/* * Copyright (c) 2022 Huawei Device Co., Ltd. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef OHOS_JS_UTIL_H #define OHOS_JS_UTIL_H #include #include #include #include "data_query.h" #include "js_kv_manager.h" #include "change_notification.h" #include "napi/native_api.h" #include "napi/native_common.h" #include "napi/native_node_api.h" #include "datashare_abs_predicates.h" #include "datashare_values_bucket.h" namespace OHOS::DistributedData { class JSUtil final { public: enum { /* Blob's first byte is the blob's data ValueType */ STRING = 0, INTEGER = 1, FLOAT = 2, BYTE_ARRAY = 3, BOOLEAN = 4, DOUBLE = 5, INVALID = 255 }; using JsSchema = class JsSchema; using Blob = OHOS::DistributedKv::Blob; using ChangeNotification = OHOS::DistributedKv::ChangeNotification; using Options = OHOS::DistributedKv::Options; using Entry = OHOS::DistributedKv::Entry; using StoreId = OHOS::DistributedKv::StoreId; using Status = OHOS::DistributedKv::Status; using DataQuery = OHOS::DistributedKv::DataQuery; using UserInfo = OHOS::DistributedKv::UserInfo; using ValueObject = OHOS::DataShare::DataShareValueObject; /* for kvStore Put/Get : boolean|string|number|Uint8Array */ using KvStoreVariant = std::variant, bool, double>; static KvStoreVariant Blob2VariantValue(const Blob& blob); static Blob VariantValue2Blob(const KvStoreVariant& value); /* for query value related : number|string|boolean */ using QueryVariant = std::variant; static napi_status GetValue(napi_env env, napi_value in, napi_value& out); static napi_status SetValue(napi_env env, napi_value in, napi_value& out); /* napi_value <-> bool */ static napi_status GetValue(napi_env env, napi_value in, bool& out); static napi_status SetValue(napi_env env, const bool& in, napi_value& out); /* napi_value <-> int32_t */ static napi_status GetValue(napi_env env, napi_value in, int32_t& out); static napi_status SetValue(napi_env env, const int32_t& in, napi_value& out); /* napi_value <-> uint32_t */ static napi_status GetValue(napi_env env, napi_value in, uint32_t& out); static napi_status SetValue(napi_env env, const uint32_t& in, napi_value& out); /* napi_value <-> int64_t */ static napi_status GetValue(napi_env env, napi_value in, int64_t& out); static napi_status SetValue(napi_env env, const int64_t& in, napi_value& out); /* napi_value <-> double */ static napi_status GetValue(napi_env env, napi_value in, double& out); static napi_status SetValue(napi_env env, const double& in, napi_value& out); /* napi_value <-> std::string */ static napi_status GetValue(napi_env env, napi_value in, std::string& out); static napi_status SetValue(napi_env env, const std::string& in, napi_value& out); /* napi_value <-> KvStoreVariant */ static napi_status GetValue(napi_env env, napi_value in, KvStoreVariant& out); static napi_status SetValue(napi_env env, const KvStoreVariant& in, napi_value& out); /* napi_value <-> QueryVariant */ static napi_status GetValue(napi_env env, napi_value in, QueryVariant& out); static napi_status SetValue(napi_env env, const QueryVariant& in, napi_value& out); /* napi_value <-> std::vector */ static napi_status GetValue(napi_env env, napi_value in, std::vector& out, bool checkLength = true); static napi_status SetValue(napi_env env, const std::vector& in, napi_value& out); /* napi_value <-> std::vector */ static napi_status GetValue(napi_env env, napi_value in, std::vector& out); static napi_status SetValue(napi_env env, const std::vector& in, napi_value& out); /* napi_value <-> std::vector */ static napi_status GetValue(napi_env env, napi_value in, std::vector& out); static napi_status SetValue(napi_env env, const std::vector& in, napi_value& out); /* napi_value <-> std::vector */ static napi_status GetValue(napi_env env, napi_value in, std::vector& out); static napi_status SetValue(napi_env env, const std::vector& in, napi_value& out); /* napi_value <-> std::vector */ static napi_status GetValue(napi_env env, napi_value in, std::vector& out); static napi_status SetValue(napi_env env, const std::vector& in, napi_value& out); /* napi_value <-> std::vector */ static napi_status GetValue(napi_env env, napi_value in, std::vector& out); static napi_status SetValue(napi_env env, const std::vector& in, napi_value& out); /* napi_value <-> ChangeNotification */ static napi_status GetValue(napi_env env, napi_value in, ChangeNotification& out, bool hasSchema); static napi_status SetValue(napi_env env, const ChangeNotification& in, napi_value& out, bool hasSchema); /* napi_value <-> Options */ static napi_status GetValue(napi_env env, napi_value in, Options& out); static napi_status SetValue(napi_env env, const Options& in, napi_value& out); /* napi_value <-> UserInfo */ static napi_status GetValue(napi_env env, napi_value in, UserInfo& out); /* napi_value <-> Entry */ static napi_status GetValue(napi_env env, napi_value in, Entry& out, bool hasSchema); static napi_status SetValue(napi_env env, const Entry& in, napi_value& out, bool hasSchema); /* napi_value <-> Options */ static napi_status GetValue(napi_env env, napi_value in, std::list& out, bool hasSchema); static napi_status SetValue(napi_env env, const std::list& in, napi_value& out, bool hasSchema); /* napi_value <-> std::vector */ static napi_status GetValue(napi_env env, napi_value in, std::vector& out, bool hasSchema); static napi_status SetValue(napi_env env, const std::vector& in, napi_value& out, bool hasSchema); /* napi_value <-> std::vector */ static napi_status GetValue(napi_env env, napi_value in, std::vector& out); static napi_status SetValue(napi_env env, const std::vector& in, napi_value& out); /* napi_value <-> std::map */ static napi_status GetValue(napi_env env, napi_value in, std::map& out); static napi_status SetValue(napi_env env, const std::map& in, napi_value& out); static napi_status GetValue(napi_env env, napi_value in, JsSchema*& out); static napi_status GetValue(napi_env env, napi_value in, DataQuery &out); static napi_status GetValue(napi_env env, napi_value jsValue, ValueObject::Type &valueObject); static napi_status GetValue(napi_env env, napi_value in, ContextParam ¶m); static napi_status GetCurrentAbilityParam(napi_env env, ContextParam ¶m); /* napi_get_named_property wrapper */ template static inline napi_status GetNamedProperty( napi_env env, napi_value in, const std::string& prop, T& value, bool optional = false) { auto [status, jsValue] = GetInnerValue(env, in, prop, optional); return (jsValue == nullptr) ? status : GetValue(env, jsValue, value); }; /* napi_define_class wrapper */ static napi_value DefineClass(napi_env env, const std::string& name, const napi_property_descriptor* properties, size_t count, napi_callback newcb); /* napi_new_instance wrapper */ static napi_ref NewWithRef(napi_env env, size_t argc, napi_value* argv, void** out, napi_value constructor); /* napi_unwrap with napi_instanceof */ static napi_status Unwrap(napi_env env, napi_value in, void** out, napi_value constructor); static bool Equals(napi_env env, napi_value value, napi_ref copy); static bool IsNull(napi_env env, napi_value value); private: enum { /* std::map to js::tuple */ TUPLE_KEY = 0, TUPLE_VALUE, TUPLE_SIZE }; static std::pair GetInnerValue( napi_env env, napi_value in, const std::string& prop, bool optional); }; } // namespace OHOS::DistributedData #endif // OHOS_JS_UTIL_H