Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(515)

Side by Side Diff: remoting/jingle_glue/javascript_signal_strategy.cc

Issue 9005034: Refactor SignalStrategy so that it can be reused for multiple connections. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: - Created 9 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698