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 ¶m); 156 157 static napi_status GetCurrentAbilityParam(napi_env env, ContextParam ¶m); 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