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 #define LOG_TAG "KVDBServiceStub"
16 #include "kvdb_service_stub.h"
17 
18 #include "ipc_skeleton.h"
19 #include "kv_types_util.h"
20 #include "log_print.h"
21 #include "utils/anonymous.h"
22 #include "utils/constant.h"
23 namespace OHOS::DistributedKv {
24 using namespace OHOS::DistributedData;
25 const KVDBServiceStub::Handler
26     KVDBServiceStub::HANDLERS[static_cast<uint32_t>(KVDBServiceInterfaceCode::TRANS_BUTT)] = {
27     &KVDBServiceStub::OnGetStoreIds,
28     &KVDBServiceStub::OnBeforeCreate,
29     &KVDBServiceStub::OnAfterCreate,
30     &KVDBServiceStub::OnDelete,
31     &KVDBServiceStub::OnSync,
32     &KVDBServiceStub::OnRegServiceNotifier,
33     &KVDBServiceStub::OnUnregServiceNotifier,
34     &KVDBServiceStub::OnSetSyncParam,
35     &KVDBServiceStub::OnGetSyncParam,
36     &KVDBServiceStub::OnEnableCap,
37     &KVDBServiceStub::OnDisableCap,
38     &KVDBServiceStub::OnSetCapability,
39     &KVDBServiceStub::OnAddSubInfo,
40     &KVDBServiceStub::OnRmvSubInfo,
41     &KVDBServiceStub::OnSubscribe,
42     &KVDBServiceStub::OnUnsubscribe,
43     &KVDBServiceStub::OnGetBackupPassword,
44     &KVDBServiceStub::OnCloudSync,
45     &KVDBServiceStub::OnNotifyDataChange,
46     &KVDBServiceStub::OnSetConfig,
47     &KVDBServiceStub::OnPutSwitch,
48     &KVDBServiceStub::OnGetSwitch,
49     &KVDBServiceStub::OnSubscribeSwitchData,
50     &KVDBServiceStub::OnUnsubscribeSwitchData,
51     &KVDBServiceStub::OnClose,
52     &KVDBServiceStub::OnRemoveDeviceData,
53 };
54 
OnRemoteRequest(uint32_t code,MessageParcel & data,MessageParcel & reply)55 int KVDBServiceStub::OnRemoteRequest(uint32_t code, MessageParcel &data, MessageParcel &reply)
56 {
57     ZLOGI("code:%{public}u callingPid:%{public}u", code, IPCSkeleton::GetCallingPid());
58     std::u16string local = KVDBServiceStub::GetDescriptor();
59     std::u16string remote = data.ReadInterfaceToken();
60     if (local != remote) {
61         ZLOGE("local is not equal to remote");
62         return -1;
63     }
64 
65     if (static_cast<uint32_t>(KVDBServiceInterfaceCode::TRANS_HEAD) > code ||
66         code >= static_cast<uint32_t>(KVDBServiceInterfaceCode::TRANS_BUTT) || HANDLERS[code] == nullptr) {
67         ZLOGE("not support code:%{public}u, BUTT:%{public}d", code,
68               static_cast<uint32_t>(KVDBServiceInterfaceCode::TRANS_BUTT));
69         return -1;
70     }
71     auto [status, storeInfo] = GetStoreInfo(code, data);
72     if (status != ERR_NONE) {
73         return status;
74     }
75     if (CheckPermission(code, storeInfo)) {
76         return (this->*HANDLERS[code])({ storeInfo.bundleName }, { storeInfo.storeId }, data, reply);
77     }
78     ZLOGE("PERMISSION_DENIED uid:%{public}d appId:%{public}s storeId:%{public}s", storeInfo.uid,
79         storeInfo.bundleName.c_str(), Anonymous::Change(storeInfo.storeId).c_str());
80 
81     if (!ITypesUtil::Marshal(reply, static_cast<int32_t>(PERMISSION_DENIED))) {
82         ZLOGE("Marshal PERMISSION_DENIED code:%{public}u appId:%{public}s storeId:%{public}s", code,
83             storeInfo.bundleName.c_str(), Anonymous::Change(storeInfo.storeId).c_str());
84         return IPC_STUB_WRITE_PARCEL_ERR;
85     }
86     return ERR_NONE;
87 }
88 
GetStoreInfo(uint32_t code,MessageParcel & data)89 std::pair<int32_t, KVDBServiceStub::StoreInfo> KVDBServiceStub::GetStoreInfo(uint32_t code, MessageParcel &data)
90 {
91     AppId appId;
92     StoreId storeId;
93     if (!ITypesUtil::Unmarshal(data, appId, storeId)) {
94         ZLOGE("Unmarshal appId:%{public}s storeId:%{public}s",
95             appId.appId.c_str(), Anonymous::Change(storeId.storeId).c_str());
96         return { IPC_STUB_INVALID_DATA_ERR, StoreInfo() };
97     }
98     appId.appId = Constant::TrimCopy(appId.appId);
99     storeId.storeId = Constant::TrimCopy(storeId.storeId);
100     StoreInfo info;
101     info.uid = IPCSkeleton::GetCallingUid();
102     info.tokenId = IPCSkeleton::GetCallingTokenID();
103     info.bundleName = std::move(appId.appId);
104     info.storeId = std::move(storeId.storeId);
105     return { ERR_NONE, info };
106 }
107 
CheckPermission(uint32_t code,const StoreInfo & storeInfo)108 bool KVDBServiceStub::CheckPermission(uint32_t code, const StoreInfo &storeInfo)
109 {
110     if (code >= static_cast<uint32_t>(KVDBServiceInterfaceCode::TRANS_PUT_SWITCH) &&
111         code <= static_cast<uint32_t>(KVDBServiceInterfaceCode::TRANS_UNSUBSCRIBE_SWITCH_DATA)) {
112         return CheckerManager::GetInstance().IsSwitches(storeInfo);
113     }
114     return CheckerManager::GetInstance().IsValid(storeInfo);
115 }
116 
OnGetStoreIds(const AppId & appId,const StoreId & storeId,MessageParcel & data,MessageParcel & reply)117 int32_t KVDBServiceStub::OnGetStoreIds(
118     const AppId &appId, const StoreId &storeId, MessageParcel &data, MessageParcel &reply)
119 {
120     std::vector<StoreId> storeIds;
121     int32_t status = GetStoreIds(appId, storeIds);
122     if (!ITypesUtil::Marshal(reply, status, storeIds)) {
123         ZLOGE("Marshal status:0x%{public}d storeIds:%{public}zu", status, storeIds.size());
124         return IPC_STUB_WRITE_PARCEL_ERR;
125     }
126     return ERR_NONE;
127 }
128 
OnBeforeCreate(const AppId & appId,const StoreId & storeId,MessageParcel & data,MessageParcel & reply)129 int32_t KVDBServiceStub::OnBeforeCreate(
130     const AppId &appId, const StoreId &storeId, MessageParcel &data, MessageParcel &reply)
131 {
132     Options options;
133     if (!ITypesUtil::Unmarshal(data, options)) {
134         ZLOGE("Unmarshal appId:%{public}s storeId:%{public}s", appId.appId.c_str(),
135             Anonymous::Change(storeId.storeId).c_str());
136         return IPC_STUB_INVALID_DATA_ERR;
137     }
138     int32_t status = BeforeCreate(appId, storeId, options);
139     if (!ITypesUtil::Marshal(reply, status)) {
140         ZLOGE("Marshal status:0x%{public}x appId:%{public}s storeId:%{public}s", status, appId.appId.c_str(),
141             Anonymous::Change(storeId.storeId).c_str());
142         return IPC_STUB_WRITE_PARCEL_ERR;
143     }
144     return ERR_NONE;
145 }
146 
OnAfterCreate(const AppId & appId,const StoreId & storeId,MessageParcel & data,MessageParcel & reply)147 int32_t KVDBServiceStub::OnAfterCreate(
148     const AppId &appId, const StoreId &storeId, MessageParcel &data, MessageParcel &reply)
149 {
150     Options options;
151     std::vector<uint8_t> password;
152     if (!ITypesUtil::Unmarshal(data, options, password)) {
153         ZLOGE("Unmarshal appId:%{public}s storeId:%{public}s", appId.appId.c_str(),
154             Anonymous::Change(storeId.storeId).c_str());
155         return IPC_STUB_INVALID_DATA_ERR;
156     }
157     int32_t status = AfterCreate(appId, storeId, options, password);
158     password.assign(password.size(), 0);
159     if (!ITypesUtil::Marshal(reply, status)) {
160         ZLOGE("Marshal status:0x%{public}x appId:%{public}s storeId:%{public}s", status, appId.appId.c_str(),
161             Anonymous::Change(storeId.storeId).c_str());
162         return IPC_STUB_WRITE_PARCEL_ERR;
163     }
164     return ERR_NONE;
165 }
166 
OnDelete(const AppId & appId,const StoreId & storeId,MessageParcel & data,MessageParcel & reply)167 int32_t KVDBServiceStub::OnDelete(const AppId &appId, const StoreId &storeId, MessageParcel &data, MessageParcel &reply)
168 {
169     int32_t status = Delete(appId, storeId);
170     if (!ITypesUtil::Marshal(reply, status)) {
171         ZLOGE("Marshal status:0x%{public}x appId:%{public}s storeId:%{public}s", status, appId.appId.c_str(),
172             Anonymous::Change(storeId.storeId).c_str());
173         return IPC_STUB_WRITE_PARCEL_ERR;
174     }
175     return ERR_NONE;
176 }
177 
OnClose(const AppId & appId,const StoreId & storeId,MessageParcel & data,MessageParcel & reply)178 int32_t KVDBServiceStub::OnClose(const AppId &appId, const StoreId &storeId, MessageParcel &data, MessageParcel &reply)
179 {
180     int32_t status = Close(appId, storeId);
181     if (!ITypesUtil::Marshal(reply, status)) {
182         ZLOGE("Marshal status:0x%{public}x appId:%{public}s storeId:%{public}s", status, appId.appId.c_str(),
183             Anonymous::Change(storeId.storeId).c_str());
184         return IPC_STUB_WRITE_PARCEL_ERR;
185     }
186     return ERR_NONE;
187 }
188 
OnSync(const AppId & appId,const StoreId & storeId,MessageParcel & data,MessageParcel & reply)189 int32_t KVDBServiceStub::OnSync(const AppId &appId, const StoreId &storeId, MessageParcel &data, MessageParcel &reply)
190 {
191     SyncInfo syncInfo;
192     if (!ITypesUtil::Unmarshal(data, syncInfo.seqId, syncInfo.mode, syncInfo.devices, syncInfo.delay, syncInfo.query)) {
193         ZLOGE("Unmarshal appId:%{public}s storeId:%{public}s", appId.appId.c_str(),
194             Anonymous::Change(storeId.storeId).c_str());
195         return IPC_STUB_INVALID_DATA_ERR;
196     }
197     int32_t status = Sync(appId, storeId, syncInfo);
198     if (!ITypesUtil::Marshal(reply, status)) {
199         ZLOGE("Marshal status:0x%{public}x appId:%{public}s storeId:%{public}s", status, appId.appId.c_str(),
200             Anonymous::Change(storeId.storeId).c_str());
201         return IPC_STUB_WRITE_PARCEL_ERR;
202     }
203     return ERR_NONE;
204 }
205 
OnCloudSync(const AppId & appId,const StoreId & storeId,MessageParcel & data,MessageParcel & reply)206 int32_t KVDBServiceStub::OnCloudSync(
207     const AppId &appId, const StoreId &storeId, MessageParcel &data, MessageParcel &reply)
208 {
209     SyncInfo syncInfo;
210     if (!ITypesUtil::Unmarshal(data, syncInfo.seqId)) {
211         ZLOGE("Unmarshal appId:%{public}s storeId:%{public}s", appId.appId.c_str(),
212               Anonymous::Change(storeId.storeId).c_str());
213         return IPC_STUB_INVALID_DATA_ERR;
214     }
215     int32_t status = CloudSync(appId, storeId, syncInfo);
216     if (!ITypesUtil::Marshal(reply, status)) {
217         ZLOGE("Marshal status:0x%{public}x appId:%{public}s storeId:%{public}s", status, appId.appId.c_str(),
218             Anonymous::Change(storeId.storeId).c_str());
219         return IPC_STUB_WRITE_PARCEL_ERR;
220     }
221     return ERR_NONE;
222 }
223 
OnNotifyDataChange(const AppId & appId,const StoreId & storeId,MessageParcel & data,MessageParcel & reply)224 int32_t KVDBServiceStub::OnNotifyDataChange(
225     const AppId &appId, const StoreId &storeId, MessageParcel &data, MessageParcel &reply)
226 {
227     uint64_t delay = 0;
228     if (!ITypesUtil::Unmarshal(data, delay)) {
229         ZLOGE("Unmarshal appId:%{public}s storeId:%{public}s", appId.appId.c_str(),
230             Anonymous::Change(storeId.storeId).c_str());
231         return IPC_STUB_INVALID_DATA_ERR;
232     }
233     int32_t status = NotifyDataChange(appId, storeId, delay);
234     if (!ITypesUtil::Marshal(reply, status)) {
235         ZLOGE("Marshal status:0x%{public}x appId:%{public}s storeId:%{public}s",
236             status, appId.appId.c_str(), Anonymous::Change(storeId.storeId).c_str());
237         return IPC_STUB_WRITE_PARCEL_ERR;
238     }
239     return ERR_NONE;
240 }
241 
OnRegServiceNotifier(const AppId & appId,const StoreId & storeId,MessageParcel & data,MessageParcel & reply)242 int32_t KVDBServiceStub::OnRegServiceNotifier(
243     const AppId &appId, const StoreId &storeId, MessageParcel &data, MessageParcel &reply)
244 {
245     sptr<IRemoteObject> remoteObj;
246     if (!ITypesUtil::Unmarshal(data, remoteObj)) {
247         ZLOGE("Unmarshal appId:%{public}s storeId:%{public}s", appId.appId.c_str(),
248             Anonymous::Change(storeId.storeId).c_str());
249         return IPC_STUB_INVALID_DATA_ERR;
250     }
251     auto notifier = (remoteObj == nullptr) ? nullptr : iface_cast<IKVDBNotifier>(remoteObj);
252     int32_t status = RegServiceNotifier(appId, notifier);
253     if (!ITypesUtil::Marshal(reply, status)) {
254         ZLOGE("Marshal status:0x%{public}x appId:%{public}s storeId:%{public}s", status, appId.appId.c_str(),
255             Anonymous::Change(storeId.storeId).c_str());
256         return IPC_STUB_WRITE_PARCEL_ERR;
257     }
258     return ERR_NONE;
259 }
260 
OnUnregServiceNotifier(const AppId & appId,const StoreId & storeId,MessageParcel & data,MessageParcel & reply)261 int32_t KVDBServiceStub::OnUnregServiceNotifier(
262     const AppId &appId, const StoreId &storeId, MessageParcel &data, MessageParcel &reply)
263 {
264     int32_t status = UnregServiceNotifier(appId);
265     if (!ITypesUtil::Marshal(reply, status)) {
266         ZLOGE("Marshal status:0x%{public}x appId:%{public}s storeId:%{public}s", status, appId.appId.c_str(),
267             Anonymous::Change(storeId.storeId).c_str());
268         return IPC_STUB_WRITE_PARCEL_ERR;
269     }
270     return ERR_NONE;
271 }
272 
OnSetSyncParam(const AppId & appId,const StoreId & storeId,MessageParcel & data,MessageParcel & reply)273 int32_t KVDBServiceStub::OnSetSyncParam(
274     const AppId &appId, const StoreId &storeId, MessageParcel &data, MessageParcel &reply)
275 {
276     KvSyncParam syncParam;
277     if (!ITypesUtil::Unmarshal(data, syncParam.allowedDelayMs)) {
278         ZLOGE("Unmarshal appId:%{public}s storeId:%{public}s", appId.appId.c_str(),
279             Anonymous::Change(storeId.storeId).c_str());
280         return IPC_STUB_INVALID_DATA_ERR;
281     }
282     int32_t status = SetSyncParam(appId, storeId, syncParam);
283     if (!ITypesUtil::Marshal(reply, status)) {
284         ZLOGE("Marshal status:0x%{public}x appId:%{public}s storeId:%{public}s", status, appId.appId.c_str(),
285             Anonymous::Change(storeId.storeId).c_str());
286         return IPC_STUB_WRITE_PARCEL_ERR;
287     }
288     return ERR_NONE;
289 }
290 
OnGetSyncParam(const AppId & appId,const StoreId & storeId,MessageParcel & data,MessageParcel & reply)291 int32_t KVDBServiceStub::OnGetSyncParam(
292     const AppId &appId, const StoreId &storeId, MessageParcel &data, MessageParcel &reply)
293 {
294     KvSyncParam syncParam;
295     int32_t status = GetSyncParam(appId, storeId, syncParam);
296     if (!ITypesUtil::Marshal(reply, status, syncParam.allowedDelayMs)) {
297         ZLOGE("Marshal status:0x%{public}x appId:%{public}s storeId:%{public}s", status, appId.appId.c_str(),
298             Anonymous::Change(storeId.storeId).c_str());
299         return IPC_STUB_WRITE_PARCEL_ERR;
300     }
301     return ERR_NONE;
302 }
303 
OnEnableCap(const AppId & appId,const StoreId & storeId,MessageParcel & data,MessageParcel & reply)304 int32_t KVDBServiceStub::OnEnableCap(
305     const AppId &appId, const StoreId &storeId, MessageParcel &data, MessageParcel &reply)
306 {
307     int32_t status = EnableCapability(appId, storeId);
308     if (!ITypesUtil::Marshal(reply, status)) {
309         ZLOGE("Marshal status:0x%{public}x appId:%{public}s storeId:%{public}s", status, appId.appId.c_str(),
310             Anonymous::Change(storeId.storeId).c_str());
311         return IPC_STUB_WRITE_PARCEL_ERR;
312     }
313     return ERR_NONE;
314 }
315 
OnDisableCap(const AppId & appId,const StoreId & storeId,MessageParcel & data,MessageParcel & reply)316 int32_t KVDBServiceStub::OnDisableCap(
317     const AppId &appId, const StoreId &storeId, MessageParcel &data, MessageParcel &reply)
318 {
319     int32_t status = DisableCapability(appId, storeId);
320     if (!ITypesUtil::Marshal(reply, status)) {
321         ZLOGE("Marshal status:0x%{public}x appId:%{public}s storeId:%{public}s", status, appId.appId.c_str(),
322             Anonymous::Change(storeId.storeId).c_str());
323         return IPC_STUB_WRITE_PARCEL_ERR;
324     }
325     return ERR_NONE;
326 }
327 
OnSetCapability(const AppId & appId,const StoreId & storeId,MessageParcel & data,MessageParcel & reply)328 int32_t KVDBServiceStub::OnSetCapability(
329     const AppId &appId, const StoreId &storeId, MessageParcel &data, MessageParcel &reply)
330 {
331     std::vector<std::string> local;
332     std::vector<std::string> remote;
333     if (!ITypesUtil::Unmarshal(data, local, remote)) {
334         ZLOGE("Unmarshal appId:%{public}s storeId:%{public}s", appId.appId.c_str(),
335             Anonymous::Change(storeId.storeId).c_str());
336         return IPC_STUB_INVALID_DATA_ERR;
337     }
338     int32_t status = SetCapability(appId, storeId, local, remote);
339     if (!ITypesUtil::Marshal(reply, status)) {
340         ZLOGE("Marshal status:0x%{public}x appId:%{public}s storeId:%{public}s", status, appId.appId.c_str(),
341             Anonymous::Change(storeId.storeId).c_str());
342         return IPC_STUB_WRITE_PARCEL_ERR;
343     }
344     return ERR_NONE;
345 }
346 
OnAddSubInfo(const AppId & appId,const StoreId & storeId,MessageParcel & data,MessageParcel & reply)347 int32_t KVDBServiceStub::OnAddSubInfo(const AppId &appId, const StoreId &storeId, MessageParcel &data,
348     MessageParcel &reply)
349 {
350     SyncInfo syncInfo;
351     if (!ITypesUtil::Unmarshal(data, syncInfo.seqId, syncInfo.devices, syncInfo.query)) {
352         ZLOGE("Unmarshal appId:%{public}s storeId:%{public}s", appId.appId.c_str(),
353             Anonymous::Change(storeId.storeId).c_str());
354         return IPC_STUB_INVALID_DATA_ERR;
355     }
356     int32_t status = AddSubscribeInfo(appId, storeId, syncInfo);
357     if (!ITypesUtil::Marshal(reply, status)) {
358         ZLOGE("Marshal status:0x%{public}x appId:%{public}s storeId:%{public}s", status, appId.appId.c_str(),
359             Anonymous::Change(storeId.storeId).c_str());
360         return IPC_STUB_WRITE_PARCEL_ERR;
361     }
362     return ERR_NONE;
363 }
364 
OnRmvSubInfo(const AppId & appId,const StoreId & storeId,MessageParcel & data,MessageParcel & reply)365 int32_t KVDBServiceStub::OnRmvSubInfo(const AppId &appId, const StoreId &storeId, MessageParcel &data,
366     MessageParcel &reply)
367 {
368     SyncInfo syncInfo;
369     if (!ITypesUtil::Unmarshal(data, syncInfo.seqId, syncInfo.devices, syncInfo.query)) {
370         ZLOGE("Unmarshal appId:%{public}s storeId:%{public}s", appId.appId.c_str(),
371             Anonymous::Change(storeId.storeId).c_str());
372         return IPC_STUB_INVALID_DATA_ERR;
373     }
374     int32_t status = RmvSubscribeInfo(appId, storeId, syncInfo);
375     if (!ITypesUtil::Marshal(reply, status)) {
376         ZLOGE("Marshal status:0x%{public}x appId:%{public}s storeId:%{public}s", status, appId.appId.c_str(),
377             Anonymous::Change(storeId.storeId).c_str());
378         return IPC_STUB_WRITE_PARCEL_ERR;
379     }
380     return ERR_NONE;
381 }
382 
OnSubscribe(const AppId & appId,const StoreId & storeId,MessageParcel & data,MessageParcel & reply)383 int32_t KVDBServiceStub::OnSubscribe(
384     const AppId &appId, const StoreId &storeId, MessageParcel &data, MessageParcel &reply)
385 {
386     sptr<IRemoteObject> remoteObj;
387     if (!ITypesUtil::Unmarshal(data, remoteObj)) {
388         ZLOGE("Unmarshal appId:%{public}s storeId:%{public}s", appId.appId.c_str(),
389             Anonymous::Change(storeId.storeId).c_str());
390         return IPC_STUB_INVALID_DATA_ERR;
391     }
392     auto observer = (remoteObj == nullptr) ? nullptr : iface_cast<IKvStoreObserver>(remoteObj);
393     int32_t status = Subscribe(appId, storeId, observer);
394     if (!ITypesUtil::Marshal(reply, status)) {
395         ZLOGE("Marshal status:0x%{public}x appId:%{public}s storeId:%{public}s", status, appId.appId.c_str(),
396             Anonymous::Change(storeId.storeId).c_str());
397         return IPC_STUB_WRITE_PARCEL_ERR;
398     }
399     return ERR_NONE;
400 }
401 
OnUnsubscribe(const AppId & appId,const StoreId & storeId,MessageParcel & data,MessageParcel & reply)402 int32_t KVDBServiceStub::OnUnsubscribe(
403     const AppId &appId, const StoreId &storeId, MessageParcel &data, MessageParcel &reply)
404 {
405     sptr<IRemoteObject> remoteObj;
406     if (!ITypesUtil::Unmarshal(data, remoteObj)) {
407         ZLOGE("Unmarshal appId:%{public}s storeId:%{public}s", appId.appId.c_str(),
408             Anonymous::Change(storeId.storeId).c_str());
409         return IPC_STUB_INVALID_DATA_ERR;
410     }
411     auto observer = (remoteObj == nullptr) ? nullptr : iface_cast<IKvStoreObserver>(remoteObj);
412     int32_t status = Unsubscribe(appId, storeId, observer);
413     if (!ITypesUtil::Marshal(reply, status)) {
414         ZLOGE("Marshal status:0x%{public}x appId:%{public}s storeId:%{public}s", status, appId.appId.c_str(),
415             Anonymous::Change(storeId.storeId).c_str());
416         return IPC_STUB_WRITE_PARCEL_ERR;
417     }
418     return ERR_NONE;
419 }
420 
OnGetBackupPassword(const AppId & appId,const StoreId & storeId,MessageParcel & data,MessageParcel & reply)421 int32_t KVDBServiceStub::OnGetBackupPassword(
422     const AppId &appId, const StoreId &storeId, MessageParcel &data, MessageParcel &reply)
423 {
424     int32_t passwordType;
425     if (!ITypesUtil::Unmarshal(data, passwordType)) {
426         ZLOGE("Unmarshal type failed, appId:%{public}s storeId:%{public}s", appId.appId.c_str(),
427             Anonymous::Change(storeId.storeId).c_str());
428         return IPC_STUB_INVALID_DATA_ERR;
429     }
430     std::vector<uint8_t> password;
431     int32_t status = GetBackupPassword(appId, storeId, password, passwordType);
432     if (!ITypesUtil::Marshal(reply, status, password)) {
433         ZLOGE("Marshal status:0x%{public}x appId:%{public}s storeId:%{public}s", status, appId.appId.c_str(),
434             Anonymous::Change(storeId.storeId).c_str());
435         password.assign(password.size(), 0);
436         return IPC_STUB_WRITE_PARCEL_ERR;
437     }
438     password.assign(password.size(), 0);
439     return ERR_NONE;
440 }
441 
OnPutSwitch(const AppId & appId,const StoreId & storeId,MessageParcel & data,MessageParcel & reply)442 int32_t KVDBServiceStub::OnPutSwitch(
443     const AppId &appId, const StoreId &storeId, MessageParcel &data, MessageParcel &reply)
444 {
445     SwitchData switchData;
446     if (!ITypesUtil::Unmarshal(data, switchData)) {
447         ZLOGE("Unmarshal appId:%{public}s", appId.appId.c_str());
448         return IPC_STUB_INVALID_DATA_ERR;
449     }
450     int32_t status = PutSwitch(appId, switchData);
451     if (!ITypesUtil::Marshal(reply, status)) {
452         ZLOGE("Marshal status:0x%{public}x appId:%{public}s", status, appId.appId.c_str());
453         return IPC_STUB_WRITE_PARCEL_ERR;
454     }
455     return ERR_NONE;
456 }
457 
OnGetSwitch(const AppId & appId,const StoreId & storeId,MessageParcel & data,MessageParcel & reply)458 int32_t KVDBServiceStub::OnGetSwitch(
459     const AppId &appId, const StoreId &storeId, MessageParcel &data, MessageParcel &reply)
460 {
461     std::string networkId;
462     if (!ITypesUtil::Unmarshal(data, networkId)) {
463         ZLOGE("Unmarshal appId:%{public}s networkId:%{public}s",
464             appId.appId.c_str(), Anonymous::Change(networkId).c_str());
465         return IPC_STUB_INVALID_DATA_ERR;
466     }
467     SwitchData switchData;
468     int32_t status = GetSwitch(appId, networkId, switchData);
469     if (!ITypesUtil::Marshal(reply, status, switchData)) {
470         ZLOGE("Marshal status:0x%{public}x appId:%{public}s networkId:%{public}s",
471             status, appId.appId.c_str(), Anonymous::Change(networkId).c_str());
472         return IPC_STUB_WRITE_PARCEL_ERR;
473     }
474     return ERR_NONE;
475 }
476 
OnSubscribeSwitchData(const AppId & appId,const StoreId & storeId,MessageParcel & data,MessageParcel & reply)477 int32_t KVDBServiceStub::OnSubscribeSwitchData(
478     const AppId &appId, const StoreId &storeId, MessageParcel &data, MessageParcel &reply)
479 {
480     int32_t status = SubscribeSwitchData(appId);
481     if (!ITypesUtil::Marshal(reply, status)) {
482         ZLOGE("Marshal status:0x%{public}x appId:%{public}s", status, appId.appId.c_str());
483         return IPC_STUB_WRITE_PARCEL_ERR;
484     }
485     return ERR_NONE;
486 }
487 
OnUnsubscribeSwitchData(const AppId & appId,const StoreId & storeId,MessageParcel & data,MessageParcel & reply)488 int32_t KVDBServiceStub::OnUnsubscribeSwitchData(
489     const AppId &appId, const StoreId &storeId, MessageParcel &data, MessageParcel &reply)
490 {
491     int32_t status = UnsubscribeSwitchData(appId);
492     if (!ITypesUtil::Marshal(reply, status)) {
493         ZLOGE("Marshal status:0x%{public}x appId:%{public}s", status, appId.appId.c_str());
494         return IPC_STUB_WRITE_PARCEL_ERR;
495     }
496     return ERR_NONE;
497 }
498 
OnSetConfig(const AppId & appId,const StoreId & storeId,MessageParcel & data,MessageParcel & reply)499 int32_t KVDBServiceStub::OnSetConfig(const AppId &appId, const StoreId &storeId, MessageParcel &data,
500     MessageParcel &reply)
501 {
502     StoreConfig storeConfig;
503     if (!ITypesUtil::Unmarshal(data, storeConfig)) {
504         ZLOGE("Unmarshal appId:%{public}s storeId:%{public}s", appId.appId.c_str(),
505             Anonymous::Change(storeId.storeId).c_str());
506         return IPC_STUB_INVALID_DATA_ERR;
507     }
508     int32_t status = SetConfig(appId, storeId, storeConfig);
509     if (!ITypesUtil::Marshal(reply, status)) {
510         ZLOGE("Marshal status:0x%{public}x appId:%{public}s", status, appId.appId.c_str());
511         return IPC_STUB_WRITE_PARCEL_ERR;
512     }
513     return ERR_NONE;
514 }
515 
OnRemoveDeviceData(const AppId & appId,const StoreId & storeId,MessageParcel & data,MessageParcel & reply)516 int32_t KVDBServiceStub::OnRemoveDeviceData(const AppId &appId, const StoreId &storeId, MessageParcel &data,
517     MessageParcel &reply)
518 {
519     std::string device;
520     if (!ITypesUtil::Unmarshal(data, device)) {
521         ZLOGE("Unmarshal appId:%{public}s storeId:%{public}s", appId.appId.c_str(),
522             Anonymous::Change(storeId.storeId).c_str());
523         return IPC_STUB_INVALID_DATA_ERR;
524     }
525     int32_t status = RemoveDeviceData(appId, storeId, device);
526     if (!ITypesUtil::Marshal(reply, status)) {
527         ZLOGE("Marshal status:0x%{public}x appId:%{public}s", status, appId.appId.c_str());
528         return IPC_STUB_WRITE_PARCEL_ERR;
529     }
530     return ERR_NONE;
531 }
532 } // namespace OHOS::DistributedKv
533