1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84
|
// 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_
|