blob: a9eeae4d2aba9c1a111a669c50ca8c44dd422b9a [file] [log] [blame]
/* ------------------------------------------------------------------
* Copyright (C) 1998-2009 PacketVideo
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
* express or implied.
* See the License for the specific language governing permissions
* and limitations under the License.
* -------------------------------------------------------------------
*/
#include "oscl_time.h"
#include "oscl_assert.h"
#include "oscl_stdstring.h"
#if (OSCL_DISABLE_INLINES)
#include "oscl_time.inl"
#endif
//---OSCL_HAS_UNIX_TIME_FUNCS---//
const uint32 origin_offset = 2208988800U;
const uint64 freq_conv = 281474977;
int NTPTime::set_to_current_time()
{
struct timeval tv;
uint64 tmp;
// get the current time
// This gives back time since 0h Jan 1, 1970
gettimeofday(&tv, 0);
timevalue = origin_offset;
// now convert to proper time origin
timevalue += tv.tv_sec;
timevalue <<= 32;
// now convert the frequency of the fractional part
// from usec to 2^32 ticks/sec.
if (tv.tv_usec > 0)
{
tmp = (tv.tv_usec * freq_conv) >> 16;
timevalue += tmp;
}
return 0;
}
NTPTime::NTPTime(const TimeValue& t)
{
const timeval *pTimeVal = t.getBasicTimeStruct();
timevalue = origin_offset;
// now convert to proper time origin
timevalue += pTimeVal->tv_sec;
timevalue <<= 32;
// now convert the frequency of the fractional part
// from usec to 2^32 ticks/sec.
uint64 tmp = (pTimeVal->tv_usec * freq_conv) >> 16;
timevalue += tmp;
}
int DayIndexFromDate(int year, int month, int day)
{
// return index (0=Sunday, 1=Monday... etc
int days_so_far[] = { 0 , 31 , 59 , 90 , 120, 151,
181, 212, 243, 273, 304, 334
};
if (month > 12 || month < 0 || year < 1 || day < 1 || day > 31)
return 0; // bad value(s)
int day_index = ((year - 1) * 365 +
(year - 1) / 4 +
days_so_far[month-1] +
day +
(((month > 2) && !(year % 4)) ? 1 : 0)
) % 7;
return (day_index == 0) ? 6 : (day_index - 1);
}
static const char* const months[] = { "Jan", "Feb", "Mar", "Apr", "May",
"Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec",
""
};
static const char* const days[] = { "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" };
OSCL_EXPORT_REF void PV8601ToRFC822(PV8601timeStrBuf pv8601_buffer, CtimeStrBuf ctime_buffer)
{
// Convert from PV8601 Format (20010805T185430.000Z)
// to RFC822 Format (Sun Aug 5 18:54:30 2001)
// No <time.h> functions will be used because this code must run on
// all platforms.
//---OSCL_HAS_ANSI_STRING_SUPPORT---//
if ((PV8601TIME_BUFFER_SIZE - 1) != strlen(pv8601_buffer))
{
ctime_buffer[0] = 0;
return;
}
char buf[5];
int year, mon, day, hour, min, sec;
strncpy(buf, pv8601_buffer, 4);
buf[4] = 0;
year = atoi(buf);
buf[2] = 0;
strncpy(buf, pv8601_buffer + 4, 2);
mon = atoi(buf);
strncpy(buf, pv8601_buffer + 6, 2);
day = atoi(buf);
strncpy(buf, pv8601_buffer + 9, 2);
hour = atoi(buf);
strncpy(buf, pv8601_buffer + 11, 2);
min = atoi(buf);
strncpy(buf, pv8601_buffer + 13, 2);
sec = atoi(buf);
sprintf(ctime_buffer,
"%s %s %2d %02d:%02d:%02d %04d",
days[DayIndexFromDate(year,mon,day)],
months[mon-1],
day, hour, min, sec, year);
}
OSCL_EXPORT_REF void RFC822ToPV8601(CtimeStrBuf ctime_buffer, PV8601timeStrBuf pv8601_buffer)
{
// Convert from RFC822 Format (Sun Aug 5 18:54:30 2001)
// to PV8601 Format (20010805T185430.000Z)
// No <time.h> functions will be used because this code must run on
// all platforms.
//---OSCL_HAS_ANSI_STRING_SUPPORT--- or ..//
const char *ptr = ctime_buffer;
int mon = 0, day, hour, min, sec;
for (int i = 0; *months[i]; i++)
{
if (!strncmp(ptr + 4, months[i], 3))
{
mon = i + 1;
break;
}
}
day = atoi(*(ptr + 8) == ' ' ? (ptr + 9) : (ptr + 8));
hour = atoi(ptr + 11);
min = atoi(ptr + 14);
sec = atoi(ptr + 17);
sprintf(pv8601_buffer,
"%04d%02d%02dT%02d%02d%02d.000Z",
atoi(ptr + 20), // year
mon, day, hour, min, sec);
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
//! get_rfc822_gmtime_str not supported on all platforms
/*!
Notes: Symbian implementation feasible but not done.
*/
OSCL_EXPORT_REF char *TimeValue::get_rfc822_gmtime_str(int max_time_strlen,
char *time_str)
{
//---OSCL_HAS_UNIX_TIME_FUNCS---//
struct tm *timeptr;
struct tm buffer;
timeptr = gmtime_r(&ts.tv_sec, &buffer);
int length = snprintf(time_str, max_time_strlen,
"%s, %02d %s %04d %02d:%02d:%02d GMT",
days[timeptr->tm_wday], timeptr->tm_mday,
months[timeptr->tm_mon], timeptr->tm_year + 1900,
timeptr->tm_hour, timeptr->tm_min, timeptr->tm_sec);
if (length < 0 || length > max_time_strlen)
{
time_str[0] = NULL_TERM_CHAR;
}
return time_str;
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
//! get_str_ctime not supported on all platforms
/*!
Notes: Symbian implementation of obsolete function get_str_time
modified to fit format returned by ctime
*/
OSCL_EXPORT_REF char *TimeValue::get_str_ctime(CtimeStrBuf ctime_buffer)
{
//---OSCL_HAS_UNIX_TIME_FUNCS---//
// Uses timeval basic time structure
char *ptr = ctime_r(&ts.tv_sec, ctime_buffer);
char *ptr_end = strchr(ptr, '\n');
if (ptr_end) *ptr_end = '\0';
return ptr;
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
OSCL_EXPORT_REF int TimeValue::get_pv8601_str_time(PV8601timeStrBuf time_strbuf)
{
//---OSCL_HAS_UNIX_TIME_FUNCS---//
int num_chars = 0;
struct tm *timeptr;
struct tm buffer;
timeptr = gmtime_r(&ts.tv_sec, &buffer);
if ((num_chars = strftime(time_strbuf, sizeof(PV8601timeStrBuf),
"%Y%m%dT%H%M%S", timeptr)) == 0)
time_strbuf[0] = NULL_TERM_CHAR;
else
num_chars += snprintf(time_strbuf + strlen(time_strbuf),
sizeof(PV8601timeStrBuf) - num_chars,
".%03dZ", (int)(ts.tv_usec / 1000));
return num_chars;
}