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