#ifndef REMOTING_HOST_FILE_TRANSFER_IPC_FILE_OPERATIONS_H_
#define REMOTING_HOST_FILE_TRANSFER_IPC_FILE_OPERATIONS_H_
#include <memory>
#include "base/files/file_path.h"
#include "base/functional/callback.h"
#include "base/memory/weak_ptr.h"
#include "remoting/host/file_transfer/file_operations.h"
#include "remoting/host/mojom/desktop_session.mojom.h"
#include "remoting/protocol/file_transfer_helpers.h"
namespace remoting {
class IpcFileOperations : public FileOperations {
public:
using BeginFileReadCallback =
mojom::DesktopSessionControl::BeginFileReadCallback;
using BeginFileWriteCallback =
mojom::DesktopSessionControl::BeginFileWriteCallback;
class RequestHandler {
public:
virtual ~RequestHandler() = default;
virtual void BeginFileRead(BeginFileReadCallback callback,
base::OnceClosure on_disconnect) = 0;
virtual void BeginFileWrite(const base::FilePath& file_path,
BeginFileWriteCallback callback,
base::OnceClosure on_disconnect) = 0;
};
IpcFileOperations(const IpcFileOperations&) = delete;
IpcFileOperations& operator=(const IpcFileOperations&) = delete;
~IpcFileOperations() override;
std::unique_ptr<Reader> CreateReader() override;
std::unique_ptr<Writer> CreateWriter() override;
private:
class IpcReader;
class IpcWriter;
explicit IpcFileOperations(base::WeakPtr<RequestHandler> request_handler);
base::WeakPtr<RequestHandler> request_handler_;
friend class IpcFileOperationsFactory;
};
class IpcFileOperationsFactory {
public:
explicit IpcFileOperationsFactory(
IpcFileOperations::RequestHandler* request_handler);
IpcFileOperationsFactory(const IpcFileOperationsFactory&) = delete;
IpcFileOperationsFactory& operator=(const IpcFileOperationsFactory&) = delete;
~IpcFileOperationsFactory();
std::unique_ptr<FileOperations> CreateFileOperations();
private:
base::WeakPtrFactory<IpcFileOperations::RequestHandler>
request_handler_weak_ptr_factory_;
};
}
#endif