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

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

Issue 1545743002: Move ownership of Transport out of Session. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@move_not_pass_client
Patch Set: Created 4 years, 12 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
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/jingle_session.h" 5 #include "remoting/protocol/jingle_session.h"
6 6
7 #include <stdint.h> 7 #include <stdint.h>
8 8
9 #include <limits> 9 #include <limits>
10 10
11 #include "base/bind.h" 11 #include "base/bind.h"
12 #include "base/rand_util.h" 12 #include "base/rand_util.h"
13 #include "base/single_thread_task_runner.h" 13 #include "base/single_thread_task_runner.h"
14 #include "base/stl_util.h" 14 #include "base/stl_util.h"
15 #include "base/strings/string_number_conversions.h" 15 #include "base/strings/string_number_conversions.h"
16 #include "base/thread_task_runner_handle.h" 16 #include "base/thread_task_runner_handle.h"
17 #include "base/time/time.h" 17 #include "base/time/time.h"
18 #include "remoting/base/constants.h" 18 #include "remoting/base/constants.h"
19 #include "remoting/protocol/authenticator.h" 19 #include "remoting/protocol/authenticator.h"
20 #include "remoting/protocol/content_description.h" 20 #include "remoting/protocol/content_description.h"
21 #include "remoting/protocol/jingle_messages.h" 21 #include "remoting/protocol/jingle_messages.h"
22 #include "remoting/protocol/jingle_session_manager.h" 22 #include "remoting/protocol/jingle_session_manager.h"
23 #include "remoting/protocol/session_config.h" 23 #include "remoting/protocol/session_config.h"
24 #include "remoting/protocol/transport.h"
24 #include "remoting/signaling/iq_sender.h" 25 #include "remoting/signaling/iq_sender.h"
25 #include "third_party/webrtc/libjingle/xmllite/xmlelement.h" 26 #include "third_party/webrtc/libjingle/xmllite/xmlelement.h"
26 #include "third_party/webrtc/p2p/base/candidate.h" 27 #include "third_party/webrtc/p2p/base/candidate.h"
27 28
28 using buzz::XmlElement; 29 using buzz::XmlElement;
29 30
30 namespace remoting { 31 namespace remoting {
31 namespace protocol { 32 namespace protocol {
32 33
33 namespace { 34 namespace {
(...skipping 27 matching lines...) Expand all
61 62
62 JingleSession::JingleSession(JingleSessionManager* session_manager) 63 JingleSession::JingleSession(JingleSessionManager* session_manager)
63 : session_manager_(session_manager), 64 : session_manager_(session_manager),
64 event_handler_(nullptr), 65 event_handler_(nullptr),
65 state_(INITIALIZING), 66 state_(INITIALIZING),
66 error_(OK), 67 error_(OK),
67 weak_factory_(this) { 68 weak_factory_(this) {
68 } 69 }
69 70
70 JingleSession::~JingleSession() { 71 JingleSession::~JingleSession() {
71 transport_.reset();
72
73 STLDeleteContainerPointers(pending_requests_.begin(), 72 STLDeleteContainerPointers(pending_requests_.begin(),
74 pending_requests_.end()); 73 pending_requests_.end());
75 STLDeleteContainerPointers(transport_info_requests_.begin(), 74 STLDeleteContainerPointers(transport_info_requests_.begin(),
76 transport_info_requests_.end()); 75 transport_info_requests_.end());
77 76
78 session_manager_->SessionDestroyed(this); 77 session_manager_->SessionDestroyed(this);
79 } 78 }
80 79
81 void JingleSession::SetEventHandler(Session::EventHandler* event_handler) { 80 void JingleSession::SetEventHandler(Session::EventHandler* event_handler) {
82 DCHECK(CalledOnValidThread()); 81 DCHECK(thread_checker_.CalledOnValidThread());
83 DCHECK(event_handler); 82 DCHECK(event_handler);
84 event_handler_ = event_handler; 83 event_handler_ = event_handler;
85 } 84 }
86 85
87 ErrorCode JingleSession::error() { 86 ErrorCode JingleSession::error() {
88 DCHECK(CalledOnValidThread()); 87 DCHECK(thread_checker_.CalledOnValidThread());
89 return error_; 88 return error_;
90 } 89 }
91 90
92 void JingleSession::StartConnection(const std::string& peer_jid, 91 void JingleSession::StartConnection(const std::string& peer_jid,
93 scoped_ptr<Authenticator> authenticator) { 92 scoped_ptr<Authenticator> authenticator) {
94 DCHECK(CalledOnValidThread()); 93 DCHECK(thread_checker_.CalledOnValidThread());
95 DCHECK(authenticator.get()); 94 DCHECK(authenticator.get());
96 DCHECK_EQ(authenticator->state(), Authenticator::MESSAGE_READY); 95 DCHECK_EQ(authenticator->state(), Authenticator::MESSAGE_READY);
97 96
98 peer_jid_ = peer_jid; 97 peer_jid_ = peer_jid;
99 authenticator_ = std::move(authenticator); 98 authenticator_ = std::move(authenticator);
100 99
101 // Generate random session ID. There are usually not more than 1 100 // Generate random session ID. There are usually not more than 1
102 // concurrent session per host, so a random 64-bit integer provides 101 // concurrent session per host, so a random 64-bit integer provides
103 // enough entropy. In the worst case connection will fail when two 102 // enough entropy. In the worst case connection will fail when two
104 // clients generate the same session ID concurrently. 103 // clients generate the same session ID concurrently.
105 session_id_ = base::Uint64ToString( 104 session_id_ = base::Uint64ToString(
106 base::RandGenerator(std::numeric_limits<uint64_t>::max())); 105 base::RandGenerator(std::numeric_limits<uint64_t>::max()));
107 106
108 transport_ = session_manager_->transport_factory_->CreateTransport();
109
110 // Send session-initiate message. 107 // Send session-initiate message.
111 JingleMessage message(peer_jid_, JingleMessage::SESSION_INITIATE, 108 JingleMessage message(peer_jid_, JingleMessage::SESSION_INITIATE,
112 session_id_); 109 session_id_);
113 message.initiator = session_manager_->signal_strategy_->GetLocalJid(); 110 message.initiator = session_manager_->signal_strategy_->GetLocalJid();
114 message.description.reset(new ContentDescription( 111 message.description.reset(new ContentDescription(
115 session_manager_->protocol_config_->Clone(), 112 session_manager_->protocol_config_->Clone(),
116 authenticator_->GetNextMessage())); 113 authenticator_->GetNextMessage()));
117 SendMessage(message); 114 SendMessage(message);
118 115
119 SetState(CONNECTING); 116 SetState(CONNECTING);
120 } 117 }
121 118
122 void JingleSession::InitializeIncomingConnection( 119 void JingleSession::InitializeIncomingConnection(
123 const JingleMessage& initiate_message, 120 const JingleMessage& initiate_message,
124 scoped_ptr<Authenticator> authenticator) { 121 scoped_ptr<Authenticator> authenticator) {
125 DCHECK(CalledOnValidThread()); 122 DCHECK(thread_checker_.CalledOnValidThread());
126 DCHECK(initiate_message.description.get()); 123 DCHECK(initiate_message.description.get());
127 DCHECK(authenticator.get()); 124 DCHECK(authenticator.get());
128 DCHECK_EQ(authenticator->state(), Authenticator::WAITING_MESSAGE); 125 DCHECK_EQ(authenticator->state(), Authenticator::WAITING_MESSAGE);
129 126
130 peer_jid_ = initiate_message.from; 127 peer_jid_ = initiate_message.from;
131 authenticator_ = std::move(authenticator); 128 authenticator_ = std::move(authenticator);
132 session_id_ = initiate_message.sid; 129 session_id_ = initiate_message.sid;
133 130
134 SetState(ACCEPTING); 131 SetState(ACCEPTING);
135 132
136 config_ = 133 config_ =
137 SessionConfig::SelectCommon(initiate_message.description->config(), 134 SessionConfig::SelectCommon(initiate_message.description->config(),
138 session_manager_->protocol_config_.get()); 135 session_manager_->protocol_config_.get());
139 if (!config_) { 136 if (!config_) {
140 LOG(WARNING) << "Rejecting connection from " << peer_jid_ 137 LOG(WARNING) << "Rejecting connection from " << peer_jid_
141 << " because no compatible configuration has been found."; 138 << " because no compatible configuration has been found.";
142 Close(INCOMPATIBLE_PROTOCOL); 139 Close(INCOMPATIBLE_PROTOCOL);
143 return; 140 return;
144 } 141 }
145
146 transport_ = session_manager_->transport_factory_->CreateTransport();
147 } 142 }
148 143
149 void JingleSession::AcceptIncomingConnection( 144 void JingleSession::AcceptIncomingConnection(
150 const JingleMessage& initiate_message) { 145 const JingleMessage& initiate_message) {
151 DCHECK(config_); 146 DCHECK(config_);
152 147
153 // Process the first authentication message. 148 // Process the first authentication message.
154 const buzz::XmlElement* first_auth_message = 149 const buzz::XmlElement* first_auth_message =
155 initiate_message.description->authenticator_message(); 150 initiate_message.description->authenticator_message();
156 151
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after
192 OnAuthenticated(); 187 OnAuthenticated();
193 } else { 188 } else {
194 DCHECK_EQ(authenticator_->state(), Authenticator::WAITING_MESSAGE); 189 DCHECK_EQ(authenticator_->state(), Authenticator::WAITING_MESSAGE);
195 if (authenticator_->started()) { 190 if (authenticator_->started()) {
196 SetState(AUTHENTICATING); 191 SetState(AUTHENTICATING);
197 } 192 }
198 } 193 }
199 } 194 }
200 195
201 const std::string& JingleSession::jid() { 196 const std::string& JingleSession::jid() {
202 DCHECK(CalledOnValidThread()); 197 DCHECK(thread_checker_.CalledOnValidThread());
203 return peer_jid_; 198 return peer_jid_;
204 } 199 }
205 200
206 const SessionConfig& JingleSession::config() { 201 const SessionConfig& JingleSession::config() {
207 DCHECK(CalledOnValidThread()); 202 DCHECK(thread_checker_.CalledOnValidThread());
208 return *config_; 203 return *config_;
209 } 204 }
210 205
211 Transport* JingleSession::GetTransport() { 206 void JingleSession::SetTransport(Transport* transport) {
212 DCHECK(CalledOnValidThread()); 207 DCHECK(thread_checker_.CalledOnValidThread());
213 return transport_.get(); 208 DCHECK(!transport_);
209 DCHECK(transport);
210 transport_ = transport;
211 }
212
213 void JingleSession::SendTransportInfo(
214 scoped_ptr<buzz::XmlElement> transport_info) {
215 DCHECK(thread_checker_.CalledOnValidThread());
216 DCHECK_EQ(state_, AUTHENTICATED);
217
218 JingleMessage message(peer_jid_, JingleMessage::TRANSPORT_INFO, session_id_);
219 message.transport_info = std::move(transport_info);
220
221 scoped_ptr<IqRequest> request = session_manager_->iq_sender()->SendIq(
222 message.ToXml(), base::Bind(&JingleSession::OnTransportInfoResponse,
223 base::Unretained(this)));
224 if (request) {
225 request->SetTimeout(base::TimeDelta::FromSeconds(kTransportInfoTimeout));
226 transport_info_requests_.push_back(request.release());
227 } else {
228 LOG(ERROR) << "Failed to send a transport-info message";
229 }
214 } 230 }
215 231
216 void JingleSession::Close(protocol::ErrorCode error) { 232 void JingleSession::Close(protocol::ErrorCode error) {
217 DCHECK(CalledOnValidThread()); 233 DCHECK(thread_checker_.CalledOnValidThread());
218
219 transport_.reset();
220 234
221 if (is_session_active()) { 235 if (is_session_active()) {
222 // Send session-terminate message with the appropriate error code. 236 // Send session-terminate message with the appropriate error code.
223 JingleMessage::Reason reason; 237 JingleMessage::Reason reason;
224 switch (error) { 238 switch (error) {
225 case OK: 239 case OK:
226 reason = JingleMessage::SUCCESS; 240 reason = JingleMessage::SUCCESS;
227 break; 241 break;
228 case SESSION_REJECTED: 242 case SESSION_REJECTED:
229 case AUTHENTICATION_FAILED: 243 case AUTHENTICATION_FAILED:
(...skipping 26 matching lines...) Expand all
256 if (state_ != FAILED && state_ != CLOSED) { 270 if (state_ != FAILED && state_ != CLOSED) {
257 if (error != OK) { 271 if (error != OK) {
258 SetState(FAILED); 272 SetState(FAILED);
259 } else { 273 } else {
260 SetState(CLOSED); 274 SetState(CLOSED);
261 } 275 }
262 } 276 }
263 } 277 }
264 278
265 void JingleSession::SendMessage(const JingleMessage& message) { 279 void JingleSession::SendMessage(const JingleMessage& message) {
266 DCHECK(CalledOnValidThread()); 280 DCHECK(thread_checker_.CalledOnValidThread());
267 281
268 scoped_ptr<IqRequest> request = session_manager_->iq_sender()->SendIq( 282 scoped_ptr<IqRequest> request = session_manager_->iq_sender()->SendIq(
269 message.ToXml(), 283 message.ToXml(),
270 base::Bind(&JingleSession::OnMessageResponse, 284 base::Bind(&JingleSession::OnMessageResponse,
271 base::Unretained(this), 285 base::Unretained(this),
272 message.action)); 286 message.action));
273 287
274 int timeout = kDefaultMessageTimeout; 288 int timeout = kDefaultMessageTimeout;
275 if (message.action == JingleMessage::SESSION_INITIATE || 289 if (message.action == JingleMessage::SESSION_INITIATE ||
276 message.action == JingleMessage::SESSION_ACCEPT) { 290 message.action == JingleMessage::SESSION_ACCEPT) {
277 timeout = kSessionInitiateAndAcceptTimeout; 291 timeout = kSessionInitiateAndAcceptTimeout;
278 } 292 }
279 if (request) { 293 if (request) {
280 request->SetTimeout(base::TimeDelta::FromSeconds(timeout)); 294 request->SetTimeout(base::TimeDelta::FromSeconds(timeout));
281 pending_requests_.insert(request.release()); 295 pending_requests_.insert(request.release());
282 } else { 296 } else {
283 LOG(ERROR) << "Failed to send a " 297 LOG(ERROR) << "Failed to send a "
284 << JingleMessage::GetActionName(message.action) << " message"; 298 << JingleMessage::GetActionName(message.action) << " message";
285 } 299 }
286 } 300 }
287 301
288 void JingleSession::OnMessageResponse( 302 void JingleSession::OnMessageResponse(
289 JingleMessage::ActionType request_type, 303 JingleMessage::ActionType request_type,
290 IqRequest* request, 304 IqRequest* request,
291 const buzz::XmlElement* response) { 305 const buzz::XmlElement* response) {
292 DCHECK(CalledOnValidThread()); 306 DCHECK(thread_checker_.CalledOnValidThread());
293 307
294 // Delete the request from the list of pending requests. 308 // Delete the request from the list of pending requests.
295 pending_requests_.erase(request); 309 pending_requests_.erase(request);
296 delete request; 310 delete request;
297 311
298 // Ignore all responses after session was closed. 312 // Ignore all responses after session was closed.
299 if (state_ == CLOSED || state_ == FAILED) 313 if (state_ == CLOSED || state_ == FAILED)
300 return; 314 return;
301 315
302 std::string type_str = JingleMessage::GetActionName(request_type); 316 std::string type_str = JingleMessage::GetActionName(request_type);
(...skipping 11 matching lines...) Expand all
314 << " message: \"" << response->Str() 328 << " message: \"" << response->Str()
315 << "\". Terminating the session."; 329 << "\". Terminating the session.";
316 330
317 // TODO(sergeyu): There may be different reasons for error 331 // TODO(sergeyu): There may be different reasons for error
318 // here. Parse the response stanza to find failure reason. 332 // here. Parse the response stanza to find failure reason.
319 Close(PEER_IS_OFFLINE); 333 Close(PEER_IS_OFFLINE);
320 } 334 }
321 } 335 }
322 } 336 }
323 337
324 void JingleSession::OnOutgoingTransportInfo(
325 scoped_ptr<XmlElement> transport_info) {
326 DCHECK(CalledOnValidThread());
327
328 JingleMessage message(peer_jid_, JingleMessage::TRANSPORT_INFO, session_id_);
329 message.transport_info = std::move(transport_info);
330
331 scoped_ptr<IqRequest> request = session_manager_->iq_sender()->SendIq(
332 message.ToXml(), base::Bind(&JingleSession::OnTransportInfoResponse,
333 base::Unretained(this)));
334 if (request) {
335 request->SetTimeout(base::TimeDelta::FromSeconds(kTransportInfoTimeout));
336 transport_info_requests_.push_back(request.release());
337 } else {
338 LOG(ERROR) << "Failed to send a transport-info message";
339 }
340 }
341
342 void JingleSession::OnTransportRouteChange(const std::string& channel_name,
343 const TransportRoute& route) {
344 DCHECK(CalledOnValidThread());
345
346 event_handler_->OnSessionRouteChange(channel_name, route);
347 }
348
349 void JingleSession::OnTransportConnected() {
350 DCHECK(CalledOnValidThread());
351 DCHECK_EQ(state_, AUTHENTICATED);
352 SetState(CONNECTED);
353 }
354
355 void JingleSession::OnTransportError(ErrorCode error) {
356 DCHECK(CalledOnValidThread());
357
358 Close(error);
359 }
360
361 void JingleSession::OnTransportInfoResponse(IqRequest* request, 338 void JingleSession::OnTransportInfoResponse(IqRequest* request,
362 const buzz::XmlElement* response) { 339 const buzz::XmlElement* response) {
363 DCHECK(CalledOnValidThread()); 340 DCHECK(thread_checker_.CalledOnValidThread());
364 DCHECK(!transport_info_requests_.empty()); 341 DCHECK(!transport_info_requests_.empty());
365 342
366 // Consider transport-info requests sent before this one lost and delete 343 // Consider transport-info requests sent before this one lost and delete
367 // corresponding IqRequest objects. 344 // corresponding IqRequest objects.
368 while (transport_info_requests_.front() != request) { 345 while (transport_info_requests_.front() != request) {
369 delete transport_info_requests_.front(); 346 delete transport_info_requests_.front();
370 transport_info_requests_.pop_front(); 347 transport_info_requests_.pop_front();
371 } 348 }
372 349
373 // Delete the |request| itself. 350 // Delete the |request| itself.
(...skipping 10 matching lines...) Expand all
384 const std::string& type = response->Attr(buzz::QName(std::string(), "type")); 361 const std::string& type = response->Attr(buzz::QName(std::string(), "type"));
385 if (type != "result") { 362 if (type != "result") {
386 LOG(ERROR) << "Received error in response to transport-info message: \"" 363 LOG(ERROR) << "Received error in response to transport-info message: \""
387 << response->Str() << "\". Terminating the session."; 364 << response->Str() << "\". Terminating the session.";
388 Close(PEER_IS_OFFLINE); 365 Close(PEER_IS_OFFLINE);
389 } 366 }
390 } 367 }
391 368
392 void JingleSession::OnIncomingMessage(const JingleMessage& message, 369 void JingleSession::OnIncomingMessage(const JingleMessage& message,
393 const ReplyCallback& reply_callback) { 370 const ReplyCallback& reply_callback) {
394 DCHECK(CalledOnValidThread()); 371 DCHECK(thread_checker_.CalledOnValidThread());
395 372
396 if (message.from != peer_jid_) { 373 if (message.from != peer_jid_) {
397 // Ignore messages received from a different Jid. 374 // Ignore messages received from a different Jid.
398 reply_callback.Run(JingleMessageReply::INVALID_SID); 375 reply_callback.Run(JingleMessageReply::INVALID_SID);
399 return; 376 return;
400 } 377 }
401 378
402 switch (message.action) { 379 switch (message.action) {
403 case JingleMessage::SESSION_ACCEPT: 380 case JingleMessage::SESSION_ACCEPT:
404 OnAccept(message, reply_callback); 381 OnAccept(message, reply_callback);
405 break; 382 break;
406 383
407 case JingleMessage::SESSION_INFO: 384 case JingleMessage::SESSION_INFO:
408 OnSessionInfo(message, reply_callback); 385 OnSessionInfo(message, reply_callback);
409 break; 386 break;
410 387
411 case JingleMessage::TRANSPORT_INFO: 388 case JingleMessage::TRANSPORT_INFO:
412 if (message.transport_info && 389 if (!transport_) {
413 transport_->ProcessTransportInfo(message.transport_info.get())) { 390 LOG(ERROR) << "Received unexpected transport-info message.";
414 reply_callback.Run(JingleMessageReply::NONE); 391 reply_callback.Run(JingleMessageReply::NONE);
415 } else { 392 return;
393 }
394
395 if (!message.transport_info ||
396 !transport_->ProcessTransportInfo(
397 message.transport_info.get())) {
416 reply_callback.Run(JingleMessageReply::BAD_REQUEST); 398 reply_callback.Run(JingleMessageReply::BAD_REQUEST);
399 return;
417 } 400 }
401
402 reply_callback.Run(JingleMessageReply::NONE);
418 break; 403 break;
419 404
420 case JingleMessage::SESSION_TERMINATE: 405 case JingleMessage::SESSION_TERMINATE:
421 OnTerminate(message, reply_callback); 406 OnTerminate(message, reply_callback);
422 break; 407 break;
423 408
424 default: 409 default:
425 reply_callback.Run(JingleMessageReply::UNEXPECTED_REQUEST); 410 reply_callback.Run(JingleMessageReply::UNEXPECTED_REQUEST);
426 } 411 }
427 } 412 }
(...skipping 107 matching lines...) Expand 10 before | Expand all | Expand 10 after
535 } 520 }
536 if (!session_manager_->protocol_config_->IsSupported(*config_)) { 521 if (!session_manager_->protocol_config_->IsSupported(*config_)) {
537 LOG(ERROR) << "session-accept specifies an invalid configuration"; 522 LOG(ERROR) << "session-accept specifies an invalid configuration";
538 return false; 523 return false;
539 } 524 }
540 525
541 return true; 526 return true;
542 } 527 }
543 528
544 void JingleSession::ProcessAuthenticationStep() { 529 void JingleSession::ProcessAuthenticationStep() {
545 DCHECK(CalledOnValidThread()); 530 DCHECK(thread_checker_.CalledOnValidThread());
546 DCHECK_NE(authenticator_->state(), Authenticator::PROCESSING_MESSAGE); 531 DCHECK_NE(authenticator_->state(), Authenticator::PROCESSING_MESSAGE);
547 532
548 if (state_ != ACCEPTED && state_ != AUTHENTICATING) { 533 if (state_ != ACCEPTED && state_ != AUTHENTICATING) {
549 DCHECK(state_ == FAILED || state_ == CLOSED); 534 DCHECK(state_ == FAILED || state_ == CLOSED);
550 // The remote host closed the connection while the authentication was being 535 // The remote host closed the connection while the authentication was being
551 // processed asynchronously, nothing to do. 536 // processed asynchronously, nothing to do.
552 return; 537 return;
553 } 538 }
554 539
555 if (authenticator_->state() == Authenticator::MESSAGE_READY) { 540 if (authenticator_->state() == Authenticator::MESSAGE_READY) {
(...skipping 21 matching lines...) Expand all
577 void JingleSession::ContinueAuthenticationStep() { 562 void JingleSession::ContinueAuthenticationStep() {
578 if (authenticator_->state() == Authenticator::ACCEPTED) { 563 if (authenticator_->state() == Authenticator::ACCEPTED) {
579 OnAuthenticated(); 564 OnAuthenticated();
580 } else if (authenticator_->state() == Authenticator::REJECTED) { 565 } else if (authenticator_->state() == Authenticator::REJECTED) {
581 Close(AuthRejectionReasonToErrorCode( 566 Close(AuthRejectionReasonToErrorCode(
582 authenticator_->rejection_reason())); 567 authenticator_->rejection_reason()));
583 } 568 }
584 } 569 }
585 570
586 void JingleSession::OnAuthenticated() { 571 void JingleSession::OnAuthenticated() {
587 transport_->Start(this, authenticator_.get()); 572 transport_->Start(authenticator_.get(),
573 base::Bind(&JingleSession::SendTransportInfo,
574 weak_factory_.GetWeakPtr()));
588 575
589 SetState(AUTHENTICATED); 576 SetState(AUTHENTICATED);
590 } 577 }
591 578
592 void JingleSession::SetState(State new_state) { 579 void JingleSession::SetState(State new_state) {
593 DCHECK(CalledOnValidThread()); 580 DCHECK(thread_checker_.CalledOnValidThread());
594 581
595 if (new_state != state_) { 582 if (new_state != state_) {
596 DCHECK_NE(state_, CLOSED); 583 DCHECK_NE(state_, CLOSED);
597 DCHECK_NE(state_, FAILED); 584 DCHECK_NE(state_, FAILED);
598 585
599 state_ = new_state; 586 state_ = new_state;
600 if (event_handler_) 587 if (event_handler_)
601 event_handler_->OnSessionStateChange(new_state); 588 event_handler_->OnSessionStateChange(new_state);
602 } 589 }
603 } 590 }
604 591
605 bool JingleSession::is_session_active() { 592 bool JingleSession::is_session_active() {
606 return state_ == CONNECTING || state_ == ACCEPTING || state_ == ACCEPTED || 593 return state_ == CONNECTING || state_ == ACCEPTING || state_ == ACCEPTED ||
607 state_ == AUTHENTICATING || state_ == AUTHENTICATED; 594 state_ == AUTHENTICATING || state_ == AUTHENTICATED;
608 } 595 }
609 596
610 } // namespace protocol 597 } // namespace protocol
611 } // namespace remoting 598 } // namespace remoting
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698