Changeset 6016 for branches/newapi

Show
Ignore:
Timestamp:
01/11/08 05:30:23 (11 months ago)
Author:
erijo
Message:

Added methods to PluginManager? for handling starting and stopping of plugins.

Location:
branches/newapi/licq/src/plugin
Files:
3 modified

Legend:

Unmodified
Added
Removed
  • branches/newapi/licq/src/plugin/pluginmanager.h

    r5924 r6016  
    2424 
    2525#include <boost/noncopyable.hpp> 
    26 #include <boost/shared_ptr.hpp> 
    2726#include <vector> 
    2827 
     
    3938{ 
    4039public: 
    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; 
    4342 
    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; 
    4650 
    4751  virtual PluginCache* getPluginCache() const = 0; 
  • branches/newapi/licq/src/plugin/pluginmanagerimpl.cpp

    r5975 r6016  
    1818 */ 
    1919 
     20#include "event/eventmanager.h" 
     21#include "event/eventqueuename.h" 
    2022#include "licq/event/eventqueue.h" 
     23#include "licq/exception/invalidargumentexception.h" 
    2124#include "plugin/plugincache.h" 
    2225#include "plugin/plugininstanceimpl.h" 
    2326#include "plugin/pluginmanagerimpl.h" 
     27#include "util/tr.h" 
    2428 
    25 LicqDaemon::PluginManagerImpl::PluginManagerImpl(PluginCache& cache, 
     29LicqDaemon::PluginManagerImpl::PluginManagerImpl(EventManager& eventManager, 
     30                                                 PluginCache& cache, 
    2631                                                 Licq::LogSink& sink) 
    27   : myCache(cache), 
     32  : myEventManager(eventManager), 
     33    myCache(cache), 
    2834    myPluginLogSink(sink) 
    2935{ 
     
    3339LicqDaemon::PluginManagerImpl::~PluginManagerImpl() 
    3440{ 
    35   // Empty 
     41  // Cleanup plugins that didn't exit on their own 
     42  while (!myPlugins.empty()) 
     43    cleanupPlugin(myPlugins.begin(), true); 
    3644} 
    3745 
    38 void LicqDaemon::PluginManagerImpl::getPluginInformation( 
    39   std::vector< boost::shared_ptr<const Licq::Plugin::Information> >* info) 
     46void LicqDaemon::PluginManagerImpl:: 
     47getPluginInformation(Licq::Plugin::InformationVector* info) 
    4048{ 
    4149  assert(info != NULL); 
     
    4755} 
    4856 
     57bool LicqDaemon::PluginManagerImpl::isValidPluginId(Licq::Plugin::Id id) const 
     58{ 
     59  return (myPlugins.find(id) != myPlugins.end()); 
     60} 
     61 
    4962Licq::Plugin::Id LicqDaemon::PluginManagerImpl:: 
    50 loadPlugin(const std::string& filename, int argc, char** argv) 
     63startPlugin(const std::string& filename, int argc, char** argv) 
    5164{ 
    5265  const size_t index = myCache.getIndex(filename); 
    5366 
    54   boost::shared_ptr<const Licq::Plugin::Information> 
    55       info = myCache.getInformation(index); 
    56  
     67  Licq::Plugin::Information::Ptr info = myCache.getInformation(index); 
    5768  boost::shared_ptr<PluginLibrary> lib = myCache.getLibrary(index); 
    5869 
    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)); 
    6172 
    6273  Licq::Plugin::Id id = instance->load(argc, argv); 
     
    6475 
    6576  // Start the plugin 
    66   instance->getThread()->start(); 
     77  instance->start(); 
    6778 
    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); 
    7190 
    7291  return id; 
    7392} 
     93 
     94void LicqDaemon::PluginManagerImpl::stopAllPlugins() 
     95{ 
     96  for (Plugins::iterator plugin = myPlugins.begin(); 
     97       plugin != myPlugins.end(); ++plugin) 
     98  { 
     99    stopPlugin(plugin); 
     100  } 
     101} 
     102 
     103void LicqDaemon::PluginManagerImpl::stopPlugin(Licq::Plugin::Id id) 
     104{ 
     105  stopPlugin(getPlugin(id)); 
     106} 
     107 
     108void LicqDaemon::PluginManagerImpl::cleanupPlugin(Licq::Plugin::Id id) 
     109{ 
     110  cleanupPlugin(getPlugin(id), false); 
     111} 
     112 
     113LicqDaemon::PluginManagerImpl::Plugins::iterator 
     114LicqDaemon::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 
     123void 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 
     140void 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  
    3333{ 
    3434 
     35class EventManager; 
    3536class PluginInstance; 
    3637 
     
    3940public: 
    4041  /** 
     42   * @param eventManager The event manager to use. 
    4143   * @param cache PluginCache to use. 
    4244   * @param sink LogSink that plugins should use. 
    4345   */ 
    44   PluginManagerImpl(PluginCache& cache, Licq::LogSink& sink); 
     46  PluginManagerImpl(EventManager& eventManger, 
     47                    PluginCache& cache, 
     48                    Licq::LogSink& sink); 
    4549 
    4650  ~PluginManagerImpl(); 
    4751 
    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; 
    5054 
    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); 
    5362 
    5463  /** 
     
    5867 
    5968private: 
     69  EventManager& myEventManager; 
    6070  PluginCache& myCache; 
    6171  Licq::LogSink& myPluginLogSink; 
    6272   
    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; 
    6575  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); 
    6680}; 
    6781