| Index: jingle/notifier/listener/mediator_thread_impl.cc
|
| diff --git a/jingle/notifier/listener/mediator_thread_impl.cc b/jingle/notifier/listener/mediator_thread_impl.cc
|
| index 918b49bf85ca6d39153ad10a60379e3a5c85cbd5..02d48fb17a877730791f3abe62f54f2d713f7847 100644
|
| --- a/jingle/notifier/listener/mediator_thread_impl.cc
|
| +++ b/jingle/notifier/listener/mediator_thread_impl.cc
|
| @@ -16,6 +16,8 @@
|
| #include "jingle/notifier/listener/subscribe_task.h"
|
| #include "net/base/host_port_pair.h"
|
| #include "net/base/host_resolver.h"
|
| +#include "talk/base/physicalsocketserver.h"
|
| +#include "talk/base/thread.h"
|
| #include "talk/xmpp/xmppclient.h"
|
| #include "talk/xmpp/xmppclientsettings.h"
|
|
|
| @@ -49,6 +51,44 @@ void MediatorThreadImpl::Start() {
|
| // TODO(akalin): Make this function return a bool and remove this
|
| // CHECK().
|
| CHECK(worker_thread_.StartWithOptions(options));
|
| + if (!notifier_options_.use_chrome_async_socket) {
|
| + worker_message_loop()->PostTask(
|
| + FROM_HERE,
|
| + NewRunnableMethod(this, &MediatorThreadImpl::StartLibjingleThread));
|
| + }
|
| +}
|
| +
|
| +void MediatorThreadImpl::StartLibjingleThread() {
|
| + DCHECK_EQ(MessageLoop::current(), worker_message_loop());
|
| + DCHECK(!notifier_options_.use_chrome_async_socket);
|
| + socket_server_.reset(new talk_base::PhysicalSocketServer());
|
| + libjingle_thread_.reset(new talk_base::Thread());
|
| + talk_base::ThreadManager::SetCurrent(libjingle_thread_.get());
|
| + worker_message_loop()->PostTask(
|
| + FROM_HERE,
|
| + NewRunnableMethod(this, &MediatorThreadImpl::PumpLibjingleLoop));
|
| +}
|
| +
|
| +void MediatorThreadImpl::StopLibjingleThread() {
|
| + DCHECK_EQ(MessageLoop::current(), worker_message_loop());
|
| + DCHECK(!notifier_options_.use_chrome_async_socket);
|
| + talk_base::ThreadManager::SetCurrent(NULL);
|
| + libjingle_thread_.reset();
|
| + socket_server_.reset();
|
| +}
|
| +
|
| +void MediatorThreadImpl::PumpLibjingleLoop() {
|
| + DCHECK_EQ(MessageLoop::current(), worker_message_loop());
|
| + DCHECK(!notifier_options_.use_chrome_async_socket);
|
| + // Pump the libjingle message loop 100ms at a time.
|
| + if (!libjingle_thread_.get()) {
|
| + // StopLibjingleThread() was called.
|
| + return;
|
| + }
|
| + libjingle_thread_->ProcessMessages(100);
|
| + worker_message_loop()->PostTask(
|
| + FROM_HERE,
|
| + NewRunnableMethod(this, &MediatorThreadImpl::PumpLibjingleLoop));
|
| }
|
|
|
| void MediatorThreadImpl::Login(const buzz::XmppClientSettings& settings) {
|
| @@ -63,6 +103,11 @@ void MediatorThreadImpl::Logout() {
|
| worker_message_loop()->PostTask(
|
| FROM_HERE,
|
| NewRunnableMethod(this, &MediatorThreadImpl::DoDisconnect));
|
| + if (!notifier_options_.use_chrome_async_socket) {
|
| + worker_message_loop()->PostTask(
|
| + FROM_HERE,
|
| + NewRunnableMethod(this, &MediatorThreadImpl::StopLibjingleThread));
|
| + }
|
| // TODO(akalin): Decomp this into a separate stop method.
|
| worker_thread_.Stop();
|
| // Process any messages the worker thread may be posted on our
|
| @@ -160,6 +205,7 @@ void MediatorThreadImpl::DoLogin(
|
| // Language is not used in the stanza so we default to |en|.
|
| std::string lang = "en";
|
| login_.reset(new notifier::Login(pump_.get(),
|
| + notifier_options_.use_chrome_async_socket,
|
| settings,
|
| options,
|
| lang,
|
|
|