delegating_signal_strategy.cc 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123
  1. // Copyright 2013 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 "remoting/signaling/delegating_signal_strategy.h"
  5. #include "base/bind.h"
  6. #include "base/logging.h"
  7. #include "base/rand_util.h"
  8. #include "base/strings/string_number_conversions.h"
  9. #include "base/task/single_thread_task_runner.h"
  10. #include "base/threading/thread_task_runner_handle.h"
  11. #include "remoting/signaling/xmpp_constants.h"
  12. #include "third_party/libjingle_xmpp/xmllite/xmlelement.h"
  13. namespace remoting {
  14. DelegatingSignalStrategy::DelegatingSignalStrategy(
  15. const SignalingAddress& local_address,
  16. scoped_refptr<base::SingleThreadTaskRunner> client_task_runner,
  17. const IqCallback& send_iq_callback)
  18. : local_address_(local_address),
  19. delegate_task_runner_(base::ThreadTaskRunnerHandle::Get()),
  20. client_task_runner_(client_task_runner),
  21. send_iq_callback_(send_iq_callback) {
  22. incoming_iq_callback_ =
  23. base::BindRepeating(&OnIncomingMessageFromDelegate,
  24. weak_factory_.GetWeakPtr(), client_task_runner_);
  25. }
  26. DelegatingSignalStrategy::~DelegatingSignalStrategy() = default;
  27. DelegatingSignalStrategy::IqCallback
  28. DelegatingSignalStrategy::GetIncomingMessageCallback() {
  29. return incoming_iq_callback_;
  30. }
  31. // static
  32. void DelegatingSignalStrategy::OnIncomingMessageFromDelegate(
  33. base::WeakPtr<DelegatingSignalStrategy> weak_ptr,
  34. scoped_refptr<base::SingleThreadTaskRunner> client_task_runner,
  35. const std::string& message) {
  36. if (client_task_runner->BelongsToCurrentThread()) {
  37. weak_ptr->OnIncomingMessage(message);
  38. return;
  39. }
  40. client_task_runner->PostTask(
  41. FROM_HERE, base::BindOnce(&DelegatingSignalStrategy::OnIncomingMessage,
  42. weak_ptr, message));
  43. }
  44. void DelegatingSignalStrategy::OnIncomingMessage(const std::string& message) {
  45. DCHECK(client_task_runner_->BelongsToCurrentThread());
  46. std::unique_ptr<jingle_xmpp::XmlElement> stanza(jingle_xmpp::XmlElement::ForStr(message));
  47. if (!stanza.get()) {
  48. LOG(WARNING) << "Malformed XMPP stanza received: " << message;
  49. return;
  50. }
  51. for (auto& listener : listeners_) {
  52. if (listener.OnSignalStrategyIncomingStanza(stanza.get()))
  53. break;
  54. }
  55. }
  56. void DelegatingSignalStrategy::Connect() {
  57. DCHECK(client_task_runner_->BelongsToCurrentThread());
  58. for (auto& observer : listeners_)
  59. observer.OnSignalStrategyStateChange(CONNECTED);
  60. }
  61. void DelegatingSignalStrategy::Disconnect() {
  62. DCHECK(client_task_runner_->BelongsToCurrentThread());
  63. }
  64. SignalStrategy::State DelegatingSignalStrategy::GetState() const {
  65. DCHECK(client_task_runner_->BelongsToCurrentThread());
  66. return CONNECTED;
  67. }
  68. SignalStrategy::Error DelegatingSignalStrategy::GetError() const {
  69. DCHECK(client_task_runner_->BelongsToCurrentThread());
  70. return OK;
  71. }
  72. const SignalingAddress& DelegatingSignalStrategy::GetLocalAddress() const {
  73. DCHECK(client_task_runner_->BelongsToCurrentThread());
  74. return local_address_;
  75. }
  76. void DelegatingSignalStrategy::AddListener(Listener* listener) {
  77. DCHECK(client_task_runner_->BelongsToCurrentThread());
  78. listeners_.AddObserver(listener);
  79. }
  80. void DelegatingSignalStrategy::RemoveListener(Listener* listener) {
  81. DCHECK(client_task_runner_->BelongsToCurrentThread());
  82. listeners_.RemoveObserver(listener);
  83. }
  84. bool DelegatingSignalStrategy::SendStanza(
  85. std::unique_ptr<jingle_xmpp::XmlElement> stanza) {
  86. DCHECK(client_task_runner_->BelongsToCurrentThread());
  87. GetLocalAddress().SetInMessage(stanza.get(), SignalingAddress::FROM);
  88. delegate_task_runner_->PostTask(
  89. FROM_HERE, base::BindOnce(send_iq_callback_, stanza->Str()));
  90. return true;
  91. }
  92. bool DelegatingSignalStrategy::SendMessage(
  93. const SignalingAddress& destination_address,
  94. const ftl::ChromotingMessage& message) {
  95. DCHECK(client_task_runner_->BelongsToCurrentThread());
  96. NOTIMPLEMENTED();
  97. return false;
  98. }
  99. std::string DelegatingSignalStrategy::GetNextId() {
  100. return base::NumberToString(base::RandUint64());
  101. }
  102. } // namespace remoting