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

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. #ifndef _THREADCONN_
  36. #define _THREADCONN_
  37. // These are the definitions of the messages our WndProc handles
  38. #ifdef _WIN32
  39. class CAsyncNetThread; // forward declare for Win32
  40. #endif
  41. //Defines for the HXMSGs.
  42. #include "hxmsgs.h"
  43. #include "hxslist.h"
  44. class HXMutex;
  45. class HXThread;
  46. class HXEvent;
  47. struct IHXCallback;
  48. class CByteGrowingQueue;
  49. struct IHXBuffer;
  50. class ThreadedConn : public conn 
  51. {
  52. public:
  53. //    static  HXThread*  GetNetworkThread(void);
  54. //    static  void        DestroyNetworkThread(void);
  55. ThreadedConn (UINT16 type);
  56. /*  call new_socket() to automatically create the correct platform specific network object.
  57.     The type parameter may be either HX_TCP_SOCKET or HX_UDP_SOCKET. If new_socket() returns 
  58.     NULL, an error occurred and the conn object was not created. Call last_error() to get the error */
  59.     
  60.     static ThreadedConn* new_socket  (UINT16 type);
  61. /*  call done() when you are finsihed with the socket. Done() will close the socket.
  62.     You may reuse the socket by calling init() or connect() */
  63.     
  64.     virtual void        done            (void);
  65.     virtual ULONG32     AddRef     (void);
  66.     virtual ULONG32     Release     (void);
  67.     
  68.     // just for DNS for hostname...
  69.     // is introduced for RTSP...
  70.     virtual HX_RESULT dns_find_ip_addr (const char * host, UINT16 blocking=0);
  71.     virtual BOOL dns_ip_addr_found(BOOL * valid, ULONG32 *addr);
  72.     virtual HX_RESULT init (UINT32 local_addr,
  73.  UINT16  port, 
  74.  UINT16  blocking=0);
  75.      
  76.     virtual HX_RESULT listen (ULONG32 ulLocalAddr,
  77.  UINT16 port,
  78.  UINT16  backlog,
  79.  UINT16  blocking=0,
  80.  ULONG32 ulPlatform=0);
  81.     
  82.     virtual HX_RESULT connect (const char *host, 
  83.  UINT16  port,
  84.  UINT16  blocking=0,
  85.  ULONG32 ulPlatform=0);
  86.     
  87.     virtual HX_RESULT blocking (void);
  88.     
  89.     virtual HX_RESULT nonblocking (void);
  90.     
  91.     virtual HX_RESULT read (void  *buf, 
  92.  UINT16  *size);
  93.     virtual HX_RESULT readfrom (REF(IHXBuffer*)   pBuffer,
  94.  REF(UINT32)     ulAddress,
  95.  REF(UINT16)     ulPort);
  96.     
  97.     virtual HX_RESULT write (void  *buf,
  98.  UINT16  *size);
  99.     virtual HX_RESULT writeto (void  *buf,
  100.  UINT16  *len, 
  101.  ULONG32  addr,
  102.  UINT16  port);
  103.     virtual HX_RESULT join_multicast_group(ULONG32 addr, ULONG32 if_addr);
  104.     virtual HX_RESULT leave_multicast_group(ULONG32 addr, ULONG32 if_addr);
  105.     virtual UINT16 connection_really_open(void);
  106. virtual HX_RESULT   set_broadcast(BOOL enable);
  107.     virtual HX_RESULT reuse_addr(BOOL enable);
  108.     virtual HX_RESULT reuse_port(BOOL enable);
  109.     virtual HX_RESULT set_multicast_if(ULONG32 ulInterface);
  110.     virtual ULONG32 get_addr (void) ;
  111.     virtual UINT16 get_local_port (void) ;
  112.     virtual void IgnoreWSAECONNRESET (BOOL b);
  113. #if defined(HELIX_FEATURE_NETWORK_USE_SELECT)
  114.     HX_RESULT     WaitforSelect(void *,void *) {return HXR_FAIL;};
  115.     HX_RESULT     ActualAccept(ULONG32     ulAddr,
  116.  ULONG32     ulPlatform);
  117.     virtual HX_RESULT accept (ULONG32 ulAddr);
  118.     virtual HX_RESULT CheckForConnection(){return HXR_FAIL;};
  119. #endif // HELIX_FEATURE_NETWORK_USE_SELECT
  120. #if defined (_WINDOWS) || defined (_WIN32)
  121.     // we need it for dns_find_ip_addr since async stuff needs a window handle...
  122.     virtual HX_RESULT  SetWindowHandle(ULONG32 handle);
  123.     
  124.     
  125.     HX_RESULT  ActuallSetWindowHandle(ULONG32 handle);
  126. #endif
  127.      
  128.     void set_callback(HXAsyncNetCallback* pCallback);
  129.     HXAsyncNetCallback* get_callback() {return m_pNetCallback;};
  130.     HX_RESULT last_error(void);
  131.     UINT16 connection_open(void);
  132.     int get_sock(void);
  133.     void set_sock(int theSock);
  134.     BOOL set_receive_buf_size(int DesiredSize);
  135.     void OnAsyncDNS(BOOL bResult);
  136.     void OnConnect(BOOL bResult);
  137.     void OnReadNotification(void);
  138.     void OnWriteNotification(void);
  139.     void OnAcceptNotification(void);
  140.     HX_RESULT ActualDnsFindIpAddr(const char* host, UINT16 blocking);
  141.     HX_RESULT ActualInit(UINT32 local_addr,UINT16 port, UINT16 blocking);
  142.     HX_RESULT ActualConnect(const char*   host, 
  143.       UINT16     port,
  144.       UINT16      blocking,
  145.       ULONG32     ulPlatform);
  146.     HX_RESULT ActualListen(ULONG32     ulLocalAddr,
  147.      UINT16     port,
  148.      UINT16     backlog,
  149.      UINT16      blocking,
  150.      ULONG32     ulPlatform);
  151.     HX_RESULT ActualBlocking(void);
  152.     HX_RESULT ActualNonBlocking(void);
  153.     void ActualDone(void);
  154.     BOOL ActualSetReceiveBufSize(UINT32 ulBufferSize);
  155.     void HandleAcceptNotification(conn* pConn);
  156.     void HandleDNSNotification(BOOL bSuccess);
  157.     void HandleConnectNotification(BOOL bSuccess);
  158.     void HandleCloseNotification();
  159.     HX_RESULT DoRead(BOOL bFromReadNotification = FALSE);
  160.     void DoWrite();
  161.     void DoNetworkIO();
  162.     
  163.     void finaldone (void);
  164.     void Detached();
  165.     BOOL IsDone() { return m_bIsDone;};
  166.     conn* GetActualConn() {return m_pActualConn;};
  167.     BOOL m_bNetworkIOPending;
  168. protected:
  169. ~ThreadedConn (void);
  170.     HX_RESULT ConvertNetworkError(HX_RESULT theErr);
  171.     HX_RESULT PostIOMessage();
  172. #if defined (_WIN32) || defined (WIN32)
  173.     CAsyncNetThread*     m_pNotifier;
  174. #endif
  175.     LONG32     m_lRefCount;
  176.     conn*     m_pActualConn;
  177.     UINT16     m_uSocketType;
  178.     HXThread*     m_pNetworkThread;
  179.     HXThread*     m_pMainAppThread;
  180.     HXMutex*     m_pMutex;
  181.     HXEvent*     m_pInitEvent;
  182.     HXEvent*     m_pQuitEvent;
  183.     HXEvent*     m_pDetachEvent;
  184.     HXEvent*     m_pListenEvent;
  185.     CHXSimpleList     m_ReadUDPBuffers;
  186.     CHXSimpleList     m_WriteUDPBuffers;
  187.     CByteGrowingQueue*     m_pSendTCP;
  188.     CByteGrowingQueue*     m_pReceiveTCP;
  189.     char*     m_pTempBuffer;
  190.     BOOL     m_bConnected;
  191.     ULONG32     m_ulUserHandle;
  192.     void*     m_pInternalWindowHandle;
  193.     BOOL     m_bDetachPending;
  194.     BOOL     m_bIsDone;
  195.     BOOL     m_bInitialized;
  196.     BOOL     m_bOutstandingReadNotification;
  197.     BOOL     m_bOutstandingWriteNotification;
  198.     BOOL     m_bWriteFlushPending;
  199.     BOOL     m_bReadNowPending;
  200.     BOOL     m_bReadPostPendingWouldBlock;
  201.     BOOL     m_bListenning;
  202.     CHXSimpleList*     m_pIncommingConnections;
  203.     BOOL     m_bIgnoreWSAECONNRESET;
  204.     class ThrConnSocketCallback : public HXAsyncNetCallback
  205.     {
  206.     public:
  207. HX_RESULT Func(NotificationType Type, BOOL bSuccess = TRUE, conn* pConn = NULL);
  208. ThreadedConn* m_pContext;
  209. ThrConnSocketCallback(ThreadedConn* pContext = NULL) : m_pContext(pContext) {}
  210.     };
  211.     friend class ThrConnSocketCallback;
  212.     ThrConnSocketCallback*  m_pNetCallback;
  213.     HX_RESULT SetActualConn(conn* pConn, ULONG32 ulPlatform);
  214.     void      PostDoneAndDetach();
  215.     class ThrdConnGenericCallback: public IHXCallback
  216.     {
  217.     public:
  218. UINT16 m_uCallbackType;
  219. ThreadedConn*   m_pConn;
  220. /* For DNS, Connect */
  221. CHXString m_HostName;
  222. /* For DNS, Init, Connect, Listen */
  223. BOOL m_bBlocking;
  224. /* For Init */
  225. UINT32 m_ulLocalAddr;
  226. /* For Init, Connect, Listen */
  227. UINT16 m_uPort;
  228. /* For SetWindowHandle, Connect, Listen */
  229. UINT32 m_ulHandle;
  230. /* For SetReceiveBufferSize */
  231. UINT32 m_ulBufferSize;
  232. /* For Listen */
  233. UINT16 m_uBacklog;
  234. ThrdConnGenericCallback(ThreadedConn* pConn, UINT16 uCallbackType);
  235. /*
  236.  * IUnknown methods
  237.  */
  238. STDMETHOD(QueryInterface) (THIS_
  239. REFIID riid,
  240. void** ppvObj);
  241. STDMETHOD_(ULONG32,AddRef) (THIS);
  242. STDMETHOD_(ULONG32,Release) (THIS);
  243. /*
  244.  * IHXCallback methods
  245.  */
  246. STDMETHOD(Func) (THIS);
  247.     protected:
  248.     ~ThrdConnGenericCallback();
  249. PRIVATE_DESTRUCTORS_ARE_NOT_A_CRIME
  250. LONG32 m_lRefCount;
  251.     };
  252. };
  253. enum
  254. {
  255.       DNS_CALLBACK_TYPE = 1
  256.     , INIT_CALLBACK_TYPE = 2
  257.     , SETWINDOWHANDLE_CALLBACK_TYPE = 3
  258.     , CONNECT_CALLBACK_TYPE = 4
  259.     , BLOCKING_CALLBACK_TYPE = 5
  260.     , NONBLOCKING_CALLBACK_TYPE = 6
  261.     , DONE_CALLBACK_TYPE = 7
  262.     , SET_BUFFER_SIZE_CALLBACK_TYPE = 8
  263.     , LISTEN_CALLBACK_TYPE = 9
  264.     , ACCEPT_CALLBACK_TYPE = 10
  265. };
  266. struct UDPPacketInfo
  267. {
  268.     IHXBuffer* m_pBuffer;
  269.     ULONG32 m_ulAddr;
  270.     UINT16 m_uPort;
  271. };
  272. #endif /*_THREADCONN_*/