• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2022 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 #include "userfilemgr_uri.h"
16 #define MLOG_TAG "Extension"
17 
18 #include "media_datashare_ext_ability.h"
19 
20 #include <cstdlib>
21 
22 #include "ability_info.h"
23 #include "app_mgr_client.h"
24 #include "dataobs_mgr_client.h"
25 #include "datashare_ext_ability_context.h"
26 #include "hilog_wrapper.h"
27 #include "ipc_skeleton.h"
28 #include "media_datashare_stub_impl.h"
29 #include "media_file_utils.h"
30 #include "media_log.h"
31 #include "media_scanner_manager.h"
32 #include "medialibrary_data_manager.h"
33 #include "medialibrary_errno.h"
34 #include "medialibrary_subscriber.h"
35 #include "medialibrary_uripermission_operations.h"
36 #include "napi/native_api.h"
37 #include "napi/native_node_api.h"
38 #include "permission_utils.h"
39 #include "photo_album_column.h"
40 #include "runtime.h"
41 #include "singleton.h"
42 #include "system_ability_definition.h"
43 #ifdef MEDIALIBRARY_SECURITY_OPEN
44 #include "sec_comp_kit.h"
45 #endif
46 
47 using namespace std;
48 using namespace OHOS::AppExecFwk;
49 using namespace OHOS::NativeRdb;
50 using namespace OHOS::DistributedKv;
51 using namespace OHOS::Media;
52 using namespace OHOS::DataShare;
53 
54 namespace OHOS {
55 namespace AbilityRuntime {
56 using namespace OHOS::AppExecFwk;
57 using DataObsMgrClient = OHOS::AAFwk::DataObsMgrClient;
58 
Create(const unique_ptr<Runtime> & runtime)59 MediaDataShareExtAbility* MediaDataShareExtAbility::Create(const unique_ptr<Runtime>& runtime)
60 {
61     return new MediaDataShareExtAbility(static_cast<Runtime&>(*runtime));
62 }
63 
MediaDataShareExtAbility(Runtime & runtime)64 MediaDataShareExtAbility::MediaDataShareExtAbility(Runtime& runtime) : DataShareExtAbility(), runtime_(runtime) {}
65 
~MediaDataShareExtAbility()66 MediaDataShareExtAbility::~MediaDataShareExtAbility()
67 {
68 }
69 
Init(const shared_ptr<AbilityLocalRecord> & record,const shared_ptr<OHOSApplication> & application,shared_ptr<AbilityHandler> & handler,const sptr<IRemoteObject> & token)70 void MediaDataShareExtAbility::Init(const shared_ptr<AbilityLocalRecord> &record,
71     const shared_ptr<OHOSApplication> &application, shared_ptr<AbilityHandler> &handler,
72     const sptr<IRemoteObject> &token)
73 {
74     if ((record == nullptr) || (application == nullptr) || (handler == nullptr) || (token == nullptr)) {
75         MEDIA_ERR_LOG("MediaDataShareExtAbility::init failed, some object is nullptr");
76         DelayedSingleton<AppExecFwk::AppMgrClient>::GetInstance()->KillApplicationSelf();
77         return;
78     }
79     DataShareExtAbility::Init(record, application, handler, token);
80 }
81 
OnStart(const AAFwk::Want & want)82 void MediaDataShareExtAbility::OnStart(const AAFwk::Want &want)
83 {
84     MEDIA_INFO_LOG("%{public}s begin.", __func__);
85     Extension::OnStart(want);
86     auto context = AbilityRuntime::Context::GetApplicationContext();
87     if (context == nullptr) {
88         MEDIA_ERR_LOG("Failed to get context");
89         DelayedSingleton<AppExecFwk::AppMgrClient>::GetInstance()->KillApplicationSelf();
90         return;
91     }
92     MEDIA_INFO_LOG("%{public}s runtime language  %{public}d", __func__, runtime_.GetLanguage());
93 
94     auto dataManager = MediaLibraryDataManager::GetInstance();
95     if (dataManager == nullptr) {
96         MEDIA_ERR_LOG("Failed to get dataManager");
97         DelayedSingleton<AppExecFwk::AppMgrClient>::GetInstance()->KillApplicationSelf();
98         return;
99     }
100     auto extensionContext = GetContext();
101     int32_t ret = dataManager->InitMediaLibraryMgr(context, extensionContext);
102     if (ret != E_OK) {
103         MEDIA_ERR_LOG("Failed to init MediaLibraryMgr");
104         DelayedSingleton<AppExecFwk::AppMgrClient>::GetInstance()->KillApplicationSelf();
105         return;
106     }
107     dataManager->SetOwner(static_pointer_cast<MediaDataShareExtAbility>(shared_from_this()));
108 
109     auto scannerManager = MediaScannerManager::GetInstance();
110     if (scannerManager != nullptr) {
111         scannerManager->Start();
112     } else {
113         MEDIA_ERR_LOG("Failed to get scanner manager");
114         DelayedSingleton<AppExecFwk::AppMgrClient>::GetInstance()->KillApplicationSelf();
115         return;
116     }
117 
118     Media::MedialibrarySubscriber::Subscribe();
119     MEDIA_INFO_LOG("%{public}s end.", __func__);
120 }
121 
OnStop()122 void MediaDataShareExtAbility::OnStop()
123 {
124     MEDIA_INFO_LOG("%{public}s begin.", __func__);
125     auto scannerManager = MediaScannerManager::GetInstance();
126     if (scannerManager != nullptr) {
127         scannerManager->Stop();
128     }
129     MediaLibraryDataManager::GetInstance()->ClearMediaLibraryMgr();
130     MEDIA_INFO_LOG("%{public}s end.", __func__);
131 }
132 
OnConnect(const AAFwk::Want & want)133 sptr<IRemoteObject> MediaDataShareExtAbility::OnConnect(const AAFwk::Want &want)
134 {
135     MEDIA_INFO_LOG("%{public}s begin. ", __func__);
136     Extension::OnConnect(want);
137     sptr<MediaDataShareStubImpl> remoteObject = new (nothrow) MediaDataShareStubImpl(
138         static_pointer_cast<MediaDataShareExtAbility>(shared_from_this()),
139         nullptr);
140     if (remoteObject == nullptr) {
141         MEDIA_ERR_LOG("%{public}s No memory allocated for DataShareStubImpl", __func__);
142         return nullptr;
143     }
144     MEDIA_INFO_LOG("%{public}s end.", __func__);
145     return remoteObject->AsObject();
146 }
147 
GetFileTypes(const Uri & uri,const string & mimeTypeFilter)148 vector<string> MediaDataShareExtAbility::GetFileTypes(const Uri &uri, const string &mimeTypeFilter)
149 {
150     vector<string> ret;
151     return ret;
152 }
153 
FillV10Perms(const MediaType mediaType,const bool containsRead,const bool containsWrite,vector<string> & perm)154 static void FillV10Perms(const MediaType mediaType, const bool containsRead, const bool containsWrite,
155     vector<string> &perm)
156 {
157     if (containsRead) {
158         if (mediaType == MEDIA_TYPE_IMAGE || mediaType == MEDIA_TYPE_VIDEO ||
159             mediaType == Media::MEDIA_TYPE_PHOTO || mediaType == Media::MEDIA_TYPE_ALBUM) {
160             perm.push_back(PERM_READ_IMAGEVIDEO);
161         } else if (mediaType == MEDIA_TYPE_AUDIO) {
162             perm.push_back(PERM_READ_AUDIO);
163         } else if (mediaType == MEDIA_TYPE_FILE) {
164             perm.push_back(PERM_READ_IMAGEVIDEO);
165             perm.push_back(PERM_READ_AUDIO);
166             perm.push_back(PERM_READ_DOCUMENT);
167         }
168     }
169     if (containsWrite) {
170         if (mediaType == MEDIA_TYPE_IMAGE || mediaType == MEDIA_TYPE_VIDEO ||
171             mediaType == Media::MEDIA_TYPE_PHOTO || mediaType == Media::MEDIA_TYPE_ALBUM) {
172             perm.push_back(PERM_WRITE_IMAGEVIDEO);
173         } else if (mediaType == MEDIA_TYPE_AUDIO) {
174             perm.push_back(PERM_WRITE_AUDIO);
175         } else if (mediaType == MEDIA_TYPE_FILE) {
176             perm.push_back(PERM_WRITE_IMAGEVIDEO);
177             perm.push_back(PERM_WRITE_AUDIO);
178             perm.push_back(PERM_WRITE_DOCUMENT);
179         }
180     }
181 }
182 
FillDeprecatedPerms(const bool containsRead,const bool containsWrite,vector<string> & perm)183 static void FillDeprecatedPerms(const bool containsRead, const bool containsWrite, vector<string> &perm)
184 {
185     if (containsRead) {
186         perm.push_back(PERMISSION_NAME_READ_MEDIA);
187     }
188     if (containsWrite) {
189         perm.push_back(PERMISSION_NAME_WRITE_MEDIA);
190     }
191 }
192 
ContainsFlag(const string & mode,const char flag)193 static inline bool ContainsFlag(const string &mode, const char flag)
194 {
195     return mode.find(flag) != string::npos;
196 }
197 
CheckOpenFilePermission(MediaLibraryCommand & cmd,string & mode)198 static int32_t CheckOpenFilePermission(MediaLibraryCommand &cmd, string &mode)
199 {
200     MEDIA_DEBUG_LOG("uri: %{public}s mode: %{public}s", cmd.GetUri().ToString().c_str(), mode.c_str());
201     MediaType mediaType = MediaFileUri::GetMediaTypeFromUri(cmd.GetUri().ToString());
202     const bool containsRead = ContainsFlag(mode, 'r');
203     const bool containsWrite = ContainsFlag(mode, 'w');
204 
205     vector<string> perms;
206     FillV10Perms(mediaType, containsRead, containsWrite, perms);
207     int32_t err = (mediaType == MEDIA_TYPE_FILE) ?
208         (PermissionUtils::CheckHasPermission(perms) ? E_SUCCESS : E_PERMISSION_DENIED) :
209         (PermissionUtils::CheckCallerPermission(perms) ? E_SUCCESS : E_PERMISSION_DENIED);
210     if (err == E_SUCCESS) {
211         return E_SUCCESS;
212     }
213     // Try to check deprecated permissions
214     perms.clear();
215     FillDeprecatedPerms(containsRead, containsWrite, perms);
216     return PermissionUtils::CheckCallerPermission(perms) ? E_SUCCESS : E_PERMISSION_DENIED;
217 }
218 
SystemApiCheck(MediaLibraryCommand & cmd)219 static int32_t SystemApiCheck(MediaLibraryCommand &cmd)
220 {
221     static const set<OperationObject> SYSTEM_API_OBJECTS = {
222         OperationObject::UFM_PHOTO,
223         OperationObject::UFM_AUDIO,
224         OperationObject::UFM_ALBUM,
225         OperationObject::UFM_MAP,
226         OperationObject::SMART_ALBUM,
227 
228         OperationObject::ALL_DEVICE,
229         OperationObject::ACTIVE_DEVICE,
230     };
231 
232     static const set<string> SYSTEM_API_URIS = {
233         // Deleting asset permanently from system is only allowed for system apps.
234         URI_DELETE_PHOTOS,
235         // Deleting asset to trash album directly without a pop-up box is only allowed for system apps.
236         UFM_DELETE_PHOTOS,
237         PAH_DELETE_PHOTOS,
238     };
239 
240     OperationObject obj = cmd.GetOprnObject();
241     string uri = cmd.GetUriStringWithoutSegment();
242     if (SYSTEM_API_OBJECTS.find(obj) != SYSTEM_API_OBJECTS.end() ||
243         (SYSTEM_API_URIS.find(uri) != SYSTEM_API_URIS.end())) {
244         if (!PermissionUtils::IsSystemApp()) {
245             MEDIA_ERR_LOG("Systemapi should only be called by system applications!");
246             return E_CHECK_SYSTEMAPP_FAIL;
247         }
248     }
249     return E_SUCCESS;
250 }
251 
NativeSACheck(MediaLibraryCommand & cmd)252 static int32_t NativeSACheck(MediaLibraryCommand &cmd)
253 {
254     static const set<string> NATIVE_SA_URIS = {
255         URI_DELETE_TOOL
256     };
257     string uri = cmd.GetUriStringWithoutSegment();
258     if (NATIVE_SA_URIS.find(uri) != NATIVE_SA_URIS.end()) {
259         if (!PermissionUtils::IsNativeSAApp()) {
260             MEDIA_ERR_LOG("Native sa check failed!");
261             return E_CHECK_NATIVE_SA_FAIL;
262         }
263     }
264     return E_SUCCESS;
265 }
266 
HandleMediaVolumePerm()267 static inline int32_t HandleMediaVolumePerm()
268 {
269     return PermissionUtils::CheckCallerPermission(PERMISSION_NAME_READ_MEDIA) ? E_SUCCESS : E_PERMISSION_DENIED;
270 }
271 
HandleBundlePermCheck()272 static inline int32_t HandleBundlePermCheck()
273 {
274     bool ret = PermissionUtils::CheckCallerPermission(PERMISSION_NAME_WRITE_MEDIA);
275     if (ret) {
276         return E_SUCCESS;
277     }
278 
279     return PermissionUtils::CheckHasPermission(WRITE_PERMS_V10) ? E_SUCCESS : E_PERMISSION_DENIED;
280 }
281 
HandleSecurityComponentPermission(MediaLibraryCommand & cmd)282 static int32_t HandleSecurityComponentPermission(MediaLibraryCommand &cmd)
283 {
284     if (cmd.GetUri().ToString().find(OPRN_CREATE_COMPONENT) != string::npos) {
285 #ifdef MEDIALIBRARY_SECURITY_OPEN
286         auto tokenId = PermissionUtils::GetTokenId();
287         if (!Security::SecurityComponent::SecCompKit::ReduceAfterVerifySavePermission(tokenId)) {
288             return E_NEED_FURTHER_CHECK;
289         }
290         return E_SUCCESS;
291 #else
292         MEDIA_ERR_LOG("Security component is not existed");
293         return E_NEED_FURTHER_CHECK;
294 #endif
295     }
296     return E_NEED_FURTHER_CHECK;
297 }
298 
UserFileMgrPermissionCheck(MediaLibraryCommand & cmd,const bool isWrite)299 static int32_t UserFileMgrPermissionCheck(MediaLibraryCommand &cmd, const bool isWrite)
300 {
301     static const set<OperationObject> USER_FILE_MGR_OBJECTS = {
302         OperationObject::UFM_PHOTO,
303         OperationObject::UFM_AUDIO,
304         OperationObject::UFM_ALBUM,
305         OperationObject::UFM_MAP,
306     };
307 
308     OperationObject obj = cmd.GetOprnObject();
309     if (USER_FILE_MGR_OBJECTS.find(obj) == USER_FILE_MGR_OBJECTS.end()) {
310         return E_NEED_FURTHER_CHECK;
311     }
312 
313     int32_t err = HandleSecurityComponentPermission(cmd);
314     if (err == E_SUCCESS || (err != SUCCESS && err != E_NEED_FURTHER_CHECK)) {
315         return err;
316     }
317 
318     string perm;
319     if (obj == OperationObject::UFM_AUDIO) {
320         perm = isWrite ? PERM_WRITE_AUDIO : PERM_READ_AUDIO;
321     } else {
322         perm = isWrite ? PERM_WRITE_IMAGEVIDEO : PERM_READ_IMAGEVIDEO;
323     }
324     return PermissionUtils::CheckCallerPermission(perm) ? E_SUCCESS : E_PERMISSION_DENIED;
325 }
326 
PhotoAccessHelperPermCheck(MediaLibraryCommand & cmd,const bool isWrite)327 static int32_t PhotoAccessHelperPermCheck(MediaLibraryCommand &cmd, const bool isWrite)
328 {
329     static const set<OperationObject> PHOTO_ACCESS_HELPER_OBJECTS = {
330         OperationObject::PAH_PHOTO,
331         OperationObject::PAH_ALBUM,
332         OperationObject::PAH_MAP,
333     };
334 
335     int32_t err = HandleSecurityComponentPermission(cmd);
336     if (err == E_SUCCESS || (err != SUCCESS && err != E_NEED_FURTHER_CHECK)) {
337         return err;
338     }
339 
340     OperationObject obj = cmd.GetOprnObject();
341     if (PHOTO_ACCESS_HELPER_OBJECTS.find(obj) == PHOTO_ACCESS_HELPER_OBJECTS.end()) {
342         return E_NEED_FURTHER_CHECK;
343     }
344     return PermissionUtils::CheckCallerPermission(
345         isWrite ? PERM_WRITE_IMAGEVIDEO : PERM_READ_IMAGEVIDEO) ? E_SUCCESS : E_PERMISSION_DENIED;
346 }
347 
HandleNoPermCheck(MediaLibraryCommand & cmd)348 static int32_t HandleNoPermCheck(MediaLibraryCommand &cmd)
349 {
350     static const set<string> NO_NEED_PERM_CHECK_URI = {
351         URI_CLOSE_FILE,
352         MEDIALIBRARY_DIRECTORY_URI,
353     };
354 
355     static const set<OperationObject> NO_NEED_PERM_CHECK_OBJ = {
356         OperationObject::ALL_DEVICE,
357         OperationObject::ACTIVE_DEVICE,
358     };
359 
360     string uri = cmd.GetUri().ToString();
361     OperationObject obj = cmd.GetOprnObject();
362     if (NO_NEED_PERM_CHECK_URI.find(uri) != NO_NEED_PERM_CHECK_URI.end() ||
363         NO_NEED_PERM_CHECK_OBJ.find(obj) != NO_NEED_PERM_CHECK_OBJ.end()) {
364         return E_SUCCESS;
365     }
366     return E_NEED_FURTHER_CHECK;
367 }
368 
HandleSpecialObjectPermission(MediaLibraryCommand & cmd,bool isWrite)369 static int32_t HandleSpecialObjectPermission(MediaLibraryCommand &cmd, bool isWrite)
370 {
371     int err = HandleNoPermCheck(cmd);
372     if (err == E_SUCCESS || (err != SUCCESS && err != E_NEED_FURTHER_CHECK)) {
373         return err;
374     }
375 
376     OperationObject obj = cmd.GetOprnObject();
377     if (obj == OperationObject::MEDIA_VOLUME) {
378         return HandleMediaVolumePerm();
379     } else if (obj == OperationObject::BUNDLE_PERMISSION) {
380         return HandleBundlePermCheck();
381     }
382 
383     return E_NEED_FURTHER_CHECK;
384 }
385 
UnifyOprnObject(MediaLibraryCommand & cmd)386 static void UnifyOprnObject(MediaLibraryCommand &cmd)
387 {
388     static const unordered_map<OperationObject, OperationObject> UNIFY_OP_OBJECT_MAP = {
389         { OperationObject::UFM_PHOTO, OperationObject::FILESYSTEM_PHOTO },
390         { OperationObject::UFM_AUDIO, OperationObject::FILESYSTEM_AUDIO },
391         { OperationObject::UFM_ALBUM, OperationObject::PHOTO_ALBUM },
392         { OperationObject::UFM_MAP, OperationObject::PHOTO_MAP },
393         { OperationObject::PAH_PHOTO, OperationObject::FILESYSTEM_PHOTO },
394         { OperationObject::PAH_ALBUM, OperationObject::PHOTO_ALBUM },
395         { OperationObject::PAH_MAP, OperationObject::PHOTO_MAP },
396     };
397 
398     OperationObject obj = cmd.GetOprnObject();
399     if (UNIFY_OP_OBJECT_MAP.find(obj) != UNIFY_OP_OBJECT_MAP.end()) {
400         cmd.SetOprnObject(UNIFY_OP_OBJECT_MAP.at(obj));
401     }
402 }
403 
CheckPermFromUri(MediaLibraryCommand & cmd,bool isWrite)404 static int32_t CheckPermFromUri(MediaLibraryCommand &cmd, bool isWrite)
405 {
406     MEDIA_DEBUG_LOG("uri: %{public}s object: %{public}d, opType: %{public}d isWrite: %{public}d",
407         cmd.GetUri().ToString().c_str(), cmd.GetOprnObject(), cmd.GetOprnType(), isWrite);
408 
409     int err = SystemApiCheck(cmd);
410     if (err != E_SUCCESS) {
411         return err;
412     }
413 
414     err = NativeSACheck(cmd);
415     if (err != E_SUCCESS) {
416         return err;
417     }
418 
419     err = PhotoAccessHelperPermCheck(cmd, isWrite);
420     if (err == E_SUCCESS || (err != SUCCESS && err != E_NEED_FURTHER_CHECK)) {
421         UnifyOprnObject(cmd);
422         return err;
423     }
424     err = UserFileMgrPermissionCheck(cmd, isWrite);
425     if (err == E_SUCCESS || (err != SUCCESS && err != E_NEED_FURTHER_CHECK)) {
426         UnifyOprnObject(cmd);
427         return err;
428     }
429     err = HandleSpecialObjectPermission(cmd, isWrite);
430     if (err == E_SUCCESS || (err != SUCCESS && err != E_NEED_FURTHER_CHECK)) {
431         UnifyOprnObject(cmd);
432         return err;
433     }
434 
435     // Finally, we should check the permission of medialibrary interfaces.
436     string perm = isWrite ? PERMISSION_NAME_WRITE_MEDIA : PERMISSION_NAME_READ_MEDIA;
437     err = PermissionUtils::CheckCallerPermission(perm) ? E_SUCCESS : E_PERMISSION_DENIED;
438     if (err < 0) {
439         return err;
440     }
441     UnifyOprnObject(cmd);
442     return E_SUCCESS;
443 }
444 
OpenFile(const Uri & uri,const string & mode)445 int MediaDataShareExtAbility::OpenFile(const Uri &uri, const string &mode)
446 {
447 #ifdef MEDIALIBRARY_COMPATIBILITY
448     string realUriStr = MediaFileUtils::GetRealUriFromVirtualUri(uri.ToString());
449     Uri realUri(realUriStr);
450     MediaLibraryCommand command(realUri, Media::OperationType::OPEN);
451 
452 #else
453     MediaLibraryCommand command(uri, Media::OperationType::OPEN);
454 #endif
455 
456     string unifyMode = mode;
457     transform(unifyMode.begin(), unifyMode.end(), unifyMode.begin(), ::tolower);
458 
459     int err = CheckOpenFilePermission(command, unifyMode);
460     if (err == E_PERMISSION_DENIED) {
461         err = UriPermissionOperations::CheckUriPermission(command.GetUriStringWithoutSegment(), unifyMode);
462         if (err != E_OK) {
463             MEDIA_ERR_LOG("Permission Denied! err = %{public}d", err);
464             return err;
465         }
466     } else if (err < 0) {
467         return err;
468     }
469     if (command.GetUri().ToString().find(MEDIA_DATA_DB_THUMBNAIL) != string::npos) {
470         command.SetOprnObject(OperationObject::THUMBNAIL);
471     }
472     return MediaLibraryDataManager::GetInstance()->OpenFile(command, unifyMode);
473 }
474 
OpenRawFile(const Uri & uri,const string & mode)475 int MediaDataShareExtAbility::OpenRawFile(const Uri &uri, const string &mode)
476 {
477     return 0;
478 }
479 
Insert(const Uri & uri,const DataShareValuesBucket & value)480 int MediaDataShareExtAbility::Insert(const Uri &uri, const DataShareValuesBucket &value)
481 {
482     MediaLibraryCommand cmd(uri);
483     int32_t err = CheckPermFromUri(cmd, true);
484     if (err < 0) {
485         return err;
486     }
487 
488     return MediaLibraryDataManager::GetInstance()->Insert(cmd, value);
489 }
490 
InsertExt(const Uri & uri,const DataShareValuesBucket & value,string & result)491 int MediaDataShareExtAbility::InsertExt(const Uri &uri, const DataShareValuesBucket &value, string &result)
492 {
493     MediaLibraryCommand cmd(uri);
494     int32_t err = CheckPermFromUri(cmd, true);
495     if (err < 0) {
496         return err;
497     }
498 
499     return MediaLibraryDataManager::GetInstance()->InsertExt(cmd, value, result);
500 }
501 
Update(const Uri & uri,const DataSharePredicates & predicates,const DataShareValuesBucket & value)502 int MediaDataShareExtAbility::Update(const Uri &uri, const DataSharePredicates &predicates,
503     const DataShareValuesBucket &value)
504 {
505     MediaLibraryCommand cmd(uri);
506     int32_t err = CheckPermFromUri(cmd, true);
507     if (err < 0) {
508         return err;
509     }
510 
511     return MediaLibraryDataManager::GetInstance()->Update(cmd, value, predicates);
512 }
513 
Delete(const Uri & uri,const DataSharePredicates & predicates)514 int MediaDataShareExtAbility::Delete(const Uri &uri, const DataSharePredicates &predicates)
515 {
516     MediaLibraryCommand cmd(uri, Media::OperationType::DELETE);
517     int err = CheckPermFromUri(cmd, true);
518     if (err < 0) {
519         return err;
520     }
521 
522     return MediaLibraryDataManager::GetInstance()->Delete(cmd, predicates);
523 }
524 
Query(const Uri & uri,const DataSharePredicates & predicates,vector<string> & columns,DatashareBusinessError & businessError)525 shared_ptr<DataShareResultSet> MediaDataShareExtAbility::Query(const Uri &uri,
526     const DataSharePredicates &predicates, vector<string> &columns, DatashareBusinessError &businessError)
527 {
528     MediaLibraryCommand cmd(uri);
529     int32_t err = CheckPermFromUri(cmd, false);
530     if (err < 0) {
531         businessError.SetCode(err);
532         return nullptr;
533     }
534 
535     int errCode = businessError.GetCode();
536     auto queryResultSet = MediaLibraryDataManager::GetInstance()->Query(cmd, columns, predicates, errCode);
537     businessError.SetCode(to_string(errCode));
538     if (queryResultSet == nullptr) {
539         MEDIA_ERR_LOG("queryResultSet is nullptr! errCode: %{public}d", errCode);
540         return nullptr;
541     }
542     shared_ptr<DataShareResultSet> resultSet = make_shared<DataShareResultSet>(queryResultSet);
543     return resultSet;
544 }
545 
GetType(const Uri & uri)546 string MediaDataShareExtAbility::GetType(const Uri &uri)
547 {
548     MEDIA_INFO_LOG("%{public}s begin.", __func__);
549     auto ret = MediaLibraryDataManager::GetInstance()->GetType(uri);
550     MEDIA_INFO_LOG("%{public}s end.", __func__);
551     return ret;
552 }
553 
BatchInsert(const Uri & uri,const vector<DataShareValuesBucket> & values)554 int MediaDataShareExtAbility::BatchInsert(const Uri &uri, const vector<DataShareValuesBucket> &values)
555 {
556     MediaLibraryCommand cmd(uri);
557     int32_t err = CheckPermFromUri(cmd, true);
558     if (err < 0) {
559         return err;
560     }
561     return MediaLibraryDataManager::GetInstance()->BatchInsert(cmd, values);
562 }
563 
RegisterObserver(const Uri & uri,const sptr<AAFwk::IDataAbilityObserver> & dataObserver)564 bool MediaDataShareExtAbility::RegisterObserver(const Uri &uri, const sptr<AAFwk::IDataAbilityObserver> &dataObserver)
565 {
566     MEDIA_INFO_LOG("%{public}s begin.", __func__);
567     auto obsMgrClient = DataObsMgrClient::GetInstance();
568     if (obsMgrClient == nullptr) {
569         MEDIA_ERR_LOG("%{public}s obsMgrClient is nullptr", __func__);
570         return false;
571     }
572 
573     ErrCode ret = obsMgrClient->RegisterObserver(uri, dataObserver);
574     if (ret != ERR_OK) {
575         MEDIA_ERR_LOG("%{public}s obsMgrClient->RegisterObserver error return %{public}d", __func__, ret);
576         return false;
577     }
578     MEDIA_INFO_LOG("%{public}s end.", __func__);
579     return true;
580 }
581 
UnregisterObserver(const Uri & uri,const sptr<AAFwk::IDataAbilityObserver> & dataObserver)582 bool MediaDataShareExtAbility::UnregisterObserver(const Uri &uri, const sptr<AAFwk::IDataAbilityObserver> &dataObserver)
583 {
584     MEDIA_INFO_LOG("%{public}s begin.", __func__);
585     auto obsMgrClient = DataObsMgrClient::GetInstance();
586     if (obsMgrClient == nullptr) {
587         MEDIA_ERR_LOG("%{public}s obsMgrClient is nullptr", __func__);
588         return false;
589     }
590 
591     ErrCode ret = obsMgrClient->UnregisterObserver(uri, dataObserver);
592     if (ret != ERR_OK) {
593         MEDIA_ERR_LOG("%{public}s obsMgrClient->UnregisterObserver error return %{public}d", __func__, ret);
594         return false;
595     }
596     MEDIA_INFO_LOG("%{public}s end.", __func__);
597     return true;
598 }
599 
NotifyChange(const Uri & uri)600 bool MediaDataShareExtAbility::NotifyChange(const Uri &uri)
601 {
602     auto obsMgrClient = DataObsMgrClient::GetInstance();
603     if (obsMgrClient == nullptr) {
604         MEDIA_ERR_LOG("%{public}s obsMgrClient is nullptr", __func__);
605         return false;
606     }
607 
608     ErrCode ret = obsMgrClient->NotifyChange(uri);
609     if (ret != ERR_OK) {
610         MEDIA_ERR_LOG("%{public}s obsMgrClient->NotifyChange error return %{public}d", __func__, ret);
611         return false;
612     }
613     return true;
614 }
615 
NormalizeUri(const Uri & uri)616 Uri MediaDataShareExtAbility::NormalizeUri(const Uri &uri)
617 {
618     MEDIA_INFO_LOG("%{public}s begin.", __func__);
619     auto ret = uri;
620     MEDIA_INFO_LOG("%{public}s end.", __func__);
621     return ret;
622 }
623 
DenormalizeUri(const Uri & uri)624 Uri MediaDataShareExtAbility::DenormalizeUri(const Uri &uri)
625 {
626     MEDIA_INFO_LOG("%{public}s begin.", __func__);
627     auto ret = uri;
628     MEDIA_INFO_LOG("%{public}s end.", __func__);
629     return ret;
630 }
631 } // namespace AbilityRuntime
632 } // namespace OHOS
633