• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2025 Huawei Device Co., Ltd.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  *     http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 
16 #define MLOG_TAG "Media_Cloud_Utils"
17 
18 #include "cloud_sync_convert.h"
19 
20 #include <string>
21 #include <vector>
22 #include <regex>
23 #include <unistd.h>
24 #include <sys/stat.h>
25 #include <charconv>
26 
27 #include "cloud_media_photos_service.h"
28 #include "media_column.h"
29 #include "media_log.h"
30 #include "medialibrary_errno.h"
31 #include "shooting_mode_column.h"
32 #include "media_file_utils.h"
33 
34 namespace OHOS::Media::CloudSync {
convertToLong(const std::string & str,int64_t & value)35 static bool convertToLong(const std::string &str, int64_t &value)
36 {
37     auto [ptr, ec] = std::from_chars(str.data(), str.data() + str.size(), value);
38     return ec == std::errc{} && ptr == str.data() + str.size();
39 }
40 
CompensateAttTitle(const CloudMediaPullDataDto & data,NativeRdb::ValuesBucket & values)41 int32_t CloudSyncConvert::CompensateAttTitle(const CloudMediaPullDataDto &data, NativeRdb::ValuesBucket &values)
42 {
43     std::string title = data.attributesTitle;
44     CHECK_AND_RETURN_RET_WARN_LOG(!title.empty(), E_CLOUDSYNC_INVAL_ARG, "Cannot find attributes::title.");
45     values.PutString(PhotoColumn::MEDIA_TITLE, title);
46     return E_OK;
47 }
48 
CompensateAttMediaType(const CloudMediaPullDataDto & data,NativeRdb::ValuesBucket & values)49 int32_t CloudSyncConvert::CompensateAttMediaType(const CloudMediaPullDataDto &data, NativeRdb::ValuesBucket &values)
50 {
51     int32_t mediaType = data.attributesMediaType;
52     if (mediaType == -1) {
53         mediaType = data.basicFileType == FILE_TYPE_VIDEO ? static_cast<int32_t>(MediaType::MEDIA_TYPE_VIDEO)
54                                                           : static_cast<int32_t>(MediaType::MEDIA_TYPE_IMAGE);
55     }
56     CHECK_AND_RETURN_RET_WARN_LOG(mediaType != -1, E_CLOUDSYNC_INVAL_ARG, "Cannot find attributes::mediaType.");
57     values.PutInt(PhotoColumn::MEDIA_TYPE, mediaType);
58     return E_OK;
59 }
60 
CompensateDuration(const CloudMediaPullDataDto & data,NativeRdb::ValuesBucket & values)61 int32_t CloudSyncConvert::CompensateDuration(const CloudMediaPullDataDto &data, NativeRdb::ValuesBucket &values)
62 {
63     int32_t duration = data.duration;
64     CHECK_AND_RETURN_RET_WARN_LOG(duration != -1, E_CLOUDSYNC_INVAL_ARG, "Cannot find basic::duration.");
65     values.PutInt(PhotoColumn::MEDIA_DURATION, duration);
66     return E_OK;
67 }
68 
CompensateAttHidden(const CloudMediaPullDataDto & data,NativeRdb::ValuesBucket & values)69 int32_t CloudSyncConvert::CompensateAttHidden(const CloudMediaPullDataDto &data, NativeRdb::ValuesBucket &values)
70 {
71     int32_t hidden = data.attributesHidden;
72     CHECK_AND_RETURN_RET_WARN_LOG(hidden != -1, E_CLOUDSYNC_INVAL_ARG, "Cannot find attributes::hidden.");
73     values.PutInt(PhotoColumn::MEDIA_HIDDEN, hidden);
74     return E_OK;
75 }
76 
CompensateAttHiddenTime(const CloudMediaPullDataDto & data,NativeRdb::ValuesBucket & values)77 int32_t CloudSyncConvert::CompensateAttHiddenTime(const CloudMediaPullDataDto &data, NativeRdb::ValuesBucket &values)
78 {
79     int64_t hiddenTime = data.attributesHiddenTime;
80     CHECK_AND_RETURN_RET_WARN_LOG(hiddenTime != -1, E_CLOUDSYNC_INVAL_ARG, "Cannot find attributes::hiddenTime.");
81     values.PutLong(PhotoColumn::PHOTO_HIDDEN_TIME, hiddenTime);
82     return E_OK;
83 }
84 
CompensateAttRelativePath(const CloudMediaPullDataDto & data,NativeRdb::ValuesBucket & values)85 int32_t CloudSyncConvert::CompensateAttRelativePath(const CloudMediaPullDataDto &data, NativeRdb::ValuesBucket &values)
86 {
87     std::string relativePath = data.attributesRelativePath;
88     CHECK_AND_RETURN_RET_WARN_LOG(
89         !relativePath.empty(), E_CLOUDSYNC_INVAL_ARG, "Cannot find attributes::relativePath.");
90     values.PutString(PhotoColumn::MEDIA_RELATIVE_PATH, relativePath);
91     return E_OK;
92 }
93 
CompensateAttVirtualPath(const CloudMediaPullDataDto & data,NativeRdb::ValuesBucket & values)94 int32_t CloudSyncConvert::CompensateAttVirtualPath(const CloudMediaPullDataDto &data, NativeRdb::ValuesBucket &values)
95 {
96     std::string virtualPath = data.attributesVirtualPath;
97     CHECK_AND_RETURN_RET_WARN_LOG(!virtualPath.empty(), E_CLOUDSYNC_INVAL_ARG, "Cannot find attributes::virtualPath.");
98     values.PutString(PhotoColumn::MEDIA_VIRTURL_PATH, virtualPath);
99     return E_OK;
100 }
101 
CompensateAttMetaDateModified(const CloudMediaPullDataDto & data,NativeRdb::ValuesBucket & values)102 int32_t CloudSyncConvert::CompensateAttMetaDateModified(
103     const CloudMediaPullDataDto &data, NativeRdb::ValuesBucket &values)
104 {
105     int64_t metaDateModified = data.attributesMetaDateModified;
106     CHECK_AND_RETURN_RET_WARN_LOG(
107         metaDateModified != -1, E_CLOUDSYNC_INVAL_ARG, "Cannot find attributes::metaDateModified.");
108     values.PutLong(PhotoColumn::PHOTO_META_DATE_MODIFIED, metaDateModified);
109     return E_OK;
110 }
111 
CompensateAttSubtype(const CloudMediaPullDataDto & data,NativeRdb::ValuesBucket & values)112 int32_t CloudSyncConvert::CompensateAttSubtype(const CloudMediaPullDataDto &data, NativeRdb::ValuesBucket &values)
113 {
114     int32_t subtype = data.attributesSubtype;
115     CHECK_AND_RETURN_RET_WARN_LOG(subtype != -1, E_CLOUDSYNC_INVAL_ARG, "Cannot find attributes::subtype.");
116     values.PutInt(PhotoColumn::PHOTO_SUBTYPE, subtype);
117     return E_OK;
118 }
119 
CompensateAttBurstCoverLevel(const CloudMediaPullDataDto & data,NativeRdb::ValuesBucket & values)120 int32_t CloudSyncConvert::CompensateAttBurstCoverLevel(
121     const CloudMediaPullDataDto &data, NativeRdb::ValuesBucket &values)
122 {
123     int32_t burstCoverLevel = data.attributesBurstCoverLevel;
124     CHECK_AND_RETURN_RET_WARN_LOG(
125         burstCoverLevel != -1, E_CLOUDSYNC_INVAL_ARG, "Cannot find attributes::burstCoverLevel.");
126     int32_t maxLevel = static_cast<int32_t>(BurstCoverLevelType::MEMBER);
127     int32_t minLevel = static_cast<int32_t>(BurstCoverLevelType::DEFAULT);
128     if (burstCoverLevel > maxLevel || burstCoverLevel < minLevel) {
129         burstCoverLevel = minLevel;
130     }
131     values.PutInt(PhotoColumn::PHOTO_BURST_COVER_LEVEL, burstCoverLevel);
132     return E_OK;
133 }
134 
CompensateAttBurstKey(const CloudMediaPullDataDto & data,NativeRdb::ValuesBucket & values)135 int32_t CloudSyncConvert::CompensateAttBurstKey(const CloudMediaPullDataDto &data, NativeRdb::ValuesBucket &values)
136 {
137     std::string burstKey = data.attributesBurstKey;
138     CHECK_AND_RETURN_RET_WARN_LOG(!burstKey.empty(), E_CLOUDSYNC_INVAL_ARG, "Cannot find attributes::burstKey.");
139     values.PutString(PhotoColumn::PHOTO_BURST_KEY, burstKey);
140     return E_OK;
141 }
142 
CompensateAttDateYear(const CloudMediaPullDataDto & data,NativeRdb::ValuesBucket & values)143 int32_t CloudSyncConvert::CompensateAttDateYear(const CloudMediaPullDataDto &data, NativeRdb::ValuesBucket &values)
144 {
145     std::string dateYear = data.attributesDateYear;
146     CHECK_AND_RETURN_RET_WARN_LOG(!dateYear.empty(), E_CLOUDSYNC_INVAL_ARG, "Cannot find attributes::dateYear.");
147     values.PutString(PhotoColumn::PHOTO_DATE_YEAR, dateYear);
148     return E_OK;
149 }
150 
CompensateAttDateMonth(const CloudMediaPullDataDto & data,NativeRdb::ValuesBucket & values)151 int32_t CloudSyncConvert::CompensateAttDateMonth(const CloudMediaPullDataDto &data, NativeRdb::ValuesBucket &values)
152 {
153     std::string dateMonth = data.attributesDateMonth;
154     CHECK_AND_RETURN_RET_WARN_LOG(!dateMonth.empty(), E_CLOUDSYNC_INVAL_ARG, "Cannot find attributes::dateMonth.");
155     values.PutString(PhotoColumn::PHOTO_DATE_MONTH, dateMonth);
156     return E_OK;
157 }
158 
CompensateAttDateDay(const CloudMediaPullDataDto & data,NativeRdb::ValuesBucket & values)159 int32_t CloudSyncConvert::CompensateAttDateDay(const CloudMediaPullDataDto &data, NativeRdb::ValuesBucket &values)
160 {
161     std::string dateDay = data.attributesDateDay;
162     CHECK_AND_RETURN_RET_WARN_LOG(!dateDay.empty(), E_CLOUDSYNC_INVAL_ARG, "Cannot find attributes::dateDay.");
163     values.PutString(PhotoColumn::PHOTO_DATE_DAY, dateDay);
164     return E_OK;
165 }
166 
CompensateAttShootingMode(const CloudMediaPullDataDto & data,NativeRdb::ValuesBucket & values)167 int32_t CloudSyncConvert::CompensateAttShootingMode(const CloudMediaPullDataDto &data, NativeRdb::ValuesBucket &values)
168 {
169     std::string shootingMode = data.attributesShootingMode;
170     if (!data.attributesShootingModeTag.empty()) {
171         shootingMode = ShootingModeAlbum::MapShootingModeTagToShootingMode(data.attributesShootingModeTag);
172     }
173     CHECK_AND_RETURN_RET_WARN_LOG(
174         !shootingMode.empty(), E_CLOUDSYNC_INVAL_ARG, "Cannot find attributes::shootingMode.");
175     values.PutString(PhotoColumn::PHOTO_SHOOTING_MODE, shootingMode);
176     return E_OK;
177 }
178 
CompensateAttShootingModeTag(const CloudMediaPullDataDto & data,NativeRdb::ValuesBucket & values)179 int32_t CloudSyncConvert::CompensateAttShootingModeTag(
180     const CloudMediaPullDataDto &data, NativeRdb::ValuesBucket &values)
181 {
182     std::string shootingModeTag = data.attributesShootingModeTag;
183     CHECK_AND_RETURN_RET_WARN_LOG(
184         !shootingModeTag.empty(), E_CLOUDSYNC_INVAL_ARG, "Cannot find attributes::shootingModeTag.");
185     values.PutString(PhotoColumn::PHOTO_SHOOTING_MODE_TAG, shootingModeTag);
186     return E_OK;
187 }
188 
CompensateAttDynamicRangeType(const CloudMediaPullDataDto & data,NativeRdb::ValuesBucket & values)189 int32_t CloudSyncConvert::CompensateAttDynamicRangeType(
190     const CloudMediaPullDataDto &data, NativeRdb::ValuesBucket &values)
191 {
192     int32_t dynamicRangeType = data.attributesDynamicRangeType;
193     CHECK_AND_RETURN_RET_WARN_LOG(
194         dynamicRangeType != -1, E_CLOUDSYNC_INVAL_ARG, "Cannot find attributes::dynamicRangeType.");
195     values.PutInt(PhotoColumn::PHOTO_DYNAMIC_RANGE_TYPE, dynamicRangeType);
196     return E_OK;
197 }
198 
CompensateAttFrontCamera(const CloudMediaPullDataDto & data,NativeRdb::ValuesBucket & values)199 int32_t CloudSyncConvert::CompensateAttFrontCamera(const CloudMediaPullDataDto &data, NativeRdb::ValuesBucket &values)
200 {
201     std::string frontCamera = data.attributesFrontCamera;
202     CHECK_AND_RETURN_RET_WARN_LOG(!frontCamera.empty(), E_CLOUDSYNC_INVAL_ARG, "Cannot find attributes::frontCamera.");
203     values.PutString(PhotoColumn::PHOTO_FRONT_CAMERA, frontCamera);
204     return E_OK;
205 }
206 
CompensateAttEditTime(const CloudMediaPullDataDto & data,NativeRdb::ValuesBucket & values)207 int32_t CloudSyncConvert::CompensateAttEditTime(const CloudMediaPullDataDto &data, NativeRdb::ValuesBucket &values)
208 {
209     int64_t editTime = data.attributesEditTime;
210     CHECK_AND_RETURN_RET_WARN_LOG(editTime != -1, E_CLOUDSYNC_INVAL_ARG, "Cannot find attributes::editTime.");
211     values.PutLong(PhotoColumn::PHOTO_EDIT_TIME, editTime);
212     return E_OK;
213 }
214 
CompensateAttOriginalSubtype(const CloudMediaPullDataDto & data,NativeRdb::ValuesBucket & values)215 int32_t CloudSyncConvert::CompensateAttOriginalSubtype(
216     const CloudMediaPullDataDto &data, NativeRdb::ValuesBucket &values)
217 {
218     int32_t originalSubtype = data.attributesOriginalSubtype;
219     CHECK_AND_RETURN_RET_WARN_LOG(
220         originalSubtype != -1, E_CLOUDSYNC_INVAL_ARG, "Cannot find attributes::originalSubtype.");
221     values.PutInt(PhotoColumn::PHOTO_ORIGINAL_SUBTYPE, originalSubtype);
222     return E_OK;
223 }
224 
CompensateAttCoverPosition(const CloudMediaPullDataDto & data,NativeRdb::ValuesBucket & values)225 int32_t CloudSyncConvert::CompensateAttCoverPosition(const CloudMediaPullDataDto &data, NativeRdb::ValuesBucket &values)
226 {
227     int64_t coverPosition = data.attributesCoverPosition;
228     CHECK_AND_RETURN_RET_WARN_LOG(coverPosition != -1, E_CLOUDSYNC_INVAL_ARG, "Cannot find attributes::coverPosition.");
229     values.PutLong(PhotoColumn::PHOTO_COVER_POSITION, coverPosition);
230     return E_OK;
231 }
232 
CompensateAttIsRectificationCover(const CloudMediaPullDataDto & data,NativeRdb::ValuesBucket & values)233 int32_t CloudSyncConvert::CompensateAttIsRectificationCover(const CloudMediaPullDataDto &data,
234                                                             NativeRdb::ValuesBucket &values)
235 {
236     int32_t isRectificationCover = data.attributesIsRectificationCover;
237     CHECK_AND_RETURN_RET_WARN_LOG(isRectificationCover != -1, E_CLOUDSYNC_INVAL_ARG,
238                                   "Cannot find attributes::isRectificationCover.");
239     values.PutLong(PhotoColumn::PHOTO_IS_RECTIFICATION_COVER, isRectificationCover);
240     return E_OK;
241 }
242 
CompensateAttMovingPhotoEffectMode(const CloudMediaPullDataDto & data,NativeRdb::ValuesBucket & values)243 int32_t CloudSyncConvert::CompensateAttMovingPhotoEffectMode(
244     const CloudMediaPullDataDto &data, NativeRdb::ValuesBucket &values)
245 {
246     int32_t movingPhotoEffectMode = data.attributesMovingPhotoEffectMode;
247     CHECK_AND_RETURN_RET_WARN_LOG(
248         movingPhotoEffectMode != -1, E_CLOUDSYNC_INVAL_ARG, "Cannot find attributes::movingPhotoEffectMode.");
249     values.PutInt(PhotoColumn::MOVING_PHOTO_EFFECT_MODE, movingPhotoEffectMode);
250     return E_OK;
251 }
252 
CompensateAttSupportedWatermarkType(const CloudMediaPullDataDto & data,NativeRdb::ValuesBucket & values)253 int32_t CloudSyncConvert::CompensateAttSupportedWatermarkType(
254     const CloudMediaPullDataDto &data, NativeRdb::ValuesBucket &values)
255 {
256     int32_t watermarkType = data.attributesSupportedWatermarkType;
257     CHECK_AND_RETURN_RET_WARN_LOG(watermarkType != -1, E_CLOUDSYNC_INVAL_ARG, "Cannot find attributes::watermarkType.");
258     values.PutInt(PhotoColumn::SUPPORTED_WATERMARK_TYPE, watermarkType);
259     return E_OK;
260 }
261 
CompensateAttStrongAssociation(const CloudMediaPullDataDto & data,NativeRdb::ValuesBucket & values)262 int32_t CloudSyncConvert::CompensateAttStrongAssociation(
263     const CloudMediaPullDataDto &data, NativeRdb::ValuesBucket &values)
264 {
265     int32_t strongAssociation = data.attributesStrongAssociation;
266     CHECK_AND_RETURN_RET_WARN_LOG(
267         strongAssociation != -1, E_CLOUDSYNC_INVAL_ARG, "Cannot find attributes::strongAssociation.");
268     values.PutInt(PhotoColumn::PHOTO_STRONG_ASSOCIATION, strongAssociation);
269     return E_OK;
270 }
271 
CompensatePropTitle(const CloudMediaPullDataDto & data,NativeRdb::ValuesBucket & values)272 int32_t CloudSyncConvert::CompensatePropTitle(const CloudMediaPullDataDto &data, NativeRdb::ValuesBucket &values)
273 {
274     std::string title = data.propertiesSourceFileName;
275     CHECK_AND_RETURN_RET_WARN_LOG(!title.empty(), E_OK, "Cannot find properties::sourceFileName.");
276 
277     size_t pos = title.find_last_of(".");
278     if (pos != std::string::npos) {
279         title = title.substr(0, pos);
280     }
281     if (values.HasColumn(PhotoColumn::MEDIA_TITLE)) {
282         values.Delete(PhotoColumn::MEDIA_TITLE);
283     }
284     values.PutString(PhotoColumn::MEDIA_TITLE, title);
285     return E_OK;
286 }
287 
CompensatePropOrientation(const CloudMediaPullDataDto & data,NativeRdb::ValuesBucket & values)288 int32_t CloudSyncConvert::CompensatePropOrientation(const CloudMediaPullDataDto &data, NativeRdb::ValuesBucket &values)
289 {
290     int32_t exifRotateValue = data.propertiesRotate;
291     CHECK_AND_RETURN_RET_WARN_LOG(
292         exifRotateValue != -1, E_CLOUDSYNC_INVAL_ARG, "Cannot find attributes::exifRotateValue.");
293     values.PutInt(PhotoColumn::PHOTO_ORIENTATION, exifRotateValue);
294     return E_OK;
295 }
296 
CompensatePropPosition(const CloudMediaPullDataDto & data,NativeRdb::ValuesBucket & values)297 int32_t CloudSyncConvert::CompensatePropPosition(const CloudMediaPullDataDto &data, NativeRdb::ValuesBucket &values)
298 {
299     CHECK_AND_RETURN_RET(!(data.latitude == 0 && data.longitude == 0), E_OK);
300     values.PutDouble(PhotoColumn::PHOTO_LATITUDE, data.latitude);
301     values.PutDouble(PhotoColumn::PHOTO_LONGITUDE, data.longitude);
302     return E_OK;
303 }
304 
CompensatePropHeight(const CloudMediaPullDataDto & data,NativeRdb::ValuesBucket & values)305 int32_t CloudSyncConvert::CompensatePropHeight(const CloudMediaPullDataDto &data, NativeRdb::ValuesBucket &values)
306 {
307     int32_t height = data.propertiesHeight;
308     CHECK_AND_PRINT_LOG(height != 0, "height is invalid, height: %{public}d", height);
309     CHECK_AND_RETURN_RET_WARN_LOG(height != -1, E_CLOUDSYNC_INVAL_ARG, "Cannot find properties::height.");
310     values.PutInt(PhotoColumn::PHOTO_HEIGHT, height);
311     return E_OK;
312 }
313 
CompensatePropWidth(const CloudMediaPullDataDto & data,NativeRdb::ValuesBucket & values)314 int32_t CloudSyncConvert::CompensatePropWidth(const CloudMediaPullDataDto &data, NativeRdb::ValuesBucket &values)
315 {
316     int32_t width = data.propertiesWidth;
317     CHECK_AND_PRINT_LOG(width != 0, "width is invalid, width: %{public}d", width);
318     CHECK_AND_RETURN_RET_WARN_LOG(width != -1, E_CLOUDSYNC_INVAL_ARG, "Cannot find properties::width.");
319     values.PutInt(PhotoColumn::PHOTO_WIDTH, width);
320     return E_OK;
321 }
322 
CompensateFormattedDate(const int64_t createTime,NativeRdb::ValuesBucket & values)323 int32_t CloudSyncConvert::CompensateFormattedDate(const int64_t createTime, NativeRdb::ValuesBucket &values)
324 {
325     std::string year = MediaFileUtils::StrCreateTime(PhotoColumn::PHOTO_DATE_YEAR_FORMAT, createTime);
326     std::string month = MediaFileUtils::StrCreateTime(PhotoColumn::PHOTO_DATE_MONTH_FORMAT, createTime);
327     std::string day = MediaFileUtils::StrCreateTime(PhotoColumn::PHOTO_DATE_DAY_FORMAT, createTime);
328     values.PutString(PhotoColumn::PHOTO_DATE_YEAR, year);
329     values.PutString(PhotoColumn::PHOTO_DATE_MONTH, month);
330     values.PutString(PhotoColumn::PHOTO_DATE_DAY, day);
331     return E_OK;
332 }
333 
CompensatePropDataAdded(const CloudMediaPullDataDto & data,NativeRdb::ValuesBucket & values)334 int32_t CloudSyncConvert::CompensatePropDataAdded(const CloudMediaPullDataDto &data, NativeRdb::ValuesBucket &values)
335 {
336     int64_t dataAdded = 0;
337     std::string tmpStr = data.propertiesFirstUpdateTime;
338 
339     if (tmpStr.empty()) {
340         dataAdded = data.basicCreatedTime;
341     } else {
342         if (!convertToLong(tmpStr, dataAdded)) {
343             MEDIA_ERR_LOG("extract dataAdded error");
344             return E_CLOUDSYNC_INVAL_ARG;
345         }
346     }
347     if (dataAdded == 0) {
348         MEDIA_ERR_LOG("The dataAdded createTime of record is incorrect");
349     }
350     values.PutLong(PhotoColumn::MEDIA_DATE_ADDED, dataAdded);
351     int64_t createTime = data.basicCreatedTime;
352     if (createTime <= 0) {
353         createTime = dataAdded;
354     }
355     values.PutLong(PhotoColumn::MEDIA_DATE_TAKEN, createTime);
356     CompensateFormattedDate(createTime / MILLISECOND_TO_SECOND, values);
357     return E_OK;
358 }
359 
CompensatePropDetailTime(const CloudMediaPullDataDto & data,NativeRdb::ValuesBucket & values)360 int32_t CloudSyncConvert::CompensatePropDetailTime(const CloudMediaPullDataDto &data, NativeRdb::ValuesBucket &values)
361 {
362     std::string detailTime = data.propertiesDetailTime;
363     CHECK_AND_RETURN_RET_WARN_LOG(!detailTime.empty(), E_CLOUDSYNC_INVAL_ARG, "Cannot find properties::detailTime.");
364     values.PutString(PhotoColumn::PHOTO_DETAIL_TIME, detailTime);
365     return E_OK;
366 }
367 
CompensatePropSourcePath(const CloudMediaPullDataDto & data,NativeRdb::ValuesBucket & values)368 int32_t CloudSyncConvert::CompensatePropSourcePath(const CloudMediaPullDataDto &data, NativeRdb::ValuesBucket &values)
369 {
370     std::string sourcePath = data.propertiesSourcePath;
371     CHECK_AND_RETURN_RET_WARN_LOG(!sourcePath.empty(), E_CLOUDSYNC_INVAL_ARG, "Cannot find properties::sourcePath.");
372     size_t pos = sourcePath.find(SCREENSHOT_ALBUM_PATH);
373     if (pos != std::string::npos) {
374         int32_t fileType = data.basicFileType;
375         if (fileType == -1) {
376             MEDIA_ERR_LOG("Cannot find basic::fileType.");
377         }
378         std::string displayName = data.basicFileName;
379         CHECK_AND_RETURN_RET_WARN_LOG(!displayName.empty(), E_CLOUDSYNC_INVAL_ARG, "Cannot find basic::displayName.");
380         if (fileType == FILE_TYPE_VIDEO) {
381             sourcePath = SCREENRECORD_ALBUM_PATH + displayName;
382         }
383     }
384     values.PutString(PhotoColumn::PHOTO_SOURCE_PATH, sourcePath);
385     return E_OK;
386 }
387 
CompensateBasicSize(const CloudMediaPullDataDto & data,NativeRdb::ValuesBucket & values)388 int32_t CloudSyncConvert::CompensateBasicSize(const CloudMediaPullDataDto &data, NativeRdb::ValuesBucket &values)
389 {
390     int64_t size = data.basicSize;
391     CHECK_AND_RETURN_RET_WARN_LOG(size != -1, E_CLOUDSYNC_INVAL_ARG, "Cannot find basic::size.");
392     values.PutLong(MediaColumn::MEDIA_SIZE, size);
393     return E_OK;
394 }
395 
CompensateBasicDisplayName(const CloudMediaPullDataDto & data,NativeRdb::ValuesBucket & values)396 int32_t CloudSyncConvert::CompensateBasicDisplayName(const CloudMediaPullDataDto &data, NativeRdb::ValuesBucket &values)
397 {
398     std::string displayName = data.basicDisplayName;
399     CHECK_AND_RETURN_RET_WARN_LOG(!displayName.empty(), E_CLOUDSYNC_INVAL_ARG, "Cannot find basic::displayName.");
400     values.PutString(MediaColumn::MEDIA_NAME, displayName);
401     return E_OK;
402 }
403 
CompensateBasicMimeType(const CloudMediaPullDataDto & data,NativeRdb::ValuesBucket & values)404 int32_t CloudSyncConvert::CompensateBasicMimeType(const CloudMediaPullDataDto &data, NativeRdb::ValuesBucket &values)
405 {
406     std::string mimeType = data.basicMimeType;
407     CHECK_AND_RETURN_RET_WARN_LOG(!mimeType.empty(), E_CLOUDSYNC_INVAL_ARG, "Cannot find basic::mimeType.");
408     values.PutString(MediaColumn::MEDIA_MIME_TYPE, mimeType);
409     return E_OK;
410 }
411 
CompensateBasicDeviceName(const CloudMediaPullDataDto & data,NativeRdb::ValuesBucket & values)412 int32_t CloudSyncConvert::CompensateBasicDeviceName(const CloudMediaPullDataDto &data, NativeRdb::ValuesBucket &values)
413 {
414     std::string deviceName = data.basicDeviceName;
415     CHECK_AND_RETURN_RET_WARN_LOG(!deviceName.empty(), E_CLOUDSYNC_INVAL_ARG, "Cannot find basic::deviceName.");
416     values.PutString(PhotoColumn::MEDIA_DEVICE_NAME, deviceName);
417     return E_OK;
418 }
419 
CompensateBasicDateModified(const CloudMediaPullDataDto & data,NativeRdb::ValuesBucket & values)420 int32_t CloudSyncConvert::CompensateBasicDateModified(
421     const CloudMediaPullDataDto &data, NativeRdb::ValuesBucket &values)
422 {
423     int64_t dateModified = data.attributesEditedTimeMs;
424     if (dateModified != -1) {
425         values.PutLong(PhotoColumn::MEDIA_DATE_MODIFIED, dateModified);
426         return E_OK;
427     }
428     dateModified = data.basicEditedTime;
429     CHECK_AND_RETURN_RET_WARN_LOG(dateModified != -1, E_CLOUDSYNC_INVAL_ARG, "Cannot find basic::dateModified.");
430     values.PutLong(PhotoColumn::MEDIA_DATE_MODIFIED, dateModified);
431     return E_OK;
432 }
433 
CompensateBasicDateTaken(const CloudMediaPullDataDto & data,NativeRdb::ValuesBucket & values)434 int32_t CloudSyncConvert::CompensateBasicDateTaken(const CloudMediaPullDataDto &data, NativeRdb::ValuesBucket &values)
435 {
436     int64_t createTime = data.basicCreatedTime;
437     CHECK_AND_RETURN_RET_WARN_LOG(createTime != -1, E_CLOUDSYNC_INVAL_ARG, "Cannot find basic::createTime.");
438     values.PutLong(MediaColumn::MEDIA_DATE_TAKEN, createTime);
439     return E_OK;
440 }
441 
CompensateBasicFavorite(const CloudMediaPullDataDto & data,NativeRdb::ValuesBucket & values)442 int32_t CloudSyncConvert::CompensateBasicFavorite(const CloudMediaPullDataDto &data, NativeRdb::ValuesBucket &values)
443 {
444     int32_t isFavorite = data.basicIsFavorite;
445     CHECK_AND_RETURN_RET_WARN_LOG(isFavorite != -1, E_CLOUDSYNC_INVAL_ARG, "Cannot find basic::isFavorite.");
446     values.PutInt(PhotoColumn::MEDIA_IS_FAV, isFavorite);
447     return E_OK;
448 }
449 
CompensateBasicDateTrashed(const CloudMediaPullDataDto & data,NativeRdb::ValuesBucket & values)450 int32_t CloudSyncConvert::CompensateBasicDateTrashed(const CloudMediaPullDataDto &data, NativeRdb::ValuesBucket &values)
451 {
452     int32_t isRecycle = data.basicIsRecycle;
453     CHECK_AND_RETURN_RET_WARN_LOG(isRecycle != -1, E_CLOUDSYNC_INVAL_ARG, "Cannot find basic::isRecycle.");
454     if (isRecycle) {
455         int64_t dataTrashed = data.basicRecycledTime;
456         CHECK_AND_RETURN_RET_WARN_LOG(dataTrashed != -1, E_CLOUDSYNC_INVAL_ARG, "Cannot find basic::dataTrashed.");
457         values.PutLong(PhotoColumn::MEDIA_DATE_TRASHED, dataTrashed);
458     } else {
459         values.PutLong(PhotoColumn::MEDIA_DATE_TRASHED, 0);
460     }
461     return E_OK;
462 }
463 
CompensateBasicCloudId(const CloudMediaPullDataDto & data,NativeRdb::ValuesBucket & values)464 int32_t CloudSyncConvert::CompensateBasicCloudId(const CloudMediaPullDataDto &data, NativeRdb::ValuesBucket &values)
465 {
466     std::string cloudId = data.cloudId;
467     CHECK_AND_RETURN_RET_WARN_LOG(!cloudId.empty(), E_CLOUDSYNC_INVAL_ARG, "Cannot find basic::cloudId.");
468     values.PutString(PhotoColumn::PHOTO_CLOUD_ID, cloudId);
469     return E_OK;
470 }
471 
CompensateBasicDescription(const CloudMediaPullDataDto & data,NativeRdb::ValuesBucket & values)472 int32_t CloudSyncConvert::CompensateBasicDescription(const CloudMediaPullDataDto &data, NativeRdb::ValuesBucket &values)
473 {
474     std::string description = data.basicDescription;
475     CHECK_AND_RETURN_RET_WARN_LOG(!description.empty(), E_CLOUDSYNC_INVAL_ARG, "Cannot find basic::description.");
476     values.PutString(PhotoColumn::PHOTO_USER_COMMENT, description);
477     return E_OK;
478 }
479 
CompensateBasicFixLivePhoto(const CloudMediaPullDataDto & data,NativeRdb::ValuesBucket & values)480 int32_t CloudSyncConvert::CompensateBasicFixLivePhoto(
481     const CloudMediaPullDataDto &data, NativeRdb::ValuesBucket &values)
482 {
483     int32_t fileType = data.basicFileType;
484     CHECK_AND_RETURN_RET_WARN_LOG(fileType != -1, E_CLOUDSYNC_INVAL_ARG, "Cannot find basic::fileType.");
485     if (fileType == FILE_TYPE_LIVEPHOTO) {
486         values.Delete(PhotoColumn::PHOTO_SUBTYPE);
487         values.PutInt(PhotoColumn::PHOTO_SUBTYPE, static_cast<int32_t>(PhotoSubType::MOVING_PHOTO));
488     }
489     return E_OK;
490 }
491 
CompensateBasicMediaType(const CloudMediaPullDataDto & data,NativeRdb::ValuesBucket & values)492 int32_t CloudSyncConvert::CompensateBasicMediaType(const CloudMediaPullDataDto &data, NativeRdb::ValuesBucket &values)
493 {
494     int32_t fileType = data.basicFileType;
495     CHECK_AND_RETURN_RET_LOG(fileType != -1, E_CLOUDSYNC_INVAL_ARG, "Cannot find basic::fileType.");
496     int32_t mediaType = fileType == FILE_TYPE_VIDEO ? static_cast<int32_t>(MediaType::MEDIA_TYPE_VIDEO)
497                                                     : static_cast<int32_t>(MediaType::MEDIA_TYPE_IMAGE);
498     values.PutInt(PhotoColumn::MEDIA_TYPE, mediaType);
499     return E_OK;
500 }
501 
CompensateBasicMetaDateModified(const CloudMediaPullDataDto & data,NativeRdb::ValuesBucket & values)502 int32_t CloudSyncConvert::CompensateBasicMetaDateModified(
503     const CloudMediaPullDataDto &data, NativeRdb::ValuesBucket &values)
504 {
505     int64_t metaDataModified = data.basicEditedTime;
506     CHECK_AND_RETURN_RET_LOG(metaDataModified != -1, E_CLOUDSYNC_INVAL_ARG, "Cannot find basic::metaDataModified.");
507 
508     // imputed value, may not be accurate
509     values.PutLong(PhotoColumn::PHOTO_META_DATE_MODIFIED, metaDataModified);
510     return E_OK;
511 }
512 
CompensateBasicSubtype(const CloudMediaPullDataDto & data,NativeRdb::ValuesBucket & values)513 int32_t CloudSyncConvert::CompensateBasicSubtype(const CloudMediaPullDataDto &data, NativeRdb::ValuesBucket &values)
514 {
515     int32_t fileType = data.basicFileType;
516     CHECK_AND_RETURN_RET_LOG(fileType != -1, E_CLOUDSYNC_INVAL_ARG, "Cannot find basic::fileType.");
517     if (fileType == FILE_TYPE_LIVEPHOTO) {
518         MEDIA_INFO_LOG("current file is live photo");
519         values.PutInt(PhotoColumn::PHOTO_SUBTYPE, static_cast<int32_t>(PhotoSubType::MOVING_PHOTO));
520         return E_OK;
521     }
522 
523     CHECK_AND_RETURN_RET_WARN_LOG(data.hasProperties, E_OK, "Data cannot find properties");
524     std::string sourcePath = data.propertiesSourcePath;
525     if (sourcePath.empty()) {
526         values.PutInt(PhotoColumn::PHOTO_SUBTYPE, static_cast<int32_t>(PhotoSubType::DEFAULT));
527         return E_OK;
528     }
529 
530     int32_t subType = static_cast<int32_t>(PhotoSubType::DEFAULT);
531     if (sourcePath.find("DCIM") != std::string::npos && sourcePath.find("Camera") != std::string::npos) {
532         subType = static_cast<int32_t>(PhotoSubType::CAMERA);
533     } else if (sourcePath.find("Screenshots") != std::string::npos) {
534         subType = static_cast<int32_t>(PhotoSubType::SCREENSHOT);
535     } else {
536         subType = static_cast<int32_t>(PhotoSubType::DEFAULT);
537     }
538     values.PutInt(PhotoColumn::PHOTO_SUBTYPE, subType);
539     return E_OK;
540 }
541 
CompensateBasicBurstCoverLevel(const CloudMediaPullDataDto & data,NativeRdb::ValuesBucket & values)542 int32_t CloudSyncConvert::CompensateBasicBurstCoverLevel(
543     const CloudMediaPullDataDto &data, NativeRdb::ValuesBucket &values)
544 {
545     values.PutInt(PhotoColumn::PHOTO_BURST_COVER_LEVEL, static_cast<int32_t>(BurstCoverLevelType::DEFAULT));
546     return E_OK;
547 }
548 
TryCompensateValue(const CloudMediaPullDataDto & data,NativeRdb::ValuesBucket & values)549 int32_t CloudSyncConvert::TryCompensateValue(const CloudMediaPullDataDto &data, NativeRdb::ValuesBucket &values)
550 {
551     CHECK_AND_RETURN_RET_WARN_LOG(data.hasProperties, E_OK, "Data cannot find properties");
552     CHECK_AND_RETURN_RET_LOG(CompensatePropTitle(data, values) == E_OK, E_ERR, "CompensateTitle Error");
553     CHECK_AND_RETURN_RET_LOG(CompensateBasicMediaType(data, values) == E_OK, E_ERR, "CompensateMediaType Error");
554     CHECK_AND_RETURN_RET_LOG(CompensateBasicMetaDateModified(data, values) == E_OK, E_ERR, "MetaModified Error");
555     CHECK_AND_RETURN_RET_LOG(CompensateBasicSubtype(data, values) == E_OK, E_ERR, "CompensateSubtype Error");
556 
557     // Prevent device-cloud inconsistency caused by the value of the PHOTO_BURST_COVER_LEVEL field out of range.
558     CHECK_AND_RETURN_RET(CompensateBasicBurstCoverLevel(data, values) == E_OK, E_ERR);
559     return E_OK;
560 }
561 
ExtractAttributeValue(const CloudMediaPullDataDto & data,NativeRdb::ValuesBucket & values)562 int32_t CloudSyncConvert::ExtractAttributeValue(const CloudMediaPullDataDto &data, NativeRdb::ValuesBucket &values)
563 {
564     CHECK_AND_RETURN_RET_WARN_LOG(data.hasAttributes, E_OK, "Data cannot find hasAttributes");
565     CompensateAttTitle(data, values);
566     CompensateAttMediaType(data, values);
567     CompensateAttHidden(data, values);
568     CompensateAttHiddenTime(data, values);
569     CompensateAttRelativePath(data, values);
570     CompensateAttVirtualPath(data, values);
571     CompensateAttMetaDateModified(data, values);
572     CompensateAttSubtype(data, values);
573     CompensateAttBurstCoverLevel(data, values);
574     CompensateAttBurstKey(data, values);
575     CompensateAttDateYear(data, values);
576     CompensateAttDateMonth(data, values);
577     CompensateAttDateDay(data, values);
578     CompensateAttShootingMode(data, values);
579     CompensateAttShootingModeTag(data, values);
580     CompensateAttDynamicRangeType(data, values);
581     CompensateAttFrontCamera(data, values);
582     CompensateAttEditTime(data, values);
583     CompensateAttOriginalSubtype(data, values);
584     CompensateAttCoverPosition(data, values);
585     CompensateAttIsRectificationCover(data, values);
586     CompensateAttMovingPhotoEffectMode(data, values);
587     CompensateAttSupportedWatermarkType(data, values);
588     CompensateAttStrongAssociation(data, values);
589     return E_OK;
590 }
591 
ExtractCompatibleValue(const CloudMediaPullDataDto & data,NativeRdb::ValuesBucket & values)592 int32_t CloudSyncConvert::ExtractCompatibleValue(const CloudMediaPullDataDto &data, NativeRdb::ValuesBucket &values)
593 {
594     /* extract value in first level*/
595     CompensateBasicSize(data, values);
596     CompensateBasicDisplayName(data, values);
597     CompensateBasicMimeType(data, values);
598     CompensateBasicDeviceName(data, values);
599     CompensateBasicDateModified(data, values);
600     CompensateBasicDateTaken(data, values);
601     CompensateBasicFavorite(data, values);
602     CompensateBasicDateTrashed(data, values);
603     CompensateBasicCloudId(data, values);
604     CompensateBasicDescription(data, values);
605     CompensateBasicFixLivePhoto(data, values);
606     CompensateDuration(data, values);
607 
608     /* extract value in properties*/
609     CompensatePropOrientation(data, values);
610     CompensatePropPosition(data, values);
611     CompensatePropHeight(data, values);
612     CompensatePropWidth(data, values);
613     CompensatePropDataAdded(data, values);
614     CompensatePropDetailTime(data, values);
615     CompensatePropSourcePath(data, values);
616     return E_OK;
617 }
618 
RecordToValueBucket(const CloudMediaPullDataDto & data,NativeRdb::ValuesBucket & values)619 bool CloudSyncConvert::RecordToValueBucket(const CloudMediaPullDataDto &data, NativeRdb::ValuesBucket &values)
620 {
621     std::string title = data.attributesTitle;
622     if (!data.hasAttributes) {
623         int32_t ret = TryCompensateValue(data, values);
624         CHECK_AND_RETURN_RET_LOG(ret == E_OK, ret, "PullData lose key value, ret: %{public}d.", ret);
625     } else {
626         int32_t ret = ExtractAttributeValue(data, values);
627         CHECK_AND_RETURN_RET_LOG(ret == E_OK, ret, "PullData do not have attributes set, need, ret: %{public}d.", ret);
628         CHECK_AND_RETURN_RET_LOG(CompensatePropTitle(data, values) == E_OK, E_ERR, "CompensatePropTitle Error");
629     }
630     CHECK_AND_RETURN_RET_LOG(ExtractCompatibleValue(data, values) == E_OK, E_ERR, "ExtractCompatibleValue Error");
631     return E_OK;
632 }
633 }  // namespace OHOS::Media::CloudSync