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