00001 #ifndef __ARC_MODULEMANAGER_H__
00002 #define __ARC_MODULEMANAGER_H__
00003
00004 #include <string>
00005 #include <map>
00006 #include <list>
00007 #include <glibmm/module.h>
00008 #include <arc/XMLNode.h>
00009 #include <arc/Thread.h>
00010 #include <arc/Logger.h>
00011
00012 namespace Arc {
00013
00014 class LoadableModuleDescription {
00015 private:
00016 Glib::Module* module;
00017 int count;
00018 int usage_count;
00019 std::string path;
00020 void check_unload(void) {
00021 if((count <= 0) && (usage_count <= 0) && module) {
00022 delete module;
00023 module=NULL;
00024 }
00025 };
00026 public:
00027 LoadableModuleDescription(void):module(NULL),count(0),usage_count(0) { };
00028 LoadableModuleDescription(Glib::Module* m):module(m),count(0),usage_count(0) { };
00029 LoadableModuleDescription& operator=(Glib::Module* m) {
00030 module=m; count=0; usage_count=0;
00031 return *this;
00032 };
00033 LoadableModuleDescription& operator=(const LoadableModuleDescription& d) {
00034 module=d.module; count=d.count; usage_count=d.usage_count;
00035 return *this;
00036 };
00037 operator Glib::Module*(void) { return module; };
00038 operator bool(void) { return (module != NULL); };
00039 bool operator!(void) { return (module == NULL); };
00040 bool operator==(Glib::Module* m) { return (module==m); };
00041 int load(void) { ++count; return count; };
00042 int unload(void) {
00043 if(count > 0) --count;
00044 check_unload();
00045 return count;
00046 };
00047 int use(void) { ++usage_count; return usage_count; };
00048 int unuse(void) {
00049 if(usage_count > 0) --usage_count;
00050
00051 return usage_count;
00052 };
00053 int usage(void) { return usage_count; };
00054 void makePersistent(void) { if(module) module->make_resident(); };
00055 };
00056 typedef std::map<std::string, LoadableModuleDescription> plugin_cache_t;
00057
00059
00063 class ModuleManager
00064 {
00065 private:
00066 Glib::Mutex mlock;
00067 static Logger logger;
00068 std::list<std::string> plugin_dir;
00069 plugin_cache_t plugin_cache;
00070 ModuleManager(const ModuleManager&) {};
00071 ModuleManager& operator=(const ModuleManager&) { return *this; };
00072 protected:
00075 void unload(Glib::Module* module);
00077 void unload(const std::string& name);
00078 public:
00082 ModuleManager(XMLNode cfg);
00083 ~ModuleManager();
00085 Glib::Module* load(const std::string& name,bool probe);
00088 std::string find(const std::string& name);
00093 Glib::Module* reload(Glib::Module* module);
00098 void use(Glib::Module* module);
00103 void unuse(Glib::Module* module);
00105 std::string findLocation(const std::string& name);
00109 bool makePersistent(Glib::Module* module);
00111 bool makePersistent(const std::string& name);
00115 void setCfg (XMLNode cfg);
00116 };
00117
00118 }
00119
00120 #endif