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

Symbian

开发平台:

Visual C++

  1. /* ***** BEGIN LICENSE BLOCK *****
  2.  * Source last modified: $Id: basehand.h,v 1.11.8.1 2004/07/09 02:07:18 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 _BASEHAND_H_
  50. #define _BASEHAND_H_
  51. #include "hxphand.h"
  52. #include "unkimp.h"
  53. #include "hxslist.h"
  54. #include "hxmap.h"
  55. // Plugin Types.
  56. #define PLUGIN_FILESYSTEM_TYPE     "PLUGIN_FILE_SYSTEM"
  57. #define PLUGIN_FILEFORMAT_TYPE     "PLUGIN_FILE_FORMAT"
  58. #define PLUGIN_FILEWRITER_TYPE     "PLUGIN_FILE_WRITER"
  59. #define PLUGIN_METAFILEFORMAT_TYPE  "PLUGIN_METAFILE_FORMAT"
  60. #define PLUGIN_RENDERER_TYPE     "PLUGIN_RENDERER"
  61. #define PLUGIN_STREAM_DESC_TYPE     "PLUGIN_STREAM_DESC"
  62. #define PLUGIN_CLASS_FACTORY_TYPE   "PLUGIN_CLASS_FACT"
  63. #define PLUGIN_PAC_TYPE     "PLUGIN_PAC"
  64. #define PLUGIN_CLASS     "PluginType"
  65. #define PLUGIN_FILENAME     "PluginFilename"
  66. #define PLUGIN_REGKEY_ROOT     "PluginHandlerData"
  67. #define PLUGIN_PLUGININFO     "PluginInfo"
  68. #define PLUGIN_GUIDINFO     "GUIDInfo"
  69. #define PLUGIN_NONHXINFO     "NonHXDLLs"
  70. #define PLUGIN_DESCRIPTION2     "Description"
  71. #define PLUGIN_FILE_HASH     "FileHash"
  72. #define PLUGIN_INDEX     "IndexNumber"
  73. #define PLUGIN_FILENAMES     "FileInfo"
  74. #define PLUGIN_COPYRIGHT2     "Copyright"
  75. #define PLUGIN_LOADMULTIPLE     "LoadMultiple"
  76. #define PLUGIN_VERSION     "Version"
  77. #define PLUGIN_FILESYSTEMSHORT     "FileShort"
  78. #define PLUGIN_FILESYSTEMPROTOCOL   "FileProtocol"
  79. #define PLUGIN_FILEMIMETYPES     "FileMime"
  80. #define PLUGIN_FILEEXTENSIONS     "FileExtensions"
  81. #define PLUGIN_FILEOPENNAMES     "FileOpenNames"
  82. #define PLUGIN_RENDERER_MIME     "RendererMime"
  83. #define PLUGIN_RENDERER_GRANULARITY "Renderer_Granularity"
  84. #define PLUGIN_STREAMDESCRIPTION    "StreamDescription"
  85. #define PLUGIN_NUM_PLUGINS     "NumPlugins"
  86. #define PLUGIN_FILE_CHECKSUM     "DLLCheckSum"
  87. #define PLUGIN_DLL_SIZE     "DLLSize"
  88. #define PLUGIN_HAS_FACTORY     "DLLHasFactory"
  89. typedef HX_RESULT (HXEXPORT_PTR FPCREATEINSTANCE) (IUnknown** /*OUT*/ ppIUnknown);
  90. typedef HX_RESULT (HXEXPORT_PTR FPSHUTDOWN) ();
  91. typedef HX_RESULT (HXEXPORT_PTR FPCANUNLOAD2) ();
  92. class DLLAccess;
  93. class CFindFile;
  94. class BaseHandler : public CUnknownIMP,
  95. public IHXPluginEnumerator,
  96. public IHXPlugin2Handler,
  97.      public IHXPluginHandler3
  98. {
  99.     class PluginMountPoint;
  100.     class PluginDLL;
  101.     class Plugin;
  102.     class OtherDLL;
  103.     friend class CPluginEnumerator;
  104.     friend class PluginDLL;
  105.     friend class Plugin;
  106.     friend class OtherDLL;
  107. public:
  108.     enum    Errors
  109.     {
  110. NO_ERRORS = 0,
  111. PLUGIN_NOT_FOUND,
  112. MEMORY_ERROR,
  113. CANT_OPEN_DLL,
  114. BAD_DLL,
  115. CREATE_INSTANCHXR_FAILURE,
  116. CANT_DETERMINE_PLUGIN_DIR,
  117. CANT_OPEN_PLUGIN_DIR,
  118. BAD_PLUGIN,
  119. INVALID_CONTEXT,
  120. CANT_GET_FILE_FORMAT_INFO,
  121. CANT_GET_RENDERER_INFO,
  122. CANT_GET_FILE_SYSTEM_INFO,
  123. CANT_LOAD_INTERFACE,
  124. SHORT_NAME_NOT_FOUND,
  125. PLUGIN_ALREADY_HAS_MOUNT_POINT,
  126. INVALID_SHORT_NAME,
  127. BAD_REGISTRY_HANDLE,
  128. PLUGIN_DIR_NOT_SAME,
  129. REQUIRED_PLUGIN_NOT_LOADED,
  130. NO_HX_CREATE_INSTANCE,
  131. AGGREGATION_NOT_SUPPORTED
  132.     };
  133.     enum eValueTypes
  134.     {
  135. eString,
  136. eBuffer,
  137. eInt
  138.     };
  139.     DECLARE_UNKNOWN_NOCREATE( BaseHandler )
  140.     DECLARE_COM_CREATE_FUNCS( BaseHandler )
  141.     BaseHandler();
  142.     ~BaseHandler();
  143.     /*
  144.      * IHXPluginEnumerator methods
  145.      */
  146.     /************************************************************************
  147.      * Method:
  148.      *     IHXPluginEnumerator::GetNumOfPlugins
  149.      *
  150.      * Purpose:
  151.      *     return the number of plugins available
  152.      *
  153.      */
  154.     STDMETHOD_(ULONG32,GetNumOfPlugins) (THIS);
  155.     /************************************************************************
  156.      * Method:
  157.      *     IHXPluginEnumerator::GetPlugin
  158.      * Purpose:
  159.      *     return an instance(IUnknown) of the plugin
  160.      *
  161.      */
  162.     STDMETHOD(GetPlugin)   (THIS_
  163.     ULONG32     /*IN*/  ulIndex,
  164.     REF(IUnknown*)  /*OUT*/ pPlugin);
  165.     /*
  166.      * IHXPlugin2Handler
  167.      */
  168.      /************************************************************************
  169.      * Method:
  170.      *     IHXPlugin2Handler::Init
  171.      *
  172.      * Purpose:
  173.      *     Specifies the context and sets the BaseHandler in motion.
  174.      *
  175.      */
  176.     STDMETHOD(Init)    (THIS_ IUnknown* pContext);
  177.     /************************************************************************
  178.      * Method:
  179.      *     IHXPlugin2Handler::GetNumPlugins2
  180.      *
  181.      * Purpose:
  182.      *     Gets the info of a particular plugin.
  183.      *
  184.      */
  185.     STDMETHOD_(ULONG32,GetNumOfPlugins2)    (THIS);
  186.     /************************************************************************
  187.      * Method:
  188.      *     IHXPlugin2Handler::GetPluginInfo
  189.      *
  190.      * Purpose:
  191.      *     Gets the info of a particular plugin.
  192.      *
  193.      */
  194.     STDMETHOD(GetPluginInfo) (THIS_
  195. UINT32 unIndex,
  196. REF(IHXValues*) /*OUT*/ Values) ;
  197.     /************************************************************************
  198.      * Method:
  199.      *     IHXPlugin2Handler::FlushCache()
  200.      *
  201.      * Purpose:
  202.      *     Flushes the LRU cache -- Unloads all DLLs from memory
  203.      *     which currenltly have a refcount of 0.
  204.      */
  205.     STDMETHOD(FlushCache) (THIS);
  206.     /************************************************************************
  207.      * Method:
  208.      *     IHXPlugin2Handler::SetCacheSize
  209.      *
  210.      * Purpose:
  211.      *     This function sets the size of the Cache. The cache is
  212.      *     initally set to 1000KB. To disable the cache simply set
  213.      * the size to 0.If the cache is disabled a DLL will be
  214.      *     unloaded whenever it's refcount becomes zero. Which MAY
  215.      * cause performance problems.
  216.      */
  217.     STDMETHOD(SetCacheSize) (THIS_ ULONG32 nSizeKB);
  218.     /************************************************************************
  219.      * Method:
  220.      *     IHXPlugin2Handler::ReadFromRegistry
  221.      *
  222.      * Purpose:
  223.      *     Reload the DLL information from the registery. It will also
  224.      *     Check to see if this information is valid, and if
  225.      */
  226.     STDMETHOD(ReadFromRegistry)(THIS);
  227.     /************************************************************************
  228.      * Method:
  229.      *     IHXPlugin2Handler::GetInstance
  230.      *
  231.      * Purpose:
  232.      *
  233.      *     This function will return a plugin instance given a plugin index.
  234.      *
  235.      */
  236.     STDMETHOD(GetInstance) (THIS_ UINT32 index, REF(IUnknown*) ppUnknown);
  237.     /************************************************************************
  238.      * Method:
  239.      *     IHXPlugin2Handler::FindReturnIndexUsingValues
  240.      *
  241.      * Purpose:
  242.      *     Finds a plugin  which matches the set of values given. An index
  243.      *     is returned which can be used to either get the values (using
  244.      *     GetPluginInfo) or an instance can be created using GetPluing().
  245.      *
  246.      */
  247.     STDMETHOD(FindIndexUsingValues)     (THIS_ IHXValues*,
  248.     REF(UINT32) unIndex);
  249.     /************************************************************************
  250.      * Method:
  251.      *     IHXPlugin2Handler::FindReturnPluginUsingValues
  252.      *
  253.      * Purpose:
  254.      *     Finds a plugin  which matches the set of values given. A Plugin
  255.      *     instance is returned.
  256.      *
  257.      */
  258.     STDMETHOD(FindPluginUsingValues)     (THIS_ IHXValues*,
  259.     REF(IUnknown*) pUnk);
  260.     /************************************************************************
  261.      * Method:
  262.      *     IHXPlugin2Handler::FindReturnIndexUsingStrings
  263.      *
  264.      * Purpose:
  265.      *     Finds a plugin  which matches the set of values given. An index
  266.      *     is returned which can be used to either get the values (using
  267.      *     GetPluginInfo) or an instance can be created using GetPluing().
  268.      *     NOTE: that a max of two values may be given.
  269.      */
  270.     STDMETHOD(FindIndexUsingStrings)     (THIS_ char* PropName1,
  271.     char* PropVal1,
  272.     char* PropName2,
  273.     char* PropVal2,
  274.     char* PropName3,
  275.     char* PropVal3,
  276.     REF(UINT32) unIndex);
  277.     /************************************************************************
  278.      * Method:
  279.      *     IHXPlugin2Handler::FindReturnPluginUsingStrings
  280.      *
  281.      * Purpose:
  282.      *     Finds a plugin  which matches the set of values given. A Plugin
  283.      *     instance is returned.
  284.      *     NOTE: that a max of two values may be given.
  285.      */
  286.     STDMETHOD(FindPluginUsingStrings)     (THIS_ char* PropName1,
  287.     char* PropVal1,
  288.     char* PropName2,
  289.     char* PropVal2,
  290.     char* PropName3,
  291.     char* PropVal3,
  292.     REF(IUnknown*) pUnk);
  293.     /************************************************************************
  294.      * Method:
  295.      *     IHXPlugin2Handler::FindImplementationFromClassID
  296.      *
  297.      * Purpose:
  298.      *     Finds a CommonClassFactory plugin which supports the
  299.      *     ClassID given. An instance of the Class is returned.
  300.      */
  301.     STDMETHOD(FindImplementationFromClassID)
  302.     (
  303. REFGUID GUIDClassID,
  304. REF(IUnknown*) pIUnknownInstance
  305.     );
  306.     /************************************************************************
  307.      * Method:
  308.      *     IHXPlugin2Handler::Close
  309.      *
  310.      * Purpose:
  311.      *     A function which performs all of the functions of delete.
  312.      *
  313.      *
  314.      */
  315.     STDMETHOD(Close) (THIS);
  316.     /************************************************************************
  317.      * Method:
  318.      *     IHXPlugin2Handler::SetRequiredPlugins
  319.      *
  320.      * Purpose:
  321.      *     This function sets the required plugin list
  322.      *
  323.      *
  324.      */
  325.     STDMETHOD(SetRequiredPlugins) (THIS_ const char** ppszRequiredPlugins);
  326.     /************************************************************************
  327.      * Method:
  328.      *     IHXPluginHandler3::RegisterContext
  329.      *
  330.      * Purpose:
  331.      *     Sets up the context without loading any plugin info
  332.      *
  333.      */
  334.     STDMETHOD( RegisterContext )( THIS_ IUnknown* pContext );
  335.     /************************************************************************
  336.      * Method:
  337.      *     IHXPluginHandler3::AddPluginMountPoint
  338.      *
  339.      * Purpose:
  340.      *
  341.      */
  342.     STDMETHOD( AddPluginMountPoint )( THIS_ const char* pName, UINT32 majorVersion,
  343.     UINT32 minorVersion, IHXBuffer* pPath );
  344.     /************************************************************************
  345.      * Method:
  346.      *     IHXPluginHandler3::RefreshPluginMountPoint
  347.      *
  348.      * Purpose:
  349.      *
  350.      */
  351.     STDMETHOD( RefreshPluginMountPoint )( THIS_ const char* pName );
  352.     /************************************************************************
  353.      * Method:
  354.      *     IHXPluginHandler3::RemovePluginMountPoint
  355.      *
  356.      * Purpose:
  357.      *
  358.      */
  359.     STDMETHOD( RemovePluginMountPoint )( THIS_ const char* pName );
  360.     /************************************************************************
  361.      * Method:
  362.      *     IHXPluginHandler3::FindImplementationFromClassID
  363.      *
  364.      * Purpose:
  365.      *     Finds a CommonClassFactory plugin which supports the
  366.      *     ClassID given. An instance of the Class is returned.
  367.      *     The plugin instance is initialized with the specified
  368.      *     context
  369.      */
  370.     STDMETHOD( FindImplementationFromClassID )( THIS_ REFGUID GUIDClassID,
  371. REF(IUnknown*) pIUnknownInstance,
  372. IUnknown* pIUnkOuter, IUnknown* pContext );
  373.     /************************************************************************
  374.      * Method:
  375.      *     IHXPluginHandler3::FindCLSIDFromName
  376.      *
  377.      * Purpose:
  378.      *
  379.      *     Maps a text name to a CLSID based on information from
  380.      *     component plugins
  381.      */
  382.     STDMETHOD( FindCLSIDFromName )( THIS_ const char* pName, REF(IHXBuffer*) pCLSID );
  383.     /************************************************************************
  384.      * Method:
  385.      *     IHXPluginHandler3::FindGroupOfPluginsUsingValues
  386.      *
  387.      * Purpose:
  388.      *     Builds a collection of plugins that match the criteria
  389.      *
  390.      */
  391.     STDMETHOD(FindGroupOfPluginsUsingValues)(THIS_ IHXValues* pValues,
  392.     REF(IHXPluginSearchEnumerator*) pIEnumerator);
  393.     /************************************************************************
  394.      * Method:
  395.      *     IHXPluginHandler3::FindGroupOfPluginsUsingStrings
  396.      *
  397.      * Purpose:
  398.      *     Builds a collection of plugins that match the criteria
  399.      *
  400.      */
  401.     STDMETHOD(FindGroupOfPluginsUsingStrings)(THIS_ char* PropName1,
  402.     char* PropVal1,
  403.     char* PropName2,
  404.     char* PropVal2,
  405.     char* PropName3,
  406.     char* PropVal3,
  407.     REF(IHXPluginSearchEnumerator*) pIEnumerator);
  408.     /************************************************************************
  409.      * Method:
  410.      *     IHXPluginHandler3::GetPlugin
  411.      *
  412.      * Purpose:
  413.      *     Allocates a plugin based on index.  Supports aggregation
  414.      *
  415.      */
  416.     STDMETHOD(GetPlugin)(THIS_ ULONG32 ulIndex,
  417.     REF(IUnknown*) pIUnkResult,
  418.     IUnknown* pIUnkOuter );
  419.     /************************************************************************
  420.      * Method:
  421.      *     IHXPluginHandler3::FindPluginUsingValues
  422.      *
  423.      * Purpose:
  424.      *     Allocates a plugin based on criteria.  Supports aggregation
  425.      *
  426.      */
  427.     STDMETHOD(FindPluginUsingValues)(THIS_ IHXValues*,
  428.     REF(IUnknown*) pIUnkResult,
  429.     IUnknown* pIUnkOuter );
  430.     /************************************************************************
  431.      * Method:
  432.      *     IHXPluginHandler3::FindPluginUsingStrings
  433.      *
  434.      * Purpose:
  435.      *     Allocates a plugin based on criteria.  Supports aggregation
  436.      *
  437.      */
  438.     STDMETHOD(FindPluginUsingStrings)(THIS_ char* PropName1,
  439.     char* PropVal1,
  440.     char* PropName2,
  441.     char* PropVal2,
  442.     char* PropName3,
  443.     char* PropVal3,
  444.     REF(IUnknown*) pIUnkResult,
  445.     IUnknown* pIUnkOuter );
  446.     /************************************************************************
  447.      * Method:
  448.      *     IHXPluginHandler3::UnloadPluginFromClassID
  449.      *
  450.      * Purpose:
  451.      *     Finds a plugin from the classID and unloads it if it supports CanUnload2
  452.  * and returns TRUE in response to query
  453.      */
  454.     STDMETHOD( UnloadPluginFromClassID )( THIS_ REFGUID GUIDClassID );
  455.     /************************************************************************
  456.      * Method:
  457.      *     IHXPluginHandler3::UnloadPackageByName
  458.      *
  459.      * Purpose:
  460.      *     finds a package from the name passed in and attempts to unload it.
  461.      */
  462.     STDMETHOD (UnloadPackageByName) (const char* pName);
  463.     //------------------------------------ Class Methods
  464.     Errors     Stat(const char* pszFilename, struct stat* pStatBuffer);
  465.     IHXBuffer*     ChecksumFile(char* pszFileName, IHXBuffer* pPathBuffer);
  466.     IHXBuffer*     ConvertToAsciiString(char* pBuffer, UINT32 nBuffLen);
  467.     HX_RESULT     FindGroupOfPluginsUsingStrings(char* PropName1,
  468.     char* PropVal1,
  469.     char* PropName2,
  470.     char* PropVal2,
  471.     char* PropName3,
  472.     char* PropVal3,
  473.     REF(CPluginEnumerator*) pEnumerator);
  474.     HX_RESULT     FindGroupOfPluginsUsingValues(IHXValues* pValues,
  475.     REF(CPluginEnumerator*) pEnumerator);
  476.     void     ReportError( UINT8 severity, const char* pDLLName, const char* pDesc );
  477.     static const char* const zm_pszFileExtension;
  478.     static const char* const zm_pszDirectorySeperator;
  479.     static const char* const zm_pszValueSeperator;
  480.     static const char* const zm_pszListStart;
  481.     static const char* const zm_pszListEnd;
  482.     static const char* const zm_pszValueSeperator2;
  483.     static const char    zm_cDirectorySeperator;
  484.     static const char* const zm_pszKeyNameRegKey;
  485.     static const char* const zm_pszRegKeySeperator;
  486.     HX_RESULT ReloadPluginsNoPropagate();
  487.     HX_RESULT ReloadPluginsNoPropagateWithFindFile(
  488.                PluginMountPoint* pMountPoint, CFindFile* pFileFinder,
  489.                IHXBuffer* pPathBuffer, char* pszPluginDir);
  490.     HX_RESULT ReloadPluginsNoPropagate( PluginMountPoint* pMountPoint );
  491. private:
  492.     void UnloadDeadDLLs(void);
  493.     Errors     LoadDLL(char* pszDllName, PluginMountPoint* pMountPoint);
  494.     void     LoadPluginsFromComponentDLL( BaseHandler::PluginDLL* pPluginDll,
  495. IHXComponentPlugin* pIIterator );
  496.     // Methods to determine out of data DLLs
  497.     BOOL     FindPlugin(const char* pFileName, UINT32 nDLLIndex, REF(UINT32) nIndex);
  498.     HX_RESULT     AddToValues(IHXValues*, char* pPropName, char* pPropVal, eValueTypes eValueType);
  499.     HX_RESULT     RefreshPluginInfo( PluginMountPoint* pMountPoint );
  500.     CHXMapStringToOb     m_MountPoints;
  501.     CHXSimpleList     m_PluginDLLList;
  502.     CHXSimpleList     m_PluginList;
  503.     CHXSimpleList     m_MiscDLLList;
  504.     CHXMapStringToOb     m_GUIDtoSupportList;
  505.     IUnknown*     m_pContext;
  506.     class PluginMountPoint
  507.     {
  508.     public:
  509. PluginMountPoint( BaseHandler* pContext, const char* pName,
  510.   UINT32 majorVersion, UINT32 minorVersion,
  511.   IHXBuffer* pPath );
  512. ~PluginMountPoint();
  513. STDMETHOD_(ULONG32,AddRef)( THIS );
  514. STDMETHOD_(ULONG32,Release)( THIS );
  515. #if !defined(_STATICALLY_LINKED) || defined(HELIX_CONFIG_CONSOLIDATED_CORE)
  516. IHXBuffer* Path();
  517. #endif
  518.     private:
  519. #if !defined(_STATICALLY_LINKED) || defined(HELIX_CONFIG_CONSOLIDATED_CORE)
  520. IHXBuffer* m_pPath;
  521. #endif
  522. INT32 m_lRefCount;
  523.     };
  524.     class PluginDLL : public IUnknown
  525.     {
  526.     public:
  527. PluginDLL(const char* pszFileName, PluginMountPoint* pMountPoint,
  528.     BaseHandler* pBaseHandler);
  529. ~PluginDLL();
  530. /*
  531.  * IUnknown methods
  532.  */
  533. STDMETHOD(QueryInterface)(THIS_ REFIID riid, void** ppvObj);
  534. STDMETHOD_(ULONG32,AddRef) (THIS);
  535. STDMETHOD_(ULONG32,Release) (THIS);
  536. Errors Load(IUnknown* pContext);
  537. HX_RESULT Unload(BOOL safe = TRUE);
  538. BOOL IsLoaded();
  539. Errors CreateInstance( IUnknown** ppUnk, UINT32 uIndex );
  540. UINT32 AddDLLReference();
  541. UINT32 ReleaseDLLReference();
  542. // Accessors
  543. void SetHash(char* phash) {m_hash = phash;}
  544. void SetFileSize(INT32 nSize) {m_nSizeBites = nSize;}
  545. PluginMountPoint* GetMountPoint() { return m_pMountPoint; }
  546. IHXBuffer* GetFileName();
  547. INT32 GetFileSize() { return m_nSizeBites; }
  548. void SetNamespace(IHXBuffer* pNamespace);
  549. IHXBuffer* GetNamespace();
  550. const char* GetHash() { return (const char*) m_hash; }
  551. CHXString const& GetPackageName () const { return m_packageName; }
  552. UINT32 GetNumPlugins() { return m_NumOfPlugins; }
  553. BOOL DoesExist() { return m_bDoesExist; }
  554.     private:
  555. FPCREATEINSTANCE m_fpCreateInstance;
  556. FPSHUTDOWN m_fpShutdown;
  557. FPCANUNLOAD2 m_fCanUnload;
  558. PluginMountPoint* m_pMountPoint;
  559. IHXBuffer* m_pFileName;
  560. IHXBuffer* m_pNamespace;
  561. CHXString m_packageName;
  562. CHXString m_hash;
  563. LONG32 m_nSizeBites;
  564. INT32 m_lRefCount;
  565. UINT16 m_NumOfPlugins : 16;
  566. HX_BITFIELD m_bHas_factory : 1;
  567. HX_BITFIELD m_bLoaded : 1;
  568. BOOL m_bDoesExist;
  569. DLLAccess* m_pDLLAccess;
  570. UINT32 m_nActiveReferences;
  571. BaseHandler* m_pBaseHandler;
  572.     };
  573.     class Plugin : public IUnknown
  574.     {
  575. public:
  576. STDMETHOD(QueryInterface) (THIS_
  577. REFIID riid,
  578. void** ppvObj);
  579. STDMETHOD_(ULONG32,AddRef) (THIS);
  580. STDMETHOD_(ULONG32,Release) (THIS);
  581. Plugin(IUnknown* pContext);
  582. ~Plugin();
  583. // Exposed to the BaseHandler
  584. void                        SetPluginProperty(const char * pszPluginType);
  585. BOOL     DoesMatch(IHXValues* pValues);
  586. Errors     GetValuesFromDLL(IHXPlugin* pHXPlugin);
  587. // Creates an instance of the top-level plugin object
  588. Errors     GetPlugin( REF(IUnknown*) ppUnknown );
  589. // Checks to see if this is a component plugin and does the appropriate indirection
  590. Errors     GetInstance(REF(IUnknown*) ppUnknown, IUnknown* pIUnkOuter = NULL );
  591. HX_RESULT     GetPluginInfo(REF(IHXValues*));
  592. IHXBuffer*     GetFileName();
  593. BOOL     IsLoaded();
  594. void     SetInfoNeedsRefresh(BOOL bRefresh) { m_bInfoNeedsRefresh = bRefresh;}
  595. void     SetDLL(PluginDLL * pPluginDll);
  596. PluginDLL*     GetDLL() {return m_pPluginDLL;}
  597. void     SetIndex(UINT16 nIndex);
  598. UINT16     GetIndex() {return m_nPluginIndex;}
  599. void     SetPropertyULONG32(char* , char*);
  600. void     SetPropertyCString(char*, char*);
  601. void     SetPropertyBuffer(char*, BYTE*, UINT32);
  602. // FIX  This is to support the initialization of component plugins
  603. void InitializeComponentPlugin( IHXPlugin* pIPlugin, IHXValues* pIValues );
  604. // void* because the client doesn't have these
  605. // XXXAH not supported currently...  They were not in the old plugin handler either...
  606. // must be some code in the server that talks directly to this (BLEECH!)
  607. void*     m_process;
  608.     private:
  609. LONG32     m_lRefCount;
  610. UINT16     m_nPluginIndex;
  611. PluginDLL*     m_pPluginDLL;
  612. IHXValues*     m_pValues;
  613. HX_BITFIELD     m_bCanUnload : 1;
  614. HX_BITFIELD     m_bInfoNeedsRefresh : 1;
  615. IUnknown*     m_pContext;
  616. IHXCommonClassFactory*     m_pClassFactory;
  617. // Methods to retreive from the DLL
  618. Errors     GetBasicValues(IHXPlugin* pHXPlugin);
  619. Errors     GetExtendedValues(IHXPlugin* pHXPlugin);
  620. // Support Functions
  621. HX_RESULT   CatStrings(char** pInStrings,
  622.        REF(IHXBuffer*) pOutBuffer);
  623. BOOL     AreBufferEqual(IHXBuffer* pBigBuff,
  624.    IHXBuffer* pSmallBuff);
  625. Errors     CreateWatcher(IUnknown* pUnknown);
  626.     };
  627.     class OtherDLL
  628.     {
  629.     public:
  630.     CHXString m_filename;
  631.     CHXString m_fileChecksum;
  632.     PluginMountPoint* m_pMountPoint;
  633.     };
  634. };
  635. class CPluginEnumerator :
  636.     public CUnknownIMP,
  637.     public IHXPluginSearchEnumerator
  638. {
  639. public:
  640.     CPluginEnumerator();
  641.     virtual ~CPluginEnumerator();
  642.     DECLARE_UNKNOWN_NOCREATE( CPluginEnumerator )
  643.     /*
  644.      * IHXPluginSearchEnumerator
  645.      */
  646.     STDMETHOD_(UINT32, GetNumPlugins)(THIS);
  647.     STDMETHOD_(void, GoHead)(THIS);
  648.     STDMETHOD(GetNextPlugin)( THIS_ REF(IUnknown*) pIUnkResult,
  649.     IUnknown* pIUnkOuter );
  650.     STDMETHOD(GetNextPluginInfo)( THIS_ REF(IHXValues*) pRetValues );
  651.     STDMETHOD(GetPluginAt)( THIS_ UINT32 index,
  652.     REF(IUnknown*) pIUnkResult,
  653.     IUnknown* pIUnkOuter );
  654.     STDMETHOD(GetPluginInfoAt)( THIS_ UINT32 index,
  655.     REF(IHXValues*) pRetValues );
  656.     //---------------- Class methods
  657.     void Add(BaseHandler::Plugin* pPlugin);
  658.     // FIX This is for backwards compatibility, and should be removed
  659.     HX_RESULT GetNext(REF(IUnknown*) pRetUnk);
  660. protected:
  661. private:
  662.     CHXSimpleList   m_ListOfPlugins;
  663.     UINT32     m_nIndex;
  664. };
  665. #endif /* _BASEHAND_H_ */