summaryrefslogtreecommitdiff
path: root/cpp/src
diff options
context:
space:
mode:
Diffstat (limited to 'cpp/src')
-rw-r--r--cpp/src/Ice/.depend1
-rw-r--r--cpp/src/Ice/Application.cpp182
-rw-r--r--cpp/src/Ice/Makefile3
3 files changed, 185 insertions, 1 deletions
diff --git a/cpp/src/Ice/.depend b/cpp/src/Ice/.depend
index b343394e2aa..cf5dc22bab6 100644
--- a/cpp/src/Ice/.depend
+++ b/cpp/src/Ice/.depend
@@ -1,3 +1,4 @@
+Application.o: Application.cpp ../../include/Ice/Application.h ../../include/Ice/Ice.h ../../include/Ice/Communicator.h ../../include/Ice/ProxyF.h ../../include/Ice/ProxyHandle.h ../../include/Ice/Config.h ../../include/IceUtil/Config.h ../../include/Ice/ObjectF.h ../../include/Ice/Handle.h ../../include/IceUtil/Handle.h ../../include/Ice/LocalObjectF.h ../../include/Ice/Native.h ../../include/Ice/LocalObject.h ../../include/IceUtil/Shared.h ../../include/Ice/LoggerF.h ../../include/Ice/ObjectAdapterF.h ../../include/Ice/PicklerF.h ../../include/Ice/PropertiesF.h ../../include/Ice/ServantFactoryF.h ../../include/Ice/ObjectAdapter.h ../../include/Ice/CommunicatorF.h ../../include/Ice/LocalException.h ../../include/Ice/Properties.h ../../include/Ice/Logger.h ../../include/Ice/ServantFactory.h ../../include/Ice/Pickler.h ../../include/Ice/Initialize.h ../../include/Ice/InstanceF.h
Stream.o: Stream.cpp ../../include/Ice/Stream.h ../../include/Ice/InstanceF.h ../../include/Ice/Handle.h ../../include/IceUtil/Handle.h ../../include/IceUtil/Config.h ../../include/Ice/Config.h ../../include/Ice/ObjectF.h ../../include/Ice/ProxyF.h ../../include/Ice/ProxyHandle.h ../../include/Ice/Buffer.h ../Ice/Instance.h ../../include/IceUtil/Shared.h ../../include/Ice/CommunicatorF.h ../../include/Ice/LocalObjectF.h ../../include/Ice/Native.h ../../include/Ice/LocalObject.h ../../include/Ice/PropertiesF.h ../../include/Ice/LoggerF.h ../Ice/TraceLevelsF.h ../../include/Ice/ProxyFactoryF.h ../Ice/ThreadPoolF.h ../../include/Ice/EmitterF.h ../Ice/ServantFactoryManagerF.h ../../include/Ice/ObjectAdapterFactoryF.h ../../include/Ice/PicklerF.h ../../include/Ice/Object.h ../../include/Ice/Proxy.h ../../include/Ice/ReferenceF.h ../Ice/ProxyFactory.h ../../include/Ice/ServantFactory.h ../Ice/ServantFactoryManager.h ../../include/Ice/ServantFactoryF.h ../../include/Ice/LocalException.h
LocalException.o: LocalException.cpp ../../include/Ice/LocalException.h ../../include/Ice/Config.h ../../include/IceUtil/Config.h ../Ice/Network.h
Pickler.o: Pickler.cpp ../../include/Ice/Pickler.h ../../include/Ice/ProxyF.h ../../include/Ice/ProxyHandle.h ../../include/Ice/Config.h ../../include/IceUtil/Config.h ../../include/Ice/ObjectF.h ../../include/Ice/Handle.h ../../include/IceUtil/Handle.h ../../include/Ice/LocalObjectF.h ../../include/Ice/Native.h ../../include/Ice/LocalObject.h ../../include/IceUtil/Shared.h ../../include/Ice/Stream.h ../../include/Ice/InstanceF.h ../../include/Ice/Buffer.h
diff --git a/cpp/src/Ice/Application.cpp b/cpp/src/Ice/Application.cpp
new file mode 100644
index 00000000000..fdb7ec3d3b6
--- /dev/null
+++ b/cpp/src/Ice/Application.cpp
@@ -0,0 +1,182 @@
+// **********************************************************************
+//
+// Copyright (c) 2001
+// MutableRealms, Inc.
+// Huntsville, AL, USA
+//
+// All Rights Reserved
+//
+// **********************************************************************
+
+#include <Ice/Application.h>
+#ifndef WIN32
+# include <signal.h>
+#endif
+
+using namespace std;
+using namespace Ice;
+
+const char* Application::_appName;
+CommunicatorPtr Application::_communicator;
+
+Ice::Application::Application()
+{
+}
+
+Ice::Application::~Application()
+{
+}
+
+int
+Ice::Application::main(int argc, char* argv[], const char* configFile)
+{
+ if (_communicator && _appName)
+ {
+ cerr << argv[0] << ": only one instance of the Application class can be used" << endl;
+ return EXIT_FAILURE;
+ }
+
+ _appName = argv[0];
+
+ int status;
+
+ try
+ {
+ if (configFile)
+ {
+ PropertiesPtr properties = createPropertiesFromFile(argc, argv, configFile);
+ _communicator = initializeWithProperties(properties);
+ }
+ else
+ {
+ _communicator = initialize(argc, argv);
+ }
+ status = run(argc, argv);
+ }
+ catch(const LocalException& ex)
+ {
+ cerr << _appName << ": local exception: " << ex << endl;
+ status = EXIT_FAILURE;
+ }
+ catch(...)
+ {
+ cerr << _appName << ": unknown exception" << endl;
+ status = EXIT_FAILURE;
+ }
+
+ if (_communicator)
+ {
+ try
+ {
+ _communicator->destroy();
+ }
+ catch(const LocalException& ex)
+ {
+ cerr << _appName << ": local exception: " << ex << endl;
+ status = EXIT_FAILURE;
+ }
+ catch(...)
+ {
+ cerr << _appName << ": unknown exception" << endl;
+ status = EXIT_FAILURE;
+ }
+ _communicator = 0;
+ }
+
+ _appName = 0;
+
+ return status;
+}
+
+const char*
+Ice::Application::appName()
+{
+ return _appName;
+}
+
+CommunicatorPtr
+Ice::Application::communicator()
+{
+ return _communicator;
+}
+
+#ifdef WIN32
+
+static BOOL WINAPI
+interruptHandler(DWORD)
+{
+ assert(Application::communicator());
+ Application::communicator()->shutdown();
+ return TRUE;
+}
+
+void
+Ice::Application::shutdownOnInterrupt()
+{
+ SetConsoleCtrlHandler(NULL, FALSE);
+ SetConsoleCtrlHandler(interruptHandler, TRUE);
+}
+
+void
+Ice::Application::ignoreInterrupt()
+{
+ SetConsoleCtrlHandler(interruptHandler, FALSE);
+ SetConsoleCtrlHandler(NULL, TRUE);
+}
+
+void
+Ice::Application::defaultInterrupt()
+{
+ SetConsoleCtrlHandler(interruptHandler, FALSE);
+ SetConsoleCtrlHandler(NULL, FALSE);
+}
+
+#else
+
+static void
+interruptHandler(int)
+{
+ assert(Application::communicator());
+ Application::communicator()->shutdown();
+}
+
+void
+Ice::Application::shutdownOnInterrupt()
+{
+ struct sigaction action;
+ action.sa_handler = interruptHandler;
+ sigemptyset(&action.sa_mask);
+ sigaddset(&action.sa_mask, SIGHUP);
+ sigaddset(&action.sa_mask, SIGINT);
+ sigaddset(&action.sa_mask, SIGTERM);
+ action.sa_flags = 0;
+ sigaction(SIGHUP, &action, 0);
+ sigaction(SIGINT, &action, 0);
+ sigaction(SIGTERM, &action, 0);
+}
+
+void
+Ice::Application::ignoreInterrupt()
+{
+ struct sigaction action;
+ action.sa_handler = SIG_IGN;
+ sigemptyset(&action.sa_mask);
+ action.sa_flags = 0;
+ sigaction(SIGHUP, &action, 0);
+ sigaction(SIGINT, &action, 0);
+ sigaction(SIGTERM, &action, 0);
+}
+
+void
+Ice::Application::defaultInterrupt()
+{
+ struct sigaction action;
+ action.sa_handler = SIG_DFL;
+ sigemptyset(&action.sa_mask);
+ action.sa_flags = 0;
+ sigaction(SIGHUP, &action, 0);
+ sigaction(SIGINT, &action, 0);
+ sigaction(SIGTERM, &action, 0);
+}
+
+#endif
diff --git a/cpp/src/Ice/Makefile b/cpp/src/Ice/Makefile
index 3da541e9d3d..14632f1000f 100644
--- a/cpp/src/Ice/Makefile
+++ b/cpp/src/Ice/Makefile
@@ -18,7 +18,8 @@ VERSIONED_NAME = $(top_srcdir)/lib/$(VERSIONED_BASE)
TARGETS = $(NAME) $(VERSIONED_NAME)
-OBJS = Stream.o \
+OBJS = Application.o \
+ Stream.o \
LocalException.o \
Pickler.o \
PicklerI.o \