• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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