00001 00002 #include <kore/version.h> 00003 #include <kore/modulemanager.h> 00004 00005 #define MM_MAJOR 0 00006 #define MM_MINOR 0 00007 #define MM_REVISION 1 00008 #define MM_VERSION "0.0.1" 00009 #define MM_API_MAJOR 0 00010 #define MM_API_MINOR 0 00011 #define MM_API_REVISION 1 00012 #define MM_API_VERSION "0.0.1" 00013 #define MM_NAME "Module Manager" 00014 #define MM_TYPE "Module Manager" 00015 #define MM_DESCRIPTION "Default Kore Module Manager" 00016 #define MM_SERVICE "Kore/Kernel/Module Manager" 00017 #define MM_SERVICE_DESCRIPTION "Kore Module Manager" 00018 00019 using namespace kore; 00020 00021 ModuleManager::ModuleManager() 00022 { 00023 _mmVersion = new Version(MM_MAJOR,MM_MINOR,MM_REVISION,MM_VERSION); 00024 _mmAPIVersion = new Version(MM_API_MAJOR,MM_API_MINOR,MM_API_REVISION,MM_API_VERSION); 00025 _mmInfo = new Info(this, MM_NAME, MM_TYPE, MM_DESCRIPTION, _mmVersion, _mmAPIVersion); 00026 setInfo(_mmInfo); 00027 _mmService = new Service(this, MM_SERVICE, MM_SERVICE_DESCRIPTION); 00028 addService(_mmService); 00029 } 00030 ModuleManager::~ModuleManager() 00031 { 00032 unregisterModules(); 00033 delete _mmInfo; 00034 delete _mmVersion; 00035 delete _mmAPIVersion; 00036 delete _mmService; 00037 } 00038 00039 void ModuleManager::registerModule(Module* module) 00040 { 00041 module->registeringModule(this); 00042 _modules.insert(module); 00043 module->moduleRegistered(this); 00044 } 00045 00046 void ModuleManager::unregisterModule(Module* module) 00047 { 00048 module->unregisteringModule(this); 00049 _modules.erase(_modules.find(module)); 00050 module->moduleUnregistered(this); 00051 } 00052 00053 void ModuleManager::registerModules(Module** modules) 00054 { 00055 for(int i = 0; modules[i]; i++) 00056 registerModule(modules[i]); 00057 } 00058 void ModuleManager::unregisterModules() 00059 { 00060 int n = _modules.size(); 00061 #ifdef WIN32 00062 mod_set_type::iterator* it = new mod_set_type::iterator[n]; 00063 mod_set_type::iterator b,e; 00064 #else 00065 mod_set_type::const_iterator* it = new mod_set_type::const_iterator[n]; 00066 mod_set_type::const_iterator b,e; 00067 #endif 00068 b = _modules.begin(); 00069 e = _modules.end(); 00070 int i = 0; 00071 #ifdef WIN32 00072 mod_set_type::iterator j; 00073 #else 00074 mod_set_type::const_iterator j; 00075 #endif 00076 for( j = b; j != e; ++j, ++i ) 00077 it[i] = j; 00078 for( i = 0; i < n; i++) 00079 { 00080 (*it[i])->unregisteringModule(this); 00081 Module* mod = *it[i]; 00082 _modules.erase(it[i]); 00083 mod->moduleUnregistered(this); 00084 } 00085 } 00086 00087 Module** ModuleManager::registeredModules() const 00088 { 00089 int n = _modules.size(); 00090 Module** mod = new Module*[n+1]; 00091 mod_set_type::const_iterator b,e; 00092 b = _modules.begin(); 00093 e = _modules.end(); 00094 int i = 0; 00095 for( mod_set_type::const_iterator j = b; j != e; ++j, ++i ) 00096 mod[i] = *j; 00097 mod[i] = 0; 00098 return mod; 00099 }