00001 /*! \file ModuleDynamique.h 00002 \brief Gestion de module dynamique. 00003 00004 Permet l'utilisation de module dynamique comme simple classe. \n 00005 00006 Dans le fichier conf : \n 00007 [moduleWIN] \n 00008 <nom> =<fichier> \n 00009 [moduleNUX] \n 00010 <nom> =<fichier> \n 00011 00012 00013 ex : \n 00014 [moduleWIN] 00015 test1 =modules/test.dll \n 00016 [moduleNUX] 00017 test1 =modules/test.so \n 00018 00019 \author aerith (www.aerith.fr) 00020 \version 1.0 00021 \date 01/11/2007 00022 */ 00023 00024 #ifndef INCLUDE_RSRC_MODULEDYNAMIQUE 00025 #define INCLUDE_RSRC_MODULEDYNAMIQUE 00026 00027 #include "../Tools/Tools.h" 00028 #include "../Error/Error.h" 00029 #include "../Surcouche/SurcoucheModule.h" 00030 #include "../Surcouche/SurcoucheMultitache.h" 00031 #include "../INI/Ini.h" 00032 #include "ModuleDynamiqueModule.h" 00033 #include <stdio.h> 00034 #include <string.h> 00035 #include <vector> 00036 #include <stdlib.h> 00037 00038 //! Gestion de module dynamique. 00039 /*! Permet l'utilisation de module dynamique comme simple classe. 00040 */ 00041 class ModuleDynamique 00042 { 00043 private : 00044 static int NbModule; /*!< Nombre de fonction importées. */ 00045 static std::vector<ModuleDynamiqueModule *> Modules; /*!< Chaque lignes est un module dynamique. */ 00046 static int ModuleInstance; /*!< Compte les instance de la class. */ 00047 static MUTEX ModuleMutex; /*!< Utiliser des que l'on accede à un fichier. */ 00048 00049 public : 00050 /*! Initialise. 00051 */ 00052 ModuleDynamique(); 00053 00054 /*! Libere proprement la mémoire, décharge les modules. 00055 */ 00056 ~ModuleDynamique(); 00057 00058 //! Charge les modules. 00059 /*! Efectue une mise à jour, charge les modules depuis le fichier de configuration \a pFile et \n 00060 décharge ceux avec le paramètre 'u'. 00061 \param pFile fichier de configuration 00062 \return code d'erreur. 00063 \sa UnLoadModules(). 00064 */ 00065 int LoadModules(char *pFile); 00066 00067 //! Decharge tous les modules. 00068 /*! Decharge tous les modules. 00069 \return code d'erreur. 00070 \sa LoadModules(). 00071 */ 00072 int UnLoadModules(); 00073 00074 //! Ajoute un module. 00075 /*! Ajoute un module de fichier \a pFile . 00076 \param pName nom du module 00077 \param pFile fichier du module 00078 \return code d'erreur. 00079 \sa DelModule(), GetModule() et GetNbModule(). 00080 */ 00081 int AddModule(char *pName, char *pFile); 00082 00083 //! Supprime un module. 00084 /*! Supprime le module étant à la position \a iPos. 00085 \param iPos position du module. 00086 \return code d'erreur. 00087 \sa AddModule(), GetModule() et GetNbModule(). 00088 */ 00089 int DelModule(int iPos); 00090 00091 //! Supprime un module. 00092 /*! Supprime le module de nom \a pName. 00093 \param pName nom du module. 00094 \return code d'erreur. 00095 \sa AddModule(), GetModule() et GetNbModule(). 00096 */ 00097 inline int DelModule(char *pName) 00098 { 00099 for(int i = 0; i < NbModule; i++) 00100 { 00101 if(!strcmp(Modules[i]->GetName(), pName)) 00102 return DelModule(i); 00103 } 00104 }; 00105 00106 //! Retourne un module par sa position. 00107 /*! Permet l'acces au module étant a la position \a iPos. 00108 \param iPos position du module. 00109 \return pointeur sur la class du module. 00110 \sa AddModule(), DelModule() et GetNbModule(). 00111 */ 00112 inline ModuleDynamiqueModule *GetModule(int iPos) 00113 { 00114 if(iPos < NbModule) 00115 return Modules[iPos]; 00116 00117 return NULL; 00118 }; 00119 00120 //! Retourne un module par son nom. 00121 /*! Permet l'acces au module ayant le nom \a pName que l'on a donnée. 00122 \param pName nom du module. 00123 \return pointeur sur la class du module. 00124 \sa AddModule(), DelModule() et GetNbModule(). 00125 */ 00126 inline ModuleDynamiqueModule *GetModule(char *pName) 00127 { 00128 for(int i = 0; i < NbModule; i++) 00129 { 00130 if(!strcmp(Modules[i]->GetName(), pName)) 00131 return Modules[i]; 00132 } 00133 00134 return NULL; 00135 }; 00136 00137 //! Retourne le nombre de module. 00138 /*! Retourne le nombre de module géré. 00139 \return nombre de module géré. 00140 \sa AddModule(), DelModule() et GetModule(). 00141 */ 00142 inline int GetNbModule() 00143 { 00144 return NbModule; 00145 }; 00146 00147 //! Retourne le nombre d'instance. 00148 /*! Retourne le nombre d'instance de la class (pour multitache). 00149 \return nombre d'instance de la class. 00150 */ 00151 inline int GetNbInstance() 00152 { 00153 return ModuleInstance; 00154 }; 00155 }; 00156 00157 00158 #endif 00159