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_media_asset_status_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 "cloud_media_asset_types.h"
30 
31 using namespace std;
32 namespace OHOS::Media {
33 static const string CLOUD_MEDIA_ASSET_STATUS_NAPI = "CloudMediaAssetStatus";
34 thread_local napi_ref CloudMediaAssetStatusNapi::constructor_ = nullptr;
35 
Init(napi_env env,napi_value exports)36 napi_value CloudMediaAssetStatusNapi::Init(napi_env env, napi_value exports)
37 {
38     NapiClassInfo info = {
39         .name = CLOUD_MEDIA_ASSET_STATUS_NAPI,
40         .ref = &constructor_,
41         .constructor = Constructor,
42         .props = {
43             DECLARE_NAPI_GETTER("taskStatus", JSGetTaskStatus),
44             DECLARE_NAPI_GETTER("errorCode", JSGetErrorCode),
45             DECLARE_NAPI_GETTER("taskInfo", JSGetTaskInfo),
46         }
47     };
48     MediaLibraryNapiUtils::NapiDefineClass(env, exports, info);
49     return exports;
50 }
51 
Constructor(napi_env env,napi_callback_info info)52 napi_value CloudMediaAssetStatusNapi::Constructor(napi_env env, napi_callback_info info)
53 {
54     napi_value newTarget = nullptr;
55     CHECK_ARGS(env, napi_get_new_target(env, info, &newTarget), JS_INNER_FAIL);
56     CHECK_COND_RET(newTarget != nullptr, nullptr, "Invalid call to constructor");
57 
58     size_t argc = ARGS_ZERO;
59     napi_value thisVar = nullptr;
60     CHECK_ARGS(env, napi_get_cb_info(env, info, &argc, nullptr, &thisVar, nullptr), JS_INNER_FAIL);
61     CHECK_COND_WITH_MESSAGE(env, argc == ARGS_ZERO, "Number of args is invalid");
62 
63     unique_ptr<CloudMediaAssetStatusNapi> obj = make_unique<CloudMediaAssetStatusNapi>();
64     CHECK_ARGS(env,
65         napi_wrap(env, thisVar, reinterpret_cast<void*>(obj.get()), CloudMediaAssetStatusNapi::Destructor,
66         nullptr, nullptr), JS_INNER_FAIL);
67     obj.release();
68     return thisVar;
69 }
70 
Destructor(napi_env env,void * nativeObject,void * finalizeHint)71 void CloudMediaAssetStatusNapi::Destructor(napi_env env, void* nativeObject, void* finalizeHint)
72 {
73     auto* cloudMediaAssetStatusNapi = reinterpret_cast<CloudMediaAssetStatusNapi*>(nativeObject);
74     if (cloudMediaAssetStatusNapi == nullptr) {
75         NAPI_ERR_LOG("cloudMediaAssetStatusNapi is nullptr");
76         return;
77     }
78 
79     delete cloudMediaAssetStatusNapi;
80     cloudMediaAssetStatusNapi = nullptr;
81 }
82 
GetCloudMediaAssetTaskStatus() const83 CloudMediaAssetTaskStatus CloudMediaAssetStatusNapi::GetCloudMediaAssetTaskStatus() const
84 {
85     return this->cloudMediaAssetTaskStatus_;
86 }
87 
SetCloudMediaAssetTaskStatus(CloudMediaAssetTaskStatus cloudMediaAssetTaskStatus)88 void CloudMediaAssetStatusNapi::SetCloudMediaAssetTaskStatus(CloudMediaAssetTaskStatus cloudMediaAssetTaskStatus)
89 {
90     this->cloudMediaAssetTaskStatus_ = cloudMediaAssetTaskStatus;
91 }
92 
GetCloudMediaTaskPauseCause() const93 CloudMediaTaskPauseCause CloudMediaAssetStatusNapi::GetCloudMediaTaskPauseCause() const
94 {
95     return this->cloudMediaTaskPauseCause_;
96 }
97 
SetCloudMediaTaskPauseCause(CloudMediaTaskPauseCause cloudMediaTaskPauseCause)98 void CloudMediaAssetStatusNapi::SetCloudMediaTaskPauseCause(CloudMediaTaskPauseCause cloudMediaTaskPauseCause)
99 {
100     this->cloudMediaTaskPauseCause_ = cloudMediaTaskPauseCause;
101 }
102 
GetTaskInfo() const103 std::string CloudMediaAssetStatusNapi::GetTaskInfo() const
104 {
105     return this->taskInfo_;
106 }
107 
SetTaskInfo(const std::string & taskInfo)108 void CloudMediaAssetStatusNapi::SetTaskInfo(const std::string &taskInfo)
109 {
110     this->taskInfo_ = taskInfo;
111 }
112 
NewCloudMediaAssetStatusNapi(napi_env env,CloudMediaAssetAsyncContext * context)113 napi_value CloudMediaAssetStatusNapi::NewCloudMediaAssetStatusNapi(napi_env env,
114     CloudMediaAssetAsyncContext* context)
115 {
116     napi_value constructor = nullptr;
117     napi_value instance = nullptr;
118     napi_status status = napi_get_reference_value(env, constructor_, &constructor);
119     CHECK_COND_RET(status == napi_ok, nullptr, "Failed to get reference of constructor, napi status: %{public}d",
120         static_cast<int>(status));
121     status = napi_new_instance(env, constructor, 0, nullptr, &instance);
122     CHECK_COND_RET(status == napi_ok, nullptr,
123         "Failed to get new instance of cloud media asset manager task state, napi status: %{public}d",
124         static_cast<int>(status));
125     CHECK_COND_RET(instance != nullptr, nullptr, "Instance is nullptr");
126 
127     CloudMediaAssetStatusNapi* cloudMediaAssetStatusNapi = nullptr;
128     status = napi_unwrap(env, instance, reinterpret_cast<void**>(&cloudMediaAssetStatusNapi));
129     CHECK_COND_RET(status == napi_ok, nullptr, "Failed to unwarp instance of CloudMediaAssetStatusNapi");
130     CHECK_COND_RET(cloudMediaAssetStatusNapi != nullptr, nullptr, "cloudMediaAssetStatusNapi is nullptr");
131     cloudMediaAssetStatusNapi->SetCloudMediaAssetTaskStatus(context->cloudMediaAssetTaskStatus_);
132     cloudMediaAssetStatusNapi->SetCloudMediaTaskPauseCause(context->cloudMediaTaskPauseCause_);
133     cloudMediaAssetStatusNapi->SetTaskInfo(context->taskInfo_);
134     return instance;
135 }
136 
JSGetTaskStatus(napi_env env,napi_callback_info info)137 napi_value CloudMediaAssetStatusNapi::JSGetTaskStatus(napi_env env, napi_callback_info info)
138 {
139     napi_status status;
140     napi_value thisVar = nullptr;
141     napi_value result = nullptr;
142     CloudMediaAssetStatusNapi* obj = nullptr;
143 
144     napi_get_undefined(env, &result);
145     GET_JS_OBJ_WITH_ZERO_ARGS(env, info, status, thisVar);
146     if (status != napi_ok || thisVar == nullptr) {
147         NAPI_ERR_LOG("Invalid arguments! status: %{public}d", status);
148         return result;
149     }
150 
151     status = napi_unwrap(env, thisVar, reinterpret_cast<void**>(&obj));
152     if (status != napi_ok || obj == nullptr) {
153         NAPI_ERR_LOG("Failed to get taskStatus");
154         return nullptr;
155     }
156     CloudMediaAssetTaskStatus cloudMediaAssetTaskStatus = obj->GetCloudMediaAssetTaskStatus();
157     napi_create_int32(env, static_cast<int32_t>(cloudMediaAssetTaskStatus), &result);
158     return result;
159 }
160 
JSGetErrorCode(napi_env env,napi_callback_info info)161 napi_value CloudMediaAssetStatusNapi::JSGetErrorCode(napi_env env, napi_callback_info info)
162 {
163     napi_status status;
164     napi_value thisVar = nullptr;
165     napi_value result = nullptr;
166     CloudMediaAssetStatusNapi* obj = nullptr;
167 
168     napi_get_undefined(env, &result);
169     GET_JS_OBJ_WITH_ZERO_ARGS(env, info, status, thisVar);
170     if (status != napi_ok || thisVar == nullptr) {
171         NAPI_ERR_LOG("Invalid arguments! status: %{public}d", status);
172         return result;
173     }
174 
175     status = napi_unwrap(env, thisVar, reinterpret_cast<void**>(&obj));
176     if (status != napi_ok || obj == nullptr) {
177         NAPI_ERR_LOG("Failed to get errorCode");
178         return nullptr;
179     }
180     CloudMediaTaskPauseCause cloudMediaTaskPauseCause = obj->GetCloudMediaTaskPauseCause();
181     napi_create_int32(env, static_cast<int32_t>(cloudMediaTaskPauseCause), &result);
182     return result;
183 }
184 
JSGetTaskInfo(napi_env env,napi_callback_info info)185 napi_value CloudMediaAssetStatusNapi::JSGetTaskInfo(napi_env env, napi_callback_info info)
186 {
187     napi_status status;
188     napi_value thisVar = nullptr;
189     napi_value result = nullptr;
190     CloudMediaAssetStatusNapi* obj = nullptr;
191 
192     napi_get_undefined(env, &result);
193     GET_JS_OBJ_WITH_ZERO_ARGS(env, info, status, thisVar);
194     if (status != napi_ok || thisVar == nullptr) {
195         NAPI_ERR_LOG("Invalid arguments! status: %{public}d", status);
196         return result;
197     }
198 
199     status = napi_unwrap(env, thisVar, reinterpret_cast<void**>(&obj));
200     if (status != napi_ok || obj == nullptr) {
201         NAPI_ERR_LOG("Failed to get taskInfo");
202         return nullptr;
203     }
204     std::string taskInfo = obj->GetTaskInfo();
205     napi_create_string_utf8(env, taskInfo.c_str(), NAPI_AUTO_LENGTH, &result);
206     return result;
207 }
208 }