MemoryStream.cpp 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127
  1. /*
  2. * Copyright (c) 2021, kleines Filmröllchen <filmroellchen@serenityos.org>.
  3. *
  4. * SPDX-License-Identifier: BSD-2-Clause
  5. */
  6. #include <LibCore/MemoryStream.h>
  7. namespace Core::Stream {
  8. FixedMemoryStream::FixedMemoryStream(Bytes bytes)
  9. : m_bytes(bytes)
  10. {
  11. }
  12. FixedMemoryStream::FixedMemoryStream(ReadonlyBytes bytes)
  13. : m_bytes({ const_cast<u8*>(bytes.data()), bytes.size() })
  14. , m_writing_enabled(false)
  15. {
  16. }
  17. ErrorOr<NonnullOwnPtr<FixedMemoryStream>> FixedMemoryStream::construct(Bytes bytes)
  18. {
  19. return adopt_nonnull_own_or_enomem<FixedMemoryStream>(new (nothrow) FixedMemoryStream(bytes));
  20. }
  21. ErrorOr<NonnullOwnPtr<FixedMemoryStream>> FixedMemoryStream::construct(ReadonlyBytes bytes)
  22. {
  23. return adopt_nonnull_own_or_enomem<FixedMemoryStream>(new (nothrow) FixedMemoryStream(bytes));
  24. }
  25. bool FixedMemoryStream::is_eof() const
  26. {
  27. return m_offset >= m_bytes.size();
  28. }
  29. bool FixedMemoryStream::is_open() const
  30. {
  31. return true;
  32. }
  33. void FixedMemoryStream::close()
  34. {
  35. // FIXME: It doesn't make sense to close a memory stream. Therefore, we don't do anything here. Is that fine?
  36. }
  37. ErrorOr<void> FixedMemoryStream::truncate(off_t)
  38. {
  39. return Error::from_errno(ENOTSUP);
  40. }
  41. ErrorOr<Bytes> FixedMemoryStream::read(Bytes bytes)
  42. {
  43. auto to_read = min(remaining(), bytes.size());
  44. if (to_read == 0)
  45. return Bytes {};
  46. m_bytes.slice(m_offset, to_read).copy_to(bytes);
  47. m_offset += to_read;
  48. return bytes.trim(to_read);
  49. }
  50. ErrorOr<off_t> FixedMemoryStream::seek(i64 offset, SeekMode seek_mode)
  51. {
  52. switch (seek_mode) {
  53. case SeekMode::SetPosition:
  54. if (offset > static_cast<i64>(m_bytes.size()))
  55. return Error::from_string_literal("Offset past the end of the stream memory");
  56. m_offset = offset;
  57. break;
  58. case SeekMode::FromCurrentPosition:
  59. if (offset + static_cast<i64>(m_offset) > static_cast<i64>(m_bytes.size()))
  60. return Error::from_string_literal("Offset past the end of the stream memory");
  61. m_offset += offset;
  62. break;
  63. case SeekMode::FromEndPosition:
  64. if (offset > static_cast<i64>(m_bytes.size()))
  65. return Error::from_string_literal("Offset past the start of the stream memory");
  66. m_offset = m_bytes.size() - offset;
  67. break;
  68. }
  69. return static_cast<off_t>(m_offset);
  70. }
  71. ErrorOr<size_t> FixedMemoryStream::write(ReadonlyBytes bytes)
  72. {
  73. VERIFY(m_writing_enabled);
  74. // FIXME: Can this not error?
  75. auto const nwritten = bytes.copy_trimmed_to(m_bytes.slice(m_offset));
  76. m_offset += nwritten;
  77. return nwritten;
  78. }
  79. ErrorOr<void> FixedMemoryStream::write_entire_buffer(ReadonlyBytes bytes)
  80. {
  81. if (remaining() < bytes.size())
  82. return Error::from_string_literal("Write of entire buffer ends past the memory area");
  83. TRY(write(bytes));
  84. return {};
  85. }
  86. Bytes FixedMemoryStream::bytes()
  87. {
  88. VERIFY(m_writing_enabled);
  89. return m_bytes;
  90. }
  91. ReadonlyBytes FixedMemoryStream::bytes() const
  92. {
  93. return m_bytes;
  94. }
  95. size_t FixedMemoryStream::offset() const
  96. {
  97. return m_offset;
  98. }
  99. size_t FixedMemoryStream::remaining() const
  100. {
  101. return m_bytes.size() - m_offset;
  102. }
  103. }