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 */
15
16 #include "napi_datashare_values_bucket.h"
17
18 #include "datashare_log.h"
19 #include "datashare_js_utils.h"
20 #include "datashare_value_object.h"
21
22 #include "securec.h"
23
24 namespace OHOS {
25 namespace DataShare {
DataShareValueBucketNewInstance(napi_env env,DataShareValuesBucket & valuesBucket)26 napi_value DataShareValueBucketNewInstance(napi_env env, DataShareValuesBucket &valuesBucket)
27 {
28 napi_value ret;
29 NAPI_CALL(env, napi_create_object(env, &ret));
30 std::map<std::string, DataShareValueObject> valuesMap = valuesBucket.valuesMap;
31 std::map<std::string, DataShareValueObject>::iterator it;
32 for (it = valuesMap.begin(); it != valuesMap.end(); ++it) {
33 std::string key = it->first;
34 auto valueObject = it->second;
35 napi_value value = nullptr;
36 switch (valueObject.GetType()) {
37 case DataShareValueObjectType::TYPE_NULL: {
38 value = nullptr;
39 } break;
40 case DataShareValueObjectType::TYPE_INT: {
41 int64_t intVal = valueObject;
42 value = DataShareJSUtils::Convert2JSValue(env, intVal);
43 } break;
44 case DataShareValueObjectType::TYPE_DOUBLE: {
45 double doubleVal = valueObject;
46 value = DataShareJSUtils::Convert2JSValue(env, doubleVal);
47 } break;
48 case DataShareValueObjectType::TYPE_BLOB: {
49 std::vector<uint8_t> blobVal = valueObject;
50 value = DataShareJSUtils::Convert2JSValue(env, blobVal);
51 } break;
52 case DataShareValueObjectType::TYPE_BOOL: {
53 bool boolVal = valueObject;
54 value = DataShareJSUtils::Convert2JSValue(env, boolVal);
55 } break;
56 default: {
57 std::string strVal = valueObject;
58 value = DataShareJSUtils::Convert2JSValue(env, strVal);
59 } break;
60 }
61 NAPI_CALL(env, napi_set_named_property(env, ret, key.c_str(), value));
62 }
63
64 return ret;
65 }
66
SetValuesBucketObject(DataShareValuesBucket & valuesBucket,const napi_env & env,std::string keyStr,napi_value value)67 bool SetValuesBucketObject(
68 DataShareValuesBucket &valuesBucket, const napi_env &env, std::string keyStr, napi_value value)
69 {
70 napi_valuetype valueType = napi_undefined;
71 napi_typeof(env, value, &valueType);
72 if (valueType == napi_string) {
73 LOG_DEBUG("ValueObject is string");
74 std::string valueString = DataShareJSUtils::UnwrapStringFromJS(env, value);
75 valuesBucket.Put(keyStr, valueString);
76 } else if (valueType == napi_number) {
77 LOG_DEBUG("ValueObject is number");
78 double valueNumber = 0;
79 napi_get_value_double(env, value, &valueNumber);
80 valuesBucket.Put(keyStr, valueNumber);
81 } else if (valueType == napi_boolean) {
82 LOG_DEBUG("ValueObject is boolean");
83 bool valueBool = false;
84 napi_get_value_bool(env, value, &valueBool);
85 valuesBucket.Put(keyStr, valueBool);
86 } else if (valueType == napi_null) {
87 LOG_DEBUG("ValueObject is null");
88 valuesBucket.Put(keyStr);
89 } else if (valueType == napi_object) {
90 LOG_DEBUG("ValueObject is Uint8Array");
91 valuesBucket.Put(keyStr, DataShareJSUtils::Convert2U8Vector(env, value));
92 } else {
93 LOG_ERROR("valuesBucket error");
94 return false;
95 }
96 return true;
97 }
98
AnalysisValuesBucket(DataShareValuesBucket & valuesBucket,const napi_env & env,const napi_value & arg)99 bool AnalysisValuesBucket(DataShareValuesBucket &valuesBucket, const napi_env &env, const napi_value &arg)
100 {
101 napi_value keys = 0;
102 napi_get_property_names(env, arg, &keys);
103 uint32_t arrLen = 0;
104 napi_status status = napi_get_array_length(env, keys, &arrLen);
105 if (status != napi_ok) {
106 LOG_ERROR("ValuesBucket err");
107 return false;
108 }
109 LOG_DEBUG("ValuesBucket num : %{public}u", arrLen);
110 for (size_t i = 0; i < arrLen; ++i) {
111 napi_value key = 0;
112 status = napi_get_element(env, keys, i, &key);
113 std::string keyStr = DataShareJSUtils::UnwrapStringFromJS(env, key);
114 napi_value value = 0;
115 napi_get_property(env, arg, key, &value);
116
117 if (!SetValuesBucketObject(valuesBucket, env, keyStr, value)) {
118 return false;
119 }
120 }
121 return true;
122 }
123
GetValueBucketObject(DataShareValuesBucket & valuesBucket,const napi_env & env,const napi_value & arg)124 bool GetValueBucketObject(DataShareValuesBucket &valuesBucket, const napi_env &env, const napi_value &arg)
125 {
126 return AnalysisValuesBucket(valuesBucket, env, arg);
127 }
128 } // namespace DataShare
129 } // namespace OHOS