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