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