#ifndef REMOTING_HOST_SECURITY_KEY_SECURITY_KEY_MESSAGE_READER_IMPL_H_
#define REMOTING_HOST_SECURITY_KEY_SECURITY_KEY_MESSAGE_READER_IMPL_H_
#include <memory>
#include "base/files/file.h"
#include "base/functional/callback.h"
#include "base/memory/weak_ptr.h"
#include "base/threading/thread.h"
#include "remoting/host/security_key/security_key_message.h"
#include "remoting/host/security_key/security_key_message_reader.h"
namespace base {
class SingleThreadTaskRunner;
}
namespace remoting {
class SecurityKeyMessageReaderImpl : public SecurityKeyMessageReader {
public:
explicit SecurityKeyMessageReaderImpl(base::File input_file);
SecurityKeyMessageReaderImpl(const SecurityKeyMessageReaderImpl&) = delete;
SecurityKeyMessageReaderImpl& operator=(const SecurityKeyMessageReaderImpl&) =
delete;
~SecurityKeyMessageReaderImpl() override;
void Start(const SecurityKeyMessageCallback& message_callback,
base::OnceClosure error_callback) override;
private:
void ReadMessage();
bool ReadFromStream(char* buffer, size_t bytes_to_read);
void NotifyError();
void InvokeMessageCallback(std::unique_ptr<SecurityKeyMessage> message);
void InvokeErrorCallback();
base::File read_stream_;
SecurityKeyMessageCallback message_callback_;
base::OnceClosure error_callback_;
base::Thread reader_thread_;
scoped_refptr<base::SingleThreadTaskRunner> main_task_runner_;
scoped_refptr<base::SingleThreadTaskRunner> read_task_runner_;
base::WeakPtr<SecurityKeyMessageReaderImpl> reader_;
base::WeakPtrFactory<SecurityKeyMessageReaderImpl> weak_factory_{this};
};
}
#endif