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