blob: 1a745caba3131fa30ae874984a9f4cec340dc4e2 [file] [log] [blame]
// Copyright 2019 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "remoting/host/ftl_signaling_connector.h"
#include <utility>
#include "base/bind.h"
#include "base/callback.h"
#include "base/strings/string_util.h"
#include "google_apis/google_api_keys.h"
#include "net/url_request/url_fetcher.h"
#include "net/url_request/url_request_context_getter.h"
#include "remoting/base/logging.h"
#include "remoting/signaling/signaling_address.h"
namespace remoting {
namespace {
const char* SignalStrategyErrorToString(SignalStrategy::Error error) {
switch (error) {
case SignalStrategy::OK:
return "OK";
case SignalStrategy::AUTHENTICATION_FAILED:
return "AUTHENTICATION_FAILED";
case SignalStrategy::NETWORK_ERROR:
return "NETWORK_ERROR";
case SignalStrategy::PROTOCOL_ERROR:
return "PROTOCOL_ERROR";
}
return "";
}
} // namespace
FtlSignalingConnector::FtlSignalingConnector(
FtlSignalStrategy* signal_strategy,
base::OnceClosure auth_failed_callback)
: signal_strategy_(signal_strategy),
auth_failed_callback_(std::move(auth_failed_callback)) {
DCHECK(signal_strategy_);
DCHECK(auth_failed_callback_);
net::NetworkChangeNotifier::AddNetworkChangeObserver(this);
signal_strategy_->AddListener(this);
}
FtlSignalingConnector::~FtlSignalingConnector() {
DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
signal_strategy_->RemoveListener(this);
net::NetworkChangeNotifier::RemoveNetworkChangeObserver(this);
}
void FtlSignalingConnector::Start() {
TryReconnect();
}
void FtlSignalingConnector::OnSignalStrategyStateChange(
SignalStrategy::State state) {
DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
if (state == SignalStrategy::CONNECTED) {
HOST_LOG << "Signaling connected. New JID: "
<< signal_strategy_->GetLocalAddress().jid();
} else if (state == SignalStrategy::DISCONNECTED) {
HOST_LOG << "Signaling disconnected. error="
<< SignalStrategyErrorToString(signal_strategy_->GetError());
if (signal_strategy_->IsSignInError() &&
signal_strategy_->GetError() == SignalStrategy::AUTHENTICATION_FAILED) {
std::move(auth_failed_callback_).Run();
return;
}
TryReconnect();
}
}
bool FtlSignalingConnector::OnSignalStrategyIncomingStanza(
const jingle_xmpp::XmlElement* stanza) {
return false;
}
void FtlSignalingConnector::OnNetworkChanged(
net::NetworkChangeNotifier::ConnectionType type) {
DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
if (type != net::NetworkChangeNotifier::CONNECTION_NONE &&
signal_strategy_->GetState() == SignalStrategy::DISCONNECTED) {
HOST_LOG << "Network state changed to online.";
TryReconnect();
}
}
void FtlSignalingConnector::TryReconnect() {
DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
timer_.Start(FROM_HERE, base::TimeDelta(), this,
&FtlSignalingConnector::DoReconnect);
}
void FtlSignalingConnector::DoReconnect() {
DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
if (signal_strategy_->GetState() == SignalStrategy::DISCONNECTED) {
HOST_LOG << "Attempting to reconnect signaling.";
signal_strategy_->Connect();
}
}
} // namespace remoting