blob: e83c359f2d43a988e61f938be9bc8009ddddc18c [file] [log] [blame]
/*
*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*
*/
#include <Configuration.h>
#include <string.h>
#include <config.h>
using namespace qpid::broker;
using namespace std;
Configuration::Configuration() :
daemon('d', "daemon", "Run as system daemon, detached from terminal.", false),
trace('t', "trace", "Print incoming & outgoing frames to the console", false),
port('p', "port", "Set the port to listen on (default=5672)", 5672),
workerThreads("worker-threads", "Set the number of worker threads to use (default=5).", 5),
maxConnections("max-connections", "Set the maximum number of connections the broker can accept (default=500).", 500),
connectionBacklog("connection-backlog", "Set the connection backlog for the servers socket (default=10)", 10),
store('s', "store", "Set the message store module to use (default='' which implies no store)", ""),
stagingThreshold("staging-threshold", "Set the message size threshold above which messages will be written to disk as they arrive (default=5,000,000)", 5000000),
help("help", "Print usage information", false),
version("version", "Print version information", false)
{
options.push_back(&daemon);
options.push_back(&trace);
options.push_back(&port);
options.push_back(&workerThreads);
options.push_back(&maxConnections);
options.push_back(&connectionBacklog);
options.push_back(&store);
options.push_back(&stagingThreshold);
options.push_back(&help);
options.push_back(&version);
}
Configuration::~Configuration(){}
void Configuration::parse(char const *progName, int argc, char** argv){
programName = progName;
int position = 1;
while(position < argc){
bool matched(false);
for(op_iterator i = options.begin(); i < options.end() && !matched; i++){
matched = (*i)->parse(position, argv, argc);
}
if(!matched) {
throw BadOptionException(
std::string("Unrecognised option: ")+argv[position]);
}
}
}
void Configuration::usage(){
std::cout << "Usage: " << programName << " [OPTION]..." << std::endl
<< "Start the Qpid AMQP broker daemon." << std::endl << std::endl
<< "Options:" << std::endl;
for(op_iterator i = options.begin(); i < options.end(); i++){
(*i)->print(std::cout);
}
std::cout << std::endl << "Report bugs to <" << PACKAGE_BUGREPORT << ">."
<< std::endl;
}
bool Configuration::isHelp() const {
return help.getValue();
}
bool Configuration::isVersion() const {
return version.getValue();
}
bool Configuration::isDaemon() const {
return daemon.getValue();
}
bool Configuration::isTrace() const {
return trace.getValue();
}
int Configuration::getPort() const {
return port.getValue();
}
int Configuration::getWorkerThreads() const {
return workerThreads.getValue();
}
int Configuration::getMaxConnections() const {
return maxConnections.getValue();
}
int Configuration::getConnectionBacklog() const {
return connectionBacklog.getValue();
}
const std::string& Configuration::getStore() const {
return store.getValue();
}
long Configuration::getStagingThreshold() const {
return stagingThreshold.getValue();
}
Configuration::Option::Option(const char _flag, const string& _name, const string& _desc) :
flag(string("-") + _flag), name("--" +_name), desc(_desc) {}
Configuration::Option::Option(const string& _name, const string& _desc) :
flag(""), name("--" + _name), desc(_desc) {}
Configuration::Option::~Option(){}
bool Configuration::Option::match(const string& arg){
return flag == arg || name == arg;
}
bool Configuration::Option::parse(int& i, char** argv, int argc){
const string arg(argv[i]);
if(match(arg)){
if(needsValue()){
if(++i < argc) setValue(argv[i]);
else throw ParseException("Argument " + arg + " requires a value!");
}else{
setValue("");
}
i++;
return true;
}else{
return false;
}
}
void Configuration::Option::print(ostream& out) const {
out << " ";
if(flag.length() > 0){
out << flag << ", ";
} else {
out << " ";
}
out << name;
if(needsValue()) out << " <value>";
out << std::endl;
out << " " << desc << std::endl;
}
// String Option:
Configuration::StringOption::StringOption(const char _flag, const string& _name, const string& _desc, const string _value) :
Option(_flag,_name,_desc), defaultValue(_value), value(_value) {}
Configuration::StringOption::StringOption(const string& _name, const string& _desc, const string _value) :
Option(_name,_desc), defaultValue(_value), value(_value) {}
Configuration::StringOption::~StringOption(){}
const string& Configuration::StringOption::getValue() const {
return value;
}
bool Configuration::StringOption::needsValue() const {
return true;
}
void Configuration::StringOption::setValue(const std::string& _value){
value = _value;
}
// Int Option:
Configuration::IntOption::IntOption(const char _flag, const string& _name, const string& _desc, const int _value) :
Option(_flag,_name,_desc), defaultValue(_value), value(_value) {}
Configuration::IntOption::IntOption(const string& _name, const string& _desc, const int _value) :
Option(_name,_desc), defaultValue(_value), value(_value) {}
Configuration::IntOption::~IntOption(){}
int Configuration::IntOption::getValue() const {
return value;
}
bool Configuration::IntOption::needsValue() const {
return true;
}
void Configuration::IntOption::setValue(const std::string& _value){
value = atoi(_value.c_str());
}
// Long Option:
Configuration::LongOption::LongOption(const char _flag, const string& _name, const string& _desc, const long _value) :
Option(_flag,_name,_desc), defaultValue(_value), value(_value) {}
Configuration::LongOption::LongOption(const string& _name, const string& _desc, const long _value) :
Option(_name,_desc), defaultValue(_value), value(_value) {}
Configuration::LongOption::~LongOption(){}
long Configuration::LongOption::getValue() const {
return value;
}
bool Configuration::LongOption::needsValue() const {
return true;
}
void Configuration::LongOption::setValue(const std::string& _value){
value = atol(_value.c_str());
}
// Bool Option:
Configuration::BoolOption::BoolOption(const char _flag, const string& _name, const string& _desc, const bool _value) :
Option(_flag,_name,_desc), defaultValue(_value), value(_value) {}
Configuration::BoolOption::BoolOption(const string& _name, const string& _desc, const bool _value) :
Option(_name,_desc), defaultValue(_value), value(_value) {}
Configuration::BoolOption::~BoolOption(){}
bool Configuration::BoolOption::getValue() const {
return value;
}
bool Configuration::BoolOption::needsValue() const {
return false;
}
void Configuration::BoolOption::setValue(const std::string& /*not required*/){
//BoolOptions have no value. The fact that the option is specified
//implies the value is true.
value = true;
}