• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2022-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 #ifndef OHOS_DISTRIBUTED_DATA_SERVICE_KVDB_SERVICE_IMPL_H
17 #define OHOS_DISTRIBUTED_DATA_SERVICE_KVDB_SERVICE_IMPL_H
18 #include <set>
19 #include <vector>
20 
21 #include "concurrent_map.h"
22 #include "crypto/crypto_manager.h"
23 #include "device_matrix.h"
24 #include "kv_store_delegate_manager.h"
25 #include "kv_store_nb_delegate.h"
26 #include "kvdb_notifier_proxy.h"
27 #include "kvdb_service_stub.h"
28 #include "kvdb_watcher.h"
29 #include "kvstore_sync_manager.h"
30 #include "metadata/meta_data_manager.h"
31 #include "metadata/store_meta_data.h"
32 #include "metadata/store_meta_data_local.h"
33 #include "metadata/strategy_meta_data.h"
34 #include "store/auto_cache.h"
35 #include "store/general_value.h"
36 #include "utils/ref_count.h"
37 namespace OHOS::DistributedKv {
38 class KVDBServiceImpl final : public KVDBServiceStub {
39 public:
40     using DBLaunchParam = DistributedDB::AutoLaunchParam;
41     using Handler = std::function<void(int, std::map<std::string, std::vector<std::string>> &)>;
42     using RefCount = DistributedData::RefCount;
43     using StoreMetaData = OHOS::DistributedData::StoreMetaData;
44     KVDBServiceImpl();
45     virtual ~KVDBServiceImpl();
46     Status GetStoreIds(const AppId &appId, int32_t subUser, std::vector<StoreId> &storeIds) override;
47     Status BeforeCreate(const AppId &appId, const StoreId &storeId, const Options &options) override;
48     Status AfterCreate(const AppId &appId, const StoreId &storeId, const Options &options,
49         const std::vector<uint8_t> &password) override;
50     Status Delete(const AppId &appId, const StoreId &storeId, int32_t subUser) override;
51     Status Close(const AppId &appId, const StoreId &storeId, int32_t subUser) override;
52     Status CloudSync(const AppId &appId, const StoreId &storeId, const SyncInfo &syncInfo) override;
53     Status Sync(const AppId &appId, const StoreId &storeId, int32_t subUser, SyncInfo &syncInfo) override;
54     Status RegServiceNotifier(const AppId &appId, sptr<IKVDBNotifier> notifier) override;
55     Status UnregServiceNotifier(const AppId &appId) override;
56     Status SetSyncParam(const AppId &appId, const StoreId &storeId, int32_t subUser,
57         const KvSyncParam &syncParam) override;
58     Status GetSyncParam(const AppId &appId, const StoreId &storeId, int32_t subUser, KvSyncParam &syncParam) override;
59     Status EnableCapability(const AppId &appId, const StoreId &storeId, int32_t subUser) override;
60     Status DisableCapability(const AppId &appId, const StoreId &storeId, int32_t subUser) override;
61     Status SetCapability(const AppId &appId, const StoreId &storeId, int32_t subUser,
62         const std::vector<std::string> &local, const std::vector<std::string> &remote) override;
63     Status AddSubscribeInfo(const AppId &appId, const StoreId &storeId, int32_t subUser,
64         const SyncInfo &syncInfo) override;
65     Status RmvSubscribeInfo(const AppId &appId, const StoreId &storeId, int32_t subUser,
66         const SyncInfo &syncInfo) override;
67     Status Subscribe(const AppId &appId, const StoreId &storeId, int32_t subUser,
68         sptr<IKvStoreObserver> observer) override;
69     Status Unsubscribe(const AppId &appId, const StoreId &storeId, int32_t subUser,
70         sptr<IKvStoreObserver> observer) override;
71     Status GetBackupPassword(const AppId &appId, const StoreId &storeId, int32_t subUser,
72         std::vector<std::vector<uint8_t>> &passwords, int32_t passwordType) override;
73     Status NotifyDataChange(const AppId &appId, const StoreId &storeId, uint64_t delay) override;
74     Status PutSwitch(const AppId &appId, const SwitchData &data) override;
75     Status GetSwitch(const AppId &appId, const std::string &networkId, SwitchData &data) override;
76     Status SubscribeSwitchData(const AppId &appId) override;
77     Status UnsubscribeSwitchData(const AppId &appId) override;
78     Status SetConfig(const AppId &appId, const StoreId &storeId, const StoreConfig &storeConfig) override;
79     int32_t OnBind(const BindInfo &bindInfo) override;
80     int32_t OnInitialize() override;
81     int32_t OnAppExit(pid_t uid, pid_t pid, uint32_t tokenId, const std::string &appId) override;
82     int32_t ResolveAutoLaunch(const std::string &identifier, DBLaunchParam &param) override;
83     int32_t OnUserChange(uint32_t code, const std::string &user, const std::string &account) override;
84     Status RemoveDeviceData(const AppId &appId, const StoreId &storeId, int32_t subUser,
85         const std::string &device) override;
86 
87 private:
88     using StrategyMeta = OHOS::DistributedData::StrategyMeta;
89     using StoreMetaDataLocal = OHOS::DistributedData::StoreMetaDataLocal;
90     using ChangeType = OHOS::DistributedData::DeviceMatrix::ChangeType;
91     using DBStore = DistributedDB::KvStoreNbDelegate;
92     using DBManager = DistributedDB::KvStoreDelegateManager;
93     using SyncEnd = KvStoreSyncManager::SyncEnd;
94     using DBResult = std::map<std::string, DistributedDB::DBStatus>;
95     using DBStatus = DistributedDB::DBStatus;
96     using DBMode = DistributedDB::SyncMode;
97     using Action = OHOS::DistributedData::MetaDataManager::Action;
98     using GeneralError = DistributedData::GeneralError;
99     using CryptoManager = DistributedData::CryptoManager;
100     enum SyncAction {
101         ACTION_SYNC,
102         ACTION_SUBSCRIBE,
103         ACTION_UNSUBSCRIBE,
104     };
105     struct SyncAgent {
106         pid_t pid_ = 0;
107         int32_t switchesObserverCount_ = 0;
108         bool staticsChanged_ = false;
109         bool dynamicChanged_ = false;
110         AppId appId_;
111         sptr<IKVDBNotifier> notifier_;
112         std::map<std::string, uint32_t> delayTimes_;
113         std::map<std::string, std::set<std::shared_ptr<KVDBWatcher>>> watchers_;
114         void ReInit(pid_t pid, const AppId &appId);
115     };
116     class Factory {
117     public:
118         Factory();
119         ~Factory();
120 
121     private:
122         std::shared_ptr<KVDBServiceImpl> product_;
123     };
124 
125     void Init();
126     void AddOptions(const Options &options, StoreMetaData &metaData);
127     StoreMetaData GetStoreMetaData(const AppId &appId, const StoreId &storeId, int32_t subUser = 0);
128     StoreMetaData LoadStoreMetaData(const AppId &appId, const StoreId &storeId, int32_t subUser = 0);
129     StoreMetaData GetDistributedDataMeta(const std::string &deviceId);
130     StrategyMeta GetStrategyMeta(const AppId &appId, const StoreId &storeId, int32_t subUser = 0);
131     int32_t GetInstIndex(uint32_t tokenId, const AppId &appId);
132     bool IsNeedMetaSync(const StoreMetaData &meta, const std::vector<std::string> &uuids);
133     Status DoCloudSync(const StoreMetaData &meta, const SyncInfo &syncInfo);
134     void DoCloudSync(bool statics, bool dynamic);
135     Status DoSync(const StoreMetaData &meta, const SyncInfo &info, const SyncEnd &complete, int32_t type);
136     Status DoSyncInOrder(const StoreMetaData &meta, const SyncInfo &info, const SyncEnd &complete, int32_t type);
137     Status DoSyncBegin(const std::vector<std::string> &devices, const StoreMetaData &meta, const SyncInfo &info,
138         const SyncEnd &complete, int32_t type);
139     Status DoComplete(const StoreMetaData &meta, const SyncInfo &info, RefCount refCount, const DBResult &dbResult);
140     uint32_t GetSyncDelayTime(uint32_t delay, const StoreId &storeId, const std::string &subUser = "");
141     Status ConvertDbStatus(DBStatus status) const;
142     Status ConvertGeneralErr(GeneralError error) const;
143     DBMode ConvertDBMode(SyncMode syncMode) const;
144     ChangeType ConvertType(SyncMode syncMode) const;
145     SwitchState ConvertAction(Action action) const;
146     SyncMode GetSyncMode(bool local, bool remote) const;
147     std::vector<std::string> ConvertDevices(const std::vector<std::string> &deviceIds) const;
148     DistributedData::GeneralStore::SyncMode ConvertGeneralSyncMode(SyncMode syncMode, SyncAction syncAction) const;
149     DBResult HandleGenBriefDetails(const DistributedData::GenDetails &details);
150     ProgressDetail HandleGenDetails(const DistributedData::GenDetails &details);
151     void OnAsyncComplete(uint32_t tokenId, uint64_t seqNum, ProgressDetail &&detail);
152     DistributedData::AutoCache::Watchers GetWatchers(uint32_t tokenId, const std::string &storeId,
153         const std::string &userId);
154     using SyncResult = std::pair<std::vector<std::string>, std::map<std::string, DBStatus>>;
155     SyncResult ProcessResult(const std::map<std::string, int32_t> &results);
156     void SaveLocalMetaData(const Options &options, const StoreMetaData &metaData);
157     void RegisterKvServiceInfo();
158     void RegisterHandler();
159     void DumpKvServiceInfo(int fd, std::map<std::string, std::vector<std::string>> &params);
160     void TryToSync(const StoreMetaData &metaData, bool force = false);
161     bool IsRemoteChange(const StoreMetaData &metaData, const std::string &device);
162     bool IsOHOSType(const std::vector<std::string> &ids);
163     Status ConvertDbStatusNative(DBStatus status);
164     bool CompareTripleIdentifier(const std::string &accountId, const std::string &identifier,
165         const StoreMetaData &storeMeta);
166     std::string GenerateKey(const std::string &userId, const std::string &storeId) const;
167     std::vector<uint8_t> LoadSecretKey(const StoreMetaData &metaData, CryptoManager::SecretKeyType secretKeyType);
168     void SaveSecretKeyMeta(const StoreMetaData &metaData, const std::vector<uint8_t> &password);
169     static Factory factory_;
170     ConcurrentMap<uint32_t, SyncAgent> syncAgents_;
171     std::shared_ptr<ExecutorPool> executors_;
172     std::atomic_uint64_t syncId_ = 0;
173     static constexpr int32_t OH_OS_TYPE = 10;
174 };
175 } // namespace OHOS::DistributedKv
176 #endif // OHOS_DISTRIBUTED_DATA_SERVICE_KVDB_SERVICE_IMPL_H