00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024 #ifndef __PLUGIN_MANAGER_H_
00025 #define __PLUGIN_MANAGER_H_
00026
00027 #include <netcomm/fawkes/handler.h>
00028 #include <core/utils/lock_list.h>
00029 #include <core/utils/lock_map.h>
00030 #include <config/change_handler.h>
00031 #include <utils/system/fam.h>
00032
00033 #include <string>
00034 #include <utility>
00035
00036 namespace fawkes {
00037 #if 0
00038 }
00039 #endif
00040
00041 class ThreadCollector;
00042 class Plugin;
00043 class PluginLoader;
00044 class Mutex;
00045 class PluginListMessage;
00046 class Configuration;
00047 #ifdef HAVE_INOTIFY
00048 class FamThread;
00049 #endif
00050 class PluginManagerListener;
00051
00052 class PluginManager
00053 : public fawkes::ConfigurationChangeHandler,
00054 public FamListener
00055 {
00056 public:
00057 PluginManager(ThreadCollector *thread_collector,
00058 Configuration *config,
00059 const char *meta_plugin_prefix);
00060 ~PluginManager();
00061
00062
00063 virtual void config_tag_changed(const char *new_tag);
00064 virtual void config_value_changed(const char *path, bool is_default, int value);
00065 virtual void config_value_changed(const char *path, bool is_default, unsigned int value);
00066 virtual void config_value_changed(const char *path, bool is_default, float value);
00067 virtual void config_value_changed(const char *path, bool is_default, bool value);
00068 virtual void config_value_changed(const char *path, bool is_default, const char *value);
00069 virtual void config_comment_changed(const char *path, bool is_default, const char *comment);
00070 virtual void config_value_erased(const char *path, bool is_default);
00071
00072
00073 virtual void fam_event(const char *filename, unsigned int mask);
00074
00075 void load(const char *plugin_list);
00076 void unload(const char *plugin_name);
00077
00078 bool is_loaded(const char *plugin_name);
00079
00080 std::list<std::string> get_loaded_plugins();
00081 std::list<std::pair<std::string, std::string> > get_available_plugins();
00082
00083 void add_listener(PluginManagerListener *listener);
00084 void remove_listener(PluginManagerListener *listener);
00085
00086 private:
00087 void init_pinfo_cache();
00088 void notify_loaded(const char *plugin_name);
00089 void notify_unloaded(const char *plugin_name);
00090
00091 std::list<std::string> parse_plugin_list(const char *plugin_type_list);
00092
00093 private:
00094 ThreadCollector *thread_collector;
00095 PluginLoader *plugin_loader;
00096
00097 LockMap< std::string, Plugin * > plugins;
00098 LockMap< std::string, Plugin * >::iterator pit;
00099 LockMap< std::string, Plugin * >::reverse_iterator rpit;
00100
00101 LockMap< std::string, std::string > __meta_plugins;
00102 LockMap< std::string, std::string >::iterator __mpit;
00103
00104 unsigned int next_plugin_id;
00105 std::map< std::string, unsigned int > plugin_ids;
00106
00107 LockList<std::pair<std::string, std::string> > __pinfo_cache;
00108
00109 LockList<PluginManagerListener *> __listeners;
00110 LockList<PluginManagerListener *>::iterator __lit;
00111
00112 Configuration *__config;
00113 std::string __meta_plugin_prefix;
00114
00115 #ifdef HAVE_INOTIFY
00116 FamThread *__fam_thread;
00117 #else
00118 void *__fam_thread;
00119 #endif
00120 };
00121
00122 }
00123
00124 #endif