Changeset 6016 for branches/newapi
- Timestamp:
- 01/11/08 05:30:23 (11 months ago)
- Location:
- branches/newapi/licq/src/plugin
- Files:
-
- 3 modified
-
pluginmanager.h (modified) (2 diffs)
-
pluginmanagerimpl.cpp (modified) (4 diffs)
-
pluginmanagerimpl.h (modified) (3 diffs)
Legend:
- Unmodified
- Added
- Removed
-
branches/newapi/licq/src/plugin/pluginmanager.h
r5924 r6016 24 24 25 25 #include <boost/noncopyable.hpp> 26 #include <boost/shared_ptr.hpp>27 26 #include <vector> 28 27 … … 39 38 { 40 39 public: 41 virtual void getPluginInformation( 42 std::vector< boost::shared_ptr<const Licq::Plugin::Information> >* info)= 0;40 virtual void getPluginInformation(Licq::Plugin::InformationVector* info) = 0; 41 virtual bool isValidPluginId(Licq::Plugin::Id id) const = 0; 43 42 44 virtual Licq::Plugin::Id 45 loadPlugin(const std::string& filename, int argc, char** argv) = 0; 43 virtual Licq::Plugin::Id startPlugin(const std::string& filename, 44 int argc, char** argv) = 0; 45 46 virtual void stopAllPlugins() = 0; 47 48 virtual void stopPlugin(Licq::Plugin::Id id) = 0; 49 virtual void cleanupPlugin(Licq::Plugin::Id id) = 0; 46 50 47 51 virtual PluginCache* getPluginCache() const = 0; -
branches/newapi/licq/src/plugin/pluginmanagerimpl.cpp
r5975 r6016 18 18 */ 19 19 20 #include "event/eventmanager.h" 21 #include "event/eventqueuename.h" 20 22 #include "licq/event/eventqueue.h" 23 #include "licq/exception/invalidargumentexception.h" 21 24 #include "plugin/plugincache.h" 22 25 #include "plugin/plugininstanceimpl.h" 23 26 #include "plugin/pluginmanagerimpl.h" 27 #include "util/tr.h" 24 28 25 LicqDaemon::PluginManagerImpl::PluginManagerImpl(PluginCache& cache, 29 LicqDaemon::PluginManagerImpl::PluginManagerImpl(EventManager& eventManager, 30 PluginCache& cache, 26 31 Licq::LogSink& sink) 27 : myCache(cache), 32 : myEventManager(eventManager), 33 myCache(cache), 28 34 myPluginLogSink(sink) 29 35 { … … 33 39 LicqDaemon::PluginManagerImpl::~PluginManagerImpl() 34 40 { 35 // Empty 41 // Cleanup plugins that didn't exit on their own 42 while (!myPlugins.empty()) 43 cleanupPlugin(myPlugins.begin(), true); 36 44 } 37 45 38 void LicqDaemon::PluginManagerImpl:: getPluginInformation(39 std::vector< boost::shared_ptr<const Licq::Plugin::Information> >* info)46 void LicqDaemon::PluginManagerImpl:: 47 getPluginInformation(Licq::Plugin::InformationVector* info) 40 48 { 41 49 assert(info != NULL); … … 47 55 } 48 56 57 bool LicqDaemon::PluginManagerImpl::isValidPluginId(Licq::Plugin::Id id) const 58 { 59 return (myPlugins.find(id) != myPlugins.end()); 60 } 61 49 62 Licq::Plugin::Id LicqDaemon::PluginManagerImpl:: 50 loadPlugin(const std::string& filename, int argc, char** argv)63 startPlugin(const std::string& filename, int argc, char** argv) 51 64 { 52 65 const size_t index = myCache.getIndex(filename); 53 66 54 boost::shared_ptr<const Licq::Plugin::Information> 55 info = myCache.getInformation(index); 56 67 Licq::Plugin::Information::Ptr info = myCache.getInformation(index); 57 68 boost::shared_ptr<PluginLibrary> lib = myCache.getLibrary(index); 58 69 59 boost::shared_ptr<PluginInstance>60 instance(new PluginInstanceImpl(info, lib, myPluginLogSink));70 // Create the plugin instance 71 PluginInstancePtr instance(new PluginInstanceImpl(info, lib, myPluginLogSink)); 61 72 62 73 Licq::Plugin::Id id = instance->load(argc, argv); … … 64 75 65 76 // Start the plugin 66 instance-> getThread()->start();77 instance->start(); 67 78 68 // Send started event 69 boost::shared_ptr<Licq::Event> started = Licq::Event::create("started"); 70 instance->getEventQueue()->push(started); 79 // Add to default queues 80 myEventManager.registerQueue(EventQueueName::allPlugins, 81 instance->getEventQueue(), 0); 82 myEventManager.registerQueue(EventQueueName::getPluginPrivate(id), 83 instance->getEventQueue(), 0); 84 85 // Notify all plugins that a new plugin has started 86 Licq::Event::Ptr started = Licq::Event::create("plugin.started"); 87 started->setProperty("id", id); 88 started->setProperty("information", info); 89 myEventManager.sendEvent(EventQueueName::allPlugins, started); 71 90 72 91 return id; 73 92 } 93 94 void LicqDaemon::PluginManagerImpl::stopAllPlugins() 95 { 96 for (Plugins::iterator plugin = myPlugins.begin(); 97 plugin != myPlugins.end(); ++plugin) 98 { 99 stopPlugin(plugin); 100 } 101 } 102 103 void LicqDaemon::PluginManagerImpl::stopPlugin(Licq::Plugin::Id id) 104 { 105 stopPlugin(getPlugin(id)); 106 } 107 108 void LicqDaemon::PluginManagerImpl::cleanupPlugin(Licq::Plugin::Id id) 109 { 110 cleanupPlugin(getPlugin(id), false); 111 } 112 113 LicqDaemon::PluginManagerImpl::Plugins::iterator 114 LicqDaemon::PluginManagerImpl::getPlugin(Licq::Plugin::Id id) 115 { 116 Plugins::iterator plugin = myPlugins.find(id); 117 if (plugin == myPlugins.end()) 118 throw Licq::InvalidArgumentException("PluginManager::getPlugin", 119 tr("No plugin instance with id %1%") % id); 120 return plugin; 121 } 122 123 void LicqDaemon::PluginManagerImpl::stopPlugin(Plugins::iterator plugin) 124 { 125 const Licq::Plugin::Id id = plugin->first; 126 PluginInstancePtr& instance = plugin->second; 127 128 // Remove from default queues 129 myEventManager.unregisterQueue(EventQueueName::allPlugins, 130 instance->getEventQueue()); 131 myEventManager.unregisterQueue(EventQueueName::getPluginPrivate(id), 132 instance->getEventQueue()); 133 134 // Send event telling plugin to stop 135 Licq::Event::Ptr stop = Licq::Event::create("plugin.stop"); 136 stop->setProperty("id", id); 137 instance->initiateStop(stop); 138 } 139 140 void LicqDaemon::PluginManagerImpl::cleanupPlugin(Plugins::iterator plugin, 141 bool force) 142 { 143 const Licq::Plugin::Id id = plugin->first; 144 PluginInstancePtr& instance = plugin->second; 145 146 // Stop plugin 147 instance->completeStop(force); 148 149 // Remove from all queues 150 myEventManager.unregisterQueue(instance->getEventQueue()); 151 152 // Notify all plugins that a plugin has stopped 153 Licq::Event::Ptr stopped = Licq::Event::create("plugin.stopped"); 154 stopped->setProperty("id", id); 155 stopped->setProperty("information", instance->getInformation()); 156 myEventManager.sendEvent(EventQueueName::allPlugins, stopped); 157 158 myPlugins.erase(plugin); 159 } -
branches/newapi/licq/src/plugin/pluginmanagerimpl.h
r5924 r6016 33 33 { 34 34 35 class EventManager; 35 36 class PluginInstance; 36 37 … … 39 40 public: 40 41 /** 42 * @param eventManager The event manager to use. 41 43 * @param cache PluginCache to use. 42 44 * @param sink LogSink that plugins should use. 43 45 */ 44 PluginManagerImpl(PluginCache& cache, Licq::LogSink& sink); 46 PluginManagerImpl(EventManager& eventManger, 47 PluginCache& cache, 48 Licq::LogSink& sink); 45 49 46 50 ~PluginManagerImpl(); 47 51 48 void getPluginInformation( 49 std::vector< boost::shared_ptr<const Licq::Plugin::Information> >* info);52 void getPluginInformation(Licq::Plugin::InformationVector* info); 53 bool isValidPluginId(Licq::Plugin::Id id) const; 50 54 51 Licq::Plugin::Id 52 loadPlugin(const std::string& filename, int argc, char** argv); 55 Licq::Plugin::Id startPlugin(const std::string& filename, 56 int argc, char** argv); 57 58 void stopAllPlugins(); 59 60 void stopPlugin(Licq::Plugin::Id id); 61 void cleanupPlugin(Licq::Plugin::Id id); 53 62 54 63 /** … … 58 67 59 68 private: 69 EventManager& myEventManager; 60 70 PluginCache& myCache; 61 71 Licq::LogSink& myPluginLogSink; 62 72 63 typedef std::map<Licq::Plugin::Id,64 boost::shared_ptr<PluginInstance>> Plugins;73 typedef boost::shared_ptr<PluginInstance> PluginInstancePtr; 74 typedef std::map<Licq::Plugin::Id, PluginInstancePtr> Plugins; 65 75 Plugins myPlugins; 76 77 Plugins::iterator getPlugin(Licq::Plugin::Id id); 78 void stopPlugin(Plugins::iterator plugin); 79 void cleanupPlugin(Plugins::iterator plugin, bool force); 66 80 }; 67 81
