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 
16 #ifndef DISTRIBUTED_RDB_RDB_SERVICE_PROXY_H
17 #define DISTRIBUTED_RDB_RDB_SERVICE_PROXY_H
18 
19 #include <atomic>
20 #include <list>
21 #include <iremote_proxy.h>
22 #include "irdb_service.h"
23 #include "rdb_notifier_stub.h"
24 #include "concurrent_map.h"
25 
26 namespace OHOS::DistributedRdb {
27 class RdbServiceProxy : public IRemoteProxy<IRdbService> {
28 public:
29     struct ObserverParam {
30         RdbStoreObserver *observer = nullptr;
31         std::string bundleName;
32         SubscribeOption subscribeOption{ SubscribeMode::REMOTE };
33     };
34     using Observers = ConcurrentMap<std::string, std::list<ObserverParam>>;
35     explicit RdbServiceProxy(const sptr<IRemoteObject>& object);
36 
37     std::string ObtainDistributedTableName(const std::string& device, const std::string& table) override;
38 
39     int32_t InitNotifier(const RdbSyncerParam &param);
40 
41     int32_t InitNotifier(const RdbSyncerParam &param, sptr<IRemoteObject> notifier) override;
42 
43     int32_t SetDistributedTables(const RdbSyncerParam &param, const std::vector<std::string> &tables,
44         const std::vector<Reference> &references, bool isRebuild, int32_t type = DISTRIBUTED_DEVICE) override;
45 
46     int32_t Sync(const RdbSyncerParam& param, const Option& option,
47                  const PredicatesMemo& predicates, const AsyncDetail &async) override;
48 
49     int32_t Subscribe(const RdbSyncerParam& param, const SubscribeOption& option,
50                       RdbStoreObserver *observer) override;
51 
52     int32_t UnSubscribe(const RdbSyncerParam& param, const SubscribeOption& option,
53                         RdbStoreObserver *observer) override;
54 
55     int32_t RegisterAutoSyncCallback(
56         const RdbSyncerParam &param, std::shared_ptr<DetailProgressObserver> observer) override;
57 
58     int32_t UnregisterAutoSyncCallback(
59         const RdbSyncerParam &param, std::shared_ptr<DetailProgressObserver> observer) override;
60 
61     std::pair<int32_t, std::shared_ptr<ResultSet>> RemoteQuery(const RdbSyncerParam &param, const std::string &device,
62         const std::string &sql, const std::vector<std::string> &selectionArgs) override;
63 
64     Observers ExportObservers();
65 
66     void ImportObservers(Observers &observers);
67 
68     int32_t BeforeOpen(RdbSyncerParam &param) override;
69 
70     int32_t AfterOpen(const RdbSyncerParam &param) override;
71 
72     int32_t Delete(const RdbSyncerParam &param) override;
73 
74     int32_t NotifyDataChange(const RdbSyncerParam& param, const RdbChangedData &clientChangedData,
75         const RdbNotifyConfig &rdbNotifyConfig) override;
76 
77     int32_t SetSearchable(const RdbSyncerParam& param, bool isSearchable) override;
78 
79     std::pair<int32_t, std::shared_ptr<ResultSet>> QuerySharingResource(const RdbSyncerParam &param,
80         const PredicatesMemo &predicates, const std::vector<std::string> &columns) override;
81     int32_t Disable(const RdbSyncerParam& param) override;
82     int32_t Enable(const RdbSyncerParam& param) override;
83     int32_t GetPassword(const RdbSyncerParam& param, std::vector<uint8_t> &key) override;
84 
85     std::pair<int32_t, uint32_t> LockCloudContainer(const RdbSyncerParam& param) override;
86 
87     int32_t UnlockCloudContainer(const RdbSyncerParam& param) override;
88 
89     int32_t GetDebugInfo(const RdbSyncerParam &param, std::map<std::string, RdbDebugInfo> &debugInfo) override;
90 
91 private:
92     using ChangeInfo = RdbStoreObserver::ChangeInfo;
93     using PrimaryFields = RdbStoreObserver::PrimaryFields;
94     using SyncCallbacks = ConcurrentMap<uint32_t, AsyncDetail>;
95     using SyncObservers = ConcurrentMap<std::string, std::list<std::shared_ptr<DetailProgressObserver>>>;
96     std::pair<int32_t, Details> DoSync(const RdbSyncerParam &param, const Option &option,
97         const PredicatesMemo &predicates);
98 
99     int32_t DoAsync(const RdbSyncerParam &param, const Option &option, const PredicatesMemo &predicates);
100 
101     int32_t DoSync(const RdbSyncerParam &param, const Option &option, const PredicatesMemo &predicates,
102         const AsyncDetail &async);
103 
104     int32_t DoAsync(const RdbSyncerParam &param, const Option &option, const PredicatesMemo &predicates,
105         const AsyncDetail &async);
106 
107     int32_t DoSubscribe(const RdbSyncerParam& param, const SubscribeOption &option);
108 
109     int32_t DoUnSubscribe(const RdbSyncerParam& param, const SubscribeOption &option);
110 
111     int32_t DoRegister(const RdbSyncerParam &param);
112 
113     int32_t DoUnRegister(const RdbSyncerParam &param);
114 
115     uint32_t GetSeqNum();
116 
117     void OnSyncComplete(uint32_t seqNum, Details &&result);
118 
119     void OnSyncComplete(const std::string &storeName, Details &&result);
120 
121     void OnDataChange(const Origin &origin, const PrimaryFields &primaries, ChangeInfo &&changeInfo);
122 
123     static std::string RemoveSuffix(const std::string& name);
124 
125     std::atomic<uint32_t> seqNum_ {};
126     Observers observers_;
127     SyncCallbacks syncCallbacks_;
128     SyncObservers syncObservers_;
129     sptr<RdbNotifierStub> notifier_;
130 
131     sptr<IRemoteObject> remote_;
132     static inline BrokerDelegator<RdbServiceProxy> delegator_;
133 };
134 } // namespace OHOS::DistributedRdb
135 #endif