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