15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "remoting/jingle_glue/fake_signal_strategy.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/bind.h" 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/location.h" 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/logging.h" 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/single_thread_task_runner.h" 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/stl_util.h" 125e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles)#include "base/strings/string_number_conversions.h" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/thread_task_runner_handle.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "third_party/libjingle/source/talk/xmllite/xmlelement.h" 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "third_party/libjingle/source/talk/xmpp/constants.h" 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace remoting { 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void FakeSignalStrategy::Connect(FakeSignalStrategy* peer1, 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FakeSignalStrategy* peer2) { 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) peer1->peer_ = peer2; 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) peer2->peer_ = peer1; 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)FakeSignalStrategy::FakeSignalStrategy(const std::string& jid) 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : jid_(jid), 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) peer_(NULL), 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) last_id_(0), 30c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) weak_factory_(this) { 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)FakeSignalStrategy::~FakeSignalStrategy() { 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while (!received_messages_.empty()) { 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delete received_messages_.front(); 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) received_messages_.pop_front(); 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void FakeSignalStrategy::Connect() { 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(CalledOnValidThread()); 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FOR_EACH_OBSERVER(Listener, listeners_, 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OnSignalStrategyStateChange(CONNECTED)); 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void FakeSignalStrategy::Disconnect() { 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(CalledOnValidThread()); 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FOR_EACH_OBSERVER(Listener, listeners_, 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OnSignalStrategyStateChange(DISCONNECTED)); 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)SignalStrategy::State FakeSignalStrategy::GetState() const { 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return CONNECTED; 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)SignalStrategy::Error FakeSignalStrategy::GetError() const { 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return OK; 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)std::string FakeSignalStrategy::GetLocalJid() const { 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(CalledOnValidThread()); 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return jid_; 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void FakeSignalStrategy::AddListener(Listener* listener) { 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(CalledOnValidThread()); 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) listeners_.AddObserver(listener); 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void FakeSignalStrategy::RemoveListener(Listener* listener) { 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(CalledOnValidThread()); 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) listeners_.RemoveObserver(listener); 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool FakeSignalStrategy::SendStanza(scoped_ptr<buzz::XmlElement> stanza) { 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(CalledOnValidThread()); 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) stanza->SetAttr(buzz::QN_FROM, jid_); 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (peer_) { 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) peer_->OnIncomingMessage(stanza.Pass()); 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)std::string FakeSignalStrategy::GetNextId() { 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ++last_id_; 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return base::IntToString(last_id_); 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void FakeSignalStrategy::OnIncomingMessage( 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<buzz::XmlElement> stanza) { 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pending_messages_.push(stanza.get()); 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) received_messages_.push_back(stanza.release()); 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::ThreadTaskRunnerHandle::Get()->PostTask( 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FROM_HERE, base::Bind(&FakeSignalStrategy::DeliverIncomingMessages, 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) weak_factory_.GetWeakPtr())); 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void FakeSignalStrategy::DeliverIncomingMessages() { 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while (!pending_messages_.empty()) { 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) buzz::XmlElement* stanza = pending_messages_.front(); 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& to_field = stanza->Attr(buzz::QN_TO); 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (to_field != jid_) { 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LOG(WARNING) << "Dropping stanza that is addressed to " << to_field 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) << ". Local jid: " << jid_ 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) << ". Message content: " << stanza->Str(); 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ObserverListBase<Listener>::Iterator it(listeners_); 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Listener* listener; 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while ((listener = it.GetNext()) != NULL) { 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (listener->OnSignalStrategyIncomingStanza(stanza)) 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pending_messages_.pop(); 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace remoting 126