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