summaryrefslogtreecommitdiff
path: root/cpp/demo/Ice/session/Client.cpp
diff options
context:
space:
mode:
authorMatthew Newhook <matthew@zeroc.com>2005-04-13 08:48:35 +0000
committerMatthew Newhook <matthew@zeroc.com>2005-04-13 08:48:35 +0000
commitd4ed5d38a15c1ad0fdd93e7af23ecedaf5315f7c (patch)
treeb709522dc8c2bb51fb54574c9726a0533b6cb877 /cpp/demo/Ice/session/Client.cpp
parentFixed race condition in Thread_opVoid class. (diff)
downloadice-d4ed5d38a15c1ad0fdd93e7af23ecedaf5315f7c.tar.bz2
ice-d4ed5d38a15c1ad0fdd93e7af23ecedaf5315f7c.tar.xz
ice-d4ed5d38a15c1ad0fdd93e7af23ecedaf5315f7c.zip
added session demo.
Diffstat (limited to 'cpp/demo/Ice/session/Client.cpp')
-rwxr-xr-xcpp/demo/Ice/session/Client.cpp211
1 files changed, 211 insertions, 0 deletions
diff --git a/cpp/demo/Ice/session/Client.cpp b/cpp/demo/Ice/session/Client.cpp
new file mode 100755
index 00000000000..3283d55c1f7
--- /dev/null
+++ b/cpp/demo/Ice/session/Client.cpp
@@ -0,0 +1,211 @@
+// **********************************************************************
+//
+// Copyright (c) 2003-2005 ZeroC, Inc. All rights reserved.
+//
+// This copy of Ice is licensed to you under the terms described in the
+// ICE_LICENSE file included in this distribution.
+//
+// **********************************************************************
+
+#include <Ice/Ice.h>
+#include <IceUtil/Thread.h>
+#include <HelloSession.h>
+
+using namespace std;
+using namespace Demo;
+
+//
+// This thread pings the session object with the given timeout frequency.
+//
+class SessionRefreshThread : public IceUtil::Thread, public IceUtil::Monitor<IceUtil::Mutex>
+{
+public:
+
+ SessionRefreshThread(const Ice::LoggerPtr& logger, const SessionPrx& session,
+ const IceUtil::Time& timeout) :
+ _logger(logger),
+ _session(session),
+ _destroy(false),
+ _timeout(timeout)
+ {
+ }
+
+ virtual void
+ run()
+ {
+ Lock sync(*this);
+ while(!_destroy)
+ {
+ timedWait(_timeout);
+ if(_destroy)
+ {
+ break;
+ }
+ //
+ // If the refresh fails we're done.
+ //
+ try
+ {
+ _session->refresh();
+ }
+ catch(const Ice::Exception& ex)
+ {
+ Ice::Warning warn(_logger);
+ warn << "SessionRefreshThread: " << ex;
+ break;
+ }
+ }
+ }
+
+ void
+ destroy()
+ {
+ Lock sync(*this);
+ _destroy = true;
+ notify();
+ }
+
+private:
+
+ const Ice::LoggerPtr _logger;
+ const SessionPrx _session;
+ bool _destroy;
+ const IceUtil::Time _timeout;
+};
+typedef IceUtil::Handle<SessionRefreshThread> SessionRefreshThreadPtr;
+
+void
+menu()
+{
+ cout <<
+ "usage:\n"
+ "h: send greeting\n"
+ "s: shutdown server\n"
+ "x: exit\n"
+ "?: help\n";
+}
+
+int
+run(int argc, char* argv[], const Ice::CommunicatorPtr& communicator)
+{
+ Ice::PropertiesPtr properties = communicator->getProperties();
+ const char* proxyProperty = "SessionManager.Proxy";
+ string proxy = properties->getProperty(proxyProperty);
+ if(proxy.empty())
+ {
+ cerr << argv[0] << ": property `" << proxyProperty << "' not set" << endl;
+ return EXIT_FAILURE;
+ }
+
+ //
+ // Get the session manager object, and create a session.
+ //
+ Ice::ObjectPrx base = communicator->stringToProxy(proxy);
+ SessionManagerPrx manager = SessionManagerPrx::checkedCast(base);
+ if(!manager)
+ {
+ cerr << argv[0] << ": invalid proxy" << endl;
+ return EXIT_FAILURE;
+ }
+
+ HelloSessionPrx hello = HelloSessionPrx::uncheckedCast(manager->create());
+ if(!hello)
+ {
+ cerr << argv[0] << ": invalid proxy" << endl;
+ return EXIT_FAILURE;
+ }
+
+ //
+ // Create a thread to ping the object at regular intervals.
+ //
+ SessionRefreshThreadPtr refresh = new SessionRefreshThread(
+ communicator->getLogger(), hello, IceUtil::Time::seconds(5));
+ refresh->start();
+
+ menu();
+
+ try
+ {
+ do
+ {
+ cout << "==> ";
+ char c;
+ cin >> c;
+ if(c == 'h')
+ {
+ hello->sayHello();
+ }
+ else if(c == 's')
+ {
+ manager->shutdown();
+ }
+ else if(c == 'x')
+ {
+ break;
+ }
+ else if(c == '?')
+ {
+ menu();
+ }
+ else
+ {
+ cout << "unknown command `" << c << "'" << endl;
+ menu();
+ }
+ }
+ while(cin.good());
+
+ //
+ // Destroy the session before we finish.
+ //
+ hello->destroy();
+ }
+ catch(const Ice::Exception& ex)
+ {
+ cerr << ex << endl;
+ }
+
+ //
+ // Destroy the ping thread, and join with it to ensure that it
+ // actually completes.
+ //
+ refresh->destroy();
+ refresh->getThreadControl().join();
+
+ return EXIT_SUCCESS;
+}
+
+int
+main(int argc, char* argv[])
+{
+ int status;
+ Ice::CommunicatorPtr communicator;
+
+ try
+ {
+ Ice::PropertiesPtr properties = Ice::createProperties();
+ properties->load("config");
+ communicator = Ice::initializeWithProperties(argc, argv, properties);
+ status = run(argc, argv, communicator);
+ }
+ catch(const Ice::Exception& ex)
+ {
+ cerr << ex << endl;
+ status = EXIT_FAILURE;
+ }
+
+ if(communicator)
+ {
+ try
+ {
+ communicator->destroy();
+ }
+ catch(const Ice::Exception& ex)
+ {
+ cerr << ex << endl;
+ status = EXIT_FAILURE;
+ }
+ }
+
+ return status;
+}