diff options
author | Dwayne Boone <dwayne@zeroc.com> | 2012-11-20 10:57:44 -0330 |
---|---|---|
committer | Dwayne Boone <dwayne@zeroc.com> | 2012-11-20 10:57:44 -0330 |
commit | 4c5255c1ab05da2a775f9e01b2da2143741df3d2 (patch) | |
tree | 502e839455de10c62c500612159425a6964fdfdd /cpp | |
parent | ICE-4965: added Python Ice/metrics demo (diff) | |
download | ice-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.cpp | 19 | ||||
-rw-r--r-- | cpp/demo/Ice/value/Makefile | 4 | ||||
-rw-r--r-- | cpp/demo/Ice/value/Makefile.mak | 6 | ||||
-rw-r--r-- | cpp/demo/Ice/value/ObjectFactory.cpp | 5 | ||||
-rw-r--r-- | cpp/demo/Ice/value/Server.cpp | 4 | ||||
-rw-r--r-- | cpp/demo/Ice/value/Value.ice | 6 | ||||
-rw-r--r-- | cpp/demo/Ice/value/ValueI.cpp | 7 | ||||
-rw-r--r-- | cpp/demo/Ice/value/ValueI.h | 5 |
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 |