1/* 2 * Copyright (c) 2023-2024 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 "arkweb_scheme_handler.h" 17 18#include <memory> 19#include <mutex> 20#include <unordered_map> 21#include <vector> 22 23#include "nweb.h" 24#include "nweb_helper.h" 25#include "nweb_log.h" 26 27namespace { 28 29// Run DO macro for every function defined in the API. 30#define FOR_EACH_API_FN(DO) \ 31 DO(OH_ArkWebRequestHeaderList_Destroy); \ 32 DO(OH_ArkWebRequestHeaderList_GetSize); \ 33 DO(OH_ArkWebRequestHeaderList_GetHeader); \ 34 DO(OH_ArkWebResourceRequest_GetMethod); \ 35 DO(OH_ArkWebResourceRequest_GetUrl); \ 36 DO(OH_ArkWebResourceRequest_GetHttpBodyStream); \ 37 DO(OH_ArkWebResourceRequest_DestroyHttpBodyStream); \ 38 DO(OH_ArkWebResourceRequest_GetResourceType); \ 39 DO(OH_ArkWebResourceRequest_GetFrameUrl); \ 40 DO(OH_ArkWebHttpBodyStream_SetReadCallback); \ 41 DO(OH_ArkWebHttpBodyStream_SetUserData); \ 42 DO(OH_ArkWebHttpBodyStream_GetUserData); \ 43 DO(OH_ArkWebHttpBodyStream_Init); \ 44 DO(OH_ArkWebHttpBodyStream_Read); \ 45 DO(OH_ArkWebHttpBodyStream_GetSize); \ 46 DO(OH_ArkWebHttpBodyStream_GetPosition); \ 47 DO(OH_ArkWebHttpBodyStream_IsChunked); \ 48 DO(OH_ArkWebHttpBodyStream_IsEof); \ 49 DO(OH_ArkWebHttpBodyStream_IsInMemory); \ 50 DO(OH_ArkWebResourceRequest_Destroy); \ 51 DO(OH_ArkWebResourceRequest_SetUserData); \ 52 DO(OH_ArkWebResourceRequest_GetUserData); \ 53 DO(OH_ArkWebResourceRequest_GetReferrer); \ 54 DO(OH_ArkWebResourceRequest_GetRequestHeaders); \ 55 DO(OH_ArkWebResourceRequest_IsRedirect); \ 56 DO(OH_ArkWebResourceRequest_IsMainFrame); \ 57 DO(OH_ArkWebResourceRequest_HasGesture); \ 58 DO(OH_ArkWeb_RegisterCustomSchemes); \ 59 DO(OH_ArkWeb_SetSchemeHandler); \ 60 DO(OH_ArkWebServiceWorker_SetSchemeHandler); \ 61 DO(OH_ArkWebServiceWorker_ClearSchemeHandlers); \ 62 DO(OH_ArkWeb_ClearSchemeHandlers); \ 63 DO(OH_ArkWeb_CreateSchemeHandler); \ 64 DO(OH_ArkWeb_DestroySchemeHandler); \ 65 DO(OH_ArkWebSchemeHandler_SetOnRequestStart); \ 66 DO(OH_ArkWebSchemeHandler_SetOnRequestStop); \ 67 DO(OH_ArkWebSchemeHandler_SetUserData); \ 68 DO(OH_ArkWebSchemeHandler_GetUserData); \ 69 DO(OH_ArkWeb_CreateResponse); \ 70 DO(OH_ArkWeb_DestroyResponse); \ 71 DO(OH_ArkWebResponse_GetUrl); \ 72 DO(OH_ArkWebResponse_SetUrl); \ 73 DO(OH_ArkWebResponse_SetError); \ 74 DO(OH_ArkWebResponse_GetError); \ 75 DO(OH_ArkWebResponse_SetStatus); \ 76 DO(OH_ArkWebResponse_GetStatus); \ 77 DO(OH_ArkWebResponse_SetStatusText); \ 78 DO(OH_ArkWebResponse_GetStatusText); \ 79 DO(OH_ArkWebResponse_SetMimeType); \ 80 DO(OH_ArkWebResponse_GetMimeType); \ 81 DO(OH_ArkWebResponse_SetCharset); \ 82 DO(OH_ArkWebResponse_GetCharset); \ 83 DO(OH_ArkWebResponse_SetHeaderByName); \ 84 DO(OH_ArkWebResponse_GetHeaderByName); \ 85 DO(OH_ArkWebResourceHandler_Destroy); \ 86 DO(OH_ArkWebResourceHandler_DidReceiveResponse); \ 87 DO(OH_ArkWebResourceHandler_DidReceiveData); \ 88 DO(OH_ArkWebResourceHandler_DidFinish); \ 89 DO(OH_ArkWebResourceHandler_DidFailWithError); \ 90 DO(OH_ArkWeb_ReleaseString); \ 91 DO(OH_ArkWeb_ReleaseByteArray); \ 92 DO(OH_ArkWebSchemeHandler_SetFromEts) 93 94struct SchemeHandlerApi { 95#define GEN_FN_PTR(fn) decltype(&(fn)) impl_##fn = nullptr 96 FOR_EACH_API_FN(GEN_FN_PTR); 97#undef GEN_FN_PTR 98}; 99 100template<typename Fn> 101void LoadFunction(const char* functionName, Fn* fnOut) 102{ 103 void* fn = OHOS::NWeb::NWebHelper::Instance().LoadFuncSymbol(functionName); 104 if (!fn) { 105 WVLOG_E("%{public}s not found.", functionName); 106 return; 107 } 108 *fnOut = reinterpret_cast<Fn>(fn); 109} 110 111SchemeHandlerApi* g_SchemeHandlerApi = nullptr; 112 113void LoadSchemeHandlerApi(SchemeHandlerApi* api) 114{ 115 // Initialize each function pointer field from the so. 116#define LOAD_FN_PTR(fn) LoadFunction(#fn, &api->impl_##fn) 117 FOR_EACH_API_FN(LOAD_FN_PTR); 118#undef LOAD_FN_PTR 119} 120 121bool EnsureSdkLoaded() 122{ 123 if (g_SchemeHandlerApi) { 124 WVLOG_I("SchemeHandlerApi had loaded."); 125 return true; 126 } 127 128 auto* schemeHandlerApi = new (std::nothrow) SchemeHandlerApi(); 129 if (schemeHandlerApi == nullptr) { 130 WVLOG_I("schemeHandlerApi is nullptr."); 131 return false; 132 } 133 LoadSchemeHandlerApi(schemeHandlerApi); 134 g_SchemeHandlerApi = schemeHandlerApi; 135 return true; 136} 137#undef FOR_EACH_API_FN 138} // namespace 139 140using namespace OHOS; 141void OH_ArkWebRequestHeaderList_Destroy(ArkWeb_RequestHeaderList* requestHeaderList) 142{ 143 if (!g_SchemeHandlerApi || !g_SchemeHandlerApi->impl_OH_ArkWebRequestHeaderList_Destroy) { 144 WVLOG_E("OH_ArkWebRequestHeaderList_Destroy not found."); 145 return; 146 } 147 148 return g_SchemeHandlerApi->impl_OH_ArkWebRequestHeaderList_Destroy(requestHeaderList); 149} 150 151int32_t OH_ArkWebRequestHeaderList_GetSize(const ArkWeb_RequestHeaderList* requestHeaderList) 152{ 153 if (!g_SchemeHandlerApi || !g_SchemeHandlerApi->impl_OH_ArkWebRequestHeaderList_GetSize) { 154 WVLOG_E("OH_ArkWebRequestHeaderList_GetSize not found."); 155 return -1; 156 } 157 158 return g_SchemeHandlerApi->impl_OH_ArkWebRequestHeaderList_GetSize(requestHeaderList); 159} 160 161void OH_ArkWebRequestHeaderList_GetHeader( 162 const ArkWeb_RequestHeaderList* requestHeaderList, int32_t index, char** key, char** value) 163{ 164 if (!g_SchemeHandlerApi || !g_SchemeHandlerApi->impl_OH_ArkWebRequestHeaderList_GetHeader) { 165 WVLOG_E("OH_ArkWebRequestHeaderList_GetHeader not found."); 166 return; 167 } 168 169 return g_SchemeHandlerApi->impl_OH_ArkWebRequestHeaderList_GetHeader(requestHeaderList, index, key, value); 170} 171 172void OH_ArkWebResourceRequest_GetMethod(const ArkWeb_ResourceRequest* resourceRequest, char** method) 173{ 174 if (!g_SchemeHandlerApi || !g_SchemeHandlerApi->impl_OH_ArkWebResourceRequest_GetMethod) { 175 WVLOG_E("OH_ArkWebResourceRequest_GetMethod not found."); 176 return; 177 } 178 179 return g_SchemeHandlerApi->impl_OH_ArkWebResourceRequest_GetMethod(resourceRequest, method); 180} 181 182void OH_ArkWebResourceRequest_GetUrl(const ArkWeb_ResourceRequest* resourceRequest, char** url) 183{ 184 if (!g_SchemeHandlerApi || !g_SchemeHandlerApi->impl_OH_ArkWebResourceRequest_GetUrl) { 185 WVLOG_E("OH_ArkWebResourceRequest_GetUrl not found."); 186 return; 187 } 188 189 return g_SchemeHandlerApi->impl_OH_ArkWebResourceRequest_GetUrl(resourceRequest, url); 190} 191 192void OH_ArkWebResourceRequest_GetHttpBodyStream( 193 const ArkWeb_ResourceRequest* resourceRequest, ArkWeb_HttpBodyStream** httpBodyStream) 194{ 195 if (!g_SchemeHandlerApi || !g_SchemeHandlerApi->impl_OH_ArkWebResourceRequest_GetHttpBodyStream) { 196 WVLOG_E("OH_ArkWebResourceRequest_GetHttpBodyStream not found."); 197 return; 198 } 199 200 return g_SchemeHandlerApi->impl_OH_ArkWebResourceRequest_GetHttpBodyStream(resourceRequest, httpBodyStream); 201} 202 203void OH_ArkWebResourceRequest_DestroyHttpBodyStream(ArkWeb_HttpBodyStream* httpBodyStream) 204{ 205 if (!g_SchemeHandlerApi || !g_SchemeHandlerApi->impl_OH_ArkWebResourceRequest_DestroyHttpBodyStream) { 206 WVLOG_E("OH_ArkWebResourceRequest_DestroyHttpBodyStream not found."); 207 return; 208 } 209 210 return g_SchemeHandlerApi->impl_OH_ArkWebResourceRequest_DestroyHttpBodyStream(httpBodyStream); 211} 212 213int32_t OH_ArkWebResourceRequest_GetResourceType(const ArkWeb_ResourceRequest* resourceRequest) 214{ 215 if (!g_SchemeHandlerApi || !g_SchemeHandlerApi->impl_OH_ArkWebResourceRequest_GetResourceType) { 216 WVLOG_E("OH_ArkWebResourceRequest_GetResourceType not found."); 217 return -1; 218 } 219 220 return g_SchemeHandlerApi->impl_OH_ArkWebResourceRequest_GetResourceType(resourceRequest); 221} 222 223void OH_ArkWebResourceRequest_GetFrameUrl(const ArkWeb_ResourceRequest* resourceRequest, char** frameUrl) 224{ 225 if (!g_SchemeHandlerApi || !g_SchemeHandlerApi->impl_OH_ArkWebResourceRequest_GetFrameUrl) { 226 WVLOG_E("OH_ArkWebResourceRequest_GetFrameUrl not found."); 227 return; 228 } 229 230 return g_SchemeHandlerApi->impl_OH_ArkWebResourceRequest_GetFrameUrl(resourceRequest, frameUrl); 231} 232 233int32_t OH_ArkWebHttpBodyStream_SetUserData(ArkWeb_HttpBodyStream* httpBodyStream, void* userData) 234{ 235 if (!g_SchemeHandlerApi || !g_SchemeHandlerApi->impl_OH_ArkWebHttpBodyStream_SetUserData) { 236 WVLOG_E("OH_ArkWebHttpBodyStream_SetUserData not found."); 237 return ARKWEB_ERROR_UNKNOWN; 238 } 239 return g_SchemeHandlerApi->impl_OH_ArkWebHttpBodyStream_SetUserData(httpBodyStream, userData); 240} 241 242void* OH_ArkWebHttpBodyStream_GetUserData(const ArkWeb_HttpBodyStream* httpBodyStream) 243{ 244 if (!g_SchemeHandlerApi || !g_SchemeHandlerApi->impl_OH_ArkWebHttpBodyStream_GetUserData) { 245 WVLOG_E("OH_ArkWebHttpBodyStream_GetUserData not found."); 246 return nullptr; 247 } 248 return g_SchemeHandlerApi->impl_OH_ArkWebHttpBodyStream_GetUserData(httpBodyStream); 249} 250 251int32_t OH_ArkWebHttpBodyStream_SetReadCallback( 252 ArkWeb_HttpBodyStream* httpBodyStream, ArkWeb_HttpBodyStreamReadCallback readCallback) 253{ 254 if (!g_SchemeHandlerApi || !g_SchemeHandlerApi->impl_OH_ArkWebHttpBodyStream_SetReadCallback) { 255 WVLOG_E("OH_ArkWebHttpBodyStream_SetReadCallback not found."); 256 return ARKWEB_ERROR_UNKNOWN; 257 } 258 259 return g_SchemeHandlerApi->impl_OH_ArkWebHttpBodyStream_SetReadCallback(httpBodyStream, readCallback); 260} 261 262int32_t OH_ArkWebHttpBodyStream_Init( 263 ArkWeb_HttpBodyStream* httpBodyStream, ArkWeb_HttpBodyStreamInitCallback initCallback) 264{ 265 if (!g_SchemeHandlerApi || !g_SchemeHandlerApi->impl_OH_ArkWebHttpBodyStream_Init) { 266 WVLOG_E("OH_ArkWebHttpBodyStream_Init not found."); 267 return ARKWEB_ERROR_UNKNOWN; 268 } 269 270 return g_SchemeHandlerApi->impl_OH_ArkWebHttpBodyStream_Init(httpBodyStream, initCallback); 271} 272 273void OH_ArkWebHttpBodyStream_Read(const ArkWeb_HttpBodyStream* httpBodyStream, uint8_t* buffer, int bufLen) 274{ 275 if (!g_SchemeHandlerApi || !g_SchemeHandlerApi->impl_OH_ArkWebHttpBodyStream_Read) { 276 WVLOG_E("OH_ArkWebHttpBodyStream_Read not found."); 277 return; 278 } 279 280 return g_SchemeHandlerApi->impl_OH_ArkWebHttpBodyStream_Read(httpBodyStream, buffer, bufLen); 281} 282 283uint64_t OH_ArkWebHttpBodyStream_GetSize(const ArkWeb_HttpBodyStream* httpBodyStream) 284{ 285 if (!g_SchemeHandlerApi || !g_SchemeHandlerApi->impl_OH_ArkWebHttpBodyStream_GetSize) { 286 WVLOG_E("OH_ArkWebHttpBodyStream_GetSize not found."); 287 return 0; 288 } 289 290 return g_SchemeHandlerApi->impl_OH_ArkWebHttpBodyStream_GetSize(httpBodyStream); 291} 292 293uint64_t OH_ArkWebHttpBodyStream_GetPosition(const ArkWeb_HttpBodyStream* httpBodyStream) 294{ 295 if (!g_SchemeHandlerApi || !g_SchemeHandlerApi->impl_OH_ArkWebHttpBodyStream_GetPosition) { 296 WVLOG_E("OH_ArkWebHttpBodyStream_GetPosition not found."); 297 return 0; 298 } 299 300 return g_SchemeHandlerApi->impl_OH_ArkWebHttpBodyStream_GetPosition(httpBodyStream); 301} 302 303bool OH_ArkWebHttpBodyStream_IsChunked(const ArkWeb_HttpBodyStream* httpBodyStream) 304{ 305 if (!g_SchemeHandlerApi || !g_SchemeHandlerApi->impl_OH_ArkWebHttpBodyStream_IsChunked) { 306 WVLOG_E("OH_ArkWebHttpBodyStream_IsTrunked not found."); 307 return false; 308 } 309 310 return g_SchemeHandlerApi->impl_OH_ArkWebHttpBodyStream_IsChunked(httpBodyStream); 311} 312 313bool OH_ArkWebHttpBodyStream_IsEof(const ArkWeb_HttpBodyStream* httpBodyStream) 314{ 315 if (!g_SchemeHandlerApi || !g_SchemeHandlerApi->impl_OH_ArkWebHttpBodyStream_IsEof) { 316 WVLOG_E("OH_ArkWebHttpBodyStream_HasNullSource not found."); 317 return false; 318 } 319 320 return g_SchemeHandlerApi->impl_OH_ArkWebHttpBodyStream_IsEof(httpBodyStream); 321} 322 323bool OH_ArkWebHttpBodyStream_IsInMemory(const ArkWeb_HttpBodyStream* httpBodyStream) 324{ 325 if (!g_SchemeHandlerApi || !g_SchemeHandlerApi->impl_OH_ArkWebHttpBodyStream_IsInMemory) { 326 WVLOG_E("OH_ArkWebHttpBodyStream_IsInMemory not found."); 327 return false; 328 } 329 330 return g_SchemeHandlerApi->impl_OH_ArkWebHttpBodyStream_IsInMemory(httpBodyStream); 331} 332 333int32_t OH_ArkWebResourceRequest_Destroy(const ArkWeb_ResourceRequest* resourceRequest) 334{ 335 if (!g_SchemeHandlerApi || !g_SchemeHandlerApi->impl_OH_ArkWebResourceRequest_Destroy) { 336 WVLOG_E("OH_ArkWebResourceRequest_Destroy not found."); 337 return ARKWEB_ERROR_UNKNOWN; 338 } 339 340 return g_SchemeHandlerApi->impl_OH_ArkWebResourceRequest_Destroy(resourceRequest); 341} 342 343void OH_ArkWebResourceRequest_GetReferrer(const ArkWeb_ResourceRequest* resourceRequest, char** referrer) 344{ 345 if (!g_SchemeHandlerApi || !g_SchemeHandlerApi->impl_OH_ArkWebResourceRequest_GetReferrer) { 346 WVLOG_E("OH_ArkWebResourceRequest_GetReferrer not found."); 347 return; 348 } 349 350 return g_SchemeHandlerApi->impl_OH_ArkWebResourceRequest_GetReferrer(resourceRequest, referrer); 351} 352 353int32_t OH_ArkWebResourceRequest_SetUserData(ArkWeb_ResourceRequest* resourceRequest, void* userData) 354{ 355 if (!g_SchemeHandlerApi || !g_SchemeHandlerApi->impl_OH_ArkWebResourceRequest_SetUserData) { 356 WVLOG_E("OH_ArkWebResourceRequest_SetUserData not found."); 357 return ARKWEB_ERROR_UNKNOWN; 358 } 359 360 return g_SchemeHandlerApi->impl_OH_ArkWebResourceRequest_SetUserData(resourceRequest, userData); 361} 362 363void* OH_ArkWebResourceRequest_GetUserData(const ArkWeb_ResourceRequest* resourceRequest) 364{ 365 if (!g_SchemeHandlerApi || !g_SchemeHandlerApi->impl_OH_ArkWebResourceRequest_GetUserData) { 366 WVLOG_E("OH_ArkWebResourceRequest_GetUserData not found."); 367 return nullptr; 368 } 369 370 return g_SchemeHandlerApi->impl_OH_ArkWebResourceRequest_GetUserData(resourceRequest); 371} 372 373void OH_ArkWebResourceRequest_GetRequestHeaders( 374 const ArkWeb_ResourceRequest* resourceRequest, ArkWeb_RequestHeaderList** requestHeaderList) 375{ 376 if (!g_SchemeHandlerApi || !g_SchemeHandlerApi->impl_OH_ArkWebResourceRequest_GetRequestHeaders) { 377 WVLOG_E("OH_ArkWebResourceRequest_GetRequestHeaders not found."); 378 return; 379 } 380 381 return g_SchemeHandlerApi->impl_OH_ArkWebResourceRequest_GetRequestHeaders(resourceRequest, requestHeaderList); 382} 383 384bool OH_ArkWebResourceRequest_IsRedirect(const ArkWeb_ResourceRequest* resourceRequest) 385{ 386 if (!g_SchemeHandlerApi || !g_SchemeHandlerApi->impl_OH_ArkWebResourceRequest_IsRedirect) { 387 WVLOG_E("OH_ArkWebResourceRequest_IsRedirect not found."); 388 return false; 389 } 390 391 return g_SchemeHandlerApi->impl_OH_ArkWebResourceRequest_IsRedirect(resourceRequest); 392} 393 394bool OH_ArkWebResourceRequest_IsMainFrame(const ArkWeb_ResourceRequest* resourceRequest) 395{ 396 if (!g_SchemeHandlerApi || !g_SchemeHandlerApi->impl_OH_ArkWebResourceRequest_IsMainFrame) { 397 WVLOG_E("OH_ArkWebResourceRequest_IsMainFrame not found."); 398 return false; 399 } 400 401 return g_SchemeHandlerApi->impl_OH_ArkWebResourceRequest_IsMainFrame(resourceRequest); 402} 403 404bool OH_ArkWebResourceRequest_HasGesture(const ArkWeb_ResourceRequest* resourceRequest) 405{ 406 if (!g_SchemeHandlerApi || !g_SchemeHandlerApi->impl_OH_ArkWebResourceRequest_HasGesture) { 407 WVLOG_E("OH_ArkWebResourceRequest_HasGesture not found."); 408 return false; 409 } 410 411 return g_SchemeHandlerApi->impl_OH_ArkWebResourceRequest_HasGesture(resourceRequest); 412} 413 414int32_t OH_ArkWeb_RegisterCustomSchemes(const char* scheme, int32_t option) 415{ 416 if (OHOS::NWeb::NWebHelper::Instance().LoadWebEngine(true, false)) { 417 if (!EnsureSdkLoaded()) { 418 WVLOG_E("OH_ArkWeb_RegisterCustomSchemes sdk not loaded."); 419 } 420 } else { 421 WVLOG_E("OH_ArkWeb_RegisterCustomSchemes webEngineHandle is nullptr."); 422 } 423 424 if (!g_SchemeHandlerApi || !g_SchemeHandlerApi->impl_OH_ArkWeb_RegisterCustomSchemes) { 425 WVLOG_E("OH_ArkWeb_RegisterCustomSchemes not found."); 426 return ARKWEB_ERROR_UNKNOWN; 427 } 428 429 return g_SchemeHandlerApi->impl_OH_ArkWeb_RegisterCustomSchemes(scheme, option); 430} 431 432bool OH_ArkWeb_SetSchemeHandler(const char* scheme, const char* webTag, ArkWeb_SchemeHandler* schemeHandler) 433{ 434 if (OHOS::NWeb::NWebHelper::Instance().LoadWebEngine(true, false)) { 435 if (!EnsureSdkLoaded()) { 436 WVLOG_E("scheme_handler sdk not loaded."); 437 } 438 } else { 439 WVLOG_E("scheme_handler webEngineHandle is nullptr."); 440 } 441 if (!g_SchemeHandlerApi || !g_SchemeHandlerApi->impl_OH_ArkWeb_SetSchemeHandler) { 442 WVLOG_E("OH_ArkWeb_SetSchemeHandler not found."); 443 return false; 444 } 445 446 return g_SchemeHandlerApi->impl_OH_ArkWeb_SetSchemeHandler(scheme, webTag, schemeHandler); 447} 448 449bool OH_ArkWebServiceWorker_SetSchemeHandler(const char* scheme, ArkWeb_SchemeHandler* schemeHandler) 450{ 451 if (OHOS::NWeb::NWebHelper::Instance().LoadWebEngine(true, false)) { 452 if (!EnsureSdkLoaded()) { 453 WVLOG_E("scheme_handler sdk not loaded."); 454 } 455 } else { 456 WVLOG_E("scheme_handler webEngineHandle is nullptr."); 457 } 458 if (!g_SchemeHandlerApi || !g_SchemeHandlerApi->impl_OH_ArkWebServiceWorker_SetSchemeHandler) { 459 WVLOG_E("OH_ArkWebServiceWorker_SetSchemeHandler not found."); 460 return false; 461 } 462 463 return g_SchemeHandlerApi->impl_OH_ArkWebServiceWorker_SetSchemeHandler(scheme, schemeHandler); 464} 465 466int32_t OH_ArkWeb_ClearSchemeHandlers(const char* webTag) 467{ 468 if (!g_SchemeHandlerApi || !g_SchemeHandlerApi->impl_OH_ArkWeb_ClearSchemeHandlers) { 469 WVLOG_E("OH_ArkWeb_ClearSchemeHandlers not found."); 470 return ARKWEB_ERROR_UNKNOWN; 471 } 472 473 return g_SchemeHandlerApi->impl_OH_ArkWeb_ClearSchemeHandlers(webTag); 474} 475 476int32_t OH_ArkWebServiceWorker_ClearSchemeHandlers() 477{ 478 if (!g_SchemeHandlerApi || !g_SchemeHandlerApi->impl_OH_ArkWebServiceWorker_ClearSchemeHandlers) { 479 WVLOG_E("OH_ArkWebServiceWorker_ClearSchemeHandlers not found."); 480 return ARKWEB_ERROR_UNKNOWN; 481 } 482 483 return g_SchemeHandlerApi->impl_OH_ArkWebServiceWorker_ClearSchemeHandlers(); 484} 485 486void OH_ArkWeb_CreateSchemeHandler(ArkWeb_SchemeHandler** schemeHandler) 487{ 488 if (OHOS::NWeb::NWebHelper::Instance().LoadWebEngine(true, false)) { 489 if (!EnsureSdkLoaded()) { 490 WVLOG_E("scheme_handler sdk not loaded."); 491 } 492 } else { 493 WVLOG_E("scheme_handler webEngineHandle is nullptr."); 494 } 495 if (!g_SchemeHandlerApi || !g_SchemeHandlerApi->impl_OH_ArkWeb_CreateSchemeHandler) { 496 WVLOG_E("OH_ArkWeb_CreateSchemeHandler not found."); 497 return; 498 } 499 500 return g_SchemeHandlerApi->impl_OH_ArkWeb_CreateSchemeHandler(schemeHandler); 501} 502 503void OH_ArkWeb_DestroySchemeHandler(ArkWeb_SchemeHandler* schemeHandler) 504{ 505 if (!g_SchemeHandlerApi || !g_SchemeHandlerApi->impl_OH_ArkWeb_DestroySchemeHandler) { 506 WVLOG_E("OH_ArkWeb_DestroySchemeHandler not found."); 507 return; 508 } 509 510 return g_SchemeHandlerApi->impl_OH_ArkWeb_DestroySchemeHandler(schemeHandler); 511} 512 513int32_t OH_ArkWebSchemeHandler_SetUserData(ArkWeb_SchemeHandler* schemeHandler, void* userData) 514{ 515 if (!g_SchemeHandlerApi || !g_SchemeHandlerApi->impl_OH_ArkWebSchemeHandler_SetUserData) { 516 WVLOG_E("OH_ArkWebSchemeHandler_SetUserData not found."); 517 return ARKWEB_ERROR_UNKNOWN; 518 } 519 return g_SchemeHandlerApi->impl_OH_ArkWebSchemeHandler_SetUserData(schemeHandler, userData); 520} 521 522void* OH_ArkWebSchemeHandler_GetUserData(const ArkWeb_SchemeHandler* schemeHandler) 523{ 524 if (!g_SchemeHandlerApi || !g_SchemeHandlerApi->impl_OH_ArkWebSchemeHandler_GetUserData) { 525 WVLOG_E("OH_ArkWebSchemeHandler_GetUserData not found."); 526 return nullptr; 527 } 528 return g_SchemeHandlerApi->impl_OH_ArkWebSchemeHandler_GetUserData(schemeHandler); 529} 530 531int32_t OH_ArkWebSchemeHandler_SetOnRequestStart( 532 ArkWeb_SchemeHandler* schemeHandler, ArkWeb_OnRequestStart onRequestStart) 533{ 534 if (!g_SchemeHandlerApi || !g_SchemeHandlerApi->impl_OH_ArkWebSchemeHandler_SetOnRequestStart) { 535 WVLOG_E("OH_ArkWebSchemeHandler_SetOnRequestStart not found."); 536 return ARKWEB_ERROR_UNKNOWN; 537 } 538 539 return g_SchemeHandlerApi->impl_OH_ArkWebSchemeHandler_SetOnRequestStart(schemeHandler, onRequestStart); 540} 541 542int32_t OH_ArkWebSchemeHandler_SetOnRequestStop( 543 ArkWeb_SchemeHandler* schemeHandler, ArkWeb_OnRequestStop onRequestStop) 544{ 545 if (!g_SchemeHandlerApi || !g_SchemeHandlerApi->impl_OH_ArkWebSchemeHandler_SetOnRequestStop) { 546 WVLOG_E("OH_ArkWebSchemeHandler_SetOnRequestStop not found."); 547 return ARKWEB_ERROR_UNKNOWN; 548 } 549 550 return g_SchemeHandlerApi->impl_OH_ArkWebSchemeHandler_SetOnRequestStop(schemeHandler, onRequestStop); 551} 552 553void OH_ArkWeb_CreateResponse(ArkWeb_Response** response) 554{ 555 if (OHOS::NWeb::NWebHelper::Instance().LoadWebEngine(true, false)) { 556 if (!EnsureSdkLoaded()) { 557 WVLOG_E("scheme_handler sdk not loaded."); 558 } 559 } else { 560 WVLOG_E("scheme_handler webEngineHandle is nullptr."); 561 } 562 if (!g_SchemeHandlerApi || !g_SchemeHandlerApi->impl_OH_ArkWeb_CreateResponse) { 563 WVLOG_E("OH_ArkWeb_CreateResponse not found."); 564 return; 565 } 566 567 return g_SchemeHandlerApi->impl_OH_ArkWeb_CreateResponse(response); 568} 569 570void OH_ArkWeb_DestroyResponse(ArkWeb_Response* response) 571{ 572 if (!g_SchemeHandlerApi || !g_SchemeHandlerApi->impl_OH_ArkWeb_DestroyResponse) { 573 WVLOG_E("OH_ArkWeb_DestroyResponse not found."); 574 return; 575 } 576 577 return g_SchemeHandlerApi->impl_OH_ArkWeb_DestroyResponse(response); 578} 579 580int32_t OH_ArkWebResponse_SetUrl(ArkWeb_Response* response, const char* url) 581{ 582 if (!g_SchemeHandlerApi || !g_SchemeHandlerApi->impl_OH_ArkWebResponse_SetUrl) { 583 WVLOG_E("OH_ArkWebResponse_SetUrl not found."); 584 return ARKWEB_ERROR_UNKNOWN; 585 } 586 587 return g_SchemeHandlerApi->impl_OH_ArkWebResponse_SetUrl(response, url); 588} 589 590void OH_ArkWebResponse_GetUrl(const ArkWeb_Response* response, char** url) 591{ 592 if (!g_SchemeHandlerApi || !g_SchemeHandlerApi->impl_OH_ArkWebResponse_GetUrl) { 593 WVLOG_E("OH_ArkWebResponse_GetUrl not found."); 594 return; 595 } 596 597 return g_SchemeHandlerApi->impl_OH_ArkWebResponse_GetUrl(response, url); 598} 599 600int32_t OH_ArkWebResponse_SetError(ArkWeb_Response* response, ArkWeb_NetError errorCode) 601{ 602 if (!g_SchemeHandlerApi || !g_SchemeHandlerApi->impl_OH_ArkWebResponse_SetError) { 603 WVLOG_E("OH_ArkWebResponse_SetError not found."); 604 return ARKWEB_ERROR_UNKNOWN; 605 } 606 607 return g_SchemeHandlerApi->impl_OH_ArkWebResponse_SetError(response, errorCode); 608} 609 610ArkWeb_NetError OH_ArkWebResponse_GetError(const ArkWeb_Response* response) 611{ 612 if (!g_SchemeHandlerApi || !g_SchemeHandlerApi->impl_OH_ArkWebResponse_GetError) { 613 WVLOG_E("OH_ArkWebResponse_GetError not found."); 614 return ARKWEB_ERR_FAILED; 615 } 616 617 return g_SchemeHandlerApi->impl_OH_ArkWebResponse_GetError(response); 618} 619 620int32_t OH_ArkWebResponse_SetStatus(ArkWeb_Response* response, int status) 621{ 622 if (!g_SchemeHandlerApi || !g_SchemeHandlerApi->impl_OH_ArkWebResponse_SetStatus) { 623 WVLOG_E("OH_ArkWebResponse_SetStatus not found."); 624 return ARKWEB_ERROR_UNKNOWN; 625 } 626 627 return g_SchemeHandlerApi->impl_OH_ArkWebResponse_SetStatus(response, status); 628} 629 630int OH_ArkWebResponse_GetStatus(const ArkWeb_Response* response) 631{ 632 if (!g_SchemeHandlerApi || !g_SchemeHandlerApi->impl_OH_ArkWebResponse_GetStatus) { 633 WVLOG_E("OH_ArkWebResponse_GetStatus not found."); 634 return -1; 635 } 636 637 return g_SchemeHandlerApi->impl_OH_ArkWebResponse_GetStatus(response); 638} 639 640int32_t OH_ArkWebResponse_SetStatusText(ArkWeb_Response* response, const char* statusText) 641{ 642 if (!g_SchemeHandlerApi || !g_SchemeHandlerApi->impl_OH_ArkWebResponse_SetStatusText) { 643 WVLOG_E("OH_ArkWebResponse_SetStatusText not found."); 644 return ARKWEB_ERROR_UNKNOWN; 645 } 646 647 return g_SchemeHandlerApi->impl_OH_ArkWebResponse_SetStatusText(response, statusText); 648} 649 650void OH_ArkWebResponse_GetStatusText(const ArkWeb_Response* response, char** statusText) 651{ 652 if (!g_SchemeHandlerApi || !g_SchemeHandlerApi->impl_OH_ArkWebResponse_GetStatusText) { 653 WVLOG_E("OH_ArkWebResponse_GetStatusText not found."); 654 return; 655 } 656 657 return g_SchemeHandlerApi->impl_OH_ArkWebResponse_GetStatusText(response, statusText); 658} 659 660int32_t OH_ArkWebResponse_SetMimeType(ArkWeb_Response* response, const char* mimeType) 661{ 662 if (!g_SchemeHandlerApi || !g_SchemeHandlerApi->impl_OH_ArkWebResponse_SetMimeType) { 663 WVLOG_E("OH_ArkWebResponse_SetMimeType not found."); 664 return ARKWEB_ERROR_UNKNOWN; 665 } 666 667 return g_SchemeHandlerApi->impl_OH_ArkWebResponse_SetMimeType(response, mimeType); 668} 669 670void OH_ArkWebResponse_GetMimeType(const ArkWeb_Response* response, char** mimeType) 671{ 672 if (!g_SchemeHandlerApi || !g_SchemeHandlerApi->impl_OH_ArkWebResponse_GetMimeType) { 673 WVLOG_E("OH_ArkWebResponse_GetMimeType not found."); 674 return; 675 } 676 677 return g_SchemeHandlerApi->impl_OH_ArkWebResponse_GetMimeType(response, mimeType); 678} 679 680int32_t OH_ArkWebResponse_SetCharset(ArkWeb_Response* response, const char* charset) 681{ 682 if (!g_SchemeHandlerApi || !g_SchemeHandlerApi->impl_OH_ArkWebResponse_SetCharset) { 683 WVLOG_E("OH_ArkWebResponse_SetCharset not found."); 684 return ARKWEB_ERROR_UNKNOWN; 685 } 686 687 return g_SchemeHandlerApi->impl_OH_ArkWebResponse_SetCharset(response, charset); 688} 689 690void OH_ArkWebResponse_GetCharset(const ArkWeb_Response* response, char** charset) 691{ 692 if (!g_SchemeHandlerApi || !g_SchemeHandlerApi->impl_OH_ArkWebResponse_GetCharset) { 693 WVLOG_E("OH_ArkWebResponse_GetCharset not found."); 694 return; 695 } 696 697 return g_SchemeHandlerApi->impl_OH_ArkWebResponse_GetCharset(response, charset); 698} 699 700int32_t OH_ArkWebResponse_SetHeaderByName( 701 ArkWeb_Response* response, const char* name, const char* value, bool overwrite) 702{ 703 if (!g_SchemeHandlerApi || !g_SchemeHandlerApi->impl_OH_ArkWebResponse_SetHeaderByName) { 704 WVLOG_E("OH_ArkWebResponse_SetHeaderByName not found."); 705 return ARKWEB_ERROR_UNKNOWN; 706 } 707 708 return g_SchemeHandlerApi->impl_OH_ArkWebResponse_SetHeaderByName(response, name, value, overwrite); 709} 710 711void OH_ArkWebResponse_GetHeaderByName(const ArkWeb_Response* response, const char* name, char** value) 712{ 713 if (!g_SchemeHandlerApi || !g_SchemeHandlerApi->impl_OH_ArkWebResponse_GetHeaderByName) { 714 WVLOG_E("OH_ArkWebResponse_GetHeaderByName not found."); 715 return; 716 } 717 718 return g_SchemeHandlerApi->impl_OH_ArkWebResponse_GetHeaderByName(response, name, value); 719} 720 721int32_t OH_ArkWebResourceHandler_Destroy(const ArkWeb_ResourceHandler* resourceHandler) 722{ 723 if (!g_SchemeHandlerApi || !g_SchemeHandlerApi->impl_OH_ArkWebResourceHandler_Destroy) { 724 WVLOG_E("OH_ArkWebResourceHandler_Destroy not found."); 725 return ARKWEB_ERROR_UNKNOWN; 726 } 727 728 return g_SchemeHandlerApi->impl_OH_ArkWebResourceHandler_Destroy(resourceHandler); 729} 730 731int32_t OH_ArkWebResourceHandler_DidReceiveResponse( 732 const ArkWeb_ResourceHandler* resourceHandler, const ArkWeb_Response* response) 733{ 734 if (!g_SchemeHandlerApi || !g_SchemeHandlerApi->impl_OH_ArkWebResourceHandler_DidReceiveResponse) { 735 WVLOG_E("OH_ArkWebResourceHandler_DidReceiveResponse not found."); 736 return ARKWEB_ERROR_UNKNOWN; 737 } 738 739 return g_SchemeHandlerApi->impl_OH_ArkWebResourceHandler_DidReceiveResponse(resourceHandler, response); 740} 741 742int32_t OH_ArkWebResourceHandler_DidReceiveData( 743 const ArkWeb_ResourceHandler* resourceHandler, const uint8_t* buffer, int64_t bufLen) 744{ 745 if (!g_SchemeHandlerApi || !g_SchemeHandlerApi->impl_OH_ArkWebResourceHandler_DidReceiveData) { 746 WVLOG_E("OH_ArkWebResourceHandler_DidReceiveData not found."); 747 return ARKWEB_ERROR_UNKNOWN; 748 } 749 750 return g_SchemeHandlerApi->impl_OH_ArkWebResourceHandler_DidReceiveData(resourceHandler, buffer, bufLen); 751} 752 753int32_t OH_ArkWebResourceHandler_DidFinish(const ArkWeb_ResourceHandler* resourceHandler) 754{ 755 if (!g_SchemeHandlerApi || !g_SchemeHandlerApi->impl_OH_ArkWebResourceHandler_DidFinish) { 756 WVLOG_E("OH_ArkWeb_ResourceHandler_DidFinish not found."); 757 return ARKWEB_ERROR_UNKNOWN; 758 } 759 760 return g_SchemeHandlerApi->impl_OH_ArkWebResourceHandler_DidFinish(resourceHandler); 761} 762 763int32_t OH_ArkWebResourceHandler_DidFailWithError( 764 const ArkWeb_ResourceHandler* resourceHandler, ArkWeb_NetError errorCode) 765{ 766 if (!g_SchemeHandlerApi || !g_SchemeHandlerApi->impl_OH_ArkWebResourceHandler_DidFailWithError) { 767 WVLOG_E("OH_ArkWeb_ResourceHandler_DidFailWithError not found."); 768 return ARKWEB_ERROR_UNKNOWN; 769 } 770 771 return g_SchemeHandlerApi->impl_OH_ArkWebResourceHandler_DidFailWithError(resourceHandler, errorCode); 772} 773 774void OH_ArkWeb_ReleaseString(char* string) 775{ 776 if (!g_SchemeHandlerApi || !g_SchemeHandlerApi->impl_OH_ArkWeb_ReleaseString) { 777 WVLOG_E("OH_ArkWeb_ReleaseString not found."); 778 return; 779 } 780 781 return g_SchemeHandlerApi->impl_OH_ArkWeb_ReleaseString(string); 782} 783 784void OH_ArkWeb_ReleaseByteArray(uint8_t* byteArray) 785{ 786 if (!g_SchemeHandlerApi || !g_SchemeHandlerApi->impl_OH_ArkWeb_ReleaseByteArray) { 787 WVLOG_E("OH_ArkWeb_ReleaseByteArray not found."); 788 return; 789 } 790 791 return g_SchemeHandlerApi->impl_OH_ArkWeb_ReleaseByteArray(byteArray); 792} 793 794int32_t OH_ArkWebSchemeHandler_SetFromEts( 795 ArkWeb_SchemeHandler* schemeHandler, bool fromEts) 796{ 797 if (!g_SchemeHandlerApi || !g_SchemeHandlerApi->impl_OH_ArkWebSchemeHandler_SetFromEts) { 798 WVLOG_E("impl_OH_ArkWebSchemeHandler_SetFromEts not found."); 799 return ARKWEB_ERROR_UNKNOWN; 800 } 801 802 return g_SchemeHandlerApi->impl_OH_ArkWebSchemeHandler_SetFromEts(schemeHandler, fromEts); 803} 804