1 /*
2 * Copyright (c) 2025 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 "audio_haptic_file_descriptor_napi.h"
17 #include "audio_haptic_log.h"
18
19 using namespace std;
20
21 namespace {
22 constexpr OHOS::HiviewDFX::HiLogLabel LABEL = {LOG_CORE, LOG_DOMAIN_AUDIO_NAPI, "AudioHapticFileDescriptorNapi"};
23 }
24
25 namespace OHOS {
26 namespace Media {
27 thread_local napi_ref AudioHapticFileDescriptorNapi::sConstructor_ = nullptr;
28
29 int32_t AudioHapticFileDescriptorNapi::sFd_ = 0;
30 int64_t AudioHapticFileDescriptorNapi::sLength_ = 0;
31 int64_t AudioHapticFileDescriptorNapi::sOffset_ = 0;
32
AudioHapticFileDescriptorNapi()33 AudioHapticFileDescriptorNapi::AudioHapticFileDescriptorNapi() : env_(nullptr)
34 {
35 }
36
37 AudioHapticFileDescriptorNapi::~AudioHapticFileDescriptorNapi() = default;
38
Destructor(napi_env env,void * nativeObject,void * finalize_hint)39 void AudioHapticFileDescriptorNapi::Destructor(napi_env env, void *nativeObject, void *finalize_hint)
40 {
41 if (nativeObject != nullptr) {
42 auto obj = static_cast<AudioHapticFileDescriptorNapi *>(nativeObject);
43 delete obj;
44 obj = nullptr;
45 }
46 }
47
Init(napi_env env,napi_value exports)48 napi_value AudioHapticFileDescriptorNapi::Init(napi_env env, napi_value exports)
49 {
50 napi_status status;
51 napi_value constructor;
52 napi_value result = nullptr;
53 napi_get_undefined(env, &result);
54
55 napi_property_descriptor audio_haptic_file_descriptor_properties[] = {
56 DECLARE_NAPI_GETTER_SETTER("fd", GetFd, SetFd),
57 DECLARE_NAPI_GETTER_SETTER("length", GetLength, SetLength),
58 DECLARE_NAPI_GETTER_SETTER("offset", GetOffset, SetOffset)
59 };
60
61 status = napi_define_class(env, AUDIO_HAPTIC_FILE_DESCRIPTOR_NAPI_CLASS_NAME.c_str(), NAPI_AUTO_LENGTH, Construct,
62 nullptr, sizeof(audio_haptic_file_descriptor_properties) / sizeof(audio_haptic_file_descriptor_properties[0]),
63 audio_haptic_file_descriptor_properties, &constructor);
64 if (status != napi_ok) {
65 return result;
66 }
67
68 status = napi_create_reference(env, constructor, 1, &sConstructor_);
69 if (status == napi_ok) {
70 status = napi_set_named_property(env, exports,
71 AUDIO_HAPTIC_FILE_DESCRIPTOR_NAPI_CLASS_NAME.c_str(), constructor);
72 if (status == napi_ok) {
73 return exports;
74 }
75 }
76 MEDIA_LOGE("Failure in AudioHapticFileDescriptorNapi::Init()");
77
78 return result;
79 }
80
Construct(napi_env env,napi_callback_info info)81 napi_value AudioHapticFileDescriptorNapi::Construct(napi_env env, napi_callback_info info)
82 {
83 napi_status status;
84 napi_value jsThis = nullptr;
85 size_t argCount = 0;
86
87 status = napi_get_cb_info(env, info, &argCount, nullptr, &jsThis, nullptr);
88 if (status == napi_ok) {
89 unique_ptr<AudioHapticFileDescriptorNapi> obj = make_unique<AudioHapticFileDescriptorNapi>();
90 if (obj != nullptr) {
91 obj->env_ = env;
92 obj->fd_ = sFd_;
93 obj->length_ = sLength_;
94 obj->offset_ = sOffset_;
95 status = napi_wrap(env, jsThis, static_cast<void*>(obj.get()),
96 AudioHapticFileDescriptorNapi::Destructor, nullptr, nullptr);
97 if (status == napi_ok) {
98 obj.release();
99 return jsThis;
100 }
101 }
102 }
103
104 MEDIA_LOGE("Failed in AudioHapticFileDescriptorNapi::Construct()!");
105 napi_get_undefined(env, &jsThis);
106
107 return jsThis;
108 }
109
CreateAudioHapticFileDescriptorWrapper(napi_env env,int32_t fd,int64_t length,int64_t offset)110 napi_value AudioHapticFileDescriptorNapi::CreateAudioHapticFileDescriptorWrapper(napi_env env,
111 int32_t fd, int64_t length, int64_t offset)
112 {
113 napi_status status;
114 napi_value result = nullptr;
115 napi_value constructor;
116
117 status = napi_get_reference_value(env, sConstructor_, &constructor);
118 if (status == napi_ok) {
119 sFd_ = fd;
120 sLength_ = length;
121 sOffset_ = offset;
122 status = napi_new_instance(env, constructor, 0, nullptr, &result);
123 if (status == napi_ok) {
124 return result;
125 }
126 }
127 MEDIA_LOGE("Failed in CreateAudioHapticFileDescriptorWrapper, %{public}d", status);
128
129 napi_get_undefined(env, &result);
130
131 return result;
132 }
133
GetFd(napi_env env,napi_callback_info info)134 napi_value AudioHapticFileDescriptorNapi::GetFd(napi_env env, napi_callback_info info)
135 {
136 napi_status status;
137 AudioHapticFileDescriptorNapi *audioHapticFileDescriptorNapi = nullptr;
138 size_t argc = 0;
139 napi_value jsThis = nullptr;
140 napi_value jsResult = nullptr;
141 napi_get_undefined(env, &jsResult);
142
143 status = napi_get_cb_info(env, info, &argc, nullptr, &jsThis, nullptr);
144 if (status != napi_ok || jsThis == nullptr) {
145 MEDIA_LOGE("GetFd: failed for napi_get_cb_info");
146 return jsResult;
147 }
148
149 status = napi_unwrap(env, jsThis, (void **)&audioHapticFileDescriptorNapi);
150 if (status == napi_ok && audioHapticFileDescriptorNapi != nullptr) {
151 status = napi_create_int32(env, audioHapticFileDescriptorNapi->fd_, &jsResult);
152 if (status == napi_ok) {
153 return jsResult;
154 }
155 }
156
157 return jsResult;
158 }
159
SetFd(napi_env env,napi_callback_info info)160 napi_value AudioHapticFileDescriptorNapi::SetFd(napi_env env, napi_callback_info info)
161 {
162 napi_status status;
163 AudioHapticFileDescriptorNapi *audioHapticFileDescriptorNapi = nullptr;
164 size_t argc = 1;
165 napi_value args[1] = { nullptr };
166 napi_value jsThis = nullptr;
167 int32_t fd = 0;
168 napi_value jsResult = nullptr;
169 napi_get_undefined(env, &jsResult);
170
171 status = napi_get_cb_info(env, info, &argc, args, &jsThis, nullptr);
172 if (status != napi_ok || jsThis == nullptr || args[0] == nullptr) {
173 MEDIA_LOGE("SetFd: failed for napi_get_cb_info");
174 return jsResult;
175 }
176
177 status = napi_unwrap(env, jsThis, (void **)&audioHapticFileDescriptorNapi);
178 if (status == napi_ok && audioHapticFileDescriptorNapi != nullptr) {
179 napi_valuetype valueType = napi_undefined;
180 if (napi_typeof(env, args[0], &valueType) != napi_ok || valueType != napi_number) {
181 MEDIA_LOGE("SetFd: failed for wrong data type");
182 return jsResult;
183 }
184 }
185
186 status = napi_get_value_int32(env, args[0], &fd);
187 if (status == napi_ok) {
188 audioHapticFileDescriptorNapi->fd_ = fd;
189 }
190
191 return jsResult;
192 }
193
GetLength(napi_env env,napi_callback_info info)194 napi_value AudioHapticFileDescriptorNapi::GetLength(napi_env env, napi_callback_info info)
195 {
196 napi_status status;
197 AudioHapticFileDescriptorNapi *audioHapticFileDescriptorNapi = nullptr;
198 size_t argc = 0;
199 napi_value jsThis = nullptr;
200 napi_value jsResult = nullptr;
201 napi_get_undefined(env, &jsResult);
202
203 status = napi_get_cb_info(env, info, &argc, nullptr, &jsThis, nullptr);
204 if (status != napi_ok || jsThis == nullptr) {
205 MEDIA_LOGE("GetLength: failed for napi_get_cb_info");
206 return jsResult;
207 }
208
209 status = napi_unwrap(env, jsThis, (void **)&audioHapticFileDescriptorNapi);
210 if (status == napi_ok && audioHapticFileDescriptorNapi != nullptr) {
211 status = napi_create_int64(env, audioHapticFileDescriptorNapi->length_, &jsResult);
212 if (status == napi_ok) {
213 return jsResult;
214 }
215 }
216
217 return jsResult;
218 }
219
SetLength(napi_env env,napi_callback_info info)220 napi_value AudioHapticFileDescriptorNapi::SetLength(napi_env env, napi_callback_info info)
221 {
222 napi_status status;
223 AudioHapticFileDescriptorNapi *audioHapticFileDescriptorNapi = nullptr;
224 size_t argc = 1;
225 napi_value args[1] = { nullptr };
226 napi_value jsThis = nullptr;
227 int64_t length = 0;
228 napi_value jsResult = nullptr;
229 napi_get_undefined(env, &jsResult);
230
231 status = napi_get_cb_info(env, info, &argc, args, &jsThis, nullptr);
232 if (status != napi_ok || jsThis == nullptr || args[0] == nullptr) {
233 MEDIA_LOGE("SetLength: failed for napi_get_cb_info");
234 return jsResult;
235 }
236
237 status = napi_unwrap(env, jsThis, (void **)&audioHapticFileDescriptorNapi);
238 if (status == napi_ok && audioHapticFileDescriptorNapi != nullptr) {
239 napi_valuetype valueType = napi_undefined;
240 if (napi_typeof(env, args[0], &valueType) != napi_ok || valueType != napi_number) {
241 MEDIA_LOGE("SetLength: failed for wrong data type");
242 return jsResult;
243 }
244 }
245
246 status = napi_get_value_int64(env, args[0], &length);
247 if (status == napi_ok) {
248 audioHapticFileDescriptorNapi->length_ = length;
249 }
250
251 return jsResult;
252 }
253
GetOffset(napi_env env,napi_callback_info info)254 napi_value AudioHapticFileDescriptorNapi::GetOffset(napi_env env, napi_callback_info info)
255 {
256 napi_status status;
257 AudioHapticFileDescriptorNapi *audioHapticFileDescriptorNapi = nullptr;
258 size_t argc = 0;
259 napi_value jsThis = nullptr;
260 napi_value jsResult = nullptr;
261 napi_get_undefined(env, &jsResult);
262
263 status = napi_get_cb_info(env, info, &argc, nullptr, &jsThis, nullptr);
264 if (status != napi_ok || jsThis == nullptr) {
265 MEDIA_LOGE("GetOffset: failed for napi_get_cb_info");
266 return jsResult;
267 }
268
269 status = napi_unwrap(env, jsThis, (void **)&audioHapticFileDescriptorNapi);
270 if (status == napi_ok && audioHapticFileDescriptorNapi != nullptr) {
271 status = napi_create_int64(env, audioHapticFileDescriptorNapi->offset_, &jsResult);
272 if (status == napi_ok) {
273 return jsResult;
274 }
275 }
276
277 return jsResult;
278 }
279
SetOffset(napi_env env,napi_callback_info info)280 napi_value AudioHapticFileDescriptorNapi::SetOffset(napi_env env, napi_callback_info info)
281 {
282 napi_status status;
283 AudioHapticFileDescriptorNapi *audioHapticFileDescriptorNapi = nullptr;
284 size_t argc = 1;
285 napi_value args[1] = { nullptr };
286 napi_value jsThis = nullptr;
287 int64_t offset = 0;
288 napi_value jsResult = nullptr;
289 napi_get_undefined(env, &jsResult);
290
291 status = napi_get_cb_info(env, info, &argc, args, &jsThis, nullptr);
292 if (status != napi_ok || jsThis == nullptr || args[0] == nullptr) {
293 MEDIA_LOGE("SetOffset: failed for napi_get_cb_info");
294 return jsResult;
295 }
296
297 status = napi_unwrap(env, jsThis, (void **)&audioHapticFileDescriptorNapi);
298 if (status == napi_ok && audioHapticFileDescriptorNapi != nullptr) {
299 napi_valuetype valueType = napi_undefined;
300 if (napi_typeof(env, args[0], &valueType) != napi_ok || valueType != napi_number) {
301 MEDIA_LOGE("SetOffset: failed for wrong data type");
302 return jsResult;
303 }
304 }
305
306 status = napi_get_value_int64(env, args[0], &offset);
307 if (status == napi_ok) {
308 audioHapticFileDescriptorNapi->offset_ = offset;
309 }
310
311 return jsResult;
312 }
313 } // namespace Media
314 } // namespace OHOS