10826e83eSopenharmony_ci/*
20826e83eSopenharmony_ci * Copyright (c) 2022 Huawei Device Co., Ltd.
30826e83eSopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
40826e83eSopenharmony_ci * you may not use this file except in compliance with the License.
50826e83eSopenharmony_ci * You may obtain a copy of the License at
60826e83eSopenharmony_ci *
70826e83eSopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0
80826e83eSopenharmony_ci *
90826e83eSopenharmony_ci * Unless required by applicable law or agreed to in writing, software
100826e83eSopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
110826e83eSopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
120826e83eSopenharmony_ci * See the License for the specific language governing permissions and
130826e83eSopenharmony_ci * limitations under the License.
140826e83eSopenharmony_ci */
150826e83eSopenharmony_ci
160826e83eSopenharmony_ci#include "web_download_delegate.h"
170826e83eSopenharmony_ci
180826e83eSopenharmony_ci#include <cstring>
190826e83eSopenharmony_ci
200826e83eSopenharmony_ci#include "nweb_c_api.h"
210826e83eSopenharmony_ci#include "nweb_log.h"
220826e83eSopenharmony_ci#include "napi_web_download_item.h"
230826e83eSopenharmony_ci#include "web_download_manager.h"
240826e83eSopenharmony_ci#include "nweb_napi_scope.h"
250826e83eSopenharmony_ci
260826e83eSopenharmony_cinamespace OHOS {
270826e83eSopenharmony_cinamespace NWeb {
280826e83eSopenharmony_ciWebDownloadDelegate::WebDownloadDelegate(napi_env env)
290826e83eSopenharmony_ci    : delegate_(nullptr),
300826e83eSopenharmony_ci      download_before_start_callback_(nullptr),
310826e83eSopenharmony_ci      download_did_update_callback_(nullptr),
320826e83eSopenharmony_ci      download_did_finish_callback_(nullptr),
330826e83eSopenharmony_ci      download_did_fail_callback_(nullptr),
340826e83eSopenharmony_ci      env_(env)
350826e83eSopenharmony_ci{
360826e83eSopenharmony_ci    WVLOG_D("WebDownloadDelegate::WebDownloadDelegate");
370826e83eSopenharmony_ci}
380826e83eSopenharmony_ci
390826e83eSopenharmony_ciWebDownloadDelegate::~WebDownloadDelegate()
400826e83eSopenharmony_ci{
410826e83eSopenharmony_ci    WVLOG_D("[DOWNLOAD] WebDownloadDelegate::~WebDownloadDelegate");
420826e83eSopenharmony_ci    if (download_before_start_callback_) {
430826e83eSopenharmony_ci        napi_delete_reference(env_, download_before_start_callback_);
440826e83eSopenharmony_ci    }
450826e83eSopenharmony_ci    if (download_did_update_callback_) {
460826e83eSopenharmony_ci        napi_delete_reference(env_, download_did_update_callback_);
470826e83eSopenharmony_ci    }
480826e83eSopenharmony_ci    if (download_did_finish_callback_) {
490826e83eSopenharmony_ci        napi_delete_reference(env_, download_did_finish_callback_);
500826e83eSopenharmony_ci    }
510826e83eSopenharmony_ci    if (download_did_fail_callback_) {
520826e83eSopenharmony_ci        napi_delete_reference(env_, download_did_fail_callback_);
530826e83eSopenharmony_ci    }
540826e83eSopenharmony_ci    WebDownloadManager::RemoveDownloadDelegate(this);
550826e83eSopenharmony_ci}
560826e83eSopenharmony_ci
570826e83eSopenharmony_civoid WebDownloadDelegate::RemoveSelfRef()
580826e83eSopenharmony_ci{
590826e83eSopenharmony_ci    if (delegate_) {
600826e83eSopenharmony_ci        napi_delete_reference(env_, delegate_);
610826e83eSopenharmony_ci        delegate_ = nullptr;
620826e83eSopenharmony_ci    }
630826e83eSopenharmony_ci}
640826e83eSopenharmony_ci
650826e83eSopenharmony_civoid WebDownloadDelegate::DownloadBeforeStart(WebDownloadItem *webDownloadItem)
660826e83eSopenharmony_ci{
670826e83eSopenharmony_ci    WVLOG_D("[DOWNLOAD] WebDownloadDelegate::DownloadBeforeStart");
680826e83eSopenharmony_ci    if (!env_) {
690826e83eSopenharmony_ci        WVLOG_E("[DOWNLOAD] WebDownloadDelegate::DownloadBeforeStart nil env");
700826e83eSopenharmony_ci        return;
710826e83eSopenharmony_ci    }
720826e83eSopenharmony_ci    size_t paramCount = 1;
730826e83eSopenharmony_ci
740826e83eSopenharmony_ci    OHOS::NApiScope scope(env_);
750826e83eSopenharmony_ci
760826e83eSopenharmony_ci    napi_value callbackFunc = nullptr;
770826e83eSopenharmony_ci    napi_status status;
780826e83eSopenharmony_ci
790826e83eSopenharmony_ci    if (!download_before_start_callback_) {
800826e83eSopenharmony_ci        WVLOG_E("[DOWNLOAD] downloadBeforeStart nil env");
810826e83eSopenharmony_ci        return;
820826e83eSopenharmony_ci    }
830826e83eSopenharmony_ci    status = napi_get_reference_value(env_, download_before_start_callback_, &callbackFunc);
840826e83eSopenharmony_ci    if (status != napi_ok || callbackFunc == nullptr) {
850826e83eSopenharmony_ci        WVLOG_E("[DOWNLOAD] get downloadBeforeStart func failed.");
860826e83eSopenharmony_ci        return;
870826e83eSopenharmony_ci    }
880826e83eSopenharmony_ci
890826e83eSopenharmony_ci    napi_value webDownloadItemValue = nullptr;
900826e83eSopenharmony_ci    napi_create_object(env_, &webDownloadItemValue);
910826e83eSopenharmony_ci    napi_wrap(
920826e83eSopenharmony_ci        env_, webDownloadItemValue, webDownloadItem,
930826e83eSopenharmony_ci        [](napi_env                             /* env */, void *data, void * /* hint */) {
940826e83eSopenharmony_ci            if (data) {
950826e83eSopenharmony_ci                WebDownloadItem *downloadItem = static_cast<WebDownloadItem *>(data);
960826e83eSopenharmony_ci                delete downloadItem;
970826e83eSopenharmony_ci            }
980826e83eSopenharmony_ci        },
990826e83eSopenharmony_ci        nullptr, nullptr);
1000826e83eSopenharmony_ci    NapiWebDownloadItem::DefineProperties(env_, &webDownloadItemValue);
1010826e83eSopenharmony_ci
1020826e83eSopenharmony_ci    napi_value result = nullptr;
1030826e83eSopenharmony_ci    status = napi_call_function(env_, nullptr, callbackFunc, paramCount, &webDownloadItemValue, &result);
1040826e83eSopenharmony_ci    if (status != napi_status::napi_ok) {
1050826e83eSopenharmony_ci        WVLOG_E("[DOWNLOAD] call downloadBeforeStart failed.");
1060826e83eSopenharmony_ci    }
1070826e83eSopenharmony_ci}
1080826e83eSopenharmony_civoid WebDownloadDelegate::DownloadDidUpdate(WebDownloadItem *webDownloadItem)
1090826e83eSopenharmony_ci{
1100826e83eSopenharmony_ci    WVLOG_D("[DOWNLOAD] WebDownloadDelegate::DownloadDidUpdate");
1110826e83eSopenharmony_ci    if (!env_) {
1120826e83eSopenharmony_ci        WVLOG_E("[DOWNLOAD] WebDownloadDelegate::DownloadDidUpdate nil env.");
1130826e83eSopenharmony_ci        return;
1140826e83eSopenharmony_ci    }
1150826e83eSopenharmony_ci    size_t paramCount = 1;
1160826e83eSopenharmony_ci
1170826e83eSopenharmony_ci    OHOS::NApiScope scope(env_);
1180826e83eSopenharmony_ci
1190826e83eSopenharmony_ci    napi_value callbackFunc = nullptr;
1200826e83eSopenharmony_ci    napi_status status;
1210826e83eSopenharmony_ci
1220826e83eSopenharmony_ci    if (!download_did_update_callback_) {
1230826e83eSopenharmony_ci        WVLOG_E("[DOWNLOAD] downloadDidUpdate not exists.");
1240826e83eSopenharmony_ci        return;
1250826e83eSopenharmony_ci    }
1260826e83eSopenharmony_ci    status = napi_get_reference_value(env_, download_did_update_callback_, &callbackFunc);
1270826e83eSopenharmony_ci    if (status != napi_ok || callbackFunc == nullptr) {
1280826e83eSopenharmony_ci        WVLOG_E("[DOWNLOAD] get downloadDidUpdate func failed.");
1290826e83eSopenharmony_ci        return;
1300826e83eSopenharmony_ci    }
1310826e83eSopenharmony_ci
1320826e83eSopenharmony_ci    napi_value webDownloadItemValue = nullptr;
1330826e83eSopenharmony_ci    napi_create_object(env_, &webDownloadItemValue);
1340826e83eSopenharmony_ci    napi_wrap(
1350826e83eSopenharmony_ci        env_, webDownloadItemValue, webDownloadItem,
1360826e83eSopenharmony_ci        [](napi_env                             /* env */, void *data, void * /* hint */) {
1370826e83eSopenharmony_ci            if (data) {
1380826e83eSopenharmony_ci                WebDownloadItem *downloadItem = static_cast<WebDownloadItem *>(data);
1390826e83eSopenharmony_ci                delete downloadItem;
1400826e83eSopenharmony_ci            }
1410826e83eSopenharmony_ci        },
1420826e83eSopenharmony_ci        nullptr, nullptr);
1430826e83eSopenharmony_ci    NapiWebDownloadItem::DefineProperties(env_, &webDownloadItemValue);
1440826e83eSopenharmony_ci
1450826e83eSopenharmony_ci    napi_value result = nullptr;
1460826e83eSopenharmony_ci    status = napi_call_function(env_, nullptr, callbackFunc, paramCount, &webDownloadItemValue, &result);
1470826e83eSopenharmony_ci    if (status != napi_status::napi_ok) {
1480826e83eSopenharmony_ci        WVLOG_E("[DOWNLOAD] call downloadDidUpdate failed.");
1490826e83eSopenharmony_ci    }
1500826e83eSopenharmony_ci}
1510826e83eSopenharmony_ci
1520826e83eSopenharmony_civoid WebDownloadDelegate::DownloadDidFail(WebDownloadItem *webDownloadItem)
1530826e83eSopenharmony_ci{
1540826e83eSopenharmony_ci    WVLOG_D("WebDownloadDelegate::DownloadDidFail");
1550826e83eSopenharmony_ci    if (!env_) {
1560826e83eSopenharmony_ci        WVLOG_E("[DOWNLOAD] WebDownloadDelegate::DownloadDidFail nil env.");
1570826e83eSopenharmony_ci        return;
1580826e83eSopenharmony_ci    }
1590826e83eSopenharmony_ci    size_t paramCount = 1;
1600826e83eSopenharmony_ci
1610826e83eSopenharmony_ci    OHOS::NApiScope scope(env_);
1620826e83eSopenharmony_ci
1630826e83eSopenharmony_ci    napi_value callbackFunc = nullptr;
1640826e83eSopenharmony_ci    napi_status status;
1650826e83eSopenharmony_ci
1660826e83eSopenharmony_ci    if (!download_did_fail_callback_) {
1670826e83eSopenharmony_ci        WVLOG_E("[DOWNLOAD] DownloadDidFail not exists.");
1680826e83eSopenharmony_ci        return;
1690826e83eSopenharmony_ci    }
1700826e83eSopenharmony_ci    status = napi_get_reference_value(env_, download_did_fail_callback_, &callbackFunc);
1710826e83eSopenharmony_ci    if (status != napi_ok || callbackFunc == nullptr) {
1720826e83eSopenharmony_ci        WVLOG_E("[DOWNLOAD] get downloadDidFail func failed.");
1730826e83eSopenharmony_ci        return;
1740826e83eSopenharmony_ci    }
1750826e83eSopenharmony_ci
1760826e83eSopenharmony_ci    napi_value webDownloadItemValue = nullptr;
1770826e83eSopenharmony_ci    napi_create_object(env_, &webDownloadItemValue);
1780826e83eSopenharmony_ci    napi_wrap(
1790826e83eSopenharmony_ci        env_, webDownloadItemValue, webDownloadItem,
1800826e83eSopenharmony_ci        [](napi_env                             /* env */, void *data, void * /* hint */) {
1810826e83eSopenharmony_ci            if (data) {
1820826e83eSopenharmony_ci                WebDownloadItem *downloadItem = static_cast<WebDownloadItem *>(data);
1830826e83eSopenharmony_ci                delete downloadItem;
1840826e83eSopenharmony_ci            }
1850826e83eSopenharmony_ci        },
1860826e83eSopenharmony_ci        nullptr, nullptr);
1870826e83eSopenharmony_ci    NapiWebDownloadItem::DefineProperties(env_, &webDownloadItemValue);
1880826e83eSopenharmony_ci
1890826e83eSopenharmony_ci    napi_value result = nullptr;
1900826e83eSopenharmony_ci    status = napi_call_function(env_, nullptr, callbackFunc, paramCount, &webDownloadItemValue, &result);
1910826e83eSopenharmony_ci    if (status != napi_status::napi_ok) {
1920826e83eSopenharmony_ci        WVLOG_E("[DOWNLOAD] call downloadDidFail failed.");
1930826e83eSopenharmony_ci    }
1940826e83eSopenharmony_ci}
1950826e83eSopenharmony_ci
1960826e83eSopenharmony_civoid WebDownloadDelegate::DownloadDidFinish(WebDownloadItem *webDownloadItem)
1970826e83eSopenharmony_ci{
1980826e83eSopenharmony_ci    WVLOG_D("WebDownloadDelegate::DownloadDidFinish");
1990826e83eSopenharmony_ci    if (!env_) {
2000826e83eSopenharmony_ci        WVLOG_E("[DOWNLOAD] WebDownloadDelegate::DownloadDidFinish nil env.");
2010826e83eSopenharmony_ci        return;
2020826e83eSopenharmony_ci    }
2030826e83eSopenharmony_ci    size_t paramCount = 1;
2040826e83eSopenharmony_ci
2050826e83eSopenharmony_ci    OHOS::NApiScope scope(env_);
2060826e83eSopenharmony_ci
2070826e83eSopenharmony_ci    napi_value callbackFunc = nullptr;
2080826e83eSopenharmony_ci    napi_status status;
2090826e83eSopenharmony_ci
2100826e83eSopenharmony_ci    if (!download_did_finish_callback_) {
2110826e83eSopenharmony_ci        WVLOG_E("[DOWNLOAD] downloadDidFinish not exists.");
2120826e83eSopenharmony_ci        return;
2130826e83eSopenharmony_ci    }
2140826e83eSopenharmony_ci    status = napi_get_reference_value(env_, download_did_finish_callback_, &callbackFunc);
2150826e83eSopenharmony_ci    if (status != napi_ok || callbackFunc == nullptr) {
2160826e83eSopenharmony_ci        WVLOG_E("[DOWNLOAD] get downloadDidFinish func failed.");
2170826e83eSopenharmony_ci        return;
2180826e83eSopenharmony_ci    }
2190826e83eSopenharmony_ci
2200826e83eSopenharmony_ci    napi_value webDownloadItemValue = nullptr;
2210826e83eSopenharmony_ci    napi_create_object(env_, &webDownloadItemValue);
2220826e83eSopenharmony_ci    napi_wrap(
2230826e83eSopenharmony_ci        env_, webDownloadItemValue, webDownloadItem,
2240826e83eSopenharmony_ci        [](napi_env                             /* env */, void *data, void * /* hint */) {
2250826e83eSopenharmony_ci            if (data) {
2260826e83eSopenharmony_ci                WebDownloadItem *downloadItem = static_cast<WebDownloadItem *>(data);
2270826e83eSopenharmony_ci                delete downloadItem;
2280826e83eSopenharmony_ci            }
2290826e83eSopenharmony_ci        },
2300826e83eSopenharmony_ci        nullptr, nullptr);
2310826e83eSopenharmony_ci    NapiWebDownloadItem::DefineProperties(env_, &webDownloadItemValue);
2320826e83eSopenharmony_ci
2330826e83eSopenharmony_ci    napi_value result = nullptr;
2340826e83eSopenharmony_ci    status = napi_call_function(env_, nullptr, callbackFunc, paramCount, &webDownloadItemValue, &result);
2350826e83eSopenharmony_ci    if (status != napi_status::napi_ok) {
2360826e83eSopenharmony_ci        WVLOG_E("[DOWNLOAD] call downloadDidFinish failed.");
2370826e83eSopenharmony_ci    }
2380826e83eSopenharmony_ci}
2390826e83eSopenharmony_ci
2400826e83eSopenharmony_civoid WebDownloadDelegate::PutDownloadBeforeStart(napi_env, napi_value callback)
2410826e83eSopenharmony_ci{
2420826e83eSopenharmony_ci    WVLOG_D("WebDownloadDelegate::PutDownloadBeforeStart");
2430826e83eSopenharmony_ci    napi_status status = napi_create_reference(env_, callback, 1, &download_before_start_callback_);
2440826e83eSopenharmony_ci    if (status != napi_status::napi_ok) {
2450826e83eSopenharmony_ci        WVLOG_E("[DOWNLOAD] PutDownloadBeforeStart create reference failed.");
2460826e83eSopenharmony_ci    }
2470826e83eSopenharmony_ci}
2480826e83eSopenharmony_ci
2490826e83eSopenharmony_civoid WebDownloadDelegate::PutDownloadDidUpdate(napi_env, napi_value callback)
2500826e83eSopenharmony_ci{
2510826e83eSopenharmony_ci    WVLOG_D("[DOWNLOAD] WebDownloadDelegate::PutDownloadDidUpdate");
2520826e83eSopenharmony_ci    napi_status status = napi_create_reference(env_, callback, 1, &download_did_update_callback_);
2530826e83eSopenharmony_ci    if (status != napi_status::napi_ok) {
2540826e83eSopenharmony_ci        WVLOG_E("[DOWNLOAD] PutDownloadDidUpdate create reference failed.");
2550826e83eSopenharmony_ci    }
2560826e83eSopenharmony_ci}
2570826e83eSopenharmony_ci
2580826e83eSopenharmony_civoid WebDownloadDelegate::PutDownloadDidFinish(napi_env, napi_value callback)
2590826e83eSopenharmony_ci{
2600826e83eSopenharmony_ci    WVLOG_D("WebDownloadDelegate::PutDownloadDidFinish");
2610826e83eSopenharmony_ci    napi_status status = napi_create_reference(env_, callback, 1, &download_did_finish_callback_);
2620826e83eSopenharmony_ci    if (status != napi_status::napi_ok) {
2630826e83eSopenharmony_ci        WVLOG_E("[DOWNLOAD] PutDownloadDidFinish create reference failed.");
2640826e83eSopenharmony_ci    }
2650826e83eSopenharmony_ci}
2660826e83eSopenharmony_ci
2670826e83eSopenharmony_civoid WebDownloadDelegate::PutDownloadDidFail(napi_env, napi_value callback)
2680826e83eSopenharmony_ci{
2690826e83eSopenharmony_ci    WVLOG_D("WebDownloadDelegate::PutDownloadDidFail");
2700826e83eSopenharmony_ci    napi_status status = napi_create_reference(env_, callback, 1, &download_did_fail_callback_);
2710826e83eSopenharmony_ci    if (status != napi_status::napi_ok) {
2720826e83eSopenharmony_ci        WVLOG_E("[DOWNLOAD] PutDownloadDidFail create reference failed.");
2730826e83eSopenharmony_ci    }
2740826e83eSopenharmony_ci}
2750826e83eSopenharmony_ci
2760826e83eSopenharmony_ciint32_t WebDownloadDelegate::GetNWebId() const
2770826e83eSopenharmony_ci{
2780826e83eSopenharmony_ci    return nwebId_;
2790826e83eSopenharmony_ci}
2800826e83eSopenharmony_ci
2810826e83eSopenharmony_civoid WebDownloadDelegate::SetNWebId(int32_t nwebId)
2820826e83eSopenharmony_ci{
2830826e83eSopenharmony_ci    nwebId_ = nwebId;
2840826e83eSopenharmony_ci}
2850826e83eSopenharmony_ci
2860826e83eSopenharmony_cinapi_env WebDownloadDelegate::GetEnv()
2870826e83eSopenharmony_ci{
2880826e83eSopenharmony_ci    return env_;
2890826e83eSopenharmony_ci}
2900826e83eSopenharmony_ci} // namespace NWeb
2910826e83eSopenharmony_ci} // namespace OHOS
292