00001
00002
00003
00004
00005
00006
00007
00008
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 }