summaryrefslogtreecommitdiff
path: root/cpp/src
diff options
context:
space:
mode:
authorDwayne Boone <dwayne@zeroc.com>2006-04-19 14:54:28 +0000
committerDwayne Boone <dwayne@zeroc.com>2006-04-19 14:54:28 +0000
commit90283288bc4d4fe6aa0a7ecbc4caa262c5c46a9e (patch)
tree3399cf11248ce48b992dd63a264568129c420054 /cpp/src
parentfix for assertion failure on FC5 (diff)
downloadice-90283288bc4d4fe6aa0a7ecbc4caa262c5c46a9e.tar.bz2
ice-90283288bc4d4fe6aa0a7ecbc4caa262c5c46a9e.tar.xz
ice-90283288bc4d4fe6aa0a7ecbc4caa262c5c46a9e.zip
Added method to detroy session from backend
Diffstat (limited to 'cpp/src')
-rw-r--r--cpp/src/Glacier2/Glacier2Router.cpp2
-rw-r--r--cpp/src/Glacier2/RouterI.cpp19
-rw-r--r--cpp/src/Glacier2/RouterI.h6
-rw-r--r--cpp/src/Glacier2/SessionRouterI.cpp48
-rw-r--r--cpp/src/Glacier2/SessionRouterI.h7
-rw-r--r--cpp/src/IceGrid/SessionManagerI.cpp2
-rw-r--r--cpp/src/IceGrid/SessionManagerI.h2
-rw-r--r--cpp/src/slice2cppe/Gen.cpp11
-rw-r--r--cpp/src/slice2cppe/Gen.h4
-rw-r--r--cpp/src/slice2cppe/Main.cpp2
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();