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
26namespace OHOS {
27namespace NWeb {
28WebDownloadDelegate::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
39WebDownloadDelegate::~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
57void WebDownloadDelegate::RemoveSelfRef()
58{
59    if (delegate_) {
60        napi_delete_reference(env_, delegate_);
61        delegate_ = nullptr;
62    }
63}
64
65void 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 = static_cast<WebDownloadItem *>(data);
96                delete downloadItem;
97            }
98        },
99        nullptr, nullptr);
100    NapiWebDownloadItem::DefineProperties(env_, &webDownloadItemValue);
101
102    napi_value result = nullptr;
103    status = napi_call_function(env_, nullptr, callbackFunc, paramCount, &webDownloadItemValue, &result);
104    if (status != napi_status::napi_ok) {
105        WVLOG_E("[DOWNLOAD] call downloadBeforeStart failed.");
106    }
107}
108void WebDownloadDelegate::DownloadDidUpdate(WebDownloadItem *webDownloadItem)
109{
110    WVLOG_D("[DOWNLOAD] WebDownloadDelegate::DownloadDidUpdate");
111    if (!env_) {
112        WVLOG_E("[DOWNLOAD] WebDownloadDelegate::DownloadDidUpdate nil env.");
113        return;
114    }
115    size_t paramCount = 1;
116
117    OHOS::NApiScope scope(env_);
118
119    napi_value callbackFunc = nullptr;
120    napi_status status;
121
122    if (!download_did_update_callback_) {
123        WVLOG_E("[DOWNLOAD] downloadDidUpdate not exists.");
124        return;
125    }
126    status = napi_get_reference_value(env_, download_did_update_callback_, &callbackFunc);
127    if (status != napi_ok || callbackFunc == nullptr) {
128        WVLOG_E("[DOWNLOAD] get downloadDidUpdate func failed.");
129        return;
130    }
131
132    napi_value webDownloadItemValue = nullptr;
133    napi_create_object(env_, &webDownloadItemValue);
134    napi_wrap(
135        env_, webDownloadItemValue, webDownloadItem,
136        [](napi_env                             /* env */, void *data, void * /* hint */) {
137            if (data) {
138                WebDownloadItem *downloadItem = static_cast<WebDownloadItem *>(data);
139                delete downloadItem;
140            }
141        },
142        nullptr, nullptr);
143    NapiWebDownloadItem::DefineProperties(env_, &webDownloadItemValue);
144
145    napi_value result = nullptr;
146    status = napi_call_function(env_, nullptr, callbackFunc, paramCount, &webDownloadItemValue, &result);
147    if (status != napi_status::napi_ok) {
148        WVLOG_E("[DOWNLOAD] call downloadDidUpdate failed.");
149    }
150}
151
152void WebDownloadDelegate::DownloadDidFail(WebDownloadItem *webDownloadItem)
153{
154    WVLOG_D("WebDownloadDelegate::DownloadDidFail");
155    if (!env_) {
156        WVLOG_E("[DOWNLOAD] WebDownloadDelegate::DownloadDidFail nil env.");
157        return;
158    }
159    size_t paramCount = 1;
160
161    OHOS::NApiScope scope(env_);
162
163    napi_value callbackFunc = nullptr;
164    napi_status status;
165
166    if (!download_did_fail_callback_) {
167        WVLOG_E("[DOWNLOAD] DownloadDidFail not exists.");
168        return;
169    }
170    status = napi_get_reference_value(env_, download_did_fail_callback_, &callbackFunc);
171    if (status != napi_ok || callbackFunc == nullptr) {
172        WVLOG_E("[DOWNLOAD] get downloadDidFail func failed.");
173        return;
174    }
175
176    napi_value webDownloadItemValue = nullptr;
177    napi_create_object(env_, &webDownloadItemValue);
178    napi_wrap(
179        env_, webDownloadItemValue, webDownloadItem,
180        [](napi_env                             /* env */, void *data, void * /* hint */) {
181            if (data) {
182                WebDownloadItem *downloadItem = static_cast<WebDownloadItem *>(data);
183                delete downloadItem;
184            }
185        },
186        nullptr, nullptr);
187    NapiWebDownloadItem::DefineProperties(env_, &webDownloadItemValue);
188
189    napi_value result = nullptr;
190    status = napi_call_function(env_, nullptr, callbackFunc, paramCount, &webDownloadItemValue, &result);
191    if (status != napi_status::napi_ok) {
192        WVLOG_E("[DOWNLOAD] call downloadDidFail failed.");
193    }
194}
195
196void WebDownloadDelegate::DownloadDidFinish(WebDownloadItem *webDownloadItem)
197{
198    WVLOG_D("WebDownloadDelegate::DownloadDidFinish");
199    if (!env_) {
200        WVLOG_E("[DOWNLOAD] WebDownloadDelegate::DownloadDidFinish nil env.");
201        return;
202    }
203    size_t paramCount = 1;
204
205    OHOS::NApiScope scope(env_);
206
207    napi_value callbackFunc = nullptr;
208    napi_status status;
209
210    if (!download_did_finish_callback_) {
211        WVLOG_E("[DOWNLOAD] downloadDidFinish not exists.");
212        return;
213    }
214    status = napi_get_reference_value(env_, download_did_finish_callback_, &callbackFunc);
215    if (status != napi_ok || callbackFunc == nullptr) {
216        WVLOG_E("[DOWNLOAD] get downloadDidFinish func failed.");
217        return;
218    }
219
220    napi_value webDownloadItemValue = nullptr;
221    napi_create_object(env_, &webDownloadItemValue);
222    napi_wrap(
223        env_, webDownloadItemValue, webDownloadItem,
224        [](napi_env                             /* env */, void *data, void * /* hint */) {
225            if (data) {
226                WebDownloadItem *downloadItem = static_cast<WebDownloadItem *>(data);
227                delete downloadItem;
228            }
229        },
230        nullptr, nullptr);
231    NapiWebDownloadItem::DefineProperties(env_, &webDownloadItemValue);
232
233    napi_value result = nullptr;
234    status = napi_call_function(env_, nullptr, callbackFunc, paramCount, &webDownloadItemValue, &result);
235    if (status != napi_status::napi_ok) {
236        WVLOG_E("[DOWNLOAD] call downloadDidFinish failed.");
237    }
238}
239
240void WebDownloadDelegate::PutDownloadBeforeStart(napi_env, napi_value callback)
241{
242    WVLOG_D("WebDownloadDelegate::PutDownloadBeforeStart");
243    napi_status status = napi_create_reference(env_, callback, 1, &download_before_start_callback_);
244    if (status != napi_status::napi_ok) {
245        WVLOG_E("[DOWNLOAD] PutDownloadBeforeStart create reference failed.");
246    }
247}
248
249void WebDownloadDelegate::PutDownloadDidUpdate(napi_env, napi_value callback)
250{
251    WVLOG_D("[DOWNLOAD] WebDownloadDelegate::PutDownloadDidUpdate");
252    napi_status status = napi_create_reference(env_, callback, 1, &download_did_update_callback_);
253    if (status != napi_status::napi_ok) {
254        WVLOG_E("[DOWNLOAD] PutDownloadDidUpdate create reference failed.");
255    }
256}
257
258void WebDownloadDelegate::PutDownloadDidFinish(napi_env, napi_value callback)
259{
260    WVLOG_D("WebDownloadDelegate::PutDownloadDidFinish");
261    napi_status status = napi_create_reference(env_, callback, 1, &download_did_finish_callback_);
262    if (status != napi_status::napi_ok) {
263        WVLOG_E("[DOWNLOAD] PutDownloadDidFinish create reference failed.");
264    }
265}
266
267void WebDownloadDelegate::PutDownloadDidFail(napi_env, napi_value callback)
268{
269    WVLOG_D("WebDownloadDelegate::PutDownloadDidFail");
270    napi_status status = napi_create_reference(env_, callback, 1, &download_did_fail_callback_);
271    if (status != napi_status::napi_ok) {
272        WVLOG_E("[DOWNLOAD] PutDownloadDidFail create reference failed.");
273    }
274}
275
276int32_t WebDownloadDelegate::GetNWebId() const
277{
278    return nwebId_;
279}
280
281void WebDownloadDelegate::SetNWebId(int32_t nwebId)
282{
283    nwebId_ = nwebId;
284}
285
286napi_env WebDownloadDelegate::GetEnv()
287{
288    return env_;
289}
290} // namespace NWeb
291} // namespace OHOS
292