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 "cloud_enhancement_task_state_napi.h"
17 
18 #include <fcntl.h>
19 #include <unistd.h>
20 
21 #include "directory_ex.h"
22 #include "file_uri.h"
23 #include "media_file_utils.h"
24 #include "media_library_napi.h"
25 #include "medialibrary_client_errno.h"
26 #include "medialibrary_errno.h"
27 #include "medialibrary_napi_utils.h"
28 #include "userfile_client.h"
29 #include "userfile_manager_types.h"
30 
31 using namespace std;
32 
33 namespace OHOS {
34 namespace Media {
35 
36 static const string CLOUD_ENHANCEMENT_TASK_STATE_CLASS = "CloudEnhancementTaskState";
37 thread_local napi_ref CloudEnhancementTaskStateNapi::constructor_ = nullptr;
38 
Init(napi_env env,napi_value exports)39 napi_value CloudEnhancementTaskStateNapi::Init(napi_env env, napi_value exports)
40 {
41     NapiClassInfo info = {
42         .name = CLOUD_ENHANCEMENT_TASK_STATE_CLASS,
43         .ref = &constructor_,
44         .constructor = Constructor,
45         .props = {
46             DECLARE_NAPI_GETTER("taskStage", JSGetTaskStage),
47             DECLARE_NAPI_GETTER("transferredFileSize", JSGetTransferredFileSize),
48             DECLARE_NAPI_GETTER("totalFileSize", JSGetTotalFileSize),
49             DECLARE_NAPI_GETTER("expectedDuration", JSGetExpectedDuration),
50             DECLARE_NAPI_GETTER("statusCode", JSGetStatusCode),
51         }
52     };
53     MediaLibraryNapiUtils::NapiDefineClass(env, exports, info);
54     return exports;
55 }
56 
Constructor(napi_env env,napi_callback_info info)57 napi_value CloudEnhancementTaskStateNapi::Constructor(napi_env env, napi_callback_info info)
58 {
59     napi_value newTarget = nullptr;
60     CHECK_ARGS(env, napi_get_new_target(env, info, &newTarget), JS_INNER_FAIL);
61     CHECK_COND_RET(newTarget != nullptr, nullptr, "Invalid call to constructor");
62 
63     size_t argc = ARGS_ZERO;
64     napi_value thisVar = nullptr;
65     CHECK_ARGS(env, napi_get_cb_info(env, info, &argc, nullptr, &thisVar, nullptr), JS_INNER_FAIL);
66     CHECK_COND_WITH_MESSAGE(env, argc == ARGS_ZERO, "Number of args is invalid");
67 
68     unique_ptr<CloudEnhancementTaskStateNapi> obj = make_unique<CloudEnhancementTaskStateNapi>();
69     CHECK_ARGS(env,
70         napi_wrap(env, thisVar, reinterpret_cast<void*>(obj.get()), CloudEnhancementTaskStateNapi::Destructor,
71         nullptr, nullptr), JS_INNER_FAIL);
72     obj.release();
73     return thisVar;
74 }
75 
Destructor(napi_env env,void * nativeObject,void * finalizeHint)76 void CloudEnhancementTaskStateNapi::Destructor(napi_env env, void* nativeObject, void* finalizeHint)
77 {
78     auto* cloudEnhancementTaskStateNapi = reinterpret_cast<CloudEnhancementTaskStateNapi*>(nativeObject);
79     if (cloudEnhancementTaskStateNapi == nullptr) {
80         return;
81     }
82 
83     delete cloudEnhancementTaskStateNapi;
84     cloudEnhancementTaskStateNapi = nullptr;
85 }
86 
GetCloudEnhancementTaskStage() const87 CloudEnhancementTaskStage CloudEnhancementTaskStateNapi::GetCloudEnhancementTaskStage() const
88 {
89     return this->cloudEnhancementTaskStage_;
90 }
91 
SetCloudEnhancementTaskStage(CloudEnhancementTaskStage cloudEnhancementTaskStage)92 void CloudEnhancementTaskStateNapi::SetCloudEnhancementTaskStage(CloudEnhancementTaskStage cloudEnhancementTaskStage)
93 {
94     this->cloudEnhancementTaskStage_ = cloudEnhancementTaskStage;
95 }
96 
GetTransferredFileSize() const97 int32_t CloudEnhancementTaskStateNapi::GetTransferredFileSize() const
98 {
99     return this->transferredFileSize_;
100 }
101 
SetTransferredFileSize(int32_t transferredFileSize)102 void CloudEnhancementTaskStateNapi::SetTransferredFileSize(int32_t transferredFileSize)
103 {
104     this->transferredFileSize_ = transferredFileSize;
105 }
106 
GetTotalFileSize() const107 int32_t CloudEnhancementTaskStateNapi::GetTotalFileSize() const
108 {
109     return this->totalFileSize_;
110 }
111 
SetTotalFileSize(int32_t totalFileSize)112 void CloudEnhancementTaskStateNapi::SetTotalFileSize(int32_t totalFileSize)
113 {
114     this->totalFileSize_ = totalFileSize;
115 }
116 
GetExpectedDuration() const117 int32_t CloudEnhancementTaskStateNapi::GetExpectedDuration() const
118 {
119     return this->expectedDuration_;
120 }
121 
SetExpectedDuration(int32_t expectedDuration)122 void CloudEnhancementTaskStateNapi::SetExpectedDuration(int32_t expectedDuration)
123 {
124     this->expectedDuration_ = expectedDuration;
125 }
126 
GetStatusCode() const127 int32_t CloudEnhancementTaskStateNapi::GetStatusCode() const
128 {
129     return this->statusCode_;
130 }
131 
SetStatusCode(int32_t statusCode)132 void CloudEnhancementTaskStateNapi::SetStatusCode(int32_t statusCode)
133 {
134     this->statusCode_ = statusCode;
135 }
136 
NewCloudEnhancementTaskStateNapi(napi_env env,CloudEnhancementAsyncContext * context)137 napi_value CloudEnhancementTaskStateNapi::NewCloudEnhancementTaskStateNapi(napi_env env,
138     CloudEnhancementAsyncContext* context)
139 {
140     napi_value constructor = nullptr;
141     napi_value instance = nullptr;
142     napi_status status = napi_get_reference_value(env, constructor_, &constructor);
143     CHECK_COND_RET(status == napi_ok, nullptr, "Failed to get reference of constructor, napi status: %{public}d",
144         static_cast<int>(status));
145     status = napi_new_instance(env, constructor, 0, nullptr, &instance);
146     CHECK_COND_RET(status == napi_ok, nullptr,
147         "Failed to get new instance of cloud enhancement task state, napi status: %{public}d",
148         static_cast<int>(status));
149     CHECK_COND_RET(instance != nullptr, nullptr, "Instance is nullptr");
150 
151     CloudEnhancementTaskStateNapi* cloudEnhancementTaskStateNapi = nullptr;
152     status = napi_unwrap(env, instance, reinterpret_cast<void**>(&cloudEnhancementTaskStateNapi));
153     CHECK_COND_RET(status == napi_ok, nullptr, "Failed to unwarp instance of CloudEnhancementTaskStateNapi");
154     CHECK_COND_RET(cloudEnhancementTaskStateNapi != nullptr, nullptr, "cloudEnhancementTaskStateNapi is nullptr");
155     cloudEnhancementTaskStateNapi->SetCloudEnhancementTaskStage(context->cloudEnhancementTaskStage_);
156     cloudEnhancementTaskStateNapi->SetTransferredFileSize(context->transferredFileSize_);
157     cloudEnhancementTaskStateNapi->SetTotalFileSize(context->totalFileSize_);
158     cloudEnhancementTaskStateNapi->SetExpectedDuration(context->expectedDuration_);
159     cloudEnhancementTaskStateNapi->SetStatusCode(context->statusCode_);
160     return instance;
161 }
162 
JSGetTaskStage(napi_env env,napi_callback_info info)163 napi_value CloudEnhancementTaskStateNapi::JSGetTaskStage(napi_env env, napi_callback_info info)
164 {
165     napi_status status;
166     napi_value thisVar = nullptr;
167     napi_value result = nullptr;
168     CloudEnhancementTaskStateNapi* obj = nullptr;
169 
170     napi_get_undefined(env, &result);
171     GET_JS_OBJ_WITH_ZERO_ARGS(env, info, status, thisVar);
172     if (status != napi_ok || thisVar == nullptr) {
173         NAPI_ERR_LOG("Invalid arguments! status: %{public}d", status);
174         return result;
175     }
176 
177     status = napi_unwrap(env, thisVar, reinterpret_cast<void**>(&obj));
178     if (status == napi_ok && obj != nullptr) {
179         CloudEnhancementTaskStage cloudEnhancementTaskStage = obj->GetCloudEnhancementTaskStage();
180         napi_create_int32(env, static_cast<int32_t>(cloudEnhancementTaskStage), &result);
181     } else {
182         NAPI_ERR_LOG("Failed to get taskStage");
183     }
184     return result;
185 }
186 
JSGetTransferredFileSize(napi_env env,napi_callback_info info)187 napi_value CloudEnhancementTaskStateNapi::JSGetTransferredFileSize(napi_env env, napi_callback_info info)
188 {
189     napi_status status;
190     napi_value thisVar = nullptr;
191     napi_value result = nullptr;
192     CloudEnhancementTaskStateNapi* obj = nullptr;
193 
194     napi_get_undefined(env, &result);
195     GET_JS_OBJ_WITH_ZERO_ARGS(env, info, status, thisVar);
196     if (status != napi_ok || thisVar == nullptr) {
197         NAPI_ERR_LOG("Invalid arguments! status: %{public}d", status);
198         return result;
199     }
200 
201     status = napi_unwrap(env, thisVar, reinterpret_cast<void**>(&obj));
202     if (status == napi_ok && obj != nullptr) {
203         int32_t transferredFileSize = obj->GetTransferredFileSize();
204         if (transferredFileSize != UNDEFINED) {
205             napi_create_int32(env, transferredFileSize, &result);
206         }
207     } else {
208         NAPI_ERR_LOG("Failed to get transferredFileSize");
209     }
210     return result;
211 }
212 
JSGetTotalFileSize(napi_env env,napi_callback_info info)213 napi_value CloudEnhancementTaskStateNapi::JSGetTotalFileSize(napi_env env, napi_callback_info info)
214 {
215     napi_status status;
216     napi_value thisVar = nullptr;
217     napi_value result = nullptr;
218     CloudEnhancementTaskStateNapi* obj = nullptr;
219 
220     napi_get_undefined(env, &result);
221     GET_JS_OBJ_WITH_ZERO_ARGS(env, info, status, thisVar);
222     if (status != napi_ok || thisVar == nullptr) {
223         NAPI_ERR_LOG("Invalid arguments! status: %{public}d", status);
224         return result;
225     }
226 
227     status = napi_unwrap(env, thisVar, reinterpret_cast<void**>(&obj));
228     if (status == napi_ok && obj != nullptr) {
229         int32_t totalFileSize = obj->GetTotalFileSize();
230         if (totalFileSize != UNDEFINED) {
231             napi_create_int32(env, totalFileSize, &result);
232         }
233     } else {
234         NAPI_ERR_LOG("Failed to get totalFileSize");
235     }
236     return result;
237 }
238 
JSGetExpectedDuration(napi_env env,napi_callback_info info)239 napi_value CloudEnhancementTaskStateNapi::JSGetExpectedDuration(napi_env env, napi_callback_info info)
240 {
241     napi_status status;
242     napi_value thisVar = nullptr;
243     napi_value result = nullptr;
244     CloudEnhancementTaskStateNapi* obj = nullptr;
245 
246     napi_get_undefined(env, &result);
247     GET_JS_OBJ_WITH_ZERO_ARGS(env, info, status, thisVar);
248     if (status != napi_ok || thisVar == nullptr) {
249         NAPI_ERR_LOG("Invalid arguments! status: %{public}d", status);
250         return result;
251     }
252 
253     status = napi_unwrap(env, thisVar, reinterpret_cast<void**>(&obj));
254     if (status == napi_ok && obj != nullptr) {
255         int32_t expectedDuration = obj->GetExpectedDuration();
256         if (expectedDuration != UNDEFINED) {
257             napi_create_int32(env, expectedDuration, &result);
258         }
259     } else {
260         NAPI_ERR_LOG("Failed to get expectedDuration");
261     }
262     return result;
263 }
264 
JSGetStatusCode(napi_env env,napi_callback_info info)265 napi_value CloudEnhancementTaskStateNapi::JSGetStatusCode(napi_env env, napi_callback_info info)
266 {
267     napi_status status;
268     napi_value thisVar = nullptr;
269     napi_value result = nullptr;
270     CloudEnhancementTaskStateNapi* obj = nullptr;
271 
272     napi_get_undefined(env, &result);
273     GET_JS_OBJ_WITH_ZERO_ARGS(env, info, status, thisVar);
274     if (status != napi_ok || thisVar == nullptr) {
275         NAPI_ERR_LOG("Invalid arguments! status: %{public}d", status);
276         return result;
277     }
278 
279     status = napi_unwrap(env, thisVar, reinterpret_cast<void**>(&obj));
280     if (status == napi_ok && obj != nullptr) {
281         int32_t statusCode = obj->GetStatusCode();
282         if (statusCode != UNDEFINED) {
283             napi_create_int32(env, statusCode, &result);
284         }
285     } else {
286         NAPI_ERR_LOG("Failed to get statusCode");
287     }
288     return result;
289 }
290 
291 } // namespace Media
292 } // namespace OHOS