1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125
|
// Copyright 2013 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "remoting/signaling/delegating_signal_strategy.h"
#include "base/functional/bind.h"
#include "base/logging.h"
#include "base/rand_util.h"
#include "base/strings/string_number_conversions.h"
#include "base/task/single_thread_task_runner.h"
#include "remoting/signaling/xmpp_constants.h"
#include "third_party/libjingle_xmpp/xmllite/xmlelement.h"
namespace remoting {
DelegatingSignalStrategy::DelegatingSignalStrategy(
const SignalingAddress& local_address,
scoped_refptr<base::SingleThreadTaskRunner> client_task_runner,
const IqCallback& send_iq_callback)
: local_address_(local_address),
delegate_task_runner_(base::SingleThreadTaskRunner::GetCurrentDefault()),
client_task_runner_(client_task_runner),
send_iq_callback_(send_iq_callback) {
incoming_iq_callback_ =
base::BindRepeating(&OnIncomingMessageFromDelegate,
weak_factory_.GetWeakPtr(), client_task_runner_);
}
DelegatingSignalStrategy::~DelegatingSignalStrategy() = default;
DelegatingSignalStrategy::IqCallback
DelegatingSignalStrategy::GetIncomingMessageCallback() {
return incoming_iq_callback_;
}
// static
void DelegatingSignalStrategy::OnIncomingMessageFromDelegate(
base::WeakPtr<DelegatingSignalStrategy> weak_ptr,
scoped_refptr<base::SingleThreadTaskRunner> client_task_runner,
const std::string& message) {
if (client_task_runner->BelongsToCurrentThread()) {
weak_ptr->OnIncomingMessage(message);
return;
}
client_task_runner->PostTask(
FROM_HERE, base::BindOnce(&DelegatingSignalStrategy::OnIncomingMessage,
weak_ptr, message));
}
void DelegatingSignalStrategy::OnIncomingMessage(const std::string& message) {
DCHECK(client_task_runner_->BelongsToCurrentThread());
std::unique_ptr<jingle_xmpp::XmlElement> stanza(
jingle_xmpp::XmlElement::ForStr(message));
if (!stanza.get()) {
LOG(WARNING) << "Malformed XMPP stanza received: " << message;
return;
}
for (auto& listener : listeners_) {
if (listener.OnSignalStrategyIncomingStanza(stanza.get())) {
break;
}
}
}
void DelegatingSignalStrategy::Connect() {
DCHECK(client_task_runner_->BelongsToCurrentThread());
for (auto& observer : listeners_) {
observer.OnSignalStrategyStateChange(CONNECTED);
}
}
void DelegatingSignalStrategy::Disconnect() {
DCHECK(client_task_runner_->BelongsToCurrentThread());
}
SignalStrategy::State DelegatingSignalStrategy::GetState() const {
DCHECK(client_task_runner_->BelongsToCurrentThread());
return CONNECTED;
}
SignalStrategy::Error DelegatingSignalStrategy::GetError() const {
DCHECK(client_task_runner_->BelongsToCurrentThread());
return OK;
}
const SignalingAddress& DelegatingSignalStrategy::GetLocalAddress() const {
DCHECK(client_task_runner_->BelongsToCurrentThread());
return local_address_;
}
void DelegatingSignalStrategy::AddListener(Listener* listener) {
DCHECK(client_task_runner_->BelongsToCurrentThread());
listeners_.AddObserver(listener);
}
void DelegatingSignalStrategy::RemoveListener(Listener* listener) {
DCHECK(client_task_runner_->BelongsToCurrentThread());
listeners_.RemoveObserver(listener);
}
bool DelegatingSignalStrategy::SendStanza(
std::unique_ptr<jingle_xmpp::XmlElement> stanza) {
DCHECK(client_task_runner_->BelongsToCurrentThread());
GetLocalAddress().SetInMessage(stanza.get(), SignalingAddress::FROM);
delegate_task_runner_->PostTask(
FROM_HERE, base::BindOnce(send_iq_callback_, stanza->Str()));
return true;
}
bool DelegatingSignalStrategy::SendMessage(
const SignalingAddress& destination_address,
const ftl::ChromotingMessage& message) {
DCHECK(client_task_runner_->BelongsToCurrentThread());
NOTIMPLEMENTED();
return false;
}
std::string DelegatingSignalStrategy::GetNextId() {
return base::NumberToString(base::RandUint64());
}
} // namespace remoting
|