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

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. #ifndef _SB_USE_STD_NAMESPACE
  23. #define _SB_USE_STD_NAMESPACE
  24. #endif
  25. #ifdef _WIN32
  26. #ifndef UNICODE
  27. #define UNICODE
  28. #endif
  29. #ifndef _UNICODE
  30. #define _UNICODE
  31. #endif
  32. #endif /* WIN32 */
  33. #include <stdio.h>
  34. #include <stdlib.h>
  35. #include <stdarg.h>
  36. #include <wctype.h>
  37. #include "VXItypes.h"
  38. #include "VXIvalue.h"
  39. #include "VXIinet.h"
  40. #define SBINET_EXPORTS
  41. #include "SBinet.h"
  42. #include "VXItrd.h"
  43. #include "VXIlog.h"
  44. #ifdef _WIN32
  45. #undef HTTP_VERSION
  46. #define WIN32_LEAN_AND_MEAN
  47. #include <windows.h>
  48. #include <wininet.h>
  49. #include <winsock2.h>
  50. #endif /* WIN32 */
  51. #include "SBinetLog.h"
  52. #include "SBinetChannel.h"
  53. #include <SBinetString.hpp>
  54. class SBinet: public SWIutilLogger
  55. {
  56. public:
  57.   SBinet():
  58.     SWIutilLogger(MODULE_SBINET, NULL, 0),
  59.     _initialized(false)
  60.   {}
  61.   bool isInitialized() const
  62.   {
  63.     return _initialized;
  64.   }
  65.   virtual ~SBinet();
  66.   SWIutilLogger::SetLog;
  67.   VXIinetResult  Init(const VXIMap*    configParams);
  68.   VXIinetResult  Terminate(VXIbool     clearLogResource);
  69. private:
  70.   VXIinetResult  CheckEnvironment();
  71.   bool _initialized;
  72. };
  73. /*****************************************************************************
  74.  *****************************************************************************
  75.  * Globals
  76.  *****************************************************************************
  77.  *****************************************************************************
  78.  */
  79. // The Global inet object. Manages Event Thread, etc.
  80. static SBinet g_SBinet;
  81. /*****************************************************************************
  82.  *****************************************************************************
  83.  * SBinet C routines:  Init(), ShutDown(), CreateResource(), DestroyResource()
  84.  *
  85.  * NOTE: We provide both OSB and SB prefixed entry points, OSB for the
  86.  * OpenVXI open source release, SB for the OpenSpeech Browser PIK product.
  87.  *****************************************************************************
  88.  *****************************************************************************
  89.  */
  90. SBINET_API
  91. VXIinetResult SBinetInit( VXIlogInterface* piVXILog,
  92.                           const VXIunsigned diagLogBase,
  93.                           const VXIchar*   reserved1,
  94.                           const VXIint     reserved2,
  95.                           const VXIint     reserved3,
  96.                           const VXIint     reserved4,
  97.                           const VXIchar*   pszProxyServer,
  98.                           const VXIulong   nProxyPort,
  99.   const VXIchar*   userAgentName,
  100.   const VXIMap*    extensionRules,
  101.   const VXIVector* reserved )
  102. {
  103.   g_SBinet.SetLog(piVXILog, diagLogBase);
  104.   VXIinetResult rc = VXIinet_RESULT_SUCCESS;
  105.   SBinetLogFunc apiTrace (piVXILog, diagLogBase+ MODULE_SBINET_API_TAGID,
  106.   L"SBinetInit", (int *) &rc,
  107.   L"entering: 0x%p, %s, %d, %d, %d, %s, %lu, %s, "
  108.   L"0x%p, 0x%p", piVXILog, 
  109.   (reserved1!=NULL)?reserved1:L"",
  110.   reserved2, reserved3,
  111.   reserved4, 
  112.   (pszProxyServer!=NULL)?pszProxyServer:L"", 
  113.   nProxyPort,
  114.   (userAgentName!=NULL)?userAgentName:L"", 
  115.   extensionRules, reserved);
  116.   VXIMap *theMap = VXIMapCreate();
  117.   if (theMap == NULL)
  118.   {
  119.     return rc = VXIinet_RESULT_OUT_OF_MEMORY;
  120.   }
  121.   if (userAgentName && *userAgentName)
  122.   {
  123.     VXIMapSetProperty(theMap, SBINET_USER_AGENT_NAME, (VXIValue *) VXIStringCreate(userAgentName));
  124.   }
  125.   if (extensionRules)
  126.   {
  127.     VXIMapSetProperty(theMap, SBINET_EXTENSION_RULES, (VXIValue *) VXIMapClone(extensionRules));
  128.   }
  129.   if (pszProxyServer && *pszProxyServer)
  130.   {
  131.     VXIVector *proxyVector = VXIVectorCreate();
  132.     if (proxyVector == NULL)
  133.     {
  134.       rc = VXIinet_RESULT_OUT_OF_MEMORY;
  135.       goto cleanUp;
  136.     }
  137.     VXIMapSetProperty(theMap, SBINET_PROXY_RULES, (VXIValue *) proxyVector);
  138.     SBinetString proxyRule = "|";
  139.     proxyRule += pszProxyServer;
  140.     proxyRule += ':';
  141.     char tmpPort[20];
  142.     sprintf(tmpPort, "%lu", nProxyPort);
  143.     proxyRule += tmpPort;
  144.     VXIVectorAddElement(proxyVector, (VXIValue *) VXIStringCreate(proxyRule.c_str()));
  145.   }
  146.   rc = SBinetInitEx(piVXILog, diagLogBase, theMap);
  147.  cleanUp:
  148.   if (theMap != NULL) VXIMapDestroy(&theMap);
  149.   return ( rc );
  150. }
  151. SBINET_API
  152. VXIinetResult SBinetInitEx(VXIlogInterface* piVXILog,
  153.                            const VXIunsigned diagLogBase,
  154.                            const VXIMap*    configParams)
  155. {
  156.   g_SBinet.SetLog(piVXILog, diagLogBase);
  157.   VXIinetResult rc = VXIinet_RESULT_SUCCESS;
  158.   SBinetLogFunc apiTrace (piVXILog, diagLogBase+ MODULE_SBINET_API_TAGID,
  159.   L"SBinetInitEx", (int *) &rc,
  160.   L"entering: 0x%p, %p",
  161.   piVXILog, configParams);
  162.   rc = g_SBinet.Init(configParams);
  163.   return ( rc );
  164. }
  165. SBINET_API
  166. VXIinetResult SBinetShutDown( VXIlogInterface* piVXILog )
  167. {
  168.   VXIinetResult rc = VXIinet_RESULT_SUCCESS;
  169.   SBinetLogFunc apiTrace (piVXILog, g_SBinet.GetDiagBase() +
  170.   MODULE_SBINET_API_TAGID,
  171.   L"SBinetShutdown", (int *) &rc,
  172.   L"entering: 0x%p", piVXILog);
  173.   return rc = g_SBinet.Terminate(FALSE);
  174. }
  175. SBINET_API
  176. VXIinetResult SBinetCreateResource(VXIlogInterface* piVXILog,
  177.                                    VXIcacheInterface* piVXICache,
  178.                                    VXIinetInterface**     ppiVXIInet )
  179. {
  180.   VXIinetResult rc = VXIinet_RESULT_SUCCESS;
  181.   SBinetLogFunc apiTrace (piVXILog, g_SBinet.GetDiagBase() +
  182.   MODULE_SBINET_API_TAGID,
  183.   L"SBinetCreateResource", (int *) &rc,
  184.   L"entering: 0x%p, 0x%p",
  185.   piVXILog, ppiVXIInet);
  186.   if (! g_SBinet.isInitialized())
  187.     return VXIinet_RESULT_FATAL_ERROR;
  188.   if (!piVXILog || !ppiVXIInet)
  189.   {
  190.     SWIutilLogger::Error(piVXILog,MODULE_SBINET,102,NULL);
  191.     return (rc = VXIinet_RESULT_INVALID_ARGUMENT);
  192.   }
  193.   SBinetChannel* pInter = new SBinetChannel(piVXILog,
  194.                                             g_SBinet.GetDiagBase(),
  195.                                             piVXICache);
  196.   if (!pInter)
  197.   {
  198.     SWIutilLogger::Error(piVXILog,MODULE_SBINET,103,NULL);
  199.     return (rc = VXIinet_RESULT_OUT_OF_MEMORY);
  200.   }
  201.   // Could add to Channel/Interface table for validation but...
  202.   *ppiVXIInet = (VXIinetInterface*)pInter; // Downcast...
  203.   return (rc);
  204. }
  205. SBINET_API
  206. VXIinetResult SBinetDestroyResource( VXIinetInterface** ppiVXIInet )
  207. {
  208.   if (! g_SBinet.isInitialized())
  209.     return VXIinet_RESULT_FATAL_ERROR;
  210.   VXIlogInterface* piVXILog = g_SBinet.GetLog();
  211.   VXIinetResult rc = VXIinet_RESULT_SUCCESS;
  212.   SBinetLogFunc apiTrace (piVXILog, g_SBinet.GetDiagBase() +
  213.   MODULE_SBINET_API_TAGID,
  214.   L"SBinetDestroyResource", (int *) &rc,
  215.   L"entering: 0x%p (0x%p)", ppiVXIInet,
  216.   (ppiVXIInet ? *ppiVXIInet : NULL));
  217.   if (! ppiVXIInet) {
  218.     g_SBinet.Error(102,NULL);
  219.     return (rc = VXIinet_RESULT_INVALID_ARGUMENT);
  220.   }
  221.   if (! *ppiVXIInet) {
  222.     g_SBinet.Error(102,NULL);
  223.     return (rc = VXIinet_RESULT_INVALID_ARGUMENT);
  224.   }
  225.   SBinetChannel* pSBinet = static_cast<SBinetChannel*>(*ppiVXIInet);
  226.   if (!pSBinet)
  227.   {
  228.     g_SBinet.Error(102,NULL);
  229.     return (rc = VXIinet_RESULT_INVALID_ARGUMENT);
  230.   }
  231.   // Could delete to Channel/Interface table for validation but...
  232.   // Delete it, destructor cleans up
  233.   delete pSBinet;
  234.   *ppiVXIInet = static_cast<VXIinetInterface*>(NULL);
  235.   return (rc);
  236. }
  237. /****************************************************************************
  238.  ****************************************************************************
  239.  * SBinet methods: Initializations
  240.  *
  241.  ****************************************************************************
  242.  ****************************************************************************
  243.  */
  244. SBinet::~SBinet()
  245. {
  246.   Terminate(TRUE);
  247. }
  248. //
  249. // Initialize SBinet
  250. //
  251. VXIinetResult SBinet::Init(const VXIMap *configParams)
  252. {
  253.   if (_initialized)
  254.   {
  255.     return VXIinet_RESULT_SUCCESS;
  256.   }
  257.   // We need to initialize winsock on Windows.
  258. #ifdef _WIN32
  259.   WSADATA wsaData;
  260.   int err = WSAStartup( MAKEWORD(1,1), &wsaData );
  261.   if (err != 0)
  262.   {
  263.     Error(109,NULL);
  264.     return   VXIinet_RESULT_PLATFORM_ERROR;
  265.   }
  266.   //    if (LOBYTE(wsaData.wVersion) != 1 && HIBYTE(wsaData.wVersion) != 1) {
  267.   //      WSACleanup();
  268.   //      return -1;
  269.   //    }
  270. #endif
  271.   // Check if the environment is correct for supporting SBinet
  272.   VXIinetResult rc = CheckEnvironment();
  273.   if (rc != VXIinet_RESULT_SUCCESS)
  274.     return rc;
  275.   rc = SBinetChannel::init(configParams, this);
  276.   if (rc != VXIinet_RESULT_SUCCESS)
  277.     return rc;
  278.   _initialized = true;
  279.   return rc;
  280. }
  281. //
  282. // Terminate SBinet
  283. //
  284. VXIinetResult SBinet::Terminate(VXIbool clearLogResource)
  285. {
  286.   if (!_initialized)
  287.   {
  288.     return VXIinet_RESULT_NON_FATAL_ERROR;
  289.   }
  290.   VXIinetResult rc = VXIinet_RESULT_SUCCESS;
  291.   if (clearLogResource)
  292.     SetLog(NULL, GetDiagBase());
  293.   SBinetChannel::shutdown();
  294.   // TODO: Scan Instance and Stream maps and delete outstanding objects
  295.   // Shutdown winsock on WIN32
  296. #ifdef _WIN32
  297.   WSACleanup();
  298. #endif
  299.   _initialized = false;
  300.   return rc;
  301. }
  302. //
  303. // Check if the environment properly supports SBinet
  304. //
  305. VXIinetResult SBinet::CheckEnvironment()
  306. {
  307.   VXIinetResult rc = VXIinet_RESULT_SUCCESS;
  308. #ifdef _WIN32
  309.   // Get the Microsoft Internet Explorer version, must have version
  310.   // 5.0 or later otherwise InternetCrackUrl() rejects various
  311.   // file:// URL formats that we need to support. Base this off the
  312.   // version of the DLL that implements the browser as documented at
  313.   // http://support.microsoft.com/support/kb/articles/q164/5/39.asp,
  314.   // the IE 5 GA release = 5.00.2014.213
  315.   static const wchar_t IE_DLL_NAME[] = L"shdocvw.dll";
  316.   static const int IE_DLL_VER_1 = 5;
  317.   static const int IE_DLL_VER_2 = 0;
  318.   static const int IE_DLL_VER_3 = 2014;
  319.   static const int IE_DLL_VER_4 = 213;
  320.   VXIint infoSize = GetFileVersionInfoSize((wchar_t *) IE_DLL_NAME, 0);
  321.   if (infoSize <= 0) {
  322.     // Could not find the DLL or version info not available
  323.     Error(105, NULL);
  324.     rc = VXIinet_RESULT_PLATFORM_ERROR;
  325.   } else {
  326.     VXIbyte *infoData = new VXIbyte [infoSize];
  327.     if (infoData == NULL) {
  328.       Error(103, NULL);
  329.       rc = VXIinet_RESULT_OUT_OF_MEMORY;
  330.     } else {
  331.       LPDWORD dwResource;
  332.       UINT cnSize;
  333.       if ((GetFileVersionInfo((wchar_t*)IE_DLL_NAME, 0,infoSize,infoData)==0)||
  334.  (VerQueryValue(infoData, L"\", (LPVOID*)(&dwResource), &cnSize)==0)){
  335. // Version info not available
  336. Error(105, NULL);
  337. rc = VXIinet_RESULT_PLATFORM_ERROR;
  338.       } else {
  339. Diag(MODULE_SBINET_API_TAGID, NULL,
  340.      L"Microsoft Internet Explorer %2d.%02d.%04d.%d is active",
  341.      HIWORD(dwResource[2]), LOWORD(dwResource[2]),
  342.      HIWORD(dwResource[3]), LOWORD(dwResource[3]));
  343.         // Check if the DLL's version is OK for us
  344. bool badVersion = false;
  345.         if (HIWORD(dwResource[2]) < IE_DLL_VER_1)
  346.           badVersion = true;
  347.         else if (HIWORD(dwResource[2]) == IE_DLL_VER_1) {
  348.           if (LOWORD(dwResource[2]) < IE_DLL_VER_2)
  349.             badVersion = true;
  350.           else if (LOWORD(dwResource[2]) == IE_DLL_VER_2) {
  351.             if (HIWORD(dwResource[3]) < IE_DLL_VER_3)
  352.               badVersion = true;
  353.             else if (HIWORD(dwResource[3]) == IE_DLL_VER_3) {
  354.               if (LOWORD(dwResource[3]) < IE_DLL_VER_4)
  355.                 badVersion = true;
  356.             }
  357.           }
  358.         }
  359. if (badVersion) {
  360.   Error(104, L"%s%d%s%d%s%d%s%d",
  361. L"IEMajor", HIWORD(dwResource[2]),
  362. L"IEMinor", LOWORD(dwResource[2]),
  363. L"IEBuild", HIWORD(dwResource[3]),
  364. L"IEPatch", LOWORD(dwResource[3]));
  365.   rc = VXIinet_RESULT_PLATFORM_ERROR;
  366. }
  367.       }
  368.       delete [] infoData;
  369.     }
  370.   }
  371. #endif
  372.   return rc;
  373. }