msec.cpp
上传用户:ets1996
上传日期:2014-09-30
资源大小:353k
文件大小:7k
源码类别:

SNMP编程

开发平台:

Visual C++

  1. /*_############################################################################
  2.   _## 
  3.   _##  msec.cpp  
  4.   _##
  5.   _##  SNMP++v3.2.22
  6.   _##  -----------------------------------------------
  7.   _##  Copyright (c) 2001-2007 Jochen Katz, Frank Fock
  8.   _##
  9.   _##  This software is based on SNMP++2.6 from Hewlett Packard:
  10.   _##  
  11.   _##    Copyright (c) 1996
  12.   _##    Hewlett-Packard Company
  13.   _##  
  14.   _##  ATTENTION: USE OF THIS SOFTWARE IS SUBJECT TO THE FOLLOWING TERMS.
  15.   _##  Permission to use, copy, modify, distribute and/or sell this software 
  16.   _##  and/or its documentation is hereby granted without fee. User agrees 
  17.   _##  to display the above copyright notice and this license notice in all 
  18.   _##  copies of the software and any documentation of the software. User 
  19.   _##  agrees to assume all liability for the use of the software; 
  20.   _##  Hewlett-Packard and Jochen Katz make no representations about the 
  21.   _##  suitability of this software for any purpose. It is provided 
  22.   _##  "AS-IS" without warranty of any kind, either express or implied. User 
  23.   _##  hereby grants a royalty-free license to any and all derivatives based
  24.   _##  upon this software code base. 
  25.   _##  
  26.   _##  Stuttgart, Germany, Wed May  2 23:22:30 CEST 2007 
  27.   _##  
  28.   _##########################################################################*/
  29. /*
  30.   Copyright (c) 1999
  31.   Hewlett-Packard Company
  32.   ATTENTION: USE OF THIS SOFTWARE IS SUBJECT TO THE FOLLOWING TERMS.
  33.   Permission to use, copy, modify, distribute and/or sell this software
  34.   and/or its documentation is hereby granted without fee. User agrees
  35.   to display the above copyright notice and this license notice in all
  36.   copies of the software and any documentation of the software. User
  37.   agrees to assume all liability for the use of the software; Hewlett-Packard
  38.   makes no representations about the suitability of this software for any
  39.   purpose. It is provided "AS-IS" without warranty of any kind,either express
  40.   or implied. User hereby grants a royalty-free license to any and all
  41.   derivatives based upon this software code base.
  42. */
  43. char msec_cpp_version[]="@(#) SNMP++ $Id: msec.cpp 277 2007-03-22 21:17:36Z katz $";
  44. #include "snmp_pp/msec.h"
  45. #include "snmp_pp/smival.h"
  46. #include "snmp_pp/config_snmp_pp.h"
  47. #include <stdio.h>  // for sprintf
  48. #include <string.h> // for strcat
  49. #ifdef WIN32
  50. #include <sys/types.h> // for _timeb
  51. #include <sys/timeb.h> // and _ftime
  52. #ifdef __BCPLUSPLUS__
  53. #define _timeb timeb
  54. #define _ftime ftime
  55. #endif
  56. #endif
  57. #ifdef SNMP_PP_NAMESPACE
  58. namespace Snmp_pp {
  59. #endif
  60. #if !defined HAVE_LOCALTIME_R && !defined HAVE_REENTRANT_LOCALTIME
  61. #ifdef _THREADS
  62. SnmpSynchronized msec::m_localtime_mutex;
  63. #endif
  64. #endif
  65. int operator==(const msec &t1, const msec &t2)
  66. {
  67.   return((t1.m_time.tv_sec == t2.m_time.tv_sec) &&
  68.  (t1.m_time.tv_usec == t2.m_time.tv_usec));
  69. }
  70. int operator!=(const msec &t1, const msec &t2)
  71. {
  72.   return((t1.m_time.tv_sec != t2.m_time.tv_sec) ||
  73.  (t1.m_time.tv_usec != t2.m_time.tv_usec));
  74. }
  75. int operator<(const msec &t1, const msec &t2)
  76. {
  77.   if (t1.IsInfinite()) return 0;
  78.   if (t2.IsInfinite()) return 1;
  79.   if ((t1.m_time.tv_sec < t2.m_time.tv_sec) ||
  80.       ((t1.m_time.tv_sec == t2.m_time.tv_sec) &&
  81.        (t1.m_time.tv_usec < t2.m_time.tv_usec)))
  82.     return 1;
  83.   return 0;
  84. }
  85. int operator>(const msec &t1, const msec &t2)
  86. {
  87.   if (t2.IsInfinite()) return 0;
  88.   if (t1.IsInfinite()) return 1;
  89.   if ((t1.m_time.tv_sec > t2.m_time.tv_sec) ||
  90.       ((t1.m_time.tv_sec == t2.m_time.tv_sec) &&
  91.        (t1.m_time.tv_usec > t2.m_time.tv_usec)))
  92.     return 1;
  93.   return 0;
  94. }
  95. msec &msec::operator-=(const long millisec)
  96. {
  97.   timeval t1;
  98.   // create a timeval
  99.   t1.tv_sec = millisec / 1000;
  100.   t1.tv_usec = (millisec % 1000) * 1000;
  101.   // subtract it from this
  102.   *this -= t1; // add m_changed = true if this line is removed!
  103.   return *this;
  104. }
  105. msec &msec::operator-=(const timeval &t1)
  106. {
  107.   long tmp_usec = t1.tv_usec/1000;// convert usec to millisec
  108.   if (!this->IsInfinite())
  109.   {
  110.     if (m_time.tv_usec < t1.tv_usec) {
  111.       // borrow
  112.       m_time.tv_sec--;
  113.       m_time.tv_usec += 1000;
  114.     }
  115.     m_time.tv_usec -= tmp_usec;
  116.     m_time.tv_sec -= t1.tv_sec;
  117.   }
  118.   m_changed = true;
  119.   return *this;
  120. }
  121. msec &msec::operator+=(const long millisec)
  122. {
  123.   timeval t1;
  124.   // create a timeval
  125.   t1.tv_sec = millisec / 1000;
  126.   t1.tv_usec = (millisec % 1000) * 1000;
  127.   // add it to this
  128.   *this += t1; // add m_changed = true if this line is removed!
  129.   return *this;
  130. }
  131. msec &msec::operator+=(const timeval &t1)
  132. {
  133.   long tmp_usec = t1.tv_usec/1000;// convert usec to millisec
  134.   if (!this->IsInfinite())
  135.   {
  136.     m_time.tv_usec += tmp_usec;
  137.     if (m_time.tv_usec > 1000) {
  138.       // carry
  139.       m_time.tv_sec +=  m_time.tv_usec / 1000;
  140.       m_time.tv_usec = m_time.tv_usec % 1000;
  141.     }
  142.     m_time.tv_sec += t1.tv_sec;
  143.   }
  144.   m_changed = true;
  145.   return *this;
  146. }
  147. msec &msec::operator=(const timeval &t1)
  148. {
  149.   m_time.tv_sec  = t1.tv_sec;
  150.   m_time.tv_usec = t1.tv_usec/1000; // convert usec to millisec
  151.   m_changed = true;
  152.   return *this;
  153. }
  154. #if defined (CPU) && CPU == PPC603
  155.   struct SCommTimer
  156.   {
  157. unsigned long NumMS;
  158. unsigned long FractMS;
  159.   };
  160.   extern "C"
  161.   {
  162.   // The GetTime call is not part of the VxWorks library!
  163.   // If it is not already available in your environment,
  164.   // you will need to implement it!
  165.   void GetTime (struct SCommTimer *  Time);
  166.   }
  167. #endif
  168. void msec::refresh()
  169. {
  170. #ifdef WIN32
  171.   struct _timeb timebuffer;
  172.   _ftime( &timebuffer );
  173.   m_time.tv_usec = timebuffer.millitm;
  174.   m_time.tv_sec  = SAFE_ULONG_CAST(timebuffer.time);
  175. #elif defined (CPU) && CPU == PPC603
  176.   SCommTimer theTime;
  177.   GetTime(&theTime);
  178.   m_time.tv_sec = theTime.NumMS/1000;
  179.   m_time.tv_usec = theTime.NumMS % 1000;
  180. #else
  181.   class timezone tzone;
  182.   gettimeofday((timeval *)&m_time, &tzone);
  183.   m_time.tv_usec /= 1000; // convert usec to millisec
  184. #endif
  185.   m_changed = true;
  186. }
  187. #ifndef MAX_ALARM
  188. #define MAX_ALARM 1000000000L
  189. #endif
  190. void msec::GetDelta(const msec &future, timeval &timeout) const
  191. {
  192.   if (future.IsInfinite())
  193.   {
  194.     timeout.tv_sec = MAX_ALARM; // max allowable select timeout
  195.     timeout.tv_usec = 0;
  196.   }
  197.   else if (future > *this)
  198.   {
  199.     if (future.m_time.tv_usec < m_time.tv_usec)
  200.     {
  201.       timeout.tv_sec  = future.m_time.tv_sec  - 1    - m_time.tv_sec;
  202.       timeout.tv_usec = future.m_time.tv_usec + 1000 - m_time.tv_usec;
  203.     }
  204.     else
  205.     {
  206.       timeout.tv_sec  = future.m_time.tv_sec  - m_time.tv_sec;
  207.       timeout.tv_usec = future.m_time.tv_usec - m_time.tv_usec;
  208.     }
  209.     timeout.tv_usec *= 1000 ;// convert back to usec
  210.   }
  211.   else // Never give back negative timeval's they make select() hurl
  212.   {
  213.     timeout.tv_sec = 0;
  214.     timeout.tv_usec = 0;
  215.   }
  216. }
  217. // FIXME: does not print years and days!
  218. const char *msec::get_printable() const
  219. {
  220.   if (m_changed == false) return m_output_buffer;
  221.   char msec_buffer[5];
  222.   msec *nc_this = PP_CONST_CAST(msec*, this);
  223. #ifdef HAVE_LOCALTIME_R
  224.   struct tm stm;
  225.   localtime_r((const time_t *)&m_time.tv_sec, &stm);
  226.   strftime(nc_this->m_output_buffer, sizeof(m_output_buffer),
  227.            "%H:%M:%S.", &stm);
  228. #else
  229. #if defined _THREADS && !defined HAVE_REENTRANT_LOCALTIME
  230.   SnmpSynchronize s(m_localtime_mutex);  // Serialize all calls to localtime!
  231. #endif
  232.   struct tm *tmptr;
  233.   tmptr = localtime((time_t *)&m_time.tv_sec);
  234.   strftime(nc_this->m_output_buffer, sizeof(m_output_buffer),
  235.            "%H:%M:%S.", tmptr);
  236. #endif
  237.   sprintf(msec_buffer, "%.3ld", m_time.tv_usec);
  238.   strcat(nc_this->m_output_buffer, msec_buffer);
  239.   nc_this->m_changed = false;
  240.   return m_output_buffer;
  241. }
  242. #ifdef SNMP_PP_NAMESPACE
  243. }; // end of namespace Snmp_pp
  244. #endif