• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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