diff options
Diffstat (limited to 'cpp/src')
-rw-r--r-- | cpp/src/Ice/.depend | 1 | ||||
-rw-r--r-- | cpp/src/Ice/Application.cpp | 182 | ||||
-rw-r--r-- | cpp/src/Ice/Makefile | 3 |
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 \ |