Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(6001)

Unified Diff: chrome/browser/sync/notifier/listener/mediator_thread_impl.cc

Issue 1956001: Moved XMPP notifier library from chrome/browser/sync to chrome/common.... (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/
Patch Set: '' Created 10 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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

Powered by Google App Engine
This is Rietveld 408576698