plghand2.h
上传用户:zhongxx05
上传日期:2007-06-06
资源大小:33641k
文件大小:33k
源码类别:

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. #ifndef _PLGNHAND_H_
  36. #define _PLGNHAND_H_
  37. #include "hxslist.h"
  38. #include "hxplugn.h"
  39. #include "hxstring.h"
  40. #include "hxguidmap.h"
  41. #include "hxprefs.h"
  42. #include "hxengin.h"
  43. #include "hxcomm.h" 
  44. #include "hxerror.h"
  45. #include "hxphand.h"
  46. #include "dbindex.h"
  47. #include "unkimp.h"
  48. typedef HX_RESULT (HXEXPORT_PTR FPCREATEINSTANCE) (IUnknown** /*OUT*/ ppIUnknown);
  49. typedef HX_RESULT (HXEXPORT_PTR FPSHUTDOWN) ();
  50. typedef HX_RESULT (HXEXPORT_PTR FPCANUNLOAD2) ();
  51. typedef ULONG32     (STDMETHODCALLTYPE *FPWatchRef)(void*);
  52. typedef HX_RESULT   (STDMETHODCALLTYPE *FPQueryInterfaceWatch)(void*, REFIID riid,void** ppvObj);
  53. // This is the new and improved plugin handler. 
  54. // What is better in this version 
  55. //  (1) Unified Plugins No longer do you have to modify code in seven places when a bug 
  56. // appears. Simply modify the Plugin Class. It is the heart of the plugin Handler.
  57. //  (2) The plugin handler now has rudimentary ref counting of the DLLs which it loads.
  58. // This means that we cannot (almost) safely shutdown the player. Further, we can
  59. // ALMOST unload DLLs when they are not required anymore. 
  60. class Plugin2Handler;
  61. class DLLAccess;
  62. class CPluginEnumerator;
  63. class CPluginInfoWriter;
  64. // you want GUIDS? WE have GUIDS!
  65. DEFINE_GUID(IID_IHXPluginWatcherResponse, 0x00000C08, 0x901, 0x11d1, 0x8b, 0x6, 0x0, 
  66. 0xa0, 0x24, 0x40, 0x6d, 0x59);
  67. DECLARE_INTERFACE_(IHXPluginWatcherResponse, IUnknown)
  68. {
  69.     /*
  70.      *  IUnknown methods
  71.      */
  72.     STDMETHOD(QueryInterface) (THIS_
  73. REFIID riid,
  74. void** ppvObj) PURE;
  75.     STDMETHOD_(ULONG32,AddRef) (THIS) PURE;
  76.     STDMETHOD_(ULONG32,Release) (THIS) PURE;
  77.     /************************************************************************
  78.      * Method:
  79.      *     IHXPluginWatcherResponse::AllObjectsDeleted
  80.      * Purpose:
  81.      *     This function will be called all objects of the given class are
  82.      *     destroyed. 
  83.      */
  84.     STDMETHOD(AllObjectsDeleted) (THIS_ void*) PURE;
  85. };
  86. class Plugin2Handler : public CUnknownIMP,
  87. public IHXPluginEnumerator, 
  88. public IHXPluginReloader,
  89. public IHXPlugin2Handler,
  90. public IHXPlugin2HandlerEnumeratorInterface,
  91.      public IHXPluginHandler3,
  92.      public IHXPluginDatabase,
  93.      public IHXCallback
  94. {
  95.     // forward declarations?
  96.     // see note below   class PluginMonitor;     
  97.     class PreferenceEnumerator;
  98.     class PluginMountPoint;
  99.     class PluginDLL;
  100.     class Plugin;
  101.     class OtherDLL;
  102.     class PluginSupportingGUID;
  103.     
  104.     friend class CPluginEnumerator;
  105.     friend class PreferenceEnumerator;
  106.     friend class PluginDLL;
  107.     friend class Plugin;
  108.     friend class PluginSupportingGUID;
  109.     friend class OtherDLL;
  110. public:
  111.     enum    Errors
  112.     {
  113. NO_ERRORS = 0,
  114. PLUGIN_NOT_FOUND,
  115. MEMORY_ERROR,
  116. CANT_OPEN_DLL,
  117. BAD_DLL,
  118. CREATE_INSTANCHXR_FAILURE,
  119. CANT_DETERMINE_PLUGIN_DIR,
  120. CANT_OPEN_PLUGIN_DIR,
  121. BAD_PLUGIN,
  122. INVALID_CONTEXT,
  123. CANT_GET_FILE_FORMAT_INFO,
  124. CANT_GET_RENDERER_INFO,
  125. CANT_GET_FILE_SYSTEM_INFO,
  126. CANT_LOAD_INTERFACE,
  127. SHORT_NAME_NOT_FOUND,
  128. PLUGIN_ALREADY_HAS_MOUNT_POINT,
  129. INVALID_SHORT_NAME,
  130. BAD_REGISTRY_HANDLE,
  131. PLUGIN_DIR_NOT_SAME,
  132. REQUIRED_PLUGIN_NOT_LOADED,
  133. NO_HX_CREATE_INSTANCE,
  134. AGGREGATION_NOT_SUPPORTED
  135.     };
  136.     enum eValueTypes
  137.     {
  138. eString,
  139. eBuffer,
  140. eInt
  141.     };
  142.     DECLARE_UNKNOWN_NOCREATE( Plugin2Handler )
  143.     DECLARE_COM_CREATE_FUNCS( Plugin2Handler )
  144.     Plugin2Handler();
  145.     ~Plugin2Handler();
  146.     /*
  147.      * IHXCallback methods
  148.      */
  149.     STDMETHOD ( Func ) ( THIS );
  150.     /*
  151.      * IHXPluginEnumerator methods
  152.      */
  153.     /************************************************************************
  154.      * Method:
  155.      *     IHXPluginEnumerator::GetNumOfPlugins
  156.      *
  157.      * Purpose:    
  158.      *     return the number of plugins available
  159.      *
  160.      */
  161.     STDMETHOD_(ULONG32,GetNumOfPlugins) (THIS);
  162.     /************************************************************************
  163.      * Method:
  164.      *     IHXPluginEnumerator::GetPlugin
  165.      * Purpose:
  166.      *     return an instance(IUnknown) of the plugin
  167.      *
  168.      */
  169.     STDMETHOD(GetPlugin)   (THIS_
  170.     ULONG32     /*IN*/  ulIndex,
  171.     REF(IUnknown*)  /*OUT*/ pPlugin);
  172.     /*
  173.      * IHXPluginReloader methods
  174.      */
  175.     /************************************************************************
  176.      * Method:
  177.      *     IHXPluginReloader::ReloadPlugins
  178.      *
  179.      * Purpose:    
  180.      *     reloads plugins 
  181.      *
  182.      */
  183.     STDMETHOD(ReloadPlugins) (THIS);
  184.     /*
  185.      * IHXPlugin2Handler
  186.      */
  187.      /************************************************************************
  188.      * Method:
  189.      *     IHXPlugin2Handler::Init
  190.      *
  191.      * Purpose:    
  192.      *     Specifies the context and sets the Plugin2Handler in motion.
  193.      *
  194.      */
  195.     STDMETHOD(Init)    (THIS_ IUnknown* pContext);
  196.     /************************************************************************
  197.      * Method:
  198.      *     IHXPlugin2Handler::GetNumPlugins2
  199.      *
  200.      * Purpose:    
  201.      *     Gets the info of a particular plugin.
  202.      *
  203.      */
  204.     STDMETHOD_(ULONG32,GetNumOfPlugins2)    (THIS);
  205.     
  206.     /************************************************************************
  207.      * Method:
  208.      *     IHXPlugin2Handler::GetPluginInfo
  209.      *
  210.      * Purpose:    
  211.      *     Gets the info of a particular plugin.
  212.      *
  213.      */
  214.     STDMETHOD(GetPluginInfo) (THIS_ 
  215. UINT32 unIndex, 
  216. REF(IHXValues*) /*OUT*/ Values) ;
  217.     /************************************************************************
  218.      * Method:
  219.      *     IHXPlugin2Handler::FlushCache()
  220.      *
  221.      * Purpose:    
  222.      *     Flushes the LRU cache -- Unloads all DLLs from memory 
  223.      *     which currenltly have a refcount of 0.
  224.      */
  225.     STDMETHOD(FlushCache) (THIS);
  226.     /************************************************************************
  227.      * Method:
  228.      *     IHXPlugin2Handler::SetCacheSize
  229.      *
  230.      * Purpose:    
  231.      *     This function sets the size of the Cache. The cache is 
  232.      *     initally set to 1000KB. To disable the cache simply set
  233.      * the size to 0.If the cache is disabled a DLL will be 
  234.      *     unloaded whenever it's refcount becomes zero. Which MAY
  235.      * cause performance problems.
  236.      */
  237.     STDMETHOD(SetCacheSize) (THIS_ ULONG32 nSizeKB);
  238.     /************************************************************************
  239.      * Method:
  240.      *     IHXPlugin2Handler::ReadFromRegistry
  241.      *
  242.      * Purpose:    
  243.      *     Reload the DLL information from the registery. It will also 
  244.      *     Check to see if this information is valid, and if 
  245.      */
  246.     STDMETHOD(ReadFromRegistry)(THIS);
  247.     /************************************************************************
  248.      * Method:
  249.      *     IHXPlugin2Handler::GetInstance
  250.      *
  251.      * Purpose:    
  252.      *     
  253.      *     This function will return a plugin instance given a plugin index.
  254.      *
  255.      */
  256.     
  257.     STDMETHOD(GetInstance) (THIS_ UINT32 index, REF(IUnknown*) ppUnknown); 
  258.     
  259.     /************************************************************************
  260.      * Method:
  261.      *     IHXPlugin2Handler::FindReturnIndexUsingValues
  262.      *
  263.      * Purpose:    
  264.      *     Finds a plugin  which matches the set of values given. An index
  265.      *     is returned which can be used to either get the values (using 
  266.      *     GetPluginInfo) or an instance can be created using GetPluing(). 
  267.      * 
  268.      */
  269.     STDMETHOD(FindIndexUsingValues)     (THIS_ IHXValues*, 
  270.     REF(UINT32) unIndex);
  271.     /************************************************************************
  272.      * Method:
  273.      *     IHXPlugin2Handler::FindReturnPluginUsingValues
  274.      *
  275.      * Purpose:    
  276.      *     Finds a plugin  which matches the set of values given. A Plugin
  277.      *     instance is returned. 
  278.      *     
  279.      */
  280.     STDMETHOD(FindPluginUsingValues)     (THIS_ IHXValues*, 
  281.     REF(IUnknown*) pUnk);
  282.     
  283.     /************************************************************************
  284.      * Method:
  285.      *     IHXPlugin2Handler::FindReturnIndexUsingStrings
  286.      *
  287.      * Purpose:    
  288.      *     Finds a plugin  which matches the set of values given. An index
  289.      *     is returned which can be used to either get the values (using 
  290.      *     GetPluginInfo) or an instance can be created using GetPluing(). 
  291.      *     NOTE: that a max of two values may be given.
  292.      */
  293.     STDMETHOD(FindIndexUsingStrings)     (THIS_ char* PropName1, 
  294.     char* PropVal1, 
  295.     char* PropName2, 
  296.     char* PropVal2, 
  297.     char* PropName3, 
  298.     char* PropVal3, 
  299.     REF(UINT32) unIndex);
  300.     /************************************************************************
  301.      * Method:
  302.      *     IHXPlugin2Handler::FindReturnPluginUsingStrings
  303.      *
  304.      * Purpose:    
  305.      *     Finds a plugin  which matches the set of values given. A Plugin
  306.      *     instance is returned. 
  307.      *     NOTE: that a max of two values may be given.
  308.      */
  309.     STDMETHOD(FindPluginUsingStrings)     (THIS_ char* PropName1, 
  310.     char* PropVal1, 
  311.     char* PropName2, 
  312.     char* PropVal2, 
  313.     char* PropName3, 
  314.     char* PropVal3, 
  315.     REF(IUnknown*) pUnk);
  316.     /************************************************************************
  317.      * Method:
  318.      *     IHXPlugin2Handler::FindImplementationFromClassID
  319.      *
  320.      * Purpose:    
  321.      *     Finds a CommonClassFactory plugin which supports the 
  322.      *     ClassID given. An instance of the Class is returned. 
  323.      */
  324.     STDMETHOD(FindImplementationFromClassID)
  325.     (
  326. REFGUID GUIDClassID, 
  327. REF(IUnknown*) pIUnknownInstance
  328.     );
  329.     /************************************************************************
  330.      * Method:
  331.      *     IHXPlugin2Handler::Close
  332.      *
  333.      * Purpose:    
  334.      *     A function which performs all of the functions of delete.
  335.      *     
  336.      *
  337.      */
  338.     
  339.     STDMETHOD(Close) (THIS); 
  340.     /************************************************************************
  341.      * Method:
  342.      *     IHXPlugin2Handler::SetRequiredPlugins
  343.      *
  344.      * Purpose:    
  345.      *     This function sets the required plugin list
  346.      *     
  347.      *
  348.      */
  349.     STDMETHOD(SetRequiredPlugins) (THIS_ const char** ppszRequiredPlugins);
  350.     /************************************************************************
  351.      * Method:
  352.      *     IHXPlugin2HandlerEnumeratorInterface::GetNumPluginsSupporting
  353.      *
  354.      * Purpose:    Required for the plugin enumerator.
  355.      *     
  356.      *     
  357.      *
  358.      */
  359.     STDMETHOD(GetNumPluginsSupporting) (THIS_ REFIID iid, REF(UINT32) nNumPlugins);
  360.     /************************************************************************
  361.      * Method:
  362.      *     IHXPlugin2HandlerEnumeratorInterface::GetPluginIndexSupportingIID
  363.      *
  364.      * Purpose:    Required for the plugin enumerator.
  365.      *     
  366.      *     
  367.      *
  368.      */
  369.     STDMETHOD(GetPluginIndexSupportingIID) (THIS_ REFIID iid, UINT32 nPluginIndex, REF(UINT32) nIndexOut);
  370.     /************************************************************************
  371.      * Method:
  372.      *     IHXPlugin2HandlerEnumeratorInterface::AddSupportedIID
  373.      *
  374.      * Purpose:    Required for the plugin enumerator.
  375.      *     
  376.      *     
  377.      *
  378.      */
  379.     STDMETHOD(AddSupportedIID) (THIS_ REFIID iid);
  380.     /************************************************************************
  381.      * Method:
  382.      *     IHXPluginHandler3::RegisterContext
  383.      *
  384.      * Purpose:    
  385.      *     Sets up the context without loading any plugin info
  386.      *
  387.      */
  388.     STDMETHOD( RegisterContext )( THIS_ IUnknown* pContext );
  389.     /************************************************************************
  390.      * Method:
  391.      *     IHXPluginHandler3::AddPluginMountPoint
  392.      *
  393.      * Purpose:    
  394.      *
  395.      */
  396.     STDMETHOD( AddPluginMountPoint )( THIS_ const char* pName, UINT32 majorVersion,
  397.     UINT32 minorVersion, IHXBuffer* pPath );
  398.     /************************************************************************
  399.      * Method:
  400.      *     IHXPluginHandler3::RefreshPluginMountPoint
  401.      *
  402.      * Purpose:    
  403.      *
  404.      */
  405.     STDMETHOD( RefreshPluginMountPoint )( THIS_ const char* pName );
  406.     /************************************************************************
  407.      * Method:
  408.      *     IHXPluginHandler3::RemovePluginMountPoint
  409.      *
  410.      * Purpose:    
  411.      *
  412.      */
  413.     STDMETHOD( RemovePluginMountPoint )( THIS_ const char* pName );
  414.     /************************************************************************
  415.      * Method:
  416.      *     IHXPluginHandler3::FindImplementationFromClassID
  417.      *
  418.      * Purpose:    
  419.      *     Finds a CommonClassFactory plugin which supports the 
  420.      *     ClassID given. An instance of the Class is returned. 
  421.      *     The plugin instance is initialized with the specified 
  422.      *     context
  423.      */
  424.     STDMETHOD( FindImplementationFromClassID )( THIS_ REFGUID GUIDClassID, 
  425.     REF(IUnknown*) pIUnknownInstance, IUnknown* pIUnkOuter, IUnknown* pContext );
  426.     /************************************************************************
  427.      * Method:
  428.      *     IHXPluginHandler3::FindCLSIDFromName
  429.      *
  430.      * Purpose:    
  431.      *
  432.      *     Maps a text name to a CLSID based on information from 
  433.      *     component plugins
  434.      */
  435.     STDMETHOD( FindCLSIDFromName )( THIS_ const char* pName, REF(IHXBuffer*) pCLSID );
  436.     /************************************************************************
  437.      * Method:
  438.      *     IHXPluginHandler3::FindGroupOfPluginsUsingValues
  439.      *
  440.      * Purpose:    
  441.      *     Builds a collection of plugins that match the criteria
  442.      *
  443.      */
  444.     STDMETHOD(FindGroupOfPluginsUsingValues)(THIS_ IHXValues* pValues, 
  445.     REF(IHXPluginSearchEnumerator*) pIEnumerator);
  446.     /************************************************************************
  447.      * Method:
  448.      *     IHXPluginHandler3::FindGroupOfPluginsUsingStrings
  449.      *
  450.      * Purpose:    
  451.      *     Builds a collection of plugins that match the criteria
  452.      *
  453.      */
  454.     STDMETHOD(FindGroupOfPluginsUsingStrings)(THIS_ char* PropName1, 
  455.     char* PropVal1, 
  456.     char* PropName2, 
  457.     char* PropVal2, 
  458.     char* PropName3, 
  459.     char* PropVal3, 
  460.     REF(IHXPluginSearchEnumerator*) pIEnumerator);
  461.     /************************************************************************
  462.      * Method:
  463.      *     IHXPluginHandler3::GetPlugin
  464.      *
  465.      * Purpose:    
  466.      *     Allocates a plugin based on index.  Supports aggregation
  467.      *
  468.      */
  469.     STDMETHOD(GetPlugin)(THIS_ ULONG32 ulIndex,
  470.     REF(IUnknown*) pIUnkResult,
  471.     IUnknown* pIUnkOuter );
  472.     /************************************************************************
  473.      * Method:
  474.      *     IHXPluginHandler3::FindPluginUsingValues
  475.      *
  476.      * Purpose:    
  477.      *     Allocates a plugin based on criteria.  Supports aggregation
  478.      *
  479.      */
  480.     STDMETHOD(FindPluginUsingValues)(THIS_ IHXValues*, 
  481.     REF(IUnknown*) pIUnkResult, 
  482.     IUnknown* pIUnkOuter );
  483.     /************************************************************************
  484.      * Method:
  485.      *     IHXPluginHandler3::FindPluginUsingStrings
  486.      *
  487.      * Purpose:    
  488.      *     Allocates a plugin based on criteria.  Supports aggregation
  489.      *
  490.      */
  491.     STDMETHOD(FindPluginUsingStrings)(THIS_ char* PropName1, 
  492.     char* PropVal1, 
  493.     char* PropName2, 
  494.     char* PropVal2, 
  495.     char* PropName3, 
  496.     char* PropVal3, 
  497.     REF(IUnknown*) pIUnkResult, 
  498.     IUnknown* pIUnkOuter );
  499.     /************************************************************************
  500.      * Method:
  501.      *     IHXPluginHandler3::UnloadPluginFromClassID
  502.      *
  503.      * Purpose:    
  504.      *     Finds a plugin from the classID and unloads it if it supports CanUnload2
  505.  * and returns TRUE in response to query
  506.      */
  507.     STDMETHOD( UnloadPluginFromClassID )( THIS_ REFGUID GUIDClassID );
  508.     /************************************************************************
  509.      * Method:
  510.      *     IHXPluginHandler3::UnloadPackageByName
  511.      *
  512.      * Purpose:    
  513.      *     finds a package from the name passed in and attempts to unload it.
  514.      */
  515.     STDMETHOD (UnloadPackageByName) (const char* pName);
  516.     //------------------------------------ IHXPluginDatabase interface methods
  517.     STDMETHOD( AddPluginIndex ) ( THIS_ const char* pKeyName, EPluginIndexType indexType, BOOL bScanExisting );
  518.     STDMETHOD( RemovePluginIndex )( THIS_ const char* pKeyName );
  519.     STDMETHOD( FindPluginInfoViaIndex )( THIS_ const char* pKeyName, const void* pValue, IHXValues** ppIInfo );
  520.     STDMETHOD( FindPluginSetViaIndex )( THIS_ const char* pKeyName, const void* pValue, IHXPluginSearchEnumerator** ppIEnumerator );
  521.     STDMETHOD( CreatePluginViaIndex )( THIS_ const char* pKeyName, const void* pValue, IUnknown** ppIUnkPlugin, IUnknown* pIUnkOuter );
  522.     //------------------------------------ Class Methods
  523.     Errors     Stat(const char* pszFilename, struct stat* pStatBuffer);
  524.     IHXBuffer*     ChecksumFile(char* pszFileName, IHXBuffer* pPathBuffer);
  525.     IHXBuffer*     ConvertToAsciiString(char* pBuffer, UINT32 nBuffLen);
  526.     IHXBuffer*     GetPluginDir();
  527.     IHXPreferences*     GetPreferences();
  528.     CHXSimpleList&     GetCanUnload2DllList() { return( m_CanUnload2DllList ); }
  529.     HX_RESULT     FindGroupOfPluginsUsingStrings(char* PropName1, 
  530.     char* PropVal1, 
  531.     char* PropName2, 
  532.     char* PropVal2, 
  533.     char* PropName3, 
  534.     char* PropVal3, 
  535.     REF(CPluginEnumerator*) pEnumerator);
  536.     HX_RESULT     FindGroupOfPluginsUsingValues(IHXValues* pValues, 
  537.     REF(CPluginEnumerator*) pEnumerator);
  538.     void     ReportError( UINT8 severity, const char* pDLLName, const char* pDesc );
  539.     static const char* const zm_pszFileExtension;
  540.     static const char* const zm_pszDirectorySeperator;
  541.     static const char* const zm_pszValueSeperator;
  542.     static const char* const zm_pszListStart;
  543.     static const char* const zm_pszListEnd;
  544.     static const char* const zm_pszValueSeperator2;
  545.     static const char    zm_cDirectorySeperator;
  546.     static const char* const zm_pszKeyNameRegKey;
  547.     static const char* const zm_pszRegKeySeperator;
  548. #if !defined(HELIX_CONFIG_NOSTATICS)
  549.     static BOOL  zm_bFasterPrefs;
  550. #else
  551.     static const BOOL  zm_bFasterPrefs;
  552. #endif
  553.     HX_RESULT AddtoLRU(Plugin2Handler::PluginDLL* pDLL);
  554.     HX_RESULT RemoveFromLRU(Plugin2Handler::PluginDLL* pDLL);
  555.     HX_RESULT UpdateCache();
  556.     HX_RESULT ReloadPluginsNoPropagate();
  557.     HX_RESULT ReloadPluginsNoPropagate( PluginMountPoint* pMountPoint );
  558. private: 
  559.     static HX_RESULT VerifyChecksum_ (const char*);
  560.     void UnloadDeadDLLs(void);
  561.     IHXScheduler*  m_pIScheduler;
  562.     CallbackHandle  m_hScheduler;
  563.     enum
  564.     {
  565. // kPingDuration = 1000 // USE ONLY FOR TESTING
  566. kPingDuration = 60000 // 60000ms = 1 minute
  567.     };
  568.     IHXBuffer*     GetDefaultPluginDir();
  569.     void     WriteSupportedGUIDs();
  570.     HX_RESULT     ConnectPluginToDLL(Plugin2Handler::Plugin * pPlugin);
  571.     Errors     LoadDLL(char* pszDllName, PluginMountPoint* pMountPoint);
  572.     void     LoadPluginsFromComponentDLL( Plugin2Handler::PluginDLL* pPluginDll, 
  573. IHXComponentPlugin* pIIterator );
  574.     // Methods to determine out of data DLLs
  575.     BOOL     FindPlugin(const char* pFileName, UINT32 nDLLIndex, REF(UINT32) nIndex);
  576.     HX_RESULT     AddToValues(IHXValues*, char* pPropName, char* pPropVal, eValueTypes eValueType);
  577.     UINT32     GetNumSupportedGUIDs();
  578.     HX_RESULT     RemoveDLLFromGUIDSupportLists(const char* pszFileName);
  579.     HX_RESULT     GetGUIDForIndex(UINT32 nIndex, REF(CHXString) sGUID);
  580.     HX_RESULT     AddSupportForGUID(const char* pszGUID, PluginDLL* pDLL, UINT32 nIndexInDLL);
  581.     BOOL     GetPluginFileInfo( REF(char*) pszCurrentPos, 
  582.        REF(char*) pszName, 
  583.        REF(char*) pszCheckSum, 
  584.        REF(BOOL) bFactory, 
  585.        REF(int) nDLLSize, 
  586.        REF(int) nNumberPlugins);
  587.     BOOL     GetNameValuePair(REF(char*) pszCurrentPos, REF(char*) pszName, REF(char*) pszValue);
  588.     BOOL     GetPluginFileInfo(REF(char*) pszCurrentPos, REF(Plugin2Handler::Plugin*) pPlugin);
  589.     BOOL     GetNextSupportingFile(REF(char*) pszCurrentPos, REF(char*) pszFileName, REF(UINT32) index);
  590.     BOOL     GetGUIDInfo(REF(char*) pszCurrentPos, PluginMountPoint* pMountPoint, REF(char*) pszGUID, REF(CHXSimpleList*) pList);
  591.     void     ReconnectDLL(const char* pszDLLName, Plugin2Handler::PluginDLL* pNewDLL);
  592.     BOOL     GetNonHXInfo(REF(char*) pszCurrentPos, PluginMountPoint* pMountPoint, REF(Plugin2Handler::OtherDLL*) pOtherData);
  593.     void     WriteHugePref( IHXPreferences* pPrefs, const char* pszKeyName, IHXBuffer* pBigBuffer);
  594.     HX_RESULT     ReadHugePref( IHXPreferences* pPrefs, const char* pszKeyName, REF(IHXBuffer*) pBigBuffer);
  595.     void     DeleteHugePref_ (IHXPreferences*, IHXPreferences3*, const char*);
  596.     // Internal shared code
  597.     HX_RESULT      FindImplementationFromClassIDInternal( 
  598.     REFGUID GUIDClassID, 
  599.     REF(IUnknown*) pIUnknownInstance, 
  600.     IUnknown* pContext );
  601.     // New plugin info loading methods
  602.     HX_RESULT ClearMountPoint_ (PluginMountPoint*);
  603.     HX_RESULT RefreshPluginInfo( PluginMountPoint* pMountPoint );
  604.     HX_RESULT WritePluginInfo( PluginMountPoint* pMountPoint );
  605.     HX_RESULT ReadPluginInfoFast( PluginMountPoint* pMountPoint );
  606.     HX_RESULT WritePluginInfoFast( PluginMountPoint* pMountPoint );
  607.     HX_RESULT ReadPluginInfoSlow( PluginMountPoint* pMountPoint );
  608.     HX_RESULT WritePluginInfoSlow( PluginMountPoint* pMountPoint );
  609.     CPluginDatabaseIndex* FindDBIndex( const char* pKeyName );
  610.     void AddPluginToIndices( Plugin2Handler::Plugin* pPlugin );
  611.     void RemovePluginFromIndices( Plugin2Handler::Plugin* pPlugin );
  612.     CHXMapStringToOb     m_MountPoints;
  613.     CHXSimpleList     m_PluginDLLList;
  614.     CHXSimpleList     m_PluginList;
  615.     CHXSimpleList     m_MiscDLLList;
  616.     CHXSimpleList     m_CanUnload2DllList;
  617.     CHXMapStringToOb     m_GUIDtoSupportList;
  618.     CHXMapStringToOb     m_dbIndices;
  619.     CHXMapStringToOb     m_GUIDSupportListIsValid;
  620.     CHXMapStringToOb     m_FileNameMap;
  621.     
  622.     IHXBuffer*     m_pPluginDir;
  623.     IHXPreferences*     m_pPreferences;
  624.     IHXErrorMessages*     m_pErrorMessages;
  625.     IUnknown*     m_pContext;
  626.     INT32     m_nCacheSizeBites;
  627.     CHXSimpleList     m_DLL_LRUList;
  628.     class PluginMountPoint
  629.     {
  630.     public:
  631. PluginMountPoint( Plugin2Handler* pContext, const char* pName, 
  632.     UINT32 majorVersion, UINT32 minorVersion, 
  633.     IHXBuffer* pPath );
  634. ~PluginMountPoint();
  635.     
  636. STDMETHOD_(ULONG32,AddRef)( THIS );
  637. STDMETHOD_(ULONG32,Release)( THIS );
  638.     
  639. void AddClient();
  640. INT32 RemoveClient();
  641. // XXXND  This is for backward compatibility
  642. BOOL IsHXCompliant();
  643. IHXPreferences* Prefs();
  644. IHXBuffer* Path();
  645.     
  646.     private:
  647. INT32 m_lRefCount;
  648. INT32 m_lClientCount;
  649.     
  650. // XXXND  This is for backward compatibility
  651. BOOL m_bHXCompliant;
  652. IHXPreferences* m_pIPrefs;
  653. IHXBuffer* m_pIPath;
  654.     };
  655.     class PluginDLL : public IUnknown
  656.     {
  657.     public:
  658. PluginDLL(const char* pszFileName, PluginMountPoint* pMountPoint, 
  659.     Plugin2Handler* pPlugin2Handler);
  660. ~PluginDLL();
  661. /*
  662.  * IUnknown methods
  663.  */
  664. STDMETHOD(QueryInterface)(THIS_ REFIID riid, void** ppvObj);
  665. STDMETHOD_(ULONG32,AddRef) (THIS);
  666. STDMETHOD_(ULONG32,Release) (THIS);
  667. Errors Load(IUnknown* pContext);
  668. HX_RESULT Unload(BOOL safe = TRUE);
  669. BOOL IsLoaded();
  670. Errors CreateInstance( IUnknown** ppUnk, UINT32 uIndex );
  671. UINT32 AddDLLReference();
  672. UINT32 ReleaseDLLReference();
  673. void SetPref( int nNumberPlugins, char* pszCheckSum, int nDLLSize, BOOL bFactory );
  674. HX_RESULT WritePref2( REF(CPluginInfoWriter) piw);
  675. HX_RESULT WritePref( PreferenceEnumerator* pPrefEnum );
  676. HX_RESULT ReadPref( PreferenceEnumerator* pPrefs );
  677. // Accessors
  678. void SetHash(char* phash) {m_hash = phash;}
  679. void SetFileSize(INT32 nSize) {m_nSizeBites = nSize;}
  680. PluginMountPoint* GetMountPoint() { return m_pMountPoint; }
  681. IHXBuffer* GetFileName();
  682. INT32 GetFileSize() { return m_nSizeBites; }
  683. void SetNamespace(IHXBuffer* pNamespace);
  684. IHXBuffer* GetNamespace();
  685. const char* GetHash() { return (const char*) m_hash; }
  686. CHXString const& GetPackageName () const { return m_packageName; }
  687. UINT32 GetNumPlugins() { return m_NumOfPlugins; }
  688. BOOL DoesExist() { return m_bDoesExist; }
  689.     private:
  690. FPCREATEINSTANCE m_fpCreateInstance;
  691. FPSHUTDOWN m_fpShutdown;
  692. FPCANUNLOAD2 m_fCanUnload;
  693. PluginMountPoint* m_pMountPoint;
  694. IHXBuffer* m_pFileName;
  695. IHXBuffer* m_pNamespace;
  696. CHXString m_packageName;
  697. CHXString m_hash;
  698. LONG32 m_nSizeBites;
  699. INT32 m_lRefCount;
  700. UINT16 m_NumOfPlugins : 16;
  701. HX_BITFIELD m_bHas_factory : 1;
  702. HX_BITFIELD m_bLoaded : 1;
  703. BOOL m_bDoesExist;
  704. DLLAccess* m_pDLLAccess;
  705. UINT32 m_nActiveReferences; 
  706. Plugin2Handler* m_pPlugin2Handler;
  707.     };
  708.     class Plugin :  public IHXPluginWatcherResponse
  709.     {
  710. public:
  711. STDMETHOD(QueryInterface) (THIS_
  712. REFIID riid,
  713. void** ppvObj);
  714. STDMETHOD_(ULONG32,AddRef) (THIS);
  715. STDMETHOD_(ULONG32,Release) (THIS);
  716. STDMETHOD(AllObjectsDeleted) (THIS_ void*);
  717. Plugin(IUnknown* pContext);
  718. ~Plugin();  
  719. // Exposed to the Plugin2Handler
  720. BOOL     DoesMatch(IHXValues* pValues);
  721. HX_RESULT     WritePref2(REF(CPluginInfoWriter) piw);
  722. HX_RESULT     WritePref(PreferenceEnumerator* pPrefEnum);
  723. HX_RESULT     ReadPref(PreferenceEnumerator* pPrefs);
  724. Errors     GetValuesFromDLL(IHXPlugin* pHXPlugin);
  725. // Creates an instance of the top-level plugin object
  726. Errors     GetPlugin( REF(IUnknown*) ppUnknown );
  727. // Checks to see if this is a component plugin and does the appropriate indirection
  728. Errors     GetInstance(REF(IUnknown*) ppUnknown, IUnknown* pIUnkOuter = NULL );
  729. HX_RESULT     GetPluginInfo(REF(IHXValues*));
  730. IHXBuffer*     GetFileName();
  731. BOOL     IsLoaded();
  732. BOOL     DoesInfoNeedsRefresh() {return m_bInfoNeedsRefresh;}
  733. void     SetInfoNeedsRefresh(BOOL bRefresh) { m_bInfoNeedsRefresh = bRefresh;}
  734. void     SetDLL(PluginDLL * pPluginDll);
  735. PluginDLL*     GetDLL() {return m_pPluginDLL;}
  736. void     SetIndex(UINT16 nIndex);
  737. UINT16     GetIndex() {return m_nPluginIndex;}
  738. void     SetPropertyULONG32(char* , char*);
  739. void     SetPropertyCString(char*, char*);
  740. void     SetPropertyBuffer(char*, BYTE*, UINT32);
  741. // this causes an init plugins should be handled with care.
  742. HX_RESULT     GetBandwidthInfo();
  743. // FIX  This is to support the initialization of component plugins
  744. void InitializeComponentPlugin( IHXPlugin* pIPlugin, IHXValues* pIValues );
  745. // void* because the client doesn't have these
  746. // XXXAH not supported currently...  They were not in the old plugin handler either...
  747. // must be some code in the server that talks directly to this (BLEECH!)
  748. void*     m_process;  
  749.     private:
  750. LONG32     m_lRefCount;
  751. UINT16     m_nPluginIndex;
  752. PluginDLL*     m_pPluginDLL;
  753. IHXValues*     m_pValues;
  754. HX_BITFIELD     m_bCanUnload : 1;
  755. HX_BITFIELD     m_bInfoNeedsRefresh : 1;
  756. IUnknown*     m_pContext;
  757. // Methods to retreive from the DLL
  758. Errors     GetBasicValues(IHXPlugin* pHXPlugin);
  759. Errors     GetExtendedValues(IHXPlugin* pHXPlugin);
  760. // Support Functions
  761. HX_RESULT   CatStrings(     char** pInStrings, 
  762.     REF(IHXBuffer*) pOutBuffer);
  763. HX_RESULT   CatPropertiesULONG32(   REF(IHXBuffer*) pBuffer, 
  764.     const char* pPropName, 
  765.     ULONG32 nValue);
  766. HX_RESULT   CatPropertiesCString(   REF(IHXBuffer*) pBuffer, 
  767.     const char* pPropName, 
  768.     IHXBuffer* pValue);
  769. BOOL     GetNextValueFromString( REF(char*) pszValues, 
  770.     REF(UINT32) nType, 
  771.     REF(IHXBuffer*) pValueNameBuffer, 
  772.     REF(IHXBuffer*) pValueBuffer, 
  773.     REF(ULONG32) nValue);
  774. BOOL     AreBufferEqual(     IHXBuffer* pBigBuff, 
  775.     IHXBuffer* pSmallBuff);
  776. Errors     CreateWatcher(IUnknown* pUnknown);
  777.     };
  778.     class PluginSupportingGUID
  779.     {
  780.     public:
  781.     CHXString m_filename;
  782.     UINT32 m_nIndexInDLL;
  783.     PluginMountPoint* m_pMountPoint;
  784.     };
  785.     class OtherDLL 
  786.     {
  787.     public:
  788.     CHXString m_filename;
  789.     CHXString m_fileChecksum;
  790.     PluginMountPoint* m_pMountPoint;
  791.     };
  792.     class PreferenceEnumerator
  793.     {
  794. public:
  795.     HX_RESULT     BeginSubPref(const char* pszSubPref);
  796.     HX_RESULT     EndSubPref();
  797.     HX_RESULT     WriteSubPref(const char* pszSubName, IHXBuffer* pBuffer);
  798.     HX_RESULT     ReadPref(const char* pszSubName, REF(IHXBuffer*) /*OUT*/ pBuffer);
  799.     HX_RESULT     GetPrefKey(UINT32 nIndex, IHXBuffer*& pBuffer);
  800.     HX_RESULT     ResetPropNameList();
  801.     PreferenceEnumerator(IHXPreferences* pIHXPref);
  802.     ~PreferenceEnumerator();
  803. private:
  804.     CHXString m_RegKey;
  805.     CHXSimpleList m_ListofProps;
  806.     IHXPreferenceEnumerator* m_pPrefEnum;
  807.     IHXPreferences* m_pPreferences;
  808.     };
  809. };
  810. class CPluginEnumerator :
  811.     public CUnknownIMP,
  812.     public IHXPluginSearchEnumerator
  813. {
  814. public: 
  815.     CPluginEnumerator();
  816.     virtual ~CPluginEnumerator();
  817.     DECLARE_UNKNOWN_NOCREATE( CPluginEnumerator )
  818.     /*
  819.      * IHXPluginSearchEnumerator
  820.      */
  821.     STDMETHOD_(UINT32, GetNumPlugins)(THIS);
  822.     STDMETHOD_(void, GoHead)(THIS);
  823.     STDMETHOD(GetNextPlugin)( THIS_ REF(IUnknown*) pIUnkResult, 
  824.     IUnknown* pIUnkOuter );
  825.     STDMETHOD(GetNextPluginInfo)( THIS_ REF(IHXValues*) pRetValues );
  826.     
  827.     STDMETHOD(GetPluginAt)( THIS_ UINT32 index, 
  828.     REF(IUnknown*) pIUnkResult, 
  829.     IUnknown* pIUnkOuter );
  830.     STDMETHOD(GetPluginInfoAt)( THIS_ UINT32 index, 
  831.     REF(IHXValues*) pRetValues );
  832.     //---------------- Class methods
  833.     void Add(Plugin2Handler::Plugin* pPlugin);
  834.     // FIX This is for backwards compatibility, and should be removed
  835.     HX_RESULT GetNext(REF(IUnknown*) pRetUnk);
  836. protected:
  837. private:
  838.     CHXSimpleList   m_ListOfPlugins;
  839.     UINT32     m_nIndex;
  840. };
  841. // Helper class used to write plugin info to registry...
  842. class CPluginInfoWriter
  843. {
  844. public:
  845.     CPluginInfoWriter();
  846.     ~CPluginInfoWriter();
  847.     HX_RESULT Init(IHXPreferences* pPrefs, const char* pBaseKeyName, IHXBuffer* pIHXBuffer);
  848.     HX_RESULT Write(IHXBuffer *pBuffer);
  849.     HX_RESULT Write(const char *pInfo);
  850.     HX_RESULT Write(const char *pInfo, UINT32 len);
  851.     HX_RESULT Flush();
  852. private:
  853.     void TerminateBuffer();
  854.     void WriteToRegistry();
  855.     static BOOL IsAscii7Compliant (const char*, const UINT32 len);
  856.     IHXBuffer* m_pIHXBuffer; // Contains a pointer to internal buffer
  857.     IHXPreferences* m_pIHXPreferences; // Used to write to registry
  858.     UINT32 m_NumWrites;  // Keeps track of how many times we have written to registry during lifetime of class
  859.     UINT32 m_BufUsed;    // Keeps track of how much we have written to internal buffer between writes to registry
  860.     UINT32 m_BufSize;    // Size of internal buffer; Used to determine when to write info to registry
  861.     UINT32 m_Checksum;  // Total size of the data written to the registry across the lifetime of the object.
  862.     CHXString m_BaseKeyName; // Combined with m_NumWrite to generate the name of the registry key to which we write
  863. };
  864. #endif /* _PLGNHAND_H_ */