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

Symbian

开发平台:

Visual C++

  1. /* ***** BEGIN LICENSE BLOCK *****
  2.  * Source last modified: $Id: smplfsys.h,v 1.1.32.3 2004/07/09 02:04:08 hubbe Exp $
  3.  * 
  4.  * Portions Copyright (c) 1995-2004 RealNetworks, Inc. All Rights Reserved.
  5.  * 
  6.  * The contents of this file, and the files included with this file,
  7.  * are subject to the current version of the RealNetworks Public
  8.  * Source License (the "RPSL") available at
  9.  * http://www.helixcommunity.org/content/rpsl unless you have licensed
  10.  * the file under the current version of the RealNetworks Community
  11.  * Source License (the "RCSL") available at
  12.  * http://www.helixcommunity.org/content/rcsl, in which case the RCSL
  13.  * will apply. You may also obtain the license terms directly from
  14.  * RealNetworks.  You may not use this file except in compliance with
  15.  * the RPSL or, if you have a valid RCSL with RealNetworks applicable
  16.  * to this file, the RCSL.  Please see the applicable RPSL or RCSL for
  17.  * the rights, obligations and limitations governing use of the
  18.  * contents of the file.
  19.  * 
  20.  * Alternatively, the contents of this file may be used under the
  21.  * terms of the GNU General Public License Version 2 or later (the
  22.  * "GPL") in which case the provisions of the GPL are applicable
  23.  * instead of those above. If you wish to allow use of your version of
  24.  * this file only under the terms of the GPL, and not to allow others
  25.  * to use your version of this file under the terms of either the RPSL
  26.  * or RCSL, indicate your decision by deleting the provisions above
  27.  * and replace them with the notice and other provisions required by
  28.  * the GPL. If you do not delete the provisions above, a recipient may
  29.  * use your version of this file under the terms of any one of the
  30.  * RPSL, the RCSL or the GPL.
  31.  * 
  32.  * This file is part of the Helix DNA Technology. RealNetworks is the
  33.  * developer of the Original Code and owns the copyrights in the
  34.  * portions it created.
  35.  * 
  36.  * This file, and the files included with this file, is distributed
  37.  * and made available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY
  38.  * KIND, EITHER EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS
  39.  * ALL SUCH WARRANTIES, INCLUDING WITHOUT LIMITATION, ANY WARRANTIES
  40.  * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, QUIET
  41.  * ENJOYMENT OR NON-INFRINGEMENT.
  42.  * 
  43.  * Technology Compatibility Kit Test Suite(s) Location:
  44.  *    http://www.helixcommunity.org/content/tck
  45.  * 
  46.  * Contributor(s):
  47.  * 
  48.  * ***** END LICENSE BLOCK ***** */
  49. #ifndef _SMPLFSYS_H_
  50. #define _SMPLFSYS_H_
  51. #include <stdio.h>
  52. /****************************************************************************
  53.  * 
  54.  *  Function:
  55.  * 
  56.  * HXCreateInstance()
  57.  * 
  58.  *  Purpose:
  59.  * 
  60.  * Function implemented by all plugin DLL's to create an instance of 
  61.  * any of the objects supported by the DLL. This method is similar to 
  62.  * Window's CoCreateInstance() in its purpose, except that it only 
  63.  * creates objects from this plugin DLL.
  64.  *
  65.  * NOTE: Aggregation is never used. Therefore an outer unknown is
  66.  * not passed to this function, and you do not need to code for this
  67.  * situation.
  68.  * 
  69.  */
  70. STDAPI HXCreateInstance(IUnknown**  /*OUT*/ ppIUnknown);
  71. /****************************************************************************
  72.  * 
  73.  *  Function:
  74.  * 
  75.  * HXShutdown()
  76.  * 
  77.  *  Purpose:
  78.  * 
  79.  * Function implemented by all plugin DLL's to free any *global* 
  80.  * resources. This method is called just before the DLL is unloaded.
  81.  *
  82.  */
  83. STDAPI HXShutdown(void);
  84. // Forward declarations
  85. class CHXGenericCallback;
  86. #if defined(HELIX_FEATURE_PROGDOWN)
  87. class CProgressiveDownloadMonitor;
  88. #endif /* #if defined(HELIX_FEATURE_PROGDOWN) */
  89. /////////////////////////////////////////////////////////////////////////////
  90. // 
  91. //  Class:
  92. //
  93. //   CSimpleFileSystem
  94. //
  95. //  Purpose:
  96. //
  97. //   Example implementation of a basic file system.
  98. //
  99. class CSimpleFileSystem :   public IHXPlugin, 
  100.     public IHXFileSystemObject
  101. {
  102. private:
  103.     LONG32 m_lRefCount;
  104.     static const IID            zm_myIID;
  105.     static const char* const    zm_pDescription;
  106.     static const char* const    zm_pCopyright;
  107.     static const char* const    zm_pMoreInfoURL;
  108.     static const char* const    zm_pShortName;
  109.     static const char* const zm_pProtocol;
  110.     CHXString m_base_path;
  111.     IUnknown* m_pContext;
  112.     IHXValues* m_options;
  113.     UINT32 m_ulMaxIterationLevel;
  114. public:
  115.     CSimpleFileSystem();
  116.     ~CSimpleFileSystem();
  117.     BOOL m_bDisableMemoryMappedIO;
  118.     BOOL m_bEnableFileLocking;
  119.     UINT32 m_ulChunkSize;
  120.     IUnknown* m_pCommonObj;
  121.     // *** IUnknown methods ***
  122.     STDMETHOD(QueryInterface) (THIS_
  123.                     REFIID riid,
  124.                     void** ppvObj);
  125.     STDMETHOD_(ULONG32,AddRef) (THIS);
  126.     STDMETHOD_(ULONG32,Release) (THIS);
  127.     // *** IHXPlugin methods ***
  128.     /************************************************************************
  129.      * Method:
  130.      *     IHXPlugin::GetPluginInfo
  131.      * Purpose:
  132.      *     Returns the basic information about this plugin. Including:
  133.      *
  134.      *     bLoadMultiple whether or not this plugin DLL can be loaded
  135.      * multiple times. All File Formats must set
  136.      * this value to TRUE.
  137.      *     pDescription which is used in about UIs (can be NULL)
  138.      *     pCopyright which is used in about UIs (can be NULL)
  139.      *     pMoreInfoURL which is used in about UIs (can be NULL)
  140.      */
  141.     STDMETHOD(GetPluginInfo) (THIS_
  142. REF(BOOL)        /*OUT*/ bLoadMultiple,
  143. REF(const char*) /*OUT*/ pDescription,
  144. REF(const char*) /*OUT*/ pCopyright,
  145. REF(const char*) /*OUT*/ pMoreInfoURL,
  146. REF(ULONG32)  /*OUT*/ ulVersionNumber
  147. );
  148.     /************************************************************************
  149.      * Method:
  150.      *     IHXPlugin::InitPlugin
  151.      * Purpose:
  152.      *     Initializes the plugin for use. This interface must always be
  153.      *     called before any other method is called. This is primarily needed 
  154.      *     so that the plugin can have access to the context for creation of
  155.      *     IHXBuffers and IMalloc.
  156.      */
  157.     STDMETHOD(InitPlugin)   (THIS_
  158.     IUnknown*   /*IN*/  pContext);
  159.     // *** IHXFileSystemObject methods ***
  160.     STDMETHOD(GetFileSystemInfo)    (THIS_
  161.     REF(const char*) /*OUT*/ pShortName,
  162.     REF(const char*) /*OUT*/ pProtocol);
  163.     STDMETHOD(InitFileSystem) (THIS_ IHXValues* options);
  164.     STDMETHOD(CreateFile) (THIS_
  165. IUnknown**    /*OUT*/ ppFileObject);
  166.     STDMETHOD(CreateDir)        (THIS_
  167.                                 IUnknown**     /*OUT*/  ppDirObject);
  168. };
  169. #ifdef _MACINTOSH
  170. enum SeekReason
  171. {
  172.     REINIT_SEEK = 0,
  173.     EXTERNAL_SEEK,
  174.     PRE_TELL_SEEK,
  175.     POST_TELL_SEEK
  176. };
  177. #endif
  178. /////////////////////////////////////////////////////////////////////////////
  179. // 
  180. //  Class:
  181. //
  182. //   CSimpleFileObject
  183. //
  184. //  Purpose:
  185. //
  186. //   Example implementation of a basic file system file object.
  187. //
  188. class CSimpleFileObject :   public IHXFileObject, 
  189.     public IHXDirHandler,
  190.     public IHXFileStat,
  191.     public IHXFileExists,
  192.     public IHXGetFileFromSamePool,
  193.     public IHXRequestHandler,
  194.     public IHXFileRename,
  195.     public IHXFileRemove,
  196.     public IHXFileMove,
  197.     public IHXThreadSafeMethods
  198. #if defined(HELIX_FEATURE_PROGDOWN)
  199.                             , public CProgressiveDownloadMonitorResponse
  200. #endif /* #if defined(HELIX_FEATURE_PROGDOWN) */
  201. {
  202. private:
  203.     UINT32     m_ulSize;
  204.     UINT32     m_ulPos;
  205.     BOOL     m_bCanBeReOpened;
  206.     void     UpdateFileNameMember();
  207.     LONG32     m_lRefCount;
  208.     UINT32          m_ulFlags;
  209.     UINT32     m_ulMaxIterationLevel;
  210. #ifdef USE_THREADSAFE_SCHEDULER
  211.     IHXThreadSafeScheduler* m_pScheduler;
  212. #else
  213.     IHXScheduler*     m_pScheduler;
  214. #endif //USE_THREADSAFE_SCHEDULER
  215.     IUnknown*     m_pContext;
  216.     IHXCommonClassFactory* m_pCommonClassFactory;
  217.     IHXFileResponse*     m_pFileResponse;
  218.     CSimpleFileSystem*     m_pFileSystem;
  219.     IHXRequest*     m_pRequest;
  220.     IHXDescriptorRegistration* m_pDescriptorReg;
  221.     BOOL     m_bLocalClose;
  222.     IHXDirHandlerResponse* m_pDirResponse;
  223.     char*     m_pFilename;
  224. #ifdef _MACINTOSH
  225.     CMacAsyncFile*     m_pDataFile; /* cross-platform file object */
  226. #else
  227.     IHXDataFile*     m_pDataFile; /* cross-platform file object */
  228. #endif
  229.     int     m_nFd;
  230.     CHXString     m_base_path;
  231.     BOOL     m_bAsyncAccess;
  232.     BOOL     m_bInRead;
  233.     BOOL     m_bReadPending;
  234.     BOOL     m_bAsyncReadPending;
  235.     UINT32     m_ulPendingReadCount;
  236.     CFindFile*     m_pDirList;
  237.     IUnknown*     m_pUnknownUserContext;
  238.     UINT32                  m_ulPendingSeekOffset;
  239.     UINT16                  m_usPendingSeekWhence;
  240.     void GetFullPathname(const char* pPath, CHXString* pPathname);
  241.     BOOL     m_bReadCancelled;
  242.     HX_RESULT ActualAsyncReadDone(HX_RESULT result, IHXBuffer* pBuffer);
  243.     HX_RESULT ActualAsyncSeekDone(HX_RESULT result);
  244.     HX_RESULT DoRead(REF(BOOL) rbProgFail);
  245.     HX_RESULT DoSeek(REF(HX_RESULT) rSeekDoneResult);
  246.     void      SeekBackwards(UINT32 ulNumBytes);
  247.     HX_RESULT FinishDoRead(UINT32 actual, REF(IHXBuffer*) pBuffer);
  248. #ifdef _MACINTOSH
  249.     class SMPLAsyncResponse : public CMacAsyncFileResponse
  250.     {
  251.     public:
  252. SMPLAsyncResponse(CSimpleFileObject* pFileObject);
  253. ~SMPLAsyncResponse();
  254. HX_RESULT AsyncReadDone(HX_RESULT result, IHXBuffer* pBuffer);
  255. HX_RESULT AsyncSeekDone(HX_RESULT result);
  256. CSimpleFileObject*  m_pSMPLFileObject;
  257.     };
  258.     friend class SMPLAsyncResponse;
  259.     SMPLAsyncResponse*     m_pAsyncFileResponse;
  260.     IHXInterruptState*     m_pInterruptState;
  261.     IHXFileStatResponse*   m_pFileStatResponse;
  262.     SeekReason     m_eSeekReason;
  263.     UINT32     m_ulPreSeekPosition;
  264.     BOOL     m_bFileToBeClosed;
  265. #endif
  266.     CHXGenericCallback* m_pStackCallback;
  267. #if defined(HELIX_FEATURE_PROGDOWN)
  268.     enum
  269.     {
  270.         CallbackStateUnknown,
  271.         CallbackStateSeek,
  272.         CallbackStateRead
  273.     };
  274.     CProgressiveDownloadMonitor* m_pProgDownMon;
  275.     UINT32                       m_ulCallbackState;
  276.     BOOL                         RequireFullRead();
  277.     HX_RESULT                    FinishDoReadWithCallback(UINT32 actual);
  278.     HX_RESULT                    FinishDoReadWithoutCallback(UINT32 actual);
  279.     BOOL                         m_bProgDownEnabled;
  280. #endif /* #if defined(HELIX_FEATURE_PROGDOWN) */
  281. public:
  282.     CSimpleFileObject
  283.     (
  284. CHXString& base_path, 
  285. CSimpleFileSystem*, 
  286. IUnknown*,
  287. UINT32 ulMaxRecursionLevel
  288.     );
  289.     ~CSimpleFileObject();
  290.     /*
  291.      * IUnknown methods
  292.      */
  293.     STDMETHOD(QueryInterface) (THIS_
  294.                     REFIID riid,
  295.                     void** ppvObj);
  296.     STDMETHOD_(ULONG32,AddRef) (THIS);
  297.     STDMETHOD_(ULONG32,Release) (THIS);
  298.     /*
  299.      * IHXFileObject methods
  300.      */
  301.     /************************************************************************
  302.      * Method:
  303.      *     IHXFileObject::Init
  304.      * Purpose:
  305.      *     Associates a file object with the file response object it should
  306.      *     notify of operation completness. This method should also check
  307.      *     for validity of the object (for example by opening it if it is
  308.      *     a local file).
  309.      */
  310.     STDMETHOD(Init) (THIS_
  311. ULONG32     /*IN*/ ulFlags,
  312. IHXFileResponse*   /*IN*/ pFileResponse);
  313.     /************************************************************************
  314.      *  Method:
  315.      *      IHXFileObject::GetFilename
  316.      *  Purpose:
  317.      *      Returns the filename (without any path information) associated
  318.      *      with a file object.
  319.      */
  320.     STDMETHOD(GetFilename)      (THIS_
  321. REF(const char*)    /*OUT*/  pFilename);
  322.     /************************************************************************
  323.      * Method:
  324.      *     IHXFileObject::Close
  325.      * Purpose:
  326.      *     Closes the file resource and releases all resources associated
  327.      *     with the object.
  328.      */
  329.     STDMETHOD(Close)      (THIS);
  330.     /************************************************************************
  331.      * Method:
  332.      *     IHXFileObject::Read
  333.      * Purpose:
  334.      *     Reads a buffer of data of the specified length from the file
  335.      *     and asynchronously returns it to the caller via the 
  336.      *     IHXFileResponse interface passed in to Init.
  337.      */
  338.     STDMETHOD(Read) (THIS_
  339.                     ULONG32          ulCount);
  340.     /************************************************************************
  341.      * Method:
  342.      *     IHXFileObject::Write
  343.      * Purpose:
  344.      *     Writes a buffer of data to the file and asynchronously notifies
  345.      *     the caller via the IHXFileResponse interface passed in to Init,
  346.      *     of the completeness of the operation.
  347.      */
  348.     STDMETHOD(Write)      (THIS_
  349.                     IHXBuffer*     pBuffer);
  350.     /************************************************************************
  351.      * Method:
  352.      *     IHXFileObject::Seek
  353.      * Purpose:
  354.      *     Seeks to an offset in the file and asynchronously notifies
  355.      *     the caller via the IHXFileResponse interface passed in to Init,
  356.      *     of the completeness of the operation.
  357.      */
  358.     STDMETHOD(Seek) (THIS_
  359.                      ULONG32     ulOffset,
  360.  BOOL               bRelative);
  361.     /************************************************************************
  362.      * Method:
  363.      *     IHXFileObject::Stat
  364.      * Purpose:
  365.      *     Collects information about the file that is returned to the
  366.      *      caller in an IHXStat object
  367.      */
  368.     STDMETHOD(Stat) (THIS_
  369. IHXFileStatResponse* pFileStatResponse);
  370.     /************************************************************************
  371.      * Method:
  372.      *     IHXFileObject::Advise
  373.      * Purpose:
  374.      *      To pass information to the File Object
  375.      */
  376.     STDMETHOD(Advise) (THIS_
  377. ULONG32 ulInfo);
  378.     /************************************************************************
  379.      * Method:
  380.      *     IHXDirHandler::InitDirHandler
  381.      * Purpose:
  382.      *     Associates a directory handler with the directory handler
  383.      *     response, it should notify of operation completness.
  384.      */
  385.     STDMETHOD(InitDirHandler) (THIS_
  386. IHXDirHandlerResponse*    /*IN*/  pDirResponse);
  387.     /************************************************************************
  388.      * Method:
  389.      *     IHXDirHandler::CloseDirHandler
  390.      * Purpose:
  391.      *     Closes the directory handler resource and releases all resources
  392.      *     associated with the object.
  393.      */
  394.     STDMETHOD(CloseDirHandler) (THIS);
  395.     /************************************************************************
  396.      * Method:
  397.      *     IHXDirHandler::MakeDir
  398.      * Purpose:
  399.      *     Create the directory
  400.      */
  401.     STDMETHOD(MakeDir) (THIS);
  402.     /************************************************************************
  403.      * Method:
  404.      *     IHXDirHandler::ReadDir
  405.      * Purpose:
  406.      *     Get a dump of the directory
  407.      */
  408.     STDMETHOD(ReadDir) (THIS);
  409.     /************************************************************************
  410.      * Method:
  411.      *     IHXGetFileFromSamePool::GetFileObjectFromPool
  412.      * Purpose:
  413.      *      To get another FileObject from the same pool. 
  414.      */
  415.     STDMETHOD(GetFileObjectFromPool) (THIS_
  416.  IHXGetFileFromSamePoolResponse*);
  417.     // IHXFileExists interface
  418.     /************************************************************************
  419.      * Method:
  420.      *     IHXFileExists::DoesExist
  421.      * Purpose:
  422.      */
  423.     STDMETHOD(DoesExist) (THIS_
  424. const char* /*IN*/  pPath, 
  425. IHXFileExistsResponse* /*IN*/  pFileResponse);
  426.     //IHXRequestHandler methods
  427.     /************************************************************************
  428.      * Method:
  429.      *     IHXRequestHandler::SetRequest
  430.      * Purpose:
  431.      *     Associates an IHXRequest with an object
  432.      */
  433.     STDMETHOD(SetRequest)    (THIS_
  434.      IHXRequest*        /*IN*/  pRequest);
  435.     /************************************************************************
  436.      * Method:
  437.      *     IHXRequestHandler::GetRequest
  438.      * Purpose:
  439.      *     Gets the IHXRequest object associated with an object
  440.      */
  441.     STDMETHOD(GetRequest)    (THIS_
  442.      REF(IHXRequest*)  /*OUT*/  pRequest);
  443.     /************************************************************************
  444.      * Method:
  445.      *     IHXFileRename::Rename
  446.      * Purpose:
  447.      *     Renames the file to the new file name
  448.      */
  449.     STDMETHOD(Rename) (THIS_
  450. const char* /*IN*/  pFilename);
  451.     /************************************************************************
  452.      * Method:
  453.      *     IHXFileMove::Move
  454.      * Purpose:
  455.      *     Renames the file to the new file name
  456.      */
  457.     STDMETHOD(Move) (THIS_
  458. const char* /*IN*/  pFilename);
  459.     /************************************************************************
  460.      * Method:
  461.      *     IHXFileRemove::Remove
  462.      * Purpose:
  463.      *     Removes the file from the file system
  464.      */
  465.     STDMETHOD(Remove) (THIS);
  466.     /************************************************************************
  467.      * Method:
  468.      *     Private interface::_OpenFile
  469.      * Purpose:
  470.      *     This common method is used from Init() and GetFileObjectFromPool()
  471.      */
  472.     STDMETHOD(_OpenFile) (THIS_
  473.   ULONG32     ulFlags);
  474.     STDMETHOD_(UINT32,IsThreadSafe)(THIS);
  475. #if defined(HELIX_FEATURE_PROGDOWN)
  476.     // CProgressiveDownloadMonitorResponse methods
  477.     STDMETHOD(ProgressiveCallback) (THIS);
  478. #endif /* #if defined(HELIX_FEATURE_PROGDOWN) */
  479.     // CSimpleFileObject methods
  480.     static void StackCallback(void* pArg);
  481. };
  482. #endif // ndef _SMPLFSYS_H_