• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 }