MdeModulePkg: Refine the code in BootMaintenanceManagerUiLib
[mirror_edk2.git] / MdeModulePkg / Library / BootMaintenanceManagerUiLib / Variable.c
index a276caed05c4f3a76a87e0d29356ed3349ca5f77..929f38343bd65f591846cf5a11584ec4d579072e 100644 (file)
@@ -1,7 +1,7 @@
 /** @file\r
 Variable operation that will be used by bootmaint\r
 \r
-Copyright (c) 2004 - 2015, Intel Corporation. All rights reserved.<BR>\r
+Copyright (c) 2004 - 2016, Intel Corporation. All rights reserved.<BR>\r
 This program and the accompanying materials\r
 are licensed and made available under the terms and conditions of the BSD License\r
 which accompanies this distribution.  The full text of the license may be found at\r
@@ -535,19 +535,18 @@ Var_UpdateDriverOption (
   )\r
 {\r
   UINT16          Index;\r
-  UINT16          *DriverOrderList;\r
-  UINT16          *NewDriverOrderList;\r
   UINT16          DriverString[12];\r
-  UINTN           DriverOrderListSize;\r
-  VOID            *Buffer;\r
-  UINTN           BufferSize;\r
-  UINT8           *Ptr;\r
   BM_MENU_ENTRY   *NewMenuEntry;\r
   BM_LOAD_CONTEXT *NewLoadContext;\r
   BOOLEAN         OptionalDataExist;\r
   EFI_STATUS      Status;\r
+  EFI_BOOT_MANAGER_LOAD_OPTION  LoadOption;\r
+  UINT8                         *OptionalDesData;\r
+  UINT32                        OptionalDataSize;\r
 \r
   OptionalDataExist = FALSE;\r
+  OptionalDesData = NULL;\r
+  OptionalDataSize = 0;\r
 \r
   Index             = BOpt_GetDriverOptionNumber ();\r
   UnicodeSPrint (\r
@@ -561,68 +560,50 @@ Var_UpdateDriverOption (
     StrCpyS (DescriptionData, MAX_MENU_NUMBER, DriverString);\r
   }\r
 \r
-  BufferSize = sizeof (UINT32) + sizeof (UINT16) + StrSize (DescriptionData);\r
-  BufferSize += GetDevicePathSize (CallbackData->LoadContext->FilePathList);\r
-\r
   if (*OptionalData != 0x0000) {\r
     OptionalDataExist = TRUE;\r
-    BufferSize += StrSize (OptionalData);\r
-  }\r
-\r
-  Buffer = AllocateZeroPool (BufferSize);\r
-  if (NULL == Buffer) {\r
-    return EFI_OUT_OF_RESOURCES;\r
+    OptionalDesData = (UINT8 *)OptionalData;\r
+    OptionalDataSize = (UINT32)StrSize (OptionalData);\r
   }\r
 \r
   NewMenuEntry = BOpt_CreateMenuEntry (BM_LOAD_CONTEXT_SELECT);\r
   if (NULL == NewMenuEntry) {\r
-    FreePool (Buffer);\r
     return EFI_OUT_OF_RESOURCES;\r
   }\r
 \r
+  Status = EfiBootManagerInitializeLoadOption (\r
+             &LoadOption,\r
+             Index,\r
+             LoadOptionTypeDriver,\r
+             LOAD_OPTION_ACTIVE | (ForceReconnect << 1),\r
+             DescriptionData,\r
+             CallbackData->LoadContext->FilePathList,\r
+             OptionalDesData,\r
+             OptionalDataSize\r
+           );\r
+  if (!EFI_ERROR (Status)){\r
+    Status = EfiBootManagerAddLoadOptionVariable (&LoadOption,(UINTN) -1 );\r
+  }\r
+\r
   NewLoadContext                  = (BM_LOAD_CONTEXT *) NewMenuEntry->VariableContext;\r
   NewLoadContext->Deleted         = FALSE;\r
-  NewLoadContext->LoadOptionSize  = BufferSize;\r
-  Ptr = (UINT8 *) Buffer;\r
-  NewLoadContext->LoadOption = Ptr;\r
-  *((UINT32 *) Ptr) = LOAD_OPTION_ACTIVE | (ForceReconnect << 1);\r
-  NewLoadContext->Attributes = *((UINT32 *) Ptr);\r
-  NewLoadContext->IsActive = TRUE;\r
-  NewLoadContext->ForceReconnect = (BOOLEAN) (NewLoadContext->Attributes & LOAD_OPTION_FORCE_RECONNECT);\r
-\r
-  Ptr += sizeof (UINT32);\r
-  *((UINT16 *) Ptr) = (UINT16) GetDevicePathSize (CallbackData->LoadContext->FilePathList);\r
-  NewLoadContext->FilePathListLength = *((UINT16 *) Ptr);\r
-\r
-  Ptr += sizeof (UINT16);\r
-  CopyMem (\r
-    Ptr,\r
-    DescriptionData,\r
-    StrSize (DescriptionData)\r
-    );\r
+  NewLoadContext->Attributes = LoadOption.Attributes;\r
+  NewLoadContext->FilePathListLength = (UINT16)GetDevicePathSize (LoadOption.FilePath);\r
 \r
   NewLoadContext->Description = AllocateZeroPool (StrSize (DescriptionData));\r
   ASSERT (NewLoadContext->Description != NULL);\r
   NewMenuEntry->DisplayString = NewLoadContext->Description;\r
   CopyMem (\r
     NewLoadContext->Description,\r
-    (VOID *) Ptr,\r
+    LoadOption.Description,\r
     StrSize (DescriptionData)\r
     );\r
 \r
-  Ptr += StrSize (DescriptionData);\r
-  CopyMem (\r
-    Ptr,\r
-    CallbackData->LoadContext->FilePathList,\r
-    GetDevicePathSize (CallbackData->LoadContext->FilePathList)\r
-    );\r
-\r
   NewLoadContext->FilePathList = AllocateZeroPool (GetDevicePathSize (CallbackData->LoadContext->FilePathList));\r
   ASSERT (NewLoadContext->FilePathList != NULL);\r
-\r
   CopyMem (\r
     NewLoadContext->FilePathList,\r
-    (VOID *) Ptr,\r
+    LoadOption.FilePath,\r
     GetDevicePathSize (CallbackData->LoadContext->FilePathList)\r
     );\r
 \r
@@ -632,50 +613,19 @@ Var_UpdateDriverOption (
   NewMenuEntry->HelpStringToken = HiiSetString (HiiHandle, 0, NewMenuEntry->HelpString, NULL);\r
 \r
   if (OptionalDataExist) {\r
-    Ptr += (UINT8) GetDevicePathSize (CallbackData->LoadContext->FilePathList);\r
-\r
+    NewLoadContext->OptionalData = AllocateZeroPool (LoadOption.OptionalDataSize);\r
     CopyMem (\r
-      Ptr,\r
-      OptionalData,\r
-      StrSize (OptionalData)\r
+      NewLoadContext->OptionalData,\r
+      LoadOption.OptionalData,\r
+      LoadOption.OptionalDataSize\r
       );\r
   }\r
 \r
-  Status = gRT->SetVariable (\r
-                  DriverString,\r
-                  &gEfiGlobalVariableGuid,\r
-                  VAR_FLAG,\r
-                  BufferSize,\r
-                  Buffer\r
-                  );\r
-  ASSERT_EFI_ERROR (Status);\r
-  GetEfiGlobalVariable2 (L"DriverOrder", (VOID **) &DriverOrderList, &DriverOrderListSize);\r
-  NewDriverOrderList = AllocateZeroPool (DriverOrderListSize + sizeof (UINT16));\r
-  ASSERT (NewDriverOrderList != NULL);\r
-  if (DriverOrderList != NULL){\r
-    CopyMem (NewDriverOrderList, DriverOrderList, DriverOrderListSize);\r
-  }\r
-  NewDriverOrderList[DriverOrderListSize / sizeof (UINT16)] = Index;\r
-  if (DriverOrderList != NULL) {\r
-    EfiLibDeleteVariable (L"DriverOrder", &gEfiGlobalVariableGuid);\r
-  }\r
-\r
-  Status = gRT->SetVariable (\r
-                  L"DriverOrder",\r
-                  &gEfiGlobalVariableGuid,\r
-                  VAR_FLAG,\r
-                  DriverOrderListSize + sizeof (UINT16),\r
-                  NewDriverOrderList\r
-                  );\r
-  ASSERT_EFI_ERROR (Status);\r
-  if (DriverOrderList != NULL) {\r
-    FreePool (DriverOrderList);\r
-  }\r
-  DriverOrderList = NULL;\r
-  FreePool (NewDriverOrderList);\r
   InsertTailList (&DriverOptionMenu.Head, &NewMenuEntry->Link);\r
   DriverOptionMenu.MenuNumber++;\r
 \r
+  EfiBootManagerFreeLoadOption(&LoadOption);\r
+\r
   return EFI_SUCCESS;\r
 }\r
 \r
@@ -696,22 +646,21 @@ Var_UpdateBootOption (
   IN  BMM_CALLBACK_DATA              *CallbackData\r
   )\r
 {\r
-  UINT16          *BootOrderList;\r
-  UINT16          *NewBootOrderList;\r
-  UINTN           BootOrderListSize;\r
   UINT16          BootString[10];\r
-  VOID            *Buffer;\r
-  UINTN           BufferSize;\r
-  UINT8           *Ptr;\r
   UINT16          Index;\r
   BM_MENU_ENTRY   *NewMenuEntry;\r
   BM_LOAD_CONTEXT *NewLoadContext;\r
   BOOLEAN         OptionalDataExist;\r
   EFI_STATUS      Status;\r
   BMM_FAKE_NV_DATA  *NvRamMap;\r
+  EFI_BOOT_MANAGER_LOAD_OPTION  LoadOption;\r
+  UINT8                         *OptionalData;\r
+  UINT32                        OptionalDataSize;\r
 \r
   OptionalDataExist = FALSE;\r
   NvRamMap = &CallbackData->BmmFakeNvData;\r
+  OptionalData = NULL;\r
+  OptionalDataSize = 0;\r
 \r
   Index = BOpt_GetBootOptionNumber () ;\r
   UnicodeSPrint (BootString, sizeof (BootString), L"Boot%04x", Index);\r
@@ -720,17 +669,10 @@ Var_UpdateBootOption (
     StrCpyS (NvRamMap->BootDescriptionData, sizeof (NvRamMap->BootDescriptionData) / sizeof (NvRamMap->BootDescriptionData[0]), BootString);\r
   }\r
 \r
-  BufferSize = sizeof (UINT32) + sizeof (UINT16) + StrSize (NvRamMap->BootDescriptionData);\r
-  BufferSize += GetDevicePathSize (CallbackData->LoadContext->FilePathList);\r
-\r
   if (NvRamMap->BootOptionalData[0] != 0x0000) {\r
     OptionalDataExist = TRUE;\r
-    BufferSize += StrSize (NvRamMap->BootOptionalData);\r
-  }\r
-\r
-  Buffer = AllocateZeroPool (BufferSize);\r
-  if (NULL == Buffer) {\r
-    return EFI_OUT_OF_RESOURCES;\r
+    OptionalData = (UINT8 *)NvRamMap->BootOptionalData;\r
+    OptionalDataSize = (UINT32)StrSize (NvRamMap->BootOptionalData);\r
   }\r
 \r
   NewMenuEntry = BOpt_CreateMenuEntry (BM_LOAD_CONTEXT_SELECT);\r
@@ -738,50 +680,41 @@ Var_UpdateBootOption (
     return EFI_OUT_OF_RESOURCES;\r
   }\r
 \r
+  Status = EfiBootManagerInitializeLoadOption (\r
+             &LoadOption,\r
+             Index,\r
+             LoadOptionTypeBoot,\r
+             LOAD_OPTION_ACTIVE,\r
+             NvRamMap->BootDescriptionData,\r
+             CallbackData->LoadContext->FilePathList,\r
+             OptionalData,\r
+             OptionalDataSize\r
+           );\r
+  if (!EFI_ERROR (Status)){\r
+    Status = EfiBootManagerAddLoadOptionVariable (&LoadOption,(UINTN) -1 );\r
+  }\r
+\r
   NewLoadContext                  = (BM_LOAD_CONTEXT *) NewMenuEntry->VariableContext;\r
   NewLoadContext->Deleted         = FALSE;\r
-  NewLoadContext->LoadOptionSize  = BufferSize;\r
-  Ptr = (UINT8 *) Buffer;\r
-  NewLoadContext->LoadOption = Ptr;\r
-  *((UINT32 *) Ptr) = LOAD_OPTION_ACTIVE;\r
-  NewLoadContext->Attributes = *((UINT32 *) Ptr);\r
-  NewLoadContext->IsActive = TRUE;\r
-  NewLoadContext->ForceReconnect = (BOOLEAN) (NewLoadContext->Attributes & LOAD_OPTION_FORCE_RECONNECT);\r
-\r
-  Ptr += sizeof (UINT32);\r
-  *((UINT16 *) Ptr) = (UINT16) GetDevicePathSize (CallbackData->LoadContext->FilePathList);\r
-  NewLoadContext->FilePathListLength = *((UINT16 *) Ptr);\r
-  Ptr += sizeof (UINT16);\r
-\r
-  CopyMem (\r
-    Ptr,\r
-    NvRamMap->BootDescriptionData,\r
-    StrSize (NvRamMap->BootDescriptionData)\r
-    );\r
+  NewLoadContext->Attributes = LoadOption.Attributes;\r
+  NewLoadContext->FilePathListLength = (UINT16) GetDevicePathSize (LoadOption.FilePath);\r
 \r
   NewLoadContext->Description = AllocateZeroPool (StrSize (NvRamMap->BootDescriptionData));\r
   ASSERT (NewLoadContext->Description != NULL);\r
 \r
   NewMenuEntry->DisplayString = NewLoadContext->Description;\r
+\r
   CopyMem (\r
     NewLoadContext->Description,\r
-    (VOID *) Ptr,\r
+    LoadOption.Description,\r
     StrSize (NvRamMap->BootDescriptionData)\r
     );\r
 \r
-  Ptr += StrSize (NvRamMap->BootDescriptionData);\r
-  CopyMem (\r
-    Ptr,\r
-    CallbackData->LoadContext->FilePathList,\r
-    GetDevicePathSize (CallbackData->LoadContext->FilePathList)\r
-    );\r
-\r
   NewLoadContext->FilePathList = AllocateZeroPool (GetDevicePathSize (CallbackData->LoadContext->FilePathList));\r
   ASSERT (NewLoadContext->FilePathList != NULL);\r
-\r
   CopyMem (\r
     NewLoadContext->FilePathList,\r
-    (VOID *) Ptr,\r
+    LoadOption.FilePath,\r
     GetDevicePathSize (CallbackData->LoadContext->FilePathList)\r
     );\r
 \r
@@ -791,46 +724,19 @@ Var_UpdateBootOption (
   NewMenuEntry->HelpStringToken = HiiSetString (CallbackData->BmmHiiHandle, 0, NewMenuEntry->HelpString, NULL);\r
 \r
   if (OptionalDataExist) {\r
-    Ptr += (UINT8) GetDevicePathSize (CallbackData->LoadContext->FilePathList);\r
-\r
-    CopyMem (Ptr, NvRamMap->BootOptionalData, StrSize (NvRamMap->BootOptionalData));\r
-  }\r
-\r
-  Status = gRT->SetVariable (\r
-                  BootString,\r
-                  &gEfiGlobalVariableGuid,\r
-                  VAR_FLAG,\r
-                  BufferSize,\r
-                  Buffer\r
-                  );\r
-  ASSERT_EFI_ERROR (Status);\r
-\r
-  GetEfiGlobalVariable2 (L"BootOrder", (VOID **) &BootOrderList, &BootOrderListSize);\r
-  NewBootOrderList = AllocateZeroPool (BootOrderListSize + sizeof (UINT16));\r
-  ASSERT (NewBootOrderList != NULL);\r
-  if (BootOrderList != NULL){\r
-    CopyMem (NewBootOrderList, BootOrderList, BootOrderListSize);\r
-  }\r
-  NewBootOrderList[BootOrderListSize / sizeof (UINT16)] = Index;\r
-\r
-  if (BootOrderList != NULL) {\r
-    FreePool (BootOrderList);\r
+    NewLoadContext->OptionalData = AllocateZeroPool (LoadOption.OptionalDataSize);\r
+    CopyMem (\r
+      NewLoadContext->OptionalData,\r
+      LoadOption.OptionalData,\r
+      LoadOption.OptionalDataSize\r
+      );\r
   }\r
 \r
-  Status = gRT->SetVariable (\r
-                  L"BootOrder",\r
-                  &gEfiGlobalVariableGuid,\r
-                  VAR_FLAG,\r
-                  BootOrderListSize + sizeof (UINT16),\r
-                  NewBootOrderList\r
-                  );\r
-  ASSERT_EFI_ERROR (Status);\r
-\r
-  FreePool (NewBootOrderList);\r
-  NewBootOrderList = NULL;\r
   InsertTailList (&BootOptionMenu.Head, &NewMenuEntry->Link);\r
   BootOptionMenu.MenuNumber++;\r
 \r
+  EfiBootManagerFreeLoadOption(&LoadOption);\r
+\r
   return EFI_SUCCESS;\r
 }\r
 \r