localrep.c
上传用户:zhongxx05
上传日期:2007-06-06
资源大小:33641k
文件大小:12k
源码类别:

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. // Includes for this file...
  36. #include "hxtypes.h"
  37. #include "hlxclib/stdlib.h"
  38. #include "hlxclib/time.h"
  39. #include "localrep.h"
  40. #if defined(_WINDOWS)
  41. #include "hlxclib/windows.h"
  42. #include <windowsx.h>
  43. #endif
  44. #if defined(_MACINTOSH)
  45. #include <stdio.h>
  46. #include <string.h>
  47. #endif
  48. // For debugging...
  49. //#include "hxassert.h"
  50. #include "hxheap.h"
  51. #ifdef _DEBUG
  52. #undef HX_THIS_FILE
  53. static const char HX_THIS_FILE[] = __FILE__;
  54. #endif
  55. #ifdef _OPENWAVE
  56. #undef WIN32                    /* simulator build... */
  57. #endif
  58. // Local function prototypes...
  59. ULONG32 TranslateLocalTimeStringFlags(ULONG32 flags);
  60. ULONG32 TranslateLocalDateStringFlags(ULONG32 flags);
  61. /*
  62.  * HXGetLocalTimeString
  63.  * --------------------
  64.  * Returns in the buffer the formated string for the time given, or for the local time if the time
  65.  * given is 0.
  66.  */
  67. INT32 HXGetLocalTimeString(char *buffer, INT32 sizeOfBuffer, const char *formatString, ULONG32 flags, time_t time, ULONG32 locale)
  68. {
  69.     // Translate the flags for this system...
  70.     ULONG32 sysflags = TranslateLocalTimeStringFlags(flags);
  71.     INT32 result = 0;
  72. #ifdef WIN32
  73.     // Copy the time into the appropriate format for the routine to use...
  74.     SYSTEMTIME sysTime;
  75.     if (time > 0)
  76.     {
  77. struct tm *tmtime = localtime(&time);
  78. if (tmtime != NULL)
  79. {
  80.     sysTime.wYear = tmtime->tm_year + 1900;
  81.     sysTime.wMonth = tmtime->tm_mon + 1;
  82.     sysTime.wDayOfWeek = tmtime->tm_wday;
  83.     sysTime.wDay = tmtime->tm_mday;
  84.     sysTime.wHour = tmtime->tm_hour;
  85.     sysTime.wMinute = tmtime->tm_min;
  86.     sysTime.wSecond = tmtime->tm_sec;
  87.     sysTime.wMilliseconds = 0;
  88. }
  89.     }
  90.     // Get the time format now...
  91.     result = GetTimeFormat(locale ? locale : LOCALE_SYSTEM_DEFAULT, 
  92.    sysflags, (time > 0)? &sysTime : NULL, 
  93.    OS_STRING(formatString), 
  94.    OS_STRING2(buffer, sizeOfBuffer), 
  95.    sizeOfBuffer);
  96. #endif
  97. #ifdef _MACINTOSH
  98.     if (time > 0)
  99.     {
  100. struct tm *tmtime = localtime(&time);
  101. char format[32]; /* Flawfinder: ignore */
  102. switch (flags)
  103. {
  104.     case HXLOCALTIMESTRING_24HOURFORMAT:
  105.     {
  106.         strcpy(format, "%H:%M"); /* Flawfinder: ignore */
  107.     }
  108.     break;
  109.     case HXLOCALTIMESTRING_NOMINUTESORSECONDS:
  110.     {
  111.      sprintf(format, "%d", (((tmtime->tm_hour == 0) || (tmtime->tm_hour - 12 == 0))? 12 : ((tmtime->tm_hour > 12)? tmtime->tm_hour - 12 : tmtime->tm_hour))); /* Flawfinder: ignore */
  112.      strcat(format, " %p"); /* Flawfinder: ignore */
  113.     }
  114.     break;
  115.     case HXLOCALTIMESTRING_NOSECONDS:
  116.     default:
  117.     {
  118.      sprintf(format, "%d", (((tmtime->tm_hour == 0) || (tmtime->tm_hour - 12 == 0))? 12 : ((tmtime->tm_hour > 12)? tmtime->tm_hour - 12 : tmtime->tm_hour))); /* Flawfinder: ignore */
  119.      strcat(format, ":%M %p"); /* Flawfinder: ignore */
  120.     }
  121.     break;
  122. }
  123. strftime(buffer, sizeOfBuffer, format, tmtime);
  124.     }
  125. #endif
  126.     return result;
  127. }
  128. #ifdef _WIN32
  129. // Global string for formate date....
  130. char gFormatString[255]; /* Flawfinder: ignore */
  131. #endif
  132. #ifdef WIN32
  133. // Counts the number of instances of the given letter in a string...
  134. INT32 CountChar(char *str, char find)
  135. {
  136.     int count, i;
  137.     i = 0;
  138.     count = 0;
  139.     if (str == NULL) return 0;
  140.     while (TRUE)
  141.     {
  142. if (str[i] == '') break;
  143. if (find == str[i++]) count++;
  144.     }
  145.     return count;
  146. }
  147. // This routine will return the shortest date string format for the
  148. // default system default into the global gFormatString buffer.
  149. BOOL CALLBACK EnumDateFormatsCallBack(LPTSTR formatString)
  150. {
  151.     // Make some assumptions....
  152.     //HX_ASSERT(gFormatString != NULL);
  153.     strncpy(gFormatString, formatString, 254); /* Flawfinder: ignore */
  154.     gFormatString[254] = '';
  155.     // If the format string has two digits for year, return false right away...
  156.     if ((CountChar(gFormatString, 'y') == 2) && (CountChar(gFormatString, 'M') == 1) && (CountChar(gFormatString, 'd') == 1)) return FALSE;
  157.     return TRUE;
  158. }
  159. #endif // WIN32
  160. /*
  161.  * HXGetLocalDataFormatString
  162.  * --------------------------
  163.  * Returns a format string for the local machine.  This function needs to be expanded at some point...right now it will only return a short format.
  164.  *
  165.  * input:
  166.  * char *buffer - Buffer.
  167.  * INT32 length - Size of buffer.
  168.  *
  169.  */
  170. void HXGetLocalDateFormatString(char *buffer, INT32 length)
  171. {
  172. #ifdef WIN32
  173.     // Create a new format string globally...
  174.     *gFormatString = '';
  175.     EnumDateFormats((DATEFMT_ENUMPROC)EnumDateFormatsCallBack, LOCALE_SYSTEM_DEFAULT, DATE_SHORTDATE);
  176.     // Save the global string onto the buffer and release the global's memory...
  177.     strncpy(buffer, gFormatString, length); /* Flawfinder: ignore */
  178.     buffer[length-1] = '';
  179.     *gFormatString = '';
  180. #else
  181. //HX_ASSERT(!"HXGetLocalDateFormatString is not defined for this platform.");
  182. #endif
  183. }
  184. /*
  185.  * HXGetLocalDateString
  186.  * --------------------
  187.  * Returns in the buffer the formated string for the date given, or for the current date if the date 
  188.  * given is 0.
  189.  */
  190. INT32 HXGetLocalDateString(char *buffer, INT32 sizeOfBuffer, const char *formatString, ULONG32 flags, time_t time, ULONG32 locale)
  191. {
  192.     // Translate the flags for this system...
  193.     ULONG32 sysflags = TranslateLocalDateStringFlags(flags);
  194.     INT32 result = 0;
  195. #ifdef WIN32
  196.     char tempFormatString[256]; /* Flawfinder: ignore */
  197.     // Copy the time into the appropriate format for the routine to use...
  198.     SYSTEMTIME sysTime;
  199.     if (time > 0)
  200.     {
  201. struct tm *tmtime = localtime(&time);
  202. if (tmtime != NULL)
  203. {
  204.     sysTime.wYear = tmtime->tm_year + 1900;
  205.     sysTime.wMonth = tmtime->tm_mon + 1;
  206.     sysTime.wDayOfWeek = tmtime->tm_wday;
  207.     sysTime.wDay = tmtime->tm_mday;
  208.     sysTime.wHour = tmtime->tm_hour;
  209.     sysTime.wMinute = tmtime->tm_min;
  210.     sysTime.wSecond = tmtime->tm_sec;
  211.     sysTime.wMilliseconds = 0;
  212. }
  213.     }
  214.     if (formatString == NULL) HXGetLocalDateFormatString(tempFormatString, 255); 
  215.     // Get the time format now...
  216.     result = GetDateFormat( locale ? locale : LOCALE_SYSTEM_DEFAULT, 
  217.     sysflags, 
  218.     (time > 0)? &sysTime : NULL, 
  219.     (formatString)? formatString : tempFormatString, 
  220.     buffer, 
  221.     sizeOfBuffer);
  222. #endif
  223. #ifdef _MACINTOSH
  224.     if (time >  0)
  225.     {
  226. struct tm *tmtime = localtime(&time);
  227. char format[32];/* Flawfinder: ignore */
  228. switch (flags)
  229. {
  230.     case HXLOCALDATESTRING_SHORTDATE:
  231.         strcpy(format, "%x"); /* Flawfinder: ignore */ // 10 Aug, 1999
  232.      break;
  233.     case HXLOCALDATESTRING_LONGDATE:
  234.      strcpy(format, "%B %d, %Y"); /* Flawfinder: ignore */ // August 10, 1999
  235.      break;
  236.     case HXLOCALDATESTRING_DEFAULT:
  237.     default:
  238.      strcpy(format, "%m/%d"); /* Flawfinder: ignore */ // 10/8
  239.      break;
  240. }
  241. strftime(buffer, sizeOfBuffer, format, tmtime);
  242.     }
  243. #endif
  244.     return result;
  245. }
  246. /*
  247.  * TranslateLocalTimeStringFlags
  248.  * -----------------------------
  249.  * Translage the flags to their system specific counterparts.
  250.  *
  251.  * input:
  252.  * ULONG32 flags - Flags to translate.
  253.  *
  254.  * output:
  255.  * ULONG32 - Resultant flags, maybe system specific.
  256.  *
  257.  */
  258. ULONG32 TranslateLocalTimeStringFlags(ULONG32 flags)
  259. {
  260. #ifdef WIN32
  261.     ULONG32 systemSpecificFlags = 0;
  262. #else
  263.     ULONG32 systemSpecificFlags = flags;
  264. #endif
  265.     if (flags & HXLOCALTIMESTRING_NOSECONDS)
  266.     {
  267. #ifdef WIN32
  268. systemSpecificFlags |= TIME_NOSECONDS;
  269. #endif
  270.     }
  271.     if (flags & HXLOCALTIMESTRING_NOMINUTESORSECONDS)
  272.     {
  273. #ifdef WIN32
  274. systemSpecificFlags |= TIME_NOMINUTESORSECONDS;
  275. #endif
  276.     }
  277.     if (flags & HXLOCALTIMESTRING_NOTIMEMARKER)
  278.     {
  279. #ifdef WIN32
  280. systemSpecificFlags |= TIME_NOTIMEMARKER;
  281. #endif
  282.     }
  283.     if (flags & HXLOCALTIMESTRING_24HOURFORMAT)
  284.     {
  285. #ifdef WIN32
  286. systemSpecificFlags |= TIME_FORCE24HOURFORMAT;
  287. #endif
  288.     }
  289.     if (flags == HXLOCALTIMESTRING_DEFAULT)
  290.     {
  291. #ifdef WIN32
  292. systemSpecificFlags = 0;
  293. #endif
  294.     }
  295.     return systemSpecificFlags;
  296. }
  297. /*
  298.  * TranslateLocalDateStringFlags
  299.  * -----------------------------
  300.  * Translage the flags to their system specific counterparts.
  301.  *
  302.  * input:
  303.  * ULONG32 flags - Flags to translate.
  304.  *
  305.  * output:
  306.  * ULONG32 - Resultant flags, maybe system specific.
  307.  *
  308.  */
  309. ULONG32 TranslateLocalDateStringFlags(ULONG32 flags)
  310. {
  311. #ifdef WIN32
  312.     ULONG32 systemSpecificFlags = 0;
  313. #else
  314.     ULONG32 systemSpecificFlags = flags;
  315. #endif
  316.     if (flags & HXLOCALDATESTRING_SHORTDATE)
  317.     {
  318. #ifdef WIN32
  319. systemSpecificFlags = DATE_SHORTDATE;
  320. #endif 
  321.     }
  322.     if (flags & HXLOCALDATESTRING_LONGDATE) 
  323.     {
  324. #ifdef WIN32
  325. systemSpecificFlags = DATE_LONGDATE;
  326. #endif 
  327.     }
  328.     if (flags == HXLOCALDATESTRING_DEFAULT)
  329.     {
  330. #ifdef WIN32
  331. systemSpecificFlags = 0;
  332. #endif 
  333.     }
  334.     return systemSpecificFlags;
  335. }
  336. /*
  337.  * HXGetLocalDecimalPoint
  338.  * --------------------
  339.  * Returns decimal point representation in the locale selected.
  340.  *
  341.  * input:
  342.  * ULONG32 locale - Optional locale id, if not included, the default system locale will be used.
  343.  *
  344.  * output:
  345.  * char - Decimal point representation.  
  346.  * 
  347.  */
  348. char HXGetLocalDecimalPoint(ULONG32 locale)
  349. {
  350.         char result = '.';
  351. #ifdef WIN32
  352. char buffer[3]; /* Flawfinder: ignore */
  353. if(GetLocaleInfo(locale ? locale : LOCALE_SYSTEM_DEFAULT, LOCALE_SDECIMAL, buffer, 2) > 1)
  354.     result = buffer[0];
  355. #elif defined(_MACINTOSH)
  356. {
  357. Intl0Hndl intlHandle;
  358. check(locale == 0);
  359. intlHandle = (Intl0Hndl) GetIntlResource(0);
  360. if (intlHandle)
  361. {
  362. result = (**intlHandle).decimalPt;
  363. }
  364. }
  365. #endif 
  366. return result;
  367. }
  368. /*
  369.  * HXGetLocalTimeSeparator
  370.  * --------------------
  371.  * Returns time separator representation in the locale selected.
  372.  *
  373.  * input:
  374.  * ULONG32 locale - Optional locale id, if not included, the default system locale will be used.
  375.  *
  376.  * output:
  377.  * char - Time separator representation.  
  378.  * 
  379.  */
  380. char HXGetLocalTimeSeparator(ULONG32 locale)
  381. {
  382.         char result = ':';
  383. #if defined(_MACINTOSH)
  384. {
  385. Intl0Hndl intlHandle;
  386. check(locale == 0);
  387. intlHandle = (Intl0Hndl) GetIntlResource(0);
  388. if (intlHandle)
  389. {
  390. result = (**intlHandle).timeSep;
  391. }
  392. }
  393. #endif
  394. #ifdef WIN32
  395. char buffer[3]; /* Flawfinder: ignore */
  396. if(GetLocaleInfo(locale ? locale : LOCALE_SYSTEM_DEFAULT, LOCALE_SDECIMAL, buffer, 2) > 1)
  397.     result = buffer[0];
  398. #endif 
  399. return result;
  400. }