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