Decoder.cpp 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195
  1. /*
  2. * Copyright (c) 2020, Andreas Kling <kling@serenityos.org>
  3. *
  4. * SPDX-License-Identifier: BSD-2-Clause
  5. */
  6. #include <AK/MemoryStream.h>
  7. #include <AK/URL.h>
  8. #include <LibCore/AnonymousBuffer.h>
  9. #include <LibCore/DateTime.h>
  10. #include <LibCore/System.h>
  11. #include <LibIPC/Decoder.h>
  12. #include <LibIPC/Dictionary.h>
  13. #include <LibIPC/File.h>
  14. #include <errno.h>
  15. #include <fcntl.h>
  16. #include <string.h>
  17. #include <sys/socket.h>
  18. namespace IPC {
  19. ErrorOr<void> Decoder::decode(bool& value)
  20. {
  21. m_stream >> value;
  22. return m_stream.try_handle_any_error();
  23. }
  24. ErrorOr<void> Decoder::decode(u8& value)
  25. {
  26. m_stream >> value;
  27. return m_stream.try_handle_any_error();
  28. }
  29. ErrorOr<void> Decoder::decode(u16& value)
  30. {
  31. m_stream >> value;
  32. return m_stream.try_handle_any_error();
  33. }
  34. ErrorOr<void> Decoder::decode(unsigned& value)
  35. {
  36. m_stream >> value;
  37. return m_stream.try_handle_any_error();
  38. }
  39. ErrorOr<void> Decoder::decode(unsigned long& value)
  40. {
  41. m_stream >> value;
  42. return m_stream.try_handle_any_error();
  43. }
  44. ErrorOr<void> Decoder::decode(unsigned long long& value)
  45. {
  46. m_stream >> value;
  47. return m_stream.try_handle_any_error();
  48. }
  49. ErrorOr<void> Decoder::decode(i8& value)
  50. {
  51. m_stream >> value;
  52. return m_stream.try_handle_any_error();
  53. }
  54. ErrorOr<void> Decoder::decode(i16& value)
  55. {
  56. m_stream >> value;
  57. return m_stream.try_handle_any_error();
  58. }
  59. ErrorOr<void> Decoder::decode(i32& value)
  60. {
  61. m_stream >> value;
  62. return m_stream.try_handle_any_error();
  63. }
  64. ErrorOr<void> Decoder::decode(i64& value)
  65. {
  66. m_stream >> value;
  67. return m_stream.try_handle_any_error();
  68. }
  69. ErrorOr<void> Decoder::decode(float& value)
  70. {
  71. m_stream >> value;
  72. return m_stream.try_handle_any_error();
  73. }
  74. ErrorOr<void> Decoder::decode(double& value)
  75. {
  76. m_stream >> value;
  77. return m_stream.try_handle_any_error();
  78. }
  79. ErrorOr<void> Decoder::decode(String& value)
  80. {
  81. i32 length;
  82. TRY(decode(length));
  83. if (length < 0) {
  84. value = {};
  85. return {};
  86. }
  87. if (length == 0) {
  88. value = String::empty();
  89. return {};
  90. }
  91. char* text_buffer = nullptr;
  92. auto text_impl = StringImpl::create_uninitialized(static_cast<size_t>(length), text_buffer);
  93. m_stream >> Bytes { text_buffer, static_cast<size_t>(length) };
  94. value = *text_impl;
  95. return m_stream.try_handle_any_error();
  96. }
  97. ErrorOr<void> Decoder::decode(ByteBuffer& value)
  98. {
  99. i32 length;
  100. TRY(decode(length));
  101. if (length < 0) {
  102. value = {};
  103. return {};
  104. }
  105. if (length == 0) {
  106. value = {};
  107. return {};
  108. }
  109. if (auto buffer_result = ByteBuffer::create_uninitialized(length); buffer_result.has_value())
  110. value = buffer_result.release_value();
  111. else
  112. return Error::from_errno(ENOMEM);
  113. m_stream >> value.bytes();
  114. return m_stream.try_handle_any_error();
  115. }
  116. ErrorOr<void> Decoder::decode(URL& value)
  117. {
  118. String string;
  119. TRY(decode(string));
  120. value = URL(string);
  121. return {};
  122. }
  123. ErrorOr<void> Decoder::decode(Dictionary& dictionary)
  124. {
  125. u64 size;
  126. TRY(decode(size));
  127. if (size >= (size_t)NumericLimits<i32>::max())
  128. VERIFY_NOT_REACHED();
  129. for (size_t i = 0; i < size; ++i) {
  130. String key;
  131. TRY(decode(key));
  132. String value;
  133. TRY(decode(value));
  134. dictionary.add(move(key), move(value));
  135. }
  136. return {};
  137. }
  138. ErrorOr<void> Decoder::decode([[maybe_unused]] File& file)
  139. {
  140. int fd = TRY(m_socket.receive_fd(O_CLOEXEC));
  141. file = File(fd, File::ConstructWithReceivedFileDescriptor);
  142. return {};
  143. }
  144. ErrorOr<void> decode(Decoder& decoder, Core::AnonymousBuffer& buffer)
  145. {
  146. bool valid;
  147. TRY(decoder.decode(valid));
  148. if (!valid) {
  149. buffer = {};
  150. return {};
  151. }
  152. u32 size;
  153. TRY(decoder.decode(size));
  154. IPC::File anon_file;
  155. TRY(decoder.decode(anon_file));
  156. buffer = TRY(Core::AnonymousBuffer::create_from_anon_fd(anon_file.take_fd(), size));
  157. return {};
  158. }
  159. ErrorOr<void> decode(Decoder& decoder, Core::DateTime& datetime)
  160. {
  161. i64 timestamp;
  162. TRY(decoder.decode(timestamp));
  163. datetime = Core::DateTime::from_timestamp(static_cast<time_t>(timestamp));
  164. return {};
  165. }
  166. }