1bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)/* 2bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles) * Copyright (C) 2004, 2006, 2008, 2011 Apple Inc. All rights reserved. 3bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles) * Copyright (C) 2009 Google Inc. All rights reserved. 4bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles) * Copyright (C) 2012 Digia Plc. and/or its subsidiary(-ies) 5bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles) * 6bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles) * This library is free software; you can redistribute it and/or 7bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles) * modify it under the terms of the GNU Library General Public 8bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles) * License as published by the Free Software Foundation; either 9bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles) * version 2 of the License, or (at your option) any later version. 10bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles) * 11bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles) * This library is distributed in the hope that it will be useful, 12bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles) * but WITHOUT ANY WARRANTY; without even the implied warranty of 13bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles) * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 14bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles) * Library General Public License for more details. 15bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles) * 16bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles) * You should have received a copy of the GNU Library General Public License 17bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles) * along with this library; see the file COPYING.LIB. If not, write to 18bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles) * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, 19bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles) * Boston, MA 02110-1301, USA. 20bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles) */ 21bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles) 22bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)#include "config.h" 23bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)#include "platform/network/FormData.h" 24bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles) 25bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)#include "platform/FileMetadata.h" 26bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)#include "platform/network/FormDataBuilder.h" 27a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)#include "wtf/text/CString.h" 28bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)#include "wtf/text/TextEncoding.h" 29bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles) 30c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)namespace blink { 31bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles) 32bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)inline FormData::FormData() 33bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles) : m_identifier(0) 34bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles) , m_alwaysStream(false) 35bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles) , m_containsPasswordData(false) 36bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles){ 37bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)} 38bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles) 39bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)inline FormData::FormData(const FormData& data) 40bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles) : RefCounted<FormData>() 41bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles) , m_elements(data.m_elements) 42bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles) , m_identifier(data.m_identifier) 43bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles) , m_alwaysStream(false) 44bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles) , m_containsPasswordData(data.m_containsPasswordData) 45bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles){ 46bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)} 47bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles) 48bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)FormData::~FormData() 49bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles){ 50bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)} 51bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles) 52bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)PassRefPtr<FormData> FormData::create() 53bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles){ 54bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles) return adoptRef(new FormData); 55bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)} 56bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles) 57bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)PassRefPtr<FormData> FormData::create(const void* data, size_t size) 58bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles){ 59bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles) RefPtr<FormData> result = create(); 60bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles) result->appendData(data, size); 61bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles) return result.release(); 62bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)} 63bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles) 64bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)PassRefPtr<FormData> FormData::create(const CString& string) 65bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles){ 66bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles) RefPtr<FormData> result = create(); 67bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles) result->appendData(string.data(), string.length()); 68bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles) return result.release(); 69bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)} 70bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles) 71bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)PassRefPtr<FormData> FormData::create(const Vector<char>& vector) 72bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles){ 73bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles) RefPtr<FormData> result = create(); 74bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles) result->appendData(vector.data(), vector.size()); 75bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles) return result.release(); 76bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)} 77bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles) 78bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)PassRefPtr<FormData> FormData::copy() const 79bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles){ 80bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles) return adoptRef(new FormData(*this)); 81bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)} 82bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles) 83bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)PassRefPtr<FormData> FormData::deepCopy() const 84bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles){ 85bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles) RefPtr<FormData> formData(create()); 86bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles) 87bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles) formData->m_alwaysStream = m_alwaysStream; 88bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles) 89bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles) size_t n = m_elements.size(); 90bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles) formData->m_elements.reserveInitialCapacity(n); 91bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles) for (size_t i = 0; i < n; ++i) { 92bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles) const FormDataElement& e = m_elements[i]; 93bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles) switch (e.m_type) { 94bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles) case FormDataElement::data: 95bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles) formData->m_elements.uncheckedAppend(FormDataElement(e.m_data)); 96bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles) break; 97bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles) case FormDataElement::encodedFile: 98bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles) formData->m_elements.uncheckedAppend(FormDataElement(e.m_filename, e.m_fileStart, e.m_fileLength, e.m_expectedFileModificationTime)); 99bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles) break; 100bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles) case FormDataElement::encodedBlob: 101bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles) formData->m_elements.uncheckedAppend(FormDataElement(e.m_blobUUID, e.m_optionalBlobDataHandle)); 102bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles) break; 103bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles) case FormDataElement::encodedFileSystemURL: 104bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles) formData->m_elements.uncheckedAppend(FormDataElement(e.m_fileSystemURL, e.m_fileStart, e.m_fileLength, e.m_expectedFileModificationTime)); 105bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles) break; 106bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles) } 107bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles) } 108bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles) return formData.release(); 109bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)} 110bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles) 111bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)void FormData::appendData(const void* data, size_t size) 112bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles){ 113bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles) if (m_elements.isEmpty() || m_elements.last().m_type != FormDataElement::data) 114bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles) m_elements.append(FormDataElement()); 115bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles) FormDataElement& e = m_elements.last(); 116bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles) size_t oldSize = e.m_data.size(); 117bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles) e.m_data.grow(oldSize + size); 118bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles) memcpy(e.m_data.data() + oldSize, data, size); 119bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)} 120bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles) 121bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)void FormData::appendFile(const String& filename) 122bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles){ 123bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles) m_elements.append(FormDataElement(filename, 0, BlobDataItem::toEndOfFile, invalidFileTime())); 124bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)} 125bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles) 126bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)void FormData::appendFileRange(const String& filename, long long start, long long length, double expectedModificationTime) 127bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles){ 128bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles) m_elements.append(FormDataElement(filename, start, length, expectedModificationTime)); 129bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)} 130bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles) 131bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)void FormData::appendBlob(const String& uuid, PassRefPtr<BlobDataHandle> optionalHandle) 132bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles){ 133bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles) m_elements.append(FormDataElement(uuid, optionalHandle)); 134bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)} 135bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles) 136bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)void FormData::appendFileSystemURL(const KURL& url) 137bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles){ 138bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles) m_elements.append(FormDataElement(url, 0, BlobDataItem::toEndOfFile, invalidFileTime())); 139bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)} 140bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles) 141bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)void FormData::appendFileSystemURLRange(const KURL& url, long long start, long long length, double expectedModificationTime) 142bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles){ 143bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles) m_elements.append(FormDataElement(url, start, length, expectedModificationTime)); 144bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)} 145bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles) 146bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)void FormData::flatten(Vector<char>& data) const 147bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles){ 148bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles) // Concatenate all the byte arrays, but omit any files. 149bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles) data.clear(); 150bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles) size_t n = m_elements.size(); 151bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles) for (size_t i = 0; i < n; ++i) { 152bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles) const FormDataElement& e = m_elements[i]; 153bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles) if (e.m_type == FormDataElement::data) 154bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles) data.append(e.m_data.data(), static_cast<size_t>(e.m_data.size())); 155bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles) } 156bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)} 157bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles) 158bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)String FormData::flattenToString() const 159bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles){ 160bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles) Vector<char> bytes; 161bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles) flatten(bytes); 162bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles) return Latin1Encoding().decode(reinterpret_cast<const char*>(bytes.data()), bytes.size()); 163bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)} 164bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles) 165d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)unsigned long long FormData::sizeInBytes() const 166d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles){ 167d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) unsigned size = 0; 168d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) size_t n = m_elements.size(); 169d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) for (size_t i = 0; i < n; ++i) { 170d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) const FormDataElement& e = m_elements[i]; 171d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) switch (e.m_type) { 172d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) case FormDataElement::data: 173d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) size += e.m_data.size(); 174d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) break; 175d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) case FormDataElement::encodedFile: 176d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) size += e.m_fileLength - e.m_fileStart; 177d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) break; 178d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) case FormDataElement::encodedBlob: 179d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) if (e.m_optionalBlobDataHandle) 180d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) size += e.m_optionalBlobDataHandle->size(); 181d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) break; 182d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) case FormDataElement::encodedFileSystemURL: 183d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) size += e.m_fileLength - e.m_fileStart; 184d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) break; 185d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) } 186d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) } 187d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) return size; 188d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)} 189d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) 190c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)} // namespace blink 191