summaryrefslogtreecommitdiff
path: root/cpp
diff options
context:
space:
mode:
authorDwayne Boone <dwayne@zeroc.com>2012-11-20 10:57:44 -0330
committerDwayne Boone <dwayne@zeroc.com>2012-11-20 10:57:44 -0330
commit4c5255c1ab05da2a775f9e01b2da2143741df3d2 (patch)
tree502e839455de10c62c500612159425a6964fdfdd /cpp
parentICE-4965: added Python Ice/metrics demo (diff)
downloadice-4c5255c1ab05da2a775f9e01b2da2143741df3d2.tar.bz2
ice-4c5255c1ab05da2a775f9e01b2da2143741df3d2.tar.xz
ice-4c5255c1ab05da2a775f9e01b2da2143741df3d2.zip
ICE-4963 added example of "preserve-slice" to value demo
Diffstat (limited to 'cpp')
-rw-r--r--cpp/demo/Ice/value/Client.cpp19
-rw-r--r--cpp/demo/Ice/value/Makefile4
-rw-r--r--cpp/demo/Ice/value/Makefile.mak6
-rw-r--r--cpp/demo/Ice/value/ObjectFactory.cpp5
-rw-r--r--cpp/demo/Ice/value/Server.cpp4
-rw-r--r--cpp/demo/Ice/value/Value.ice6
-rw-r--r--cpp/demo/Ice/value/ValueI.cpp7
-rw-r--r--cpp/demo/Ice/value/ValueI.h5
8 files changed, 51 insertions, 5 deletions
diff --git a/cpp/demo/Ice/value/Client.cpp b/cpp/demo/Ice/value/Client.cpp
index 1b5c6ca7591..7535b690e96 100644
--- a/cpp/demo/Ice/value/Client.cpp
+++ b/cpp/demo/Ice/value/Client.cpp
@@ -9,6 +9,7 @@
#include <Ice/Ice.h>
#include <Value.h>
+#include <ValueI.h>
#include <ObjectFactory.h>
using namespace std;
@@ -156,6 +157,24 @@ ValueClient::run(int argc, char* argv[])
derived->printUppercase();
cout << '\n'
+ << "Now let's make sure that slice is preserved with [\"preserve-slice\"]\n"
+ << "metadata. We create a derived type on the client and pass it to the\n"
+ << "server, which does not have a factory for the derived type. We do a\n"
+ << "dynamic_cast<> to make sure we can still access the derived type when\n"
+ << "it has been returned from the server.\n"
+ << "[press enter]\n";
+ cin.getline(c, 2);
+
+ ClientPrinterPtr clientp = new ClientPrinterI;
+ clientp->message = "a message 4 u";
+ communicator()->addObjectFactory(factory, Demo::ClientPrinter::ice_staticId());
+
+ derivedAsBase = initial->updatePrinterMessage(clientp);
+ clientp = ClientPrinterPtr::dynamicCast(derivedAsBase);
+ assert(clientp);
+ cout << "==> " << clientp->message << endl;
+
+ 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"
diff --git a/cpp/demo/Ice/value/Makefile b/cpp/demo/Ice/value/Makefile
index 1faf100b7df..58b776de87d 100644
--- a/cpp/demo/Ice/value/Makefile
+++ b/cpp/demo/Ice/value/Makefile
@@ -15,10 +15,10 @@ SERVER = server
TARGETS = $(CLIENT) $(SERVER)
OBJS = Value.o \
- ValueI.o
+ ValueI.o \
+ ObjectFactory.o
COBJS = Client.o \
- ObjectFactory.o
SOBJS = Server.o
diff --git a/cpp/demo/Ice/value/Makefile.mak b/cpp/demo/Ice/value/Makefile.mak
index d1bf2d13282..81d2ca654ea 100644
--- a/cpp/demo/Ice/value/Makefile.mak
+++ b/cpp/demo/Ice/value/Makefile.mak
@@ -15,11 +15,11 @@ SERVER = server.exe
TARGETS = $(CLIENT) $(SERVER)
OBJS = Value.obj \
- ValueI.obj
-
-COBJS = Client.obj \
+ ValueI.obj \
ObjectFactory.obj
+COBJS = Client.obj
+
SOBJS = Server.obj
SRCS = $(OBJS:.obj=.cpp) \
diff --git a/cpp/demo/Ice/value/ObjectFactory.cpp b/cpp/demo/Ice/value/ObjectFactory.cpp
index 94ac45da167..bc95cbd2131 100644
--- a/cpp/demo/Ice/value/ObjectFactory.cpp
+++ b/cpp/demo/Ice/value/ObjectFactory.cpp
@@ -26,6 +26,11 @@ ObjectFactory::create(const string& type)
return new DerivedPrinterI;
}
+ if(type == Demo::ClientPrinter::ice_staticId())
+ {
+ return new ClientPrinterI;
+ }
+
assert(false);
return 0;
}
diff --git a/cpp/demo/Ice/value/Server.cpp b/cpp/demo/Ice/value/Server.cpp
index 7d3a8784f02..57e591829c8 100644
--- a/cpp/demo/Ice/value/Server.cpp
+++ b/cpp/demo/Ice/value/Server.cpp
@@ -9,6 +9,7 @@
#include <Ice/Ice.h>
#include <ValueI.h>
+#include <ObjectFactory.h>
using namespace std;
@@ -35,6 +36,9 @@ ValueServer::run(int argc, char* argv[])
return EXIT_FAILURE;
}
+ Ice::ObjectFactoryPtr factory = new ObjectFactory;
+ communicator()->addObjectFactory(factory, Demo::Printer::ice_staticId());
+
Ice::ObjectAdapterPtr adapter = communicator()->createObjectAdapter("Value");
Demo::InitialPtr initial = new InitialI(adapter);
adapter->add(initial, communicator()->stringToIdentity("initial"));
diff --git a/cpp/demo/Ice/value/Value.ice b/cpp/demo/Ice/value/Value.ice
index e925acf8c88..0f2fee1c6cf 100644
--- a/cpp/demo/Ice/value/Value.ice
+++ b/cpp/demo/Ice/value/Value.ice
@@ -17,6 +17,7 @@ class Simple
string message;
};
+["preserve-slice"]
class Printer
{
string message;
@@ -29,6 +30,10 @@ class Printer
void printUppercase();
};
+["cpp:virtual"]class ClientPrinter extends Printer
+{
+};
+
exception DerivedPrinterException
{
DerivedPrinter derived;
@@ -39,6 +44,7 @@ interface Initial
Simple getSimple();
void getPrinter(out Printer impl, out Printer* proxy);
["format:sliced"] Printer getDerivedPrinter();
+ ["format:sliced"] Printer updatePrinterMessage(Printer impl);
void throwDerivedPrinter() throws DerivedPrinterException;
void shutdown();
};
diff --git a/cpp/demo/Ice/value/ValueI.cpp b/cpp/demo/Ice/value/ValueI.cpp
index 032b264982c..151eca338f4 100644
--- a/cpp/demo/Ice/value/ValueI.cpp
+++ b/cpp/demo/Ice/value/ValueI.cpp
@@ -44,6 +44,13 @@ InitialI::getDerivedPrinter(const Ice::Current&)
return _derivedPrinter;
}
+PrinterPtr
+InitialI::updatePrinterMessage(const PrinterPtr& printer, const Ice::Current&)
+{
+ printer->message = "a modified message 4 u";
+ return printer;
+}
+
void
InitialI::throwDerivedPrinter(const Ice::Current&)
{
diff --git a/cpp/demo/Ice/value/ValueI.h b/cpp/demo/Ice/value/ValueI.h
index 87e687b38f5..2c3dd3f8b76 100644
--- a/cpp/demo/Ice/value/ValueI.h
+++ b/cpp/demo/Ice/value/ValueI.h
@@ -21,6 +21,7 @@ public:
virtual Demo::SimplePtr getSimple(const Ice::Current&);
virtual void getPrinter(::Demo::PrinterPtr&, Demo::PrinterPrx&, const Ice::Current&);
virtual Demo::PrinterPtr getDerivedPrinter(const Ice::Current&);
+ virtual Demo::PrinterPtr updatePrinterMessage(const Demo::PrinterPtr&, const Ice::Current&);
virtual void throwDerivedPrinter(const Ice::Current&);
virtual void shutdown(const Ice::Current&);
@@ -46,4 +47,8 @@ public:
virtual void printUppercase(const Ice::Current&);
};
+class ClientPrinterI : virtual public Demo::ClientPrinter, virtual public PrinterI
+{
+};
+
#endif