1 /* 2 * Copyright (c) 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 "webview_message_ffi.h" 17 18 #include "webview_controller_impl.h" 19 #include "webview_function.h" 20 #include "webview_utils.h" 21 #include "webview_javascript_execute_callback.h" 22 #include "nweb_helper.h" 23 #include "nweb_init_params.h" 24 #include "web_errors.h" 25 #include "webview_log.h" 26 #include "parameters.h" 27 #include "pixel_map.h" 28 #include "cj_lambda.h" 29 30 using namespace OHOS::FFI; 31 using namespace OHOS::NWeb; 32 33 namespace OHOS { 34 namespace Webview { 35 36 extern "C" { 37 // WebMessagePort FfiOHOSWebMessagePortPostMessageEvent(int64_t msgPortId,char * stringValue,int32_t * errCode)38 void FfiOHOSWebMessagePortPostMessageEvent(int64_t msgPortId, char* stringValue, int32_t *errCode) 39 { 40 WEBVIEWLOGD("message port post message"); 41 auto webMsg = std::make_shared<OHOS::NWeb::NWebMessage>(NWebValue::Type::NONE); 42 std::string message(stringValue); 43 webMsg->SetType(NWebValue::Type::STRING); 44 webMsg->SetString(message); 45 WebMessagePortImpl *msgPort = FFIData::GetData<WebMessagePortImpl>(msgPortId); 46 if (msgPort == nullptr) { 47 WEBVIEWLOGE("post message failed, ffi unwrap msg port failed"); 48 *errCode = NWebError::CAN_NOT_POST_MESSAGE; 49 return; 50 } 51 *errCode = msgPort->PostPortMessage(webMsg); 52 return; 53 } 54 FfiOHOSWebMessagePortPostMessageEventArr(int64_t msgPortId,CArrUI8 arrBuf,int32_t * errCode)55 void FfiOHOSWebMessagePortPostMessageEventArr(int64_t msgPortId, CArrUI8 arrBuf, int32_t *errCode) 56 { 57 WEBVIEWLOGD("message port post message"); 58 auto webMsg = std::make_shared<OHOS::NWeb::NWebMessage>(NWebValue::Type::NONE); 59 std::vector<uint8_t> vecData(arrBuf.head, arrBuf.head + arrBuf.size); 60 webMsg->SetType(NWebValue::Type::BINARY); 61 webMsg->SetBinary(vecData); 62 WebMessagePortImpl *msgPort = FFIData::GetData<WebMessagePortImpl>(msgPortId); 63 if (msgPort == nullptr) { 64 WEBVIEWLOGE("post message failed, ffi unwrap msg port failed"); 65 *errCode = NWebError::CAN_NOT_POST_MESSAGE; 66 return; 67 } 68 *errCode = msgPort->PostPortMessage(webMsg); 69 return; 70 } 71 FfiOHOSWebMessagePortPostMessageEventExt(int64_t msgPortId,int64_t msgExtId,int32_t * errCode)72 void FfiOHOSWebMessagePortPostMessageEventExt(int64_t msgPortId, int64_t msgExtId, int32_t *errCode) 73 { 74 WEBVIEWLOGD("message PostMessageEventExt start"); 75 WebMessageExtImpl* webMessageExt = FFIData::GetData<WebMessageExtImpl>(msgExtId); 76 if (webMessageExt == nullptr) { 77 WEBVIEWLOGE("FfiOHOSWebMessagePortPostMessageEventExt error"); 78 *errCode = NWebError::PARAM_CHECK_ERROR; 79 return; 80 } 81 WebMessagePortImpl *msgPort = FFIData::GetData<WebMessagePortImpl>(msgPortId); 82 if (msgPort == nullptr) { 83 WEBVIEWLOGE("post message failed, ffi unwrap msg port failed"); 84 *errCode = NWebError::CAN_NOT_POST_MESSAGE; 85 return; 86 } 87 if (!msgPort->IsExtentionType()) { 88 *errCode = NWebError::PARAM_CHECK_ERROR; 89 return; 90 } 91 *errCode = msgPort->PostPortMessage(webMessageExt->GetData()); 92 return; 93 } 94 FfiOHOSWebMessagePortIsExtentionType(int64_t msgPortId)95 bool FfiOHOSWebMessagePortIsExtentionType(int64_t msgPortId) 96 { 97 WebMessagePortImpl *msgPort = FFIData::GetData<WebMessagePortImpl>(msgPortId); 98 if (msgPort == nullptr) { 99 WEBVIEWLOGE("post message failed, ffi unwrap msg port failed"); 100 return false; 101 } 102 return msgPort->IsExtentionType(); 103 } 104 FfiOHOSWebMessagePortOnMessageEvent(int64_t msgPortId,void (* callback)(RetWebMessage),int32_t * errCode)105 void FfiOHOSWebMessagePortOnMessageEvent(int64_t msgPortId, void (*callback)(RetWebMessage), int32_t *errCode) 106 { 107 WEBVIEWLOGD("message port set OnMessageEvent callback"); 108 std::function<void(RetWebMessage)> onMsgEventFunc = CJLambda::Create(callback); 109 auto callbackImpl = std::make_shared<NWebMessageCallbackImpl>(onMsgEventFunc); 110 WebMessagePortImpl *msgPort = FFIData::GetData<WebMessagePortImpl>(msgPortId); 111 if (msgPort == nullptr) { 112 WEBVIEWLOGE("post message failed, ffi unwrap msg port failed"); 113 *errCode = NWebError::CAN_NOT_REGISTER_MESSAGE_EVENT; 114 return; 115 } 116 *errCode = msgPort->SetPortMessageCallback(callbackImpl); 117 return; 118 } 119 FfiOHOSWebMessagePortOnMessageEventExt(int64_t msgPortId,void (* callback)(int64_t),int32_t * errCode)120 void FfiOHOSWebMessagePortOnMessageEventExt(int64_t msgPortId, void (*callback)(int64_t), int32_t *errCode) 121 { 122 WEBVIEWLOGD("message port set OnMessageEventExt callback"); 123 std::function<void(int64_t)> onMsgEventFunc = CJLambda::Create(callback); 124 auto callbackImpl = std::make_shared<NWebWebMessageExtCallbackImpl>(onMsgEventFunc); 125 WebMessagePortImpl *msgPort = FFIData::GetData<WebMessagePortImpl>(msgPortId); 126 if (msgPort == nullptr) { 127 WEBVIEWLOGE("post message failed, ffi unwrap msg port failed"); 128 *errCode = NWebError::CAN_NOT_REGISTER_MESSAGE_EVENT; 129 return; 130 } 131 *errCode = msgPort->SetPortMessageCallback(callbackImpl); 132 return; 133 } 134 FfiOHOSWebMessagePortClose(int64_t msgPortId,int32_t * errCode)135 void FfiOHOSWebMessagePortClose(int64_t msgPortId, int32_t *errCode) 136 { 137 WebMessagePortImpl *msgPort = FFIData::GetData<WebMessagePortImpl>(msgPortId); 138 if (msgPort == nullptr) { 139 WEBVIEWLOGE("close message failed, ffi unwrap msg port failed"); 140 return; 141 } 142 *errCode = msgPort->ClosePort(); 143 return; 144 } 145 // WebMessageExt FfiOHOSWebMessageExtImplConstructor()146 int64_t FfiOHOSWebMessageExtImplConstructor() 147 { 148 auto webMsg = std::make_shared<OHOS::NWeb::NWebMessage>(NWebValue::Type::NONE); 149 WebMessageExtImpl* nativeWebMessageExtImpl = FFIData::Create<WebMessageExtImpl>(webMsg); 150 if (nativeWebMessageExtImpl == nullptr) { 151 WEBVIEWLOGE("new webMessageExt failed"); 152 return -1; 153 } 154 return nativeWebMessageExtImpl->GetID(); 155 } 156 FfiOHOSWebMessageExtImplGetType(int64_t msgExtId,int32_t * errCode)157 int32_t FfiOHOSWebMessageExtImplGetType(int64_t msgExtId, int32_t *errCode) 158 { 159 WEBVIEWLOGD("FfiOHOSWebMessageExtImplGetType::GetType start"); 160 WebMessageExtImpl* webMessageExt = FFIData::GetData<WebMessageExtImpl>(msgExtId); 161 if (webMessageExt == nullptr) { 162 WEBVIEWLOGE("FfiOHOSWebMessageExtImplGetType::GetType error"); 163 *errCode = NWebError::PARAM_CHECK_ERROR; 164 return -1; 165 } 166 int32_t type = webMessageExt->GetType(); 167 *errCode = NWebError::NO_ERROR; 168 return type; 169 } 170 FfiOHOSWebMessageExtImplGetString(int64_t msgExtId,int32_t * errCode)171 char* FfiOHOSWebMessageExtImplGetString(int64_t msgExtId, int32_t *errCode) 172 { 173 WEBVIEWLOGD("FfiOHOSWebMessageExtImplGetString::GetString start"); 174 WebMessageExtImpl* webMessageExt = FFIData::GetData<WebMessageExtImpl>(msgExtId); 175 if (webMessageExt == nullptr) { 176 WEBVIEWLOGE("FfiOHOSWebMessageExtImplGetString::GetString error"); 177 *errCode = NWebError::INIT_ERROR; 178 return nullptr; 179 } 180 181 if (webMessageExt->GetType() != static_cast<int32_t>(WebMessageType::STRING)) { 182 *errCode = NWebError::TYPE_NOT_MATCH_WITCH_VALUE; 183 return nullptr; 184 } 185 auto data = webMessageExt->GetData(); 186 if (data == nullptr) { 187 WEBVIEWLOGE("FfiOHOSWebMessageExtImplGetString::GetString error"); 188 *errCode = NWebError::INIT_ERROR; 189 return nullptr; 190 } 191 std::string msgStr = data->GetString(); 192 *errCode = NWebError::NO_ERROR; 193 return MallocCString(msgStr); 194 } 195 FfiOHOSWebMessageExtImplGetNumber(int64_t msgExtId,int32_t * errCode)196 RetNumber FfiOHOSWebMessageExtImplGetNumber(int64_t msgExtId, int32_t *errCode) 197 { 198 WEBVIEWLOGD("FfiOHOSWebMessageExtImplGetNumber::GetNumber start"); 199 WebMessageExtImpl* webMessageExt = FFIData::GetData<WebMessageExtImpl>(msgExtId); 200 RetNumber ret = { .numberInt = 0, .numberDouble = 0.0 }; 201 if (webMessageExt == nullptr) { 202 WEBVIEWLOGE("FfiOHOSWebMessageExtImplGetNumber::GetNumber error"); 203 *errCode = NWebError::INIT_ERROR; 204 return ret; 205 } 206 207 if (webMessageExt->GetType() != static_cast<int32_t>(WebMessageType::NUMBER)) { 208 *errCode = NWebError::TYPE_NOT_MATCH_WITCH_VALUE; 209 return ret; 210 } 211 auto data = webMessageExt->GetData(); 212 if (data == nullptr) { 213 WEBVIEWLOGE("FfiOHOSWebMessageExtImplGetNumber::GetNumber error"); 214 *errCode = NWebError::INIT_ERROR; 215 return ret; 216 } 217 if (data->GetType() == NWebValue::Type::INTEGER) { 218 ret.numberInt = data->GetInt64(); 219 } else { 220 ret.numberDouble = data->GetDouble(); 221 } 222 return ret; 223 } 224 FfiOHOSWebMessageExtImplGetBoolean(int64_t msgExtId,int32_t * errCode)225 bool FfiOHOSWebMessageExtImplGetBoolean(int64_t msgExtId, int32_t *errCode) 226 { 227 WEBVIEWLOGD("FfiOHOSWebMessageExtImplGetBoolean::GetBoolean start"); 228 WebMessageExtImpl* webMessageExt = FFIData::GetData<WebMessageExtImpl>(msgExtId); 229 if (webMessageExt == nullptr) { 230 WEBVIEWLOGE("FfiOHOSWebMessageExtImplGetBoolean::GetBoolean error"); 231 *errCode = NWebError::INIT_ERROR; 232 return false; 233 } 234 235 if (webMessageExt->GetType() != static_cast<int32_t>(WebMessageType::BOOLEAN)) { 236 *errCode = NWebError::TYPE_NOT_MATCH_WITCH_VALUE; 237 return false; 238 } 239 auto data = webMessageExt->GetData(); 240 if (data == nullptr) { 241 WEBVIEWLOGE("FfiOHOSWebMessageExtImplGetBoolean::GetBoolean error"); 242 *errCode = NWebError::INIT_ERROR; 243 return false; 244 } 245 *errCode = NWebError::NO_ERROR; 246 return data->GetBoolean(); 247 } 248 FfiOHOSWebMessageExtImplGetArrayBuffer(int64_t msgExtId,int32_t * errCode)249 CArrUI8 FfiOHOSWebMessageExtImplGetArrayBuffer(int64_t msgExtId, int32_t *errCode) 250 { 251 WEBVIEWLOGD("FfiOHOSWebMessageExtImplGetArrayBuffer::GetArrayBuffer start"); 252 WebMessageExtImpl* webMessageExt = FFIData::GetData<WebMessageExtImpl>(msgExtId); 253 if (webMessageExt == nullptr) { 254 WEBVIEWLOGE("FfiOHOSWebMessageExtImplGetArrayBuffer::GetArrayBuffer error"); 255 *errCode = NWebError::INIT_ERROR; 256 return CArrUI8{nullptr, 0}; 257 } 258 259 if (webMessageExt->GetType() != static_cast<int32_t>(WebMessageType::ARRAYBUFFER)) { 260 *errCode = NWebError::TYPE_NOT_MATCH_WITCH_VALUE; 261 return CArrUI8{nullptr, 0}; 262 } 263 auto data = webMessageExt->GetData(); 264 if (data == nullptr) { 265 WEBVIEWLOGE("FfiOHOSWebMessageExtImplGetArrayBuffer::GetArrayBuffer error"); 266 *errCode = NWebError::INIT_ERROR; 267 return CArrUI8{nullptr, 0}; 268 } 269 std::vector<uint8_t> msgArr = data->GetBinary(); 270 uint8_t* result = VectorToCArrUI8(msgArr); 271 if (result == nullptr) { 272 WEBVIEWLOGE("FfiOHOSWebMessageExtImplGetArrayBuffer malloc failed"); 273 *errCode = NWebError::NEW_OOM; 274 return CArrUI8{nullptr, 0}; 275 } 276 *errCode = NWebError::NO_ERROR; 277 return CArrUI8{result, msgArr.size()}; 278 } 279 ConvertToCArr(std::shared_ptr<NWebMessage> data,int32_t * errCode)280 CArrValue ConvertToCArr(std::shared_ptr<NWebMessage> data, int32_t *errCode) 281 { 282 CArrValue ret = { .strHead = nullptr, .intHead = nullptr, .doubleHead = nullptr, 283 .boolHead = nullptr, .size = 0 }; 284 if (data->GetType() == NWebValue::Type::STRINGARRAY) { 285 std::vector<std::string> values = data->GetStringArray(); 286 ret.size = static_cast<int64_t>(values.size()); 287 ret.strHead = OHOS::Webview::VectorToCArrString(values); 288 } else if (data->GetType() == NWebValue::Type::BOOLEANARRAY) { 289 std::vector<bool> values = data->GetBooleanArray(); 290 auto arr = static_cast<bool*>(malloc(sizeof(bool) * values.size())); 291 if (!arr) { 292 *errCode = NWebError::NEW_OOM; 293 return ret; 294 } 295 for (uint32_t i = 0; i < values.size(); i++) { 296 arr[i] = values[i]; 297 } 298 ret.boolHead = arr; 299 ret.size = static_cast<int64_t>(values.size()); 300 } else if (data->GetType() == NWebValue::Type::DOUBLEARRAY) { 301 std::vector<double> values = data->GetDoubleArray(); 302 auto arr = static_cast<double*>(malloc(sizeof(double) * values.size())); 303 if (!arr) { 304 *errCode = NWebError::NEW_OOM; 305 return ret; 306 } 307 for (uint32_t i = 0; i < values.size(); i++) { 308 arr[i] = values[i]; 309 } 310 ret.doubleHead = arr; 311 ret.size = static_cast<int64_t>(values.size()); 312 } else { 313 std::vector<int64_t> values = data->GetInt64Array(); 314 auto arr = static_cast<int64_t*>(malloc(sizeof(int64_t) * values.size())); 315 if (!arr) { 316 *errCode = NWebError::NEW_OOM; 317 return ret; 318 } 319 for (uint32_t i = 0; i < values.size(); i++) { 320 arr[i] = values[i]; 321 } 322 ret.intHead = arr; 323 ret.size = static_cast<int64_t>(values.size()); 324 } 325 return ret; 326 } 327 FfiOHOSWebMessageExtImplGetArray(int64_t msgExtId,int32_t * errCode)328 CArrValue FfiOHOSWebMessageExtImplGetArray(int64_t msgExtId, int32_t *errCode) 329 { 330 CArrValue ret = { .strHead = nullptr, .intHead = nullptr, .doubleHead = nullptr, 331 .boolHead = nullptr, .size = 0 }; 332 WebMessageExtImpl* webMessageExt = FFIData::GetData<WebMessageExtImpl>(msgExtId); 333 if (webMessageExt == nullptr) { 334 *errCode = NWebError::INIT_ERROR; 335 return ret; 336 } 337 if (webMessageExt->GetType() != static_cast<int32_t>(WebMessageType::ARRAY)) { 338 *errCode = NWebError::TYPE_NOT_MATCH_WITCH_VALUE; 339 return ret; 340 } 341 auto data = webMessageExt->GetData(); 342 if (data == nullptr) { 343 *errCode = NWebError::INIT_ERROR; 344 return ret; 345 } 346 return ConvertToCArr(data, errCode); 347 } 348 FfiOHOSWebMessageExtImplGetError(int64_t msgExtId,int32_t * errCode)349 CError FfiOHOSWebMessageExtImplGetError(int64_t msgExtId, int32_t *errCode) 350 { 351 WEBVIEWLOGD("FfiOHOSWebMessageExtImplGetError::GetError start"); 352 WebMessageExtImpl* webMessageExt = FFIData::GetData<WebMessageExtImpl>(msgExtId); 353 auto err = CError{.errorName = nullptr, .errorMsg = nullptr}; 354 if (webMessageExt == nullptr) { 355 WEBVIEWLOGE("FfiOHOSWebMessageExtImplGetError::GetError error"); 356 *errCode = NWebError::INIT_ERROR; 357 return err; 358 } 359 if (webMessageExt->GetType() != static_cast<int32_t>(WebMessageType::ERROR)) { 360 *errCode = NWebError::TYPE_NOT_MATCH_WITCH_VALUE; 361 return err; 362 } 363 auto data = webMessageExt->GetData(); 364 if (data == nullptr) { 365 WEBVIEWLOGE("FfiOHOSWebMessageExtImplGetError::GetError error"); 366 *errCode = NWebError::INIT_ERROR; 367 return err; 368 } 369 *errCode = NWebError::NO_ERROR; 370 std::string errorName = data->GetErrName(); 371 std::string errorMsg = data->GetErrName() + ": " + data->GetErrMsg(); 372 err.errorName = MallocCString(errorName); 373 err.errorMsg = MallocCString(errorMsg); 374 return err; 375 } 376 FfiOHOSWebMessageExtImplSetType(int64_t msgExtId,int32_t type,int32_t * errCode)377 void FfiOHOSWebMessageExtImplSetType(int64_t msgExtId, int32_t type, int32_t *errCode) 378 { 379 WEBVIEWLOGD("FfiOHOSWebMessageExtImplSetType::SetType"); 380 if (type <= static_cast<int>(WebMessageType::NOTSUPPORT) || type > static_cast<int>(WebMessageType::ERROR)) { 381 *errCode = NWebError::TYPE_NOT_MATCH_WITCH_VALUE; 382 return; 383 } 384 WebMessageExtImpl* webMessageExt = FFIData::GetData<WebMessageExtImpl>(msgExtId); 385 if (webMessageExt == nullptr) { 386 WEBVIEWLOGE("FfiOHOSWebMessageExtImplGetArrayBuffer::GetArrayBuffer error"); 387 *errCode = NWebError::PARAM_CHECK_ERROR; 388 return; 389 } 390 webMessageExt->SetType(type); 391 *errCode = NWebError::NO_ERROR; 392 return; 393 } 394 FfiOHOSWebMessageExtImplSetString(int64_t msgExtId,char * message,int32_t * errCode)395 void FfiOHOSWebMessageExtImplSetString(int64_t msgExtId, char* message, int32_t *errCode) 396 { 397 WEBVIEWLOGD("FfiOHOSWebMessageExtImplSetString::SetString start"); 398 WebMessageExtImpl* webMessageExt = FFIData::GetData<WebMessageExtImpl>(msgExtId); 399 if (webMessageExt == nullptr) { 400 WEBVIEWLOGE("FfiOHOSWebMessageExtImplSetString::SetString error"); 401 *errCode = NWebError::PARAM_CHECK_ERROR; 402 return; 403 } 404 if (webMessageExt->GetType() != static_cast<int32_t>(WebMessageType::STRING)) { 405 *errCode = NWebError::TYPE_NOT_MATCH_WITCH_VALUE; 406 return; 407 } 408 std::string value = std::string(message); 409 webMessageExt->SetString(value); 410 *errCode = NWebError::NO_ERROR; 411 return; 412 } 413 FfiOHOSWebMessageExtImplSetNumber(int64_t msgExtId,double value,int32_t * errCode)414 void FfiOHOSWebMessageExtImplSetNumber(int64_t msgExtId, double value, int32_t *errCode) 415 { 416 WebMessageExtImpl* webMessageExt = FFIData::GetData<WebMessageExtImpl>(msgExtId); 417 if (webMessageExt == nullptr) { 418 WEBVIEWLOGE("FfiOHOSWebMessageExtImplSetNumber::SetNumber error"); 419 *errCode = NWebError::PARAM_CHECK_ERROR; 420 return; 421 } 422 if (webMessageExt->GetType() != static_cast<int32_t>(WebMessageType::NUMBER)) { 423 *errCode = NWebError::TYPE_NOT_MATCH_WITCH_VALUE; 424 return; 425 } 426 webMessageExt->SetNumber(value); 427 *errCode = NWebError::NO_ERROR; 428 return; 429 } 430 FfiOHOSWebMessageExtImplSetBoolean(int64_t msgExtId,bool value,int32_t * errCode)431 void FfiOHOSWebMessageExtImplSetBoolean(int64_t msgExtId, bool value, int32_t *errCode) 432 { 433 WebMessageExtImpl* webMessageExt = FFIData::GetData<WebMessageExtImpl>(msgExtId); 434 if (webMessageExt == nullptr) { 435 WEBVIEWLOGE("FfiOHOSWebMessageExtImplSetBoolean::SetBoolean error"); 436 *errCode = NWebError::PARAM_CHECK_ERROR; 437 return; 438 } 439 if (webMessageExt->GetType() != static_cast<int32_t>(WebMessageType::BOOLEAN)) { 440 *errCode = NWebError::TYPE_NOT_MATCH_WITCH_VALUE; 441 return; 442 } 443 webMessageExt->SetBoolean(value); 444 *errCode = NWebError::NO_ERROR; 445 return; 446 } 447 FfiOHOSWebMessageExtImplSetArrayBuffer(int64_t msgExtId,CArrUI8 value,int32_t * errCode)448 void FfiOHOSWebMessageExtImplSetArrayBuffer(int64_t msgExtId, CArrUI8 value, int32_t *errCode) 449 { 450 WebMessageExtImpl* webMessageExt = FFIData::GetData<WebMessageExtImpl>(msgExtId); 451 if (webMessageExt == nullptr) { 452 WEBVIEWLOGE("FfiOHOSWebMessageExtImplSetArrayBuffer::SetArrayBuffer error"); 453 *errCode = NWebError::PARAM_CHECK_ERROR; 454 return; 455 } 456 if (webMessageExt->GetType() != static_cast<int32_t>(WebMessageType::ARRAYBUFFER)) { 457 *errCode = NWebError::TYPE_NOT_MATCH_WITCH_VALUE; 458 return; 459 } 460 uint8_t *arrBuf = value.head; 461 size_t byteLength = static_cast<size_t>(value.size); 462 std::vector<uint8_t> vecData(arrBuf, arrBuf + byteLength); 463 webMessageExt->SetArrayBuffer(vecData); 464 *errCode = NWebError::NO_ERROR; 465 return; 466 } 467 FfiOHOSWebMessageExtImplSetArrayString(int64_t msgExtId,CArrString value,int32_t * errCode)468 void FfiOHOSWebMessageExtImplSetArrayString(int64_t msgExtId, CArrString value, int32_t *errCode) 469 { 470 WebMessageExtImpl* webMessageExt = FFIData::GetData<WebMessageExtImpl>(msgExtId); 471 if (webMessageExt == nullptr) { 472 WEBVIEWLOGE("FfiOHOSWebMessageExtImplSetArrayString error"); 473 *errCode = NWebError::PARAM_CHECK_ERROR; 474 return; 475 } 476 if (webMessageExt->GetType() != static_cast<int32_t>(WebMessageType::ARRAY)) { 477 *errCode = NWebError::TYPE_NOT_MATCH_WITCH_VALUE; 478 return; 479 } 480 std::vector<std::string> outValue; 481 for (int64_t i = 0; i < value.size; i++) { 482 outValue.push_back(std::string(value.head[i])); 483 } 484 webMessageExt->SetStringArray(outValue); 485 *errCode = NWebError::NO_ERROR; 486 return; 487 } 488 FfiOHOSWebMessageExtImplSetArrayInt(int64_t msgExtId,CArrI64 value,int32_t * errCode)489 void FfiOHOSWebMessageExtImplSetArrayInt(int64_t msgExtId, CArrI64 value, int32_t *errCode) 490 { 491 WebMessageExtImpl* webMessageExt = FFIData::GetData<WebMessageExtImpl>(msgExtId); 492 if (webMessageExt == nullptr) { 493 WEBVIEWLOGE("FfiOHOSWebMessageExtImplSetArrayInt error"); 494 *errCode = NWebError::PARAM_CHECK_ERROR; 495 return; 496 } 497 if (webMessageExt->GetType() != static_cast<int32_t>(WebMessageType::ARRAY)) { 498 *errCode = NWebError::TYPE_NOT_MATCH_WITCH_VALUE; 499 return; 500 } 501 std::vector<int64_t> outValue; 502 for (int64_t i = 0; i < value.size; i++) { 503 outValue.push_back(value.head[i]); 504 } 505 webMessageExt->SetInt64Array(outValue); 506 *errCode = NWebError::NO_ERROR; 507 return; 508 } 509 FfiOHOSWebMessageExtImplSetArrayDouble(int64_t msgExtId,OHOS::Webview::CArrDouble value,int32_t * errCode)510 void FfiOHOSWebMessageExtImplSetArrayDouble(int64_t msgExtId, 511 OHOS::Webview::CArrDouble value, int32_t *errCode) 512 { 513 WebMessageExtImpl* webMessageExt = FFIData::GetData<WebMessageExtImpl>(msgExtId); 514 if (webMessageExt == nullptr) { 515 WEBVIEWLOGE("FfiOHOSWebMessageExtImplSetArrayDouble error"); 516 *errCode = NWebError::PARAM_CHECK_ERROR; 517 return; 518 } 519 if (webMessageExt->GetType() != static_cast<int32_t>(WebMessageType::ARRAY)) { 520 *errCode = NWebError::TYPE_NOT_MATCH_WITCH_VALUE; 521 return; 522 } 523 std::vector<double> outValue; 524 for (int64_t i = 0; i < value.size; i++) { 525 outValue.push_back(value.head[i]); 526 } 527 webMessageExt->SetDoubleArray(outValue); 528 *errCode = NWebError::NO_ERROR; 529 return; 530 } 531 FfiOHOSWebMessageExtImplSetArrayBoolean(int64_t msgExtId,OHOS::Webview::CArrBool value,int32_t * errCode)532 void FfiOHOSWebMessageExtImplSetArrayBoolean(int64_t msgExtId, 533 OHOS::Webview::CArrBool value, int32_t *errCode) 534 { 535 WebMessageExtImpl* webMessageExt = FFIData::GetData<WebMessageExtImpl>(msgExtId); 536 if (webMessageExt == nullptr) { 537 WEBVIEWLOGE("FfiOHOSWebMessageExtImplSetArrayBoolean error"); 538 *errCode = NWebError::PARAM_CHECK_ERROR; 539 return; 540 } 541 if (webMessageExt->GetType() != static_cast<int32_t>(WebMessageType::ARRAY)) { 542 *errCode = NWebError::TYPE_NOT_MATCH_WITCH_VALUE; 543 return; 544 } 545 std::vector<bool> outValue; 546 for (int64_t i = 0; i < value.size; i++) { 547 outValue.push_back(value.head[i]); 548 } 549 webMessageExt->SetBooleanArray(outValue); 550 *errCode = NWebError::NO_ERROR; 551 return; 552 } 553 FfiOHOSWebMessageExtImplSetError(int64_t msgExtId,OHOS::Webview::CError value,int32_t * errCode)554 void FfiOHOSWebMessageExtImplSetError(int64_t msgExtId, OHOS::Webview::CError value, int32_t *errCode) 555 { 556 WebMessageExtImpl* webMessageExt = FFIData::GetData<WebMessageExtImpl>(msgExtId); 557 if (webMessageExt == nullptr) { 558 WEBVIEWLOGE("FfiOHOSWebMessageExtImplGetError::GetError error"); 559 *errCode = NWebError::PARAM_CHECK_ERROR; 560 return; 561 } 562 if (webMessageExt->GetType() != static_cast<int32_t>(WebMessageType::ERROR)) { 563 *errCode = NWebError::TYPE_NOT_MATCH_WITCH_VALUE; 564 return; 565 } 566 std::string nameVal = std::string(value.errorName); 567 std::string msgVal = std::string(value.errorMsg); 568 *errCode = NWebError::NO_ERROR; 569 webMessageExt->SetError(nameVal, msgVal); 570 return; 571 } 572 573 // WebJsMessageExtImpl FfiOHOSJsMessageExtImplGetType(int64_t jsExtId,int32_t * errCode)574 int32_t FfiOHOSJsMessageExtImplGetType(int64_t jsExtId, int32_t *errCode) 575 { 576 WEBVIEWLOGD("FfiOHOSJsMessageExtImplGetType::GetType start"); 577 WebJsMessageExtImpl* webJsMessageExt = FFIData::GetData<WebJsMessageExtImpl>(jsExtId); 578 if (webJsMessageExt == nullptr) { 579 WEBVIEWLOGE("FfiOHOSJsMessageExtImplGetType::GetType error"); 580 *errCode = NWebError::PARAM_CHECK_ERROR; 581 return -1; 582 } 583 int32_t type = webJsMessageExt->GetType(); 584 *errCode = NWebError::NO_ERROR; 585 return type; 586 } 587 FfiOHOSJsMessageExtImplGetString(int64_t jsExtId,int32_t * errCode)588 char* FfiOHOSJsMessageExtImplGetString(int64_t jsExtId, int32_t *errCode) 589 { 590 WEBVIEWLOGD("FfiOHOSJsMessageExtImplGetString::GetString start"); 591 WebJsMessageExtImpl* webJsMessageExt = FFIData::GetData<WebJsMessageExtImpl>(jsExtId); 592 if (webJsMessageExt == nullptr) { 593 WEBVIEWLOGE("FfiOHOSJsMessageExtImplGetString::GetString error"); 594 *errCode = NWebError::INIT_ERROR; 595 return nullptr; 596 } 597 598 if (webJsMessageExt->GetType() != static_cast<int32_t>(JsMessageType::STRING)) { 599 *errCode = NWebError::TYPE_NOT_MATCH_WITCH_VALUE; 600 return nullptr; 601 } 602 auto data = webJsMessageExt->GetJsMsgResult(); 603 if (data == nullptr) { 604 WEBVIEWLOGE("FfiOHOSJsMessageExtImplGetString::GetString error"); 605 *errCode = NWebError::INIT_ERROR; 606 return nullptr; 607 } 608 std::string msgStr = data->GetString(); 609 *errCode = NWebError::NO_ERROR; 610 return MallocCString(msgStr); 611 } 612 FfiOHOSJsMessageExtImplGetNumber(int64_t jsExtId,int32_t * errCode)613 RetNumber FfiOHOSJsMessageExtImplGetNumber(int64_t jsExtId, int32_t *errCode) 614 { 615 WEBVIEWLOGD("FfiOHOSJsMessageExtImplGetNumber::GetNumber start"); 616 WebJsMessageExtImpl* webJsMessageExt = FFIData::GetData<WebJsMessageExtImpl>(jsExtId); 617 RetNumber ret = { .numberInt = 0, .numberDouble = 0.0 }; 618 if (webJsMessageExt == nullptr) { 619 WEBVIEWLOGE("FfiOHOSJsMessageExtImplGetNumber::GetNumber error"); 620 *errCode = NWebError::INIT_ERROR; 621 return ret; 622 } 623 624 if (webJsMessageExt->GetType() != static_cast<int32_t>(JsMessageType::NUMBER)) { 625 *errCode = NWebError::TYPE_NOT_MATCH_WITCH_VALUE; 626 return ret; 627 } 628 auto data = webJsMessageExt->GetJsMsgResult(); 629 if (data == nullptr) { 630 WEBVIEWLOGE("FfiOHOSJsMessageExtImplGetNumber::GetNumber error"); 631 *errCode = NWebError::INIT_ERROR; 632 return ret; 633 } 634 if (data->GetType() == NWebValue::Type::INTEGER) { 635 ret.numberInt = data->GetInt64(); 636 } else { 637 ret.numberDouble = data->GetDouble(); 638 } 639 return ret; 640 } 641 FfiOHOSJsMessageExtImplGetBoolean(int64_t jsExtId,int32_t * errCode)642 bool FfiOHOSJsMessageExtImplGetBoolean(int64_t jsExtId, int32_t *errCode) 643 { 644 WEBVIEWLOGD("FfiOHOSJsMessageExtImplGetBoolean::GetBoolean start"); 645 WebJsMessageExtImpl* webJsMessageExt = FFIData::GetData<WebJsMessageExtImpl>(jsExtId); 646 if (webJsMessageExt == nullptr) { 647 WEBVIEWLOGE("FfiOHOSJsMessageExtImplGetBoolean::GetBoolean error"); 648 *errCode = NWebError::INIT_ERROR; 649 return false; 650 } 651 652 if (webJsMessageExt->GetType() != static_cast<int32_t>(JsMessageType::BOOLEAN)) { 653 *errCode = NWebError::TYPE_NOT_MATCH_WITCH_VALUE; 654 return false; 655 } 656 auto data = webJsMessageExt->GetJsMsgResult(); 657 if (data == nullptr) { 658 WEBVIEWLOGE("FfiOHOSJsMessageExtImplGetBoolean::GetBoolean error"); 659 *errCode = NWebError::INIT_ERROR; 660 return false; 661 } 662 *errCode = NWebError::NO_ERROR; 663 return data->GetBoolean(); 664 } 665 FfiOHOSJsMessageExtImplGetArrayBuffer(int64_t jsExtId,int32_t * errCode)666 CArrUI8 FfiOHOSJsMessageExtImplGetArrayBuffer(int64_t jsExtId, int32_t *errCode) 667 { 668 WEBVIEWLOGD("FfiOHOSJsMessageExtImplGetArrayBuffer::GetArrayBuffer start"); 669 WebJsMessageExtImpl* webJsMessageExt = FFIData::GetData<WebJsMessageExtImpl>(jsExtId); 670 if (webJsMessageExt == nullptr) { 671 WEBVIEWLOGE("FfiOHOSJsMessageExtImplGetArrayBuffer::GetArrayBuffer error"); 672 *errCode = NWebError::INIT_ERROR; 673 return CArrUI8{nullptr, 0}; 674 } 675 676 if (webJsMessageExt->GetType() != static_cast<int32_t>(JsMessageType::ARRAYBUFFER)) { 677 *errCode = NWebError::TYPE_NOT_MATCH_WITCH_VALUE; 678 return CArrUI8{nullptr, 0}; 679 } 680 auto data = webJsMessageExt->GetJsMsgResult(); 681 if (data == nullptr) { 682 WEBVIEWLOGE("FfiOHOSJsMessageExtImplGetArrayBuffer::GetArrayBuffer error"); 683 *errCode = NWebError::INIT_ERROR; 684 return CArrUI8{nullptr, 0}; 685 } 686 std::vector<uint8_t> msgArr = data->GetBinary(); 687 uint8_t* result = VectorToCArrUI8(msgArr); 688 if (result == nullptr) { 689 WEBVIEWLOGE("FfiOHOSJsMessageExtImplGetArrayBuffer malloc failed"); 690 *errCode = NWebError::NEW_OOM; 691 return CArrUI8{nullptr, 0}; 692 } 693 *errCode = NWebError::NO_ERROR; 694 return CArrUI8{result, msgArr.size()}; 695 } 696 FfiOHOSJsMessageExtImplGetArray(int64_t jsExtId,int32_t * errCode)697 CArrValue FfiOHOSJsMessageExtImplGetArray(int64_t jsExtId, int32_t *errCode) 698 { 699 CArrValue ret = { .strHead = nullptr, .intHead = nullptr, .doubleHead = nullptr, 700 .boolHead = nullptr, .size = 0 }; 701 WebJsMessageExtImpl* webJsMessageExt = FFIData::GetData<WebJsMessageExtImpl>(jsExtId); 702 if (webJsMessageExt == nullptr) { 703 *errCode = NWebError::INIT_ERROR; 704 return ret; 705 } 706 if (webJsMessageExt->GetType() != static_cast<int32_t>(JsMessageType::ARRAY)) { 707 *errCode = NWebError::TYPE_NOT_MATCH_WITCH_VALUE; 708 return ret; 709 } 710 auto data = webJsMessageExt->GetJsMsgResult(); 711 if (data == nullptr) { 712 *errCode = NWebError::INIT_ERROR; 713 return ret; 714 } 715 return ConvertToCArr(data, errCode); 716 } 717 } 718 } 719 }