Index: remoting/signaling/fake_signal_strategy.cc |
diff --git a/remoting/signaling/fake_signal_strategy.cc b/remoting/signaling/fake_signal_strategy.cc |
index 8ce08c022c6c0340a65355d6efbae99ce4ff62f4..9e17e1d7e88e31984984a929d4877b6bb642e104 100644 |
--- a/remoting/signaling/fake_signal_strategy.cc |
+++ b/remoting/signaling/fake_signal_strategy.cc |
@@ -19,13 +19,15 @@ namespace remoting { |
// static |
void FakeSignalStrategy::Connect(FakeSignalStrategy* peer1, |
FakeSignalStrategy* peer2) { |
- peer1->peer_ = peer2; |
- peer2->peer_ = peer1; |
+ DCHECK(peer1->main_thread_->BelongsToCurrentThread()); |
+ DCHECK(peer2->main_thread_->BelongsToCurrentThread()); |
+ peer1->ConnectTo(peer2); |
+ peer2->ConnectTo(peer1); |
} |
FakeSignalStrategy::FakeSignalStrategy(const std::string& jid) |
- : jid_(jid), |
- peer_(NULL), |
+ : main_thread_(base::ThreadTaskRunnerHandle::Get()), |
+ jid_(jid), |
last_id_(0), |
weak_factory_(this) { |
@@ -38,6 +40,22 @@ FakeSignalStrategy::~FakeSignalStrategy() { |
} |
} |
+void FakeSignalStrategy::ConnectTo(FakeSignalStrategy* peer) { |
+ PeerCallback peer_callback = |
+ base::Bind(&FakeSignalStrategy::DeliverMessageOnThread, |
+ main_thread_, |
+ weak_factory_.GetWeakPtr()); |
+ if (peer->main_thread_->BelongsToCurrentThread()) { |
+ peer->SetPeerCallback(peer_callback); |
+ } else { |
+ peer->main_thread_->PostTask( |
+ FROM_HERE, |
+ base::Bind(&FakeSignalStrategy::SetPeerCallback, |
+ base::Unretained(peer), |
+ peer_callback)); |
+ } |
+} |
+ |
void FakeSignalStrategy::Connect() { |
DCHECK(CalledOnValidThread()); |
FOR_EACH_OBSERVER(Listener, listeners_, |
@@ -78,8 +96,8 @@ bool FakeSignalStrategy::SendStanza(scoped_ptr<buzz::XmlElement> stanza) { |
stanza->SetAttr(buzz::QN_FROM, jid_); |
- if (peer_) { |
- peer_->OnIncomingMessage(stanza.Pass()); |
+ if (!peer_callback_.is_null()) { |
+ peer_callback_.Run(stanza.Pass()); |
return true; |
} else { |
return false; |
@@ -91,35 +109,41 @@ std::string FakeSignalStrategy::GetNextId() { |
return base::IntToString(last_id_); |
} |
+// static |
+void FakeSignalStrategy::DeliverMessageOnThread( |
+ scoped_refptr<base::SingleThreadTaskRunner> thread, |
+ base::WeakPtr<FakeSignalStrategy> target, |
+ scoped_ptr<buzz::XmlElement> stanza) { |
+ thread->PostTask(FROM_HERE, |
+ base::Bind(&FakeSignalStrategy::OnIncomingMessage, |
+ target, base::Passed(&stanza))); |
+} |
+ |
void FakeSignalStrategy::OnIncomingMessage( |
scoped_ptr<buzz::XmlElement> stanza) { |
- pending_messages_.push(stanza.get()); |
+ DCHECK(CalledOnValidThread()); |
+ |
+ buzz::XmlElement* stanza_ptr = stanza.get(); |
received_messages_.push_back(stanza.release()); |
- base::ThreadTaskRunnerHandle::Get()->PostTask( |
- FROM_HERE, base::Bind(&FakeSignalStrategy::DeliverIncomingMessages, |
- weak_factory_.GetWeakPtr())); |
-} |
- |
-void FakeSignalStrategy::DeliverIncomingMessages() { |
- while (!pending_messages_.empty()) { |
- buzz::XmlElement* stanza = pending_messages_.front(); |
- const std::string& to_field = stanza->Attr(buzz::QN_TO); |
- if (to_field != jid_) { |
- LOG(WARNING) << "Dropping stanza that is addressed to " << to_field |
- << ". Local jid: " << jid_ |
- << ". Message content: " << stanza->Str(); |
- return; |
- } |
- |
- ObserverListBase<Listener>::Iterator it(listeners_); |
- Listener* listener; |
- while ((listener = it.GetNext()) != NULL) { |
- if (listener->OnSignalStrategyIncomingStanza(stanza)) |
- break; |
- } |
- |
- pending_messages_.pop(); |
+ |
+ const std::string& to_field = stanza_ptr->Attr(buzz::QN_TO); |
+ if (to_field != jid_) { |
+ LOG(WARNING) << "Dropping stanza that is addressed to " << to_field |
+ << ". Local jid: " << jid_ |
+ << ". Message content: " << stanza_ptr->Str(); |
+ return; |
} |
+ |
+ ObserverListBase<Listener>::Iterator it(listeners_); |
+ Listener* listener; |
+ while ((listener = it.GetNext()) != NULL) { |
+ if (listener->OnSignalStrategyIncomingStanza(stanza_ptr)) |
+ break; |
+ } |
+} |
+ |
+void FakeSignalStrategy::SetPeerCallback(const PeerCallback& peer_callback) { |
+ peer_callback_ = peer_callback; |
} |
} // namespace remoting |