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 |