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

Symbian

开发平台:

Visual C++

  1. /* ***** BEGIN LICENSE BLOCK *****
  2.  * Source last modified: $Id: hxnetapi.h,v 1.12.32.1 2004/07/09 02:08: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 _HXNETAPI_H_
  50. #define _HXNETAPI_H_
  51. #if defined(_SYMBIAN)
  52. #include "platform/symbian/hxsymbiannetapi.h"
  53. #elif defined(_OPENWAVE)
  54. #include "platform/openwave/hxopwavenetapi.h"
  55. #else
  56. #include "conn.h"
  57. #include "hxengin.h"
  58. #include "hxslist.h"
  59. #include "hxpnets.h"
  60. #include "preftran.h"
  61. // necessary for authentication 
  62. #include "hxauthn.h"
  63. #include "hxathsp.h"
  64. #include "hxcomsp.h"
  65. #include "hxplnsp.h"
  66. #include "hxcloakedtcp.h"
  67. #include "hxsockcallback.h"
  68. #include "hxnetutil.h"
  69. struct IHXCloakedNetworkServices;
  70. struct IHXNetworkServices;
  71. struct IHXListenSocket;
  72. struct IHXTCPSocket;
  73. struct IHXUDPSocket;
  74. struct IHXInterruptState;
  75. struct IHXInterruptSafe;
  76. // for sockets
  77. #if defined(_WIN32) || defined(_WINDOWS)
  78. #include "platform/win/win_net.h"
  79. #elif defined(_OPENWAVE)
  80. #include "socketdefs.h"
  81. #elif defined(__TCS__)
  82. #include "sockio.h"
  83. #else
  84. #include "hlxclib/sys/socket.h"
  85. #endif
  86. class CByteGrowingQueue;
  87. class HXAsyncNetCallback;
  88. class HXMutex;
  89. class HXEvent;
  90. #ifdef _MACINTOSH
  91. struct IhxQueueElement 
  92. {
  93. IhxQueueElement  *mNextElementInQueue; // link must be first member
  94. IUnknown *mObject;
  95. };
  96. class InterruptSafeMacQueue 
  97. {
  98. protected:
  99. QHdr  mQueueHeader;
  100. Boolean mDestructing;
  101. public:
  102. InterruptSafeMacQueue(void);
  103. ~InterruptSafeMacQueue(void); // decrements the ref on the irma nodes (via release)
  104. IUnknown *  RemoveHead(void);
  105. HX_RESULT  AddTail(IUnknown* pObject); // increments the ref
  106. HX_RESULT TransferToSimpleList(CHXSimpleList &simpleList); // leaves the ref incremented
  107. };
  108. #endif // _MACINTOSH
  109. class HXNetworkServices : public IHXNetworkServices,
  110.    public IHXCloakedNetworkServices,
  111.    public IHXNetworkInterfaceEnumerator
  112. {
  113. public:
  114. HXNetworkServices(IUnknown* pContext);
  115. ~HXNetworkServices();
  116.     /* IUnknown interface */
  117.     STDMETHOD(QueryInterface)     (THIS_ 
  118.     REFIID riid, void** ppvObj);
  119.     STDMETHOD_(ULONG32,AddRef)     (THIS);
  120.     STDMETHOD_(ULONG32,Release)     (THIS);
  121.     /* IHXNetworkServices interface */
  122.     STDMETHOD(CreateTCPSocket)      (THIS_ 
  123.     IHXTCPSocket** ppTCPSocket);
  124.     STDMETHOD(CreateUDPSocket) (THIS_
  125. IHXUDPSocket**    /*OUT*/     ppUDPSocket);
  126.     STDMETHOD(CreateListenSocket)   (THIS_ 
  127.     IHXListenSocket** ppListenSocket);
  128.     STDMETHOD(CreateResolver)     (THIS_
  129.          IHXResolver** ppResolver);
  130.     /* IHXCloakedNetworkServices interface */
  131.     STDMETHOD(CreateClientCloakedSocket) (THIS_
  132. IHXTCPSocket**    /*OUT*/     ppTCPSocket);
  133.     STDMETHOD(CreateServerCloakedSocket) (THIS_
  134. IHXListenSocket**    /*OUT*/     ppListenSocket);
  135.     /* IHXNetworkInterfaceEnumerator methods */
  136.     STDMETHOD(EnumerateInterfaces) (THIS_
  137. REF(UINT32*) pulInterfaces, REF(UINT32) ulNumInterfaces);
  138.     void Close();
  139.     void UseDrivers();
  140. private:
  141.     LONG32                      m_lRefCount;
  142.     IUnknown* m_pContext;
  143.     BOOL m_bNeedToCleanupDrivers;
  144. #if !defined(HELIX_CONFIG_NOSTATICS)
  145.     static UINT16 z_muNumDriverInstance;
  146. #else
  147.     static const UINT16 z_muNumDriverInstance;
  148. #endif
  149. };
  150. class HXResolver: public IHXResolver
  151. {
  152. public:
  153.      HXResolver(HXNetworkServices* pNetworkServices);
  154.      ~HXResolver();
  155.                                 HXResolver(HXNetworkServices* pNetworkServices,
  156.                                             IUnknown*           pContext );
  157.                                 
  158.     STDMETHOD(QueryInterface)   (THIS_ REFIID riid, void** ppvObj);
  159.     STDMETHOD_(ULONG32,AddRef)  (THIS);
  160.     STDMETHOD_(ULONG32,Release) (THIS);
  161.     STDMETHOD(Init)             (THIS_ IHXResolverResponse* pResp);
  162.     STDMETHOD(GetHostByName)    (THIS_ const char* pHostName);
  163. private:
  164.     class HXResolverCallback: public HXAsyncNetCallback
  165.     {
  166.     public:
  167. HX_RESULT Func(NotificationType Type, BOOL bSuccess = TRUE, conn* pConn = NULL);
  168. HXResolver* m_pContext;
  169.     };
  170.     friend class HXResolverCallback;
  171.     void    DNSDone(BOOL bSuccess);
  172.     HXResolverCallback* m_pCallback;
  173.     LONG32                      m_lRefCount;
  174.     IHXResolverResponse*       m_pResp;
  175.     BOOL m_bResolverPending;
  176.     conn* m_pData;
  177.     HXNetworkServices* m_pNetworkServices;
  178.     IUnknown*                   m_pContext;
  179. };
  180. class HXUDPSocket : public IHXUDPSocket,
  181.      public IHXSetSocketOption,
  182.      public SocketCallbackInterface,
  183.      public IHXUDPMulticastInit,
  184.      public IHXSetPrivateSocketOption
  185. {
  186. public:
  187. HXUDPSocket(IUnknown* pContext, HXNetworkServices* pNetworkServices);
  188. ~HXUDPSocket();
  189.     /* IUnknown interface */
  190.     STDMETHOD(QueryInterface) (THIS_ 
  191. REFIID riid, void** ppvObj);
  192.     STDMETHOD_(ULONG32,AddRef) (THIS);
  193.     STDMETHOD_(ULONG32,Release) (THIS);
  194.    /* SocketCallbackInterface interface */
  195.   enum {
  196. UDP_READ_COMMAND,
  197. UDP_WRITE_COMMAND,
  198. UDP_BIND_COMMAND
  199. };
  200. STDMETHODIMP HandleCallback(INT32 theCommand, HX_RESULT theError);
  201.     /* IHXUDPSocket interface */
  202.     STDMETHOD(Init) (THIS_
  203. ULONG32 ulAddr,
  204. UINT16 nPort,
  205. IHXUDPResponse* pUDPResponse);
  206.     STDMETHOD(Bind) (THIS_
  207. UINT32 ulLocalAddr,
  208. UINT16  nPort);
  209.     STDMETHOD(Read) (THIS_
  210. UINT16 Size);
  211.     STDMETHOD(Write) (THIS_
  212. IHXBuffer* pBuffer);
  213.     STDMETHOD(WriteTo) (THIS_
  214.      ULONG32 ulAddr,
  215. UINT16 nPort,
  216. IHXBuffer* pBuffer);
  217.     STDMETHOD(GetLocalPort) (THIS_
  218.      UINT16& nPort);
  219.     STDMETHOD(JoinMulticastGroup) (THIS_
  220.      ULONG32     ulMulticastAddr,
  221.      ULONG32     ulInterfaceAddr);
  222.     STDMETHOD(LeaveMulticastGroup) (THIS_
  223.      ULONG32     ulMulticastAddr,
  224.      ULONG32     ulInterfaceAddr);
  225.     /*
  226.      * IHXUDPMulticastInit methods
  227.      */
  228.  
  229.     STDMETHOD(InitMulticast)            (THIS_
  230.                                          UINT8       ulTTL);
  231.     /*
  232.      * IHXListenSocket methods
  233.      */
  234.     STDMETHOD(SetOption) (THIS_ 
  235.  HX_SOCKET_OPTION option,
  236.  UINT32 ulValue);
  237.     /*
  238.      * IHXSetPrivateSocketOption methods
  239.      */
  240.     STDMETHOD(SetOption) (THIS_ 
  241.  HX_PRIVATE_SOCKET_OPTION option,
  242.  UINT32 ulValue);    
  243.     class UDPSocketCallback: public HXAsyncNetCallback
  244.     {
  245.     public:
  246. HX_RESULT Func(NotificationType Type, BOOL bSuccess = TRUE, conn* pConn = NULL);
  247. HXUDPSocket* m_pContext;
  248.     };
  249.     friend class UDPSocketCallback;
  250.   private:
  251.     IUnknown*                   m_pContext;
  252.     HX_RESULT DoRead();
  253.     HX_RESULT DoWrite();
  254.     BOOL IsSafe();
  255.     LONG32                      m_lRefCount;
  256.     IHXUDPResponse* m_pUDPResponse;
  257.     conn* m_pData;
  258.     struct sockaddr_in m_sockAddr;
  259.     HX_BITFIELD m_bReadPending : 1;
  260.     HX_BITFIELD m_bInRead : 1;
  261.     HX_BITFIELD m_bInDoRead : 1;
  262.     HX_BITFIELD m_bInWrite : 1;
  263.     UINT32 m_nRequired;
  264.     CHXSimpleList m_ReadBuffers;
  265.     CHXSimpleList m_WriteBuffers;
  266.     IHXScheduler* m_pScheduler;
  267.     UDPSocketCallback* m_pCallback;
  268.     ScheduledSocketCallback* m_pSchedulerReadCallback;
  269.     ScheduledSocketCallback* m_pSchedulerWriteCallback;
  270.     ScheduledSocketCallback* m_pNonInterruptReadCallback;
  271.     UINT16 m_nDestPort;
  272.     HX_BITFIELD m_bInitComplete : 1;
  273.     IHXInterruptState* m_pInterruptState;
  274.     IHXInterruptSafe* m_pResponseInterruptSafe;
  275.     HXMutex* m_pMutex;
  276.     HX_BITFIELD m_bInDestructor : 1;
  277.     HXNetworkServices* m_pNetworkServices;
  278. #ifdef _MACINTOSH
  279. InterruptSafeMacQueue* m_pInterruptSafeMacWriteQueue; // only instantiated on the mac
  280. #endif
  281.     BOOL m_bReuseAddr;
  282.     BOOL m_bReusePort;    
  283. };
  284. class HXTCPSocket : public IHXTCPSocket,
  285.      public IHXSetSocketOption,
  286.      public SocketCallbackInterface,
  287.      public IHXTCPSecureSocket
  288. {
  289. public:
  290. HXTCPSocket(IUnknown* pContext, HXNetworkServices* pNetworkServices);
  291. ~HXTCPSocket();
  292.     
  293.     /* IUnknown interface */
  294.     STDMETHOD(QueryInterface)   (THIS_ 
  295. REFIID riid, void** ppvObj);
  296.     STDMETHOD_(ULONG32,AddRef)  (THIS);
  297.     STDMETHOD_(ULONG32,Release) (THIS);
  298.    /* SocketCallbackInterface interface */
  299.   enum {
  300. TCP_READ_COMMAND,
  301. TCP_WRITE_COMMAND,
  302. TCP_BIND_COMMAND,
  303. TCP_READ_DONE_COMMAND,
  304. TCP_CONNECT_DONE_COMMAND
  305. };
  306. STDMETHODIMP HandleCallback(INT32 theCommand, HX_RESULT theError);
  307.     /*
  308.      *  IHXTCPSocket methods
  309.      */
  310.     STDMETHOD(Init) (THIS_
  311. IHXTCPResponse*    /*IN*/  pTCPResponse);
  312.     STDMETHOD(SetResponse) (THIS_
  313. IHXTCPResponse*    /*IN*/  pTCPResponse);
  314.     STDMETHOD(Bind) (THIS_
  315. UINT32     ulLocalAddr,
  316. UINT16      nPort);
  317.     STDMETHOD(Connect) (THIS_
  318. const char*     pDestination,
  319. UINT16     nPort);
  320.     STDMETHOD(Read) (THIS_
  321. UINT16     uSize);
  322.     STDMETHOD(Write) (THIS_
  323. IHXBuffer*     pBuffer);
  324.     STDMETHOD(WantWrite) (THIS);
  325.     STDMETHOD(GetLocalAddress) (THIS_
  326. UINT32&     lAddress);
  327.     STDMETHOD(GetForeignAddress)(THIS_
  328. UINT32&     lAddress);
  329.     STDMETHOD(GetLocalPort) (THIS_
  330.      UINT16&     nPort);
  331.     STDMETHOD(GetForeignPort) (THIS_
  332.      UINT16&     nPort);
  333.     /*
  334.      * IHXTCPSecureSocket
  335.      */
  336.     
  337.     STDMETHOD(SetSecure) (THIS_
  338.      BOOL bSecure);
  339.     
  340.     /*
  341.      * IHXListenSocket methods
  342.      */
  343.     STDMETHOD(SetOption) (THIS_ 
  344.  HX_SOCKET_OPTION option,
  345.  UINT32 ulValue);
  346.     class TCPSocketCallback: public HXAsyncNetCallback
  347.     {
  348.     public:
  349. HX_RESULT Func(NotificationType Type, BOOL bSuccess = TRUE, conn* pConn = NULL);
  350. HXTCPSocket* m_pContext;
  351.     };
  352.    friend class TCPSocketCallback;
  353.     STDMETHOD(AcceptConnection) (THIS_ conn* pNewCon);
  354. private:
  355.     HX_RESULT DoRead();
  356.     HX_RESULT DoWrite();
  357.     void CloseDone();
  358.     void DNSDone(BOOL bSuccess);
  359.     void TransferBuffers();
  360.     void ConnectDone(BOOL bResult);
  361.     BOOL IsSafe();
  362.     LONG32                      m_lRefCount;
  363.     IHXTCPResponse* m_pTCPResponse;
  364.     conn* m_pCtrl;
  365.     UINT32 m_lForeignAddress;
  366.     UINT16 m_nForeignPort : 16;
  367.     UINT16 m_nRequired : 16;
  368.     HX_BITFIELD m_bReadPending : 1;
  369.     HX_BITFIELD m_bConnected : 1;
  370.     HX_BITFIELD m_bWantWritePending : 1;
  371.     HX_BITFIELD m_bInitComplete : 1;
  372.     HX_BITFIELD m_bInDestructor : 1;
  373.     HX_BITFIELD m_bInRead : 1;
  374.     HX_BITFIELD m_bInDoRead : 1;
  375.     HX_BITFIELD m_bInWrite : 1;
  376.     HX_BITFIELD m_bWriteFlushPending : 1;
  377.     CByteGrowingQueue* mSendTCP;
  378.     CByteGrowingQueue* mReceiveTCP;
  379.     CHXSimpleList m_PendingWriteBuffers;
  380.     char* m_pBuffer;
  381.     TCPSocketCallback* m_pCallback;
  382.     UINT16 m_nLocalPort;
  383.     IHXScheduler* m_pScheduler;
  384.     ScheduledSocketCallback* m_pSchedulerReadCallback;
  385.     ScheduledSocketCallback* m_pSchedulerWriteCallback;
  386.     ScheduledSocketCallback* m_pNonInterruptReadCallback;
  387. #ifdef _MACINTOSH
  388. ScheduledSocketCallback*  m_pMacCommandCallback;
  389. InterruptSafeMacQueue* m_pInterruptSafeMacWriteQueue; // only instantiated on the mac
  390. #endif
  391.     IHXInterruptState* m_pInterruptState;
  392.     IHXInterruptSafe* m_pResponseInterruptSafe;
  393.     HXMutex* m_pMutex;
  394.     HXNetworkServices* m_pNetworkServices;
  395.     IHXPreferences* m_pPreferences;
  396.     BOOL m_bReuseAddr;
  397.     BOOL m_bReusePort;
  398.     IUnknown*                   m_pContext;
  399.     BOOL m_bSecureSocket;
  400. };
  401. class HXListenSocket : public IHXListenSocket,
  402. public IHXSetSocketOption
  403. {
  404. public:
  405. HXListenSocket(IUnknown* pContext, HXNetworkServices* pNetworkServices);
  406. ~HXListenSocket();
  407.     /* IUnknown interface */
  408.     STDMETHOD(QueryInterface)   (THIS_ 
  409. REFIID riid, void** ppvObj);
  410.     STDMETHOD_(ULONG32,AddRef)  (THIS);
  411.     STDMETHOD_(ULONG32,Release) (THIS);
  412.     /*
  413.      *  IHXListenSocket methods
  414.      */
  415.     STDMETHOD(Init) (THIS_
  416. UINT32 ulLocalAddr,
  417. UINT16 port,
  418. IHXListenResponse*    /*IN*/ pListenResponse);
  419.     /*
  420.      * IHXSetSocketOption methods
  421.      */
  422.     STDMETHOD(SetOption) (THIS_ 
  423.  HX_SOCKET_OPTION option,
  424.  UINT32 ulValue);
  425.     class ListenSocketCallback: public HXAsyncNetCallback
  426.     {
  427.     public:
  428. HX_RESULT Func(NotificationType Type, BOOL bSuccess = TRUE, conn* pConn = NULL);
  429. HXListenSocket* m_pContext;
  430.     };
  431.     friend class ListenSocketCallback;
  432. private:
  433.     LONG32                      m_lRefCount;
  434.     IHXListenResponse* m_pListenResponse;
  435.     HXNetworkServices* m_pNetworkServices;
  436.     IUnknown* m_pContext;
  437.     conn* m_pListenConn;
  438.     ListenSocketCallback* m_pCallback;
  439.     BOOL m_bReuseAddr;
  440.     BOOL m_bReusePort;
  441. };
  442. #endif /* defined(_SYMBIAN) */
  443. #endif /*_HXNETAPI_H_*/