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 #include "flat_object_store.h"
17
18 #include "block_data.h"
19 #include "bytes_utils.h"
20 #include "client_adaptor.h"
21 #include "distributed_objectstore_impl.h"
22 #include "logger.h"
23 #include "object_callback_impl.h"
24 #include "object_service_proxy.h"
25 #include "objectstore_errors.h"
26 #include "softbus_adapter.h"
27 #include "string_utils.h"
28
29 namespace OHOS::ObjectStore {
FlatObjectStore(const std::string & bundleName)30 FlatObjectStore::FlatObjectStore(const std::string &bundleName)
31 {
32 bundleName_ = bundleName;
33 storageEngine_ = std::make_shared<FlatObjectStorageEngine>();
34 uint32_t status = storageEngine_->Open(bundleName);
35 if (status != SUCCESS) {
36 LOG_ERROR("FlatObjectStore: Failed to open, error: open storage engine failure %{public}d", status);
37 }
38 cacheManager_ = new CacheManager();
39 }
40
~FlatObjectStore()41 FlatObjectStore::~FlatObjectStore()
42 {
43 if (storageEngine_ != nullptr) {
44 storageEngine_->Close();
45 storageEngine_ = nullptr;
46 }
47 delete cacheManager_;
48 cacheManager_ = nullptr;
49 }
50
CreateObject(const std::string & sessionId)51 uint32_t FlatObjectStore::CreateObject(const std::string &sessionId)
52 {
53 if (!storageEngine_->isOpened_ && storageEngine_->Open(bundleName_) != SUCCESS) {
54 LOG_ERROR("FlatObjectStore::DB has not inited");
55 return ERR_DB_NOT_INIT;
56 }
57 uint32_t status = storageEngine_->CreateTable(sessionId);
58 if (status != SUCCESS) {
59 LOG_ERROR("FlatObjectStore::CreateObject createTable err %{public}d", status);
60 return status;
61 }
62 std::function<void(const std::map<std::string, std::vector<uint8_t>> &data)> callback =
63 [sessionId, this](
64 const std::map<std::string, std::vector<uint8_t>> &data) {
65 if (data.size() > 0) {
66 LOG_INFO("objectstore, retrieve success");
67 {
68 std::lock_guard<std::mutex> lck(mutex_);
69 if (find(retrievedCache_.begin(), retrievedCache_.end(), sessionId) == retrievedCache_.end()) {
70 retrievedCache_.push_back(sessionId);
71 }
72 }
73 auto result = storageEngine_->UpdateItems(sessionId, data);
74 storageEngine_->NotifyStatus(sessionId, "local", "restored");
75 if (result != SUCCESS) {
76 LOG_ERROR("UpdateItems failed, status = %{public}d", result);
77 }
78 } else {
79 LOG_INFO("objectstore, retrieve empty");
80 }
81 };
82 std::function<void(const std::map<std::string, std::vector<uint8_t>> &data)> remoteResumeCallback =
83 [sessionId, this](
84 const std::map<std::string, std::vector<uint8_t>> &data) {
85 LOG_INFO("SubscribeDataChange callback success.");
86 std::map<std::string, std::vector<uint8_t>> filteredData = data;
87 FilterData(sessionId, filteredData);
88 if (!filteredData.empty()) {
89 auto status = storageEngine_->UpdateItems(sessionId, filteredData);
90 if (status != SUCCESS) {
91 LOG_ERROR("UpdateItems failed, status = %{public}d", status);
92 }
93 storageEngine_->NotifyChange(sessionId, filteredData);
94 }
95 storageEngine_->NotifyStatus(sessionId, "local", "restored");
96 };
97 cacheManager_->ResumeObject(bundleName_, sessionId, callback);
98 cacheManager_->SubscribeDataChange(bundleName_, sessionId, remoteResumeCallback);
99 return SUCCESS;
100 }
101
Delete(const std::string & sessionId)102 uint32_t FlatObjectStore::Delete(const std::string &sessionId)
103 {
104 if (!storageEngine_->isOpened_ && storageEngine_->Open(bundleName_) != SUCCESS) {
105 LOG_ERROR("FlatObjectStore::DB has not inited");
106 return ERR_DB_NOT_INIT;
107 }
108 uint32_t status = storageEngine_->DeleteTable(sessionId);
109 if (status != SUCCESS) {
110 LOG_ERROR("FlatObjectStore: Failed to delete object %{public}d", status);
111 return status;
112 }
113 cacheManager_->UnregisterDataChange(bundleName_, sessionId);
114 cacheManager_->DeleteSnapshot(bundleName_, sessionId);
115 return SUCCESS;
116 }
117
Watch(const std::string & sessionId,std::shared_ptr<FlatObjectWatcher> watcher)118 uint32_t FlatObjectStore::Watch(const std::string &sessionId, std::shared_ptr<FlatObjectWatcher> watcher)
119 {
120 if (!storageEngine_->isOpened_ && storageEngine_->Open(bundleName_) != SUCCESS) {
121 LOG_ERROR("FlatObjectStore::DB has not inited");
122 return ERR_DB_NOT_INIT;
123 }
124 uint32_t status = storageEngine_->RegisterObserver(sessionId, watcher);
125 if (status != SUCCESS) {
126 LOG_ERROR("FlatObjectStore::Watch failed %{public}d", status);
127 }
128 return status;
129 }
130
UnWatch(const std::string & sessionId)131 uint32_t FlatObjectStore::UnWatch(const std::string &sessionId)
132 {
133 if (!storageEngine_->isOpened_ && storageEngine_->Open(bundleName_) != SUCCESS) {
134 LOG_ERROR("FlatObjectStore::DB has not inited");
135 return ERR_DB_NOT_INIT;
136 }
137 uint32_t status = storageEngine_->UnRegisterObserver(sessionId);
138 if (status != SUCCESS) {
139 LOG_ERROR("FlatObjectStore::Watch failed %{public}d", status);
140 }
141 return status;
142 }
143
Put(const std::string & sessionId,const std::string & key,std::vector<uint8_t> value)144 uint32_t FlatObjectStore::Put(const std::string &sessionId, const std::string &key, std::vector<uint8_t> value)
145 {
146 if (!storageEngine_->isOpened_ && storageEngine_->Open(bundleName_) != SUCCESS) {
147 LOG_ERROR("FlatObjectStore::DB has not inited");
148 return ERR_DB_NOT_INIT;
149 }
150 return storageEngine_->UpdateItem(sessionId, key, value);
151 }
152
Get(const std::string & sessionId,const std::string & key,Bytes & value)153 uint32_t FlatObjectStore::Get(const std::string &sessionId, const std::string &key, Bytes &value)
154 {
155 if (!storageEngine_->isOpened_ && storageEngine_->Open(bundleName_) != SUCCESS) {
156 LOG_ERROR("FlatObjectStore::DB has not inited");
157 return ERR_DB_NOT_INIT;
158 }
159 return storageEngine_->GetItem(sessionId, key, value);
160 }
161
SetStatusNotifier(std::shared_ptr<StatusWatcher> notifier)162 uint32_t FlatObjectStore::SetStatusNotifier(std::shared_ptr<StatusWatcher> notifier)
163 {
164 if (!storageEngine_->isOpened_ && storageEngine_->Open(bundleName_) != SUCCESS) {
165 LOG_ERROR("FlatObjectStore::DB has not inited");
166 return ERR_DB_NOT_INIT;
167 }
168 return storageEngine_->SetStatusNotifier(notifier);
169 }
170
SyncAllData(const std::string & sessionId,const std::function<void (const std::map<std::string,DistributedDB::DBStatus> &)> & onComplete)171 uint32_t FlatObjectStore::SyncAllData(const std::string &sessionId,
172 const std::function<void(const std::map<std::string, DistributedDB::DBStatus> &)> &onComplete)
173 {
174 if (!storageEngine_->isOpened_ && storageEngine_->Open(bundleName_) != SUCCESS) {
175 LOG_ERROR("FlatObjectStore::DB has not inited");
176 return ERR_DB_NOT_INIT;
177 }
178 std::vector<DeviceInfo> devices = SoftBusAdapter::GetInstance()->GetDeviceList();
179 std::vector<std::string> deviceIds;
180 for (auto item : devices) {
181 deviceIds.push_back(item.deviceId);
182 }
183 return storageEngine_->SyncAllData(sessionId, deviceIds, onComplete);
184 }
185
Save(const std::string & sessionId,const std::string & deviceId)186 uint32_t FlatObjectStore::Save(const std::string &sessionId, const std::string &deviceId)
187 {
188 if (cacheManager_ == nullptr) {
189 LOG_ERROR("FlatObjectStore::cacheManager_ is null");
190 return ERR_NULL_PTR;
191 }
192 std::map<std::string, std::vector<uint8_t>> objectData;
193 uint32_t status = storageEngine_->GetItems(sessionId, objectData);
194 if (status != SUCCESS) {
195 LOG_ERROR("FlatObjectStore::GetItems fail");
196 return status;
197 }
198 return cacheManager_->Save(bundleName_, sessionId, deviceId, objectData);
199 }
200
RevokeSave(const std::string & sessionId)201 uint32_t FlatObjectStore::RevokeSave(const std::string &sessionId)
202 {
203 if (cacheManager_ == nullptr) {
204 LOG_ERROR("FlatObjectStore::cacheManager_ is null");
205 return ERR_NULL_PTR;
206 }
207 return cacheManager_->RevokeSave(bundleName_, sessionId);
208 }
209
BindAssetStore(const std::string & sessionId,AssetBindInfo & bindInfo,Asset & assetValue)210 uint32_t FlatObjectStore::BindAssetStore(const std::string &sessionId, AssetBindInfo &bindInfo, Asset &assetValue)
211 {
212 std::unique_lock<std::mutex> lck(mutex_);
213 sptr<OHOS::DistributedObject::IObjectService> proxy = ClientAdaptor::GetObjectService();
214 if (proxy == nullptr) {
215 LOG_ERROR("proxy is nullptr.");
216 return ERR_PROCESSING;
217 }
218 int32_t status = proxy->BindAssetStore(bundleName_, sessionId, assetValue, bindInfo);
219 if (status != SUCCESS) {
220 LOG_ERROR("object bind asset failed code=%{public}d.", static_cast<int>(status));
221 }
222 LOG_DEBUG("object bind asset successful sessionId: %{public}s and assetName %{public}s", sessionId.c_str(),
223 assetValue.name.c_str());
224 return status;
225 }
226
CheckRetrieveCache(const std::string & sessionId)227 void FlatObjectStore::CheckRetrieveCache(const std::string &sessionId)
228 {
229 std::lock_guard<std::mutex> lck(mutex_);
230 auto iter = find(retrievedCache_.begin(), retrievedCache_.end(), sessionId);
231 if (iter != retrievedCache_.end()) {
232 storageEngine_->NotifyStatus(*iter, "local", "restored");
233 retrievedCache_.erase(iter);
234 }
235 }
236
FilterData(const std::string & sessionId,std::map<std::string,std::vector<uint8_t>> & data)237 void FlatObjectStore::FilterData(const std::string &sessionId,
238 std::map<std::string, std::vector<uint8_t>> &data)
239 {
240 std::map<std::string, std::vector<uint8_t>> allData {};
241 storageEngine_->GetItems(sessionId, allData);
242 for (const auto &item : allData) {
243 data.erase(item.first);
244 }
245 }
246
PutDouble(const std::string & sessionId,const std::string & key,double value)247 uint32_t FlatObjectStore::PutDouble(const std::string &sessionId, const std::string &key, double value)
248 {
249 Bytes data;
250 Type type = Type::TYPE_DOUBLE;
251 BytesUtils::PutNum(&type, 0, sizeof(type), data);
252 BytesUtils::PutNum(&value, sizeof(type), sizeof(value), data);
253 return Put(sessionId, FIELDS_PREFIX + key, data);
254 }
255
PutBoolean(const std::string & sessionId,const std::string & key,bool value)256 uint32_t FlatObjectStore::PutBoolean(const std::string &sessionId, const std::string &key, bool value)
257 {
258 Bytes data;
259 Type type = Type::TYPE_BOOLEAN;
260 BytesUtils::PutNum(&type, 0, sizeof(type), data);
261 BytesUtils::PutNum(&value, sizeof(type), sizeof(value), data);
262 return Put(sessionId, FIELDS_PREFIX + key, data);
263 }
264
PutString(const std::string & sessionId,const std::string & key,const std::string & value)265 uint32_t FlatObjectStore::PutString(const std::string &sessionId, const std::string &key, const std::string &value)
266 {
267 Bytes data;
268 Type type = Type::TYPE_STRING;
269 BytesUtils::PutNum(&type, 0, sizeof(type), data);
270 Bytes dst = StringUtils::StrToBytes(value);
271 data.insert(data.end(), dst.begin(), dst.end());
272 return Put(sessionId, FIELDS_PREFIX + key, data);
273 }
274
GetDouble(const std::string & sessionId,const std::string & key,double & value)275 uint32_t FlatObjectStore::GetDouble(const std::string &sessionId, const std::string &key, double &value)
276 {
277 Bytes data;
278 Bytes keyBytes = StringUtils::StrToBytes(key);
279 uint32_t status = Get(sessionId, FIELDS_PREFIX + key, data);
280 if (status != SUCCESS) {
281 LOG_ERROR("GetDouble field not exist. %{public}d %{public}s", status, key.c_str());
282 return status;
283 }
284 status = BytesUtils::GetNum(data, sizeof(Type), &value, sizeof(value));
285 if (status != SUCCESS) {
286 LOG_ERROR("GetDouble getNum err. %{public}d", status);
287 }
288 return status;
289 }
290
GetBoolean(const std::string & sessionId,const std::string & key,bool & value)291 uint32_t FlatObjectStore::GetBoolean(const std::string &sessionId, const std::string &key, bool &value)
292 {
293 Bytes data;
294 Bytes keyBytes = StringUtils::StrToBytes(key);
295 uint32_t status = Get(sessionId, FIELDS_PREFIX + key, data);
296 if (status != SUCCESS) {
297 LOG_ERROR("GetBoolean field not exist. %{public}d %{public}s", status, key.c_str());
298 return status;
299 }
300 status = BytesUtils::GetNum(data, sizeof(Type), &value, sizeof(value));
301 if (status != SUCCESS) {
302 LOG_ERROR("GetBoolean getNum err. %{public}d", status);
303 return status;
304 }
305 return SUCCESS;
306 }
307
GetString(const std::string & sessionId,const std::string & key,std::string & value)308 uint32_t FlatObjectStore::GetString(const std::string &sessionId, const std::string &key, std::string &value)
309 {
310 Bytes data;
311 uint32_t status = Get(sessionId, FIELDS_PREFIX + key, data);
312 if (status != SUCCESS) {
313 LOG_ERROR("GetString field not exist. %{public}d %{public}s", status, key.c_str());
314 return status;
315 }
316 status = StringUtils::BytesToStrWithType(data, value);
317 if (status != SUCCESS) {
318 LOG_ERROR("GetString dataToVal err. %{public}d", status);
319 }
320 return status;
321 }
322
PutComplex(const std::string & sessionId,const std::string & key,const std::vector<uint8_t> & value)323 uint32_t FlatObjectStore::PutComplex(const std::string &sessionId, const std::string &key,
324 const std::vector<uint8_t> &value)
325 {
326 Bytes data;
327 Type type = Type::TYPE_COMPLEX;
328 BytesUtils::PutNum(&type, 0, sizeof(type), data);
329 data.insert(data.end(), value.begin(), value.end());
330 uint32_t status = Put(sessionId, FIELDS_PREFIX + key, data);
331 if (status != SUCCESS) {
332 LOG_ERROR("PutBoolean setField err %{public}d", status);
333 }
334 return status;
335 }
336
GetComplex(const std::string & sessionId,const std::string & key,std::vector<uint8_t> & value)337 uint32_t FlatObjectStore::GetComplex(const std::string &sessionId, const std::string &key,
338 std::vector<uint8_t> &value)
339 {
340 uint32_t status = Get(sessionId, FIELDS_PREFIX + key, value);
341 if (status != SUCCESS) {
342 LOG_ERROR("GetString field not exist. %{public}d %{public}s", status, key.c_str());
343 return status;
344 }
345 value.erase(value.begin(), value.begin() + sizeof(Type));
346 return status;
347 }
348
GetType(const std::string & sessionId,const std::string & key,Type & type)349 uint32_t FlatObjectStore::GetType(const std::string &sessionId, const std::string &key, Type &type)
350 {
351 Bytes data;
352 uint32_t status = Get(sessionId, FIELDS_PREFIX + key, data);
353 if (status != SUCCESS) {
354 LOG_ERROR("GetString field not exist. %{public}d %{public}s", status, key.c_str());
355 return status;
356 }
357 status = BytesUtils::GetNum(data, 0, &type, sizeof(type));
358 if (status != SUCCESS) {
359 LOG_ERROR("GetBoolean getNum err. %{public}d", status);
360 return status;
361 }
362 return SUCCESS;
363 }
364
GetBundleName()365 std::string FlatObjectStore::GetBundleName()
366 {
367 return bundleName_;
368 }
369
CacheManager()370 CacheManager::CacheManager()
371 {
372 }
373
Save(const std::string & bundleName,const std::string & sessionId,const std::string & deviceId,const std::map<std::string,std::vector<uint8_t>> & objectData)374 uint32_t CacheManager::Save(const std::string &bundleName, const std::string &sessionId, const std::string &deviceId,
375 const std::map<std::string, std::vector<uint8_t>> &objectData)
376 {
377 std::unique_lock<std::mutex> lck(mutex_);
378 auto block = std::make_shared<BlockData<std::tuple<bool, int32_t>>>(WAIT_TIME, std::tuple{ true, ERR_DB_GET_FAIL });
379 int32_t status = SaveObject(bundleName, sessionId, deviceId, objectData,
380 [deviceId, block](const std::map<std::string, int32_t> &results) {
381 LOG_INFO("CacheManager::task callback");
382 if (results.count(deviceId) != 0) {
383 block->SetValue({ false, results.at(deviceId) });
384 } else {
385 block->SetValue({ false, ERR_DB_GET_FAIL });
386 }
387 });
388 if (status != SUCCESS) {
389 LOG_ERROR("SaveObject failed");
390 return status;
391 }
392 LOG_INFO("CacheManager::start wait");
393 auto [timeout, res] = block->GetValue();
394 LOG_INFO("CacheManager::end wait, timeout: %{public}d, result: %{public}d", timeout, res);
395 return res;
396 }
397
RevokeSave(const std::string & bundleName,const std::string & sessionId)398 uint32_t CacheManager::RevokeSave(const std::string &bundleName, const std::string &sessionId)
399 {
400 std::unique_lock<std::mutex> lck(mutex_);
401 auto block = std::make_shared<BlockData<std::tuple<bool, int32_t>>>(WAIT_TIME, std::tuple{ true, ERR_DB_GET_FAIL });
402 int32_t status = RevokeSaveObject(bundleName, sessionId, [block](int32_t result) {
403 LOG_INFO("CacheManager::task callback");
404 block->SetValue({ false, result });
405 });
406 if (status != SUCCESS) {
407 LOG_ERROR("RevokeSaveObject failed");
408 return status;
409 }
410 LOG_INFO("CacheManager::start wait");
411 auto [timeout, res] = block->GetValue();
412 LOG_INFO("CacheManager::end wait, timeout: %{public}d, result: %{public}d", timeout, res);
413 return res;
414 }
415
SaveObject(const std::string & bundleName,const std::string & sessionId,const std::string & deviceId,const std::map<std::string,std::vector<uint8_t>> & objectData,const std::function<void (const std::map<std::string,int32_t> &)> & callback)416 int32_t CacheManager::SaveObject(const std::string &bundleName, const std::string &sessionId,
417 const std::string &deviceId, const std::map<std::string, std::vector<uint8_t>> &objectData,
418 const std::function<void(const std::map<std::string, int32_t> &)> &callback)
419 {
420 sptr<OHOS::DistributedObject::IObjectService> proxy = ClientAdaptor::GetObjectService();
421 if (proxy == nullptr) {
422 LOG_ERROR("proxy is nullptr.");
423 return ERR_PROCESSING;
424 }
425 sptr<ObjectSaveCallbackBroker> objectSaveCallback = new (std::nothrow) ObjectSaveCallback(callback);
426 if (objectSaveCallback == nullptr) {
427 LOG_ERROR("CacheManager::SaveObject no memory for ObjectSaveCallback malloc!");
428 return ERR_NULL_PTR;
429 }
430 int32_t status = proxy->ObjectStoreSave(
431 bundleName, sessionId, deviceId, objectData, objectSaveCallback->AsObject().GetRefPtr());
432 if (status != SUCCESS) {
433 LOG_ERROR("object save failed code=%d.", static_cast<int>(status));
434 }
435 LOG_INFO("object save successful");
436 return status;
437 }
438
RevokeSaveObject(const std::string & bundleName,const std::string & sessionId,const std::function<void (int32_t)> & callback)439 int32_t CacheManager::RevokeSaveObject(
440 const std::string &bundleName, const std::string &sessionId, const std::function<void(int32_t)> &callback)
441 {
442 sptr<OHOS::DistributedObject::IObjectService> proxy = ClientAdaptor::GetObjectService();
443 if (proxy == nullptr) {
444 LOG_ERROR("proxy is nullptr.");
445 return ERR_PROCESSING;
446 }
447 sptr<ObjectRevokeSaveCallbackBroker> objectRevokeSaveCallback = new (std::nothrow)
448 ObjectRevokeSaveCallback(callback);
449 if (objectRevokeSaveCallback == nullptr) {
450 LOG_ERROR("CacheManager::RevokeSaveObject no memory for ObjectRevokeSaveCallback malloc!");
451 return ERR_NULL_PTR;
452 }
453 int32_t status = proxy->ObjectStoreRevokeSave(
454 bundleName, sessionId, objectRevokeSaveCallback->AsObject().GetRefPtr());
455 if (status != SUCCESS) {
456 LOG_ERROR("object revoke save failed code=%d.", static_cast<int>(status));
457 }
458 LOG_INFO("object revoke save successful");
459 return status;
460 }
461
ResumeObject(const std::string & bundleName,const std::string & sessionId,std::function<void (const std::map<std::string,std::vector<uint8_t>> & data)> & callback)462 int32_t CacheManager::ResumeObject(const std::string &bundleName, const std::string &sessionId,
463 std::function<void(const std::map<std::string, std::vector<uint8_t>> &data)> &callback)
464 {
465 sptr<OHOS::DistributedObject::IObjectService> proxy = ClientAdaptor::GetObjectService();
466 if (proxy == nullptr) {
467 LOG_ERROR("proxy is nullptr.");
468 return ERR_NULL_PTR;
469 }
470 sptr<ObjectRetrieveCallbackBroker> objectRetrieveCallback = new (std::nothrow) ObjectRetrieveCallback(callback);
471 if (objectRetrieveCallback == nullptr) {
472 LOG_ERROR("CacheManager::ResumeObject no memory for ObjectRetrieveCallback malloc!");
473 return ERR_NULL_PTR;
474 }
475 int32_t status = proxy->ObjectStoreRetrieve(
476 bundleName, sessionId, objectRetrieveCallback->AsObject().GetRefPtr());
477 if (status != SUCCESS) {
478 LOG_ERROR("object resume failed code=%d.", static_cast<int>(status));
479 }
480 LOG_INFO("object resume successful");
481 return status;
482 }
483
SubscribeDataChange(const std::string & bundleName,const std::string & sessionId,std::function<void (const std::map<std::string,std::vector<uint8_t>> & data)> & callback)484 int32_t CacheManager::SubscribeDataChange(const std::string &bundleName, const std::string &sessionId,
485 std::function<void(const std::map<std::string, std::vector<uint8_t>> &data)> &callback)
486 {
487 sptr<OHOS::DistributedObject::IObjectService> proxy = ClientAdaptor::GetObjectService();
488 if (proxy == nullptr) {
489 LOG_ERROR("proxy is nullptr.");
490 return ERR_NULL_PTR;
491 }
492 sptr<ObjectChangeCallbackBroker> objectRemoteResumeCallback = new (std::nothrow) ObjectChangeCallback(callback);
493 if (objectRemoteResumeCallback == nullptr) {
494 LOG_ERROR("CacheManager::SubscribeDataChange no memory for ObjectChangeCallback malloc!");
495 return ERR_NULL_PTR;
496 }
497 ClientAdaptor::RegisterClientDeathListener(bundleName, objectRemoteResumeCallback->AsObject());
498 int32_t status = proxy->RegisterDataObserver(
499 bundleName, sessionId, objectRemoteResumeCallback->AsObject().GetRefPtr());
500 if (status != SUCCESS) {
501 LOG_ERROR("object remote resume failed code=%d.", static_cast<int>(status));
502 }
503 LOG_INFO("object remote resume successful");
504 return status;
505 }
506
UnregisterDataChange(const std::string & bundleName,const std::string & sessionId)507 int32_t CacheManager::UnregisterDataChange(const std::string &bundleName, const std::string &sessionId)
508 {
509 sptr<OHOS::DistributedObject::IObjectService> proxy = ClientAdaptor::GetObjectService();
510 if (proxy == nullptr) {
511 LOG_ERROR("proxy is nullptr.");
512 return ERR_NULL_PTR;
513 }
514 int32_t status = proxy->UnregisterDataChangeObserver(bundleName, sessionId);
515 if (status != SUCCESS) {
516 LOG_ERROR("object remote resume failed code=%d.", static_cast<int>(status));
517 }
518 LOG_INFO("object unregister data change observer successful");
519 return status;
520 }
521
DeleteSnapshot(const std::string & bundleName,const std::string & sessionId)522 int32_t CacheManager::DeleteSnapshot(const std::string &bundleName, const std::string &sessionId)
523 {
524 sptr<OHOS::DistributedObject::IObjectService> proxy = ClientAdaptor::GetObjectService();
525 if (proxy == nullptr) {
526 LOG_ERROR("proxy is nullptr.");
527 return ERR_NULL_PTR;
528 }
529 int32_t status = proxy->DeleteSnapshot(bundleName, sessionId);
530 if (status != SUCCESS) {
531 LOG_ERROR("object delete snapshot failed code=%d.", static_cast<int>(status));
532 }
533 LOG_INFO("object delete snapshot successful");
534 return status;
535 }
536 } // namespace OHOS::ObjectStore
537