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