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