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

Module.cpp

Aller à la documentation de ce fichier.
00001 /*! \file Module.cpp
00002     \brief Gestion de module dynamique.
00003 
00004     Permet l'utilisation de module dynamique comme simple classe. \n
00005 
00006     \author     aerith (contact@aerith.biz - www.aerith.biz)
00007     \version    1.0
00008     \date       29/11/2005
00009 */
00010 
00011 #include    "Module.h"
00012 
00013 MUTEX           Module::ModuleMutex;
00014 int             Module::ModuleInstance = 0;
00015 int             Module::NbModule = 0;
00016 ModuleModule    **Module::Modules = NULL;
00017 
00018 Module::Module()
00019 {
00020     if(!ModuleInstance)
00021         MutexInit(&ModuleMutex);
00022 
00023     ModuleInstance++;
00024 }
00025 
00026 Module::~Module()
00027 {
00028     int     i;
00029 
00030     ModuleInstance--;
00031 
00032     if(!ModuleInstance)
00033     {
00034         UnLoadModules();
00035 
00036         MutexStop(&ModuleMutex);
00037 
00038         for(i = 0; i < NbModule; i++)
00039         {
00040             if(Modules[i])
00041                 free(Modules[i]);
00042             Modules[i] = NULL;
00043         }
00044         if(Modules)
00045             free(Modules);
00046         Modules = NULL;
00047     }
00048 }
00049 
00050 int     Module::LoadModules(char *pFile)
00051 {
00052     FILE    *OSInfo;
00053     char    OS[] = "WIN";
00054     char    Section[12];
00055     char    ModuleName[MODULE_NAME];
00056     char    ModuleFile[MODULE_FILE];
00057     int     i;
00058     BEGIN
00059     LOC("Module::LoadModules")
00060 
00061     Ini     Fichier(pFile);
00062 
00063     MutexLock(&ModuleMutex);
00064 
00065 #ifndef WIN32
00066     system("uname -a > tmp.txt");
00067 
00068     OSInfo = fopen("tmp.txt", "r");
00069     if(OSInfo)
00070     {
00071         while(!feof(OSInfo))
00072         {
00073             if(fgets(ModuleFile, MODULE_FILE, OSInfo))
00074             {
00075                 if(strstr(ModuleFile, "Linux"))
00076                     strcpy(OS, "NUX");
00077                 else if(strstr(ModuleFile, "BSD"))
00078                     strcpy(OS, "BSD");
00079                 else if(strstr(ModuleFile, "SOLARIS"))
00080                     strcpy(OS, "SOL");
00081                 else if(strstr(ModuleFile, "Unix"))
00082                     strcpy(OS, "NIX");
00083             }
00084         }
00085         fclose(OSInfo);
00086     }
00087 
00088     system("rm tmp.txt");
00089 #endif
00090 
00091     sprintf(Section, "module%s", OS);
00092     printf("[Module] OS detected : %s\n", OS);
00093 
00094     TRY if(Fichier.GetSection(Section))
00095     {
00096         for(i = 0; i < Fichier.GetSection(Section)->GetNbItem(); i++)
00097         {
00098             TRY strcpy(ModuleName, Fichier.GetSection(Section)->GetItemName(i));
00099             TRYIF(ModuleName, 17)
00100             TRY strcpy(ModuleFile, Fichier.GetSection(Section)->GetItem(i)->GetData());
00101             TRYIF(ModuleFile, 17)
00102 
00103             CERROR = AddModule(ModuleName, ModuleFile);
00104         }
00105     }
00106     else
00107     {
00108         CERROR = 23;
00109         printf("[Module] No module to load in conf file\n");
00110     }
00111 
00112     MutexUnLock(&ModuleMutex);
00113 
00114     PERROR
00115 
00116     ENDBEGIN
00117 }
00118 
00119 int     Module::UnLoadModules()
00120 {
00121     int     i;
00122     BEGIN
00123     LOC("Module::UnLoadModules")
00124 
00125     MutexLock(&ModuleMutex);
00126 
00127     for(i = 0; (i < NbModule) && (!CERROR); i++)
00128         CERROR = DelModule(i);
00129 
00130     delete [] Modules;
00131 
00132     MutexUnLock(&ModuleMutex);
00133 
00134     PERROR
00135 
00136     ENDBEGIN
00137 }
00138 
00139 int     Module::AddModule(char *pName, char *pFile)
00140 {
00141     ModuleModule    *ModuleTemp;
00142     BEGIN
00143     LOC("Module::AddModules")
00144 
00145     ModuleTemp = new ModuleModule;
00146 
00147     CERROR = ModuleTemp->Load(pName, pFile);
00148 
00149     TRY {
00150         Modules = (ModuleModule **)realloc(Modules, (NbModule + 1) * sizeof(ModuleModule *));
00151         Modules[NbModule] = ModuleTemp;
00152         NbModule++;
00153     }
00154     else
00155     {
00156         if(ModuleTemp)
00157             free(ModuleTemp);
00158         ModuleTemp = NULL;
00159     }
00160 
00161     PERROR
00162 
00163     ENDBEGIN
00164 }
00165 
00166 int     Module::DelModule(int iPos)
00167 {
00168     int     i;
00169     BEGIN
00170     LOC("Module::DelModules")
00171 
00172     if(iPos < NbModule)
00173     {
00174         CERROR = Modules[iPos]->UnLoad();
00175 
00176         TRY {
00177             if(Modules[iPos])
00178                 free(Modules[iPos]);
00179             Modules[iPos] = NULL;
00180 
00181             for(i = iPos; i < (NbModule - 1); Modules[i] = Modules[i++]);
00182             Modules = (ModuleModule **)realloc(Modules, (NbModule - 1) * sizeof(ModuleModule *));
00183 
00184             NbModule--;
00185         }
00186     }
00187     ENDTRY(24)
00188 
00189     PERROR
00190 
00191     ENDBEGIN
00192 }

Généré le Thu Oct 12 01:00:43 2006 pour GestionAsso par  doxygen 1.3.9.1