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

Symbian

开发平台:

Visual C++

  1. /* ***** BEGIN LICENSE BLOCK *****
  2.  * Source last modified: $Id: conn.cpp,v 1.9.30.3 2004/07/09 01:47:02 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. #include "hlxclib/time.h"
  50. #include <string.h>
  51. #if defined(_UNIX)
  52. #include <sys/types.h>
  53. #endif
  54. #include "hlxclib/sys/socket.h"
  55. #include "hlxclib/netdb.h"
  56. #include "hxcom.h"
  57. #include "conn.h"
  58. #include "hxengin.h"
  59. #include "hxcom.h"
  60. #include "hxtick.h"
  61. #include "hxresult.h"
  62. #include "hxthread.h"
  63. #include "hxbuffer.h"
  64. #include "hxstrutl.h"
  65. #include "netbyte.h"
  66. #if defined( THREADS_SUPPORTED ) || defined(_UNIX_THREADED_NETWORK_IO)
  67. #include "thrdconn.h"
  68. #endif
  69. //#include "../dcondev/dcon.h"
  70. #include "hxheap.h"
  71. #ifdef _DEBUG
  72. #undef HX_THIS_FILE
  73. static const char HX_THIS_FILE[] = __FILE__;
  74. #endif  
  75. #define MAX_CONN_STARVINGTIME 1000
  76. // DNR cache
  77. DNR_cache conn::mCache[MAX_CACHE];
  78. UINT16 conn::mCacheCount = 0;
  79. // conn object list
  80. // XXXJR Really sorry this, but as an actual instance it doesn't get
  81. // initialized when linked into a shared library under unix.  Yuck.
  82. CHXMapPtrToPtr* conn::mConnectionList     = NULL;
  83. HXThread* conn::m_pNetworkThread     = NULL;
  84. UINT32   conn::m_ulMaxBandwidth     = MAX_UINT32;   // in bytes per sec
  85. UINT32 conn::m_ulTCPTotalBytesRead = 0;
  86. UINT32 conn::m_ulTCPReadTimeStamp  = 0;
  87. CHXSimpleList* conn::m_pTCPStarvingList    = NULL;
  88. BOOL            conn::m_bNetworkThreading   = FALSE;
  89. BOOL            conn::m_bThreadedDNS        = FALSE;
  90. static HXMutex* z_pConnectionListMutex = NULL;
  91. DestructConnGlobals selfConnGlobalDestructor;
  92. void
  93. conn::DestructGlobals()
  94. {
  95.     HX_DELETE(z_pConnectionListMutex);
  96. }
  97. // new_socket() creates the correct version of conn depending on the
  98. // defined platform and requested socket type
  99. conn* conn::new_socket (UINT16 type)
  100. {
  101.     conn *c = 0;
  102. #if defined(_UNIX_THREADED_NETWORK_IO)
  103.     if( conn::GetNetworkThreadingPref() )
  104.     {
  105.         c = ThreadedConn::new_socket(type);
  106.     }
  107.     else
  108.     {
  109.         c = actual_new_socket(type);
  110.     }
  111. #elif defined(THREADS_SUPPORTED)
  112.     c = ThreadedConn::new_socket(type);
  113. #else    
  114.     c = actual_new_socket(type);
  115. #endif
  116.     if ( c != NULL )
  117.     {
  118. conn::add_connection_to_list ( c );
  119. c->AddRef();
  120.     }
  121.     return(c);
  122. }
  123. conn::~conn (void)
  124. {
  125. //    dprintf("**Destructor** conn::conn(%X)n", this);
  126.     if (m_pUDPBuffer)
  127.     {
  128. delete [] m_pUDPBuffer;
  129. m_pUDPBuffer = 0;
  130.     }
  131.     if ( this != NULL )
  132.     conn::remove_connection_from_list ( this );
  133. }
  134. // platform specific constructor should set the socket to a value  
  135. // indicating the connection is not open
  136. conn::conn (void)
  137.     : m_bNoAsyncDNS( FALSE )
  138. {
  139. // if ( this != NULL )
  140. // dprintf("==Constructor== conn::conn(%X)n", this);
  141. mSock = HX_INVALID_SOCKET;
  142. mConnectionOpen = 0;
  143. mLastError = HXR_OK;
  144. mCallBack = 0;
  145. mHostIPAddr = 0;
  146. mHostIPValid = FALSE;
  147. mDNSDone  = FALSE;
  148. m_pUDPBuffer  = 0;
  149. m_ulLastStarvingTime = 0; 
  150. }
  151. /*  conn::is_cached searches the cached DNR for host and returns its inet address 
  152. in  addr and 1 if it was found, or 0 if it was not found */
  153. UINT16
  154. conn::is_cached(char *host,ULONG32 *addr)
  155. {
  156. UINT16 found = 0;
  157. for (UINT16 i=0; i < mCacheCount && !found; i++) 
  158. {
  159. if (mCache[i].domainName && (::strcmp(host, mCache[i].domainName) == 0)) 
  160. {
  161. *addr = mCache[i].addr;
  162. found = 1;
  163. }
  164. }
  165. return found;
  166. }
  167. /*  conn::add_to_cache adds the host and its inet addr to the cache. If the cache is
  168. full, the oldest entry is replaced with the new entry */
  169. void
  170. conn::add_to_cache(char *host,ULONG32 addr)
  171. {
  172. UINT16 found = 0;
  173. // search the cache to see if entry has already been entered
  174. for (UINT16 i=0; i < mCacheCount && !found; i++) 
  175. {
  176. DNR_cache_ptr p = &mCache[i];
  177. if(addr == p->addr && p->domainName && (::strcmp(host, p->domainName) == 0)) 
  178. {
  179. ::time(&p->cachetime); // refresh cache time
  180. found = 1;
  181. }
  182. }
  183. if(found) return;   // our work here is done
  184. if(mCacheCount < MAX_CACHE) // add the new entry to the end of the cache array
  185. {
  186. DNR_cache_ptr p = &mCache[mCacheCount];
  187. p->addr = addr;
  188. ::time(&p->cachetime);
  189. if (p->domainName != host)
  190. {
  191.     HX_VECTOR_DELETE(p->domainName);
  192.     p->domainName = ::new_string(host);
  193. }
  194. mCacheCount++;
  195. }
  196. else // search cache for oldest entry and replace it with the new data
  197. {
  198. time_t minTime = mCache[0].cachetime;
  199. UINT16 minPos = 0;
  200. for(UINT16 i = 1; i < mCacheCount; i++)
  201. {
  202. if(mCache[i].cachetime < minTime)
  203. {
  204. minTime = mCache[i].cachetime;
  205. minPos = i;
  206. }
  207. }
  208. DNR_cache_ptr p = &mCache[minPos];
  209. p->addr = addr;
  210. ::time(&p->cachetime); // time of caching
  211. if (p->domainName != host)
  212. {
  213.     HX_VECTOR_DELETE(p->domainName);
  214.     p->domainName = ::new_string(host);
  215. }
  216. }
  217. }
  218. void
  219. conn::remove_from_cache(const char *host)
  220. {
  221. UINT16 found = 0;
  222. // search the cache to see if entry has been entered
  223. for (UINT16 i = 0; i < mCacheCount && !found; i++) 
  224. {
  225. DNR_cache_ptr p = &mCache[i];
  226. if(p->domainName && ::strcmp(host, p->domainName) == 0) 
  227. {
  228. HX_VECTOR_DELETE(p->domainName);
  229. p->addr = 0;
  230. p->cachetime = 0; // reset time to 0
  231. found = 1;
  232. }
  233. }
  234. }
  235. void
  236. conn::clear_cache()
  237. {
  238.     mCacheCount = 0;
  239. }
  240. POSITION
  241. conn::get_first_connection_position ()
  242. {
  243.     if(!conn::mConnectionList)
  244.     {
  245. return NULL;
  246.     }
  247.     return conn::mConnectionList->GetStartPosition();
  248. }
  249. void
  250. conn::get_next_connection(POSITION& nextPos, conn*& rpConn)
  251. {
  252.     if(!conn::mConnectionList)
  253.     {
  254. nextPos = NULL;
  255. rpConn = NULL;
  256. return;
  257.     }
  258.     void* pVoid = NULL;
  259.     conn::mConnectionList->GetNextAssoc ( nextPos, (void *&)rpConn, pVoid );
  260. }
  261. void
  262. conn::add_connection_to_list ( conn *pConn )
  263. {
  264.     if (!z_pConnectionListMutex)
  265.     {
  266. #if defined(_UNIX_THREADED_NETWORK_IO)
  267.         if( conn::GetNetworkThreadingPref() )
  268.         {
  269.             HXMutex::MakeMutex(z_pConnectionListMutex);
  270.         }
  271.         else
  272.         {
  273.             HXMutex::MakeStubMutex(z_pConnectionListMutex);
  274.         }
  275. #elif defined(THREADS_SUPPORTED)
  276.         HXMutex::MakeMutex(z_pConnectionListMutex);
  277. #else    
  278.         HXMutex::MakeStubMutex(z_pConnectionListMutex);
  279. #endif
  280.     }
  281.     
  282.     HX_ASSERT( z_pConnectionListMutex);
  283.     z_pConnectionListMutex->Lock();
  284.     //fprintf(stderr, "==AddToList== conn::add_connection_to_list(%X)n", pConn);
  285.     if(!conn::mConnectionList)
  286.     {
  287. conn::mConnectionList = new CHXMapPtrToPtr;
  288.     }
  289.         
  290.     conn::mConnectionList->SetAt ( pConn, NULL );
  291.     z_pConnectionListMutex->Unlock();
  292. }
  293. void
  294. conn::remove_connection_from_list ( conn *pConn )
  295. {
  296.     LISTPOSITION    listpos = NULL;
  297.     CHXSimpleList::Iterator  i;
  298.     if(!conn::mConnectionList)
  299.     {
  300. return;
  301.     }
  302.     
  303.     HX_ASSERT(z_pConnectionListMutex);
  304.     if (z_pConnectionListMutex)
  305.     {
  306. z_pConnectionListMutex->Lock();
  307.     }
  308.     HX_VERIFY (conn::mConnectionList->RemoveKey ( pConn ) );
  309.     if (conn::m_pTCPStarvingList)
  310.     {
  311. listpos = conn::m_pTCPStarvingList->Find(pConn);
  312. if (listpos)
  313. {
  314.     conn::m_pTCPStarvingList->RemoveAt(listpos);
  315.     pConn->m_ulLastStarvingTime = 0;
  316. }
  317.     }
  318.     
  319.     if (conn::mConnectionList->IsEmpty())
  320.     {
  321. delete conn::mConnectionList;
  322. conn::mConnectionList = NULL;
  323. HX_ASSERT(!conn::m_pTCPStarvingList || conn::m_pTCPStarvingList->IsEmpty());
  324.     }
  325.     if (conn::m_pTCPStarvingList && conn::m_pTCPStarvingList->IsEmpty())
  326.     {
  327. HX_DELETE(conn::m_pTCPStarvingList);
  328.     }
  329.     if (z_pConnectionListMutex)
  330.     {
  331. z_pConnectionListMutex->Unlock();
  332.     }
  333. }
  334. UINT32
  335. conn::bytes_to_preparetcpread(conn* pConn)
  336. {
  337.     // no op. if EnforceMaxBandwidth is FALSE
  338.     if (conn::m_ulMaxBandwidth == MAX_UINT32)
  339.     {
  340. return MAX_UINT32;
  341.     }
  342.     UINT32     ulCurrentTime = HX_GET_TICKCOUNT();
  343.     UINT32     ulBytesToRead = 0;
  344.     LISTPOSITION    listpos = NULL;
  345.     conn*     pStarvingConn = NULL;
  346.     UINT32     ulTimeElapsed = CALCULATE_ELAPSED_TICKS(conn::m_ulTCPReadTimeStamp, ulCurrentTime);
  347.     // return 0 bytes if the current bandwidth >= max. bandwidth
  348.     if (ulTimeElapsed < 1000 && conn::m_ulTCPTotalBytesRead >= conn::m_ulMaxBandwidth)
  349.     {
  350. goto cleanup;
  351.     }
  352.     // reset the attributes every 1 sec
  353.     else if (ulTimeElapsed >= 1000)
  354.     {
  355. conn::m_ulTCPReadTimeStamp = ulCurrentTime;
  356. conn::m_ulTCPTotalBytesRead = 0;
  357.     }
  358.     // remove the conn from the starving list if it has been starving to death :)
  359.     // so other conn has chance to get the its share of bytes
  360.     while (conn::m_pTCPStarvingList && !conn::m_pTCPStarvingList->IsEmpty())
  361.     {
  362. pStarvingConn = (conn*)conn::m_pTCPStarvingList->GetHead();
  363. if (pStarvingConn != pConn &&
  364.     (CALCULATE_ELAPSED_TICKS(pStarvingConn->m_ulLastStarvingTime, ulCurrentTime) >=
  365.     MAX_CONN_STARVINGTIME))
  366. {     
  367.     conn::m_pTCPStarvingList->RemoveHead();
  368.     pStarvingConn->m_ulLastStarvingTime = 0;
  369. }
  370. else
  371. {
  372.     break;
  373. }
  374.     }
  375.     // return 0 bytes if there is starving conn AND pConn is not the starving conn
  376.     // at the top of the list
  377.     if (!pStarvingConn || pStarvingConn == pConn)
  378.     {
  379. // either there is no starving conn OR
  380. // pConn is the starving conn
  381. ulBytesToRead = conn::m_ulMaxBandwidth - conn::m_ulTCPTotalBytesRead;
  382. if (pStarvingConn)
  383. {
  384.     pStarvingConn->m_ulLastStarvingTime = 0;
  385.     conn::m_pTCPStarvingList->RemoveHead();
  386. }
  387.     }
  388. cleanup:
  389.     HX_ASSERT(conn::mConnectionList);
  390.     // if there is no bytes to read and more than 1 source
  391.     if (ulBytesToRead == 0 && conn::mConnectionList && conn::mConnectionList->GetCount() > 1)
  392.     {
  393. if (!conn::m_pTCPStarvingList)
  394. {
  395.     conn::m_pTCPStarvingList = new CHXSimpleList();
  396. }
  397. if (!pConn->m_ulLastStarvingTime)
  398. {
  399.     pConn->m_ulLastStarvingTime = ulCurrentTime;
  400.     conn::m_pTCPStarvingList->AddTail(pConn);
  401. }
  402.     }
  403.     return ulBytesToRead;
  404. }
  405. void
  406. conn::bytes_to_actualtcpread(conn* pConn, UINT32 ulBytesRead)
  407. {
  408.     if (conn::m_ulMaxBandwidth != MAX_UINT32)
  409.     {
  410. conn::m_ulTCPTotalBytesRead += ulBytesRead;
  411.     }
  412. }
  413. HX_RESULT
  414. conn::EnumerateInterfaces
  415.     (REF(UINT32*) pulInterfaces, REF(UINT32) ulNumInterfaces)
  416. {
  417.     HX_RESULT theErr = HXR_OK;
  418.     const UINT32 ulHostNameLen = 256;
  419.  
  420.     char pHostname[ulHostNameLen]; /* Flawfinder: ignore */
  421.     
  422. #ifndef _MACINTOSH
  423.     char **pptr;
  424. #endif
  425. #ifdef _MACINTOSH
  426.     return HXR_UNEXPECTED;
  427. #endif
  428.     theErr = init_drivers(NULL);
  429.     if (FAILED(theErr))
  430.     {
  431. // just retrun, no need to close_driver()
  432. return theErr;
  433.     }
  434.     theErr = get_host_name(pHostname, ulHostNameLen);
  435.     if (FAILED(theErr))
  436.     {
  437. goto bail;
  438.     }    
  439.     // get local host name
  440.     struct hostent* hptr;    
  441.     theErr = get_host_by_name(pHostname, hptr);
  442.     if (FAILED(theErr))
  443.     { 
  444. goto bail;
  445.     }
  446.     HX_ASSERT(hptr);
  447. #ifndef _MACINTOSH
  448.     if (hptr->h_addrtype == AF_INET) 
  449.     {
  450. // get # of interfaces
  451. UINT32 ulIFCount = 0;
  452.      for (pptr = hptr->h_addr_list; *pptr != NULL; pptr++) 
  453.      {
  454.     ulIFCount++;
  455. }
  456. if (ulIFCount > ulNumInterfaces)
  457. {
  458.     // tell the user how many it needs.
  459.     ulNumInterfaces = ulIFCount;
  460.     theErr = HXR_BUFFERTOOSMALL;
  461.     goto bail;
  462. }
  463. ulNumInterfaces= 0;
  464. for (pptr = hptr->h_addr_list; *pptr != NULL; pptr++)
  465. {
  466.     pulInterfaces[ulNumInterfaces++] = DwToHost(*(UINT32*)*pptr);
  467. }
  468. HX_ASSERT(ulNumInterfaces == ulIFCount);
  469. theErr = HXR_OK;
  470.     }
  471.     else
  472.     {
  473. theErr = HXR_UNEXPECTED;
  474.     }
  475. #endif
  476. bail:    
  477.     return theErr;    
  478. }
  479. #if defined(HELIX_FEATURE_SECURECONN)
  480. CHXMapPtrToPtr secureconnhelper::zm_ConnMap;
  481. // xxxbobclark yeesh, why this is required I'm still working on.
  482. // Yuck nonetheless.
  483. void WasteTime()
  484. {
  485. #ifdef _MACINTOSH
  486. ULONG32 startTix = HX_GET_TICKCOUNT();
  487. while (CALCULATE_ELAPSED_TICKS(startTix, HX_GET_TICKCOUNT()) < 200)
  488. {
  489. //     EventRecord er;
  490. //     ::EventAvail(everyEvent, &er);
  491. }
  492. #endif
  493. }
  494. conn*
  495. secureconnhelper::GetConn(LONG32 fakeFD)
  496. {
  497.     conn* pConn = (conn*)zm_ConnMap[(void*)fakeFD];
  498.     
  499.     HX_ASSERT(pConn != NULL);
  500.     
  501.     return pConn;
  502. }
  503. void
  504. secureconnhelper::SetConn(LONG32 fakeFD, conn* pConn)
  505. {
  506.     HX_ASSERT(zm_ConnMap[(void*)fakeFD] == NULL);
  507.     
  508.     zm_ConnMap[(void*)fakeFD] = pConn;
  509. }
  510. long secureconnhelper::readCallback(LONG32 fakeFD, void* buff, LONG32 len)
  511. {
  512.     conn* pConn = GetConn(fakeFD);
  513.     
  514.     HX_RESULT result = HXR_FAIL;
  515.     
  516.     if (pConn)
  517.     {
  518. UINT16 bytes = (UINT16) len;
  519. result = pConn->read(buff, &bytes);
  520. WasteTime();
  521. if (result == HXR_OK)
  522. {
  523.     return bytes;
  524. }
  525.     }
  526.     return -1;
  527. }
  528. long secureconnhelper::writeCallback(LONG32 fakeFD, void* buff, LONG32 len)
  529. {
  530.     conn* pConn = GetConn(fakeFD);
  531.     
  532.     HX_RESULT result = HXR_FAIL;
  533.     
  534.     if (pConn)
  535.     {
  536. UINT16 bytes = (UINT16) len;
  537. result = pConn->write(buff, &bytes);
  538. WasteTime();
  539. if (result == HXR_OK)
  540. {
  541.     return bytes;
  542. }
  543.     }
  544.     return -1;
  545. }
  546. void secureconnhelper::closeCallback(LONG32 fakeFD)
  547. {
  548.     conn* pConn = GetConn(fakeFD);
  549.     
  550.     if (pConn)
  551.     {
  552. pConn->done();
  553.     }
  554. }
  555. LONG32 secureconn::zm_Count = 0;
  556. secureconn::secureconn(IHXSSL* pHXSSL)
  557.   : m_lRefCount(0)
  558.   , m_pActualConn(0)
  559.   , m_FakeFD(-1)
  560.   , m_pHXSSL(NULL)
  561. {
  562.     m_pActualConn = conn::new_socket(HX_TCP_SOCKET);
  563.     m_FakeFD = ++zm_Count;
  564.     secureconnhelper::SetConn(m_FakeFD, m_pActualConn);
  565.     m_pHXSSL = pHXSSL;
  566.     HX_ASSERT(m_pHXSSL != NULL);
  567.     m_pHXSSL->AddRef();
  568.     
  569.     m_pHXSSL->SetCallbacks((void*)secureconnhelper::readCallback,
  570.                            (void*)secureconnhelper::writeCallback,
  571.                            (void*)secureconnhelper::closeCallback);
  572.     
  573.     m_pHXSSL->Initialize();
  574. }
  575. secureconn::~secureconn()
  576. {
  577.     HX_ASSERT(m_pActualConn != NULL);
  578.     m_pHXSSL->Shutdown();
  579.     
  580.     HX_RELEASE(m_pHXSSL);
  581.     if (m_pActualConn)
  582.     {
  583.         m_pActualConn->Release();
  584.         m_pActualConn = NULL;
  585.     }
  586. }
  587. ULONG32 secureconn::AddRef()
  588. {
  589.     return InterlockedIncrement(&m_lRefCount);
  590. }
  591. ULONG32 secureconn::Release()
  592. {
  593.     if (InterlockedDecrement(&m_lRefCount) > 0)
  594.     {
  595.         return m_lRefCount;
  596.     }
  597.     delete this;
  598.     return 0;
  599. }
  600. HX_RESULT
  601. secureconn::connect(const char* host, UINT16 port, UINT16 blocking, ULONG32 ulPlatform)
  602. {
  603.     HX_ASSERT(m_pActualConn != NULL);
  604.     HX_ASSERT(m_pHXSSL != NULL);
  605.     
  606.     HX_RESULT result = m_pActualConn->connect(host, port, blocking, ulPlatform);
  607.     WasteTime();
  608.     
  609.     if (result == HXR_OK)
  610.     {
  611. result = m_pHXSSL->PostConnect(m_FakeFD);
  612.     }
  613.     
  614.     return result;
  615. }
  616. HX_RESULT
  617. secureconn::read(void* buf, UINT16* size)
  618. {
  619.     HX_ASSERT(m_pActualConn != NULL);
  620.     
  621.     HX_ASSERT(m_pHXSSL != NULL);
  622.     
  623.     LONG32 len = *size;
  624.     
  625.     len = m_pHXSSL->Read(m_FakeFD, buf, len);
  626.     
  627.     if (len == -1) return HXR_FAIL;
  628.     
  629.     *size = (UINT16) len;
  630.     return HXR_OK;
  631. }
  632. HX_RESULT
  633. secureconn::write(void* buf, UINT16* size)
  634. {
  635.     HX_ASSERT(m_pActualConn != NULL);
  636.     HX_ASSERT(m_pHXSSL != NULL);
  637.     
  638.     LONG32 len = *size;
  639.     
  640.     len = m_pHXSSL->Write(m_FakeFD, buf, len);
  641.     
  642.     if (len == -1) return HXR_FAIL;
  643.     
  644.     *size = (UINT16) len;
  645.     return HXR_OK;
  646. }
  647. HX_RESULT secureconn::blocking()
  648. {
  649.     HX_ASSERT(m_pActualConn != NULL);
  650.     
  651.     return m_pActualConn->blocking();
  652. }
  653. HX_RESULT secureconn::nonblocking()
  654. {
  655.     HX_ASSERT(m_pActualConn != NULL);
  656.     
  657.     return m_pActualConn->nonblocking();
  658. }
  659. HX_RESULT secureconn::readfrom(REF(IHXBuffer*)   pBuffer,
  660.  REF(UINT32)     ulAddress,
  661.  REF(UINT16)     ulPort)
  662. {
  663.     HX_ASSERT(m_pActualConn != NULL);
  664.     
  665.     return m_pActualConn->readfrom(pBuffer, ulAddress, ulPort);
  666. }
  667. HX_RESULT secureconn::writeto(void  *buf,
  668.  UINT16  *len, 
  669.  ULONG32  addr,
  670.  UINT16  port)
  671. {
  672.     HX_ASSERT(m_pActualConn != NULL);
  673.     
  674.     return m_pActualConn->writeto(buf, len, addr, port);
  675. }
  676. ULONG32 secureconn::get_addr()
  677. {
  678.     HX_ASSERT(m_pActualConn != NULL);
  679.     
  680.     return m_pActualConn->get_addr();
  681. }
  682. UINT16 secureconn::get_local_port()
  683. {
  684.     HX_ASSERT(m_pActualConn != NULL);
  685.     
  686.     return m_pActualConn->get_local_port();
  687. }
  688. HX_RESULT
  689. secureconn::dns_find_ip_addr(const char * host, UINT16 blocking)
  690. {
  691.     HX_ASSERT(m_pActualConn != NULL);
  692.     
  693.     return m_pActualConn->dns_find_ip_addr(host, blocking);
  694. }
  695. BOOL
  696. secureconn::dns_ip_addr_found(BOOL * valid, ULONG32 *addr)
  697. {
  698.     HX_ASSERT(m_pActualConn != NULL);
  699.     
  700.     return m_pActualConn->dns_ip_addr_found(valid, addr);
  701. }
  702. void
  703. secureconn::done()
  704. {
  705.     HX_ASSERT(m_pActualConn != NULL);
  706.     
  707.     m_pActualConn->done();
  708. }
  709. HX_RESULT
  710. secureconn::init(UINT32 local_addr,
  711. UINT16  port, 
  712.  UINT16  blocking)
  713. {
  714.     HX_ASSERT(m_pActualConn != NULL);
  715.     
  716.     return m_pActualConn->init(local_addr, port, blocking);
  717. }
  718. HX_RESULT
  719. secureconn::listen(ULONG32 ulLocalAddr,
  720.  UINT16 port,
  721.  UINT16  backlog,
  722.  UINT16 blocking,
  723.  ULONG32 ulPlatform)
  724. {
  725.     HX_ASSERT(m_pActualConn != NULL);
  726.     
  727.     return m_pActualConn->listen(ulLocalAddr, port, backlog, blocking, ulPlatform);
  728. }
  729. HX_RESULT
  730. secureconn::join_multicast_group(ULONG32 addr, ULONG32 if_addr)
  731. {
  732.     HX_ASSERT(m_pActualConn != NULL);
  733.     
  734.     return m_pActualConn->join_multicast_group(addr, if_addr);
  735. }
  736. HX_RESULT
  737. secureconn::leave_multicast_group(ULONG32 addr, ULONG32 if_addr)
  738. {
  739.     HX_ASSERT(m_pActualConn != NULL);
  740.     
  741.     return m_pActualConn->leave_multicast_group(addr, if_addr);
  742. }
  743. HX_RESULT
  744. secureconn::set_broadcast(BOOL enable)
  745. {
  746.     HX_ASSERT(m_pActualConn != NULL);
  747.     
  748.     return m_pActualConn->set_broadcast(enable);
  749. }
  750. HX_RESULT
  751. secureconn::set_multicast_if(UINT32 ulInterface)
  752. {
  753.     HX_ASSERT(m_pActualConn != NULL);
  754.     
  755.     return m_pActualConn->set_multicast_if(ulInterface);
  756. }
  757. HX_RESULT
  758. secureconn::last_error()
  759. {
  760.     HX_ASSERT(m_pActualConn != NULL);
  761.     
  762.     return m_pActualConn->last_error();
  763. }
  764. #ifdef _MACINTOSH
  765. HX_RESULT
  766. secureconn::GetEndpoint(REF(void*) pRef)
  767. {
  768.     HX_ASSERT(m_pActualConn != NULL);
  769.     
  770.     return m_pActualConn->GetEndpoint(pRef);
  771. }
  772. HX_RESULT
  773. secureconn::SetupEndpoint(BOOL bWait)
  774. {
  775.     HX_ASSERT(m_pActualConn != NULL);
  776.     
  777.     return m_pActualConn->SetupEndpoint(bWait);
  778. }
  779. #endif
  780. void
  781. secureconn::set_callback(HXAsyncNetCallback* pCallback)
  782. {
  783.     HX_ASSERT(m_pActualConn != NULL);
  784.     
  785.     m_pActualConn->set_callback(pCallback);
  786. }
  787. UINT16
  788. secureconn::connection_open()
  789. {
  790.     HX_ASSERT(m_pActualConn != NULL);
  791.     
  792.     return m_pActualConn->connection_open();
  793. }
  794. int
  795. secureconn::get_sock()
  796. {
  797.     HX_ASSERT(m_pActualConn != NULL);
  798.     
  799.     return m_pActualConn->get_sock();
  800. }
  801. void
  802. secureconn::set_sock(int theSock)
  803. {
  804.     HX_ASSERT(m_pActualConn != NULL);
  805.     
  806.     m_pActualConn->set_sock(theSock);
  807. }
  808. BOOL
  809. secureconn::set_receive_buf_size(int DesiredSize)
  810. {
  811.     HX_ASSERT(m_pActualConn != NULL);
  812.     
  813.     return m_pActualConn->set_receive_buf_size(DesiredSize);
  814. }
  815. HX_RESULT
  816. secureconn::reuse_addr(BOOL enable)
  817. {
  818.     HX_ASSERT(m_pActualConn != NULL);
  819.     
  820.     return m_pActualConn->reuse_addr(enable);
  821. }
  822. HX_RESULT
  823. secureconn::reuse_port(BOOL enable)
  824. {
  825.     HX_ASSERT(m_pActualConn != NULL);
  826.     
  827.     return m_pActualConn->reuse_port(enable);
  828. }
  829. #endif /* HELIX_FEATURE_SECURECONN */
  830. #ifdef TESTING
  831. #include "conn.h"
  832. int opt_debug = 0xff;
  833. int main( int argc, char **argv )
  834. {
  835. conn *m_conn = 0;
  836. HX_RESULT theErr = HXR_OK;
  837. m_conn = conn::new_socket( HX_TCP_SOCKET );
  838. if ( m_conn )
  839. {
  840. // XXXAAK -- local addr binding stuff
  841. theErr = m_conn->init( INADDR_ANY, argc > 2 ? atoi(argv[2]) : 7071, 1);
  842. if ( !theErr )
  843. {
  844. theErr = m_conn->connect( argc > 1 ? argv[1] : "localhost",
  845. argc > 2 ? atoi(argv[2]) : 7071,
  846. 1);
  847. printf("connect(): %s, port: %d, theErr: %d, errno: %dn", 
  848. argc > 1 ? argv[1] : "localhost",
  849. argc > 2 ? atoi(argv[2]) : 7071,
  850. theErr, errno );
  851. }
  852. else
  853. printf("Couldn't init port: %d, theErr: %dn",
  854. argc > 2 ? atoi(argv[2]) : 7071,
  855. theErr);
  856. }
  857. else
  858. printf("Couldn't create a new TCP socket!n");
  859. exit(0);
  860. }
  861. #endif