1fc223305Sopenharmony_ci/*
2fc223305Sopenharmony_ci * Copyright (c) 2024 Huawei Device Co., Ltd.
3fc223305Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
4fc223305Sopenharmony_ci * you may not use this file except in compliance with the License.
5fc223305Sopenharmony_ci * You may obtain a copy of the License at
6fc223305Sopenharmony_ci *
7fc223305Sopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0
8fc223305Sopenharmony_ci *
9fc223305Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software
10fc223305Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
11fc223305Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12fc223305Sopenharmony_ci * See the License for the specific language governing permissions and
13fc223305Sopenharmony_ci * limitations under the License.
14fc223305Sopenharmony_ci */
15fc223305Sopenharmony_ci
16fc223305Sopenharmony_ci#include "preferences_value_parcel.h"
17fc223305Sopenharmony_ci
18fc223305Sopenharmony_ci#include "log_print.h"
19fc223305Sopenharmony_ci#include "preferences_errno.h"
20fc223305Sopenharmony_ci#include "securec.h"
21fc223305Sopenharmony_ci
22fc223305Sopenharmony_cinamespace OHOS {
23fc223305Sopenharmony_cinamespace NativePreferences {
24fc223305Sopenharmony_ci
25fc223305Sopenharmony_ciuint8_t PreferencesValueParcel::GetTypeIndex(const PreferencesValue &value)
26fc223305Sopenharmony_ci{
27fc223305Sopenharmony_ci    if (value.IsInt()) {
28fc223305Sopenharmony_ci        return INT_TYPE;
29fc223305Sopenharmony_ci    } else if (value.IsLong()) {
30fc223305Sopenharmony_ci        return LONG_TYPE;
31fc223305Sopenharmony_ci    } else if (value.IsFloat()) {
32fc223305Sopenharmony_ci        return FLOAT_TYPE;
33fc223305Sopenharmony_ci    } else if (value.IsDouble()) {
34fc223305Sopenharmony_ci        return DOUBLE_TYPE;
35fc223305Sopenharmony_ci    } else if (value.IsBool()) {
36fc223305Sopenharmony_ci        return BOOL_TYPE;
37fc223305Sopenharmony_ci    } else if (value.IsString()) {
38fc223305Sopenharmony_ci        return STRING_TYPE;
39fc223305Sopenharmony_ci    } else if (value.IsStringArray()) {
40fc223305Sopenharmony_ci        return STRING_ARRAY_TYPE;
41fc223305Sopenharmony_ci    } else if (value.IsBoolArray()) {
42fc223305Sopenharmony_ci        return BOOL_ARRAY_TYPE;
43fc223305Sopenharmony_ci    } else if (value.IsDoubleArray()) {
44fc223305Sopenharmony_ci        return DOUBLE_ARRAY_TYPE;
45fc223305Sopenharmony_ci    } else if (value.IsUint8Array()) {
46fc223305Sopenharmony_ci        return UINT8_ARRAY_TYPE;
47fc223305Sopenharmony_ci    } else if (value.IsObject()) {
48fc223305Sopenharmony_ci        return OBJECT_TYPE;
49fc223305Sopenharmony_ci    } else if (value.IsBigInt()) {
50fc223305Sopenharmony_ci        return BIG_INT_TYPE;
51fc223305Sopenharmony_ci    } else {
52fc223305Sopenharmony_ci        return MONO_TYPE;
53fc223305Sopenharmony_ci    }
54fc223305Sopenharmony_ci}
55fc223305Sopenharmony_ci
56fc223305Sopenharmony_ciuint32_t PreferencesValueParcel::CalSize(PreferencesValue value)
57fc223305Sopenharmony_ci{
58fc223305Sopenharmony_ci    uint8_t type = GetTypeIndex(value);
59fc223305Sopenharmony_ci    switch (type) {
60fc223305Sopenharmony_ci        case INT_TYPE:
61fc223305Sopenharmony_ci            return sizeof(uint8_t) + sizeof(int);
62fc223305Sopenharmony_ci        case LONG_TYPE:
63fc223305Sopenharmony_ci            return sizeof(uint8_t) + sizeof(int64_t);
64fc223305Sopenharmony_ci        case FLOAT_TYPE:
65fc223305Sopenharmony_ci            return sizeof(uint8_t) + sizeof(float);
66fc223305Sopenharmony_ci        case DOUBLE_TYPE:
67fc223305Sopenharmony_ci            return sizeof(uint8_t) + sizeof(double);
68fc223305Sopenharmony_ci        case BOOL_TYPE:
69fc223305Sopenharmony_ci            return sizeof(uint8_t) + sizeof(bool);
70fc223305Sopenharmony_ci        case OBJECT_TYPE:
71fc223305Sopenharmony_ci        case STRING_TYPE: {
72fc223305Sopenharmony_ci            uint32_t strLen = sizeof(uint8_t) + sizeof(size_t);
73fc223305Sopenharmony_ci            strLen += (type == STRING_TYPE) ? std::get<std::string>(value.value_).size() :
74fc223305Sopenharmony_ci                std::get<Object>(value.value_).valueStr.size();
75fc223305Sopenharmony_ci            return  strLen;
76fc223305Sopenharmony_ci        }
77fc223305Sopenharmony_ci        case BOOL_ARRAY_TYPE:
78fc223305Sopenharmony_ci            return sizeof(uint8_t) + sizeof(size_t) + std::get<std::vector<bool>>(value.value_).size() * sizeof(bool);
79fc223305Sopenharmony_ci        case DOUBLE_ARRAY_TYPE:
80fc223305Sopenharmony_ci            return sizeof(uint8_t) + sizeof(size_t) +
81fc223305Sopenharmony_ci                std::get<std::vector<double>>(value.value_).size() * sizeof(double);
82fc223305Sopenharmony_ci        case UINT8_ARRAY_TYPE:
83fc223305Sopenharmony_ci            return sizeof(uint8_t) + sizeof(size_t) +
84fc223305Sopenharmony_ci                ((std::get<std::vector<uint8_t>>(value.value_).size()) * sizeof(uint8_t));
85fc223305Sopenharmony_ci        case STRING_ARRAY_TYPE: {
86fc223305Sopenharmony_ci            uint32_t strArrBlobLen = sizeof(uint8_t) + sizeof(size_t);
87fc223305Sopenharmony_ci            std::vector<std::string> strVec = std::get<std::vector<std::string>>(value.value_);
88fc223305Sopenharmony_ci
89fc223305Sopenharmony_ci            for (size_t i = 0; i < strVec.size(); i++) {
90fc223305Sopenharmony_ci                strArrBlobLen += sizeof(size_t);
91fc223305Sopenharmony_ci                strArrBlobLen += strVec[i].size();
92fc223305Sopenharmony_ci            }
93fc223305Sopenharmony_ci            return strArrBlobLen;
94fc223305Sopenharmony_ci        }
95fc223305Sopenharmony_ci        case BIG_INT_TYPE:
96fc223305Sopenharmony_ci            return sizeof(uint8_t) + sizeof(size_t) + sizeof(int64_t) +
97fc223305Sopenharmony_ci                std::get<BigInt>(value.value_).words_.size() * sizeof(uint64_t);
98fc223305Sopenharmony_ci        default:
99fc223305Sopenharmony_ci            break;
100fc223305Sopenharmony_ci    }
101fc223305Sopenharmony_ci    return 0;
102fc223305Sopenharmony_ci}
103fc223305Sopenharmony_ci
104fc223305Sopenharmony_ciint PreferencesValueParcel::MarshallingBasicValueInner(const PreferencesValue &value, const uint8_t type,
105fc223305Sopenharmony_ci    std::vector<uint8_t> &data)
106fc223305Sopenharmony_ci{
107fc223305Sopenharmony_ci    uint8_t *startAddr = data.data();
108fc223305Sopenharmony_ci    size_t basicDataLen = 0;
109fc223305Sopenharmony_ci    if (data.size() <= sizeof(uint8_t)) {
110fc223305Sopenharmony_ci        LOG_ERROR("memcpy error when marshalling basic value, type: %{public}d", type);
111fc223305Sopenharmony_ci        return E_ERROR;
112fc223305Sopenharmony_ci    }
113fc223305Sopenharmony_ci    size_t memLen = data.size() - sizeof(uint8_t);
114fc223305Sopenharmony_ci    int errCode = E_OK;
115fc223305Sopenharmony_ci    switch (type) {
116fc223305Sopenharmony_ci        case INT_TYPE: {
117fc223305Sopenharmony_ci            int intValue = std::get<int>(value.value_);
118fc223305Sopenharmony_ci            basicDataLen = sizeof(int);
119fc223305Sopenharmony_ci            errCode = memcpy_s(startAddr + sizeof(uint8_t), memLen, &intValue, basicDataLen);
120fc223305Sopenharmony_ci            break;
121fc223305Sopenharmony_ci        }
122fc223305Sopenharmony_ci        case LONG_TYPE: {
123fc223305Sopenharmony_ci            int64_t longValue = std::get<int64_t>(value.value_);
124fc223305Sopenharmony_ci            basicDataLen = sizeof(int64_t);
125fc223305Sopenharmony_ci            errCode = memcpy_s(startAddr + sizeof(uint8_t), memLen, &longValue, basicDataLen);
126fc223305Sopenharmony_ci            break;
127fc223305Sopenharmony_ci        }
128fc223305Sopenharmony_ci        case FLOAT_TYPE: {
129fc223305Sopenharmony_ci            float floatValue = std::get<float>(value.value_);
130fc223305Sopenharmony_ci            basicDataLen = sizeof(float);
131fc223305Sopenharmony_ci            errCode = memcpy_s(startAddr + sizeof(uint8_t), memLen, &floatValue, basicDataLen);
132fc223305Sopenharmony_ci            break;
133fc223305Sopenharmony_ci        }
134fc223305Sopenharmony_ci        case DOUBLE_TYPE: {
135fc223305Sopenharmony_ci            double doubleValue = std::get<double>(value.value_);
136fc223305Sopenharmony_ci            basicDataLen = sizeof(double);
137fc223305Sopenharmony_ci            errCode = memcpy_s(startAddr + sizeof(uint8_t), memLen, &doubleValue, basicDataLen);
138fc223305Sopenharmony_ci            break;
139fc223305Sopenharmony_ci        }
140fc223305Sopenharmony_ci        case BOOL_TYPE: {
141fc223305Sopenharmony_ci            bool boolValue = std::get<bool>(value.value_);
142fc223305Sopenharmony_ci            basicDataLen = sizeof(bool);
143fc223305Sopenharmony_ci            errCode = memcpy_s(startAddr + sizeof(uint8_t), memLen, &boolValue, basicDataLen);
144fc223305Sopenharmony_ci            break;
145fc223305Sopenharmony_ci        }
146fc223305Sopenharmony_ci        default:
147fc223305Sopenharmony_ci            break;
148fc223305Sopenharmony_ci    }
149fc223305Sopenharmony_ci
150fc223305Sopenharmony_ci    if (errCode != E_OK) {
151fc223305Sopenharmony_ci        LOG_ERROR("memcpy failed when marshalling basic value, %{public}d", errCode);
152fc223305Sopenharmony_ci        return E_ERROR;
153fc223305Sopenharmony_ci    }
154fc223305Sopenharmony_ci    return E_OK;
155fc223305Sopenharmony_ci}
156fc223305Sopenharmony_ci
157fc223305Sopenharmony_ci/**
158fc223305Sopenharmony_ci *     ------------------------
159fc223305Sopenharmony_ci *     |  type  |   BasicData   |
160fc223305Sopenharmony_ci *     ------------------------
161fc223305Sopenharmony_ci * len:  uint8_t   sizeof(int) or size of(Bool) e.g.
162fc223305Sopenharmony_ci*/
163fc223305Sopenharmony_ciint PreferencesValueParcel::MarshallingBasicValue(const PreferencesValue &value, const uint8_t type,
164fc223305Sopenharmony_ci    std::vector<uint8_t> &data)
165fc223305Sopenharmony_ci{
166fc223305Sopenharmony_ci    uint8_t *startAddr = data.data();
167fc223305Sopenharmony_ci    int errCode = memcpy_s(startAddr, data.size(), &type, sizeof(uint8_t));
168fc223305Sopenharmony_ci    if (errCode != E_OK) {
169fc223305Sopenharmony_ci        LOG_ERROR("memcpy failed when marshalling basic value's type, %{public}d", errCode);
170fc223305Sopenharmony_ci        return E_NOT_SUPPORTED;
171fc223305Sopenharmony_ci    }
172fc223305Sopenharmony_ci    return MarshallingBasicValueInner(value, type, data);
173fc223305Sopenharmony_ci}
174fc223305Sopenharmony_ci
175fc223305Sopenharmony_ci/**
176fc223305Sopenharmony_ci *     -------------------------------------
177fc223305Sopenharmony_ci *     |  type  |   strLen   |   strData   |
178fc223305Sopenharmony_ci *     -------------------------------------
179fc223305Sopenharmony_ci * len:  uint8_t   size_t        strLen
180fc223305Sopenharmony_ci*/
181fc223305Sopenharmony_ciint PreferencesValueParcel::MarshallingStringValue(const PreferencesValue &value, const uint8_t type,
182fc223305Sopenharmony_ci    std::vector<uint8_t> &data)
183fc223305Sopenharmony_ci{
184fc223305Sopenharmony_ci    std::string stringValue;
185fc223305Sopenharmony_ci    if (type == OBJECT_TYPE) {
186fc223305Sopenharmony_ci        Object objValue = std::get<Object>(value.value_);
187fc223305Sopenharmony_ci        stringValue = objValue.valueStr;
188fc223305Sopenharmony_ci    } else {
189fc223305Sopenharmony_ci        // it's string type
190fc223305Sopenharmony_ci        stringValue = std::get<std::string>(value.value_);
191fc223305Sopenharmony_ci    }
192fc223305Sopenharmony_ci    uint8_t *startAddr = data.data();
193fc223305Sopenharmony_ci    int errCode = memcpy_s(startAddr, sizeof(uint8_t), &type, sizeof(uint8_t));
194fc223305Sopenharmony_ci    if (errCode != E_OK) {
195fc223305Sopenharmony_ci        LOG_ERROR("memcpy failed when marshalling string value's type, %{public}d", errCode);
196fc223305Sopenharmony_ci        return -E_ERROR;
197fc223305Sopenharmony_ci    }
198fc223305Sopenharmony_ci    size_t strLen = stringValue.size();
199fc223305Sopenharmony_ci    errCode = memcpy_s(startAddr + sizeof(uint8_t), sizeof(size_t), &strLen, sizeof(size_t));
200fc223305Sopenharmony_ci    if (errCode != E_OK) {
201fc223305Sopenharmony_ci        LOG_ERROR("memcpy failed when marshalling string value's str len, %{public}d", errCode);
202fc223305Sopenharmony_ci        return -E_ERROR;
203fc223305Sopenharmony_ci    }
204fc223305Sopenharmony_ci    if (strLen == 0) {
205fc223305Sopenharmony_ci        return E_OK;
206fc223305Sopenharmony_ci    }
207fc223305Sopenharmony_ci    errCode = memcpy_s(startAddr + sizeof(uint8_t) + sizeof(size_t), strLen,
208fc223305Sopenharmony_ci        stringValue.c_str(), strLen);
209fc223305Sopenharmony_ci    if (errCode != E_OK) {
210fc223305Sopenharmony_ci        LOG_ERROR("memcpy failed when marshalling string value's str data, %{public}d", errCode);
211fc223305Sopenharmony_ci        return -E_ERROR;
212fc223305Sopenharmony_ci    }
213fc223305Sopenharmony_ci    return E_OK;
214fc223305Sopenharmony_ci}
215fc223305Sopenharmony_ci
216fc223305Sopenharmony_ci/**
217fc223305Sopenharmony_ci *     --------------------------------------------------------------------
218fc223305Sopenharmony_ci *     |  type  |   vec_num   |  len1  |  str1  |  len2  |  str2  |  ...  |
219fc223305Sopenharmony_ci *     --------------------------------------------------------------------
220fc223305Sopenharmony_ci * len:  uint8_t   size_t        sizet     len1    size_t   len2
221fc223305Sopenharmony_ci*/
222fc223305Sopenharmony_ciint PreferencesValueParcel::MarshallingStringArrayValue(const PreferencesValue &value, const uint8_t type,
223fc223305Sopenharmony_ci    std::vector<uint8_t> &data)
224fc223305Sopenharmony_ci{
225fc223305Sopenharmony_ci    std::vector<std::string> strVec = std::get<std::vector<std::string>>(value.value_);
226fc223305Sopenharmony_ci    uint8_t *startAddr = data.data();
227fc223305Sopenharmony_ci    // write type into data
228fc223305Sopenharmony_ci    int errCode = memcpy_s(startAddr, sizeof(uint8_t), &type, sizeof(uint8_t));
229fc223305Sopenharmony_ci    if (errCode != E_OK) {
230fc223305Sopenharmony_ci        LOG_ERROR("memcpy failed when marshalling string array value's type, %{public}d", errCode);
231fc223305Sopenharmony_ci        return -E_ERROR;
232fc223305Sopenharmony_ci    }
233fc223305Sopenharmony_ci    startAddr += sizeof(uint8_t);
234fc223305Sopenharmony_ci
235fc223305Sopenharmony_ci    // write vector size into data
236fc223305Sopenharmony_ci    size_t vecNum = strVec.size();
237fc223305Sopenharmony_ci    errCode = memcpy_s(startAddr, sizeof(size_t), &vecNum, sizeof(size_t));
238fc223305Sopenharmony_ci    if (errCode != E_OK) {
239fc223305Sopenharmony_ci        LOG_ERROR("memcpy failed when marshalling string array value's vector num, %{public}d", errCode);
240fc223305Sopenharmony_ci        return -E_ERROR;
241fc223305Sopenharmony_ci    }
242fc223305Sopenharmony_ci    startAddr += sizeof(size_t);
243fc223305Sopenharmony_ci
244fc223305Sopenharmony_ci    // write every single str into data
245fc223305Sopenharmony_ci    for (size_t i = 0; i < vecNum; i++) {
246fc223305Sopenharmony_ci        size_t strLen = strVec[i].size();
247fc223305Sopenharmony_ci        errCode = memcpy_s(startAddr, sizeof(size_t), &strLen, sizeof(size_t));
248fc223305Sopenharmony_ci        if (errCode != E_OK) {
249fc223305Sopenharmony_ci            LOG_ERROR("memcpy failed when marshalling string array value's str len, %{public}d", errCode);
250fc223305Sopenharmony_ci            return -E_ERROR;
251fc223305Sopenharmony_ci        }
252fc223305Sopenharmony_ci        startAddr += sizeof(size_t);
253fc223305Sopenharmony_ci        if (strLen == 0) {
254fc223305Sopenharmony_ci            continue;
255fc223305Sopenharmony_ci        }
256fc223305Sopenharmony_ci        errCode = memcpy_s(startAddr, strLen, strVec[i].c_str(), strLen);
257fc223305Sopenharmony_ci        if (errCode != E_OK) {
258fc223305Sopenharmony_ci            LOG_ERROR("memcpy failed when marshalling string array value's str data, %{public}d", errCode);
259fc223305Sopenharmony_ci            return -E_ERROR;
260fc223305Sopenharmony_ci        }
261fc223305Sopenharmony_ci        startAddr += strLen;
262fc223305Sopenharmony_ci    }
263fc223305Sopenharmony_ci    return E_OK;
264fc223305Sopenharmony_ci}
265fc223305Sopenharmony_ci
266fc223305Sopenharmony_ciint PreferencesValueParcel::MarshallingVecUInt8AfterType(const PreferencesValue &value, uint8_t *startAddr)
267fc223305Sopenharmony_ci{
268fc223305Sopenharmony_ci    std::vector<uint8_t> vec = std::get<std::vector<uint8_t>>(value.value_);
269fc223305Sopenharmony_ci    size_t vecNum = vec.size();
270fc223305Sopenharmony_ci    // write vec num
271fc223305Sopenharmony_ci    int errCode = memcpy_s(startAddr, sizeof(size_t), &vecNum, sizeof(size_t));
272fc223305Sopenharmony_ci    if (errCode != E_OK) {
273fc223305Sopenharmony_ci        LOG_ERROR("memcpy failed when marshalling uint8 array value's vector num, %{public}d", errCode);
274fc223305Sopenharmony_ci        return E_ERROR;
275fc223305Sopenharmony_ci    }
276fc223305Sopenharmony_ci    if (vecNum == 0) {
277fc223305Sopenharmony_ci        return E_OK;
278fc223305Sopenharmony_ci    }
279fc223305Sopenharmony_ci    startAddr += sizeof(size_t);
280fc223305Sopenharmony_ci    errCode = memcpy_s(startAddr, vecNum * sizeof(uint8_t), vec.data(), vecNum * sizeof(uint8_t));
281fc223305Sopenharmony_ci    if (errCode != E_OK) {
282fc223305Sopenharmony_ci        LOG_ERROR("memcpy failed when marshalling uint8 array value's data, %{public}d", errCode);
283fc223305Sopenharmony_ci        return E_ERROR;
284fc223305Sopenharmony_ci    }
285fc223305Sopenharmony_ci    return errCode;
286fc223305Sopenharmony_ci}
287fc223305Sopenharmony_ci
288fc223305Sopenharmony_ci/**
289fc223305Sopenharmony_ci *     --------------------------------------------------------------------------
290fc223305Sopenharmony_ci *     |  type  |  vec_num  |    sign    |     data1     |     data2     | .... |
291fc223305Sopenharmony_ci *     --------------------------------------------------------------------------
292fc223305Sopenharmony_ci * len:  uint8_t   size_t   sizeof(int64_t)  sizeof(int64_t)    sizeof(int64_t)
293fc223305Sopenharmony_ci*/
294fc223305Sopenharmony_ciint PreferencesValueParcel::MarshallingVecBigIntAfterType(const PreferencesValue &value, uint8_t *startAddr)
295fc223305Sopenharmony_ci{
296fc223305Sopenharmony_ci    BigInt bigIntValue = std::get<BigInt>(value.value_);
297fc223305Sopenharmony_ci    int64_t sign = static_cast<int64_t>(bigIntValue.sign_);
298fc223305Sopenharmony_ci    std::vector<uint64_t> words = bigIntValue.words_;
299fc223305Sopenharmony_ci
300fc223305Sopenharmony_ci    // write vec num
301fc223305Sopenharmony_ci    size_t vecNum = words.size();
302fc223305Sopenharmony_ci    int errCode = memcpy_s(startAddr, sizeof(size_t), &vecNum, sizeof(size_t));
303fc223305Sopenharmony_ci    if (errCode != E_OK) {
304fc223305Sopenharmony_ci        LOG_ERROR("memcpy failed when marshalling bigInt array value's vector num, %{public}d", errCode);
305fc223305Sopenharmony_ci        return E_ERROR;
306fc223305Sopenharmony_ci    }
307fc223305Sopenharmony_ci    startAddr += sizeof(size_t);
308fc223305Sopenharmony_ci
309fc223305Sopenharmony_ci    // write sign
310fc223305Sopenharmony_ci    errCode = memcpy_s(startAddr, sizeof(int64_t), &sign, sizeof(int64_t));
311fc223305Sopenharmony_ci    if (errCode != E_OK) {
312fc223305Sopenharmony_ci        LOG_ERROR("memcpy failed when marshalling bigInt array value's sign, %{public}d", errCode);
313fc223305Sopenharmony_ci        return E_ERROR;
314fc223305Sopenharmony_ci    }
315fc223305Sopenharmony_ci    startAddr += sizeof(int64_t);
316fc223305Sopenharmony_ci
317fc223305Sopenharmony_ci    // write vec element
318fc223305Sopenharmony_ci    for (size_t i = 0; i < vecNum; i++) {
319fc223305Sopenharmony_ci        uint64_t item = words[i];
320fc223305Sopenharmony_ci        errCode = memcpy_s(startAddr, sizeof(uint64_t), &item, sizeof(uint64_t));
321fc223305Sopenharmony_ci        if (errCode != E_OK) {
322fc223305Sopenharmony_ci            LOG_ERROR("memcpy failed when marshalling bigInt array value's words, %{public}d", errCode);
323fc223305Sopenharmony_ci            return E_ERROR;
324fc223305Sopenharmony_ci        }
325fc223305Sopenharmony_ci        startAddr += sizeof(uint64_t);
326fc223305Sopenharmony_ci    }
327fc223305Sopenharmony_ci    return errCode;
328fc223305Sopenharmony_ci}
329fc223305Sopenharmony_ci
330fc223305Sopenharmony_ciint PreferencesValueParcel::MarshallingVecDoubleAfterType(const PreferencesValue &value, uint8_t *startAddr)
331fc223305Sopenharmony_ci{
332fc223305Sopenharmony_ci    std::vector<double> vec = std::get<std::vector<double>>(value.value_);
333fc223305Sopenharmony_ci    size_t vecNum = vec.size();
334fc223305Sopenharmony_ci    // write vec num
335fc223305Sopenharmony_ci    int errCode = memcpy_s(startAddr, sizeof(size_t), &vecNum, sizeof(size_t));
336fc223305Sopenharmony_ci    if (errCode != E_OK) {
337fc223305Sopenharmony_ci        LOG_ERROR("memcpy failed when marshalling double array value's vector num, %{public}d", errCode);
338fc223305Sopenharmony_ci        return E_ERROR;
339fc223305Sopenharmony_ci    }
340fc223305Sopenharmony_ci    startAddr += sizeof(size_t);
341fc223305Sopenharmony_ci
342fc223305Sopenharmony_ci    // write vec element
343fc223305Sopenharmony_ci    for (size_t i = 0; i < vecNum; i++) {
344fc223305Sopenharmony_ci        double item = vec[i];
345fc223305Sopenharmony_ci        errCode = memcpy_s(startAddr, sizeof(double), &item, sizeof(double));
346fc223305Sopenharmony_ci        if (errCode != E_OK) {
347fc223305Sopenharmony_ci            LOG_ERROR("memcpy failed when marshalling double array value's vector data, %{public}d", errCode);
348fc223305Sopenharmony_ci            return E_ERROR;
349fc223305Sopenharmony_ci        }
350fc223305Sopenharmony_ci        startAddr += sizeof(double);
351fc223305Sopenharmony_ci    }
352fc223305Sopenharmony_ci    return errCode;
353fc223305Sopenharmony_ci}
354fc223305Sopenharmony_ci
355fc223305Sopenharmony_ciint PreferencesValueParcel::MarshallingVecBoolAfterType(const PreferencesValue &value, uint8_t *startAddr)
356fc223305Sopenharmony_ci{
357fc223305Sopenharmony_ci    const std::vector<bool> vec = std::get<std::vector<bool>>(value.value_);
358fc223305Sopenharmony_ci    size_t vecNum = vec.size();
359fc223305Sopenharmony_ci    // write vec num
360fc223305Sopenharmony_ci    int errCode = memcpy_s(startAddr, sizeof(size_t), &vecNum, sizeof(size_t));
361fc223305Sopenharmony_ci    if (errCode != E_OK) {
362fc223305Sopenharmony_ci        LOG_ERROR("memcpy failed when marshalling bool array value's vector num, %{public}d", errCode);
363fc223305Sopenharmony_ci        return E_ERROR;
364fc223305Sopenharmony_ci    }
365fc223305Sopenharmony_ci    startAddr += sizeof(size_t);
366fc223305Sopenharmony_ci
367fc223305Sopenharmony_ci    // write vec element
368fc223305Sopenharmony_ci    for (size_t i = 0; i < vecNum; i++) {
369fc223305Sopenharmony_ci        bool item = vec[i];
370fc223305Sopenharmony_ci        errCode = memcpy_s(startAddr, sizeof(bool), &item, sizeof(bool));
371fc223305Sopenharmony_ci        if (errCode != E_OK) {
372fc223305Sopenharmony_ci            LOG_ERROR("memcpy failed when marshalling bool array value's vector data, %{public}d", errCode);
373fc223305Sopenharmony_ci            return E_ERROR;
374fc223305Sopenharmony_ci        }
375fc223305Sopenharmony_ci        startAddr += sizeof(bool);
376fc223305Sopenharmony_ci    }
377fc223305Sopenharmony_ci    return errCode;
378fc223305Sopenharmony_ci}
379fc223305Sopenharmony_ci
380fc223305Sopenharmony_ci/**
381fc223305Sopenharmony_ci *     -----------------------------------------------------------------------
382fc223305Sopenharmony_ci *     |  type  |  vec_num  |    data1    |    data2    |    data3    | .... |
383fc223305Sopenharmony_ci *     ----------------------------------------------------------------------
384fc223305Sopenharmony_ci * len:  uint8_t   size_t     sizeof(typ)    sizeof(typ)
385fc223305Sopenharmony_ci*/
386fc223305Sopenharmony_ciint PreferencesValueParcel::MarshallingBasicArrayValue(const PreferencesValue &value, const uint8_t type,
387fc223305Sopenharmony_ci    std::vector<uint8_t> &data)
388fc223305Sopenharmony_ci{
389fc223305Sopenharmony_ci    uint8_t *startAddr = data.data();
390fc223305Sopenharmony_ci    int errCode = memcpy_s(startAddr, sizeof(uint8_t), &type, sizeof(uint8_t));
391fc223305Sopenharmony_ci    if (errCode != E_OK) {
392fc223305Sopenharmony_ci        LOG_ERROR("memcpy failed when marshalling basic array value's type, %{public}d", errCode);
393fc223305Sopenharmony_ci        return E_ERROR;
394fc223305Sopenharmony_ci    }
395fc223305Sopenharmony_ci    // write type
396fc223305Sopenharmony_ci    startAddr += sizeof(uint8_t);
397fc223305Sopenharmony_ci
398fc223305Sopenharmony_ci    switch (type) {
399fc223305Sopenharmony_ci        case UINT8_ARRAY_TYPE:
400fc223305Sopenharmony_ci            errCode = MarshallingVecUInt8AfterType(value, startAddr);
401fc223305Sopenharmony_ci            break;
402fc223305Sopenharmony_ci        case BIG_INT_TYPE:
403fc223305Sopenharmony_ci            errCode = MarshallingVecBigIntAfterType(value, startAddr);
404fc223305Sopenharmony_ci            break;
405fc223305Sopenharmony_ci        case DOUBLE_ARRAY_TYPE:
406fc223305Sopenharmony_ci            errCode = MarshallingVecDoubleAfterType(value, startAddr);
407fc223305Sopenharmony_ci            break;
408fc223305Sopenharmony_ci        case BOOL_ARRAY_TYPE:
409fc223305Sopenharmony_ci            errCode = MarshallingVecBoolAfterType(value, startAddr);
410fc223305Sopenharmony_ci            break;
411fc223305Sopenharmony_ci        default:
412fc223305Sopenharmony_ci            errCode = E_INVALID_ARGS;
413fc223305Sopenharmony_ci            break;
414fc223305Sopenharmony_ci    }
415fc223305Sopenharmony_ci    return errCode;
416fc223305Sopenharmony_ci}
417fc223305Sopenharmony_ci
418fc223305Sopenharmony_ciint PreferencesValueParcel::MarshallingPreferenceValue(const PreferencesValue &value, std::vector<uint8_t> &data)
419fc223305Sopenharmony_ci{
420fc223305Sopenharmony_ci    int errCode = E_OK;
421fc223305Sopenharmony_ci    uint8_t type = GetTypeIndex(value);
422fc223305Sopenharmony_ci    switch (type) {
423fc223305Sopenharmony_ci        case INT_TYPE:
424fc223305Sopenharmony_ci        case LONG_TYPE:
425fc223305Sopenharmony_ci        case FLOAT_TYPE:
426fc223305Sopenharmony_ci        case DOUBLE_TYPE:
427fc223305Sopenharmony_ci        case BOOL_TYPE:
428fc223305Sopenharmony_ci            errCode = MarshallingBasicValue(value, type, data);
429fc223305Sopenharmony_ci            break;
430fc223305Sopenharmony_ci        case STRING_TYPE:
431fc223305Sopenharmony_ci        case OBJECT_TYPE:
432fc223305Sopenharmony_ci            errCode = MarshallingStringValue(value, type, data);
433fc223305Sopenharmony_ci            break;
434fc223305Sopenharmony_ci        case STRING_ARRAY_TYPE:
435fc223305Sopenharmony_ci            errCode = MarshallingStringArrayValue(value, type, data);
436fc223305Sopenharmony_ci            break;
437fc223305Sopenharmony_ci        case UINT8_ARRAY_TYPE:
438fc223305Sopenharmony_ci        case BIG_INT_TYPE:
439fc223305Sopenharmony_ci        case DOUBLE_ARRAY_TYPE:
440fc223305Sopenharmony_ci        case BOOL_ARRAY_TYPE:
441fc223305Sopenharmony_ci            errCode = MarshallingBasicArrayValue(value, type, data);
442fc223305Sopenharmony_ci            break;
443fc223305Sopenharmony_ci        default:
444fc223305Sopenharmony_ci            errCode = E_INVALID_ARGS;
445fc223305Sopenharmony_ci            LOG_ERROR("MarshallingPreferenceValue failed, type invalid, %{public}d", errCode);
446fc223305Sopenharmony_ci            break;
447fc223305Sopenharmony_ci    }
448fc223305Sopenharmony_ci    return errCode;
449fc223305Sopenharmony_ci}
450fc223305Sopenharmony_ci
451fc223305Sopenharmony_cistd::pair<int, PreferencesValue> PreferencesValueParcel::UnmarshallingBasicValue(const uint8_t type,
452fc223305Sopenharmony_ci    const std::vector<uint8_t> &data)
453fc223305Sopenharmony_ci{
454fc223305Sopenharmony_ci    const uint8_t *startAddr = data.data();
455fc223305Sopenharmony_ci    switch (type) {
456fc223305Sopenharmony_ci        case INT_TYPE: {
457fc223305Sopenharmony_ci            const int intValue = *(reinterpret_cast<const int *>(startAddr + sizeof(uint8_t)));
458fc223305Sopenharmony_ci            return std::make_pair(E_OK, PreferencesValue(intValue));
459fc223305Sopenharmony_ci        }
460fc223305Sopenharmony_ci        case LONG_TYPE: {
461fc223305Sopenharmony_ci            const int64_t longValue = *(reinterpret_cast<const int64_t *>(startAddr + sizeof(uint8_t)));
462fc223305Sopenharmony_ci            return std::make_pair(E_OK, PreferencesValue(longValue));
463fc223305Sopenharmony_ci        }
464fc223305Sopenharmony_ci        case FLOAT_TYPE: {
465fc223305Sopenharmony_ci            const float floatValue = *(reinterpret_cast<const float *>(startAddr + sizeof(uint8_t)));
466fc223305Sopenharmony_ci            return std::make_pair(E_OK, PreferencesValue(floatValue));
467fc223305Sopenharmony_ci        }
468fc223305Sopenharmony_ci        case DOUBLE_TYPE: {
469fc223305Sopenharmony_ci            const double doubleValue = *(reinterpret_cast<const double *>(startAddr + sizeof(uint8_t)));
470fc223305Sopenharmony_ci            return std::make_pair(E_OK, PreferencesValue(doubleValue));
471fc223305Sopenharmony_ci        }
472fc223305Sopenharmony_ci        case BOOL_TYPE: {
473fc223305Sopenharmony_ci            const bool boolValue = *(reinterpret_cast<const bool *>(startAddr + sizeof(uint8_t)));
474fc223305Sopenharmony_ci            return std::make_pair(E_OK, PreferencesValue(boolValue));
475fc223305Sopenharmony_ci        }
476fc223305Sopenharmony_ci        default:
477fc223305Sopenharmony_ci            break;
478fc223305Sopenharmony_ci    }
479fc223305Sopenharmony_ci    return std::make_pair(E_INVALID_ARGS, PreferencesValue(0));
480fc223305Sopenharmony_ci}
481fc223305Sopenharmony_ci
482fc223305Sopenharmony_cistd::pair<int, PreferencesValue> PreferencesValueParcel::UnmarshallingStringValue(const uint8_t type,
483fc223305Sopenharmony_ci    const std::vector<uint8_t> &data)
484fc223305Sopenharmony_ci{
485fc223305Sopenharmony_ci    const uint8_t *startAddr = data.data();
486fc223305Sopenharmony_ci    std::string strValue;
487fc223305Sopenharmony_ci    size_t strLen = *(reinterpret_cast<const size_t *>(startAddr + sizeof(uint8_t)));
488fc223305Sopenharmony_ci    if (strLen == 0) {
489fc223305Sopenharmony_ci        strValue = "";
490fc223305Sopenharmony_ci    } else {
491fc223305Sopenharmony_ci        strValue.resize(strLen);
492fc223305Sopenharmony_ci        strValue.assign(startAddr + sizeof(uint8_t) + sizeof(size_t), startAddr + sizeof(uint8_t) + sizeof(size_t) +
493fc223305Sopenharmony_ci            strLen);
494fc223305Sopenharmony_ci    }
495fc223305Sopenharmony_ci
496fc223305Sopenharmony_ci    if (type == OBJECT_TYPE) {
497fc223305Sopenharmony_ci        Object obj;
498fc223305Sopenharmony_ci        obj.valueStr = strValue;
499fc223305Sopenharmony_ci        return std::make_pair(E_OK, PreferencesValue(obj));
500fc223305Sopenharmony_ci    } else if (type == STRING_TYPE) {
501fc223305Sopenharmony_ci        return std::make_pair(E_OK, PreferencesValue(strValue));
502fc223305Sopenharmony_ci    }
503fc223305Sopenharmony_ci    return std::make_pair(E_INVALID_ARGS, PreferencesValue(0));
504fc223305Sopenharmony_ci}
505fc223305Sopenharmony_ci
506fc223305Sopenharmony_cistd::pair<int, PreferencesValue> PreferencesValueParcel::UnmarshallingStringArrayValue(const uint8_t type,
507fc223305Sopenharmony_ci    const std::vector<uint8_t> &data)
508fc223305Sopenharmony_ci{
509fc223305Sopenharmony_ci    if (type != STRING_ARRAY_TYPE) {
510fc223305Sopenharmony_ci        return std::make_pair(E_INVALID_ARGS, PreferencesValue(0));
511fc223305Sopenharmony_ci    }
512fc223305Sopenharmony_ci
513fc223305Sopenharmony_ci    const uint8_t *startAddr = data.data() + sizeof(uint8_t);
514fc223305Sopenharmony_ci    size_t vecNum = *(reinterpret_cast<const size_t *>(startAddr));
515fc223305Sopenharmony_ci    startAddr += sizeof(size_t);
516fc223305Sopenharmony_ci
517fc223305Sopenharmony_ci    std::vector<std::string> strVec;
518fc223305Sopenharmony_ci    strVec.resize(vecNum);
519fc223305Sopenharmony_ci    for (size_t i = 0; i < vecNum; i++) {
520fc223305Sopenharmony_ci        size_t strLen = *(reinterpret_cast<const size_t *>(startAddr));
521fc223305Sopenharmony_ci        startAddr += sizeof(size_t);
522fc223305Sopenharmony_ci        std::string strValue;
523fc223305Sopenharmony_ci        if (strLen == 0) {
524fc223305Sopenharmony_ci            strValue = "";
525fc223305Sopenharmony_ci        } else {
526fc223305Sopenharmony_ci            strValue.resize(strLen);
527fc223305Sopenharmony_ci            strValue.assign(startAddr, startAddr + strLen);
528fc223305Sopenharmony_ci        }
529fc223305Sopenharmony_ci        strVec[i] = strValue;
530fc223305Sopenharmony_ci        startAddr += strLen;
531fc223305Sopenharmony_ci    }
532fc223305Sopenharmony_ci    return std::make_pair(E_OK, PreferencesValue(strVec));
533fc223305Sopenharmony_ci}
534fc223305Sopenharmony_ci
535fc223305Sopenharmony_cistd::pair<int, PreferencesValue> PreferencesValueParcel::UnmarshallingVecUInt8(const std::vector<uint8_t> &data)
536fc223305Sopenharmony_ci{
537fc223305Sopenharmony_ci    const uint8_t *startAddr = data.data() + sizeof(uint8_t);
538fc223305Sopenharmony_ci    size_t vecNum = *(reinterpret_cast<const size_t *>(startAddr));
539fc223305Sopenharmony_ci    startAddr += sizeof(size_t);
540fc223305Sopenharmony_ci
541fc223305Sopenharmony_ci    std::vector<uint8_t> vec;
542fc223305Sopenharmony_ci    vec.resize(vecNum);
543fc223305Sopenharmony_ci    for (size_t i = 0; i < vecNum; i++) {
544fc223305Sopenharmony_ci        uint8_t element = *(reinterpret_cast<const uint8_t *>(startAddr));
545fc223305Sopenharmony_ci        vec[i] = element;
546fc223305Sopenharmony_ci        startAddr += sizeof(uint8_t);
547fc223305Sopenharmony_ci    }
548fc223305Sopenharmony_ci    return std::make_pair(E_OK, PreferencesValue(vec));
549fc223305Sopenharmony_ci}
550fc223305Sopenharmony_ci
551fc223305Sopenharmony_cistd::pair<int, PreferencesValue> PreferencesValueParcel::UnmarshallingVecDouble(const std::vector<uint8_t> &data)
552fc223305Sopenharmony_ci{
553fc223305Sopenharmony_ci    const uint8_t *startAddr = data.data() + sizeof(uint8_t);
554fc223305Sopenharmony_ci    size_t vecNum = *(reinterpret_cast<const size_t *>(startAddr));
555fc223305Sopenharmony_ci    startAddr += sizeof(size_t);
556fc223305Sopenharmony_ci
557fc223305Sopenharmony_ci    std::vector<double> vec;
558fc223305Sopenharmony_ci    vec.resize(vecNum);
559fc223305Sopenharmony_ci    for (size_t i = 0; i < vecNum; i++) {
560fc223305Sopenharmony_ci        double element = *(reinterpret_cast<const double *>(startAddr));
561fc223305Sopenharmony_ci        vec[i] = element;
562fc223305Sopenharmony_ci        startAddr += sizeof(double);
563fc223305Sopenharmony_ci    }
564fc223305Sopenharmony_ci    return std::make_pair(E_OK, PreferencesValue(vec));
565fc223305Sopenharmony_ci}
566fc223305Sopenharmony_ci
567fc223305Sopenharmony_cistd::pair<int, PreferencesValue> PreferencesValueParcel::UnmarshallingVecBool(const std::vector<uint8_t> &data)
568fc223305Sopenharmony_ci{
569fc223305Sopenharmony_ci    const uint8_t *startAddr = data.data() + sizeof(uint8_t);
570fc223305Sopenharmony_ci    size_t vecNum = *(reinterpret_cast<const size_t *>(startAddr));
571fc223305Sopenharmony_ci    startAddr += sizeof(size_t);
572fc223305Sopenharmony_ci
573fc223305Sopenharmony_ci    std::vector<bool> vec;
574fc223305Sopenharmony_ci    vec.resize(vecNum);
575fc223305Sopenharmony_ci    for (size_t i = 0; i < vecNum; i++) {
576fc223305Sopenharmony_ci        bool element = *(reinterpret_cast<const bool *>(startAddr));
577fc223305Sopenharmony_ci        vec[i] = element;
578fc223305Sopenharmony_ci        startAddr += sizeof(bool);
579fc223305Sopenharmony_ci    }
580fc223305Sopenharmony_ci    return std::make_pair(E_OK, PreferencesValue(vec));
581fc223305Sopenharmony_ci}
582fc223305Sopenharmony_ci
583fc223305Sopenharmony_cistd::pair<int, PreferencesValue> PreferencesValueParcel::UnmarshallingVecBigInt(const std::vector<uint8_t> &data)
584fc223305Sopenharmony_ci{
585fc223305Sopenharmony_ci    const uint8_t *startAddr = data.data() + sizeof(uint8_t);
586fc223305Sopenharmony_ci    size_t vecNum = *(reinterpret_cast<const size_t *>(startAddr));
587fc223305Sopenharmony_ci    startAddr += sizeof(size_t);
588fc223305Sopenharmony_ci
589fc223305Sopenharmony_ci    int64_t sign = *(reinterpret_cast<const int64_t *>(startAddr));
590fc223305Sopenharmony_ci    startAddr += sizeof(int64_t);
591fc223305Sopenharmony_ci
592fc223305Sopenharmony_ci    std::vector<uint64_t> vec;
593fc223305Sopenharmony_ci    vec.resize(vecNum);
594fc223305Sopenharmony_ci    for (size_t i = 0; i < vecNum; i++) {
595fc223305Sopenharmony_ci        uint64_t element = *(reinterpret_cast<const uint64_t *>(startAddr));
596fc223305Sopenharmony_ci        vec[i] = element;
597fc223305Sopenharmony_ci        startAddr += sizeof(uint64_t);
598fc223305Sopenharmony_ci    }
599fc223305Sopenharmony_ci    BigInt bigIntValue = BigInt(vec, sign);
600fc223305Sopenharmony_ci    return std::make_pair(E_OK, PreferencesValue(bigIntValue));
601fc223305Sopenharmony_ci}
602fc223305Sopenharmony_ci
603fc223305Sopenharmony_cistd::pair<int, PreferencesValue> PreferencesValueParcel::UnmarshallingBasicArrayValue(const uint8_t type,
604fc223305Sopenharmony_ci    const std::vector<uint8_t> &data)
605fc223305Sopenharmony_ci{
606fc223305Sopenharmony_ci    switch (type) {
607fc223305Sopenharmony_ci        case UINT8_ARRAY_TYPE:
608fc223305Sopenharmony_ci            return UnmarshallingVecUInt8(data);
609fc223305Sopenharmony_ci            break;
610fc223305Sopenharmony_ci        case BIG_INT_TYPE:
611fc223305Sopenharmony_ci            return UnmarshallingVecBigInt(data);
612fc223305Sopenharmony_ci            break;
613fc223305Sopenharmony_ci        case DOUBLE_ARRAY_TYPE:
614fc223305Sopenharmony_ci            return UnmarshallingVecDouble(data);
615fc223305Sopenharmony_ci            break;
616fc223305Sopenharmony_ci        case BOOL_ARRAY_TYPE:
617fc223305Sopenharmony_ci            return UnmarshallingVecBool(data);
618fc223305Sopenharmony_ci            break;
619fc223305Sopenharmony_ci        default:
620fc223305Sopenharmony_ci            break;
621fc223305Sopenharmony_ci    }
622fc223305Sopenharmony_ci    return std::make_pair(E_INVALID_ARGS, PreferencesValue(0));
623fc223305Sopenharmony_ci}
624fc223305Sopenharmony_ci
625fc223305Sopenharmony_cistd::pair<int, PreferencesValue> PreferencesValueParcel::UnmarshallingPreferenceValue(const std::vector<uint8_t> &data)
626fc223305Sopenharmony_ci{
627fc223305Sopenharmony_ci    PreferencesValue value(0);
628fc223305Sopenharmony_ci    if (data.empty()) {
629fc223305Sopenharmony_ci        LOG_ERROR("UnmarshallingPreferenceValue failed, data empty, %{public}d", E_INVALID_ARGS);
630fc223305Sopenharmony_ci        return std::make_pair(E_INVALID_ARGS, value);
631fc223305Sopenharmony_ci    }
632fc223305Sopenharmony_ci    uint8_t type = data[0];
633fc223305Sopenharmony_ci
634fc223305Sopenharmony_ci    switch (type) {
635fc223305Sopenharmony_ci        case INT_TYPE:
636fc223305Sopenharmony_ci        case LONG_TYPE:
637fc223305Sopenharmony_ci        case FLOAT_TYPE:
638fc223305Sopenharmony_ci        case DOUBLE_TYPE:
639fc223305Sopenharmony_ci        case BOOL_TYPE:
640fc223305Sopenharmony_ci            return UnmarshallingBasicValue(type, data);
641fc223305Sopenharmony_ci        case OBJECT_TYPE:
642fc223305Sopenharmony_ci        case STRING_TYPE:
643fc223305Sopenharmony_ci            return UnmarshallingStringValue(type, data);
644fc223305Sopenharmony_ci        case STRING_ARRAY_TYPE:
645fc223305Sopenharmony_ci            return UnmarshallingStringArrayValue(type, data);
646fc223305Sopenharmony_ci        case UINT8_ARRAY_TYPE:
647fc223305Sopenharmony_ci        case BIG_INT_TYPE:
648fc223305Sopenharmony_ci        case DOUBLE_ARRAY_TYPE:
649fc223305Sopenharmony_ci        case BOOL_ARRAY_TYPE:
650fc223305Sopenharmony_ci            return UnmarshallingBasicArrayValue(type, data);
651fc223305Sopenharmony_ci        default:
652fc223305Sopenharmony_ci            break;
653fc223305Sopenharmony_ci    }
654fc223305Sopenharmony_ci
655fc223305Sopenharmony_ci    return std::make_pair(E_INVALID_ARGS, value);
656fc223305Sopenharmony_ci}
657fc223305Sopenharmony_ci} // namespace NativePreferences
658fc223305Sopenharmony_ci} // namespace OHOS