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