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