1/*
2 * Copyright (C) 2024 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.ets';
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_STORE_ID = 'clientStoreId';
26const SERVET_STORE_ID = 'clientStoreId';
27let TEST_BUNDLE_NAME = 'com.acts.distributekvdisets';
28
29let logTag = "[[RpcServer_TestApi:  ]]";
30let kvManager = null;
31let kvStore = null;
32let rdbStore = undefined;
33let g_object = undefined;
34
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 : undefined,
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 == "S1"){
112            optionsInfo.securityLevel=disData.SecurityLevel.S1;
113        }else if(SecurityLevel == "S2"){
114            optionsInfo.securityLevel=disData.SecurityLevel.S2;
115        }else if(SecurityLevel == "S3"){
116            optionsInfo.securityLevel=disData.SecurityLevel.S3;
117        }else if(SecurityLevel == "S4"){
118            optionsInfo.securityLevel=disData.SecurityLevel.S4;
119        }else {
120            optionsInfo.securityLevel=disData.SecurityLevel.S1;
121        }
122
123        let name = new disData.FieldNode('name');
124        name.type = disData.ValueType.INTEGER;
125        name.nullable = false;
126        name.default = '0';
127
128        let schema = new disData.Schema();
129        schema.root.appendChild(name);
130        schema.indexes = ['$.name'];
131        schema.mode = 1; 
132
133        let TEST_SCHEMA_STORE_ID_PREF = "SchemaStoreId_";
134        let schemaIdPref = storeId.substring(0, 14);
135        console.info(logTag + "schemaIdPref=" + schemaIdPref);
136        if (schemaIdPref == TEST_SCHEMA_STORE_ID_PREF) {
137            optionsInfo.schema = schema;
138        } 
139        console.info(logTag + "optionsInfo.schema=" + optionsInfo.schema);
140
141        await kvManager.getKVStore(storeId,optionsInfo).then((store) =>{
142            kvStore = store;
143            console.info(logTag + " getKVStore success, securityLevel is: " + optionsInfo.securityLevel);
144            return String(true);
145        }).catch((error) => {
146            console.error(logTag + "getKVStore fail, error.code=" + error.code + "error.message=" + error.message);
147            return String(error);
148        });
149    }
150    async closeKvStore(storeId){
151        try{
152        await kvManager.closeKVStore(TEST_BUNDLE_NAME, storeId).then(async () => {
153            await kvManager.deleteKVStore(TEST_BUNDLE_NAME, storeId).then(() => {
154                console.info(logTag + " Server deleteKVStore success, storeId=" + storeId);
155                return String(true);
156            })
157        }).catch((error) => {
158            console.error(logTag + "Server deleteKVStore fail, error.code=" + error.code + "error.message=" + error.message);
159            return String(error);
160        });
161        } catch (err) {
162            console.error('catch closeKvStore err:' + `, error code is ${err.code}, message is ${err.message}`);
163            return String(err);
164        }
165    }
166
167    async kvPut(key,value,valueType){
168        let putValue = undefined;
169        console.info(logTag + " putValue : " + putValue + "  value is: " + value + "  valueType is: " + valueType);
170        if(valueType == "String"){
171            putValue = value;
172        }else if(valueType == "String_MAX_VALUE_LENGTH"){
173            let maxValueLength:number = disData.Constants.MAX_VALUE_LENGTH;
174            console.info(logTag + 'maxValueLength = ' + maxValueLength);
175            let maxValueLengthString:number = "v".repeat(maxValueLength);
176            console.info(logTag + 'maxValueLengthString.length = ' + maxValueLengthString.length);
177            putValue = maxValueLengthString;
178        }else if(valueType == "Number"){
179            putValue = Number(value);
180        }else if(valueType == "Number_Min"){
181            putValue = Number.MIN_VALUE;
182        }else if(valueType == "Uint8Array"){
183            putValue = value.split(',');
184        }else if(valueType == "Boolean"){
185            if(value == "false"){
186                putValue = false;
187            }else{
188                putValue = Boolean(value);
189            }
190        }
191        console.info(logTag + " putValue : " + putValue + "  value is: " + value + "  valueType is: " + valueType);
192        await kvStore.put(key,putValue).then(() =>  {
193            console.info(logTag + " Server  put data success ,key is : " + key + " value is: " + putValue);
194            return String(true);
195        }).catch((error) => {
196            console.error(logTag + " Server  put fail, error.code=" + error.code + "error.message=" + error.message);
197            return String(error);
198        });
199    }
200     async kvGet(key,callback){
201        console.info(logTag + " kvGet start");
202        let errInfo = undefined;
203        let result = undefined;
204        kvStore.get(key, function (err, data){
205            errInfo = err;
206            result = data;
207        })
208        if(errInfo != null){
209            console.info(logTag + " kvGet get data error: " + errInfo);
210            callback(errInfo);
211        }else{
212            console.info(logTag + " kvGet get data success");
213            callback(result);
214        }
215    }
216    async kvDelete(key){
217        await kvStore.delete(key).then(() => {
218            console.info(logTag + "Delete data success");
219            return String(true);
220        }).catch((err) => {
221            console.info(logTag + "Delete data error,errorInfo: " + err);
222            return String(err);
223
224        });
225    }
226
227    kvSync(deviceid,mode){
228        let syncMode = undefined;
229        if(mode == "PUSH"){
230            syncMode = disData.SyncMode.PUSH_ONLY;
231        }else if(mode == "PUSH_PULL"){
232            syncMode = disData.SyncMode.PUSH_PULL;
233        }
234        kvStore.Sync([deviceid],syncMode);
235        return JSON.stringify(syncMode);
236    }
237
238    async createObject(objectname, age, isVis){
239        try{
240            console.info(logTag + "************* createObject begin ************* ");
241
242            let g_context = globalThis.extensionContext;
243            console.info(logTag + "context 2= " + g_context);
244            if (g_context == undefined || g_context == null) {
245                console.info(logTag + "error: g_context = undefined");
246                return false;
247            }
248
249            g_object = undefined;
250            let rename = objectname;
251            let reage = Number(age);
252            let reisVis = Boolean(isVis);
253
254            console.info(logTag + "objectname=" + objectname + "  age=" + age + "  isVis=" + isVis);
255            console.info(logTag + "rename=" + rename + "  reage=" + reage + "  reisVis=" + reisVis);
256
257            g_object = distributedObject.create(g_context, {name: rename, age: reage, isVis: reisVis});
258            if (g_object == undefined || g_object == null) {
259                console.info(logTag + "error:  g_object = undefined");
260                return false;
261            }
262            console.info(logTag + "createObject success");
263            console.info(logTag + g_object.name + "  " + g_object.age + "  " + g_object.isVis);
264
265        }catch (err) {
266            console.info(logTag + "createObject error, err: "+ err.code + err.message);
267        }
268    }
269
270    async setSessionId(sessionId){
271        try{
272            console.info(logTag + "************* setSessionId begin ************* ");
273            console.info(logTag +"g_object=" + g_object);
274            if (g_object == undefined || g_object == null) {
275                console.info(logTag + "error:  g_object = undefined");
276                return false;
277            }
278            g_object.setSessionId(sessionId).then(() => {
279                console.info(logTag + "remote join session success. sessionId=" + sessionId);
280            }).catch((error) => {
281                console.info(logTag + "remote join session error: " + error.code + error.message);
282                return false;
283            });
284        }catch (err) {
285            console.info(logTag + "setSessionId error, err: "+ err.code + err.message);
286        }
287    }
288    
289    async objectPut(key,value){
290        console.info(logTag + "objectPut key=" + key + "  value=" + value );
291        if(key == "name"){
292            g_object.name = value;
293            console.info(logTag + "objectPut success. name=" + g_object.name);
294        }else if(key == "age"){
295            g_object.age = Number(value);
296            console.info(logTag + "objectPut success. age=" + g_object.age);
297        }else if(key == "isVis"){
298            if(value == "false"){
299                g_object.isVis = false;
300            }else{
301                g_object.isVis = Boolean(value);
302            }
303            console.info(logTag + "objectPut success. isVis=" + g_object.isVis);
304        }
305    }
306
307}
308