/* * Copyright (c) 2020-2021 Huawei Device Co., Ltd. * * HDF is dual licensed: you can use it either under the terms of * the GPL, or the BSD license, at your option. * See the LICENSE file in the root of this repository for complete details. */ #include "hcs_parser.h" #include "hcs_blob_if.h" #include "hcs_generate_tree.h" #include "hdf_log.h" #include "osal_mem.h" #define HDF_LOG_TAG hcs_parser static int32_t GetHcsTreeSize(const char *blob, int32_t nodeLength) { return GenerateCfgTree(blob, nodeLength, NULL, NULL); } bool HcsDecompile(const char *hcsBlob, uint32_t offset, struct DeviceResourceNode **root) { int32_t nodeLength = HcsGetNodeLength(hcsBlob + offset); int32_t treeMemLength; char *treeMem = NULL; int32_t treeLayer; if (nodeLength < 0) { HDF_LOGE("%s failed, HcsGetNodeLength error", __func__); return false; } treeMemLength = GetHcsTreeSize(hcsBlob + offset, nodeLength); if (treeMemLength <= 0) { HDF_LOGE("%s failed, GetHcsTreeSize error, treeMemLength = %d", __func__, treeMemLength); return false; } treeMem = (char *)OsalMemCalloc(treeMemLength); if (treeMem == NULL) { HDF_LOGE("%s failed, OsalMemCalloc error", __func__); return false; } treeLayer = GenerateCfgTree(hcsBlob + offset, nodeLength, treeMem, root); if (treeLayer <= 0) { HDF_LOGE("%s failed, the treeLayer is %d", __func__, treeLayer); OsalMemFree(treeMem); *root = NULL; return false; } return true; }