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

Symbian

开发平台:

Visual 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 _ATOMIZER_H_
  36. #define _ATOMIZER_H_
  37. /****************************************************************************
  38.  *  Defines
  39.  */
  40. #define ATOMIZE_ALL 0
  41. #ifdef QTCONFIG_SPEED_OVER_SIZE
  42. #define QTATOMIZER_INLINE inline
  43. #else // QTCONFIG_SPEED_OVER_SIZE
  44. #define QTATOMIZER_INLINE /**/
  45. #endif // QTCONFIG_SPEED_OVER_SIZE
  46. /****************************************************************************
  47.  *  Includes
  48.  */
  49. #include "hxatmzr.h"
  50. #include "hxfiles.h"
  51. #include "hxengin.h"
  52. #include "fswtchr.h"
  53. /****************************************************************************
  54.  * 
  55.  *  Class:
  56.  * CAtomizer
  57.  *
  58.  *  Purpose:
  59.  * Loads QT atoms into the atom tree from a file.
  60.  *
  61.  */
  62. class CAtomizer :   public IHXFileResponse,
  63.                     public IHXThreadSafeMethods,
  64.     public IHXAtomizationCommander
  65. {
  66. public:
  67.     /*
  68.      * Constructor
  69.      */
  70.     CAtomizer(void);
  71.     /*
  72.      * Main Interface
  73.      */
  74.     HX_RESULT Init(IUnknown* pSource,
  75.            IUnknown* pResponse,
  76.    IUnknown* pCommander = NULL);
  77.     void Close(void);
  78.     HX_RESULT Atomize( ULONG32 ulOffset = 0,
  79. ULONG32 ulSize = ATOMIZE_ALL);
  80.     /*
  81.      * IUnknown methods
  82.      */
  83.     STDMETHOD (QueryInterface )     (THIS_ 
  84.     REFIID ID, 
  85.     void** ppInterfaceObj);
  86.     STDMETHOD_(UINT32, AddRef )     (THIS);
  87.     STDMETHOD_(UINT32, Release)     (THIS);
  88.     /*
  89.      *  IHXFileResponse methods
  90.      */
  91.     /////////////////////////////////////////////////////////////////////////
  92.     //  Method:
  93.     //    IHXFileResponse::InitDone
  94.     //  Purpose:
  95.     //    Notification interface provided by users of the IHXFileObject
  96.     //    interface. This method is called by the IHXFileObject when the
  97.     //    initialization of the file is complete, and the Mime type is
  98.     //    available for the request file. If the URL is not valid for the
  99.     //    file system, the status HXR_FAILED should be returned,
  100.     //    with a mime type of NULL. If the URL is valid but the mime type
  101.     //    is unknown, then the status HXR_OK should be returned with
  102.     //    a mime type of NULL.
  103.     //
  104.     STDMETHOD(InitDone)     (THIS_
  105.     HX_RESULT     status)
  106.     {
  107. HX_ASSERT(HXR_NOTIMPL == HXR_OK);
  108. return HXR_NOTIMPL;
  109.     }
  110.     /////////////////////////////////////////////////////////////////////////
  111.     //  Method:
  112.     //   IHXFileResponse::CloseDone
  113.     //  Purpose:
  114.     //   Notification interface provided by users of the IHXFileObject
  115.     //   interface. This method is called by the IHXFileObject when the
  116.     //   close of the file is complete.
  117.     //
  118.     STDMETHOD(CloseDone) (THIS_
  119. HX_RESULT status)
  120.     {
  121. HX_ASSERT(HXR_NOTIMPL == HXR_OK);
  122. return HXR_NOTIMPL;
  123.     }
  124.     /////////////////////////////////////////////////////////////////////////
  125.     //  Method:
  126.     //   IHXFileResponse::ReadDone
  127.     //  Purpose:
  128.     //   Notification interface provided by users of the IHXFileObject
  129.     //   interface. This method is called by the IHXFileObject when the
  130.     //   last read from the file is complete and a buffer is available.
  131.     //
  132.     STDMETHOD(ReadDone) (THIS_ 
  133. HX_RESULT     status,
  134. IHXBuffer*     pBuffer);
  135.     /////////////////////////////////////////////////////////////////////////
  136.     //  Method:
  137.     //   IHXFileResponse::WriteDone
  138.     //  Purpose:
  139.     //   Notification interface provided by users of the IHXFileObject
  140.     //   interface. This method is called by the IHXFileObject when the
  141.     //   last write to the file is complete.
  142.     //
  143.     STDMETHOD(WriteDone) (THIS_ 
  144. HX_RESULT     status)
  145.     {
  146. HX_ASSERT(HXR_NOTIMPL == HXR_OK);
  147. return HXR_NOTIMPL;
  148.     }
  149.     /////////////////////////////////////////////////////////////////////////
  150.     //  Method:
  151.     //   IHXFileResponse::SeekDone
  152.     //  Purpose:
  153.     //   Notification interface provided by users of the IHXFileObject
  154.     //   interface. This method is called by the IHXFileObject when the
  155.     //   last seek in the file is complete.
  156.     //
  157.     STDMETHOD(SeekDone) (THIS_ 
  158. HX_RESULT     status);
  159.     /************************************************************************
  160.      * Method:
  161.      *     IHXFileResponse::FileObjectReady
  162.      * Purpose:
  163.      *     Notification interface provided by users of the IHXFileObject
  164.      *     interface. This method is called by the IHXFileObject when the
  165.      *     requested FileObject is ready. It may return NULL with 
  166.      *     HX_RESULT_FAIL if the requested filename did not exist in the 
  167.      *     same pool.
  168.      */
  169.     STDMETHOD(FileObjectReady) (THIS_
  170. HX_RESULT status,
  171. IHXFileObject* pFileObject)
  172.     {
  173. HX_ASSERT(HXR_NOTIMPL == HXR_OK);
  174. return HXR_NOTIMPL;
  175.     }
  176.     /*
  177.      * IHXAtomizationCommander methods
  178.      */
  179.     STDMETHOD_(QTAtomizerCmd,GetAtomCommand)   (THIS_
  180. QTAtomType AtomType,
  181. CQTAtom *pParent)
  182.     {
  183. return ATMZR_CMD_LOAD;
  184.     }
  185.    ///////////////////////////////////////////////////////////////////////////
  186.    //  Method:
  187.    // IHXThreadSafeMethods::IsThreadSafe
  188.    //  Purpose:
  189.    // This routine returns threadsafeness information about the file object
  190.    // which is used by the server for improved performance.
  191.    //
  192.    STDMETHOD_(UINT32,IsThreadSafe) (THIS);
  193. private:
  194.     typedef enum
  195.     {
  196. ATMZR_Offline,
  197. ATMZR_Ready, 
  198. ATMZR_ProcHeader,
  199. ATMZR_ProcNewHeader,
  200. ATMZR_ProcExtendedSize,
  201. ATMZR_MakeAtom,
  202. ATMZR_ProcBody
  203.     } AtomizerState;
  204.     typedef enum
  205.     {
  206. ATMZR_CBSTEP_Read,
  207. ATMZR_CBSTEP_Seek
  208.     } CallbackStep;
  209.     class CRecursionCallback : public IHXCallback
  210.     {
  211.     public:
  212. CRecursionCallback(CAtomizer *pAtomizer);
  213. ~CRecursionCallback();
  214. /*
  215.  *  IHXCallback methods
  216.  */
  217. STDMETHOD(Func) (THIS);
  218.     
  219.         /*
  220.  *  IUnknown methods
  221.  */
  222. STDMETHOD(QueryInterface) (THIS_ REFIID riid, void** ppvObj);
  223. STDMETHOD_(ULONG32,AddRef) (THIS);
  224. STDMETHOD_(ULONG32,Release) (THIS);
  225.     private:
  226. INT32     m_lRefCount;
  227. CAtomizer*  m_pAtomizer;
  228.     };
  229.     HX_RESULT ReadData(ULONG32 ulSize);
  230.     HX_RESULT SeekData(ULONG32 ulOffset, BOOL bRelative = FALSE);
  231.     inline HX_RESULT ReadDataCB(ULONG32 ulSize);
  232.     inline HX_RESULT SeekDataCB(ULONG32 ulOffset, BOOL bRelative = FALSE);
  233.     BOOL IsOffsetInRange(ULONG32 ulOffset)
  234.     {
  235. return (m_ulFinalOffset == ATOMIZE_ALL) || 
  236.        (ulOffset < m_ulFinalOffset);
  237.     }
  238.     QTATOMIZER_INLINE HX_RESULT AdjustCurrentRoot(void);
  239.     void CompleteAtomization(HX_RESULT status);
  240.     AtomizerState m_State;
  241.     IHXFileSwitcher *m_pFileSwitcher;
  242.     IHXAtomizerResponse *m_pResponse;
  243.     IHXAtomizationCommander *m_pCommander;    
  244.     IHXScheduler *m_pScheduler;
  245.     BOOL m_bSyncAccessEnabled;
  246.     BOOL m_bPreferLinearAccess;
  247.     CQTAtom *m_pRoot;
  248.     CQTAtom *m_pCurrentRoot;
  249.     CQTAtom *m_pNewAtom;
  250.     ULONG32 m_ulStartOffset;
  251.     ULONG32 m_ulFinalOffset;
  252.     ULONG32 m_ulCurrentOffset;
  253.     ULONG32 m_ulNewAtomOffset;
  254.     ULONG32 m_ulNewAtomDataSize;
  255.     QTAtomType m_AtomType;
  256.     ULONG32 m_ulTotalSize;
  257.     CRecursionCallback *m_pRecursionCallback;
  258.     ULONG32 m_ulRecursionCount;
  259.     CallbackStep m_CallbackStep;
  260.     ULONG32 m_ulSize;
  261.     BOOL m_bRelative;
  262.     LONG32 m_lRefCount;
  263.     friend class CRecursionCallback;
  264.     ~CAtomizer(); 
  265.     PRIVATE_DESTRUCTORS_ARE_NOT_A_CRIME
  266. };
  267. #endif  // _ATOMIZER_H_