hxcloakedtcp.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 HXCLOAKEDTCP_H
  36. #define HXCLOAKEDTCP_H
  37. #include "hxtypes.h"
  38. #include "hxcom.h"
  39. #include "hxengin.h"
  40. #include "hxpnets.h"
  41. #include "hxauthn.h"
  42. #include "hxpreftr.h"
  43. #include "hxstring.h"
  44. #include "hxslist.h"
  45. #include "growingq.h"
  46. #include "smartptr.h"
  47. #include "hxathsp.h"
  48. #include "hxsockcallback.h"
  49. class  HTTPResponseMessage;
  50. class HXMutex;
  51. class HXClientCloakedTCPSocket : public IHXTCPSocket, 
  52.  public IHXCloakedTCPSocket,
  53.  public IHXHTTPProxy, 
  54.  public SocketCallbackInterface,
  55.  public IHXClientAuthResponse
  56. {
  57. public:
  58. HXClientCloakedTCPSocket(IUnknown* pContext);
  59. ~HXClientCloakedTCPSocket();
  60.     
  61.     /* IUnknown interface */
  62.     STDMETHOD(QueryInterface)   (THIS_ 
  63. REFIID riid, void** ppvObj);
  64.     STDMETHOD_(ULONG32,AddRef)  (THIS);
  65.     STDMETHOD_(ULONG32,Release) (THIS);
  66.    /* SocketCallbackInterface interface */
  67.   enum {
  68. CLOAKED_TCP_READ_COMMAND,
  69. CLOAKED_TCP_GETWRITE_COMMAND,
  70. CLOAKED_TCP_PUTWRITE_COMMAND,
  71. CLOAKED_TCP_PUTRESPONSE_TIMEOUT_COMMAND
  72. };
  73. STDMETHODIMP HandleCallback(INT32 theCommand, HX_RESULT theError);
  74.     /*
  75.      *  IHXTCPSocket methods
  76.      */
  77.     STDMETHOD(Init) (THIS_
  78. IHXTCPResponse*    /*IN*/  pTCPResponse);
  79.     STDMETHOD(SetResponse) (THIS_
  80. IHXTCPResponse*    /*IN*/  pTCPResponse);
  81.     STDMETHOD(Bind) (THIS_
  82. UINT32     ulLocalAddr,
  83. UINT16      nPort);
  84.     STDMETHOD(Connect) (THIS_
  85. const char*     pDestination,
  86. UINT16     nPort);
  87.     STDMETHOD(Read) (THIS_
  88. UINT16     uSize);
  89.     STDMETHOD(Write) (THIS_
  90. IHXBuffer*     pBuffer);
  91.     STDMETHOD(WantWrite) (THIS);
  92.     STDMETHOD(GetLocalAddress) (THIS_
  93. UINT32&     lAddress);
  94.     STDMETHOD(GetForeignAddress)(THIS_
  95. UINT32&     lAddress);
  96.     STDMETHOD(GetLocalPort) (THIS_
  97.      UINT16&     nPort);
  98.     STDMETHOD(GetForeignPort) (THIS_
  99.      UINT16&     nPort);
  100.     // IHXClientAuthResponse
  101.     
  102.     STDMETHOD(ResponseReady) (THIS_
  103.      HX_RESULT   HX_RESULTStatus,
  104. IHXRequest* pIHXRequestResponse);
  105.     
  106.     /*
  107.      * IHXHTTPProxy methods
  108.      *
  109.      *  Network addresses and ports are in native byte order
  110.      *  
  111.      */
  112.     STDMETHOD(SetProxy) (THIS_
  113. const char* /*IN*/  pProxyHostName,
  114. UINT16     /*IN*/  nPort);
  115.     /************************************************************************
  116.      * Method:
  117.      *     IHXCloakedTCPSocket::InitCloak
  118.      */
  119.     STDMETHOD(InitCloak) (THIS_
  120. IHXValues* /*IN*/  pValues,
  121. IUnknown* pUnknown);
  122.     class HTTPCloakTCPResponse : public IHXTCPResponse,
  123.  public IHXInterruptSafe
  124.     {
  125.     public:
  126. HTTPCloakTCPResponse(HXClientCloakedTCPSocket* pOwner, BOOL bIsRead);
  127. ~HTTPCloakTCPResponse();
  128. /*
  129.  *  IUnknown methods
  130.  */
  131. STDMETHOD(QueryInterface) (THIS_
  132.     REFIID riid,
  133.     void** ppvObj);
  134. STDMETHOD_(ULONG32,AddRef) (THIS);
  135. STDMETHOD_(ULONG32,Release) (THIS);
  136. /*
  137.  * IHXTCPResponse methods
  138.  */
  139. STDMETHOD(ConnectDone) (THIS_
  140. HX_RESULT status);
  141. STDMETHOD(ReadDone) (THIS_
  142.  HX_RESULT status,
  143.  IHXBuffer* pBuffer);
  144. STDMETHOD(WriteReady) (THIS_
  145.      HX_RESULT status);
  146. STDMETHOD(Closed) (THIS_
  147.  HX_RESULT status);
  148.      /*
  149.        * IHXInterruptSafe methods
  150.        */
  151. STDMETHOD_(BOOL,IsInterruptSafe) (THIS) {return TRUE;};
  152.     private:
  153. LONG32     m_lRefCount;
  154. HXClientCloakedTCPSocket*  m_pOwner;
  155. BOOL     m_bIsRead;
  156.     };
  157.     friend class HTTPCloakTCPResponse;
  158. private:
  159.     void TransferBuffers();
  160.     HX_RESULT DoRead();
  161.     HX_RESULT DoGetReadDone(HX_RESULT status, IHXBuffer* pBuffer);
  162.     HX_RESULT DoPutReadDone(HX_RESULT status, IHXBuffer* pBuffer);
  163.     HX_RESULT DoGetWrite();
  164.     void GetConnectDone(BOOL bResult);
  165.     
  166.     HX_RESULT DoPutWrite(); /* only used by m_pWriteCtrl*/
  167.     void PutConnectDone(BOOL bResult);
  168.     HX_RESULT PreparePostMessage(const UCHAR *inData, UINT16 inLength);
  169.     HX_RESULT EncodeBase64(const UCHAR* inData, UINT16 inLength, UCHAR* outData, UINT16& outLength);
  170.     HX_RESULT PrepareGetMessage(void);
  171.     void CreateGuid(void);
  172.     HX_RESULT HandleHTTPResponse(UCHAR response);
  173.     BOOL IsSafe();
  174.     void FlushQueues(void);
  175.     void SendHTTPDone(void);
  176.     HX_RESULT ActualConnect(void);
  177.     HX_RESULT GetServerIPFromResponse(BOOL bGetResponse, const char* pszInBuffer);    
  178.     HX_RESULT CleanUpAndReInitializeStuff(void);
  179.     HX_RESULT ReconnectToSameServerIP(void);
  180.     BOOL AuthenticationRequired(HX_RESULT   status, IHXBuffer* pInBuffer);
  181.     void ObtainAuthenticationInformation(CHXString& strAuth);
  182.     HX_RESULT HandleAuthentication(IHXRequest* pRequest, HTTPResponseMessage* pMessage,
  183.      const char* pHost, const char* pProxyHost);
  184.     LONG32                      m_lRefCount;
  185.     IUnknown* m_pContext;
  186.     IHXScheduler* m_pScheduler;
  187.     IHXTCPResponse* m_pTCPResponse;
  188.     IHXNetworkServices* m_pNetworkServices;    
  189.     IHXTCPSocket* m_pGetCtrl;
  190.     IHXTCPSocket* m_pPutCtrl;
  191.     HTTPCloakTCPResponse* m_pGetCtrlResponse;
  192.     HTTPCloakTCPResponse* m_pPutCtrlResponse;
  193.     char* m_pForiegnHost;
  194.     UINT32 m_lForeignAddress;
  195.     UINT16 m_nForeignPort : 16;
  196.     UINT16 m_nRequired : 16;
  197.     CByteGrowingQueue* m_pSendTCP;
  198.     CByteGrowingQueue* m_pReceiveGetTCP;
  199.     CByteGrowingQueue* m_pReceivePutTCP;
  200.     CByteGrowingQueue* m_pPreEncodedSendHTTP;
  201.     CByteGrowingQueue* m_pPostEncodedSendHTTP;
  202.     CHXSimpleList m_PendingWriteBuffers;
  203.     char* m_pOutBuf;
  204.     char* m_pOutEncodedBuf;
  205.     char* m_pInBuf;
  206.     char* m_pGuid;
  207.     HX_BITFIELD m_bGetReadPending : 1;
  208.     HX_BITFIELD m_bPutReadPending : 1;
  209.     HX_BITFIELD m_bPutWantWritePending : 1;
  210.     HX_BITFIELD m_bReadPending : 1;
  211.     HX_BITFIELD m_bConnected : 1;
  212.     HX_BITFIELD m_bGetConnectDone : 1;
  213.     HX_BITFIELD m_bPutConnectDone : 1;
  214.     HX_BITFIELD m_bGetConnectSuccessful : 1;
  215.     HX_BITFIELD m_bPutConnectSuccessful : 1;
  216.     HX_BITFIELD m_bConnectResponsePending : 1;
  217.     HX_BITFIELD m_bOptionsReceived : 1;
  218.     HX_BITFIELD m_bUseExactContentLength : 1;
  219.     /* == 1, close connection after write completes */
  220.     HX_BITFIELD m_bCloseHttpAfterWrite : 1;
  221.     /* == 1 we must close the HTTP POST connection */
  222.     HX_BITFIELD m_bMustCloseHTTP : 1;
  223.     HX_BITFIELD m_bHttpInitialized : 1;
  224.     HX_BITFIELD m_bInitComplete : 1;
  225.     HX_BITFIELD m_bInDestructor : 1;
  226.     HX_BITFIELD m_bInDoRead: 1;
  227.     HX_BITFIELD m_bInDoGetWrite : 1;
  228.     HX_BITFIELD m_bInDoPutWrite : 1;
  229.     HX_BITFIELD m_bInTransferBuffers : 1;
  230.     HX_BITFIELD m_bDeletePadding : 1;
  231.     
  232.     HX_BITFIELD m_bGetResponsed : 1;
  233.     HX_BITFIELD m_bPutResponsed : 1;
  234.     char* m_pszGetServerIP;
  235.     char* m_pszPutServerIP;
  236.     HX_BITFIELD m_bReconnectToSameServerIP : 1;
  237.     HX_BITFIELD m_bConnectToSameServerIP : 1;
  238.     HX_BITFIELD m_bHTTPGetHeaderReadDone : 1;
  239.     HX_BITFIELD m_bHTTPPutHeaderReadDone : 1;
  240.     HX_RESULT m_LastError;
  241.     char* m_pHTTPHeaderBuffer;
  242.     UINT16 m_nHTTPHeaderBufferLength;
  243.     UINT16 m_nProxyPortNumber;
  244.     char* m_pProxyHostName;
  245.     UINT16 m_uPadLength;
  246.     ScheduledSocketCallback* m_pSchedulerCallback;
  247.     ScheduledSocketCallback* m_pNonInterruptCallback;
  248.     IHXInterruptState* m_pInterruptState;
  249.     IHXInterruptSafe* m_pResponseInterruptSafe;
  250.     HXMutex* m_pMutex;
  251.     IHXValues* m_pCloakValues;
  252.     IUnknown* m_pCloakContext;
  253.     IHXPreferredTransport* m_pPreferredTransport;
  254.     IHXPreferredTransportManager* m_pPreferredTransportManager;
  255. #ifdef _MACINTOSH
  256.     class MacCloakedTCPSocketAuthenticationCallback : public IHXCallback
  257.     {
  258.     private:
  259. LONG32 m_lRefCount;
  260. ~MacCloakedTCPSocketAuthenticationCallback();
  261. PRIVATE_DESTRUCTORS_ARE_NOT_A_CRIME
  262.     public:
  263. MacCloakedTCPSocketAuthenticationCallback(
  264. HXClientCloakedTCPSocket* pSocket);
  265. // IUnknown methods
  266. STDMETHOD(QueryInterface) (THIS_ REFIID riid, void** ppvObj);
  267. STDMETHOD_(ULONG32, AddRef) (THIS);
  268. STDMETHOD_(ULONG32, Release) (THIS);
  269. // IHXCallback methods
  270. STDMETHOD(Func) (THIS);
  271. // callback specific stuff
  272. CallbackHandle m_ulPendingCallbackID;
  273. HXClientCloakedTCPSocket* m_pSocket;
  274. HX_RESULT m_Status;
  275. IHXBuffer* m_pInBuffer;
  276.     };
  277.     
  278.     friend class MacCloakedTCPSocketAuthenticationCallback;
  279.     
  280.     MacCloakedTCPSocketAuthenticationCallback* m_pAuthenticationCallback;
  281. #endif
  282.     BOOL m_bInAuthenticationKludge;
  283.     DECLARE_SMART_POINTER
  284.     (
  285. IHXClientAuthConversation
  286.     ) spClientAuthConversationAuthenticator;
  287. };
  288. #endif /* HXCLOAKEDTCP_H */