blob: 5948cd3288804990bc0e909be818b2259b050d3f [file] [log] [blame]
// Copyright 2014 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef CHROMEOS_DBUS_PIPE_READER_H_
#define CHROMEOS_DBUS_PIPE_READER_H_
#include <memory>
#include <string>
#include "base/callback.h"
#include "base/component_export.h"
#include "base/files/scoped_file.h"
#include "base/macros.h"
#include "base/memory/ref_counted.h"
#include "base/memory/weak_ptr.h"
#include "base/optional.h"
namespace base {
class TaskRunner;
}
namespace net {
class FileStream;
class IOBufferWithSize;
}
namespace chromeos {
// Simple class to encapsulate collecting data from a pipe into a
// string. To use:
// - Instantiate the appropriate subclass of PipeReader
// - Call StartIO() which will create the appropriate FDs.
// - As data is received, the PipeReader will collect this data
// as appropriate to the subclass.
// - When the there is no more data to read, the PipeReader calls
// |callback|.
class COMPONENT_EXPORT(CHROMEOS_DBUS) PipeReader {
public:
using CompletionCallback =
base::OnceCallback<void(base::Optional<std::string> data)>;
explicit PipeReader(const scoped_refptr<base::TaskRunner>& task_runner);
~PipeReader();
// Starts data collection.
// Returns the write end of the pipe if stream was setup correctly.
// On completion, |callback| will be called with the read |data| in
// case of success, or with nullopt in case of an error.
// To shut down the collection delete the instance.
base::ScopedFD StartIO(CompletionCallback callback);
private:
// Posts a task to read the data from the pipe. Returns
// net::FileStream::Read()'s result.
int RequestRead();
// Called when |io_buffer_| is filled via |data_stream_.Read()|.
void OnRead(int byte_count);
scoped_refptr<net::IOBufferWithSize> io_buffer_;
scoped_refptr<base::TaskRunner> task_runner_;
CompletionCallback callback_;
std::unique_ptr<net::FileStream> data_stream_;
std::string data_;
// Note: This should remain the last member so it'll be destroyed and
// invalidate its weak pointers before any other members are destroyed.
base::WeakPtrFactory<PipeReader> weak_ptr_factory_;
DISALLOW_COPY_AND_ASSIGN(PipeReader);
};
} // namespace chromeos
#endif // CHROMEOS_DBUS_PIPE_READER_H_