Message.cpp 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165
  1. /*
  2. * Copyright (c) 2020, Sergey Bugaev <bugaevc@serenityos.org>
  3. *
  4. * SPDX-License-Identifier: BSD-2-Clause
  5. */
  6. #include <Kernel/FileSystem/Plan9FS/FileSystem.h>
  7. #include <Kernel/FileSystem/Plan9FS/Inode.h>
  8. #include <Kernel/FileSystem/Plan9FS/Message.h>
  9. namespace Kernel {
  10. Plan9FSMessage& Plan9FSMessage::operator<<(u8 number)
  11. {
  12. return append_number(number);
  13. }
  14. Plan9FSMessage& Plan9FSMessage::operator<<(u16 number)
  15. {
  16. return append_number(number);
  17. }
  18. Plan9FSMessage& Plan9FSMessage::operator<<(u32 number)
  19. {
  20. return append_number(number);
  21. }
  22. Plan9FSMessage& Plan9FSMessage::operator<<(u64 number)
  23. {
  24. return append_number(number);
  25. }
  26. Plan9FSMessage& Plan9FSMessage::operator<<(StringView string)
  27. {
  28. *this << static_cast<u16>(string.length());
  29. // FIXME: Handle append failure.
  30. (void)m_builder.append(string);
  31. return *this;
  32. }
  33. ErrorOr<void> Plan9FSMessage::append_data(StringView data)
  34. {
  35. *this << static_cast<u32>(data.length());
  36. TRY(m_builder.append(data));
  37. return {};
  38. }
  39. Plan9FSMessage::Decoder& Plan9FSMessage::Decoder::operator>>(u8& number)
  40. {
  41. return read_number(number);
  42. }
  43. Plan9FSMessage::Decoder& Plan9FSMessage::Decoder::operator>>(u16& number)
  44. {
  45. return read_number(number);
  46. }
  47. Plan9FSMessage::Decoder& Plan9FSMessage::Decoder::operator>>(u32& number)
  48. {
  49. return read_number(number);
  50. }
  51. Plan9FSMessage::Decoder& Plan9FSMessage::Decoder::operator>>(u64& number)
  52. {
  53. return read_number(number);
  54. }
  55. Plan9FSMessage::Decoder& Plan9FSMessage::Decoder::operator>>(Plan9FSQIdentifier& qid)
  56. {
  57. return *this >> qid.type >> qid.version >> qid.path;
  58. }
  59. Plan9FSMessage::Decoder& Plan9FSMessage::Decoder::operator>>(StringView& string)
  60. {
  61. u16 length;
  62. *this >> length;
  63. VERIFY(length <= m_data.length());
  64. string = m_data.substring_view(0, length);
  65. m_data = m_data.substring_view_starting_after_substring(string);
  66. return *this;
  67. }
  68. StringView Plan9FSMessage::Decoder::read_data()
  69. {
  70. u32 length;
  71. *this >> length;
  72. VERIFY(length <= m_data.length());
  73. auto data = m_data.substring_view(0, length);
  74. m_data = m_data.substring_view_starting_after_substring(data);
  75. return data;
  76. }
  77. Plan9FSMessage::Plan9FSMessage(Plan9FS& fs, Type type)
  78. : m_builder(KBufferBuilder::try_create().release_value()) // FIXME: Don't assume KBufferBuilder allocation success.
  79. , m_tag(fs.allocate_tag())
  80. , m_type(type)
  81. , m_have_been_built(false)
  82. {
  83. u32 size_placeholder = 0;
  84. *this << size_placeholder << (u8)type << m_tag;
  85. }
  86. Plan9FSMessage::Plan9FSMessage(NonnullOwnPtr<KBuffer>&& buffer)
  87. : m_built { move(buffer), Decoder({ buffer->bytes() }) }
  88. , m_have_been_built(true)
  89. {
  90. u32 size;
  91. u8 raw_type;
  92. *this >> size >> raw_type >> m_tag;
  93. m_type = (Type)raw_type;
  94. }
  95. Plan9FSMessage::~Plan9FSMessage()
  96. {
  97. if (m_have_been_built) {
  98. m_built.buffer.~NonnullOwnPtr<KBuffer>();
  99. m_built.decoder.~Decoder();
  100. } else {
  101. m_builder.~KBufferBuilder();
  102. }
  103. }
  104. Plan9FSMessage& Plan9FSMessage::operator=(Plan9FSMessage&& message)
  105. {
  106. m_tag = message.m_tag;
  107. m_type = message.m_type;
  108. if (m_have_been_built) {
  109. m_built.buffer.~NonnullOwnPtr<KBuffer>();
  110. m_built.decoder.~Decoder();
  111. } else {
  112. m_builder.~KBufferBuilder();
  113. }
  114. m_have_been_built = message.m_have_been_built;
  115. if (m_have_been_built) {
  116. new (&m_built.buffer) NonnullOwnPtr<KBuffer>(move(message.m_built.buffer));
  117. new (&m_built.decoder) Decoder(move(message.m_built.decoder));
  118. } else {
  119. new (&m_builder) KBufferBuilder(move(message.m_builder));
  120. }
  121. return *this;
  122. }
  123. KBuffer const& Plan9FSMessage::build()
  124. {
  125. VERIFY(!m_have_been_built);
  126. auto tmp_buffer = m_builder.build();
  127. // FIXME: We should not assume success here.
  128. VERIFY(tmp_buffer);
  129. m_have_been_built = true;
  130. m_builder.~KBufferBuilder();
  131. new (&m_built.buffer) NonnullOwnPtr<KBuffer>(tmp_buffer.release_nonnull());
  132. new (&m_built.decoder) Decoder({ m_built.buffer->data(), m_built.buffer->size() });
  133. u32* size = reinterpret_cast<u32*>(m_built.buffer->data());
  134. *size = m_built.buffer->size();
  135. return *m_built.buffer;
  136. }
  137. }