浏览代码

LibCore: Add a wrapper for adapting Core::Stream to AK::InputStream

Tim Schumacher 2 年之前
父节点
当前提交
4e7da96d58
共有 2 个文件被更改,包括 59 次插入0 次删除
  1. 46 0
      Userland/Libraries/LibCore/Stream.cpp
  2. 13 0
      Userland/Libraries/LibCore/Stream.h

+ 46 - 0
Userland/Libraries/LibCore/Stream.cpp

@@ -807,4 +807,50 @@ void WrappedAKOutputStream::close()
 {
 }
 
+WrapInAKInputStream::WrapInAKInputStream(Core::Stream::Stream& stream)
+    : m_stream(stream)
+{
+}
+
+size_t WrapInAKInputStream::read(Bytes bytes)
+{
+    if (has_any_error())
+        return 0;
+
+    auto data_or_error = m_stream.read(bytes);
+    if (data_or_error.is_error()) {
+        set_fatal_error();
+        return 0;
+    }
+
+    return data_or_error.value().size();
+}
+
+bool WrapInAKInputStream::unreliable_eof() const
+{
+    return m_stream.is_eof();
+}
+
+bool WrapInAKInputStream::read_or_error(Bytes bytes)
+{
+    if (read(bytes) < bytes.size()) {
+        set_fatal_error();
+        return false;
+    }
+
+    return true;
+}
+
+bool WrapInAKInputStream::discard_or_error(size_t count)
+{
+    auto maybe_error = m_stream.discard(count);
+
+    if (maybe_error.is_error()) {
+        set_fatal_error();
+        return false;
+    }
+
+    return true;
+}
+
 }

+ 13 - 0
Userland/Libraries/LibCore/Stream.h

@@ -1030,4 +1030,17 @@ private:
     NonnullOwnPtr<OutputStream> m_stream;
 };
 
+// Note: This is only a temporary hack, to break up the task of moving away from AK::Stream into smaller parts.
+class WrapInAKInputStream final : public InputStream {
+public:
+    WrapInAKInputStream(Core::Stream::Stream& stream);
+    virtual size_t read(Bytes) override;
+    virtual bool unreliable_eof() const override;
+    virtual bool read_or_error(Bytes) override;
+    virtual bool discard_or_error(size_t count) override;
+
+private:
+    Core::Stream::Stream& m_stream;
+};
+
 }