blob: d930465062fb3274e24458621ad79f06ebdf4680 [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 "base/macros.h"
#include "base/sequence_checker.h"
#include "base/timer/timer.h"
#include "net/base/network_change_notifier.h"
#include "remoting/signaling/ftl_signal_strategy.h"
namespace remoting {
// FtlSignalingConnector listens for SignalStrategy status notifications
// and attempts to keep it connected when possible. When signaling is
// not connected it keeps trying to reconnect it until it is
// connected. It also monitors network state and reconnects signaling whenever
// connection type changes or IP address changes.
// TODO(yuweih): Revisit to see if DNS blackhole checking is necessary here.
class FtlSignalingConnector
: public SignalStrategy::Listener,
public net::NetworkChangeNotifier::NetworkChangeObserver {
// |signal_strategy| must outlive |this|.
// The |auth_failed_callback| is called when authentication fails. The
// singaling connector will no longer try to reconnect after this callback is
// called.
FtlSignalingConnector(FtlSignalStrategy* signal_strategy,
base::OnceClosure auth_failed_callback);
~FtlSignalingConnector() override;
void Start();
// SignalStrategy::Listener interface.
void OnSignalStrategyStateChange(SignalStrategy::State state) override;
bool OnSignalStrategyIncomingStanza(
const jingle_xmpp::XmlElement* stanza) override;
// NetworkChangeNotifier::NetworkChangeObserver interface.
void OnNetworkChanged(
net::NetworkChangeNotifier::ConnectionType type) override;
void TryReconnect();
void DoReconnect();
FtlSignalStrategy* signal_strategy_;
base::OnceClosure auth_failed_callback_;
base::OneShotTimer timer_;
} // namespace remoting