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

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 "safestring.h"
  36. #include "hlxclib/stdlib.h"
  37. #include "hxtypes.h"
  38. #include "hxstring.h"
  39. #include "hxtime.h"
  40. #include "nptime.h"
  41. #ifdef _DEBUG
  42. #undef HX_THIS_FILE
  43. static const char HX_THIS_FILE[] = __FILE__;
  44. #endif
  45. const INT32 USECS_PER_SEC = 1000000;
  46. NPTime::NPTime()
  47. {
  48.     // default to now
  49.     HXTime now;
  50.     gettimeofday(&now, 0);
  51.     m_lSecond = now.tv_sec;
  52.     m_lMicroSecond = now.tv_usec; 
  53. }
  54. NPTime::NPTime(INT32 sec, INT32 uSec):
  55.     m_lSecond(sec),
  56.     m_lMicroSecond(uSec)
  57. {
  58. }
  59. NPTime::NPTime(INT32 mSec)
  60. {
  61.     fromMSec(mSec);
  62. }
  63. NPTime::NPTime(const char* pTimeString)
  64. {
  65.     fromString(pTimeString);
  66. }
  67. NPTime::NPTime(const char* pTimeString, BOOL bAllow_h_min_s_ms_units,
  68.        BOOL& bSucceeded)
  69. {
  70.     bSucceeded = TRUE;
  71.     if (!pTimeString)
  72.     {
  73. bSucceeded = FALSE;
  74.     }
  75.     else if(strchr(pTimeString, ':'))
  76.     {
  77. fromString(pTimeString);
  78.     }
  79.     // /Make sure it starts with a number:
  80.     else if ('.' == *pTimeString  ||
  81.     ('0' <= *pTimeString  &&  '9' >= *pTimeString))
  82.     {
  83. // /Try h|min|s|ms, e.g., "23min" or "55s", where "s" is the default
  84. // if there is nothing after the number:
  85. m_lSecond = m_lMicroSecond = 0;
  86. char* pEndPtr = 0;
  87. double dVal = strtod(pTimeString, &pEndPtr);
  88. UINT32 ulTimeValue = 0;
  89. // /NOTE: default is seconds, so "23s" and "23" are the same:
  90. if (!strlen(pEndPtr))
  91. {
  92.     ulTimeValue = (UINT32)(dVal * 1000.0);
  93. }
  94. else if (bAllow_h_min_s_ms_units)
  95. {
  96.     if(strcmp(pEndPtr, "h") == 0)
  97.     {
  98. ulTimeValue = (UINT32)(dVal * 60.0 * 60.0 * 1000.0);
  99.     }
  100.     else if(strcmp(pEndPtr, "min") == 0)
  101.     {
  102. ulTimeValue = (UINT32)(dVal * 60.0 * 1000.0);
  103.     }
  104.     else if(strcmp(pEndPtr, "s") == 0)
  105.     {
  106. ulTimeValue = (UINT32)(dVal * 1000.0);
  107.     }
  108.     else if(strcmp(pEndPtr, "ms") == 0)
  109.     {
  110. ulTimeValue = (UINT32)(dVal);
  111.     }
  112.     // /else something other than "h", "min", "s", "ms", or ""
  113.     // was specified:
  114.     else
  115.     {
  116. bSucceeded = FALSE;
  117.     }
  118. }
  119. if (bSucceeded)
  120. {
  121.     m_lSecond = ulTimeValue / 1000;
  122.     m_lMicroSecond = (ulTimeValue % 1000) * 1000;
  123. }
  124.     }
  125.     else
  126.     {
  127. bSucceeded = FALSE;
  128.     }
  129. }
  130. NPTime::NPTime(const NPTime& lhs)
  131. {
  132.     m_lSecond = lhs.m_lSecond;
  133.     m_lMicroSecond = lhs.m_lMicroSecond;
  134. }
  135. NPTime&
  136. NPTime::operator=(const NPTime& lhs)
  137. {
  138.     m_lSecond = lhs.m_lSecond;
  139.     m_lMicroSecond = lhs.m_lMicroSecond;
  140.     return *this;
  141. }
  142. void
  143. NPTime::normalize()
  144. {
  145.     while(m_lMicroSecond < 0)
  146.     {
  147. m_lSecond--;
  148. m_lMicroSecond += USECS_PER_SEC;
  149.     }
  150.     while(m_lMicroSecond >= USECS_PER_SEC)
  151.     {
  152. m_lSecond++;
  153. m_lMicroSecond -= USECS_PER_SEC;
  154.     }
  155. }
  156. INT32
  157. NPTime::compare(const NPTime& lhs) const
  158. {
  159.     // I'm sure there's a better way to do this...
  160.     if(m_lSecond > lhs.m_lSecond)
  161.     {
  162. return 1;
  163.     }
  164.     else if(m_lSecond == lhs.m_lSecond)
  165.     {
  166. return m_lMicroSecond - lhs.m_lMicroSecond;
  167.     }
  168.     return -1;
  169. }
  170. INT32
  171. NPTime::toMSec()
  172. {
  173.     // no checking for overflow
  174.     return (m_lSecond * 1000) + (m_lMicroSecond / 1000);
  175. }
  176. void
  177. NPTime::fromMSec(INT32 mSec)
  178. {
  179.     m_lSecond = mSec / 1000;
  180.     m_lMicroSecond = (mSec % 1000) * 1000;
  181.     normalize();
  182. }
  183. const char*
  184. NPTime::toString()
  185. {
  186.     char strBuf[80]; /* Flawfinder: ignore */
  187.     if(m_lMicroSecond > 0)
  188.     {
  189.         HX_ASSERT(m_lMicroSecond < USECS_PER_SEC);
  190.         SafeSprintf(strBuf, sizeof(strBuf), "%ld.%06d", m_lSecond, m_lMicroSecond);
  191.     }
  192.     else
  193.     {
  194. SafeSprintf(strBuf, sizeof(strBuf), "%ld", m_lSecond);
  195.     }
  196.     m_asString = strBuf;
  197.     return m_asString;
  198. }
  199. void
  200. NPTime::fromString(const char* pTimeString)
  201. {
  202.     // format is [dd:[hh:[mm:]]]ssss[.uuuuu]
  203.     double placeholder[4];
  204.     char* pTmp = new char[strlen(pTimeString)+1];
  205.     strcpy(pTmp, pTimeString); /* Flawfinder: ignore */
  206.     char* pTok = strtok(pTmp, ":");
  207.     int idx = 0;
  208.     if (!pTok)
  209.     {
  210. m_lSecond = 0;
  211. m_lMicroSecond = 0;
  212.     }
  213.     
  214.     while (pTok && (idx < 4))
  215.     {
  216. placeholder[idx++] = strtod(pTok, 0);
  217. pTok = strtok(NULL, ":");
  218.     }
  219.     if (pTok != NULL)
  220.     {
  221. m_lSecond = 0;
  222. m_lMicroSecond = 0;
  223.     }
  224.     else if (idx == 1)
  225.     {
  226. m_lSecond = (UINT32)placeholder[0];
  227. m_lMicroSecond = (UINT32)((placeholder[0] - (double)m_lSecond) *
  228.     USECS_PER_SEC);
  229.     }
  230.     else if (idx == 2)
  231.     {
  232. m_lSecond = (UINT32)placeholder[1];
  233. m_lMicroSecond = (UINT32)((placeholder[1] - (double)m_lSecond) *
  234.     USECS_PER_SEC);
  235. m_lSecond += (UINT32)(placeholder[0] * 60.0);
  236.     }
  237.     else if (idx == 3)
  238.     {
  239. m_lSecond = (UINT32)placeholder[2];
  240. m_lMicroSecond = (UINT32)((placeholder[2] - (double)m_lSecond) *
  241.     USECS_PER_SEC);
  242. m_lSecond += (UINT32)(placeholder[1] * 60.0);
  243. m_lSecond += (UINT32)(placeholder[0] * (60.0 * 60.0));
  244.     }
  245.     else if (idx == 4)
  246.     {
  247. m_lSecond = (UINT32)placeholder[3];
  248. m_lMicroSecond = (UINT32)((placeholder[3] - (double)m_lSecond) *
  249.     USECS_PER_SEC);
  250. m_lSecond += (UINT32)(placeholder[2] * 60.0);
  251. m_lSecond += (UINT32)(placeholder[1] * (60.0 * 60.0));
  252. m_lSecond += (UINT32)(placeholder[0] * ((60.0 * 60.0) * 24.0));
  253.     }
  254.     delete[] pTmp;
  255.     normalize();
  256. }
  257. NPTime::operator const char*()
  258. {
  259.     return toString();
  260. }
  261. NPTime::operator UINT32()
  262. {
  263.     return toMSec();
  264. }
  265. NPTime&
  266. NPTime::operator+=(const NPTime& lhs)
  267. {
  268.     m_lSecond += lhs.m_lSecond;
  269.     m_lMicroSecond += lhs.m_lSecond;
  270.     normalize();
  271.     return *this;
  272. NPTime&
  273. NPTime::operator-=(const NPTime& lhs)
  274. {
  275.     m_lSecond -= lhs.m_lSecond;
  276.     m_lMicroSecond -= lhs.m_lMicroSecond;
  277.     normalize();
  278.     return *this;
  279. }
  280. NPTime
  281. NPTime::operator+(const NPTime& lhs)
  282. {
  283.     NPTime tmpTime = *this;
  284.     tmpTime += lhs;
  285.     return tmpTime;
  286. }
  287. NPTime
  288. NPTime::operator-(const NPTime& lhs)
  289. {
  290.     NPTime tmpTime = *this;
  291.     tmpTime -= lhs;
  292.     return tmpTime;
  293. }