| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright (C) 2011, 2012 Google Inc. All rights reserved. | 2 * Copyright (C) 2011, 2012 Google Inc. All rights reserved. |
| 3 * | 3 * |
| 4 * Redistribution and use in source and binary forms, with or without | 4 * Redistribution and use in source and binary forms, with or without |
| 5 * modification, are permitted provided that the following conditions are | 5 * modification, are permitted provided that the following conditions are |
| 6 * met: | 6 * met: |
| 7 * | 7 * |
| 8 * * Redistributions of source code must retain the above copyright | 8 * * Redistributions of source code must retain the above copyright |
| 9 * notice, this list of conditions and the following disclaimer. | 9 * notice, this list of conditions and the following disclaimer. |
| 10 * * Redistributions in binary form must reproduce the above | 10 * * Redistributions in binary form must reproduce the above |
| (...skipping 139 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 150 | 150 |
| 151 ThreadableWebSocketChannel::SendResult WebSocketChannel::send(const ArrayBuffer&
binaryData, unsigned byteOffset, unsigned byteLength) | 151 ThreadableWebSocketChannel::SendResult WebSocketChannel::send(const ArrayBuffer&
binaryData, unsigned byteOffset, unsigned byteLength) |
| 152 { | 152 { |
| 153 LOG(Network, "WebSocketChannel %p send arraybuffer %p %u %u", this, &binaryD
ata, byteOffset, byteLength); | 153 LOG(Network, "WebSocketChannel %p send arraybuffer %p %u %u", this, &binaryD
ata, byteOffset, byteLength); |
| 154 enqueueRawFrame(WebSocketFrame::OpCodeBinary, static_cast<const char*>(binar
yData.data()) + byteOffset, byteLength); | 154 enqueueRawFrame(WebSocketFrame::OpCodeBinary, static_cast<const char*>(binar
yData.data()) + byteOffset, byteLength); |
| 155 return ThreadableWebSocketChannel::SendSuccess; | 155 return ThreadableWebSocketChannel::SendSuccess; |
| 156 } | 156 } |
| 157 | 157 |
| 158 ThreadableWebSocketChannel::SendResult WebSocketChannel::send(const Blob& binary
Data) | 158 ThreadableWebSocketChannel::SendResult WebSocketChannel::send(const Blob& binary
Data) |
| 159 { | 159 { |
| 160 LOG(Network, "WebSocketChannel %p send blob %s", this, binaryData.url().stri
ng().utf8().data()); | 160 LOG(Network, "WebSocketChannel %p send blob %s", this, binaryData.uuid().utf
8().data()); |
| 161 enqueueBlobFrame(WebSocketFrame::OpCodeBinary, binaryData); | 161 enqueueBlobFrame(WebSocketFrame::OpCodeBinary, binaryData); |
| 162 return ThreadableWebSocketChannel::SendSuccess; | 162 return ThreadableWebSocketChannel::SendSuccess; |
| 163 } | 163 } |
| 164 | 164 |
| 165 bool WebSocketChannel::send(const char* data, int length) | 165 bool WebSocketChannel::send(const char* data, int length) |
| 166 { | 166 { |
| 167 LOG(Network, "WebSocketChannel %p send binary %p (%dB)", this, data, length)
; | 167 LOG(Network, "WebSocketChannel %p send binary %p (%dB)", this, data, length)
; |
| 168 enqueueRawFrame(WebSocketFrame::OpCodeBinary, data, length); | 168 enqueueRawFrame(WebSocketFrame::OpCodeBinary, data, length); |
| 169 return true; | 169 return true; |
| 170 } | 170 } |
| (...skipping 526 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 697 m_outgoingFrameQueue.append(frame.release()); | 697 m_outgoingFrameQueue.append(frame.release()); |
| 698 processOutgoingFrameQueue(); | 698 processOutgoingFrameQueue(); |
| 699 } | 699 } |
| 700 | 700 |
| 701 void WebSocketChannel::enqueueBlobFrame(WebSocketFrame::OpCode opCode, const Blo
b& blob) | 701 void WebSocketChannel::enqueueBlobFrame(WebSocketFrame::OpCode opCode, const Blo
b& blob) |
| 702 { | 702 { |
| 703 ASSERT(m_outgoingFrameQueueStatus == OutgoingFrameQueueOpen); | 703 ASSERT(m_outgoingFrameQueueStatus == OutgoingFrameQueueOpen); |
| 704 OwnPtr<QueuedFrame> frame = adoptPtr(new QueuedFrame); | 704 OwnPtr<QueuedFrame> frame = adoptPtr(new QueuedFrame); |
| 705 frame->opCode = opCode; | 705 frame->opCode = opCode; |
| 706 frame->frameType = QueuedFrameTypeBlob; | 706 frame->frameType = QueuedFrameTypeBlob; |
| 707 frame->blobData = Blob::create(blob.url(), blob.type(), blob.size()); | 707 frame->blobData = Blob::create(blob.blobDataHandle()); |
| 708 m_outgoingFrameQueue.append(frame.release()); | 708 m_outgoingFrameQueue.append(frame.release()); |
| 709 processOutgoingFrameQueue(); | 709 processOutgoingFrameQueue(); |
| 710 } | 710 } |
| 711 | 711 |
| 712 void WebSocketChannel::processOutgoingFrameQueue() | 712 void WebSocketChannel::processOutgoingFrameQueue() |
| 713 { | 713 { |
| 714 if (m_outgoingFrameQueueStatus == OutgoingFrameQueueClosed) | 714 if (m_outgoingFrameQueueStatus == OutgoingFrameQueueClosed) |
| 715 return; | 715 return; |
| 716 | 716 |
| 717 while (!m_outgoingFrameQueue.isEmpty()) { | 717 while (!m_outgoingFrameQueue.isEmpty()) { |
| 718 OwnPtr<QueuedFrame> frame = m_outgoingFrameQueue.takeFirst(); | 718 OwnPtr<QueuedFrame> frame = m_outgoingFrameQueue.takeFirst(); |
| 719 switch (frame->frameType) { | 719 switch (frame->frameType) { |
| 720 case QueuedFrameTypeString: { | 720 case QueuedFrameTypeString: { |
| 721 if (!sendFrame(frame->opCode, frame->stringData.data(), frame->strin
gData.length())) | 721 if (!sendFrame(frame->opCode, frame->stringData.data(), frame->strin
gData.length())) |
| 722 fail("Failed to send WebSocket frame."); | 722 fail("Failed to send WebSocket frame."); |
| 723 break; | 723 break; |
| 724 } | 724 } |
| 725 | 725 |
| 726 case QueuedFrameTypeVector: | 726 case QueuedFrameTypeVector: |
| 727 if (!sendFrame(frame->opCode, frame->vectorData.data(), frame->vecto
rData.size())) | 727 if (!sendFrame(frame->opCode, frame->vectorData.data(), frame->vecto
rData.size())) |
| 728 fail("Failed to send WebSocket frame."); | 728 fail("Failed to send WebSocket frame."); |
| 729 break; | 729 break; |
| 730 | 730 |
| 731 case QueuedFrameTypeBlob: { | 731 case QueuedFrameTypeBlob: { |
| 732 #if ENABLE(BLOB) | 732 #if ENABLE(BLOB) |
| 733 // FIXME: Read and write incrementally. This may be a large amount o
f data, too large |
| 734 // to reasonably load into an array buffer. |
| 733 switch (m_blobLoaderStatus) { | 735 switch (m_blobLoaderStatus) { |
| 734 case BlobLoaderNotStarted: | 736 case BlobLoaderNotStarted: |
| 735 ref(); // Will be derefed after didFinishLoading() or didFail(). | 737 ref(); // Will be derefed after didFinishLoading() or didFail(). |
| 736 ASSERT(!m_blobLoader); | 738 ASSERT(!m_blobLoader); |
| 737 m_blobLoader = adoptPtr(new FileReaderLoader(FileReaderLoader::R
eadAsArrayBuffer, this)); | 739 m_blobLoader = adoptPtr(new FileReaderLoader(FileReaderLoader::R
eadAsArrayBuffer, this)); |
| 738 m_blobLoaderStatus = BlobLoaderStarted; | 740 m_blobLoaderStatus = BlobLoaderStarted; |
| 739 m_blobLoader->start(m_document, frame->blobData.get()); | 741 m_blobLoader->start(m_document, frame->blobData.get()); |
| 740 m_outgoingFrameQueue.prepend(frame.release()); | 742 m_outgoingFrameQueue.prepend(frame.release()); |
| 741 return; | 743 return; |
| 742 | 744 |
| (...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 801 | 803 |
| 802 Vector<char> frameData; | 804 Vector<char> frameData; |
| 803 frame.makeFrameData(frameData); | 805 frame.makeFrameData(frameData); |
| 804 | 806 |
| 805 return m_handle->send(frameData.data(), frameData.size()); | 807 return m_handle->send(frameData.data(), frameData.size()); |
| 806 } | 808 } |
| 807 | 809 |
| 808 } // namespace WebCore | 810 } // namespace WebCore |
| 809 | 811 |
| 810 #endif // ENABLE(WEB_SOCKETS) | 812 #endif // ENABLE(WEB_SOCKETS) |
| OLD | NEW |