• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2024 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 #include "cloud_sync_notify_handler.h"
17 
18 #include <sys/stat.h>
19 
20 #include "cloud_media_asset_manager.h"
21 #include "cloud_media_asset_types.h"
22 #include "cloud_sync_utils.h"
23 #include "medialibrary_album_fusion_utils.h"
24 #include "medialibrary_album_operations.h"
25 #include "notify_responsibility_chain_factory.h"
26 #include "result_set_utils.h"
27 #include "thumbnail_service.h"
28 #include "medialibrary_notify.h"
29 #include "medialibrary_photo_operations.h"
30 #include "medialibrary_rdb_utils.h"
31 #include "parameters.h"
32 #include "photo_album_column.h"
33 #include "media_log.h"
34 #include "dfx_const.h"
35 
36 using namespace std;
37 
38 namespace OHOS {
39 namespace Media {
40 using ChangeType = DataShare::DataShareObserver::ChangeType;
41 
42 const std::string INVALID_ZERO_ID = "0";
43 
IsCloudInsertTaskPriorityHigh()44 static bool IsCloudInsertTaskPriorityHigh()
45 {
46     int32_t cloudSyncStatus = static_cast<int32_t>(system::GetParameter(CLOUDSYNC_STATUS_KEY, "0").at(0) - '0');
47     return cloudSyncStatus == CloudSyncStatus::FIRST_FIVE_HUNDRED ||
48         cloudSyncStatus == CloudSyncStatus::INCREMENT_DOWNLOAD;
49 }
50 
IsCloudNotifyInfoValid(const string & cloudNotifyInfo)51 static inline bool IsCloudNotifyInfoValid(const string& cloudNotifyInfo)
52 {
53     CHECK_AND_RETURN_RET(!cloudNotifyInfo.empty(), false);
54 
55     for (char const& ch : cloudNotifyInfo) {
56         if (isdigit(ch) == 0) {
57             return false;
58         }
59     }
60     return true;
61 }
62 
UpdateCloudAssetDownloadTask(const std::list<Uri> & uris)63 static void UpdateCloudAssetDownloadTask(const std::list<Uri> &uris)
64 {
65     string uriString = uris.front().ToString();
66     auto pos = uriString.find_last_of('/');
67     CHECK_AND_RETURN_LOG(pos != std::string::npos, "Current status is not suitable for SetIsThumbnailUpdate");
68     string idString = uriString.substr(pos + 1);
69     CHECK_AND_RETURN_LOG(IsCloudNotifyInfoValid(idString), "Failed to check idString");
70     CloudMediaAssetManager::GetInstance().SetIsThumbnailUpdate();
71 }
72 
HandleInsertEvent(const std::list<Uri> & uris)73 void CloudSyncNotifyHandler::HandleInsertEvent(const std::list<Uri> &uris)
74 {
75     bool isCloudInsertTaskPriorityHigh = IsCloudInsertTaskPriorityHigh();
76     if (!isCloudInsertTaskPriorityHigh && !ThumbnailService::GetInstance()->GetCurrentStatusForTask()) {
77         MEDIA_INFO_LOG("current status is not suitable for task");
78         return;
79     }
80     for (auto &uri : uris) {
81         string uriString = uri.ToString();
82         auto pos = uriString.find_last_of('/');
83         if (pos == string::npos) {
84             continue;
85         }
86         string idString = uriString.substr(pos + 1);
87         if (idString.compare(INVALID_ZERO_ID) == 0 || !IsCloudNotifyInfoValid(idString)) {
88             MEDIA_WARN_LOG("cloud observer get no valid fileId and uri : %{public}s", uriString.c_str());
89             continue;
90         }
91         ThumbnailService::GetInstance()->CreateAstcCloudDownload(idString, isCloudInsertTaskPriorityHigh);
92     }
93 }
94 
HandleDeleteEvent(const std::list<Uri> & uris)95 void CloudSyncNotifyHandler::HandleDeleteEvent(const std::list<Uri> &uris)
96 {
97     for (auto &uri : uris) {
98         string uriString = uri.ToString();
99         auto dateTakenPos = uriString.rfind('/');
100         if (dateTakenPos == string::npos) {
101             continue;
102         }
103         auto fileIdPos = uriString.rfind('/', dateTakenPos - 1);
104         if (fileIdPos == string::npos) {
105             continue;
106         }
107 
108         string dateTaken = uriString.substr(dateTakenPos + 1);
109         string fileId = uriString.substr(fileIdPos + 1, dateTakenPos - fileIdPos - 1);
110         if (!IsCloudNotifyInfoValid(dateTaken) || !IsCloudNotifyInfoValid(fileId)) {
111             MEDIA_WARN_LOG("cloud observer get no valid uri : %{public}s", uriString.c_str());
112             continue;
113         }
114 
115         ThumbnailService::GetInstance()->DeleteAstcWithFileIdAndDateTaken(fileId, dateTaken);
116         MediaLibraryPhotoOperations::HasDroppedThumbnailSize(fileId);
117     }
118 }
119 
HandleTimeUpdateEvent(const std::list<Uri> & uris)120 void CloudSyncNotifyHandler::HandleTimeUpdateEvent(const std::list<Uri> &uris)
121 {
122     for (auto &uri : uris) {
123         string uriString = uri.ToString();
124         auto newDateTakenPos = uriString.rfind('/');
125         if (newDateTakenPos == string::npos) {
126             continue;
127         }
128         auto formerDateTakenPos = uriString.rfind('/', newDateTakenPos - 1);
129         if (formerDateTakenPos == string::npos) {
130             continue;
131         }
132         auto fileIdPos = uriString.rfind('/', formerDateTakenPos - 1);
133         if (fileIdPos == string::npos) {
134             continue;
135         }
136 
137         string newDateTaken = uriString.substr(newDateTakenPos + 1);
138         string formerDateTaken = uriString.substr(formerDateTakenPos + 1, newDateTakenPos - formerDateTakenPos - 1);
139         string fileId = uriString.substr(fileIdPos + 1, formerDateTakenPos - fileIdPos - 1);
140         if (!IsCloudNotifyInfoValid(newDateTaken) || !IsCloudNotifyInfoValid(formerDateTaken) ||
141             !IsCloudNotifyInfoValid(fileId)) {
142             MEDIA_WARN_LOG("cloud observer get no valid uri : %{public}s", uriString.c_str());
143             continue;
144         }
145 
146         ThumbnailService::GetInstance()->UpdateAstcWithNewDateTaken(fileId, newDateTaken, formerDateTaken);
147     }
148 }
149 
HandleExtraEvent(const std::list<Uri> & uris,const ChangeType & type)150 void CloudSyncNotifyHandler::HandleExtraEvent(const std::list<Uri> &uris, const ChangeType &type)
151 {
152     ExtraChangeType extraType = static_cast<ExtraChangeType>(type);
153     if (extraType == ExtraChangeType::PHOTO_TIME_UPDATE) {
154         HandleTimeUpdateEvent(uris);
155         return;
156     }
157     MEDIA_DEBUG_LOG("change type is %{public}d, no need ThumbnailObserverOnChange", type);
158 }
159 
ThumbnailObserverOnChange(const list<Uri> & uris,const ChangeType & type)160 void CloudSyncNotifyHandler::ThumbnailObserverOnChange(const list<Uri> &uris, const ChangeType &type)
161 {
162     MediaLibraryRdbUtils::SetNeedRefreshAlbum(true);
163     switch (type) {
164         case ChangeType::INSERT:
165             HandleInsertEvent(uris);
166             UpdateCloudAssetDownloadTask(uris);
167             break;
168         case ChangeType::DELETE:
169             HandleDeleteEvent(uris);
170             break;
171         default:
172             HandleExtraEvent(uris, type);
173             break;
174     }
175 }
176 
HandleDirtyDataFix(const std::list<Uri> & uris,const CloudSyncErrType & errType)177 void CloudSyncNotifyHandler::HandleDirtyDataFix(const std::list<Uri> &uris, const CloudSyncErrType &errType)
178 {
179     MEDIA_INFO_LOG("HandleDirtyDataFix start, err: %{public}d", static_cast<int32_t>(errType));
180     MediaLibraryRdbUtils::SetNeedRefreshAlbum(true);
181     switch (errType) {
182         case CloudSyncErrType::CONTENT_NOT_FOUND:
183             HandleContentNotFound(uris);
184             break;
185         case CloudSyncErrType::THM_NOT_FOUND:
186             HandleThumbnailNotFound(uris);
187             break;
188         case CloudSyncErrType::LCD_NOT_FOUND:
189             HandleLCDNotFound(uris);
190             break;
191         case CloudSyncErrType::LCD_SIZE_IS_TOO_LARGE:
192             HandleLCDSizeTooLarge(uris);
193             break;
194         case CloudSyncErrType::CONTENT_SIZE_IS_ZERO:
195             HandleContentSizeIsZero(uris);
196             break;
197         case CloudSyncErrType::ALBUM_NOT_FOUND:
198             HandleAlbumNotFound(uris);
199             break;
200         case CloudSyncErrType::THM_GENERATE_FAILED:
201             HandleThumbnailGenerateFailed(uris);
202             break;
203         default:
204             MEDIA_ERR_LOG("HandleDirtyDataFix, Unrecognized error type : %{public}d", errType);
205         }
206 }
207 
GetfileIdFromPastDirtyDataFixUri(std::string uriString)208 std::string CloudSyncNotifyHandler::GetfileIdFromPastDirtyDataFixUri(std::string uriString)
209 {
210     auto fileIdPos = uriString.rfind('/');
211     if (fileIdPos == string::npos) {
212         return "";
213     }
214     std::string fileId = uriString.substr(fileIdPos + 1, uriString.size() - fileIdPos);
215     return fileId;
216 }
217 
HandleContentNotFound(const std::list<Uri> & uris)218 void CloudSyncNotifyHandler::HandleContentNotFound(const std::list<Uri> &uris)
219 {
220     for (auto &uri : uris) {
221         std::string uriString = uri.ToString();
222         std::string fileId = GetfileIdFromPastDirtyDataFixUri(uriString);
223         if (fileId == "") {
224             continue;
225         }
226         if (fileId.compare(INVALID_ZERO_ID) == 0 || !IsCloudNotifyInfoValid(fileId)) {
227             MEDIA_WARN_LOG("cloud observer get no valid uri : %{public}s", uriString.c_str());
228             continue;
229         }
230         MEDIA_INFO_LOG(
231             "ContentNotFound, uri : %{public}s", uriString.c_str());
232     }
233 }
234 
HandleThumbnailNotFound(const std::list<Uri> & uris)235 void CloudSyncNotifyHandler::HandleThumbnailNotFound(const std::list<Uri> &uris)
236 {
237     for (auto &uri : uris) {
238         std::string uriString = uri.ToString();
239         std::string fileId = GetfileIdFromPastDirtyDataFixUri(uriString);
240         if (fileId == "") {
241             continue;
242         }
243         if (fileId.compare(INVALID_ZERO_ID) == 0 || !IsCloudNotifyInfoValid(fileId)) {
244             MEDIA_WARN_LOG("cloud observer get no valid uri : %{public}s", uriString.c_str());
245             continue;
246         }
247 
248         int32_t err = ThumbnailService::GetInstance()->CreateThumbnailPastDirtyDataFix(fileId);
249         if (err != E_SUCCESS) {
250             MEDIA_ERR_LOG("ThumbnailService CreateThumbnailPastDirtyDataFix failed : %{public}d", err);
251             continue;
252         }
253         MEDIA_INFO_LOG("Generate thumbnail %{public}s, success ", uriString.c_str());
254     }
255 }
256 
HandleLCDNotFound(const std::list<Uri> & uris)257 void CloudSyncNotifyHandler::HandleLCDNotFound(const std::list<Uri> &uris)
258 {
259     for (auto &uri : uris) {
260         std::string uriString = uri.ToString();
261         std::string fileId = GetfileIdFromPastDirtyDataFixUri(uriString);
262         if (fileId == "") {
263             continue;
264         }
265         if (fileId.compare(INVALID_ZERO_ID) == 0 || !IsCloudNotifyInfoValid(fileId)) {
266             MEDIA_WARN_LOG("cloud observer get no valid uri : %{public}s", uriString.c_str());
267             continue;
268         }
269 
270         int32_t err = ThumbnailService::GetInstance()->CreateLcdPastDirtyDataFix(fileId);
271         if (err != E_SUCCESS) {
272             MEDIA_ERR_LOG("ThumbnailService CreateLCDPastDirtyDataFix failed : %{public}d", err);
273             continue;
274         }
275         MEDIA_INFO_LOG("Generate Lcd %{public}s, success ", uriString.c_str());
276     }
277     return;
278 }
279 
HandleLCDSizeTooLarge(const std::list<Uri> & uris)280 void CloudSyncNotifyHandler::HandleLCDSizeTooLarge(const std::list<Uri> &uris)
281 {
282     for (auto &uri : uris) {
283         std::string uriString = uri.ToString();
284         std::string fileId = GetfileIdFromPastDirtyDataFixUri(uriString);
285         if (fileId == "") {
286             continue;
287         }
288         if (fileId.compare(INVALID_ZERO_ID) == 0 || !IsCloudNotifyInfoValid(fileId)) {
289             MEDIA_WARN_LOG("cloud observer get no valid uri : %{public}s", uriString.c_str());
290             continue;
291         }
292 
293         int32_t err = ThumbnailService::GetInstance()->CreateLcdPastDirtyDataFix(fileId);
294         if (err != E_SUCCESS) {
295             MEDIA_ERR_LOG("ThumbnailService CreateLcdPastDirtyDataFix failed : %{public}d", err);
296             continue;
297         }
298         MEDIA_INFO_LOG("Regenerate Lcd %{public}s success ", uriString.c_str());
299     }
300     return;
301 }
302 
HandleContentSizeIsZero(const std::list<Uri> & uris)303 void CloudSyncNotifyHandler::HandleContentSizeIsZero(const std::list<Uri> &uris)
304 {
305     for (auto &uri : uris) {
306         std::string uriString = uri.ToString();
307         std::string fileId = GetfileIdFromPastDirtyDataFixUri(uriString);
308         if (fileId == "") {
309             continue;
310         }
311         if (fileId.compare(INVALID_ZERO_ID) == 0 || !IsCloudNotifyInfoValid(fileId)) {
312             MEDIA_WARN_LOG("cloud observer get no valid uri : %{public}s", uriString.c_str());
313             continue;
314         }
315 
316         std::string filePath;
317         auto err = QueryFilePathFromFileId(fileId, filePath);
318         if (err != E_SUCCESS) {
319             MEDIA_ERR_LOG("QueryFilePathFromFileId failed : %{public}d", err);
320             continue;
321         }
322         auto rdbStore = MediaLibraryUnistoreManager::GetInstance().GetRdbStore();
323         int changeRows = 0;
324         struct stat st;
325         err = stat(filePath.c_str(), &st);
326         if (err != E_SUCCESS) {
327             MEDIA_ERR_LOG("stat failed : %{public}d", err);
328             continue;
329         }
330         if (st.st_size == 0) {
331             MEDIA_INFO_LOG("HandleContentSizeIsZero, file size is zero");
332             continue;
333         }
334         NativeRdb::ValuesBucket valuesNew;
335         valuesNew.PutLong(PhotoColumn::MEDIA_SIZE, st.st_size);
336         NativeRdb::RdbPredicates rdbPredicates(PhotoColumn::PHOTOS_TABLE);
337         rdbPredicates.EqualTo(PhotoColumn::MEDIA_ID, fileId);
338         rdbStore->Update(changeRows, valuesNew, rdbPredicates);
339         CHECK_AND_PRINT_LOG(changeRows >= 0, "Failed to update content size , ret = %{public}d", changeRows);
340         MEDIA_INFO_LOG("refresh photo size field to : %{public}d , success", static_cast<int>(st.st_size));
341     }
342     return;
343 }
344 
QueryFilePathFromFileId(const std::string & id,std::string & filePath)345 int32_t CloudSyncNotifyHandler::QueryFilePathFromFileId(const std::string &id, std::string &filePath)
346 {
347     auto rdbStore = MediaLibraryUnistoreManager::GetInstance().GetRdbStore();
348     CHECK_AND_RETURN_RET_LOG(rdbStore != nullptr, E_DB_FAIL, "QueryFilePathFromFileId failed. rdbStore is null");
349     const string sqlQuery = "SELECT * From " + PhotoColumn::PHOTOS_TABLE +
350                             " WHERE " + PhotoColumn::MEDIA_ID + " = " + id;
351     auto resultSet = rdbStore->QuerySql(sqlQuery);
352     CHECK_AND_RETURN_RET_LOG(
353         resultSet != nullptr && resultSet->GoToFirstRow() == NativeRdb::E_OK,
354         E_DB_FAIL, "Query not matched data fails");
355 
356     filePath = get<std::string>(
357         ResultSetUtils::GetValFromColumn(MediaColumn::MEDIA_FILE_PATH, resultSet, ResultSetDataType::TYPE_STRING));
358     return E_OK;
359 }
360 
QueryAlbumLpathFromFileId(const std::string & id,std::string & lpath)361 int32_t CloudSyncNotifyHandler::QueryAlbumLpathFromFileId(const std::string &id, std::string &lpath)
362 {
363     auto rdbStore = MediaLibraryUnistoreManager::GetInstance().GetRdbStore();
364     CHECK_AND_RETURN_RET_LOG(
365         rdbStore != nullptr,
366         E_DB_FAIL, "QueryAlbumLpathFromFileId failed. rdbStore is null");
367     const string sqlQuery = "SELECT * From " + PhotoColumn::PHOTOS_TABLE + " WHERE " + PhotoColumn::MEDIA_ID +
368                             " = " + id;
369     auto resultSet = rdbStore->QuerySql(sqlQuery);
370     CHECK_AND_RETURN_RET_LOG(
371         resultSet != nullptr && resultSet->GoToFirstRow() == NativeRdb::E_OK,
372         E_DB_FAIL, "Query not matched data fails");
373 
374     auto sourcePath = get<std::string>(
375         ResultSetUtils::GetValFromColumn(PhotoColumn::PHOTO_SOURCE_PATH, resultSet, ResultSetDataType::TYPE_STRING));
376     int32_t mediaType = GetInt32Val(PhotoColumn::MEDIA_TYPE, resultSet);
377     int32_t err = MediaLibraryAlbumOperations::GetLPathFromSourcePath(sourcePath, lpath, mediaType);
378     CHECK_AND_RETURN_RET_LOG(err == E_OK, E_DB_FAIL, "GetLPathFromSourcePath fail : %{public}s ", lpath.c_str());
379     MEDIA_INFO_LOG("QueryAlbumLpathFromFileId succcess, lpath is : %{public}s ", lpath.c_str());
380     return E_OK;
381 }
382 
HandleAlbumNotFound(const std::list<Uri> & uris)383 void CloudSyncNotifyHandler::HandleAlbumNotFound(const std::list<Uri> &uris)
384 {
385     for (auto &uri : uris) {
386         std::string uriString = uri.ToString();
387         std::string fileId = GetfileIdFromPastDirtyDataFixUri(uriString);
388         if (fileId == "") {
389             continue;
390         }
391         if (fileId.compare(INVALID_ZERO_ID) == 0 || !IsCloudNotifyInfoValid(fileId)) {
392             MEDIA_WARN_LOG("cloud observer get no valid uri : %{public}s", uriString.c_str());
393             continue;
394         }
395 
396         std::string lpath;
397         int64_t newAlbumId = -1;
398         bool isUserAlbum = false;
399         auto err = QueryAlbumLpathFromFileId(fileId, lpath);
400         if (err != E_SUCCESS) {
401             MEDIA_ERR_LOG("QueryAlbumLpathFromFileId failed : %{public}d", err);
402             continue;
403         }
404         MediaLibraryAlbumOperations::RecoverAlbum(fileId, lpath, isUserAlbum, newAlbumId);
405         if (newAlbumId == -1) {
406             MEDIA_ERR_LOG("HandleAlbumNotFound Fail, Recover album fails");
407             continue;
408         }
409 
410         if (isUserAlbum) {
411         MediaLibraryRdbUtils::UpdateUserAlbumInternal(
412             MediaLibraryUnistoreManager::GetInstance().GetRdbStore(), {to_string(newAlbumId)});
413         } else {
414             MediaLibraryRdbUtils::UpdateSourceAlbumInternal(
415                 MediaLibraryUnistoreManager::GetInstance().GetRdbStore(), {to_string(newAlbumId)});
416         }
417         auto watch = MediaLibraryNotify::GetInstance();
418         if (watch != nullptr) {
419             watch->Notify(MediaFileUtils::GetUriByExtrConditions(
420                 PhotoAlbumColumns::ALBUM_URI_PREFIX, to_string(newAlbumId)), NotifyType::NOTIFY_ADD);
421         }
422     }
423     return;
424 }
425 
HandleThumbnailGenerateFailed(const std::list<Uri> & uris)426 void CloudSyncNotifyHandler::HandleThumbnailGenerateFailed(const std::list<Uri> &uris)
427 {
428     for (auto &uri : uris) {
429         std::string uriString = uri.ToString();
430         std::string fileId = GetfileIdFromPastDirtyDataFixUri(uriString);
431         if (fileId == "") {
432             continue;
433         }
434         if (fileId.compare(INVALID_ZERO_ID) == 0 || !IsCloudNotifyInfoValid(fileId)) {
435             MEDIA_WARN_LOG("cloud observer get no valid uri : %{public}s", uriString.c_str());
436             continue;
437         }
438 
439         int32_t err = ThumbnailService::GetInstance()->RegenerateThumbnailFromCloud(fileId);
440         if (err != E_SUCCESS) {
441             MEDIA_ERR_LOG("RegenerateThumbnailFromCloud failed : %{public}d", err);
442             continue;
443         }
444         MEDIA_INFO_LOG("RegenerateThumbnailFromCloud %{public}s success, uri: ", uriString.c_str());
445     }
446 }
447 
MakeResponsibilityChain()448 void CloudSyncNotifyHandler::MakeResponsibilityChain()
449 {
450     string uriString = notifyInfo_.uris.front().ToString();
451     MEDIA_DEBUG_LOG("observer get first uri is : %{public}s", uriString.c_str());
452 
453     if (uriString.find("file://cloudsync/Photo/HeightError/") != string::npos) {
454         return;
455     }
456 
457     if (uriString.find("file://cloudsync/Photo/DownloadSuccessed/") != string::npos) {
458         return;
459     }
460 
461     if (uriString.find(PhotoColumn::PHOTO_CLOUD_URI_PREFIX) != string::npos) {
462         ThumbnailObserverOnChange(notifyInfo_.uris, notifyInfo_.type);
463     }
464 
465     if (uriString.find("file://cloudsync/Photo/RebuildCloudData/") != string::npos) {
466         MEDIA_INFO_LOG("Get cloud rebuild cloud data notification : %{public}s",
467             "file://cloudsync/Photo/RebuildCloudData/");
468         MediaLibraryAlbumFusionUtils::CleanInvalidCloudAlbumAndData();
469     }
470 
471     shared_ptr<BaseHandler> chain = nullptr;
472 
473     if (uriString.find(PhotoAlbumColumns::ALBUM_CLOUD_URI_PREFIX) != string::npos) {
474         if (notifyInfo_.type == ChangeType::DELETE) {
475             chain = NotifyResponsibilityChainFactory::CreateChain(ALBUM_DELETE);
476         } else {
477             chain = NotifyResponsibilityChainFactory::CreateChain(TRANSPARENT);
478         }
479     }
480 
481     if (uriString.find(PhotoColumn::PHOTO_CLOUD_URI_PREFIX) != string::npos) {
482         if (notifyInfo_.type == ChangeType::UPDATE || notifyInfo_.type == ChangeType::OTHER) {
483             chain = NotifyResponsibilityChainFactory::CreateChain(PHOTODELETE);
484         } else {
485             chain = NotifyResponsibilityChainFactory::CreateChain(TRANSPARENT);
486         }
487     }
488 
489     if (uriString.find(PhotoColumn::PHOTO_CLOUD_GALLERY_REBUILD_URI_PREFIX) != string::npos) {
490         HandleDirtyDataFix(notifyInfo_.uris, static_cast<CloudSyncErrType>(notifyInfo_.type));
491     }
492     CloudSyncHandleData handleData;
493     handleData.orgInfo = notifyInfo_;
494     if (chain == nullptr) {
495         MEDIA_ERR_LOG("uri OR type is Invalid");
496         return;
497     }
498     chain->Handle(handleData);
499 }
500 } //namespace Media
501 } //namespace OHOS
502