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