| Index: extensions/browser/api/cast_channel/cast_channel_api.cc
|
| diff --git a/extensions/browser/api/cast_channel/cast_channel_api.cc b/extensions/browser/api/cast_channel/cast_channel_api.cc
|
| index 8878a0c5c26fd3a439aad1ab2d5531530902e3c2..bf710534488da7b44e696a6f3529b2bdff86e9fd 100644
|
| --- a/extensions/browser/api/cast_channel/cast_channel_api.cc
|
| +++ b/extensions/browser/api/cast_channel/cast_channel_api.cc
|
| @@ -65,7 +65,7 @@ void FillChannelInfo(const CastSocket& socket, ChannelInfo* channel_info) {
|
|
|
| bool IsValidConnectInfoPort(const ConnectInfo& connect_info) {
|
| return connect_info.port > 0 && connect_info.port <
|
| - std::numeric_limits<unsigned short>::max();
|
| + std::numeric_limits<uint16_t>::max();
|
| }
|
|
|
| bool IsValidConnectInfoAuth(const ConnectInfo& connect_info) {
|
| @@ -162,7 +162,8 @@ CastSocket* CastChannelAsyncApiFunction::GetSocketOrCompleteWithError(
|
| int channel_id) {
|
| CastSocket* socket = GetSocket(channel_id);
|
| if (!socket) {
|
| - SetResultFromError(cast_channel::CHANNEL_ERROR_INVALID_CHANNEL_ID);
|
| + SetResultFromError(channel_id,
|
| + cast_channel::CHANNEL_ERROR_INVALID_CHANNEL_ID);
|
| AsyncWorkCompleted();
|
| }
|
| return socket;
|
| @@ -183,21 +184,24 @@ void CastChannelAsyncApiFunction::RemoveSocket(int channel_id) {
|
| manager_->Remove(extension_->id(), channel_id);
|
| }
|
|
|
| -void CastChannelAsyncApiFunction::SetResultFromSocket(int channel_id) {
|
| - CastSocket* socket = GetSocket(channel_id);
|
| - DCHECK(socket);
|
| +void CastChannelAsyncApiFunction::SetResultFromSocket(
|
| + const CastSocket& socket) {
|
| ChannelInfo channel_info;
|
| - FillChannelInfo(*socket, &channel_info);
|
| - error_ = socket->error_state();
|
| + FillChannelInfo(socket, &channel_info);
|
| + error_ = socket.error_state();
|
| SetResultFromChannelInfo(channel_info);
|
| }
|
|
|
| -void CastChannelAsyncApiFunction::SetResultFromError(ChannelError error) {
|
| +void CastChannelAsyncApiFunction::SetResultFromError(int channel_id,
|
| + ChannelError error) {
|
| ChannelInfo channel_info;
|
| - channel_info.channel_id = -1;
|
| + channel_info.channel_id = channel_id;
|
| channel_info.url = "";
|
| channel_info.ready_state = cast_channel::READY_STATE_CLOSED;
|
| channel_info.error_state = error;
|
| + channel_info.connect_info.ip_address = "";
|
| + channel_info.connect_info.port = 0;
|
| + channel_info.connect_info.auth = cast_channel::CHANNEL_AUTH_TYPE_SSL;
|
| SetResultFromChannelInfo(channel_info);
|
| error_ = error;
|
| }
|
| @@ -338,7 +342,13 @@ void CastChannelOpenFunction::AsyncWorkStart() {
|
| void CastChannelOpenFunction::OnOpen(int result) {
|
| DCHECK_CURRENTLY_ON(BrowserThread::IO);
|
| VLOG(1) << "Connect finished, OnOpen invoked.";
|
| - SetResultFromSocket(new_channel_id_);
|
| + CastSocket* socket = GetSocket(new_channel_id_);
|
| + if (!socket) {
|
| + SetResultFromError(new_channel_id_,
|
| + cast_channel::CHANNEL_ERROR_CONNECT_ERROR);
|
| + } else {
|
| + SetResultFromSocket(*socket);
|
| + }
|
| AsyncWorkCompleted();
|
| }
|
|
|
| @@ -382,10 +392,13 @@ void CastChannelSendFunction::AsyncWorkStart() {
|
|
|
| void CastChannelSendFunction::OnSend(int result) {
|
| DCHECK_CURRENTLY_ON(BrowserThread::IO);
|
| - if (result < 0) {
|
| - SetResultFromError(cast_channel::CHANNEL_ERROR_SOCKET_ERROR);
|
| + int channel_id = params_->channel.channel_id;
|
| + CastSocket* socket = GetSocket(channel_id);
|
| + if (result < 0 || !socket) {
|
| + SetResultFromError(channel_id,
|
| + cast_channel::CHANNEL_ERROR_SOCKET_ERROR);
|
| } else {
|
| - SetResultFromSocket(params_->channel.channel_id);
|
| + SetResultFromSocket(*socket);
|
| }
|
| AsyncWorkCompleted();
|
| }
|
| @@ -410,12 +423,16 @@ void CastChannelCloseFunction::AsyncWorkStart() {
|
| void CastChannelCloseFunction::OnClose(int result) {
|
| DCHECK_CURRENTLY_ON(BrowserThread::IO);
|
| VLOG(1) << "CastChannelCloseFunction::OnClose result = " << result;
|
| - if (result < 0) {
|
| - SetResultFromError(cast_channel::CHANNEL_ERROR_SOCKET_ERROR);
|
| + int channel_id = params_->channel.channel_id;
|
| + CastSocket* socket = GetSocket(channel_id);
|
| + if (result < 0 || !socket) {
|
| + SetResultFromError(channel_id,
|
| + cast_channel::CHANNEL_ERROR_SOCKET_ERROR);
|
| } else {
|
| - int channel_id = params_->channel.channel_id;
|
| - SetResultFromSocket(channel_id);
|
| + SetResultFromSocket(*socket);
|
| + // This will delete |socket|.
|
| RemoveSocket(channel_id);
|
| + socket = NULL;
|
| }
|
| AsyncWorkCompleted();
|
| }
|
|
|