diff options
Diffstat (limited to 'cpp/src')
-rw-r--r-- | cpp/src/Glacier2/Glacier2Router.cpp | 2 | ||||
-rw-r--r-- | cpp/src/Glacier2/RouterI.cpp | 19 | ||||
-rw-r--r-- | cpp/src/Glacier2/RouterI.h | 6 | ||||
-rw-r--r-- | cpp/src/Glacier2/SessionRouterI.cpp | 48 | ||||
-rw-r--r-- | cpp/src/Glacier2/SessionRouterI.h | 7 | ||||
-rw-r--r-- | cpp/src/IceGrid/SessionManagerI.cpp | 2 | ||||
-rw-r--r-- | cpp/src/IceGrid/SessionManagerI.h | 2 | ||||
-rw-r--r-- | cpp/src/slice2cppe/Gen.cpp | 11 | ||||
-rw-r--r-- | cpp/src/slice2cppe/Gen.h | 4 | ||||
-rw-r--r-- | cpp/src/slice2cppe/Main.cpp | 2 |
10 files changed, 86 insertions, 17 deletions
diff --git a/cpp/src/Glacier2/Glacier2Router.cpp b/cpp/src/Glacier2/Glacier2Router.cpp index ccc73487add..5f9676f1cbe 100644 --- a/cpp/src/Glacier2/Glacier2Router.cpp +++ b/cpp/src/Glacier2/Glacier2Router.cpp @@ -223,7 +223,7 @@ Glacier2::RouterService::start(int argc, char* argv[]) // and all required servant locators, so no registration has to be // done here. // - _sessionRouter = new SessionRouterI(clientAdapter, serverAdapter, verifier, sessionManager); + _sessionRouter = new SessionRouterI(clientAdapter, serverAdapter, adminAdapter, verifier, sessionManager); // // If we have an admin adapter, we add an admin object. diff --git a/cpp/src/Glacier2/RouterI.cpp b/cpp/src/Glacier2/RouterI.cpp index 4e1b7a51744..6dbd435c282 100644 --- a/cpp/src/Glacier2/RouterI.cpp +++ b/cpp/src/Glacier2/RouterI.cpp @@ -17,13 +17,16 @@ using namespace Ice; using namespace Glacier2; Glacier2::RouterI::RouterI(const ObjectAdapterPtr& clientAdapter, const ObjectAdapterPtr& serverAdapter, - const ConnectionPtr& connection, const string& userId, const SessionPrx& session) : + const ObjectAdapterPtr& adminAdapter, const ConnectionPtr& connection, + const string& userId, const SessionPrx& session, const Identity& controlId) : _communicator(clientAdapter->getCommunicator()), _routingTable(new RoutingTable(_communicator)), _clientProxy(clientAdapter->createProxy(stringToIdentity("dummy"))), + _adminAdapter(adminAdapter), _connection(connection), _userId(userId), _session(session), + _controlId(controlId), _timestamp(IceUtil::Time::now()), _destroy(false) { @@ -103,6 +106,20 @@ Glacier2::RouterI::destroy() if(_session) { + if(_adminAdapter) + { + // + // Remove the session control object. + // + try + { + _adminAdapter->remove(_controlId); + } + catch(const NotRegisteredException&) + { + } + } + // // This can raise an exception, therefore it must be the last // statement in this destroy() function. diff --git a/cpp/src/Glacier2/RouterI.h b/cpp/src/Glacier2/RouterI.h index 4240e808d61..1ab1ea50000 100644 --- a/cpp/src/Glacier2/RouterI.h +++ b/cpp/src/Glacier2/RouterI.h @@ -26,8 +26,8 @@ class RouterI : public Router, public IceUtil::Mutex { public: - RouterI(const Ice::ObjectAdapterPtr&, const Ice::ObjectAdapterPtr&, const Ice::ConnectionPtr&, - const std::string&, const SessionPrx&); + RouterI(const Ice::ObjectAdapterPtr&, const Ice::ObjectAdapterPtr&, const Ice::ObjectAdapterPtr&, + const Ice::ConnectionPtr&, const std::string&, const SessionPrx&, const Ice::Identity&); virtual ~RouterI(); void destroy(); @@ -56,9 +56,11 @@ private: const Ice::ObjectPrx _serverProxy; const ClientBlobjectPtr _clientBlobject; const ServerBlobjectPtr _serverBlobject; + const Ice::ObjectAdapterPtr _adminAdapter; const Ice::ConnectionPtr _connection; const std::string _userId; const SessionPrx _session; + const Ice::Identity _controlId; mutable IceUtil::Time _timestamp; bool _destroy; }; diff --git a/cpp/src/Glacier2/SessionRouterI.cpp b/cpp/src/Glacier2/SessionRouterI.cpp index 6efbd9d5b67..87ff6b86426 100644 --- a/cpp/src/Glacier2/SessionRouterI.cpp +++ b/cpp/src/Glacier2/SessionRouterI.cpp @@ -18,6 +18,28 @@ using namespace std; using namespace Ice; using namespace Glacier2; +class SessionControlI : public SessionControl +{ +public: + + SessionControlI(const SessionRouterIPtr& sessionRouter, const ConnectionPtr& connection) : + _sessionRouter(sessionRouter), + _connection(connection) + { + } + + virtual void + destroy(const Current&) + { + _sessionRouter->destroySession(_connection); + } + +private: + + SessionRouterIPtr _sessionRouter; + ConnectionPtr _connection; +}; + class ClientLocator : public ServantLocator { public: @@ -80,6 +102,7 @@ private: Glacier2::SessionRouterI::SessionRouterI(const ObjectAdapterPtr& clientAdapter, const ObjectAdapterPtr& serverAdapter, + const ObjectAdapterPtr& adminAdapter, const PermissionsVerifierPrx& verifier, const SessionManagerPrx& sessionManager) : _properties(clientAdapter->getCommunicator()->getProperties()), @@ -88,6 +111,7 @@ Glacier2::SessionRouterI::SessionRouterI(const ObjectAdapterPtr& clientAdapter, _rejectTraceLevel(_properties->getPropertyAsInt("Glacier2.Client.Trace.Reject")), _clientAdapter(clientAdapter), _serverAdapter(serverAdapter), + _adminAdapter(adminAdapter), _verifier(verifier), _sessionManager(sessionManager), _sessionTimeout(IceUtil::Time::seconds(_properties->getPropertyAsInt("Glacier2.SessionTimeout"))), @@ -362,6 +386,7 @@ Glacier2::SessionRouterI::createSession(const std::string& userId, const std::st SessionPrx session; + Identity controlId; RouterIPtr router; try @@ -372,13 +397,20 @@ Glacier2::SessionRouterI::createSession(const std::string& userId, const std::st // if(_sessionManager) { - session = _sessionManager->create(userId, current.ctx); + SessionControlPrx control; + if(_adminAdapter) + { + control = SessionControlPrx::uncheckedCast(_adminAdapter->addWithUUID( + new SessionControlI(this, current.con))); + controlId = control->ice_getIdentity(); + } + session = _sessionManager->create(userId, control, current.ctx); } // // Add a new per-client router. // - router = new RouterI(_clientAdapter, _serverAdapter, current.con, userId, session); + router = new RouterI(_clientAdapter, _serverAdapter, _adminAdapter, current.con, userId, session, controlId); } catch(const Exception& ex) { @@ -461,6 +493,12 @@ Glacier2::SessionRouterI::createSession(const std::string& userId, const std::st void Glacier2::SessionRouterI::destroySession(const Current& current) { + destroySession(current.con); +} + +void +Glacier2::SessionRouterI::destroySession(const ConnectionPtr& connection) +{ RouterIPtr router; { @@ -468,19 +506,19 @@ Glacier2::SessionRouterI::destroySession(const Current& current) if(_destroy) { - current.con->close(true); + connection->close(true); throw ObjectNotExistException(__FILE__, __LINE__); } map<ConnectionPtr, RouterIPtr>::iterator p; - if(_routersByConnectionHint != _routersByConnection.end() && _routersByConnectionHint->first == current.con) + if(_routersByConnectionHint != _routersByConnection.end() && _routersByConnectionHint->first == connection) { p = _routersByConnectionHint; } else { - p = _routersByConnection.find(current.con); + p = _routersByConnection.find(connection); } if(p == _routersByConnection.end()) diff --git a/cpp/src/Glacier2/SessionRouterI.h b/cpp/src/Glacier2/SessionRouterI.h index f186083d3c2..03e5115b581 100644 --- a/cpp/src/Glacier2/SessionRouterI.h +++ b/cpp/src/Glacier2/SessionRouterI.h @@ -31,7 +31,7 @@ class SessionRouterI : public Router, public IceUtil::Monitor<IceUtil::Mutex> { public: - SessionRouterI(const Ice::ObjectAdapterPtr&, const Ice::ObjectAdapterPtr&, + SessionRouterI(const Ice::ObjectAdapterPtr&, const Ice::ObjectAdapterPtr&, const Ice::ObjectAdapterPtr&, const PermissionsVerifierPrx&, const SessionManagerPrx&); virtual ~SessionRouterI(); void destroy(); @@ -46,9 +46,11 @@ public: RouterIPtr getRouter(const Ice::ConnectionPtr&, const Ice::Identity&) const; RouterIPtr getRouter(const std::string&) const; - + void expireSessions(); + void destroySession(const ::Ice::ConnectionPtr&); + private: const Ice::PropertiesPtr _properties; @@ -57,6 +59,7 @@ private: const int _rejectTraceLevel; const Ice::ObjectAdapterPtr _clientAdapter; const Ice::ObjectAdapterPtr _serverAdapter; + const Ice::ObjectAdapterPtr _adminAdapter; const PermissionsVerifierPrx _verifier; /*const*/ SessionManagerPrx _sessionManager; const IceUtil::Time _sessionTimeout; diff --git a/cpp/src/IceGrid/SessionManagerI.cpp b/cpp/src/IceGrid/SessionManagerI.cpp index 03f14f2129b..7a77844438e 100644 --- a/cpp/src/IceGrid/SessionManagerI.cpp +++ b/cpp/src/IceGrid/SessionManagerI.cpp @@ -31,7 +31,7 @@ SessionManagerI::SessionManagerI(RegistryObserverTopic& regTopic, } Glacier2::SessionPrx -SessionManagerI::create(const string& userId, const Ice::Current& current) +SessionManagerI::create(const string& userId, const Glacier2::SessionControlPrx&, const Ice::Current& current) { SessionIPtr session = new Glacier2ObserverSessionI(userId, _database, _registryObserverTopic, _nodeObserverTopic, _sessionTimeout); diff --git a/cpp/src/IceGrid/SessionManagerI.h b/cpp/src/IceGrid/SessionManagerI.h index bf42a18de57..122fe0ca33f 100644 --- a/cpp/src/IceGrid/SessionManagerI.h +++ b/cpp/src/IceGrid/SessionManagerI.h @@ -33,7 +33,7 @@ public: SessionManagerI(RegistryObserverTopic&, NodeObserverTopic&, const DatabasePtr&, const ReapThreadPtr&, int); - virtual Glacier2::SessionPrx create(const std::string&, const Ice::Current&); + virtual Glacier2::SessionPrx create(const std::string&, const Glacier2::SessionControlPrx&, const Ice::Current&); virtual SessionPrx createLocalSession(const std::string&, const Ice::Current&); private: diff --git a/cpp/src/slice2cppe/Gen.cpp b/cpp/src/slice2cppe/Gen.cpp index 0c3bda566a8..38c9dee2872 100644 --- a/cpp/src/slice2cppe/Gen.cpp +++ b/cpp/src/slice2cppe/Gen.cpp @@ -43,7 +43,8 @@ getIds(const ClassDefPtr& p, StringList& ids) Slice::Gen::Gen(const string& name, const string& base, const string& headerExtension, const string& sourceExtension, const vector<string>& extraHeaders, const string& include, - const vector<string>& includePaths, const string& dllExport, const string& dir, bool imp) : + const vector<string>& includePaths, const string& dllExport, const string& dir, bool imp, + bool ice) : _base(base), _headerExtension(headerExtension), _sourceExtension(sourceExtension), @@ -51,7 +52,8 @@ Slice::Gen::Gen(const string& name, const string& base, const string& headerExte _include(include), _includePaths(includePaths), _dllExport(dllExport), - _impl(imp) + _impl(imp), + _ice(ice) { for(vector<string>::iterator p = _includePaths.begin(); p != _includePaths.end(); ++p) { @@ -250,6 +252,11 @@ Slice::Gen::generate(const UnitPtr& p) H << "\n#include <IceE/UndefSysMacros.h>"; + if(_ice) + { + C << "\n#include <IceE/DisableWarnings.h>"; + } + GlobalIncludeVisitor globalIncludeVisitor(H); p->visit(&globalIncludeVisitor, false); diff --git a/cpp/src/slice2cppe/Gen.h b/cpp/src/slice2cppe/Gen.h index 9be5619bfe5..da1c03cae8a 100644 --- a/cpp/src/slice2cppe/Gen.h +++ b/cpp/src/slice2cppe/Gen.h @@ -35,7 +35,8 @@ public: const std::vector<std::string>&, const std::string&, const std::string&, - bool); + bool, + bool); ~Gen(); bool operator!() const; // Returns true if there was a constructor error @@ -62,6 +63,7 @@ private: std::vector<std::string> _includePaths; std::string _dllExport; bool _impl; + bool _ice; class GlobalIncludeVisitor : private ::IceUtil::noncopyable, public ParserVisitor { diff --git a/cpp/src/slice2cppe/Main.cpp b/cpp/src/slice2cppe/Main.cpp index 7457f79f670..c9261337313 100644 --- a/cpp/src/slice2cppe/Main.cpp +++ b/cpp/src/slice2cppe/Main.cpp @@ -204,7 +204,7 @@ main(int argc, char* argv[]) else { Gen gen(argv[0], icecpp.getBaseName(), headerExtension, sourceExtension, extraHeaders, include, - includePaths, dllExport, output, impl); + includePaths, dllExport, output, impl, ice); if(!gen) { u->destroy(); |