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