WebSocketQt.cpp 3.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. /*
  2. * Copyright (c) 2022, Dex♪ <dexes.ttp@gmail.com>
  3. * Copyright (c) 2022, Andreas Kling <andreas@ladybird.org>
  4. *
  5. * SPDX-License-Identifier: BSD-2-Clause
  6. */
  7. #include "WebSocketQt.h"
  8. namespace Ladybird {
  9. NonnullRefPtr<WebSocketQt> WebSocketQt::create(NonnullRefPtr<WebSocket::WebSocket> underlying_socket)
  10. {
  11. return adopt_ref(*new WebSocketQt(move(underlying_socket)));
  12. }
  13. WebSocketQt::WebSocketQt(NonnullRefPtr<WebSocket::WebSocket> underlying_socket)
  14. : m_websocket(move(underlying_socket))
  15. {
  16. m_websocket->on_open = [weak_this = make_weak_ptr()] {
  17. if (auto strong_this = weak_this.strong_ref())
  18. if (strong_this->on_open)
  19. strong_this->on_open();
  20. };
  21. m_websocket->on_message = [weak_this = make_weak_ptr()](auto message) {
  22. if (auto strong_this = weak_this.strong_ref()) {
  23. if (strong_this->on_message) {
  24. strong_this->on_message(Web::WebSockets::WebSocketClientSocket::Message {
  25. .data = move(message.data()),
  26. .is_text = message.is_text(),
  27. });
  28. }
  29. }
  30. };
  31. m_websocket->on_error = [weak_this = make_weak_ptr()](auto error) {
  32. if (auto strong_this = weak_this.strong_ref()) {
  33. if (strong_this->on_error) {
  34. switch (error) {
  35. case WebSocket::WebSocket::Error::CouldNotEstablishConnection:
  36. strong_this->on_error(Web::WebSockets::WebSocketClientSocket::Error::CouldNotEstablishConnection);
  37. return;
  38. case WebSocket::WebSocket::Error::ConnectionUpgradeFailed:
  39. strong_this->on_error(Web::WebSockets::WebSocketClientSocket::Error::ConnectionUpgradeFailed);
  40. return;
  41. case WebSocket::WebSocket::Error::ServerClosedSocket:
  42. strong_this->on_error(Web::WebSockets::WebSocketClientSocket::Error::ServerClosedSocket);
  43. return;
  44. }
  45. VERIFY_NOT_REACHED();
  46. }
  47. }
  48. };
  49. m_websocket->on_close = [weak_this = make_weak_ptr()](u16 code, ByteString reason, bool was_clean) {
  50. if (auto strong_this = weak_this.strong_ref())
  51. if (strong_this->on_close)
  52. strong_this->on_close(code, move(reason), was_clean);
  53. };
  54. }
  55. WebSocketQt::~WebSocketQt() = default;
  56. Web::WebSockets::WebSocket::ReadyState WebSocketQt::ready_state()
  57. {
  58. switch (m_websocket->ready_state()) {
  59. case WebSocket::ReadyState::Connecting:
  60. return Web::WebSockets::WebSocket::ReadyState::Connecting;
  61. case WebSocket::ReadyState::Open:
  62. return Web::WebSockets::WebSocket::ReadyState::Open;
  63. case WebSocket::ReadyState::Closing:
  64. return Web::WebSockets::WebSocket::ReadyState::Closing;
  65. case WebSocket::ReadyState::Closed:
  66. return Web::WebSockets::WebSocket::ReadyState::Closed;
  67. }
  68. VERIFY_NOT_REACHED();
  69. }
  70. ByteString WebSocketQt::subprotocol_in_use()
  71. {
  72. return m_websocket->subprotocol_in_use();
  73. }
  74. void WebSocketQt::send(ByteBuffer binary_or_text_message, bool is_text)
  75. {
  76. m_websocket->send(WebSocket::Message(binary_or_text_message, is_text));
  77. }
  78. void WebSocketQt::send(StringView message)
  79. {
  80. m_websocket->send(WebSocket::Message(message));
  81. }
  82. void WebSocketQt::close(u16 code, ByteString reason)
  83. {
  84. m_websocket->close(code, reason);
  85. }
  86. }