1 /* 2 * Copyright (C) 2021 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 #ifndef OHOS_MEDIALIBRARY_DATA_ABILITY_H 17 #define OHOS_MEDIALIBRARY_DATA_ABILITY_H 18 19 #include <string> 20 21 #include "ability.h" 22 #include "ability_loader.h" 23 #include "abs_rdb_predicates.h" 24 #include "data_ability_predicates.h" 25 #include "device_manager.h" 26 #include "device_manager_callback.h" 27 #include "medialibrary_album_operations.h" 28 #include "medialibrary_smartalbum_map_operations.h" 29 #include "medialibrary_smartalbum_operations.h" 30 #include "media_data_ability_const.h" 31 #include "medialibrary_data_ability_utils.h" 32 #include "medialibrary_device.h" 33 #include "medialibrary_device_info.h" 34 #include "medialibrary_file_operations.h" 35 #include "medialibrary_kvstore_operations.h" 36 #include "media_log.h" 37 #include "rdb_errno.h" 38 #include "rdb_helper.h" 39 #include "rdb_open_callback.h" 40 #include "rdb_store.h" 41 #include "rdb_store_config.h" 42 #include "rdb_types.h" 43 #include "result_set.h" 44 #include "uri.h" 45 #include "values_bucket.h" 46 #include "want.h" 47 #include "hilog/log.h" 48 #include "medialibrary_thumbnail.h" 49 #include "distributed_kv_data_manager.h" 50 #include "timer.h" 51 52 namespace OHOS { 53 namespace Media { 54 // kvstore constants 55 const DistributedKv::AppId KVSTORE_APPID { "com.ohos.medialibrary.MediaLibraryDataA" }; 56 const DistributedKv::StoreId KVSTORE_STOREID { "ringtone" }; 57 enum TableType { 58 TYPE_DATA, 59 TYPE_SMARTALBUM, 60 TYPE_SMARTALBUM_MAP, 61 TYPE_ALBUM_TABLE, 62 TYPE_SMARTALBUMASSETS_TABLE, 63 TYPE_ACTIVE_DEVICE, 64 TYPE_ALL_DEVICE, 65 TYPE_ASSETSMAP_TABLE 66 }; 67 class MediaLibraryInitCallback; 68 class MediaLibraryDeviceStateCallback; 69 class MediaLibraryRdbStoreObserver; 70 class MediaLibraryDataAbility : public AppExecFwk::Ability { 71 public: 72 EXPORT MediaLibraryDataAbility(); 73 EXPORT ~MediaLibraryDataAbility(); 74 75 EXPORT int32_t InitMediaLibraryRdbStore(); 76 EXPORT void InitialiseKvStore(); 77 EXPORT int32_t Insert(const Uri &uri, const NativeRdb::ValuesBucket &value) override; 78 EXPORT int32_t Delete(const Uri &uri, const NativeRdb::DataAbilityPredicates &predicates) override; 79 EXPORT int32_t BatchInsert(const Uri &uri, const std::vector<NativeRdb::ValuesBucket> &values) override; 80 EXPORT int32_t Update(const Uri &uri, const NativeRdb::ValuesBucket &value, 81 const NativeRdb::DataAbilityPredicates &predicates) override; 82 EXPORT std::shared_ptr<NativeRdb::AbsSharedResultSet> Query(const Uri &uri, 83 const std::vector<std::string> &columns, 84 const NativeRdb::DataAbilityPredicates &predicates) override; 85 EXPORT int32_t OpenFile(const Uri &uri, const std::string &mode) override; 86 EXPORT std::string GetType(const Uri &uri) override; 87 88 protected: 89 void OnStart(const AAFwk::Want &want) override; 90 void OnStop() override; 91 92 private: 93 static constexpr const char DEVICE_BUNDLENAME[] = "com.ohos.medialibrary.MediaLibraryDataA"; 94 std::string GetOperationType(const std::string &uri); 95 void ScanFile(const ValuesBucket &values, const shared_ptr<RdbStore> &rdbStore1); 96 void InitDeviceData(); 97 bool SubscribeRdbStoreObserver(); 98 bool UnSubscribeRdbStoreObserver(); 99 bool QuerySync(const std::string &deviceId, const std::string &tableName); 100 bool QuerySync(); 101 102 bool CheckFileNameValid(const ValuesBucket &value); 103 sptr<AppExecFwk::IBundleMgr> GetSysBundleManager(); 104 std::string GetClientBundleName(); 105 bool CheckClientPermission(const std::string& permissionStr); 106 std::string GetClientBundle(int uid); 107 108 int32_t PreCheckInsert(const std::string &uri, const NativeRdb::ValuesBucket &value); 109 110 static const std::string PERMISSION_NAME_READ_MEDIA; 111 static const std::string PERMISSION_NAME_WRITE_MEDIA; 112 std::shared_ptr<DistributedKv::SingleKvStore> kvStorePtr_; 113 DistributedKv::DistributedKvDataManager dataManager_; 114 std::shared_ptr<IMediaScannerClient> scannerClient_; 115 std::shared_ptr<NativeRdb::RdbStore> rdbStore_; 116 std::shared_ptr<MediaLibraryThumbnail> mediaThumbnail_; 117 std::shared_ptr<MediaLibraryDeviceStateCallback> deviceStateCallback_; 118 std::shared_ptr<MediaLibraryInitCallback> deviceInitCallback_; 119 std::shared_ptr<MediaLibraryRdbStoreObserver> rdbStoreObs_; 120 bool isRdbStoreInitialized; 121 std::string bundleName_; 122 OHOS::sptr<AppExecFwk::IBundleMgr> bundleMgr_; 123 }; 124 125 class MediaLibraryDataCallBack : public NativeRdb::RdbOpenCallback { 126 public: 127 int32_t OnCreate(NativeRdb::RdbStore &rdbStore) override; 128 int32_t OnUpgrade(NativeRdb::RdbStore &rdbStore, int32_t oldVersion, int32_t newVersion) override; 129 bool GetDistributedTables(); 130 private: 131 bool isDistributedTables = false; 132 }; 133 134 // Scanner callback objects 135 class ScanFileCallback : public IMediaScannerAppCallback { 136 public: 137 ScanFileCallback() = default; 138 ~ScanFileCallback() = default; 139 void OnScanFinished(const int32_t status, const std::string &uri, const std::string &path) override; 140 }; 141 142 class MediaLibraryInitCallback : public OHOS::DistributedHardware::DmInitCallback { 143 public: ~MediaLibraryInitCallback()144 virtual ~MediaLibraryInitCallback() {} 145 void OnRemoteDied() override; 146 }; 147 148 class MediaLibraryDeviceStateCallback : public OHOS::DistributedHardware::DeviceStateCallback { 149 public: MediaLibraryDeviceStateCallback(std::shared_ptr<NativeRdb::RdbStore> & rdbStore,std::string & bundleName)150 explicit MediaLibraryDeviceStateCallback(std::shared_ptr<NativeRdb::RdbStore> &rdbStore, std::string &bundleName) 151 : bundleName_(bundleName), rdbStore_(rdbStore) {} ~MediaLibraryDeviceStateCallback()152 virtual ~MediaLibraryDeviceStateCallback() {}; 153 void OnDeviceOnline(const OHOS::DistributedHardware::DmDeviceInfo &deviceInfo) override; 154 void OnDeviceReady(const OHOS::DistributedHardware::DmDeviceInfo &deviceInfo) override; 155 void OnDeviceOffline(const OHOS::DistributedHardware::DmDeviceInfo &deviceInfo) override; 156 void OnDeviceChanged(const OHOS::DistributedHardware::DmDeviceInfo &deviceInfo) override; 157 private: 158 std::string bundleName_; 159 std::shared_ptr<NativeRdb::RdbStore> rdbStore_; 160 }; 161 162 class MediaLibraryRdbStoreObserver : public NativeRdb::RdbStore::RdbStoreObserver { 163 public: 164 explicit MediaLibraryRdbStoreObserver(std::string &bundleName); 165 virtual ~MediaLibraryRdbStoreObserver(); 166 void OnChange(const std::vector<std::string>& devices) override; 167 private: 168 void NotifyDeviceChange(); 169 private: 170 static constexpr int NOTIFY_TIME_INTERVAL = 10000; 171 std::unique_ptr<OHOS::Utils::Timer> timer_ {nullptr}; 172 uint32_t timerId_ {0}; 173 std::string bundleName_; 174 bool isNotifyDeviceChange_; 175 }; 176 } // namespace Media 177 } // namespace OHOS 178 #endif // OHOS_MEDIALIBRARY_DATA_ABILITY_H 179