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