blob: 5d840d2dfcf4861fe4d447b09ddfa7a316638993 [file] [log] [blame]
// Copyright 2025 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef REMOTING_CLIENT_COMMON_REMOTING_CLIENT_H_
#define REMOTING_CLIENT_COMMON_REMOTING_CLIENT_H_
#include <memory>
#include <string>
#include <string_view>
#include "base/functional/callback.h"
#include "base/memory/scoped_refptr.h"
#include "base/memory/weak_ptr.h"
#include "base/observer_list.h"
#include "remoting/base/http_status.h"
#include "remoting/base/oauth_token_info.h"
#include "remoting/protocol/client_stub.h"
#include "remoting/protocol/connection_to_host.h"
#include "remoting/signaling/signal_strategy.h"
namespace network {
class SharedURLLoaderFactory;
}
namespace remoting {
namespace apis::v1 {
class GetManagedChromeOsHostResponse;
class HostInfo;
} // namespace apis::v1
class DirectoryServiceClient;
class OAuthTokenGetter;
class ClientStatusObserver;
namespace protocol {
class AudioStub;
class ConnectionToHost;
class FrameConsumer;
class SessionManager;
class VideoRenderer;
} // namespace protocol
// A simple, native chromoting client implementation.
class RemotingClient : public SignalStrategy::Listener,
public protocol::ConnectionToHost::HostEventCallback,
public protocol::ClientStub {
public:
RemotingClient(
base::OnceClosure quit_closure,
protocol::FrameConsumer* frame_consumer,
base::WeakPtr<protocol::AudioStub> audio_stream_consumer,
scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory);
RemotingClient(const RemotingClient&) = delete;
RemotingClient& operator=(const RemotingClient&) = delete;
~RemotingClient() override;
void StartSession(std::string_view support_access_code,
OAuthTokenInfo oauth_token_info);
void StopSession();
void AddObserver(ClientStatusObserver* observer);
void RemoveObserver(ClientStatusObserver* observer);
base::WeakPtr<RemotingClient> GetWeakPtr();
private:
// ClientStub implementation.
void SetCapabilities(const protocol::Capabilities& capabilities) override;
void SetPairingResponse(
const protocol::PairingResponse& pairing_response) override;
void DeliverHostMessage(const protocol::ExtensionMessage& message) override;
void SetVideoLayout(const protocol::VideoLayout& layout) override;
void SetTransportInfo(const protocol::TransportInfo& transport_info) override;
void SetActiveDisplay(const protocol::ActiveDisplay& active_display) override;
void InjectClipboardEvent(const protocol::ClipboardEvent& event) override;
void SetCursorShape(const protocol::CursorShapeInfo& cursor_shape) override;
void SetHostCursorPosition(
const protocol::HostCursorPosition& position) override;
void SetKeyboardLayout(const protocol::KeyboardLayout& layout) override;
// ConnectionToHost::HostEventCallback implementation.
void OnConnectionState(protocol::ConnectionToHost::State state,
protocol::ErrorCode error) override;
void OnConnectionReady(bool ready) override;
void OnRouteChanged(const std::string& channel_name,
const protocol::TransportRoute& route) override;
// SignalStrategy::StatusObserver interface.
void OnSignalStrategyStateChange(SignalStrategy::State state) override;
bool OnSignalStrategyIncomingStanza(
const jingle_xmpp::XmlElement* stanza) override;
void OnGetManagedChromeOsHostRetrieved(
const HttpStatus& status,
std::unique_ptr<apis::v1::GetManagedChromeOsHostResponse> response);
void StartConnection();
void RunQuitClosure();
std::string host_id_;
std::string host_secret_;
OAuthTokenInfo oauth_token_info_;
base::OnceClosure quit_closure_;
base::ObserverList<ClientStatusObserver> observers_;
// Used to provide an OAuth access token for service requests. Since a raw *
// is passed around, this field should be destroyed after the service clients.
std::unique_ptr<OAuthTokenGetter> oauth_token_getter_;
// Used to retrieve details about the remote host to connect to.
std::unique_ptr<DirectoryServiceClient> directory_service_client_;
// Information about the remote host being connected to.
std::unique_ptr<apis::v1::HostInfo> chrome_os_host_;
// TODO: joedow - |Move FtlSignalingConnector| from //remoting/host into
// //remoting/signaling so it can be used in the client.
std::unique_ptr<SignalStrategy> signal_strategy_;
// |frame_consumer_| must outlive |video_renderer_|.
const raw_ptr<protocol::FrameConsumer> frame_consumer_;
base::WeakPtr<protocol::AudioStub> audio_stream_consumer_;
// Session related members.
std::unique_ptr<protocol::ConnectionToHost> connection_;
std::unique_ptr<protocol::SessionManager> session_manager_;
std::unique_ptr<protocol::VideoRenderer> video_renderer_;
// Used to make service requests.
scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory_;
base::WeakPtrFactory<RemotingClient> weak_factory_{this};
};
} // namespace remoting
#endif // REMOTING_CLIENT_COMMON_REMOTING_CLIENT_H_