• 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 #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