Chromium Code Reviews| 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; |
| } |