OLD | NEW |
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 "chrome/test/chromedriver/net/websocket.h" | 5 #include "chrome/test/chromedriver/net/websocket.h" |
6 | 6 |
7 #include "base/base64.h" | 7 #include "base/base64.h" |
8 #include "base/bind.h" | 8 #include "base/bind.h" |
9 #include "base/bind_helpers.h" | 9 #include "base/bind_helpers.h" |
10 #include "base/memory/scoped_vector.h" | 10 #include "base/memory/scoped_vector.h" |
(...skipping 110 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
121 | 121 |
122 void WebSocket::ContinueWritingIfNecessary() { | 122 void WebSocket::ContinueWritingIfNecessary() { |
123 if (!write_buffer_->BytesRemaining()) { | 123 if (!write_buffer_->BytesRemaining()) { |
124 if (pending_write_.empty()) | 124 if (pending_write_.empty()) |
125 return; | 125 return; |
126 write_buffer_ = new net::DrainableIOBuffer( | 126 write_buffer_ = new net::DrainableIOBuffer( |
127 new net::StringIOBuffer(pending_write_), | 127 new net::StringIOBuffer(pending_write_), |
128 pending_write_.length()); | 128 pending_write_.length()); |
129 pending_write_.clear(); | 129 pending_write_.clear(); |
130 } | 130 } |
131 int code = socket_->Write( | 131 int code = |
132 write_buffer_, | 132 socket_->Write(write_buffer_.get(), |
133 write_buffer_->BytesRemaining(), | 133 write_buffer_->BytesRemaining(), |
134 base::Bind(&WebSocket::OnWrite, base::Unretained(this))); | 134 base::Bind(&WebSocket::OnWrite, base::Unretained(this))); |
135 if (code != net::ERR_IO_PENDING) | 135 if (code != net::ERR_IO_PENDING) |
136 OnWrite(code); | 136 OnWrite(code); |
137 } | 137 } |
138 | 138 |
139 void WebSocket::Read() { | 139 void WebSocket::Read() { |
140 int code = socket_->Read( | 140 int code = |
141 read_buffer_, | 141 socket_->Read(read_buffer_.get(), |
142 read_buffer_->size(), | 142 read_buffer_->size(), |
143 base::Bind(&WebSocket::OnRead, base::Unretained(this))); | 143 base::Bind(&WebSocket::OnRead, base::Unretained(this))); |
144 if (code != net::ERR_IO_PENDING) | 144 if (code != net::ERR_IO_PENDING) |
145 OnRead(code); | 145 OnRead(code); |
146 } | 146 } |
147 | 147 |
148 void WebSocket::OnRead(int code) { | 148 void WebSocket::OnRead(int code) { |
149 if (code <= 0) { | 149 if (code <= 0) { |
150 Close(code ? code : net::ERR_FAILED); | 150 Close(code ? code : net::ERR_FAILED); |
151 return; | 151 return; |
152 } | 152 } |
153 | 153 |
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
189 InvokeConnectCallback(net::OK); | 189 InvokeConnectCallback(net::OK); |
190 if (!leftover_message.empty()) | 190 if (!leftover_message.empty()) |
191 OnReadDuringOpen(leftover_message.c_str(), leftover_message.length()); | 191 OnReadDuringOpen(leftover_message.c_str(), leftover_message.length()); |
192 } | 192 } |
193 | 193 |
194 void WebSocket::OnReadDuringOpen(const char* data, int len) { | 194 void WebSocket::OnReadDuringOpen(const char* data, int len) { |
195 ScopedVector<net::WebSocketFrameChunk> frame_chunks; | 195 ScopedVector<net::WebSocketFrameChunk> frame_chunks; |
196 CHECK(parser_.Decode(data, len, &frame_chunks)); | 196 CHECK(parser_.Decode(data, len, &frame_chunks)); |
197 for (size_t i = 0; i < frame_chunks.size(); ++i) { | 197 for (size_t i = 0; i < frame_chunks.size(); ++i) { |
198 scoped_refptr<net::IOBufferWithSize> buffer = frame_chunks[i]->data; | 198 scoped_refptr<net::IOBufferWithSize> buffer = frame_chunks[i]->data; |
199 if (buffer) | 199 if (buffer.get()) |
200 next_message_ += std::string(buffer->data(), buffer->size()); | 200 next_message_ += std::string(buffer->data(), buffer->size()); |
201 if (frame_chunks[i]->final_chunk) { | 201 if (frame_chunks[i]->final_chunk) { |
202 listener_->OnMessageReceived(next_message_); | 202 listener_->OnMessageReceived(next_message_); |
203 next_message_.clear(); | 203 next_message_.clear(); |
204 } | 204 } |
205 } | 205 } |
206 } | 206 } |
207 | 207 |
208 void WebSocket::InvokeConnectCallback(int code) { | 208 void WebSocket::InvokeConnectCallback(int code) { |
209 net::CompletionCallback temp = connect_callback_; | 209 net::CompletionCallback temp = connect_callback_; |
210 connect_callback_.Reset(); | 210 connect_callback_.Reset(); |
211 CHECK(!temp.is_null()); | 211 CHECK(!temp.is_null()); |
212 temp.Run(code); | 212 temp.Run(code); |
213 } | 213 } |
214 | 214 |
215 void WebSocket::Close(int code) { | 215 void WebSocket::Close(int code) { |
216 socket_->Disconnect(); | 216 socket_->Disconnect(); |
217 if (!connect_callback_.is_null()) | 217 if (!connect_callback_.is_null()) |
218 InvokeConnectCallback(code); | 218 InvokeConnectCallback(code); |
219 if (state_ == OPEN) | 219 if (state_ == OPEN) |
220 listener_->OnClose(); | 220 listener_->OnClose(); |
221 | 221 |
222 state_ = CLOSED; | 222 state_ = CLOSED; |
223 } | 223 } |
224 | 224 |
225 | 225 |
OLD | NEW |