/* * * 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 #include namespace qpid { namespace messaging { namespace { double FOREVER(std::numeric_limits::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& 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& to) { for (qpid::types::Variant::List::const_iterator i = from.begin(); i != from.end(); ++i) merge(i->asString(), to); } } ConnectionOptions::ConnectionOptions(const std::map& 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