00001 #include "Arguments.h" 00002 #include "Sct/LogicErrors.h" 00003 #include "Sct/SctNames.h" 00004 #include <boost/lexical_cast.hpp> 00005 00006 namespace SctService { 00007 using std::string; 00008 using std::list; 00009 using std::endl; 00010 using Sct::InvalidArgumentError; 00011 using Sct::SctNames; 00012 00013 Arguments::Arguments(int argc, char** argv) : 00014 m_nworkers(1), m_recovery(false){ 00015 m_list = makeList(argc,argv); 00016 } 00017 00018 void Arguments::parse(){ 00019 for (list<string>::iterator i=m_list.begin(); i!=m_list.end(); ++i){ 00020 if (*i == "-help"){ 00021 SctNames::Mrs() << "HELP_MESSAGE" << MRS_TEXT(printHelp()) << MRS_INFORMATION << ENDM; exit(1); 00022 }else if (*i == "-recover"){ 00023 m_recovery=true; 00024 } else if (*i == "-input"){ 00025 string server=next(i); 00026 string regexp=next(i); 00027 m_input.push_back(Subscription(server,regexp)); 00028 } else if (*i == "-name"){ 00029 m_instanceName=next(i); 00030 } else if (*i == "-status"){ 00031 m_status_name=next(i); 00032 } else if (*i == "-output"){ 00033 m_output=next(i); 00034 } else if (*i == "-nworkers"){ 00035 unsigned requested_workers=boost::lexical_cast<int>(next(i)); 00036 m_nworkers=requested_workers; 00037 if (m_nworkers>MAX_WORKERS) { 00038 m_nworkers=MAX_WORKERS; 00039 std::cerr << "Number of workers requested (" << requested_workers 00040 << ") too large - limited to 10" << std::endl; 00041 } 00042 } 00043 } 00044 } 00045 00046 string Arguments::next(list<string>::iterator& i) const{ 00047 if (++i==m_list.end()) throw InvalidArgumentError(printHelp(), __FILE__, __LINE__); 00048 return *i; 00049 } 00050 00051 list<string> Arguments::makeList(int argc, char** argv){ 00052 list<std::string> theList; 00053 for (int i=1; i<argc; ++i){ 00054 theList.push_back(argv[i]); 00055 } 00056 return theList; 00057 } 00058 00059 std::string Arguments::printHelp() const{ 00060 std::ostringstream oss; 00061 printHelp(oss); 00062 return oss.str(); 00063 } 00064 00065 std::string Arguments::print() const{ 00066 std::ostringstream oss; 00067 print(oss); 00068 return oss.str(); 00069 } 00070 00071 Arguments::~Arguments(){} 00072 00073 void Arguments::printHelp(std::ostream& oss) const{ 00074 oss << "ServiceArguments:" << endl 00075 << " -name <name> : name (in IPC) for this service" << endl 00076 << " -status <name> : IS name to publish status information to" << endl 00077 << " -nworkers <nworkers> : number of worker threads" << endl 00078 << " -recover (switch) : try to do auto-recovery" << endl 00079 << " -input <server name> <regexp> : add IS server from which to receive data (can be used many times)" << endl 00080 << " -output <server name> : set IS server to write output data to" << endl 00081 << " -help : print this help message" << endl; 00082 } 00083 00084 void Arguments::print(std::ostream& oss) const{ 00085 oss << "Initial arguments were: "; 00086 for (list<string>::const_iterator i=m_list.begin(); i!=m_list.end(); ++i){ 00087 oss << " " << *i; 00088 } 00089 oss << endl; 00090 } 00091 unsigned Arguments::getNWorkers() const{ 00092 return m_nworkers; 00093 } 00094 00095 std::string Arguments::getOutputISServer() const{ 00096 return m_output; 00097 } 00098 00099 std::list<Arguments::Subscription> Arguments::getInputISServers() const{ 00100 return m_input; 00101 } 00102 00103 bool Arguments::recoveryMode() const{ 00104 return m_recovery; 00105 } 00106 00107 std::string Arguments::instanceName() const{ 00108 return m_instanceName; 00109 } 00110 00111 std::string Arguments::getISStatusName() const{ 00112 return m_status_name; 00113 } 00114 00115 void Arguments::setInstanceName(const std::string& n){ 00116 m_instanceName=n; 00117 } 00118 00119 void Arguments::setNWorkers(const unsigned n){ 00120 m_nworkers=n; 00121 } 00122 00123 void Arguments::setOutputISServer(const std::string &s){ 00124 m_output=s; 00125 } 00126 00127 void Arguments::setISStatusName(const std::string& s){ 00128 m_status_name=s; 00129 } 00130 00131 void Arguments::setRecoveryMode(const bool b){ 00132 m_recovery=b; 00133 } 00134 00135 Arguments::Subscription::Subscription(string server, string regexp) : 00136 server (server), regexp(regexp) 00137 { 00138 } 00139 }