summaryrefslogtreecommitdiff
path: root/cpp/demo/Ice/value/Client.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'cpp/demo/Ice/value/Client.cpp')
-rw-r--r--cpp/demo/Ice/value/Client.cpp191
1 files changed, 191 insertions, 0 deletions
diff --git a/cpp/demo/Ice/value/Client.cpp b/cpp/demo/Ice/value/Client.cpp
new file mode 100644
index 00000000000..99848567055
--- /dev/null
+++ b/cpp/demo/Ice/value/Client.cpp
@@ -0,0 +1,191 @@
+// **********************************************************************
+//
+// Copyright (c) 2003-2011 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 <Value.h>
+#include <ObjectFactory.h>
+
+using namespace std;
+using namespace Demo;
+
+class ValueClient : public Ice::Application
+{
+public:
+
+ ValueClient();
+ virtual int run(int, char*[]);
+};
+
+int
+main(int argc, char* argv[])
+{
+ ValueClient app;
+ return app.main(argc, argv, "config.client");
+}
+
+ValueClient::ValueClient() :
+ //
+ // Since this is an interactive demo we don't want any signal
+ // handling.
+ //
+ Ice::Application(Ice::NoSignalHandling)
+{
+}
+
+int
+ValueClient::run(int argc, char* argv[])
+{
+ if(argc > 1)
+ {
+ cerr << appName() << ": too many arguments" << endl;
+ return EXIT_FAILURE;
+ }
+
+ InitialPrx initial = InitialPrx::checkedCast(communicator()->propertyToProxy("Initial.Proxy"));
+ if(!initial)
+ {
+ cerr << argv[0] << ": invalid object reference" << endl;
+ return EXIT_FAILURE;
+ }
+
+ char c[2];
+
+ cout << '\n'
+ << "Let's first transfer a simple object, for a class without\n"
+ << "operations, and print its contents. No factory is required\n"
+ << "for this.\n"
+ << "[press enter]\n";
+ cin.getline(c, 2);
+
+ SimplePtr simple = initial->getSimple();
+ cout << "==> " << simple->message << endl;
+
+ cout << '\n'
+ << "Yes, this worked. Now let's try to transfer an object for a class\n"
+ << "with operations as type ::Demo::Printer, without installing a factory first.\n"
+ << "This should give us a `no factory' exception.\n"
+ << "[press enter]\n";
+ cin.getline(c, 2);
+
+ PrinterPtr printer;
+ PrinterPrx printerProxy;
+ try
+ {
+ initial->getPrinter(printer, printerProxy);
+ cerr << argv[0] << "Did not get the expected NoObjectFactoryException!" << endl;
+ exit(EXIT_FAILURE);
+ }
+ catch(const Ice::NoObjectFactoryException& ex)
+ {
+ cout << "==> " << ex << endl;
+ }
+
+ cout << '\n'
+ << "Yep, that's what we expected. Now let's try again, but with\n"
+ << "installing an appropriate factory first. If successful, we print\n"
+ << "the object's content.\n"
+ << "[press enter]\n";
+ cin.getline(c, 2);
+
+ Ice::ObjectFactoryPtr factory = new ObjectFactory;
+ communicator()->addObjectFactory(factory, Demo::Printer::ice_staticId());
+
+ initial->getPrinter(printer, printerProxy);
+ cout << "==> " << printer->message << endl;
+
+ cout << '\n'
+ << "Cool, it worked! Let's try calling the printBackwards() method\n"
+ << "on the object we just received locally.\n"
+ << "[press enter]\n";
+ cin.getline(c, 2);
+
+ cout << "==> ";
+ printer->printBackwards();
+
+ cout << '\n'
+ << "Now we call the same method, but on the remote object. Watch the\n"
+ << "server's output.\n"
+ << "[press enter]\n";
+ cin.getline(c, 2);
+
+ printerProxy->printBackwards();
+
+ cout << '\n'
+ << "Next, we transfer a derived object from the server as a base\n"
+ << "object. Since we haven't yet installed a factory for the derived\n"
+ << "class, the derived class (::Demo::DerivedPrinter) is sliced\n"
+ << "to its base class (::Demo::Printer).\n"
+ << "[press enter]\n";
+ cin.getline(c, 2);
+
+ PrinterPtr derivedAsBase;
+ derivedAsBase = initial->getDerivedPrinter();
+ cout << "==> The type ID of the received object is \"" << derivedAsBase->ice_id() << "\"" << endl;
+ assert(derivedAsBase->ice_id() == Demo::Printer::ice_staticId());
+
+ cout << '\n'
+ << "Now we install a factory for the derived class, and try again.\n"
+ << "Because we receive the derived object as a base object, we\n"
+ << "we need to do a dynamic_cast<> to get from the base to the derived object.\n"
+ << "[press enter]\n";
+ cin.getline(c, 2);
+
+ communicator()->addObjectFactory(factory, Demo::DerivedPrinter::ice_staticId());
+
+ derivedAsBase = initial->getDerivedPrinter();
+ DerivedPrinterPtr derived = DerivedPrinterPtr::dynamicCast(derivedAsBase);
+ assert(derived);
+ cout << "==> dynamic_cast<> to derived object succeded" << endl;
+ cout << "==> The type ID of the received object is \"" << derived->ice_id() << "\"" << endl;
+
+ cout << '\n'
+ << "Let's print the message contained in the derived object, and\n"
+ << "call the operation printUppercase() on the derived object\n"
+ << "locally.\n"
+ << "[press enter]\n";
+ cin.getline(c, 2);
+
+ cout << "==> " << derived->derivedMessage << endl;
+ cout << "==> ";
+ derived->printUppercase();
+
+ cout << '\n'
+ << "Finally, we try the same again, but instead of returning the\n"
+ << "derived object, we throw an exception containing the derived\n"
+ << "object.\n"
+ << "[press enter]\n";
+ cin.getline(c, 2);
+
+ try
+ {
+ initial->throwDerivedPrinter();
+ cerr << argv[0] << ": Did not get the expected DerivedPrinterException!" << endl;
+ exit(EXIT_FAILURE);
+ }
+ catch(const DerivedPrinterException& ex)
+ {
+ derived = ex.derived;
+ if(!derived)
+ {
+ cerr << argv[0] << "Unexpected null pointer for `derived'" << endl;
+ exit(EXIT_FAILURE);
+ }
+ }
+
+ cout << "==> " << derived->derivedMessage << endl;
+ cout << "==> ";
+ derived->printUppercase();
+
+ cout << '\n'
+ << "That's it for this demo. Have fun with Ice!\n";
+
+ initial->shutdown();
+
+ return EXIT_SUCCESS;
+}