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_extened.h"
22 
23 #include "base/log/log_wrapper.h"
24 
25 namespace {
26 
27 constexpr int32_t CURRENT_NATIVE_NODE_API_VERSION = 1;
28 
29 ArkUI_NativeNodeAPI_Compatible nodeImpl_compatible = {
30     CURRENT_NATIVE_NODE_API_VERSION,
31     OHOS::Ace::NodeModel::CreateNode,
32     OHOS::Ace::NodeModel::DisposeNode,
33     OHOS::Ace::NodeModel::AddChild,
34     OHOS::Ace::NodeModel::RemoveChild,
35     OHOS::Ace::NodeModel::InsertChildAfter,
36     OHOS::Ace::NodeModel::InsertChildBefore,
37     OHOS::Ace::NodeModel::InsertChildAt,
38     OHOS::Ace::NodeModel::SetAttribute,
39     OHOS::Ace::NodeModel::GetAttribute,
40     OHOS::Ace::NodeModel::ResetAttribute,
41     OHOS::Ace::NodeModel::RegisterNodeEvent,
42     OHOS::Ace::NodeModel::UnregisterNodeEvent,
43     OHOS::Ace::NodeModel::RegisterOnEvent,
44     OHOS::Ace::NodeModel::UnregisterOnEvent,
45     OHOS::Ace::NodeModel::MarkDirty,
46 };
47 
48 ArkUI_NativeNodeAPI_1 nodeImpl_1 = {
49     CURRENT_NATIVE_NODE_API_VERSION,
50     OHOS::Ace::NodeModel::CreateNode,
51     OHOS::Ace::NodeModel::DisposeNode,
52     OHOS::Ace::NodeModel::AddChild,
53     OHOS::Ace::NodeModel::RemoveChild,
54     OHOS::Ace::NodeModel::InsertChildAfter,
55     OHOS::Ace::NodeModel::InsertChildBefore,
56     OHOS::Ace::NodeModel::InsertChildAt,
57     OHOS::Ace::NodeModel::SetAttribute,
58     OHOS::Ace::NodeModel::GetAttribute,
59     OHOS::Ace::NodeModel::ResetAttribute,
60     OHOS::Ace::NodeModel::RegisterNodeEvent,
61     OHOS::Ace::NodeModel::UnregisterNodeEvent,
62     OHOS::Ace::NodeModel::RegisterOnEvent,
63     OHOS::Ace::NodeModel::UnregisterOnEvent,
64     OHOS::Ace::NodeModel::MarkDirty,
65     OHOS::Ace::NodeModel::GetTotalChildCount,
66     OHOS::Ace::NodeModel::GetChildAt,
67     OHOS::Ace::NodeModel::GetFirstChild,
68     OHOS::Ace::NodeModel::GetLastChild,
69     OHOS::Ace::NodeModel::GetPreviousSibling,
70     OHOS::Ace::NodeModel::GetNextSibling,
71     OHOS::Ace::NodeModel::RegisterNodeCustomEvent,
72     OHOS::Ace::NodeModel::UnregisterNodeCustomEvent,
73     OHOS::Ace::NodeModel::RegisterNodeCustomReceiver,
74     OHOS::Ace::NodeModel::UnregisterNodeCustomEventReceiver,
75     OHOS::Ace::NodeModel::SetMeasuredSize,
76     OHOS::Ace::NodeModel::SetLayoutPosition,
77     OHOS::Ace::NodeModel::GetMeasuredSize,
78     OHOS::Ace::NodeModel::GetLayoutPosition,
79     OHOS::Ace::NodeModel::MeasureNode,
80     OHOS::Ace::NodeModel::LayoutNode,
81     OHOS::Ace::NodeModel::AddNodeEventReceiver,
82     OHOS::Ace::NodeModel::RemoveNodeEventReceiver,
83     OHOS::Ace::NodeModel::AddNodeCustomEventReceiver,
84     OHOS::Ace::NodeModel::RemoveNodeCustomEventReceiver,
85     OHOS::Ace::NodeModel::SetUserData,
86     OHOS::Ace::NodeModel::GetUserData,
87     OHOS::Ace::NodeModel::SetLengthMetricUnit,
88     OHOS::Ace::NodeModel::GetParent,
89     OHOS::Ace::NodeModel::RemoveAllChildren,
90 };
91 
92 ArkUI_NativeDialogAPI_1 dialogImpl_1 = {
93     OHOS::Ace::DialogModel::Create,
94     OHOS::Ace::DialogModel::Dispose,
95     OHOS::Ace::DialogModel::SetContent,
96     OHOS::Ace::DialogModel::RemoveContent,
97     OHOS::Ace::DialogModel::SetContentAlignment,
98     OHOS::Ace::DialogModel::ResetContentAlignment,
99     OHOS::Ace::DialogModel::SetModalMode,
100     OHOS::Ace::DialogModel::SetAutoCancel,
101     OHOS::Ace::DialogModel::SetMask,
102     OHOS::Ace::DialogModel::SetBackgroundColor,
103     OHOS::Ace::DialogModel::SetCornerRadius,
104     OHOS::Ace::DialogModel::SetGridColumnCount,
105     OHOS::Ace::DialogModel::EnableCustomStyle,
106     OHOS::Ace::DialogModel::EnableCustomAnimation,
107     OHOS::Ace::DialogModel::RegisterOnWillDismiss,
108     OHOS::Ace::DialogModel::Show,
109     OHOS::Ace::DialogModel::Close,
110     OHOS::Ace::DialogModel::RegisterOnWillDismissWithUserData,
111 };
112 
113 constexpr int32_t CURRENT_NATIVE_GESTURE_API_VERSION = 1;
114 ArkUI_NativeGestureAPI_1 gestureImpl_1 = {
115     CURRENT_NATIVE_GESTURE_API_VERSION,
116     OHOS::Ace::GestureModel::CreateTapGesture,
117     OHOS::Ace::GestureModel::CreateLongPressGesture,
118     OHOS::Ace::GestureModel::CreatePanGesture,
119     OHOS::Ace::GestureModel::CreatePinchGesture,
120     OHOS::Ace::GestureModel::CreateRotationGesture,
121     OHOS::Ace::GestureModel::CreateSwipeGesture,
122     OHOS::Ace::GestureModel::CreateGroupGesture,
123     OHOS::Ace::GestureModel::DisposeGesture,
124     OHOS::Ace::GestureModel::AddChildGesture,
125     OHOS::Ace::GestureModel::RemoveChildGesture,
126     OHOS::Ace::GestureModel::SetGestureEventTarget,
127     OHOS::Ace::GestureModel::AddGestureToNode,
128     OHOS::Ace::GestureModel::RemoveGestureFromNode,
129     OHOS::Ace::GestureModel::SetGestureInterrupterToNode,
130     OHOS::Ace::GestureModel::GetGestureType,
131     OHOS::Ace::GestureModel::SetInnerGestureParallelTo,
132     OHOS::Ace::GestureModel::CreateTapGestureWithDistanceThreshold,
133 };
134 
135 ArkUI_NativeAnimateAPI_1 animateImpl_1 = {
136     OHOS::Ace::AnimateModel::AnimateTo,
137     OHOS::Ace::AnimateModel::KeyframeAnimateTo,
138     OHOS::Ace::AnimateModel::CreateAnimator,
139     OHOS::Ace::AnimateModel::DisposeAnimator,
140 };
141 
142 } // namespace
143 
144 #ifdef __cplusplus
145 extern "C" {
146 #endif
147 
OH_ArkUI_QueryModuleInterface(ArkUI_NativeAPIVariantKind type, int32_t version)148 void* OH_ArkUI_QueryModuleInterface(ArkUI_NativeAPIVariantKind type, int32_t version)
149 {
150     if (!OHOS::Ace::NodeModel::InitialFullImpl()) {
151         TAG_LOGE(OHOS::Ace::AceLogTag::ACE_NATIVE_NODE,
152             "fail to get %{public}d node api family of %{public}d version, impl library is not found", type, version);
153         return nullptr;
154     }
155     switch (type) {
156         case ARKUI_NATIVE_NODE: {
157             switch (version) {
158                 case 0:
159                 case 1:
160                     return &nodeImpl_compatible;
161                 default: {
162                     TAG_LOGE(OHOS::Ace::AceLogTag::ACE_NATIVE_NODE,
163                         "fail to get basic node api family, version is incorrect: %{public}d", version);
164                     return nullptr;
165                 }
166             }
167             break;
168         }
169         case ARKUI_NATIVE_DIALOG: {
170             switch (version) {
171                 case 0:
172                 case 1:
173                     return &dialogImpl_1;
174                 default: {
175                     TAG_LOGE(OHOS::Ace::AceLogTag::ACE_NATIVE_NODE,
176                         "fail to get dialog api family, version is incorrect: %{public}d", version);
177                     return nullptr;
178                 }
179             }
180         }
181         case ARKUI_NATIVE_GESTURE: {
182             switch (version) {
183                 case 0:
184                 case 1:
185                     return &gestureImpl_1;
186                 default: {
187                     TAG_LOGE(OHOS::Ace::AceLogTag::ACE_NATIVE_NODE,
188                         "fail to get gesture api family, version is incorrect: %{public}d", version);
189                     return nullptr;
190                 }
191             }
192             break;
193         }
194         default: {
195             TAG_LOGE(OHOS::Ace::AceLogTag::ACE_NATIVE_NODE,
196                 "fail to get %{public}d node api family, version is incorrect: %{public}d", type, version);
197             return nullptr;
198         }
199     }
200 }
201 
OH_ArkUI_GetNativeAPI(ArkUI_NativeAPIVariantKind type, int32_t version)202 void* OH_ArkUI_GetNativeAPI(ArkUI_NativeAPIVariantKind type, int32_t version)
203 {
204     return OH_ArkUI_QueryModuleInterface(type, version);
205 }
206 
OH_ArkUI_QueryModuleInterfaceByName(ArkUI_NativeAPIVariantKind type, const char* structName)207 void* OH_ArkUI_QueryModuleInterfaceByName(ArkUI_NativeAPIVariantKind type, const char* structName)
208 {
209     if (!OHOS::Ace::NodeModel::InitialFullImpl()) {
210         TAG_LOGE(OHOS::Ace::AceLogTag::ACE_NATIVE_NODE,
211             "fail to get %{public}d node api family, impl library is not found", type);
212         return nullptr;
213     }
214     switch (type) {
215         case ARKUI_NATIVE_NODE:
216             if (strcmp(structName, "ArkUI_NativeNodeAPI_1") == 0) {
217                 return &nodeImpl_1;
218             }
219             break;
220         case ARKUI_NATIVE_DIALOG:
221             if (strcmp(structName, "ArkUI_NativeDialogAPI_1") == 0) {
222                 return &dialogImpl_1;
223             }
224             break;
225         case ARKUI_NATIVE_GESTURE:
226             if (strcmp(structName, "ArkUI_NativeGestureAPI_1") == 0) {
227                 return &gestureImpl_1;
228             }
229             break;
230         case ARKUI_NATIVE_ANIMATE:
231             if (strcmp(structName, "ArkUI_NativeAnimateAPI_1") == 0) {
232                 return &animateImpl_1;
233             }
234             break;
235         default:
236             break;
237     }
238     return nullptr;
239 }
240 
241 #ifdef __cplusplus
242 };
243 #endif
244