1 /*
2 * Copyright (c) 2022 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 "web_download_delegate.h"
17
18 #include <cstring>
19
20 #include "nweb_c_api.h"
21 #include "nweb_log.h"
22 #include "napi_web_download_item.h"
23 #include "web_download_manager.h"
24 #include "nweb_napi_scope.h"
25
26 namespace OHOS {
27 namespace NWeb {
WebDownloadDelegate(napi_env env)28 WebDownloadDelegate::WebDownloadDelegate(napi_env env)
29 : delegate_(nullptr),
30 download_before_start_callback_(nullptr),
31 download_did_update_callback_(nullptr),
32 download_did_finish_callback_(nullptr),
33 download_did_fail_callback_(nullptr),
34 env_(env)
35 {
36 WVLOG_D("WebDownloadDelegate::WebDownloadDelegate");
37 }
38
~WebDownloadDelegate()39 WebDownloadDelegate::~WebDownloadDelegate()
40 {
41 WVLOG_D("[DOWNLOAD] WebDownloadDelegate::~WebDownloadDelegate");
42 if (download_before_start_callback_) {
43 napi_delete_reference(env_, download_before_start_callback_);
44 }
45 if (download_did_update_callback_) {
46 napi_delete_reference(env_, download_did_update_callback_);
47 }
48 if (download_did_finish_callback_) {
49 napi_delete_reference(env_, download_did_finish_callback_);
50 }
51 if (download_did_fail_callback_) {
52 napi_delete_reference(env_, download_did_fail_callback_);
53 }
54 WebDownloadManager::RemoveDownloadDelegate(this);
55 }
56
RemoveSelfRef()57 void WebDownloadDelegate::RemoveSelfRef()
58 {
59 if (delegate_) {
60 napi_delete_reference(env_, delegate_);
61 delegate_ = nullptr;
62 }
63 }
64
DownloadBeforeStart(WebDownloadItem * webDownloadItem)65 void WebDownloadDelegate::DownloadBeforeStart(WebDownloadItem *webDownloadItem)
66 {
67 WVLOG_D("[DOWNLOAD] WebDownloadDelegate::DownloadBeforeStart");
68 if (!env_) {
69 WVLOG_E("[DOWNLOAD] WebDownloadDelegate::DownloadBeforeStart nil env");
70 return;
71 }
72 size_t paramCount = 1;
73
74 OHOS::NApiScope scope(env_);
75
76 napi_value callbackFunc = nullptr;
77 napi_status status;
78
79 if (!download_before_start_callback_) {
80 WVLOG_E("[DOWNLOAD] downloadBeforeStart nil env");
81 return;
82 }
83 status = napi_get_reference_value(env_, download_before_start_callback_, &callbackFunc);
84 if (status != napi_ok || callbackFunc == nullptr) {
85 WVLOG_E("[DOWNLOAD] get downloadBeforeStart func failed.");
86 return;
87 }
88
89 napi_value webDownloadItemValue = nullptr;
90 napi_create_object(env_, &webDownloadItemValue);
91 napi_wrap(
92 env_, webDownloadItemValue, webDownloadItem,
93 [](napi_env /* env */, void *data, void * /* hint */) {
94 if (data) {
95 WebDownloadItem *downloadItem = (WebDownloadItem *)data;
96 if (!downloadItem->download_item_callback &&
97 !downloadItem->hasStarted &&
98 downloadItem->before_download_callback) {
99 WVLOG_I("[DOWNLOAD] downloadBeforeStart cancel guid: %s.",
100 downloadItem->guid.c_str());
101 WebDownload_CancelBeforeDownload(downloadItem->before_download_callback);
102 }
103 delete downloadItem;
104 }
105 },
106 nullptr, nullptr);
107 NapiWebDownloadItem::DefineProperties(env_, &webDownloadItemValue);
108
109 napi_value result = nullptr;
110 status = napi_call_function(env_, nullptr, callbackFunc, paramCount, &webDownloadItemValue, &result);
111 if (status != napi_status::napi_ok) {
112 WVLOG_E("[DOWNLOAD] call downloadBeforeStart failed.");
113 }
114 }
DownloadDidUpdate(WebDownloadItem * webDownloadItem)115 void WebDownloadDelegate::DownloadDidUpdate(WebDownloadItem *webDownloadItem)
116 {
117 WVLOG_D("[DOWNLOAD] WebDownloadDelegate::DownloadDidUpdate");
118 if (!env_) {
119 WVLOG_E("[DOWNLOAD] WebDownloadDelegate::DownloadDidUpdate nil env.");
120 return;
121 }
122 size_t paramCount = 1;
123
124 OHOS::NApiScope scope(env_);
125
126 napi_value callbackFunc = nullptr;
127 napi_status status;
128
129 if (!download_did_update_callback_) {
130 WVLOG_E("[DOWNLOAD] downloadDidUpdate not exists.");
131 return;
132 }
133 status = napi_get_reference_value(env_, download_did_update_callback_, &callbackFunc);
134 if (status != napi_ok || callbackFunc == nullptr) {
135 WVLOG_E("[DOWNLOAD] get downloadDidUpdate func failed.");
136 return;
137 }
138
139 napi_value webDownloadItemValue = nullptr;
140 napi_create_object(env_, &webDownloadItemValue);
141 napi_wrap(
142 env_, webDownloadItemValue, webDownloadItem,
143 [](napi_env /* env */, void *data, void * /* hint */) {
144 if (data) {
145 WebDownloadItem *downloadItem = (WebDownloadItem *)data;
146 delete downloadItem;
147 }
148 },
149 nullptr, nullptr);
150 NapiWebDownloadItem::DefineProperties(env_, &webDownloadItemValue);
151
152 napi_value result = nullptr;
153 status = napi_call_function(env_, nullptr, callbackFunc, paramCount, &webDownloadItemValue, &result);
154 if (status != napi_status::napi_ok) {
155 WVLOG_E("[DOWNLOAD] call downloadDidUpdate failed.");
156 }
157 }
158
DownloadDidFail(WebDownloadItem * webDownloadItem)159 void WebDownloadDelegate::DownloadDidFail(WebDownloadItem *webDownloadItem)
160 {
161 WVLOG_D("WebDownloadDelegate::DownloadDidFail");
162 if (!env_) {
163 WVLOG_E("[DOWNLOAD] WebDownloadDelegate::DownloadDidFail nil env.");
164 return;
165 }
166 size_t paramCount = 1;
167
168 OHOS::NApiScope scope(env_);
169
170 napi_value callbackFunc = nullptr;
171 napi_status status;
172
173 if (!download_did_fail_callback_) {
174 WVLOG_E("[DOWNLOAD] DownloadDidFail not exists.");
175 return;
176 }
177 status = napi_get_reference_value(env_, download_did_fail_callback_, &callbackFunc);
178 if (status != napi_ok || callbackFunc == nullptr) {
179 WVLOG_E("[DOWNLOAD] get downloadDidFail func failed.");
180 return;
181 }
182
183 napi_value webDownloadItemValue = nullptr;
184 napi_create_object(env_, &webDownloadItemValue);
185 napi_wrap(
186 env_, webDownloadItemValue, webDownloadItem,
187 [](napi_env /* env */, void *data, void * /* hint */) {
188 if (data) {
189 WebDownloadItem *downloadItem = (WebDownloadItem *)data;
190 delete downloadItem;
191 }
192 },
193 nullptr, nullptr);
194 NapiWebDownloadItem::DefineProperties(env_, &webDownloadItemValue);
195
196 napi_value result = nullptr;
197 status = napi_call_function(env_, nullptr, callbackFunc, paramCount, &webDownloadItemValue, &result);
198 if (status != napi_status::napi_ok) {
199 WVLOG_E("[DOWNLOAD] call downloadDidFail failed.");
200 }
201 }
202
DownloadDidFinish(WebDownloadItem * webDownloadItem)203 void WebDownloadDelegate::DownloadDidFinish(WebDownloadItem *webDownloadItem)
204 {
205 WVLOG_D("WebDownloadDelegate::DownloadDidFinish");
206 if (!env_) {
207 WVLOG_E("[DOWNLOAD] WebDownloadDelegate::DownloadDidFinish nil env.");
208 return;
209 }
210 size_t paramCount = 1;
211
212 OHOS::NApiScope scope(env_);
213
214 napi_value callbackFunc = nullptr;
215 napi_status status;
216
217 if (!download_did_finish_callback_) {
218 WVLOG_E("[DOWNLOAD] downloadDidFinish not exists.");
219 return;
220 }
221 status = napi_get_reference_value(env_, download_did_finish_callback_, &callbackFunc);
222 if (status != napi_ok || callbackFunc == nullptr) {
223 WVLOG_E("[DOWNLOAD] get downloadDidFinish func failed.");
224 return;
225 }
226
227 napi_value webDownloadItemValue = nullptr;
228 napi_create_object(env_, &webDownloadItemValue);
229 napi_wrap(
230 env_, webDownloadItemValue, webDownloadItem,
231 [](napi_env /* env */, void *data, void * /* hint */) {
232 if (data) {
233 WebDownloadItem *downloadItem = (WebDownloadItem *)data;
234 delete downloadItem;
235 }
236 },
237 nullptr, nullptr);
238 NapiWebDownloadItem::DefineProperties(env_, &webDownloadItemValue);
239
240 napi_value result = nullptr;
241 status = napi_call_function(env_, nullptr, callbackFunc, paramCount, &webDownloadItemValue, &result);
242 if (status != napi_status::napi_ok) {
243 WVLOG_E("[DOWNLOAD] call downloadDidFinish failed.");
244 }
245 }
246
PutDownloadBeforeStart(napi_env,napi_value callback)247 void WebDownloadDelegate::PutDownloadBeforeStart(napi_env, napi_value callback)
248 {
249 WVLOG_D("WebDownloadDelegate::PutDownloadBeforeStart");
250 napi_status status = napi_create_reference(env_, callback, 1, &download_before_start_callback_);
251 if (status != napi_status::napi_ok) {
252 WVLOG_E("[DOWNLOAD] PutDownloadBeforeStart create reference failed.");
253 }
254 }
255
PutDownloadDidUpdate(napi_env,napi_value callback)256 void WebDownloadDelegate::PutDownloadDidUpdate(napi_env, napi_value callback)
257 {
258 WVLOG_D("[DOWNLOAD] WebDownloadDelegate::PutDownloadDidUpdate");
259 napi_status status = napi_create_reference(env_, callback, 1, &download_did_update_callback_);
260 if (status != napi_status::napi_ok) {
261 WVLOG_E("[DOWNLOAD] PutDownloadDidUpdate create reference failed.");
262 }
263 }
264
PutDownloadDidFinish(napi_env,napi_value callback)265 void WebDownloadDelegate::PutDownloadDidFinish(napi_env, napi_value callback)
266 {
267 WVLOG_D("WebDownloadDelegate::PutDownloadDidFinish");
268 napi_status status = napi_create_reference(env_, callback, 1, &download_did_finish_callback_);
269 if (status != napi_status::napi_ok) {
270 WVLOG_E("[DOWNLOAD] PutDownloadDidFinish create reference failed.");
271 }
272 }
273
PutDownloadDidFail(napi_env,napi_value callback)274 void WebDownloadDelegate::PutDownloadDidFail(napi_env, napi_value callback)
275 {
276 WVLOG_D("WebDownloadDelegate::PutDownloadDidFail");
277 napi_status status = napi_create_reference(env_, callback, 1, &download_did_fail_callback_);
278 if (status != napi_status::napi_ok) {
279 WVLOG_E("[DOWNLOAD] PutDownloadDidFail create reference failed.");
280 }
281 }
282
GetNWebId() const283 int32_t WebDownloadDelegate::GetNWebId() const
284 {
285 return nwebId_;
286 }
287
SetNWebId(int32_t nwebId)288 void WebDownloadDelegate::SetNWebId(int32_t nwebId)
289 {
290 nwebId_ = nwebId;
291 }
292
GetEnv()293 napi_env WebDownloadDelegate::GetEnv()
294 {
295 return env_;
296 }
297 } // namespace NWeb
298 } // namespace OHOS
299