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

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