diff options
Diffstat (limited to 'cs/demo/Ice/session/Client.cs')
-rwxr-xr-x | cs/demo/Ice/session/Client.cs | 209 |
1 files changed, 207 insertions, 2 deletions
diff --git a/cs/demo/Ice/session/Client.cs b/cs/demo/Ice/session/Client.cs index 9b0ae6b6902..ad89fe1c5dc 100755 --- a/cs/demo/Ice/session/Client.cs +++ b/cs/demo/Ice/session/Client.cs @@ -7,11 +7,216 @@ // // ********************************************************************** -public class Client +using System; +using System.Threading; +using System.Collections; +using Demo; + +public class Client : Ice.Application { + class SessionRefreshThread + { + public SessionRefreshThread(Ice.Logger logger, int timeout, SessionPrx session) + { + _logger = logger; + _session = session; + _timeout = timeout; + _terminated = false; + } + + public void run() + { + lock(this) + { + while(!_terminated) + { + System.Threading.Monitor.Wait(this, _timeout); + if(!_terminated) + { + try + { + _session.refresh(); + } + catch(Ice.Exception ex) + { + _logger.warning("SessionRefreshThread: " + ex); + _terminated = true; + } + } + } + } + } + + public void terminate() + { + lock(this) + { + _terminated = true; + System.Threading.Monitor.Pulse(this); + } + } + + private Ice.Logger _logger; + private SessionPrx _session; + private int _timeout; + private bool _terminated; + }; + + public override int run(string[] args) + { + string name; + do + { + Console.Out.Write("Please enter your name ==> "); + Console.Out.Flush(); + + name = Console.In.ReadLine(); + if(name == null) + { + return 1; + } + name = name.Trim(); + } + while(name.Length == 0); + + Ice.Properties properties = communicator().getProperties(); + string proxyProperty = "SessionFactory.Proxy"; + string proxy = properties.getProperty(proxyProperty); + if(proxy.Length == 0) + { + Console.Error.WriteLine("property `" + proxyProperty + "' not set"); + return 1; + } + + Ice.ObjectPrx basePrx = communicator().stringToProxy(proxy); + SessionFactoryPrx factory = SessionFactoryPrxHelper.checkedCast(basePrx); + if(factory == null) + { + Console.Error.WriteLine("invalid proxy"); + return 1; + } + + SessionPrx session = factory.create(name); + + SessionRefreshThread refresh = new SessionRefreshThread(communicator().getLogger(), 5000, session); + Thread refreshThread = new Thread(new ThreadStart(refresh.run)); + refreshThread.Start(); + + ArrayList hellos = new ArrayList(); + + menu(); + + try + { + bool destroy = true; + bool shutdown = false; + while(true) + { + Console.Out.Write("==> "); + Console.Out.Flush(); + string line = Console.In.ReadLine(); + if(line == null) + { + break; + } + if(line.Length > 0 && Char.IsDigit(line[0])) + { + int index = Int32.Parse(line); + if(index < hellos.Count) + { + HelloPrx hello = (HelloPrx)hellos[index]; + hello.sayHello(); + } + else + { + Console.Out.WriteLine("Index is too high. " + hellos.Count + + " hello objects exist so far.\n" + + "Use `c' to create a new hello object."); + } + } + else if(line.Equals("c")) + { + hellos.Add(session.createHello()); + Console.Out.WriteLine("Created hello object " + (hellos.Count - 1)); + } + else if(line.Equals("s")) + { + destroy = false; + shutdown = true; + break; + } + else if(line.Equals("x")) + { + break; + } + else if(line.Equals("t")) + { + destroy = false; + break; + } + else if(line.Equals("?")) + { + menu(); + } + else + { + Console.Out.WriteLine("Unknown command `" + line + "'."); + menu(); + } + } + + // + // The refresher thread must be terminated before destroy is + // called, otherwise it might get ObjectNotExistException. refresh + // is set to 0 so that if session.destroy() raises an exception + // the thread will not be re-terminated and re-joined. + // + refresh.terminate(); + refreshThread.Join(); + refresh = null; + + if(destroy) + { + session.destroy(); + } + if(shutdown) + { + factory.shutdown(); + } + } + catch(System.Exception) + { + // + // The refresher thread must be terminated in the event of a + // failure. + // + if(refresh != null) + { + refresh.terminate(); + refreshThread.Join(); + refresh = null; + } + throw; + } + + return 0; + } + + private static void menu() + { + Console.Out.WriteLine( + "usage:\n" + + "c: create a new per-client hello object\n" + + "0-9: send a greeting to a hello object\n" + + "s: shutdown the server and exit\n" + + "x: exit\n" + + "t: exit without destroying the session\n" + + "?: help\n"); + } + public static void Main(string[] args) { - SessionClient app = new SessionClient(); + Client app = new Client(); int status = app.main(args, "config"); System.Environment.Exit(status); } |