httpfileobj.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 _HTTPFILEOBJ_H_
  36. #define _HTTPFILEOBJ_H_
  37. /****************************************************************************
  38.  * Includes
  39.  */
  40. #include "hxcom.h"
  41. #include "hxfiles.h"        // IHXFileObject, IHXRequestHandler, etc. 
  42. #include "hxcache2.h"       // IHXCache2, IHXCacheObject, IHXCacheObjectResponse
  43. #include "hxengin.h"        // IHXTCPResponse, IHXTCPSocket, IHXNetworkServices
  44. #include "hxbuffer.h"
  45. #include "hxurl.h"          // CHXURL
  46. #include "memcache.h"       // uses only memory
  47. #ifdef HELIX_FEATURE_HTTP_FILECACHE // Create a file cache object
  48.     #include "filecache.h"  // uses filesystem + memory   
  49. #endif
  50. /****************************************************************************
  51.  *
  52.  *  CHXHTTPFileObject Class
  53.  *
  54.  *  This class inherits the interfaces required to create a File Object,
  55.  *  which is used by the File System plug-in to handle file I/O. This class
  56.  *  implements the IHXFileObject interface which handles the actual low
  57.  *  level file access. The IHXRequestHandler interface is used to obtain
  58.  *  the requested URL; while the IHXFileExists interface determines if the
  59.  *  requested file actually exists. Since we are using COM, this class also
  60.  *  inherits COM's IUnknown interface to handle reference counting and
  61.  *  interface query.
  62.  */
  63. class CHXHTTPFileObject :  public IHXFileObject,
  64.    public IHXRequestHandler,
  65.    public IHXFileStat,
  66.                            public IHXCacheObjectResponse,
  67.                            public IHXTCPResponse,
  68.                            public IHXCallback
  69. {
  70. public:
  71.     CHXHTTPFileObject(IUnknown*  pContext, IHXValues* pOptions);
  72.     ~CHXHTTPFileObject(void);
  73.     /************************************************************************
  74.      *  IHXFileObject Interface Methods
  75.      */
  76.     STDMETHOD(Init       ) (THIS_ UINT32 access,IHXFileResponse* pFileResp);
  77.     STDMETHOD(GetFilename) (THIS_ REF(const char*) pFileName);
  78.     STDMETHOD(Read       ) (THIS_ UINT32 byteCount);
  79.     STDMETHOD(Write      ) (THIS_ IHXBuffer* pDataToWrite);
  80.     STDMETHOD(Seek       ) (THIS_ UINT32 offset, BOOL bRelative);
  81.     STDMETHOD(Advise     ) (THIS_ UINT32 useage);
  82.     STDMETHOD(Close      ) (THIS);
  83.     /************************************************************************
  84.      *  IHXRequestHandler Interface Methods
  85.      */
  86.     STDMETHOD(SetRequest) (THIS_     IHXRequest*  pRequest);
  87.     STDMETHOD(GetRequest) (THIS_ REF(IHXRequest*) pRequest);
  88.     /************************************************************************
  89.      *  IUnknown COM Interface Methods
  90.      */
  91.     STDMETHOD (QueryInterface ) (THIS_ REFIID ID, void** ppInterfaceObj);
  92.     STDMETHOD_(UINT32, AddRef ) (THIS);
  93.     STDMETHOD_(UINT32, Release) (THIS);
  94.     /************************************************************************
  95.      *  IHXFileStat Interface Methods
  96.      */
  97.     STDMETHOD(Stat)(THIS_ IHXFileStatResponse* pFileStatResponse);
  98.     /************************************************************************
  99.      * IHXCacheObjectResponse methods
  100.      */
  101.     STDMETHOD(InitDone)                 (THIS_
  102.                 HX_RESULT /*IN*/ status);
  103.     STDMETHOD(ChangeCapacityDone) (THIS_
  104.                 HX_RESULT /*IN*/ status);
  105.     STDMETHOD(AddBlockDone)                 (THIS_
  106.                 HX_RESULT /*IN*/ status);
  107.     STDMETHOD(VerifyBlockDone)                 (THIS_
  108.                 BOOL         /*IN*/ bExist);
  109.     STDMETHOD(ReadBlockDone)                 (THIS_
  110.                 HX_RESULT /*IN*/ status,
  111.                 IHXBuffer* /*IN*/ pBuffer);
  112.     STDMETHOD(FlushDone)                 (THIS_
  113.                 HX_RESULT /*IN*/ status);
  114.     /************************************************************************
  115.      * IHXTCPResponse methods
  116.      */
  117.     STDMETHOD(ConnectDone) (THIS_
  118. HX_RESULT status);
  119.     
  120.     STDMETHOD(ReadDone) (THIS_
  121. HX_RESULT status,
  122. IHXBuffer* pBuffer);
  123.     STDMETHOD(WriteReady) (THIS_
  124.      HX_RESULT status);
  125.     STDMETHOD(Closed) (THIS_
  126. HX_RESULT status);
  127.     /************************************************************************
  128.      * IHXCallback methods
  129.      */
  130.     STDMETHOD(Func)      (THIS);
  131. private:
  132.     // The struct used to represent chunks of HTTP header as 
  133.     // they arrive. The chunks are consolidated after the
  134.     // last header chunk arrives.
  135.     struct HdrChunk
  136.     {
  137.         IHXBuffer*  pPartOfHdr;
  138.         HdrChunk*    next;
  139.     };
  140.     // If a read can't be fully satisfied by the cache, a buffer
  141.     // is created for it and is filled in installments. Information 
  142.     // for the pnding read, such as where to start reading for the next
  143.     // installment, where to write in the pending read buffer, etc is 
  144.     // stored in this struct.
  145.     struct PendingReadInfo
  146.     {
  147.         UINT32 ulWriteOffset;       // Where to start writing in the buffer
  148.         UINT32 ulReadOffset;        // From where should the next installment begin.
  149.         UINT32 ulSize;              // Size left to be read
  150.         IHXBuffer* pPendingReadBuff;// The buffer to be filled
  151.     } m_pPendingReadInfo;
  152.     /****** Private Class Variables ****************************************/
  153.     INT32                   m_RefCount;             // Object's reference count
  154.     IUnknown*               m_pContext;
  155.     IHXValues*              m_pOptions;
  156.     IHXCommonClassFactory*  m_pClassFactory;        // Creates common classes
  157.     IHXFileResponse*        m_pFileResponse;        // Provides completion notif.
  158.     IHXRequest*             m_pRequest;             // Used to get requested URL
  159.     IHXCacheObject*         m_pCache;               // Non-persistent cache object
  160.     IHXTCPSocket*           m_pSocket;              // Socket used to connect to the HTTP server
  161.     CHXURL*                 m_pCHXURL;              // URL parser
  162.     UINT32                  m_ulCurrentReadOffset;  // Offset to be used for the next read
  163.     int                     m_lNewReadOffset;       // Offset requested by Seek()
  164.     BOOL                    m_bInSeekDone;
  165.     BOOL                    m_bInReadDone;
  166.     BOOL                    m_bReadPending;         // Is a read pending?
  167.     BOOL                    m_bIncompleteReadPending;   // A read was only partially satisfied by the cache.
  168.                                                         // Need to read in installments from the cache.
  169.     UINT32                  m_ulFileLength;         // The Content-Length returned in HTTP header
  170.     HdrChunk*               m_pHdrListRoot;         // List for storing the header chunks
  171.     BOOL                    m_bHeaderCompletelyRead;// Has the HTTP header been completely read?
  172.     CHXBuffer*              m_pHeader;              // The HTTP Header
  173.     BOOL                    m_bStartAllOverAgain;   // A backward seek failed. Start all over again.
  174.     IHXScheduler*     m_pScheduler;           // For scheduling callbacks.
  175.     UINT32                  m_ulCallbackHandle;
  176.     UINT32                  m_ulCallBackInterval;   // millisec
  177.     BOOL                    m_bFirstChunk;          // Is it the first chunk of TCP data we got from the n/w service?
  178.     BOOL                    m_bInitResponsePending; // Init() is completed. Call InitDone() on fileformat obj
  179.     BOOL                    m_bInitialized;         // Has been already initialized
  180.     UINT32                  m_ulFileDataRead;       // How much of the file has been read
  181.     BOOL                    m_bAddBlockPending;     // A block was previously rejected by cache. Add it when
  182.                                                     // cache becomes free again.
  183.     IHXBuffer*              m_pPendingAddBlock;     // The block which was rejected by cache
  184.     BOOL                    m_bDisconnected;
  185.     
  186.     /****** Private Class Methods ******************************************/
  187.     STDMETHOD(_CleanUp) (THIS);                     // Called by Close() and destructor
  188.     STDMETHOD(_Start) (THIS);                       // Starts connecting to server
  189.     // Retrives cache preferences like "whether to cache or not", 
  190.     // "where to cache", etc which are set by the user.
  191.     STDMETHOD(_GetCachePreferences) (THIS_
  192.                                      REF(BOOL)      /*OUT*/ bCacheEnabled,
  193.                                      REF(char *)    /*OUT*/ pCacheFile);
  194.     STDMETHOD(_PrepareHTTP10GetMessage) (THIS_
  195.                                          REF(char *)    /*OUT*/ pGetMsg,
  196.                                          REF(UINT32)    /*OUT*/ ulMsgLen);
  197.                                      
  198.     
  199. };
  200. #endif  /* _HTTPFILEOBJ_H_ */