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