| Index: chrome/browser/sync/notifier/listener/mediator_thread_impl.cc | 
| =================================================================== | 
| --- chrome/browser/sync/notifier/listener/mediator_thread_impl.cc	(revision 46353) | 
| +++ chrome/browser/sync/notifier/listener/mediator_thread_impl.cc	(working copy) | 
| @@ -1,298 +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. | 
| - | 
| -#include "chrome/browser/sync/notifier/listener/mediator_thread_impl.h" | 
| - | 
| -#include "base/logging.h" | 
| -#include "base/message_loop.h" | 
| -#include "base/platform_thread.h" | 
| -#include "chrome/browser/sync/notifier/base/async_dns_lookup.h" | 
| -#include "chrome/browser/sync/notifier/base/task_pump.h" | 
| -#include "chrome/browser/sync/notifier/communicator/connection_options.h" | 
| -#include "chrome/browser/sync/notifier/communicator/const_communicator.h" | 
| -#include "chrome/browser/sync/notifier/communicator/xmpp_connection_generator.h" | 
| -#include "chrome/browser/sync/notifier/listener/listen_task.h" | 
| -#include "chrome/browser/sync/notifier/listener/send_update_task.h" | 
| -#include "chrome/browser/sync/notifier/listener/subscribe_task.h" | 
| -#include "talk/base/thread.h" | 
| -#include "talk/xmpp/xmppclient.h" | 
| -#include "talk/xmpp/xmppclientsettings.h" | 
| - | 
| -using std::string; | 
| - | 
| -namespace notifier { | 
| - | 
| -MediatorThreadImpl::MediatorThreadImpl() {} | 
| - | 
| -MediatorThreadImpl::~MediatorThreadImpl() { | 
| -} | 
| - | 
| -void MediatorThreadImpl::Start() { | 
| -  talk_base::Thread::Start(); | 
| -} | 
| - | 
| -void MediatorThreadImpl::Run() { | 
| -  PlatformThread::SetName("Notifier_MediatorThread"); | 
| -  // For win32, this sets up the win32socketserver. Note that it needs to | 
| -  // dispatch windows messages since that is what the win32 socket server uses. | 
| - | 
| -  MessageLoop message_loop; | 
| - | 
| -  Post(this, CMD_PUMP_AUXILIARY_LOOPS); | 
| -  ProcessMessages(talk_base::kForever); | 
| -} | 
| - | 
| -void MediatorThreadImpl::PumpAuxiliaryLoops() { | 
| -  if (pump_.get() && pump_->HasPendingTimeoutTask()) { | 
| -    pump_->WakeTasks(); | 
| -  } | 
| -  MessageLoop::current()->RunAllPending(); | 
| -  // We want to pump auxiliary loops every 100ms until this thread is stopped, | 
| -  // at which point this call will do nothing. | 
| -  PostDelayed(100, this, CMD_PUMP_AUXILIARY_LOOPS); | 
| -} | 
| - | 
| -void MediatorThreadImpl::Login(const buzz::XmppClientSettings& settings) { | 
| -  Post(this, CMD_LOGIN, new LoginData(settings)); | 
| -} | 
| - | 
| -void MediatorThreadImpl::Stop() { | 
| -  Thread::Stop(); | 
| -  CHECK(!login_.get() && !pump_.get()) << "Logout should be called prior to" | 
| -      << "message queue exit."; | 
| -} | 
| - | 
| -void MediatorThreadImpl::Logout() { | 
| -  CHECK(!IsQuitting()) | 
| -      << "Logout should be called prior to message queue exit."; | 
| -  Post(this, CMD_DISCONNECT); | 
| -  Stop(); | 
| -} | 
| - | 
| -void MediatorThreadImpl::ListenForUpdates() { | 
| -  Post(this, CMD_LISTEN_FOR_UPDATES); | 
| -} | 
| - | 
| -void MediatorThreadImpl::SubscribeForUpdates( | 
| -    const std::vector<std::string>& subscribed_services_list) { | 
| -  Post(this, CMD_SUBSCRIBE_FOR_UPDATES, | 
| -       new SubscriptionData(subscribed_services_list)); | 
| -} | 
| - | 
| -void MediatorThreadImpl::SendNotification( | 
| -    const OutgoingNotificationData& data) { | 
| -  Post(this, CMD_SEND_NOTIFICATION, new OutgoingNotificationMessageData(data)); | 
| -} | 
| - | 
| -void MediatorThreadImpl::ProcessMessages(int milliseconds) { | 
| -  talk_base::Thread::ProcessMessages(milliseconds); | 
| -} | 
| - | 
| -void MediatorThreadImpl::OnMessage(talk_base::Message* msg) { | 
| -  scoped_ptr<LoginData> data; | 
| -  switch (msg->message_id) { | 
| -    case CMD_LOGIN: | 
| -      DCHECK(msg->pdata); | 
| -      data.reset(reinterpret_cast<LoginData*>(msg->pdata)); | 
| -      DoLogin(data.get()); | 
| -      break; | 
| -    case CMD_DISCONNECT: | 
| -      DoDisconnect(); | 
| -      break; | 
| -    case CMD_LISTEN_FOR_UPDATES: | 
| -      DoListenForUpdates(); | 
| -      break; | 
| -    case CMD_SEND_NOTIFICATION: { | 
| -      DCHECK(msg->pdata); | 
| -      scoped_ptr<OutgoingNotificationMessageData> data( | 
| -          reinterpret_cast<OutgoingNotificationMessageData*>(msg->pdata)); | 
| -      DoSendNotification(*data); | 
| -      break; | 
| -    } | 
| -    case CMD_SUBSCRIBE_FOR_UPDATES: { | 
| -      DCHECK(msg->pdata); | 
| -      scoped_ptr<SubscriptionData> subscription_data( | 
| -          reinterpret_cast<SubscriptionData*>(msg->pdata)); | 
| -      DoSubscribeForUpdates(*subscription_data); | 
| -      break; | 
| -    } | 
| -    case CMD_PUMP_AUXILIARY_LOOPS: | 
| -      PumpAuxiliaryLoops(); | 
| -      break; | 
| -    default: | 
| -      LOG(ERROR) << "P2P: Someone passed a bad message to the thread."; | 
| -      break; | 
| -  } | 
| -} | 
| - | 
| -void MediatorThreadImpl::DoLogin(LoginData* login_data) { | 
| -  LOG(INFO) << "P2P: Thread logging into talk network."; | 
| -  buzz::XmppClientSettings& user_settings = login_data->user_settings; | 
| - | 
| -  // Start a new pump for the login. | 
| -  login_.reset(); | 
| -  pump_.reset(new notifier::TaskPump()); | 
| - | 
| -  notifier::ServerInformation server_list[2]; | 
| -  int server_list_count = 2; | 
| - | 
| -  // The default servers know how to serve over port 443 (that's the magic). | 
| -  server_list[0].server = talk_base::SocketAddress("talk.google.com", | 
| -                                                   notifier::kDefaultXmppPort, | 
| -                                                   true);  // Use DNS. | 
| -  server_list[0].special_port_magic = true; | 
| -  server_list[1].server = talk_base::SocketAddress("talkx.l.google.com", | 
| -                                                   notifier::kDefaultXmppPort, | 
| -                                                   true);  // Use DNS. | 
| -  server_list[1].special_port_magic = true; | 
| - | 
| -  // Autodetect proxy is on by default. | 
| -  notifier::ConnectionOptions options; | 
| - | 
| -  // Language is not used in the stanza so we default to |en|. | 
| -  std::string lang = "en"; | 
| -  login_.reset(new notifier::Login(pump_.get(), | 
| -                                   user_settings, | 
| -                                   options, | 
| -                                   lang, | 
| -                                   server_list, | 
| -                                   server_list_count, | 
| -                                   // NetworkStatusDetectionTask will be | 
| -                                   // created for you if NULL is passed in. | 
| -                                   // It helps shorten the autoreconnect | 
| -                                   // time after going offline and coming | 
| -                                   // back online. | 
| -                                   NULL, | 
| -                                   // talk_base::FirewallManager* is NULL. | 
| -                                   NULL, | 
| -                                   // Both the proxy and a non-proxy route | 
| -                                   // will be attempted. | 
| -                                   false, | 
| -                                   // |previous_login_successful| is true | 
| -                                   // because we have already done a | 
| -                                   // successful gaia login at this point | 
| -                                   // through another mechanism. | 
| -                                   true)); | 
| - | 
| -  login_->SignalClientStateChange.connect( | 
| -      this, &MediatorThreadImpl::OnClientStateChangeMessage); | 
| -  login_->SignalLoginFailure.connect( | 
| -      this, &MediatorThreadImpl::OnLoginFailureMessage); | 
| -  login_->StartConnection(); | 
| -} | 
| - | 
| -void MediatorThreadImpl::OnInputDebug(const char* msg, int length) { | 
| -  string output(msg, length); | 
| -  LOG(INFO) << "P2P: OnInputDebug:" << output << "."; | 
| -} | 
| - | 
| -void MediatorThreadImpl::OnOutputDebug(const char* msg, int length) { | 
| -  string output(msg, length); | 
| -  LOG(INFO) << "P2P: OnOutputDebug:" << output << "."; | 
| -} | 
| - | 
| -void MediatorThreadImpl::DoDisconnect() { | 
| -  LOG(INFO) << "P2P: Thread logging out of talk network."; | 
| -  login_.reset(); | 
| -  // Delete the old pump while on the thread to ensure that everything is | 
| -  // cleaned-up in a predicatable manner. | 
| -  pump_.reset(); | 
| -} | 
| - | 
| -void MediatorThreadImpl::DoSubscribeForUpdates( | 
| -    const SubscriptionData& subscription_data) { | 
| -  buzz::XmppClient* client = xmpp_client(); | 
| -  // If there isn't an active xmpp client, return. | 
| -  if (!client) { | 
| -    return; | 
| -  } | 
| -  SubscribeTask* subscription = | 
| -      new SubscribeTask(client, subscription_data.subscribed_services_list); | 
| -  subscription->SignalStatusUpdate.connect( | 
| -      this, | 
| -      &MediatorThreadImpl::OnSubscriptionStateChange); | 
| -  subscription->Start(); | 
| -} | 
| - | 
| -void MediatorThreadImpl::DoListenForUpdates() { | 
| -  buzz::XmppClient* client = xmpp_client(); | 
| -  // If there isn't an active xmpp client, return. | 
| -  if (!client) { | 
| -    return; | 
| -  } | 
| -  ListenTask* listener = new ListenTask(client); | 
| -  listener->SignalUpdateAvailable.connect( | 
| -      this, | 
| -      &MediatorThreadImpl::OnUpdateListenerMessage); | 
| -  listener->Start(); | 
| -} | 
| - | 
| -void MediatorThreadImpl::DoSendNotification( | 
| -    const OutgoingNotificationMessageData& data) { | 
| -  buzz::XmppClient* client = xmpp_client(); | 
| -  // If there isn't an active xmpp client, return. | 
| -  if (!client) { | 
| -    return; | 
| -  } | 
| -  SendUpdateTask* task = new SendUpdateTask(client, data.notification_data); | 
| -  task->SignalStatusUpdate.connect( | 
| -      this, | 
| -      &MediatorThreadImpl::OnUpdateNotificationSent); | 
| -  task->Start(); | 
| -} | 
| - | 
| -void MediatorThreadImpl::OnUpdateListenerMessage( | 
| -    const IncomingNotificationData& notification_data) { | 
| -  SignalNotificationReceived(notification_data); | 
| -} | 
| - | 
| -void MediatorThreadImpl::OnUpdateNotificationSent(bool success) { | 
| -  if (success) { | 
| -    SignalStateChange(MSG_NOTIFICATION_SENT); | 
| -  } | 
| -} | 
| - | 
| -void MediatorThreadImpl::OnLoginFailureMessage( | 
| -    const notifier::LoginFailure& failure) { | 
| -  SignalStateChange(MSG_LOGGED_OUT); | 
| -} | 
| - | 
| -void MediatorThreadImpl::OnClientStateChangeMessage( | 
| -    notifier::Login::ConnectionState state) { | 
| -  switch (state) { | 
| -    case notifier::Login::STATE_CLOSED: | 
| -      SignalStateChange(MSG_LOGGED_OUT); | 
| -      break; | 
| -    case notifier::Login::STATE_RETRYING: | 
| -    case notifier::Login::STATE_OPENING: | 
| -      LOG(INFO) << "P2P: Thread trying to connect."; | 
| -      // Maybe first time logon, maybe intermediate network disruption. Assume | 
| -      // the server went down, and lost our subscription for updates. | 
| -      SignalStateChange(MSG_SUBSCRIPTION_FAILURE); | 
| -      break; | 
| -    case notifier::Login::STATE_OPENED: | 
| -      SignalStateChange(MSG_LOGGED_IN); | 
| -      break; | 
| -    default: | 
| -      LOG(WARNING) << "P2P: Unknown client state change."; | 
| -      break; | 
| -  } | 
| -} | 
| - | 
| -void MediatorThreadImpl::OnSubscriptionStateChange(bool success) { | 
| -  if (success) { | 
| -    SignalStateChange(MSG_SUBSCRIPTION_SUCCESS); | 
| -  } else { | 
| -    SignalStateChange(MSG_SUBSCRIPTION_FAILURE); | 
| -  } | 
| -} | 
| - | 
| -buzz::XmppClient* MediatorThreadImpl::xmpp_client() { | 
| -  if (!login_.get()) { | 
| -    return NULL; | 
| -  } | 
| -  return login_->xmpp_client(); | 
| -} | 
| - | 
| -}  // namespace notifier | 
|  |