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 disData from '@ohos.data.distributedKVStore';
16import backgroundTaskManager from '@ohos.backgroundTaskManager';
17import dataRdb from '@ohos.data.rdb';
18import ApiResult from '../common/apiResult';
19import distributedObject from '@ohos.data.distributedDataObject';
20import deviceinfo from '@ohos.deviceInfo'
21import UIAbility from '@ohos.app.ability.UIAbility';
22
23import common from "@ohos.app.ability.common"
24
25const TEST_BUNDLE_NAME = 'com.acts.distributekvdisjs';
26let logTag = "[[RpcServer_TestApi:  ]]";
27let kvManager = null;
28let kvStore = null;
29
30let rdbStore = undefined;
31
32let g_object = undefined;
33
34let context;
35
36export default class TestApi{
37    constructor(){}
38    add(a,b) {
39        console.log(logTag+"_methodName is add");
40        return Number(a)+Number(b);
41    }
42    sub(a,b) {
43        console.log(logTag+"_methodName is sub");
44         return Number(a)-Number(b);
45    }
46
47    async createKvManager(){
48        console.info(logTag + "_methodName is createKvManager");
49        try {
50             let context = globalThis.extensionContext;
51             console.info(logTag + "context=" + context);
52             const config = {
53                 context: context,
54                 bundleName: TEST_BUNDLE_NAME,
55             }
56             kvManager = disData.createKVManager(config);
57             console.log(logTag + "createKvManager22 success, kvManager=" + kvManager);
58          } catch (error) {
59            console.error(logTag + "createKvManager22 error.code=" + error.code + "error.message=" + error.message);
60          }
61         console.info(logTag + "createKvManager22 end");
62    }
63
64    async getKvStore(storeId,SecurityLevel,encrypt){
65        console.info(logTag + "_methodName is getKvStore, storeId=" + storeId + " SecurityLevel=" + SecurityLevel + " encrypt="+ encrypt);
66        console.info(logTag + "kvManager=" + kvManager);
67        if(!kvManager) {
68            console.info(logTag + "createKvManager22 begin");
69           console.info(logTag + "_methodName is createKvManager22");
70           try {
71                let context = globalThis.extensionContext;
72                console.info(logTag + "context=" + context);
73                const config = {
74                    context: context,
75                    bundleName: TEST_BUNDLE_NAME,
76                }
77                kvManager = disData.createKVManager(config);
78                console.log(logTag + "createKvManager22 success, kvManager=" + kvManager);
79             } catch (error) {
80               console.error(logTag + "createKvManager22 error.code=" + error.code + "error.message=" + error.message);
81             }
82            console.info(logTag + "createKvManager22 end");
83        }
84
85        let flag_41 = 1;
86        let localOSVersion = "";
87        let OSVersion41 = "OpenHarmony-4.1";
88        let osReleaseTypeInfo = deviceinfo.osReleaseType;
89        console.info(logTag + 'the value of the deviceinfo osReleaseType is :' + osReleaseTypeInfo);
90        let osFullNameInfo = deviceinfo.osFullName;
91        console.info(logTag + 'the value of the deviceinfo osFullName is :' + osFullNameInfo);
92
93        localOSVersion = osFullNameInfo.substring(0, 15);
94        console.info(logTag + "localOSVersion is: " + localOSVersion);
95
96        var optionsInfo = {
97            createIfMissing : true,
98            encrypt : false,
99            backup : false,
100            autoSync: false,
101            kvStoreType : disData.KVStoreType.SINGLE_VERSION,
102            schema : '',
103            securityLevel : disData.SecurityLevel.S1,
104        }
105        if(encrypt == "true"){
106            optionsInfo.encrypt = true;
107        }else{
108            optionsInfo.encrypt = false;
109        }
110
111        if(SecurityLevel == "NO_LEVEL"){
112            optionsInfo.securityLevel=disData.SecurityLevel.NO_LEVEL;
113        }else if(SecurityLevel == "S0"){
114            optionsInfo.securityLevel=disData.SecurityLevel.S0;
115        }else if(SecurityLevel == "S1"){
116            optionsInfo.securityLevel=disData.SecurityLevel.S1;
117        }else if(SecurityLevel == "S2"){
118            optionsInfo.securityLevel=disData.SecurityLevel.S2;
119        }else if(SecurityLevel == "S3"){
120            optionsInfo.securityLevel=disData.SecurityLevel.S3;
121        }else if(SecurityLevel == "S4"){
122            optionsInfo.securityLevel=disData.SecurityLevel.S4;
123        }else {
124            optionsInfo.securityLevel=disData.SecurityLevel.S1;
125        }
126
127        let name = new disData.FieldNode('name');
128        name.type = disData.ValueType.INTEGER;
129        name.nullable = false;
130        name.default = '0';
131
132        let schema = new disData.Schema();
133        schema.root.appendChild(name);
134        schema.indexes = ['$.name'];
135        schema.mode = 1;
136
137
138        let TEST_SCHEMA_STORE_ID_PREF = "SchemaStoreId_";
139        let schemaIdPref = storeId.substring(0, 14);
140        console.info(logTag + "schemaIdPref=" + schemaIdPref);
141        if (schemaIdPref == TEST_SCHEMA_STORE_ID_PREF) {
142            optionsInfo.schema = schema;
143        }
144        console.info(logTag + "optionsInfo.schema=" + optionsInfo.schema);
145
146        await kvManager.getKVStore(storeId,optionsInfo).then((store) =>{
147            kvStore = store;
148            console.info(logTag + " getKVStore success, securityLevel is: " + optionsInfo.securityLevel);
149            return String(true);
150        }).catch((error) => {
151            console.error(logTag + "getKVStore fail, error.code=" + error.code + "error.message=" + error.message);
152            return String(error);
153        });
154    }
155    async closeKvStore(storeId){
156        try{
157        await kvManager.closeKVStore(TEST_BUNDLE_NAME, storeId).then(async () => {
158            await kvManager.deleteKVStore(TEST_BUNDLE_NAME, storeId).then(() => {
159                console.info(logTag + " Server deleteKVStore success, storeId=" + storeId);
160                return String(true);
161            })
162        }).catch((error) => {
163            console.error(logTag + "Server deleteKVStore fail, error.code=" + error.code + "error.message=" + error.message);
164            return String(error);
165        });
166        } catch (err) {
167            console.error('catch closeKvStore err:' + `, error code is ${err.code}, message is ${err.message}`);
168            return String(err);
169        }
170    }
171
172    async kvPut(key,value,valueType){
173        let putValue = undefined;
174        console.info(logTag + " putValue : " + putValue + "  value is: " + value + "  valueType is: " + valueType);
175        if(valueType == "String"){
176            putValue = value;
177        }else if(valueType == "Number"){
178            putValue = Number(value);
179        }else if(valueType == "Number_Min"){
180            putValue = Number.MIN_VALUE;
181        }else if(valueType == "Uint8Array"){
182            putValue = value.split(',');
183        }else if(valueType == "Boolean"){
184            if(value == "false"){
185                putValue = false;
186            }else{
187                putValue = Boolean(value);
188            }
189        }
190        console.info(logTag + " putValue : " + putValue + "  value is: " + value);
191        await kvStore.put(key,putValue).then(() =>  {
192            console.info(logTag + " Server  put data success ,key is : " + key + " value is: " + putValue);
193            return String(true);
194        }).catch((error) => {
195            console.error(logTag + " Server  put fail, error.code=" + error.code + "error.message=" + error.message);
196            return String(error);
197        });
198    }
199     async kvGet(key,callback){
200        console.info(logTag + " kvGet start");
201        let errInfo = undefined;
202        let result = undefined;
203        kvStore.get(key, function (err, data){
204            errInfo = err;
205            result = data;
206        })
207        if(err != null){
208            console.info(logTag + " kvGet get data error: " + err);
209            callback(err);
210        }else{
211            console.info(logTag + " kvGet get data success");
212            callback(data);
213        }
214    }
215    async kvDelete(key){
216        await kvStore.delete(key).then(() => {
217            console.info(logTag + "Delete data success");
218            return String(true);
219        }).catch((err) => {
220            console.info(logTag + "Delete data error,errorInfo: " + err);
221            return String(err);
222
223        });
224    }
225
226    kvSync(deviceid,mode){
227        let syncMode = undefined;
228        if(mode == "PUSH"){
229            syncMode = disData.SyncMode.PUSH_ONLY;
230        }else if(mode == "PUSH_PULL"){
231            syncMode = disData.SyncMode.PUSH_PULL;
232        }
233        kvStore.Sync([deviceid],syncMode);
234        return JSON.stringify(syncMode);
235    }
236
237    async getRdbStore(rdbStoreName){
238        var storeConfig = {
239            name: rdbStoreName,
240        }
241        await dataRdb.getRdbStore(storeConfig,1).then((store) => {
242            console.info(logTag + " get rdbStore success");
243            rdbStore = store;
244            return String(true);
245        }).catch((err) => {
246            console.info(logTag + " get rdbStore error, err: " + err.code + err.message);
247            return String(err);
248        });
249    }
250
251    async createObject(objectname, age, isVis){
252        try{
253            console.info(logTag + "************* createObject begin ************* ");
254
255            let g_context = globalThis.extensionContext;
256            console.info(logTag + "context 2= " + g_context);
257            if (g_context == undefined || g_context == null) {
258                console.info(logTag + "error: g_context = undefined");
259                return false;
260            }
261
262            g_object = undefined;
263            let rename = objectname;
264            let reage = Number(age);
265            let reisVis = Boolean(isVis);
266
267            console.info(logTag + "objectname=" + objectname + "  age=" + age + "  isVis=" + isVis);
268            console.info(logTag + "rename=" + rename + "  reage=" + reage + "  reisVis=" + reisVis);
269
270            g_object = distributedObject.create(g_context, {name: rename, age: reage, isVis: reisVis});
271            if (g_object == undefined || g_object == null) {
272                console.info(logTag + "error:  g_object = undefined");
273                return false;
274            }
275            console.info(logTag + "createObject success");
276            console.info(logTag + g_object.name + "  " + g_object.age + "  " + g_object.isVis);
277
278        }catch (err) {
279            console.info(logTag + "createObject error, err: "+ err.code + err.message);
280        }
281    }
282
283    async setSessionId(sessionId){
284        try{
285            console.info(logTag + "************* setSessionId begin ************* ");
286            console.info(logTag +"g_object=" + g_object);
287            if (g_object == undefined || g_object == null) {
288                console.info(logTag + "error:  g_object = undefined");
289                return false;
290            }
291            g_object.setSessionId(sessionId).then(() => {
292                console.info(logTag + "remote join session success. sessionId=" + sessionId);
293            }).catch((error) => {
294                console.info(logTag + "remote join session error: " + error.code + error.message);
295                return false;
296            });
297        }catch (err) {
298            console.info(logTag + "setSessionId error, err: "+ err.code + err.message);
299        }
300    }
301
302    async objectPut(key,value){
303        console.info(logTag + "objectPut key=" + key + "  value=" + value );
304        if(key == "name"){
305            g_object.name = value;
306            console.info(logTag + "objectPut success. name=" + g_object.name);
307        }else if(key == "age"){
308            g_object.age = Number(value);
309            console.info(logTag + "objectPut success. age=" + g_object.age);
310        }else if(key == "isVis"){
311            if(value == "false"){
312                g_object.isVis = false;
313            }else{
314                g_object.isVis = Boolean(value);
315            }
316            console.info(logTag + "objectPut success. isVis=" + g_object.isVis);
317        }
318    }
319
320}
321