blob: ecd5ba9693b9b0850187598cb3fedab8829b1379 [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 "qpid/messaging/ConnectionOptions.h"
#include "qpid/messaging/exceptions.h"
#include "qpid/types/Variant.h"
#include "qpid/log/Statement.h"
#include <algorithm>
#include <limits>
namespace qpid {
namespace messaging {
namespace {
double FOREVER(std::numeric_limits<double>::max());
double timeValue(const qpid::types::Variant& value) {
if (types::isIntegerType(value.getType()))
return double(value.asInt64());
return value.asDouble();
}
void merge(const std::string& value, std::vector<std::string>& list) {
if (std::find(list.begin(), list.end(), value) == list.end())
list.push_back(value);
}
void merge(const qpid::types::Variant::List& from, std::vector<std::string>& to)
{
for (qpid::types::Variant::List::const_iterator i = from.begin(); i != from.end(); ++i)
merge(i->asString(), to);
}
}
ConnectionOptions::ConnectionOptions(const std::map<std::string, qpid::types::Variant>& options)
: replaceUrls(false), reconnect(false), timeout(FOREVER), limit(-1), minReconnectInterval(0.001), maxReconnectInterval(2),
retries(0), reconnectOnLimitExceeded(true)
{
for (qpid::types::Variant::Map::const_iterator i = options.begin(); i != options.end(); ++i) {
set(i->first, i->second);
}
}
void ConnectionOptions::set(const std::string& name, const qpid::types::Variant& value)
{
if (name == "reconnect") {
reconnect = value;
} else if (name == "reconnect-timeout" || name == "reconnect_timeout") {
timeout = timeValue(value);
} else if (name == "reconnect-limit" || name == "reconnect_limit") {
limit = value;
} else if (name == "reconnect-interval" || name == "reconnect_interval") {
maxReconnectInterval = minReconnectInterval = timeValue(value);
} else if (name == "reconnect-interval-min" || name == "reconnect_interval_min") {
minReconnectInterval = timeValue(value);
} else if (name == "reconnect-interval-max" || name == "reconnect_interval_max") {
maxReconnectInterval = timeValue(value);
} else if (name == "reconnect-urls-replace" || name == "reconnect_urls_replace") {
replaceUrls = value.asBool();
} else if (name == "reconnect-urls" || name == "reconnect_urls") {
if (replaceUrls) urls.clear();
if (value.getType() == qpid::types::VAR_LIST) {
merge(value.asList(), urls);
} else {
merge(value.asString(), urls);
}
} else if (name == "username") {
username = value.asString();
} else if (name == "password") {
password = value.asString();
} else if (name == "sasl-mechanism" || name == "sasl_mechanism" ||
name == "sasl-mechanisms" || name == "sasl_mechanisms") {
mechanism = value.asString();
} else if (name == "sasl-service" || name == "sasl_service") {
service = value.asString();
} else if (name == "sasl-min-ssf" || name == "sasl_min_ssf") {
minSsf = value;
} else if (name == "sasl-max-ssf" || name == "sasl_max_ssf") {
maxSsf = value;
} else if (name == "heartbeat") {
heartbeat = value;
} else if (name == "tcp-nodelay" || name == "tcp_nodelay") {
tcpNoDelay = value;
} else if (name == "locale") {
locale = value.asString();
} else if (name == "max-channels" || name == "max_channels") {
maxChannels = value;
} else if (name == "max-frame-size" || name == "max_frame_size") {
maxFrameSize = value;
} else if (name == "bounds") {
bounds = value;
} else if (name == "transport") {
protocol = value.asString();
} else if (name == "ssl-cert-name" || name == "ssl_cert_name") {
sslCertName = value.asString();
} else if (name == "x-reconnect-on-limit-exceeded" || name == "x_reconnect_on_limit_exceeded") {
reconnectOnLimitExceeded = value;
} else {
throw qpid::messaging::MessagingException(QPID_MSG("Invalid option: " << name << " not recognised"));
}
}
}} // namespace qpid::messaging