• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2023 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 "ringtone_options_napi.h"
17 #include "hilog/log.h"
18 
19 using namespace std;
20 using OHOS::HiviewDFX::HiLog;
21 using OHOS::HiviewDFX::HiLogLabel;
22 
23 namespace OHOS {
24 namespace Media {
25 napi_ref RingtoneOptionsNapi::sConstructor_ = nullptr;
26 
27 float RingtoneOptionsNapi::sVolume_ = 1;
28 bool RingtoneOptionsNapi::sLoop_ = true;
29 
30 namespace {
31     constexpr HiLogLabel LABEL = {LOG_CORE, LOG_DOMAIN, "RingtoneOptionsNapi"};
32 }
33 
RingtoneOptionsNapi()34 RingtoneOptionsNapi::RingtoneOptionsNapi()
35     : env_(nullptr) {
36 }
37 
38 RingtoneOptionsNapi::~RingtoneOptionsNapi() = default;
39 
Destructor(napi_env env,void * nativeObject,void * finalize_hint)40 void RingtoneOptionsNapi::Destructor(napi_env env, void *nativeObject, void *finalize_hint)
41 {
42     if (nativeObject != nullptr) {
43         auto obj = static_cast<RingtoneOptionsNapi *>(nativeObject);
44         delete obj;
45         obj = nullptr;
46     }
47 }
48 
Init(napi_env env,napi_value exports)49 napi_value RingtoneOptionsNapi::Init(napi_env env, napi_value exports)
50 {
51     napi_status status;
52     napi_value constructor;
53     napi_value result = nullptr;
54     napi_get_undefined(env, &result);
55 
56     napi_property_descriptor ringtone_options_properties[] = {
57         DECLARE_NAPI_GETTER_SETTER("volume", GetVolume, SetVolume),
58         DECLARE_NAPI_GETTER_SETTER("loop", GetLoop, SetLoop)
59     };
60 
61     status = napi_define_class(env, RINGTONE_OPTIONS_NAPI_CLASS_NAME.c_str(), NAPI_AUTO_LENGTH, Construct,
62                                nullptr, sizeof(ringtone_options_properties) / sizeof(ringtone_options_properties[0]),
63                                ringtone_options_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, RINGTONE_OPTIONS_NAPI_CLASS_NAME.c_str(),
71                                          constructor);
72         if (status == napi_ok) {
73             return exports;
74         }
75     }
76     HiLog::Error(LABEL, "Failure in RingtoneOptionsNapi::Init()");
77 
78     return result;
79 }
80 
Construct(napi_env env,napi_callback_info info)81 napi_value RingtoneOptionsNapi::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<RingtoneOptionsNapi> obj = make_unique<RingtoneOptionsNapi>();
90         if (obj != nullptr) {
91             obj->env_ = env;
92             obj->volume_ = sVolume_;
93             obj->loop_ = sLoop_;
94             status = napi_wrap(env, jsThis, static_cast<void*>(obj.get()),
95                                RingtoneOptionsNapi::Destructor, nullptr, nullptr);
96             if (status == napi_ok) {
97                 obj.release();
98                 return jsThis;
99             }
100         }
101     }
102 
103     HiLog::Error(LABEL, "Failed in RingtoneOptionsNapi::Construct()!");
104     napi_get_undefined(env, &jsThis);
105 
106     return jsThis;
107 }
108 
CreateRingtoneOptionsWrapper(napi_env env,float volume,bool loop)109 napi_value RingtoneOptionsNapi::CreateRingtoneOptionsWrapper(napi_env env, float volume, bool loop)
110 {
111     napi_status status;
112     napi_value result = nullptr;
113     napi_value constructor;
114 
115     status = napi_get_reference_value(env, sConstructor_, &constructor);
116     if (status == napi_ok) {
117         sVolume_ = volume;
118         sLoop_ = loop;
119         status = napi_new_instance(env, constructor, 0, nullptr, &result);
120         if (status == napi_ok) {
121             return result;
122         }
123     }
124     HiLog::Error(LABEL, "Failed in CreateRingtoneOptionsWrapper, %{public}d", status);
125 
126     napi_get_undefined(env, &result);
127 
128     return result;
129 }
130 
GetVolume(napi_env env,napi_callback_info info)131 napi_value RingtoneOptionsNapi::GetVolume(napi_env env, napi_callback_info info)
132 {
133     napi_status status;
134     RingtoneOptionsNapi *ringtoneOptionsNapi = nullptr;
135     size_t argc = 0;
136     napi_value jsThis = nullptr;
137     napi_value jsResult = nullptr;
138     napi_get_undefined(env, &jsResult);
139 
140     status = napi_get_cb_info(env, info, &argc, nullptr, &jsThis, nullptr);
141     if (status != napi_ok || jsThis == nullptr) {
142         HiLog::Error(LABEL, "Get volume fail to napi_get_cb_info");
143         return jsResult;
144     }
145 
146     status = napi_unwrap(env, jsThis, (void **)&ringtoneOptionsNapi);
147     if (status == napi_ok) {
148         status = napi_create_double(env, ringtoneOptionsNapi->volume_, &jsResult);
149         if (status == napi_ok) {
150             return jsResult;
151         }
152     }
153 
154     return jsResult;
155 }
156 
SetVolume(napi_env env,napi_callback_info info)157 napi_value RingtoneOptionsNapi::SetVolume(napi_env env, napi_callback_info info)
158 {
159     napi_status status;
160     RingtoneOptionsNapi *ringtoneOptionsNapi = nullptr;
161     size_t argc = 1;
162     napi_value args[1] = { nullptr };
163     napi_value jsThis = nullptr;
164     double volume;
165     napi_value jsResult = nullptr;
166     napi_get_undefined(env, &jsResult);
167 
168     status = napi_get_cb_info(env, info, &argc, args, &jsThis, nullptr);
169     if (status != napi_ok || jsThis == nullptr || args[0] == nullptr) {
170         HiLog::Error(LABEL, "set volume fail to napi_get_cb_info");
171         return jsResult;
172     }
173 
174     status = napi_unwrap(env, jsThis, (void **)&ringtoneOptionsNapi);
175     if (status == napi_ok) {
176         napi_valuetype valueType = napi_undefined;
177         if (napi_typeof(env, args[0], &valueType) != napi_ok || valueType != napi_number) {
178             HiLog::Error(LABEL, "set volume fail: wrong data type");
179             return jsResult;
180         }
181     }
182 
183     status = napi_get_value_double(env, args[0], &volume);
184     if (status == napi_ok) {
185         ringtoneOptionsNapi->volume_ = (float)volume;
186     }
187 
188     return jsResult;
189 }
190 
GetLoop(napi_env env,napi_callback_info info)191 napi_value RingtoneOptionsNapi::GetLoop(napi_env env, napi_callback_info info)
192 {
193     napi_status status;
194     RingtoneOptionsNapi *ringtoneOptionsNapi = nullptr;
195     size_t argc = 0;
196     napi_value jsThis = nullptr;
197     napi_value jsResult = nullptr;
198     napi_get_undefined(env, &jsResult);
199 
200     status = napi_get_cb_info(env, info, &argc, nullptr, &jsThis, nullptr);
201     if (status != napi_ok || jsThis == nullptr) {
202         HiLog::Error(LABEL, "Get volume fail to napi_get_cb_info");
203         return jsResult;
204     }
205 
206     status = napi_unwrap(env, jsThis, (void **)&ringtoneOptionsNapi);
207     if (status == napi_ok) {
208         status = napi_get_boolean(env, ringtoneOptionsNapi->loop_, &jsResult);
209         if (status == napi_ok) {
210             return jsResult;
211         }
212     }
213 
214     return jsResult;
215 }
216 
SetLoop(napi_env env,napi_callback_info info)217 napi_value RingtoneOptionsNapi::SetLoop(napi_env env, napi_callback_info info)
218 {
219     napi_status status;
220     RingtoneOptionsNapi *ringtoneOptionsNapi = nullptr;
221     size_t argc = 1;
222     napi_value args[1] = { nullptr };
223     napi_value jsThis = nullptr;
224     bool loop = false;
225     napi_value jsResult = nullptr;
226     napi_get_undefined(env, &jsResult);
227 
228     status = napi_get_cb_info(env, info, &argc, args, &jsThis, nullptr);
229     if (status != napi_ok || jsThis == nullptr || args[0] == nullptr) {
230         HiLog::Error(LABEL, "set loop fail to napi_get_cb_info");
231         return jsResult;
232     }
233 
234     status = napi_unwrap(env, jsThis, (void **)&ringtoneOptionsNapi);
235     if (status == napi_ok) {
236         napi_valuetype valueType = napi_undefined;
237         if (napi_typeof(env, args[0], &valueType) != napi_ok || valueType != napi_boolean) {
238             HiLog::Error(LABEL, "set volume fail: wrong data type");
239             return jsResult;
240         }
241     }
242 
243     status = napi_get_value_bool(env, args[0], &loop);
244     if (status == napi_ok) {
245         ringtoneOptionsNapi->loop_ = loop;
246     }
247 
248     return jsResult;
249 }
250 }  // namespace Media
251 }  // namespace OHOS
252