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
25namespace {
26
27constexpr int32_t CURRENT_NATIVE_NODE_API_VERSION = 1;
28
29ArkUI_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
48ArkUI_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
92ArkUI_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
113constexpr int32_t CURRENT_NATIVE_GESTURE_API_VERSION = 1;
114ArkUI_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
135ArkUI_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
145extern "C" {
146#endif
147
148void* 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
202void* OH_ArkUI_GetNativeAPI(ArkUI_NativeAPIVariantKind type, int32_t version)
203{
204    return OH_ArkUI_QueryModuleInterface(type, version);
205}
206
207void* 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