localrep.c
上传用户:dangjiwu
上传日期:2013-07-19
资源大小:42019k
文件大小:13k
源码类别:

Symbian

开发平台:

Visual C++

  1. /* ***** BEGIN LICENSE BLOCK *****
  2.  * Source last modified: $Id: localrep.c,v 1.9.32.3 2004/07/09 01:48:16 hubbe Exp $
  3.  * 
  4.  * Portions Copyright (c) 1995-2004 RealNetworks, Inc. All Rights Reserved.
  5.  * 
  6.  * The contents of this file, and the files included with this file,
  7.  * are subject to the current version of the RealNetworks Public
  8.  * Source License (the "RPSL") available at
  9.  * http://www.helixcommunity.org/content/rpsl unless you have licensed
  10.  * the file under the current version of the RealNetworks Community
  11.  * Source License (the "RCSL") available at
  12.  * http://www.helixcommunity.org/content/rcsl, in which case the RCSL
  13.  * will apply. You may also obtain the license terms directly from
  14.  * RealNetworks.  You may not use this file except in compliance with
  15.  * the RPSL or, if you have a valid RCSL with RealNetworks applicable
  16.  * to this file, the RCSL.  Please see the applicable RPSL or RCSL for
  17.  * the rights, obligations and limitations governing use of the
  18.  * contents of the file.
  19.  * 
  20.  * Alternatively, the contents of this file may be used under the
  21.  * terms of the GNU General Public License Version 2 or later (the
  22.  * "GPL") in which case the provisions of the GPL are applicable
  23.  * instead of those above. If you wish to allow use of your version of
  24.  * this file only under the terms of the GPL, and not to allow others
  25.  * to use your version of this file under the terms of either the RPSL
  26.  * or RCSL, indicate your decision by deleting the provisions above
  27.  * and replace them with the notice and other provisions required by
  28.  * the GPL. If you do not delete the provisions above, a recipient may
  29.  * use your version of this file under the terms of any one of the
  30.  * RPSL, the RCSL or the GPL.
  31.  * 
  32.  * This file is part of the Helix DNA Technology. RealNetworks is the
  33.  * developer of the Original Code and owns the copyrights in the
  34.  * portions it created.
  35.  * 
  36.  * This file, and the files included with this file, is distributed
  37.  * and made available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY
  38.  * KIND, EITHER EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS
  39.  * ALL SUCH WARRANTIES, INCLUDING WITHOUT LIMITATION, ANY WARRANTIES
  40.  * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, QUIET
  41.  * ENJOYMENT OR NON-INFRINGEMENT.
  42.  * 
  43.  * Technology Compatibility Kit Test Suite(s) Location:
  44.  *    http://www.helixcommunity.org/content/tck
  45.  * 
  46.  * Contributor(s):
  47.  * 
  48.  * ***** END LICENSE BLOCK ***** */
  49. // Includes for this file...
  50. #include "hxtypes.h"
  51. #include "hlxclib/stdlib.h"
  52. #include "hlxclib/time.h"
  53. #include "localrep.h"
  54. #if defined(_WINDOWS)
  55. #include "hlxclib/windows.h"
  56. #include <windowsx.h>
  57. #endif
  58. #if defined(_MACINTOSH)
  59. #include <stdio.h>
  60. #include <string.h>
  61. #endif
  62. // For debugging...
  63. //#include "hxassert.h"
  64. #include "hxheap.h"
  65. #ifdef _DEBUG
  66. #undef HX_THIS_FILE
  67. static const char HX_THIS_FILE[] = __FILE__;
  68. #endif
  69. #ifdef _OPENWAVE
  70. #undef WIN32                    /* simulator build... */
  71. #endif
  72. // Local function prototypes...
  73. ULONG32 TranslateLocalTimeStringFlags(ULONG32 flags);
  74. ULONG32 TranslateLocalDateStringFlags(ULONG32 flags);
  75. /*
  76.  * HXGetLocalTimeString
  77.  * --------------------
  78.  * Returns in the buffer the formated string for the time given, or for the local time if the time
  79.  * given is 0.
  80.  */
  81. INT32 HXGetLocalTimeString(char *buffer, INT32 sizeOfBuffer, const char *formatString, ULONG32 flags, time_t time, ULONG32 locale)
  82. {
  83.     // Translate the flags for this system...
  84.     ULONG32 sysflags = TranslateLocalTimeStringFlags(flags);
  85.     INT32 result = 0;
  86. #ifdef WIN32
  87.     // Copy the time into the appropriate format for the routine to use...
  88.     SYSTEMTIME sysTime;
  89.     if (time > 0)
  90.     {
  91. struct tm *tmtime = localtime(&time);
  92. if (tmtime != NULL)
  93. {
  94.     sysTime.wYear = tmtime->tm_year + 1900;
  95.     sysTime.wMonth = tmtime->tm_mon + 1;
  96.     sysTime.wDayOfWeek = tmtime->tm_wday;
  97.     sysTime.wDay = tmtime->tm_mday;
  98.     sysTime.wHour = tmtime->tm_hour;
  99.     sysTime.wMinute = tmtime->tm_min;
  100.     sysTime.wSecond = tmtime->tm_sec;
  101.     sysTime.wMilliseconds = 0;
  102. }
  103.     }
  104.     // Get the time format now...
  105.     result = GetTimeFormat(locale ? locale : LOCALE_SYSTEM_DEFAULT, 
  106.    sysflags, (time > 0)? &sysTime : NULL, 
  107.    OS_STRING(formatString), 
  108.    OS_STRING2(buffer, sizeOfBuffer), 
  109.    sizeOfBuffer);
  110. #endif
  111. #ifdef _MACINTOSH
  112.     if (time > 0)
  113.     {
  114. struct tm *tmtime = localtime(&time);
  115. char format[32]; /* Flawfinder: ignore */
  116. switch (flags)
  117. {
  118.     case HXLOCALTIMESTRING_24HOURFORMAT:
  119.     {
  120.         strcpy(format, "%H:%M"); /* Flawfinder: ignore */
  121.     }
  122.     break;
  123.     case HXLOCALTIMESTRING_NOMINUTESORSECONDS:
  124.     {
  125.      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 */
  126.      strcat(format, " %p"); /* Flawfinder: ignore */
  127.     }
  128.     break;
  129.     case HXLOCALTIMESTRING_NOSECONDS:
  130.     default:
  131.     {
  132.      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 */
  133.      strcat(format, ":%M %p"); /* Flawfinder: ignore */
  134.     }
  135.     break;
  136. }
  137. strftime(buffer, sizeOfBuffer, format, tmtime);
  138.     }
  139. #endif
  140.     return result;
  141. }
  142. #ifdef _WIN32
  143. // Global string for formate date....
  144. char gFormatString[255]; /* Flawfinder: ignore */
  145. #endif
  146. #ifdef WIN32
  147. // Counts the number of instances of the given letter in a string...
  148. INT32 CountChar(char *str, char find)
  149. {
  150.     int count, i;
  151.     i = 0;
  152.     count = 0;
  153.     if (str == NULL) return 0;
  154.     while (TRUE)
  155.     {
  156. if (str[i] == '') break;
  157. if (find == str[i++]) count++;
  158.     }
  159.     return count;
  160. }
  161. // This routine will return the shortest date string format for the
  162. // default system default into the global gFormatString buffer.
  163. BOOL CALLBACK EnumDateFormatsCallBack(LPTSTR formatString)
  164. {
  165.     // Make some assumptions....
  166.     //HX_ASSERT(gFormatString != NULL);
  167.     strncpy(gFormatString, formatString, 254); /* Flawfinder: ignore */
  168.     gFormatString[254] = '';
  169.     // If the format string has two digits for year, return false right away...
  170.     if ((CountChar(gFormatString, 'y') == 2) && (CountChar(gFormatString, 'M') == 1) && (CountChar(gFormatString, 'd') == 1)) return FALSE;
  171.     return TRUE;
  172. }
  173. #endif // WIN32
  174. /*
  175.  * HXGetLocalDataFormatString
  176.  * --------------------------
  177.  * 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.
  178.  *
  179.  * input:
  180.  * char *buffer - Buffer.
  181.  * INT32 length - Size of buffer.
  182.  *
  183.  */
  184. void HXGetLocalDateFormatString(char *buffer, INT32 length)
  185. {
  186. #ifdef WIN32
  187.     // Create a new format string globally...
  188.     *gFormatString = '';
  189.     EnumDateFormats((DATEFMT_ENUMPROC)EnumDateFormatsCallBack, LOCALE_SYSTEM_DEFAULT, DATE_SHORTDATE);
  190.     // Save the global string onto the buffer and release the global's memory...
  191.     strncpy(buffer, gFormatString, length); /* Flawfinder: ignore */
  192.     buffer[length-1] = '';
  193.     *gFormatString = '';
  194. #else
  195. //HX_ASSERT(!"HXGetLocalDateFormatString is not defined for this platform.");
  196. #endif
  197. }
  198. /*
  199.  * HXGetLocalDateString
  200.  * --------------------
  201.  * Returns in the buffer the formated string for the date given, or for the current date if the date 
  202.  * given is 0.
  203.  */
  204. INT32 HXGetLocalDateString(char *buffer, INT32 sizeOfBuffer, const char *formatString, ULONG32 flags, time_t time, ULONG32 locale)
  205. {
  206.     // Translate the flags for this system...
  207.     ULONG32 sysflags = TranslateLocalDateStringFlags(flags);
  208.     INT32 result = 0;
  209. #ifdef WIN32
  210.     char tempFormatString[256]; /* Flawfinder: ignore */
  211.     // Copy the time into the appropriate format for the routine to use...
  212.     SYSTEMTIME sysTime;
  213.     if (time > 0)
  214.     {
  215. struct tm *tmtime = localtime(&time);
  216. if (tmtime != NULL)
  217. {
  218.     sysTime.wYear = tmtime->tm_year + 1900;
  219.     sysTime.wMonth = tmtime->tm_mon + 1;
  220.     sysTime.wDayOfWeek = tmtime->tm_wday;
  221.     sysTime.wDay = tmtime->tm_mday;
  222.     sysTime.wHour = tmtime->tm_hour;
  223.     sysTime.wMinute = tmtime->tm_min;
  224.     sysTime.wSecond = tmtime->tm_sec;
  225.     sysTime.wMilliseconds = 0;
  226. }
  227.     }
  228.     if (formatString == NULL) HXGetLocalDateFormatString(tempFormatString, 255); 
  229.     // Get the time format now...
  230.     result = GetDateFormat( locale ? locale : LOCALE_SYSTEM_DEFAULT, 
  231.     sysflags, 
  232.     (time > 0)? &sysTime : NULL, 
  233.     (formatString)? formatString : tempFormatString, 
  234.     buffer, 
  235.     sizeOfBuffer);
  236. #endif
  237. #ifdef _MACINTOSH
  238.     if (time >  0)
  239.     {
  240. struct tm *tmtime = localtime(&time);
  241. char format[32];/* Flawfinder: ignore */
  242. switch (flags)
  243. {
  244.     case HXLOCALDATESTRING_SHORTDATE:
  245.         strcpy(format, "%x"); /* Flawfinder: ignore */ // 10 Aug, 1999
  246.      break;
  247.     case HXLOCALDATESTRING_LONGDATE:
  248.      strcpy(format, "%B %d, %Y"); /* Flawfinder: ignore */ // August 10, 1999
  249.      break;
  250.     case HXLOCALDATESTRING_DEFAULT:
  251.     default:
  252.      strcpy(format, "%m/%d"); /* Flawfinder: ignore */ // 10/8
  253.      break;
  254. }
  255. strftime(buffer, sizeOfBuffer, format, tmtime);
  256.     }
  257. #endif
  258.     return result;
  259. }
  260. /*
  261.  * TranslateLocalTimeStringFlags
  262.  * -----------------------------
  263.  * Translage the flags to their system specific counterparts.
  264.  *
  265.  * input:
  266.  * ULONG32 flags - Flags to translate.
  267.  *
  268.  * output:
  269.  * ULONG32 - Resultant flags, maybe system specific.
  270.  *
  271.  */
  272. ULONG32 TranslateLocalTimeStringFlags(ULONG32 flags)
  273. {
  274. #ifdef WIN32
  275.     ULONG32 systemSpecificFlags = 0;
  276. #else
  277.     ULONG32 systemSpecificFlags = flags;
  278. #endif
  279.     if (flags & HXLOCALTIMESTRING_NOSECONDS)
  280.     {
  281. #ifdef WIN32
  282. systemSpecificFlags |= TIME_NOSECONDS;
  283. #endif
  284.     }
  285.     if (flags & HXLOCALTIMESTRING_NOMINUTESORSECONDS)
  286.     {
  287. #ifdef WIN32
  288. systemSpecificFlags |= TIME_NOMINUTESORSECONDS;
  289. #endif
  290.     }
  291.     if (flags & HXLOCALTIMESTRING_NOTIMEMARKER)
  292.     {
  293. #ifdef WIN32
  294. systemSpecificFlags |= TIME_NOTIMEMARKER;
  295. #endif
  296.     }
  297.     if (flags & HXLOCALTIMESTRING_24HOURFORMAT)
  298.     {
  299. #ifdef WIN32
  300. systemSpecificFlags |= TIME_FORCE24HOURFORMAT;
  301. #endif
  302.     }
  303.     if (flags == HXLOCALTIMESTRING_DEFAULT)
  304.     {
  305. #ifdef WIN32
  306. systemSpecificFlags = 0;
  307. #endif
  308.     }
  309.     return systemSpecificFlags;
  310. }
  311. /*
  312.  * TranslateLocalDateStringFlags
  313.  * -----------------------------
  314.  * Translage the flags to their system specific counterparts.
  315.  *
  316.  * input:
  317.  * ULONG32 flags - Flags to translate.
  318.  *
  319.  * output:
  320.  * ULONG32 - Resultant flags, maybe system specific.
  321.  *
  322.  */
  323. ULONG32 TranslateLocalDateStringFlags(ULONG32 flags)
  324. {
  325. #ifdef WIN32
  326.     ULONG32 systemSpecificFlags = 0;
  327. #else
  328.     ULONG32 systemSpecificFlags = flags;
  329. #endif
  330.     if (flags & HXLOCALDATESTRING_SHORTDATE)
  331.     {
  332. #ifdef WIN32
  333. systemSpecificFlags = DATE_SHORTDATE;
  334. #endif 
  335.     }
  336.     if (flags & HXLOCALDATESTRING_LONGDATE) 
  337.     {
  338. #ifdef WIN32
  339. systemSpecificFlags = DATE_LONGDATE;
  340. #endif 
  341.     }
  342.     if (flags == HXLOCALDATESTRING_DEFAULT)
  343.     {
  344. #ifdef WIN32
  345. systemSpecificFlags = 0;
  346. #endif 
  347.     }
  348.     return systemSpecificFlags;
  349. }
  350. /*
  351.  * HXGetLocalDecimalPoint
  352.  * --------------------
  353.  * Returns decimal point representation in the locale selected.
  354.  *
  355.  * input:
  356.  * ULONG32 locale - Optional locale id, if not included, the default system locale will be used.
  357.  *
  358.  * output:
  359.  * char - Decimal point representation.  
  360.  * 
  361.  */
  362. char HXGetLocalDecimalPoint(ULONG32 locale)
  363. {
  364.         char result = '.';
  365. #ifdef WIN32
  366. char buffer[3]; /* Flawfinder: ignore */
  367. if(GetLocaleInfo(locale ? locale : LOCALE_SYSTEM_DEFAULT, LOCALE_SDECIMAL, buffer, 2) > 1)
  368.     result = buffer[0];
  369. #elif defined(_MACINTOSH)
  370. {
  371. Intl0Hndl intlHandle;
  372. check(locale == 0);
  373. intlHandle = (Intl0Hndl) GetIntlResource(0);
  374. if (intlHandle)
  375. {
  376. result = (**intlHandle).decimalPt;
  377. }
  378. }
  379. #endif 
  380. return result;
  381. }
  382. /*
  383.  * HXGetLocalTimeSeparator
  384.  * --------------------
  385.  * Returns time separator representation in the locale selected.
  386.  *
  387.  * input:
  388.  * ULONG32 locale - Optional locale id, if not included, the default system locale will be used.
  389.  *
  390.  * output:
  391.  * char - Time separator representation.  
  392.  * 
  393.  */
  394. char HXGetLocalTimeSeparator(ULONG32 locale)
  395. {
  396.         char result = ':';
  397. #if defined(_MACINTOSH)
  398. {
  399. Intl0Hndl intlHandle;
  400. check(locale == 0);
  401. intlHandle = (Intl0Hndl) GetIntlResource(0);
  402. if (intlHandle)
  403. {
  404. result = (**intlHandle).timeSep;
  405. }
  406. }
  407. #endif
  408. #ifdef WIN32
  409. char buffer[3]; /* Flawfinder: ignore */
  410. if(GetLocaleInfo(locale ? locale : LOCALE_SYSTEM_DEFAULT, LOCALE_SDECIMAL, buffer, 2) > 1)
  411.     result = buffer[0];
  412. #endif 
  413. return result;
  414. }