#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;
}
class DirectoryServiceClient;
class OAuthTokenGetter;
class ClientStatusObserver;
namespace protocol {
class AudioStub;
class ConnectionToHost;
class FrameConsumer;
class SessionManager;
class VideoRenderer;
}
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:
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;
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;
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_;
std::unique_ptr<OAuthTokenGetter> oauth_token_getter_;
std::unique_ptr<DirectoryServiceClient> directory_service_client_;
std::unique_ptr<apis::v1::HostInfo> chrome_os_host_;
std::unique_ptr<SignalStrategy> signal_strategy_;
const raw_ptr<protocol::FrameConsumer> frame_consumer_;
base::WeakPtr<protocol::AudioStub> audio_stream_consumer_;
std::unique_ptr<protocol::ConnectionToHost> connection_;
std::unique_ptr<protocol::SessionManager> session_manager_;
std::unique_ptr<protocol::VideoRenderer> video_renderer_;
scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory_;
base::WeakPtrFactory<RemotingClient> weak_factory_{this};
};
}
#endif