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