minifilesys.cpp
上传用户:zhongxx05
上传日期:2007-06-06
资源大小:33641k
文件大小:12k
源码类别:

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. /****************************************************************************
  36.  * Defines
  37.  */
  38. #define   INITGUID     /* Interface ID's */
  39. /****************************************************************************
  40.  * Includes
  41.  */
  42. #include "hlxclib/string.h" /* strcpy */
  43. #include "hxtypes.h"
  44. #include "hxver.h"    /* HXVER_COPYRIGHT */
  45. #include "hxcom.h"    /* IUnknown */
  46. #include "hxcomm.h"   /* IHXCommonClassFactory */
  47. #include "ihxpckts.h" /* IHXValues */
  48. #include "minifilesys.h" /* CMiniFileSystem */
  49. #include "minifileobj.h" /* CMiniFileObject */
  50. #include "../smplfsys.ver" /* version info */
  51. #include "debug.h"
  52. #define D_MINI_FS 0x1000000
  53. /****************************************************************************
  54.  *
  55.  *  Function:
  56.  *
  57.  * HXCreateInstance()
  58.  *
  59.  *  Purpose:
  60.  *
  61.  * Function implemented by all plugin DLL's to create an instance of
  62.  * any of the objects supported by the DLL. This method is similar to
  63.  * Window's CoCreateInstance() in its purpose, except that it only
  64.  * creates objects from this plugin DLL.
  65.  *
  66.  * NOTE: Aggregation is never used. Therefore and outer unknown is
  67.  * not passed to this function, and you do not need to code for this
  68.  * situation.
  69.  *
  70.  */
  71. STDAPI ENTRYPOINT(HXCREATEINSTANCE)(IUnknown** ppFileSystemObj)
  72. {
  73.     DPRINTF(D_MINI_FS, ("smplfsys HXCREATEINSTANCE()n"));
  74.     HX_RESULT res = HXR_OUTOFMEMORY;
  75.     *ppFileSystemObj = (IUnknown*)(IHXPlugin*)new CHXMiniFileSystem();
  76.     if (*ppFileSystemObj != NULL)
  77.     {
  78. (*ppFileSystemObj)->AddRef();
  79. res = HXR_OK;
  80.     }
  81.     return res;
  82. }
  83. // CHXMiniFileSystem Class Methods
  84. /****************************************************************************
  85.  *  CHXMiniFileSystem static variables
  86.  *
  87.  *  These variables are passed to the Helix core to provide information about
  88.  *  this plug-in. They are required to be static in order to remain valid
  89.  *  for the lifetime of the plug-in.
  90.  */
  91. const char* const CHXMiniFileSystem::zm_pDescription = "RealNetworks Mini Local File System";
  92. const char* const CHXMiniFileSystem::zm_pCopyright   = HXVER_COPYRIGHT;
  93. const char* const CHXMiniFileSystem::zm_pMoreInfoURL = HXVER_MOREINFO;
  94. const char* const CHXMiniFileSystem::zm_pShortName   = "pn-mini-local";
  95. const char* const CHXMiniFileSystem::zm_pProtocol    = FILE_SYS_PROTOCOL;
  96. /****************************************************************************
  97.  *  CHXMiniFileSystem::CHXMiniFileSystem
  98.  *
  99.  *  Constructor
  100.  */
  101. CHXMiniFileSystem::CHXMiniFileSystem(void)
  102.     : m_RefCount      (0),
  103.       m_pClassFactory (NULL),
  104.       m_pBasePath     (new char[1])
  105. {
  106.     DPRINTF(D_MINI_FS, ("CHXMiniFileSystem()n"));
  107.     if (m_pBasePath)
  108.     {
  109. m_pBasePath[ 0 ] = '';
  110.     }
  111. }
  112. /****************************************************************************
  113.  *  CHXMiniFileSystem::~CHXMiniFileSystem
  114.  *
  115.  *  Destructor. Be sure to release all outstanding references to objects.
  116.  */
  117. CHXMiniFileSystem::~CHXMiniFileSystem(void)
  118. {
  119.     DPRINTF(D_MINI_FS, ("~CHXMiniFileSystem()n"));
  120.     HX_RELEASE(m_pClassFactory);
  121.     delete [] m_pBasePath;
  122.     m_pBasePath = 0;
  123. }
  124. // IHXFileSystemObject Interface Methods
  125. /****************************************************************************
  126.  *  IHXFileSystemObject::GetFileSystemInfo
  127.  *
  128.  *  This routine returns crucial information required to associate this
  129.  *  plug-in with a given protocol. This information tells the core which
  130.  *  File System plug-in to use for a particular protocol. For example, in the
  131.  *  URL: "file://myfile.txt", the protocol would be "file". This routine is
  132.  *  called when the Helix core application is launched.
  133.  */
  134. STDMETHODIMP
  135. CHXMiniFileSystem::GetFileSystemInfo(REF(const char*) pShortName,
  136.      REF(const char*) pProtocol)
  137. {
  138.     DPRINTF(D_MINI_FS, ("GetFileSystemInfo()n"));
  139.     pShortName = zm_pShortName;
  140.     pProtocol  = zm_pProtocol;
  141.     return HXR_OK;
  142. }
  143. /****************************************************************************
  144.  *  IHXFileSystemObject::InitFileSystem
  145.  *
  146.  *  This routine performs any additional initialization steps required for
  147.  *  the file system.  It is called prior to the CreatFile() request. Any
  148.  *  options provided usually refer to mounting options related to the server,
  149.  *  such as base path or authentication preferences.
  150.  */
  151. STDMETHODIMP
  152. CHXMiniFileSystem::InitFileSystem(IHXValues*  options )
  153. {
  154.     DPRINTF(D_MINI_FS, ("InitFileSystem()n"));
  155.     HX_RESULT res = HXR_OK;
  156.     // Retrieve the platform's base path, if specified
  157.     if (options != NULL )
  158.     {
  159. IHXBuffer* pPathBuffer = NULL;
  160. if (options->GetPropertyBuffer("BasePath", pPathBuffer) == HXR_OK)
  161. {
  162.     if (pPathBuffer->GetBuffer() != NULL)
  163.     {
  164. delete [] m_pBasePath;
  165. m_pBasePath = new char[strlen((char*)pPathBuffer->GetBuffer())];
  166. if (m_pBasePath)
  167. {
  168.     strcpy(m_pBasePath, (char*)pPathBuffer->GetBuffer());
  169. }
  170. else
  171. {
  172.     res = HXR_OUTOFMEMORY;
  173. }
  174.     }
  175.     pPathBuffer->Release();
  176. }
  177.     }
  178.     return res;
  179. }
  180. /****************************************************************************
  181.  *  IHXFileSystemObject::CreateFile
  182.  *
  183.  *  This routine creates a new File Object which handles all of the file I/O
  184.  *  functionality of this class. This File Object is eventually handed off
  185.  *  to a File Format plug-in which handles file I/O through this File Object.
  186.  *  This method is called called when an URL with a protocol associated with
  187.  *  this plug-in is opened.
  188.  */
  189. STDMETHODIMP
  190. CHXMiniFileSystem::CreateFile(IUnknown** ppFileObject)
  191. {
  192.     DPRINTF(D_MINI_FS, ("CreateFile()n"));
  193.     HX_RESULT res = HXR_OUTOFMEMORY;
  194.     // Create a new File Object which implements the file I/O methods
  195.     CHXMiniFileObject* pFileObj = new CHXMiniFileObject(m_pClassFactory,
  196. m_pBasePath);
  197.     if (pFileObj != NULL)
  198.     {
  199. pFileObj->QueryInterface(IID_IUnknown, (void**)ppFileObject);
  200. res = (pFileObj != NULL) ? HXR_OK : HXR_UNEXPECTED;
  201.     }
  202.     return res;
  203. }
  204. /****************************************************************************
  205.  *  IHXFileSystemObject::CreateDir
  206.  *
  207.  *  This routine is analagous to CreatFile, except directories instead of
  208.  *  files are of concern. It is not implemented in this example.
  209.  */
  210. STDMETHODIMP
  211. CHXMiniFileSystem::CreateDir(IUnknown** /* ppDirectoryObject */)
  212. {
  213.     DPRINTF(D_MINI_FS, ("CreateDir()n"));
  214.     return HXR_NOTIMPL;
  215. }
  216. // IHXPlugin Interface Methods
  217. /****************************************************************************
  218.  *  IHXPlugin::GetPluginInfo
  219.  *
  220.  *  This routine returns descriptive information about the plug-in, most
  221.  *  of which is used in the About box of the user interface. It is called
  222.  *  when the Helix core application is launched.
  223.  */
  224. STDMETHODIMP
  225. CHXMiniFileSystem::GetPluginInfo(REF(BOOL)        bLoadMultiple,
  226.  REF(const char*) pDescription,
  227.  REF(const char*) pCopyright,
  228.  REF(const char*) pMoreInfoURL,
  229.  REF(UINT32)      versionNumber)
  230. {
  231.     DPRINTF(D_MINI_FS, ("GetPluginInfo()n"));
  232.     bLoadMultiple = TRUE;
  233.     pDescription  = zm_pDescription;
  234.     pCopyright    = zm_pCopyright;
  235.     pMoreInfoURL  = zm_pMoreInfoURL;
  236.     versionNumber = TARVER_ULONG32_VERSION;
  237.     return HXR_OK;
  238. }
  239. /****************************************************************************
  240.  *  IHXPlugin::InitPlugin
  241.  *
  242.  *  This routine performs initialization steps such as determining if
  243.  *  required interfaces are available. It is called when the Helix core
  244.  *  application is launched, and whenever an URL with a protocol associated
  245.  *  with this plug-in is opened.
  246.  */
  247. STDMETHODIMP
  248. CHXMiniFileSystem::InitPlugin(IUnknown* pContext)
  249. {
  250.     DPRINTF(D_MINI_FS, ("InitPlugin()n"));
  251.     HX_RESULT res = HXR_OK;
  252.     if (pContext->QueryInterface(IID_IHXCommonClassFactory,
  253.  (void**)&m_pClassFactory) != HXR_OK)
  254.     {
  255. res = HXR_NOINTERFACE;
  256.     }
  257.     return res;
  258. }
  259. // IUnknown COM Interface Methods
  260. /****************************************************************************
  261.  *  IUnknown::AddRef
  262.  *
  263.  *  This routine increases the object reference count in a thread safe
  264.  *  manner. The reference count is used to manage the lifetime of an object.
  265.  *  This method must be explicitly called by the user whenever a new
  266.  *  reference to an object is used.
  267.  */
  268. STDMETHODIMP_(UINT32) CHXMiniFileSystem::AddRef(void)
  269. {
  270.     return InterlockedIncrement(&m_RefCount);
  271. }
  272. /****************************************************************************
  273.  *  IUnknown::Release
  274.  *
  275.  *  This routine decreases the object reference count in a thread safe
  276.  *  manner, and deletes the object if no more references to it exist. It must
  277.  *  be called explicitly by the user whenever an object is no longer needed.
  278.  */
  279. STDMETHODIMP_(UINT32) CHXMiniFileSystem::Release(void)
  280. {
  281.     if (InterlockedDecrement(&m_RefCount) > 0)
  282.     {
  283. return m_RefCount;
  284.     }
  285.     delete this;
  286.     return 0;
  287. }
  288. /****************************************************************************
  289.  *  IUnknown::QueryInterface
  290.  *
  291.  *  This routine indicates which interfaces this object supports. If a given
  292.  *  interface is supported, the object's reference count is incremented, and
  293.  *  a reference to that interface is returned. Otherwise a NULL object and
  294.  *  error code are returned. This method is called by other objects to
  295.  *  discover the functionality of this object.
  296.  */
  297. STDMETHODIMP CHXMiniFileSystem::QueryInterface(REFIID interfaceID,
  298.        void** ppInterfaceObj)
  299. {
  300.     QInterfaceList qiList[] =
  301.     {
  302. { GET_IIDHANDLE(IID_IUnknown),  (IUnknown*)(IHXPlugin*)this },
  303. { GET_IIDHANDLE(IID_IHXPlugin), (IHXPlugin*) this },
  304. { GET_IIDHANDLE(IID_IHXFileSystemObject), (IHXFileSystemObject*) this },
  305.     };
  306.     return ::QIFind(qiList, QILISTSIZE(qiList), interfaceID, ppInterfaceObj);
  307. }
  308. STDAPI ENTRYPOINT(CanUnload2)(void)
  309. {
  310.     return (CHXBaseCountingObject::ObjectsActive() > 0 ? HXR_FAIL : HXR_OK);
  311. }