|
From: Emilien K. <cur...@us...> - 2005-10-15 16:24:12
|
Update of /cvsroot/wxdevcenter/wxDevCenter/include/wxDevCenter In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv24539/include/wxDevCenter Modified Files: Plugin.h Element.h Log Message: Rewrite of plugin management/loading system. Index: Element.h =================================================================== RCS file: /cvsroot/wxdevcenter/wxDevCenter/include/wxDevCenter/Element.h,v retrieving revision 1.4 retrieving revision 1.5 diff -C2 -d -r1.4 -r1.5 *** Element.h 11 Oct 2005 19:54:24 -0000 1.4 --- Element.h 15 Oct 2005 16:24:04 -0000 1.5 *************** *** 92,96 **** namespace plugins { ! class DynLibRefData; } --- 92,96 ---- namespace plugins { ! class DynLib; } *************** *** 101,105 **** class WXDC_DLL_BASE Element { ! friend class plugins::DynLibRefData; DECLARE_CLASS(Element) private: --- 101,105 ---- class WXDC_DLL_BASE Element { ! friend class plugins::DynLib; DECLARE_CLASS(Element) private: Index: Plugin.h =================================================================== RCS file: /cvsroot/wxdevcenter/wxDevCenter/include/wxDevCenter/Plugin.h,v retrieving revision 1.6 retrieving revision 1.7 diff -C2 -d -r1.6 -r1.7 *** Plugin.h 11 Oct 2005 19:54:24 -0000 1.6 --- Plugin.h 15 Oct 2005 16:24:04 -0000 1.7 *************** *** 28,31 **** --- 28,61 ---- + /** @page Plugins Gestion des extensions. + * @section plugins_intro Introduction. + * Le wxDevCenter est base sur un système d'extensions avec dépendances à trois niveaux : + * - Les Groupes de fonctions (features). + * - Les gréffons (plugins). + * - Les bibliothèques dynamiques (dynlibs). + * Chacun des éléments de chaque niveau peut être lié à des élément du même niveau ou du niveau inférieur + * (Une feature peut etre liée à d'autres features et à des plugins mais pas directement au dynlibs). + * + * @section plugins_loading Processus de chargement. + * @subsection plugins_loading_preload Préchargement des features et des plugins. + * Avant tout utilisation des plugins, il est nécessaire de précharger les descripteurs de features et de plugins + * (respectivement feature.xml et plugin.xml) pour initialiser la tables d'extensions et éviter tout problème de dépendance + * ou de surcharge de fonction. + * + * De plus, le gestionnaire de configuration permettant de surcharger les chemins d'accès, si deux descripteurs identiques sont trouvés + * en deux emplacements différents, seul le dernier chemin de configuration est conservé. + * L'identité des extensions sont fait par identifiant (et non le nom) ansi que par le numéro de version. + * + * Une fois toutes les descriptions chargées et nettoyées, + * la table des dynlibs est remplies avec les identifiants des dynlibs. + * Ces identifiants sont de la forme "nomduplugin/nomdeladynlib" le nom de la dynlib pouvant être décorée d'un numéro de version + * mais sans aucune décoration d'extension (.dll/.so ou un préfixe lib). + * + * @subsection plugins_loading_load Chargement des features, des plugins et des dynlibs. + * Les features, les plugins et les dynlibs étant prédéclarés, un chargement récursif est effectué. + * + **/ + + #ifndef __WXDEVCENTER_PLUGIN #define __WXDEVCENTER_PLUGIN *************** *** 105,108 **** --- 135,139 ---- Version& operator=(wxString str) { + str.Trim(false).Trim(true); wxString s; long l; *************** *** 132,189 **** ! /** Descriptif de module. ! * Objet référençable des modules.*/ ! class WXDC_DLL_BASE DynLibRefData : public wxObjectRefData { ! friend class DynLib; ! protected: ! /** Flag d'état du module.*/ ! unsigned short m_flagState; ! ! /** Chemin du module.*/ ! wxString m_strPath; ! ! /** Objet wx accédant à la dll/so.*/ ! wxDynamicLibrary m_DLL; ! ! /** Gestionnaire des éléments de plugins enregistrés.*/ ! BaseElementManager m_Elements; public: ! DynLibRefData(); ! virtual ~DynLibRefData(); ! ! /** Débugage : Dump du contenu. */ ! wxDEBUG_CODE(wxString Dump();) ! ! /** Charge le module. ! * @param strLongName Nom long du module. ! * @return Vrai si chargement réussi.*/ ! bool Load(wxString strLongName); ! /** Teste si le module est chargé. ! * @return Vrai si le module est chargé.*/ ! bool IsLoaded()const{return m_DLL.IsLoaded();} ! /** Teste si le module est initialisé. ! * @return Vrai si le module est initialisé.*/ ! bool IsInitialized()const{return (m_flagState&Initialized)!=0;} ! ! /** Décharge le module.*/ ! bool Unload(); ! /** Initialise le contenu du module.*/ ! bool Initialize(); ! /** Finalise le contenu du module.*/ ! bool Finalize(); ! ! /** Drapeaux d'états du module.*/ ! enum DynLibState ! { ! Initial = 0x0000, ! Registered = 0x0001, ! Loaded = 0x0002, ! Initialized = 0x0004, ! Error = 0xFFFF ! }; ! }; /** Classe de description d'un module. * Un module est une dll/so qui contient des objets enregistrables. --- 163,193 ---- ! /** Structure représentant une condition sur les versions.*/ ! class WXDC_DLL_BASE VersionCondition { ! struct AtomVersionCondition ! { ! enum AtomVersionConditionOperator ! { ! AVCO_EGUAL, ! AVCO_DIFF, ! AVCO_SUPEGUAL, ! AVCO_SUP, ! AVCO_INFEGUAL, ! AVCO_INF ! }oper; ! Version ver; ! AtomVersionCondition* pNext; ! }; ! AtomVersionCondition* m_pFirst; public: ! VersionCondition():m_pFirst(NULL){} ! VersionCondition(wxString str):m_pFirst(NULL){Set(str);} ! void Set(wxString str); ! wxString Get()const; ! bool Test(Version ver)const; }; + /** Classe de description d'un module. * Un module est une dll/so qui contient des objets enregistrables. *************** *** 194,207 **** DECLARE_CLASS(DynLib) protected: ! /** Accesseur sur la référence de module.*/ ! DynLibRefData* GetDynLibRef()const {return (DynLibRefData*) GetRefData();} ! // create a new m_refData ! virtual wxObjectRefData *CreateRefData() const{return new DynLibRefData;} public: /** Constructeur.*/ ! DynLib(); ! /** Constructeur.*/ ! DynLib(const DynLib& module):wxObject(){Ref(module);} /** Débugage : Dump du contenu. */ --- 198,220 ---- DECLARE_CLASS(DynLib) protected: ! // Identifier. (pluginname/dynlibname) ! wxString m_strID; ! ! /** Flag d'état du module.*/ ! unsigned short m_flagState; ! ! /** Chemin du module.*/ ! wxString m_strPath; + /** Objet wx accédant à la dll/so.*/ + wxDynamicLibrary* m_pDLL; + + /** Gestionnaire des éléments de plugins enregistrés.*/ + BaseElementManager m_Elements; public: /** Constructeur.*/ ! DynLib(wxString strDynLib=wxT("")); ! /** Destructeur.*/ ! ~DynLib(); /** Débugage : Dump du contenu. */ *************** *** 215,223 **** /** Retourne le nom de la dynlib.*/ wxString GetName(); /** Charge le module et enregistre son contenu. - * @param strLongName Nom long du module. * @return Vrai si chargement réussi.*/ ! bool Load(wxString strLongName); /** Décharge le module.*/ bool Unload(); --- 228,237 ---- /** Retourne le nom de la dynlib.*/ wxString GetName(); + /** Retourne l'identifiant de la dynlib.*/ + wxString GetID()const{return m_strID;} /** Charge le module et enregistre son contenu. * @return Vrai si chargement réussi.*/ ! bool Load(); /** Décharge le module.*/ bool Unload(); *************** *** 227,231 **** bool Finalize(); ! }; --- 241,253 ---- bool Finalize(); ! /** Drapeaux d'états du module.*/ ! enum DynLibState ! { ! Initial = 0x0000, ! Registered = 0x0001, ! Loaded = 0x0002, ! Initialized = 0x0004, ! Error = 0xFFFF ! }; }; *************** *** 257,260 **** --- 279,287 ---- unsigned short m_Status; + /** Identifiant de la fonctionnalité.*/ + wxString m_strID; + /** Version de la fonctionnalité.*/ + Version m_Version; + /** Nom de la fonctionnalité.*/ wxString m_strName; *************** *** 263,268 **** /** Description de la fonctionnalité.*/ wxString m_strDescript; - /** Version de la fonctionnalité.*/ - Version m_Version; /** Auteur du plugin.*/ wxString m_strAuthor; --- 290,293 ---- *************** *** 298,317 **** wxString GetDescriptorFilePath()const{return m_strDescriptFilePath;} /** Acces sur le nom.*/ wxString GetName()const{return m_strName;} /** Acces sur la description.*/ wxString GetDescript()const{return m_strDescript;} - /** Acces sur la version.*/ - Version GetVersion()const{return m_Version;} /** Teste si le plugin peut être chargé.*/ bool CheckValidity(); /** Précharge la description du plugin. ! * @param strName Nom du plugin * @return Faux si le plugin est mal décrit.*/ ! bool PreLoad(wxString strName); ! /** Charge le plugin. ! * @param strName Nom du plugin.*/ ! bool Load(wxString strName); /** Décharge le plugin.*/ bool Unload(); --- 323,344 ---- wxString GetDescriptorFilePath()const{return m_strDescriptFilePath;} + /** Acces sur l'ID.*/ + wxString GetID()const{return m_strID;} + /** Acces sur la version.*/ + Version GetVersion()const{return m_Version;} + /** Acces sur le nom.*/ wxString GetName()const{return m_strName;} /** Acces sur la description.*/ wxString GetDescript()const{return m_strDescript;} /** Teste si le plugin peut être chargé.*/ bool CheckValidity(); /** Précharge la description du plugin. ! * @param strPath Chemin du plugin * @return Faux si le plugin est mal décrit.*/ ! bool PreLoad(wxString strPath); ! /** Charge le plugin.*/ ! bool Load(); /** Décharge le plugin.*/ bool Unload(); *************** *** 343,347 **** ErrDescript = 0x0200, WarningMask = 0x00F0, ! ErrFlag = 0x0F00 }; protected: --- 370,374 ---- ErrDescript = 0x0200, WarningMask = 0x00F0, ! ErrMask = 0x0F00 }; protected: *************** *** 351,362 **** unsigned short m_Status; ! /** Nom de la fonctionnalité.*/ ! wxString m_strName; /** Chemin du fichier de description.*/ wxString m_strDescriptFilePath; /** Description de la fonctionnalité.*/ wxString m_strDescript; - /** Version de la fonctionnalité.*/ - Version m_Version; /** Auteur de la fonctionnalité.*/ wxString m_strAuthor; --- 378,395 ---- unsigned short m_Status; ! /** Identifiant de la fonctionnalité.*/ ! wxString m_strID; ! /** Version de la fonctionnalité.*/ ! Version m_Version; ! ! /** Chemin de base du contenu.*/ ! wxString m_strBasePath; /** Chemin du fichier de description.*/ wxString m_strDescriptFilePath; + + /** Nom de la fonctionnalité.*/ + wxString m_strName; /** Description de la fonctionnalité.*/ wxString m_strDescript; /** Auteur de la fonctionnalité.*/ wxString m_strAuthor; *************** *** 386,392 **** bool CheckValidity(); /** Précharge la description de la fonctionnalité. ! * @param strName Nom de la fonctionnalité. * @return Faux si la fonctionnalité est mal décrite.*/ ! bool PreLoad(wxString strName); /** Teste si la fonctionnalité est chargée.*/ bool IsLoaded()const; --- 419,425 ---- bool CheckValidity(); /** Précharge la description de la fonctionnalité. ! * @param strPath Chemin de la fonctionnalité. * @return Faux si la fonctionnalité est mal décrite.*/ ! bool PreLoad(wxString strPath); /** Teste si la fonctionnalité est chargée.*/ bool IsLoaded()const; *************** *** 395,400 **** bool IsInitialized()const{return (m_Status&Initialized)!=0;} /** Charge la fonctionnalité. ! * @param strName Nom de la fonctionnalité.*/ ! bool Load(wxString strName); /** Décharge la fonctionnalité.*/ bool Unload(); --- 428,433 ---- bool IsInitialized()const{return (m_Status&Initialized)!=0;} /** Charge la fonctionnalité. ! */ ! bool Load(); /** Décharge la fonctionnalité.*/ bool Unload(); *************** *** 404,413 **** bool Finalize(); /** Acces sur le nom.*/ wxString GetName()const{return m_strName;} /** Acces sur la description.*/ wxString GetDescript()const{return m_strDescript;} - /** Acces sur la version.*/ - Version GetVersion()const{return m_Version;} /** Fixe le chemin du fichier de description.*/ --- 437,449 ---- bool Finalize(); + /** Acces sur l'ID.*/ + wxString GetID()const{return m_strID;} + /** Acces sur la version.*/ + Version GetVersion()const{return m_Version;} + /** Acces sur le nom.*/ wxString GetName()const{return m_strName;} /** Acces sur la description.*/ wxString GetDescript()const{return m_strDescript;} /** Fixe le chemin du fichier de description.*/ *************** *** 428,436 **** }; ! WX_DECLARE_STRING_HASH_MAP_WITH_DECL(Feature, FeatureMap, class WXDC_DLL_BASE); ! WX_DECLARE_STRING_HASH_MAP_WITH_DECL(Plugin, PluginMap, class WXDC_DLL_BASE); ! WX_DECLARE_STRING_HASH_MAP_WITH_DECL(DynLib, DynLibMap, class WXDC_DLL_BASE); /** Chargeur de plugins avec prise en charge des fonctionnalités. --- 464,494 ---- }; + /** + * Feature descriptor direct container. + */ + class FeatureManager : public Vector<Feature> + { + public: + void Register(const Feature& feature){Add(feature);} + }; ! /** ! * Plugin descriptor direct container. ! */ ! class PluginManager : public Vector<Plugin> ! { ! public: ! void Register(const Plugin& plugin){Add(plugin);} ! ! }; + /** + * DynLib descriptor direct container. + */ + class DynLibManager : public Vector<DynLib> + { + public: + void Register(const DynLib& dynlib){Add(dynlib);} + }; /** Chargeur de plugins avec prise en charge des fonctionnalités. *************** *** 440,446 **** DECLARE_CLASS(PluginLoader) protected: ! FeatureMap m_FeatureMap; /**> Fonctionnalité indéxé par son nom.*/ ! PluginMap m_PluginMap; /**> Plugin indexé par son nom.*/ ! DynLibMap m_DynLibMap; /**> DynLib indexé par son chemin.*/ static PluginLoader s_PluginManager; --- 498,504 ---- DECLARE_CLASS(PluginLoader) protected: ! FeatureManager m_FeatureManager; ! PluginManager m_PluginManager; ! DynLibManager m_DynLibManager; static PluginLoader s_PluginManager; *************** *** 458,521 **** /** Accesseur sur une feature.*/ ! Feature* GetFeature(wxString strFeature); /** Accesseur sur un plugin.*/ ! Plugin* GetPlugin(wxString strPlugin); /** Accesseur sur une dynlib.*/ ! DynLib* GetDynLib(wxString strDynLib); /** Charge tous les plugins.*/ bool Load(); ! /** Charge un module à l'adresse spécifiée. ! * @param strPath Adrese du module. ! * @return Adresse du descripteur de module associé si chargé et NULL sinon..*/ ! DynLib* LoadDynLib(wxString strPath); ! ! /** Précharge la description des fonctionnalités et des plugins.*/ void PreLoadDescription(); ! /** Débugage : Dump du contenu. */ ! wxDEBUG_CODE(wxString Dump();) ! /** Précharge la description d'une fonctionnalité. ! * Le fichier "feature.xml" est parsé et analysé. ! * @param strName Nom de la fonctionnalité. ! * @return Adresse du descripteur de fonctionnalité si chargé, NULL sinon.*/ ! Feature* PreLoadFeature(wxString strName); ! /** Précharge la description d'un plugin. ! * Le fichier "plugin.xml" est parsé et analysé. ! * @param strName Nom du plugin. ! * @return Adrese du descripteur des plugins si chargé, NULL sinon.*/ ! Plugin* PreLoadPlugin(wxString strName); /** Charge un plugin ainsi que toutes ses dépendances. ! * Le plugin est recherché uniquement dans le répertoire des plugins. ! * @param strName Nom du plugin. * @return Adrese du descripteur des plugins si chargé, NULL sinon.*/ ! Plugin* LoadPlugin(wxString strName); /** Charge une fonctionnalité. ! * La fonctionnalité est recherchée uniquement dans le répertoire des fonctionnalité. ! * @param strName Nom de la fonctionnalité. * @return Adresse du descripteur de fonctionnalité si chargé, NULL sinon.*/ ! Feature* LoadFeature(wxString strName); - /** Initialise un plugin ainsi que toutes ses dépendances. - * @param strName Nom du plugin. - * @return Vrai si le plugin est correctement initialisé. - */ - bool InitializePlugin(wxString strName); /** Initialise une fonctionnalité. ! * @param strName Nom de la fonctionnalité. * @return Vrai si la fonctionnalité est correctement initialisé. */ ! bool InitializeFeature(wxString strName); /** Initialise un module. ! * @param strName Nom du module. * @return Vrai si le module est correctement initialisé. */ ! bool InitializeDynLib(wxString strName); /** Initialise le contenu chargé. --- 516,573 ---- /** Accesseur sur une feature.*/ ! Feature* GetFeature(wxString strID, wxString strVer=wxT("")); /** Accesseur sur un plugin.*/ ! Plugin* GetPlugin(wxString strID, wxString strVer=wxT("")); /** Accesseur sur une dynlib.*/ ! DynLib* GetDynLib(wxString strName); /** Charge tous les plugins.*/ bool Load(); ! /** Précharge la description des fonctionnalités et des plugins. ! * Résoud la surcharge des descriptions.*/ void PreLoadDescription(); ! /** Resoud les conflits de versions. ! * Désactives les versions non exploitées. ! */ ! void ResolveVersions(); + /** Remplit la table des dynlibs.*/ + void FillDynLibManager(); ! /** Débugage : Dump du contenu. */ ! wxDEBUG_CODE(wxString Dump();) ! /** Charge un module. ! * @param lIndex Index du module. ! * @return Adresse du descripteur de module associé si chargé et NULL sinon..*/ ! DynLib* LoadDynLib(unsigned long lIndex); /** Charge un plugin ainsi que toutes ses dépendances. ! * @param lIndex Index du plugin. * @return Adrese du descripteur des plugins si chargé, NULL sinon.*/ ! Plugin* LoadPlugin(unsigned long lIndex); /** Charge une fonctionnalité. ! * @param lIndex Index de la fonctionnalité. * @return Adresse du descripteur de fonctionnalité si chargé, NULL sinon.*/ ! Feature* LoadFeature(unsigned long lIndex); /** Initialise une fonctionnalité. ! * @param lIndex Index de la fonctionnalité. * @return Vrai si la fonctionnalité est correctement initialisé. */ ! bool InitializeFeature(unsigned long lIndex); ! /** Initialise un plugin ainsi que toutes ses dépendances. ! * @param lIndex Index du plugin. ! * @return Vrai si le plugin est correctement initialisé. ! */ ! bool InitializePlugin(unsigned long lIndex); /** Initialise un module. ! * @param lIndex Index du module. * @return Vrai si le module est correctement initialisé. */ ! bool InitializeDynLib(unsigned long lIndex); /** Initialise le contenu chargé. |