Decoder.cpp 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135
  1. /*
  2. * Copyright (c) 2020, Andreas Kling <kling@serenityos.org>
  3. * Copyright (c) 2023, Tim Flynn <trflynn89@serenityos.org>
  4. *
  5. * SPDX-License-Identifier: BSD-2-Clause
  6. */
  7. #include <AK/JsonValue.h>
  8. #include <AK/NumericLimits.h>
  9. #include <AK/URL.h>
  10. #include <LibCore/AnonymousBuffer.h>
  11. #include <LibCore/DateTime.h>
  12. #include <LibCore/Proxy.h>
  13. #include <LibCore/Socket.h>
  14. #include <LibIPC/Decoder.h>
  15. #include <LibIPC/File.h>
  16. #include <fcntl.h>
  17. namespace IPC {
  18. ErrorOr<size_t> Decoder::decode_size()
  19. {
  20. return static_cast<size_t>(TRY(decode<u32>()));
  21. }
  22. template<>
  23. ErrorOr<String> decode(Decoder& decoder)
  24. {
  25. auto length = TRY(decoder.decode_size());
  26. return String::from_stream(decoder.stream(), length);
  27. }
  28. template<>
  29. ErrorOr<ByteString> decode(Decoder& decoder)
  30. {
  31. auto length = TRY(decoder.decode_size());
  32. if (length == NumericLimits<u32>::max())
  33. return ByteString {};
  34. if (length == 0)
  35. return ByteString::empty();
  36. char* text_buffer = nullptr;
  37. auto text_impl = StringImpl::create_uninitialized(length, text_buffer);
  38. Bytes bytes { text_buffer, length };
  39. TRY(decoder.decode_into(bytes));
  40. return ByteString { *text_impl };
  41. }
  42. template<>
  43. ErrorOr<ByteBuffer> decode(Decoder& decoder)
  44. {
  45. auto length = TRY(decoder.decode_size());
  46. if (length == 0)
  47. return ByteBuffer {};
  48. auto buffer = TRY(ByteBuffer::create_uninitialized(length));
  49. auto bytes = buffer.bytes();
  50. TRY(decoder.decode_into(bytes));
  51. return buffer;
  52. }
  53. template<>
  54. ErrorOr<JsonValue> decode(Decoder& decoder)
  55. {
  56. auto json = TRY(decoder.decode<ByteString>());
  57. return JsonValue::from_string(json);
  58. }
  59. template<>
  60. ErrorOr<Duration> decode(Decoder& decoder)
  61. {
  62. auto nanoseconds = TRY(decoder.decode<i64>());
  63. return AK::Duration::from_nanoseconds(nanoseconds);
  64. }
  65. template<>
  66. ErrorOr<UnixDateTime> decode(Decoder& decoder)
  67. {
  68. auto nanoseconds = TRY(decoder.decode<i64>());
  69. return AK::UnixDateTime::from_nanoseconds_since_epoch(nanoseconds);
  70. }
  71. template<>
  72. ErrorOr<URL> decode(Decoder& decoder)
  73. {
  74. auto url = TRY(decoder.decode<ByteString>());
  75. return URL { url };
  76. }
  77. template<>
  78. ErrorOr<File> decode(Decoder& decoder)
  79. {
  80. int fd = TRY(decoder.socket().receive_fd(O_CLOEXEC));
  81. return File { fd, File::ConstructWithReceivedFileDescriptor };
  82. }
  83. template<>
  84. ErrorOr<Empty> decode(Decoder&)
  85. {
  86. return Empty {};
  87. }
  88. template<>
  89. ErrorOr<Core::AnonymousBuffer> decode(Decoder& decoder)
  90. {
  91. if (auto valid = TRY(decoder.decode<bool>()); !valid)
  92. return Core::AnonymousBuffer {};
  93. auto size = TRY(decoder.decode_size());
  94. auto anon_file = TRY(decoder.decode<IPC::File>());
  95. return Core::AnonymousBuffer::create_from_anon_fd(anon_file.take_fd(), size);
  96. }
  97. template<>
  98. ErrorOr<Core::DateTime> decode(Decoder& decoder)
  99. {
  100. auto timestamp = TRY(decoder.decode<i64>());
  101. return Core::DateTime::from_timestamp(static_cast<time_t>(timestamp));
  102. }
  103. template<>
  104. ErrorOr<Core::ProxyData> decode(Decoder& decoder)
  105. {
  106. auto type = TRY(decoder.decode<Core::ProxyData::Type>());
  107. auto host_ipv4 = TRY(decoder.decode<u32>());
  108. auto port = TRY(decoder.decode<int>());
  109. return Core::ProxyData { type, host_ipv4, port };
  110. }
  111. }