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 "native_interface.h"
17 #include "node/animate_impl.h"
18 #include "node/dialog_model.h"
19 #include "node/gesture_impl.h"
20 #include "node/node_model.h"
21 #include "node/node_model_safely.h"
22 #include "node_extened.h"
23
24 #include "base/log/log_wrapper.h"
25
26 namespace {
27
28 constexpr int32_t CURRENT_NATIVE_NODE_API_VERSION = 1;
29 constexpr int32_t NATIVE_DIALOG_VERSION_0 = 0;
30 constexpr int32_t NATIVE_DIALOG_VERSION_1 = 1;
31 constexpr int32_t NATIVE_DIALOG_VERSION_2 = 2;
32 constexpr int32_t NATIVE_DIALOG_VERSION_3 = 3;
33
34 ArkUI_NativeNodeAPI_Compatible nodeImpl_compatible = {
35 CURRENT_NATIVE_NODE_API_VERSION,
36 OHOS::Ace::NodeModel::CreateNode,
37 OHOS::Ace::NodeModel::DisposeNode,
38 OHOS::Ace::NodeModel::AddChild,
39 OHOS::Ace::NodeModel::RemoveChild,
40 OHOS::Ace::NodeModel::InsertChildAfter,
41 OHOS::Ace::NodeModel::InsertChildBefore,
42 OHOS::Ace::NodeModel::InsertChildAt,
43 OHOS::Ace::NodeModel::SetAttribute,
44 OHOS::Ace::NodeModel::GetAttribute,
45 OHOS::Ace::NodeModel::ResetAttribute,
46 OHOS::Ace::NodeModel::RegisterNodeEvent,
47 OHOS::Ace::NodeModel::UnregisterNodeEvent,
48 OHOS::Ace::NodeModel::RegisterOnEvent,
49 OHOS::Ace::NodeModel::UnregisterOnEvent,
50 OHOS::Ace::NodeModel::MarkDirty,
51 };
52
53 ArkUI_NativeNodeAPI_1 nodeImpl_1 = {
54 CURRENT_NATIVE_NODE_API_VERSION,
55 OHOS::Ace::NodeModel::CreateNode,
56 OHOS::Ace::NodeModel::DisposeNode,
57 OHOS::Ace::NodeModel::AddChild,
58 OHOS::Ace::NodeModel::RemoveChild,
59 OHOS::Ace::NodeModel::InsertChildAfter,
60 OHOS::Ace::NodeModel::InsertChildBefore,
61 OHOS::Ace::NodeModel::InsertChildAt,
62 OHOS::Ace::NodeModel::SetAttribute,
63 OHOS::Ace::NodeModel::GetAttribute,
64 OHOS::Ace::NodeModel::ResetAttribute,
65 OHOS::Ace::NodeModel::RegisterNodeEvent,
66 OHOS::Ace::NodeModel::UnregisterNodeEvent,
67 OHOS::Ace::NodeModel::RegisterOnEvent,
68 OHOS::Ace::NodeModel::UnregisterOnEvent,
69 OHOS::Ace::NodeModel::MarkDirty,
70 OHOS::Ace::NodeModel::GetTotalChildCount,
71 OHOS::Ace::NodeModel::GetChildAt,
72 OHOS::Ace::NodeModel::GetFirstChild,
73 OHOS::Ace::NodeModel::GetLastChild,
74 OHOS::Ace::NodeModel::GetPreviousSibling,
75 OHOS::Ace::NodeModel::GetNextSibling,
76 OHOS::Ace::NodeModel::RegisterNodeCustomEvent,
77 OHOS::Ace::NodeModel::UnregisterNodeCustomEvent,
78 OHOS::Ace::NodeModel::RegisterNodeCustomReceiver,
79 OHOS::Ace::NodeModel::UnregisterNodeCustomEventReceiver,
80 OHOS::Ace::NodeModel::SetMeasuredSize,
81 OHOS::Ace::NodeModel::SetLayoutPosition,
82 OHOS::Ace::NodeModel::GetMeasuredSize,
83 OHOS::Ace::NodeModel::GetLayoutPosition,
84 OHOS::Ace::NodeModel::MeasureNode,
85 OHOS::Ace::NodeModel::LayoutNode,
86 OHOS::Ace::NodeModel::AddNodeEventReceiver,
87 OHOS::Ace::NodeModel::RemoveNodeEventReceiver,
88 OHOS::Ace::NodeModel::AddNodeCustomEventReceiver,
89 OHOS::Ace::NodeModel::RemoveNodeCustomEventReceiver,
90 OHOS::Ace::NodeModel::SetUserData,
91 OHOS::Ace::NodeModel::GetUserData,
92 OHOS::Ace::NodeModel::SetLengthMetricUnit,
93 OHOS::Ace::NodeModel::GetParent,
94 OHOS::Ace::NodeModel::RemoveAllChildren,
95 };
96
97 ArkUI_NativeNodeAPI_1 multiThreadNodeImpl_1 = {
98 .version = CURRENT_NATIVE_NODE_API_VERSION,
99 .createNode = OHOS::Ace::NodeModel::CreateNodeSafely,
100 .disposeNode = OHOS::Ace::NodeModel::DisposeNodeSafely,
101 .addChild = OHOS::Ace::NodeModel::AddChildSafely,
102 .removeChild = OHOS::Ace::NodeModel::RemoveChildSafely,
103 .insertChildAfter = OHOS::Ace::NodeModel::InsertChildAfterSafely,
104 .insertChildBefore = OHOS::Ace::NodeModel::InsertChildBeforeSafely,
105 .insertChildAt = OHOS::Ace::NodeModel::InsertChildAtSafely,
106 .setAttribute = OHOS::Ace::NodeModel::SetAttributeSafely,
107 .getAttribute = OHOS::Ace::NodeModel::GetAttributeSafely,
108 .resetAttribute = OHOS::Ace::NodeModel::ResetAttributeSafely,
109 .registerNodeEvent = OHOS::Ace::NodeModel::RegisterNodeEventSafely,
110 .unregisterNodeEvent = OHOS::Ace::NodeModel::UnregisterNodeEventSafely,
111 .registerNodeEventReceiver = OHOS::Ace::NodeModel::RegisterOnEventSafely,
112 .unregisterNodeEventReceiver = OHOS::Ace::NodeModel::UnregisterOnEventSafely,
113 .markDirty = OHOS::Ace::NodeModel::MarkDirtySafely,
114 .getTotalChildCount = OHOS::Ace::NodeModel::GetTotalChildCountSafely,
115 .getChildAt = OHOS::Ace::NodeModel::GetChildAtSafely,
116 .getFirstChild = OHOS::Ace::NodeModel::GetFirstChildSafely,
117 .getLastChild = OHOS::Ace::NodeModel::GetLastChildSafely,
118 .getPreviousSibling = OHOS::Ace::NodeModel::GetPreviousSiblingSafely,
119 .getNextSibling = OHOS::Ace::NodeModel::GetNextSiblingSafely,
120 .registerNodeCustomEvent = OHOS::Ace::NodeModel::RegisterNodeCustomEventSafely,
121 .unregisterNodeCustomEvent = OHOS::Ace::NodeModel::UnregisterNodeCustomEventSafely,
122 .registerNodeCustomEventReceiver = OHOS::Ace::NodeModel::RegisterNodeCustomReceiverSafely,
123 .unregisterNodeCustomEventReceiver = OHOS::Ace::NodeModel::UnregisterNodeCustomEventReceiverSafely,
124 .setMeasuredSize = OHOS::Ace::NodeModel::SetMeasuredSizeSafely,
125 .setLayoutPosition = OHOS::Ace::NodeModel::SetLayoutPositionSafely,
126 .getMeasuredSize = OHOS::Ace::NodeModel::GetMeasuredSizeSafely,
127 .getLayoutPosition = OHOS::Ace::NodeModel::GetLayoutPositionSafely,
128 .measureNode = OHOS::Ace::NodeModel::MeasureNodeSafely,
129 .layoutNode = OHOS::Ace::NodeModel::LayoutNodeSafely,
130 .addNodeEventReceiver = OHOS::Ace::NodeModel::AddNodeEventReceiverSafely,
131 .removeNodeEventReceiver = OHOS::Ace::NodeModel::RemoveNodeEventReceiverSafely,
132 .addNodeCustomEventReceiver = OHOS::Ace::NodeModel::AddNodeCustomEventReceiverSafely,
133 .removeNodeCustomEventReceiver = OHOS::Ace::NodeModel::RemoveNodeCustomEventReceiverSafely,
134 .setUserData = OHOS::Ace::NodeModel::SetUserDataSafely,
135 .getUserData = OHOS::Ace::NodeModel::GetUserDataSafely,
136 .setLengthMetricUnit = OHOS::Ace::NodeModel::SetLengthMetricUnitSafely,
137 .getParent = OHOS::Ace::NodeModel::GetParentSafely,
138 .removeAllChildren = OHOS::Ace::NodeModel::RemoveAllChildrenSafely,
139 };
140
141 ArkUI_NativeDialogAPI_1 dialogImpl_1 = {
142 OHOS::Ace::DialogModel::Create,
143 OHOS::Ace::DialogModel::Dispose,
144 OHOS::Ace::DialogModel::SetContent,
145 OHOS::Ace::DialogModel::RemoveContent,
146 OHOS::Ace::DialogModel::SetContentAlignment,
147 OHOS::Ace::DialogModel::ResetContentAlignment,
148 OHOS::Ace::DialogModel::SetModalMode,
149 OHOS::Ace::DialogModel::SetAutoCancel,
150 OHOS::Ace::DialogModel::SetMask,
151 OHOS::Ace::DialogModel::SetBackgroundColor,
152 OHOS::Ace::DialogModel::SetCornerRadius,
153 OHOS::Ace::DialogModel::SetGridColumnCount,
154 OHOS::Ace::DialogModel::EnableCustomStyle,
155 OHOS::Ace::DialogModel::EnableCustomAnimation,
156 OHOS::Ace::DialogModel::RegisterOnWillDismiss,
157 OHOS::Ace::DialogModel::Show,
158 OHOS::Ace::DialogModel::Close,
159 OHOS::Ace::DialogModel::RegisterOnWillDismissWithUserData,
160 };
161
162 ArkUI_NativeDialogAPI_2 dialogImpl_2 = {
163 dialogImpl_1,
164 OHOS::Ace::DialogModel::SetKeyboardAvoidDistance,
165 OHOS::Ace::DialogModel::SetLevelMode,
166 OHOS::Ace::DialogModel::SetLevelUniqueId,
167 OHOS::Ace::DialogModel::SetImmersiveMode,
168 };
169
170 ArkUI_NativeDialogAPI_3 dialogImpl_3 = {
171 dialogImpl_1,
172 dialogImpl_2,
173 OHOS::Ace::DialogModel::SetLevelOrder,
174 OHOS::Ace::DialogModel::RegisterOnWillAppear,
175 OHOS::Ace::DialogModel::RegisterOnDidAppear,
176 OHOS::Ace::DialogModel::RegisterOnWillDisappear,
177 OHOS::Ace::DialogModel::RegisterOnDidDisappear,
178 OHOS::Ace::DialogModel::SetBorderWidth,
179 OHOS::Ace::DialogModel::SetBorderColor,
180 OHOS::Ace::DialogModel::SetBorderStyle,
181 OHOS::Ace::DialogModel::SetWidth,
182 OHOS::Ace::DialogModel::SetHeight,
183 OHOS::Ace::DialogModel::SetShadow,
184 OHOS::Ace::DialogModel::SetCustomShadow,
185 OHOS::Ace::DialogModel::SetBackgroundBlurStyle,
186 OHOS::Ace::DialogModel::SetKeyboardAvoidMode,
187 OHOS::Ace::DialogModel::EnableHoverMode,
188 OHOS::Ace::DialogModel::SetHoverModeArea,
189 OHOS::Ace::DialogModel::SetFocusable,
190 OHOS::Ace::DialogModel::SetBackgroundBlurStyleOptions,
191 OHOS::Ace::DialogModel::SetBackgroundEffect,
192 };
193
194 constexpr int32_t CURRENT_NATIVE_GESTURE_API_VERSION = 1;
195 ArkUI_NativeGestureAPI_1 gestureImpl_1 = {
196 CURRENT_NATIVE_GESTURE_API_VERSION,
197 OHOS::Ace::GestureModel::CreateTapGesture,
198 OHOS::Ace::GestureModel::CreateLongPressGesture,
199 OHOS::Ace::GestureModel::CreatePanGesture,
200 OHOS::Ace::GestureModel::CreatePinchGesture,
201 OHOS::Ace::GestureModel::CreateRotationGesture,
202 OHOS::Ace::GestureModel::CreateSwipeGesture,
203 OHOS::Ace::GestureModel::CreateGroupGesture,
204 OHOS::Ace::GestureModel::DisposeGesture,
205 OHOS::Ace::GestureModel::AddChildGesture,
206 OHOS::Ace::GestureModel::RemoveChildGesture,
207 OHOS::Ace::GestureModel::SetGestureEventTarget,
208 OHOS::Ace::GestureModel::AddGestureToNode,
209 OHOS::Ace::GestureModel::RemoveGestureFromNode,
210 OHOS::Ace::GestureModel::SetGestureInterrupterToNode,
211 OHOS::Ace::GestureModel::GetGestureType,
212 OHOS::Ace::GestureModel::SetInnerGestureParallelTo,
213 OHOS::Ace::GestureModel::CreateTapGestureWithDistanceThreshold,
214 };
215
216 ArkUI_NativeGestureAPI_2 gestureImpl_2 = {
217 &gestureImpl_1,
218 OHOS::Ace::GestureModel::SetGestureInterrupterToNodeWithUserData,
219 };
220
221 ArkUI_NativeAnimateAPI_1 animateImpl_1 = {
222 OHOS::Ace::AnimateModel::AnimateTo,
223 OHOS::Ace::AnimateModel::KeyframeAnimateTo,
224 OHOS::Ace::AnimateModel::CreateAnimator,
225 OHOS::Ace::AnimateModel::DisposeAnimator,
226 };
227
228 } // namespace
229
230 #ifdef __cplusplus
231 extern "C" {
232 #endif
233
OH_ArkUI_QueryModuleInterface(ArkUI_NativeAPIVariantKind type,int32_t version)234 void* OH_ArkUI_QueryModuleInterface(ArkUI_NativeAPIVariantKind type, int32_t version)
235 {
236 if (!OHOS::Ace::NodeModel::InitialFullImpl()) {
237 TAG_LOGE(OHOS::Ace::AceLogTag::ACE_NATIVE_NODE,
238 "fail to get %{public}d node api family of %{public}d version, impl library is not found", type, version);
239 return nullptr;
240 }
241 switch (type) {
242 case ARKUI_NATIVE_NODE: {
243 switch (version) {
244 case 0:
245 case 1:
246 return &nodeImpl_compatible;
247 default: {
248 TAG_LOGE(OHOS::Ace::AceLogTag::ACE_NATIVE_NODE,
249 "fail to get basic node api family, version is incorrect: %{public}d", version);
250 return nullptr;
251 }
252 }
253 break;
254 }
255 case ARKUI_NATIVE_DIALOG: {
256 switch (version) {
257 case NATIVE_DIALOG_VERSION_0:
258 case NATIVE_DIALOG_VERSION_1:
259 return &dialogImpl_1;
260 case NATIVE_DIALOG_VERSION_2:
261 return &dialogImpl_2;
262 case NATIVE_DIALOG_VERSION_3:
263 return &dialogImpl_3;
264 default: {
265 TAG_LOGE(OHOS::Ace::AceLogTag::ACE_NATIVE_NODE,
266 "fail to get dialog api family, version is incorrect: %{public}d", version);
267 return nullptr;
268 }
269 }
270 }
271 case ARKUI_NATIVE_GESTURE: {
272 switch (version) {
273 case 0:
274 case 1:
275 return &gestureImpl_1;
276 case 2:
277 return &gestureImpl_2;
278 default: {
279 TAG_LOGE(OHOS::Ace::AceLogTag::ACE_NATIVE_NODE,
280 "fail to get gesture api family, version is incorrect: %{public}d", version);
281 return nullptr;
282 }
283 }
284 break;
285 }
286 default: {
287 TAG_LOGE(OHOS::Ace::AceLogTag::ACE_NATIVE_NODE,
288 "fail to get %{public}d node api family, version is incorrect: %{public}d", type, version);
289 return nullptr;
290 }
291 }
292 }
293
OH_ArkUI_GetNativeAPI(ArkUI_NativeAPIVariantKind type,int32_t version)294 void* OH_ArkUI_GetNativeAPI(ArkUI_NativeAPIVariantKind type, int32_t version)
295 {
296 return OH_ArkUI_QueryModuleInterface(type, version);
297 }
298
OH_ArkUI_QueryModuleInterfaceByName(ArkUI_NativeAPIVariantKind type,const char * structName)299 void* OH_ArkUI_QueryModuleInterfaceByName(ArkUI_NativeAPIVariantKind type, const char* structName)
300 {
301 if (!OHOS::Ace::NodeModel::InitialFullImpl()) {
302 TAG_LOGE(OHOS::Ace::AceLogTag::ACE_NATIVE_NODE,
303 "fail to get %{public}d node api family, impl library is not found", type);
304 return nullptr;
305 }
306 switch (type) {
307 case ARKUI_NATIVE_NODE:
308 if (strcmp(structName, "ArkUI_NativeNodeAPI_1") == 0) {
309 return &nodeImpl_1;
310 }
311 break;
312 case ARKUI_NATIVE_DIALOG:
313 if (strcmp(structName, "ArkUI_NativeDialogAPI_1") == 0) {
314 return &dialogImpl_1;
315 } else if (strcmp(structName, "ArkUI_NativeDialogAPI_2") == 0) {
316 return &dialogImpl_2;
317 } else if (strcmp(structName, "ArkUI_NativeDialogAPI_3") == 0) {
318 return &dialogImpl_3;
319 }
320 break;
321 case ARKUI_NATIVE_GESTURE:
322 if (strcmp(structName, "ArkUI_NativeGestureAPI_1") == 0) {
323 return &gestureImpl_1;
324 } else if (strcmp(structName, "ArkUI_NativeGestureAPI_2") == 0) {
325 return &gestureImpl_2;
326 }
327 break;
328 case ARKUI_NATIVE_ANIMATE:
329 if (strcmp(structName, "ArkUI_NativeAnimateAPI_1") == 0) {
330 return &animateImpl_1;
331 }
332 break;
333 case ARKUI_MULTI_THREAD_NATIVE_NODE:
334 if (strcmp(structName, "ArkUI_NativeNodeAPI_1") == 0) {
335 return &multiThreadNodeImpl_1;
336 }
337 break;
338 default:
339 break;
340 }
341 return nullptr;
342 }
343
344 #ifdef __cplusplus
345 };
346 #endif
347