summaryrefslogtreecommitdiff
path: root/cpp/demo
diff options
context:
space:
mode:
Diffstat (limited to 'cpp/demo')
-rw-r--r--cpp/demo/IceStorm/Makefile2
-rw-r--r--cpp/demo/IceStorm/Makefile.mak2
-rw-r--r--cpp/demo/IceStorm/README4
-rw-r--r--cpp/demo/IceStorm/clock/.depend2
-rw-r--r--cpp/demo/IceStorm/clock/Publisher.cpp49
-rw-r--r--cpp/demo/IceStorm/clock/README13
-rw-r--r--cpp/demo/IceStorm/clock/Subscriber.cpp182
-rw-r--r--cpp/demo/IceStorm/clock/config.pub2
-rw-r--r--cpp/demo/IceStorm/clock/config.service8
-rw-r--r--cpp/demo/IceStorm/clock/config.sub2
-rw-r--r--cpp/demo/IceStorm/counter/.depend10
-rw-r--r--cpp/demo/IceStorm/counter/Server.cpp11
-rw-r--r--cpp/demo/IceStorm/counter/config.server2
-rw-r--r--cpp/demo/IceStorm/counter/config.service5
-rw-r--r--cpp/demo/IceStorm/replicated/.depend6
-rw-r--r--cpp/demo/IceStorm/replicated/Publisher.cpp105
-rw-r--r--cpp/demo/IceStorm/replicated/Subscriber.cpp369
-rw-r--r--cpp/demo/IceStorm/replicated/application.xml29
-rw-r--r--cpp/demo/IceStorm/replicated2/.depend5
-rw-r--r--cpp/demo/IceStorm/replicated2/.gitignore10
-rw-r--r--cpp/demo/IceStorm/replicated2/Clock.ice23
-rw-r--r--cpp/demo/IceStorm/replicated2/Makefile47
-rw-r--r--cpp/demo/IceStorm/replicated2/Makefile.mak54
-rw-r--r--cpp/demo/IceStorm/replicated2/Publisher.cpp151
-rw-r--r--cpp/demo/IceStorm/replicated2/README25
-rw-r--r--cpp/demo/IceStorm/replicated2/Subscriber.cpp258
-rw-r--r--cpp/demo/IceStorm/replicated2/config.ib132
-rw-r--r--cpp/demo/IceStorm/replicated2/config.ib232
-rw-r--r--cpp/demo/IceStorm/replicated2/config.ib332
-rw-r--r--cpp/demo/IceStorm/replicated2/config.pub14
-rw-r--r--cpp/demo/IceStorm/replicated2/config.s1112
-rw-r--r--cpp/demo/IceStorm/replicated2/config.s2112
-rw-r--r--cpp/demo/IceStorm/replicated2/config.s3112
-rw-r--r--cpp/demo/IceStorm/replicated2/config.sub20
-rw-r--r--cpp/demo/IceStorm/replicated2/db1/.gitignore8
-rw-r--r--cpp/demo/IceStorm/replicated2/db2/.gitignore8
-rw-r--r--cpp/demo/IceStorm/replicated2/db3/.gitignore8
-rwxr-xr-xcpp/demo/IceStorm/replicated2/expect.py28
-rw-r--r--cpp/demo/IceStorm/replicated2/replicated2C.dsp157
-rw-r--r--cpp/demo/IceStorm/replicated2/replicated2S.dsp157
40 files changed, 1863 insertions, 345 deletions
diff --git a/cpp/demo/IceStorm/Makefile b/cpp/demo/IceStorm/Makefile
index a71c7b2235a..c2713280047 100644
--- a/cpp/demo/IceStorm/Makefile
+++ b/cpp/demo/IceStorm/Makefile
@@ -11,7 +11,7 @@ top_srcdir = ../..
include $(top_srcdir)/config/Make.rules
-SUBDIRS = clock counter replicated
+SUBDIRS = clock counter replicated replicated2
$(EVERYTHING)::
@for subdir in $(SUBDIRS); \
diff --git a/cpp/demo/IceStorm/Makefile.mak b/cpp/demo/IceStorm/Makefile.mak
index 3027da38dab..569a0a60a5c 100644
--- a/cpp/demo/IceStorm/Makefile.mak
+++ b/cpp/demo/IceStorm/Makefile.mak
@@ -11,7 +11,7 @@ top_srcdir = ..\..
!include $(top_srcdir)\config\Make.rules.mak
-SUBDIRS = clock counter replicated
+SUBDIRS = clock counter replicated replicated2
$(EVERYTHING)::
@for %i in ( $(SUBDIRS) ) do \
diff --git a/cpp/demo/IceStorm/README b/cpp/demo/IceStorm/README
index a0caf8cd50d..cb7b44a2837 100644
--- a/cpp/demo/IceStorm/README
+++ b/cpp/demo/IceStorm/README
@@ -12,3 +12,7 @@ Demos in this directory:
- replicated
Shows how to replicate IceStorm services using IceGrid.
+
+- replicated2
+
+ Shows how to replicate IceStorm services without using IceGrid.
diff --git a/cpp/demo/IceStorm/clock/.depend b/cpp/demo/IceStorm/clock/.depend
index d3383526e6a..b70ddcd8b28 100644
--- a/cpp/demo/IceStorm/clock/.depend
+++ b/cpp/demo/IceStorm/clock/.depend
@@ -1,4 +1,4 @@
-Clock$(OBJEXT): Clock.cpp Clock.h $(includedir)/Ice/LocalObjectF.h $(includedir)/IceUtil/Shared.h $(includedir)/IceUtil/Config.h $(includedir)/Ice/Handle.h $(includedir)/IceUtil/Handle.h $(includedir)/IceUtil/Exception.h $(includedir)/Ice/Config.h $(includedir)/Ice/ProxyHandle.h $(includedir)/Ice/ProxyF.h $(includedir)/Ice/ObjectF.h $(includedir)/Ice/GCCountMap.h $(includedir)/Ice/GCShared.h $(includedir)/Ice/Exception.h $(includedir)/Ice/LocalObject.h $(includedir)/Ice/Proxy.h $(includedir)/IceUtil/Mutex.h $(includedir)/IceUtil/Lock.h $(includedir)/IceUtil/ThreadException.h $(includedir)/IceUtil/Time.h $(includedir)/Ice/ProxyFactoryF.h $(includedir)/Ice/ConnectionIF.h $(includedir)/Ice/RequestHandlerF.h $(includedir)/Ice/EndpointIF.h $(includedir)/Ice/Endpoint.h $(includedir)/Ice/UndefSysMacros.h $(includedir)/Ice/ObjectAdapterF.h $(includedir)/Ice/ReferenceF.h $(includedir)/Ice/OutgoingAsyncF.h $(includedir)/Ice/Current.h $(includedir)/Ice/ConnectionF.h $(includedir)/Ice/Identity.h $(includedir)/Ice/StreamF.h $(includedir)/Ice/CommunicatorF.h $(includedir)/Ice/Object.h $(includedir)/Ice/IncomingAsyncF.h $(includedir)/Ice/Outgoing.h $(includedir)/IceUtil/Monitor.h $(includedir)/IceUtil/Cond.h $(includedir)/Ice/InstanceF.h $(includedir)/Ice/BasicStream.h $(includedir)/Ice/ObjectFactoryF.h $(includedir)/Ice/Buffer.h $(includedir)/Ice/Protocol.h $(includedir)/Ice/StringConverter.h $(includedir)/IceUtil/Unicode.h $(includedir)/Ice/Incoming.h $(includedir)/Ice/ServantLocatorF.h $(includedir)/Ice/ServantManagerF.h $(includedir)/Ice/Direct.h $(includedir)/Ice/LocalException.h $(includedir)/Ice/BuiltinSequences.h $(includedir)/Ice/ObjectFactory.h $(includedir)/IceUtil/Iterator.h $(includedir)/IceUtil/ScopedArray.h
+Clock$(OBJEXT): Clock.cpp Clock.h $(includedir)/Ice/LocalObjectF.h $(includedir)/IceUtil/Shared.h $(includedir)/IceUtil/Config.h $(includedir)/IceUtil/Mutex.h $(includedir)/IceUtil/Lock.h $(includedir)/IceUtil/ThreadException.h $(includedir)/IceUtil/Exception.h $(includedir)/IceUtil/Time.h $(includedir)/Ice/Handle.h $(includedir)/IceUtil/Handle.h $(includedir)/Ice/Config.h $(includedir)/Ice/ProxyHandle.h $(includedir)/Ice/ProxyF.h $(includedir)/Ice/ObjectF.h $(includedir)/Ice/GCCountMap.h $(includedir)/Ice/GCShared.h $(includedir)/Ice/Exception.h $(includedir)/Ice/LocalObject.h $(includedir)/Ice/Proxy.h $(includedir)/Ice/ProxyFactoryF.h $(includedir)/Ice/ConnectionIF.h $(includedir)/Ice/RequestHandlerF.h $(includedir)/Ice/EndpointIF.h $(includedir)/Ice/Endpoint.h $(includedir)/Ice/UndefSysMacros.h $(includedir)/Ice/ObjectAdapterF.h $(includedir)/Ice/ReferenceF.h $(includedir)/Ice/OutgoingAsyncF.h $(includedir)/Ice/Current.h $(includedir)/Ice/ConnectionF.h $(includedir)/Ice/Identity.h $(includedir)/Ice/StreamF.h $(includedir)/Ice/CommunicatorF.h $(includedir)/Ice/Object.h $(includedir)/Ice/IncomingAsyncF.h $(includedir)/Ice/Outgoing.h $(includedir)/IceUtil/Monitor.h $(includedir)/IceUtil/Cond.h $(includedir)/Ice/InstanceF.h $(includedir)/Ice/BasicStream.h $(includedir)/Ice/ObjectFactoryF.h $(includedir)/Ice/Buffer.h $(includedir)/Ice/Protocol.h $(includedir)/Ice/StringConverter.h $(includedir)/IceUtil/Unicode.h $(includedir)/Ice/Incoming.h $(includedir)/Ice/ServantLocatorF.h $(includedir)/Ice/ServantManagerF.h $(includedir)/Ice/Direct.h $(includedir)/Ice/LocalException.h $(includedir)/Ice/BuiltinSequences.h $(includedir)/Ice/ObjectFactory.h $(includedir)/IceUtil/Iterator.h $(includedir)/IceUtil/ScopedArray.h
Publisher$(OBJEXT): Publisher.cpp $(includedir)/IceUtil/IceUtil.h $(includedir)/IceUtil/Config.h $(includedir)/IceUtil/AbstractMutex.h $(includedir)/IceUtil/Lock.h $(includedir)/IceUtil/ThreadException.h $(includedir)/IceUtil/Exception.h $(includedir)/IceUtil/Time.h $(includedir)/IceUtil/Cache.h $(includedir)/IceUtil/Handle.h $(includedir)/IceUtil/Mutex.h $(includedir)/IceUtil/CountDownLatch.h $(includedir)/IceUtil/Cond.h $(includedir)/IceUtil/CtrlCHandler.h $(includedir)/IceUtil/Functional.h $(includedir)/IceUtil/Monitor.h $(includedir)/IceUtil/RWRecMutex.h $(includedir)/IceUtil/Thread.h $(includedir)/IceUtil/Shared.h $(includedir)/IceUtil/RecMutex.h $(includedir)/IceUtil/StaticMutex.h $(includedir)/IceUtil/Timer.h $(includedir)/IceUtil/UUID.h $(includedir)/IceUtil/Unicode.h $(includedir)/Ice/Ice.h $(includedir)/Ice/Initialize.h $(includedir)/Ice/CommunicatorF.h $(includedir)/Ice/LocalObjectF.h $(includedir)/Ice/Handle.h $(includedir)/Ice/Config.h $(includedir)/Ice/ProxyHandle.h $(includedir)/Ice/ProxyF.h $(includedir)/Ice/ObjectF.h $(includedir)/Ice/GCCountMap.h $(includedir)/Ice/GCShared.h $(includedir)/Ice/Exception.h $(includedir)/Ice/LocalObject.h $(includedir)/Ice/UndefSysMacros.h $(includedir)/Ice/PropertiesF.h $(includedir)/Ice/Proxy.h $(includedir)/Ice/ProxyFactoryF.h $(includedir)/Ice/ConnectionIF.h $(includedir)/Ice/RequestHandlerF.h $(includedir)/Ice/EndpointIF.h $(includedir)/Ice/Endpoint.h $(includedir)/Ice/ObjectAdapterF.h $(includedir)/Ice/ReferenceF.h $(includedir)/Ice/OutgoingAsyncF.h $(includedir)/Ice/Current.h $(includedir)/Ice/ConnectionF.h $(includedir)/Ice/Identity.h $(includedir)/Ice/StreamF.h $(includedir)/Ice/Object.h $(includedir)/Ice/IncomingAsyncF.h $(includedir)/Ice/InstanceF.h $(includedir)/Ice/LoggerF.h $(includedir)/Ice/StatsF.h $(includedir)/Ice/StringConverter.h $(includedir)/Ice/BuiltinSequences.h $(includedir)/Ice/LocalException.h $(includedir)/Ice/Properties.h $(includedir)/Ice/Outgoing.h $(includedir)/Ice/BasicStream.h $(includedir)/Ice/ObjectFactoryF.h $(includedir)/Ice/Buffer.h $(includedir)/Ice/Protocol.h $(includedir)/Ice/OutgoingAsync.h $(includedir)/Ice/Incoming.h $(includedir)/Ice/ServantLocatorF.h $(includedir)/Ice/ServantManagerF.h $(includedir)/Ice/Direct.h $(includedir)/Ice/Logger.h $(includedir)/Ice/LoggerUtil.h $(includedir)/Ice/Stats.h $(includedir)/Ice/Communicator.h $(includedir)/Ice/RouterF.h $(includedir)/Ice/LocatorF.h $(includedir)/Ice/PluginF.h $(includedir)/Ice/ImplicitContextF.h $(includedir)/Ice/ObjectFactory.h $(includedir)/Ice/ObjectAdapter.h $(includedir)/Ice/FacetMap.h $(includedir)/Ice/ServantLocator.h $(includedir)/Ice/IncomingAsync.h $(includedir)/Ice/Process.h $(includedir)/Ice/Application.h $(includedir)/Ice/Connection.h $(includedir)/Ice/Functional.h $(includedir)/Ice/Stream.h $(includedir)/Ice/ImplicitContext.h $(includedir)/Ice/Locator.h $(includedir)/Ice/UserExceptionFactory.h $(includedir)/Ice/FactoryTable.h $(includedir)/Ice/FactoryTableDef.h $(includedir)/Ice/UserExceptionFactoryF.h $(includedir)/Ice/ProcessF.h $(includedir)/Ice/Router.h $(includedir)/Ice/DispatchInterceptor.h $(includedir)/Ice/IconvStringConverter.h $(includedir)/IceStorm/IceStorm.h $(includedir)/Ice/SliceChecksumDict.h Clock.h
Subscriber$(OBJEXT): Subscriber.cpp $(includedir)/IceUtil/IceUtil.h $(includedir)/IceUtil/Config.h $(includedir)/IceUtil/AbstractMutex.h $(includedir)/IceUtil/Lock.h $(includedir)/IceUtil/ThreadException.h $(includedir)/IceUtil/Exception.h $(includedir)/IceUtil/Time.h $(includedir)/IceUtil/Cache.h $(includedir)/IceUtil/Handle.h $(includedir)/IceUtil/Mutex.h $(includedir)/IceUtil/CountDownLatch.h $(includedir)/IceUtil/Cond.h $(includedir)/IceUtil/CtrlCHandler.h $(includedir)/IceUtil/Functional.h $(includedir)/IceUtil/Monitor.h $(includedir)/IceUtil/RWRecMutex.h $(includedir)/IceUtil/Thread.h $(includedir)/IceUtil/Shared.h $(includedir)/IceUtil/RecMutex.h $(includedir)/IceUtil/StaticMutex.h $(includedir)/IceUtil/Timer.h $(includedir)/IceUtil/UUID.h $(includedir)/IceUtil/Unicode.h $(includedir)/Ice/Ice.h $(includedir)/Ice/Initialize.h $(includedir)/Ice/CommunicatorF.h $(includedir)/Ice/LocalObjectF.h $(includedir)/Ice/Handle.h $(includedir)/Ice/Config.h $(includedir)/Ice/ProxyHandle.h $(includedir)/Ice/ProxyF.h $(includedir)/Ice/ObjectF.h $(includedir)/Ice/GCCountMap.h $(includedir)/Ice/GCShared.h $(includedir)/Ice/Exception.h $(includedir)/Ice/LocalObject.h $(includedir)/Ice/UndefSysMacros.h $(includedir)/Ice/PropertiesF.h $(includedir)/Ice/Proxy.h $(includedir)/Ice/ProxyFactoryF.h $(includedir)/Ice/ConnectionIF.h $(includedir)/Ice/RequestHandlerF.h $(includedir)/Ice/EndpointIF.h $(includedir)/Ice/Endpoint.h $(includedir)/Ice/ObjectAdapterF.h $(includedir)/Ice/ReferenceF.h $(includedir)/Ice/OutgoingAsyncF.h $(includedir)/Ice/Current.h $(includedir)/Ice/ConnectionF.h $(includedir)/Ice/Identity.h $(includedir)/Ice/StreamF.h $(includedir)/Ice/Object.h $(includedir)/Ice/IncomingAsyncF.h $(includedir)/Ice/InstanceF.h $(includedir)/Ice/LoggerF.h $(includedir)/Ice/StatsF.h $(includedir)/Ice/StringConverter.h $(includedir)/Ice/BuiltinSequences.h $(includedir)/Ice/LocalException.h $(includedir)/Ice/Properties.h $(includedir)/Ice/Outgoing.h $(includedir)/Ice/BasicStream.h $(includedir)/Ice/ObjectFactoryF.h $(includedir)/Ice/Buffer.h $(includedir)/Ice/Protocol.h $(includedir)/Ice/OutgoingAsync.h $(includedir)/Ice/Incoming.h $(includedir)/Ice/ServantLocatorF.h $(includedir)/Ice/ServantManagerF.h $(includedir)/Ice/Direct.h $(includedir)/Ice/Logger.h $(includedir)/Ice/LoggerUtil.h $(includedir)/Ice/Stats.h $(includedir)/Ice/Communicator.h $(includedir)/Ice/RouterF.h $(includedir)/Ice/LocatorF.h $(includedir)/Ice/PluginF.h $(includedir)/Ice/ImplicitContextF.h $(includedir)/Ice/ObjectFactory.h $(includedir)/Ice/ObjectAdapter.h $(includedir)/Ice/FacetMap.h $(includedir)/Ice/ServantLocator.h $(includedir)/Ice/IncomingAsync.h $(includedir)/Ice/Process.h $(includedir)/Ice/Application.h $(includedir)/Ice/Connection.h $(includedir)/Ice/Functional.h $(includedir)/Ice/Stream.h $(includedir)/Ice/ImplicitContext.h $(includedir)/Ice/Locator.h $(includedir)/Ice/UserExceptionFactory.h $(includedir)/Ice/FactoryTable.h $(includedir)/Ice/FactoryTableDef.h $(includedir)/Ice/UserExceptionFactoryF.h $(includedir)/Ice/ProcessF.h $(includedir)/Ice/Router.h $(includedir)/Ice/DispatchInterceptor.h $(includedir)/Ice/IconvStringConverter.h $(includedir)/IceStorm/IceStorm.h $(includedir)/Ice/SliceChecksumDict.h Clock.h
Clock.cpp: Clock.ice
diff --git a/cpp/demo/IceStorm/clock/Publisher.cpp b/cpp/demo/IceStorm/clock/Publisher.cpp
index 7ac4258f88d..36fbf10b0f6 100644
--- a/cpp/demo/IceStorm/clock/Publisher.cpp
+++ b/cpp/demo/IceStorm/clock/Publisher.cpp
@@ -33,27 +33,21 @@ main(int argc, char* argv[])
void
usage(const string& n)
{
- cerr << "Usage: " << n << " [--datagram|--twoway|--oneway] [topic]\n" << endl;
+ cerr << "Usage: " << n << " [--datagram|--twoway|--oneway] [topic]" << endl;
}
int
Publisher::run(int argc, char* argv[])
{
- enum Option { Datagram, Twoway, Oneway };
- Option option = Oneway;
-
+ enum Option { None, Datagram, Twoway, Oneway };
+ Option option = None;
string topicName = "time";
+ int i;
- if(argc > 3)
- {
- cerr << appName() << ": too many arguments" << endl;
- usage(appName());
- return EXIT_FAILURE;
- }
-
- if(argc >= 2)
+ for(i = 1; i < argc; ++i)
{
- string optionString = argv[1];
+ string optionString = argv[i];
+ Option oldoption = option;
if(optionString == "--datagram")
{
option = Datagram;
@@ -66,35 +60,32 @@ Publisher::run(int argc, char* argv[])
{
option = Oneway;
}
- else if(argc == 3)
+ else if(optionString.substr(0, 2) == "--")
{
- cerr << appName() << ": too many arguments" << endl;
- usage(appName());
+ usage(argv[0]);
return EXIT_FAILURE;
}
else
{
- topicName = optionString;
- }
-
- if(argc == 3)
- {
- topicName = argv[2];
+ topicName = argv[i++];
+ break;
}
- if(topicName[0] == '-')
+ if(oldoption != option && oldoption != None)
{
- cerr << appName() << ": invalid topic name" << endl;
- usage(appName());
+ usage(argv[0]);
return EXIT_FAILURE;
}
}
-
-
+ if(i != argc)
+ {
+ usage(argv[0]);
+ return EXIT_FAILURE;
+ }
IceStorm::TopicManagerPrx manager = IceStorm::TopicManagerPrx::checkedCast(
- communicator()->propertyToProxy("IceStorm.TopicManager.Proxy"));
+ communicator()->propertyToProxy("TopicManager.Proxy"));
if(!manager)
{
cerr << appName() << ": invalid proxy" << endl;
@@ -135,7 +126,7 @@ Publisher::run(int argc, char* argv[])
{
// Do nothing.
}
- else if(option == Oneway)
+ else if(option == Oneway || option == None)
{
publisher = publisher->ice_oneway();
}
diff --git a/cpp/demo/IceStorm/clock/README b/cpp/demo/IceStorm/clock/README
index 1f5b44e76f1..f2276af203e 100644
--- a/cpp/demo/IceStorm/clock/README
+++ b/cpp/demo/IceStorm/clock/README
@@ -47,6 +47,19 @@ subscriber --batch
This is an additional flag that forwards datagram and oneway events
to the subscriber in batches.
+subscriber --id <id>
+
+ This is flag sets the unique for the given subscriber. If this
+ option is used it you should run the subscriber on a static port.
+ Use --Clock.Subscriber.Endpoints="tcp -p <x> -h <h>:udp -p <x> -h
+ <h>"
+
+subscriber --retryCount <count>
+
+ This flag sets the retry count for a subscriber. This option should
+ be used in conjunction with the --id option. Setting retryCount
+ changes the default subscriber QoS to twoway.
+
For the publisher:
publisher --oneway
diff --git a/cpp/demo/IceStorm/clock/Subscriber.cpp b/cpp/demo/IceStorm/clock/Subscriber.cpp
index 04ebe98a927..1d7faf18673 100644
--- a/cpp/demo/IceStorm/clock/Subscriber.cpp
+++ b/cpp/demo/IceStorm/clock/Subscriber.cpp
@@ -13,8 +13,6 @@
#include <Clock.h>
-#include <map>
-
using namespace std;
using namespace Demo;
@@ -46,50 +44,30 @@ main(int argc, char* argv[])
void
usage(const string& n)
{
- cerr << "Usage: " << n << " [--batch] [--datagram|--twoway|--ordered|--oneway] [topic]" << endl;
+ cerr << "Usage: " << n
+ << " [--batch] [--datagram|--twoway|--ordered|--oneway] [--retryCount count] [--id id] [topic]" << endl;
}
int
Subscriber::run(int argc, char* argv[])
{
- bool batch = false;
-
- enum Option { Datagram, Twoway, Oneway, Ordered};
- Option option = Oneway;
+ Ice::StringSeq args = Ice::argsToStringSeq(argc, argv);
+ args = communicator()->getProperties()->parseCommandLineOptions("Clock", args);
+ Ice::stringSeqToArgs(args, argc, argv);
+ bool batch = false;
+ enum Option { None, Datagram, Twoway, Oneway, Ordered};
+ Option option = None;
string topicName = "time";
+ string id;
+ string retryCount;
+ int i;
- if(argc > 4)
- {
- cerr << appName() << ": too many arguments" << endl;
- usage(appName());
- return EXIT_FAILURE;
- }
-
- if(argc >= 2)
+ for(i = 1; i < argc; ++i)
{
- int argIndex = 1;
- string optionString = argv[argIndex];
-
- if(optionString == "--batch")
- {
- batch = true;
- if(argc >= 3)
- {
- argIndex++;
- optionString = argv[argIndex];
- }
- else
- {
- optionString = "";
- }
- }
-
- if(optionString == "")
- {
- // done
- }
- else if(optionString == "--datagram")
+ string optionString = argv[i];
+ Option oldoption = option;
+ if(optionString == "--datagram")
{
option = Datagram;
}
@@ -105,33 +83,75 @@ Subscriber::run(int argc, char* argv[])
{
option = Ordered;
}
- else if(argIndex == argc - 2)
+ else if(optionString == "--batch")
{
- cerr << appName() << ": too many arguments" << endl;
- usage(appName());
+ batch = true;
+ }
+ else if(optionString == "--id")
+ {
+ ++i;
+ if(i >= argc)
+ {
+ usage(argv[0]);
+ return EXIT_FAILURE;
+ }
+ id = argv[i];
+ }
+ else if(optionString == "--retryCount")
+ {
+ ++i;
+ if(i >= argc)
+ {
+ usage(argv[0]);
+ return EXIT_FAILURE;
+ }
+ retryCount = argv[i];
+ }
+ else if(optionString.substr(0, 2) == "--")
+ {
+ usage(argv[0]);
return EXIT_FAILURE;
}
else
{
- topicName = optionString;
+ topicName = argv[i++];
+ break;
}
- argIndex++;
- if(argIndex < argc)
+ if(oldoption != option && oldoption != None)
{
- topicName = argv[argIndex];
+ usage(argv[0]);
+ return EXIT_FAILURE;
}
+ }
- if(topicName[0] == '-')
+ if(i != argc)
+ {
+ usage(argv[0]);
+ return EXIT_FAILURE;
+ }
+
+ if(!retryCount.empty())
+ {
+ if(option == None)
{
- cerr << appName() << ": invalid topic name" << endl;
- usage(appName());
+ option = Twoway;
+ }
+ else if(option != Twoway && option != Ordered)
+ {
+ cerr << argv[0] << ": retryCount requires a twoway proxy" << endl;
return EXIT_FAILURE;
}
}
+ if(batch && (option == Twoway || option == Ordered))
+ {
+ cerr << argv[0] << ": batch can only be set with oneway or datagram" << endl;
+ return EXIT_FAILURE;
+ }
+
IceStorm::TopicManagerPrx manager = IceStorm::TopicManagerPrx::checkedCast(
- communicator()->propertyToProxy("IceStorm.TopicManager.Proxy"));
+ communicator()->propertyToProxy("TopicManager.Proxy"));
if(!manager)
{
cerr << appName() << ": invalid proxy" << endl;
@@ -159,52 +179,74 @@ Subscriber::run(int argc, char* argv[])
Ice::ObjectAdapterPtr adapter = communicator()->createObjectAdapter("Clock.Subscriber");
//
- // Add a Servant for the Ice Object.
+ // Add a servant for the Ice object. If --id is used the identity
+ // comes from the command line, otherwise a UUID is used.
//
+ // id is not directly altered since it is used below to detect
+ // whether subscribeAndGetPublisher can raise AlreadySubscribed.
+ //
+ Ice::Identity subId;
+ subId.name = id;
+ if(subId.name.empty())
+ {
+ subId.name = IceUtil::generateUUID();
+ }
+ Ice::ObjectPrx subscriber = adapter->add(new ClockI, subId);
+
IceStorm::QoS qos;
- Ice::ObjectPrx subscriber = adapter->addWithUUID(new ClockI);
+ if(!retryCount.empty())
+ {
+ qos["retryCount"] = retryCount;
+ }
+
//
// Set up the proxy.
//
-
if(option == Datagram)
{
- subscriber = subscriber->ice_datagram();
+ if(batch)
+ {
+ subscriber = subscriber->ice_batchDatagram();
+ }
+ else
+ {
+ subscriber = subscriber->ice_datagram();
+ }
}
else if(option == Twoway)
{
// Do nothing to the subscriber proxy. Its already twoway.
-
}
else if(option == Ordered)
{
- qos["reliability"] = "ordered";
// Do nothing to the subscriber proxy. Its already twoway.
-
- }
- else if(option == Oneway)
- {
- subscriber = subscriber->ice_oneway();
+ qos["reliability"] = "ordered";
}
-
- if(batch)
+ else if(option == Oneway || option == None)
{
- if(option == Twoway || option == Ordered)
+ if(batch)
{
- cerr << appName() << ": batch can only be set with oneway or datagram" << endl;
- return EXIT_FAILURE;
- }
- if(option == Datagram)
- {
- subscriber = subscriber->ice_batchDatagram();
+ subscriber = subscriber->ice_batchOneway();
}
else
{
- subscriber = subscriber->ice_batchOneway();
+ subscriber = subscriber->ice_oneway();
}
}
- topic->subscribeAndGetPublisher(qos, subscriber);
+ try
+ {
+ topic->subscribeAndGetPublisher(qos, subscriber);
+ }
+ catch(const IceStorm::AlreadySubscribed&)
+ {
+ // If we're manually setting the subscriber id ignore.
+ if(id.empty())
+ {
+ throw;
+ }
+ cout << "reactivating persistent subscriber" << endl;
+ }
adapter->activate();
shutdownOnInterrupt();
diff --git a/cpp/demo/IceStorm/clock/config.pub b/cpp/demo/IceStorm/clock/config.pub
index c6de9cb84b1..e7d497f8f52 100644
--- a/cpp/demo/IceStorm/clock/config.pub
+++ b/cpp/demo/IceStorm/clock/config.pub
@@ -1,7 +1,7 @@
#
# This property is used by the clients to connect to IceStorm.
#
-IceStorm.TopicManager.Proxy=DemoIceStorm/TopicManager:default -p 10000
+TopicManager.Proxy=DemoIceStorm/TopicManager:default -p 10000
#
# Network Tracing
diff --git a/cpp/demo/IceStorm/clock/config.service b/cpp/demo/IceStorm/clock/config.service
index b9930aa64d4..e87c8a3b23e 100644
--- a/cpp/demo/IceStorm/clock/config.service
+++ b/cpp/demo/IceStorm/clock/config.service
@@ -1,14 +1,12 @@
#
-# This property is used by the administrative client to connect to IceStorm.
-#
-IceStorm.TopicManager.Proxy=DemoIceStorm/TopicManager:default -p 10000
-
-#
# This property defines the endpoints on which the IceStorm
# TopicManager listens.
#
IceStorm.TopicManager.Endpoints=default -p 10000
+IceStorm.Publish.ThreadPool.Size=2
+IceStorm.Publish.ThreadPool.SizeWarn=0
+
#
# The IceStorm service instance name.
#
diff --git a/cpp/demo/IceStorm/clock/config.sub b/cpp/demo/IceStorm/clock/config.sub
index ad2ac555de8..cefadaeb6e5 100644
--- a/cpp/demo/IceStorm/clock/config.sub
+++ b/cpp/demo/IceStorm/clock/config.sub
@@ -7,7 +7,7 @@ Clock.Subscriber.Endpoints=tcp:udp
#
# This property is used by the clients to connect to IceStorm.
#
-IceStorm.TopicManager.Proxy=DemoIceStorm/TopicManager:default -p 10000
+TopicManager.Proxy=DemoIceStorm/TopicManager:default -p 10000
#
# Network Tracing
diff --git a/cpp/demo/IceStorm/counter/.depend b/cpp/demo/IceStorm/counter/.depend
index 46a869c6112..b9262487438 100644
--- a/cpp/demo/IceStorm/counter/.depend
+++ b/cpp/demo/IceStorm/counter/.depend
@@ -1,7 +1,7 @@
-Counter$(OBJEXT): Counter.cpp Counter.h $(includedir)/Ice/LocalObjectF.h $(includedir)/IceUtil/Shared.h $(includedir)/IceUtil/Config.h $(includedir)/Ice/Handle.h $(includedir)/IceUtil/Handle.h $(includedir)/IceUtil/Exception.h $(includedir)/Ice/Config.h $(includedir)/Ice/ProxyHandle.h $(includedir)/Ice/ProxyF.h $(includedir)/Ice/ObjectF.h $(includedir)/Ice/GCCountMap.h $(includedir)/Ice/GCShared.h $(includedir)/Ice/Exception.h $(includedir)/Ice/LocalObject.h $(includedir)/Ice/Proxy.h $(includedir)/IceUtil/Mutex.h $(includedir)/IceUtil/Lock.h $(includedir)/IceUtil/ThreadException.h $(includedir)/IceUtil/Time.h $(includedir)/Ice/ProxyFactoryF.h $(includedir)/Ice/ConnectionIF.h $(includedir)/Ice/RequestHandlerF.h $(includedir)/Ice/EndpointIF.h $(includedir)/Ice/Endpoint.h $(includedir)/Ice/UndefSysMacros.h $(includedir)/Ice/ObjectAdapterF.h $(includedir)/Ice/ReferenceF.h $(includedir)/Ice/OutgoingAsyncF.h $(includedir)/Ice/Current.h $(includedir)/Ice/ConnectionF.h $(includedir)/Ice/Identity.h $(includedir)/Ice/StreamF.h $(includedir)/Ice/CommunicatorF.h $(includedir)/Ice/Object.h $(includedir)/Ice/IncomingAsyncF.h $(includedir)/Ice/Outgoing.h $(includedir)/IceUtil/Monitor.h $(includedir)/IceUtil/Cond.h $(includedir)/Ice/InstanceF.h $(includedir)/Ice/BasicStream.h $(includedir)/Ice/ObjectFactoryF.h $(includedir)/Ice/Buffer.h $(includedir)/Ice/Protocol.h $(includedir)/Ice/StringConverter.h $(includedir)/IceUtil/Unicode.h $(includedir)/Ice/Incoming.h $(includedir)/Ice/ServantLocatorF.h $(includedir)/Ice/ServantManagerF.h $(includedir)/Ice/Direct.h $(includedir)/Ice/LocalException.h $(includedir)/Ice/BuiltinSequences.h $(includedir)/Ice/ObjectFactory.h $(includedir)/IceUtil/Iterator.h $(includedir)/IceUtil/ScopedArray.h
-Client$(OBJEXT): Client.cpp $(includedir)/Ice/Ice.h $(includedir)/Ice/Initialize.h $(includedir)/Ice/CommunicatorF.h $(includedir)/Ice/LocalObjectF.h $(includedir)/IceUtil/Shared.h $(includedir)/IceUtil/Config.h $(includedir)/Ice/Handle.h $(includedir)/IceUtil/Handle.h $(includedir)/IceUtil/Exception.h $(includedir)/Ice/Config.h $(includedir)/Ice/ProxyHandle.h $(includedir)/Ice/ProxyF.h $(includedir)/Ice/ObjectF.h $(includedir)/Ice/GCCountMap.h $(includedir)/Ice/GCShared.h $(includedir)/Ice/Exception.h $(includedir)/Ice/LocalObject.h $(includedir)/Ice/UndefSysMacros.h $(includedir)/Ice/PropertiesF.h $(includedir)/Ice/Proxy.h $(includedir)/IceUtil/Mutex.h $(includedir)/IceUtil/Lock.h $(includedir)/IceUtil/ThreadException.h $(includedir)/IceUtil/Time.h $(includedir)/Ice/ProxyFactoryF.h $(includedir)/Ice/ConnectionIF.h $(includedir)/Ice/RequestHandlerF.h $(includedir)/Ice/EndpointIF.h $(includedir)/Ice/Endpoint.h $(includedir)/Ice/ObjectAdapterF.h $(includedir)/Ice/ReferenceF.h $(includedir)/Ice/OutgoingAsyncF.h $(includedir)/Ice/Current.h $(includedir)/Ice/ConnectionF.h $(includedir)/Ice/Identity.h $(includedir)/Ice/StreamF.h $(includedir)/Ice/Object.h $(includedir)/Ice/IncomingAsyncF.h $(includedir)/Ice/InstanceF.h $(includedir)/Ice/LoggerF.h $(includedir)/Ice/StatsF.h $(includedir)/Ice/StringConverter.h $(includedir)/Ice/BuiltinSequences.h $(includedir)/Ice/LocalException.h $(includedir)/Ice/Properties.h $(includedir)/Ice/Outgoing.h $(includedir)/IceUtil/Monitor.h $(includedir)/IceUtil/Cond.h $(includedir)/Ice/BasicStream.h $(includedir)/Ice/ObjectFactoryF.h $(includedir)/Ice/Buffer.h $(includedir)/Ice/Protocol.h $(includedir)/IceUtil/Unicode.h $(includedir)/Ice/OutgoingAsync.h $(includedir)/IceUtil/Timer.h $(includedir)/IceUtil/Thread.h $(includedir)/Ice/Incoming.h $(includedir)/Ice/ServantLocatorF.h $(includedir)/Ice/ServantManagerF.h $(includedir)/Ice/Direct.h $(includedir)/Ice/Logger.h $(includedir)/Ice/LoggerUtil.h $(includedir)/Ice/Stats.h $(includedir)/Ice/Communicator.h $(includedir)/Ice/RouterF.h $(includedir)/Ice/LocatorF.h $(includedir)/Ice/PluginF.h $(includedir)/Ice/ImplicitContextF.h $(includedir)/Ice/ObjectFactory.h $(includedir)/Ice/ObjectAdapter.h $(includedir)/Ice/FacetMap.h $(includedir)/Ice/ServantLocator.h $(includedir)/Ice/IncomingAsync.h $(includedir)/Ice/Process.h $(includedir)/Ice/Application.h $(includedir)/Ice/Connection.h $(includedir)/Ice/Functional.h $(includedir)/IceUtil/Functional.h $(includedir)/Ice/Stream.h $(includedir)/Ice/ImplicitContext.h $(includedir)/Ice/Locator.h $(includedir)/Ice/UserExceptionFactory.h $(includedir)/Ice/FactoryTable.h $(includedir)/Ice/FactoryTableDef.h $(includedir)/IceUtil/StaticMutex.h $(includedir)/Ice/UserExceptionFactoryF.h $(includedir)/Ice/ProcessF.h $(includedir)/Ice/Router.h $(includedir)/Ice/DispatchInterceptor.h $(includedir)/Ice/IconvStringConverter.h CounterObserverI.h Counter.h
-CounterObserverI$(OBJEXT): CounterObserverI.cpp $(includedir)/Ice/Ice.h $(includedir)/Ice/Initialize.h $(includedir)/Ice/CommunicatorF.h $(includedir)/Ice/LocalObjectF.h $(includedir)/IceUtil/Shared.h $(includedir)/IceUtil/Config.h $(includedir)/Ice/Handle.h $(includedir)/IceUtil/Handle.h $(includedir)/IceUtil/Exception.h $(includedir)/Ice/Config.h $(includedir)/Ice/ProxyHandle.h $(includedir)/Ice/ProxyF.h $(includedir)/Ice/ObjectF.h $(includedir)/Ice/GCCountMap.h $(includedir)/Ice/GCShared.h $(includedir)/Ice/Exception.h $(includedir)/Ice/LocalObject.h $(includedir)/Ice/UndefSysMacros.h $(includedir)/Ice/PropertiesF.h $(includedir)/Ice/Proxy.h $(includedir)/IceUtil/Mutex.h $(includedir)/IceUtil/Lock.h $(includedir)/IceUtil/ThreadException.h $(includedir)/IceUtil/Time.h $(includedir)/Ice/ProxyFactoryF.h $(includedir)/Ice/ConnectionIF.h $(includedir)/Ice/RequestHandlerF.h $(includedir)/Ice/EndpointIF.h $(includedir)/Ice/Endpoint.h $(includedir)/Ice/ObjectAdapterF.h $(includedir)/Ice/ReferenceF.h $(includedir)/Ice/OutgoingAsyncF.h $(includedir)/Ice/Current.h $(includedir)/Ice/ConnectionF.h $(includedir)/Ice/Identity.h $(includedir)/Ice/StreamF.h $(includedir)/Ice/Object.h $(includedir)/Ice/IncomingAsyncF.h $(includedir)/Ice/InstanceF.h $(includedir)/Ice/LoggerF.h $(includedir)/Ice/StatsF.h $(includedir)/Ice/StringConverter.h $(includedir)/Ice/BuiltinSequences.h $(includedir)/Ice/LocalException.h $(includedir)/Ice/Properties.h $(includedir)/Ice/Outgoing.h $(includedir)/IceUtil/Monitor.h $(includedir)/IceUtil/Cond.h $(includedir)/Ice/BasicStream.h $(includedir)/Ice/ObjectFactoryF.h $(includedir)/Ice/Buffer.h $(includedir)/Ice/Protocol.h $(includedir)/IceUtil/Unicode.h $(includedir)/Ice/OutgoingAsync.h $(includedir)/IceUtil/Timer.h $(includedir)/IceUtil/Thread.h $(includedir)/Ice/Incoming.h $(includedir)/Ice/ServantLocatorF.h $(includedir)/Ice/ServantManagerF.h $(includedir)/Ice/Direct.h $(includedir)/Ice/Logger.h $(includedir)/Ice/LoggerUtil.h $(includedir)/Ice/Stats.h $(includedir)/Ice/Communicator.h $(includedir)/Ice/RouterF.h $(includedir)/Ice/LocatorF.h $(includedir)/Ice/PluginF.h $(includedir)/Ice/ImplicitContextF.h $(includedir)/Ice/ObjectFactory.h $(includedir)/Ice/ObjectAdapter.h $(includedir)/Ice/FacetMap.h $(includedir)/Ice/ServantLocator.h $(includedir)/Ice/IncomingAsync.h $(includedir)/Ice/Process.h $(includedir)/Ice/Application.h $(includedir)/Ice/Connection.h $(includedir)/Ice/Functional.h $(includedir)/IceUtil/Functional.h $(includedir)/Ice/Stream.h $(includedir)/Ice/ImplicitContext.h $(includedir)/Ice/Locator.h $(includedir)/Ice/UserExceptionFactory.h $(includedir)/Ice/FactoryTable.h $(includedir)/Ice/FactoryTableDef.h $(includedir)/IceUtil/StaticMutex.h $(includedir)/Ice/UserExceptionFactoryF.h $(includedir)/Ice/ProcessF.h $(includedir)/Ice/Router.h $(includedir)/Ice/DispatchInterceptor.h $(includedir)/Ice/IconvStringConverter.h CounterObserverI.h Counter.h
-Server$(OBJEXT): Server.cpp $(includedir)/Ice/Ice.h $(includedir)/Ice/Initialize.h $(includedir)/Ice/CommunicatorF.h $(includedir)/Ice/LocalObjectF.h $(includedir)/IceUtil/Shared.h $(includedir)/IceUtil/Config.h $(includedir)/Ice/Handle.h $(includedir)/IceUtil/Handle.h $(includedir)/IceUtil/Exception.h $(includedir)/Ice/Config.h $(includedir)/Ice/ProxyHandle.h $(includedir)/Ice/ProxyF.h $(includedir)/Ice/ObjectF.h $(includedir)/Ice/GCCountMap.h $(includedir)/Ice/GCShared.h $(includedir)/Ice/Exception.h $(includedir)/Ice/LocalObject.h $(includedir)/Ice/UndefSysMacros.h $(includedir)/Ice/PropertiesF.h $(includedir)/Ice/Proxy.h $(includedir)/IceUtil/Mutex.h $(includedir)/IceUtil/Lock.h $(includedir)/IceUtil/ThreadException.h $(includedir)/IceUtil/Time.h $(includedir)/Ice/ProxyFactoryF.h $(includedir)/Ice/ConnectionIF.h $(includedir)/Ice/RequestHandlerF.h $(includedir)/Ice/EndpointIF.h $(includedir)/Ice/Endpoint.h $(includedir)/Ice/ObjectAdapterF.h $(includedir)/Ice/ReferenceF.h $(includedir)/Ice/OutgoingAsyncF.h $(includedir)/Ice/Current.h $(includedir)/Ice/ConnectionF.h $(includedir)/Ice/Identity.h $(includedir)/Ice/StreamF.h $(includedir)/Ice/Object.h $(includedir)/Ice/IncomingAsyncF.h $(includedir)/Ice/InstanceF.h $(includedir)/Ice/LoggerF.h $(includedir)/Ice/StatsF.h $(includedir)/Ice/StringConverter.h $(includedir)/Ice/BuiltinSequences.h $(includedir)/Ice/LocalException.h $(includedir)/Ice/Properties.h $(includedir)/Ice/Outgoing.h $(includedir)/IceUtil/Monitor.h $(includedir)/IceUtil/Cond.h $(includedir)/Ice/BasicStream.h $(includedir)/Ice/ObjectFactoryF.h $(includedir)/Ice/Buffer.h $(includedir)/Ice/Protocol.h $(includedir)/IceUtil/Unicode.h $(includedir)/Ice/OutgoingAsync.h $(includedir)/IceUtil/Timer.h $(includedir)/IceUtil/Thread.h $(includedir)/Ice/Incoming.h $(includedir)/Ice/ServantLocatorF.h $(includedir)/Ice/ServantManagerF.h $(includedir)/Ice/Direct.h $(includedir)/Ice/Logger.h $(includedir)/Ice/LoggerUtil.h $(includedir)/Ice/Stats.h $(includedir)/Ice/Communicator.h $(includedir)/Ice/RouterF.h $(includedir)/Ice/LocatorF.h $(includedir)/Ice/PluginF.h $(includedir)/Ice/ImplicitContextF.h $(includedir)/Ice/ObjectFactory.h $(includedir)/Ice/ObjectAdapter.h $(includedir)/Ice/FacetMap.h $(includedir)/Ice/ServantLocator.h $(includedir)/Ice/IncomingAsync.h $(includedir)/Ice/Process.h $(includedir)/Ice/Application.h $(includedir)/Ice/Connection.h $(includedir)/Ice/Functional.h $(includedir)/IceUtil/Functional.h $(includedir)/Ice/Stream.h $(includedir)/Ice/ImplicitContext.h $(includedir)/Ice/Locator.h $(includedir)/Ice/UserExceptionFactory.h $(includedir)/Ice/FactoryTable.h $(includedir)/Ice/FactoryTableDef.h $(includedir)/IceUtil/StaticMutex.h $(includedir)/Ice/UserExceptionFactoryF.h $(includedir)/Ice/ProcessF.h $(includedir)/Ice/Router.h $(includedir)/Ice/DispatchInterceptor.h $(includedir)/Ice/IconvStringConverter.h $(includedir)/IceStorm/IceStorm.h $(includedir)/Ice/SliceChecksumDict.h CounterI.h Counter.h
-CounterI$(OBJEXT): CounterI.cpp $(includedir)/Ice/Ice.h $(includedir)/Ice/Initialize.h $(includedir)/Ice/CommunicatorF.h $(includedir)/Ice/LocalObjectF.h $(includedir)/IceUtil/Shared.h $(includedir)/IceUtil/Config.h $(includedir)/Ice/Handle.h $(includedir)/IceUtil/Handle.h $(includedir)/IceUtil/Exception.h $(includedir)/Ice/Config.h $(includedir)/Ice/ProxyHandle.h $(includedir)/Ice/ProxyF.h $(includedir)/Ice/ObjectF.h $(includedir)/Ice/GCCountMap.h $(includedir)/Ice/GCShared.h $(includedir)/Ice/Exception.h $(includedir)/Ice/LocalObject.h $(includedir)/Ice/UndefSysMacros.h $(includedir)/Ice/PropertiesF.h $(includedir)/Ice/Proxy.h $(includedir)/IceUtil/Mutex.h $(includedir)/IceUtil/Lock.h $(includedir)/IceUtil/ThreadException.h $(includedir)/IceUtil/Time.h $(includedir)/Ice/ProxyFactoryF.h $(includedir)/Ice/ConnectionIF.h $(includedir)/Ice/RequestHandlerF.h $(includedir)/Ice/EndpointIF.h $(includedir)/Ice/Endpoint.h $(includedir)/Ice/ObjectAdapterF.h $(includedir)/Ice/ReferenceF.h $(includedir)/Ice/OutgoingAsyncF.h $(includedir)/Ice/Current.h $(includedir)/Ice/ConnectionF.h $(includedir)/Ice/Identity.h $(includedir)/Ice/StreamF.h $(includedir)/Ice/Object.h $(includedir)/Ice/IncomingAsyncF.h $(includedir)/Ice/InstanceF.h $(includedir)/Ice/LoggerF.h $(includedir)/Ice/StatsF.h $(includedir)/Ice/StringConverter.h $(includedir)/Ice/BuiltinSequences.h $(includedir)/Ice/LocalException.h $(includedir)/Ice/Properties.h $(includedir)/Ice/Outgoing.h $(includedir)/IceUtil/Monitor.h $(includedir)/IceUtil/Cond.h $(includedir)/Ice/BasicStream.h $(includedir)/Ice/ObjectFactoryF.h $(includedir)/Ice/Buffer.h $(includedir)/Ice/Protocol.h $(includedir)/IceUtil/Unicode.h $(includedir)/Ice/OutgoingAsync.h $(includedir)/IceUtil/Timer.h $(includedir)/IceUtil/Thread.h $(includedir)/Ice/Incoming.h $(includedir)/Ice/ServantLocatorF.h $(includedir)/Ice/ServantManagerF.h $(includedir)/Ice/Direct.h $(includedir)/Ice/Logger.h $(includedir)/Ice/LoggerUtil.h $(includedir)/Ice/Stats.h $(includedir)/Ice/Communicator.h $(includedir)/Ice/RouterF.h $(includedir)/Ice/LocatorF.h $(includedir)/Ice/PluginF.h $(includedir)/Ice/ImplicitContextF.h $(includedir)/Ice/ObjectFactory.h $(includedir)/Ice/ObjectAdapter.h $(includedir)/Ice/FacetMap.h $(includedir)/Ice/ServantLocator.h $(includedir)/Ice/IncomingAsync.h $(includedir)/Ice/Process.h $(includedir)/Ice/Application.h $(includedir)/Ice/Connection.h $(includedir)/Ice/Functional.h $(includedir)/IceUtil/Functional.h $(includedir)/Ice/Stream.h $(includedir)/Ice/ImplicitContext.h $(includedir)/Ice/Locator.h $(includedir)/Ice/UserExceptionFactory.h $(includedir)/Ice/FactoryTable.h $(includedir)/Ice/FactoryTableDef.h $(includedir)/IceUtil/StaticMutex.h $(includedir)/Ice/UserExceptionFactoryF.h $(includedir)/Ice/ProcessF.h $(includedir)/Ice/Router.h $(includedir)/Ice/DispatchInterceptor.h $(includedir)/Ice/IconvStringConverter.h CounterI.h $(includedir)/IceStorm/IceStorm.h $(includedir)/Ice/SliceChecksumDict.h Counter.h
+Counter$(OBJEXT): Counter.cpp Counter.h $(includedir)/Ice/LocalObjectF.h $(includedir)/IceUtil/Shared.h $(includedir)/IceUtil/Config.h $(includedir)/IceUtil/Mutex.h $(includedir)/IceUtil/Lock.h $(includedir)/IceUtil/ThreadException.h $(includedir)/IceUtil/Exception.h $(includedir)/IceUtil/Time.h $(includedir)/Ice/Handle.h $(includedir)/IceUtil/Handle.h $(includedir)/Ice/Config.h $(includedir)/Ice/ProxyHandle.h $(includedir)/Ice/ProxyF.h $(includedir)/Ice/ObjectF.h $(includedir)/Ice/GCCountMap.h $(includedir)/Ice/GCShared.h $(includedir)/Ice/Exception.h $(includedir)/Ice/LocalObject.h $(includedir)/Ice/Proxy.h $(includedir)/Ice/ProxyFactoryF.h $(includedir)/Ice/ConnectionIF.h $(includedir)/Ice/RequestHandlerF.h $(includedir)/Ice/EndpointIF.h $(includedir)/Ice/Endpoint.h $(includedir)/Ice/UndefSysMacros.h $(includedir)/Ice/ObjectAdapterF.h $(includedir)/Ice/ReferenceF.h $(includedir)/Ice/OutgoingAsyncF.h $(includedir)/Ice/Current.h $(includedir)/Ice/ConnectionF.h $(includedir)/Ice/Identity.h $(includedir)/Ice/StreamF.h $(includedir)/Ice/CommunicatorF.h $(includedir)/Ice/Object.h $(includedir)/Ice/IncomingAsyncF.h $(includedir)/Ice/Outgoing.h $(includedir)/IceUtil/Monitor.h $(includedir)/IceUtil/Cond.h $(includedir)/Ice/InstanceF.h $(includedir)/Ice/BasicStream.h $(includedir)/Ice/ObjectFactoryF.h $(includedir)/Ice/Buffer.h $(includedir)/Ice/Protocol.h $(includedir)/Ice/StringConverter.h $(includedir)/IceUtil/Unicode.h $(includedir)/Ice/Incoming.h $(includedir)/Ice/ServantLocatorF.h $(includedir)/Ice/ServantManagerF.h $(includedir)/Ice/Direct.h $(includedir)/Ice/LocalException.h $(includedir)/Ice/BuiltinSequences.h $(includedir)/Ice/ObjectFactory.h $(includedir)/IceUtil/Iterator.h $(includedir)/IceUtil/ScopedArray.h
+Client$(OBJEXT): Client.cpp $(includedir)/Ice/Ice.h $(includedir)/Ice/Initialize.h $(includedir)/Ice/CommunicatorF.h $(includedir)/Ice/LocalObjectF.h $(includedir)/IceUtil/Shared.h $(includedir)/IceUtil/Config.h $(includedir)/IceUtil/Mutex.h $(includedir)/IceUtil/Lock.h $(includedir)/IceUtil/ThreadException.h $(includedir)/IceUtil/Exception.h $(includedir)/IceUtil/Time.h $(includedir)/Ice/Handle.h $(includedir)/IceUtil/Handle.h $(includedir)/Ice/Config.h $(includedir)/Ice/ProxyHandle.h $(includedir)/Ice/ProxyF.h $(includedir)/Ice/ObjectF.h $(includedir)/Ice/GCCountMap.h $(includedir)/Ice/GCShared.h $(includedir)/Ice/Exception.h $(includedir)/Ice/LocalObject.h $(includedir)/Ice/UndefSysMacros.h $(includedir)/Ice/PropertiesF.h $(includedir)/Ice/Proxy.h $(includedir)/Ice/ProxyFactoryF.h $(includedir)/Ice/ConnectionIF.h $(includedir)/Ice/RequestHandlerF.h $(includedir)/Ice/EndpointIF.h $(includedir)/Ice/Endpoint.h $(includedir)/Ice/ObjectAdapterF.h $(includedir)/Ice/ReferenceF.h $(includedir)/Ice/OutgoingAsyncF.h $(includedir)/Ice/Current.h $(includedir)/Ice/ConnectionF.h $(includedir)/Ice/Identity.h $(includedir)/Ice/StreamF.h $(includedir)/Ice/Object.h $(includedir)/Ice/IncomingAsyncF.h $(includedir)/Ice/InstanceF.h $(includedir)/Ice/LoggerF.h $(includedir)/Ice/StatsF.h $(includedir)/Ice/StringConverter.h $(includedir)/Ice/BuiltinSequences.h $(includedir)/Ice/LocalException.h $(includedir)/Ice/Properties.h $(includedir)/Ice/Outgoing.h $(includedir)/IceUtil/Monitor.h $(includedir)/IceUtil/Cond.h $(includedir)/Ice/BasicStream.h $(includedir)/Ice/ObjectFactoryF.h $(includedir)/Ice/Buffer.h $(includedir)/Ice/Protocol.h $(includedir)/IceUtil/Unicode.h $(includedir)/Ice/OutgoingAsync.h $(includedir)/IceUtil/Timer.h $(includedir)/IceUtil/Thread.h $(includedir)/Ice/Incoming.h $(includedir)/Ice/ServantLocatorF.h $(includedir)/Ice/ServantManagerF.h $(includedir)/Ice/Direct.h $(includedir)/Ice/Logger.h $(includedir)/Ice/LoggerUtil.h $(includedir)/Ice/Stats.h $(includedir)/Ice/Communicator.h $(includedir)/Ice/RouterF.h $(includedir)/Ice/LocatorF.h $(includedir)/Ice/PluginF.h $(includedir)/Ice/ImplicitContextF.h $(includedir)/Ice/ObjectFactory.h $(includedir)/Ice/ObjectAdapter.h $(includedir)/Ice/FacetMap.h $(includedir)/Ice/ServantLocator.h $(includedir)/Ice/IncomingAsync.h $(includedir)/Ice/Process.h $(includedir)/Ice/Application.h $(includedir)/Ice/Connection.h $(includedir)/Ice/Functional.h $(includedir)/IceUtil/Functional.h $(includedir)/Ice/Stream.h $(includedir)/Ice/ImplicitContext.h $(includedir)/Ice/Locator.h $(includedir)/Ice/UserExceptionFactory.h $(includedir)/Ice/FactoryTable.h $(includedir)/Ice/FactoryTableDef.h $(includedir)/IceUtil/StaticMutex.h $(includedir)/Ice/UserExceptionFactoryF.h $(includedir)/Ice/ProcessF.h $(includedir)/Ice/Router.h $(includedir)/Ice/DispatchInterceptor.h $(includedir)/Ice/IconvStringConverter.h CounterObserverI.h Counter.h
+CounterObserverI$(OBJEXT): CounterObserverI.cpp $(includedir)/Ice/Ice.h $(includedir)/Ice/Initialize.h $(includedir)/Ice/CommunicatorF.h $(includedir)/Ice/LocalObjectF.h $(includedir)/IceUtil/Shared.h $(includedir)/IceUtil/Config.h $(includedir)/IceUtil/Mutex.h $(includedir)/IceUtil/Lock.h $(includedir)/IceUtil/ThreadException.h $(includedir)/IceUtil/Exception.h $(includedir)/IceUtil/Time.h $(includedir)/Ice/Handle.h $(includedir)/IceUtil/Handle.h $(includedir)/Ice/Config.h $(includedir)/Ice/ProxyHandle.h $(includedir)/Ice/ProxyF.h $(includedir)/Ice/ObjectF.h $(includedir)/Ice/GCCountMap.h $(includedir)/Ice/GCShared.h $(includedir)/Ice/Exception.h $(includedir)/Ice/LocalObject.h $(includedir)/Ice/UndefSysMacros.h $(includedir)/Ice/PropertiesF.h $(includedir)/Ice/Proxy.h $(includedir)/Ice/ProxyFactoryF.h $(includedir)/Ice/ConnectionIF.h $(includedir)/Ice/RequestHandlerF.h $(includedir)/Ice/EndpointIF.h $(includedir)/Ice/Endpoint.h $(includedir)/Ice/ObjectAdapterF.h $(includedir)/Ice/ReferenceF.h $(includedir)/Ice/OutgoingAsyncF.h $(includedir)/Ice/Current.h $(includedir)/Ice/ConnectionF.h $(includedir)/Ice/Identity.h $(includedir)/Ice/StreamF.h $(includedir)/Ice/Object.h $(includedir)/Ice/IncomingAsyncF.h $(includedir)/Ice/InstanceF.h $(includedir)/Ice/LoggerF.h $(includedir)/Ice/StatsF.h $(includedir)/Ice/StringConverter.h $(includedir)/Ice/BuiltinSequences.h $(includedir)/Ice/LocalException.h $(includedir)/Ice/Properties.h $(includedir)/Ice/Outgoing.h $(includedir)/IceUtil/Monitor.h $(includedir)/IceUtil/Cond.h $(includedir)/Ice/BasicStream.h $(includedir)/Ice/ObjectFactoryF.h $(includedir)/Ice/Buffer.h $(includedir)/Ice/Protocol.h $(includedir)/IceUtil/Unicode.h $(includedir)/Ice/OutgoingAsync.h $(includedir)/IceUtil/Timer.h $(includedir)/IceUtil/Thread.h $(includedir)/Ice/Incoming.h $(includedir)/Ice/ServantLocatorF.h $(includedir)/Ice/ServantManagerF.h $(includedir)/Ice/Direct.h $(includedir)/Ice/Logger.h $(includedir)/Ice/LoggerUtil.h $(includedir)/Ice/Stats.h $(includedir)/Ice/Communicator.h $(includedir)/Ice/RouterF.h $(includedir)/Ice/LocatorF.h $(includedir)/Ice/PluginF.h $(includedir)/Ice/ImplicitContextF.h $(includedir)/Ice/ObjectFactory.h $(includedir)/Ice/ObjectAdapter.h $(includedir)/Ice/FacetMap.h $(includedir)/Ice/ServantLocator.h $(includedir)/Ice/IncomingAsync.h $(includedir)/Ice/Process.h $(includedir)/Ice/Application.h $(includedir)/Ice/Connection.h $(includedir)/Ice/Functional.h $(includedir)/IceUtil/Functional.h $(includedir)/Ice/Stream.h $(includedir)/Ice/ImplicitContext.h $(includedir)/Ice/Locator.h $(includedir)/Ice/UserExceptionFactory.h $(includedir)/Ice/FactoryTable.h $(includedir)/Ice/FactoryTableDef.h $(includedir)/IceUtil/StaticMutex.h $(includedir)/Ice/UserExceptionFactoryF.h $(includedir)/Ice/ProcessF.h $(includedir)/Ice/Router.h $(includedir)/Ice/DispatchInterceptor.h $(includedir)/Ice/IconvStringConverter.h CounterObserverI.h Counter.h
+Server$(OBJEXT): Server.cpp $(includedir)/Ice/Ice.h $(includedir)/Ice/Initialize.h $(includedir)/Ice/CommunicatorF.h $(includedir)/Ice/LocalObjectF.h $(includedir)/IceUtil/Shared.h $(includedir)/IceUtil/Config.h $(includedir)/IceUtil/Mutex.h $(includedir)/IceUtil/Lock.h $(includedir)/IceUtil/ThreadException.h $(includedir)/IceUtil/Exception.h $(includedir)/IceUtil/Time.h $(includedir)/Ice/Handle.h $(includedir)/IceUtil/Handle.h $(includedir)/Ice/Config.h $(includedir)/Ice/ProxyHandle.h $(includedir)/Ice/ProxyF.h $(includedir)/Ice/ObjectF.h $(includedir)/Ice/GCCountMap.h $(includedir)/Ice/GCShared.h $(includedir)/Ice/Exception.h $(includedir)/Ice/LocalObject.h $(includedir)/Ice/UndefSysMacros.h $(includedir)/Ice/PropertiesF.h $(includedir)/Ice/Proxy.h $(includedir)/Ice/ProxyFactoryF.h $(includedir)/Ice/ConnectionIF.h $(includedir)/Ice/RequestHandlerF.h $(includedir)/Ice/EndpointIF.h $(includedir)/Ice/Endpoint.h $(includedir)/Ice/ObjectAdapterF.h $(includedir)/Ice/ReferenceF.h $(includedir)/Ice/OutgoingAsyncF.h $(includedir)/Ice/Current.h $(includedir)/Ice/ConnectionF.h $(includedir)/Ice/Identity.h $(includedir)/Ice/StreamF.h $(includedir)/Ice/Object.h $(includedir)/Ice/IncomingAsyncF.h $(includedir)/Ice/InstanceF.h $(includedir)/Ice/LoggerF.h $(includedir)/Ice/StatsF.h $(includedir)/Ice/StringConverter.h $(includedir)/Ice/BuiltinSequences.h $(includedir)/Ice/LocalException.h $(includedir)/Ice/Properties.h $(includedir)/Ice/Outgoing.h $(includedir)/IceUtil/Monitor.h $(includedir)/IceUtil/Cond.h $(includedir)/Ice/BasicStream.h $(includedir)/Ice/ObjectFactoryF.h $(includedir)/Ice/Buffer.h $(includedir)/Ice/Protocol.h $(includedir)/IceUtil/Unicode.h $(includedir)/Ice/OutgoingAsync.h $(includedir)/IceUtil/Timer.h $(includedir)/IceUtil/Thread.h $(includedir)/Ice/Incoming.h $(includedir)/Ice/ServantLocatorF.h $(includedir)/Ice/ServantManagerF.h $(includedir)/Ice/Direct.h $(includedir)/Ice/Logger.h $(includedir)/Ice/LoggerUtil.h $(includedir)/Ice/Stats.h $(includedir)/Ice/Communicator.h $(includedir)/Ice/RouterF.h $(includedir)/Ice/LocatorF.h $(includedir)/Ice/PluginF.h $(includedir)/Ice/ImplicitContextF.h $(includedir)/Ice/ObjectFactory.h $(includedir)/Ice/ObjectAdapter.h $(includedir)/Ice/FacetMap.h $(includedir)/Ice/ServantLocator.h $(includedir)/Ice/IncomingAsync.h $(includedir)/Ice/Process.h $(includedir)/Ice/Application.h $(includedir)/Ice/Connection.h $(includedir)/Ice/Functional.h $(includedir)/IceUtil/Functional.h $(includedir)/Ice/Stream.h $(includedir)/Ice/ImplicitContext.h $(includedir)/Ice/Locator.h $(includedir)/Ice/UserExceptionFactory.h $(includedir)/Ice/FactoryTable.h $(includedir)/Ice/FactoryTableDef.h $(includedir)/IceUtil/StaticMutex.h $(includedir)/Ice/UserExceptionFactoryF.h $(includedir)/Ice/ProcessF.h $(includedir)/Ice/Router.h $(includedir)/Ice/DispatchInterceptor.h $(includedir)/Ice/IconvStringConverter.h $(includedir)/IceStorm/IceStorm.h $(includedir)/Ice/SliceChecksumDict.h CounterI.h Counter.h
+CounterI$(OBJEXT): CounterI.cpp $(includedir)/Ice/Ice.h $(includedir)/Ice/Initialize.h $(includedir)/Ice/CommunicatorF.h $(includedir)/Ice/LocalObjectF.h $(includedir)/IceUtil/Shared.h $(includedir)/IceUtil/Config.h $(includedir)/IceUtil/Mutex.h $(includedir)/IceUtil/Lock.h $(includedir)/IceUtil/ThreadException.h $(includedir)/IceUtil/Exception.h $(includedir)/IceUtil/Time.h $(includedir)/Ice/Handle.h $(includedir)/IceUtil/Handle.h $(includedir)/Ice/Config.h $(includedir)/Ice/ProxyHandle.h $(includedir)/Ice/ProxyF.h $(includedir)/Ice/ObjectF.h $(includedir)/Ice/GCCountMap.h $(includedir)/Ice/GCShared.h $(includedir)/Ice/Exception.h $(includedir)/Ice/LocalObject.h $(includedir)/Ice/UndefSysMacros.h $(includedir)/Ice/PropertiesF.h $(includedir)/Ice/Proxy.h $(includedir)/Ice/ProxyFactoryF.h $(includedir)/Ice/ConnectionIF.h $(includedir)/Ice/RequestHandlerF.h $(includedir)/Ice/EndpointIF.h $(includedir)/Ice/Endpoint.h $(includedir)/Ice/ObjectAdapterF.h $(includedir)/Ice/ReferenceF.h $(includedir)/Ice/OutgoingAsyncF.h $(includedir)/Ice/Current.h $(includedir)/Ice/ConnectionF.h $(includedir)/Ice/Identity.h $(includedir)/Ice/StreamF.h $(includedir)/Ice/Object.h $(includedir)/Ice/IncomingAsyncF.h $(includedir)/Ice/InstanceF.h $(includedir)/Ice/LoggerF.h $(includedir)/Ice/StatsF.h $(includedir)/Ice/StringConverter.h $(includedir)/Ice/BuiltinSequences.h $(includedir)/Ice/LocalException.h $(includedir)/Ice/Properties.h $(includedir)/Ice/Outgoing.h $(includedir)/IceUtil/Monitor.h $(includedir)/IceUtil/Cond.h $(includedir)/Ice/BasicStream.h $(includedir)/Ice/ObjectFactoryF.h $(includedir)/Ice/Buffer.h $(includedir)/Ice/Protocol.h $(includedir)/IceUtil/Unicode.h $(includedir)/Ice/OutgoingAsync.h $(includedir)/IceUtil/Timer.h $(includedir)/IceUtil/Thread.h $(includedir)/Ice/Incoming.h $(includedir)/Ice/ServantLocatorF.h $(includedir)/Ice/ServantManagerF.h $(includedir)/Ice/Direct.h $(includedir)/Ice/Logger.h $(includedir)/Ice/LoggerUtil.h $(includedir)/Ice/Stats.h $(includedir)/Ice/Communicator.h $(includedir)/Ice/RouterF.h $(includedir)/Ice/LocatorF.h $(includedir)/Ice/PluginF.h $(includedir)/Ice/ImplicitContextF.h $(includedir)/Ice/ObjectFactory.h $(includedir)/Ice/ObjectAdapter.h $(includedir)/Ice/FacetMap.h $(includedir)/Ice/ServantLocator.h $(includedir)/Ice/IncomingAsync.h $(includedir)/Ice/Process.h $(includedir)/Ice/Application.h $(includedir)/Ice/Connection.h $(includedir)/Ice/Functional.h $(includedir)/IceUtil/Functional.h $(includedir)/Ice/Stream.h $(includedir)/Ice/ImplicitContext.h $(includedir)/Ice/Locator.h $(includedir)/Ice/UserExceptionFactory.h $(includedir)/Ice/FactoryTable.h $(includedir)/Ice/FactoryTableDef.h $(includedir)/IceUtil/StaticMutex.h $(includedir)/Ice/UserExceptionFactoryF.h $(includedir)/Ice/ProcessF.h $(includedir)/Ice/Router.h $(includedir)/Ice/DispatchInterceptor.h $(includedir)/Ice/IconvStringConverter.h CounterI.h $(includedir)/IceStorm/IceStorm.h $(includedir)/Ice/SliceChecksumDict.h Counter.h
Counter.cpp: Counter.ice
Counter.ice: $(SLICE2CPP) $(SLICEPARSERLIB)
diff --git a/cpp/demo/IceStorm/counter/Server.cpp b/cpp/demo/IceStorm/counter/Server.cpp
index cdf5996e313..b58d55e2ba4 100644
--- a/cpp/demo/IceStorm/counter/Server.cpp
+++ b/cpp/demo/IceStorm/counter/Server.cpp
@@ -42,15 +42,8 @@ Server::run(int argc, char* argv[])
Ice::PropertiesPtr properties = communicator()->getProperties();
- const string proxyProperty = "IceStorm.TopicManager.Proxy";
- string proxy = properties->getProperty(proxyProperty);
- if(proxy.empty())
- {
- cerr << appName() << ": property `" << proxyProperty << "' not set" << endl;
- return EXIT_FAILURE;
- }
-
- IceStorm::TopicManagerPrx manager = IceStorm::TopicManagerPrx::checkedCast(communicator()->stringToProxy(proxy));
+ IceStorm::TopicManagerPrx manager = IceStorm::TopicManagerPrx::checkedCast(
+ communicator()->propertyToProxy("TopicManager.Proxy"));
if(!manager)
{
cerr << appName() << ": invalid proxy" << endl;
diff --git a/cpp/demo/IceStorm/counter/config.server b/cpp/demo/IceStorm/counter/config.server
index be119f2b1da..52b117f3d2f 100644
--- a/cpp/demo/IceStorm/counter/config.server
+++ b/cpp/demo/IceStorm/counter/config.server
@@ -6,7 +6,7 @@ Counter.Endpoints=tcp -p 12000
#
# This property is used by the counter server to connect with IceStorm.
#
-IceStorm.TopicManager.Proxy=DemoIceStorm/TopicManager:default -p 10000
+TopicManager.Proxy=DemoIceStorm/TopicManager:default -p 10000
#
# Network Tracing
diff --git a/cpp/demo/IceStorm/counter/config.service b/cpp/demo/IceStorm/counter/config.service
index f6deda26be5..d27cb93ce31 100644
--- a/cpp/demo/IceStorm/counter/config.service
+++ b/cpp/demo/IceStorm/counter/config.service
@@ -1,9 +1,4 @@
#
-# This property is used by the administrative client to connect to IceStorm.
-#
-IceStorm.TopicManager.Proxy=DemoIceStorm/TopicManager:default -p 10000
-
-#
# This property defines the endpoints on which the IceStorm
# TopicManager listens.
#
diff --git a/cpp/demo/IceStorm/replicated/.depend b/cpp/demo/IceStorm/replicated/.depend
index 3d3bef5952a..b70ddcd8b28 100644
--- a/cpp/demo/IceStorm/replicated/.depend
+++ b/cpp/demo/IceStorm/replicated/.depend
@@ -1,5 +1,5 @@
-Clock$(OBJEXT): Clock.cpp Clock.h $(includedir)/Ice/LocalObjectF.h $(includedir)/IceUtil/Shared.h $(includedir)/IceUtil/Config.h $(includedir)/Ice/Handle.h $(includedir)/IceUtil/Handle.h $(includedir)/IceUtil/Exception.h $(includedir)/Ice/Config.h $(includedir)/Ice/ProxyHandle.h $(includedir)/Ice/ProxyF.h $(includedir)/Ice/ObjectF.h $(includedir)/Ice/GCCountMap.h $(includedir)/Ice/GCShared.h $(includedir)/Ice/Exception.h $(includedir)/Ice/LocalObject.h $(includedir)/Ice/Proxy.h $(includedir)/IceUtil/Mutex.h $(includedir)/IceUtil/Lock.h $(includedir)/IceUtil/ThreadException.h $(includedir)/IceUtil/Time.h $(includedir)/Ice/ProxyFactoryF.h $(includedir)/Ice/ConnectionIF.h $(includedir)/Ice/RequestHandlerF.h $(includedir)/Ice/EndpointIF.h $(includedir)/Ice/Endpoint.h $(includedir)/Ice/UndefSysMacros.h $(includedir)/Ice/ObjectAdapterF.h $(includedir)/Ice/ReferenceF.h $(includedir)/Ice/OutgoingAsyncF.h $(includedir)/Ice/Current.h $(includedir)/Ice/ConnectionF.h $(includedir)/Ice/Identity.h $(includedir)/Ice/StreamF.h $(includedir)/Ice/CommunicatorF.h $(includedir)/Ice/Object.h $(includedir)/Ice/IncomingAsyncF.h $(includedir)/Ice/Outgoing.h $(includedir)/IceUtil/Monitor.h $(includedir)/IceUtil/Cond.h $(includedir)/Ice/InstanceF.h $(includedir)/Ice/BasicStream.h $(includedir)/Ice/ObjectFactoryF.h $(includedir)/Ice/Buffer.h $(includedir)/Ice/Protocol.h $(includedir)/Ice/StringConverter.h $(includedir)/IceUtil/Unicode.h $(includedir)/Ice/Incoming.h $(includedir)/Ice/ServantLocatorF.h $(includedir)/Ice/ServantManagerF.h $(includedir)/Ice/Direct.h $(includedir)/Ice/LocalException.h $(includedir)/Ice/BuiltinSequences.h $(includedir)/Ice/ObjectFactory.h $(includedir)/IceUtil/Iterator.h $(includedir)/IceUtil/ScopedArray.h
-Publisher$(OBJEXT): Publisher.cpp $(includedir)/IceUtil/IceUtil.h $(includedir)/IceUtil/Config.h $(includedir)/IceUtil/AbstractMutex.h $(includedir)/IceUtil/Lock.h $(includedir)/IceUtil/ThreadException.h $(includedir)/IceUtil/Exception.h $(includedir)/IceUtil/Time.h $(includedir)/IceUtil/Cache.h $(includedir)/IceUtil/Handle.h $(includedir)/IceUtil/Mutex.h $(includedir)/IceUtil/CountDownLatch.h $(includedir)/IceUtil/Cond.h $(includedir)/IceUtil/CtrlCHandler.h $(includedir)/IceUtil/Functional.h $(includedir)/IceUtil/Monitor.h $(includedir)/IceUtil/RWRecMutex.h $(includedir)/IceUtil/Thread.h $(includedir)/IceUtil/Shared.h $(includedir)/IceUtil/RecMutex.h $(includedir)/IceUtil/StaticMutex.h $(includedir)/IceUtil/Timer.h $(includedir)/IceUtil/UUID.h $(includedir)/IceUtil/Unicode.h $(includedir)/Ice/Ice.h $(includedir)/Ice/Initialize.h $(includedir)/Ice/CommunicatorF.h $(includedir)/Ice/LocalObjectF.h $(includedir)/Ice/Handle.h $(includedir)/Ice/Config.h $(includedir)/Ice/ProxyHandle.h $(includedir)/Ice/ProxyF.h $(includedir)/Ice/ObjectF.h $(includedir)/Ice/GCCountMap.h $(includedir)/Ice/GCShared.h $(includedir)/Ice/Exception.h $(includedir)/Ice/LocalObject.h $(includedir)/Ice/UndefSysMacros.h $(includedir)/Ice/PropertiesF.h $(includedir)/Ice/Proxy.h $(includedir)/Ice/ProxyFactoryF.h $(includedir)/Ice/ConnectionIF.h $(includedir)/Ice/RequestHandlerF.h $(includedir)/Ice/EndpointIF.h $(includedir)/Ice/Endpoint.h $(includedir)/Ice/ObjectAdapterF.h $(includedir)/Ice/ReferenceF.h $(includedir)/Ice/OutgoingAsyncF.h $(includedir)/Ice/Current.h $(includedir)/Ice/ConnectionF.h $(includedir)/Ice/Identity.h $(includedir)/Ice/StreamF.h $(includedir)/Ice/Object.h $(includedir)/Ice/IncomingAsyncF.h $(includedir)/Ice/InstanceF.h $(includedir)/Ice/LoggerF.h $(includedir)/Ice/StatsF.h $(includedir)/Ice/StringConverter.h $(includedir)/Ice/BuiltinSequences.h $(includedir)/Ice/LocalException.h $(includedir)/Ice/Properties.h $(includedir)/Ice/Outgoing.h $(includedir)/Ice/BasicStream.h $(includedir)/Ice/ObjectFactoryF.h $(includedir)/Ice/Buffer.h $(includedir)/Ice/Protocol.h $(includedir)/Ice/OutgoingAsync.h $(includedir)/Ice/Incoming.h $(includedir)/Ice/ServantLocatorF.h $(includedir)/Ice/ServantManagerF.h $(includedir)/Ice/Direct.h $(includedir)/Ice/Logger.h $(includedir)/Ice/LoggerUtil.h $(includedir)/Ice/Stats.h $(includedir)/Ice/Communicator.h $(includedir)/Ice/RouterF.h $(includedir)/Ice/LocatorF.h $(includedir)/Ice/PluginF.h $(includedir)/Ice/ImplicitContextF.h $(includedir)/Ice/ObjectFactory.h $(includedir)/Ice/ObjectAdapter.h $(includedir)/Ice/FacetMap.h $(includedir)/Ice/ServantLocator.h $(includedir)/Ice/IncomingAsync.h $(includedir)/Ice/Process.h $(includedir)/Ice/Application.h $(includedir)/Ice/Connection.h $(includedir)/Ice/Functional.h $(includedir)/Ice/Stream.h $(includedir)/Ice/ImplicitContext.h $(includedir)/Ice/Locator.h $(includedir)/Ice/UserExceptionFactory.h $(includedir)/Ice/FactoryTable.h $(includedir)/Ice/FactoryTableDef.h $(includedir)/Ice/UserExceptionFactoryF.h $(includedir)/Ice/ProcessF.h $(includedir)/Ice/Router.h $(includedir)/Ice/DispatchInterceptor.h $(includedir)/Ice/IconvStringConverter.h $(includedir)/IceStorm/IceStorm.h $(includedir)/Ice/SliceChecksumDict.h $(includedir)/IceGrid/Query.h $(includedir)/IceGrid/Exception.h Clock.h
-Subscriber$(OBJEXT): Subscriber.cpp $(includedir)/IceUtil/IceUtil.h $(includedir)/IceUtil/Config.h $(includedir)/IceUtil/AbstractMutex.h $(includedir)/IceUtil/Lock.h $(includedir)/IceUtil/ThreadException.h $(includedir)/IceUtil/Exception.h $(includedir)/IceUtil/Time.h $(includedir)/IceUtil/Cache.h $(includedir)/IceUtil/Handle.h $(includedir)/IceUtil/Mutex.h $(includedir)/IceUtil/CountDownLatch.h $(includedir)/IceUtil/Cond.h $(includedir)/IceUtil/CtrlCHandler.h $(includedir)/IceUtil/Functional.h $(includedir)/IceUtil/Monitor.h $(includedir)/IceUtil/RWRecMutex.h $(includedir)/IceUtil/Thread.h $(includedir)/IceUtil/Shared.h $(includedir)/IceUtil/RecMutex.h $(includedir)/IceUtil/StaticMutex.h $(includedir)/IceUtil/Timer.h $(includedir)/IceUtil/UUID.h $(includedir)/IceUtil/Unicode.h $(includedir)/Ice/Ice.h $(includedir)/Ice/Initialize.h $(includedir)/Ice/CommunicatorF.h $(includedir)/Ice/LocalObjectF.h $(includedir)/Ice/Handle.h $(includedir)/Ice/Config.h $(includedir)/Ice/ProxyHandle.h $(includedir)/Ice/ProxyF.h $(includedir)/Ice/ObjectF.h $(includedir)/Ice/GCCountMap.h $(includedir)/Ice/GCShared.h $(includedir)/Ice/Exception.h $(includedir)/Ice/LocalObject.h $(includedir)/Ice/UndefSysMacros.h $(includedir)/Ice/PropertiesF.h $(includedir)/Ice/Proxy.h $(includedir)/Ice/ProxyFactoryF.h $(includedir)/Ice/ConnectionIF.h $(includedir)/Ice/RequestHandlerF.h $(includedir)/Ice/EndpointIF.h $(includedir)/Ice/Endpoint.h $(includedir)/Ice/ObjectAdapterF.h $(includedir)/Ice/ReferenceF.h $(includedir)/Ice/OutgoingAsyncF.h $(includedir)/Ice/Current.h $(includedir)/Ice/ConnectionF.h $(includedir)/Ice/Identity.h $(includedir)/Ice/StreamF.h $(includedir)/Ice/Object.h $(includedir)/Ice/IncomingAsyncF.h $(includedir)/Ice/InstanceF.h $(includedir)/Ice/LoggerF.h $(includedir)/Ice/StatsF.h $(includedir)/Ice/StringConverter.h $(includedir)/Ice/BuiltinSequences.h $(includedir)/Ice/LocalException.h $(includedir)/Ice/Properties.h $(includedir)/Ice/Outgoing.h $(includedir)/Ice/BasicStream.h $(includedir)/Ice/ObjectFactoryF.h $(includedir)/Ice/Buffer.h $(includedir)/Ice/Protocol.h $(includedir)/Ice/OutgoingAsync.h $(includedir)/Ice/Incoming.h $(includedir)/Ice/ServantLocatorF.h $(includedir)/Ice/ServantManagerF.h $(includedir)/Ice/Direct.h $(includedir)/Ice/Logger.h $(includedir)/Ice/LoggerUtil.h $(includedir)/Ice/Stats.h $(includedir)/Ice/Communicator.h $(includedir)/Ice/RouterF.h $(includedir)/Ice/LocatorF.h $(includedir)/Ice/PluginF.h $(includedir)/Ice/ImplicitContextF.h $(includedir)/Ice/ObjectFactory.h $(includedir)/Ice/ObjectAdapter.h $(includedir)/Ice/FacetMap.h $(includedir)/Ice/ServantLocator.h $(includedir)/Ice/IncomingAsync.h $(includedir)/Ice/Process.h $(includedir)/Ice/Application.h $(includedir)/Ice/Connection.h $(includedir)/Ice/Functional.h $(includedir)/Ice/Stream.h $(includedir)/Ice/ImplicitContext.h $(includedir)/Ice/Locator.h $(includedir)/Ice/UserExceptionFactory.h $(includedir)/Ice/FactoryTable.h $(includedir)/Ice/FactoryTableDef.h $(includedir)/Ice/UserExceptionFactoryF.h $(includedir)/Ice/ProcessF.h $(includedir)/Ice/Router.h $(includedir)/Ice/DispatchInterceptor.h $(includedir)/Ice/IconvStringConverter.h $(includedir)/IceStorm/IceStorm.h $(includedir)/Ice/SliceChecksumDict.h $(includedir)/IceGrid/Query.h $(includedir)/IceGrid/Exception.h Clock.h
+Clock$(OBJEXT): Clock.cpp Clock.h $(includedir)/Ice/LocalObjectF.h $(includedir)/IceUtil/Shared.h $(includedir)/IceUtil/Config.h $(includedir)/IceUtil/Mutex.h $(includedir)/IceUtil/Lock.h $(includedir)/IceUtil/ThreadException.h $(includedir)/IceUtil/Exception.h $(includedir)/IceUtil/Time.h $(includedir)/Ice/Handle.h $(includedir)/IceUtil/Handle.h $(includedir)/Ice/Config.h $(includedir)/Ice/ProxyHandle.h $(includedir)/Ice/ProxyF.h $(includedir)/Ice/ObjectF.h $(includedir)/Ice/GCCountMap.h $(includedir)/Ice/GCShared.h $(includedir)/Ice/Exception.h $(includedir)/Ice/LocalObject.h $(includedir)/Ice/Proxy.h $(includedir)/Ice/ProxyFactoryF.h $(includedir)/Ice/ConnectionIF.h $(includedir)/Ice/RequestHandlerF.h $(includedir)/Ice/EndpointIF.h $(includedir)/Ice/Endpoint.h $(includedir)/Ice/UndefSysMacros.h $(includedir)/Ice/ObjectAdapterF.h $(includedir)/Ice/ReferenceF.h $(includedir)/Ice/OutgoingAsyncF.h $(includedir)/Ice/Current.h $(includedir)/Ice/ConnectionF.h $(includedir)/Ice/Identity.h $(includedir)/Ice/StreamF.h $(includedir)/Ice/CommunicatorF.h $(includedir)/Ice/Object.h $(includedir)/Ice/IncomingAsyncF.h $(includedir)/Ice/Outgoing.h $(includedir)/IceUtil/Monitor.h $(includedir)/IceUtil/Cond.h $(includedir)/Ice/InstanceF.h $(includedir)/Ice/BasicStream.h $(includedir)/Ice/ObjectFactoryF.h $(includedir)/Ice/Buffer.h $(includedir)/Ice/Protocol.h $(includedir)/Ice/StringConverter.h $(includedir)/IceUtil/Unicode.h $(includedir)/Ice/Incoming.h $(includedir)/Ice/ServantLocatorF.h $(includedir)/Ice/ServantManagerF.h $(includedir)/Ice/Direct.h $(includedir)/Ice/LocalException.h $(includedir)/Ice/BuiltinSequences.h $(includedir)/Ice/ObjectFactory.h $(includedir)/IceUtil/Iterator.h $(includedir)/IceUtil/ScopedArray.h
+Publisher$(OBJEXT): Publisher.cpp $(includedir)/IceUtil/IceUtil.h $(includedir)/IceUtil/Config.h $(includedir)/IceUtil/AbstractMutex.h $(includedir)/IceUtil/Lock.h $(includedir)/IceUtil/ThreadException.h $(includedir)/IceUtil/Exception.h $(includedir)/IceUtil/Time.h $(includedir)/IceUtil/Cache.h $(includedir)/IceUtil/Handle.h $(includedir)/IceUtil/Mutex.h $(includedir)/IceUtil/CountDownLatch.h $(includedir)/IceUtil/Cond.h $(includedir)/IceUtil/CtrlCHandler.h $(includedir)/IceUtil/Functional.h $(includedir)/IceUtil/Monitor.h $(includedir)/IceUtil/RWRecMutex.h $(includedir)/IceUtil/Thread.h $(includedir)/IceUtil/Shared.h $(includedir)/IceUtil/RecMutex.h $(includedir)/IceUtil/StaticMutex.h $(includedir)/IceUtil/Timer.h $(includedir)/IceUtil/UUID.h $(includedir)/IceUtil/Unicode.h $(includedir)/Ice/Ice.h $(includedir)/Ice/Initialize.h $(includedir)/Ice/CommunicatorF.h $(includedir)/Ice/LocalObjectF.h $(includedir)/Ice/Handle.h $(includedir)/Ice/Config.h $(includedir)/Ice/ProxyHandle.h $(includedir)/Ice/ProxyF.h $(includedir)/Ice/ObjectF.h $(includedir)/Ice/GCCountMap.h $(includedir)/Ice/GCShared.h $(includedir)/Ice/Exception.h $(includedir)/Ice/LocalObject.h $(includedir)/Ice/UndefSysMacros.h $(includedir)/Ice/PropertiesF.h $(includedir)/Ice/Proxy.h $(includedir)/Ice/ProxyFactoryF.h $(includedir)/Ice/ConnectionIF.h $(includedir)/Ice/RequestHandlerF.h $(includedir)/Ice/EndpointIF.h $(includedir)/Ice/Endpoint.h $(includedir)/Ice/ObjectAdapterF.h $(includedir)/Ice/ReferenceF.h $(includedir)/Ice/OutgoingAsyncF.h $(includedir)/Ice/Current.h $(includedir)/Ice/ConnectionF.h $(includedir)/Ice/Identity.h $(includedir)/Ice/StreamF.h $(includedir)/Ice/Object.h $(includedir)/Ice/IncomingAsyncF.h $(includedir)/Ice/InstanceF.h $(includedir)/Ice/LoggerF.h $(includedir)/Ice/StatsF.h $(includedir)/Ice/StringConverter.h $(includedir)/Ice/BuiltinSequences.h $(includedir)/Ice/LocalException.h $(includedir)/Ice/Properties.h $(includedir)/Ice/Outgoing.h $(includedir)/Ice/BasicStream.h $(includedir)/Ice/ObjectFactoryF.h $(includedir)/Ice/Buffer.h $(includedir)/Ice/Protocol.h $(includedir)/Ice/OutgoingAsync.h $(includedir)/Ice/Incoming.h $(includedir)/Ice/ServantLocatorF.h $(includedir)/Ice/ServantManagerF.h $(includedir)/Ice/Direct.h $(includedir)/Ice/Logger.h $(includedir)/Ice/LoggerUtil.h $(includedir)/Ice/Stats.h $(includedir)/Ice/Communicator.h $(includedir)/Ice/RouterF.h $(includedir)/Ice/LocatorF.h $(includedir)/Ice/PluginF.h $(includedir)/Ice/ImplicitContextF.h $(includedir)/Ice/ObjectFactory.h $(includedir)/Ice/ObjectAdapter.h $(includedir)/Ice/FacetMap.h $(includedir)/Ice/ServantLocator.h $(includedir)/Ice/IncomingAsync.h $(includedir)/Ice/Process.h $(includedir)/Ice/Application.h $(includedir)/Ice/Connection.h $(includedir)/Ice/Functional.h $(includedir)/Ice/Stream.h $(includedir)/Ice/ImplicitContext.h $(includedir)/Ice/Locator.h $(includedir)/Ice/UserExceptionFactory.h $(includedir)/Ice/FactoryTable.h $(includedir)/Ice/FactoryTableDef.h $(includedir)/Ice/UserExceptionFactoryF.h $(includedir)/Ice/ProcessF.h $(includedir)/Ice/Router.h $(includedir)/Ice/DispatchInterceptor.h $(includedir)/Ice/IconvStringConverter.h $(includedir)/IceStorm/IceStorm.h $(includedir)/Ice/SliceChecksumDict.h Clock.h
+Subscriber$(OBJEXT): Subscriber.cpp $(includedir)/IceUtil/IceUtil.h $(includedir)/IceUtil/Config.h $(includedir)/IceUtil/AbstractMutex.h $(includedir)/IceUtil/Lock.h $(includedir)/IceUtil/ThreadException.h $(includedir)/IceUtil/Exception.h $(includedir)/IceUtil/Time.h $(includedir)/IceUtil/Cache.h $(includedir)/IceUtil/Handle.h $(includedir)/IceUtil/Mutex.h $(includedir)/IceUtil/CountDownLatch.h $(includedir)/IceUtil/Cond.h $(includedir)/IceUtil/CtrlCHandler.h $(includedir)/IceUtil/Functional.h $(includedir)/IceUtil/Monitor.h $(includedir)/IceUtil/RWRecMutex.h $(includedir)/IceUtil/Thread.h $(includedir)/IceUtil/Shared.h $(includedir)/IceUtil/RecMutex.h $(includedir)/IceUtil/StaticMutex.h $(includedir)/IceUtil/Timer.h $(includedir)/IceUtil/UUID.h $(includedir)/IceUtil/Unicode.h $(includedir)/Ice/Ice.h $(includedir)/Ice/Initialize.h $(includedir)/Ice/CommunicatorF.h $(includedir)/Ice/LocalObjectF.h $(includedir)/Ice/Handle.h $(includedir)/Ice/Config.h $(includedir)/Ice/ProxyHandle.h $(includedir)/Ice/ProxyF.h $(includedir)/Ice/ObjectF.h $(includedir)/Ice/GCCountMap.h $(includedir)/Ice/GCShared.h $(includedir)/Ice/Exception.h $(includedir)/Ice/LocalObject.h $(includedir)/Ice/UndefSysMacros.h $(includedir)/Ice/PropertiesF.h $(includedir)/Ice/Proxy.h $(includedir)/Ice/ProxyFactoryF.h $(includedir)/Ice/ConnectionIF.h $(includedir)/Ice/RequestHandlerF.h $(includedir)/Ice/EndpointIF.h $(includedir)/Ice/Endpoint.h $(includedir)/Ice/ObjectAdapterF.h $(includedir)/Ice/ReferenceF.h $(includedir)/Ice/OutgoingAsyncF.h $(includedir)/Ice/Current.h $(includedir)/Ice/ConnectionF.h $(includedir)/Ice/Identity.h $(includedir)/Ice/StreamF.h $(includedir)/Ice/Object.h $(includedir)/Ice/IncomingAsyncF.h $(includedir)/Ice/InstanceF.h $(includedir)/Ice/LoggerF.h $(includedir)/Ice/StatsF.h $(includedir)/Ice/StringConverter.h $(includedir)/Ice/BuiltinSequences.h $(includedir)/Ice/LocalException.h $(includedir)/Ice/Properties.h $(includedir)/Ice/Outgoing.h $(includedir)/Ice/BasicStream.h $(includedir)/Ice/ObjectFactoryF.h $(includedir)/Ice/Buffer.h $(includedir)/Ice/Protocol.h $(includedir)/Ice/OutgoingAsync.h $(includedir)/Ice/Incoming.h $(includedir)/Ice/ServantLocatorF.h $(includedir)/Ice/ServantManagerF.h $(includedir)/Ice/Direct.h $(includedir)/Ice/Logger.h $(includedir)/Ice/LoggerUtil.h $(includedir)/Ice/Stats.h $(includedir)/Ice/Communicator.h $(includedir)/Ice/RouterF.h $(includedir)/Ice/LocatorF.h $(includedir)/Ice/PluginF.h $(includedir)/Ice/ImplicitContextF.h $(includedir)/Ice/ObjectFactory.h $(includedir)/Ice/ObjectAdapter.h $(includedir)/Ice/FacetMap.h $(includedir)/Ice/ServantLocator.h $(includedir)/Ice/IncomingAsync.h $(includedir)/Ice/Process.h $(includedir)/Ice/Application.h $(includedir)/Ice/Connection.h $(includedir)/Ice/Functional.h $(includedir)/Ice/Stream.h $(includedir)/Ice/ImplicitContext.h $(includedir)/Ice/Locator.h $(includedir)/Ice/UserExceptionFactory.h $(includedir)/Ice/FactoryTable.h $(includedir)/Ice/FactoryTableDef.h $(includedir)/Ice/UserExceptionFactoryF.h $(includedir)/Ice/ProcessF.h $(includedir)/Ice/Router.h $(includedir)/Ice/DispatchInterceptor.h $(includedir)/Ice/IconvStringConverter.h $(includedir)/IceStorm/IceStorm.h $(includedir)/Ice/SliceChecksumDict.h Clock.h
Clock.cpp: Clock.ice
Clock.ice: $(SLICE2CPP) $(SLICEPARSERLIB)
diff --git a/cpp/demo/IceStorm/replicated/Publisher.cpp b/cpp/demo/IceStorm/replicated/Publisher.cpp
index 44e0f3fd1ec..6fb1acf9474 100644
--- a/cpp/demo/IceStorm/replicated/Publisher.cpp
+++ b/cpp/demo/IceStorm/replicated/Publisher.cpp
@@ -10,7 +10,6 @@
#include <IceUtil/IceUtil.h>
#include <Ice/Ice.h>
#include <IceStorm/IceStorm.h>
-#include <IceGrid/Query.h>
#include <Clock.h>
@@ -31,31 +30,79 @@ main(int argc, char* argv[])
return app.main(argc, argv, "config.pub");
}
+void
+usage(const string& n)
+{
+ cerr << "Usage: " << n << " [--datagram|--twoway|--oneway] [topic]" << endl;
+}
+
int
Publisher::run(int argc, char* argv[])
{
- if(argc > 2)
+ enum Option { None, Datagram, Twoway, Oneway };
+ Option option = None;
+ string topicName = "time";
+ int i;
+
+ for(i = 1; i < argc; ++i)
{
- cerr << appName() << ": too many arguments" << endl;
- return EXIT_FAILURE;
- }
+ string optionString = argv[i];
+ Option oldoption = option;
+ if(optionString == "--datagram")
+ {
+ option = Datagram;
+ }
+ else if(optionString == "--twoway")
+ {
+ option = Twoway;
+ }
+ else if(optionString == "--oneway")
+ {
+ option = Oneway;
+ }
+ else if(optionString.substr(0, 2) == "--")
+ {
+ usage(argv[0]);
+ return EXIT_FAILURE;
+ }
+ else
+ {
+ topicName = argv[i++];
+ break;
+ }
- Ice::PropertiesPtr properties = communicator()->getProperties();
+ if(oldoption != option && oldoption != None)
+ {
+ usage(argv[0]);
+ return EXIT_FAILURE;
+ }
+ }
- IceStorm::TopicManagerPrx manager =
- IceStorm::TopicManagerPrx::checkedCast(communicator()->stringToProxy("DemoIceStorm/TopicManager"));
- if(manager == 0)
+ if(i != argc)
{
- cerr << appName() << ": no topic manager found, make sure application was deployed." << endl;
+ usage(argv[0]);
return EXIT_FAILURE;
}
- string topicName = "time";
- if(argc != 1)
+ IceStorm::TopicManagerPrx manager;
+ try
{
- topicName = argv[1];
+ manager = IceStorm::TopicManagerPrx::checkedCast(communicator()->stringToProxy("DemoIceStorm/TopicManager"));
+ if(!manager)
+ {
+ cerr << appName() << ": invalid proxy" << endl;
+ return EXIT_FAILURE;
+ }
+ }
+ catch(const Ice::NotRegisteredException&)
+ {
+ cerr << appName() << ": no topic manager found, make sure application was deployed." << endl;
+ return EXIT_FAILURE;
}
+ //
+ // Retrieve the topic.
+ //
IceStorm::TopicPrx topic;
try
{
@@ -63,16 +110,38 @@ Publisher::run(int argc, char* argv[])
}
catch(const IceStorm::NoSuchTopic&)
{
- cerr << appName() << ": topics not created yet, run subscriber." << endl;
- return EXIT_FAILURE;
+ try
+ {
+ topic = manager->create(topicName);
+ }
+ catch(const IceStorm::TopicExists&)
+ {
+ cerr << appName() << ": temporary failure. try again." << endl;
+ return EXIT_FAILURE;
+ }
}
//
- // Get the topic's publisher object, and configure a Clock proxy
- // with per-request load balancing.
+ // Get the topic's publisher object, and create a Clock proxy with
+ // the mode specified as an argument of this application.
//
- ClockPrx clock = ClockPrx::uncheckedCast(topic->getPublisher()->ice_oneway()->ice_connectionCached(false));
+ Ice::ObjectPrx publisher = topic->getPublisher();
+ if(option == Datagram)
+ {
+ publisher = publisher->ice_datagram();
+ }
+ else if(option == Twoway)
+ {
+ // Do nothing.
+ }
+ else if(option == Oneway || option == None)
+ {
+ publisher = publisher->ice_oneway();
+ }
+
+ ClockPrx clock = ClockPrx::uncheckedCast(publisher);
+ cout << "publishing tick events. Press ^C to terminate the application." << endl;
try
{
while(true)
diff --git a/cpp/demo/IceStorm/replicated/Subscriber.cpp b/cpp/demo/IceStorm/replicated/Subscriber.cpp
index 7a0848c76a4..9754af70bcd 100644
--- a/cpp/demo/IceStorm/replicated/Subscriber.cpp
+++ b/cpp/demo/IceStorm/replicated/Subscriber.cpp
@@ -10,128 +10,12 @@
#include <IceUtil/IceUtil.h>
#include <Ice/Ice.h>
#include <IceStorm/IceStorm.h>
-#include <IceGrid/Query.h>
#include <Clock.h>
-#include <set>
-
using namespace std;
using namespace Demo;
-class InstanceCheckThread : public IceUtil::Thread, public IceUtil::Monitor<IceUtil::Mutex>
-{
-public:
-
- InstanceCheckThread(const IceGrid::QueryPrx& query, const string& topicName, const Ice::ObjectPrx& clock,
- const Ice::ObjectPrx& managerReplica, const set<IceStorm::TopicManagerPrx>& managers,
- const Ice::ObjectPrx& topicReplica, const set<IceStorm::TopicPrx>& topics) :
- _query(query),
- _topicName(topicName),
- _clock(clock),
- _managerReplica(managerReplica),
- _managers(managers),
- _topicReplica(topicReplica),
- _topics(topics),
- _timeout(IceUtil::Time::seconds(10)),
- _terminated(false)
- {
- }
-
- virtual void
- run()
- {
- Lock sync(*this);
- while(!_terminated)
- {
- timedWait(_timeout);
- if(!_terminated)
- {
- try
- {
- //
- // Check if there are any new topic managers in the replicas list.
- //
- Ice::ObjectProxySeq managers = _query->findAllReplicas(_managerReplica);
- Ice::ObjectProxySeq::const_iterator p;
- for(p = managers.begin(); p != managers.end(); ++p)
- {
- IceStorm::TopicManagerPrx manager = IceStorm::TopicManagerPrx::uncheckedCast(*p);
- if(_managers.find(manager) == _managers.end())
- {
- //
- // Create the topic on the new topic manager if it does
- // not already exist.
- //
- try
- {
- manager->retrieve(_topicName);
- }
- catch(const IceStorm::NoSuchTopic&)
- {
- manager->create(_topicName);
- }
-
- //
- // Since the topic proxy returned by the retrieval/creation
- // is a replicated proxy we cannot use it to subscribe to the
- // new instance. Instead we have to retrive all the topics and
- // find the new one.
- //
- Ice::ObjectProxySeq topics = _query->findAllReplicas(_topicReplica);
- Ice::ObjectProxySeq::const_iterator q;
- for(q = topics.begin(); q != topics.end(); ++q)
- {
- IceStorm::TopicPrx topic = IceStorm::TopicPrx::uncheckedCast(*q);;
- if(_topics.find(topic) == _topics.end())
- {
- try
- {
- topic->subscribeAndGetPublisher(IceStorm::QoS(), _clock);
- }
- catch(const IceStorm::AlreadySubscribed&)
- {
- // Ignore
- }
- _topics.insert(topic);
- _managers.insert(manager);
- break;
- }
- }
- }
- }
- }
- catch(const Ice::Exception& ex)
- {
- cerr << "warning: exception while checking for new IceStorm instances: " << ex << endl;
- }
- }
- }
- }
-
- void
- terminate()
- {
- Lock sync(*this);
- _terminated = true;
- notify();
- }
-
-private:
-
- const IceGrid::QueryPrx _query;
- const string _topicName;
- const Ice::ObjectPrx _clock;
- const Ice::ObjectPrx _managerReplica;
- set<IceStorm::TopicManagerPrx> _managers;
- const Ice::ObjectPrx _topicReplica;
- set<IceStorm::TopicPrx> _topics;
- const IceUtil::Time _timeout;
- bool _terminated;
-};
-
-typedef IceUtil::Handle<InstanceCheckThread> InstanceCheckThreadPtr;
-
class ClockI : public Clock
{
public:
@@ -157,109 +41,226 @@ main(int argc, char* argv[])
return app.main(argc, argv, "config.sub");
}
+void
+usage(const string& n)
+{
+ cerr << "Usage: " << n
+ << " [--batch] [--datagram|--twoway|--ordered|--oneway] [--retryCount count] [--id id] [topic]" << endl;
+}
+
int
Subscriber::run(int argc, char* argv[])
{
- if(argc > 2)
+ Ice::StringSeq args = Ice::argsToStringSeq(argc, argv);
+ args = communicator()->getProperties()->parseCommandLineOptions("Clock", args);
+ Ice::stringSeqToArgs(args, argc, argv);
+
+ bool batch = false;
+ enum Option { None, Datagram, Twoway, Oneway, Ordered};
+ Option option = None;
+ string topicName = "time";
+ string id;
+ string retryCount;
+ int i;
+
+ for(i = 1; i < argc; ++i)
{
- cerr << appName() << ": too many arguments" << endl;
- return EXIT_FAILURE;
- }
+ string optionString = argv[i];
+ Option oldoption = option;
+ if(optionString == "--datagram")
+ {
+ option = Datagram;
+ }
+ else if(optionString == "--twoway")
+ {
+ option = Twoway;
+ }
+ else if(optionString == "--oneway")
+ {
+ option = Oneway;
+ }
+ else if(optionString == "--ordered")
+ {
+ option = Ordered;
+ }
+ else if(optionString == "--batch")
+ {
+ batch = true;
+ }
+ else if(optionString == "--id")
+ {
+ ++i;
+ if(i >= argc)
+ {
+ usage(argv[0]);
+ return EXIT_FAILURE;
+ }
+ id = argv[i];
+ }
+ else if(optionString == "--retryCount")
+ {
+ ++i;
+ if(i >= argc)
+ {
+ usage(argv[0]);
+ return EXIT_FAILURE;
+ }
+ retryCount = argv[i];
+ }
+ else if(optionString.substr(0, 2) == "--")
+ {
+ usage(argv[0]);
+ return EXIT_FAILURE;
+ }
+ else
+ {
+ topicName = argv[i++];
+ break;
+ }
- Ice::PropertiesPtr properties = communicator()->getProperties();
+ if(oldoption != option && oldoption != None)
+ {
+ usage(argv[0]);
+ return EXIT_FAILURE;
+ }
+ }
- IceGrid::QueryPrx query = IceGrid::QueryPrx::uncheckedCast(communicator()->stringToProxy("DemoIceGrid/Query"));
- Ice::ObjectPrx managerReplica = communicator()->stringToProxy("DemoIceStorm/TopicManager");
- Ice::ObjectProxySeq objSeq = query->findAllReplicas(managerReplica);
- if(objSeq.size() == 0)
+ if(i != argc)
{
- cerr << appName() << ": no topic managers found, make sure application was deployed." << endl;
+ usage(argv[0]);
return EXIT_FAILURE;
}
- string topicName = "time";
- if(argc != 1)
+ if(!retryCount.empty())
{
- topicName = argv[1];
+ if(option == None)
+ {
+ option = Twoway;
+ }
+ else if(option != Twoway && option != Ordered)
+ {
+ cerr << argv[0] << ": retryCount requires a twoway proxy" << endl;
+ return EXIT_FAILURE;
+ }
}
- //
- // Create the servant to receive the events.
- //
- Ice::ObjectAdapterPtr adapter = communicator()->createObjectAdapter("Clock.Subscriber");
-
- //
- // We want to use oneway batch messages.
- //
- Ice::ObjectPrx clock = adapter->addWithUUID(new ClockI)->ice_batchOneway();
+ if(batch && (option == Twoway || option == Ordered))
+ {
+ cerr << argv[0] << ": batch can only be set with oneway or datagram" << endl;
+ return EXIT_FAILURE;
+ }
- //
- // Get all the topic managers and create the topic if necessary.
- //
- IceStorm::TopicPrx topicReplica;
- set<IceStorm::TopicManagerPrx> managers;
- Ice::ObjectProxySeq::const_iterator p;
- for(p = objSeq.begin(); p != objSeq.end(); ++p)
+ IceStorm::TopicManagerPrx manager;
+ try
+ {
+ manager = IceStorm::TopicManagerPrx::checkedCast(communicator()->stringToProxy("DemoIceStorm/TopicManager"));
+ if(!manager)
+ {
+ cerr << appName() << ": invalid proxy" << endl;
+ return EXIT_FAILURE;
+ }
+ }
+ catch(const Ice::NotRegisteredException&)
{
- IceStorm::TopicManagerPrx manager = IceStorm::TopicManagerPrx::checkedCast(*p);
- managers.insert(manager);
+ cerr << appName() << ": no topic manager found, make sure application was deployed." << endl;
+ return EXIT_FAILURE;
+ }
+ IceStorm::TopicPrx topic;
+ try
+ {
+ topic = manager->retrieve(topicName);
+ }
+ catch(const IceStorm::NoSuchTopic&)
+ {
try
{
- topicReplica = manager->retrieve(topicName);
+ topic = manager->create(topicName);
}
- catch(const IceStorm::NoSuchTopic&)
+ catch(const IceStorm::TopicExists&)
{
- try
- {
- topicReplica = manager->create(topicName);
- }
- catch(const IceStorm::TopicExists&)
- {
- cerr << appName() << ": temporary failure. try again." << endl;
- return EXIT_FAILURE;
- }
+ cerr << appName() << ": temporary failure. try again." << endl;
+ return EXIT_FAILURE;
}
}
+ Ice::ObjectAdapterPtr adapter = communicator()->createObjectAdapter("Clock.Subscriber");
+
//
- // Get all the topics and subscribe. We can't use the proxies returned by
- // the topic creation above because they are repicated proxies, and not
- // specific proxies for each individual topic.
+ // Add a servant for the Ice object. If --id is used the identity
+ // comes from the command line, otherwise a UUID is used.
//
- IceStorm::TopicPrx topic;
- objSeq = query->findAllReplicas(topicReplica);
- set<IceStorm::TopicPrx> topics;
- for(p = objSeq.begin(); p != objSeq.end(); ++p)
+ // id is not directly altered since it is used below to detect
+ // whether subscribeAndGetPublisher can raise AlreadySubscribed.
+ //
+ Ice::Identity subId;
+ subId.name = id;
+ if(subId.name.empty())
{
- topic = IceStorm::TopicPrx::uncheckedCast(*p);
- topic->subscribeAndGetPublisher(IceStorm::QoS(), clock);
- topics.insert(topic);
+ subId.name = IceUtil::generateUUID();
+ }
+ Ice::ObjectPrx subscriber = adapter->add(new ClockI, subId);
+
+ IceStorm::QoS qos;
+ if(!retryCount.empty())
+ {
+ qos["retryCount"] = retryCount;
}
//
- // Create and start thread to check for new IceStorm instances coming online.
+ // Set up the proxy.
//
- InstanceCheckThreadPtr instanceCheck =
- new InstanceCheckThread(query, topicName, clock, managerReplica, managers, topicReplica, topics);
- instanceCheck->start();
+ if(option == Datagram)
+ {
+ if(batch)
+ {
+ subscriber = subscriber->ice_batchDatagram();
+ }
+ else
+ {
+ subscriber = subscriber->ice_datagram();
+ }
+ }
+ else if(option == Twoway)
+ {
+ // Do nothing to the subscriber proxy. Its already twoway.
+ }
+ else if(option == Ordered)
+ {
+ // Do nothing to the subscriber proxy. Its already twoway.
+ qos["reliability"] = "ordered";
+ }
+ else if(option == Oneway || option == None)
+ {
+ if(batch)
+ {
+ subscriber = subscriber->ice_batchOneway();
+ }
+ else
+ {
+ subscriber = subscriber->ice_oneway();
+ }
+ }
+ try
+ {
+ topic->subscribeAndGetPublisher(qos, subscriber);
+ }
+ catch(const IceStorm::AlreadySubscribed&)
+ {
+ // If we're manually setting the subscriber id ignore.
+ if(id.empty())
+ {
+ throw;
+ }
+ cout << "reactivating persistent subscriber" << endl;
+ }
adapter->activate();
+
shutdownOnInterrupt();
communicator()->waitForShutdown();
- instanceCheck->terminate();
- instanceCheck->getThreadControl().join();
-
- //
- // Unsubscribe from all topics.
- //
- objSeq = query->findAllReplicas(topicReplica);
- for(p = objSeq.begin(); p != objSeq.end(); ++p)
- {
- topic = IceStorm::TopicPrx::uncheckedCast(*p);
- topic->unsubscribe(clock);
- }
+ topic->unsubscribe(subscriber);
return EXIT_SUCCESS;
}
diff --git a/cpp/demo/IceStorm/replicated/application.xml b/cpp/demo/IceStorm/replicated/application.xml
index 65f10019719..df06c34af41 100644
--- a/cpp/demo/IceStorm/replicated/application.xml
+++ b/cpp/demo/IceStorm/replicated/application.xml
@@ -6,8 +6,10 @@
<parameter name="index"/>
<parameter name="topic-manager-endpoints" default="default"/>
<parameter name="publish-endpoints" default="default"/>
+ <parameter name="node-endpoints" default="default"/>
+ <parameter name="instance-name"/>
- <icebox id="DemoIceStorm-${index}" exe="icebox" activation="on-demand">
+ <icebox id="${instance-name}-${index}" exe="icebox" activation="on-demand">
<service name="IceStorm" entry="IceStormService,33:createIceStorm">
@@ -15,17 +17,22 @@
<adapter name="${service}.TopicManager"
endpoints="${topic-manager-endpoints}"
- replica-group="IceStormTopicManagerReplicaGroup"/>
+ replica-group="${instance-name}-TopicManagerReplicaGroup"/>
- <adapter name="${service}.Publish"
- endpoints="${publish-endpoints}"
- replica-group="IceStormPublishReplicaGroup"/>
+ <adapter name="${service}.Publish"
+ endpoints="${publish-endpoints}"
+ replica-group="${instance-name}-PublishReplicaGroup"/>
+
+ <adapter name="${service}.Node"
+ endpoints="${node-endpoints}"/>
<properties>
- <property name="${service}.InstanceName" value="DemoIceStorm"/>
+ <property name="${service}.InstanceName" value="${instance-name}"/>
<property name="${service}.Trace.TopicManager" value="2"/>
<property name="${service}.Trace.Topic" value="1"/>
<property name="${service}.Trace.Subscriber" value="1"/>
+ <property name="${service}.Trace.Election" value="1"/>
+ <property name="${service}.NodeId" value="${index}"/>
</properties>
</service>
@@ -33,17 +40,17 @@
</icebox>
</server-template>
- <replica-group id="IceStormPublishReplicaGroup">
+ <replica-group id="DemoIceStorm-PublishReplicaGroup">
</replica-group>
- <replica-group id="IceStormTopicManagerReplicaGroup">
+ <replica-group id="DemoIceStorm-TopicManagerReplicaGroup">
<object identity="DemoIceStorm/TopicManager" type="::IceStorm::TopicManager"/>
</replica-group>
<node name="localhost">
- <server-instance template="IceStorm" index="1"/>
- <server-instance template="IceStorm" index="2"/>
- <server-instance template="IceStorm" index="3"/>
+ <server-instance template="IceStorm" index="1" instance-name="DemoIceStorm"/>
+ <server-instance template="IceStorm" index="2" instance-name="DemoIceStorm"/>
+ <server-instance template="IceStorm" index="3" instance-name="DemoIceStorm"/>
</node>
</application>
diff --git a/cpp/demo/IceStorm/replicated2/.depend b/cpp/demo/IceStorm/replicated2/.depend
new file mode 100644
index 00000000000..b70ddcd8b28
--- /dev/null
+++ b/cpp/demo/IceStorm/replicated2/.depend
@@ -0,0 +1,5 @@
+Clock$(OBJEXT): Clock.cpp Clock.h $(includedir)/Ice/LocalObjectF.h $(includedir)/IceUtil/Shared.h $(includedir)/IceUtil/Config.h $(includedir)/IceUtil/Mutex.h $(includedir)/IceUtil/Lock.h $(includedir)/IceUtil/ThreadException.h $(includedir)/IceUtil/Exception.h $(includedir)/IceUtil/Time.h $(includedir)/Ice/Handle.h $(includedir)/IceUtil/Handle.h $(includedir)/Ice/Config.h $(includedir)/Ice/ProxyHandle.h $(includedir)/Ice/ProxyF.h $(includedir)/Ice/ObjectF.h $(includedir)/Ice/GCCountMap.h $(includedir)/Ice/GCShared.h $(includedir)/Ice/Exception.h $(includedir)/Ice/LocalObject.h $(includedir)/Ice/Proxy.h $(includedir)/Ice/ProxyFactoryF.h $(includedir)/Ice/ConnectionIF.h $(includedir)/Ice/RequestHandlerF.h $(includedir)/Ice/EndpointIF.h $(includedir)/Ice/Endpoint.h $(includedir)/Ice/UndefSysMacros.h $(includedir)/Ice/ObjectAdapterF.h $(includedir)/Ice/ReferenceF.h $(includedir)/Ice/OutgoingAsyncF.h $(includedir)/Ice/Current.h $(includedir)/Ice/ConnectionF.h $(includedir)/Ice/Identity.h $(includedir)/Ice/StreamF.h $(includedir)/Ice/CommunicatorF.h $(includedir)/Ice/Object.h $(includedir)/Ice/IncomingAsyncF.h $(includedir)/Ice/Outgoing.h $(includedir)/IceUtil/Monitor.h $(includedir)/IceUtil/Cond.h $(includedir)/Ice/InstanceF.h $(includedir)/Ice/BasicStream.h $(includedir)/Ice/ObjectFactoryF.h $(includedir)/Ice/Buffer.h $(includedir)/Ice/Protocol.h $(includedir)/Ice/StringConverter.h $(includedir)/IceUtil/Unicode.h $(includedir)/Ice/Incoming.h $(includedir)/Ice/ServantLocatorF.h $(includedir)/Ice/ServantManagerF.h $(includedir)/Ice/Direct.h $(includedir)/Ice/LocalException.h $(includedir)/Ice/BuiltinSequences.h $(includedir)/Ice/ObjectFactory.h $(includedir)/IceUtil/Iterator.h $(includedir)/IceUtil/ScopedArray.h
+Publisher$(OBJEXT): Publisher.cpp $(includedir)/IceUtil/IceUtil.h $(includedir)/IceUtil/Config.h $(includedir)/IceUtil/AbstractMutex.h $(includedir)/IceUtil/Lock.h $(includedir)/IceUtil/ThreadException.h $(includedir)/IceUtil/Exception.h $(includedir)/IceUtil/Time.h $(includedir)/IceUtil/Cache.h $(includedir)/IceUtil/Handle.h $(includedir)/IceUtil/Mutex.h $(includedir)/IceUtil/CountDownLatch.h $(includedir)/IceUtil/Cond.h $(includedir)/IceUtil/CtrlCHandler.h $(includedir)/IceUtil/Functional.h $(includedir)/IceUtil/Monitor.h $(includedir)/IceUtil/RWRecMutex.h $(includedir)/IceUtil/Thread.h $(includedir)/IceUtil/Shared.h $(includedir)/IceUtil/RecMutex.h $(includedir)/IceUtil/StaticMutex.h $(includedir)/IceUtil/Timer.h $(includedir)/IceUtil/UUID.h $(includedir)/IceUtil/Unicode.h $(includedir)/Ice/Ice.h $(includedir)/Ice/Initialize.h $(includedir)/Ice/CommunicatorF.h $(includedir)/Ice/LocalObjectF.h $(includedir)/Ice/Handle.h $(includedir)/Ice/Config.h $(includedir)/Ice/ProxyHandle.h $(includedir)/Ice/ProxyF.h $(includedir)/Ice/ObjectF.h $(includedir)/Ice/GCCountMap.h $(includedir)/Ice/GCShared.h $(includedir)/Ice/Exception.h $(includedir)/Ice/LocalObject.h $(includedir)/Ice/UndefSysMacros.h $(includedir)/Ice/PropertiesF.h $(includedir)/Ice/Proxy.h $(includedir)/Ice/ProxyFactoryF.h $(includedir)/Ice/ConnectionIF.h $(includedir)/Ice/RequestHandlerF.h $(includedir)/Ice/EndpointIF.h $(includedir)/Ice/Endpoint.h $(includedir)/Ice/ObjectAdapterF.h $(includedir)/Ice/ReferenceF.h $(includedir)/Ice/OutgoingAsyncF.h $(includedir)/Ice/Current.h $(includedir)/Ice/ConnectionF.h $(includedir)/Ice/Identity.h $(includedir)/Ice/StreamF.h $(includedir)/Ice/Object.h $(includedir)/Ice/IncomingAsyncF.h $(includedir)/Ice/InstanceF.h $(includedir)/Ice/LoggerF.h $(includedir)/Ice/StatsF.h $(includedir)/Ice/StringConverter.h $(includedir)/Ice/BuiltinSequences.h $(includedir)/Ice/LocalException.h $(includedir)/Ice/Properties.h $(includedir)/Ice/Outgoing.h $(includedir)/Ice/BasicStream.h $(includedir)/Ice/ObjectFactoryF.h $(includedir)/Ice/Buffer.h $(includedir)/Ice/Protocol.h $(includedir)/Ice/OutgoingAsync.h $(includedir)/Ice/Incoming.h $(includedir)/Ice/ServantLocatorF.h $(includedir)/Ice/ServantManagerF.h $(includedir)/Ice/Direct.h $(includedir)/Ice/Logger.h $(includedir)/Ice/LoggerUtil.h $(includedir)/Ice/Stats.h $(includedir)/Ice/Communicator.h $(includedir)/Ice/RouterF.h $(includedir)/Ice/LocatorF.h $(includedir)/Ice/PluginF.h $(includedir)/Ice/ImplicitContextF.h $(includedir)/Ice/ObjectFactory.h $(includedir)/Ice/ObjectAdapter.h $(includedir)/Ice/FacetMap.h $(includedir)/Ice/ServantLocator.h $(includedir)/Ice/IncomingAsync.h $(includedir)/Ice/Process.h $(includedir)/Ice/Application.h $(includedir)/Ice/Connection.h $(includedir)/Ice/Functional.h $(includedir)/Ice/Stream.h $(includedir)/Ice/ImplicitContext.h $(includedir)/Ice/Locator.h $(includedir)/Ice/UserExceptionFactory.h $(includedir)/Ice/FactoryTable.h $(includedir)/Ice/FactoryTableDef.h $(includedir)/Ice/UserExceptionFactoryF.h $(includedir)/Ice/ProcessF.h $(includedir)/Ice/Router.h $(includedir)/Ice/DispatchInterceptor.h $(includedir)/Ice/IconvStringConverter.h $(includedir)/IceStorm/IceStorm.h $(includedir)/Ice/SliceChecksumDict.h Clock.h
+Subscriber$(OBJEXT): Subscriber.cpp $(includedir)/IceUtil/IceUtil.h $(includedir)/IceUtil/Config.h $(includedir)/IceUtil/AbstractMutex.h $(includedir)/IceUtil/Lock.h $(includedir)/IceUtil/ThreadException.h $(includedir)/IceUtil/Exception.h $(includedir)/IceUtil/Time.h $(includedir)/IceUtil/Cache.h $(includedir)/IceUtil/Handle.h $(includedir)/IceUtil/Mutex.h $(includedir)/IceUtil/CountDownLatch.h $(includedir)/IceUtil/Cond.h $(includedir)/IceUtil/CtrlCHandler.h $(includedir)/IceUtil/Functional.h $(includedir)/IceUtil/Monitor.h $(includedir)/IceUtil/RWRecMutex.h $(includedir)/IceUtil/Thread.h $(includedir)/IceUtil/Shared.h $(includedir)/IceUtil/RecMutex.h $(includedir)/IceUtil/StaticMutex.h $(includedir)/IceUtil/Timer.h $(includedir)/IceUtil/UUID.h $(includedir)/IceUtil/Unicode.h $(includedir)/Ice/Ice.h $(includedir)/Ice/Initialize.h $(includedir)/Ice/CommunicatorF.h $(includedir)/Ice/LocalObjectF.h $(includedir)/Ice/Handle.h $(includedir)/Ice/Config.h $(includedir)/Ice/ProxyHandle.h $(includedir)/Ice/ProxyF.h $(includedir)/Ice/ObjectF.h $(includedir)/Ice/GCCountMap.h $(includedir)/Ice/GCShared.h $(includedir)/Ice/Exception.h $(includedir)/Ice/LocalObject.h $(includedir)/Ice/UndefSysMacros.h $(includedir)/Ice/PropertiesF.h $(includedir)/Ice/Proxy.h $(includedir)/Ice/ProxyFactoryF.h $(includedir)/Ice/ConnectionIF.h $(includedir)/Ice/RequestHandlerF.h $(includedir)/Ice/EndpointIF.h $(includedir)/Ice/Endpoint.h $(includedir)/Ice/ObjectAdapterF.h $(includedir)/Ice/ReferenceF.h $(includedir)/Ice/OutgoingAsyncF.h $(includedir)/Ice/Current.h $(includedir)/Ice/ConnectionF.h $(includedir)/Ice/Identity.h $(includedir)/Ice/StreamF.h $(includedir)/Ice/Object.h $(includedir)/Ice/IncomingAsyncF.h $(includedir)/Ice/InstanceF.h $(includedir)/Ice/LoggerF.h $(includedir)/Ice/StatsF.h $(includedir)/Ice/StringConverter.h $(includedir)/Ice/BuiltinSequences.h $(includedir)/Ice/LocalException.h $(includedir)/Ice/Properties.h $(includedir)/Ice/Outgoing.h $(includedir)/Ice/BasicStream.h $(includedir)/Ice/ObjectFactoryF.h $(includedir)/Ice/Buffer.h $(includedir)/Ice/Protocol.h $(includedir)/Ice/OutgoingAsync.h $(includedir)/Ice/Incoming.h $(includedir)/Ice/ServantLocatorF.h $(includedir)/Ice/ServantManagerF.h $(includedir)/Ice/Direct.h $(includedir)/Ice/Logger.h $(includedir)/Ice/LoggerUtil.h $(includedir)/Ice/Stats.h $(includedir)/Ice/Communicator.h $(includedir)/Ice/RouterF.h $(includedir)/Ice/LocatorF.h $(includedir)/Ice/PluginF.h $(includedir)/Ice/ImplicitContextF.h $(includedir)/Ice/ObjectFactory.h $(includedir)/Ice/ObjectAdapter.h $(includedir)/Ice/FacetMap.h $(includedir)/Ice/ServantLocator.h $(includedir)/Ice/IncomingAsync.h $(includedir)/Ice/Process.h $(includedir)/Ice/Application.h $(includedir)/Ice/Connection.h $(includedir)/Ice/Functional.h $(includedir)/Ice/Stream.h $(includedir)/Ice/ImplicitContext.h $(includedir)/Ice/Locator.h $(includedir)/Ice/UserExceptionFactory.h $(includedir)/Ice/FactoryTable.h $(includedir)/Ice/FactoryTableDef.h $(includedir)/Ice/UserExceptionFactoryF.h $(includedir)/Ice/ProcessF.h $(includedir)/Ice/Router.h $(includedir)/Ice/DispatchInterceptor.h $(includedir)/Ice/IconvStringConverter.h $(includedir)/IceStorm/IceStorm.h $(includedir)/Ice/SliceChecksumDict.h Clock.h
+Clock.cpp: Clock.ice
+Clock.ice: $(SLICE2CPP) $(SLICEPARSERLIB)
diff --git a/cpp/demo/IceStorm/replicated2/.gitignore b/cpp/demo/IceStorm/replicated2/.gitignore
new file mode 100644
index 00000000000..f6c88071874
--- /dev/null
+++ b/cpp/demo/IceStorm/replicated2/.gitignore
@@ -0,0 +1,10 @@
+// Generated by makegitignore.py
+
+// IMPORTANT: Do not edit this file -- any edits made here will be lost!
+publisher
+subscriber
+Clock.cpp
+Clock.h
+db1/*
+db2/*
+db3/*
diff --git a/cpp/demo/IceStorm/replicated2/Clock.ice b/cpp/demo/IceStorm/replicated2/Clock.ice
new file mode 100644
index 00000000000..ca19916a636
--- /dev/null
+++ b/cpp/demo/IceStorm/replicated2/Clock.ice
@@ -0,0 +1,23 @@
+// **********************************************************************
+//
+// Copyright (c) 2003-2007 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.
+//
+// **********************************************************************
+
+#ifndef CLOCK_ICE
+#define CLOCK_ICE
+
+module Demo
+{
+
+interface Clock
+{
+ void tick(string time);
+};
+
+};
+
+#endif
diff --git a/cpp/demo/IceStorm/replicated2/Makefile b/cpp/demo/IceStorm/replicated2/Makefile
new file mode 100644
index 00000000000..fbc9daa2564
--- /dev/null
+++ b/cpp/demo/IceStorm/replicated2/Makefile
@@ -0,0 +1,47 @@
+# **********************************************************************
+#
+# Copyright (c) 2003-2007 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.
+#
+# **********************************************************************
+
+top_srcdir = ../../..
+
+PUBLISHER = publisher
+SUBSCRIBER = subscriber
+
+TARGETS = $(PUBLISHER) $(SUBSCRIBER)
+
+OBJS = Clock.o
+
+POBJS = Publisher.o
+
+SOBJS = Subscriber.o
+
+SRCS = $(OBJS:.o=.cpp) \
+ $(POBJS:.o=.cpp) \
+ $(SOBJS:.o=.cpp)
+
+SLICE_SRCS = Clock.ice
+
+include $(top_srcdir)/config/Make.rules
+
+CPPFLAGS := -I. $(CPPFLAGS)
+LIBS := -lIceStorm $(LIBS)
+
+$(PUBLISHER): $(OBJS) $(POBJS)
+ rm -f $@
+ $(CXX) $(LDFLAGS) -o $@ $(OBJS) $(POBJS) $(LIBS)
+
+$(SUBSCRIBER): $(OBJS) $(SOBJS)
+ rm -f $@
+ $(CXX) $(LDFLAGS) -o $@ $(OBJS) $(SOBJS) $(LIBS)
+
+clean::
+ -rm -f db1/*
+ -rm -f db2/*
+ -rm -f db3/*
+
+include .depend
diff --git a/cpp/demo/IceStorm/replicated2/Makefile.mak b/cpp/demo/IceStorm/replicated2/Makefile.mak
new file mode 100644
index 00000000000..a9e74475207
--- /dev/null
+++ b/cpp/demo/IceStorm/replicated2/Makefile.mak
@@ -0,0 +1,54 @@
+# **********************************************************************
+#
+# Copyright (c) 2003-2007 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.
+#
+# **********************************************************************
+
+top_srcdir = ..\..\..
+
+PUBLISHER = publisher.exe
+SUBSCRIBER = subscriber.exe
+
+TARGETS = $(PUBLISHER) $(SUBSCRIBER)
+
+OBJS = Clock.obj
+
+POBJS = Publisher.obj
+
+SOBJS = Subscriber.obj
+
+SRCS = $(OBJS:.obj=.cpp) \
+ $(POBJS:.obj=.cpp) \
+ $(SOBJS:.obj=.cpp)
+
+
+!include $(top_srcdir)/config/Make.rules.mak
+
+CPPFLAGS = -I. $(CPPFLAGS) -DWIN32_LEAN_AND_MEAN
+LIBS = $(libdir)\icestorm$(LIBSUFFIX).lib $(LIBS)
+
+!if "$(CPP_COMPILER)" != "BCC2006" && "$(OPTIMIZE)" != "yes"
+PPDBFLAGS = /pdb:$(PUBLISHER:.exe=.pdb)
+SPDBFLAGS = /pdb:$(SUBSCRIBER:.exe=.pdb)
+!endif
+
+$(PUBLISHER): $(OBJS) $(POBJS)
+ $(LINK) $(LD_EXEFLAGS) $(PPDBFLAGS) $(SETARGV) $(OBJS) $(POBJS) $(PREOUT)$@ $(PRELIBS)$(LIBS)
+ @if exist $@.manifest echo ^ ^ ^ Embedding manifest using $(MT) && \
+ $(MT) -nologo -manifest $@.manifest -outputresource:$@;#1 && del /q $@.manifest
+
+$(SUBSCRIBER): $(OBJS) $(SOBJS)
+ $(LINK) $(LD_EXEFLAGS) $(SPDBFLAGS) $(SETARGV) $(OBJS) $(SOBJS) $(PREOUT)$@ $(PRELIBS)$(LIBS)
+ @if exist $@.manifest echo ^ ^ ^ Embedding manifest using $(MT) && \
+ $(MT) -nologo -manifest $@.manifest -outputresource:$@;#1 && del /q $@.manifest
+
+clean::
+ -del /q Clock.cpp Clock.h
+
+clean::
+ -for %f in (db\*) do if not %f == db\.gitignore del /q %f
+
+!include .depend
diff --git a/cpp/demo/IceStorm/replicated2/Publisher.cpp b/cpp/demo/IceStorm/replicated2/Publisher.cpp
new file mode 100644
index 00000000000..36fbf10b0f6
--- /dev/null
+++ b/cpp/demo/IceStorm/replicated2/Publisher.cpp
@@ -0,0 +1,151 @@
+// **********************************************************************
+//
+// Copyright (c) 2003-2008 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 <IceUtil/IceUtil.h>
+#include <Ice/Ice.h>
+#include <IceStorm/IceStorm.h>
+
+#include <Clock.h>
+
+using namespace std;
+using namespace Demo;
+
+class Publisher : public Ice::Application
+{
+public:
+
+ virtual int run(int, char*[]);
+};
+
+int
+main(int argc, char* argv[])
+{
+ Publisher app;
+ return app.main(argc, argv, "config.pub");
+}
+
+void
+usage(const string& n)
+{
+ cerr << "Usage: " << n << " [--datagram|--twoway|--oneway] [topic]" << endl;
+}
+
+int
+Publisher::run(int argc, char* argv[])
+{
+ enum Option { None, Datagram, Twoway, Oneway };
+ Option option = None;
+ string topicName = "time";
+ int i;
+
+ for(i = 1; i < argc; ++i)
+ {
+ string optionString = argv[i];
+ Option oldoption = option;
+ if(optionString == "--datagram")
+ {
+ option = Datagram;
+ }
+ else if(optionString == "--twoway")
+ {
+ option = Twoway;
+ }
+ else if(optionString == "--oneway")
+ {
+ option = Oneway;
+ }
+ else if(optionString.substr(0, 2) == "--")
+ {
+ usage(argv[0]);
+ return EXIT_FAILURE;
+ }
+ else
+ {
+ topicName = argv[i++];
+ break;
+ }
+
+ if(oldoption != option && oldoption != None)
+ {
+ usage(argv[0]);
+ return EXIT_FAILURE;
+ }
+ }
+
+ if(i != argc)
+ {
+ usage(argv[0]);
+ return EXIT_FAILURE;
+ }
+
+ IceStorm::TopicManagerPrx manager = IceStorm::TopicManagerPrx::checkedCast(
+ communicator()->propertyToProxy("TopicManager.Proxy"));
+ if(!manager)
+ {
+ cerr << appName() << ": invalid proxy" << endl;
+ return EXIT_FAILURE;
+ }
+
+ //
+ // Retrieve the topic.
+ //
+ IceStorm::TopicPrx topic;
+ try
+ {
+ topic = manager->retrieve(topicName);
+ }
+ catch(const IceStorm::NoSuchTopic&)
+ {
+ try
+ {
+ topic = manager->create(topicName);
+ }
+ catch(const IceStorm::TopicExists&)
+ {
+ cerr << appName() << ": temporary failure. try again." << endl;
+ return EXIT_FAILURE;
+ }
+ }
+
+ //
+ // Get the topic's publisher object, and create a Clock proxy with
+ // the mode specified as an argument of this application.
+ //
+ Ice::ObjectPrx publisher = topic->getPublisher();
+ if(option == Datagram)
+ {
+ publisher = publisher->ice_datagram();
+ }
+ else if(option == Twoway)
+ {
+ // Do nothing.
+ }
+ else if(option == Oneway || option == None)
+ {
+ publisher = publisher->ice_oneway();
+ }
+
+ ClockPrx clock = ClockPrx::uncheckedCast(publisher);
+
+ cout << "publishing tick events. Press ^C to terminate the application." << endl;
+ try
+ {
+ while(true)
+ {
+ clock->tick(IceUtil::Time::now().toDateTime());
+ IceUtil::ThreadControl::sleep(IceUtil::Time::seconds(1));
+ }
+ }
+ catch(const Ice::CommunicatorDestroyedException&)
+ {
+ // Ignore
+ }
+
+ return EXIT_SUCCESS;
+}
diff --git a/cpp/demo/IceStorm/replicated2/README b/cpp/demo/IceStorm/replicated2/README
new file mode 100644
index 00000000000..8d1470061eb
--- /dev/null
+++ b/cpp/demo/IceStorm/replicated2/README
@@ -0,0 +1,25 @@
+This demo demonstrates how to configure and deploy IceStorm in a
+replicated fashion without using IceGrid.
+
+To run the demo, start the three IceStorm replicas. In three separate
+windows:
+
+$ icebox --Ice.Config=config.ib1
+$ icebox --Ice.Config=config.ib2
+$ icebox --Ice.Config=config.ib3
+
+And then in a separate window:
+
+$ subscriber
+
+In another window:
+
+$ publisher
+
+While the publisher continues to run, "tick" messages should be
+displayed in the subscriber window.
+
+The subscribers and publishers do not have to do anything special to
+take advantage of the replication. The subscriber and publisher are
+identical to the publisher and subscriber in the clock directory. See
+../clock/README for instructions on running them.
diff --git a/cpp/demo/IceStorm/replicated2/Subscriber.cpp b/cpp/demo/IceStorm/replicated2/Subscriber.cpp
new file mode 100644
index 00000000000..1d7faf18673
--- /dev/null
+++ b/cpp/demo/IceStorm/replicated2/Subscriber.cpp
@@ -0,0 +1,258 @@
+// **********************************************************************
+//
+// Copyright (c) 2003-2008 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 <IceUtil/IceUtil.h>
+#include <Ice/Ice.h>
+#include <IceStorm/IceStorm.h>
+
+#include <Clock.h>
+
+using namespace std;
+using namespace Demo;
+
+class ClockI : public Clock
+{
+public:
+
+ virtual void
+ tick(const string& time, const Ice::Current&)
+ {
+ cout << time << endl;
+ }
+};
+
+class Subscriber : public Ice::Application
+{
+public:
+
+ virtual int run(int, char*[]);
+};
+
+int
+main(int argc, char* argv[])
+{
+ Subscriber app;
+ return app.main(argc, argv, "config.sub");
+}
+
+void
+usage(const string& n)
+{
+ cerr << "Usage: " << n
+ << " [--batch] [--datagram|--twoway|--ordered|--oneway] [--retryCount count] [--id id] [topic]" << endl;
+}
+
+int
+Subscriber::run(int argc, char* argv[])
+{
+ Ice::StringSeq args = Ice::argsToStringSeq(argc, argv);
+ args = communicator()->getProperties()->parseCommandLineOptions("Clock", args);
+ Ice::stringSeqToArgs(args, argc, argv);
+
+ bool batch = false;
+ enum Option { None, Datagram, Twoway, Oneway, Ordered};
+ Option option = None;
+ string topicName = "time";
+ string id;
+ string retryCount;
+ int i;
+
+ for(i = 1; i < argc; ++i)
+ {
+ string optionString = argv[i];
+ Option oldoption = option;
+ if(optionString == "--datagram")
+ {
+ option = Datagram;
+ }
+ else if(optionString == "--twoway")
+ {
+ option = Twoway;
+ }
+ else if(optionString == "--oneway")
+ {
+ option = Oneway;
+ }
+ else if(optionString == "--ordered")
+ {
+ option = Ordered;
+ }
+ else if(optionString == "--batch")
+ {
+ batch = true;
+ }
+ else if(optionString == "--id")
+ {
+ ++i;
+ if(i >= argc)
+ {
+ usage(argv[0]);
+ return EXIT_FAILURE;
+ }
+ id = argv[i];
+ }
+ else if(optionString == "--retryCount")
+ {
+ ++i;
+ if(i >= argc)
+ {
+ usage(argv[0]);
+ return EXIT_FAILURE;
+ }
+ retryCount = argv[i];
+ }
+ else if(optionString.substr(0, 2) == "--")
+ {
+ usage(argv[0]);
+ return EXIT_FAILURE;
+ }
+ else
+ {
+ topicName = argv[i++];
+ break;
+ }
+
+ if(oldoption != option && oldoption != None)
+ {
+ usage(argv[0]);
+ return EXIT_FAILURE;
+ }
+ }
+
+ if(i != argc)
+ {
+ usage(argv[0]);
+ return EXIT_FAILURE;
+ }
+
+ if(!retryCount.empty())
+ {
+ if(option == None)
+ {
+ option = Twoway;
+ }
+ else if(option != Twoway && option != Ordered)
+ {
+ cerr << argv[0] << ": retryCount requires a twoway proxy" << endl;
+ return EXIT_FAILURE;
+ }
+ }
+
+ if(batch && (option == Twoway || option == Ordered))
+ {
+ cerr << argv[0] << ": batch can only be set with oneway or datagram" << endl;
+ return EXIT_FAILURE;
+ }
+
+ IceStorm::TopicManagerPrx manager = IceStorm::TopicManagerPrx::checkedCast(
+ communicator()->propertyToProxy("TopicManager.Proxy"));
+ if(!manager)
+ {
+ cerr << appName() << ": invalid proxy" << endl;
+ return EXIT_FAILURE;
+ }
+
+ IceStorm::TopicPrx topic;
+ try
+ {
+ topic = manager->retrieve(topicName);
+ }
+ catch(const IceStorm::NoSuchTopic&)
+ {
+ try
+ {
+ topic = manager->create(topicName);
+ }
+ catch(const IceStorm::TopicExists&)
+ {
+ cerr << appName() << ": temporary failure. try again." << endl;
+ return EXIT_FAILURE;
+ }
+ }
+
+ Ice::ObjectAdapterPtr adapter = communicator()->createObjectAdapter("Clock.Subscriber");
+
+ //
+ // Add a servant for the Ice object. If --id is used the identity
+ // comes from the command line, otherwise a UUID is used.
+ //
+ // id is not directly altered since it is used below to detect
+ // whether subscribeAndGetPublisher can raise AlreadySubscribed.
+ //
+ Ice::Identity subId;
+ subId.name = id;
+ if(subId.name.empty())
+ {
+ subId.name = IceUtil::generateUUID();
+ }
+ Ice::ObjectPrx subscriber = adapter->add(new ClockI, subId);
+
+ IceStorm::QoS qos;
+ if(!retryCount.empty())
+ {
+ qos["retryCount"] = retryCount;
+ }
+
+ //
+ // Set up the proxy.
+ //
+ if(option == Datagram)
+ {
+ if(batch)
+ {
+ subscriber = subscriber->ice_batchDatagram();
+ }
+ else
+ {
+ subscriber = subscriber->ice_datagram();
+ }
+ }
+ else if(option == Twoway)
+ {
+ // Do nothing to the subscriber proxy. Its already twoway.
+ }
+ else if(option == Ordered)
+ {
+ // Do nothing to the subscriber proxy. Its already twoway.
+ qos["reliability"] = "ordered";
+ }
+ else if(option == Oneway || option == None)
+ {
+ if(batch)
+ {
+ subscriber = subscriber->ice_batchOneway();
+ }
+ else
+ {
+ subscriber = subscriber->ice_oneway();
+ }
+ }
+
+ try
+ {
+ topic->subscribeAndGetPublisher(qos, subscriber);
+ }
+ catch(const IceStorm::AlreadySubscribed&)
+ {
+ // If we're manually setting the subscriber id ignore.
+ if(id.empty())
+ {
+ throw;
+ }
+ cout << "reactivating persistent subscriber" << endl;
+ }
+ adapter->activate();
+
+ shutdownOnInterrupt();
+ communicator()->waitForShutdown();
+
+ topic->unsubscribe(subscriber);
+
+ return EXIT_SUCCESS;
+}
diff --git a/cpp/demo/IceStorm/replicated2/config.ib1 b/cpp/demo/IceStorm/replicated2/config.ib1
new file mode 100644
index 00000000000..461a826bb4f
--- /dev/null
+++ b/cpp/demo/IceStorm/replicated2/config.ib1
@@ -0,0 +1,32 @@
+#
+# The IceBox server endpoint configuration
+#
+IceBox.ServiceManager.Endpoints=tcp -p 9990
+
+#
+# The IceStorm service
+#
+IceBox.Service.IceStorm=IceStormService,33:createIceStorm --Ice.Config=config.s1
+
+#
+# Warn about connection exceptions
+#
+#Ice.Warn.Connections=1
+
+#
+# Network Tracing
+#
+# 0 = no network tracing
+# 1 = trace connection establishment and closure
+# 2 = like 1, but more detailed
+# 3 = like 2, but also trace data transfer
+#
+#Ice.Trace.Network=1
+
+#
+# Protocol Tracing
+#
+# 0 = no protocol tracing
+# 1 = trace protocol messages
+#
+#Ice.Trace.Protocol=1
diff --git a/cpp/demo/IceStorm/replicated2/config.ib2 b/cpp/demo/IceStorm/replicated2/config.ib2
new file mode 100644
index 00000000000..54a0f3ad796
--- /dev/null
+++ b/cpp/demo/IceStorm/replicated2/config.ib2
@@ -0,0 +1,32 @@
+#
+# The IceBox server endpoint configuration
+#
+IceBox.ServiceManager.Endpoints=tcp -p 9991
+
+#
+# The IceStorm service
+#
+IceBox.Service.IceStorm=IceStormService,33:createIceStorm --Ice.Config=config.s2
+
+#
+# Warn about connection exceptions
+#
+#Ice.Warn.Connections=1
+
+#
+# Network Tracing
+#
+# 0 = no network tracing
+# 1 = trace connection establishment and closure
+# 2 = like 1, but more detailed
+# 3 = like 2, but also trace data transfer
+#
+#Ice.Trace.Network=1
+
+#
+# Protocol Tracing
+#
+# 0 = no protocol tracing
+# 1 = trace protocol messages
+#
+#Ice.Trace.Protocol=1
diff --git a/cpp/demo/IceStorm/replicated2/config.ib3 b/cpp/demo/IceStorm/replicated2/config.ib3
new file mode 100644
index 00000000000..c12a6328483
--- /dev/null
+++ b/cpp/demo/IceStorm/replicated2/config.ib3
@@ -0,0 +1,32 @@
+#
+# The IceBox server endpoint configuration
+#
+IceBox.ServiceManager.Endpoints=tcp -p 9993
+
+#
+# The IceStorm service
+#
+IceBox.Service.IceStorm=IceStormService,33:createIceStorm --Ice.Config=config.s3
+
+#
+# Warn about connection exceptions
+#
+#Ice.Warn.Connections=1
+
+#
+# Network Tracing
+#
+# 0 = no network tracing
+# 1 = trace connection establishment and closure
+# 2 = like 1, but more detailed
+# 3 = like 2, but also trace data transfer
+#
+#Ice.Trace.Network=1
+
+#
+# Protocol Tracing
+#
+# 0 = no protocol tracing
+# 1 = trace protocol messages
+#
+#Ice.Trace.Protocol=1
diff --git a/cpp/demo/IceStorm/replicated2/config.pub b/cpp/demo/IceStorm/replicated2/config.pub
new file mode 100644
index 00000000000..e7d497f8f52
--- /dev/null
+++ b/cpp/demo/IceStorm/replicated2/config.pub
@@ -0,0 +1,14 @@
+#
+# This property is used by the clients to connect to IceStorm.
+#
+TopicManager.Proxy=DemoIceStorm/TopicManager:default -p 10000
+
+#
+# Network Tracing
+#
+# 0 = no network tracing
+# 1 = trace connection establishment and closure
+# 2 = like 1, but more detailed
+# 3 = like 2, but also trace data transfer
+#
+#Ice.Trace.Network=1
diff --git a/cpp/demo/IceStorm/replicated2/config.s1 b/cpp/demo/IceStorm/replicated2/config.s1
new file mode 100644
index 00000000000..9bc2a1bca73
--- /dev/null
+++ b/cpp/demo/IceStorm/replicated2/config.s1
@@ -0,0 +1,112 @@
+# This property configures the node id. It must be a positive integer.
+IceStorm.NodeId=0
+
+# This property configures the replicated node endpoints.
+IceStorm.Node.Endpoints=default -p 13000
+
+# This set of properties configures the replicated node proxies. Each
+# property is of the form
+# IceStorm.Nodes.<id>=<instance-name>/node<id>:<endpoints>
+#
+# All nodes must be included in this list.
+IceStorm.Nodes.0=DemoIceStorm/node0:default -p 13000
+IceStorm.Nodes.1=DemoIceStorm/node1:default -p 13010
+IceStorm.Nodes.2=DemoIceStorm/node2:default -p 13020
+
+# Node tracing properties.
+IceStorm.Trace.Election=1
+IceStorm.Trace.Replication=1
+
+# The interval in seconds at which a slave checks the status of the
+# coordinator.
+#IceStorm.Election.MasterTimeout=2
+
+# The interval in seconds at which a coordinator attempts to form
+# larger groups of replicas.
+#IceStorm.Election.ElectionTimeout=2
+
+# The interval in seconds that a replica waits for replies to an
+# invitation to form a larger group. Lower priority wait for intervals
+# inversely proporitional to the maximum priority.
+#IceStorm.Election.ResponseTimeout=2
+
+#
+# This property defines the endpoints on which the IceStorm
+# TopicManager listens.
+#
+IceStorm.TopicManager.Endpoints=default -p 10000
+
+# This property defines the endpoints contained in proxies to topics.
+IceStorm.ReplicatedTopicManagerEndpoints=default -p 10000:default -p 10010:default -p 10020
+
+#
+# The IceStorm service instance name.
+#
+IceStorm.InstanceName=DemoIceStorm
+
+#
+# This property defines the endpoints on which the topic
+# publisher objects listen. If you want to federate
+# IceStorm instances this must run on a fixed port (or use
+# IceGrid).
+#
+IceStorm.Publish.Endpoints=default -p 10001:udp -p 10001
+
+# This property defines the endpoints contained in publisher proxies.
+IceStorm.ReplicatedPublishEndpoints=default -p 10001:default -p 10011:default -p 10021:udp -p 10001:udp -p 10011:udp -p 10021
+
+#
+# TopicManager Tracing
+#
+# 0 = no tracing
+# 1 = trace topic creation, subscription, unsubscription
+# 2 = like 1, but with more detailed subscription information
+#
+IceStorm.Trace.TopicManager=2
+
+#
+# Topic Tracing
+#
+# 0 = no tracing
+# 1 = trace unsubscription diagnostics
+#
+IceStorm.Trace.Topic=1
+
+#
+# Subscriber Tracing
+#
+# 0 = no tracing
+# 1 = subscriber diagnostics (subscription, unsubscription, event
+# propagation failures)
+#
+IceStorm.Trace.Subscriber=1
+
+#
+# Flush Tracing (for batch mode transfer flushing)
+#
+# 0 = no tracing
+# 1 = trace activity of flusher thread
+#
+IceStorm.Trace.Flush=1
+
+#
+# Amount of time in milliseconds between flushes for batch mode
+# transfer. The minimum allowable value is 100ms.
+#
+IceStorm.Flush.Timeout=2000
+
+#
+# Network Tracing
+#
+# 0 = no network tracing
+# 1 = trace connection establishment and closure
+# 2 = like 1, but more detailed
+# 3 = like 2, but also trace data transfer
+#
+#Ice.Trace.Network=1
+
+#
+# This property defines the home directory of the Freeze
+# database environment for the IceStorm service.
+#
+Freeze.DbEnv.IceStorm.DbHome=db1
diff --git a/cpp/demo/IceStorm/replicated2/config.s2 b/cpp/demo/IceStorm/replicated2/config.s2
new file mode 100644
index 00000000000..b785c32c96f
--- /dev/null
+++ b/cpp/demo/IceStorm/replicated2/config.s2
@@ -0,0 +1,112 @@
+# This property configures the node id. It must be a positive integer.
+IceStorm.NodeId=1
+
+# This property configures the replicated node endpoints.
+IceStorm.Node.Endpoints=default -p 13010
+
+# This set of properties configures the replicated node proxies. Each
+# property is of the form
+# IceStorm.Nodes.<id>=<instance-name>/node<id>:<endpoints>
+#
+# All nodes must be included in this list.
+IceStorm.Nodes.0=DemoIceStorm/node0:default -p 13000
+IceStorm.Nodes.1=DemoIceStorm/node1:default -p 13010
+IceStorm.Nodes.2=DemoIceStorm/node2:default -p 13020
+
+# Node tracing properties.
+IceStorm.Trace.Election=1
+IceStorm.Trace.Replication=1
+
+# The interval in seconds at which a slave checks the status of the
+# coordinator.
+#IceStorm.Election.MasterTimeout=2
+
+# The interval in seconds at which a coordinator attempts to form
+# larger groups of replicas.
+#IceStorm.Election.ElectionTimeout=2
+
+# The interval in seconds that a replica waits for replies to an
+# invitation to form a larger group. Lower priority wait for intervals
+# inversely proporitional to the maximum priority.
+#IceStorm.Election.ResponseTimeout=2
+
+#
+# This property defines the endpoints on which the IceStorm
+# TopicManager listens.
+#
+IceStorm.TopicManager.Endpoints=default -p 10010
+
+# This property defines the endpoints contained in proxies to topics.
+IceStorm.ReplicatedTopicManagerEndpoints=default -p 10000:default -p 10010:default -p 10020
+
+#
+# The IceStorm service instance name.
+#
+IceStorm.InstanceName=DemoIceStorm
+
+#
+# This property defines the endpoints on which the topic
+# publisher objects listen. If you want to federate
+# IceStorm instances this must run on a fixed port (or use
+# IceGrid).
+#
+IceStorm.Publish.Endpoints=default -p 10011:udp -p 10011
+
+# This property defines the endpoints contained in publisher proxies.
+IceStorm.ReplicatedPublishEndpoints=default -p 10001:default -p 10011:default -p 10021:udp -p 10001:udp -p 10011:udp -p 10021
+
+#
+# TopicManager Tracing
+#
+# 0 = no tracing
+# 1 = trace topic creation, subscription, unsubscription
+# 2 = like 1, but with more detailed subscription information
+#
+IceStorm.Trace.TopicManager=2
+
+#
+# Topic Tracing
+#
+# 0 = no tracing
+# 1 = trace unsubscription diagnostics
+#
+IceStorm.Trace.Topic=1
+
+#
+# Subscriber Tracing
+#
+# 0 = no tracing
+# 1 = subscriber diagnostics (subscription, unsubscription, event
+# propagation failures)
+#
+IceStorm.Trace.Subscriber=1
+
+#
+# Flush Tracing (for batch mode transfer flushing)
+#
+# 0 = no tracing
+# 1 = trace activity of flusher thread
+#
+IceStorm.Trace.Flush=1
+
+#
+# Amount of time in milliseconds between flushes for batch mode
+# transfer. The minimum allowable value is 100ms.
+#
+IceStorm.Flush.Timeout=2000
+
+#
+# Network Tracing
+#
+# 0 = no network tracing
+# 1 = trace connection establishment and closure
+# 2 = like 1, but more detailed
+# 3 = like 2, but also trace data transfer
+#
+#Ice.Trace.Network=1
+
+#
+# This property defines the home directory of the Freeze
+# database environment for the IceStorm service.
+#
+Freeze.DbEnv.IceStorm.DbHome=db2
diff --git a/cpp/demo/IceStorm/replicated2/config.s3 b/cpp/demo/IceStorm/replicated2/config.s3
new file mode 100644
index 00000000000..74f6e6b8908
--- /dev/null
+++ b/cpp/demo/IceStorm/replicated2/config.s3
@@ -0,0 +1,112 @@
+# This property configures the node id. It must be a positive integer.
+IceStorm.NodeId=2
+
+# This property configures the replicated node endpoints.
+IceStorm.Node.Endpoints=default -p 13020
+
+# This set of properties configures the replicated node proxies. Each
+# property is of the form
+# IceStorm.Nodes.<id>=<instance-name>/node<id>:<endpoints>
+#
+# All nodes must be included in this list.
+IceStorm.Nodes.0=DemoIceStorm/node0:default -p 13000
+IceStorm.Nodes.1=DemoIceStorm/node1:default -p 13010
+IceStorm.Nodes.2=DemoIceStorm/node2:default -p 13020
+
+# Node tracing properties.
+IceStorm.Trace.Election=1
+IceStorm.Trace.Replication=1
+
+# The interval in seconds at which a slave checks the status of the
+# coordinator.
+#IceStorm.Election.MasterTimeout=2
+
+# The interval in seconds at which a coordinator attempts to form
+# larger groups of replicas.
+#IceStorm.Election.ElectionTimeout=2
+
+# The interval in seconds that a replica waits for replies to an
+# invitation to form a larger group. Lower priority wait for intervals
+# inversely proporitional to the maximum priority.
+#IceStorm.Election.ResponseTimeout=2
+
+#
+# This property defines the endpoints on which the IceStorm
+# TopicManager listens.
+#
+IceStorm.TopicManager.Endpoints=default -p 10020
+
+# This property defines the endpoints contained in proxies to topics.
+IceStorm.ReplicatedTopicManagerEndpoints=default -p 10000:default -p 10010:default -p 10020
+
+#
+# The IceStorm service instance name.
+#
+IceStorm.InstanceName=DemoIceStorm
+
+#
+# This property defines the endpoints on which the topic
+# publisher objects listen. If you want to federate
+# IceStorm instances this must run on a fixed port (or use
+# IceGrid).
+#
+IceStorm.Publish.Endpoints=default -p 10021:udp -p 10021
+
+# This property defines the endpoints contained in publisher proxies.
+IceStorm.ReplicatedPublishEndpoints=default -p 10001:default -p 10011:default -p 10021:udp -p 10001:udp -p 10011:udp -p 10021
+
+#
+# TopicManager Tracing
+#
+# 0 = no tracing
+# 1 = trace topic creation, subscription, unsubscription
+# 2 = like 1, but with more detailed subscription information
+#
+IceStorm.Trace.TopicManager=2
+
+#
+# Topic Tracing
+#
+# 0 = no tracing
+# 1 = trace unsubscription diagnostics
+#
+IceStorm.Trace.Topic=1
+
+#
+# Subscriber Tracing
+#
+# 0 = no tracing
+# 1 = subscriber diagnostics (subscription, unsubscription, event
+# propagation failures)
+#
+IceStorm.Trace.Subscriber=1
+
+#
+# Flush Tracing (for batch mode transfer flushing)
+#
+# 0 = no tracing
+# 1 = trace activity of flusher thread
+#
+IceStorm.Trace.Flush=1
+
+#
+# Amount of time in milliseconds between flushes for batch mode
+# transfer. The minimum allowable value is 100ms.
+#
+IceStorm.Flush.Timeout=2000
+
+#
+# Network Tracing
+#
+# 0 = no network tracing
+# 1 = trace connection establishment and closure
+# 2 = like 1, but more detailed
+# 3 = like 2, but also trace data transfer
+#
+#Ice.Trace.Network=1
+
+#
+# This property defines the home directory of the Freeze
+# database environment for the IceStorm service.
+#
+Freeze.DbEnv.IceStorm.DbHome=db3
diff --git a/cpp/demo/IceStorm/replicated2/config.sub b/cpp/demo/IceStorm/replicated2/config.sub
new file mode 100644
index 00000000000..24a7d8d73e5
--- /dev/null
+++ b/cpp/demo/IceStorm/replicated2/config.sub
@@ -0,0 +1,20 @@
+#
+# This property is used to configure the endpoints of the clock
+# subscriber adapter.
+#
+Clock.Subscriber.Endpoints=tcp:udp
+
+#
+# This property is used by the clients to connect to IceStorm.
+#
+TopicManager.Proxy=DemoIceStorm/TopicManager:default -p 10000:default -p 10010:default -p 10020
+
+#
+# Network Tracing
+#
+# 0 = no network tracing
+# 1 = trace connection establishment and closure
+# 2 = like 1, but more detailed
+# 3 = like 2, but also trace data transfer
+#
+#Ice.Trace.Network=1
diff --git a/cpp/demo/IceStorm/replicated2/db1/.gitignore b/cpp/demo/IceStorm/replicated2/db1/.gitignore
new file mode 100644
index 00000000000..005f76775fa
--- /dev/null
+++ b/cpp/demo/IceStorm/replicated2/db1/.gitignore
@@ -0,0 +1,8 @@
+// Generated by makegitignore.py
+
+// IMPORTANT: Do not edit this file -- any edits made here will be lost!
+publisher
+subscriber
+Clock.cpp
+Clock.h
+db/*
diff --git a/cpp/demo/IceStorm/replicated2/db2/.gitignore b/cpp/demo/IceStorm/replicated2/db2/.gitignore
new file mode 100644
index 00000000000..005f76775fa
--- /dev/null
+++ b/cpp/demo/IceStorm/replicated2/db2/.gitignore
@@ -0,0 +1,8 @@
+// Generated by makegitignore.py
+
+// IMPORTANT: Do not edit this file -- any edits made here will be lost!
+publisher
+subscriber
+Clock.cpp
+Clock.h
+db/*
diff --git a/cpp/demo/IceStorm/replicated2/db3/.gitignore b/cpp/demo/IceStorm/replicated2/db3/.gitignore
new file mode 100644
index 00000000000..005f76775fa
--- /dev/null
+++ b/cpp/demo/IceStorm/replicated2/db3/.gitignore
@@ -0,0 +1,8 @@
+// Generated by makegitignore.py
+
+// IMPORTANT: Do not edit this file -- any edits made here will be lost!
+publisher
+subscriber
+Clock.cpp
+Clock.h
+db/*
diff --git a/cpp/demo/IceStorm/replicated2/expect.py b/cpp/demo/IceStorm/replicated2/expect.py
new file mode 100755
index 00000000000..b303c340957
--- /dev/null
+++ b/cpp/demo/IceStorm/replicated2/expect.py
@@ -0,0 +1,28 @@
+#!/usr/bin/env python
+# **********************************************************************
+#
+# Copyright (c) 2003-2007 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.
+#
+# **********************************************************************
+
+import pexpect, sys, os
+
+try:
+ import demoscript
+except ImportError:
+ for toplevel in [".", "..", "../..", "../../..", "../../../.."]:
+ toplevel = os.path.normpath(toplevel)
+ if os.path.exists(os.path.join(toplevel, "demoscript")):
+ break
+ else:
+ raise "can't find toplevel directory!"
+ sys.path.append(os.path.join(toplevel))
+ import demoscript
+
+import demoscript.Util
+import demoscript.IceStorm.clock
+
+demoscript.IceStorm.clock.run('./subscriber', './publisher')
diff --git a/cpp/demo/IceStorm/replicated2/replicated2C.dsp b/cpp/demo/IceStorm/replicated2/replicated2C.dsp
new file mode 100644
index 00000000000..b382c9c79e2
--- /dev/null
+++ b/cpp/demo/IceStorm/replicated2/replicated2C.dsp
@@ -0,0 +1,157 @@
+# Microsoft Developer Studio Project File - Name="replicated2C" - Package Owner=<4>
+# Microsoft Developer Studio Generated Build File, Format Version 6.00
+# ** DO NOT EDIT **
+
+# TARGTYPE "Win32 (x86) Console Application" 0x0103
+
+CFG=replicated2C - Win32 Debug
+!MESSAGE This is not a valid makefile. To build this project using NMAKE,
+!MESSAGE use the Export Makefile command and run
+!MESSAGE
+!MESSAGE NMAKE /f "replicated2C.mak".
+!MESSAGE
+!MESSAGE You can specify a configuration when running NMAKE
+!MESSAGE by defining the macro CFG on the command line. For example:
+!MESSAGE
+!MESSAGE NMAKE /f "replicated2C.mak" CFG="replicated2C - Win32 Debug"
+!MESSAGE
+!MESSAGE Possible choices for configuration are:
+!MESSAGE
+!MESSAGE "replicated2C - Win32 Release" (based on "Win32 (x86) Console Application")
+!MESSAGE "replicated2C - Win32 Debug" (based on "Win32 (x86) Console Application")
+!MESSAGE
+
+# Begin Project
+# PROP AllowPerConfigDependencies 0
+# PROP Scc_ProjName ""
+# PROP Scc_LocalPath ""
+CPP=cl.exe
+RSC=rc.exe
+
+!IF "$(CFG)" == "replicated2C - Win32 Release"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 0
+# PROP BASE Output_Dir "Release"
+# PROP BASE Intermediate_Dir "Release"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 0
+# PROP Output_Dir "Release"
+# PROP Intermediate_Dir "Release"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c
+# ADD CPP /nologo /MD /W3 /WX /GR /GX /O2 /I "." /I "../../../include" /I "../../../include/stlport" /D "_CONSOLE" /D "NDEBUG" /D "WIN32_LEAN_AND_MEAN" /FD /c
+# SUBTRACT CPP /Fr /YX
+# ADD BASE RSC /l 0x409 /d "NDEBUG"
+# ADD RSC /l 0x409 /d "NDEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386
+# ADD LINK32 IceStorm.lib IceGrid.lib Ice.lib IceUtil.lib setargv.obj /nologo /subsystem:console /pdb:none /machine:I386 /out:"publisher.exe" /libpath:"../../../lib" /FIXED:no
+# SUBTRACT LINK32 /debug
+
+!ELSEIF "$(CFG)" == "replicated2C - Win32 Debug"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 1
+# PROP BASE Output_Dir "Debug"
+# PROP BASE Intermediate_Dir "Debug"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 1
+# PROP Output_Dir "Debug"
+# PROP Intermediate_Dir "Debug"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c
+# ADD CPP /nologo /MDd /W3 /WX /Gm /GR /GX /Zi /Od /I "." /I "../../../include" /I "../../../include/stlport" /D "_CONSOLE" /D "_DEBUG" /D "WIN32_LEAN_AND_MEAN" /FD /GZ /c
+# SUBTRACT CPP /Fr /YX
+# ADD BASE RSC /l 0x409 /d "_DEBUG"
+# ADD RSC /l 0x409 /d "_DEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept
+# ADD LINK32 IceStormd.lib IceGridd.lib Iced.lib IceUtild.lib setargv.obj /nologo /subsystem:console /debug /machine:I386 /out:"publisher.exe" /pdbtype:sept /libpath:"../../../lib" /FIXED:no
+# SUBTRACT LINK32 /pdb:none
+
+!ENDIF
+
+# Begin Target
+
+# Name "replicated2C - Win32 Release"
+# Name "replicated2C - Win32 Debug"
+# Begin Group "Source Files"
+
+# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
+# Begin Source File
+
+SOURCE=.\Clock.cpp
+# End Source File
+# Begin Source File
+
+SOURCE=.\Publisher.cpp
+# End Source File
+# End Group
+# Begin Group "Header Files"
+
+# PROP Default_Filter "h;hpp;hxx;hm;inl"
+# Begin Source File
+
+SOURCE=.\Clock.h
+# End Source File
+# End Group
+# Begin Group "Resource Files"
+
+# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe"
+# Begin Source File
+
+SOURCE=.\Clock.ice
+
+!IF "$(CFG)" == "replicated2C - Win32 Release"
+
+USERDEP__CLOCK="..\..\..\bin\slice2cpp.exe" "..\..\..\lib\slice.lib"
+# Begin Custom Build
+InputPath=.\Clock.ice
+
+BuildCmds= \
+ ..\..\..\bin\slice2cpp.exe Clock.ice
+
+"Clock.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+
+"Clock.cpp" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+# End Custom Build
+
+!ELSEIF "$(CFG)" == "replicated2C - Win32 Debug"
+
+USERDEP__CLOCK="..\..\..\bin\slice2cpp.exe" "..\..\..\lib\sliced.lib"
+# Begin Custom Build
+InputPath=.\Clock.ice
+
+BuildCmds= \
+ ..\..\..\bin\slice2cpp.exe Clock.ice
+
+"Clock.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+
+"Clock.cpp" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+# End Custom Build
+
+!ENDIF
+
+# End Source File
+# End Group
+# Begin Source File
+
+SOURCE=.\README
+# End Source File
+# End Target
+# End Project
diff --git a/cpp/demo/IceStorm/replicated2/replicated2S.dsp b/cpp/demo/IceStorm/replicated2/replicated2S.dsp
new file mode 100644
index 00000000000..cee078aef18
--- /dev/null
+++ b/cpp/demo/IceStorm/replicated2/replicated2S.dsp
@@ -0,0 +1,157 @@
+# Microsoft Developer Studio Project File - Name="replicated2S" - Package Owner=<4>
+# Microsoft Developer Studio Generated Build File, Format Version 6.00
+# ** DO NOT EDIT **
+
+# TARGTYPE "Win32 (x86) Console Application" 0x0103
+
+CFG=replicated2S - Win32 Debug
+!MESSAGE This is not a valid makefile. To build this project using NMAKE,
+!MESSAGE use the Export Makefile command and run
+!MESSAGE
+!MESSAGE NMAKE /f "replicated2S.mak".
+!MESSAGE
+!MESSAGE You can specify a configuration when running NMAKE
+!MESSAGE by defining the macro CFG on the command line. For example:
+!MESSAGE
+!MESSAGE NMAKE /f "replicated2S.mak" CFG="replicated2S - Win32 Debug"
+!MESSAGE
+!MESSAGE Possible choices for configuration are:
+!MESSAGE
+!MESSAGE "replicated2S - Win32 Release" (based on "Win32 (x86) Console Application")
+!MESSAGE "replicated2S - Win32 Debug" (based on "Win32 (x86) Console Application")
+!MESSAGE
+
+# Begin Project
+# PROP AllowPerConfigDependencies 0
+# PROP Scc_ProjName ""
+# PROP Scc_LocalPath ""
+CPP=cl.exe
+RSC=rc.exe
+
+!IF "$(CFG)" == "replicated2S - Win32 Release"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 0
+# PROP BASE Output_Dir "Release"
+# PROP BASE Intermediate_Dir "Release"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 0
+# PROP Output_Dir "Release"
+# PROP Intermediate_Dir "Release"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c
+# ADD CPP /nologo /MD /W3 /WX /GR /GX /O2 /I "." /I "../../../include" /I "../../../include/stlport" /D "_CONSOLE" /D "NDEBUG" /D "WIN32_LEAN_AND_MEAN" /FD /c
+# SUBTRACT CPP /Fr /YX
+# ADD BASE RSC /l 0x409 /d "NDEBUG"
+# ADD RSC /l 0x409 /d "NDEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386
+# ADD LINK32 IceStorm.lib IceGrid.lib Ice.lib IceUtil.lib setargv.obj /nologo /subsystem:console /pdb:none /machine:I386 /out:"subscriber.exe" /libpath:"../../../lib" /FIXED:no
+# SUBTRACT LINK32 /debug
+
+!ELSEIF "$(CFG)" == "replicated2S - Win32 Debug"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 1
+# PROP BASE Output_Dir "Debug"
+# PROP BASE Intermediate_Dir "Debug"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 1
+# PROP Output_Dir "Debug"
+# PROP Intermediate_Dir "Debug"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c
+# ADD CPP /nologo /MDd /W3 /WX /Gm /GR /GX /Zi /Od /I "." /I "../../../include" /I "../../../include/stlport" /D "_CONSOLE" /D "_DEBUG" /D "WIN32_LEAN_AND_MEAN" /FD /GZ /c
+# SUBTRACT CPP /Fr /YX
+# ADD BASE RSC /l 0x409 /d "_DEBUG"
+# ADD RSC /l 0x409 /d "_DEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept
+# ADD LINK32 IceStormd.lib IceGridd.lib Iced.lib IceUtild.lib setargv.obj /nologo /subsystem:console /debug /machine:I386 /out:"subscriber.exe" /pdbtype:sept /libpath:"../../../lib" /FIXED:no
+# SUBTRACT LINK32 /pdb:none
+
+!ENDIF
+
+# Begin Target
+
+# Name "replicated2S - Win32 Release"
+# Name "replicated2S - Win32 Debug"
+# Begin Group "Source Files"
+
+# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
+# Begin Source File
+
+SOURCE=.\Clock.cpp
+# End Source File
+# Begin Source File
+
+SOURCE=.\Subscriber.cpp
+# End Source File
+# End Group
+# Begin Group "Header Files"
+
+# PROP Default_Filter "h;hpp;hxx;hm;inl"
+# Begin Source File
+
+SOURCE=.\Clock.h
+# End Source File
+# End Group
+# Begin Group "Resource Files"
+
+# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe"
+# Begin Source File
+
+SOURCE=.\Clock.ice
+
+!IF "$(CFG)" == "replicated2S - Win32 Release"
+
+USERDEP__CLOCK="..\..\..\bin\slice2cpp.exe" "..\..\..\lib\slice.lib"
+# Begin Custom Build
+InputPath=.\Clock.ice
+
+BuildCmds= \
+ ..\..\..\bin\slice2cpp.exe Clock.ice
+
+"Clock.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+
+"Clock.cpp" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+# End Custom Build
+
+!ELSEIF "$(CFG)" == "replicated2S - Win32 Debug"
+
+USERDEP__CLOCK="..\..\..\bin\slice2cpp.exe" "..\..\..\lib\sliced.lib"
+# Begin Custom Build
+InputPath=.\Clock.ice
+
+BuildCmds= \
+ ..\..\..\bin\slice2cpp.exe Clock.ice
+
+"Clock.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+
+"Clock.cpp" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+# End Custom Build
+
+!ENDIF
+
+# End Source File
+# End Group
+# Begin Source File
+
+SOURCE=.\README
+# End Source File
+# End Target
+# End Project