| Index: chrome/browser/sync/notifier/communicator/xmpp_connection_generator.cc
|
| ===================================================================
|
| --- chrome/browser/sync/notifier/communicator/xmpp_connection_generator.cc (revision 46353)
|
| +++ chrome/browser/sync/notifier/communicator/xmpp_connection_generator.cc (working copy)
|
| @@ -1,210 +0,0 @@
|
| -// 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.
|
| -//
|
| -// XmppConnectionGenerator does the following algorithm:
|
| -// proxy = ResolveProxyInformation(connection_options)
|
| -// for server in server_list
|
| -// get dns_addresses for server
|
| -// connection_list = (dns_addresses X connection methods X proxy).shuffle()
|
| -// for connection in connection_list
|
| -// yield connection
|
| -
|
| -#include "chrome/browser/sync/notifier/communicator/xmpp_connection_generator.h"
|
| -
|
| -#include <vector>
|
| -
|
| -#include "base/logging.h"
|
| -#include "chrome/browser/sync/notifier/base/async_dns_lookup.h"
|
| -#include "chrome/browser/sync/notifier/base/signal_thread_task.h"
|
| -#include "chrome/browser/sync/notifier/communicator/connection_options.h"
|
| -#include "chrome/browser/sync/notifier/communicator/connection_settings.h"
|
| -#include "chrome/browser/sync/notifier/communicator/product_info.h"
|
| -#include "talk/base/autodetectproxy.h"
|
| -#include "talk/base/httpcommon-inl.h"
|
| -#include "talk/base/task.h"
|
| -#include "talk/base/thread.h"
|
| -#include "talk/xmpp/prexmppauth.h"
|
| -#include "talk/xmpp/xmppclientsettings.h"
|
| -#include "talk/xmpp/xmppengine.h"
|
| -
|
| -namespace notifier {
|
| -
|
| -XmppConnectionGenerator::XmppConnectionGenerator(
|
| - talk_base::Task* parent,
|
| - const ConnectionOptions* options,
|
| - bool proxy_only,
|
| - const ServerInformation* server_list,
|
| - int server_count)
|
| - : settings_list_(new ConnectionSettingsList()),
|
| - settings_index_(0),
|
| - server_list_(new ServerInformation[server_count]),
|
| - server_count_(server_count),
|
| - server_index_(-1),
|
| - proxy_only_(proxy_only),
|
| - successfully_resolved_dns_(false),
|
| - first_dns_error_(0),
|
| - options_(options),
|
| - parent_(parent) {
|
| - assert(parent);
|
| - assert(options);
|
| - assert(server_count_ > 0);
|
| - for (int i = 0; i < server_count_; ++i) {
|
| - server_list_[i] = server_list[i];
|
| - }
|
| -}
|
| -
|
| -XmppConnectionGenerator::~XmppConnectionGenerator() {
|
| - LOG(INFO) << "XmppConnectionGenerator::~XmppConnectionGenerator";
|
| -}
|
| -
|
| -const talk_base::ProxyInfo& XmppConnectionGenerator::proxy() const {
|
| - assert(settings_list_.get());
|
| - if (settings_index_ >= settings_list_->GetCount()) {
|
| - return settings_list_->proxy();
|
| - }
|
| -
|
| - ConnectionSettings* settings = settings_list_->GetSettings(settings_index_);
|
| - return settings->proxy();
|
| -}
|
| -
|
| -// Starts resolving proxy information.
|
| -void XmppConnectionGenerator::StartGenerating() {
|
| - LOG(INFO) << "XmppConnectionGenerator::StartGenerating";
|
| -
|
| - talk_base::AutoDetectProxy* proxy_detect =
|
| - new talk_base::AutoDetectProxy(GetUserAgentString());
|
| -
|
| - if (options_->autodetect_proxy()) {
|
| - // Pretend the xmpp server is https, when detecting whether a proxy is
|
| - // required to connect.
|
| - talk_base::Url<char> host_url("/",
|
| - server_list_[0].server.IPAsString().c_str(),
|
| - server_list_[0].server.port());
|
| - host_url.set_secure(true);
|
| - proxy_detect->set_server_url(host_url.url());
|
| - } else if (options_->proxy_host().length()) {
|
| - talk_base::SocketAddress proxy(options_->proxy_host(),
|
| - options_->proxy_port());
|
| - proxy_detect->set_proxy(proxy);
|
| - }
|
| - proxy_detect->set_auth_info(options_->use_proxy_auth(),
|
| - options_->auth_user(),
|
| - talk_base::CryptString(options_->auth_pass()));
|
| -
|
| - SignalThreadTask<talk_base::AutoDetectProxy>* wrapper_task =
|
| - new SignalThreadTask<talk_base::AutoDetectProxy>(parent_, &proxy_detect);
|
| - wrapper_task->SignalWorkDone.connect(
|
| - this,
|
| - &XmppConnectionGenerator::OnProxyDetect);
|
| - wrapper_task->Start();
|
| -}
|
| -
|
| -void XmppConnectionGenerator::OnProxyDetect(
|
| - talk_base::AutoDetectProxy* proxy_detect) {
|
| - LOG(INFO) << "XmppConnectionGenerator::OnProxyDetect";
|
| -
|
| - ASSERT(settings_list_.get());
|
| - ASSERT(proxy_detect);
|
| - settings_list_->SetProxy(proxy_detect->proxy());
|
| -
|
| - // Start iterating through the connections (which are generated on demand).
|
| - UseNextConnection();
|
| -}
|
| -
|
| -void XmppConnectionGenerator::UseNextConnection() {
|
| - // Trying to connect.
|
| -
|
| - // Iterate to the next possible connection.
|
| - settings_index_++;
|
| - if (settings_index_ < settings_list_->GetCount()) {
|
| - // We have more connection settings in the settings_list_ to try, kick off
|
| - // the next one.
|
| - UseCurrentConnection();
|
| - return;
|
| - }
|
| -
|
| - // Iterate to the next possible server.
|
| - server_index_++;
|
| - if (server_index_ < server_count_) {
|
| - AsyncDNSLookup* dns_lookup = new AsyncDNSLookup(
|
| - server_list_[server_index_].server);
|
| - SignalThreadTask<AsyncDNSLookup>* wrapper_task =
|
| - new SignalThreadTask<AsyncDNSLookup>(parent_, &dns_lookup);
|
| - wrapper_task->SignalWorkDone.connect(
|
| - this,
|
| - &XmppConnectionGenerator::OnServerDNSResolved);
|
| - wrapper_task->Start();
|
| - return;
|
| - }
|
| -
|
| - // All out of possibilities.
|
| - HandleExhaustedConnections();
|
| -}
|
| -
|
| -void XmppConnectionGenerator::OnServerDNSResolved(
|
| - AsyncDNSLookup* dns_lookup) {
|
| - LOG(INFO) << "XmppConnectionGenerator::OnServerDNSResolved";
|
| -
|
| - // Print logging info.
|
| - LOG(INFO) << " server: " <<
|
| - server_list_[server_index_].server.ToString() <<
|
| - " error: " << dns_lookup->error();
|
| - if (first_dns_error_ == 0 && dns_lookup->error() != 0) {
|
| - first_dns_error_ = dns_lookup->error();
|
| - }
|
| -
|
| - if (!successfully_resolved_dns_ && dns_lookup->ip_list().size() > 0) {
|
| - successfully_resolved_dns_ = true;
|
| - }
|
| -
|
| - for (int i = 0; i < static_cast<int>(dns_lookup->ip_list().size()); ++i) {
|
| - LOG(INFO)
|
| - << " ip " << i << " : "
|
| - << talk_base::SocketAddress::IPToString(dns_lookup->ip_list()[i]);
|
| - }
|
| -
|
| - // Build the ip list.
|
| - assert(settings_list_.get());
|
| - settings_index_ = -1;
|
| - settings_list_->ClearPermutations();
|
| - settings_list_->AddPermutations(
|
| - server_list_[server_index_].server.IPAsString(),
|
| - dns_lookup->ip_list(),
|
| - server_list_[server_index_].server.port(),
|
| - server_list_[server_index_].special_port_magic,
|
| - proxy_only_);
|
| -
|
| - UseNextConnection();
|
| -}
|
| -
|
| -static const char* const PROTO_NAMES[cricket::PROTO_LAST + 1] = {
|
| - "udp", "tcp", "ssltcp"
|
| -};
|
| -
|
| -static const char* ProtocolToString(cricket::ProtocolType proto) {
|
| - return PROTO_NAMES[proto];
|
| -}
|
| -
|
| -void XmppConnectionGenerator::UseCurrentConnection() {
|
| - LOG(INFO) << "XmppConnectionGenerator::UseCurrentConnection";
|
| -
|
| - ConnectionSettings* settings = settings_list_->GetSettings(settings_index_);
|
| - LOG(INFO) << "*** Attempting "
|
| - << ProtocolToString(settings->protocol()) << " connection to "
|
| - << settings->server().IPAsString() << ":"
|
| - << settings->server().port()
|
| - << " (via " << ProxyToString(settings->proxy().type)
|
| - << " proxy @ " << settings->proxy().address.IPAsString() << ":"
|
| - << settings->proxy().address.port() << ")";
|
| -
|
| - SignalNewSettings(*settings);
|
| -}
|
| -
|
| -void XmppConnectionGenerator::HandleExhaustedConnections() {
|
| - LOG(INFO) << "(" << buzz::XmppEngine::ERROR_SOCKET
|
| - << ", " << first_dns_error_ << ")";
|
| - SignalExhaustedSettings(successfully_resolved_dns_, first_dns_error_);
|
| -}
|
| -
|
| -} // namespace notifier
|
|
|