diff options
author | Benoit Foucher <benoit@zeroc.com> | 2002-08-22 22:52:31 +0000 |
---|---|---|
committer | Benoit Foucher <benoit@zeroc.com> | 2002-08-22 22:52:31 +0000 |
commit | 8ee8c08018e63d5b5b6c505490e27dcb3ef766db (patch) | |
tree | 4f888dacbe96952a910eb969a5428aba67030e7b /cpp/src/IcePack/ServerRegistryI.cpp | |
parent | bug fix for identity reuse in add() (diff) | |
download | ice-8ee8c08018e63d5b5b6c505490e27dcb3ef766db.tar.bz2 ice-8ee8c08018e63d5b5b6c505490e27dcb3ef766db.tar.xz ice-8ee8c08018e63d5b5b6c505490e27dcb3ef766db.zip |
Added support for IcePack node and re-factored many things in IcePack.
Diffstat (limited to 'cpp/src/IcePack/ServerRegistryI.cpp')
-rw-r--r-- | cpp/src/IcePack/ServerRegistryI.cpp | 112 |
1 files changed, 112 insertions, 0 deletions
diff --git a/cpp/src/IcePack/ServerRegistryI.cpp b/cpp/src/IcePack/ServerRegistryI.cpp new file mode 100644 index 00000000000..03745c813a1 --- /dev/null +++ b/cpp/src/IcePack/ServerRegistryI.cpp @@ -0,0 +1,112 @@ +// ********************************************************************** +// +// Copyright (c) 2001 +// Mutable Realms, Inc. +// Huntsville, AL, USA +// +// All Rights Reserved +// +// ********************************************************************** + +#include <IcePack/ServerRegistryI.h> +#include <IcePack/TraceLevels.h> + +using namespace std; +using namespace IcePack; + +IcePack::ServerRegistryI::ServerRegistryI(const Freeze::DBPtr& db, const TraceLevelsPtr& traceLevels) : + _dict(db), + _traceLevels(traceLevels) +{ +} + +void +IcePack::ServerRegistryI::add(const string& name, const ServerPrx& server, const Ice::Current&) +{ + StringObjectProxyDict::iterator p = _dict.find(name); + if(p != _dict.end()) + { + try + { + p->second->ice_ping(); + } + catch(const Ice::ObjectNotExistException&) + { + p.set(server); + + if(_traceLevels->serverRegistry > 0) + { + Ice::Trace out(_traceLevels->logger, _traceLevels->serverRegistryCat); + out << "added server `" << name << "'"; + } + + return; + } + catch(const Ice::LocalException&) + { + } + throw ServerExistsException(); + } + + _dict.insert(make_pair(name, server)); + + if(_traceLevels->serverRegistry > 0) + { + Ice::Trace out(_traceLevels->logger, _traceLevels->serverRegistryCat); + out << "added server `" << name << "'"; + } +} + +void +IcePack::ServerRegistryI::remove(const string& name, const Ice::Current&) +{ + StringObjectProxyDict::iterator p = _dict.find(name); + if(p == _dict.end()) + { + throw ServerNotExistException(); + } + + _dict.erase(p); + + if(_traceLevels->serverRegistry > 0) + { + Ice::Trace out(_traceLevels->logger, _traceLevels->serverRegistryCat); + out << "removed server `" << name << "'"; + } +} + +ServerPrx +IcePack::ServerRegistryI::findByName(const string& name, const Ice::Current&) +{ + StringObjectProxyDict::iterator p = _dict.find(name); + if(p != _dict.end()) + { + try + { + return ServerPrx::checkedCast(p->second); + } + catch(const Ice::ObjectNotExistException&) + { + _dict.erase(p); + } + catch(const Ice::LocalException&) + { + return ServerPrx::uncheckedCast(p->second); + } + } + throw ServerNotExistException(); +} + +Ice::StringSeq +IcePack::ServerRegistryI::getAll(const Ice::Current&) const +{ + Ice::StringSeq names; + names.reserve(_dict.size()); + + for(StringObjectProxyDict::const_iterator p = _dict.begin(); p != _dict.end(); ++p) + { + names.push_back(p->first); + } + + return names; +} |