SBinetUtils.cpp
上传用户:xqtpzdz
上传日期:2022-05-21
资源大小:1764k
文件大小:7k
源码类别:

xml/soap/webservice

开发平台:

Visual C++

  1. /****************License************************************************
  2.  * Vocalocity OpenVXI
  3.  * Copyright (C) 2004-2005 by Vocalocity, Inc. All Rights Reserved.
  4.  * This program is free software; you can redistribute it and/or
  5.  * modify it under the terms of the GNU General Public License
  6.  * as published by the Free Software Foundation; either version 2
  7.  * of the License, or (at your option) any later version.
  8.  *  
  9.  * This program is distributed in the hope that it will be useful,
  10.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  11.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  12.  * GNU General Public License for more details.
  13.  *
  14.  * You should have received a copy of the GNU General Public License
  15.  * along with this program; if not, write to the Free Software
  16.  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
  17.  * Vocalocity, the Vocalocity logo, and VocalOS are trademarks or 
  18.  * registered trademarks of Vocalocity, Inc. 
  19.  * OpenVXI is a trademark of Scansoft, Inc. and used under license 
  20.  * by Vocalocity.
  21.  ***********************************************************************/
  22. #include "SBinetInternal.h"
  23. #include "SBinetUtils.hpp"
  24. #include "SBinetValidator.h"
  25. #include "md5.h"
  26. #include <stdio.h>
  27. #include <string.h>
  28. #include <time.h>
  29. #include <sys/timeb.h>                  // for ftime( )/_ftime( )
  30. bool SBinetUtils::getInteger(const VXIMap *theMap, const VXIchar *prop,
  31.      VXIint32& val)
  32. {
  33.   const VXIValue *value = VXIMapGetProperty(theMap, prop);
  34.   if (value != NULL && VXIValueGetType(value) == VALUE_INTEGER)
  35.   {
  36.     val = VXIIntegerValue((const VXIInteger *) value);
  37.     return true;
  38.   }
  39. #if (VXI_CURRENT_VERSION >= 0x00030000)
  40.   if (value != NULL && VXIValueGetType(value) == VALUE_ULONG)
  41.   {
  42.     val = (VXIint32)VXIULongValue((const VXIULong *) value);
  43.     return true;
  44.   }
  45. #endif  
  46.   return false;
  47. }
  48. bool SBinetUtils::getFloat(const VXIMap *theMap, const VXIchar *prop,
  49.                            VXIflt32& val)
  50. {
  51.   const VXIValue *value = VXIMapGetProperty(theMap, prop);
  52.   if (value != NULL && VXIValueGetType(value) == VALUE_FLOAT)
  53.   {
  54.     val = VXIFloatValue((const VXIFloat *) value);
  55.     return true;
  56.   }
  57. #if (VXI_CURRENT_VERSION >= 0x00030000)
  58.   if (value != NULL && VXIValueGetType(value) == VALUE_DOUBLE)
  59.   {
  60.     val = (VXIflt32)VXIDoubleValue((const VXIDouble *) value);
  61.     return true;
  62.   }
  63. #endif  
  64.   return false;
  65. }
  66. const VXIchar *SBinetUtils::getString(const VXIMap *theMap,
  67.                                       const VXIchar *prop)
  68. {
  69.   const VXIValue *value = VXIMapGetProperty(theMap, prop);
  70.   if (value != NULL && VXIValueGetType(value) == VALUE_STRING)
  71.   {
  72.     return VXIStringCStr((const VXIString *) value);
  73.   }
  74.   return NULL;
  75. }
  76. bool SBinetUtils::getContent(const VXIMap *theMap,
  77.                              const VXIchar *prop,
  78.                              const char *&content,
  79.                              VXIulong &contentLength)
  80. {
  81.   const VXIValue *value = VXIMapGetProperty(theMap, prop);
  82.   if (value != NULL && VXIValueGetType(value) == VALUE_CONTENT)
  83.   {
  84.     const VXIchar *mimeType;
  85.     VXIvalueResult rc = VXIContentValue((const VXIContent *) value, &mimeType,
  86.                                         (const VXIbyte **) &content,
  87. &contentLength);
  88.     if (rc == VXIvalue_RESULT_SUCCESS && content != NULL)
  89.     {
  90.       // FIXME: should check for text/plain mimetype!
  91.       return true;
  92.     }
  93.   }
  94.   return false;
  95. }
  96. static void DestroyContent(VXIbyte **content, void *userdata)
  97. {
  98.   if (content)
  99.   {
  100.     delete [] (char *)(*content);
  101.     *content = NULL;
  102.   }
  103. }
  104. VXIContent *SBinetUtils::createContent(const char *str)
  105. {
  106.   int len = ::strlen(str);
  107.   return VXIContentCreate(L"text/plain",
  108.                           (VXIbyte *) ::strcpy(new char[len +1], str), len,
  109.                           DestroyContent, NULL);
  110. }
  111. char *SBinetUtils::getTimeStampStr(time_t  timestamp,
  112.    char   *timestampStr)
  113. {
  114. #ifdef WIN32
  115.   char *timeStr = ctime(&timestamp);
  116.   if (timeStr)
  117.     ::strcpy(timestampStr, timeStr);
  118.   else
  119.     ::strcpy(timestampStr, "<bad timestamp>");
  120. #else
  121.   char *timeStr = ctime_r(&timestamp, timestampStr);
  122.   if (! timeStr)
  123.     ::strcpy(timestampStr, "<bad timestamp>");
  124. #endif
  125.   return timestampStr;
  126. }
  127. char *SBinetUtils::getTimeStampMsecStr(char  *timestampStr)
  128. {
  129. #ifdef WIN32
  130.   struct _timeb tbuf;
  131.   _ftime(&tbuf);
  132.   char *timeStr = ctime(&tbuf.time);
  133. #else
  134.   struct timeb tbuf;
  135.   ftime(&tbuf);
  136.   char timeStr_r[64] = "";
  137.   char *timeStr = ctime_r(&tbuf.time, timeStr_r);
  138. #endif
  139.   if (timeStr) {
  140.     // Strip the weekday name from the front, year from the end,
  141.     // append hundredths of a second (the thousandths position is
  142.     // inaccurate, remains constant across entire runs of the process)
  143.     ::strncpy(timestampStr, &timeStr[4], 15);
  144.     ::sprintf(&timestampStr[15], ".%02u", tbuf.millitm / 10);
  145.   } else {
  146.     ::strcpy(timestampStr, "<bad timestamp>");
  147.   }
  148.   return timestampStr;
  149. }
  150. bool SBinetUtils::setValidatorInfo(VXIMap *streamInfo, const SBinetValidator *validator)
  151. {
  152.   // Build caching information required to put in the streamInfo map.  This
  153.   // consist of three properties:
  154.   //
  155.   // 1) INET_INFO_EXPIRES_HINT: indicates when a new request should be made to
  156.   // the remote server.
  157.   //
  158.   // 2) INET_INFO_VALIDATOR_STRONG: indicates that the ETag provided by the
  159.   // remote server is a strong one.
  160.   //
  161.   // 3) INET_INFO_VALIDATOR: the actual validator information as returned by
  162.   // the remote server.
  163.   if (validator->isStrong())
  164.   {
  165.     // We have a strong validator.
  166.     if (VXIMapSetProperty(streamInfo, INET_INFO_VALIDATOR_STRONG, (VXIValue *) VXIIntegerCreate(TRUE)) !=
  167.         VXIvalue_RESULT_SUCCESS)
  168.       return false;
  169.   }
  170.   else
  171.   {
  172.     VXIMapDeleteProperty(streamInfo, INET_INFO_VALIDATOR_STRONG);
  173.   }
  174.   time_t expiresTimeStamp = validator->getExpiresTime();
  175.   if (expiresTimeStamp < (time_t) 0) expiresTimeStamp = (time_t) 0;
  176.   if (VXIMapSetProperty(streamInfo, INET_INFO_EXPIRES_HINT, (VXIValue *) VXIIntegerCreate(expiresTimeStamp)) !=
  177.       VXIvalue_RESULT_SUCCESS)
  178.     return false;
  179.   return VXIMapSetProperty(streamInfo, INET_INFO_VALIDATOR, (VXIValue *) validator->serialize()) ==
  180.     VXIvalue_RESULT_SUCCESS;
  181. }
  182. //
  183. // MD5 genaration implementation
  184. //
  185. SBinetMD5::SBinetMD5()
  186. {
  187.   memset(raw, 0, 16 * sizeof(unsigned char));  
  188. }
  189. SBinetMD5::SBinetMD5(const VXIchar* url)
  190. {
  191.   memset(raw, 0, 16 * sizeof(unsigned char));  
  192.   GenMD5Key(url);
  193. }
  194.   
  195. SBinetMD5::SBinetMD5(const SBinetMD5 & x)
  196. {
  197.   memcpy(raw, x.raw, 16 * sizeof(unsigned char));   
  198. }
  199. SBinetMD5 & SBinetMD5::operator=(const SBinetMD5 & x)
  200. {
  201.   if (this != &x) 
  202.   { 
  203.     memcpy(raw, x.raw, 16 * sizeof(unsigned char)); 
  204.   }
  205.   return *this;  
  206. }
  207.   
  208. bool SBinetMD5::GenMD5Key(const VXIchar* content)
  209. {
  210.   if( !content ) return false;  
  211.   // Generate MD5 key
  212.   MD5_CTX md5;
  213.   VXIulong cntLen = wcslen(content) * sizeof(VXIchar) / sizeof(VXIbyte);
  214.   MD5Init (&md5);
  215.   MD5Update (&md5, reinterpret_cast<const VXIbyte*>(content), cntLen);
  216.   MD5Final (raw, &md5);           
  217.   return true;  
  218. }
  219. void SBinetMD5::Clear()
  220. {
  221.   memset(raw, 0, 16 * sizeof(unsigned char));  
  222. }
  223. bool SBinetMD5::IsClear() const
  224. {
  225.   for(int i = 0; i <= 16; ++i)
  226.     if( raw[i] != 0 ) return false;
  227.   return true;  
  228. }