Revision: 14625
          http://sourceforge.net/p/edk2/code/14625
Author:   ydong10
Date:     2013-09-04 04:15:10 +0000 (Wed, 04 Sep 2013)
Log Message:
-----------
Enable warningif opcode in browser.

Signed-off-by: Eric Dong <[email protected]>
Reviewed-by: Liming Gao <[email protected]>

Modified Paths:
--------------
    trunk/edk2/MdeModulePkg/Universal/DisplayEngineDxe/ProcessOptions.c
    trunk/edk2/MdeModulePkg/Universal/SetupBrowserDxe/IfrParse.c
    trunk/edk2/MdeModulePkg/Universal/SetupBrowserDxe/Presentation.c
    trunk/edk2/MdeModulePkg/Universal/SetupBrowserDxe/Setup.h

Modified: trunk/edk2/MdeModulePkg/Universal/DisplayEngineDxe/ProcessOptions.c
===================================================================
--- trunk/edk2/MdeModulePkg/Universal/DisplayEngineDxe/ProcessOptions.c 
2013-09-04 04:13:48 UTC (rev 14624)
+++ trunk/edk2/MdeModulePkg/Universal/DisplayEngineDxe/ProcessOptions.c 
2013-09-04 04:15:10 UTC (rev 14625)
@@ -15,6 +15,14 @@
 
 #include "FormDisplay.h"
 
+typedef struct {
+  EFI_EVENT   SyncEvent;
+  UINT8       *TimeOut;
+  CHAR16      *ErrorInfo;
+} WARNING_IF_CONTEXT;
+
+#define MAX_TIME_OUT_LEN  0x10
+
 /**
   Concatenate a narrow string to another string.
 
@@ -561,6 +569,136 @@
 }
 
 /**
+  Process nothing.
+
+  @param Event    The Event need to be process
+  @param Context  The context of the event.
+
+**/
+VOID
+EFIAPI
+EmptyEventProcess (
+  IN  EFI_EVENT    Event,
+  IN  VOID         *Context
+  )
+{
+}
+
+/**
+  Process for the refresh interval statement.
+
+  @param Event    The Event need to be process
+  @param Context  The context of the event.
+
+**/
+VOID
+EFIAPI
+RefreshTimeOutProcess (
+  IN  EFI_EVENT    Event,
+  IN  VOID         *Context
+  )
+{
+  WARNING_IF_CONTEXT     *EventInfo;
+  CHAR16                 TimeOutString[MAX_TIME_OUT_LEN];
+
+  EventInfo   = (WARNING_IF_CONTEXT *) Context;
+
+  if (*(EventInfo->TimeOut) == 0) {
+    gBS->CloseEvent (Event);
+
+    gBS->SignalEvent (EventInfo->SyncEvent);
+    return;
+  }
+
+  UnicodeSPrint(TimeOutString, MAX_TIME_OUT_LEN, L"%d", *(EventInfo->TimeOut));
+
+  CreateDialog (NULL, gEmptyString, EventInfo->ErrorInfo, gPressEnter, 
gEmptyString, TimeOutString, NULL);
+
+  *(EventInfo->TimeOut) -= 1;
+}
+
+/**
+  Show the warning message.
+
+  @param   RetInfo    The input warning string and timeout info.
+
+**/
+VOID
+WarningIfCheck (
+  IN STATEMENT_ERROR_INFO  *RetInfo
+  )
+{
+  CHAR16             *ErrorInfo;
+  EFI_EVENT          WaitList[2];
+  EFI_EVENT          RefreshIntervalEvent;
+  EFI_EVENT          TimeOutEvent;
+  UINT8              TimeOut;
+  EFI_STATUS         Status;
+  UINTN              Index;
+  WARNING_IF_CONTEXT EventContext;
+  EFI_INPUT_KEY      Key;
+
+  TimeOutEvent         = NULL;
+  RefreshIntervalEvent = NULL;
+
+  ASSERT (RetInfo->StringId != 0);
+  ErrorInfo = GetToken (RetInfo->StringId, gFormData->HiiHandle);
+  TimeOut   = RetInfo->TimeOut;
+  if (RetInfo->TimeOut == 0) {
+    do {
+      CreateDialog (&Key, gEmptyString, ErrorInfo, gPressEnter, gEmptyString, 
NULL);
+    } while (Key.UnicodeChar != CHAR_CARRIAGE_RETURN);
+  } else {
+    Status = gBS->CreateEvent (EVT_NOTIFY_WAIT, TPL_CALLBACK, 
EmptyEventProcess, NULL, &TimeOutEvent);
+    ASSERT_EFI_ERROR (Status);
+
+    EventContext.SyncEvent = TimeOutEvent;
+    EventContext.TimeOut   = &TimeOut;
+    EventContext.ErrorInfo = ErrorInfo;
+
+    Status = gBS->CreateEvent (EVT_TIMER | EVT_NOTIFY_SIGNAL, TPL_CALLBACK, 
RefreshTimeOutProcess, &EventContext, &RefreshIntervalEvent);
+    ASSERT_EFI_ERROR (Status);
+
+    //
+    // Show the dialog first to avoid long time not reaction.
+    //
+    gBS->SignalEvent (RefreshIntervalEvent);
+
+    Status = gBS->SetTimer (RefreshIntervalEvent, TimerPeriodic, ONE_SECOND);
+    ASSERT_EFI_ERROR (Status);
+
+    while (TRUE) {
+      Status = gST->ConIn->ReadKeyStroke (gST->ConIn, &Key);
+      if (!EFI_ERROR (Status) && Key.UnicodeChar == CHAR_CARRIAGE_RETURN) {
+        break;
+      }
+
+      if (Status != EFI_NOT_READY) {
+        continue;
+      }
+
+      WaitList[0] = TimeOutEvent;
+      WaitList[1] = gST->ConIn->WaitForKey;
+
+      Status = gBS->WaitForEvent (2, WaitList, &Index);
+      ASSERT_EFI_ERROR (Status);
+
+      if (Index == 0) {
+        //
+        // Timeout occur, close the hoot time out event.
+        //
+        break;
+      }
+    }
+  }
+
+  gBS->CloseEvent (TimeOutEvent);
+  gBS->CloseEvent (RefreshIntervalEvent);
+
+  FreePool (ErrorInfo);
+}
+
+/**
   Process validate for one question.
 
   @param  Question               The question need to be validate.
@@ -600,8 +738,15 @@
     FreePool (ErrorInfo);
 
     Status = EFI_INVALID_PARAMETER;
-  break;
+    break;
 
+  case WARNING_IF_TRUE:
+    //
+    // Condition meet, show up warning message
+    //
+    WarningIfCheck (&RetInfo);
+    break;
+
   default:
     break;
   }

Modified: trunk/edk2/MdeModulePkg/Universal/SetupBrowserDxe/IfrParse.c
===================================================================
--- trunk/edk2/MdeModulePkg/Universal/SetupBrowserDxe/IfrParse.c        
2013-09-04 04:13:48 UTC (rev 14624)
+++ trunk/edk2/MdeModulePkg/Universal/SetupBrowserDxe/IfrParse.c        
2013-09-04 04:15:10 UTC (rev 14625)
@@ -54,6 +54,7 @@
   InitializeListHead (&Statement->OptionListHead);
   InitializeListHead (&Statement->InconsistentListHead);
   InitializeListHead (&Statement->NoSubmitListHead);
+  InitializeListHead (&Statement->WarningListHead);
 
   Statement->Signature = FORM_BROWSER_STATEMENT_SIGNATURE;
 
@@ -816,6 +817,17 @@
     DestroyExpression (Expression);
   }
 
+  //
+  // Free WarningIf List
+  //
+  while (!IsListEmpty (&Statement->WarningListHead)) {
+    Link = GetFirstNode (&Statement->WarningListHead);
+    Expression = FORM_EXPRESSION_FROM_LINK (Link);
+    RemoveEntryList (&Expression->Link);
+
+    DestroyExpression (Expression);
+  }
+
   if (Statement->Expression != NULL) {
     FreePool (Statement->Expression);
   }
@@ -2020,6 +2032,25 @@
       }
       break;
 
+    case EFI_IFR_WARNING_IF_OP:
+      //
+      // Create an Expression node
+      //
+      CurrentExpression = CreateExpression (CurrentForm);
+      CopyMem (&CurrentExpression->Error, &((EFI_IFR_WARNING_IF *) 
OpCodeData)->Warning, sizeof (EFI_STRING_ID));
+      CurrentExpression->TimeOut = ((EFI_IFR_WARNING_IF *) 
OpCodeData)->TimeOut;
+      CurrentExpression->Type    = EFI_HII_EXPRESSION_WARNING_IF;
+      InsertTailList (&CurrentStatement->WarningListHead, 
&CurrentExpression->Link);
+
+      //
+      // Take a look at next OpCode to see whether current expression consists
+      // of single OpCode
+      //
+      if (((EFI_IFR_OP_HEADER *) (OpCodeData + OpCodeLength))->Scope == 0) {
+        SingleOpCodeExpression = TRUE;
+      }
+      break;
+
     case EFI_IFR_SUPPRESS_IF_OP:
       //
       // Question and Option will appear in scope of this OpCode
@@ -2327,6 +2358,7 @@
 
       case EFI_IFR_NO_SUBMIT_IF_OP:
       case EFI_IFR_INCONSISTENT_IF_OP:
+      case EFI_IFR_WARNING_IF_OP:
         //
         // Ignore end of EFI_IFR_NO_SUBMIT_IF and EFI_IFR_INCONSISTENT_IF
         //

Modified: trunk/edk2/MdeModulePkg/Universal/SetupBrowserDxe/Presentation.c
===================================================================
--- trunk/edk2/MdeModulePkg/Universal/SetupBrowserDxe/Presentation.c    
2013-09-04 04:13:48 UTC (rev 14624)
+++ trunk/edk2/MdeModulePkg/Universal/SetupBrowserDxe/Presentation.c    
2013-09-04 04:15:10 UTC (rev 14625)
@@ -52,6 +52,7 @@
 
     if (Expression->Type == EFI_HII_EXPRESSION_INCONSISTENT_IF ||
         Expression->Type == EFI_HII_EXPRESSION_NO_SUBMIT_IF ||
+        Expression->Type == EFI_HII_EXPRESSION_WARNING_IF ||
         Expression->Type == EFI_HII_EXPRESSION_WRITE ||
         (Expression->Type == EFI_HII_EXPRESSION_READ && Form->FormType != 
STANDARD_MAP_FORM_TYPE)) {
       //
@@ -228,13 +229,15 @@
   Perform value check for a question.
   
   @param  Question       The question need to do check.
+  @param  Type           Condition type need to check.
   @param  ErrorInfo      Return info about the error.
   
   @retval  The check result.
 **/
 UINT32
-InConsistentIfCheck (
+ConditionCheck (
   IN  FORM_BROWSER_STATEMENT        *Question,
+  IN  UINT8                         Type,
   OUT STATEMENT_ERROR_INFO          *ErrorInfo
   )
 {
@@ -245,8 +248,23 @@
   UINT32                  RetVal;
 
   RetVal     = STATEMENT_VALID;
-  ListHead   = &Question->InconsistentListHead;
+  ListHead   = NULL;
 
+  switch (Type) {
+  case EFI_HII_EXPRESSION_INCONSISTENT_IF:
+    ListHead = &Question->InconsistentListHead;
+    break;
+
+  case EFI_HII_EXPRESSION_WARNING_IF:
+    ListHead = &Question->WarningListHead;
+    break;
+
+  default:
+    ASSERT (FALSE);
+    return RetVal;
+  }
+
+  ASSERT (ListHead != NULL);
   Link = GetFirstNode (ListHead);
   while (!IsNull (ListHead, Link)) {
     Expression = FORM_EXPRESSION_FROM_LINK (Link);
@@ -262,8 +280,21 @@
 
     if ((Expression->Result.Type == EFI_IFR_TYPE_BOOLEAN) && 
Expression->Result.Value.b) {
       ErrorInfo->StringId = Expression->Error;
-      ErrorInfo->TimeOut  = 0;
-      RetVal              = INCOSISTENT_IF_TRUE;
+      switch (Type) {
+      case EFI_HII_EXPRESSION_INCONSISTENT_IF:
+        ErrorInfo->TimeOut  = 0;
+        RetVal              = INCOSISTENT_IF_TRUE;
+        break;
+
+      case EFI_HII_EXPRESSION_WARNING_IF:
+        ErrorInfo->TimeOut  = Expression->TimeOut;
+        RetVal              = WARNING_IF_TRUE;
+        break;
+
+      default:
+        ASSERT (FALSE);
+        break;
+      }
       break;
     }
   }
@@ -324,10 +355,17 @@
   // Do the inconsistentif check.
   //
   if (!IsListEmpty (&Question->InconsistentListHead)) {
-    RetVal = InConsistentIfCheck(Question, ErrorInfo);
+    RetVal = ConditionCheck(Question, EFI_HII_EXPRESSION_INCONSISTENT_IF, 
ErrorInfo);
   }
 
   //
+  // Do the warningif check.
+  //
+  if (RetVal == STATEMENT_VALID && !IsListEmpty (&Question->WarningListHead)) {
+    RetVal = ConditionCheck(Question, EFI_HII_EXPRESSION_WARNING_IF, 
ErrorInfo);
+  }
+
+  //
   // Restore the quesion value.
   //
   switch (Question->Operand) {
@@ -456,7 +494,7 @@
   //
   // Save the validate check question for later use.
   //
-  if (!IsListEmpty (&Statement->InconsistentListHead)) {
+  if (!IsListEmpty (&Statement->InconsistentListHead) || !IsListEmpty 
(&Statement->WarningListHead)) {
     DisplayStatement->ValidateQuestion = QuestionCheck;
   }
 

Modified: trunk/edk2/MdeModulePkg/Universal/SetupBrowserDxe/Setup.h
===================================================================
--- trunk/edk2/MdeModulePkg/Universal/SetupBrowserDxe/Setup.h   2013-09-04 
04:13:48 UTC (rev 14624)
+++ trunk/edk2/MdeModulePkg/Universal/SetupBrowserDxe/Setup.h   2013-09-04 
04:15:10 UTC (rev 14625)
@@ -106,6 +106,7 @@
 #define EFI_HII_EXPRESSION_RULE              6
 #define EFI_HII_EXPRESSION_READ              7
 #define EFI_HII_EXPRESSION_WRITE             8
+#define EFI_HII_EXPRESSION_WARNING_IF        9
 
 #define EFI_HII_VARSTORE_BUFFER              0
 #define EFI_HII_VARSTORE_NAME_VALUE          1
@@ -224,6 +225,8 @@
 
   EFI_HII_VALUE     Result;          // Expression evaluation result
 
+  UINT8             TimeOut;         // For EFI_IFR_WARNING_IF
+
   LIST_ENTRY        OpCodeListHead;  // OpCodes consist of this expression 
(EXPRESSION_OPCODE)
 } FORM_EXPRESSION;
 
@@ -351,6 +354,7 @@
 
   LIST_ENTRY            InconsistentListHead;// nested inconsistent expression 
list (FORM_EXPRESSION)
   LIST_ENTRY            NoSubmitListHead;    // nested nosubmit expression 
list (FORM_EXPRESSION)
+  LIST_ENTRY            WarningListHead;     // nested warning expression list 
(FORM_EXPRESSION)
   FORM_EXPRESSION_LIST  *Expression;         // nesting inside of 
GrayOutIf/DisableIf/SuppressIf
 
   FORM_EXPRESSION       *ReadExpression;     // nested EFI_IFR_READ, provide 
this question value by read expression.

This was sent by the SourceForge.net collaborative development platform, the 
world's largest Open Source development site.


------------------------------------------------------------------------------
Learn the latest--Visual Studio 2012, SharePoint 2013, SQL 2012, more!
Discover the easy way to master current and previous Microsoft technologies
and advance your career. Get an incredible 1,500+ hours of step-by-step
tutorial videos with LearnDevNow. Subscribe today and save!
http://pubads.g.doubleclick.net/gampad/clk?id=58040911&iu=/4140/ostg.clktrk
_______________________________________________
edk2-commits mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/edk2-commits

Reply via email to