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

Symbian

开发平台:

Visual C++

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