summaryrefslogtreecommitdiff
path: root/cpp/src/Ice/PluginManagerI.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'cpp/src/Ice/PluginManagerI.cpp')
-rw-r--r--cpp/src/Ice/PluginManagerI.cpp46
1 files changed, 33 insertions, 13 deletions
diff --git a/cpp/src/Ice/PluginManagerI.cpp b/cpp/src/Ice/PluginManagerI.cpp
index efc205f0b9f..b2e7124e8d5 100644
--- a/cpp/src/Ice/PluginManagerI.cpp
+++ b/cpp/src/Ice/PluginManagerI.cpp
@@ -10,8 +10,8 @@
#include <Ice/PluginManagerI.h>
#include <Ice/DynamicLibrary.h>
+#include <Ice/Communicator.h>
#include <Ice/Properties.h>
-#include <Ice/Instance.h>
#include <Ice/LoggerUtil.h>
#include <Ice/Initialize.h>
#include <Ice/LocalException.h>
@@ -22,21 +22,22 @@ using namespace IceInternal;
typedef Ice::Plugin* (*PLUGIN_FACTORY)(const CommunicatorPtr&, const string&, const StringSeq&);
-Ice::PluginManagerI::PluginManagerI(const InstancePtr& instance)
- : _instance(instance)
-{
-}
-
PluginPtr
Ice::PluginManagerI::getPlugin(const string& name)
{
IceUtil::Mutex::Lock sync(*this);
+ if(!_communicator)
+ {
+ throw CommunicatorDestroyedException(__FILE__, __LINE__);
+ }
+
map<string, PluginInfo>::const_iterator r = _plugins.find(name);
if(r != _plugins.end())
{
return (*r).second.plugin;
}
+
throw PluginNotFoundException(__FILE__, __LINE__);
}
@@ -45,6 +46,11 @@ Ice::PluginManagerI::addPlugin(const string& name, const PluginPtr& plugin)
{
IceUtil::Mutex::Lock sync(*this);
+ if(!_communicator)
+ {
+ throw CommunicatorDestroyedException(__FILE__, __LINE__);
+ }
+
map<string, PluginInfo>::const_iterator r = _plugins.find(name);
if(r != _plugins.end())
{
@@ -60,18 +66,30 @@ Ice::PluginManagerI::destroy()
{
IceUtil::Mutex::Lock sync(*this);
- map<string, PluginInfo>::iterator r;
- for(r = _plugins.begin(); r != _plugins.end(); ++r)
+ if(_communicator)
{
- (*r).second.plugin->destroy();
- (*r).second.plugin = 0;
- (*r).second.library = 0;
+ map<string, PluginInfo>::iterator r;
+ for(r = _plugins.begin(); r != _plugins.end(); ++r)
+ {
+ r->second.plugin->destroy();
+ r->second.plugin = 0;
+ r->second.library = 0;
+ }
+
+ _communicator = 0;
}
}
+Ice::PluginManagerI::PluginManagerI(const CommunicatorPtr& communicator) :
+ _communicator(communicator)
+{
+}
+
void
Ice::PluginManagerI::loadPlugins(int& argc, char* argv[])
{
+ assert(_communicator);
+
StringSeq cmdArgs = argsToStringSeq(argc, argv);
//
@@ -82,7 +100,7 @@ Ice::PluginManagerI::loadPlugins(int& argc, char* argv[])
// Ice.Plugin.name=entry_point [args]
//
const string prefix = "Ice.Plugin.";
- PropertiesPtr properties = _instance->properties();
+ PropertiesPtr properties = _communicator->getProperties();
PropertyDict plugins = properties->getPropertiesForPrefix(prefix);
PropertyDict::const_iterator p;
for(p = plugins.begin(); p != plugins.end(); ++p)
@@ -137,6 +155,8 @@ Ice::PluginManagerI::loadPlugins(int& argc, char* argv[])
void
Ice::PluginManagerI::loadPlugin(const string& name, const string& entryPoint, const StringSeq& args)
{
+ assert(_communicator);
+
//
// Load the entry point symbol.
//
@@ -163,7 +183,7 @@ Ice::PluginManagerI::loadPlugin(const string& name, const string& entryPoint, co
PLUGIN_FACTORY factory = (PLUGIN_FACTORY)sym;
try
{
- info.plugin = factory(_instance->communicator(), name, args);
+ info.plugin = factory(_communicator, name, args);
}
catch(const Exception& ex)
{