1643ca7872b450ea4efacab6188849e5aac2ba161Steve Block/* 2643ca7872b450ea4efacab6188849e5aac2ba161Steve Block * Copyright (C) 2009 Google Inc. All rights reserved. 3643ca7872b450ea4efacab6188849e5aac2ba161Steve Block * 4643ca7872b450ea4efacab6188849e5aac2ba161Steve Block * Redistribution and use in source and binary forms, with or without 5643ca7872b450ea4efacab6188849e5aac2ba161Steve Block * modification, are permitted provided that the following conditions are 6643ca7872b450ea4efacab6188849e5aac2ba161Steve Block * met: 7643ca7872b450ea4efacab6188849e5aac2ba161Steve Block * 8643ca7872b450ea4efacab6188849e5aac2ba161Steve Block * * Redistributions of source code must retain the above copyright 9643ca7872b450ea4efacab6188849e5aac2ba161Steve Block * notice, this list of conditions and the following disclaimer. 10643ca7872b450ea4efacab6188849e5aac2ba161Steve Block * * Redistributions in binary form must reproduce the above 11643ca7872b450ea4efacab6188849e5aac2ba161Steve Block * copyright notice, this list of conditions and the following disclaimer 12643ca7872b450ea4efacab6188849e5aac2ba161Steve Block * in the documentation and/or other materials provided with the 13643ca7872b450ea4efacab6188849e5aac2ba161Steve Block * distribution. 14643ca7872b450ea4efacab6188849e5aac2ba161Steve Block * * Neither the name of Google Inc. nor the names of its 15643ca7872b450ea4efacab6188849e5aac2ba161Steve Block * contributors may be used to endorse or promote products derived from 16643ca7872b450ea4efacab6188849e5aac2ba161Steve Block * this software without specific prior written permission. 17643ca7872b450ea4efacab6188849e5aac2ba161Steve Block * 18643ca7872b450ea4efacab6188849e5aac2ba161Steve Block * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 19643ca7872b450ea4efacab6188849e5aac2ba161Steve Block * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 20643ca7872b450ea4efacab6188849e5aac2ba161Steve Block * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 21643ca7872b450ea4efacab6188849e5aac2ba161Steve Block * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 22643ca7872b450ea4efacab6188849e5aac2ba161Steve Block * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 23643ca7872b450ea4efacab6188849e5aac2ba161Steve Block * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 24643ca7872b450ea4efacab6188849e5aac2ba161Steve Block * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 25643ca7872b450ea4efacab6188849e5aac2ba161Steve Block * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 26643ca7872b450ea4efacab6188849e5aac2ba161Steve Block * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 27643ca7872b450ea4efacab6188849e5aac2ba161Steve Block * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 28643ca7872b450ea4efacab6188849e5aac2ba161Steve Block * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 29643ca7872b450ea4efacab6188849e5aac2ba161Steve Block */ 30643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 31643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#include "config.h" 32643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#include "WebHTTPBody.h" 33643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 34643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#include "FormData.h" 35643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 36643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockusing namespace WebCore; 37643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 38643ca7872b450ea4efacab6188849e5aac2ba161Steve Blocknamespace WebKit { 39643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 40643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockclass WebHTTPBodyPrivate : public FormData { 41643ca7872b450ea4efacab6188849e5aac2ba161Steve Block}; 42643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 43643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockvoid WebHTTPBody::initialize() 44643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{ 45643ca7872b450ea4efacab6188849e5aac2ba161Steve Block assign(static_cast<WebHTTPBodyPrivate*>(FormData::create().releaseRef())); 46643ca7872b450ea4efacab6188849e5aac2ba161Steve Block} 47643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 48643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockvoid WebHTTPBody::reset() 49643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{ 50643ca7872b450ea4efacab6188849e5aac2ba161Steve Block assign(0); 51643ca7872b450ea4efacab6188849e5aac2ba161Steve Block} 52643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 53643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockvoid WebHTTPBody::assign(const WebHTTPBody& other) 54643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{ 55643ca7872b450ea4efacab6188849e5aac2ba161Steve Block WebHTTPBodyPrivate* p = const_cast<WebHTTPBodyPrivate*>(other.m_private); 56643ca7872b450ea4efacab6188849e5aac2ba161Steve Block if (p) 57643ca7872b450ea4efacab6188849e5aac2ba161Steve Block p->ref(); 58643ca7872b450ea4efacab6188849e5aac2ba161Steve Block assign(p); 59643ca7872b450ea4efacab6188849e5aac2ba161Steve Block} 60643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 61643ca7872b450ea4efacab6188849e5aac2ba161Steve Blocksize_t WebHTTPBody::elementCount() const 62643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{ 63643ca7872b450ea4efacab6188849e5aac2ba161Steve Block ASSERT(!isNull()); 64643ca7872b450ea4efacab6188849e5aac2ba161Steve Block return m_private->elements().size(); 65643ca7872b450ea4efacab6188849e5aac2ba161Steve Block} 66643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 67643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockbool WebHTTPBody::elementAt(size_t index, Element& result) const 68643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{ 69643ca7872b450ea4efacab6188849e5aac2ba161Steve Block ASSERT(!isNull()); 70643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 71643ca7872b450ea4efacab6188849e5aac2ba161Steve Block if (index >= m_private->elements().size()) 72643ca7872b450ea4efacab6188849e5aac2ba161Steve Block return false; 73643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 74643ca7872b450ea4efacab6188849e5aac2ba161Steve Block const FormDataElement& element = m_private->elements()[index]; 75643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 76e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block result.data.reset(); 77e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block result.filePath.reset(); 78e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block result.fileStart = 0; 79e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block result.fileLength = 0; 8068513a70bcd92384395513322f1b801e7bf9c729Steve Block result.modificationTime = 0.0; 81e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block result.blobURL = KURL(); 82e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block 83643ca7872b450ea4efacab6188849e5aac2ba161Steve Block switch (element.m_type) { 84643ca7872b450ea4efacab6188849e5aac2ba161Steve Block case FormDataElement::data: 85643ca7872b450ea4efacab6188849e5aac2ba161Steve Block result.type = Element::TypeData; 86643ca7872b450ea4efacab6188849e5aac2ba161Steve Block result.data.assign(element.m_data.data(), element.m_data.size()); 87643ca7872b450ea4efacab6188849e5aac2ba161Steve Block break; 88643ca7872b450ea4efacab6188849e5aac2ba161Steve Block case FormDataElement::encodedFile: 89643ca7872b450ea4efacab6188849e5aac2ba161Steve Block result.type = Element::TypeFile; 90643ca7872b450ea4efacab6188849e5aac2ba161Steve Block result.filePath = element.m_filename; 91dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch#if ENABLE(BLOB) 92dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block result.fileStart = element.m_fileStart; 93dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block result.fileLength = element.m_fileLength; 9468513a70bcd92384395513322f1b801e7bf9c729Steve Block result.modificationTime = element.m_expectedFileModificationTime; 95dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#endif 96643ca7872b450ea4efacab6188849e5aac2ba161Steve Block break; 97e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block#if ENABLE(BLOB) 98e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block case FormDataElement::encodedBlob: 99e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block result.type = Element::TypeBlob; 100e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block result.blobURL = element.m_blobURL; 101e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block break; 102e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block#endif 103643ca7872b450ea4efacab6188849e5aac2ba161Steve Block default: 104643ca7872b450ea4efacab6188849e5aac2ba161Steve Block ASSERT_NOT_REACHED(); 105643ca7872b450ea4efacab6188849e5aac2ba161Steve Block return false; 106643ca7872b450ea4efacab6188849e5aac2ba161Steve Block } 107643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 108643ca7872b450ea4efacab6188849e5aac2ba161Steve Block return true; 109643ca7872b450ea4efacab6188849e5aac2ba161Steve Block} 110643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 111643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockvoid WebHTTPBody::appendData(const WebData& data) 112643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{ 113643ca7872b450ea4efacab6188849e5aac2ba161Steve Block ensureMutable(); 114643ca7872b450ea4efacab6188849e5aac2ba161Steve Block // FIXME: FormDataElement::m_data should be a SharedBuffer<char>. Then we 115643ca7872b450ea4efacab6188849e5aac2ba161Steve Block // could avoid this buffer copy. 116643ca7872b450ea4efacab6188849e5aac2ba161Steve Block m_private->appendData(data.data(), data.size()); 117643ca7872b450ea4efacab6188849e5aac2ba161Steve Block} 118643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 119643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockvoid WebHTTPBody::appendFile(const WebString& filePath) 120643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{ 121643ca7872b450ea4efacab6188849e5aac2ba161Steve Block ensureMutable(); 122643ca7872b450ea4efacab6188849e5aac2ba161Steve Block m_private->appendFile(filePath); 123643ca7872b450ea4efacab6188849e5aac2ba161Steve Block} 124643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 12568513a70bcd92384395513322f1b801e7bf9c729Steve Blockvoid WebHTTPBody::appendFileRange(const WebString& filePath, long long fileStart, long long fileLength, double modificationTime) 1268a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block{ 127dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch#if ENABLE(BLOB) 128dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block ensureMutable(); 12968513a70bcd92384395513322f1b801e7bf9c729Steve Block m_private->appendFileRange(filePath, fileStart, fileLength, modificationTime); 130dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#endif 1318a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block} 1328a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block 133e8b154fd68f9b33be40a3590e58347f353835f5cSteve Blockvoid WebHTTPBody::appendBlob(const WebURL& blobURL) 134e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block{ 135e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block#if ENABLE(BLOB) 136e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block ensureMutable(); 137e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block m_private->appendBlob(blobURL); 138e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block#endif 139e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block} 140e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block 141643ca7872b450ea4efacab6188849e5aac2ba161Steve Blocklong long WebHTTPBody::identifier() const 142643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{ 143643ca7872b450ea4efacab6188849e5aac2ba161Steve Block ASSERT(!isNull()); 144643ca7872b450ea4efacab6188849e5aac2ba161Steve Block return m_private->identifier(); 145643ca7872b450ea4efacab6188849e5aac2ba161Steve Block} 146643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 147643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockvoid WebHTTPBody::setIdentifier(long long identifier) 148643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{ 149643ca7872b450ea4efacab6188849e5aac2ba161Steve Block ensureMutable(); 150643ca7872b450ea4efacab6188849e5aac2ba161Steve Block return m_private->setIdentifier(identifier); 151643ca7872b450ea4efacab6188849e5aac2ba161Steve Block} 152643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 153643ca7872b450ea4efacab6188849e5aac2ba161Steve BlockWebHTTPBody::WebHTTPBody(const PassRefPtr<FormData>& data) 154643ca7872b450ea4efacab6188849e5aac2ba161Steve Block : m_private(static_cast<WebHTTPBodyPrivate*>(data.releaseRef())) 155643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{ 156643ca7872b450ea4efacab6188849e5aac2ba161Steve Block} 157643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 158643ca7872b450ea4efacab6188849e5aac2ba161Steve BlockWebHTTPBody& WebHTTPBody::operator=(const PassRefPtr<FormData>& data) 159643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{ 160643ca7872b450ea4efacab6188849e5aac2ba161Steve Block assign(static_cast<WebHTTPBodyPrivate*>(data.releaseRef())); 161643ca7872b450ea4efacab6188849e5aac2ba161Steve Block return *this; 162643ca7872b450ea4efacab6188849e5aac2ba161Steve Block} 163643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 164643ca7872b450ea4efacab6188849e5aac2ba161Steve BlockWebHTTPBody::operator PassRefPtr<FormData>() const 165643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{ 166643ca7872b450ea4efacab6188849e5aac2ba161Steve Block return m_private; 167643ca7872b450ea4efacab6188849e5aac2ba161Steve Block} 168643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 169643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockvoid WebHTTPBody::assign(WebHTTPBodyPrivate* p) 170643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{ 171643ca7872b450ea4efacab6188849e5aac2ba161Steve Block // p is already ref'd for us by the caller 172643ca7872b450ea4efacab6188849e5aac2ba161Steve Block if (m_private) 173643ca7872b450ea4efacab6188849e5aac2ba161Steve Block m_private->deref(); 174643ca7872b450ea4efacab6188849e5aac2ba161Steve Block m_private = p; 175643ca7872b450ea4efacab6188849e5aac2ba161Steve Block} 176643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 177643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockvoid WebHTTPBody::ensureMutable() 178643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{ 179643ca7872b450ea4efacab6188849e5aac2ba161Steve Block ASSERT(!isNull()); 180643ca7872b450ea4efacab6188849e5aac2ba161Steve Block if (!m_private->hasOneRef()) 181643ca7872b450ea4efacab6188849e5aac2ba161Steve Block assign(static_cast<WebHTTPBodyPrivate*>(m_private->copy().releaseRef())); 182643ca7872b450ea4efacab6188849e5aac2ba161Steve Block} 183643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 184643ca7872b450ea4efacab6188849e5aac2ba161Steve Block} // namespace WebKit 185