| Index: chrome/browser/sync/notifier/communicator/connection_settings.cc
|
| ===================================================================
|
| --- chrome/browser/sync/notifier/communicator/connection_settings.cc (revision 0)
|
| +++ chrome/browser/sync/notifier/communicator/connection_settings.cc (revision 0)
|
| @@ -0,0 +1,126 @@
|
| +// Copyright (c) 2009 The Chromium Authors. All rights reserved.
|
| +// Use of this source code is governed by a BSD-style license that can be
|
| +// found in the LICENSE file.
|
| +
|
| +#include <deque>
|
| +#include <string>
|
| +#include <vector>
|
| +
|
| +#include "chrome/browser/sync/notifier/communicator/connection_settings.h"
|
| +#include "talk/base/helpers.h"
|
| +#include "talk/xmpp/xmppclientsettings.h"
|
| +
|
| +namespace notifier {
|
| +
|
| +class RandomGenerator {
|
| + public:
|
| + int operator()(int ceiling) {
|
| + return static_cast<int>(cricket::CreateRandomId() % ceiling);
|
| + }
|
| +};
|
| +
|
| +void ConnectionSettings::FillXmppClientSettings(
|
| + buzz::XmppClientSettings* xcs) const {
|
| + assert(xcs);
|
| + xcs->set_protocol(protocol_);
|
| + xcs->set_server(server_);
|
| + xcs->set_proxy(proxy_.type);
|
| + if (proxy_.type != talk_base::PROXY_NONE) {
|
| + xcs->set_proxy_host(proxy_.address.IPAsString());
|
| + xcs->set_proxy_port(proxy_.address.port());
|
| + }
|
| + if ((proxy_.type != talk_base::PROXY_NONE) && !proxy_.username.empty()) {
|
| + xcs->set_use_proxy_auth(true);
|
| + xcs->set_proxy_user(proxy_.username);
|
| + xcs->set_proxy_pass(proxy_.password);
|
| + } else {
|
| + xcs->set_use_proxy_auth(false);
|
| + }
|
| +}
|
| +
|
| +void ConnectionSettingsList::AddPermutations(const std::string& hostname,
|
| + const std::vector<uint32>& iplist,
|
| + int16 port,
|
| + bool special_port_magic,
|
| + bool proxy_only) {
|
| + // randomize the list. This ensures the iplist isn't always
|
| + // evaluated in the order returned by DNS
|
| + std::vector<uint32> iplist_random = iplist;
|
| + RandomGenerator rg;
|
| + std::random_shuffle(iplist_random.begin(), iplist_random.end(), rg);
|
| +
|
| + // Put generated addresses in a new deque, then append on the list_, since
|
| + // there are order dependencies and AddPermutations() may be called more
|
| + // than once.
|
| + std::deque<ConnectionSettings> list_temp;
|
| +
|
| + // Permute addresses for this server. In some cases we haven't resolved the
|
| + // to ip addresses.
|
| + talk_base::SocketAddress server(hostname, port, false);
|
| + if (iplist_random.empty()) {
|
| + // We couldn't pre-resolve the hostname, so let's hope it will resolve
|
| + // further down the pipeline (by a proxy, for example).
|
| + PermuteForAddress(server, special_port_magic, proxy_only, &list_temp);
|
| + } else {
|
| + // Generate a set of possibilities for each server address.
|
| + // Don't do permute duplicates.
|
| + for (size_t index = 0; index < iplist_random.size(); ++index) {
|
| + if (std::find(iplist_seen_.begin(), iplist_seen_.end(),
|
| + iplist_random[index]) != iplist_seen_.end()) {
|
| + continue;
|
| + }
|
| + iplist_seen_.push_back(iplist_random[index]);
|
| + server.SetResolvedIP(iplist_random[index]);
|
| + PermuteForAddress(server, special_port_magic, proxy_only, &list_temp);
|
| + }
|
| + }
|
| +
|
| + // Add this list to the instance list
|
| + while (list_temp.size() != 0) {
|
| + list_.push_back(list_temp[0]);
|
| + list_temp.pop_front();
|
| + }
|
| +}
|
| +
|
| +
|
| +void ConnectionSettingsList::PermuteForAddress(
|
| + const talk_base::SocketAddress& server,
|
| + bool special_port_magic,
|
| + bool proxy_only,
|
| + std::deque<ConnectionSettings>* list_temp) {
|
| + assert(list_temp);
|
| + *(template_.mutable_server()) = server;
|
| +
|
| + // Use all of the original settings
|
| + list_temp->push_back(template_);
|
| +
|
| + // Try alternate port
|
| + if (special_port_magic) {
|
| + ConnectionSettings settings(template_);
|
| + settings.set_protocol(cricket::PROTO_SSLTCP);
|
| + settings.mutable_server()->SetPort(443);
|
| + // HTTPS proxies usually require port 443, so try it first
|
| + if ((template_.proxy().type == talk_base::PROXY_HTTPS) ||
|
| + (template_.proxy().type == talk_base::PROXY_UNKNOWN)) {
|
| + list_temp->push_front(settings);
|
| + } else {
|
| + list_temp->push_back(settings);
|
| + }
|
| + }
|
| +
|
| + if (!proxy_only) {
|
| + // Try without the proxy
|
| + if (template_.proxy().type != talk_base::PROXY_NONE) {
|
| + ConnectionSettings settings(template_);
|
| + settings.mutable_proxy()->type = talk_base::PROXY_NONE;
|
| + list_temp->push_back(settings);
|
| +
|
| + if (special_port_magic) {
|
| + settings.set_protocol(cricket::PROTO_SSLTCP);
|
| + settings.mutable_server()->SetPort(443);
|
| + list_temp->push_back(settings);
|
| + }
|
| + }
|
| + }
|
| +}
|
| +} // namespace notifier
|
|
|
| Property changes on: chrome\browser\sync\notifier\communicator\connection_settings.cc
|
| ___________________________________________________________________
|
| Added: svn:eol-style
|
| + LF
|
|
|
|
|