FileStream.h 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161
  1. /*
  2. * Copyright (c) 2020, the SerenityOS developers.
  3. *
  4. * SPDX-License-Identifier: BSD-2-Clause
  5. */
  6. #pragma once
  7. #include <AK/Buffered.h>
  8. #include <AK/ByteBuffer.h>
  9. #include <AK/Stream.h>
  10. #include <LibCore/File.h>
  11. namespace Core {
  12. class InputFileStream final : public InputStream {
  13. public:
  14. explicit InputFileStream(NonnullRefPtr<File> file)
  15. : m_file(file)
  16. {
  17. }
  18. static Result<InputFileStream, OSError> open(StringView filename, OpenMode mode = OpenMode::ReadOnly, mode_t permissions = 0644)
  19. {
  20. VERIFY(has_flag(mode, OpenMode::ReadOnly));
  21. auto file_result = File::open(filename, mode, permissions);
  22. if (file_result.is_error())
  23. return file_result.error();
  24. return InputFileStream { file_result.value() };
  25. }
  26. static Result<Buffered<InputFileStream>, OSError> open_buffered(StringView filename, OpenMode mode = OpenMode::ReadOnly, mode_t permissions = 0644)
  27. {
  28. VERIFY(has_flag(mode, OpenMode::ReadOnly));
  29. auto file_result = File::open(filename, mode, permissions);
  30. if (file_result.is_error())
  31. return file_result.error();
  32. return Buffered<InputFileStream> { file_result.value() };
  33. }
  34. size_t read(Bytes bytes) override
  35. {
  36. if (has_any_error())
  37. return 0;
  38. const auto buffer = m_file->read(bytes.size());
  39. return buffer.bytes().copy_to(bytes);
  40. }
  41. bool read_or_error(Bytes bytes) override
  42. {
  43. if (read(bytes) < bytes.size()) {
  44. set_fatal_error();
  45. return false;
  46. }
  47. return true;
  48. }
  49. bool seek(size_t offset, SeekMode whence = SeekMode::SetPosition)
  50. {
  51. return m_file->seek(offset, whence);
  52. }
  53. bool discard_or_error(size_t count) override { return m_file->seek(count, SeekMode::FromCurrentPosition); }
  54. bool unreliable_eof() const override { return m_file->eof(); }
  55. void close()
  56. {
  57. if (!m_file->close())
  58. set_fatal_error();
  59. }
  60. private:
  61. NonnullRefPtr<File> m_file;
  62. };
  63. class OutputFileStream : public OutputStream {
  64. public:
  65. explicit OutputFileStream(NonnullRefPtr<File> file)
  66. : m_file(file)
  67. {
  68. }
  69. static Result<OutputFileStream, OSError> open(StringView filename, OpenMode mode = OpenMode::WriteOnly, mode_t permissions = 0644)
  70. {
  71. VERIFY(has_flag(mode, OpenMode::WriteOnly));
  72. auto file_result = File::open(filename, mode, permissions);
  73. if (file_result.is_error())
  74. return file_result.error();
  75. return OutputFileStream { file_result.value() };
  76. }
  77. static Result<Buffered<OutputFileStream>, OSError> open_buffered(StringView filename, OpenMode mode = OpenMode::WriteOnly, mode_t permissions = 0644)
  78. {
  79. VERIFY(has_flag(mode, OpenMode::WriteOnly));
  80. auto file_result = File::open(filename, mode, permissions);
  81. if (file_result.is_error())
  82. return file_result.error();
  83. return Buffered<OutputFileStream> { file_result.value() };
  84. }
  85. static OutputFileStream standard_output()
  86. {
  87. return OutputFileStream { Core::File::standard_output() };
  88. }
  89. static OutputFileStream standard_error()
  90. {
  91. return OutputFileStream { Core::File::standard_error() };
  92. }
  93. static Buffered<OutputFileStream> stdout_buffered()
  94. {
  95. return Buffered<OutputFileStream> { Core::File::standard_output() };
  96. }
  97. size_t write(ReadonlyBytes bytes) override
  98. {
  99. if (!m_file->write(bytes.data(), bytes.size())) {
  100. set_fatal_error();
  101. return 0;
  102. }
  103. return bytes.size();
  104. }
  105. bool write_or_error(ReadonlyBytes bytes) override
  106. {
  107. if (write(bytes) < bytes.size()) {
  108. set_fatal_error();
  109. return false;
  110. }
  111. return true;
  112. }
  113. void close()
  114. {
  115. if (!m_file->close())
  116. set_fatal_error();
  117. }
  118. private:
  119. NonnullRefPtr<File> m_file;
  120. };
  121. }