hxdate.cpp
上传用户:zhongxx05
上传日期:2007-06-06
资源大小:33641k
文件大小:9k
源码类别:

Symbian

开发平台:

C/C++

  1. /* ***** BEGIN LICENSE BLOCK ***** 
  2.  * Version: RCSL 1.0/RPSL 1.0 
  3.  *  
  4.  * Portions Copyright (c) 1995-2002 RealNetworks, Inc. All Rights Reserved. 
  5.  *      
  6.  * The contents of this file, and the files included with this file, are 
  7.  * subject to the current version of the RealNetworks Public Source License 
  8.  * Version 1.0 (the "RPSL") available at 
  9.  * http://www.helixcommunity.org/content/rpsl unless you have licensed 
  10.  * the file under the RealNetworks Community Source License Version 1.0 
  11.  * (the "RCSL") available at http://www.helixcommunity.org/content/rcsl, 
  12.  * in which case the RCSL will apply. You may also obtain the license terms 
  13.  * directly from RealNetworks.  You may not use this file except in 
  14.  * compliance with the RPSL or, if you have a valid RCSL with RealNetworks 
  15.  * applicable to this file, the RCSL.  Please see the applicable RPSL or 
  16.  * RCSL for the rights, obligations and limitations governing use of the 
  17.  * contents of the file.  
  18.  *  
  19.  * This file is part of the Helix DNA Technology. RealNetworks is the 
  20.  * developer of the Original Code and owns the copyrights in the portions 
  21.  * it created. 
  22.  *  
  23.  * This file, and the files included with this file, is distributed and made 
  24.  * available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER 
  25.  * EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS ALL SUCH WARRANTIES, 
  26.  * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, FITNESS 
  27.  * FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. 
  28.  * 
  29.  * Technology Compatibility Kit Test Suite(s) Location: 
  30.  *    http://www.helixcommunity.org/content/tck 
  31.  * 
  32.  * Contributor(s): 
  33.  *  
  34.  * ***** END LICENSE BLOCK ***** */ 
  35. #include "hxtypes.h"
  36. #include "hlxclib/string.h"
  37. #include "hlxclib/stdio.h"
  38. #ifdef _MACINTOSH
  39. #ifndef _MAC_MACHO
  40. #include <OSUtils.h>
  41. #endif
  42. #ifdef _CARBON
  43. #ifndef _MAC_MACHO
  44. #include <stat.h>
  45. #endif
  46. #else
  47. #include <stat.mac.h>
  48. #endif
  49. #else
  50. #include "hlxclib/sys/types.h"
  51. #include "hlxclib/sys/stat.h"
  52. #endif
  53. #if defined(_AIX)
  54. #include <ctype.h>
  55. #endif
  56. #ifdef _WINDOWS
  57. #include <windows.h>
  58. #include <wininet.h>
  59. #include "hlxclib/io.h"
  60. #endif /* _WINDOWS */
  61. #include "hxstrutl.h"
  62. #include "hxdate.h"
  63. #include "hxheap.h"
  64. #ifdef _DEBUG
  65. #undef HX_THIS_FILE
  66. static const char HX_THIS_FILE[] = __FILE__;
  67. #endif
  68. #if defined(_OPENWAVE)
  69. HX_DATETIME 
  70. HX_GET_DATETIME(void)
  71. {
  72.     op_tm tm;
  73.     time_t t = op_time();
  74.     HX_DATETIME dt;
  75.     // XXXSAB - localtime?
  76.     op_gmtime(t, &tm);
  77.     dt.second = tm.tm_sec;
  78.     dt.minute = tm.tm_min;
  79.     dt.hour = tm.tm_hour;
  80.     dt.dayofweek = tm.tm_wday;
  81.     dt.dayofmonth = tm.tm_mday;
  82.     dt.dayofyear = tm.tm_yday;
  83.     dt.month = tm.tm_mon + 1; // 0 based (11 = December)
  84.     dt.year = tm.tm_year;
  85.     dt.gmtDelta = 0; // or something
  86.     return dt;
  87. }
  88. #elif (defined(_WINDOWS) || defined(WIN32) || defined(_WIN32) || defined(_WINCE))
  89. HX_DATETIME HX_GET_DATETIME(void)
  90. {
  91. HX_DATETIME datetime;
  92. #ifdef _WINCE
  93. TIME_ZONE_INFORMATION tzinfo;
  94. ::GetTimeZoneInformation(&tzinfo);
  95. #else
  96. // init the timezone data
  97. _tzset();
  98. #endif /* _WINCE */
  99. // Get the local time
  100. time_t lTime;
  101. struct tm* tmDateTime;
  102. time(&lTime);
  103. tmDateTime=localtime(&lTime);
  104. datetime.second = tmDateTime->tm_sec;
  105. datetime.minute = tmDateTime->tm_min;
  106. datetime.hour = tmDateTime->tm_hour;
  107. datetime.dayofweek = tmDateTime->tm_wday;
  108. datetime.dayofmonth = tmDateTime->tm_mday;
  109. datetime.dayofyear = tmDateTime->tm_yday + 1;
  110. datetime.month = tmDateTime->tm_mon + 1;
  111. datetime.year = tmDateTime->tm_year;
  112. #ifdef _WINCE
  113. datetime.gmtDelta = -1 * (tzinfo.Bias / 60);  // minutes to hours
  114. #else
  115. datetime.gmtDelta = -1*(_timezone/3600); //seconds to hours
  116. #endif /* _WINCE */
  117. return datetime;
  118. }
  119. #elif _MACINTOSH
  120. #ifndef _MAC_MACHO
  121. #include <datetimeutils.h>
  122. #endif
  123. HX_DATETIME HX_GET_DATETIME(void)
  124. {
  125. HX_DATETIME datetime;
  126. ULONG32 secs;
  127. LongDateRec ldate;
  128. ::GetDateTime(&secs);
  129. LongDateTime time = secs;
  130. ::LongSecondsToDate(&time, &ldate);
  131. datetime.second = ldate.ld.second;
  132. datetime.minute = ldate.ld.minute;
  133. datetime.hour = ldate.ld.hour;
  134. datetime.dayofweek = ldate.ld.dayOfWeek - 1;
  135. datetime.dayofmonth = ldate.ld.day;
  136. datetime.dayofyear = ldate.ld.dayOfYear;
  137. datetime.month = ldate.ld.month;
  138. datetime.year = ldate.ld.year - HX_YEAR_OFFSET;
  139. // get time zone in seconds
  140. MachineLocation loc;
  141. ::ReadLocation(&loc);
  142. // we need to extend the sign since the gmtDelta is a 3 byte value
  143. long gmtDelta = loc.u.gmtDelta;
  144. long internalGmtDelta = gmtDelta & 0x00FFFFFF;
  145. if(internalGmtDelta & 0x00800000)
  146. {
  147. internalGmtDelta = internalGmtDelta | 0xFF000000;
  148. }
  149. // convert to hours
  150. datetime.gmtDelta = (short)internalGmtDelta/3600; 
  151. return datetime;
  152. }
  153. #elif defined(_UNIX) || defined(_SYMBIAN)
  154. HX_DATETIME 
  155. HX_GET_DATETIME(void)
  156. {
  157.     struct tm* tm;
  158.     time_t t = time(0);
  159.     HX_DATETIME dt;
  160.     tm = localtime(&t);
  161.     dt.second = tm->tm_sec;
  162.     dt.minute = tm->tm_min;
  163.     dt.hour = tm->tm_hour;
  164.     dt.dayofweek = tm->tm_wday;
  165.     dt.dayofmonth = tm->tm_mday;
  166.     dt.dayofyear = tm->tm_yday;
  167.     dt.month = tm->tm_mon + 1; // 0 based (11 = December)
  168.     dt.year = tm->tm_year;
  169.     dt.gmtDelta = 0; // or something
  170.     return dt;
  171. }
  172. // unix code added here
  173. #endif // _WIN32 
  174. //  Returns the number of the month given or -1 on error.
  175. int MonthNo (char * month)
  176. {
  177.     int ret = -1;
  178.     
  179.     if (!strncasecmp(month, "JAN", 3))
  180.         ret = 0;
  181.     else if (!strncasecmp(month, "FEB", 3))
  182.         ret = 1;
  183.     else if (!strncasecmp(month, "MAR", 3))
  184.         ret = 2;
  185.     else if (!strncasecmp(month, "APR", 3))
  186.         ret = 3;
  187.     else if (!strncasecmp(month, "MAY", 3))
  188.         ret = 4;
  189.     else if (!strncasecmp(month, "JUN", 3))
  190.         ret = 5;
  191.     else if (!strncasecmp(month, "JUL", 3))
  192.         ret = 6;
  193.     else if (!strncasecmp(month, "AUG", 3))
  194.         ret = 7;
  195.     else if (!strncasecmp(month, "SEP", 3))
  196.         ret = 8;
  197.     else if (!strncasecmp(month, "OCT", 3))
  198.         ret = 9;
  199.     else if (!strncasecmp(month, "NOV", 3))
  200.         ret = 10;
  201.     else if (!strncasecmp(month, "DEC", 3))
  202.         ret = 11;
  203.     else 
  204.     {
  205.         ret = -1;
  206.     }
  207.     return ret;
  208. }
  209. time_t ParseDate(char *date_string)
  210. {
  211. #ifdef _OPENWAVE
  212.     struct op_tm tm;
  213.     if (op_time_parse_http_date(date_string, &tm))
  214.     {
  215.         return op_timegm(&tm);
  216.     }
  217.     return 0;
  218. #else
  219.     struct  tm time_info;         // Points to static tm structure
  220.     char*   ip = NULL;
  221.     char    mname[256] = {0}; /* Flawfinder: ignore */
  222.     time_t  rv;
  223.     memset(&time_info, 0, sizeof(struct tm));
  224.     // Whatever format we're looking at, it will start with weekday.
  225.     // Skip to first space
  226.     if(!(ip = strchr(date_string,' ')))
  227.     {
  228.         return 0;
  229.     }
  230.     else
  231.     {
  232. while(IS_SPACE(*ip))
  233. {
  234.             ++ip;
  235. }
  236.     }
  237.     /* make sure that the date is less than 256 
  238.      * That will keep mname from ever overflowing 
  239.      */
  240.     if(255 < strlen(ip))
  241.     {
  242. return 0;
  243.     }
  244.     if(isalpha(*ip)) 
  245.     {
  246. // ctime
  247. sscanf(ip, (strstr(ip, "DST") ? "%s %d %d:%d:%d %*s %d"
  248. : "%s %d %d:%d:%d %d"),
  249.    mname,
  250.    &time_info.tm_mday,
  251.    &time_info.tm_hour,
  252.    &time_info.tm_min,
  253.    &time_info.tm_sec,
  254.    &time_info.tm_year);
  255. time_info.tm_year -= 1900;
  256.     }
  257.     else if(ip[2] == '-') 
  258.     {
  259.         // RFC 850 (normal HTTP)
  260.         char t[256] = {0}; /* Flawfinder: ignore */
  261.         sscanf(ip,"%s %d:%d:%d", t,
  262.     &time_info.tm_hour,
  263.     &time_info.tm_min,
  264.     &time_info.tm_sec);
  265.         t[2] = '';
  266.         time_info.tm_mday = atoi(t);
  267.         t[6] = '';
  268.         SafeStrCpy(mname, &t[3], 256);
  269.         time_info.tm_year = atoi(&t[7]);
  270.         // Prevent wraparound from ambiguity
  271.         if(time_info.tm_year < 70)
  272. {
  273.             time_info.tm_year += 100;
  274. }
  275. else if(time_info.tm_year > 1900)
  276. {
  277.     time_info.tm_year -= 1900;
  278. }
  279.     }
  280.     else 
  281.     {
  282.         // RFC 822
  283.         sscanf(ip,"%d %s %d %d:%d:%d",&time_info.tm_mday,
  284.     mname,
  285.     &time_info.tm_year,
  286.     &time_info.tm_hour,
  287.     &time_info.tm_min,
  288.     &time_info.tm_sec);
  289. // since tm_year is years since 1900 and the year we parsed
  290.   // is absolute, we need to subtract 1900 years from it
  291. time_info.tm_year -= 1900;
  292.     }
  293.     time_info.tm_mon = MonthNo(mname);
  294.     if(time_info.tm_mon == -1)
  295.     {
  296. return 0;
  297.     }
  298.     rv = mktime(&time_info);
  299. #ifndef NO_TM_ISDST
  300.     if(time_info.tm_isdst)
  301.     {
  302. rv -= 3600;
  303.     }
  304. #endif /* NO_TM_ISDST */
  305.     if(rv == -1)
  306.     {
  307.         return(0);
  308.     }
  309.     else
  310.     {
  311. return(rv);
  312.     }
  313. #endif /* _OPENWAVE */
  314. }