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

Symbian

开发平台:

Visual C++

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