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 */ 15import distributedData from '@ohos.data.distributedData'; 16import { logger } from './Logger'; 17import deviceManager from '@ohos.distributedHardware.deviceManager'; 18 19const STORE_ID = 'distributedcalc'; 20const TAG = 'KvStoreModel'; 21let bundleName = 'ohos.samples.distributedcalc'; 22const mode = distributedData.SyncMode.PUSH_PULL; 23let devManager; 24 25export class KvStoreModel { 26 kvManager 27 kvStore 28 29 createKvStore(callback) { 30 if ((typeof (this.kvStore) !== undefined)) { 31 callback() 32 } 33 var config = { 34 bundleName, 35 userInfo: { 36 userId: '0', 37 userType: 0 38 } 39 } 40 logger.info(TAG, `createKVManager begin`) 41 distributedData.createKVManager(config).then((manager) => { 42 logger.debug(`createKVManager success, kvManager=${JSON.stringify(manager)}`) 43 this.kvManager = manager 44 let options = { 45 createIfMissing: true, 46 encrypt: false, 47 backup: false, 48 autoSync: false, 49 kvStoreType: 1, 50 securityLevel: 1, 51 } 52 logger.info(TAG, `kvManager.getKVStore begin`) 53 this.kvManager.getKVStore(STORE_ID, options).then((store) => { 54 logger.debug(TAG, `getKVStore success, kvStore=${store}`) 55 this.kvStore = store 56 callback() 57 }) 58 logger.info(TAG, `kvManager.getKVStore end`) 59 }) 60 logger.info(TAG, `createKVManager end`) 61 } 62 63 put(key, value) { 64 logger.debug(TAG, `kvStore.put ${key}=${value}`) 65 try { 66 this.kvStore.put(key, value + 'end').then((data) => { 67 logger.debug(TAG, `kvStore.put ${key} finished, data=${JSON.stringify(data)}`) 68 // create deviceManager 69 deviceManager.createDeviceManager(bundleName, (err, value) => { 70 let deviceIds = []; 71 if (!err) { 72 devManager = value; 73 if (devManager != null) { 74 var devices = devManager.getTrustedDeviceListSync(); 75 for (var i = 0; i < devices.length; i++) { 76 deviceIds[i] = devices[i].networkId; 77 } 78 } 79 } 80 if (this.kvStore != null) { 81 this.kvStore.sync(deviceIds, mode, 1000); 82 } 83 }); 84 }).catch((err) => { 85 logger.error(TAG, `kvStore.put ${key} failed, ${JSON.stringify(err)}`) 86 }) 87 } catch(error) { 88 logger.error(TAG, `kvStore.put code ${JSON.stringify(error.code)}`) 89 } 90 } 91 92 off() { 93 if (this.kvStore !== null) { 94 try { 95 this.kvStore.off('dataChange') 96 } catch(error) { 97 logger.error(TAG, `kvStore.off code ${JSON.stringify(error.code)}`) 98 } 99 } 100 } 101 102 setOnMessageReceivedListener(msg, refreshdata) { 103 logger.debug(TAG, `setOnMessageReceivedListener ${msg}`) 104 this.createKvStore(() => { 105 logger.info(TAG, `kvStore.on(dataChange) begin`) 106 try { 107 this.kvStore?.on('dataChange', distributedData.SubscribeType.SUBSCRIBE_TYPE_REMOTE, (data) => { 108 logger.debug(TAG, `dataChange, ${JSON.stringify(data)}`) 109 logger.debug(TAG, `dataChange, insert ${data.insertEntries.length} update ${data.updateEntries.length}`) 110 let entries = data.insertEntries.length > 0 ? data.insertEntries : data.updateEntries 111 this.simplify(entries, msg, refreshdata) 112 }) 113 } catch(error) { 114 logger.error(TAG, `kvStore.on(dataChange) code is ${JSON.stringify(error.code)}, message is ${JSON.stringify(error.message)}`) 115 } 116 logger.info(TAG, `kvStore.on(dataChange) end`) 117 }) 118 } 119 120 simplify(entries, msg, refreshdata) { 121 for (let i = 0; i < entries.length; i++) { 122 if (entries[i].key === msg) { 123 let value = entries[i].value.value 124 logger.debug(TAG, `Entries receive ${msg}=${value}`) 125 let valueResult = value.substring(0, value.lastIndexOf('end')) 126 logger.debug(TAG, `Entries receive valueResult = ${valueResult}`) 127 refreshdata(valueResult) 128 return 129 } 130 } 131 } 132}