1  /*
2   * Copyright (c) 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 <cstdint>
17  
18  #include "native_node.h"
19  #include "native_type.h"
20  #include "node/node_model.h"
21  
22  #include "base/error/error_code.h"
23  #include "base/utils/utils.h"
24  #include "core/interfaces/arkoala/arkoala_api.h"
25  
26  #ifdef __cplusplus
27  extern "C" {
28  #endif
29  
OH_ArkUI_NodeAdapter_Create(void)30  ArkUI_NodeAdapterHandle OH_ArkUI_NodeAdapter_Create(void)
31  {
32      auto* fullImpl = OHOS::Ace::NodeModel::GetFullImpl();
33      CHECK_NULL_RETURN(fullImpl, nullptr);
34      auto* nodeAdapter = fullImpl->getNodeAdapterAPI()->create();
35      return reinterpret_cast<ArkUI_NodeAdapterHandle>(nodeAdapter);
36  }
37  
OH_ArkUI_NodeAdapter_Dispose(ArkUI_NodeAdapterHandle handle)38  void OH_ArkUI_NodeAdapter_Dispose(ArkUI_NodeAdapterHandle handle)
39  {
40      CHECK_NULL_VOID(handle);
41      auto* fullImpl = OHOS::Ace::NodeModel::GetFullImpl();
42      CHECK_NULL_VOID(fullImpl);
43      fullImpl->getNodeAdapterAPI()->dispose(reinterpret_cast<ArkUINodeAdapterHandle>(handle));
44  }
45  
OH_ArkUI_NodeAdapter_SetTotalNodeCount(ArkUI_NodeAdapterHandle handle,uint32_t size)46  int32_t OH_ArkUI_NodeAdapter_SetTotalNodeCount(ArkUI_NodeAdapterHandle handle, uint32_t size)
47  {
48      CHECK_NULL_RETURN(handle, OHOS::Ace::ERROR_CODE_PARAM_INVALID);
49      auto* fullImpl = OHOS::Ace::NodeModel::GetFullImpl();
50      CHECK_NULL_RETURN(fullImpl, OHOS::Ace::ERROR_CODE_NATIVE_IMPL_LIBRARY_NOT_FOUND);
51      return fullImpl->getNodeAdapterAPI()->setTotalNodeCount(reinterpret_cast<ArkUINodeAdapterHandle>(handle), size);
52  }
53  
OH_ArkUI_NodeAdapter_GetTotalNodeCount(ArkUI_NodeAdapterHandle handle)54  uint32_t OH_ArkUI_NodeAdapter_GetTotalNodeCount(ArkUI_NodeAdapterHandle handle)
55  {
56      CHECK_NULL_RETURN(handle, OHOS::Ace::ERROR_CODE_PARAM_INVALID);
57      auto* fullImpl = OHOS::Ace::NodeModel::GetFullImpl();
58      CHECK_NULL_RETURN(fullImpl, OHOS::Ace::ERROR_CODE_NATIVE_IMPL_LIBRARY_NOT_FOUND);
59      return fullImpl->getNodeAdapterAPI()->getTotalNodeCount(reinterpret_cast<ArkUINodeAdapterHandle>(handle));
60  }
61  
62  typedef void (*InnerArkUINodeAdapterEvent)(ArkUINodeAdapterEvent* event);
OH_ArkUI_NodeAdapter_RegisterEventReceiver(ArkUI_NodeAdapterHandle handle,void * userData,void (* receiver)(ArkUI_NodeAdapterEvent * event))63  int32_t OH_ArkUI_NodeAdapter_RegisterEventReceiver(
64      ArkUI_NodeAdapterHandle handle, void* userData, void (*receiver)(ArkUI_NodeAdapterEvent* event))
65  {
66      CHECK_NULL_RETURN(handle, OHOS::Ace::ERROR_CODE_PARAM_INVALID);
67      auto* fullImpl = OHOS::Ace::NodeModel::GetFullImpl();
68      CHECK_NULL_RETURN(fullImpl, OHOS::Ace::ERROR_CODE_NATIVE_IMPL_LIBRARY_NOT_FOUND);
69      return fullImpl->getNodeAdapterAPI()->registerEventReceiver(reinterpret_cast<ArkUINodeAdapterHandle>(handle),
70          userData, reinterpret_cast<InnerArkUINodeAdapterEvent>(receiver));
71  }
72  
OH_ArkUI_NodeAdapter_UnregisterEventReceiver(ArkUI_NodeAdapterHandle handle)73  void OH_ArkUI_NodeAdapter_UnregisterEventReceiver(ArkUI_NodeAdapterHandle handle)
74  {
75      CHECK_NULL_VOID(handle);
76      auto* fullImpl = OHOS::Ace::NodeModel::GetFullImpl();
77      CHECK_NULL_VOID(fullImpl);
78      fullImpl->getNodeAdapterAPI()->unregisterEventReceiver(reinterpret_cast<ArkUINodeAdapterHandle>(handle));
79  }
80  
OH_ArkUI_NodeAdapter_ReloadAllItems(ArkUI_NodeAdapterHandle handle)81  int32_t OH_ArkUI_NodeAdapter_ReloadAllItems(ArkUI_NodeAdapterHandle handle)
82  {
83      CHECK_NULL_RETURN(handle, OHOS::Ace::ERROR_CODE_PARAM_INVALID);
84      auto* fullImpl = OHOS::Ace::NodeModel::GetFullImpl();
85      CHECK_NULL_RETURN(fullImpl, OHOS::Ace::ERROR_CODE_NATIVE_IMPL_LIBRARY_NOT_FOUND);
86      return fullImpl->getNodeAdapterAPI()->notifyItemReloaded(reinterpret_cast<ArkUINodeAdapterHandle>(handle));
87  }
88  
OH_ArkUI_NodeAdapter_ReloadItem(ArkUI_NodeAdapterHandle handle,uint32_t startPosition,uint32_t itemCount)89  int32_t OH_ArkUI_NodeAdapter_ReloadItem(
90      ArkUI_NodeAdapterHandle handle, uint32_t startPosition, uint32_t itemCount)
91  {
92      CHECK_NULL_RETURN(handle, OHOS::Ace::ERROR_CODE_PARAM_INVALID);
93      auto* fullImpl = OHOS::Ace::NodeModel::GetFullImpl();
94      CHECK_NULL_RETURN(fullImpl, OHOS::Ace::ERROR_CODE_NATIVE_IMPL_LIBRARY_NOT_FOUND);
95      return fullImpl->getNodeAdapterAPI()->notifyItemChanged(
96          reinterpret_cast<ArkUINodeAdapterHandle>(handle), startPosition, itemCount);
97  }
98  
OH_ArkUI_NodeAdapter_RemoveItem(ArkUI_NodeAdapterHandle handle,uint32_t startPosition,uint32_t itemCount)99  int32_t OH_ArkUI_NodeAdapter_RemoveItem(
100      ArkUI_NodeAdapterHandle handle, uint32_t startPosition, uint32_t itemCount)
101  {
102      CHECK_NULL_RETURN(handle, OHOS::Ace::ERROR_CODE_PARAM_INVALID);
103      auto* fullImpl = OHOS::Ace::NodeModel::GetFullImpl();
104      CHECK_NULL_RETURN(fullImpl, OHOS::Ace::ERROR_CODE_NATIVE_IMPL_LIBRARY_NOT_FOUND);
105      return fullImpl->getNodeAdapterAPI()->notifyItemRemoved(
106          reinterpret_cast<ArkUINodeAdapterHandle>(handle), startPosition, itemCount);
107  }
108  
OH_ArkUI_NodeAdapter_InsertItem(ArkUI_NodeAdapterHandle handle,uint32_t startPosition,uint32_t itemCount)109  int32_t OH_ArkUI_NodeAdapter_InsertItem(
110      ArkUI_NodeAdapterHandle handle, uint32_t startPosition, uint32_t itemCount)
111  {
112      CHECK_NULL_RETURN(handle, OHOS::Ace::ERROR_CODE_PARAM_INVALID);
113      auto* fullImpl = OHOS::Ace::NodeModel::GetFullImpl();
114      CHECK_NULL_RETURN(fullImpl, OHOS::Ace::ERROR_CODE_NATIVE_IMPL_LIBRARY_NOT_FOUND);
115      return fullImpl->getNodeAdapterAPI()->notifyItemInserted(
116          reinterpret_cast<ArkUINodeAdapterHandle>(handle), startPosition, itemCount);
117  }
118  
OH_ArkUI_NodeAdapter_MoveItem(ArkUI_NodeAdapterHandle handle,uint32_t from,uint32_t to)119  int32_t OH_ArkUI_NodeAdapter_MoveItem(ArkUI_NodeAdapterHandle handle, uint32_t from, uint32_t to)
120  {
121      CHECK_NULL_RETURN(handle, OHOS::Ace::ERROR_CODE_PARAM_INVALID);
122      auto* fullImpl = OHOS::Ace::NodeModel::GetFullImpl();
123      CHECK_NULL_RETURN(fullImpl, OHOS::Ace::ERROR_CODE_NATIVE_IMPL_LIBRARY_NOT_FOUND);
124      return fullImpl->getNodeAdapterAPI()->notifyItemMoved(reinterpret_cast<ArkUINodeAdapterHandle>(handle), from, to);
125  }
126  
OH_ArkUI_NodeAdapter_GetAllItems(ArkUI_NodeAdapterHandle handle,ArkUI_NodeHandle ** items,uint32_t * size)127  int32_t OH_ArkUI_NodeAdapter_GetAllItems(ArkUI_NodeAdapterHandle handle, ArkUI_NodeHandle** items, uint32_t* size)
128  {
129      CHECK_NULL_RETURN(handle, OHOS::Ace::ERROR_CODE_PARAM_INVALID);
130      auto* fullImpl = OHOS::Ace::NodeModel::GetFullImpl();
131      CHECK_NULL_RETURN(fullImpl, OHOS::Ace::ERROR_CODE_NATIVE_IMPL_LIBRARY_NOT_FOUND);
132      ArkUINodeHandle* innerNodes = nullptr;
133      uint32_t totalSize = 0;
134      auto error = fullImpl->getNodeAdapterAPI()->getAllItem(
135          reinterpret_cast<ArkUINodeAdapterHandle>(handle), &innerNodes, &totalSize);
136      if (error != 0) {
137          return error;
138      }
139      *size = totalSize;
140      if (*size == 0) {
141          return OHOS::Ace::ERROR_CODE_NO_ERROR;
142      }
143      *items = new ArkUI_NodeHandle[*size] {};
144      for (uint32_t i = 0; i < *size; i++) {
145          (*items)[i] = reinterpret_cast<ArkUI_NodeHandle>(fullImpl->getExtendedAPI()->getAttachNodePtr(innerNodes[i]));
146      }
147      delete[] innerNodes;
148      return OHOS::Ace::ERROR_CODE_NO_ERROR;
149  }
150  
OH_ArkUI_NodeAdapterEvent_GetUserData(ArkUI_NodeAdapterEvent * event)151  void* OH_ArkUI_NodeAdapterEvent_GetUserData(ArkUI_NodeAdapterEvent* event)
152  {
153      CHECK_NULL_RETURN(event, nullptr);
154      auto* innerEvent = reinterpret_cast<ArkUINodeAdapterEvent*>(event);
155      return reinterpret_cast<void*>(innerEvent->extraParam);
156  }
157  
OH_ArkUI_NodeAdapterEvent_GetType(ArkUI_NodeAdapterEvent * event)158  ArkUI_NodeAdapterEventType OH_ArkUI_NodeAdapterEvent_GetType(ArkUI_NodeAdapterEvent* event)
159  {
160      CHECK_NULL_RETURN(event, ArkUI_NodeAdapterEventType(-1));
161      auto* innerEvent = reinterpret_cast<ArkUINodeAdapterEvent*>(event);
162      return static_cast<ArkUI_NodeAdapterEventType>(innerEvent->type);
163  }
164  
OH_ArkUI_NodeAdapterEvent_GetRemovedNode(ArkUI_NodeAdapterEvent * event)165  ArkUI_NodeHandle OH_ArkUI_NodeAdapterEvent_GetRemovedNode(ArkUI_NodeAdapterEvent* event)
166  {
167      CHECK_NULL_RETURN(event, nullptr);
168      auto* fullImpl = OHOS::Ace::NodeModel::GetFullImpl();
169      CHECK_NULL_RETURN(fullImpl, nullptr);
170      auto* innerEvent = reinterpret_cast<ArkUINodeAdapterEvent*>(event);
171      return reinterpret_cast<ArkUI_NodeHandle>(fullImpl->getExtendedAPI()->getAttachNodePtr(innerEvent->handle));
172  }
173  
OH_ArkUI_NodeAdapterEvent_GetHostNode(ArkUI_NodeAdapterEvent * event)174  ArkUI_NodeHandle OH_ArkUI_NodeAdapterEvent_GetHostNode(ArkUI_NodeAdapterEvent* event)
175  {
176      CHECK_NULL_RETURN(event, nullptr);
177      auto* fullImpl = OHOS::Ace::NodeModel::GetFullImpl();
178      CHECK_NULL_RETURN(fullImpl, nullptr);
179      auto* innerEvent = reinterpret_cast<ArkUINodeAdapterEvent*>(event);
180      return reinterpret_cast<ArkUI_NodeHandle>(fullImpl->getExtendedAPI()->getAttachNodePtr(innerEvent->handle));
181  }
182  
OH_ArkUI_NodeAdapterEvent_GetItemIndex(ArkUI_NodeAdapterEvent * event)183  uint32_t OH_ArkUI_NodeAdapterEvent_GetItemIndex(ArkUI_NodeAdapterEvent* event)
184  {
185      CHECK_NULL_RETURN(event, 0);
186      auto* innerEvent = reinterpret_cast<ArkUINodeAdapterEvent*>(event);
187      return innerEvent->index;
188  }
189  
OH_ArkUI_NodeAdapterEvent_SetItem(ArkUI_NodeAdapterEvent * event,ArkUI_NodeHandle handle)190  int32_t OH_ArkUI_NodeAdapterEvent_SetItem(ArkUI_NodeAdapterEvent* event, ArkUI_NodeHandle handle)
191  {
192      CHECK_NULL_RETURN(event, OHOS::Ace::ERROR_CODE_PARAM_INVALID);
193      CHECK_NULL_RETURN(handle, OHOS::Ace::ERROR_CODE_PARAM_INVALID);
194      auto* innerEvent = reinterpret_cast<ArkUINodeAdapterEvent*>(event);
195      innerEvent->handle = handle->uiNodeHandle;
196      innerEvent->nodeSet = true;
197      return OHOS::Ace::ERROR_CODE_NO_ERROR;
198  }
199  
OH_ArkUI_NodeAdapterEvent_SetNodeId(ArkUI_NodeAdapterEvent * event,int32_t id)200  int32_t OH_ArkUI_NodeAdapterEvent_SetNodeId(ArkUI_NodeAdapterEvent* event, int32_t id)
201  {
202      CHECK_NULL_RETURN(event, OHOS::Ace::ERROR_CODE_PARAM_INVALID);
203      auto* innerEvent = reinterpret_cast<ArkUINodeAdapterEvent*>(event);
204      innerEvent->id = id;
205      innerEvent->idSet = true;
206      return OHOS::Ace::ERROR_CODE_NO_ERROR;
207  }
208  
OH_ArkUI_GetContextByNode(ArkUI_NodeHandle node)209  ArkUI_ContextHandle OH_ArkUI_GetContextByNode(ArkUI_NodeHandle node)
210  {
211      CHECK_NULL_RETURN(node, nullptr);
212      auto* fullImpl = OHOS::Ace::NodeModel::GetFullImpl();
213      CHECK_NULL_RETURN(fullImpl, nullptr);
214      auto basicAPI = fullImpl->getBasicAPI();
215      CHECK_NULL_RETURN(basicAPI, nullptr);
216      int32_t instanceId = basicAPI->getContextByNode(node->uiNodeHandle);
217      if (instanceId < 0) {
218          return nullptr;
219      }
220      return new ArkUI_Context({ .id = instanceId });
221  }
222  
223  #ifdef __cplusplus
224  };
225  #endif
226