18e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/*
2cad810f21b803229eb11403f9209855525a25d57Steve Block * Copyright (C) 2004, 2006, 2008, 2011 Apple Inc. All rights reserved.
38e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
48e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * This library is free software; you can redistribute it and/or
58e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * modify it under the terms of the GNU Library General Public
68e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * License as published by the Free Software Foundation; either
78e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * version 2 of the License, or (at your option) any later version.
88e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
98e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * This library is distributed in the hope that it will be useful,
108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * but WITHOUT ANY WARRANTY; without even the implied warranty of
118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Library General Public License for more details.
138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * You should have received a copy of the GNU Library General Public License
158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * along with this library; see the file COPYING.LIB. If not, write to
168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Boston, MA 02110-1301, USA.
188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project */
198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#ifndef FormData_h
218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#define FormData_h
228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
23e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block#include "KURL.h"
248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "PlatformString.h"
25dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch#include <wtf/Forward.h>
268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include <wtf/RefCounted.h>
278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include <wtf/Vector.h>
288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectnamespace WebCore {
308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
31dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockclass Document;
325ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsenclass FormDataList;
33545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdochclass TextEncoding;
348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectclass FormDataElement {
368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectpublic:
378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    FormDataElement() : m_type(data) { }
38cad810f21b803229eb11403f9209855525a25d57Steve Block    explicit FormDataElement(const Vector<char>& array) : m_type(data), m_data(array) { }
39545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch
40dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch#if ENABLE(BLOB)
41dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    FormDataElement(const String& filename, long long fileStart, long long fileLength, double expectedFileModificationTime, bool shouldGenerateFile) : m_type(encodedFile), m_filename(filename), m_fileStart(fileStart), m_fileLength(fileLength), m_expectedFileModificationTime(expectedFileModificationTime), m_shouldGenerateFile(shouldGenerateFile) { }
42cad810f21b803229eb11403f9209855525a25d57Steve Block    explicit FormDataElement(const KURL& blobURL) : m_type(encodedBlob), m_blobURL(blobURL) { }
43dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#else
448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    FormDataElement(const String& filename, bool shouldGenerateFile) : m_type(encodedFile), m_filename(filename), m_shouldGenerateFile(shouldGenerateFile) { }
45dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#endif
468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
47e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    enum {
48e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block        data,
49e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block        encodedFile
50e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block#if ENABLE(BLOB)
51e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block        , encodedBlob
52e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block#endif
53e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    } m_type;
548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    Vector<char> m_data;
558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    String m_filename;
56dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch#if ENABLE(BLOB)
57dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    long long m_fileStart;
58dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    long long m_fileLength;
59dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    double m_expectedFileModificationTime;
60e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    KURL m_blobURL;
61dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#endif
628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    String m_generatedFilename;
638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    bool m_shouldGenerateFile;
648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project};
658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectinline bool operator==(const FormDataElement& a, const FormDataElement& b)
678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (&a == &b)
698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return true;
70545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch
718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (a.m_type != b.m_type)
728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return false;
73e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    if (a.m_type == FormDataElement::data)
74e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block        return a.m_data == b.m_data;
75e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    if (a.m_type == FormDataElement::encodedFile)
76dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch#if ENABLE(BLOB)
77e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block        return a.m_filename == b.m_filename && a.m_fileStart == b.m_fileStart && a.m_fileLength == b.m_fileLength && a.m_expectedFileModificationTime == b.m_expectedFileModificationTime;
78e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    if (a.m_type == FormDataElement::encodedBlob)
79e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block        return a.m_blobURL == b.m_blobURL;
80dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#else
81e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block        return a.m_filename == b.m_filename;
82dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#endif
838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return true;
858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
86545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch
878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectinline bool operator!=(const FormDataElement& a, const FormDataElement& b)
888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return !(a == b);
908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
91545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch
928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectclass FormData : public RefCounted<FormData> {
938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectpublic:
948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    static PassRefPtr<FormData> create();
958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    static PassRefPtr<FormData> create(const void*, size_t);
96dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    static PassRefPtr<FormData> create(const CString&);
978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    static PassRefPtr<FormData> create(const Vector<char>&);
985ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    static PassRefPtr<FormData> create(const FormDataList&, const TextEncoding&);
995ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    static PassRefPtr<FormData> createMultiPart(const FormDataList&, const TextEncoding&, Document*);
1008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    PassRefPtr<FormData> copy() const;
101635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    PassRefPtr<FormData> deepCopy() const;
1028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ~FormData();
103545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch
104cad810f21b803229eb11403f9209855525a25d57Steve Block    void encodeForBackForward(Encoder&) const;
105cad810f21b803229eb11403f9209855525a25d57Steve Block    static PassRefPtr<FormData> decodeForBackForward(Decoder&);
106cad810f21b803229eb11403f9209855525a25d57Steve Block
1078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    void appendData(const void* data, size_t);
1085ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    void appendFile(const String& filePath, bool shouldGenerateFile = false);
109dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch#if ENABLE(BLOB)
110dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    void appendFileRange(const String& filename, long long start, long long length, double expectedModificationTime, bool shouldGenerateFile = false);
111e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    void appendBlob(const KURL& blobURL);
112dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#endif
1138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    void flatten(Vector<char>&) const; // omits files
1158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    String flattenToString() const; // omits files
1168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    bool isEmpty() const { return m_elements.isEmpty(); }
1188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    const Vector<FormDataElement>& elements() const { return m_elements; }
119dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    const Vector<char>& boundary() const { return m_boundary; }
1208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
12121939df44de1705786c545cd1bf519d47250322dBen Murdoch    void generateFiles(Document*);
1228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    void removeGeneratedFilesIfNeeded();
1238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    bool alwaysStream() const { return m_alwaysStream; }
1258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    void setAlwaysStream(bool alwaysStream) { m_alwaysStream = alwaysStream; }
1268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1278f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    // Identifies a particular form submission instance.  A value of 0 is used
1288f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    // to indicate an unspecified identifier.
1298f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    void setIdentifier(int64_t identifier) { m_identifier = identifier; }
1308f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    int64_t identifier() const { return m_identifier; }
1318f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian
1328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectprivate:
1338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    FormData();
1348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    FormData(const FormData&);
1358f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian
1365ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    void appendKeyValuePairItems(const FormDataList&, const TextEncoding&, bool isMultiPartForm, Document*);
137dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
1388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    Vector<FormDataElement> m_elements;
139545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch
1408f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    int64_t m_identifier;
1418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    bool m_hasGeneratedFiles;
1428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    bool m_alwaysStream;
143dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    Vector<char> m_boundary;
1448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project};
1458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectinline bool operator==(const FormData& a, const FormData& b)
1478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
1488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return a.elements() == b.elements();
1498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectinline bool operator!=(const FormData& a, const FormData& b)
1528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
153545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    return !(a == b);
1548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} // namespace WebCore
1578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif
159