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

Symbian

开发平台:

Visual C++

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