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_Controller"
17
18 #include "cloud_media_photo_controller_processor.h"
19
20 #include "media_log.h"
21 #include "cloud_file_data_vo.h"
22 #include "cloud_file_data_dto.h"
23 #include "photos_vo.h"
24 #include "photos_dto.h"
25
26 namespace OHOS::Media::CloudSync {
SetFdirtyDataVoFromDto(std::vector<PhotosDto> & fdirtyDataDtos)27 std::vector<PhotosVo> CloudMediaPhotoControllerProcessor::SetFdirtyDataVoFromDto(std::vector<PhotosDto> &fdirtyDataDtos)
28 {
29 std::vector<PhotosVo> fdirtyDatas;
30 if (fdirtyDataDtos.size() <= 0) {
31 return fdirtyDatas;
32 }
33 for (auto fdirtyDataDto : fdirtyDataDtos) {
34 PhotosVo fdirtyDataVo;
35 fdirtyDataVo.cloudId = fdirtyDataDto.cloudId;
36 fdirtyDataVo.fileName = fdirtyDataDto.displayName;
37 fdirtyDataVo.path = fdirtyDataDto.path;
38 fdirtyDataVo.type = fdirtyDataDto.mediaType;
39 fdirtyDataVo.size = fdirtyDataDto.size;
40 fdirtyDataVo.modifiedTime = fdirtyDataDto.modifiedTime;
41 fdirtyDataVo.originalCloudId = fdirtyDataDto.originalCloudId;
42 for (auto &nodePair : fdirtyDataDto.attachment) {
43 CloudFileDataVo fileData;
44 fileData.fileName = nodePair.second.fileName;
45 fileData.filePath = nodePair.second.path;
46 fileData.size = nodePair.second.size;
47 fdirtyDataVo.attachment[nodePair.first] = fileData;
48 }
49 fdirtyDatas.emplace_back(fdirtyDataVo);
50 }
51 return fdirtyDatas;
52 }
SetNewDataVoFromDto(std::vector<PhotosDto> & newDataDtos)53 std::vector<PhotosVo> CloudMediaPhotoControllerProcessor::SetNewDataVoFromDto(std::vector<PhotosDto> &newDataDtos)
54 {
55 std::vector<PhotosVo> newDatas;
56 if (newDataDtos.size() <= 0) {
57 return newDatas;
58 }
59 for (auto newDataDto : newDataDtos) {
60 PhotosVo newDataVo;
61 newDataVo.cloudId = newDataDto.cloudId;
62 newDataVo.fileName = newDataDto.fileName;
63 newDataVo.path = newDataDto.path;
64 newDataVo.type = newDataDto.mediaType;
65 newDataVo.size = newDataDto.size;
66 newDataVo.modifiedTime = newDataDto.modifiedTime;
67 newDataVo.originalCloudId = newDataDto.originalCloudId;
68 for (auto &nodePair : newDataDto.attachment) {
69 CloudFileDataVo fileData;
70 fileData.fileName = nodePair.second.fileName;
71 fileData.filePath = nodePair.second.path;
72 fileData.size = nodePair.second.size;
73 newDataVo.attachment[nodePair.first] = fileData;
74 }
75 newDatas.emplace_back(newDataVo);
76 }
77 return newDatas;
78 }
79 using CheckData = GetCheckRecordsRespBodyCheckData;
GetCheckRecordsRespBody(std::vector<PhotosDto> photosDtoVec)80 std::unordered_map<std::string, CheckData> CloudMediaPhotoControllerProcessor::GetCheckRecordsRespBody(
81 std::vector<PhotosDto> photosDtoVec)
82 {
83 std::unordered_map<std::string, GetCheckRecordsRespBodyCheckData> checkDataList;
84 for (auto &photosDto : photosDtoVec) {
85 GetCheckRecordsRespBodyCheckData checkData;
86 checkData.cloudId = photosDto.cloudId;
87 checkData.size = photosDto.size;
88 checkData.data = photosDto.path;
89 checkData.displayName = photosDto.displayName;
90 checkData.fileName = photosDto.fileName;
91 checkData.mediaType = photosDto.mediaType;
92 checkData.cloudVersion = photosDto.cloudVersion;
93 checkData.position = photosDto.position;
94 checkData.dateModified = photosDto.dateModified;
95 checkData.dirty = photosDto.dirty;
96 checkData.syncStatus = photosDto.syncStatus;
97 checkData.thmStatus = photosDto.thumbStatus;
98 for (auto &[key, value] : photosDto.attachment) {
99 CloudFileDataVo vo;
100 vo.fileName = value.fileName;
101 vo.filePath = value.path;
102 vo.size = value.size;
103 checkData.attachment[key] = vo;
104 }
105 checkDataList[checkData.cloudId] = checkData;
106 MEDIA_DEBUG_LOG("CloudMediaDataControllerProcessor CheckData: %{public}s", checkData.ToString().c_str());
107 }
108 return checkDataList;
109 }
110
GetBasicInfo(const PhotosPo & record,CloudMdkRecordPhotosVo & photosVo)111 bool CloudMediaPhotoControllerProcessor::GetBasicInfo(const PhotosPo &record, CloudMdkRecordPhotosVo &photosVo)
112 {
113 photosVo.title = record.title.value_or("");
114 photosVo.mediaType = record.mediaType.value_or(0);
115 photosVo.hidden = record.hidden.value_or(0);
116 photosVo.sourcePath = record.sourcePath.value_or("");
117 photosVo.displayName = record.displayName.value_or("");
118 photosVo.dateTrashed = record.dateTrashed.value_or(0);
119 photosVo.isFavorite = record.isFavorite.value_or(0);
120 photosVo.dirty = record.dirty.value_or(0);
121 photosVo.orientation = record.orientation.value_or(0);
122 photosVo.size = record.size.value_or(0);
123 photosVo.mimeType = record.mimeType.value_or("");
124 photosVo.albumCloudId = record.albumCloudId.value_or("");
125 photosVo.albumLPath = record.albumLPath.value_or("");
126 return true;
127 }
128
GetAttributesInfo(const PhotosPo & record,CloudMdkRecordPhotosVo & photosVo)129 bool CloudMediaPhotoControllerProcessor::GetAttributesInfo(const PhotosPo &record, CloudMdkRecordPhotosVo &photosVo)
130 {
131 photosVo.subtype = record.subtype.value_or(0);
132 photosVo.burstCoverLevel = record.burstCoverLevel.value_or(1);
133 photosVo.burstKey = record.burstKey.value_or("");
134 photosVo.dateYear = record.dateYear.value_or("");
135 photosVo.dateMonth = record.dateMonth.value_or("");
136 photosVo.dateDay = record.dateDay.value_or("");
137 photosVo.duration = record.duration.value_or(0);
138 photosVo.relativePath = record.relativePath.value_or("");
139 photosVo.virtualPath = record.virtualPath.value_or("");
140 photosVo.shootingMode = record.shootingMode.value_or("");
141 photosVo.shootingModeTag = record.shootingModeTag.value_or("");
142 photosVo.dynamicRangeType = record.dynamicRangeType.value_or(0);
143 photosVo.frontCamera = record.frontCamera.value_or("");
144 photosVo.originalSubtype = record.originalSubtype.value_or(0);
145 photosVo.coverPosition = record.coverPosition.value_or(0);
146 photosVo.isRectificationCover = record.isRectificationCover.value_or(0);
147 photosVo.exifRotate = record.exifRotate.value_or(0);
148 photosVo.movingPhotoEffectMode = record.movingPhotoEffectMode.value_or(0);
149 photosVo.supportedWatermarkType = record.supportedWatermarkType.value_or(0);
150 photosVo.strongAssociation = record.strongAssociation.value_or(0);
151 photosVo.fileId = record.fileId.value_or(0);
152 photosVo.data = record.data.value_or("");
153 photosVo.ownerAlbumId = record.ownerAlbumId.value_or(0);
154 return true;
155 }
156
GetPropertiesInfo(const PhotosPo & record,CloudMdkRecordPhotosVo & photosVo)157 bool CloudMediaPhotoControllerProcessor::GetPropertiesInfo(const PhotosPo &record, CloudMdkRecordPhotosVo &photosVo)
158 {
159 photosVo.metaDateModified = record.metaDateModified.value_or(0);
160 photosVo.hiddenTime = record.hiddenTime.value_or(0);
161 photosVo.editTime = record.editTime.value_or(0);
162 photosVo.dateAdded = record.dateAdded.value_or(0);
163 photosVo.dateModified = record.dateModified.value_or(0);
164 photosVo.dateTaken = record.dateTaken.value_or(0);
165 photosVo.detailTime = record.detailTime.value_or("");
166 photosVo.height = record.height.value_or(0);
167 photosVo.width = record.width.value_or(0);
168 photosVo.deviceName = record.deviceName.value_or("");
169 photosVo.latitude = record.latitude.value_or(0);
170 photosVo.longitude = record.longitude.value_or(0);
171 photosVo.userComment = record.userComment.value_or("");
172 return true;
173 }
174
GetCloudInfo(const PhotosPo & record,CloudMdkRecordPhotosVo & photosVo)175 bool CloudMediaPhotoControllerProcessor::GetCloudInfo(const PhotosPo &record, CloudMdkRecordPhotosVo &photosVo)
176 {
177 photosVo.cloudId = record.cloudId.value_or("");
178 photosVo.originalAssetCloudId = record.originalAssetCloudId.value_or("");
179 photosVo.recordType = record.recordType.value_or("");
180 photosVo.recordId = record.cloudId.value_or("");
181 photosVo.baseVersion = record.baseVersion.value_or(0);
182 photosVo.isNew = record.isNew.value_or(false);
183 return true;
184 }
185
ConvertRecordPoToVo(const PhotosPo & record)186 CloudMdkRecordPhotosVo CloudMediaPhotoControllerProcessor::ConvertRecordPoToVo(const PhotosPo &record)
187 {
188 CloudMdkRecordPhotosVo photosVo;
189 this->GetBasicInfo(record, photosVo);
190 this->GetAttributesInfo(record, photosVo);
191 this->GetPropertiesInfo(record, photosVo);
192 this->GetCloudInfo(record, photosVo);
193 return photosVo;
194 }
195
GetBasicInfo(const OnFetchPhotosVo & photosVo,CloudMediaPullDataDto & data)196 bool CloudMediaPhotoControllerProcessor::GetBasicInfo(const OnFetchPhotosVo &photosVo, CloudMediaPullDataDto &data)
197 {
198 data.basicFileName = photosVo.fileName;
199 data.basicDisplayName = photosVo.fileName;
200 data.propertiesSourceFileName = photosVo.fileName;
201 data.propertiesSourcePath = photosVo.fileSourcePath;
202 data.basicFileType = photosVo.fileType;
203 data.basicSize = photosVo.size;
204 data.localSize = photosVo.size;
205 data.lcdSize = photosVo.lcdSize;
206 data.thmSize = photosVo.thmSize;
207 data.propertiesRotate = photosVo.rotation;
208 data.basicIsFavorite = photosVo.isFavorite;
209 data.attributesHidden = photosVo.hidden;
210 data.basicRecycledTime = photosVo.recycledTime;
211 data.latitude = photosVo.latitude;
212 data.longitude = photosVo.longitude;
213 data.localPath = photosVo.localPath;
214 data.basicDeviceName = photosVo.source;
215 data.basicDescription = photosVo.description;
216 return true;
217 }
218
GetAttributesInfo(const OnFetchPhotosVo & photosVo,CloudMediaPullDataDto & data)219 bool CloudMediaPhotoControllerProcessor::GetAttributesInfo(const OnFetchPhotosVo &photosVo, CloudMediaPullDataDto &data)
220 {
221 data.attributesFileId = photosVo.fileId;
222 data.basicMimeType = photosVo.mimeType;
223 data.basicIsRecycle = photosVo.isRecycle;
224 data.propertiesHeight = photosVo.photoHeight;
225 data.propertiesWidth = photosVo.photoWidth;
226 data.propertiesDetailTime = photosVo.detailTime;
227 data.attributesTitle = photosVo.title;
228 data.attributesMediaType = photosVo.mediaType;
229 data.duration = photosVo.duration;
230 data.attributesHiddenTime = photosVo.hiddenTime;
231 data.attributesRelativePath = photosVo.relativePath;
232 data.attributesVirtualPath = photosVo.virtualPath;
233 data.attributesShootingMode = photosVo.shootingMode;
234 data.attributesShootingModeTag = photosVo.shootingModeTag;
235 data.attributesBurstKey = photosVo.burstKey;
236 data.attributesBurstCoverLevel = photosVo.burstCoverLevel;
237 data.attributesSubtype = photosVo.subtype;
238 data.attributesOriginalSubtype = photosVo.originalSubtype;
239 data.attributesDynamicRangeType = photosVo.dynamicRangeType;
240 data.attributesFrontCamera = photosVo.frontCamera;
241 data.attributesMovingPhotoEffectMode = photosVo.movingPhotoEffectMode;
242 data.attributesCoverPosition = photosVo.coverPosition;
243 data.attributesIsRectificationCover = photosVo.isRectificationCover;
244 data.exifRotate = photosVo.exifRotate;
245 data.attributesEditDataCamera = photosVo.editDataCamera;
246 data.attributesSupportedWatermarkType = photosVo.supportedWatermarkType;
247 data.attributesStrongAssociation = photosVo.strongAssociation;
248 return true;
249 }
250
GetPropertiesInfo(const OnFetchPhotosVo & photosVo,CloudMediaPullDataDto & data)251 bool CloudMediaPhotoControllerProcessor::GetPropertiesInfo(const OnFetchPhotosVo &photosVo, CloudMediaPullDataDto &data)
252 {
253 data.basicCreatedTime = photosVo.createTime;
254 data.basicEditedTime = photosVo.dualEditTime;
255 data.attributesEditedTimeMs = photosVo.editedTimeMs;
256 data.modifiedTime = photosVo.editedTimeMs;
257 data.attributesDateYear = photosVo.dateYear;
258 data.attributesDateMonth = photosVo.dateMonth;
259 data.attributesDateDay = photosVo.dateDay;
260 data.attributesEditTime = photosVo.editTime;
261 data.propertiesFirstUpdateTime = photosVo.firstVisitTime;
262 data.attributesMetaDateModified = photosVo.metaDateModified;
263 return true;
264 }
265
GetCloudInfo(const OnFetchPhotosVo & photosVo,CloudMediaPullDataDto & data)266 bool CloudMediaPhotoControllerProcessor::GetCloudInfo(const OnFetchPhotosVo &photosVo, CloudMediaPullDataDto &data)
267 {
268 data.cloudId = photosVo.cloudId;
269 data.attributesFixVersion = photosVo.fixVersion;
270 data.basicCloudVersion = photosVo.version;
271 data.basicIsDelete = photosVo.isDelete;
272 data.hasAttributes = photosVo.hasAttributes;
273 data.hasProperties = photosVo.hasproperties;
274 return true;
275 }
276
GetAlbumInfo(const OnFetchPhotosVo & photosVo,CloudMediaPullDataDto & data)277 bool CloudMediaPhotoControllerProcessor::GetAlbumInfo(const OnFetchPhotosVo &photosVo, CloudMediaPullDataDto &data)
278 {
279 data.attributesSrcAlbumIds = photosVo.sourceAlbumIds;
280 return true;
281 }
282
ConvertToCloudMediaPullData(const OnFetchPhotosVo & photosVo)283 CloudMediaPullDataDto CloudMediaPhotoControllerProcessor::ConvertToCloudMediaPullData(const OnFetchPhotosVo &photosVo)
284 {
285 CloudMediaPullDataDto data;
286 this->GetBasicInfo(photosVo, data);
287 this->GetAttributesInfo(photosVo, data);
288 this->GetPropertiesInfo(photosVo, data);
289 this->GetCloudInfo(photosVo, data);
290 this->GetAlbumInfo(photosVo, data);
291 return data;
292 }
293
ConvertToPhotoDto(const OnCreateRecord & recordVo)294 PhotosDto CloudMediaPhotoControllerProcessor::ConvertToPhotoDto(const OnCreateRecord &recordVo)
295 {
296 PhotosDto record;
297 record.fileId = recordVo.fileId;
298 record.localId = recordVo.localId;
299 record.rotation = recordVo.rotation;
300 record.fileType = recordVo.fileType;
301 record.size = recordVo.size;
302 record.createTime = recordVo.createTime;
303 record.modifiedTime = recordVo.modifiedTime;
304 record.editedTimeMs = recordVo.editedTimeMs;
305 record.metaDateModified = recordVo.metaDateModified;
306 record.version = recordVo.version;
307 record.cloudId = recordVo.cloudId;
308 record.path = recordVo.path;
309 record.fileName = recordVo.fileName;
310 record.sourcePath = recordVo.sourcePath;
311 record.isSuccess = recordVo.isSuccess;
312 record.errorType = recordVo.errorType;
313 record.serverErrorCode = recordVo.serverErrorCode;
314 record.livePhotoCachePath = recordVo.livePhotoCachePath;
315 record.errorDetails = recordVo.errorDetails;
316 return record;
317 }
318
ConvertToPhotosDto(const OnFileDirtyRecord & recordVo,PhotosDto & dto)319 void CloudMediaPhotoControllerProcessor::ConvertToPhotosDto(const OnFileDirtyRecord &recordVo, PhotosDto &dto)
320 {
321 dto.fileId = recordVo.fileId;
322 dto.rotation = recordVo.rotation;
323 dto.fileType = recordVo.fileType;
324 dto.size = recordVo.size;
325 dto.createTime = recordVo.createTime;
326 dto.modifiedTime = recordVo.modifyTime;
327 dto.version = recordVo.version;
328 dto.cloudId = recordVo.cloudId;
329 dto.path = recordVo.path;
330 dto.fileName = recordVo.fileName;
331 dto.sourcePath = recordVo.sourcePath;
332 dto.metaDateModified = recordVo.metaDateModified;
333 dto.errorDetails = recordVo.errorDetails;
334 dto.serverErrorCode = recordVo.serverErrorCode;
335 dto.errorType = recordVo.errorType;
336 dto.isSuccess = recordVo.isSuccess;
337 return;
338 }
339
ConvertToPhotosDto(const OnModifyRecord & recordVo,PhotosDto & dto)340 void CloudMediaPhotoControllerProcessor::ConvertToPhotosDto(const OnModifyRecord &recordVo, PhotosDto &dto)
341 {
342 dto.cloudId = recordVo.cloudId;
343 dto.fileId = recordVo.fileId;
344 dto.fileName = recordVo.fileName;
345 dto.modifiedTime = recordVo.modifyTime;
346 dto.metaDateModified = recordVo.metaDateModified;
347 dto.path = recordVo.path;
348 dto.version = recordVo.version;
349 dto.isSuccess = recordVo.isSuccess;
350 dto.errorType = recordVo.errorType;
351 dto.serverErrorCode = recordVo.serverErrorCode;
352 dto.errorDetails = recordVo.errorDetails;
353 return;
354 }
355
GetReportFailureDto(const ReportFailureReqBody & reqBody)356 ReportFailureDto CloudMediaPhotoControllerProcessor::GetReportFailureDto(const ReportFailureReqBody &reqBody)
357 {
358 ReportFailureDto reportFailureDto;
359 reportFailureDto.apiCode = reqBody.apiCode;
360 reportFailureDto.errorCode = reqBody.errorCode;
361 reportFailureDto.fileId = reqBody.fileId;
362 reportFailureDto.cloudId = reqBody.cloudId;
363 return reportFailureDto;
364 }
365 } // namespace OHOS::Media::CloudSync