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 UserInfo = OHOS::DistributedKv::UserInfo;
51     using ValueObject = OHOS::DataShare::DataShareValueObject;
52     /* for kvStore Put/Get : boolean|string|number|Uint8Array */
53     using KvStoreVariant = std::variant<std::string, int32_t, float, std::vector<uint8_t>, bool, double>;
54     static KvStoreVariant Blob2VariantValue(const Blob& blob);
55     static Blob VariantValue2Blob(const KvStoreVariant& value);
56 
57     /* for query value related : number|string|boolean */
58     using QueryVariant = std::variant<std::string, bool, double>;
59 
60     static napi_status GetValue(napi_env env, napi_value in, napi_value& out);
61     static napi_status SetValue(napi_env env, napi_value in, napi_value& out);
62     /* napi_value <-> bool */
63     static napi_status GetValue(napi_env env, napi_value in, bool& out);
64     static napi_status SetValue(napi_env env, const bool& in, napi_value& out);
65 
66     /* napi_value <-> int32_t */
67     static napi_status GetValue(napi_env env, napi_value in, int32_t& out);
68     static napi_status SetValue(napi_env env, const int32_t& in, napi_value& out);
69 
70     /* napi_value <-> uint32_t */
71     static napi_status GetValue(napi_env env, napi_value in, uint32_t& out);
72     static napi_status SetValue(napi_env env, const uint32_t& in, napi_value& out);
73 
74     /* napi_value <-> int64_t */
75     static napi_status GetValue(napi_env env, napi_value in, int64_t& out);
76     static napi_status SetValue(napi_env env, const int64_t& in, napi_value& out);
77 
78     /* napi_value <-> double */
79     static napi_status GetValue(napi_env env, napi_value in, double& out);
80     static napi_status SetValue(napi_env env, const double& in, napi_value& out);
81 
82     /* napi_value <-> std::string */
83     static napi_status GetValue(napi_env env, napi_value in, std::string& out);
84     static napi_status SetValue(napi_env env, const std::string& in, napi_value& out);
85 
86     /* napi_value <-> KvStoreVariant */
87     static napi_status GetValue(napi_env env, napi_value in, KvStoreVariant& out);
88     static napi_status SetValue(napi_env env, const KvStoreVariant& in, napi_value& out);
89 
90     /* napi_value <-> QueryVariant */
91     static napi_status GetValue(napi_env env, napi_value in, QueryVariant& out);
92     static napi_status SetValue(napi_env env, const QueryVariant& in, napi_value& out);
93 
94     /* napi_value <-> std::vector<std::string> */
95     static napi_status GetValue(napi_env env, napi_value in, std::vector<std::string>& out, bool checkLength = true);
96     static napi_status SetValue(napi_env env, const std::vector<std::string>& in, napi_value& out);
97 
98     /* napi_value <-> std::vector<uint8_t> */
99     static napi_status GetValue(napi_env env, napi_value in, std::vector<uint8_t>& out);
100     static napi_status SetValue(napi_env env, const std::vector<uint8_t>& in, napi_value& out);
101 
102     /* napi_value <-> std::vector<int32_t> */
103     static napi_status GetValue(napi_env env, napi_value in, std::vector<int32_t>& out);
104     static napi_status SetValue(napi_env env, const std::vector<int32_t>& in, napi_value& out);
105 
106     /* napi_value <-> std::vector<uint32_t> */
107     static napi_status GetValue(napi_env env, napi_value in, std::vector<uint32_t>& out);
108     static napi_status SetValue(napi_env env, const std::vector<uint32_t>& in, napi_value& out);
109 
110     /* napi_value <-> std::vector<int64_t> */
111     static napi_status GetValue(napi_env env, napi_value in, std::vector<int64_t>& out);
112     static napi_status SetValue(napi_env env, const std::vector<int64_t>& in, napi_value& out);
113 
114     /* napi_value <-> std::vector<double> */
115     static napi_status GetValue(napi_env env, napi_value in, std::vector<double>& out);
116     static napi_status SetValue(napi_env env, const std::vector<double>& in, napi_value& out);
117 
118     /* napi_value <-> ChangeNotification */
119     static napi_status GetValue(napi_env env, napi_value in, ChangeNotification& out, bool hasSchema);
120     static napi_status SetValue(napi_env env, const ChangeNotification& in, napi_value& out, bool hasSchema);
121 
122     /* napi_value <-> Options */
123     static napi_status GetValue(napi_env env, napi_value in, Options& out);
124     static napi_status SetValue(napi_env env, const Options& in, napi_value& out);
125 
126     /* napi_value <-> UserInfo */
127     static napi_status GetValue(napi_env env, napi_value in, UserInfo& out);
128 
129     /* napi_value <-> Entry */
130     static napi_status GetValue(napi_env env, napi_value in, Entry& out, bool hasSchema);
131     static napi_status SetValue(napi_env env, const Entry& in, napi_value& out, bool hasSchema);
132 
133     /* napi_value <-> Options */
134     static napi_status GetValue(napi_env env, napi_value in, std::list<Entry>& out, bool hasSchema);
135     static napi_status SetValue(napi_env env, const std::list<Entry>& in, napi_value& out, bool hasSchema);
136 
137     /* napi_value <-> std::vector<Entry> */
138     static napi_status GetValue(napi_env env, napi_value in, std::vector<Entry>& out, bool hasSchema);
139     static napi_status SetValue(napi_env env, const std::vector<Entry>& in, napi_value& out, bool hasSchema);
140 
141     /* napi_value <-> std::vector<StoreId> */
142     static napi_status GetValue(napi_env env, napi_value in, std::vector<StoreId>& out);
143     static napi_status SetValue(napi_env env, const std::vector<StoreId>& in, napi_value& out);
144 
145     /* napi_value <-> std::map<std::string, Status> */
146     static napi_status GetValue(napi_env env, napi_value in, std::map<std::string, Status>& out);
147     static napi_status SetValue(napi_env env, const std::map<std::string, Status>& in, napi_value& out);
148 
149     static napi_status GetValue(napi_env env, napi_value in, JsSchema*& out);
150 
151     static napi_status GetValue(napi_env env, napi_value in, DataQuery &out);
152 
153     static napi_status GetValue(napi_env env, napi_value jsValue, ValueObject::Type &valueObject);
154 
155     static napi_status GetValue(napi_env env, napi_value in, ContextParam &param);
156 
157     static napi_status GetCurrentAbilityParam(napi_env env, ContextParam &param);
158     /* napi_get_named_property wrapper */
159     template <typename T>
160     static inline napi_status GetNamedProperty(
161         napi_env env, napi_value in, const std::string& prop, T& value, bool optional = false)
162     {
163         auto [status, jsValue] = GetInnerValue(env, in, prop, optional);
164         return (jsValue == nullptr) ? status : GetValue(env, jsValue, value);
165     };
166 
167     /* napi_define_class  wrapper */
168     static napi_value DefineClass(napi_env env, const std::string& name,
169         const napi_property_descriptor* properties, size_t count, napi_callback newcb);
170 
171     /* napi_new_instance  wrapper */
172     static napi_ref NewWithRef(napi_env env, size_t argc, napi_value* argv, void** out, napi_value constructor);
173 
174     /* napi_unwrap with napi_instanceof */
175     static napi_status Unwrap(napi_env env, napi_value in, void** out, napi_value constructor);
176 
177     static bool Equals(napi_env env, napi_value value, napi_ref copy);
178 
179     static bool IsNull(napi_env env, napi_value value);
180 
181 private:
182     enum {
183         /* std::map<key, value> to js::tuple<key, value> */
184         TUPLE_KEY = 0,
185         TUPLE_VALUE,
186         TUPLE_SIZE
187     };
188     static std::pair<napi_status, napi_value> GetInnerValue(
189         napi_env env, napi_value in, const std::string& prop, bool optional);
190 };
191 } // namespace OHOS::DistributedData
192 #endif // OHOS_JS_UTIL_H
193