]> git.proxmox.com Git - mirror_edk2.git/blame - ShellPkg/Library/UefiShellLevel2CommandsLib/TimeDate.c
ShellPkg: Fixed build error 'variable set but not used'
[mirror_edk2.git] / ShellPkg / Library / UefiShellLevel2CommandsLib / TimeDate.c
CommitLineData
a405b86d 1/** @file\r
2 Main file for time, timezone, and date shell level 2 and shell level 3 functions.\r
3\r
b54fd049 4 Copyright (c) 2009 - 2011, Intel Corporation. All rights reserved.<BR>\r
a405b86d 5 This program and the accompanying materials\r
6 are licensed and made available under the terms and conditions of the BSD License\r
7 which accompanies this distribution. The full text of the license may be found at\r
8 http://opensource.org/licenses/bsd-license.php\r
9\r
10 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
11 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
12\r
13**/\r
14\r
15#include "UefiShellLevel2CommandsLib.h"\r
16\r
b54fd049 17/**\r
18 Determine if String is a valid representation for a time or date.\r
19\r
20 @param[in] String The pointer to the string to test.\r
21 @param[in] Char The delimeter character.\r
22 @param[in] Min The minimum value allowed.\r
23 @param[in] Max The maximum value allowed.\r
24 @param[in] MinusOk Whether negative numbers are permitted.\r
a405b86d 25\r
b54fd049 26 @retval TRUE String is a valid representation.\r
27 @retval FALSE String is invalid.\r
28**/\r
a405b86d 29BOOLEAN\r
30EFIAPI\r
31InternalIsTimeLikeString (\r
32 IN CONST CHAR16 *String,\r
33 IN CONST CHAR16 Char,\r
34 IN CONST UINTN Min,\r
35 IN CONST UINTN Max,\r
36 IN CONST BOOLEAN MinusOk\r
37 )\r
38{\r
39 UINTN Count;\r
40 Count = 0;\r
41\r
42 if (MinusOk) {\r
43 //\r
44 // A single minus is ok.\r
45 //\r
46 if (*String == L'-') {\r
47 String++;\r
48 }\r
49 }\r
50\r
51 //\r
52 // the first char must be numeric.\r
53 //\r
54 if (!ShellIsDecimalDigitCharacter(*String)) {\r
55 return (FALSE);\r
56 }\r
57 //\r
58 // loop through the characters and use the lib function\r
59 //\r
60 for ( ; String != NULL && *String != CHAR_NULL ; String++){\r
61 if (*String == Char) {\r
62 Count++;\r
63 if (Count > Max) {\r
64 return (FALSE);\r
65 }\r
66 continue;\r
67 }\r
68 if (!ShellIsDecimalDigitCharacter(*String)) {\r
69 return (FALSE);\r
70 }\r
71 }\r
72 if (Count < Min) {\r
73 return (FALSE);\r
74 }\r
75 return (TRUE);\r
76}\r
77\r
b54fd049 78/**\r
79 Verify that the DateString is valid and if so set that as the current \r
80 date.\r
81\r
82 @param[in] DateString The pointer to a string representation of the date.\r
83\r
84 @retval SHELL_INVALID_PARAMETER DateString was NULL.\r
85 @retval SHELL_INVALID_PARAMETER DateString was mis-formatted.\r
86 @retval SHELL_SUCCESS The operation was successful.\r
87**/\r
a405b86d 88SHELL_STATUS\r
89EFIAPI\r
90CheckAndSetDate (\r
91 IN CONST CHAR16 *DateString\r
92 )\r
93{\r
94 EFI_TIME TheTime;\r
95 EFI_STATUS Status;\r
b54fd049 96 CHAR16 *DateStringCopy;\r
97 CHAR16 *Walker;\r
98 CHAR16 *Walker1;\r
a405b86d 99\r
100 if (!InternalIsTimeLikeString(DateString, L'/', 2, 2, FALSE)) {\r
101 return (SHELL_INVALID_PARAMETER);\r
102 }\r
103\r
104 Status = gRT->GetTime(&TheTime, NULL);\r
35f26e73 105 if (EFI_ERROR(Status)) {\r
106 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_UEFI_FUNC_WARN), gShellLevel2HiiHandle, L"gRT->GetTime", Status);\r
107 return (SHELL_DEVICE_ERROR);\r
108 }\r
a405b86d 109\r
b54fd049 110 DateStringCopy = NULL;\r
111 DateStringCopy = StrnCatGrow(&DateStringCopy, NULL, DateString, 0);\r
112 if (DateStringCopy == NULL) {\r
113 return (SHELL_OUT_OF_RESOURCES);\r
114 }\r
115 Walker = DateStringCopy;\r
a405b86d 116\r
117 TheTime.Month = 0xFF;\r
118 TheTime.Day = 0xFF;\r
119 TheTime.Year = 0xFFFF;\r
120\r
b54fd049 121 Walker1 = StrStr(Walker, L"/");\r
122 if (Walker1 != NULL && *Walker1 == L'/') {\r
123 *Walker1 = CHAR_NULL;\r
124 }\r
125\r
126 TheTime.Month = (UINT8)ShellStrToUintn (Walker);\r
127 if (Walker1 != NULL) {\r
128 Walker = Walker1 + 1;\r
129 }\r
33c031ee 130 Walker1 = Walker!=NULL?StrStr(Walker, L"/"):NULL;\r
b54fd049 131 if (Walker1 != NULL && *Walker1 == L'/') {\r
132 *Walker1 = CHAR_NULL;\r
a405b86d 133 }\r
134 if (Walker != NULL && Walker[0] != CHAR_NULL) {\r
b54fd049 135 TheTime.Day = (UINT8)ShellStrToUintn (Walker);\r
136 if (Walker1 != NULL) {\r
137 Walker = Walker1 + 1;\r
138 }\r
33c031ee 139 Walker1 = Walker!=NULL?StrStr(Walker, L"/"):NULL;\r
b54fd049 140 if (Walker1 != NULL && *Walker1 == L'/') {\r
141 *Walker1 = CHAR_NULL;\r
a405b86d 142 }\r
143 if (Walker != NULL && Walker[0] != CHAR_NULL) {\r
b54fd049 144 TheTime.Year = (UINT16)ShellStrToUintn (Walker);\r
a405b86d 145 }\r
146 }\r
147\r
148 if (TheTime.Year < 100) {\r
149 if (TheTime.Year >= 98) {\r
150 TheTime.Year = (UINT16)(1900 + TheTime.Year);\r
151 } else {\r
152 TheTime.Year = (UINT16)(2000 + TheTime.Year);\r
153 }\r
154 }\r
155\r
156 Status = gRT->SetTime(&TheTime);\r
157\r
158 if (!EFI_ERROR(Status)){\r
159 return (SHELL_SUCCESS);\r
160 }\r
161 return (SHELL_INVALID_PARAMETER);\r
162}\r
163\r
164/**\r
165 Function for 'date' command.\r
166\r
167 @param[in] ImageHandle Handle to the Image (NULL if Internal).\r
168 @param[in] SystemTable Pointer to the System Table (NULL if Internal).\r
169**/\r
170SHELL_STATUS\r
171EFIAPI\r
172ShellCommandRunDate (\r
173 IN EFI_HANDLE ImageHandle,\r
174 IN EFI_SYSTEM_TABLE *SystemTable\r
175 )\r
176{\r
177 EFI_STATUS Status;\r
178 LIST_ENTRY *Package;\r
179 EFI_TIME TheTime;\r
180 CHAR16 *ProblemParam;\r
181 SHELL_STATUS ShellStatus;\r
beab0fc5 182 CONST CHAR16 *Param1;\r
a405b86d 183\r
184 ShellStatus = SHELL_SUCCESS;\r
185 ProblemParam = NULL;\r
186\r
187 //\r
188 // initialize the shell lib (we must be in non-auto-init...)\r
189 //\r
190 Status = ShellInitialize();\r
191 ASSERT_EFI_ERROR(Status);\r
192\r
193 //\r
194 // parse the command line\r
195 //\r
196 Status = ShellCommandLineParse (SfoParamList, &Package, &ProblemParam, TRUE);\r
197 if (EFI_ERROR(Status)) {\r
198 if (Status == EFI_VOLUME_CORRUPTED && ProblemParam != NULL) {\r
199 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellLevel2HiiHandle, ProblemParam);\r
200 FreePool(ProblemParam);\r
201 ShellStatus = SHELL_INVALID_PARAMETER;\r
202 } else {\r
203 ASSERT(FALSE);\r
204 }\r
205 } else {\r
206 //\r
207 // check for "-?"\r
208 //\r
209 if (ShellCommandLineGetFlag(Package, L"-?")) {\r
210 ASSERT(FALSE);\r
211 } else if (ShellCommandLineGetRawValue(Package, 2) != NULL) {\r
212 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_MANY), gShellLevel2HiiHandle);\r
213 ShellStatus = SHELL_INVALID_PARAMETER;\r
214 } else {\r
215 //\r
216 // If there are 0 value parameters, then print the current date\r
217 // else If there are any value paramerers, then print error\r
218 //\r
219 if (ShellCommandLineGetRawValue(Package, 1) == NULL) {\r
220 //\r
221 // get the current date\r
222 //\r
223 Status = gRT->GetTime(&TheTime, NULL);\r
224 ASSERT_EFI_ERROR(Status);\r
225\r
226 //\r
227 // ShellPrintEx the date in SFO or regular format\r
228 //\r
229 if (ShellCommandLineGetFlag(Package, L"-sfo")) {\r
230 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_DATE_SFO_FORMAT), gShellLevel2HiiHandle, TheTime.Month, TheTime.Day, TheTime.Year);\r
231 } else {\r
232 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_DATE_FORMAT), gShellLevel2HiiHandle, TheTime.Month, TheTime.Day, TheTime.Year);\r
233 }\r
234 } else {\r
235 if (PcdGet8(PcdShellSupportLevel) == 2) {\r
236 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_MANY), gShellLevel2HiiHandle);\r
237 ShellStatus = SHELL_INVALID_PARAMETER;\r
238 } else {\r
239 //\r
240 // perform level 3 operation here.\r
241 //\r
beab0fc5 242 Param1 = ShellCommandLineGetRawValue(Package, 1);\r
243 if (Param1 == NULL) {\r
244 ShellStatus = SHELL_INVALID_PARAMETER;\r
245 } else {\r
246 ShellStatus = CheckAndSetDate(Param1);\r
247 }\r
a405b86d 248 if (ShellStatus != SHELL_SUCCESS) {\r
beab0fc5 249 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellLevel2HiiHandle, Param1);\r
a405b86d 250 ShellStatus = SHELL_INVALID_PARAMETER;\r
251 }\r
252 }\r
253 }\r
254 }\r
255 }\r
256 //\r
257 // free the command line package\r
258 //\r
259 ShellCommandLineFreeVarList (Package);\r
260\r
261 //\r
262 // return the status\r
263 //\r
264 return (ShellStatus);\r
265}\r
266\r
267//\r
268// Note "-tz" is invalid for this (non-interactive) version of 'time'.\r
269//\r
270STATIC CONST SHELL_PARAM_ITEM TimeParamList2[] = {\r
271 {L"-d", TypeValue},\r
272 {NULL, TypeMax}\r
273 };\r
274\r
275STATIC CONST SHELL_PARAM_ITEM TimeParamList3[] = {\r
276 {L"-d", TypeValue},\r
277 {L"-tz", TypeValue},\r
278 {NULL, TypeMax}\r
279 };\r
280\r
b54fd049 281/**\r
282 Verify that the TimeString is valid and if so set that as the current \r
283 time.\r
284\r
285 @param[in] TimeString The pointer to a string representation of the time.\r
286 @param[in] Tz The value to set for TimeZone.\r
287 @param[in] Daylight The value to set for Daylight.\r
288\r
289 @retval SHELL_INVALID_PARAMETER TimeString was NULL.\r
290 @retval SHELL_INVALID_PARAMETER TimeString was mis-formatted.\r
291 @retval SHELL_SUCCESS The operation was successful.\r
292**/\r
a405b86d 293SHELL_STATUS\r
294EFIAPI\r
295CheckAndSetTime (\r
296 IN CONST CHAR16 *TimeString,\r
297 IN CONST INT16 Tz,\r
298 IN CONST UINT8 Daylight\r
299 )\r
300{\r
301 EFI_TIME TheTime;\r
302 EFI_STATUS Status;\r
b54fd049 303 CHAR16 *TimeStringCopy;\r
304 CHAR16 *Walker1;\r
305 CHAR16 *Walker2;\r
a405b86d 306\r
307 if (TimeString != NULL && !InternalIsTimeLikeString(TimeString, L':', 1, 2, FALSE)) {\r
308 return (SHELL_INVALID_PARAMETER);\r
309 }\r
f20076da 310 if (Daylight != 0xFF &&((Daylight & (EFI_TIME_IN_DAYLIGHT|EFI_TIME_ADJUST_DAYLIGHT)) != Daylight)) {\r
0841f3af 311 return (SHELL_INVALID_PARAMETER);\r
312 }\r
a405b86d 313\r
314 Status = gRT->GetTime(&TheTime, NULL);\r
315 ASSERT_EFI_ERROR(Status);\r
316\r
317 if (TimeString != NULL) {\r
0841f3af 318 TimeStringCopy = NULL;\r
319 TimeStringCopy = StrnCatGrow(&TimeStringCopy, NULL, TimeString, 0);\r
b54fd049 320 Walker1 = TimeStringCopy;\r
a405b86d 321 TheTime.Hour = 0xFF;\r
322 TheTime.Minute = 0xFF;\r
323\r
33c031ee 324 Walker2 = Walker1!=NULL?StrStr(Walker1, L":"):NULL;\r
b54fd049 325 if (Walker2 != NULL && *Walker2 == L':') {\r
326 *Walker2 = CHAR_NULL;\r
a405b86d 327 }\r
b54fd049 328 TheTime.Hour = (UINT8)ShellStrToUintn (Walker1);\r
329 if (Walker2 != NULL) {\r
330 Walker1 = Walker2 + 1;\r
331 }\r
33c031ee 332 Walker2 = Walker1!=NULL?StrStr(Walker1, L":"):NULL;\r
b54fd049 333 if (Walker2 != NULL && *Walker2 == L':') {\r
334 *Walker2 = CHAR_NULL;\r
335 }\r
336 if (Walker1 != NULL && Walker1[0] != CHAR_NULL) {\r
337 TheTime.Minute = (UINT8)ShellStrToUintn (Walker1);\r
338 if (Walker2 != NULL) {\r
339 Walker1 = Walker2 + 1;\r
a405b86d 340 }\r
b54fd049 341 if (Walker1 != NULL && Walker1[0] != CHAR_NULL) {\r
342 TheTime.Second = (UINT8)ShellStrToUintn (Walker1);\r
a405b86d 343 }\r
344 }\r
0841f3af 345 SHELL_FREE_NON_NULL(TimeStringCopy);\r
a405b86d 346 }\r
347\r
b54fd049 348\r
349 if ((Tz >= -1440 && Tz <= 1440)||(Tz == 0x7FF)) {\r
a405b86d 350 TheTime.TimeZone = Tz;\r
351 }\r
0841f3af 352\r
f20076da 353 if (Daylight != 0xFF) {\r
354 TheTime.Daylight = Daylight;\r
355 }\r
0841f3af 356\r
a405b86d 357 Status = gRT->SetTime(&TheTime);\r
358\r
359 if (!EFI_ERROR(Status)){\r
360 return (SHELL_SUCCESS);\r
361 }\r
362\r
363 return (SHELL_INVALID_PARAMETER);\r
364}\r
365\r
366/**\r
367 Function for 'time' command.\r
368\r
369 @param[in] ImageHandle Handle to the Image (NULL if Internal).\r
370 @param[in] SystemTable Pointer to the System Table (NULL if Internal).\r
371**/\r
372SHELL_STATUS\r
373EFIAPI\r
374ShellCommandRunTime (\r
375 IN EFI_HANDLE ImageHandle,\r
376 IN EFI_SYSTEM_TABLE *SystemTable\r
377 )\r
378{\r
379 EFI_STATUS Status;\r
380 LIST_ENTRY *Package;\r
a405b86d 381 EFI_TIME TheTime;\r
382 CHAR16 *ProblemParam;\r
383 SHELL_STATUS ShellStatus;\r
384 INT16 Tz;\r
385 UINT8 Daylight;\r
386 CONST CHAR16 *TempLocation;\r
387 UINTN TzMinutes;\r
388\r
a405b86d 389 //\r
390 // Initialize variables\r
391 //\r
e755a4ca 392 ShellStatus = SHELL_SUCCESS;\r
393 ProblemParam = NULL;\r
a405b86d 394\r
395 //\r
396 // initialize the shell lib (we must be in non-auto-init...)\r
397 //\r
398 Status = ShellInitialize();\r
399 ASSERT_EFI_ERROR(Status);\r
400\r
401 //\r
402 // parse the command line\r
403 //\r
404 if (PcdGet8(PcdShellSupportLevel) == 2) {\r
405 Status = ShellCommandLineParseEx (TimeParamList2, &Package, &ProblemParam, TRUE, TRUE);\r
406 } else {\r
407 ASSERT(PcdGet8(PcdShellSupportLevel) == 3);\r
408 Status = ShellCommandLineParseEx (TimeParamList3, &Package, &ProblemParam, TRUE, TRUE);\r
409 }\r
410 if (EFI_ERROR(Status)) {\r
411 if (Status == EFI_VOLUME_CORRUPTED && ProblemParam != NULL) {\r
412 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellLevel2HiiHandle, ProblemParam);\r
413 FreePool(ProblemParam);\r
414 ShellStatus = SHELL_INVALID_PARAMETER;\r
415 } else {\r
416 ASSERT(FALSE);\r
417 }\r
418 } else {\r
419 //\r
420 // check for "-?"\r
421 //\r
422 Status = gRT->GetTime(&TheTime, NULL);\r
423 ASSERT_EFI_ERROR(Status);\r
424 if (ShellCommandLineGetFlag(Package, L"-?")) {\r
425 ASSERT(FALSE);\r
426 } else if (ShellCommandLineGetRawValue(Package, 2) != NULL) {\r
427 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_MANY), gShellLevel2HiiHandle);\r
428 ShellStatus = SHELL_INVALID_PARAMETER;\r
429 } else {\r
430 //\r
431 // If there are no parameters, then print the current time\r
432 //\r
433 if (ShellCommandLineGetRawValue(Package, 1) == NULL\r
434 && !ShellCommandLineGetFlag(Package, L"-d")\r
435 && !ShellCommandLineGetFlag(Package, L"-tz")) {\r
436 //\r
437 // ShellPrintEx the current time\r
438 //\r
2e8e9ed5 439 if (TheTime.TimeZone == EFI_UNSPECIFIED_TIMEZONE) {\r
a405b86d 440 TzMinutes = 0;\r
441 } else {\r
b54fd049 442 TzMinutes = (ABS(TheTime.TimeZone)) % 60;\r
a405b86d 443 }\r
444\r
445 ShellPrintHiiEx (\r
446 -1,\r
447 -1,\r
448 NULL,\r
449 STRING_TOKEN (STR_TIME_FORMAT),\r
450 gShellLevel2HiiHandle,\r
451 TheTime.Hour,\r
452 TheTime.Minute,\r
453 TheTime.Second,\r
2e8e9ed5 454 TheTime.TimeZone==EFI_UNSPECIFIED_TIMEZONE?L" ":(TheTime.TimeZone > 0?L"-":L"+"),\r
455 TheTime.TimeZone==EFI_UNSPECIFIED_TIMEZONE?0:(ABS(TheTime.TimeZone)) / 60,\r
a405b86d 456 TzMinutes\r
457 );\r
458 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_CRLF), gShellLevel2HiiHandle);\r
459 } else if (ShellCommandLineGetFlag(Package, L"-d") && ShellCommandLineGetValue(Package, L"-d") == NULL) {\r
2e8e9ed5 460 if (TheTime.TimeZone == EFI_UNSPECIFIED_TIMEZONE) {\r
a405b86d 461 TzMinutes = 0;\r
462 } else {\r
b54fd049 463 TzMinutes = (ABS(TheTime.TimeZone)) % 60;\r
a405b86d 464 }\r
465\r
466 ShellPrintHiiEx (\r
467 -1,\r
468 -1,\r
469 NULL,\r
470 STRING_TOKEN (STR_TIME_FORMAT),\r
471 gShellLevel2HiiHandle,\r
472 TheTime.Hour,\r
473 TheTime.Minute,\r
474 TheTime.Second,\r
2e8e9ed5 475 TheTime.TimeZone==EFI_UNSPECIFIED_TIMEZONE?L" ":(TheTime.TimeZone > 0?L"-":L"+"),\r
476 TheTime.TimeZone==EFI_UNSPECIFIED_TIMEZONE?0:(ABS(TheTime.TimeZone)) / 60,\r
a405b86d 477 TzMinutes\r
478 );\r
479 switch (TheTime.Daylight) {\r
0841f3af 480 case 0:\r
481 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_TIME_DST0), gShellLevel2HiiHandle);\r
482 break;\r
a405b86d 483 case EFI_TIME_ADJUST_DAYLIGHT:\r
b54fd049 484 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_TIME_DST1), gShellLevel2HiiHandle);\r
a405b86d 485 break;\r
486 case EFI_TIME_IN_DAYLIGHT:\r
b54fd049 487 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_TIME_DST2), gShellLevel2HiiHandle);\r
488 break;\r
489 case EFI_TIME_IN_DAYLIGHT|EFI_TIME_ADJUST_DAYLIGHT:\r
490 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_TIME_DST3), gShellLevel2HiiHandle);\r
a405b86d 491 break;\r
492 default:\r
493 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_UEFI_FUNC_ERROR), gShellLevel2HiiHandle, L"gRT->GetTime", L"TheTime.Daylight", TheTime.Daylight);\r
494 }\r
495 } else {\r
496 if (PcdGet8(PcdShellSupportLevel) == 2) {\r
497 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_MANY), gShellLevel2HiiHandle);\r
498 ShellStatus = SHELL_INVALID_PARAMETER;\r
499 } else {\r
500 //\r
501 // perform level 3 operation here.\r
502 //\r
503 if ((TempLocation = ShellCommandLineGetValue(Package, L"-tz")) != NULL) {\r
504 if (TempLocation[0] == L'-') {\r
b54fd049 505 Tz = (INT16)(0 - ShellStrToUintn(++TempLocation));\r
a405b86d 506 } else {\r
b54fd049 507 Tz = (INT16)ShellStrToUintn(TempLocation);\r
a405b86d 508 }\r
2e8e9ed5 509 if (!(Tz >= -1440 && Tz <= 1440) && Tz != EFI_UNSPECIFIED_TIMEZONE) {\r
0841f3af 510 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM_VAL), gShellLevel2HiiHandle, L"-tz");\r
a405b86d 511 ShellStatus = SHELL_INVALID_PARAMETER;\r
512 }\r
513 } else {\r
514 //\r
515 // intentionally out of bounds value will prevent changing it...\r
516 //\r
517 Tz = 1441;\r
518 }\r
519 TempLocation = ShellCommandLineGetValue(Package, L"-d");\r
520 if (TempLocation != NULL) {\r
b54fd049 521 Daylight = (UINT8)ShellStrToUintn(TempLocation);\r
a405b86d 522 if (Daylight != 0 && Daylight != 1 && Daylight != 3) {\r
0841f3af 523 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM_VAL), gShellLevel2HiiHandle, L"-d");\r
a405b86d 524 ShellStatus = SHELL_INVALID_PARAMETER;\r
525 }\r
526 } else {\r
527 //\r
528 // invalid = will not use\r
529 //\r
530 Daylight = 0xFF;\r
531 }\r
532 if (ShellStatus == SHELL_SUCCESS) {\r
533 ShellStatus = CheckAndSetTime(ShellCommandLineGetRawValue(Package, 1), Tz, Daylight);\r
534 if (ShellStatus != SHELL_SUCCESS) {\r
535 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellLevel2HiiHandle, ShellCommandLineGetRawValue(Package, 1));\r
536 ShellStatus = SHELL_INVALID_PARAMETER;\r
537 }\r
538 }\r
539 }\r
540 }\r
541 }\r
542 }\r
543\r
544 //\r
545 // free the command line package\r
546 //\r
547 ShellCommandLineFreeVarList (Package);\r
548\r
549 //\r
550 // return the status\r
551 //\r
552 return (ShellStatus);\r
553}\r
554\r
555typedef struct {\r
556 INT16 TimeZone;\r
557 EFI_STRING_ID StringId;\r
558} TIME_ZONE_ITEM;\r
559\r
560STATIC CONST SHELL_PARAM_ITEM TimeZoneParamList2[] = {\r
561 {L"-l", TypeFlag},\r
562 {L"-f", TypeFlag},\r
563 {NULL, TypeMax}\r
564 };\r
565STATIC CONST SHELL_PARAM_ITEM TimeZoneParamList3[] = {\r
566 {L"-l", TypeFlag},\r
567 {L"-f", TypeFlag},\r
568 {L"-s", TypeValue},\r
569 {NULL, TypeMax}\r
570 };\r
571\r
572 STATIC CONST TIME_ZONE_ITEM TimeZoneList[] = {\r
573 {720, STRING_TOKEN (STR_TIMEZONE_M12)},\r
574 {660, STRING_TOKEN (STR_TIMEZONE_M11)},\r
575 {600, STRING_TOKEN (STR_TIMEZONE_M10)},\r
576 {540, STRING_TOKEN (STR_TIMEZONE_M9)},\r
577 {480, STRING_TOKEN (STR_TIMEZONE_M8)},\r
578 {420, STRING_TOKEN (STR_TIMEZONE_M7)},\r
579 {360, STRING_TOKEN (STR_TIMEZONE_M6)},\r
580 {300, STRING_TOKEN (STR_TIMEZONE_M5)},\r
581 {270, STRING_TOKEN (STR_TIMEZONE_M430)},\r
582 {240, STRING_TOKEN (STR_TIMEZONE_M4)},\r
583 {210, STRING_TOKEN (STR_TIMEZONE_M330)},\r
584 {180, STRING_TOKEN (STR_TIMEZONE_M3)},\r
585 {120, STRING_TOKEN (STR_TIMEZONE_M2)},\r
586 {60 , STRING_TOKEN (STR_TIMEZONE_M1)},\r
587 {0 , STRING_TOKEN (STR_TIMEZONE_0)},\r
588 {-60 , STRING_TOKEN (STR_TIMEZONE_P1)},\r
589 {-120 , STRING_TOKEN (STR_TIMEZONE_P2)},\r
590 {-180 , STRING_TOKEN (STR_TIMEZONE_P3)},\r
591 {-210 , STRING_TOKEN (STR_TIMEZONE_P330)},\r
592 {-240 , STRING_TOKEN (STR_TIMEZONE_P4)},\r
593 {-270 , STRING_TOKEN (STR_TIMEZONE_P430)},\r
594 {-300 , STRING_TOKEN (STR_TIMEZONE_P5)},\r
595 {-330 , STRING_TOKEN (STR_TIMEZONE_P530)},\r
596 {-345 , STRING_TOKEN (STR_TIMEZONE_P545)},\r
597 {-360 , STRING_TOKEN (STR_TIMEZONE_P6)},\r
598 {-390 , STRING_TOKEN (STR_TIMEZONE_P630)},\r
599 {-420 , STRING_TOKEN (STR_TIMEZONE_P7)},\r
600 {-480 , STRING_TOKEN (STR_TIMEZONE_P8)},\r
601 {-540 , STRING_TOKEN (STR_TIMEZONE_P9)},\r
602 {-570 , STRING_TOKEN (STR_TIMEZONE_P930)},\r
603 {-600 , STRING_TOKEN (STR_TIMEZONE_P10)},\r
604 {-660 , STRING_TOKEN (STR_TIMEZONE_P11)},\r
605 {-720 , STRING_TOKEN (STR_TIMEZONE_P12)},\r
606 {-780 , STRING_TOKEN (STR_TIMEZONE_P13)},\r
607 {-840 , STRING_TOKEN (STR_TIMEZONE_P14)}\r
b54fd049 608};\r
609\r
610/**\r
611 Verify that the TimeZoneString is valid and if so set that as the current \r
612 timezone.\r
a405b86d 613\r
b54fd049 614 @param[in] TimeZoneString The pointer to a string representation of the timezone.\r
615\r
616 @retval SHELL_INVALID_PARAMETER TimeZoneString was NULL.\r
617 @retval SHELL_INVALID_PARAMETER TimeZoneString was mis-formatted.\r
618 @retval SHELL_SUCCESS The operation was successful.\r
619**/\r
a405b86d 620SHELL_STATUS\r
621EFIAPI\r
622CheckAndSetTimeZone (\r
623 IN CONST CHAR16 *TimeZoneString\r
624 )\r
625{\r
626 EFI_TIME TheTime;\r
627 EFI_STATUS Status;\r
b54fd049 628 CHAR16 *TimeZoneCopy;\r
629 CHAR16 *Walker;\r
630 CHAR16 *Walker2;\r
a405b86d 631 UINTN LoopVar;\r
632\r
633 if (TimeZoneString == NULL) {\r
634 return (SHELL_INVALID_PARAMETER);\r
635 }\r
636\r
637 if (TimeZoneString != NULL && !InternalIsTimeLikeString(TimeZoneString, L':', 1, 1, TRUE)) {\r
638 return (SHELL_INVALID_PARAMETER);\r
639 }\r
640\r
641 Status = gRT->GetTime(&TheTime, NULL);\r
532691c8 642 if (EFI_ERROR(Status)) {\r
643 return (SHELL_DEVICE_ERROR);\r
644 }\r
a405b86d 645\r
b54fd049 646 TimeZoneCopy = NULL;\r
647 TimeZoneCopy = StrnCatGrow(&TimeZoneCopy, NULL, TimeZoneString, 0);\r
532691c8 648 if (TimeZoneCopy == NULL) {\r
649 return (SHELL_OUT_OF_RESOURCES);\r
650 }\r
b54fd049 651 Walker = TimeZoneCopy;\r
652 Walker2 = StrStr(Walker, L":");\r
653 if (Walker2 != NULL && *Walker2 == L':') {\r
654 *Walker2 = CHAR_NULL;\r
655 }\r
a405b86d 656 if (*Walker == L'-') {\r
b54fd049 657 TheTime.TimeZone = (INT16)((ShellStrToUintn (++Walker)) * 60);\r
a405b86d 658 } else {\r
b54fd049 659 TheTime.TimeZone = (INT16)((ShellStrToUintn (Walker)) * -60);\r
a405b86d 660 }\r
b54fd049 661 if (Walker2 != NULL) {\r
662 Walker = Walker2 + 1;\r
a405b86d 663 }\r
664 if (Walker != NULL && Walker[0] != CHAR_NULL) {\r
665 if (TheTime.TimeZone < 0) {\r
b54fd049 666 TheTime.TimeZone = (INT16)(TheTime.TimeZone - (UINT8)ShellStrToUintn (Walker));\r
a405b86d 667 } else {\r
b54fd049 668 TheTime.TimeZone = (INT16)(TheTime.TimeZone + (UINT8)ShellStrToUintn (Walker));\r
a405b86d 669 }\r
670 }\r
671\r
672 Status = EFI_INVALID_PARAMETER;\r
673\r
674 for ( LoopVar = 0\r
675 ; LoopVar < sizeof(TimeZoneList) / sizeof(TimeZoneList[0])\r
676 ; LoopVar++\r
677 ){\r
678 if (TheTime.TimeZone == TimeZoneList[LoopVar].TimeZone) {\r
679 Status = gRT->SetTime(&TheTime);\r
680 break;\r
681 }\r
682 }\r
683\r
b54fd049 684 FreePool(TimeZoneCopy);\r
685\r
a405b86d 686 if (!EFI_ERROR(Status)){\r
687 return (SHELL_SUCCESS);\r
688 }\r
689 return (SHELL_INVALID_PARAMETER);\r
690}\r
691\r
692\r
693/**\r
694 Function for 'timezone' command.\r
695\r
696 @param[in] ImageHandle Handle to the Image (NULL if Internal).\r
697 @param[in] SystemTable Pointer to the System Table (NULL if Internal).\r
698**/\r
699SHELL_STATUS\r
700EFIAPI\r
701ShellCommandRunTimeZone (\r
702 IN EFI_HANDLE ImageHandle,\r
703 IN EFI_SYSTEM_TABLE *SystemTable\r
704 )\r
705{\r
706 //\r
707 // non interactive\r
708 //\r
709 EFI_STATUS Status;\r
710 LIST_ENTRY *Package;\r
711 CHAR16 *ProblemParam;\r
712 SHELL_STATUS ShellStatus;\r
713 UINT8 LoopVar;\r
714 EFI_TIME TheTime;\r
715 BOOLEAN Found;\r
716 UINTN TzMinutes;\r
717\r
718 ShellStatus = SHELL_SUCCESS;\r
719 ProblemParam = NULL;\r
720\r
721 //\r
722 // initialize the shell lib (we must be in non-auto-init...)\r
723 //\r
724 Status = ShellInitialize();\r
725 ASSERT_EFI_ERROR(Status);\r
726\r
727 //\r
728 // parse the command line\r
729 //\r
730 if (PcdGet8(PcdShellSupportLevel) == 2) {\r
8f04ca1a 731 Status = ShellCommandLineParse (TimeZoneParamList2, &Package, &ProblemParam, TRUE);\r
a405b86d 732 } else {\r
733 ASSERT(PcdGet8(PcdShellSupportLevel) == 3);\r
8f04ca1a 734 Status = ShellCommandLineParseEx (TimeZoneParamList3, &Package, &ProblemParam, TRUE, TRUE);\r
a405b86d 735 }\r
736 if (EFI_ERROR(Status)) {\r
737 if (Status == EFI_VOLUME_CORRUPTED && ProblemParam != NULL) {\r
738 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellLevel2HiiHandle, ProblemParam);\r
739 FreePool(ProblemParam);\r
740 ShellStatus = SHELL_INVALID_PARAMETER;\r
741 } else {\r
742 ASSERT(FALSE);\r
743 }\r
744 } else {\r
745 //\r
746 // check for "-?"\r
747 //\r
748 if (ShellCommandLineGetCount(Package) > 1) {\r
749 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_MANY), gShellLevel2HiiHandle);\r
750 ShellStatus = SHELL_INVALID_PARAMETER;\r
751 } else if (ShellCommandLineGetFlag(Package, L"-?")) {\r
752 ASSERT(FALSE);\r
753 } else if (ShellCommandLineGetFlag(Package, L"-s")) {\r
754 if ((ShellCommandLineGetFlag(Package, L"-l")) || (ShellCommandLineGetFlag(Package, L"-f"))) {\r
755 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellLevel2HiiHandle, L"-l or -f");\r
756 ShellStatus = SHELL_INVALID_PARAMETER;\r
757 } else {\r
758 ASSERT(PcdGet8(PcdShellSupportLevel) == 3);\r
759 if (ShellCommandLineGetValue(Package, L"-s") == NULL) {\r
760 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_NO_VALUE), gShellLevel2HiiHandle, L"-s");\r
761 ShellStatus = SHELL_INVALID_PARAMETER;\r
762 } else {\r
763 //\r
764 // Set the time zone\r
765 //\r
766 ShellStatus = CheckAndSetTimeZone(ShellCommandLineGetValue(Package, L"-s"));\r
767 if (ShellStatus != SHELL_SUCCESS) {\r
768 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellLevel2HiiHandle, ShellCommandLineGetValue(Package, L"-s"));\r
769 ShellStatus = SHELL_INVALID_PARAMETER;\r
770 }\r
771 }\r
772 }\r
773 } else if (ShellCommandLineGetFlag(Package, L"-l")) {\r
774 //\r
775 // Print a list of all time zones\r
776 //\r
777 for ( LoopVar = 0\r
778 ; LoopVar < sizeof(TimeZoneList) / sizeof(TimeZoneList[0])\r
779 ; LoopVar++\r
780 ){\r
781 ShellPrintHiiEx (-1, -1, NULL, TimeZoneList[LoopVar].StringId, gShellLevel2HiiHandle);\r
782 }\r
783 } else {\r
784 //\r
785 // Get Current Time Zone Info\r
786 //\r
787 Status = gRT->GetTime(&TheTime, NULL);\r
788 ASSERT_EFI_ERROR(Status);\r
789\r
2e8e9ed5 790 if (TheTime.TimeZone != EFI_UNSPECIFIED_TIMEZONE) {\r
a405b86d 791 Found = FALSE;\r
792 for ( LoopVar = 0\r
793 ; LoopVar < sizeof(TimeZoneList) / sizeof(TimeZoneList[0])\r
794 ; LoopVar++\r
795 ){\r
796 if (TheTime.TimeZone == TimeZoneList[LoopVar].TimeZone) {\r
797 if (ShellCommandLineGetFlag(Package, L"-f")) {\r
798 //\r
799 // Print all info about current time zone\r
800 //\r
801 ShellPrintHiiEx (-1, -1, NULL, TimeZoneList[LoopVar].StringId, gShellLevel2HiiHandle);\r
802 } else {\r
803 //\r
804 // Print basic info only\r
805 //\r
2e8e9ed5 806 if (TheTime.TimeZone == EFI_UNSPECIFIED_TIMEZONE) {\r
a405b86d 807 TzMinutes = 0;\r
808 } else {\r
b54fd049 809 TzMinutes = (ABS(TheTime.TimeZone)) % 60;\r
a405b86d 810 }\r
811\r
812 ShellPrintHiiEx (\r
813 -1,\r
814 -1,\r
815 NULL,\r
816 STRING_TOKEN(STR_TIMEZONE_SIMPLE),\r
817 gShellLevel2HiiHandle,\r
2e8e9ed5 818 TheTime.TimeZone==EFI_UNSPECIFIED_TIMEZONE?0:(TheTime.TimeZone > 0?L"-":L"+"),\r
819 TheTime.TimeZone==EFI_UNSPECIFIED_TIMEZONE?0:(ABS(TheTime.TimeZone)) / 60,\r
a405b86d 820 TzMinutes);\r
821 }\r
822 Found = TRUE;\r
823 break;\r
824 }\r
825 }\r
826 if (!Found) {\r
827 //\r
828 // Print basic info only\r
829 //\r
2e8e9ed5 830 if (TheTime.TimeZone == EFI_UNSPECIFIED_TIMEZONE) {\r
a405b86d 831 TzMinutes = 0;\r
832 } else {\r
b54fd049 833 TzMinutes = (ABS(TheTime.TimeZone)) % 60;\r
a405b86d 834 }\r
835 ShellPrintHiiEx (\r
836 -1,\r
837 -1,\r
838 NULL,\r
839 STRING_TOKEN(STR_TIMEZONE_SIMPLE),\r
840 gShellLevel2HiiHandle,\r
2e8e9ed5 841 TheTime.TimeZone==EFI_UNSPECIFIED_TIMEZONE?0:(TheTime.TimeZone > 0?L"-":L"+"),\r
842 TheTime.TimeZone==EFI_UNSPECIFIED_TIMEZONE?0:(ABS(TheTime.TimeZone)) / 60,\r
a405b86d 843 TzMinutes);\r
844 if (ShellCommandLineGetFlag(Package, L"-f")) {\r
845 ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN(STR_TIMEZONE_NI), gShellLevel2HiiHandle);\r
846 }\r
847 }\r
848 } else {\r
849 //\r
2e8e9ed5 850 // TimeZone was EFI_UNSPECIFIED_TIMEZONE (unknown) from GetTime()\r
a405b86d 851 //\r
852 }\r
853 }\r
854 }\r
855\r
856 //\r
857 // free the command line package\r
858 //\r
859 ShellCommandLineFreeVarList (Package);\r
860\r
861 return (ShellStatus);\r
862}\r