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