summaryrefslogtreecommitdiff
path: root/cpp/src/IceBox/Service.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'cpp/src/IceBox/Service.cpp')
-rw-r--r--cpp/src/IceBox/Service.cpp159
1 files changed, 159 insertions, 0 deletions
diff --git a/cpp/src/IceBox/Service.cpp b/cpp/src/IceBox/Service.cpp
new file mode 100644
index 00000000000..3c60ace423d
--- /dev/null
+++ b/cpp/src/IceBox/Service.cpp
@@ -0,0 +1,159 @@
+// **********************************************************************
+//
+// Copyright (c) 2003-2011 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/Options.h>
+#include <Ice/Ice.h>
+#include <Ice/Service.h>
+#include <IceBox/ServiceManagerI.h>
+
+using namespace std;
+using namespace Ice;
+using namespace IceBox;
+
+namespace IceBox
+{
+
+class IceBoxService : public Ice::Service
+{
+public:
+
+ IceBoxService();
+
+protected:
+
+ virtual bool start(int, char*[], int&);
+ virtual bool stop();
+
+private:
+
+ void usage(const std::string&);
+ ServiceManagerIPtr _serviceManager;
+};
+
+}
+
+IceBox::IceBoxService::IceBoxService()
+{
+}
+
+bool
+IceBox::IceBoxService::start(int argc, char* argv[], int& status)
+{
+ // Run through the command line arguments removing all the service
+ // properties.
+ vector<string> args = Ice::argsToStringSeq(argc, argv);
+ PropertiesPtr properties = communicator()->getProperties();
+ const string prefix = "IceBox.Service.";
+ PropertyDict services = properties->getPropertiesForPrefix(prefix);
+ for(PropertyDict::const_iterator p = services.begin(); p != services.end(); ++p)
+ {
+ string name = p->first.substr(prefix.size());
+ StringSeq::iterator q = args.begin();
+ while(q != args.end())
+ {
+ if(q->find("--" + name + ".") == 0)
+ {
+ q = args.erase(q);
+ continue;
+ }
+ ++q;
+ }
+ }
+
+ IceUtilInternal::Options opts;
+ opts.addOpt("h", "help");
+ opts.addOpt("v", "version");
+
+ try
+ {
+ args = opts.parse(args);
+ }
+ catch(const IceUtilInternal::BadOptException& e)
+ {
+ error(e.reason);
+ usage(argv[0]);
+ return false;
+ }
+
+ if(opts.isSet("help"))
+ {
+ usage(argv[0]);
+ status = EXIT_SUCCESS;
+ return false;
+ }
+ if(opts.isSet("version"))
+ {
+ print(ICE_STRING_VERSION);
+ status = EXIT_SUCCESS;
+ return false;
+ }
+
+ if(!args.empty())
+ {
+ usage(argv[0]);
+ return false;
+ }
+
+ _serviceManager = new ServiceManagerI(communicator(), argc, argv);
+
+ return _serviceManager->start();
+}
+
+bool
+IceBox::IceBoxService::stop()
+{
+ if(_serviceManager)
+ {
+ _serviceManager->stop();
+ _serviceManager = 0;
+ }
+ return true;
+}
+
+void
+IceBox::IceBoxService::usage(const string& appName)
+{
+ string options =
+ "Options:\n"
+ "-h, --help Show this message.\n"
+ "-v, --version Display the Ice version.";
+#ifndef _WIN32
+ options.append(
+ "\n"
+ "\n"
+ "--daemon Run as a daemon.\n"
+ "--pidfile FILE Write process ID into FILE.\n"
+ "--noclose Do not close open file descriptors.\n"
+ "--nochdir Do not change the current working directory."
+ );
+#endif
+ print("Usage: " + appName + " [options]\n" + options);
+}
+
+//COMPILERFIX: Borland C++ 2010 doesn't support wmain for console applications.
+#if defined(_WIN32 ) && !defined(__BCPLUSPLUS__)
+
+int
+wmain(int argc, wchar_t* argv[])
+
+#else
+
+int
+main(int argc, char* argv[])
+
+#endif
+{
+ IceBox::IceBoxService svc;
+
+ InitializationData initData;
+ initData.properties = createProperties();
+ initData.properties->setProperty("Ice.Admin.DelayCreation", "1");
+ return svc.main(argc, argv, initData);
+}
+