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 #define MLOG_TAG "Media_Client"
16
17 #include "cloud_media_album_handler.h"
18
19 #include <string>
20
21 #include "media_log.h"
22 #include "user_define_ipc_client.h"
23 #include "media_req_vo.h"
24 #include "media_resp_vo.h"
25 #include "cloud_media_operation_code.h"
26 #include "medialibrary_errno.h"
27 #include "cloud_mdkrecord_photo_album_vo.h"
28 #include "on_create_records_album_vo.h"
29 #include "on_fetch_records_album_vo.h"
30 #include "on_delete_records_album_vo.h"
31 #include "on_delete_albums_vo.h"
32 #include "on_mdirty_records_album_vo.h"
33 #include "mdk_record_album_data.h"
34 #include "cloud_album_data_convert.h"
35 #include "get_check_records_album_vo.h"
36 #include "failed_size_resp_vo.h"
37
38 namespace OHOS::Media::CloudSync {
SetUserId(const int32_t & userId)39 void CloudMediaAlbumHandler::SetUserId(const int32_t &userId)
40 {
41 this->userId_ = userId;
42 }
43
SetTraceId(const std::string & traceId)44 void CloudMediaAlbumHandler::SetTraceId(const std::string &traceId)
45 {
46 this->traceId_ = traceId;
47 }
48
GetTraceId() const49 std::string CloudMediaAlbumHandler::GetTraceId() const
50 {
51 return this->traceId_;
52 }
53
InitAlbumReqData(MDKRecordAlbumData & albumData,OnFetchRecordsAlbumReqBody::AlbumReqData & data)54 static void InitAlbumReqData(MDKRecordAlbumData &albumData, OnFetchRecordsAlbumReqBody::AlbumReqData &data)
55 {
56 auto lpathOpt = albumData.GetlPath();
57 if (lpathOpt.has_value()) {
58 data.localPath = lpathOpt.value();
59 }
60 auto albumTypeOpt = albumData.GetAlbumType();
61 if (albumTypeOpt.has_value()) {
62 data.albumType = albumTypeOpt.value();
63 } else {
64 data.albumType = PhotoAlbumType::INVALID;
65 }
66 auto albumSubTypeOpt = albumData.GetAlbumSubType();
67 if (albumSubTypeOpt.has_value()) {
68 data.albumSubType = albumSubTypeOpt.value();
69 }
70 auto albumDateAddedOpt = albumData.GetDateAdded();
71 if (albumDateAddedOpt.has_value()) {
72 data.albumDateAdded = albumDateAddedOpt.value();
73 }
74 auto albumDateModifiedOpt = albumData.GetDateModified();
75 if (albumDateModifiedOpt.has_value()) {
76 data.albumDateModified = albumDateModifiedOpt.value();
77 }
78 auto albumNameOpt = albumData.GetAlbumName();
79 if (albumNameOpt.has_value()) {
80 data.albumName = albumNameOpt.value();
81 }
82 auto albumBundleNameOpt = albumData.GetBundleName();
83 if (albumBundleNameOpt.has_value()) {
84 data.albumBundleName = albumBundleNameOpt.value();
85 }
86 std::optional<std::string> cloudIdOpt = albumData.GetCloudId();
87 if (cloudIdOpt.has_value()) {
88 data.cloudId = cloudIdOpt.value();
89 }
90 auto albumsCoverUriSource = albumData.GetCoverUriSource();
91 if (albumsCoverUriSource.has_value()) {
92 data.coverUriSource = albumsCoverUriSource.value();
93 }
94 auto albumsCoverCloudId = albumData.GetCoverCloudId();
95 if (albumsCoverCloudId.has_value()) {
96 data.coverCloudId = albumsCoverCloudId.value();
97 }
98 }
99
100 /**
101 * stats: 引用入参,按照以下顺序进行返回 [新增,合一,元数据修改,文件修改,删除]:
102 * stats: [100, 30, 50, 10, 10]
103 */
OnFetchRecords(const std::vector<MDKRecord> & records,std::vector<CloudMetaData> & newData,std::vector<CloudMetaData> & fdirtyData,std::vector<std::string> & failedRecords,std::vector<int32_t> & stats)104 int32_t CloudMediaAlbumHandler::OnFetchRecords(const std::vector<MDKRecord> &records,
105 std::vector<CloudMetaData> &newData, std::vector<CloudMetaData> &fdirtyData,
106 std::vector<std::string> &failedRecords, std::vector<int32_t> &stats)
107 {
108 CHECK_AND_RETURN_RET_LOG(!records.empty(), E_OK, "OnFetchRecords param error, records is empty");
109 OnFetchRecordsAlbumReqBody req;
110 OnFetchRecordsAlbumRespBody resp;
111 MEDIA_INFO_LOG("OnFetchRecords %{public}zu records", records.size());
112 for (auto record : records) {
113 auto cloudId = record.GetRecordId();
114 OnFetchRecordsAlbumReqBody::AlbumReqData data;
115 data.cloudId = cloudId;
116 MDKRecordAlbumData albumData = MDKRecordAlbumData(record);
117 InitAlbumReqData(albumData, data);
118 data.albumDateCreated = static_cast<int64_t>(record.GetCreateTime());
119 data.isDelete = record.GetIsDelete();
120 req.albums.emplace_back(data);
121 MEDIA_INFO_LOG("OnFetchRecords AlbumReqData:%{public}s", data.ToString().c_str());
122 }
123 uint32_t operationCode = static_cast<uint32_t>(CloudMediaAlbumOperationCode::CMD_ON_FETCH_RECORDS);
124 int32_t ret =
125 IPC::UserDefineIPCClient().SetUserId(userId_).SetTraceId(this->traceId_).Post(operationCode, req, resp);
126 stats = resp.stats;
127 failedRecords = resp.failedRecords;
128 return ret;
129 }
130
OnDentryFileInsert(std::vector<MDKRecord> & records,std::vector<std::string> & failedRecords)131 int32_t CloudMediaAlbumHandler::OnDentryFileInsert(
132 std::vector<MDKRecord> &records, std::vector<std::string> &failedRecords)
133 {
134 MEDIA_INFO_LOG("OnDentryFileInsert, records size: %{public}zu", records.size());
135 uint32_t operationCode = static_cast<uint32_t>(CloudMediaAlbumOperationCode::CMD_ON_DENTRY_FILE_INSERT);
136 return IPC::UserDefineIPCClient().SetUserId(userId_).SetTraceId(this->traceId_).Post(operationCode);
137 }
138
139 // album does not handle this operation <GetRetryRecords>.
GetRetryRecords(std::vector<std::string> & records)140 int32_t CloudMediaAlbumHandler::GetRetryRecords(std::vector<std::string> &records)
141 {
142 MEDIA_INFO_LOG("OnDentryFileInsert, records size: %{public}zu", records.size());
143 return E_OK;
144 }
145
146 // album does not handle this operation <GetCheckRecords>.
GetCheckRecords(const std::vector<std::string> & cloudIds,std::unordered_map<std::string,CloudCheckData> & checkRecords)147 int32_t CloudMediaAlbumHandler::GetCheckRecords(
148 const std::vector<std::string> &cloudIds, std::unordered_map<std::string, CloudCheckData> &checkRecords)
149 {
150 MEDIA_INFO_LOG("album does not handle this operation <GetCheckRecords>.");
151 return E_OK;
152 }
153
GetCreatedRecords(std::vector<MDKRecord> & records,int32_t size)154 int32_t CloudMediaAlbumHandler::GetCreatedRecords(std::vector<MDKRecord> &records, int32_t size)
155 {
156 MEDIA_INFO_LOG("enter CloudMediaAlbumHandler::GetCreatedRecords");
157 CloudMdkRecordPhotoAlbumReqBody reqBody;
158 reqBody.size = size;
159 CloudMdkRecordPhotoAlbumRespBody respBody;
160 uint32_t operationCode = static_cast<uint32_t>(CloudMediaAlbumOperationCode::CMD_GET_CREATED_RECORDS);
161 int32_t ret = IPC::UserDefineIPCClient().SetUserId(userId_).SetTraceId(this->traceId_)
162 .Post(operationCode, reqBody, respBody);
163 if (ret != E_OK) {
164 MEDIA_ERR_LOG("GetCreatedRecords fail to call service function");
165 return E_ERR;
166 }
167 std::vector<CloudMdkRecordPhotoAlbumVo> createdRecord = respBody.GetPhotoAlbumRecords();
168 CloudAlbumDataConvert dataConvertor{CloudAlbumOperationType::PHOTO_ALBUM_CREATE};
169 std::map<std::string, MDKRecordField> data;
170 for (auto it = createdRecord.begin(); it != createdRecord.end(); ++it) {
171 std::shared_ptr<MDKRecord> dkRecord = dataConvertor.ConvertToMdkRecord(*it);
172 if (dkRecord != nullptr) {
173 dkRecord->GetRecordData(data);
174 data["albumId"] = MDKRecordField(dkRecord->GetRecordId());
175 dkRecord->SetRecordData(data);
176 records.push_back(*dkRecord);
177 } else {
178 MEDIA_ERR_LOG("CloudMediaAlbumHandler::GetCreatedRecords ConvertToMdkRecord Error");
179 }
180 dkRecord = nullptr;
181 }
182 return E_OK;
183 }
184
GetMetaModifiedRecords(std::vector<MDKRecord> & records,int32_t size,int32_t dirtyType)185 int32_t CloudMediaAlbumHandler::GetMetaModifiedRecords(std::vector<MDKRecord> &records, int32_t size, int32_t dirtyType)
186 {
187 MEDIA_INFO_LOG("enter CloudMediaAlbumHandler::GetMetaModifiedRecords");
188 CloudMdkRecordPhotoAlbumReqBody reqBody;
189 reqBody.size = size;
190 CloudMdkRecordPhotoAlbumRespBody respBody;
191 uint32_t operationCode = static_cast<uint32_t>(CloudMediaAlbumOperationCode::CMD_GET_META_MODIFIED_RECORDS);
192 int32_t ret = IPC::UserDefineIPCClient().SetUserId(userId_).SetTraceId(this->traceId_)
193 .Post(operationCode, reqBody, respBody);
194 if (ret != E_OK) {
195 MEDIA_ERR_LOG("GetMetaModifiedRecords fail to call service function");
196 return E_ERR;
197 }
198 std::vector<CloudMdkRecordPhotoAlbumVo> createdRecord = respBody.GetPhotoAlbumRecords();
199 MEDIA_INFO_LOG("Enter CloudMediaAlbumHandler::GetMetaModifiedRecords size: %{public}zu", createdRecord.size());
200 CloudAlbumDataConvert dataConvertor{CloudAlbumOperationType::PHOTO_ALBUM_METADATA_MODIF};
201 for (auto it = createdRecord.begin(); it != createdRecord.end(); ++it) {
202 std::shared_ptr<MDKRecord> dkRecord = dataConvertor.ConvertToMdkRecord(*it);
203 if (dkRecord != nullptr) {
204 records.push_back(*dkRecord);
205 dkRecord = nullptr;
206 }
207 }
208 return E_OK;
209 }
210 // album does not handle this operation <GetFileModifiedRecords>.
GetFileModifiedRecords(std::vector<MDKRecord> & records,int32_t size)211 int32_t CloudMediaAlbumHandler::GetFileModifiedRecords(std::vector<MDKRecord> &records, int32_t size)
212 {
213 return E_OK;
214 }
215
GetDeletedRecords(std::vector<MDKRecord> & records,int32_t size)216 int32_t CloudMediaAlbumHandler::GetDeletedRecords(std::vector<MDKRecord> &records, int32_t size)
217 {
218 MEDIA_INFO_LOG("enter CloudMediaAlbumHandler::GetDeletedRecords %{public}d", size);
219 CloudMdkRecordPhotoAlbumReqBody reqBody;
220 reqBody.size = size;
221 CloudMdkRecordPhotoAlbumRespBody respBody;
222 uint32_t operationCode = static_cast<uint32_t>(CloudMediaAlbumOperationCode::CMD_GET_DELETED_RECORDS);
223 int32_t ret = IPC::UserDefineIPCClient().SetUserId(userId_).SetTraceId(this->traceId_)
224 .Post(operationCode, reqBody, respBody);
225 if (ret != E_OK) {
226 MEDIA_ERR_LOG("GetDeletedRecords fail to call service function");
227 return E_ERR;
228 }
229 std::vector<CloudMdkRecordPhotoAlbumVo> createdRecord = respBody.GetPhotoAlbumRecords();
230 CloudAlbumDataConvert dataConvertor{CloudAlbumOperationType::PHOTO_ALBUM_DELETE};
231 for (auto it = createdRecord.begin(); it != createdRecord.end(); ++it) {
232 std::shared_ptr<MDKRecord> dkRecord = dataConvertor.ConvertToMdkRecord(*it);
233 if (dkRecord != nullptr) {
234 records.push_back(*dkRecord);
235 dkRecord = nullptr;
236 }
237 }
238 return E_OK;
239 }
240 // album does not handle this operation <GetRetryRecords>.
GetCopyRecords(std::vector<MDKRecord> & records,int32_t size)241 int32_t CloudMediaAlbumHandler::GetCopyRecords(std::vector<MDKRecord> &records, int32_t size)
242 {
243 return E_OK;
244 }
245
OnCreateRecords(const std::map<std::string,MDKRecordOperResult> & map,int32_t & failSize)246 int32_t CloudMediaAlbumHandler::OnCreateRecords(
247 const std::map<std::string, MDKRecordOperResult> &map, int32_t &failSize)
248 {
249 MEDIA_INFO_LOG("enter CloudMediaAlbumHandler::OnCreateRecords %{public}zu", map.size());
250 CHECK_AND_RETURN_RET_LOG(!map.empty(), E_OK, "OnCreateRecords Album param error");
251 OnCreateRecordsAlbumReqBody reqBody;
252 CloudAlbumDataConvert dataConvertor{CloudAlbumOperationType::PHOTO_ALBUM_CREATE};
253 for (auto &entry : map) {
254 if (entry.first.empty()) {
255 MEDIA_INFO_LOG("OnCreateRecords is failed");
256 continue;
257 }
258 OnCreateRecordsAlbumReqBodyAlbumData record;
259 if (dataConvertor.ConvertToOnCreateRecord(entry.first, entry.second, record) != E_OK) {
260 MEDIA_ERR_LOG("OnCreateRecords Album ConvertToOnCreateRecord error");
261 continue;
262 }
263 MEDIA_INFO_LOG("OnCreateRecords Album:%{public}s", record.ToString().c_str());
264 reqBody.albums.emplace_back(record);
265 }
266 uint32_t operationCode = static_cast<uint32_t>(CloudMediaAlbumOperationCode::CMD_ON_CREATE_RECORDS);
267 FailedSizeResp resp;
268 resp.failedSize = 0;
269 int32_t ret = IPC::UserDefineIPCClient().SetUserId(userId_).SetTraceId(this->traceId_)
270 .Post(operationCode, reqBody, resp);
271 failSize = resp.failedSize;
272 MEDIA_INFO_LOG("OnCreateRecords Album Resp:%{public}s Ret:%{public}d", resp.ToString().c_str(), ret);
273 return ret;
274 }
275
OnMdirtyRecords(const std::map<std::string,MDKRecordOperResult> & map,int32_t & failSize)276 int32_t CloudMediaAlbumHandler::OnMdirtyRecords(
277 const std::map<std::string, MDKRecordOperResult> &map, int32_t &failSize)
278 {
279 MEDIA_INFO_LOG("enter CloudMediaAlbumHandler::OnMdirtyRecords %{public}zu", map.size());
280 CHECK_AND_RETURN_RET_LOG(!map.empty(), E_OK, "OnMdirtyRecords Album param error");
281 OnMdirtyRecordsAlbumReqBody reqBody;
282 CloudAlbumDataConvert dataConvertor{CloudAlbumOperationType::PHOTO_ALBUM_METADATA_MODIF};
283 for (auto &entry : map) {
284 OnMdirtyAlbumRecord record;
285 if (dataConvertor.BuildModifyRecord(entry.first, entry.second, record) != E_OK) {
286 MEDIA_ERR_LOG("OnMdirtyRecords Album BuildModifyRecord error");
287 continue;
288 }
289 MEDIA_INFO_LOG("OnMdirtyRecords Album Record:%{public}s", record.ToString().c_str());
290 reqBody.AddMdirtyRecord(record);
291 }
292 OnMdirtyRecordsAlbumRespBody respBody;
293 respBody.failSize = 0;
294 uint32_t operationCode = static_cast<uint32_t>(CloudMediaAlbumOperationCode::CMD_ON_MDIRTY_RECORDS);
295 int32_t ret = IPC::UserDefineIPCClient().SetUserId(userId_).SetTraceId(this->traceId_)
296 .Post(operationCode, reqBody, respBody);
297 failSize = respBody.failSize;
298 return ret;
299 }
300
OnFdirtyRecords(const std::map<std::string,MDKRecordOperResult> & map,int32_t & failSize)301 int32_t CloudMediaAlbumHandler::OnFdirtyRecords(
302 const std::map<std::string, MDKRecordOperResult> &map, int32_t &failSize)
303 {
304 MEDIA_INFO_LOG("CloudMediaAlbumHandler::OnFdirtyRecords, size: %{public}zu", map.size());
305 CHECK_AND_RETURN_RET_LOG(!map.empty(), E_OK, "OnFdirtyRecords Album param error");
306 uint32_t operationCode = static_cast<uint32_t>(CloudMediaAlbumOperationCode::CMD_ON_FDIRTY_RECORDS);
307 return IPC::UserDefineIPCClient().SetUserId(userId_).SetTraceId(this->traceId_).Post(operationCode);
308 }
309
OnDeleteRecords(const std::map<std::string,MDKRecordOperResult> & map,int32_t & failSize)310 int32_t CloudMediaAlbumHandler::OnDeleteRecords(
311 const std::map<std::string, MDKRecordOperResult> &map, int32_t &failSize)
312 {
313 MEDIA_INFO_LOG("enter CloudMediaAlbumHandler::OnDeleteRecords, size: %{public}zu", map.size());
314 CHECK_AND_RETURN_RET_LOG(!map.empty(), E_OK, "OnDeleteRecords Album param error");
315 OnDeleteRecordsAlbumReqBody reqBody;
316 OnDeleteRecordsAlbumRespBody respBody;
317 respBody.failSize = 0;
318 for (auto &entry : map) {
319 const MDKRecordOperResult &result = entry.second;
320 OnDeleteAlbumData album;
321 album.cloudId = entry.first;
322 album.isSuccess = result.IsSuccess();
323 reqBody.AddSuccessResult(album);
324 MEDIA_INFO_LOG("OnDeleteRecords, IsSuccess: %{public}d, ErrorCode: %{public}d, cloudId: %{public}s",
325 result.IsSuccess(),
326 result.GetDKError().serverErrorCode,
327 entry.first.c_str());
328 }
329 uint32_t operationCode = static_cast<uint32_t>(CloudMediaAlbumOperationCode::CMD_ON_DELETE_RECORDS);
330 int32_t ret = IPC::UserDefineIPCClient().SetUserId(userId_).SetTraceId(this->traceId_)
331 .Post(operationCode, reqBody, respBody);
332 failSize = respBody.failSize;
333 return ret;
334 }
335
OnCopyRecords(const std::map<std::string,MDKRecordOperResult> & map,int32_t & failSize)336 int32_t CloudMediaAlbumHandler::OnCopyRecords(const std::map<std::string, MDKRecordOperResult> &map, int32_t &failSize)
337 {
338 MEDIA_INFO_LOG("OnCopyRecords, map size: %{public}zu", map.size());
339 CHECK_AND_RETURN_RET_LOG(!map.empty(), E_OK, "OnCopyRecords Album param error");
340 uint32_t operationCode = static_cast<uint32_t>(CloudMediaAlbumOperationCode::CMD_ON_COPY_RECORDS);
341 return IPC::UserDefineIPCClient().SetUserId(userId_).SetTraceId(this->traceId_).Post(operationCode);
342 }
343
OnStartSync()344 int32_t CloudMediaAlbumHandler::OnStartSync()
345 {
346 MEDIA_INFO_LOG("OnStartSync enter");
347 uint32_t operationCode = static_cast<uint32_t>(CloudMediaAlbumOperationCode::CMD_ON_START_SYNC);
348 return IPC::UserDefineIPCClient().SetUserId(userId_).SetTraceId(this->traceId_).Post(operationCode);
349 }
350
OnCompleteSync()351 int32_t CloudMediaAlbumHandler::OnCompleteSync()
352 {
353 MEDIA_INFO_LOG("OnCompleteSync enter");
354 uint32_t operationCode = static_cast<uint32_t>(CloudMediaAlbumOperationCode::CMD_ON_COMPLETE_SYNC);
355 return IPC::UserDefineIPCClient().SetUserId(userId_).SetTraceId(this->traceId_).Post(operationCode);
356 }
357
OnCompletePull()358 int32_t CloudMediaAlbumHandler::OnCompletePull()
359 {
360 MEDIA_INFO_LOG("OnCompletePull enter");
361 uint32_t operationCode = static_cast<uint32_t>(CloudMediaAlbumOperationCode::CMD_ON_COMPLETE_PULL);
362 return IPC::UserDefineIPCClient().SetUserId(userId_).SetTraceId(this->traceId_).Post(operationCode);
363 }
364
OnCompletePush()365 int32_t CloudMediaAlbumHandler::OnCompletePush()
366 {
367 MEDIA_INFO_LOG("OnCompletePush enter");
368 uint32_t operationCode = static_cast<uint32_t>(CloudMediaAlbumOperationCode::CMD_ON_COMPLETE_PUSH);
369 return IPC::UserDefineIPCClient().SetUserId(userId_).SetTraceId(this->traceId_).Post(operationCode);
370 }
371
OnCompleteCheck()372 int32_t CloudMediaAlbumHandler::OnCompleteCheck()
373 {
374 MEDIA_INFO_LOG("CloudMediaDataClient::OnCompleteCheck begin");
375 uint32_t operationCode = static_cast<uint32_t>(CloudMediaAlbumOperationCode::CMD_ON_COMPLETE_CHECK);
376 return IPC::UserDefineIPCClient().SetUserId(userId_).SetTraceId(this->traceId_).Post(operationCode);
377 }
378 } // namespace OHOS::Media::CloudSync