Added StreamCopier and MemoryStream utility classes
Change-Id: I771b6931baaef46f5c0a03ad673200a1565295eb
Reviewed-on: https://weave-review.googlesource.com/1273
Reviewed-by: Vitaly Buka <vitalybuka@google.com>
diff --git a/libweave/src/streams.h b/libweave/src/streams.h
new file mode 100644
index 0000000..0a21737
--- /dev/null
+++ b/libweave/src/streams.h
@@ -0,0 +1,63 @@
+// Copyright 2015 The Chromium OS 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 LIBWEAVE_SRC_STREAMS_H_
+#define LIBWEAVE_SRC_STREAMS_H_
+
+#include <base/memory/weak_ptr.h>
+#include <weave/stream.h>
+
+namespace weave {
+
+namespace provider {
+class TaskRunner;
+}
+
+class MemoryStream : public InputStream, public OutputStream {
+ public:
+ MemoryStream(const std::vector<uint8_t>& data,
+ provider::TaskRunner* task_runner);
+
+ void Read(void* buffer,
+ size_t size_to_read,
+ const ReadSuccessCallback& success_callback,
+ const ErrorCallback& error_callback) override;
+
+ void Write(const void* buffer,
+ size_t size_to_write,
+ const SuccessCallback& success_callback,
+ const ErrorCallback& error_callback) override;
+
+ const std::vector<uint8_t>& GetData() const { return data_; }
+
+ private:
+ std::vector<uint8_t> data_;
+ provider::TaskRunner* task_runner_{nullptr};
+ size_t read_position_{0};
+};
+
+class StreamCopier {
+ public:
+ StreamCopier(InputStream* source, OutputStream* destination);
+
+ void Copy(const InputStream::ReadSuccessCallback& success_callback,
+ const ErrorCallback& error_callback);
+
+ private:
+ void OnSuccessRead(const InputStream::ReadSuccessCallback& success_callback,
+ const ErrorCallback& error_callback,
+ size_t size);
+
+ InputStream* source_{nullptr};
+ OutputStream* destination_{nullptr};
+
+ size_t size_done_{0};
+ std::vector<uint8_t> buffer_;
+
+ base::WeakPtrFactory<StreamCopier> weak_ptr_factory_{this};
+};
+
+} // namespace weave
+
+#endif // LIBWEAVE_SRC_STREAMS_H_