#ifndef REMOTING_HOST_SECURITY_KEY_SECURITY_KEY_MESSAGE_HANDLER_H_
#define REMOTING_HOST_SECURITY_KEY_SECURITY_KEY_MESSAGE_HANDLER_H_
#include <memory>
#include <string>
#include "base/files/file.h"
#include "base/functional/callback.h"
#include "base/threading/thread_checker.h"
#include "remoting/host/security_key/security_key_message.h"
namespace remoting {
class SecurityKeyIpcClient;
class SecurityKeyMessageReader;
class SecurityKeyMessageWriter;
class SecurityKeyMessageHandler {
public:
SecurityKeyMessageHandler();
SecurityKeyMessageHandler(const SecurityKeyMessageHandler&) = delete;
SecurityKeyMessageHandler& operator=(const SecurityKeyMessageHandler&) =
delete;
~SecurityKeyMessageHandler();
void Start(base::File message_read_stream,
base::File message_write_stream,
std::unique_ptr<SecurityKeyIpcClient> ipc_client,
base::OnceClosure error_callback);
void SetSecurityKeyMessageReaderForTest(
std::unique_ptr<SecurityKeyMessageReader> reader);
void SetSecurityKeyMessageWriterForTest(
std::unique_ptr<SecurityKeyMessageWriter> writer);
private:
void ProcessSecurityKeyMessage(std::unique_ptr<SecurityKeyMessage> message);
void OnError();
void SendMessage(SecurityKeyMessageType message_type);
void SendMessageWithPayload(SecurityKeyMessageType message_type,
const std::string& message_payload);
void HandleIpcConnectionChange();
void HandleIpcConnectionError();
void HandleSecurityKeyResponse(const std::string& response_data);
void HandleConnectRequest(const std::string& message_payload);
void HandleSecurityKeyRequest(const std::string& message_payload);
std::unique_ptr<SecurityKeyIpcClient> ipc_client_;
std::unique_ptr<SecurityKeyMessageReader> reader_;
std::unique_ptr<SecurityKeyMessageWriter> writer_;
base::OnceClosure error_callback_;
base::ThreadChecker thread_checker_;
};
}
#endif