conn.h
上传用户:zhongxx05
上传日期:2007-06-06
资源大小:33641k
文件大小:17k
源码类别:

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. #ifdef _MACINTOSH
  36. #pragma once
  37. #endif
  38. #ifndef _conn
  39. #define _conn
  40. #include "hlxclib/time.h"
  41. #include "hxtypes.h"
  42. #include "hxresult.h"
  43. #include "hxslist.h"
  44. //#include "callback.h"
  45. #include "hxmap.h" // for CHXMapPtrToPtr class
  46. #include "hxcom.h"
  47. #include "hxengin.h"
  48. struct IHXBuffer;
  49. struct sockaddr_in;
  50. typedef enum _NotificationType
  51. {
  52.     READ_NOTIFICATION     = 0,
  53.     WRITE_NOTIFICATION     = 1,
  54.     CONNECT_NOTIFICATION    = 2,
  55.     DNS_NOTIFICATION     = 3,
  56.     CLOSE_NOTIFICATION     = 4,
  57.     ACCEPT_NOTIFICATION     = 5,
  58.     SEND_BUFFER_NOTIFICATION = 6
  59. } NotificationType;
  60. class conn;
  61. class HXAsyncNetCallback
  62. {
  63. public:
  64.     virtual HX_RESULT Func(NotificationType Type, BOOL bSuccess = TRUE, conn* pConn = NULL) = 0;
  65. };
  66. #ifndef HX_INVALID_SOCKET
  67. #define HX_INVALID_SOCKET -1
  68. #endif
  69. #define HX_TCP_SOCKET 1
  70. #define HX_UDP_SOCKET 2
  71. #define MAX_CACHE 10
  72. #if defined(HELIX_CONFIG_LOW_HEAP_STREAMING) && !defined(HELIX_FEATURE_NETWORK_USE_SELECT)
  73. // We want this value to be as small as possible. Dividing by 16 brings us to
  74. // 2048 which seems by trial and error to be optimal.
  75. #define TCP_BUF_SIZE  (32768>>4)
  76. #else
  77. // This was 32678. I assume it was supposed to be 32768. XXXJHHB
  78. #define TCP_BUF_SIZE  32768
  79. #endif // HELIX_FEATURE_MIN_HEAP
  80. typedef struct DNR_cache
  81. {
  82.     DNR_cache()
  83.     {
  84. domainName  = NULL; // domainName cached
  85.     }
  86.     ~DNR_cache()
  87.     {
  88. if (domainName)
  89. {
  90.     delete [] domainName;
  91. }
  92.     }
  93.     ULONG32  addr; // inet address of domainName
  94.     time_t cachetime; // time of caching
  95.     UINT16  empty; // cache slot is empty
  96.     char*  domainName; // domainName cached
  97. } DNR_cache, *DNR_cache_ptr;
  98. typedef struct _UDP_PACKET
  99. {
  100.     IHXBuffer* pBuffer;
  101.     UINT32 ulAddress;
  102.     UINT16 ulPort;
  103. } UDP_PACKET;
  104. class HXThread;
  105. class conn 
  106. {
  107. public:
  108. static void DestructGlobals();
  109. /*  conn::is_cached searched the cached DNR for host and returns its inet address 
  110. in  addr and 1 if it was found, or 0 if it was not found */
  111. static UINT16 is_cached  (char *host,ULONG32 *addr);
  112. /*  conn::add_to_cache adds the host and its inet addr to the cache. If the cache is
  113. full, the oldest entry is replaced with the new entry*/
  114. static void add_to_cache  (char *host,ULONG32 addr);
  115. /*  conn::remove_from_cache removes the host name from the cache */
  116. static void remove_from_cache  (const char *host);
  117. static void clear_cache();
  118. /*  call init_drivers() to do any platform specific initialization of the network drivers
  119. before calling any other functions in this class. params is a pointer to an optional
  120. platform specific structure needed to initialize the drivers. Simply typecast it to
  121. the correct struct in your platform specific version of init_drivers. The function
  122. will return HXR_OK if an error occurred otherwise it will return the platform
  123. specific error */
  124. static HX_RESULT init_drivers  (void *params);
  125. /*  close_drivers() should close any network drivers used by the program
  126.   NOTE: The program MUST not make any other calls to the network drivers
  127.   until init_drivers() has been called */
  128. static HX_RESULT close_drivers  (void *params);
  129. /*  host_to_ip_str() converts the host name to an ASCII ip address of
  130. the form "XXX.XXX.XXX.XXX" */
  131. static  HX_RESULT  host_to_ip_str (char *host, char *ip, UINT32 ulIPBufLen);
  132. /*  call new_socket() to automatically create the correct platform specific network object.
  133. The type parameter may be either HX_TCP_SOCKET or HX_UDP_SOCKET. If new_socket() returns 
  134. NULL, an error occurred and the conn object was not created. Call last_error to get the error */
  135. static conn *new_socket      (UINT16 type);
  136. // just for DNS for hostname...
  137. // is introduced for RTSP...
  138. virtual HX_RESULT dns_find_ip_addr (const char * host, UINT16 blocking=0) = 0;
  139. virtual BOOL dns_ip_addr_found(BOOL * valid, ULONG32 *addr) = 0;
  140. /*  last_error() returns the last platform specific error that occurred on this socket */
  141. virtual HX_RESULT last_error (void) {return mLastError;};
  142. /*  call done() when you are finsihed with the socket. Done() will close the socket.
  143. You may reuse the socket by calling init() or connect() or listen() */
  144. virtual void done (void) = 0;
  145. virtual HX_RESULT init (UINT32 local_addr,
  146.  UINT16  port, 
  147.  UINT16  blocking=0) = 0;
  148. virtual HX_RESULT listen (ULONG32 ulLocalAddr,
  149.  UINT16 port,
  150.  UINT16  backlog,
  151.  UINT16 blocking,
  152.  ULONG32 ulPlatform) = 0;
  153. //////////////////////////////////////////////////////////////////
  154. // NOTE: 96/10/15 Brad
  155. // This is temporarily windows only, since it is related to
  156. // some experimental proxy/multicast work and is not yet needed
  157. // for all the platforms. It is not clear what the cross platform
  158. // equivilent to the sockaddr is.
  159. #if defined (_WINDOWS) || defined (_WIN32)
  160. // virtual HX_RESULT accept (ULONG32* pAddr) = 0;
  161. // we need it for dns_find_ip_addr since async stuff needs a window handle...
  162. virtual HX_RESULT  SetWindowHandle(ULONG32 handle) {return HXR_OK;};
  163. #elif defined (_MACINTOSH)
  164. /* 
  165.  * these are mac only - required for setting up
  166.  * a socket to accept a new incomming connection
  167.  */ 
  168.   virtual HX_RESULT GetEndpoint(REF(void*) pRef) {return HXR_NOTIMPL;}
  169. virtual HX_RESULT SetupEndpoint(BOOL bWait) {return HXR_NOTIMPL;}
  170. #endif
  171. virtual ULONG32     AddRef     (void)  = 0;
  172. virtual ULONG32     Release     (void)  = 0;
  173. virtual HX_RESULT connect (const char *host, 
  174.  UINT16  port,
  175.  UINT16  blocking=0,
  176.  ULONG32 ulPlatform=0 ) = 0;
  177.  
  178. virtual HX_RESULT blocking (void) = 0;
  179. virtual HX_RESULT nonblocking (void) = 0;
  180. virtual HX_RESULT read (void  *buf, 
  181.  UINT16  *size) = 0;
  182. virtual HX_RESULT readfrom (REF(IHXBuffer*)   pBuffer,
  183.  REF(UINT32)     ulAddress,
  184.  REF(UINT16)     ulPort) = 0;
  185. virtual HX_RESULT write (void  *buf,
  186.  UINT16  *size) = 0;
  187. virtual HX_RESULT writeto (void  *buf,
  188.  UINT16  *len, 
  189.  ULONG32  addr,
  190.  UINT16  port) = 0;
  191. virtual ULONG32 get_addr (void) = 0;
  192. virtual UINT16 get_local_port (void) = 0;
  193. virtual void set_callback (HXAsyncNetCallback* pCallback) {mCallBack = pCallback;};
  194. virtual HXAsyncNetCallback* get_callback() {return mCallBack;};
  195. /* connection_open() returns 1 if the socket is open 0 is it is closed */
  196. virtual  UINT16 connection_open (void) {return mConnectionOpen;};
  197. virtual  UINT16 connection_really_open (void) {return mConnectionOpen;};
  198. /* get_sock() returns the socket number or -1 if the socket is invalid */
  199. virtual int get_sock (void) {return mSock;};
  200. virtual void set_sock ( int theSock ) { mSock = theSock; };
  201. virtual BOOL set_receive_buf_size(int DesiredSize) {return FALSE;};
  202. /* join_multicast_group() has this socket join a multicast group */
  203. virtual HX_RESULT join_multicast_group 
  204.     (ULONG32 addr, ULONG32 if_addr = HX_INADDR_ANY) = 0;
  205. virtual HX_RESULT leave_multicast_group
  206.     (ULONG32 addr, ULONG32 if_addr = HX_INADDR_ANY) = 0;
  207. virtual HX_RESULT       set_multicast() {return HXR_NOTIMPL;};
  208. virtual HX_RESULT       set_multicast_ttl(unsigned char ttl) {return HXR_NOTIMPL;};
  209. /* SetSockOpt */
  210. virtual HX_RESULT set_broadcast (BOOL enable) =0;
  211. virtual HX_RESULT reuse_addr(BOOL enable) {return HXR_NOTIMPL;};
  212. virtual HX_RESULT reuse_port(BOOL enable) {return HXR_NOTIMPL;};
  213. virtual HX_RESULT set_multicast_if(UINT32 ulInterface) = 0;
  214. virtual HX_RESULT       set_send_size(UINT32 send_size) {return HXR_NOTIMPL;};
  215. // IHXNetworkInterfaceEnumerator support */
  216. static HX_RESULT EnumerateInterfaces
  217.     (REF(UINT32*) pulInterfaces, REF(UINT32) ulNumInterfaces);     
  218. static HX_RESULT get_host_name(char *name, int namelen);
  219. static HX_RESULT get_host_by_name(char *name, REF(struct hostent*) pHostent);
  220. virtual void SetUserThread(HXThread* pThread) {m_pUserThread = pThread;};
  221. virtual HXThread* GetUserThread(void) {return m_pUserThread;};
  222. /* get_first_connection_position returns the position of the first connection
  223.    in the list of connections; if the list is empty the return value is
  224.    NULL */
  225. static POSITION get_first_connection_position ();
  226. /* get_next_connection returns the conn object at POSITION and increments
  227.    POSITION to point to the next */
  228. static void get_next_connection (POSITION&  nextPos,
  229.  conn *&  rpConn);
  230. static void set_maxbandwidth (UINT32 ulBandwidth);
  231. // TCP max. bandwidth management
  232. static UINT32 bytes_to_preparetcpread(conn* pConn);
  233. static void bytes_to_actualtcpread(conn* pConn, UINT32 ulBytesRead);
  234. UINT32 m_ulLastStarvingTime;
  235. static UINT32    m_ulMaxBandwidth;
  236.         inline void SetAsyncDNSPref(BOOL bNoAsyncDNS)
  237.         { m_bNoAsyncDNS = bNoAsyncDNS; }
  238.         inline BOOL GetAsyncDNSPref(void) const { return m_bNoAsyncDNS; }
  239.         
  240.         static inline void SetNetworkThreadingPref(BOOL bNetworkThreading)
  241.         { m_bNetworkThreading = bNetworkThreading; }
  242.         static inline BOOL GetNetworkThreadingPref(void) { return m_bNetworkThreading; }
  243.         
  244.         static inline void SetThreadedDNSPref(BOOL bThreadedDNS ) { m_bThreadedDNS = bThreadedDNS; }
  245.         static inline BOOL GetThreadedDNSPref(void) { return m_bThreadedDNS; }    
  246.         /*
  247.          * WinSock Recvfrom() Now Returns WSAECONNRESET Instead of Blocking or Timing Out (Q263823)
  248.          * workaround - only for win UDP
  249.          */
  250.         virtual void IgnoreWSAECONNRESET(BOOL b) {}
  251.         
  252. /*
  253.  * to run the networkthreadmainloop from select instead of the timer 
  254.  * implement this function in your platform specific connection class
  255.  * the parameters are the 3 fdset structures and timeval used in select
  256.  */
  257. #if defined(HELIX_FEATURE_NETWORK_USE_SELECT)
  258. virtual HX_RESULT WaitforSelect(void *,void *) = 0;
  259. virtual HX_RESULT CheckForConnection()=0;
  260. #endif /* HELIX_FEATURE_NETWORK_USE_SELECT */
  261.         
  262. protected:
  263. /*  Constructor NOTE: use new_socket() to create an instance of this class */
  264. conn (void);
  265. /*  class destructor */
  266. virtual     ~conn (void);
  267. int mSock;
  268. HX_RESULT mLastError; // last error to occur on this socket
  269. UINT16 mConnectionOpen;
  270. HXAsyncNetCallback* mCallBack;
  271. static DNR_cache mCache[MAX_CACHE];
  272. static UINT16  mCacheCount;
  273. // just for DNS for hostname...
  274. // is introduced for RTSP...
  275. ULONG32 mHostIPAddr;
  276. BOOL mHostIPValid;
  277. BOOL mDNSDone;
  278. HXThread* m_pUserThread;
  279. UCHAR* m_pUDPBuffer;
  280. protected:
  281. /* add_connection_to_list () is called by the factory method new_socket()
  282.    to keep track of all the sockets in the system; it should only be
  283.    accessible to the base class since that's where the factory method resides */
  284. static void add_connection_to_list ( conn *pConn );
  285. /* remove_connection_from_list () is called in the base class destructor 
  286.    to remove objects from the list of connections. */
  287. static void remove_connection_from_list ( conn *pConn );
  288. static conn* actual_new_socket  (UINT16 type);
  289. static CHXMapPtrToPtr* mConnectionList;
  290. static HXThread* m_pNetworkThread;
  291. // TCP max. bandwidth management
  292. static UINT32 m_ulTCPTotalBytesRead;
  293. static UINT32 m_ulTCPReadTimeStamp;
  294. static CHXSimpleList* m_pTCPStarvingList;
  295.         //This member variable holds the pref for turning on/off Async
  296.         //DNS. Async DNS, under un*x, uses a fork which screws up 'gdb'.
  297.         //You can set NoAsyncDNS=1 in your prefs file to turn off the fork.
  298.         BOOL m_bNoAsyncDNS;
  299.         static BOOL m_bNetworkThreading;
  300.         static BOOL m_bThreadedDNS;
  301. };
  302. class DestructConnGlobals
  303. {
  304. public:
  305.     DestructConnGlobals() {};
  306.     ~DestructConnGlobals() {conn::DestructGlobals();};
  307. };
  308. #if defined(HELIX_FEATURE_SECURECONN)
  309. class secureconn : public conn
  310. {
  311. private:
  312.     LONG32 m_lRefCount;
  313.     conn* m_pActualConn;
  314.     LONG32 m_FakeFD;
  315.     static LONG32 zm_Count;
  316.     IHXSSL* m_pHXSSL;
  317.     
  318. public:
  319.     secureconn(IHXSSL* pHXSSL);
  320.     virtual ~secureconn();
  321.     
  322.     virtual ULONG32 AddRef(void);
  323.     virtual ULONG32 Release(void);
  324.     
  325.     virtual HX_RESULT connect(const char* host, UINT16 port, UINT16 blocking=0, ULONG32 ulPlatform=0);
  326.     virtual HX_RESULT read(void* buf, UINT16* size);
  327.     virtual HX_RESULT write(void* buf, UINT16* size);
  328.     
  329.     virtual HX_RESULT blocking(void);
  330.     virtual HX_RESULT nonblocking(void);
  331.     virtual HX_RESULT readfrom (REF(IHXBuffer*)   pBuffer,
  332.  REF(UINT32)     ulAddress,
  333.  REF(UINT16)     ulPort);
  334.     virtual HX_RESULT writeto (void  *buf,
  335.  UINT16  *len, 
  336.  ULONG32  addr,
  337.  UINT16  port);
  338.     virtual ULONG32 get_addr (void);
  339.     virtual UINT16 get_local_port (void);
  340.     virtual HX_RESULT dns_find_ip_addr (const char * host, UINT16 blocking=0);
  341.     virtual BOOL dns_ip_addr_found(BOOL * valid, ULONG32 *addr);
  342.     virtual void done(void);
  343.     virtual HX_RESULT init (UINT32 local_addr,
  344.  UINT16  port, 
  345.  UINT16  blocking=0);
  346.     virtual HX_RESULT listen (ULONG32 ulLocalAddr,
  347.  UINT16 port,
  348.  UINT16  backlog,
  349.  UINT16 blocking,
  350.  ULONG32 ulPlatform);
  351.     virtual HX_RESULT join_multicast_group 
  352.     (ULONG32 addr, ULONG32 if_addr = HX_INADDR_ANY);
  353.     virtual HX_RESULT leave_multicast_group
  354.     (ULONG32 addr, ULONG32 if_addr = HX_INADDR_ANY);
  355.     virtual HX_RESULT set_broadcast (BOOL enable);
  356.     virtual HX_RESULT set_multicast_if(UINT32 ulInterface);
  357.     
  358.     // all of these functions need to be implemented so I can
  359.     // call through to the final implemenations' code.
  360.     
  361. virtual HX_RESULT last_error (void);
  362. #if defined (_WINDOWS) || defined (_WIN32)
  363. // virtual HX_RESULT  SetWindowHandle(ULONG32 handle) {return HXR_OK;};
  364. #elif defined (_MACINTOSH)
  365.   virtual HX_RESULT GetEndpoint(REF(void*) pRef);
  366. virtual HX_RESULT SetupEndpoint(BOOL bWait);
  367. #endif
  368. virtual void set_callback (HXAsyncNetCallback* pCallback);
  369. virtual  UINT16 connection_open (void);
  370. virtual int get_sock (void);
  371. virtual void set_sock ( int theSock );
  372. virtual BOOL set_receive_buf_size(int DesiredSize);
  373. virtual HX_RESULT reuse_addr(BOOL enable);
  374. virtual HX_RESULT reuse_port(BOOL enable);
  375. #if defined(HELIX_FEATURE_NETWORK_USE_SELECT)
  376.     HX_RESULT     WaitforSelect(void *,void *) {return HXR_FAIL;};
  377.     virtual HX_RESULT CheckForConnection(){return HXR_FAIL;};
  378. #endif // HELIX_FEATURE_NETWORK_USE_SELECT
  379. };
  380. class secureconnhelper
  381. {
  382. public:
  383. static CHXMapPtrToPtr zm_ConnMap;
  384. static conn* GetConn(LONG32 fakeFD);
  385. static void SetConn(LONG32 fakeFD, conn* pConn);
  386. // callbacks from rnssl
  387. static long readCallback(LONG32 fakeFD, void* buff, LONG32 len);
  388. static long writeCallback(LONG32 fakeFD, void* buff, LONG32 len);
  389. static void closeCallback(LONG32 fakeFD);
  390. };
  391. #endif /* HELIX_FEATURE_SECURECONN */
  392. #endif // _conn