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

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. #include "hxslist.h"    // CHXSimpleList
  36. #include "hxthread.h"   // HXMutex
  37. // In case we want to read data from the cache file and add to the 
  38. // list, this ratio determines the size of the blocks to create.
  39. #define CAPACITY_BLOCKSIZE_RATIO 8
  40. class CHXFileCacheObject : public IHXCacheObject
  41. {
  42. public:
  43.     /****************************************************************************
  44.      *  CHXFileCacheObject::CHXFileCacheObject
  45.      *
  46.      *  Constructor
  47.      */
  48.     CHXFileCacheObject(IHXCommonClassFactory*   /*IN*/      pClassFactory,
  49.                        UINT32                   /*IN*/      ulFileLength,
  50.                        char*                    /*IN*/      pFileName);
  51.     /****************************************************************************
  52.      *  CHXFileCacheObject::~CHXFileCacheObject
  53.      *
  54.      *  Destructor
  55.      */
  56.     ~CHXFileCacheObject();
  57.     // IUnknown COM Interface Methods
  58.     /****************************************************************************
  59.      *  IUnknown::AddRef
  60.      *
  61.      *  This routine increases the object reference count in a thread safe
  62.      *  manner. The reference count is used to manage the lifetime of an object.
  63.      *  This method must be explicitly called by the user whenever a new
  64.      *  reference to an object is used.
  65.      */
  66.     
  67.     STDMETHOD_(ULONG32,AddRef) (THIS);
  68.     
  69.     /****************************************************************************
  70.      *  IUnknown::Release
  71.      *
  72.      *  This routine decreases the object reference count in a thread safe
  73.      *  manner, and deletes the object if no more references to it exist. It must
  74.      *  be called explicitly by the user whenever an object is no longer needed.
  75.      */
  76.     STDMETHOD_(ULONG32,Release) (THIS);
  77.     /****************************************************************************
  78.      *  IUnknown::QueryInterface
  79.      *
  80.      *  This routine indicates which interfaces this object supports. If a given
  81.      *  interface is supported, the object's reference count is incremented, and
  82.      *  a reference to that interface is returned. Otherwise a NULL object and
  83.      *  error code are returned. This method is called by other objects to
  84.      *  discover the functionality of this object.
  85.      */
  86.     
  87.     STDMETHOD(QueryInterface) (THIS_
  88. REFIID riid,
  89. void** ppvObj);     
  90.     
  91.     /************************************************************************
  92.      * Method:
  93.      *
  94.      *     IHXCacheObject::Init
  95.      *
  96.      * Purpose:
  97.      *
  98.      *     Associates a cache object with the response object
  99.      *     it should notify of operation completeness.
  100.      */
  101.     
  102.     STDMETHOD(Init) (THIS_
  103. IHXCacheObjectResponse*     /*IN*/  pCacheObjectResponse,
  104.                         UINT32   /*IN*/      ulCapacity,
  105.                         UINT32   /*IN*/      lThreshold);
  106.     /************************************************************************
  107.      * Method:
  108.      *
  109.      *     IHXCacheObject::GetThreshold
  110.      *
  111.      * Purpose:
  112.      *
  113.      *     Obtain the threshold of the cache object.
  114.      */
  115.     STDMETHOD_(UINT32, GetThreshold) (THIS);
  116.     /************************************************************************
  117.      * Method:
  118.      *
  119.      *     IHXCacheObject::ChangeThreshold
  120.      *
  121.      * Purpose:
  122.      *
  123.      *     The object keeps caching data until it is full (exhausts its 
  124.      *      capacity). Once it is full, it will overwite existing cached data
  125.      *      with new data ONLY if the percentage of cached data which has been
  126.      *      read from the cache using the ReadBlock() method is greater than a
  127.      *      given percentage of Capacity.. This percentage is set using the SetThreshold()
  128.      *      method. In case the threshold is exceeded, the oldest added data
  129.      *      (the data with the the least offset) will be discarded and the 
  130.      *      amount of data discarded is so that the remaining cached data just
  131.      *      satisfies the threshold condidtion (approximately).
  132.      *
  133.      *      This cache object is used in the HTTP/1.0 file system plugin for
  134.      *      mobile devices and in this case, the threshold is set to 70%
  135.      *      i.e., utilizedDataPercentage = 0.7
  136.      *
  137.      */
  138.      STDMETHOD(ChangeThreshold)      (THIS_
  139.               UINT32  /*IN*/ lNewThreshold);
  140.     /************************************************************************
  141.      * Method:
  142.      *
  143.      *     IHXCacheObject::GetCapacity
  144.      *
  145.      * Purpose:
  146.      *
  147.      *     Obtain the capacity in bytes of the cache object.
  148.      */
  149.      STDMETHOD_(UINT32, GetCapacity) (THIS);
  150.     /************************************************************************
  151.      * Method:
  152.      *
  153.      *     IHXCacheObject::ChangeCapacity
  154.      *
  155.      * Purpose:
  156.      *
  157.      *     Changes the capacity of the cache object (in bytes). It is used to
  158.      *      increase or decrease the capacity after the cache object has been
  159.      *      created and it's capacity set using SetCapacity(). This method can
  160.      *      called any number of times. If new capacity is less than old capacity,
  161.      *      the oldest data are discarded.
  162.      *
  163.      */
  164.     STDMETHOD(ChangeCapacity)      (THIS_
  165.             UINT32  /*IN*/ newByteCount);
  166.     /************************************************************************
  167.      * Method:
  168.      *
  169.      *     IHXCacheObject::GetUnusedCapacity
  170.      *
  171.      * Purpose:
  172.      *
  173.      *     Obtain the unused capacity in bytes of the cache object.
  174.      */
  175.     STDMETHOD_(UINT32, GetUnusedCapacity) (THIS);
  176.     /************************************************************************
  177.      * Method:
  178.      *
  179.      *     IHXCacheObject::AddBlock
  180.      *
  181.      * Purpose:
  182.      *
  183.      *     Adds a block of data to the cache.
  184.      */
  185.     STDMETHOD(AddBlock) (THIS_
  186.  IHXBuffer* /*IN*/ pBlock);
  187.     /************************************************************************
  188.      * Method:
  189.      *
  190.      *     IHXCacheObject::VerifyBlock
  191.      *
  192.      * Purpose:
  193.      *
  194.      *     Verify that a block of data is in the cache.
  195.      */
  196.     STDMETHOD(VerifyBlock) (THIS_
  197.  UINT32 /*IN*/ ulBlockOffset,
  198.  UINT32 /*IN*/ ulBlockLength);
  199.     /************************************************************************
  200.      * Method:
  201.      *
  202.      *     IHXCacheObject::ReadBlock
  203.      *
  204.      * Purpose:
  205.      *
  206.      *     Read a block out of the cache.
  207.      */
  208.     STDMETHOD(ReadBlock) (THIS_
  209.  UINT32 /*IN*/ ulBlockOffset,
  210.  UINT32 /*IN*/ ulBlockLength);
  211.     /************************************************************************
  212.      * Method:
  213.      *     IHXCacheObject::Flush
  214.      *
  215.      * Purpose:
  216.      *
  217.      *     Flushes all data to the cache file AND releases all data buffers 
  218.      *      in the memory.After flushing, the object can be used for reading/writing
  219.      *      as before.
  220.      */
  221.     STDMETHOD(Flush) (THIS);
  222.     /************************************************************************
  223.      * Method:
  224.      *
  225.      *     IHXCacheObject::IsFull
  226.      *
  227.      * Purpose:
  228.      *
  229.      *     Can the cache object accept any more data for storage?
  230.      */
  231.     
  232.     STDMETHOD_(BOOL, IsFull) (THIS);
  233.     /************************************************************************
  234.      * Method:
  235.      *
  236.      *     IHXCacheObject::IsEmpty
  237.      *
  238.      * Purpose:
  239.      *
  240.      *     Does the cache object have any data stored?
  241.      */
  242.     
  243.     STDMETHOD_(BOOL, IsEmpty) (THIS);
  244. private:
  245.     INT32                       m_RefCount;
  246.     IHXCacheObjectResponse*     m_pCacheObjectResponse;
  247.     IHXCommonClassFactory*      m_pClassFactory;
  248.     UINT32                      m_ulCapacity;
  249.     UINT32                      m_lThreshold;
  250.     UINT32                      m_ulUsedCapacity;
  251.     CHXSimpleList*              m_pList;
  252.     UINT32                      m_ulCurrentWriteOffset;
  253.     IHXBuffer*                  m_pPendingAddBlock;
  254.     BOOL                        m_bInAddBlockDone;
  255.     BOOL                        m_bInReadBlockDone;
  256.     HXMutex*                    m_pMutex;
  257.     UINT32                      m_ulCurrentReadOffset;   // Offset of the first byte that has NOT been read.
  258.     UINT32                      m_ulFileLength;
  259.     char*                       m_pFileName;
  260.     UINT32                      m_ulFileWriteOffset;
  261.     FILE*                       m_pCacheFileHandle;
  262.     UINT32                      m_ulHighestByteNotRead;
  263.     FILE*                       m_pFileHandle;
  264.     struct PendingReadInfo
  265.     {
  266.         UINT32      ulOffset;
  267.         UINT32      ulLength;
  268.         IHXBuffer*  pBlock;
  269.     
  270.     } m_pPendingReadInfo;
  271.     struct Info
  272.     {
  273.         UINT32      ulOffset;         // Offset of the starting byte of the block
  274.         UINT32      ulSize;           // Size of the block
  275.         IHXBuffer*  pBlock;      // The actual block data
  276.     };
  277.     
  278.     // Discards 'byteCount' amount of oldest data. Note that this
  279.     // method is not thread safe. The caller has to take care of 
  280.     // locking common data structures before calling this method.
  281.     HX_RESULT _DiscardDataFromHead(UINT32 byteCount, BOOL bWriteToFile);
  282.     
  283.     HX_RESULT _DiscardDataFromTail(UINT32 byteCount, BOOL bWriteToFile);
  284.     // Check if utilizedData has exceeded THRESHOLD. If yes, discard 
  285.     // appropriate amount of data. Note that this
  286.     // method is not thread safe. The caller has to take care of 
  287.     // locking common data structures before calling this method.
  288.     HX_RESULT _CheckForThresholdCondition();
  289.     HX_RESULT _CopyFromFileToHead(UINT32 ulOffset, UINT32 ulSize);
  290.     HX_RESULT _CopyFromFileToTail(UINT32 ulOffset, UINT32 ulSize);
  291.     HX_RESULT _CopyAllDataToFile();
  292.     
  293.     
  294. }; // CHXFileCacheObject