blob: 60afb46687db925f83fc43d6e83937182363c73f [file] [log] [blame]
// Copyright 2018 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_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 {
// Implementation of FileOperations that forwards a file read or write request
// over a Mojo channel.
class IpcFileOperations : public FileOperations {
public:
using BeginFileReadCallback =
mojom::DesktopSessionControl::BeginFileReadCallback;
using BeginFileWriteCallback =
mojom::DesktopSessionControl::BeginFileWriteCallback;
// Handles requests from an IpcFileOperations instance by forwarding them to
// another process via Mojo IPC.
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;
// FileOperations implementation.
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;
};
// Creates IpcFileOperations instances for a given RequestHandler. All
// IpcFileOperations instances for the RequestHandler must be created through
// the same IpcFileOperationsFactory.
class IpcFileOperationsFactory {
public:
// |request_handler| must outlive the IpcFileOperationsFactory instance.
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_;
};
} // namespace remoting
#endif // REMOTING_HOST_FILE_TRANSFER_IPC_FILE_OPERATIONS_H_