Page principale | Liste alphabétique | Liste des classes | Liste des fichiers | Membres de classe | Membres de fichier | Pages associées

ModuleDynamique.cpp

Aller à la documentation de ce fichier.
00001 /*! \file ModuleDynamique.cpp
00002     \brief Gestion de module dynamique.
00003 
00004     Permet l'utilisation de module dynamique comme simple classe. \n
00005 
00006     \author     aerith (www.aerith.fr)
00007     \version    1.0
00008     \date       26/07/2007
00009 */
00010 
00011 #include    "ModuleDynamique.h"
00012 
00013 MUTEX           ModuleDynamique::ModuleMutex;
00014 int             ModuleDynamique::ModuleInstance = 0;
00015 int             ModuleDynamique::NbModule = 0;
00016 std::vector<ModuleDynamiqueModule *>    ModuleDynamique::Modules;
00017 
00018 ModuleDynamique::ModuleDynamique()
00019 {
00020     if(!ModuleInstance)
00021         MutexInit(&ModuleMutex);
00022 
00023     ModuleInstance++;
00024 }
00025 
00026 ModuleDynamique::~ModuleDynamique()
00027 {
00028     ModuleInstance--;
00029 
00030     if(!ModuleInstance)
00031     {
00032         UnLoadModules();
00033 
00034         MutexStop(&ModuleMutex);
00035 
00036         Modules.clear();
00037     }
00038 }
00039 
00040 int     ModuleDynamique::LoadModules(char *pFile)
00041 {
00042     char    OS[] = "WIN";
00043     char    Section[12];
00044     char    ModuleName[MODULE_NAME];
00045     char    ModuleFile[MODULE_FILE];
00046     int     i;
00047     BEGIN
00048     LOC("ModuleDynamique::LoadModules")
00049 
00050     Ini     Fichier(pFile);
00051 
00052     MutexLock(&ModuleMutex);
00053 
00054 #ifndef WIN32
00055     strcpy(OS, "NUX");
00056 #endif
00057 
00058     sprintf(Section, "module%s", OS);
00059     printf("[Module] OS detected : %s\n", OS);
00060 
00061     TRY if(Fichier.GetSection(Section))
00062     {
00063         for(i = 0; i < Fichier.GetSection(Section)->GetNbItem(); i++)
00064         {
00065             TRY strcpy(ModuleName, Fichier.GetSection(Section)->GetItemName(i));
00066             TRYIF(ModuleName, ERROR_C_CONF_FILE)
00067             TRY strcpy(ModuleFile, Fichier.GetSection(Section)->GetItem(i)->GetData());
00068             TRYIF(ModuleFile, ERROR_C_CONF_FILE)
00069 
00070             CERROR = AddModule(ModuleName, ModuleFile);
00071         }
00072     }
00073     else
00074     {
00075         CERROR = ERROR_C_LOAD_DLL;
00076         printf("[Module] No module to load in conf file\n");
00077     }
00078 
00079     MutexUnLock(&ModuleMutex);
00080 
00081     PERROR
00082 
00083     ENDBEGIN
00084 }
00085 
00086 int     ModuleDynamique::UnLoadModules()
00087 {
00088     BEGIN
00089     LOC("ModuleDynamique::UnLoadModules")
00090 
00091     MutexLock(&ModuleMutex);
00092 
00093     while(NbModule)
00094     {
00095         CERROR = DelModule(NbModule - 1);
00096     }
00097 
00098     MutexUnLock(&ModuleMutex);
00099 
00100     PERROR
00101 
00102     ENDBEGIN
00103 }
00104 
00105 int     ModuleDynamique::AddModule(char *pName, char *pFile)
00106 {
00107     BEGIN
00108     LOC("ModuleDynamique::AddModules")
00109 
00110     Modules.push_back(new ModuleDynamiqueModule);
00111     
00112     if(!Modules[NbModule])
00113         CERROR = ERROR_C_MEMORY;
00114     else
00115     {
00116         CERROR = Modules.back()->Load(pName, pFile);
00117 
00118         TRY NbModule++;
00119         else
00120             Modules.erase(Modules.begin() + NbModule);
00121     }
00122     
00123     PERROR
00124 
00125     ENDBEGIN
00126 }
00127 
00128 int     ModuleDynamique::DelModule(int iPos)
00129 {
00130     BEGIN
00131     LOC("ModuleDynamique::DelModules")
00132 
00133     if(iPos < NbModule)
00134     {
00135         CERROR = Modules[iPos]->UnLoad();
00136 
00137         TRY {
00138             delete Modules[iPos];
00139             Modules.erase(Modules.begin() + iPos);
00140 
00141             NbModule--;
00142         }
00143     }
00144     ENDTRY(ERROR_C_UNLOAD_DLL)
00145 
00146     PERROR
00147 
00148     ENDBEGIN
00149 }

Généré le Thu Jun 12 09:12:29 2008 pour A.I.F. par  doxygen 1.3.9.1