1 /* 2 * Copyright (C) 2009 Google Inc. All rights reserved. 3 * 4 * Redistribution and use in source and binary forms, with or without 5 * modification, are permitted provided that the following conditions are 6 * met: 7 * 8 * * Redistributions of source code must retain the above copyright 9 * notice, this list of conditions and the following disclaimer. 10 * * Redistributions in binary form must reproduce the above 11 * copyright notice, this list of conditions and the following disclaimer 12 * in the documentation and/or other materials provided with the 13 * distribution. 14 * * Neither the name of Google Inc. nor the names of its 15 * contributors may be used to endorse or promote products derived from 16 * this software without specific prior written permission. 17 * 18 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 19 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 20 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 21 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 22 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 23 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 24 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 25 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 26 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 27 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 28 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 29 */ 30 31 #include "config.h" 32 #include "SocketStreamHandleBase.h" 33 34 #include "SocketStreamHandle.h" 35 #include "SocketStreamHandleClient.h" 36 37 namespace WebCore { 38 39 const unsigned int bufferSize = 100 * 1024 * 1024; 40 41 SocketStreamHandleBase::SocketStreamHandleBase(const KURL& url, SocketStreamHandleClient* client) 42 : m_url(url) 43 , m_client(client) 44 , m_state(Connecting) 45 { 46 } 47 48 SocketStreamHandleBase::SocketStreamState SocketStreamHandleBase::state() const 49 { 50 return m_state; 51 } 52 53 bool SocketStreamHandleBase::send(const char* data, int length) 54 { 55 if (m_state == Connecting) 56 return false; 57 if (!m_buffer.isEmpty()) { 58 if (m_buffer.size() + length > bufferSize) { 59 // FIXME: report error to indicate that buffer has no more space. 60 return false; 61 } 62 m_buffer.append(data, length); 63 return true; 64 } 65 int bytesWritten = 0; 66 if (m_state == Open) 67 bytesWritten = platformSend(data, length); 68 if (bytesWritten < 0) 69 return false; 70 if (m_buffer.size() + length - bytesWritten > bufferSize) { 71 // FIXME: report error to indicate that buffer has no more space. 72 return false; 73 } 74 if (bytesWritten < length) 75 m_buffer.append(data + bytesWritten, length - bytesWritten); 76 return true; 77 } 78 79 void SocketStreamHandleBase::close() 80 { 81 RefPtr<SocketStreamHandle> protect(static_cast<SocketStreamHandle*>(this)); // platformClose calls the client, which may make the handle get deallocated immediately. 82 83 platformClose(); 84 m_state = Closed; 85 } 86 87 void SocketStreamHandleBase::setClient(SocketStreamHandleClient* client) 88 { 89 ASSERT(!client || (!m_client && m_state == Connecting)); 90 m_client = client; 91 } 92 93 bool SocketStreamHandleBase::sendPendingData() 94 { 95 if (m_state != Open) 96 return false; 97 if (m_buffer.isEmpty()) 98 return false; 99 int bytesWritten = platformSend(m_buffer.data(), m_buffer.size()); 100 if (bytesWritten <= 0) 101 return false; 102 Vector<char> remainingData; 103 ASSERT(m_buffer.size() - bytesWritten <= bufferSize); 104 remainingData.append(m_buffer.data() + bytesWritten, m_buffer.size() - bytesWritten); 105 m_buffer.swap(remainingData); 106 return true; 107 } 108 109 } // namespace WebCore 110