Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 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/jingle_glue/javascript_signal_strategy.h" | 5 #include "remoting/jingle_glue/javascript_signal_strategy.h" |
| 6 | 6 |
| 7 #include <algorithm> | 7 #include <algorithm> |
| 8 | 8 |
| 9 #include "base/logging.h" | 9 #include "base/logging.h" |
| 10 #include "base/string_number_conversions.h" | 10 #include "base/string_number_conversions.h" |
| 11 #include "remoting/jingle_glue/xmpp_proxy.h" | 11 #include "remoting/jingle_glue/xmpp_proxy.h" |
| 12 #include "third_party/libjingle/source/talk/xmllite/xmlelement.h" | 12 #include "third_party/libjingle/source/talk/xmllite/xmlelement.h" |
| 13 | 13 |
| 14 namespace remoting { | 14 namespace remoting { |
| 15 | 15 |
| 16 JavascriptSignalStrategy::JavascriptSignalStrategy(const std::string& your_jid) | 16 JavascriptSignalStrategy::JavascriptSignalStrategy(const std::string& local_jid) |
| 17 : your_jid_(your_jid), | 17 : local_jid_(local_jid), |
| 18 last_id_(0) { | 18 last_id_(0) { |
| 19 } | 19 } |
| 20 | 20 |
| 21 JavascriptSignalStrategy::~JavascriptSignalStrategy() { | 21 JavascriptSignalStrategy::~JavascriptSignalStrategy() { |
| 22 DCHECK(listeners_.empty()); | 22 DCHECK_EQ(listeners_.size(), 0U); |
| 23 Close(); | 23 Disconnect(); |
| 24 } | 24 } |
| 25 | 25 |
| 26 void JavascriptSignalStrategy::AttachXmppProxy( | 26 void JavascriptSignalStrategy::AttachXmppProxy( |
| 27 scoped_refptr<XmppProxy> xmpp_proxy) { | 27 scoped_refptr<XmppProxy> xmpp_proxy) { |
| 28 DCHECK(CalledOnValidThread()); | 28 DCHECK(CalledOnValidThread()); |
| 29 xmpp_proxy_ = xmpp_proxy; | 29 xmpp_proxy_ = xmpp_proxy; |
| 30 xmpp_proxy_->AttachCallback(AsWeakPtr()); | |
| 31 } | 30 } |
| 32 | 31 |
| 33 void JavascriptSignalStrategy::Init(StatusObserver* observer) { | 32 void JavascriptSignalStrategy::Connect() { |
| 34 DCHECK(CalledOnValidThread()); | 33 DCHECK(CalledOnValidThread()); |
| 35 | 34 |
| 36 // Blast through each state since for a JavascriptSignalStrategy, we're | 35 xmpp_proxy_->AttachCallback(AsWeakPtr()); |
| 37 // already connected. | 36 FOR_EACH_OBSERVER(Listener, listeners_, |
| 38 // | 37 OnSignalStrategyStateChange(CONNECTED)); |
| 39 // TODO(ajwong): Clarify the status API contract to see if we have to actually | |
| 40 // walk through each state. | |
| 41 observer->OnStateChange(StatusObserver::START); | |
| 42 observer->OnStateChange(StatusObserver::CONNECTING); | |
| 43 observer->OnJidChange(your_jid_); | |
| 44 observer->OnStateChange(StatusObserver::CONNECTED); | |
| 45 } | 38 } |
| 46 | 39 |
| 47 void JavascriptSignalStrategy::Close() { | 40 void JavascriptSignalStrategy::Disconnect() { |
| 48 DCHECK(CalledOnValidThread()); | 41 DCHECK(CalledOnValidThread()); |
| 49 | 42 |
| 50 if (xmpp_proxy_) { | 43 if (xmpp_proxy_) |
| 51 xmpp_proxy_->DetachCallback(); | 44 xmpp_proxy_->DetachCallback(); |
| 52 xmpp_proxy_ = NULL; | 45 FOR_EACH_OBSERVER(Listener, listeners_, |
| 53 } | 46 OnSignalStrategyStateChange(CLOSED)); |
| 47 } | |
| 48 | |
| 49 SignalStrategy::State JavascriptSignalStrategy::GetState() const { | |
| 50 return CONNECTED; | |
|
Wez
2011/12/21 23:35:30
Shouldn't this be based upon the state of |xmpp_pr
Sergey Ulanov
2011/12/22 21:45:10
Ideally yes, but XmppProxy doesn't provide any inf
| |
| 51 } | |
| 52 | |
| 53 std::string JavascriptSignalStrategy::GetLocalJid() const { | |
| 54 return local_jid_; | |
| 54 } | 55 } |
| 55 | 56 |
| 56 void JavascriptSignalStrategy::AddListener(Listener* listener) { | 57 void JavascriptSignalStrategy::AddListener(Listener* listener) { |
| 57 DCHECK(CalledOnValidThread()); | 58 DCHECK(CalledOnValidThread()); |
| 58 DCHECK(std::find(listeners_.begin(), listeners_.end(), listener) == | 59 listeners_.AddObserver(listener); |
| 59 listeners_.end()); | |
| 60 listeners_.push_back(listener); | |
| 61 } | 60 } |
| 62 | 61 |
| 63 void JavascriptSignalStrategy::RemoveListener(Listener* listener) { | 62 void JavascriptSignalStrategy::RemoveListener(Listener* listener) { |
| 64 DCHECK(CalledOnValidThread()); | 63 DCHECK(CalledOnValidThread()); |
| 65 std::vector<Listener*>::iterator it = | 64 listeners_.RemoveObserver(listener); |
| 66 std::find(listeners_.begin(), listeners_.end(), listener); | |
| 67 CHECK(it != listeners_.end()); | |
| 68 listeners_.erase(it); | |
| 69 } | 65 } |
| 70 | 66 |
| 71 bool JavascriptSignalStrategy::SendStanza(buzz::XmlElement* stanza) { | 67 bool JavascriptSignalStrategy::SendStanza(buzz::XmlElement* stanza) { |
| 72 DCHECK(CalledOnValidThread()); | 68 DCHECK(CalledOnValidThread()); |
| 73 xmpp_proxy_->SendIq(stanza->Str()); | 69 xmpp_proxy_->SendIq(stanza->Str()); |
| 74 delete stanza; | 70 delete stanza; |
| 75 return true; | 71 return true; |
| 76 } | 72 } |
| 77 | 73 |
| 78 std::string JavascriptSignalStrategy::GetNextId() { | 74 std::string JavascriptSignalStrategy::GetNextId() { |
| 79 DCHECK(CalledOnValidThread()); | 75 DCHECK(CalledOnValidThread()); |
| 80 ++last_id_; | 76 ++last_id_; |
| 81 return base::IntToString(last_id_); | 77 return base::IntToString(last_id_); |
| 82 } | 78 } |
| 83 | 79 |
| 84 void JavascriptSignalStrategy::OnIq(const std::string& stanza_str) { | 80 void JavascriptSignalStrategy::OnIq(const std::string& stanza_str) { |
| 85 DCHECK(CalledOnValidThread()); | 81 DCHECK(CalledOnValidThread()); |
| 86 scoped_ptr<buzz::XmlElement> stanza(buzz::XmlElement::ForStr(stanza_str)); | 82 scoped_ptr<buzz::XmlElement> stanza(buzz::XmlElement::ForStr(stanza_str)); |
| 87 if (!stanza.get()) { | 83 if (!stanza.get()) { |
| 88 LOG(WARNING) << "Malformed XMPP stanza received: " << stanza_str; | 84 LOG(WARNING) << "Malformed XMPP stanza received: " << stanza_str; |
| 89 return; | 85 return; |
| 90 } | 86 } |
| 91 | 87 |
| 92 for (std::vector<Listener*>::iterator it = listeners_.begin(); | 88 ObserverListBase<Listener>::Iterator it(listeners_); |
| 93 it != listeners_.end(); ++it) { | 89 Listener* listener; |
| 94 if ((*it)->OnIncomingStanza(stanza.get())) | 90 while ((listener = it.GetNext()) != NULL) { |
| 91 if (listener->OnSignalStrategyIncomingStanza(stanza.get())) | |
| 95 break; | 92 break; |
| 96 } | 93 } |
| 97 } | 94 } |
| 98 | 95 |
| 99 } // namespace remoting | 96 } // namespace remoting |
| OLD | NEW |