4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/** @file
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Transformations between the EFI_TIME structure and struct tm or time_t.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Copyright (c) 2010, Intel Corporation. All rights reserved.<BR>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync This program and the accompanying materials are licensed and made available under
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync the terms and conditions of the BSD License that accompanies this distribution.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync The full text of the license may be found at
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync http://opensource.org/licenses/bsd-license.php.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#include <Uefi.h>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#include <LibConfig.h>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#include <time.h>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#include "tzfile.h"
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#include <MainData.h>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/** Convert an EFI_TIME structure into a C Standard tm structure.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] ET Pointer to the EFI_TIME structure to convert.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[out] BT Pointer to the tm structure to receive the converted time.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync*/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncvoid
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEfi2Tm(
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN EFI_TIME *ET,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OUT struct tm *BT
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Convert EFI time to broken-down time.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync BT->tm_year = ET->Year - TM_YEAR_BASE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync BT->tm_mon = ET->Month - 1; // BD time is zero based, EFI is 1 based
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync BT->tm_mday = ET->Day;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync BT->tm_hour = ET->Hour;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync BT->tm_min = ET->Minute;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync BT->tm_sec = ET->Second;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync BT->tm_isdst = -1;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync BT->tm_zoneoff = ET->TimeZone;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync BT->tm_daylight = ET->Daylight;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync BT->tm_Nano = ET->Nanosecond;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/** Convert an EFI_TIME structure into a time_t value.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] EfiBDtime Pointer to the EFI_TIME structure to convert.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @return The EFI_TIME converted into a time_t value.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync*/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsynctime_t
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEfi2Time(
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN EFI_TIME *EfiBDtime
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Efi2Tm( EfiBDtime, &gMD->BDTime);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return mktime( &gMD->BDTime);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/** Convert a C Standard tm structure into an EFI_TIME structure.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] BT Pointer to the tm structure to convert.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[out] ET Pointer to an EFI_TIME structure to receive the converted time.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync*/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncvoid
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncTm2Efi(
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN struct tm *BT,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OUT EFI_TIME *ET
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ET->Year = (UINT16)BT->tm_year + TM_YEAR_BASE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ET->Month = (UINT8)BT->tm_mon + 1;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ET->Day = (UINT8)BT->tm_mday;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ET->Hour = (UINT8)BT->tm_hour;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ET->Minute = (UINT8)BT->tm_min;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ET->Second = (UINT8)BT->tm_sec;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ET->Nanosecond = (UINT32)BT->tm_Nano;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ET->TimeZone = (INT16)BT->tm_zoneoff;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ET->Daylight = (UINT8)BT->tm_daylight;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/** Convert a time_t value into an EFI_TIME structure.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] CalTime Calendar time as a time_t value.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @return Returns a newly malloced EFI_TIME structure containing
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync the converted calendar time.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @post It is the responsibility of the caller to free the
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync returned structure before the application exits.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync*/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_TIME*
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncTime2Efi(
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN time_t CalTime
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync struct tm *IT;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_TIME *ET = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IT = gmtime(&CalTime);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if(IT != NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ET = malloc(sizeof(EFI_TIME));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if(ET != NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Tm2Efi(IT, ET);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return ET;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}