- Add new interface GetPendingSettings() to check and see if "Redfish.Settings" is in the JSON data or not. If "Redfish.Settings" is found, return the URI and the context to Redfish pending settings. - Fix missing FreePool() and uncrustify issues.
Signed-off-by: Nickle Wang <nick...@nvidia.com> Cc: Abner Chang <abner.ch...@amd.com> Cc: Igor Kulchytskyy <ig...@ami.com> Cc: Nick Ramirez <nrami...@nvidia.com> --- .../Library/RedfishFeatureUtilityLib.h | 260 ++-- .../RedfishFeatureUtilityLib.c | 1118 +++++++++-------- 2 files changed, 770 insertions(+), 608 deletions(-) diff --git a/RedfishClientPkg/Include/Library/RedfishFeatureUtilityLib.h b/RedfishClientPkg/Include/Library/RedfishFeatureUtilityLib.h index 1325976d8c..857f8c6ce6 100644 --- a/RedfishClientPkg/Include/Library/RedfishFeatureUtilityLib.h +++ b/RedfishClientPkg/Include/Library/RedfishFeatureUtilityLib.h @@ -2,6 +2,7 @@ This file defines the Redfish Feature Utility Library interface. (C) Copyright 2021-2022 Hewlett Packard Enterprise Development LP<BR> + Copyright (c) 2023, NVIDIA CORPORATION & AFFILIATES. All rights reserved. SPDX-License-Identifier: BSD-2-Clause-Patent @@ -18,16 +19,16 @@ // Definition of REDFISH_FEATURE_ARRAY_TYPE_CONFIG_LANG // typedef struct { - UINTN Index; - EFI_STRING ConfigureLang; + UINTN Index; + EFI_STRING ConfigureLang; } REDFISH_FEATURE_ARRAY_TYPE_CONFIG_LANG; // // Definition of REDFISH_FEATURE_ARRAY_TYPE_CONFIG_LANG_LIST // typedef struct { - UINTN Count; - REDFISH_FEATURE_ARRAY_TYPE_CONFIG_LANG *List; + UINTN Count; + REDFISH_FEATURE_ARRAY_TYPE_CONFIG_LANG *List; } REDFISH_FEATURE_ARRAY_TYPE_CONFIG_LANG_LIST; /** @@ -44,9 +45,9 @@ typedef struct { **/ EFI_STATUS GetResourceByUri ( - IN REDFISH_SERVICE *Service, - IN EFI_STRING ResourceUri, - OUT REDFISH_RESPONSE *Response + IN REDFISH_SERVICE *Service, + IN EFI_STRING ResourceUri, + OUT REDFISH_RESPONSE *Response ); /** @@ -66,9 +67,9 @@ GetResourceByUri ( **/ EFI_STATUS IsRedpathArray ( - IN EFI_STRING ConfigureLang, - OUT EFI_STRING *ArraySignatureOpen, - OUT EFI_STRING *ArraySignatureClose + IN EFI_STRING ConfigureLang, + OUT EFI_STRING *ArraySignatureOpen, + OUT EFI_STRING *ArraySignatureClose ); /** @@ -106,8 +107,8 @@ RedfishFeatureGetUnifiedArrayTypeConfigureLang ( **/ EFI_STATUS CopyConfiglanguageList ( - IN REDFISH_FEATURE_ARRAY_TYPE_CONFIG_LANG_LIST *SourceConfigureLangList, - OUT REDFISH_FEATURE_ARRAY_TYPE_CONFIG_LANG_LIST *DestConfigureLangList + IN REDFISH_FEATURE_ARRAY_TYPE_CONFIG_LANG_LIST *SourceConfigureLangList, + OUT REDFISH_FEATURE_ARRAY_TYPE_CONFIG_LANG_LIST *DestConfigureLangList ); /** @@ -121,7 +122,7 @@ CopyConfiglanguageList ( **/ UINTN GetNumberOfRedpathNodes ( - IN EFI_STRING NodeString + IN EFI_STRING NodeString ); /** @@ -138,9 +139,9 @@ GetNumberOfRedpathNodes ( **/ EFI_STRING GetRedpathNodeByIndex ( - IN EFI_STRING NodeString, - IN UINTN Index, - OUT EFI_STRING *EndOfNodePtr OPTIONAL + IN EFI_STRING NodeString, + IN UINTN Index, + OUT EFI_STRING *EndOfNodePtr OPTIONAL ); /** @@ -159,9 +160,9 @@ GetRedpathNodeByIndex ( **/ EFI_STATUS GetArrayIndexFromArrayTypeConfigureLang ( - IN CHAR16 *ConfigureLang, - OUT CHAR16 **UnifiedConfigureLang, - OUT UINTN *Index + IN CHAR16 *ConfigureLang, + OUT CHAR16 **UnifiedConfigureLang, + OUT UINTN *Index ); /** @@ -175,7 +176,7 @@ GetArrayIndexFromArrayTypeConfigureLang ( **/ UINTN ConfiglanguageGetInstanceIndex ( - IN EFI_STRING ConfigureLang + IN EFI_STRING ConfigureLang ); /** @@ -191,7 +192,7 @@ ConfiglanguageGetInstanceIndex ( **/ EFI_STATUS DestroyConfiglanguageList ( - IN REDFISH_FEATURE_ARRAY_TYPE_CONFIG_LANG_LIST *ConfigureLangList + IN REDFISH_FEATURE_ARRAY_TYPE_CONFIG_LANG_LIST *ConfigureLangList ); /** @@ -211,9 +212,9 @@ DestroyConfiglanguageList ( **/ EFI_STATUS SetResourceConfigLangMemberInstance ( - IN EFI_STRING *DestConfigLang, - IN UINTN MaxtLengthConfigLang, - IN REDFISH_FEATURE_ARRAY_TYPE_CONFIG_LANG *ConfigLangInstance + IN EFI_STRING *DestConfigLang, + IN UINTN MaxtLengthConfigLang, + IN REDFISH_FEATURE_ARRAY_TYPE_CONFIG_LANG *ConfigLangInstance ); /** @@ -229,8 +230,8 @@ SetResourceConfigLangMemberInstance ( **/ EFI_STATUS GetArraykeyFromUri ( - IN CHAR8 *Uri, - OUT CHAR8 **ArrayKey + IN CHAR8 *Uri, + OUT CHAR8 **ArrayKey ); /** @@ -248,10 +249,10 @@ GetArraykeyFromUri ( **/ EFI_STATUS ApplyFeatureSettingsStringType ( - IN CHAR8 *Schema, - IN CHAR8 *Version, - IN EFI_STRING ConfigureLang, - IN CHAR8 *FeatureValue + IN CHAR8 *Schema, + IN CHAR8 *Version, + IN EFI_STRING ConfigureLang, + IN CHAR8 *FeatureValue ); /** @@ -269,10 +270,10 @@ ApplyFeatureSettingsStringType ( **/ EFI_STATUS ApplyFeatureSettingsNumericType ( - IN CHAR8 *Schema, - IN CHAR8 *Version, - IN EFI_STRING ConfigureLang, - IN INTN FeatureValue + IN CHAR8 *Schema, + IN CHAR8 *Version, + IN EFI_STRING ConfigureLang, + IN INTN FeatureValue ); /** @@ -290,10 +291,10 @@ ApplyFeatureSettingsNumericType ( **/ EFI_STATUS ApplyFeatureSettingsBooleanType ( - IN CHAR8 *Schema, - IN CHAR8 *Version, - IN EFI_STRING ConfigureLang, - IN BOOLEAN FeatureValue + IN CHAR8 *Schema, + IN CHAR8 *Version, + IN EFI_STRING ConfigureLang, + IN BOOLEAN FeatureValue ); /** @@ -312,11 +313,11 @@ ApplyFeatureSettingsBooleanType ( **/ EFI_STATUS ApplyFeatureSettingsVagueType ( - IN CHAR8 *Schema, - IN CHAR8 *Version, - IN EFI_STRING ConfigureLang, - IN RedfishCS_EmptyProp_KeyValue *VagueValuePtr, - IN UINT32 NumberOfVagueValues + IN CHAR8 *Schema, + IN CHAR8 *Version, + IN EFI_STRING ConfigureLang, + IN RedfishCS_EmptyProp_KeyValue *VagueValuePtr, + IN UINT32 NumberOfVagueValues ); /** @@ -355,9 +356,9 @@ ApplyFeatureSettingsStringArrayType ( **/ EFI_STATUS ApplyFeatureSettingsNumericArrayType ( - IN CHAR8 *Schema, - IN CHAR8 *Version, - IN EFI_STRING ConfigureLang, + IN CHAR8 *Schema, + IN CHAR8 *Version, + IN EFI_STRING ConfigureLang, IN RedfishCS_int64_Array *ArrayHead ); @@ -398,11 +399,11 @@ ApplyFeatureSettingsBooleanArrayType ( **/ EFI_STATUS CreatePayloadToPostResource ( - IN REDFISH_SERVICE *Service, - IN REDFISH_PAYLOAD *TargetPayload, - IN CHAR8 *Json, - OUT EFI_STRING *Location, - OUT CHAR8 **Etag + IN REDFISH_SERVICE *Service, + IN REDFISH_PAYLOAD *TargetPayload, + IN CHAR8 *Json, + OUT EFI_STRING *Location, + OUT CHAR8 **Etag ); /** @@ -420,10 +421,10 @@ CreatePayloadToPostResource ( **/ EFI_STATUS CreatePayloadToPatchResource ( - IN REDFISH_SERVICE *Service, - IN REDFISH_PAYLOAD *TargetPayload, - IN CHAR8 *Json, - OUT CHAR8 **Etag + IN REDFISH_SERVICE *Service, + IN REDFISH_PAYLOAD *TargetPayload, + IN CHAR8 *Json, + OUT CHAR8 **Etag ); /** @@ -456,8 +457,8 @@ RedfisSetRedfishUri ( **/ EFI_STRING GetPropertyFromConfigureLang ( - IN EFI_STRING ResourceUri, - IN EFI_STRING ConfigureLang + IN EFI_STRING ResourceUri, + IN EFI_STRING ConfigureLang ); /** @@ -475,10 +476,10 @@ GetPropertyFromConfigureLang ( **/ CHAR8 * GetPropertyStringValue ( - IN CHAR8 *Schema, - IN CHAR8 *Version, - IN EFI_STRING PropertyName, - IN EFI_STRING ConfigureLang + IN CHAR8 *Schema, + IN CHAR8 *Version, + IN EFI_STRING PropertyName, + IN EFI_STRING ConfigureLang ); /** @@ -496,10 +497,10 @@ GetPropertyStringValue ( **/ INT64 * GetPropertyNumericValue ( - IN CHAR8 *Schema, - IN CHAR8 *Version, - IN EFI_STRING PropertyName, - IN EFI_STRING ConfigureLang + IN CHAR8 *Schema, + IN CHAR8 *Version, + IN EFI_STRING PropertyName, + IN EFI_STRING ConfigureLang ); /** @@ -516,10 +517,10 @@ GetPropertyNumericValue ( **/ BOOLEAN * GetPropertyBooleanValue ( - IN CHAR8 *Schema, - IN CHAR8 *Version, - IN EFI_STRING PropertyName, - IN EFI_STRING ConfigureLang + IN CHAR8 *Schema, + IN CHAR8 *Version, + IN EFI_STRING PropertyName, + IN EFI_STRING ConfigureLang ); /** @@ -535,8 +536,8 @@ GetPropertyBooleanValue ( **/ BOOLEAN PropertyChecker ( - IN VOID *PropertyBuffer, - IN BOOLEAN ProvisionMode + IN VOID *PropertyBuffer, + IN BOOLEAN ProvisionMode ); /** @@ -583,7 +584,7 @@ GetEtagWithUri ( **/ EFI_STRING GetOdataId ( - IN REDFISH_PAYLOAD *Payload + IN REDFISH_PAYLOAD *Payload ); /** @@ -599,8 +600,8 @@ GetOdataId ( **/ EFI_STRING GetConfigureLang ( - IN CHAR8 *Uri, - IN CHAR8 *PropertyName OPTIONAL + IN CHAR8 *Uri, + IN CHAR8 *PropertyName OPTIONAL ); /** @@ -615,7 +616,7 @@ GetConfigureLang ( **/ EFI_STRING RedfishGetUri ( - IN EFI_STRING ConfigLang + IN EFI_STRING ConfigLang ); /** @@ -630,7 +631,7 @@ RedfishGetUri ( **/ EFI_STRING RedfishGetConfigLanguage ( - IN EFI_STRING Uri + IN EFI_STRING Uri ); /** @@ -645,7 +646,7 @@ RedfishGetConfigLanguage ( **/ CHAR8 * StrUnicodeToAscii ( - IN EFI_STRING UnicodeStr + IN EFI_STRING UnicodeStr ); /** @@ -677,9 +678,9 @@ StrAsciiToUnicode ( **/ BOOLEAN CheckEtag ( - IN EFI_STRING Uri, - IN CHAR8 *EtagInHeader, - IN CHAR8 *EtagInJson + IN EFI_STRING Uri, + IN CHAR8 *EtagInHeader, + IN CHAR8 *EtagInJson ); /** @@ -697,11 +698,11 @@ CheckEtag ( **/ CHAR8 ** GetPropertyStringArrayValue ( - IN CHAR8 *Schema, - IN CHAR8 *Version, - IN EFI_STRING PropertyName, - IN EFI_STRING ConfigureLang, - OUT UINTN *ArraySize + IN CHAR8 *Schema, + IN CHAR8 *Version, + IN EFI_STRING PropertyName, + IN EFI_STRING ConfigureLang, + OUT UINTN *ArraySize ); /** @@ -719,11 +720,11 @@ GetPropertyStringArrayValue ( **/ INT64 * GetPropertyNumericArrayValue ( - IN CHAR8 *Schema, - IN CHAR8 *Version, - IN EFI_STRING PropertyName, - IN EFI_STRING ConfigureLang, - OUT UINTN *ArraySize + IN CHAR8 *Schema, + IN CHAR8 *Version, + IN EFI_STRING PropertyName, + IN EFI_STRING ConfigureLang, + OUT UINTN *ArraySize ); /** @@ -741,11 +742,11 @@ GetPropertyNumericArrayValue ( **/ BOOLEAN * GetPropertyBooleanArrayValue ( - IN CHAR8 *Schema, - IN CHAR8 *Version, - IN EFI_STRING PropertyName, - IN EFI_STRING ConfigureLang, - OUT UINTN *ArraySize + IN CHAR8 *Schema, + IN CHAR8 *Version, + IN EFI_STRING PropertyName, + IN EFI_STRING ConfigureLang, + OUT UINTN *ArraySize ); /** @@ -764,11 +765,11 @@ GetPropertyBooleanArrayValue ( **/ RedfishCS_EmptyProp_KeyValue * GetPropertyVagueValue ( - IN CHAR8 *Schema, - IN CHAR8 *Version, - IN EFI_STRING PropertyName, - IN EFI_STRING ConfigureLang, - OUT UINT32 *NumberOfValues + IN CHAR8 *Schema, + IN CHAR8 *Version, + IN EFI_STRING PropertyName, + IN EFI_STRING ConfigureLang, + OUT UINT32 *NumberOfValues ); /** @@ -780,7 +781,7 @@ GetPropertyVagueValue ( **/ VOID FreeEmptyPropKeyValueList ( - RedfishCS_EmptyProp_KeyValue *EmptyPropKeyValueListHead + RedfishCS_EmptyProp_KeyValue *EmptyPropKeyValueListHead ); /** @@ -798,7 +799,7 @@ BOOLEAN MatchPropertyWithJsonContext ( IN EFI_STRING Property, IN CHAR8 *Json -); + ); /** @@ -814,7 +815,7 @@ MatchPropertyWithJsonContext ( **/ EFI_STATUS AddRedfishCharArray ( - IN OUT RedfishCS_char_Array **Head, + IN OUT RedfishCS_char_Array **Head, IN CHAR8 **StringArray, IN UINTN ArraySize ); @@ -833,9 +834,9 @@ AddRedfishCharArray ( **/ EFI_STATUS AddRedfishNumericArray ( - IN OUT RedfishCS_int64_Array **Head, - IN INT64 *NumericArray, - IN UINTN ArraySize + IN OUT RedfishCS_int64_Array **Head, + IN INT64 *NumericArray, + IN UINTN ArraySize ); /** @@ -856,6 +857,7 @@ AddRedfishBooleanArray ( IN BOOLEAN *BooleanArray, IN UINTN ArraySize ); + /** Check and see if value in Redfish string array are all the same as the one @@ -872,9 +874,9 @@ AddRedfishBooleanArray ( **/ BOOLEAN CompareRedfishStringArrayValues ( - IN RedfishCS_char_Array *Head, - IN CHAR8 **StringArray, - IN UINTN ArraySize + IN RedfishCS_char_Array *Head, + IN CHAR8 **StringArray, + IN UINTN ArraySize ); /** @@ -893,9 +895,9 @@ CompareRedfishStringArrayValues ( **/ BOOLEAN CompareRedfishNumericArrayValues ( - IN RedfishCS_int64_Array *Head, - IN INT64 *NumericArray, - IN UINTN ArraySize + IN RedfishCS_int64_Array *Head, + IN INT64 *NumericArray, + IN UINTN ArraySize ); /** @@ -935,10 +937,10 @@ CompareRedfishBooleanArrayValues ( **/ BOOLEAN CompareRedfishPropertyVagueValues ( - IN RedfishCS_EmptyProp_KeyValue *RedfishVagueKeyValuePtr, - IN UINT32 RedfishVagueKeyValueNumber, - IN RedfishCS_EmptyProp_KeyValue *ConfigVagueKeyValuePtr, - IN UINT32 ConfigVagueKeyValueNumber + IN RedfishCS_EmptyProp_KeyValue *RedfishVagueKeyValuePtr, + IN UINT32 RedfishVagueKeyValueNumber, + IN RedfishCS_EmptyProp_KeyValue *ConfigVagueKeyValuePtr, + IN UINT32 ConfigVagueKeyValueNumber ); /** @@ -955,9 +957,31 @@ CompareRedfishPropertyVagueValues ( **/ EFI_STATUS GetEtagAndLocation ( - IN REDFISH_RESPONSE *Response, - OUT CHAR8 **Etag, OPTIONAL + IN REDFISH_RESPONSE *Response, + OUT CHAR8 **Etag, OPTIONAL OUT EFI_STRING *Location OPTIONAL ); +/** + + Check and see if "@Redfish.Settings" exist in given Payload. If found, return the + payload and URI to pending settings. Caller has to release "SettingPayload" and + "SettingUri". + + @param[in] Payload Payload that may contain "@Redfish.Settings" + @param[out] SettingPayload Payload keeps pending settings. + @param[out] SettingUri URI to pending settings. + + @retval EFI_SUCCESS Pending settings is found and returned. + @retval Others Error happens + +**/ +EFI_STATUS +GetPendingSettings ( + IN REDFISH_SERVICE RedfishService, + IN REDFISH_PAYLOAD Payload, + OUT REDFISH_RESPONSE *SettingResponse, + OUT EFI_STRING *SettingUri + ); + #endif diff --git a/RedfishClientPkg/Library/RedfishFeatureUtilityLib/RedfishFeatureUtilityLib.c b/RedfishClientPkg/Library/RedfishFeatureUtilityLib/RedfishFeatureUtilityLib.c index bfd6fff2a7..d95d399462 100644 --- a/RedfishClientPkg/Library/RedfishFeatureUtilityLib/RedfishFeatureUtilityLib.c +++ b/RedfishClientPkg/Library/RedfishFeatureUtilityLib/RedfishFeatureUtilityLib.c @@ -2,7 +2,7 @@ Redfish feature utility library implementation (C) Copyright 2020-2022 Hewlett Packard Enterprise Development LP<BR> - Copyright (c) 2022, NVIDIA CORPORATION & AFFILIATES. All rights reserved. + Copyright (c) 2023, NVIDIA CORPORATION & AFFILIATES. All rights reserved. SPDX-License-Identifier: BSD-2-Clause-Patent @@ -10,7 +10,7 @@ #include "RedfishFeatureUtilityInternal.h" -EDKII_REDFISH_ETAG_PROTOCOL *mEtagProtocol = NULL; +EDKII_REDFISH_ETAG_PROTOCOL *mEtagProtocol = NULL; EDKII_REDFISH_CONFIG_LANG_MAP_PROTOCOL *mConfigLangMapProtocol = NULL; /** @@ -33,7 +33,7 @@ RedfishLocateProtocol ( { EFI_STATUS Status; - if (ProtocolInstance == NULL || ProtocolGuid == NULL) { + if ((ProtocolInstance == NULL) || (ProtocolGuid == NULL)) { return EFI_INVALID_PARAMETER; } @@ -62,14 +62,14 @@ RedfishLocateProtocol ( **/ EFI_STATUS GetArraykeyFromUri ( - IN CHAR8 *Uri, - OUT CHAR8 **ArrayKey + IN CHAR8 *Uri, + OUT CHAR8 **ArrayKey ) { - CHAR8 *LeftBracket; - UINTN Index; + CHAR8 *LeftBracket; + UINTN Index; - if (IS_EMPTY_STRING (Uri) || ArrayKey == NULL) { + if (IS_EMPTY_STRING (Uri) || (ArrayKey == NULL)) { return EFI_INVALID_PARAMETER; } @@ -207,19 +207,19 @@ GetEtagWithUri ( **/ CHAR8 * StrUnicodeToAscii ( - IN EFI_STRING UnicodeStr + IN EFI_STRING UnicodeStr ) { - CHAR8 *AsciiStr; - UINTN AsciiStrSize; - EFI_STATUS Status; + CHAR8 *AsciiStr; + UINTN AsciiStrSize; + EFI_STATUS Status; if (IS_EMPTY_STRING (UnicodeStr)) { return NULL; } AsciiStrSize = StrLen (UnicodeStr) + 1; - AsciiStr = AllocatePool (AsciiStrSize); + AsciiStr = AllocatePool (AsciiStrSize); if (AsciiStr == NULL) { return NULL; } @@ -258,7 +258,7 @@ StrAsciiToUnicode ( } UnicodeStrSize = (AsciiStrLen (AsciiStr) + 1) * sizeof (CHAR16); - UnicodeStr = AllocatePool (UnicodeStrSize); + UnicodeStr = AllocatePool (UnicodeStrSize); if (UnicodeStr == NULL) { return NULL; } @@ -288,16 +288,16 @@ StrAsciiToUnicode ( **/ EFI_STATUS ApplyFeatureSettingsStringType ( - IN CHAR8 *Schema, - IN CHAR8 *Version, - IN EFI_STRING ConfigureLang, - IN CHAR8 *FeatureValue + IN CHAR8 *Schema, + IN CHAR8 *Version, + IN EFI_STRING ConfigureLang, + IN CHAR8 *FeatureValue ) { - EFI_STATUS Status; - EDKII_REDFISH_VALUE RedfishValue; + EFI_STATUS Status; + EDKII_REDFISH_VALUE RedfishValue; - if (IS_EMPTY_STRING (Schema) || IS_EMPTY_STRING (Version) || IS_EMPTY_STRING (ConfigureLang) || FeatureValue == NULL) { + if (IS_EMPTY_STRING (Schema) || IS_EMPTY_STRING (Version) || IS_EMPTY_STRING (ConfigureLang) || (FeatureValue == NULL)) { return EFI_INVALID_PARAMETER; } @@ -308,9 +308,8 @@ ApplyFeatureSettingsStringType ( if (EFI_ERROR (Status)) { DEBUG ((DEBUG_ERROR, "%a, %a.%a %s failed: %r\n", __FUNCTION__, Schema, Version, ConfigureLang, Status)); } else { - if (RedfishValue.Type != REDFISH_VALUE_TYPE_STRING) { - DEBUG ((DEBUG_ERROR, "%a, %a.%a %s value is not string type\n", __FUNCTION__, Schema, Version, ConfigureLang)); + DEBUG ((DEBUG_ERROR, "%a, %a.%a %s value is not string type\n", __FUNCTION__, Schema, Version, ConfigureLang)); return EFI_DEVICE_ERROR; } @@ -350,14 +349,14 @@ ApplyFeatureSettingsStringType ( **/ EFI_STATUS ApplyFeatureSettingsNumericType ( - IN CHAR8 *Schema, - IN CHAR8 *Version, - IN EFI_STRING ConfigureLang, - IN INTN FeatureValue + IN CHAR8 *Schema, + IN CHAR8 *Version, + IN EFI_STRING ConfigureLang, + IN INTN FeatureValue ) { - EFI_STATUS Status; - EDKII_REDFISH_VALUE RedfishValue; + EFI_STATUS Status; + EDKII_REDFISH_VALUE RedfishValue; if (IS_EMPTY_STRING (Schema) || IS_EMPTY_STRING (Version) || IS_EMPTY_STRING (ConfigureLang)) { return EFI_INVALID_PARAMETER; @@ -368,11 +367,10 @@ ApplyFeatureSettingsNumericType ( // Status = RedfishPlatformConfigGetValue (Schema, Version, ConfigureLang, &RedfishValue); if (EFI_ERROR (Status)) { - DEBUG ((DEBUG_ERROR, "%a, %a.%a %s failed: %r\n", __FUNCTION__, Schema, Version, ConfigureLang, Status)); + DEBUG ((DEBUG_ERROR, "%a, %a.%a %s failed: %r\n", __FUNCTION__, Schema, Version, ConfigureLang, Status)); } else { - if (RedfishValue.Type != REDFISH_VALUE_TYPE_INTEGER) { - DEBUG ((DEBUG_ERROR, "%a, %a.%a %s value is not numeric type\n", __FUNCTION__, Schema, Version, ConfigureLang)); + DEBUG ((DEBUG_ERROR, "%a, %a.%a %s value is not numeric type\n", __FUNCTION__, Schema, Version, ConfigureLang)); return EFI_DEVICE_ERROR; } @@ -411,14 +409,14 @@ ApplyFeatureSettingsNumericType ( **/ EFI_STATUS ApplyFeatureSettingsBooleanType ( - IN CHAR8 *Schema, - IN CHAR8 *Version, - IN EFI_STRING ConfigureLang, - IN BOOLEAN FeatureValue + IN CHAR8 *Schema, + IN CHAR8 *Version, + IN EFI_STRING ConfigureLang, + IN BOOLEAN FeatureValue ) { - EFI_STATUS Status; - EDKII_REDFISH_VALUE RedfishValue; + EFI_STATUS Status; + EDKII_REDFISH_VALUE RedfishValue; if (IS_EMPTY_STRING (Schema) || IS_EMPTY_STRING (Version) || IS_EMPTY_STRING (ConfigureLang)) { return EFI_INVALID_PARAMETER; @@ -429,11 +427,10 @@ ApplyFeatureSettingsBooleanType ( // Status = RedfishPlatformConfigGetValue (Schema, Version, ConfigureLang, &RedfishValue); if (EFI_ERROR (Status)) { - DEBUG ((DEBUG_ERROR, "%a, %a.%a %s failed: %r\n", __FUNCTION__, Schema, Version, ConfigureLang, Status)); + DEBUG ((DEBUG_ERROR, "%a, %a.%a %s failed: %r\n", __FUNCTION__, Schema, Version, ConfigureLang, Status)); } else { - if (RedfishValue.Type != REDFISH_VALUE_TYPE_BOOLEAN) { - DEBUG ((DEBUG_ERROR, "%a, %a.%a %s value is not boolean type\n", __FUNCTION__, Schema, Version, ConfigureLang)); + DEBUG ((DEBUG_ERROR, "%a, %a.%a %s value is not boolean type\n", __FUNCTION__, Schema, Version, ConfigureLang)); return EFI_DEVICE_ERROR; } @@ -473,32 +470,35 @@ ApplyFeatureSettingsBooleanType ( **/ EFI_STATUS ApplyFeatureSettingsVagueType ( - IN CHAR8 *Schema, - IN CHAR8 *Version, - IN EFI_STRING ConfigureLang, - IN RedfishCS_EmptyProp_KeyValue *VagueValuePtr, - IN UINT32 NumberOfVagueValues + IN CHAR8 *Schema, + IN CHAR8 *Version, + IN EFI_STRING ConfigureLang, + IN RedfishCS_EmptyProp_KeyValue *VagueValuePtr, + IN UINT32 NumberOfVagueValues ) { - EFI_STATUS Status; - UINTN StrSize; - CHAR8 *ConfigureLangAscii; - CHAR8 *ConfigureLangKeyAscii; - EFI_STRING ConfigureKeyLang; - EDKII_REDFISH_VALUE RedfishValue; - EDKII_REDFISH_VALUE_TYPES PropertyDatatype; - RedfishCS_EmptyProp_KeyValue *CurrentVagueValuePtr; - - if (IS_EMPTY_STRING (Schema) || IS_EMPTY_STRING (Version) || IS_EMPTY_STRING (ConfigureLang) || VagueValuePtr == NULL || NumberOfVagueValues == 0) { + EFI_STATUS Status; + UINTN StrSize; + CHAR8 *ConfigureLangAscii; + CHAR8 *ConfigureLangKeyAscii; + EFI_STRING ConfigureKeyLang; + EDKII_REDFISH_VALUE RedfishValue; + EDKII_REDFISH_VALUE_TYPES PropertyDatatype; + RedfishCS_EmptyProp_KeyValue *CurrentVagueValuePtr; + + if (IS_EMPTY_STRING (Schema) || IS_EMPTY_STRING (Version) || IS_EMPTY_STRING (ConfigureLang) || (VagueValuePtr == NULL) || (NumberOfVagueValues == 0)) { return EFI_INVALID_PARAMETER; } + DEBUG ((REDFISH_DEBUG_TRACE, "%a: schema: %a %a config lang: %s NumberOfVagueValues: %d\n", __FUNCTION__, Schema, Version, ConfigureLang, NumberOfVagueValues)); + ConfigureLangAscii = AllocatePool (StrLen (ConfigureLang) + 1); if (ConfigureLangAscii == NULL) { Status = EFI_OUT_OF_RESOURCES; DEBUG ((DEBUG_ERROR, "%a, Allocate memory for generate ConfigureLang of vague key of %a.%a %s failed: %r\n", __FUNCTION__, Schema, Version, ConfigureLang, Status)); return Status; } + Status = UnicodeStrToAsciiStrS (ConfigureLang, ConfigureLangAscii, StrLen (ConfigureLang) + 1); if (EFI_ERROR (Status)) { DEBUG ((DEBUG_ERROR, "%a, Convert the configureLang of vague key of %a.%a %s failed: %r\n", __FUNCTION__, Schema, Version, ConfigureLang, Status)); @@ -510,18 +510,19 @@ ApplyFeatureSettingsVagueType ( // // Generate ConfigureLang with the key name // - //ConfigureKeyLang = GetConfigureLang (ConfigureLangAscii, CurrentVagueValuePtr->KeyNamePtr); - StrSize = AsciiStrLen (ConfigureLangAscii) + AsciiStrLen (CurrentVagueValuePtr->KeyNamePtr) + 2; + // ConfigureKeyLang = GetConfigureLang (ConfigureLangAscii, CurrentVagueValuePtr->KeyNamePtr); + StrSize = AsciiStrLen (ConfigureLangAscii) + AsciiStrLen (CurrentVagueValuePtr->KeyNamePtr) + 2; ConfigureLangKeyAscii = AllocateZeroPool (StrSize); - ConfigureKeyLang = AllocateZeroPool (StrSize * sizeof (CHAR16)); - if (ConfigureLangKeyAscii == NULL || ConfigureKeyLang == NULL) { - DEBUG ((DEBUG_ERROR, "%a, Generate ConfigureLang of vague key of %a.%a %s %a failed!\n", __FUNCTION__, Schema, Version, ConfigureLang, CurrentVagueValuePtr->KeyNamePtr)); - goto ErrorContinue; + ConfigureKeyLang = AllocateZeroPool (StrSize * sizeof (CHAR16)); + if ((ConfigureLangKeyAscii == NULL) || (ConfigureKeyLang == NULL)) { + DEBUG ((DEBUG_ERROR, "%a, Generate ConfigureLang of vague key of %a.%a %s %a failed!\n", __FUNCTION__, Schema, Version, ConfigureLang, CurrentVagueValuePtr->KeyNamePtr)); + goto ErrorContinue; } - AsciiStrCatS(ConfigureLangKeyAscii, StrSize, ConfigureLangAscii); - AsciiStrCatS(ConfigureLangKeyAscii, StrSize, "/"); - AsciiStrCatS(ConfigureLangKeyAscii, StrSize, CurrentVagueValuePtr->KeyNamePtr); - AsciiStrToUnicodeStrS(ConfigureLangKeyAscii, ConfigureKeyLang, StrSize); + + AsciiStrCatS (ConfigureLangKeyAscii, StrSize, ConfigureLangAscii); + AsciiStrCatS (ConfigureLangKeyAscii, StrSize, "/"); + AsciiStrCatS (ConfigureLangKeyAscii, StrSize, CurrentVagueValuePtr->KeyNamePtr); + AsciiStrToUnicodeStrS (ConfigureLangKeyAscii, ConfigureKeyLang, StrSize); FreePool (ConfigureLangKeyAscii); ConfigureLangKeyAscii = NULL; // @@ -534,7 +535,7 @@ ApplyFeatureSettingsVagueType ( } else if (CurrentVagueValuePtr->Value->DataType == RedfishCS_Vague_DataType_Int64) { PropertyDatatype = REDFISH_VALUE_TYPE_INTEGER; } else { - DEBUG((DEBUG_ERROR, "%a, %a.%a %s Unsupported Redfish property data type\n", __FUNCTION__, Schema, Version, ConfigureLang)); + DEBUG ((DEBUG_ERROR, "%a, %a.%a %s Unsupported Redfish property data type\n", __FUNCTION__, Schema, Version, ConfigureLang)); goto ErrorContinue; } @@ -546,9 +547,10 @@ ApplyFeatureSettingsVagueType ( DEBUG ((DEBUG_ERROR, "%a, %a.%a %s failed: %r\n", __FUNCTION__, Schema, Version, ConfigureKeyLang, Status)); } else { if (RedfishValue.Type != PropertyDatatype) { - DEBUG((DEBUG_ERROR, "%a, %a.%a %s mismatched data type\n", __FUNCTION__, Schema, Version, ConfigureKeyLang)); + DEBUG ((DEBUG_ERROR, "%a, %a.%a %s mismatched data type\n", __FUNCTION__, Schema, Version, ConfigureKeyLang)); goto ErrorContinue; } + if (PropertyDatatype == REDFISH_VALUE_TYPE_STRING) { // // This is a string property. @@ -560,7 +562,7 @@ ApplyFeatureSettingsVagueType ( DEBUG ((DEBUG_INFO, "%a, %a.%a apply %s from %a to %a\n", __FUNCTION__, Schema, Version, ConfigureKeyLang, RedfishValue.Value.Buffer, CurrentVagueValuePtr->Value->DataValue.CharPtr)); FreePool (RedfishValue.Value.Buffer); RedfishValue.Value.Buffer = CurrentVagueValuePtr->Value->DataValue.CharPtr; - Status = RedfishPlatformConfigSetValue (Schema, Version, ConfigureKeyLang, RedfishValue); + Status = RedfishPlatformConfigSetValue (Schema, Version, ConfigureKeyLang, RedfishValue); if (EFI_ERROR (Status)) { DEBUG ((DEBUG_ERROR, "%a, apply %a to %a failed: %r\n", __FUNCTION__, ConfigureKeyLang, CurrentVagueValuePtr->Value->DataValue.CharPtr, Status)); } @@ -575,16 +577,19 @@ ApplyFeatureSettingsVagueType ( // // Apply settings from redfish // - DEBUG ((DEBUG_INFO, "%a, %a.%a apply %s from %a to %a\n", - __FUNCTION__, - Schema, - Version, - ConfigureKeyLang, - (RedfishValue.Value.Boolean ? "True" : "False"), - (*CurrentVagueValuePtr->Value->DataValue.BoolPtr ? "True" : "False"))); + DEBUG (( + DEBUG_INFO, + "%a, %a.%a apply %s from %a to %a\n", + __FUNCTION__, + Schema, + Version, + ConfigureKeyLang, + (RedfishValue.Value.Boolean ? "True" : "False"), + (*CurrentVagueValuePtr->Value->DataValue.BoolPtr ? "True" : "False") + )); RedfishValue.Value.Boolean = (BOOLEAN)*CurrentVagueValuePtr->Value->DataValue.BoolPtr; - Status = RedfishPlatformConfigSetValue (Schema, Version, ConfigureKeyLang, RedfishValue); + Status = RedfishPlatformConfigSetValue (Schema, Version, ConfigureKeyLang, RedfishValue); if (EFI_ERROR (Status)) { DEBUG ((DEBUG_ERROR, "%a, apply %s to %a failed: %r\n", __FUNCTION__, ConfigureKeyLang, (*CurrentVagueValuePtr->Value->DataValue.BoolPtr ? "True" : "False"), Status)); } @@ -602,7 +607,7 @@ ApplyFeatureSettingsVagueType ( DEBUG ((DEBUG_INFO, "%a, %a.%a apply %s from 0x%x to 0x%x\n", __FUNCTION__, Schema, Version, ConfigureKeyLang, RedfishValue.Value.Integer, *CurrentVagueValuePtr->Value->DataValue.Int64Ptr)); RedfishValue.Value.Integer = (INT64)*CurrentVagueValuePtr->Value->DataValue.Int64Ptr; - Status = RedfishPlatformConfigSetValue (Schema, Version, ConfigureKeyLang, RedfishValue); + Status = RedfishPlatformConfigSetValue (Schema, Version, ConfigureKeyLang, RedfishValue); if (EFI_ERROR (Status)) { DEBUG ((DEBUG_ERROR, "%a, apply %s to 0x%x failed: %r\n", __FUNCTION__, ConfigureKeyLang, *CurrentVagueValuePtr->Value->DataValue.Int64Ptr, Status)); } @@ -610,7 +615,7 @@ ApplyFeatureSettingsVagueType ( DEBUG ((DEBUG_INFO, "%a, %a.%a %s value is: 0x%x\n", __FUNCTION__, Schema, Version, ConfigureKeyLang, RedfishValue.Value.Integer, Status)); } } else { - DEBUG((DEBUG_ERROR, "%a, %a.%a %s Unsupported Redfish property data type\n", __FUNCTION__, Schema, Version, ConfigureLang)); + DEBUG ((DEBUG_ERROR, "%a, %a.%a %s Unsupported Redfish property data type\n", __FUNCTION__, Schema, Version, ConfigureLang)); goto ErrorContinue; } } @@ -620,22 +625,27 @@ ErrorContinue:; FreePool (ConfigureLangKeyAscii); ConfigureLangKeyAscii = NULL; } + if (ConfigureKeyLang != NULL) { FreePool (ConfigureKeyLang); ConfigureKeyLang = NULL; } + CurrentVagueValuePtr = CurrentVagueValuePtr->NextKeyValuePtr; - }; + } if (ConfigureLangAscii != NULL) { FreePool (ConfigureLangAscii); } + if (ConfigureLangKeyAscii != NULL) { FreePool (ConfigureLangKeyAscii); } + if (ConfigureKeyLang != NULL) { FreePool (ConfigureKeyLang); } + return EFI_SUCCESS; } @@ -648,16 +658,16 @@ ErrorContinue:; **/ VOID FreeArrayTypeRedfishValue ( - EDKII_REDFISH_VALUE *RedfishValue + EDKII_REDFISH_VALUE *RedfishValue ) { - UINTN Index; + UINTN Index; if (RedfishValue == NULL) { return; } - if (RedfishValue->Type != REDFISH_VALUE_TYPE_INTEGER_ARRAY && RedfishValue->Type != REDFISH_VALUE_TYPE_STRING_ARRAY) { + if ((RedfishValue->Type != REDFISH_VALUE_TYPE_INTEGER_ARRAY) && (RedfishValue->Type != REDFISH_VALUE_TYPE_STRING_ARRAY)) { return; } @@ -666,6 +676,7 @@ FreeArrayTypeRedfishValue ( for (Index = 0; Index < RedfishValue->ArrayCount; Index++) { FreePool (RedfishValue->Value.StringArray[Index]); } + FreePool (RedfishValue->Value.StringArray); RedfishValue->Value.StringArray = NULL; break; @@ -687,7 +698,6 @@ FreeArrayTypeRedfishValue ( RedfishValue->ArrayCount = 0; } - /** Apply property value to UEFI HII database in string array type. @@ -714,7 +724,7 @@ ApplyFeatureSettingsStringArrayType ( UINTN Index; RedfishCS_char_Array *Buffer; - if (IS_EMPTY_STRING (Schema) || IS_EMPTY_STRING (Version) || IS_EMPTY_STRING (ConfigureLang) || ArrayHead == NULL) { + if (IS_EMPTY_STRING (Schema) || IS_EMPTY_STRING (Version) || IS_EMPTY_STRING (ConfigureLang) || (ArrayHead == NULL)) { return EFI_INVALID_PARAMETER; } @@ -725,9 +735,8 @@ ApplyFeatureSettingsStringArrayType ( if (EFI_ERROR (Status)) { DEBUG ((DEBUG_ERROR, "%a, %a.%a %s failed: %r\n", __FUNCTION__, Schema, Version, ConfigureLang, Status)); } else { - if (RedfishValue.Type != REDFISH_VALUE_TYPE_STRING_ARRAY) { - DEBUG ((DEBUG_ERROR, "%a, %a.%a %s value is not string array type\n", __FUNCTION__, Schema, Version, ConfigureLang)); + DEBUG ((DEBUG_ERROR, "%a, %a.%a %s value is not string array type\n", __FUNCTION__, Schema, Version, ConfigureLang)); return EFI_DEVICE_ERROR; } @@ -745,10 +754,10 @@ ApplyFeatureSettingsStringArrayType ( // Convert array from RedfishCS_char_Array to EDKII_REDFISH_VALUE // RedfishValue.ArrayCount = 0; - Buffer = ArrayHead; + Buffer = ArrayHead; while (Buffer != NULL) { RedfishValue.ArrayCount += 1; - Buffer = Buffer->Next; + Buffer = Buffer->Next; } // @@ -761,13 +770,14 @@ ApplyFeatureSettingsStringArrayType ( } Buffer = ArrayHead; - Index = 0; + Index = 0; while (Buffer != NULL) { RedfishValue.Value.StringArray[Index] = AllocateCopyPool (AsciiStrSize (Buffer->ArrayValue), Buffer->ArrayValue); if (RedfishValue.Value.StringArray[Index] == NULL) { ASSERT (FALSE); return EFI_OUT_OF_RESOURCES; } + Buffer = Buffer->Next; Index++; } @@ -801,18 +811,18 @@ ApplyFeatureSettingsStringArrayType ( **/ EFI_STATUS ApplyFeatureSettingsNumericArrayType ( - IN CHAR8 *Schema, - IN CHAR8 *Version, - IN EFI_STRING ConfigureLang, + IN CHAR8 *Schema, + IN CHAR8 *Version, + IN EFI_STRING ConfigureLang, IN RedfishCS_int64_Array *ArrayHead ) { - EFI_STATUS Status; - EDKII_REDFISH_VALUE RedfishValue; - UINTN Index; - RedfishCS_int64_Array *Buffer; + EFI_STATUS Status; + EDKII_REDFISH_VALUE RedfishValue; + UINTN Index; + RedfishCS_int64_Array *Buffer; - if (IS_EMPTY_STRING (Schema) || IS_EMPTY_STRING (Version) || IS_EMPTY_STRING (ConfigureLang) || ArrayHead == NULL) { + if (IS_EMPTY_STRING (Schema) || IS_EMPTY_STRING (Version) || IS_EMPTY_STRING (ConfigureLang) || (ArrayHead == NULL)) { return EFI_INVALID_PARAMETER; } @@ -823,7 +833,6 @@ ApplyFeatureSettingsNumericArrayType ( if (EFI_ERROR (Status)) { DEBUG ((DEBUG_ERROR, "%a, %a.%a %s failed: %r\n", __FUNCTION__, Schema, Version, ConfigureLang, Status)); } else { - if (RedfishValue.Type != REDFISH_VALUE_TYPE_INTEGER_ARRAY) { DEBUG ((DEBUG_ERROR, "%a, %a.%a %s value is not string array type\n", __FUNCTION__, Schema, Version, ConfigureLang)); return EFI_DEVICE_ERROR; @@ -843,10 +852,10 @@ ApplyFeatureSettingsNumericArrayType ( // Convert array from RedfishCS_int64_Array to EDKII_REDFISH_VALUE // RedfishValue.ArrayCount = 0; - Buffer = ArrayHead; + Buffer = ArrayHead; while (Buffer != NULL) { RedfishValue.ArrayCount += 1; - Buffer = Buffer->Next; + Buffer = Buffer->Next; } // @@ -859,10 +868,10 @@ ApplyFeatureSettingsNumericArrayType ( } Buffer = ArrayHead; - Index = 0; + Index = 0; while (Buffer != NULL) { RedfishValue.Value.IntegerArray[Index] = (INT64)*Buffer->ArrayValue; - Buffer = Buffer->Next; + Buffer = Buffer->Next; Index++; } @@ -904,9 +913,9 @@ ApplyFeatureSettingsBooleanArrayType ( EFI_STATUS Status; EDKII_REDFISH_VALUE RedfishValue; UINTN Index; - RedfishCS_bool_Array *Buffer; + RedfishCS_bool_Array *Buffer; - if (IS_EMPTY_STRING (Schema) || IS_EMPTY_STRING (Version) || IS_EMPTY_STRING (ConfigureLang) || ArrayHead == NULL) { + if (IS_EMPTY_STRING (Schema) || IS_EMPTY_STRING (Version) || IS_EMPTY_STRING (ConfigureLang) || (ArrayHead == NULL)) { return EFI_INVALID_PARAMETER; } @@ -917,7 +926,6 @@ ApplyFeatureSettingsBooleanArrayType ( if (EFI_ERROR (Status)) { DEBUG ((DEBUG_ERROR, "%a, %a.%a %s failed: %r\n", __FUNCTION__, Schema, Version, ConfigureLang, Status)); } else { - if (RedfishValue.Type != REDFISH_VALUE_TYPE_BOOLEAN_ARRAY) { DEBUG ((DEBUG_ERROR, "%a, %a.%a %s value is not string array type\n", __FUNCTION__, Schema, Version, ConfigureLang)); return EFI_DEVICE_ERROR; @@ -937,10 +945,10 @@ ApplyFeatureSettingsBooleanArrayType ( // Convert array from RedfishCS_int64_Array to EDKII_REDFISH_VALUE // RedfishValue.ArrayCount = 0; - Buffer = ArrayHead; + Buffer = ArrayHead; while (Buffer != NULL) { RedfishValue.ArrayCount += 1; - Buffer = Buffer->Next; + Buffer = Buffer->Next; } // @@ -953,10 +961,10 @@ ApplyFeatureSettingsBooleanArrayType ( } Buffer = ArrayHead; - Index = 0; + Index = 0; while (Buffer != NULL) { RedfishValue.Value.BooleanArray[Index] = (BOOLEAN)*Buffer->ArrayValue; - Buffer = Buffer->Next; + Buffer = Buffer->Next; Index++; } @@ -988,15 +996,15 @@ ApplyFeatureSettingsBooleanArrayType ( **/ EFI_STATUS GetResourceByUri ( - IN REDFISH_SERVICE *Service, - IN EFI_STRING ResourceUri, - OUT REDFISH_RESPONSE *Response + IN REDFISH_SERVICE *Service, + IN EFI_STRING ResourceUri, + OUT REDFISH_RESPONSE *Response ) { EFI_STATUS Status; CHAR8 *AsciiResourceUri; - if (Service == NULL || Response == NULL || IS_EMPTY_STRING (ResourceUri)) { + if ((Service == NULL) || (Response == NULL) || IS_EMPTY_STRING (ResourceUri)) { return EFI_INVALID_PARAMETER; } @@ -1051,9 +1059,9 @@ GetResourceByUri ( **/ EFI_STATUS IsRedpathArray ( - IN EFI_STRING ConfigureLang, - OUT EFI_STRING *ArraySignatureOpen OPTIONAL, - OUT EFI_STRING *ArraySignatureClose OPTIONAL + IN EFI_STRING ConfigureLang, + OUT EFI_STRING *ArraySignatureOpen OPTIONAL, + OUT EFI_STRING *ArraySignatureClose OPTIONAL ) { CHAR16 *IndexString; @@ -1061,9 +1069,11 @@ IsRedpathArray ( if (ConfigureLang == NULL) { return EFI_INVALID_PARAMETER; } + if (ArraySignatureOpen != NULL) { *ArraySignatureOpen = NULL; } + if (ArraySignatureClose != NULL) { *ArraySignatureClose = NULL; } @@ -1076,6 +1086,7 @@ IsRedpathArray ( if (ArraySignatureOpen != NULL) { *ArraySignatureOpen = IndexString; } + // // Skip "{" // @@ -1087,11 +1098,14 @@ IsRedpathArray ( if (IndexString == NULL) { return EFI_INVALID_PARAMETER; } + if (ArraySignatureClose != NULL) { *ArraySignatureClose = IndexString; } + return EFI_SUCCESS; } + return EFI_NOT_FOUND; } @@ -1106,23 +1120,25 @@ IsRedpathArray ( **/ UINTN GetNumberOfRedpathNodes ( - IN EFI_STRING NodeString + IN EFI_STRING NodeString ) { - UINTN Index; - UINTN NumberNodes; - UINTN StringLen; + UINTN Index; + UINTN NumberNodes; + UINTN StringLen; NumberNodes = 0; - StringLen = StrLen (NodeString); - Index = 1; // ConfigLang always starts with '/'. + StringLen = StrLen (NodeString); + Index = 1; // ConfigLang always starts with '/'. while (Index < StringLen) { if (*(NodeString + Index) == L'/') { - NumberNodes ++; + NumberNodes++; } - Index ++; - }; - NumberNodes ++; + + Index++; + } + + NumberNodes++; return (NumberNodes); } @@ -1141,24 +1157,25 @@ GetNumberOfRedpathNodes ( **/ EFI_STRING GetRedpathNodeByIndex ( - IN EFI_STRING NodeString, - IN UINTN Index, - OUT EFI_STRING *EndOfNodePtr OPTIONAL + IN EFI_STRING NodeString, + IN UINTN Index, + OUT EFI_STRING *EndOfNodePtr OPTIONAL ) { - UINTN NumberNodes; - UINTN StringLen; - UINTN StringIndex; - EFI_STRING NodeStart; - EFI_STRING NodeEnd; + UINTN NumberNodes; + UINTN StringLen; + UINTN StringIndex; + EFI_STRING NodeStart; + EFI_STRING NodeEnd; NumberNodes = 0; - StringLen = StrLen (NodeString); + StringLen = StrLen (NodeString); StringIndex = 1; // ConfigLang always starts with '/'. - NodeStart = NodeString; + NodeStart = NodeString; if (EndOfNodePtr != NULL) { *EndOfNodePtr = NULL; } + while (StringIndex < StringLen) { if (*(NodeString + StringIndex) == L'/') { NodeEnd = NodeString + StringIndex - 1; @@ -1166,14 +1183,17 @@ GetRedpathNodeByIndex ( if (EndOfNodePtr != NULL) { *EndOfNodePtr = NodeEnd; } + return NodeStart; } else { NodeStart = NodeString + StringIndex + 1; } } - StringIndex ++; - }; - return (NULL); + + StringIndex++; + } + + return (NULL); } /** @@ -1192,18 +1212,18 @@ GetRedpathNodeByIndex ( **/ EFI_STATUS GetArrayIndexFromArrayTypeConfigureLang ( - IN CHAR16 *ConfigureLang, - OUT CHAR16 **UnifiedConfigureLang, - OUT UINTN *Index + IN CHAR16 *ConfigureLang, + OUT CHAR16 **UnifiedConfigureLang, + OUT UINTN *Index ) { - EFI_STATUS Status; - CHAR16 *TmpConfigureLang; - CHAR16 *ArrayOpenStr; - CHAR16 *ArrayCloseStr; - INTN StringIndex; + EFI_STATUS Status; + CHAR16 *TmpConfigureLang; + CHAR16 *ArrayOpenStr; + CHAR16 *ArrayCloseStr; + INTN StringIndex; - if (ConfigureLang == NULL || UnifiedConfigureLang == NULL || Index == NULL) { + if ((ConfigureLang == NULL) || (UnifiedConfigureLang == NULL) || (Index == NULL)) { return EFI_INVALID_PARAMETER; } @@ -1227,28 +1247,30 @@ GetArrayIndexFromArrayTypeConfigureLang ( // // Resotre the '}' character and remove rest of string. // - ArrayCloseStr[0] = L'}'; - ArrayCloseStr[1] = '\0'; + ArrayCloseStr[0] = L'}'; + ArrayCloseStr[1] = '\0'; *UnifiedConfigureLang = TmpConfigureLang; } else { if (Status == EFI_NOT_FOUND) { // // This is not the redpath array. Search "/" for the parent root. // - *Index = 0; + *Index = 0; StringIndex = StrLen (TmpConfigureLang) - 1; while (StringIndex >= 0 && *(TmpConfigureLang + StringIndex) != '/') { - StringIndex --; - }; + StringIndex--; + } + if (StringIndex >= 0 ) { *(TmpConfigureLang + StringIndex) = '\0'; - *UnifiedConfigureLang = TmpConfigureLang; - Status = EFI_SUCCESS; + *UnifiedConfigureLang = TmpConfigureLang; + Status = EFI_SUCCESS; } else { Status = EFI_INVALID_PARAMETER; } } } + return Status; } @@ -1265,27 +1287,30 @@ GetArrayIndexFromArrayTypeConfigureLang ( **/ EFI_STATUS CopyConfiglanguageList ( - IN REDFISH_FEATURE_ARRAY_TYPE_CONFIG_LANG_LIST *SourceConfigureLangList, - OUT REDFISH_FEATURE_ARRAY_TYPE_CONFIG_LANG_LIST *DestConfigureLangList + IN REDFISH_FEATURE_ARRAY_TYPE_CONFIG_LANG_LIST *SourceConfigureLangList, + OUT REDFISH_FEATURE_ARRAY_TYPE_CONFIG_LANG_LIST *DestConfigureLangList ) { - UINTN Index; + UINTN Index; - if (SourceConfigureLangList == NULL || DestConfigureLangList == NULL) { + if ((SourceConfigureLangList == NULL) || (DestConfigureLangList == NULL)) { return EFI_INVALID_PARAMETER; } + DestConfigureLangList->Count = SourceConfigureLangList->Count; - DestConfigureLangList->List = - (REDFISH_FEATURE_ARRAY_TYPE_CONFIG_LANG *)AllocateZeroPool (sizeof (REDFISH_FEATURE_ARRAY_TYPE_CONFIG_LANG) * DestConfigureLangList->Count); + DestConfigureLangList->List = + (REDFISH_FEATURE_ARRAY_TYPE_CONFIG_LANG *)AllocateZeroPool (sizeof (REDFISH_FEATURE_ARRAY_TYPE_CONFIG_LANG) * DestConfigureLangList->Count); if (DestConfigureLangList->List == NULL) { DEBUG ((DEBUG_ERROR, "%a, Fail to allocate memory for REDFISH_FEATURE_ARRAY_TYPE_CONFIG_LANG.\n", __FUNCTION__)); return EFI_OUT_OF_RESOURCES; } + for (Index = 0; Index < SourceConfigureLangList->Count; Index++) { - DestConfigureLangList->List [Index].Index = SourceConfigureLangList->List[Index].Index; - DestConfigureLangList->List [Index].ConfigureLang = - (EFI_STRING)AllocateCopyPool(StrSize(SourceConfigureLangList->List[Index].ConfigureLang), (VOID *)SourceConfigureLangList->List[Index].ConfigureLang); + DestConfigureLangList->List[Index].Index = SourceConfigureLangList->List[Index].Index; + DestConfigureLangList->List[Index].ConfigureLang = + (EFI_STRING)AllocateCopyPool (StrSize (SourceConfigureLangList->List[Index].ConfigureLang), (VOID *)SourceConfigureLangList->List[Index].ConfigureLang); } + return EFI_SUCCESS; } @@ -1300,39 +1325,45 @@ CopyConfiglanguageList ( **/ UINTN ConfiglanguageGetInstanceIndex ( - IN EFI_STRING ConfigureLang + IN EFI_STRING ConfigureLang ) { - INTN LeftBracketIndex; - INTN RightBracketIndex; - INTN Index; - UINT64 Instance; - EFI_STATUS Status; + INTN LeftBracketIndex; + INTN RightBracketIndex; + INTN Index; + UINT64 Instance; + EFI_STATUS Status; if (ConfigureLang == NULL) { return 0; } - LeftBracketIndex = 0; + + LeftBracketIndex = 0; RightBracketIndex = 0; - Index = StrLen (ConfigureLang) - 1; + Index = StrLen (ConfigureLang) - 1; while (Index >= 0) { if (*(ConfigureLang + Index) == L'{') { LeftBracketIndex = Index; break; } + if (*(ConfigureLang + Index) == L'}') { RightBracketIndex = Index; } - Index --; - }; + + Index--; + } + if ((RightBracketIndex - LeftBracketIndex) <= 1) { return 0; } + *(ConfigureLang + RightBracketIndex) = 0; - Status = StrDecimalToUint64S (ConfigureLang + LeftBracketIndex + 1, NULL, &Instance); - if (EFI_ERROR(Status)) { + Status = StrDecimalToUint64S (ConfigureLang + LeftBracketIndex + 1, NULL, &Instance); + if (EFI_ERROR (Status)) { Instance = 0; } + // // Restore right curly bracket. // @@ -1353,20 +1384,22 @@ ConfiglanguageGetInstanceIndex ( **/ EFI_STATUS DestroyConfiglanguageList ( - IN REDFISH_FEATURE_ARRAY_TYPE_CONFIG_LANG_LIST *ConfigureLangList + IN REDFISH_FEATURE_ARRAY_TYPE_CONFIG_LANG_LIST *ConfigureLangList ) { - UINTN Index; + UINTN Index; if (ConfigureLangList == NULL) { return EFI_INVALID_PARAMETER; } + if (ConfigureLangList->List != NULL) { for (Index = 0; Index < ConfigureLangList->Count; Index++) { - if (ConfigureLangList->List [Index].ConfigureLang != NULL) { - FreePool (ConfigureLangList->List [Index].ConfigureLang); + if (ConfigureLangList->List[Index].ConfigureLang != NULL) { + FreePool (ConfigureLangList->List[Index].ConfigureLang); } } + FreePool (ConfigureLangList->List); ConfigureLangList->List = NULL; } @@ -1391,56 +1424,60 @@ DestroyConfiglanguageList ( **/ EFI_STATUS SetResourceConfigLangMemberInstance ( - IN EFI_STRING *DestConfigLang, - IN UINTN MaxtLengthConfigLang, - IN REDFISH_FEATURE_ARRAY_TYPE_CONFIG_LANG *ConfigLangInstance + IN EFI_STRING *DestConfigLang, + IN UINTN MaxtLengthConfigLang, + IN REDFISH_FEATURE_ARRAY_TYPE_CONFIG_LANG *ConfigLangInstance ) { - EFI_STRING ThisConfigLang; - EFI_STRING NewConfigLang; - CHAR16 InstanceStr [10]; - INTN Index; - UINTN Length; - UINTN MaxStrLength; - - if (DestConfigLang == NULL || ConfigLangInstance == NULL) { + EFI_STRING ThisConfigLang; + EFI_STRING NewConfigLang; + CHAR16 InstanceStr[10]; + INTN Index; + UINTN Length; + UINTN MaxStrLength; + + if ((DestConfigLang == NULL) || (ConfigLangInstance == NULL)) { return EFI_INVALID_PARAMETER; } + UnicodeSPrint ((CHAR16 *)&InstanceStr, 10, L"%d", ConfigLangInstance->Index); ThisConfigLang = *DestConfigLang; - if (ThisConfigLang [0] == 0) { + if (ThisConfigLang[0] == 0) { // // Return ConfigLangInstance->ConfigureLang // if (ConfigLangInstance->ConfigureLang == NULL) { return EFI_INVALID_PARAMETER; } else { - StrCatS(*DestConfigLang, MaxtLengthConfigLang, ConfigLangInstance->ConfigureLang); + StrCatS (*DestConfigLang, MaxtLengthConfigLang, ConfigLangInstance->ConfigureLang); return EFI_SUCCESS; } } - MaxStrLength = StrSize (ThisConfigLang) + StrSize ((EFI_STRING)&InstanceStr); + MaxStrLength = StrSize (ThisConfigLang) + StrSize ((EFI_STRING)&InstanceStr); NewConfigLang = ThisConfigLang; if (MaxtLengthConfigLang < MaxStrLength) { - NewConfigLang = (EFI_STRING)AllocateZeroPool(MaxStrLength); + NewConfigLang = (EFI_STRING)AllocateZeroPool (MaxStrLength); if (NewConfigLang == NULL) { DEBUG ((DEBUG_ERROR, "%a, Fail to allocate memory for NewConfigLang.\n", __FUNCTION__)); return EFI_OUT_OF_RESOURCES; } } + // // Search the last "{" // Index = StrLen (ThisConfigLang) - 1; while ((ThisConfigLang[Index] != '{') && (Index >= 0)) { - Index --; - }; + Index--; + } + if (Index == -1) { if (NewConfigLang != ThisConfigLang) { - FreePool(NewConfigLang); + FreePool (NewConfigLang); } + return EFI_NOT_FOUND; } @@ -1449,15 +1486,17 @@ SetResourceConfigLangMemberInstance ( // Length = 0; while (Index >= 0) { - NewConfigLang [Index] = ThisConfigLang[Index]; - Index --; - Length ++; - }; + NewConfigLang[Index] = ThisConfigLang[Index]; + Index--; + Length++; + } + UnicodeSPrint ((CHAR16 *)(NewConfigLang + Length), MaxStrLength, L"%d", ConfigLangInstance->Index); StrCatS (NewConfigLang, MaxStrLength, L"}"); if (NewConfigLang != ThisConfigLang) { FreePool (ThisConfigLang); } + *DestConfigLang = NewConfigLang; return EFI_SUCCESS; } @@ -1478,28 +1517,28 @@ SetResourceConfigLangMemberInstance ( **/ EFI_STATUS RedfishFeatureGetUnifiedArrayTypeConfigureLang ( - IN CHAR8 *Schema, - IN CHAR8 *Version, - IN EFI_STRING Pattern, OPTIONAL + IN CHAR8 *Schema, + IN CHAR8 *Version, + IN EFI_STRING Pattern, OPTIONAL OUT REDFISH_FEATURE_ARRAY_TYPE_CONFIG_LANG_LIST *UnifiedConfigureLangList ) { - EFI_STATUS Status; - EFI_STRING *ConfigureLangList; - UINTN Count; - UINTN Index; - UINTN Index2; - UINTN ArrayIndex; - EFI_STRING UnifiedConfigureLang; - BOOLEAN Duplicated; - REDFISH_FEATURE_ARRAY_TYPE_CONFIG_LANG UnifiedConfigureLangPool[BIOS_CONFIG_TO_REDFISH_REDPATH_POOL_SIZE]; - - if (IS_EMPTY_STRING (Schema) || IS_EMPTY_STRING (Version) || UnifiedConfigureLangList == NULL) { + EFI_STATUS Status; + EFI_STRING *ConfigureLangList; + UINTN Count; + UINTN Index; + UINTN Index2; + UINTN ArrayIndex; + EFI_STRING UnifiedConfigureLang; + BOOLEAN Duplicated; + REDFISH_FEATURE_ARRAY_TYPE_CONFIG_LANG UnifiedConfigureLangPool[BIOS_CONFIG_TO_REDFISH_REDPATH_POOL_SIZE]; + + if (IS_EMPTY_STRING (Schema) || IS_EMPTY_STRING (Version) || (UnifiedConfigureLangList == NULL)) { return EFI_INVALID_PARAMETER; } UnifiedConfigureLangList->Count = 0; - UnifiedConfigureLangList->List = NULL; + UnifiedConfigureLangList->List = NULL; ZeroMem (UnifiedConfigureLangPool, sizeof (UnifiedConfigureLangPool)); Status = RedfishPlatformConfigGetConfigureLang (Schema, Version, Pattern, &ConfigureLangList, &Count); @@ -1514,7 +1553,7 @@ RedfishFeatureGetUnifiedArrayTypeConfigureLang ( for (Index = 0; Index < Count; Index++) { Status = GetArrayIndexFromArrayTypeConfigureLang (ConfigureLangList[Index], &UnifiedConfigureLang, &ArrayIndex); - if (EFI_ERROR (Status) && Status == EFI_INVALID_PARAMETER) { + if (EFI_ERROR (Status) && (Status == EFI_INVALID_PARAMETER)) { ASSERT (FALSE); continue; } @@ -1550,7 +1589,7 @@ RedfishFeatureGetUnifiedArrayTypeConfigureLang ( // UnifiedConfigureLangPool[UnifiedConfigureLangList->Count].ConfigureLang = UnifiedConfigureLang; - UnifiedConfigureLangPool[UnifiedConfigureLangList->Count].Index = ArrayIndex; + UnifiedConfigureLangPool[UnifiedConfigureLangList->Count].Index = ArrayIndex; ++UnifiedConfigureLangList->Count; } @@ -1578,23 +1617,23 @@ RedfishFeatureGetUnifiedArrayTypeConfigureLang ( **/ EFI_STATUS GetEtagAndLocation ( - IN REDFISH_RESPONSE *Response, - OUT CHAR8 **Etag, OPTIONAL + IN REDFISH_RESPONSE *Response, + OUT CHAR8 **Etag, OPTIONAL OUT EFI_STRING *Location OPTIONAL ) { - EDKII_JSON_VALUE JsonValue; - EDKII_JSON_VALUE OdataValue; - CHAR8 *OdataString; - CHAR8 *AsciiLocation; - EFI_HTTP_HEADER *Header; - EFI_STATUS Status; + EDKII_JSON_VALUE JsonValue; + EDKII_JSON_VALUE OdataValue; + CHAR8 *OdataString; + CHAR8 *AsciiLocation; + EFI_HTTP_HEADER *Header; + EFI_STATUS Status; if (Response == NULL) { return EFI_INVALID_PARAMETER; } - if (Etag == NULL && Location == NULL) { + if ((Etag == NULL) && (Location == NULL)) { return EFI_SUCCESS; } @@ -1614,7 +1653,7 @@ GetEtagAndLocation ( // // No header is returned. Search payload for location. // - if (*Etag == NULL && Response->Payload != NULL) { + if ((*Etag == NULL) && (Response->Payload != NULL)) { JsonValue = RedfishJsonInPayload (Response->Payload); if (JsonValue != NULL) { OdataValue = JsonObjectGetValue (JsonValueGetObject (JsonValue), "@odata.etag"); @@ -1649,7 +1688,7 @@ GetEtagAndLocation ( // // No header is returned. Search payload for location. // - if (*Location == NULL && Response->Payload != NULL) { + if ((*Location == NULL) && (Response->Payload != NULL)) { JsonValue = RedfishJsonInPayload (Response->Payload); if (JsonValue != NULL) { OdataValue = JsonObjectGetValue (JsonValueGetObject (JsonValue), "@odata.id"); @@ -1675,6 +1714,7 @@ GetEtagAndLocation ( return Status; } + /** Create HTTP payload and send them to redfish service with PATCH method. @@ -1690,25 +1730,25 @@ GetEtagAndLocation ( **/ EFI_STATUS CreatePayloadToPatchResource ( - IN REDFISH_SERVICE *Service, - IN REDFISH_PAYLOAD *TargetPayload, - IN CHAR8 *Json, - OUT CHAR8 **Etag + IN REDFISH_SERVICE *Service, + IN REDFISH_PAYLOAD *TargetPayload, + IN CHAR8 *Json, + OUT CHAR8 **Etag ) { - REDFISH_PAYLOAD Payload; - EDKII_JSON_VALUE ResourceJsonValue; - REDFISH_RESPONSE PostResponse; - EFI_STATUS Status; + REDFISH_PAYLOAD Payload; + EDKII_JSON_VALUE ResourceJsonValue; + REDFISH_RESPONSE PostResponse; + EFI_STATUS Status; - if (Service == NULL || TargetPayload == NULL || IS_EMPTY_STRING (Json) || Etag == NULL) { + if ((Service == NULL) || (TargetPayload == NULL) || IS_EMPTY_STRING (Json) || (Etag == NULL)) { return EFI_INVALID_PARAMETER; } ResourceJsonValue = JsonLoadString (Json, 0, NULL); - Payload = RedfishCreatePayload (ResourceJsonValue, Service); + Payload = RedfishCreatePayload (ResourceJsonValue, Service); if (Payload == NULL) { - DEBUG ((DEBUG_ERROR, "%a:%d Failed to create JSON payload from JSON value!\n",__FUNCTION__, __LINE__)); + DEBUG ((DEBUG_ERROR, "%a:%d Failed to create JSON payload from JSON value!\n", __FUNCTION__, __LINE__)); Status = EFI_DEVICE_ERROR; goto EXIT_FREE_JSON_VALUE; } @@ -1716,7 +1756,7 @@ CreatePayloadToPatchResource ( ZeroMem (&PostResponse, sizeof (REDFISH_RESPONSE)); Status = RedfishPatchToPayload (TargetPayload, Payload, &PostResponse); if (EFI_ERROR (Status)) { - DEBUG ((DEBUG_ERROR, "%a:%d Failed to PATCH payload to Redfish service.\n",__FUNCTION__, __LINE__)); + DEBUG ((DEBUG_ERROR, "%a:%d Failed to PATCH payload to Redfish service.\n", __FUNCTION__, __LINE__)); goto EXIT_FREE_JSON_VALUE; } @@ -1761,26 +1801,26 @@ EXIT_FREE_JSON_VALUE: **/ EFI_STATUS CreatePayloadToPostResource ( - IN REDFISH_SERVICE *Service, - IN REDFISH_PAYLOAD *TargetPayload, - IN CHAR8 *Json, - OUT EFI_STRING *Location, - OUT CHAR8 **Etag + IN REDFISH_SERVICE *Service, + IN REDFISH_PAYLOAD *TargetPayload, + IN CHAR8 *Json, + OUT EFI_STRING *Location, + OUT CHAR8 **Etag ) { - REDFISH_PAYLOAD Payload; - EDKII_JSON_VALUE ResourceJsonValue; - REDFISH_RESPONSE PostResponse; - EFI_STATUS Status; + REDFISH_PAYLOAD Payload; + EDKII_JSON_VALUE ResourceJsonValue; + REDFISH_RESPONSE PostResponse; + EFI_STATUS Status; - if (Service == NULL || TargetPayload == NULL || IS_EMPTY_STRING (Json) || Location == NULL || Etag == NULL) { + if ((Service == NULL) || (TargetPayload == NULL) || IS_EMPTY_STRING (Json) || (Location == NULL) || (Etag == NULL)) { return EFI_INVALID_PARAMETER; } ResourceJsonValue = JsonLoadString (Json, 0, NULL); - Payload = RedfishCreatePayload (ResourceJsonValue, Service); + Payload = RedfishCreatePayload (ResourceJsonValue, Service); if (Payload == NULL) { - DEBUG ((DEBUG_ERROR, "%a:%d Failed to create JSON payload from JSON value!\n",__FUNCTION__, __LINE__)); + DEBUG ((DEBUG_ERROR, "%a:%d Failed to create JSON payload from JSON value!\n", __FUNCTION__, __LINE__)); Status = EFI_DEVICE_ERROR; goto EXIT_FREE_JSON_VALUE; } @@ -1788,7 +1828,7 @@ CreatePayloadToPostResource ( ZeroMem (&PostResponse, sizeof (REDFISH_RESPONSE)); Status = RedfishPostToPayload (TargetPayload, Payload, &PostResponse); if (EFI_ERROR (Status)) { - DEBUG ((DEBUG_ERROR, "%a:%d Failed to POST Attribute Registry to Redfish service.\n",__FUNCTION__, __LINE__)); + DEBUG ((DEBUG_ERROR, "%a:%d Failed to POST Attribute Registry to Redfish service.\n", __FUNCTION__, __LINE__)); goto EXIT_FREE_JSON_VALUE; } @@ -1827,19 +1867,19 @@ EXIT_FREE_JSON_VALUE: **/ EFI_STRING RedfishGetUri ( - IN EFI_STRING ConfigLang + IN EFI_STRING ConfigLang ) { - EFI_STATUS Status; - EFI_STRING Target; - EFI_STRING Found; - EFI_STRING TempStr; - EFI_STRING ResultStr; - EFI_STRING Head; - EFI_STRING CloseBracket; - UINTN TempStrSize; - UINTN RemainingLen; - UINTN ConfigLangLen; + EFI_STATUS Status; + EFI_STRING Target; + EFI_STRING Found; + EFI_STRING TempStr; + EFI_STRING ResultStr; + EFI_STRING Head; + EFI_STRING CloseBracket; + UINTN TempStrSize; + UINTN RemainingLen; + UINTN ConfigLangLen; Status = RedfishLocateProtocol ((VOID **)&mConfigLangMapProtocol, &gEdkIIRedfishConfigLangMapProtocolGuid); if (EFI_ERROR (Status)) { @@ -1875,7 +1915,7 @@ RedfishGetUri ( // do { ConfigLangLen = StrLen (Head); - Target = CloseBracket; + Target = CloseBracket; // // Look for next ConfigLang @@ -1895,13 +1935,14 @@ RedfishGetUri ( // // Copy current ConfigLang to temporary string and do a query // - Target += 1; + Target += 1; RemainingLen = StrLen (Target); - TempStrSize = (ConfigLangLen - RemainingLen + 1) * sizeof (CHAR16); - TempStr = AllocateCopyPool (TempStrSize, Head); + TempStrSize = (ConfigLangLen - RemainingLen + 1) * sizeof (CHAR16); + TempStr = AllocateCopyPool (TempStrSize, Head); if (TempStr == NULL) { return NULL; } + TempStr[ConfigLangLen - RemainingLen] = '\0'; Status = mConfigLangMapProtocol->Get ( @@ -1926,7 +1967,7 @@ RedfishGetUri ( // // Prepare for next ConfigLang // - Head = Target; + Head = Target; CloseBracket = StrStr (Head, L"{"); } while (CloseBracket != NULL); @@ -1954,7 +1995,7 @@ RedfishGetUri ( **/ EFI_STRING RedfishGetConfigLanguage ( - IN EFI_STRING Uri + IN EFI_STRING Uri ) { EFI_STATUS Status; @@ -1973,13 +2014,12 @@ RedfishGetConfigLanguage ( } ConfigLang = NULL; - Status = mConfigLangMapProtocol->Get ( - mConfigLangMapProtocol, - RedfishGetTypeUri, - Uri, - &ConfigLang - ); - + Status = mConfigLangMapProtocol->Get ( + mConfigLangMapProtocol, + RedfishGetTypeUri, + Uri, + &ConfigLang + ); return ConfigLang; } @@ -1997,8 +2037,8 @@ RedfishGetConfigLanguage ( **/ EFI_STRING GetConfigureLang ( - IN CHAR8 *Uri, - IN CHAR8 *PropertyName OPTIONAL + IN CHAR8 *Uri, + IN CHAR8 *PropertyName OPTIONAL ) { EFI_STRING ConfigLang; @@ -2032,12 +2072,14 @@ GetConfigureLang ( } StringSize = StrSize (ConfigLang) + ((AsciiStrLen (PropertyName) + 1) * sizeof (CHAR16)); - ResultStr = AllocatePool (StringSize); + ResultStr = AllocatePool (StringSize); if (ResultStr == NULL) { + FreePool (ConfigLang); return NULL; } UnicodeSPrint (ResultStr, StringSize, L"%s/%a", ConfigLang, PropertyName); + FreePool (ConfigLang); return ResultStr; } @@ -2059,7 +2101,7 @@ RedfisSetRedfishUri ( IN EFI_STRING Uri ) { - EFI_STATUS Status; + EFI_STATUS Status; if (IS_EMPTY_STRING (ConfigLang) || IS_EMPTY_STRING (Uri)) { return EFI_INVALID_PARAMETER; @@ -2088,12 +2130,12 @@ RedfisSetRedfishUri ( **/ EFI_STRING GetOdataId ( - IN REDFISH_PAYLOAD *Payload + IN REDFISH_PAYLOAD *Payload ) { - EDKII_JSON_VALUE *JsonValue; - EDKII_JSON_VALUE *OdataId; - EFI_STRING OdataIdString; + EDKII_JSON_VALUE *JsonValue; + EDKII_JSON_VALUE *OdataId; + EFI_STRING OdataIdString; if (Payload == NULL) { return NULL; @@ -2117,7 +2159,6 @@ GetOdataId ( return AllocateCopyPool (StrSize (OdataIdString), OdataIdString); } - /** Get the property name by given Configure Langauge. @@ -2131,25 +2172,27 @@ GetOdataId ( **/ EFI_STRING GetPropertyFromConfigureLang ( - IN EFI_STRING ResourceUri, - IN EFI_STRING ConfigureLang + IN EFI_STRING ResourceUri, + IN EFI_STRING ConfigureLang ) { EFI_STATUS Status; EFI_STRING TempString; - if (ConfigureLang == NULL || ResourceUri == NULL) { + if ((ConfigureLang == NULL) || (ResourceUri == NULL)) { return NULL; } Status = IsRedpathArray (ConfigureLang, NULL, &TempString); - if (!EFI_ERROR(Status)) { + if (!EFI_ERROR (Status)) { TempString += 2; // Advance two characters for '}' and '/' return TempString; } + if (Status != EFI_NOT_FOUND) { return NULL; } + // // The ConigLang has no '{}' // @@ -2160,6 +2203,7 @@ GetPropertyFromConfigureLang ( if (GetRedpathNodeByIndex (ConfigureLang, 0, &TempString) == NULL) { return NULL; } + // // Advance two characters to the starting // pointer of next node. @@ -2182,17 +2226,17 @@ GetPropertyFromConfigureLang ( **/ CHAR8 * GetPropertyStringValue ( - IN CHAR8 *Schema, - IN CHAR8 *Version, - IN EFI_STRING PropertyName, - IN EFI_STRING ConfigureLang + IN CHAR8 *Schema, + IN CHAR8 *Version, + IN EFI_STRING PropertyName, + IN EFI_STRING ConfigureLang ) { - EFI_STATUS Status; - EDKII_REDFISH_VALUE RedfishValue; - EFI_STRING ConfigureLangBuffer; - UINTN BufferSize; - CHAR8 *AsciiStringValue; + EFI_STATUS Status; + EDKII_REDFISH_VALUE RedfishValue; + EFI_STRING ConfigureLangBuffer; + UINTN BufferSize; + CHAR8 *AsciiStringValue; if (IS_EMPTY_STRING (Schema) || IS_EMPTY_STRING (Version) || IS_EMPTY_STRING (ConfigureLang) || IS_EMPTY_STRING (PropertyName)) { return NULL; @@ -2201,7 +2245,7 @@ GetPropertyStringValue ( // // Configure Language buffer. // - BufferSize = sizeof (CHAR16) * MAX_CONF_LANG_LEN; + BufferSize = sizeof (CHAR16) * MAX_CONF_LANG_LEN; ConfigureLangBuffer = AllocatePool (BufferSize); if (ConfigureLangBuffer == NULL) { return NULL; @@ -2240,17 +2284,17 @@ GetPropertyStringValue ( **/ INT64 * GetPropertyNumericValue ( - IN CHAR8 *Schema, - IN CHAR8 *Version, - IN EFI_STRING PropertyName, - IN EFI_STRING ConfigureLang + IN CHAR8 *Schema, + IN CHAR8 *Version, + IN EFI_STRING PropertyName, + IN EFI_STRING ConfigureLang ) { - EFI_STATUS Status; - EDKII_REDFISH_VALUE RedfishValue; - EFI_STRING ConfigureLangBuffer; - UINTN BufferSize; - INT64 *ResultValue; + EFI_STATUS Status; + EDKII_REDFISH_VALUE RedfishValue; + EFI_STRING ConfigureLangBuffer; + UINTN BufferSize; + INT64 *ResultValue; if (IS_EMPTY_STRING (Schema) || IS_EMPTY_STRING (Version) || IS_EMPTY_STRING (ConfigureLang) || IS_EMPTY_STRING (PropertyName)) { return NULL; @@ -2259,7 +2303,7 @@ GetPropertyNumericValue ( // // Configure Language buffer. // - BufferSize = sizeof (CHAR16) * MAX_CONF_LANG_LEN; + BufferSize = sizeof (CHAR16) * MAX_CONF_LANG_LEN; ConfigureLangBuffer = AllocatePool (BufferSize); if (ConfigureLangBuffer == NULL) { return NULL; @@ -2302,17 +2346,17 @@ GetPropertyNumericValue ( **/ BOOLEAN * GetPropertyBooleanValue ( - IN CHAR8 *Schema, - IN CHAR8 *Version, - IN EFI_STRING PropertyName, - IN EFI_STRING ConfigureLang + IN CHAR8 *Schema, + IN CHAR8 *Version, + IN EFI_STRING PropertyName, + IN EFI_STRING ConfigureLang ) { - EFI_STATUS Status; - EDKII_REDFISH_VALUE RedfishValue; - EFI_STRING ConfigureLangBuffer; - UINTN BufferSize; - BOOLEAN *ResultValue; + EFI_STATUS Status; + EDKII_REDFISH_VALUE RedfishValue; + EFI_STRING ConfigureLangBuffer; + UINTN BufferSize; + BOOLEAN *ResultValue; if (IS_EMPTY_STRING (Schema) || IS_EMPTY_STRING (Version) || IS_EMPTY_STRING (ConfigureLang) || IS_EMPTY_STRING (PropertyName)) { return NULL; @@ -2321,7 +2365,7 @@ GetPropertyBooleanValue ( // // Configure Language buffer. // - BufferSize = sizeof (CHAR16) * MAX_CONF_LANG_LEN; + BufferSize = sizeof (CHAR16) * MAX_CONF_LANG_LEN; ConfigureLangBuffer = AllocatePool (BufferSize); if (ConfigureLangBuffer == NULL) { return NULL; @@ -2366,8 +2410,8 @@ GetAttributeNameFromConfigLanguage ( IN EFI_STRING ConfigureLanguage ) { - UINTN StringLen; - UINTN Index; + UINTN StringLen; + UINTN Index; if (IS_EMPTY_STRING (ConfigureLanguage)) { return NULL; @@ -2398,21 +2442,21 @@ GetAttributeNameFromConfigLanguage ( **/ CHAR8 ** GetPropertyStringArrayValue ( - IN CHAR8 *Schema, - IN CHAR8 *Version, - IN EFI_STRING PropertyName, - IN EFI_STRING ConfigureLang, - OUT UINTN *ArraySize + IN CHAR8 *Schema, + IN CHAR8 *Version, + IN EFI_STRING PropertyName, + IN EFI_STRING ConfigureLang, + OUT UINTN *ArraySize ) { - EFI_STATUS Status; - EDKII_REDFISH_VALUE RedfishValue; - EFI_STRING ConfigureLangBuffer; - UINTN BufferSize; - CHAR8 **StringArray; - UINTN Index; + EFI_STATUS Status; + EDKII_REDFISH_VALUE RedfishValue; + EFI_STRING ConfigureLangBuffer; + UINTN BufferSize; + CHAR8 **StringArray; + UINTN Index; - if (IS_EMPTY_STRING (Schema) || IS_EMPTY_STRING (Version) || IS_EMPTY_STRING (ConfigureLang) || IS_EMPTY_STRING (PropertyName) || ArraySize == NULL) { + if (IS_EMPTY_STRING (Schema) || IS_EMPTY_STRING (Version) || IS_EMPTY_STRING (ConfigureLang) || IS_EMPTY_STRING (PropertyName) || (ArraySize == NULL)) { return NULL; } @@ -2421,7 +2465,7 @@ GetPropertyStringArrayValue ( // // Configure Language buffer. // - BufferSize = sizeof (CHAR16) * MAX_CONF_LANG_LEN; + BufferSize = sizeof (CHAR16) * MAX_CONF_LANG_LEN; ConfigureLangBuffer = AllocatePool (BufferSize); if (ConfigureLangBuffer == NULL) { DEBUG ((DEBUG_ERROR, "%a, out of resource\n", __FUNCTION__)); @@ -2469,21 +2513,21 @@ GetPropertyStringArrayValue ( **/ INT64 * GetPropertyNumericArrayValue ( - IN CHAR8 *Schema, - IN CHAR8 *Version, - IN EFI_STRING PropertyName, - IN EFI_STRING ConfigureLang, - OUT UINTN *ArraySize + IN CHAR8 *Schema, + IN CHAR8 *Version, + IN EFI_STRING PropertyName, + IN EFI_STRING ConfigureLang, + OUT UINTN *ArraySize ) { - EFI_STATUS Status; - EDKII_REDFISH_VALUE RedfishValue; - EFI_STRING ConfigureLangBuffer; - UINTN BufferSize; - INT64 *IntegerArray; - UINTN Index; + EFI_STATUS Status; + EDKII_REDFISH_VALUE RedfishValue; + EFI_STRING ConfigureLangBuffer; + UINTN BufferSize; + INT64 *IntegerArray; + UINTN Index; - if (IS_EMPTY_STRING (Schema) || IS_EMPTY_STRING (Version) || IS_EMPTY_STRING (ConfigureLang) || IS_EMPTY_STRING (PropertyName) || ArraySize == NULL) { + if (IS_EMPTY_STRING (Schema) || IS_EMPTY_STRING (Version) || IS_EMPTY_STRING (ConfigureLang) || IS_EMPTY_STRING (PropertyName) || (ArraySize == NULL)) { return NULL; } @@ -2492,7 +2536,7 @@ GetPropertyNumericArrayValue ( // // Configure Language buffer. // - BufferSize = sizeof (CHAR16) * MAX_CONF_LANG_LEN; + BufferSize = sizeof (CHAR16) * MAX_CONF_LANG_LEN; ConfigureLangBuffer = AllocatePool (BufferSize); if (ConfigureLangBuffer == NULL) { DEBUG ((DEBUG_ERROR, "%a, out of resource\n", __FUNCTION__)); @@ -2540,21 +2584,21 @@ GetPropertyNumericArrayValue ( **/ BOOLEAN * GetPropertyBooleanArrayValue ( - IN CHAR8 *Schema, - IN CHAR8 *Version, - IN EFI_STRING PropertyName, - IN EFI_STRING ConfigureLang, - OUT UINTN *ArraySize + IN CHAR8 *Schema, + IN CHAR8 *Version, + IN EFI_STRING PropertyName, + IN EFI_STRING ConfigureLang, + OUT UINTN *ArraySize ) { - EFI_STATUS Status; - EDKII_REDFISH_VALUE RedfishValue; - EFI_STRING ConfigureLangBuffer; - UINTN BufferSize; - BOOLEAN *BooleanArray; - UINTN Index; + EFI_STATUS Status; + EDKII_REDFISH_VALUE RedfishValue; + EFI_STRING ConfigureLangBuffer; + UINTN BufferSize; + BOOLEAN *BooleanArray; + UINTN Index; - if (IS_EMPTY_STRING (Schema) || IS_EMPTY_STRING (Version) || IS_EMPTY_STRING (ConfigureLang) || IS_EMPTY_STRING (PropertyName) || ArraySize == NULL) { + if (IS_EMPTY_STRING (Schema) || IS_EMPTY_STRING (Version) || IS_EMPTY_STRING (ConfigureLang) || IS_EMPTY_STRING (PropertyName) || (ArraySize == NULL)) { return NULL; } @@ -2563,7 +2607,7 @@ GetPropertyBooleanArrayValue ( // // Configure Language buffer. // - BufferSize = sizeof (CHAR16) * MAX_CONF_LANG_LEN; + BufferSize = sizeof (CHAR16) * MAX_CONF_LANG_LEN; ConfigureLangBuffer = AllocatePool (BufferSize); if (ConfigureLangBuffer == NULL) { DEBUG ((DEBUG_ERROR, "%a, out of resource\n", __FUNCTION__)); @@ -2605,25 +2649,28 @@ GetPropertyBooleanArrayValue ( **/ VOID FreeEmptyPropKeyValueList ( - RedfishCS_EmptyProp_KeyValue *EmptyPropKeyValueListHead + RedfishCS_EmptyProp_KeyValue *EmptyPropKeyValueListHead ) { - RedfishCS_EmptyProp_KeyValue *NextEmptyPropKeyValueList; + RedfishCS_EmptyProp_KeyValue *NextEmptyPropKeyValueList; while (EmptyPropKeyValueListHead != NULL) { NextEmptyPropKeyValueList = EmptyPropKeyValueListHead->NextKeyValuePtr; if (EmptyPropKeyValueListHead->Value->DataValue.CharPtr != NULL) { - FreePool(EmptyPropKeyValueListHead->Value->DataValue.CharPtr); + FreePool (EmptyPropKeyValueListHead->Value->DataValue.CharPtr); } + if (EmptyPropKeyValueListHead->Value != NULL) { - FreePool(EmptyPropKeyValueListHead->Value); + FreePool (EmptyPropKeyValueListHead->Value); } + if (EmptyPropKeyValueListHead->KeyNamePtr != NULL) { - FreePool(EmptyPropKeyValueListHead->KeyNamePtr); + FreePool (EmptyPropKeyValueListHead->KeyNamePtr); } + FreePool (EmptyPropKeyValueListHead); EmptyPropKeyValueListHead = NextEmptyPropKeyValueList; - }; + } } /** @@ -2640,26 +2687,28 @@ FreeEmptyPropKeyValueList ( RedfishCS_EmptyProp_KeyValue * NewEmptyPropKeyValueFromRedfishValue ( IN EFI_STRING KeyName, - IN EDKII_REDFISH_VALUE *RedfishValue + IN EDKII_REDFISH_VALUE *RedfishValue ) { - RedfishCS_EmptyProp_KeyValue *EmptyPropKeyValue; - RedfishCS_Vague *VagueValue; - RedfishCS_char *KeyNameChar; - VOID *Data; - UINTN DataSize; - INT32 Bool32; - - KeyNameChar = StrUnicodeToAscii(KeyName); + RedfishCS_EmptyProp_KeyValue *EmptyPropKeyValue; + RedfishCS_Vague *VagueValue; + RedfishCS_char *KeyNameChar; + VOID *Data; + UINTN DataSize; + INT32 Bool32; + + KeyNameChar = StrUnicodeToAscii (KeyName); if (KeyNameChar == NULL) { DEBUG ((DEBUG_ERROR, "%a, Failed to convert unicode to ASCII.\n", __FUNCTION__)); return NULL; } + EmptyPropKeyValue = (RedfishCS_EmptyProp_KeyValue *)AllocateZeroPool (sizeof (RedfishCS_EmptyProp_KeyValue)); if (EmptyPropKeyValue == NULL) { DEBUG ((DEBUG_ERROR, "%a, Failed to allocate memory for EmptyPropKeyValue\n", __FUNCTION__)); return NULL; } + VagueValue = (RedfishCS_Vague *)AllocateZeroPool (sizeof (RedfishCS_Vague)); if (VagueValue == NULL) { DEBUG ((DEBUG_ERROR, "%a, Failed to allocate memory for VagueValue\n", __FUNCTION__)); @@ -2669,29 +2718,30 @@ NewEmptyPropKeyValueFromRedfishValue ( if (RedfishValue->Type == REDFISH_VALUE_TYPE_BOOLEAN) { VagueValue->DataType = RedfishCS_Vague_DataType_Bool; - DataSize = sizeof (BOOLEAN); + DataSize = sizeof (BOOLEAN); // // Redfish JSON to C strcuture converter uses // "int" for the BOOLEAN. // Bool32 = (INT32)RedfishValue->Value.Boolean; - Data = (VOID *)&Bool32; + Data = (VOID *)&Bool32; } else if (RedfishValue->Type == REDFISH_VALUE_TYPE_INTEGER) { VagueValue->DataType = RedfishCS_Vague_DataType_Int64; - DataSize = sizeof (INT64); - Data = (VOID *)&RedfishValue->Value.Integer; + DataSize = sizeof (INT64); + Data = (VOID *)&RedfishValue->Value.Integer; } else if (RedfishValue->Type == REDFISH_VALUE_TYPE_STRING) { VagueValue->DataType = RedfishCS_Vague_DataType_String; - DataSize = AsciiStrSize(RedfishValue->Value.Buffer); - Data = (VOID *)RedfishValue->Value.Buffer; + DataSize = AsciiStrSize (RedfishValue->Value.Buffer); + Data = (VOID *)RedfishValue->Value.Buffer; } else { DEBUG ((DEBUG_ERROR, "%a, wrong type of RedfishValue: %x\n", __FUNCTION__, RedfishValue->Type)); FreePool (VagueValue); FreePool (EmptyPropKeyValue); return NULL; } - VagueValue->DataValue.CharPtr = (RedfishCS_char *)AllocateCopyPool(DataSize, Data); - EmptyPropKeyValue->Value = VagueValue; + + VagueValue->DataValue.CharPtr = (RedfishCS_char *)AllocateCopyPool (DataSize, Data); + EmptyPropKeyValue->Value = VagueValue; EmptyPropKeyValue->KeyNamePtr = KeyNameChar; return EmptyPropKeyValue; } @@ -2712,25 +2762,25 @@ NewEmptyPropKeyValueFromRedfishValue ( **/ RedfishCS_EmptyProp_KeyValue * GetPropertyVagueValue ( - IN CHAR8 *Schema, - IN CHAR8 *Version, - IN EFI_STRING PropertyName, - IN EFI_STRING ConfigureLang, - OUT UINT32 *NumberOfValues + IN CHAR8 *Schema, + IN CHAR8 *Version, + IN EFI_STRING PropertyName, + IN EFI_STRING ConfigureLang, + OUT UINT32 *NumberOfValues ) { - EFI_STATUS Status; - RedfishCS_EmptyProp_KeyValue *EmptyPropKeyValueList; - RedfishCS_EmptyProp_KeyValue *PreEmptyPropKeyValueList; - RedfishCS_EmptyProp_KeyValue *FirstEmptyPropKeyValueList; - EDKII_REDFISH_VALUE RedfishValue; - EFI_STRING ConfigureLangBuffer; - EFI_STRING KeyName; - EFI_STRING *ConfigureLangList; - EFI_STRING SearchPattern; - UINTN BufferSize; - UINTN ConfigListCount; - UINTN ConfigListCountIndex; + EFI_STATUS Status; + RedfishCS_EmptyProp_KeyValue *EmptyPropKeyValueList; + RedfishCS_EmptyProp_KeyValue *PreEmptyPropKeyValueList; + RedfishCS_EmptyProp_KeyValue *FirstEmptyPropKeyValueList; + EDKII_REDFISH_VALUE RedfishValue; + EFI_STRING ConfigureLangBuffer; + EFI_STRING KeyName; + EFI_STRING *ConfigureLangList; + EFI_STRING SearchPattern; + UINTN BufferSize; + UINTN ConfigListCount; + UINTN ConfigListCountIndex; if (IS_EMPTY_STRING (Schema) || IS_EMPTY_STRING (Version) || IS_EMPTY_STRING (ConfigureLang) || IS_EMPTY_STRING (PropertyName)) { return NULL; @@ -2739,24 +2789,26 @@ GetPropertyVagueValue ( // // Configure Language buffer. // - BufferSize = sizeof (CHAR16) * MAX_CONF_LANG_LEN; + BufferSize = sizeof (CHAR16) * MAX_CONF_LANG_LEN; ConfigureLangBuffer = AllocatePool (BufferSize); if (ConfigureLangBuffer == NULL) { DEBUG ((DEBUG_ERROR, "%a, Failed to allocate memory for ConfigureLangBuffer\n", __FUNCTION__)); return NULL; } + UnicodeSPrint (ConfigureLangBuffer, BufferSize, L"%s/%s", ConfigureLang, PropertyName); // // Initial search pattern // - BufferSize = (StrLen (ConfigureLangBuffer) + StrLen (L"/.*") + 1) * sizeof (CHAR16); // Increase one for the NULL terminator. + BufferSize = (StrLen (ConfigureLangBuffer) + StrLen (L"/.*") + 1) * sizeof (CHAR16); // Increase one for the NULL terminator. SearchPattern = AllocatePool (BufferSize); if (SearchPattern == NULL) { DEBUG ((DEBUG_ERROR, "%a, Failed to allocate memory for SearchPattern\n", __FUNCTION__)); FreePool (ConfigureLangBuffer); return NULL; } + BufferSize = BufferSize / sizeof (CHAR16); StrCpyS (SearchPattern, BufferSize, ConfigureLangBuffer); StrCatS (SearchPattern, BufferSize, L"/.*"); @@ -2769,28 +2821,30 @@ GetPropertyVagueValue ( // // Build up the list of RedfishCS_EmptyProp_KeyValue. // - ConfigListCountIndex = 0; - PreEmptyPropKeyValueList = NULL; + ConfigListCountIndex = 0; + PreEmptyPropKeyValueList = NULL; FirstEmptyPropKeyValueList = NULL; while (ConfigListCountIndex < ConfigListCount) { - Status = RedfishPlatformConfigGetValue(Schema, Version, ConfigureLangList [ConfigListCountIndex], &RedfishValue); + Status = RedfishPlatformConfigGetValue (Schema, Version, ConfigureLangList[ConfigListCountIndex], &RedfishValue); if (EFI_ERROR (Status)) { - DEBUG ((DEBUG_ERROR, "%a, %a.%a query current setting for %s failed: %r\n", __FUNCTION__, Schema, Version, ConfigureLangList [ConfigListCountIndex], Status)); + DEBUG ((DEBUG_ERROR, "%a, %a.%a query current setting for %s failed: %r\n", __FUNCTION__, Schema, Version, ConfigureLangList[ConfigListCountIndex], Status)); goto ErrorLeave; } + // // Get the key name. // - KeyName = GetAttributeNameFromConfigLanguage (ConfigureLangList [ConfigListCountIndex]); + KeyName = GetAttributeNameFromConfigLanguage (ConfigureLangList[ConfigListCountIndex]); // // Create an entry of RedfishCS_EmptyProp_KeyValue. // EmptyPropKeyValueList = NewEmptyPropKeyValueFromRedfishValue (KeyName, &RedfishValue); if (EmptyPropKeyValueList == NULL) { DEBUG ((DEBUG_ERROR, "%a, Failed to create an entry of EmptyPropKeyValueList\n", __FUNCTION__)); - ConfigListCountIndex ++; + ConfigListCountIndex++; continue; } + // // Link the RedfishCS_EmptyProp_KeyValue list. // @@ -2799,24 +2853,29 @@ GetPropertyVagueValue ( } else { FirstEmptyPropKeyValueList = EmptyPropKeyValueList; } + PreEmptyPropKeyValueList = EmptyPropKeyValueList; - ConfigListCountIndex ++; - }; + ConfigListCountIndex++; + } + goto LeaveFunction; ErrorLeave:; if (FirstEmptyPropKeyValueList != NULL) { FreeEmptyPropKeyValueList (FirstEmptyPropKeyValueList); } + FirstEmptyPropKeyValueList = NULL; LeaveFunction: if (SearchPattern != NULL) { FreePool (SearchPattern); } + if (ConfigureLangBuffer != NULL) { FreePool (ConfigureLangBuffer); } + FreePool (ConfigureLangList); *NumberOfValues = (UINT32)ConfigListCount; @@ -2836,15 +2895,15 @@ LeaveFunction: **/ BOOLEAN PropertyChecker ( - IN VOID *PropertyBuffer, - IN BOOLEAN ProvisionMode + IN VOID *PropertyBuffer, + IN BOOLEAN ProvisionMode ) { if (ProvisionMode) { return TRUE; } - if (!ProvisionMode && PropertyBuffer != NULL) { + if (!ProvisionMode && (PropertyBuffer != NULL)) { return TRUE; } @@ -2865,12 +2924,12 @@ PropertyChecker ( **/ BOOLEAN CheckEtag ( - IN EFI_STRING Uri, - IN CHAR8 *EtagInHeader, - IN CHAR8 *EtagInJson + IN EFI_STRING Uri, + IN CHAR8 *EtagInHeader, + IN CHAR8 *EtagInJson ) { - CHAR8 *EtagInDb; + CHAR8 *EtagInDb; if (IS_EMPTY_STRING (Uri)) { return FALSE; @@ -2920,15 +2979,15 @@ CheckEtag ( **/ EDKII_JSON_VALUE * MatchJsonObject ( - IN EDKII_JSON_VALUE *JsonObj, - IN CHAR8 *ObjectName + IN EDKII_JSON_VALUE *JsonObj, + IN CHAR8 *ObjectName ) { EDKII_JSON_VALUE N; CHAR8 *Key; EDKII_JSON_VALUE Value; - if (JsonObj == NULL || IS_EMPTY_STRING (ObjectName)) { + if ((JsonObj == NULL) || IS_EMPTY_STRING (ObjectName)) { return NULL; } @@ -2962,11 +3021,11 @@ MatchPropertyWithJsonContext ( IN CHAR8 *Json ) { - CHAR8 *AsciiProperty; - CHAR8 *PropertyNode; - UINTN Index; - EDKII_JSON_VALUE *JsonObj; - EDKII_JSON_VALUE *MatchObj; + CHAR8 *AsciiProperty; + CHAR8 *PropertyNode; + UINTN Index; + EDKII_JSON_VALUE *JsonObj; + EDKII_JSON_VALUE *MatchObj; EDKII_JSON_TYPE JsonType; if (IS_EMPTY_STRING (Property) || IS_EMPTY_STRING (Json)) { @@ -2974,7 +3033,7 @@ MatchPropertyWithJsonContext ( } JsonObj = JsonLoadString (Json, 0, NULL); - if (JsonObj == NULL || !JsonValueIsObject (JsonObj)) { + if ((JsonObj == NULL) || !JsonValueIsObject (JsonObj)) { return FALSE; } @@ -2983,18 +3042,17 @@ MatchPropertyWithJsonContext ( return FALSE; } - Index = 0; + Index = 0; PropertyNode = AsciiProperty; - MatchObj = JsonObj; + MatchObj = JsonObj; // // Walk through property and find corresponding object in JSON input // while (AsciiProperty[Index] != '\0') { - if (AsciiProperty[Index] == '/') { AsciiProperty[Index] = '\0'; - MatchObj = MatchJsonObject (MatchObj, PropertyNode); + MatchObj = MatchJsonObject (MatchObj, PropertyNode); if (MatchObj == NULL) { PropertyNode = NULL; break; @@ -3023,16 +3081,19 @@ MatchPropertyWithJsonContext ( if (JsonValueIsNull (MatchObj)) { MatchObj = NULL; } + break; case EdkiiJsonTypeArray: if (JsonArrayCount (MatchObj) == 0) { MatchObj = NULL; } + break; case EdkiiJsonTypeString: if (IS_EMPTY_STRING (JsonValueGetString (MatchObj))) { MatchObj = NULL; } + break; case EdkiiJsonTypeNull: MatchObj = NULL; @@ -3061,16 +3122,16 @@ MatchPropertyWithJsonContext ( **/ EFI_STATUS AddRedfishCharArray ( - IN OUT RedfishCS_char_Array **Head, + IN OUT RedfishCS_char_Array **Head, IN CHAR8 **StringArray, IN UINTN ArraySize ) { - UINTN Index; - RedfishCS_char_Array *CharArrayBuffer; - RedfishCS_char_Array *PreArrayBuffer; + UINTN Index; + RedfishCS_char_Array *CharArrayBuffer; + RedfishCS_char_Array *PreArrayBuffer; - if (Head == NULL || StringArray == NULL || ArraySize == 0) { + if ((Head == NULL) || (StringArray == NULL) || (ArraySize == 0)) { return EFI_INVALID_PARAMETER; } @@ -3083,14 +3144,15 @@ AddRedfishCharArray ( } if (Index == 0) { - *Head = CharArrayBuffer; + *Head = CharArrayBuffer; } CharArrayBuffer->ArrayValue = StringArray[Index]; - CharArrayBuffer->Next = NULL; + CharArrayBuffer->Next = NULL; if (PreArrayBuffer != NULL) { PreArrayBuffer->Next = CharArrayBuffer; } + PreArrayBuffer = CharArrayBuffer; } @@ -3111,16 +3173,16 @@ AddRedfishCharArray ( **/ EFI_STATUS AddRedfishNumericArray ( - IN OUT RedfishCS_int64_Array **Head, - IN INT64 *NumericArray, - IN UINTN ArraySize + IN OUT RedfishCS_int64_Array **Head, + IN INT64 *NumericArray, + IN UINTN ArraySize ) { - UINTN Index; - RedfishCS_int64_Array *NumericArrayBuffer; - RedfishCS_int64_Array *PreArrayBuffer; + UINTN Index; + RedfishCS_int64_Array *NumericArrayBuffer; + RedfishCS_int64_Array *PreArrayBuffer; - if (Head == NULL || NumericArray == NULL || ArraySize == 0) { + if ((Head == NULL) || (NumericArray == NULL) || (ArraySize == 0)) { return EFI_INVALID_PARAMETER; } @@ -3133,18 +3195,21 @@ AddRedfishNumericArray ( } if (Index == 0) { - *Head = NumericArrayBuffer; + *Head = NumericArrayBuffer; } + NumericArrayBuffer->ArrayValue = AllocatePool (sizeof (RedfishCS_int64)); if (NumericArrayBuffer->ArrayValue == NULL) { ASSERT (NumericArrayBuffer->ArrayValue != NULL); continue; } + *NumericArrayBuffer->ArrayValue = NumericArray[Index]; - NumericArrayBuffer->Next = NULL; + NumericArrayBuffer->Next = NULL; if (PreArrayBuffer != NULL) { PreArrayBuffer->Next = NumericArrayBuffer; } + PreArrayBuffer = NumericArrayBuffer; } @@ -3170,11 +3235,11 @@ AddRedfishBooleanArray ( IN UINTN ArraySize ) { - UINTN Index; - RedfishCS_bool_Array *BooleanArrayBuffer; - RedfishCS_bool_Array *PreArrayBuffer; + UINTN Index; + RedfishCS_bool_Array *BooleanArrayBuffer; + RedfishCS_bool_Array *PreArrayBuffer; - if (Head == NULL || BooleanArray == NULL || ArraySize == 0) { + if ((Head == NULL) || (BooleanArray == NULL) || (ArraySize == 0)) { return EFI_INVALID_PARAMETER; } @@ -3187,7 +3252,7 @@ AddRedfishBooleanArray ( } if (Index == 0) { - *Head = BooleanArrayBuffer; + *Head = BooleanArrayBuffer; } BooleanArrayBuffer->ArrayValue = AllocatePool (sizeof (RedfishCS_bool)); @@ -3195,11 +3260,13 @@ AddRedfishBooleanArray ( ASSERT (BooleanArrayBuffer->ArrayValue != NULL); continue; } + *BooleanArrayBuffer->ArrayValue = BooleanArray[Index]; - BooleanArrayBuffer->Next = NULL; + BooleanArrayBuffer->Next = NULL; if (PreArrayBuffer != NULL) { PreArrayBuffer->Next = BooleanArrayBuffer; } + PreArrayBuffer = BooleanArrayBuffer; } @@ -3222,22 +3289,21 @@ AddRedfishBooleanArray ( **/ BOOLEAN CompareRedfishStringArrayValues ( - IN RedfishCS_char_Array *Head, - IN CHAR8 **StringArray, - IN UINTN ArraySize + IN RedfishCS_char_Array *Head, + IN CHAR8 **StringArray, + IN UINTN ArraySize ) { UINTN Index; RedfishCS_char_Array *CharArrayBuffer; - if (Head == NULL || StringArray == NULL || ArraySize == 0) { + if ((Head == NULL) || (StringArray == NULL) || (ArraySize == 0)) { return FALSE; } CharArrayBuffer = Head; - Index = 0; + Index = 0; while (CharArrayBuffer != NULL && Index < ArraySize) { - if (AsciiStrCmp (StringArray[Index], CharArrayBuffer->ArrayValue) != 0) { break; } @@ -3246,7 +3312,7 @@ CompareRedfishStringArrayValues ( CharArrayBuffer = CharArrayBuffer->Next; } - if (CharArrayBuffer != NULL || Index < ArraySize) { + if ((CharArrayBuffer != NULL) || (Index < ArraySize)) { return FALSE; } @@ -3269,20 +3335,20 @@ CompareRedfishStringArrayValues ( **/ BOOLEAN CompareRedfishNumericArrayValues ( - IN RedfishCS_int64_Array *Head, - IN INT64 *NumericArray, - IN UINTN ArraySize + IN RedfishCS_int64_Array *Head, + IN INT64 *NumericArray, + IN UINTN ArraySize ) { UINTN Index; RedfishCS_int64_Array *NumericArrayBuffer; - if (Head == NULL || NumericArray == NULL || ArraySize == 0) { + if ((Head == NULL) || (NumericArray == NULL) || (ArraySize == 0)) { return FALSE; } NumericArrayBuffer = Head; - Index = 0; + Index = 0; while (NumericArrayBuffer != NULL && Index < ArraySize) { if (NumericArray[Index] != *NumericArrayBuffer->ArrayValue) { break; @@ -3292,7 +3358,7 @@ CompareRedfishNumericArrayValues ( NumericArrayBuffer = NumericArrayBuffer->Next; } - if (NumericArrayBuffer != NULL || Index < ArraySize) { + if ((NumericArrayBuffer != NULL) || (Index < ArraySize)) { return FALSE; } @@ -3320,15 +3386,15 @@ CompareRedfishBooleanArrayValues ( IN UINTN ArraySize ) { - UINTN Index; + UINTN Index; RedfishCS_bool_Array *BooleanArrayBuffer; - if (Head == NULL || BooleanArray == NULL || ArraySize == 0) { + if ((Head == NULL) || (BooleanArray == NULL) || (ArraySize == 0)) { return FALSE; } BooleanArrayBuffer = Head; - Index = 0; + Index = 0; while (BooleanArrayBuffer != NULL && Index < ArraySize) { if (BooleanArray[Index] != *BooleanArrayBuffer->ArrayValue) { break; @@ -3338,13 +3404,79 @@ CompareRedfishBooleanArrayValues ( BooleanArrayBuffer = BooleanArrayBuffer->Next; } - if (BooleanArrayBuffer != NULL || Index < ArraySize) { + if ((BooleanArrayBuffer != NULL) || (Index < ArraySize)) { return FALSE; } return TRUE; } +/** + + Check and see if "@Redfish.Settings" exist in given Payload. If found, return the + payload and URI to pending settings. Caller has to release "SettingPayload" and + "SettingUri". + + @param[in] Payload Payload that may contain "@Redfish.Settings" + @param[out] SettingPayload Payload keeps pending settings. + @param[out] SettingUri URI to pending settings. + + @retval EFI_SUCCESS Pending settings is found and returned. + @retval Others Error happens + +**/ +EFI_STATUS +GetPendingSettings ( + IN REDFISH_SERVICE RedfishService, + IN REDFISH_PAYLOAD Payload, + OUT REDFISH_RESPONSE *SettingResponse, + OUT EFI_STRING *SettingUri + ) +{ + CONST CHAR8 *RedfishSettingsUriKeys[] = { "@Redfish.Settings", "SettingsObject", "@odata.id" }; + EDKII_JSON_VALUE JsonValue; + UINTN Index; + EFI_STATUS Status; + + if ((RedfishService == NULL) || (Payload == NULL) || (SettingResponse == NULL) || (SettingUri == NULL)) { + return EFI_INVALID_PARAMETER; + } + + *SettingUri = NULL; + JsonValue = RedfishJsonInPayload (Payload); + + // + // Seeking RedfishSettings URI link. + // + for (Index = 0; Index < ARRAY_SIZE (RedfishSettingsUriKeys); Index++) { + if (JsonValue == NULL) { + break; + } + + JsonValue = JsonObjectGetValue (JsonValueGetObject (JsonValue), RedfishSettingsUriKeys[Index]); + } + + if (JsonValue != NULL) { + // + // Verify RedfishSettings URI link is valid to retrieve resource or not. + // + *SettingUri = JsonValueGetUnicodeString (JsonValue); + if (*SettingUri == NULL) { + return EFI_NOT_FOUND; + } + + Status = GetResourceByUri (RedfishService, *SettingUri, SettingResponse); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: @Redfish.Settings exists, get resource from: %s failed: %r\n", __FUNCTION__, *SettingUri, Status)); + return Status; + } + + return EFI_SUCCESS; + } + + return EFI_NOT_FOUND; +} + /** Check and see if any difference between two vague value set. @@ -3361,12 +3493,12 @@ CompareRedfishBooleanArrayValues ( **/ BOOLEAN CompareRedfishPropertyVagueValues ( - IN RedfishCS_EmptyProp_KeyValue *RedfishVagueKeyValuePtr, - IN UINT32 RedfishVagueKeyValueNumber, - IN RedfishCS_EmptyProp_KeyValue *ConfigVagueKeyValuePtr, - IN UINT32 ConfigVagueKeyValueNumber + IN RedfishCS_EmptyProp_KeyValue *RedfishVagueKeyValuePtr, + IN UINT32 RedfishVagueKeyValueNumber, + IN RedfishCS_EmptyProp_KeyValue *ConfigVagueKeyValuePtr, + IN UINT32 ConfigVagueKeyValueNumber ) - { +{ RedfishCS_EmptyProp_KeyValue *ThisConfigVagueKeyValuePtr; RedfishCS_EmptyProp_KeyValue *ThisRedfishVagueKeyValuePtr; @@ -3384,13 +3516,14 @@ CompareRedfishPropertyVagueValues ( // Loop through all key/value on Redfish service.. // while (ThisRedfishVagueKeyValuePtr != NULL) { - if (AsciiStrCmp(ThisConfigVagueKeyValuePtr->KeyNamePtr, ThisRedfishVagueKeyValuePtr->KeyNamePtr) == 0) { + if (AsciiStrCmp (ThisConfigVagueKeyValuePtr->KeyNamePtr, ThisRedfishVagueKeyValuePtr->KeyNamePtr) == 0) { // // Check the type of value. // if (ThisConfigVagueKeyValuePtr->Value->DataType != ThisRedfishVagueKeyValuePtr->Value->DataType) { return FALSE; } + // // Check the value. // @@ -3398,11 +3531,13 @@ CompareRedfishPropertyVagueValues ( // // Is the string identical? // - if (AsciiStrCmp (ThisConfigVagueKeyValuePtr->Value->DataValue.CharPtr, - ThisRedfishVagueKeyValuePtr->Value->DataValue.CharPtr - ) == 0) { + if (AsciiStrCmp ( + ThisConfigVagueKeyValuePtr->Value->DataValue.CharPtr, + ThisRedfishVagueKeyValuePtr->Value->DataValue.CharPtr + ) == 0) + { break; - } else{ + } else { return FALSE; } } else if (ThisConfigVagueKeyValuePtr->Value->DataType == RedfishCS_Vague_DataType_Int64) { @@ -3421,16 +3556,20 @@ CompareRedfishPropertyVagueValues ( return FALSE; } } + ThisRedfishVagueKeyValuePtr = ThisRedfishVagueKeyValuePtr->NextKeyValuePtr; - }; + } + if (ThisRedfishVagueKeyValuePtr == NULL) { // // No matched key name. Threat these two vague value set is different. // return FALSE; } + ThisConfigVagueKeyValuePtr = ThisConfigVagueKeyValuePtr->NextKeyValuePtr; - }; + } + return TRUE; } @@ -3448,11 +3587,10 @@ CompareRedfishPropertyVagueValues ( EFI_STATUS EFIAPI RedfishFeatureUtilityLibConstructor ( - IN EFI_HANDLE ImageHandle, - IN EFI_SYSTEM_TABLE *SystemTable + IN EFI_HANDLE ImageHandle, + IN EFI_SYSTEM_TABLE *SystemTable ) { - return EFI_SUCCESS; } @@ -3468,8 +3606,8 @@ RedfishFeatureUtilityLibConstructor ( EFI_STATUS EFIAPI RedfishFeatureUtilityLibDestructor ( - IN EFI_HANDLE ImageHandle, - IN EFI_SYSTEM_TABLE *SystemTable + IN EFI_HANDLE ImageHandle, + IN EFI_SYSTEM_TABLE *SystemTable ) { return EFI_SUCCESS; -- 2.39.2.windows.1 -=-=-=-=-=-=-=-=-=-=-=- Groups.io Links: You receive all messages sent to this group. View/Reply Online (#100593): https://edk2.groups.io/g/devel/message/100593 Mute This Topic: https://groups.io/mt/97315341/21656 Group Owner: devel+ow...@edk2.groups.io Unsubscribe: https://edk2.groups.io/g/devel/unsub [arch...@mail-archive.com] -=-=-=-=-=-=-=-=-=-=-=-