/*++ Copyright (c) 2004 - 2010, Intel Corporation. All rights reserved.
This program and the accompanying materials are licensed and made available under the terms and conditions of the BSD License which accompanies this distribution. The full text of the license may be found at http://opensource.org/licenses/bsd-license.php THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. Module Name: StringParse.c Abstract: Routines for parsing HII string packs --*/ #include #include #include #include "Tiano.h" #include "EfiUtilityMsgs.h" #include "EfiInternalFormRepresentation.h" #include "Hii.h" #include "StringParse.h" #include "HiiPack.h" typedef struct _STRING_PACK_RECORD { struct _STRING_PACK_RECORD *Next; int Handle; EFI_GUID PackageGuid; EFI_GUID FormsetGuid; EFI_HII_STRING_PACK *StringPack; int StringPackSize; int NumStringPacks; } STRING_PACK_RECORD; static STRING_PACK_RECORD *mStringPacks = NULL; STATUS StringGetPack ( int Handle, // matches handle passed in with StringParsePack() EFI_HII_STRING_PACK **StringPack, // returned pointer to string pack int *StringPackSize, // sizeof buffer pointed to by StringPack int *NumStringPacks, // in the array pointed to by StringPack EFI_GUID *FormsetGuid, EFI_GUID *PackageGuid ) /*++ Routine Description: Get a string pack given to us previously Arguments: Handle - handle of string pack to get StringPack - outgoing pointer to string pack on the given handle StringPackSize - outgoing size of string pack pointed to by StringPack NumStringPacks - outgoing number of string packs in StringPack[] array FormsetGuid - outgoing GUID passed in with the string pack when it was parsed PackageGuid - outgoing GUID passed in with the string pack when it was parsed Returns: STATUS_SUCCESS - string pack with matching handle was found STATUS_ERROR - otherwise --*/ { STRING_PACK_RECORD *Rec; for (Rec = mStringPacks; Rec != NULL; Rec = Rec->Next) { if (Rec->Handle == Handle) { *StringPack = Rec->StringPack; *StringPackSize = Rec->StringPackSize; *NumStringPacks = Rec->NumStringPacks; return STATUS_SUCCESS; } } return STATUS_ERROR; } STATUS StringParsePack ( int Handle, EFI_HII_STRING_PACK *StringPack, EFI_GUID *FormsetGuid, EFI_GUID *PackageGuid ) /*++ Routine Description: Parse a string pack, saving the information for later retrieval by the caller Arguments: Handle - handle of string pack StringPack - pointer to string pack array to parse FormsetGuid - GUID of the string pack PackageGuid - package GUID from the HII data table from which this string pack orginated Returns: STATUS_SUCCESS - Stringpack processed successfully STATUS_ERROR - otherwise --*/ { STRING_PACK_RECORD *Rec; STRING_PACK_RECORD *TempRec; int PackSize; EFI_HII_STRING_PACK *TempPack; // // Allocate a new string pack record // Rec = (STRING_PACK_RECORD *) malloc (sizeof (STRING_PACK_RECORD)); if (Rec == NULL) { Error (NULL, 0, 0, "memory allocation failure", NULL); return STATUS_ERROR; } memset (Rec, 0, sizeof (STRING_PACK_RECORD)); Rec->Handle = Handle; if (PackageGuid != NULL) { memcpy (&Rec->PackageGuid, PackageGuid, sizeof (EFI_GUID)); } if (FormsetGuid != NULL) { memcpy (&Rec->FormsetGuid, FormsetGuid, sizeof (EFI_GUID)); } // // Walk the string packs to find the terminator // TempPack = StringPack; PackSize = 0; while (TempPack->Header.Length > 0) { if (TempPack->Header.Type != EFI_HII_STRING) { Error (NULL, 0, 0, "found a non-string pack in the string pack array", NULL); free (Rec); return STATUS_ERROR; } PackSize += TempPack->Header.Length; Rec->NumStringPacks++; TempPack = (EFI_HII_STRING_PACK *) ((char *) TempPack + TempPack->Header.Length); } // // Add space for the terminator // PackSize += sizeof (EFI_HII_STRING_PACK); Rec->StringPackSize = PackSize; // // Make a copy of the incoming string pack // Rec->StringPack = (EFI_HII_STRING_PACK *) malloc (PackSize); if (Rec->StringPack == NULL) { Error (NULL, 0, 0, "memory allocation failure", NULL); free (Rec); return STATUS_ERROR; } memcpy ((void *) Rec->StringPack, StringPack, PackSize); // // Add this record to our list // if (mStringPacks == NULL) { mStringPacks = Rec; } else { for (TempRec = mStringPacks; TempRec->Next != NULL; TempRec = TempRec->Next) ; TempRec->Next = Rec; } free (Rec->StringPack); free (Rec); return STATUS_SUCCESS; } STATUS StringInit ( VOID ) /*++ Routine Description: GC_TODO: Add function description Arguments: None Returns: GC_TODO: add return values --*/ { StringEnd (); return STATUS_SUCCESS; } STATUS StringEnd ( VOID ) /*++ Routine Description: GC_TODO: Add function description Arguments: None Returns: GC_TODO: add return values --*/ { STRING_PACK_RECORD *Next; // // Free up all the memory we've allocated // while (mStringPacks != NULL) { if (mStringPacks->StringPack != NULL) { free (mStringPacks->StringPack); } Next = mStringPacks->Next; free (mStringPacks); mStringPacks = Next; } return STATUS_SUCCESS; }