1 /*
2  * Copyright (c) 2024 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 "tone_haptics_settings_napi.h"
17 #include "media_log.h"
18 
19 using namespace std;
20 
21 namespace {
22 constexpr OHOS::HiviewDFX::HiLogLabel LABEL = {LOG_CORE, LOG_DOMAIN_AUDIO_NAPI, "ToneHapticsSettingsNapi"};
23 }
24 
25 namespace OHOS {
26 namespace Media {
27 thread_local napi_ref ToneHapticsSettingsNapi::sConstructor_ = nullptr;
28 
ToneHapticsSettingsNapi()29 ToneHapticsSettingsNapi::ToneHapticsSettingsNapi() : env_(nullptr) {}
30 
31 ToneHapticsSettingsNapi::~ToneHapticsSettingsNapi() = default;
32 
Init(napi_env env,napi_value exports)33 napi_value ToneHapticsSettingsNapi::Init(napi_env env, napi_value exports)
34 {
35     napi_status status;
36     napi_value constructor;
37     napi_value result = nullptr;
38     napi_get_undefined(env, &result);
39 
40     napi_property_descriptor tone_haptics_settings_properties[] = {
41         DECLARE_NAPI_GETTER_SETTER("mode", GetMode, SetMode),
42         DECLARE_NAPI_GETTER_SETTER("hapticsUri", GetHapticsUri, SetHapticsUri)
43     };
44 
45     status = napi_define_class(env, TONE_HAPTICS_SETTINGS_NAPI_CLASS_NAME.c_str(), NAPI_AUTO_LENGTH, Construct,
46         nullptr, sizeof(tone_haptics_settings_properties) / sizeof(tone_haptics_settings_properties[0]),
47         tone_haptics_settings_properties, &constructor);
48     if (status != napi_ok) {
49         return result;
50     }
51 
52     status = napi_create_reference(env, constructor, 1, &sConstructor_);
53     if (status == napi_ok) {
54         status = napi_set_named_property(env, exports, TONE_HAPTICS_SETTINGS_NAPI_CLASS_NAME.c_str(), constructor);
55         if (status == napi_ok) {
56             return exports;
57         }
58     }
59 
60     MEDIA_LOGE("Failure in ToneHapticsSettingsNapi::Init()");
61     return result;
62 }
63 
Construct(napi_env env,napi_callback_info info)64 napi_value ToneHapticsSettingsNapi::Construct(napi_env env, napi_callback_info info)
65 {
66     napi_status status;
67     napi_value jsThis = nullptr;
68     size_t argCount = 0;
69 
70     status = napi_get_cb_info(env, info, &argCount, nullptr, &jsThis, nullptr);
71     if (status == napi_ok) {
72         unique_ptr<ToneHapticsSettingsNapi> obj = make_unique<ToneHapticsSettingsNapi>();
73         if (obj != nullptr) {
74             obj->env_ = env;
75             status = napi_wrap(env, jsThis, static_cast<void*>(obj.get()), ToneHapticsSettingsNapi::Destructor,
76                 nullptr, nullptr);
77             if (status == napi_ok) {
78                 obj.release();
79                 return jsThis;
80             }
81         }
82     }
83 
84     MEDIA_LOGE("Failed in ToneHapticsSettingsNapi::Construct()!");
85     napi_get_undefined(env, &jsThis);
86     return jsThis;
87 }
88 
Destructor(napi_env env,void * nativeObject,void * finalize_hint)89 void ToneHapticsSettingsNapi::Destructor(napi_env env, void *nativeObject, void *finalize_hint)
90 {
91     if (nativeObject != nullptr) {
92         auto obj = static_cast<ToneHapticsSettingsNapi*>(nativeObject);
93         delete obj;
94         obj = nullptr;
95     }
96 }
97 
NewInstance(napi_env env,const ToneHapticsSettings & toneHapticsSettings,napi_value & out)98 napi_status ToneHapticsSettingsNapi::NewInstance(napi_env env, const ToneHapticsSettings &toneHapticsSettings,
99     napi_value &out)
100 {
101     napi_value constructor{};
102     NAPI_CALL_BASE(env, napi_get_reference_value(env, sConstructor_, &constructor), napi_generic_failure);
103     napi_value instance{};
104     NAPI_CALL_BASE(env, napi_new_instance(env, constructor, 0, nullptr, &instance), napi_generic_failure);
105 
106     ToneHapticsSettingsNapi* toneHapticsSettingsNapi{};
107     NAPI_CALL_BASE(env, napi_unwrap(env, instance, reinterpret_cast<void**>(&toneHapticsSettingsNapi)),
108         napi_generic_failure);
109     CHECK_AND_RETURN_RET_LOG(toneHapticsSettingsNapi != nullptr, napi_invalid_arg,
110         "toneHapticsSettingsNapi is nullptr");
111 
112     toneHapticsSettingsNapi->toneHapticsSettings_ = toneHapticsSettings;
113     out = instance;
114     return napi_ok;
115 }
116 
GetMode(napi_env env,napi_callback_info info)117 napi_value ToneHapticsSettingsNapi::GetMode(napi_env env, napi_callback_info info)
118 {
119     napi_status status;
120     ToneHapticsSettingsNapi *toneHapticsSettingsNapi = nullptr;
121     size_t argc = 0;
122     napi_value jsThis = nullptr;
123     napi_value jsResult = nullptr;
124     napi_get_undefined(env, &jsResult);
125 
126     status = napi_get_cb_info(env, info, &argc, nullptr, &jsThis, nullptr);
127     if (status != napi_ok || jsThis == nullptr) {
128         MEDIA_LOGE("GetMode: failed for napi_get_cb_info");
129         return jsResult;
130     }
131 
132     status = napi_unwrap(env, jsThis, (void **)&toneHapticsSettingsNapi);
133     if (status != napi_ok || toneHapticsSettingsNapi == nullptr) {
134         MEDIA_LOGE("GetMode: failed for napi_unwrap");
135         return jsResult;
136     }
137 
138     status = napi_create_int32(env, static_cast<int32_t>(toneHapticsSettingsNapi->toneHapticsSettings_.mode),
139         &jsResult);
140     if (status != napi_ok) {
141         MEDIA_LOGE("GetMode: failed for napi_create_int32");
142         return jsResult;
143     }
144     return jsResult;
145 }
146 
SetMode(napi_env env,napi_callback_info info)147 napi_value ToneHapticsSettingsNapi::SetMode(napi_env env, napi_callback_info info)
148 {
149     napi_status status;
150     ToneHapticsSettingsNapi *toneHapticsSettingsNapi = nullptr;
151     size_t argc = 1;
152     napi_value args[1] = { nullptr };
153     napi_value jsThis = nullptr;
154     int32_t mode = 0;
155     napi_value jsResult = nullptr;
156     napi_valuetype valueType = napi_undefined;
157     napi_get_undefined(env, &jsResult);
158 
159     status = napi_get_cb_info(env, info, &argc, args, &jsThis, nullptr);
160     if (status != napi_ok || jsThis == nullptr || argc < 1) {
161         MEDIA_LOGE("SetMode: failed for napi_get_cb_info");
162         return jsResult;
163     }
164 
165     status = napi_unwrap(env, jsThis, (void **)&toneHapticsSettingsNapi);
166     if (status != napi_ok || toneHapticsSettingsNapi == nullptr) {
167         MEDIA_LOGE("SetMode: failed for napi_unwrap");
168         return jsResult;
169     }
170 
171     status = napi_typeof(env, args[0], &valueType);
172     if (status != napi_ok || valueType != napi_number) {
173         MEDIA_LOGE("SetMode: failed for wrong data type");
174         return jsResult;
175     }
176 
177     status = napi_get_value_int32(env, args[0], &mode);
178     if (status != napi_ok) {
179         MEDIA_LOGE("SetMode: failed for napi_get_value_int32");
180         return jsResult;
181     }
182 
183     toneHapticsSettingsNapi->toneHapticsSettings_.mode = static_cast<ToneHapticsMode>(mode);
184     return jsResult;
185 }
186 
GetHapticsUri(napi_env env,napi_callback_info info)187 napi_value ToneHapticsSettingsNapi::GetHapticsUri(napi_env env, napi_callback_info info)
188 {
189     napi_status status;
190     ToneHapticsSettingsNapi *toneHapticsSettingsNapi = nullptr;
191     size_t argc = 0;
192     napi_value jsThis = nullptr;
193     napi_value jsResult = nullptr;
194     napi_get_undefined(env, &jsResult);
195 
196     status = napi_get_cb_info(env, info, &argc, nullptr, &jsThis, nullptr);
197     if (status != napi_ok || jsThis == nullptr) {
198         MEDIA_LOGE("GetHapticsUri: failed for napi_get_cb_info");
199         return jsResult;
200     }
201 
202     status = napi_unwrap(env, jsThis, (void **)&toneHapticsSettingsNapi);
203     if (status != napi_ok || toneHapticsSettingsNapi == nullptr) {
204         MEDIA_LOGE("GetHapticsUri: failed for napi_unwrap");
205         return jsResult;
206     }
207 
208     string &hapticsUri = toneHapticsSettingsNapi->toneHapticsSettings_.hapticsUri;
209     status = napi_create_string_utf8(env, hapticsUri.c_str(), hapticsUri.size(), &jsResult);
210     if (status != napi_ok) {
211         MEDIA_LOGE("GetHapticsUri: failed for napi_create_string_utf8");
212         return jsResult;
213     }
214     return jsResult;
215 }
216 
SetHapticsUri(napi_env env,napi_callback_info info)217 napi_value ToneHapticsSettingsNapi::SetHapticsUri(napi_env env, napi_callback_info info)
218 {
219     napi_status status;
220     ToneHapticsSettingsNapi *toneHapticsSettingsNapi = nullptr;
221     size_t argc = 1;
222     napi_value args[1] = { nullptr };
223     napi_value jsThis = nullptr;
224     char buffer[1024] = {0};
225     size_t res = 0;
226     napi_value jsResult = nullptr;
227     napi_valuetype valueType = napi_undefined;
228     napi_get_undefined(env, &jsResult);
229 
230     status = napi_get_cb_info(env, info, &argc, args, &jsThis, nullptr);
231     if (status != napi_ok || jsThis == nullptr || argc < 1) {
232         MEDIA_LOGE("SetHapticsUri: failed for napi_get_cb_info");
233         return jsResult;
234     }
235 
236     status = napi_unwrap(env, jsThis, (void **)&toneHapticsSettingsNapi);
237     if (status != napi_ok || toneHapticsSettingsNapi == nullptr) {
238         MEDIA_LOGE("SetHapticsUri: failed for napi_unwrap");
239         return jsResult;
240     }
241 
242     status = napi_typeof(env, args[0], &valueType);
243     if (status != napi_ok || valueType != napi_string) {
244         MEDIA_LOGE("SetHapticsUri: failed for wrong data type");
245         return jsResult;
246     }
247 
248     status = napi_get_value_string_utf8(env, args[0], buffer, sizeof(buffer), &res);
249     if (status != napi_ok) {
250         MEDIA_LOGE("SetHapticsUri: failed for napi_get_value_int32");
251         return jsResult;
252     }
253 
254     toneHapticsSettingsNapi->toneHapticsSettings_.hapticsUri = std::string(buffer);
255     return jsResult;
256 }
257 }  // namespace Media
258 }  // namespace OHOS
259