2 Main file for time, timezone, and date shell level 2 and shell level 3 functions.
4 Copyright (c) 2009 - 2011, Intel Corporation. All rights reserved.<BR>
5 This program and the accompanying materials
6 are licensed and made available under the terms and conditions of the BSD License
7 which accompanies this distribution. The full text of the license may be found at
8 http://opensource.org/licenses/bsd-license.php
10 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
11 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
15 #include "UefiShellLevel2CommandsLib.h"
18 Determine if String is a valid representation for a time or date.
20 @param[in] String The pointer to the string to test.
21 @param[in] Char The delimeter character.
22 @param[in] Min The minimum value allowed.
23 @param[in] Max The maximum value allowed.
24 @param[in] MinusOk Whether negative numbers are permitted.
26 @retval TRUE String is a valid representation.
27 @retval FALSE String is invalid.
31 InternalIsTimeLikeString (
32 IN CONST CHAR16
*String
,
36 IN CONST BOOLEAN MinusOk
44 // A single minus is ok.
46 if (*String
== L
'-') {
52 // the first char must be numeric.
54 if (!ShellIsDecimalDigitCharacter(*String
)) {
58 // loop through the characters and use the lib function
60 for ( ; String
!= NULL
&& *String
!= CHAR_NULL
; String
++){
61 if (*String
== Char
) {
68 if (!ShellIsDecimalDigitCharacter(*String
)) {
79 Verify that the DateString is valid and if so set that as the current
82 @param[in] DateString The pointer to a string representation of the date.
84 @retval SHELL_INVALID_PARAMETER DateString was NULL.
85 @retval SHELL_INVALID_PARAMETER DateString was mis-formatted.
86 @retval SHELL_SUCCESS The operation was successful.
91 IN CONST CHAR16
*DateString
96 CHAR16
*DateStringCopy
;
100 if (!InternalIsTimeLikeString(DateString
, L
'/', 2, 2, FALSE
)) {
101 return (SHELL_INVALID_PARAMETER
);
104 Status
= gRT
->GetTime(&TheTime
, NULL
);
105 ASSERT_EFI_ERROR(Status
);
107 DateStringCopy
= NULL
;
108 DateStringCopy
= StrnCatGrow(&DateStringCopy
, NULL
, DateString
, 0);
109 if (DateStringCopy
== NULL
) {
110 return (SHELL_OUT_OF_RESOURCES
);
112 Walker
= DateStringCopy
;
114 TheTime
.Month
= 0xFF;
116 TheTime
.Year
= 0xFFFF;
118 Walker1
= StrStr(Walker
, L
"/");
119 if (Walker1
!= NULL
&& *Walker1
== L
'/') {
120 *Walker1
= CHAR_NULL
;
123 TheTime
.Month
= (UINT8
)ShellStrToUintn (Walker
);
124 if (Walker1
!= NULL
) {
125 Walker
= Walker1
+ 1;
127 Walker1
= Walker
!=NULL
?StrStr(Walker
, L
"/"):NULL
;
128 if (Walker1
!= NULL
&& *Walker1
== L
'/') {
129 *Walker1
= CHAR_NULL
;
131 if (Walker
!= NULL
&& Walker
[0] != CHAR_NULL
) {
132 TheTime
.Day
= (UINT8
)ShellStrToUintn (Walker
);
133 if (Walker1
!= NULL
) {
134 Walker
= Walker1
+ 1;
136 Walker1
= Walker
!=NULL
?StrStr(Walker
, L
"/"):NULL
;
137 if (Walker1
!= NULL
&& *Walker1
== L
'/') {
138 *Walker1
= CHAR_NULL
;
140 if (Walker
!= NULL
&& Walker
[0] != CHAR_NULL
) {
141 TheTime
.Year
= (UINT16
)ShellStrToUintn (Walker
);
145 if (TheTime
.Year
< 100) {
146 if (TheTime
.Year
>= 98) {
147 TheTime
.Year
= (UINT16
)(1900 + TheTime
.Year
);
149 TheTime
.Year
= (UINT16
)(2000 + TheTime
.Year
);
153 Status
= gRT
->SetTime(&TheTime
);
155 if (!EFI_ERROR(Status
)){
156 return (SHELL_SUCCESS
);
158 return (SHELL_INVALID_PARAMETER
);
162 Function for 'date' command.
164 @param[in] ImageHandle Handle to the Image (NULL if Internal).
165 @param[in] SystemTable Pointer to the System Table (NULL if Internal).
169 ShellCommandRunDate (
170 IN EFI_HANDLE ImageHandle
,
171 IN EFI_SYSTEM_TABLE
*SystemTable
177 CHAR16
*ProblemParam
;
178 SHELL_STATUS ShellStatus
;
180 ShellStatus
= SHELL_SUCCESS
;
184 // initialize the shell lib (we must be in non-auto-init...)
186 Status
= ShellInitialize();
187 ASSERT_EFI_ERROR(Status
);
190 // parse the command line
192 Status
= ShellCommandLineParse (SfoParamList
, &Package
, &ProblemParam
, TRUE
);
193 if (EFI_ERROR(Status
)) {
194 if (Status
== EFI_VOLUME_CORRUPTED
&& ProblemParam
!= NULL
) {
195 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_GEN_PROBLEM
), gShellLevel2HiiHandle
, ProblemParam
);
196 FreePool(ProblemParam
);
197 ShellStatus
= SHELL_INVALID_PARAMETER
;
205 if (ShellCommandLineGetFlag(Package
, L
"-?")) {
207 } else if (ShellCommandLineGetRawValue(Package
, 2) != NULL
) {
208 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_GEN_TOO_MANY
), gShellLevel2HiiHandle
);
209 ShellStatus
= SHELL_INVALID_PARAMETER
;
212 // If there are 0 value parameters, then print the current date
213 // else If there are any value paramerers, then print error
215 if (ShellCommandLineGetRawValue(Package
, 1) == NULL
) {
217 // get the current date
219 Status
= gRT
->GetTime(&TheTime
, NULL
);
220 ASSERT_EFI_ERROR(Status
);
223 // ShellPrintEx the date in SFO or regular format
225 if (ShellCommandLineGetFlag(Package
, L
"-sfo")) {
226 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_DATE_SFO_FORMAT
), gShellLevel2HiiHandle
, TheTime
.Month
, TheTime
.Day
, TheTime
.Year
);
228 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_DATE_FORMAT
), gShellLevel2HiiHandle
, TheTime
.Month
, TheTime
.Day
, TheTime
.Year
);
231 if (PcdGet8(PcdShellSupportLevel
) == 2) {
232 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_GEN_TOO_MANY
), gShellLevel2HiiHandle
);
233 ShellStatus
= SHELL_INVALID_PARAMETER
;
236 // perform level 3 operation here.
238 ShellStatus
= CheckAndSetDate(ShellCommandLineGetRawValue(Package
, 1));
239 if (ShellStatus
!= SHELL_SUCCESS
) {
240 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_GEN_PROBLEM
), gShellLevel2HiiHandle
, ShellCommandLineGetRawValue(Package
, 1));
241 ShellStatus
= SHELL_INVALID_PARAMETER
;
248 // free the command line package
250 ShellCommandLineFreeVarList (Package
);
255 return (ShellStatus
);
259 // Note "-tz" is invalid for this (non-interactive) version of 'time'.
261 STATIC CONST SHELL_PARAM_ITEM TimeParamList2
[] = {
266 STATIC CONST SHELL_PARAM_ITEM TimeParamList3
[] = {
273 Verify that the TimeString is valid and if so set that as the current
276 @param[in] TimeString The pointer to a string representation of the time.
277 @param[in] Tz The value to set for TimeZone.
278 @param[in] Daylight The value to set for Daylight.
280 @retval SHELL_INVALID_PARAMETER TimeString was NULL.
281 @retval SHELL_INVALID_PARAMETER TimeString was mis-formatted.
282 @retval SHELL_SUCCESS The operation was successful.
287 IN CONST CHAR16
*TimeString
,
289 IN CONST UINT8 Daylight
294 CHAR16
*TimeStringCopy
;
298 if (TimeString
!= NULL
&& !InternalIsTimeLikeString(TimeString
, L
':', 1, 2, FALSE
)) {
299 return (SHELL_INVALID_PARAMETER
);
301 if (Daylight
!= 0xFF &&((Daylight
& (EFI_TIME_IN_DAYLIGHT
|EFI_TIME_ADJUST_DAYLIGHT
)) != Daylight
)) {
302 return (SHELL_INVALID_PARAMETER
);
305 Status
= gRT
->GetTime(&TheTime
, NULL
);
306 ASSERT_EFI_ERROR(Status
);
308 if (TimeString
!= NULL
) {
309 TimeStringCopy
= NULL
;
310 TimeStringCopy
= StrnCatGrow(&TimeStringCopy
, NULL
, TimeString
, 0);
311 Walker1
= TimeStringCopy
;
313 TheTime
.Minute
= 0xFF;
315 Walker2
= Walker1
!=NULL
?StrStr(Walker1
, L
":"):NULL
;
316 if (Walker2
!= NULL
&& *Walker2
== L
':') {
317 *Walker2
= CHAR_NULL
;
319 TheTime
.Hour
= (UINT8
)ShellStrToUintn (Walker1
);
320 if (Walker2
!= NULL
) {
321 Walker1
= Walker2
+ 1;
323 Walker2
= Walker1
!=NULL
?StrStr(Walker1
, L
":"):NULL
;
324 if (Walker2
!= NULL
&& *Walker2
== L
':') {
325 *Walker2
= CHAR_NULL
;
327 if (Walker1
!= NULL
&& Walker1
[0] != CHAR_NULL
) {
328 TheTime
.Minute
= (UINT8
)ShellStrToUintn (Walker1
);
329 if (Walker2
!= NULL
) {
330 Walker1
= Walker2
+ 1;
332 if (Walker1
!= NULL
&& Walker1
[0] != CHAR_NULL
) {
333 TheTime
.Second
= (UINT8
)ShellStrToUintn (Walker1
);
336 SHELL_FREE_NON_NULL(TimeStringCopy
);
340 if ((Tz
>= -1440 && Tz
<= 1440)||(Tz
== 0x7FF)) {
341 TheTime
.TimeZone
= Tz
;
344 if (Daylight
!= 0xFF) {
345 TheTime
.Daylight
= Daylight
;
348 Status
= gRT
->SetTime(&TheTime
);
350 if (!EFI_ERROR(Status
)){
351 return (SHELL_SUCCESS
);
354 return (SHELL_INVALID_PARAMETER
);
358 Function for 'time' command.
360 @param[in] ImageHandle Handle to the Image (NULL if Internal).
361 @param[in] SystemTable Pointer to the System Table (NULL if Internal).
365 ShellCommandRunTime (
366 IN EFI_HANDLE ImageHandle
,
367 IN EFI_SYSTEM_TABLE
*SystemTable
374 CHAR16
*ProblemParam
;
375 SHELL_STATUS ShellStatus
;
378 CONST CHAR16
*TempLocation
;
381 ShellStatus
= SHELL_SUCCESS
;
385 // Initialize variables
390 // initialize the shell lib (we must be in non-auto-init...)
392 Status
= ShellInitialize();
393 ASSERT_EFI_ERROR(Status
);
396 // parse the command line
398 if (PcdGet8(PcdShellSupportLevel
) == 2) {
399 Status
= ShellCommandLineParseEx (TimeParamList2
, &Package
, &ProblemParam
, TRUE
, TRUE
);
401 ASSERT(PcdGet8(PcdShellSupportLevel
) == 3);
402 Status
= ShellCommandLineParseEx (TimeParamList3
, &Package
, &ProblemParam
, TRUE
, TRUE
);
404 if (EFI_ERROR(Status
)) {
405 if (Status
== EFI_VOLUME_CORRUPTED
&& ProblemParam
!= NULL
) {
406 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_GEN_PROBLEM
), gShellLevel2HiiHandle
, ProblemParam
);
407 FreePool(ProblemParam
);
408 ShellStatus
= SHELL_INVALID_PARAMETER
;
416 Status
= gRT
->GetTime(&TheTime
, NULL
);
417 ASSERT_EFI_ERROR(Status
);
418 if (ShellCommandLineGetFlag(Package
, L
"-?")) {
420 } else if (ShellCommandLineGetRawValue(Package
, 2) != NULL
) {
421 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_GEN_TOO_MANY
), gShellLevel2HiiHandle
);
422 ShellStatus
= SHELL_INVALID_PARAMETER
;
425 // If there are no parameters, then print the current time
427 if (ShellCommandLineGetRawValue(Package
, 1) == NULL
428 && !ShellCommandLineGetFlag(Package
, L
"-d")
429 && !ShellCommandLineGetFlag(Package
, L
"-tz")) {
431 // ShellPrintEx the current time
433 if (TheTime
.TimeZone
== EFI_UNSPECIFIED_TIMEZONE
) {
436 TzMinutes
= (ABS(TheTime
.TimeZone
)) % 60;
443 STRING_TOKEN (STR_TIME_FORMAT
),
444 gShellLevel2HiiHandle
,
448 TheTime
.TimeZone
==EFI_UNSPECIFIED_TIMEZONE
?L
" ":(TheTime
.TimeZone
> 0?L
"-":L
"+"),
449 TheTime
.TimeZone
==EFI_UNSPECIFIED_TIMEZONE
?0:(ABS(TheTime
.TimeZone
)) / 60,
452 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_GEN_CRLF
), gShellLevel2HiiHandle
);
453 } else if (ShellCommandLineGetFlag(Package
, L
"-d") && ShellCommandLineGetValue(Package
, L
"-d") == NULL
) {
454 if (TheTime
.TimeZone
== EFI_UNSPECIFIED_TIMEZONE
) {
457 TzMinutes
= (ABS(TheTime
.TimeZone
)) % 60;
464 STRING_TOKEN (STR_TIME_FORMAT
),
465 gShellLevel2HiiHandle
,
469 TheTime
.TimeZone
==EFI_UNSPECIFIED_TIMEZONE
?L
" ":(TheTime
.TimeZone
> 0?L
"-":L
"+"),
470 TheTime
.TimeZone
==EFI_UNSPECIFIED_TIMEZONE
?0:(ABS(TheTime
.TimeZone
)) / 60,
473 switch (TheTime
.Daylight
) {
475 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_TIME_DST0
), gShellLevel2HiiHandle
);
477 case EFI_TIME_ADJUST_DAYLIGHT
:
478 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_TIME_DST1
), gShellLevel2HiiHandle
);
480 case EFI_TIME_IN_DAYLIGHT
:
481 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_TIME_DST2
), gShellLevel2HiiHandle
);
483 case EFI_TIME_IN_DAYLIGHT
|EFI_TIME_ADJUST_DAYLIGHT
:
484 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_TIME_DST3
), gShellLevel2HiiHandle
);
487 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_GEN_UEFI_FUNC_ERROR
), gShellLevel2HiiHandle
, L
"gRT->GetTime", L
"TheTime.Daylight", TheTime
.Daylight
);
490 if (PcdGet8(PcdShellSupportLevel
) == 2) {
491 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_GEN_TOO_MANY
), gShellLevel2HiiHandle
);
492 ShellStatus
= SHELL_INVALID_PARAMETER
;
495 // perform level 3 operation here.
497 if ((TempLocation
= ShellCommandLineGetValue(Package
, L
"-tz")) != NULL
) {
498 if (TempLocation
[0] == L
'-') {
499 Tz
= (INT16
)(0 - ShellStrToUintn(++TempLocation
));
501 Tz
= (INT16
)ShellStrToUintn(TempLocation
);
503 if (!(Tz
>= -1440 && Tz
<= 1440) && Tz
!= EFI_UNSPECIFIED_TIMEZONE
) {
504 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_GEN_PROBLEM_VAL
), gShellLevel2HiiHandle
, L
"-tz");
505 ShellStatus
= SHELL_INVALID_PARAMETER
;
509 // intentionally out of bounds value will prevent changing it...
513 TempLocation
= ShellCommandLineGetValue(Package
, L
"-d");
514 if (TempLocation
!= NULL
) {
515 Daylight
= (UINT8
)ShellStrToUintn(TempLocation
);
516 if (Daylight
!= 0 && Daylight
!= 1 && Daylight
!= 3) {
517 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_GEN_PROBLEM_VAL
), gShellLevel2HiiHandle
, L
"-d");
518 ShellStatus
= SHELL_INVALID_PARAMETER
;
522 // invalid = will not use
526 if (ShellStatus
== SHELL_SUCCESS
) {
527 ShellStatus
= CheckAndSetTime(ShellCommandLineGetRawValue(Package
, 1), Tz
, Daylight
);
528 if (ShellStatus
!= SHELL_SUCCESS
) {
529 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_GEN_PROBLEM
), gShellLevel2HiiHandle
, ShellCommandLineGetRawValue(Package
, 1));
530 ShellStatus
= SHELL_INVALID_PARAMETER
;
539 // free the command line package
541 ShellCommandLineFreeVarList (Package
);
546 return (ShellStatus
);
551 EFI_STRING_ID StringId
;
554 STATIC CONST SHELL_PARAM_ITEM TimeZoneParamList2
[] = {
559 STATIC CONST SHELL_PARAM_ITEM TimeZoneParamList3
[] = {
566 STATIC CONST TIME_ZONE_ITEM TimeZoneList
[] = {
567 {720, STRING_TOKEN (STR_TIMEZONE_M12
)},
568 {660, STRING_TOKEN (STR_TIMEZONE_M11
)},
569 {600, STRING_TOKEN (STR_TIMEZONE_M10
)},
570 {540, STRING_TOKEN (STR_TIMEZONE_M9
)},
571 {480, STRING_TOKEN (STR_TIMEZONE_M8
)},
572 {420, STRING_TOKEN (STR_TIMEZONE_M7
)},
573 {360, STRING_TOKEN (STR_TIMEZONE_M6
)},
574 {300, STRING_TOKEN (STR_TIMEZONE_M5
)},
575 {270, STRING_TOKEN (STR_TIMEZONE_M430
)},
576 {240, STRING_TOKEN (STR_TIMEZONE_M4
)},
577 {210, STRING_TOKEN (STR_TIMEZONE_M330
)},
578 {180, STRING_TOKEN (STR_TIMEZONE_M3
)},
579 {120, STRING_TOKEN (STR_TIMEZONE_M2
)},
580 {60 , STRING_TOKEN (STR_TIMEZONE_M1
)},
581 {0 , STRING_TOKEN (STR_TIMEZONE_0
)},
582 {-60 , STRING_TOKEN (STR_TIMEZONE_P1
)},
583 {-120 , STRING_TOKEN (STR_TIMEZONE_P2
)},
584 {-180 , STRING_TOKEN (STR_TIMEZONE_P3
)},
585 {-210 , STRING_TOKEN (STR_TIMEZONE_P330
)},
586 {-240 , STRING_TOKEN (STR_TIMEZONE_P4
)},
587 {-270 , STRING_TOKEN (STR_TIMEZONE_P430
)},
588 {-300 , STRING_TOKEN (STR_TIMEZONE_P5
)},
589 {-330 , STRING_TOKEN (STR_TIMEZONE_P530
)},
590 {-345 , STRING_TOKEN (STR_TIMEZONE_P545
)},
591 {-360 , STRING_TOKEN (STR_TIMEZONE_P6
)},
592 {-390 , STRING_TOKEN (STR_TIMEZONE_P630
)},
593 {-420 , STRING_TOKEN (STR_TIMEZONE_P7
)},
594 {-480 , STRING_TOKEN (STR_TIMEZONE_P8
)},
595 {-540 , STRING_TOKEN (STR_TIMEZONE_P9
)},
596 {-570 , STRING_TOKEN (STR_TIMEZONE_P930
)},
597 {-600 , STRING_TOKEN (STR_TIMEZONE_P10
)},
598 {-660 , STRING_TOKEN (STR_TIMEZONE_P11
)},
599 {-720 , STRING_TOKEN (STR_TIMEZONE_P12
)},
600 {-780 , STRING_TOKEN (STR_TIMEZONE_P13
)},
601 {-840 , STRING_TOKEN (STR_TIMEZONE_P14
)}
605 Verify that the TimeZoneString is valid and if so set that as the current
608 @param[in] TimeZoneString The pointer to a string representation of the timezone.
610 @retval SHELL_INVALID_PARAMETER TimeZoneString was NULL.
611 @retval SHELL_INVALID_PARAMETER TimeZoneString was mis-formatted.
612 @retval SHELL_SUCCESS The operation was successful.
616 CheckAndSetTimeZone (
617 IN CONST CHAR16
*TimeZoneString
622 CHAR16
*TimeZoneCopy
;
627 if (TimeZoneString
== NULL
) {
628 return (SHELL_INVALID_PARAMETER
);
631 if (TimeZoneString
!= NULL
&& !InternalIsTimeLikeString(TimeZoneString
, L
':', 1, 1, TRUE
)) {
632 return (SHELL_INVALID_PARAMETER
);
635 Status
= gRT
->GetTime(&TheTime
, NULL
);
636 ASSERT_EFI_ERROR(Status
);
639 TimeZoneCopy
= StrnCatGrow(&TimeZoneCopy
, NULL
, TimeZoneString
, 0);
640 Walker
= TimeZoneCopy
;
641 Walker2
= StrStr(Walker
, L
":");
642 if (Walker2
!= NULL
&& *Walker2
== L
':') {
643 *Walker2
= CHAR_NULL
;
645 if (*Walker
== L
'-') {
646 TheTime
.TimeZone
= (INT16
)((ShellStrToUintn (++Walker
)) * 60);
648 TheTime
.TimeZone
= (INT16
)((ShellStrToUintn (Walker
)) * -60);
650 if (Walker2
!= NULL
) {
651 Walker
= Walker2
+ 1;
653 if (Walker
!= NULL
&& Walker
[0] != CHAR_NULL
) {
654 if (TheTime
.TimeZone
< 0) {
655 TheTime
.TimeZone
= (INT16
)(TheTime
.TimeZone
- (UINT8
)ShellStrToUintn (Walker
));
657 TheTime
.TimeZone
= (INT16
)(TheTime
.TimeZone
+ (UINT8
)ShellStrToUintn (Walker
));
661 Status
= EFI_INVALID_PARAMETER
;
664 ; LoopVar
< sizeof(TimeZoneList
) / sizeof(TimeZoneList
[0])
667 if (TheTime
.TimeZone
== TimeZoneList
[LoopVar
].TimeZone
) {
668 Status
= gRT
->SetTime(&TheTime
);
673 FreePool(TimeZoneCopy
);
675 if (!EFI_ERROR(Status
)){
676 return (SHELL_SUCCESS
);
678 return (SHELL_INVALID_PARAMETER
);
683 Function for 'timezone' command.
685 @param[in] ImageHandle Handle to the Image (NULL if Internal).
686 @param[in] SystemTable Pointer to the System Table (NULL if Internal).
690 ShellCommandRunTimeZone (
691 IN EFI_HANDLE ImageHandle
,
692 IN EFI_SYSTEM_TABLE
*SystemTable
700 CHAR16
*ProblemParam
;
701 SHELL_STATUS ShellStatus
;
707 ShellStatus
= SHELL_SUCCESS
;
711 // initialize the shell lib (we must be in non-auto-init...)
713 Status
= ShellInitialize();
714 ASSERT_EFI_ERROR(Status
);
717 // parse the command line
719 if (PcdGet8(PcdShellSupportLevel
) == 2) {
720 Status
= ShellCommandLineParse (TimeZoneParamList2
, &Package
, &ProblemParam
, FALSE
);
722 ASSERT(PcdGet8(PcdShellSupportLevel
) == 3);
723 Status
= ShellCommandLineParseEx (TimeZoneParamList3
, &Package
, &ProblemParam
, FALSE
, TRUE
);
725 if (EFI_ERROR(Status
)) {
726 if (Status
== EFI_VOLUME_CORRUPTED
&& ProblemParam
!= NULL
) {
727 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_GEN_PROBLEM
), gShellLevel2HiiHandle
, ProblemParam
);
728 FreePool(ProblemParam
);
729 ShellStatus
= SHELL_INVALID_PARAMETER
;
737 if (ShellCommandLineGetCount(Package
) > 1) {
738 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_GEN_TOO_MANY
), gShellLevel2HiiHandle
);
739 ShellStatus
= SHELL_INVALID_PARAMETER
;
740 } else if (ShellCommandLineGetFlag(Package
, L
"-?")) {
742 } else if (ShellCommandLineGetFlag(Package
, L
"-s")) {
743 if ((ShellCommandLineGetFlag(Package
, L
"-l")) || (ShellCommandLineGetFlag(Package
, L
"-f"))) {
744 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_GEN_PROBLEM
), gShellLevel2HiiHandle
, L
"-l or -f");
745 ShellStatus
= SHELL_INVALID_PARAMETER
;
747 ASSERT(PcdGet8(PcdShellSupportLevel
) == 3);
748 if (ShellCommandLineGetValue(Package
, L
"-s") == NULL
) {
749 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_GEN_NO_VALUE
), gShellLevel2HiiHandle
, L
"-s");
750 ShellStatus
= SHELL_INVALID_PARAMETER
;
755 ShellStatus
= CheckAndSetTimeZone(ShellCommandLineGetValue(Package
, L
"-s"));
756 if (ShellStatus
!= SHELL_SUCCESS
) {
757 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_GEN_PROBLEM
), gShellLevel2HiiHandle
, ShellCommandLineGetValue(Package
, L
"-s"));
758 ShellStatus
= SHELL_INVALID_PARAMETER
;
762 } else if (ShellCommandLineGetFlag(Package
, L
"-l")) {
764 // Print a list of all time zones
767 ; LoopVar
< sizeof(TimeZoneList
) / sizeof(TimeZoneList
[0])
770 ShellPrintHiiEx (-1, -1, NULL
, TimeZoneList
[LoopVar
].StringId
, gShellLevel2HiiHandle
);
774 // Get Current Time Zone Info
776 Status
= gRT
->GetTime(&TheTime
, NULL
);
777 ASSERT_EFI_ERROR(Status
);
779 if (TheTime
.TimeZone
!= EFI_UNSPECIFIED_TIMEZONE
) {
782 ; LoopVar
< sizeof(TimeZoneList
) / sizeof(TimeZoneList
[0])
785 if (TheTime
.TimeZone
== TimeZoneList
[LoopVar
].TimeZone
) {
786 if (ShellCommandLineGetFlag(Package
, L
"-f")) {
788 // Print all info about current time zone
790 ShellPrintHiiEx (-1, -1, NULL
, TimeZoneList
[LoopVar
].StringId
, gShellLevel2HiiHandle
);
793 // Print basic info only
795 if (TheTime
.TimeZone
== EFI_UNSPECIFIED_TIMEZONE
) {
798 TzMinutes
= (ABS(TheTime
.TimeZone
)) % 60;
805 STRING_TOKEN(STR_TIMEZONE_SIMPLE
),
806 gShellLevel2HiiHandle
,
807 TheTime
.TimeZone
==EFI_UNSPECIFIED_TIMEZONE
?0:(TheTime
.TimeZone
> 0?L
"-":L
"+"),
808 TheTime
.TimeZone
==EFI_UNSPECIFIED_TIMEZONE
?0:(ABS(TheTime
.TimeZone
)) / 60,
817 // Print basic info only
819 if (TheTime
.TimeZone
== EFI_UNSPECIFIED_TIMEZONE
) {
822 TzMinutes
= (ABS(TheTime
.TimeZone
)) % 60;
828 STRING_TOKEN(STR_TIMEZONE_SIMPLE
),
829 gShellLevel2HiiHandle
,
830 TheTime
.TimeZone
==EFI_UNSPECIFIED_TIMEZONE
?0:(TheTime
.TimeZone
> 0?L
"-":L
"+"),
831 TheTime
.TimeZone
==EFI_UNSPECIFIED_TIMEZONE
?0:(ABS(TheTime
.TimeZone
)) / 60,
833 if (ShellCommandLineGetFlag(Package
, L
"-f")) {
834 ShellPrintHiiEx (-1, -1, NULL
, STRING_TOKEN(STR_TIMEZONE_NI
), gShellLevel2HiiHandle
);
839 // TimeZone was EFI_UNSPECIFIED_TIMEZONE (unknown) from GetTime()
846 // free the command line package
848 ShellCommandLineFreeVarList (Package
);
850 return (ShellStatus
);