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

Side by Side Diff: remoting/protocol/pepper_session.cc

Issue 9325036: Add abstract interfaces for the transport layer. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: fix crash Created 8 years, 10 months 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
« no previous file with comments | « remoting/protocol/pepper_session.h ('k') | remoting/protocol/pepper_session_manager.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 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/protocol/pepper_session.h" 5 #include "remoting/protocol/pepper_session.h"
6 6
7 #include "base/bind.h" 7 #include "base/bind.h"
8 #include "base/rand_util.h" 8 #include "base/rand_util.h"
9 #include "base/stl_util.h" 9 #include "base/stl_util.h"
10 #include "base/string_number_conversions.h" 10 #include "base/string_number_conversions.h"
11 #include "remoting/base/constants.h" 11 #include "remoting/base/constants.h"
12 #include "remoting/jingle_glue/iq_sender.h" 12 #include "remoting/jingle_glue/iq_sender.h"
13 #include "remoting/protocol/authenticator.h" 13 #include "remoting/protocol/authenticator.h"
14 #include "remoting/protocol/channel_authenticator.h"
14 #include "remoting/protocol/content_description.h" 15 #include "remoting/protocol/content_description.h"
15 #include "remoting/protocol/jingle_messages.h" 16 #include "remoting/protocol/jingle_messages.h"
16 #include "remoting/protocol/pepper_session_manager.h" 17 #include "remoting/protocol/pepper_session_manager.h"
17 #include "remoting/protocol/pepper_stream_channel.h"
18 #include "third_party/libjingle/source/talk/p2p/base/candidate.h" 18 #include "third_party/libjingle/source/talk/p2p/base/candidate.h"
19 #include "third_party/libjingle/source/talk/xmllite/xmlelement.h" 19 #include "third_party/libjingle/source/talk/xmllite/xmlelement.h"
20 20
21 using buzz::XmlElement; 21 using buzz::XmlElement;
22 22
23 namespace remoting { 23 namespace remoting {
24 namespace protocol { 24 namespace protocol {
25 25
26 namespace { 26 namespace {
27 // Delay after candidate creation before sending transport-info 27 // Delay after candidate creation before sending transport-info
(...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after
114 CloseInternal(true); 114 CloseInternal(true);
115 } 115 }
116 116
117 void PepperSession::CreateStreamChannel( 117 void PepperSession::CreateStreamChannel(
118 const std::string& name, 118 const std::string& name,
119 const StreamChannelCallback& callback) { 119 const StreamChannelCallback& callback) {
120 DCHECK(!channels_[name]); 120 DCHECK(!channels_[name]);
121 121
122 scoped_ptr<ChannelAuthenticator> channel_authenticator = 122 scoped_ptr<ChannelAuthenticator> channel_authenticator =
123 authenticator_->CreateChannelAuthenticator(); 123 authenticator_->CreateChannelAuthenticator();
124 PepperStreamChannel* channel = new PepperStreamChannel( 124 scoped_ptr<StreamTransport> channel =
125 this, name, callback); 125 session_manager_->transport_factory_->CreateStreamTransport();
126 channels_[name] = channel; 126 channel->Initialize(name, session_manager_->transport_config_,
127 channel->Connect(session_manager_->pp_instance_, 127 this, channel_authenticator.Pass());
128 session_manager_->transport_config_, 128 channel->Connect(callback);
129 channel_authenticator.Pass()); 129 channels_[name] = channel.release();
130 } 130 }
131 131
132 void PepperSession::CreateDatagramChannel( 132 void PepperSession::CreateDatagramChannel(
133 const std::string& name, 133 const std::string& name,
134 const DatagramChannelCallback& callback) { 134 const DatagramChannelCallback& callback) {
135 // TODO(sergeyu): Implement datagram channel support. 135 DCHECK(!channels_[name]);
136 NOTREACHED(); 136
137 scoped_ptr<ChannelAuthenticator> channel_authenticator =
138 authenticator_->CreateChannelAuthenticator();
139 scoped_ptr<DatagramTransport> channel =
140 session_manager_->transport_factory_->CreateDatagramTransport();
141 channel->Initialize(name, session_manager_->transport_config_,
142 this, channel_authenticator.Pass());
143 channel->Connect(callback);
144 channels_[name] = channel.release();
137 } 145 }
138 146
139 void PepperSession::CancelChannelCreation(const std::string& name) { 147 void PepperSession::CancelChannelCreation(const std::string& name) {
140 ChannelsMap::iterator it = channels_.find(name); 148 ChannelsMap::iterator it = channels_.find(name);
141 if (it != channels_.end() && !it->second->is_connected()) { 149 if (it != channels_.end() && !it->second->is_connected()) {
142 delete it->second; 150 delete it->second;
143 DCHECK(!channels_[name]); 151 DCHECK(!channels_[name]);
144 } 152 }
145 } 153 }
146 154
(...skipping 26 matching lines...) Expand all
173 JingleMessage message(peer_jid_, JingleMessage::SESSION_TERMINATE, 181 JingleMessage message(peer_jid_, JingleMessage::SESSION_TERMINATE,
174 session_id_); 182 session_id_);
175 scoped_ptr<IqRequest> terminate_request( 183 scoped_ptr<IqRequest> terminate_request(
176 session_manager_->iq_sender()->SendIq( 184 session_manager_->iq_sender()->SendIq(
177 message.ToXml(), IqSender::ReplyCallback())); 185 message.ToXml(), IqSender::ReplyCallback()));
178 } 186 }
179 187
180 CloseInternal(false); 188 CloseInternal(false);
181 } 189 }
182 190
191 void PepperSession::OnTransportCandidate(Transport* transport,
192 const cricket::Candidate& candidate) {
193 pending_candidates_.push_back(candidate);
194
195 if (!transport_infos_timer_.IsRunning()) {
196 // Delay sending the new candidates in case we get more candidates
197 // that we can send in one message.
198 transport_infos_timer_.Start(
199 FROM_HERE, base::TimeDelta::FromMilliseconds(kTransportInfoSendDelayMs),
200 this, &PepperSession::SendTransportInfo);
201 }
202 }
203
204 void PepperSession::OnTransportDeleted(Transport* transport) {
205 ChannelsMap::iterator it = channels_.find(transport->name());
206 DCHECK_EQ(it->second, transport);
207 channels_.erase(it);
208 }
209
183 void PepperSession::OnIncomingMessage(const JingleMessage& message, 210 void PepperSession::OnIncomingMessage(const JingleMessage& message,
184 JingleMessageReply* reply) { 211 JingleMessageReply* reply) {
185 DCHECK(CalledOnValidThread()); 212 DCHECK(CalledOnValidThread());
186 213
187 if (message.from != peer_jid_) { 214 if (message.from != peer_jid_) {
188 // Ignore messages received from a different Jid. 215 // Ignore messages received from a different Jid.
189 *reply = JingleMessageReply(JingleMessageReply::INVALID_SID); 216 *reply = JingleMessageReply(JingleMessageReply::INVALID_SID);
190 return; 217 return;
191 } 218 }
192 219
(...skipping 174 matching lines...) Expand 10 before | Expand all | Expand 10 after
367 void PepperSession::OnSessionInfoResponse(const buzz::XmlElement* response) { 394 void PepperSession::OnSessionInfoResponse(const buzz::XmlElement* response) {
368 const std::string& type = response->Attr(buzz::QName("", "type")); 395 const std::string& type = response->Attr(buzz::QName("", "type"));
369 if (type != "result") { 396 if (type != "result") {
370 LOG(ERROR) << "Received error in response to session-info message: \"" 397 LOG(ERROR) << "Received error in response to session-info message: \""
371 << response->Str() 398 << response->Str()
372 << "\". Terminating the session."; 399 << "\". Terminating the session.";
373 OnError(INCOMPATIBLE_PROTOCOL); 400 OnError(INCOMPATIBLE_PROTOCOL);
374 } 401 }
375 } 402 }
376 403
377 void PepperSession::AddLocalCandidate(const cricket::Candidate& candidate) {
378 pending_candidates_.push_back(candidate);
379
380 if (!transport_infos_timer_.IsRunning()) {
381 // Delay sending the new candidates in case we get more candidates
382 // that we can send in one message.
383 transport_infos_timer_.Start(
384 FROM_HERE, base::TimeDelta::FromMilliseconds(kTransportInfoSendDelayMs),
385 this, &PepperSession::SendTransportInfo);
386 }
387 }
388
389 void PepperSession::OnTransportInfoResponse(const buzz::XmlElement* response) { 404 void PepperSession::OnTransportInfoResponse(const buzz::XmlElement* response) {
390 const std::string& type = response->Attr(buzz::QName("", "type")); 405 const std::string& type = response->Attr(buzz::QName("", "type"));
391 if (type != "result") { 406 if (type != "result") {
392 LOG(ERROR) << "Received error in response to session-initiate message: \"" 407 LOG(ERROR) << "Received error in response to session-initiate message: \""
393 << response->Str() 408 << response->Str()
394 << "\". Terminating the session."; 409 << "\". Terminating the session.";
395 410
396 if (state_ == CONNECTING) { 411 if (state_ == CONNECTING) {
397 OnError(PEER_IS_OFFLINE); 412 OnError(PEER_IS_OFFLINE);
398 } else { 413 } else {
399 // Host has disconnected without sending session-terminate message. 414 // Host has disconnected without sending session-terminate message.
400 CloseInternal(false); 415 CloseInternal(false);
401 } 416 }
402 } 417 }
403 } 418 }
404 419
405 void PepperSession::OnDeleteChannel(PepperChannel* channel) {
406 ChannelsMap::iterator it = channels_.find(channel->name());
407 DCHECK_EQ(it->second, channel);
408 channels_.erase(it);
409 }
410
411 void PepperSession::SendTransportInfo() { 420 void PepperSession::SendTransportInfo() {
412 JingleMessage message(peer_jid_, JingleMessage::TRANSPORT_INFO, session_id_); 421 JingleMessage message(peer_jid_, JingleMessage::TRANSPORT_INFO, session_id_);
413 message.candidates.swap(pending_candidates_); 422 message.candidates.swap(pending_candidates_);
414 transport_info_request_.reset(session_manager_->iq_sender()->SendIq( 423 transport_info_request_.reset(session_manager_->iq_sender()->SendIq(
415 message.ToXml(), base::Bind( 424 message.ToXml(), base::Bind(
416 &PepperSession::OnTransportInfoResponse, 425 &PepperSession::OnTransportInfoResponse,
417 base::Unretained(this)))); 426 base::Unretained(this))));
418 } 427 }
419 428
420 429
(...skipping 16 matching lines...) Expand all
437 DCHECK_NE(state_, FAILED); 446 DCHECK_NE(state_, FAILED);
438 447
439 state_ = new_state; 448 state_ = new_state;
440 if (!state_change_callback_.is_null()) 449 if (!state_change_callback_.is_null())
441 state_change_callback_.Run(new_state); 450 state_change_callback_.Run(new_state);
442 } 451 }
443 } 452 }
444 453
445 } // namespace protocol 454 } // namespace protocol
446 } // namespace remoting 455 } // namespace remoting
OLDNEW
« no previous file with comments | « remoting/protocol/pepper_session.h ('k') | remoting/protocol/pepper_session_manager.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698