]> git.proxmox.com Git - mirror_edk2.git/blobdiff - MdeModulePkg/Universal/DriverSampleDxe/DriverSample.c
1. Support inconsistent if opcode used in string/password opcode.
[mirror_edk2.git] / MdeModulePkg / Universal / DriverSampleDxe / DriverSample.c
index 9a6cfc8d7db3a60722726de63d65b8fd48421991..9b664b4958c50912d98dfe3e2cd2d4f29caa0964 100644 (file)
@@ -2,8 +2,8 @@
 This is an example of how a driver might export data to the HII protocol to be\r
 later utilized by the Setup Protocol\r
 \r
-Copyright (c) 2004 - 2010, Intel Corporation\r
-All rights reserved. This program and the accompanying materials\r
+Copyright (c) 2004 - 2010, 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
 http://opensource.org/licenses/bsd-license.php\r
@@ -187,7 +187,7 @@ ValidatePassword (
   ASSERT (EncodedPassword != NULL);\r
   StrnCpy (EncodedPassword, Password, StrLen (Password));\r
   EncodePassword (EncodedPassword, StrLen (EncodedPassword) * sizeof (CHAR16));\r
-  if (CompareMem (EncodedPassword, PrivateData->Configuration.WhatIsThePassword2, StrLen (EncodedPassword) * sizeof (CHAR16)) != 0) {\r
+  if (CompareMem (EncodedPassword, PrivateData->Configuration.WhatIsThePassword2, PasswordMaxSize) != 0) {\r
     //\r
     // Old password mismatch, return EFI_NOT_READY to prompt for error message\r
     //\r
@@ -355,7 +355,7 @@ LoadNameValueNames (
 \r
   @retval EFI_SUCCESS            The Results is filled with the requested values.\r
   @retval EFI_OUT_OF_RESOURCES   Not enough memory to store the results.\r
-  @retval EFI_INVALID_PARAMETER  Request is NULL, illegal syntax, or unknown name.\r
+  @retval EFI_INVALID_PARAMETER  Request is illegal syntax, or unknown name.\r
   @retval EFI_NOT_FOUND          Routing data doesn't match any storage in this\r
                                  driver.\r
 \r
@@ -842,61 +842,67 @@ DriverCallback (
   UINTN                           MyVarSize;\r
 \r
   if (Action == EFI_BROWSER_ACTION_FORM_OPEN) {\r
-    //\r
-    // On FORM_OPEN event, update the form on-the-fly\r
-    //\r
-    PrivateData = DRIVER_SAMPLE_PRIVATE_FROM_THIS (This);\r
-\r
-    //\r
-    // Initialize the container for dynamic opcodes\r
-    //\r
-    StartOpCodeHandle = HiiAllocateOpCodeHandle ();\r
-    ASSERT (StartOpCodeHandle != NULL);\r
-\r
-    //\r
-    // Create Hii Extend Label OpCode as the start opcode\r
-    //\r
-    StartLabel = (EFI_IFR_GUID_LABEL *) HiiCreateGuidOpCode (StartOpCodeHandle, &gEfiIfrTianoGuid, NULL, sizeof (EFI_IFR_GUID_LABEL));\r
-    StartLabel->ExtendOpCode = EFI_IFR_EXTEND_OP_LABEL;\r
-    StartLabel->Number       = LABEL_UPDATE2;\r
+    if (QuestionId == 0x1234) {\r
+      //\r
+      // Sample CallBack for UEFI FORM_OPEN action:\r
+      //   Add Save action into Form 3 when Form 1 is opened.\r
+      //   This will be done only in FORM_OPEN CallBack of question with ID 0x1234 from Form 1.\r
+      //\r
+      PrivateData = DRIVER_SAMPLE_PRIVATE_FROM_THIS (This);\r
 \r
-    HiiCreateActionOpCode (\r
-      StartOpCodeHandle,                // Container for dynamic created opcodes\r
-      0x1238,                           // Question ID\r
-      STRING_TOKEN(STR_SAVE_TEXT),      // Prompt text\r
-      STRING_TOKEN(STR_SAVE_TEXT),      // Help text\r
-      EFI_IFR_FLAG_CALLBACK,            // Question flag\r
-      0                                 // Action String ID\r
-    );\r
+      //\r
+      // Initialize the container for dynamic opcodes\r
+      //\r
+      StartOpCodeHandle = HiiAllocateOpCodeHandle ();\r
+      ASSERT (StartOpCodeHandle != NULL);\r
 \r
-    HiiUpdateForm (\r
-      PrivateData->HiiHandle[0],  // HII handle\r
-      &mFormSetGuid,              // Formset GUID\r
-      0x3,                        // Form ID\r
-      StartOpCodeHandle,          // Label for where to insert opcodes\r
-      NULL                        // Insert data\r
+      //\r
+      // Create Hii Extend Label OpCode as the start opcode\r
+      //\r
+      StartLabel = (EFI_IFR_GUID_LABEL *) HiiCreateGuidOpCode (StartOpCodeHandle, &gEfiIfrTianoGuid, NULL, sizeof (EFI_IFR_GUID_LABEL));\r
+      StartLabel->ExtendOpCode = EFI_IFR_EXTEND_OP_LABEL;\r
+      StartLabel->Number       = LABEL_UPDATE2;\r
+\r
+      HiiCreateActionOpCode (\r
+        StartOpCodeHandle,                // Container for dynamic created opcodes\r
+        0x1238,                           // Question ID\r
+        STRING_TOKEN(STR_SAVE_TEXT),      // Prompt text\r
+        STRING_TOKEN(STR_SAVE_TEXT),      // Help text\r
+        EFI_IFR_FLAG_CALLBACK,            // Question flag\r
+        0                                 // Action String ID\r
       );\r
 \r
-    HiiFreeOpCodeHandle (StartOpCodeHandle);\r
+      HiiUpdateForm (\r
+        PrivateData->HiiHandle[0],  // HII handle\r
+        &mFormSetGuid,              // Formset GUID\r
+        0x3,                        // Form ID\r
+        StartOpCodeHandle,          // Label for where to insert opcodes\r
+        NULL                        // Insert data\r
+        );\r
+\r
+      HiiFreeOpCodeHandle (StartOpCodeHandle);\r
+    }\r
     return EFI_SUCCESS;\r
   }\r
 \r
   if (Action == EFI_BROWSER_ACTION_FORM_CLOSE) {\r
-    //\r
-    // On FORM_CLOSE event, show up a pop-up\r
-    //\r
-    do {\r
-      CreatePopUp (\r
-        EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE,\r
-        &Key,\r
-        L"",\r
-        L"You are going to leave the Form!",\r
-        L"Press ESC or ENTER to continue ...",\r
-        L"",\r
-        NULL\r
-        );\r
-    } while ((Key.ScanCode != SCAN_ESC) && (Key.UnicodeChar != CHAR_CARRIAGE_RETURN));\r
-\r
+    if (QuestionId == 0x5678) {\r
+      //\r
+      // Sample CallBack for UEFI FORM_CLOSE action:\r
+      //   Show up a pop-up to specify Form 3 will be closed when exit Form 3.\r
+      //\r
+      do {\r
+        CreatePopUp (\r
+          EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE,\r
+          &Key,\r
+          L"",\r
+          L"You are going to leave third Form!",\r
+          L"Press ESC or ENTER to continue ...",\r
+          L"",\r
+          NULL\r
+          );\r
+      } while ((Key.ScanCode != SCAN_ESC) && (Key.UnicodeChar != CHAR_CARRIAGE_RETURN));\r
+    }\r
     return EFI_SUCCESS;\r
   }\r
 \r
@@ -904,9 +910,6 @@ DriverCallback (
     return EFI_INVALID_PARAMETER;\r
   }\r
 \r
-  if ((Type == EFI_IFR_TYPE_STRING) && (Value->string == 0)) {\r
-    return EFI_INVALID_PARAMETER;\r
-  }\r
 \r
   Status = EFI_SUCCESS;\r
   PrivateData = DRIVER_SAMPLE_PRIVATE_FROM_THIS (This);\r
@@ -1028,6 +1031,37 @@ DriverCallback (
       NULL                                       // Default Opcode is NULl\r
       );\r
 \r
+    HiiCreateTextOpCode (\r
+      StartOpCodeHandle,\r
+      STRING_TOKEN(STR_TEXT_SAMPLE_HELP),\r
+      STRING_TOKEN(STR_TEXT_SAMPLE_HELP),\r
+      STRING_TOKEN(STR_TEXT_SAMPLE_STRING)\r
+    );\r
+\r
+    HiiCreateDateOpCode (\r
+      StartOpCodeHandle,\r
+      0x8004,\r
+      0x0,\r
+      0x0,\r
+      STRING_TOKEN(STR_DATE_SAMPLE_HELP),\r
+      STRING_TOKEN(STR_DATE_SAMPLE_HELP),\r
+      0,\r
+      QF_DATE_STORAGE_TIME,\r
+      NULL\r
+      );\r
+\r
+    HiiCreateTimeOpCode (\r
+      StartOpCodeHandle,\r
+      0x8005,\r
+      0x0,\r
+      0x0,\r
+      STRING_TOKEN(STR_TIME_SAMPLE_HELP),\r
+      STRING_TOKEN(STR_TIME_SAMPLE_HELP),\r
+      0,\r
+      QF_TIME_STORAGE_TIME,\r
+      NULL\r
+      );\r
+\r
     HiiCreateGotoOpCode (\r
       StartOpCodeHandle,                // Container for dynamic created opcodes\r
       1,                                // Target Form ID\r
@@ -1129,6 +1163,15 @@ DriverCallback (
     break;\r
 \r
   case 0x2000:\r
+    //\r
+    // Only used to update the state.\r
+    //\r
+    if ((Type == EFI_IFR_TYPE_STRING) && (Value->string == 0) && \r
+      (PrivateData->PasswordState == BROWSER_STATE_SET_PASSWORD)) {\r
+      PrivateData->PasswordState = BROWSER_STATE_VALIDATE_PASSWORD;\r
+      return EFI_INVALID_PARAMETER;\r
+    }\r
+\r
     //\r
     // When try to set a new password, user will be chanlleged with old password.\r
     // The Callback is responsible for validating old password input by user,\r
@@ -1433,6 +1476,9 @@ DriverSampleUnload (
   )\r
 {\r
   UINTN Index;\r
+\r
+  ASSERT (PrivateData != NULL);\r
+\r
   if (DriverHandle[0] != NULL) {\r
     gBS->UninstallMultipleProtocolInterfaces (\r
             DriverHandle[0],\r
@@ -1463,15 +1509,13 @@ DriverSampleUnload (
     HiiRemovePackages (PrivateData->HiiHandle[1]);\r
   }\r
 \r
-  if (PrivateData != NULL) {\r
-    for (Index = 0; Index < NAME_VALUE_NAME_NUMBER; Index++) {\r
-      if (PrivateData->NameValueName[Index] != NULL) {\r
-        FreePool (PrivateData->NameValueName[Index]);\r
-      }\r
+  for (Index = 0; Index < NAME_VALUE_NAME_NUMBER; Index++) {\r
+    if (PrivateData->NameValueName[Index] != NULL) {\r
+      FreePool (PrivateData->NameValueName[Index]);\r
     }\r
-    FreePool (PrivateData);\r
-    PrivateData = NULL;\r
   }\r
+  FreePool (PrivateData);\r
+  PrivateData = NULL;\r
 \r
   return EFI_SUCCESS;\r
 }\r