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