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

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 _RIFF_H_
  36. #define _RIFF_H_
  37. #include "hxfiles.h"
  38. #include "hxengin.h"
  39. #define MAXLEVELS 64
  40. // To improve performance under the Simple File System, we restrict reads to
  41. // a maximum of this value (in the future, this should be registry based):
  42. #define MAX_READ_SIZE (1 << 16)
  43. class CRIFFResponse;
  44. typedef _INTERFACE IHXFileObject IHXFileObject;
  45. class CRIFFReader : public IHXFileResponse,
  46.             public IHXThreadSafeMethods
  47. {
  48. public:
  49.     CRIFFReader(IUnknown*, CRIFFResponse*, IHXFileObject*);
  50.     ~CRIFFReader();
  51.     // CRIFFReader methods
  52.     /*
  53.      * Open: Opens the given file for reading
  54.      */
  55.     HX_RESULT Open(char* filename);
  56.     /*
  57.      * Close: Close the file
  58.      */
  59.     HX_RESULT Close();
  60.     /* FindChunk:
  61.      * At the current level of the file, search for a chunk with the given id.
  62.      * If not relative, start at the beginning of the file.  If relative,
  63.      * Start from the beginning of next chunk (or at the current file position
  64.      * if it is already pointing at the start of a chunk)
  65.      */
  66.     HX_RESULT FindChunk(UINT32 id, BOOL bRelative);
  67.     /* Descend:
  68.      * If pointing at a list or riff chunk, begin parsing the contents
  69.      * of the list
  70.      */
  71.     HX_RESULT Descend();
  72.     /* Ascend:
  73.      * Go back up a level from a previous Descend
  74.      */
  75.     HX_RESULT Ascend();
  76.     /*
  77.      * Read:
  78.      * Read the given number of bytes from the file at the current
  79.      * position
  80.      */
  81.     HX_RESULT Read(UINT32);
  82.     /*
  83.      * Seek:
  84.      * Seek to the given position _within_the_current_chunk_.
  85.      * If relative, seek relative to the current file position.
  86.      * If not relative, seek relative to the beginning of the chunk
  87.      */
  88.     HX_RESULT Seek(UINT32, BOOL);
  89.     /*
  90.      * FileSeek:
  91.      * Seek to the absolute position in the file.  Mainly for file formats
  92.      * that store index chunks with file relative offsets.  Does not
  93.      * check to see if a chunk boundary is crossed, make sure you know
  94.      * what you're doing!
  95.      */
  96.     HX_RESULT FileSeek(UINT32);
  97.     /*
  98.      * GetChunk:
  99.      * Read an entire chunk into a buffer
  100.      */
  101.     HX_RESULT GetChunk();
  102.     UINT32  CurrentOffset() { return m_ulCurOffset - m_ulThisChunkOffset; };
  103.     UINT32  FileType();
  104.     UINT32  FileSubtype();
  105.     UINT32 m_ulFileSpecifiedReadSize;
  106.     // IHXFileResponse methods
  107.     STDMETHOD(QueryInterface) (THIS_
  108.                    REFIID riid,
  109.                    void** ppvObj);
  110.     STDMETHOD_(ULONG32,AddRef) (THIS);
  111.     STDMETHOD_(ULONG32,Release) (THIS);
  112.     STDMETHOD(InitDone)      (THIS_
  113.                   HX_RESULT status);
  114.     STDMETHOD(ReadDone)      (THIS_
  115.                   HX_RESULT status,
  116.                   IHXBuffer* pBuffer);
  117.     STDMETHOD(SeekDone)      (THIS_
  118.                   HX_RESULT status);
  119.     STDMETHOD(CloseDone)     (THIS_
  120.                   HX_RESULT status);
  121.     STDMETHOD(WriteDone)     (THIS_
  122.                   HX_RESULT status);
  123.      /************************************************************************
  124.      *  Method:
  125.      *      IHXFileResponse::FileObjectReady
  126.      *  Purpose:
  127.      *      Notification interface provided by users of the IHXFileObject
  128.      *      interface. This method is called by the IHXFileObject when the
  129.      *      requested FileObject is ready. It may return NULL with
  130.      *      HX_RESULT_FAIL if the requested filename did not exist in the
  131.      *      same pool.
  132.      */
  133.     STDMETHOD(FileObjectReady)  (THIS_
  134.                 HX_RESULT status,
  135.                 IHXFileObject* pFileObject);
  136.     STDMETHOD_(UINT32,IsThreadSafe)(THIS);
  137.     // Special getlong and getshort that can handle files in either byte
  138.     // order (depending on what file type we think we're dealing with)
  139.     INT32 GetLong(UCHAR* data)
  140.     {
  141.     if(m_bLittleEndian)
  142.         return
  143.         (INT32)((((unsigned long)data[3]) << 24) | (((unsigned long)data[2]) << 16) | (((unsigned long)data[1]) << 8) | (unsigned long)data[0]);
  144.     else
  145.         return
  146.             (INT32)((((unsigned long)data[0]) << 24) | (((unsigned long)data[1]) << 16) | (((unsigned long)data[2]) << 8) | (unsigned long)data[3]);
  147.     };
  148.     INT16 GetShort(UCHAR* data)
  149.     {
  150.     if(m_bLittleEndian)
  151.         return (data[1] << 8) | data[0];
  152.     else
  153.         return (data[0] << 8) | data[1];
  154.     };
  155.     UINT32 GetListType();
  156.     UINT32 GetOffset();
  157. private:
  158.     struct LevelInfo
  159.     {
  160.     LevelInfo()
  161.         : m_startOffset(0)
  162.         , m_nextChunkOffset(0)
  163.         , started(FALSE)
  164.     {}
  165.     UINT32 m_startOffset;
  166.     UINT32 m_nextChunkOffset;
  167.     BOOL   started;
  168.     };
  169.     INT32                 m_lRefCount;
  170.     IHXFileObject*       m_pFileObject;
  171.     CRIFFResponse*        m_pResponse;
  172.     IUnknown*             m_pContext;
  173.     BOOL                  m_bFileIsOpen;
  174.     char*                 m_pFilename;
  175.     UINT32                m_ulFindChunkId;
  176.     UINT32                m_ulChunkBodyLen;
  177.     BOOL                  m_bLittleEndian;
  178.     UINT32                m_ulLevel;
  179.     UINT32                m_ulSeekOffset;
  180.     UINT32                m_ulCurOffset;
  181.     UINT32                m_ulFileType;
  182.     UINT32                m_ulSubFileType;
  183.     UINT32                m_ulChunkType;
  184.     UINT32                m_ulChunkSubType;
  185.     LevelInfo             m_levelInfo[MAXLEVELS];
  186.     UINT32                m_ulThisChunkOffset;
  187.     UINT32                m_ulGetChunkType;
  188.     UINT32                m_ulSizeDiff;
  189.     // For chunks > MAX_READ_SIZE, our reassembly buffer and associated
  190.     // variables:
  191.     IHXBuffer*           m_pReassemblyBuffer;
  192.     UINT32                m_ulChunkBytesRead;
  193.     UINT32                m_ulChunkSize;
  194.     typedef enum
  195.     {
  196.     RS_Ready,
  197.     RS_InitPending,
  198.     RS_ChunkHeaderReadPending,
  199.     RS_FileStartSeekPending,
  200.     RS_ChunkBodySeekPending,
  201.     RS_GetFileTypePending,
  202.     RS_AscendSeekPending,
  203.     RS_GetActualFileTypePending,
  204.     RS_DataReadPending,
  205.     RS_GetListTypePending,
  206.     RS_UserSeekPending,
  207.     RS_ReadChunkHeaderPending,
  208.     RS_ReadChunkBodyPending
  209.     }
  210.     RiffState;
  211.     RiffState m_state;
  212.     HX_RESULT InternalClose();
  213. };
  214. #endif