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.cpp194
1 files changed, 194 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..c687dd4342b
--- /dev/null
+++ b/cpp/demo/Ice/value/Client.cpp
@@ -0,0 +1,194 @@
+// **********************************************************************
+//
+// Copyright (c) 2001
+// MutableRealms, Inc.
+// Huntsville, AL, USA
+//
+// All Rights Reserved
+//
+// **********************************************************************
+
+#include <Ice/Ice.h>
+#include <Value.h>
+#include <Factory.h>
+
+using namespace std;
+
+int
+run(int argc, char* argv[], Ice::CommunicatorPtr communicator)
+{
+ Ice::PropertiesPtr properties = communicator->getProperties();
+ string ref = properties->getProperty("Value.Initial");
+ Ice::ObjectPrx base = communicator->stringToProxy(ref);
+
+ InitialPrx initial = InitialPrx::checkedCast(base);
+ if (!initial)
+ {
+ cerr << argv[0] << ": invalid object reference" << endl;
+ return EXIT_FAILURE;
+ }
+
+ char c;
+
+ cout << '\n'
+ << "Let's first transfer a simple value, for a class without\n"
+ << "operations. No factory is required for this.\n"
+ << "[press enter]\n";
+ cin.getline(&c, 1);
+
+ SimplePtr simple = initial->simple();
+ cout << "==> " << simple->_message << endl;
+
+ cout << '\n'
+ << "Ok, this worked. Now let's try to transfer a value for a class\n"
+ << "with operations, without first installing a factory. This\n"
+ << "should give us a `no factory' exception.\n"
+ << "[press enter]\n";
+ cin.getline(&c, 1);
+
+ PrinterPtr printer;
+ PrinterPrx printerProxy;
+ try
+ {
+ initial->printer(printer, printerProxy);
+ }
+ catch(const Ice::NoFactoryException& 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.\n"
+ << "[press enter]\n";
+ cin.getline(&c, 1);
+
+ Ice::ValueFactoryPtr factory = new Factory;
+ communicator->installValueFactory(factory, "::Printer");
+
+ initial->printer(printer, printerProxy);
+ cout << "==> " << printer->_message << endl;
+
+ cout << '\n'
+ << "Cool, it worked! Let's try calling the printBackwards() method\n"
+ << "locally.\n"
+ << "[press enter]\n";
+ cin.getline(&c, 1);
+
+ cout << "==> ";
+ printer->printBackwards();
+
+ cout << '\n'
+ << "Now we call the same method on the remote object. Watch the\n"
+ << "server's output.\n"
+ << "[press enter]\n";
+ cin.getline(&c, 1);
+
+ printerProxy->printBackwards();
+
+ cout << '\n'
+ << "Next, we transfer a derived object from the server as base\n"
+ << "object. Since we didn't install a factory for the derived\n"
+ << "class, our object will be truncated, and a dynamic_cast<> to\n"
+ << "get the derived object from the base object will fail.\n"
+ << "[press enter]\n";
+ cin.getline(&c, 1);
+
+ PrinterPtr derivedAsBase = initial->derivedPrinter();
+ assert(!DerivedPrinterPtr::dynamicCast(derivedAsBase));
+ cout << "==> dynamic_cast<> to derived object failed" << endl;
+
+ cout << '\n'
+ << "We can of course still use the derived object as base object.\n"
+ << "[press enter]\n";
+ cin.getline(&c, 1);
+
+ cout << "==> " << derivedAsBase->_message << endl;
+ cout << "==> ";
+ derivedAsBase->printBackwards();
+
+ cout << '\n'
+ << "Now we install the factory for the derived object, and try\n"
+ << "again.\n"
+ << "[press enter]\n";
+ cin.getline(&c, 1);
+
+ communicator->installValueFactory(factory, "::DerivedPrinter");
+
+ derivedAsBase = initial->derivedPrinter();
+ DerivedPrinterPtr derived = DerivedPrinterPtr::dynamicCast(derivedAsBase);
+ assert(derived);
+
+ cout << "==> dynamic_cast<> to derived object succeded" << 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, 1);
+
+ 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 it as an exception.\n"
+ << "[press enter]\n";
+ cin.getline(&c, 1);
+
+ try
+ {
+ initial->throwDerivedPrinter();
+ }
+ catch(const PrinterPtrE& ex)
+ {
+ const PrinterPtr& p = ex;
+ derived = DerivedPrinterPtr::dynamicCast(p);
+ assert(derived);
+ }
+
+ cout << "==> " << derived->_derivedMessage << endl;
+ cout << "==> ";
+ derived->printUppercase();
+
+ cout << '\n'
+ << "That's it for this demo. Have fun with Ice!\n";
+
+ return EXIT_SUCCESS;
+}
+
+int
+main(int argc, char* argv[])
+{
+ int status;
+ Ice::CommunicatorPtr communicator;
+
+ try
+ {
+ Ice::PropertiesPtr properties = Ice::loadProperties("config");
+ communicator = Ice::initializeWithProperties(argc, argv, properties);
+ status = run(argc, argv, communicator);
+ }
+ catch(const Ice::LocalException& ex)
+ {
+ cerr << ex << endl;
+ status = EXIT_FAILURE;
+ }
+
+ if (communicator)
+ {
+ try
+ {
+ communicator->destroy();
+ }
+ catch(const Ice::LocalException& ex)
+ {
+ cerr << ex << endl;
+ status = EXIT_FAILURE;
+ }
+ }
+
+ return status;
+}