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 }