Index: remoting/protocol/jingle_session.cc |
diff --git a/remoting/protocol/jingle_session.cc b/remoting/protocol/jingle_session.cc |
index b510ae8ae434e8974a8212c4bd4f56fb224aa863..44ee8726799a6e1aaa6a0a24e1716141f8065ffb 100644 |
--- a/remoting/protocol/jingle_session.cc |
+++ b/remoting/protocol/jingle_session.cc |
@@ -82,7 +82,7 @@ void JingleSession::Init(cricket::Session* cricket_session) { |
this, &JingleSession::OnSessionError); |
} |
-void JingleSession::CloseInternal(int result, bool failed) { |
+void JingleSession::CloseInternal(int result, Error error) { |
DCHECK(CalledOnValidThread()); |
if (state_ != FAILED && state_ != CLOSED && !closing_) { |
@@ -95,17 +95,36 @@ void JingleSession::CloseInternal(int result, bool failed) { |
// Tear down the cricket session, including the cricket transport channels. |
if (cricket_session_) { |
- cricket_session_->Terminate(); |
+ std::string reason; |
+ switch (error) { |
+ case OK: |
+ reason = cricket::STR_TERMINATE_SUCCESS; |
+ break; |
+ case PEER_IS_OFFLINE: |
+ reason = cricket::STR_TERMINATE_ERROR; |
+ break; |
+ case SESSION_REJECTED: |
+ reason = cricket::STR_TERMINATE_DECLINE; |
+ break; |
+ case INCOMPATIBLE_PROTOCOL: |
+ reason = cricket::STR_TERMINATE_INCOMPATIBLE_PARAMETERS; |
+ break; |
+ case CHANNEL_CONNECTION_ERROR: |
Wez
2011/11/11 23:10:09
Would it make more sense to have a default: case f
Sergey Ulanov
2011/11/12 00:02:52
Done.
|
+ reason = cricket::STR_TERMINATE_ERROR; |
+ break; |
+ } |
+ cricket_session_->TerminateWithReason(reason); |
cricket_session_->SignalState.disconnect(this); |
} |
// Inform the StateChangeCallback, so calling code knows not to |
// touch any channels. Needs to be done in the end because the |
// session may be deleted in response to this event. |
- if (failed) |
+ if (error != OK) { |
SetState(FAILED); |
- else |
+ } else { |
SetState(CLOSED); |
+ } |
} |
} |
@@ -236,7 +255,7 @@ const std::string& JingleSession::shared_secret() { |
void JingleSession::Close() { |
DCHECK(CalledOnValidThread()); |
- CloseInternal(net::ERR_CONNECTION_CLOSED, false); |
+ CloseInternal(net::ERR_CONNECTION_CLOSED, OK); |
} |
void JingleSession::OnSessionState( |
@@ -284,7 +303,8 @@ void JingleSession::OnSessionError( |
DCHECK_EQ(cricket_session_, session); |
if (error != cricket::Session::ERROR_NONE) { |
- CloseInternal(net::ERR_CONNECTION_ABORTED, true); |
+ // TODO(sergeyu): Report different errors depending on |error|. |
+ CloseInternal(net::ERR_CONNECTION_ABORTED, CHANNEL_CONNECTION_ERROR); |
} |
} |
@@ -357,7 +377,7 @@ void JingleSession::OnAccept() { |
if (cricket_session_->initiator()) { |
if (!InitializeConfigFromDescription( |
cricket_session_->remote_description())) { |
- CloseInternal(net::ERR_CONNECTION_FAILED, true); |
+ CloseInternal(net::ERR_CONNECTION_FAILED, INCOMPATIBLE_PROTOCOL); |
return; |
} |
} |
@@ -369,7 +389,7 @@ void JingleSession::OnAccept() { |
void JingleSession::OnTerminate() { |
DCHECK(CalledOnValidThread()); |
- CloseInternal(net::ERR_CONNECTION_ABORTED, false); |
+ CloseInternal(net::ERR_CONNECTION_ABORTED, OK); |
} |
void JingleSession::AcceptConnection() { |
@@ -434,7 +454,7 @@ void JingleSession::OnChannelConnected( |
if (!socket) { |
LOG(ERROR) << "Failed to connect control or events channel. " |
<< "Terminating connection"; |
- CloseInternal(net::ERR_CONNECTION_CLOSED, true); |
+ CloseInternal(net::ERR_CONNECTION_CLOSED, CHANNEL_CONNECTION_ERROR); |
return; |
} |