/** @file\r
\r
-Copyright (c) 2007 - 2008, Intel Corporation\r
-All rights reserved. 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
-http://opensource.org/licenses/bsd-license.php\r
-\r
-THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
-WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
-\r
-Module Name:\r
-\r
- PlatOverMngr.c\r
-\r
-Abstract:\r
-\r
A UI application to offer a UI interface in device manager to let user configue\r
platform override protocol to override the default algorithm for matching\r
drivers to controllers.\r
4. The UI application save all the mapping info in NV variables which will be consumed\r
by platform override protocol driver to publish the platform override protocol.\r
\r
+Copyright (c) 2007 - 2008, Intel Corporation\r
+All rights reserved. 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
+http://opensource.org/licenses/bsd-license.php\r
+\r
+THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
+WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+\r
**/\r
\r
#include <PiDxe.h>\r
#include <Protocol/ComponentName2.h>\r
#include <Protocol/ComponentName.h>\r
#include <Protocol/DriverBinding.h>\r
+#include <Guid/GlobalVariable.h>\r
\r
#include <Library/BaseLib.h>\r
#include <Library/DebugLib.h>\r
EFI_HANDLE *mDevicePathHandleBuffer;\r
EFI_HANDLE *mDriverImageHandleBuffer;\r
\r
-UINTN mSelectedCtrIndex;\r
+INTN mSelectedCtrIndex;\r
EFI_STRING_ID mControllerToken[MAX_CHOICE_NUM];\r
UINTN mDriverImageHandleCount;\r
EFI_STRING_ID mDriverImageToken[MAX_CHOICE_NUM];\r
IN CHAR8 *Language\r
)\r
{\r
- CHAR8 *LangCode;\r
- LangCode = NULL;\r
+ CHAR8 *LangCode;\r
+ LangCode = NULL;\r
\r
//\r
- // check the input language is English\r
+ // Check the input language is English\r
//\r
if (AsciiStrnCmp (Language, "en-", 3) != 0) {\r
return NULL;\r
}\r
-\r
- //\r
- // Convert Language string from RFC 3066 to ISO 639-2\r
- //\r
- LangCode = AllocateZeroPool(4);\r
- AsciiStrCpy (LangCode, "eng");\r
\r
//\r
- // Check whether the converted language is supported in the SupportedLanguages list.\r
+ // Check SupportedLanguages format\r
//\r
- if (AsciiStrStr (SupportedLanguages, LangCode) == NULL) {\r
- FreePool (LangCode);\r
- return NULL;\r
+ if (AsciiStrStr (SupportedLanguages, "en-") != NULL) {\r
+ //\r
+ // Create RFC 3066 language\r
+ //\r
+ LangCode = AllocateZeroPool(AsciiStrSize (Language));\r
+ AsciiStrCpy (LangCode, Language);\r
+ } else if (AsciiStrStr (SupportedLanguages, "en") != NULL) {\r
+ //\r
+ // Create ISO 639-2 Language\r
+ //\r
+ LangCode = AllocateZeroPool(4);\r
+ AsciiStrCpy (LangCode, "eng"); \r
}\r
-\r
+ \r
return LangCode;\r
}\r
\r
if (ComponentName != NULL) {\r
if (ComponentName->GetDriverName != NULL) {\r
SupportedLanguage = ConvertComponentNameSupportLanguage (ComponentName->SupportedLanguages, mLanguage);\r
- Status = ComponentName->GetDriverName (\r
- ComponentName,\r
- SupportedLanguage,\r
- &DriverName\r
- );\r
- FreePool (SupportedLanguage);\r
+ if (SupportedLanguage != NULL) {\r
+ Status = ComponentName->GetDriverName (\r
+ ComponentName,\r
+ SupportedLanguage,\r
+ &DriverName\r
+ );\r
+ FreePool (SupportedLanguage);\r
+ }\r
}\r
} else if (ComponentName2 != NULL) {\r
if (ComponentName2->GetDriverName != NULL) {\r
if (EFI_ERROR (Status) || (DriverBindingHandleCount == 0)) {\r
return NULL;\r
}\r
-\r
+ \r
+ //\r
+ // Get the first Driver Binding handle which has the specific image handle.\r
+ //\r
for (Index = 0; Index < DriverBindingHandleCount; Index++) {\r
DriverBindingInterface = NULL;\r
Status = gBS->OpenProtocol (\r
}\r
}\r
\r
- //\r
- // If no Driver Binding Protocol instance is found\r
- //\r
FreePool (DriverBindingHandleBuffer);\r
return DriverBindingHandle;\r
}\r
\r
@param Private Pointer to EFI_CALLBACK_INFO.\r
@param KeyValue The callback key value of device controller item in first page.\r
+ KeyValue is larger than or equal to KEY_VALUE_DEVICE_OFFSET.\r
@param FakeNvData Pointer to PLAT_OVER_MNGR_DATA.\r
\r
@retval EFI_SUCCESS Always returned.\r
// Switch the item callback key value to its NO. in mDevicePathHandleBuffer\r
//\r
mSelectedCtrIndex = KeyValue - KEY_VALUE_DEVICE_OFFSET;\r
- ASSERT (mSelectedCtrIndex < MAX_CHOICE_NUM);\r
+ ASSERT (mSelectedCtrIndex > 0 && mSelectedCtrIndex < MAX_CHOICE_NUM);\r
+\r
mLastSavedDriverImageNum = 0;\r
//\r
// Clear all the content in dynamic page\r
DriverName = DevicePathToStr (LoadedImageDevicePath);\r
\r
NewString = AllocateZeroPool (StrSize (DriverName));\r
+ ASSERT (NewString != NULL); \r
StrCat (NewString, DriverName);\r
NewStringHelpToken = mDriverImageFilePathToken[Index];\r
if (NewStringHelpToken == 0) {\r
ASSERT_EFI_ERROR (Status);\r
}\r
\r
- if (((KEY_VALUE_DEVICE_OFFSET <= KeyValue) && (KeyValue < KEY_VALUE_DEVICE_MAX)) || (KeyValue == KEY_VALUE_ORDER_GOTO_PREVIOUS)) {\r
+ if (((KeyValue >= KEY_VALUE_DEVICE_OFFSET) && (KeyValue < KEY_VALUE_DEVICE_MAX)) || (KeyValue == KEY_VALUE_ORDER_GOTO_PREVIOUS)) {\r
if (KeyValue == KEY_VALUE_ORDER_GOTO_PREVIOUS) {\r
KeyValue = (EFI_QUESTION_ID) (mSelectedCtrIndex + KEY_VALUE_DEVICE_OFFSET);\r
}\r
EFI_CALLBACK_INFO *CallbackInfo;\r
EFI_HANDLE DriverHandle;\r
EFI_FORM_BROWSER2_PROTOCOL *FormBrowser2;\r
-\r
+ \r
//\r
// There should only be one HII protocol\r
//\r
//\r
Status = HiiLibCreateHiiDriverHandle (&DriverHandle);\r
if (EFI_ERROR (Status)) {\r
- return Status;\r
+ goto Finish;\r
}\r
CallbackInfo->DriverHandle = DriverHandle;\r
\r
&CallbackInfo->ConfigAccess\r
);\r
if (EFI_ERROR (Status)) {\r
- return Status;\r
+ goto Finish;\r
}\r
\r
//\r
);\r
FreePool (PackageList);\r
\r
+ if (EFI_ERROR (Status)) {\r
+ goto Finish;\r
+ }\r
+\r
//\r
// Locate ConfigRouting protocol\r
//\r
(VOID **) &CallbackInfo->HiiConfigRouting\r
);\r
if (EFI_ERROR (Status)) {\r
- return Status;\r
+ goto Finish;\r
}\r
\r
//\r
NULL,\r
NULL\r
);\r
+ if (EFI_ERROR (Status)) {\r
+ goto Finish;\r
+ }\r
\r
Status = HiiDatabase->RemovePackageList (HiiDatabase, CallbackInfo->RegisteredHandle);\r
if (EFI_ERROR (Status)) {\r
- return Status;\r
+ goto Finish;\r
}\r
-\r
+ \r
return EFI_SUCCESS;\r
+\r
+Finish:\r
+ if (CallbackInfo->DriverHandle != NULL) {\r
+ HiiLibDestroyHiiDriverHandle (CallbackInfo->DriverHandle);\r
+ }\r
+ if (CallbackInfo != NULL) {\r
+ FreePool (CallbackInfo);\r
+ }\r
+\r
+ return Status;\r
}\r