message_port_tls_connection.cc 2.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. // Copyright 2021 The Chromium Authors. All rights reserved.
  2. // Use of this source code is governed by a BSD-style license that can be
  3. // found in the LICENSE file.
  4. #include "components/openscreen_platform/message_port_tls_connection.h"
  5. #include "third_party/openscreen/src/platform/api/task_runner.h"
  6. #include "third_party/openscreen/src/platform/base/error.h"
  7. namespace openscreen_platform {
  8. MessagePortTlsConnection::MessagePortTlsConnection(
  9. std::unique_ptr<cast_api_bindings::MessagePort> message_port,
  10. openscreen::TaskRunner* task_runner)
  11. : message_port_(std::move(message_port)), task_runner_(task_runner) {
  12. DCHECK(message_port_);
  13. DCHECK(task_runner_);
  14. message_port_->SetReceiver(this);
  15. }
  16. MessagePortTlsConnection::~MessagePortTlsConnection() = default;
  17. // TlsConnection overrides.
  18. void MessagePortTlsConnection::SetClient(TlsConnection::Client* client) {
  19. DCHECK(task_runner_->IsRunningOnTaskRunner());
  20. client_ = client;
  21. }
  22. bool MessagePortTlsConnection::Send(const void* data, size_t len) {
  23. return message_port_->PostMessage(
  24. base::StringPiece(static_cast<const char*>(data), len));
  25. }
  26. openscreen::IPEndpoint MessagePortTlsConnection::GetRemoteEndpoint() const {
  27. return openscreen::IPEndpoint{openscreen::IPAddress::kV6LoopbackAddress()};
  28. }
  29. bool MessagePortTlsConnection::OnMessage(
  30. base::StringPiece message,
  31. std::vector<std::unique_ptr<cast_api_bindings::MessagePort>> ports) {
  32. DCHECK(ports.empty());
  33. if (client_) {
  34. if (!task_runner_->IsRunningOnTaskRunner()) {
  35. task_runner_->PostTask([ptr = AsWeakPtr(), m = std::move(message)]() {
  36. if (ptr) {
  37. ptr->OnMessage(
  38. std::move(m),
  39. std::vector<std::unique_ptr<cast_api_bindings::MessagePort>>());
  40. }
  41. });
  42. return true;
  43. }
  44. client_->OnRead(this, std::vector<uint8_t>(message.begin(), message.end()));
  45. }
  46. return true;
  47. }
  48. void MessagePortTlsConnection::OnPipeError() {
  49. if (client_) {
  50. if (!task_runner_->IsRunningOnTaskRunner()) {
  51. task_runner_->PostTask([ptr = AsWeakPtr()]() {
  52. if (ptr) {
  53. ptr->OnPipeError();
  54. }
  55. });
  56. return;
  57. }
  58. client_->OnError(
  59. this, openscreen::Error(openscreen::Error::Code::kSocketFailure));
  60. }
  61. }
  62. } // namespace openscreen_platform