Message.h 1.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  1. /*
  2. * Copyright (c) 2018-2020, Andreas Kling <kling@serenityos.org>
  3. * Copyright (c) 2022, the SerenityOS developers.
  4. *
  5. * SPDX-License-Identifier: BSD-2-Clause
  6. */
  7. #pragma once
  8. #include <AK/Error.h>
  9. #include <AK/RefCounted.h>
  10. #include <AK/RefPtr.h>
  11. #include <unistd.h>
  12. namespace IPC {
  13. class AutoCloseFileDescriptor : public RefCounted<AutoCloseFileDescriptor> {
  14. public:
  15. AutoCloseFileDescriptor(int fd)
  16. : m_fd(fd)
  17. {
  18. }
  19. ~AutoCloseFileDescriptor()
  20. {
  21. if (m_fd != -1)
  22. close(m_fd);
  23. }
  24. int value() const { return m_fd; }
  25. private:
  26. int m_fd;
  27. };
  28. struct MessageBuffer {
  29. Vector<u8, 1024> data;
  30. Vector<NonnullRefPtr<AutoCloseFileDescriptor>, 1> fds;
  31. };
  32. enum class ErrorCode : u32 {
  33. PeerDisconnected
  34. };
  35. template<typename Value>
  36. using IPCErrorOr = ErrorOr<Value, ErrorCode>;
  37. class Message {
  38. public:
  39. virtual ~Message() = default;
  40. virtual u32 endpoint_magic() const = 0;
  41. virtual int message_id() const = 0;
  42. virtual char const* message_name() const = 0;
  43. virtual bool valid() const = 0;
  44. virtual ErrorOr<MessageBuffer> encode() const = 0;
  45. protected:
  46. Message() = default;
  47. };
  48. }