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