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