• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 #ifndef OHOS_JS_UTIL_H
16 #define OHOS_JS_UTIL_H
17 #include <cstdint>
18 #include <map>
19 #include <variant>
20 #include "data_query.h"
21 #include "js_kv_manager.h"
22 #include "change_notification.h"
23 #include "napi/native_api.h"
24 #include "napi/native_common.h"
25 #include "napi/native_node_api.h"
26 #include "datashare_abs_predicates.h"
27 #include "datashare_values_bucket.h"
28 
29 namespace OHOS::DistributedData {
30 class JSUtil final {
31 public:
32     enum {
33         /* Blob's first byte is the blob's data ValueType */
34         STRING = 0,
35         INTEGER = 1,
36         FLOAT = 2,
37         BYTE_ARRAY = 3,
38         BOOLEAN = 4,
39         DOUBLE = 5,
40         INVALID = 255
41     };
42     using JsSchema = class JsSchema;
43     using Blob = OHOS::DistributedKv::Blob;
44     using ChangeNotification = OHOS::DistributedKv::ChangeNotification;
45     using Options = OHOS::DistributedKv::Options;
46     using Entry = OHOS::DistributedKv::Entry;
47     using StoreId = OHOS::DistributedKv::StoreId;
48     using Status = OHOS::DistributedKv::Status;
49     using DataQuery = OHOS::DistributedKv::DataQuery;
50     using ValueObject = OHOS::DataShare::DataShareValueObject;
51     /* for kvStore Put/Get : boolean|string|number|Uint8Array */
52     using KvStoreVariant = std::variant<std::string, int32_t, float, std::vector<uint8_t>, bool, double>;
53     static KvStoreVariant Blob2VariantValue(const Blob& blob);
54     static Blob VariantValue2Blob(const KvStoreVariant& value);
55 
56     /* for query value related : number|string|boolean */
57     using QueryVariant = std::variant<std::string, bool, double>;
58 
59     static napi_status GetValue(napi_env env, napi_value in, napi_value& out);
60     static napi_status SetValue(napi_env env, napi_value in, napi_value& out);
61     /* napi_value <-> bool */
62     static napi_status GetValue(napi_env env, napi_value in, bool& out);
63     static napi_status SetValue(napi_env env, const bool& in, napi_value& out);
64 
65     /* napi_value <-> int32_t */
66     static napi_status GetValue(napi_env env, napi_value in, int32_t& out);
67     static napi_status SetValue(napi_env env, const int32_t& in, napi_value& out);
68 
69     /* napi_value <-> uint32_t */
70     static napi_status GetValue(napi_env env, napi_value in, uint32_t& out);
71     static napi_status SetValue(napi_env env, const uint32_t& in, napi_value& out);
72 
73     /* napi_value <-> int64_t */
74     static napi_status GetValue(napi_env env, napi_value in, int64_t& out);
75     static napi_status SetValue(napi_env env, const int64_t& in, napi_value& out);
76 
77     /* napi_value <-> double */
78     static napi_status GetValue(napi_env env, napi_value in, double& out);
79     static napi_status SetValue(napi_env env, const double& in, napi_value& out);
80 
81     /* napi_value <-> std::string */
82     static napi_status GetValue(napi_env env, napi_value in, std::string& out);
83     static napi_status SetValue(napi_env env, const std::string& in, napi_value& out);
84 
85     /* napi_value <-> KvStoreVariant */
86     static napi_status GetValue(napi_env env, napi_value in, KvStoreVariant& out);
87     static napi_status SetValue(napi_env env, const KvStoreVariant& in, napi_value& out);
88 
89     /* napi_value <-> QueryVariant */
90     static napi_status GetValue(napi_env env, napi_value in, QueryVariant& out);
91     static napi_status SetValue(napi_env env, const QueryVariant& in, napi_value& out);
92 
93     /* napi_value <-> std::vector<std::string> */
94     static napi_status GetValue(napi_env env, napi_value in, std::vector<std::string>& out);
95     static napi_status SetValue(napi_env env, const std::vector<std::string>& in, napi_value& out);
96 
97     /* napi_value <-> std::vector<uint8_t> */
98     static napi_status GetValue(napi_env env, napi_value in, std::vector<uint8_t>& out);
99     static napi_status SetValue(napi_env env, const std::vector<uint8_t>& in, napi_value& out);
100 
101     /* napi_value <-> std::vector<int32_t> */
102     static napi_status GetValue(napi_env env, napi_value in, std::vector<int32_t>& out);
103     static napi_status SetValue(napi_env env, const std::vector<int32_t>& in, napi_value& out);
104 
105     /* napi_value <-> std::vector<uint32_t> */
106     static napi_status GetValue(napi_env env, napi_value in, std::vector<uint32_t>& out);
107     static napi_status SetValue(napi_env env, const std::vector<uint32_t>& in, napi_value& out);
108 
109     /* napi_value <-> std::vector<int64_t> */
110     static napi_status GetValue(napi_env env, napi_value in, std::vector<int64_t>& out);
111     static napi_status SetValue(napi_env env, const std::vector<int64_t>& in, napi_value& out);
112 
113     /* napi_value <-> std::vector<double> */
114     static napi_status GetValue(napi_env env, napi_value in, std::vector<double>& out);
115     static napi_status SetValue(napi_env env, const std::vector<double>& in, napi_value& out);
116 
117     /* napi_value <-> ChangeNotification */
118     static napi_status GetValue(napi_env env, napi_value in, ChangeNotification& out, bool hasSchema);
119     static napi_status SetValue(napi_env env, const ChangeNotification& in, napi_value& out, bool hasSchema);
120 
121     /* napi_value <-> Options */
122     static napi_status GetValue(napi_env env, napi_value in, Options& out);
123     static napi_status SetValue(napi_env env, const Options& in, napi_value& out);
124 
125     /* napi_value <-> Entry */
126     static napi_status GetValue(napi_env env, napi_value in, Entry& out, bool hasSchema);
127     static napi_status SetValue(napi_env env, const Entry& in, napi_value& out, bool hasSchema);
128 
129     /* napi_value <-> Options */
130     static napi_status GetValue(napi_env env, napi_value in, std::list<Entry>& out, bool hasSchema);
131     static napi_status SetValue(napi_env env, const std::list<Entry>& in, napi_value& out, bool hasSchema);
132 
133     /* napi_value <-> std::vector<Entry> */
134     static napi_status GetValue(napi_env env, napi_value in, std::vector<Entry>& out, bool hasSchema);
135     static napi_status SetValue(napi_env env, const std::vector<Entry>& in, napi_value& out, bool hasSchema);
136 
137     /* napi_value <-> std::vector<StoreId> */
138     static napi_status GetValue(napi_env env, napi_value in, std::vector<StoreId>& out);
139     static napi_status SetValue(napi_env env, const std::vector<StoreId>& in, napi_value& out);
140 
141     /* napi_value <-> std::map<std::string, Status> */
142     static napi_status GetValue(napi_env env, napi_value in, std::map<std::string, Status>& out);
143     static napi_status SetValue(napi_env env, const std::map<std::string, Status>& in, napi_value& out);
144 
145     static napi_status GetValue(napi_env env, napi_value in, JsSchema*& out);
146 
147     static napi_status GetValue(napi_env env, napi_value in, DataQuery &out);
148 
149     static napi_status GetValue(napi_env env, napi_value jsValue, ValueObject &valueObject);
150 
151     static napi_status GetValue(napi_env env, napi_value in, ContextParam &param);
152 
153     static napi_status GetCurrentAbilityParam(napi_env env, ContextParam &param);
154     /* napi_get_named_property wrapper */
155     template <typename T>
GetNamedProperty(napi_env env,napi_value in,const std::string & prop,T & value)156     static inline napi_status GetNamedProperty(napi_env env, napi_value in, const std::string& prop, T& value)
157     {
158         bool hasProp = false;
159         napi_status status = napi_has_named_property(env, in, prop.c_str(), &hasProp);
160         if ((status == napi_ok) && hasProp) {
161             napi_value inner = nullptr;
162             status = napi_get_named_property(env, in, prop.c_str(), &inner);
163             if ((status == napi_ok) && (inner != nullptr)) {
164                 return GetValue(env, inner, value);
165             }
166         }
167         return napi_invalid_arg;
168     };
169 
170     /* napi_define_class  wrapper */
171     static napi_value DefineClass(napi_env env, const std::string& name,
172         const napi_property_descriptor* properties, size_t count, napi_callback newcb);
173 
174     /* napi_new_instance  wrapper */
175     static napi_ref NewWithRef(napi_env env, size_t argc, napi_value* argv, void** out, napi_value constructor);
176 
177     /* napi_unwrap with napi_instanceof */
178     static napi_status Unwrap(napi_env env, napi_value in, void** out, napi_value constructor);
179 
180     static bool Equals(napi_env env, napi_value value, napi_ref copy);
181 
182 private:
183     enum {
184         /* std::map<key, value> to js::tuple<key, value> */
185         TUPLE_KEY = 0,
186         TUPLE_VALUE,
187         TUPLE_SIZE
188     };
189 };
190 } // namespace OHOS::DistributedData
191 #endif // OHOS_JS_UTIL_H
192