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