Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "remoting/signaling/fake_signal_strategy.h" | 5 #include "remoting/signaling/fake_signal_strategy.h" |
| 6 | 6 |
| 7 #include <utility> | 7 #include <utility> |
| 8 | 8 |
| 9 #include "base/bind.h" | 9 #include "base/bind.h" |
| 10 #include "base/location.h" | 10 #include "base/location.h" |
| (...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 56 base::Unretained(peer), | 56 base::Unretained(peer), |
| 57 peer_callback)); | 57 peer_callback)); |
| 58 } | 58 } |
| 59 } | 59 } |
| 60 | 60 |
| 61 void FakeSignalStrategy::SetLocalJid(const std::string& jid) { | 61 void FakeSignalStrategy::SetLocalJid(const std::string& jid) { |
| 62 DCHECK(CalledOnValidThread()); | 62 DCHECK(CalledOnValidThread()); |
| 63 jid_ = jid; | 63 jid_ = jid; |
| 64 } | 64 } |
| 65 | 65 |
| 66 void FakeSignalStrategy::SimulatePackgeReordering() { | |
| 67 DCHECK(CalledOnValidThread()); | |
| 68 simulate_reorder_ = true; | |
| 69 } | |
| 70 | |
| 66 void FakeSignalStrategy::Connect() { | 71 void FakeSignalStrategy::Connect() { |
| 67 DCHECK(CalledOnValidThread()); | 72 DCHECK(CalledOnValidThread()); |
| 68 FOR_EACH_OBSERVER(Listener, listeners_, | 73 FOR_EACH_OBSERVER(Listener, listeners_, |
| 69 OnSignalStrategyStateChange(CONNECTED)); | 74 OnSignalStrategyStateChange(CONNECTED)); |
| 70 } | 75 } |
| 71 | 76 |
| 72 void FakeSignalStrategy::Disconnect() { | 77 void FakeSignalStrategy::Disconnect() { |
| 73 DCHECK(CalledOnValidThread()); | 78 DCHECK(CalledOnValidThread()); |
| 74 FOR_EACH_OBSERVER(Listener, listeners_, | 79 FOR_EACH_OBSERVER(Listener, listeners_, |
| 75 OnSignalStrategyStateChange(DISCONNECTED)); | 80 OnSignalStrategyStateChange(DISCONNECTED)); |
| (...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 128 std::unique_ptr<buzz::XmlElement> stanza) { | 133 std::unique_ptr<buzz::XmlElement> stanza) { |
| 129 thread->PostTask(FROM_HERE, | 134 thread->PostTask(FROM_HERE, |
| 130 base::Bind(&FakeSignalStrategy::OnIncomingMessage, | 135 base::Bind(&FakeSignalStrategy::OnIncomingMessage, |
| 131 target, base::Passed(&stanza))); | 136 target, base::Passed(&stanza))); |
| 132 } | 137 } |
| 133 | 138 |
| 134 void FakeSignalStrategy::OnIncomingMessage( | 139 void FakeSignalStrategy::OnIncomingMessage( |
| 135 std::unique_ptr<buzz::XmlElement> stanza) { | 140 std::unique_ptr<buzz::XmlElement> stanza) { |
| 136 DCHECK(CalledOnValidThread()); | 141 DCHECK(CalledOnValidThread()); |
| 137 | 142 |
| 143 if (!simulate_reorder_) { | |
| 144 NotifyListeners(std::move(stanza)); | |
| 145 return; | |
| 146 } | |
| 147 | |
| 148 // Simulate IQ message re-ordering by swapping the delivery order of the 2nd | |
| 149 // session-info message and the first transport-info message. | |
| 150 const buzz::XmlElement* jingle = | |
| 151 stanza->FirstNamed(buzz::QName("urn:xmpp:jingle:1", "jingle")); | |
| 152 std::string action = jingle->Attr(buzz::QName("", "action")); | |
| 153 | |
| 154 if (action != "session-info" && action != "transport-info") { | |
|
Sergey Ulanov
2016/10/19 21:23:39
I don't think we really need this logic here. The
kelvinp
2016/10/21 00:26:03
Done.
| |
| 155 NotifyListeners(std::move(stanza)); | |
| 156 return; | |
| 157 } | |
| 158 | |
| 159 if (action == "session-info") { | |
| 160 session_info_counts_++; | |
| 161 // Only reorder the 2nd session-info message. | |
| 162 if (session_info_counts_ == 2) { | |
| 163 pending_session_info_ = std::move(stanza); | |
| 164 } else { | |
| 165 NotifyListeners(std::move(stanza)); | |
| 166 } | |
| 167 } else if (action == "transport-info" && session_info_counts_ == 2) { | |
| 168 NotifyListeners(std::move(stanza)); | |
| 169 NotifyListeners(std::move(pending_session_info_)); | |
| 170 pending_session_info_.reset(); | |
| 171 simulate_reorder_ = false; | |
| 172 } | |
| 173 } | |
| 174 | |
| 175 void FakeSignalStrategy::NotifyListeners( | |
| 176 std::unique_ptr<buzz::XmlElement> stanza) { | |
| 177 DCHECK(CalledOnValidThread()); | |
| 178 | |
| 138 buzz::XmlElement* stanza_ptr = stanza.get(); | 179 buzz::XmlElement* stanza_ptr = stanza.get(); |
| 139 received_messages_.push_back(stanza.release()); | 180 received_messages_.push_back(stanza.release()); |
| 140 | 181 |
| 141 const std::string& to_field = stanza_ptr->Attr(buzz::QN_TO); | 182 const std::string& to_field = stanza_ptr->Attr(buzz::QN_TO); |
| 142 if (to_field != jid_) { | 183 if (to_field != jid_) { |
| 143 LOG(WARNING) << "Dropping stanza that is addressed to " << to_field | 184 LOG(WARNING) << "Dropping stanza that is addressed to " << to_field |
| 144 << ". Local jid: " << jid_ | 185 << ". Local jid: " << jid_ |
| 145 << ". Message content: " << stanza_ptr->Str(); | 186 << ". Message content: " << stanza_ptr->Str(); |
| 146 return; | 187 return; |
| 147 } | 188 } |
| 148 | 189 |
| 149 base::ObserverListBase<Listener>::Iterator it(&listeners_); | 190 base::ObserverListBase<Listener>::Iterator it(&listeners_); |
| 150 Listener* listener; | 191 Listener* listener; |
| 151 while ((listener = it.GetNext()) != nullptr) { | 192 while ((listener = it.GetNext()) != nullptr) { |
| 152 if (listener->OnSignalStrategyIncomingStanza(stanza_ptr)) | 193 if (listener->OnSignalStrategyIncomingStanza(stanza_ptr)) |
| 153 break; | 194 break; |
| 154 } | 195 } |
| 155 } | 196 } |
| 156 | 197 |
| 157 void FakeSignalStrategy::SetPeerCallback(const PeerCallback& peer_callback) { | 198 void FakeSignalStrategy::SetPeerCallback(const PeerCallback& peer_callback) { |
| 158 peer_callback_ = peer_callback; | 199 peer_callback_ = peer_callback; |
| 159 } | 200 } |
| 160 | 201 |
| 161 } // namespace remoting | 202 } // namespace remoting |
| OLD | NEW |