Part 2 of removing PlatformString.h, remove PlatformString.h
[WebKit-https.git] / Source / WebCore / platform / network / FormData.h
1 /*
2  * Copyright (C) 2004, 2006, 2008, 2011 Apple Inc. All rights reserved.
3  *
4  * This library is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU Library General Public
6  * License as published by the Free Software Foundation; either
7  * version 2 of the License, or (at your option) any later version.
8  *
9  * This library is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12  * Library General Public License for more details.
13  *
14  * You should have received a copy of the GNU Library General Public License
15  * along with this library; see the file COPYING.LIB. If not, write to
16  * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
17  * Boston, MA 02110-1301, USA.
18  */
19
20 #ifndef FormData_h
21 #define FormData_h
22
23 #include "KURL.h"
24 #include <wtf/Forward.h>
25 #include <wtf/RefCounted.h>
26 #include <wtf/Vector.h>
27 #include <wtf/text/WTFString.h>
28
29 namespace WebCore {
30
31 class Document;
32 class FormDataList;
33 class MemoryObjectInfo;
34 class TextEncoding;
35
36 class FormDataElement {
37 public:
38     FormDataElement() : m_type(data) { }
39     explicit FormDataElement(const Vector<char>& array) : m_type(data), m_data(array) { }
40
41 #if ENABLE(BLOB)
42     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) { }
43     explicit FormDataElement(const KURL& blobURL) : m_type(encodedBlob), m_url(blobURL) { }
44 #else
45     FormDataElement(const String& filename, bool shouldGenerateFile) : m_type(encodedFile), m_filename(filename), m_shouldGenerateFile(shouldGenerateFile) { }
46 #endif
47 #if ENABLE(FILE_SYSTEM)
48     FormDataElement(const KURL& url, long long start, long long length, double expectedFileModificationTime) : m_type(encodedURL), m_url(url), m_fileStart(start), m_fileLength(length), m_expectedFileModificationTime(expectedFileModificationTime), m_shouldGenerateFile(false) { }
49 #endif
50
51     enum Type {
52         data,
53         encodedFile
54 #if ENABLE(BLOB)
55         , encodedBlob
56 #endif
57 #if ENABLE(FILE_SYSTEM)
58         , encodedURL
59 #endif
60     } m_type;
61     Vector<char> m_data;
62     String m_filename;
63 #if ENABLE(BLOB)
64     KURL m_url; // For Blob or URL.
65     long long m_fileStart;
66     long long m_fileLength;
67     double m_expectedFileModificationTime;
68 #endif
69     String m_generatedFilename;
70     bool m_shouldGenerateFile;
71 };
72
73 inline bool operator==(const FormDataElement& a, const FormDataElement& b)
74 {
75     if (&a == &b)
76         return true;
77
78     if (a.m_type != b.m_type)
79         return false;
80     if (a.m_type == FormDataElement::data)
81         return a.m_data == b.m_data;
82     if (a.m_type == FormDataElement::encodedFile)
83 #if ENABLE(BLOB)
84         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;
85     if (a.m_type == FormDataElement::encodedBlob)
86         return a.m_url == b.m_url;
87 #else
88         return a.m_filename == b.m_filename;
89 #endif
90 #if ENABLE(FILE_SYSTEM)
91     if (a.m_type == FormDataElement::encodedURL)
92         return a.m_url == b.m_url;
93 #endif
94
95     return true;
96 }
97
98 inline bool operator!=(const FormDataElement& a, const FormDataElement& b)
99 {
100     return !(a == b);
101 }
102
103 class FormData : public RefCounted<FormData> {
104 public:
105     enum EncodingType {
106         FormURLEncoded, // for application/x-www-form-urlencoded
107         TextPlain, // for text/plain
108         MultipartFormData // for multipart/form-data
109     };
110
111     static PassRefPtr<FormData> create();
112     static PassRefPtr<FormData> create(const void*, size_t);
113     static PassRefPtr<FormData> create(const CString&);
114     static PassRefPtr<FormData> create(const Vector<char>&);
115     static PassRefPtr<FormData> create(const FormDataList&, const TextEncoding&, EncodingType = FormURLEncoded);
116     static PassRefPtr<FormData> createMultiPart(const FormDataList&, const TextEncoding&, Document*);
117     PassRefPtr<FormData> copy() const;
118     PassRefPtr<FormData> deepCopy() const;
119     ~FormData();
120
121     void encodeForBackForward(Encoder&) const;
122     static PassRefPtr<FormData> decodeForBackForward(Decoder&);
123
124     void appendData(const void* data, size_t);
125     void appendFile(const String& filePath, bool shouldGenerateFile = false);
126 #if ENABLE(BLOB)
127     void appendFileRange(const String& filename, long long start, long long length, double expectedModificationTime, bool shouldGenerateFile = false);
128     void appendBlob(const KURL& blobURL);
129 #endif
130 #if ENABLE(FILE_SYSTEM)
131     void appendURL(const KURL&);
132     void appendURLRange(const KURL&, long long start, long long length, double expectedModificationTime);
133 #endif
134
135     void flatten(Vector<char>&) const; // omits files
136     String flattenToString() const; // omits files
137
138     bool isEmpty() const { return m_elements.isEmpty(); }
139     const Vector<FormDataElement>& elements() const { return m_elements; }
140     const Vector<char>& boundary() const { return m_boundary; }
141
142     void generateFiles(Document*);
143     void removeGeneratedFilesIfNeeded();
144
145     bool alwaysStream() const { return m_alwaysStream; }
146     void setAlwaysStream(bool alwaysStream) { m_alwaysStream = alwaysStream; }
147
148     // Identifies a particular form submission instance.  A value of 0 is used
149     // to indicate an unspecified identifier.
150     void setIdentifier(int64_t identifier) { m_identifier = identifier; }
151     int64_t identifier() const { return m_identifier; }
152
153     bool containsPasswordData() const { return m_containsPasswordData; }
154     void setContainsPasswordData(bool containsPasswordData) { m_containsPasswordData = containsPasswordData; }
155
156     void reportMemoryUsage(MemoryObjectInfo*) const;
157
158     static EncodingType parseEncodingType(const String& type)
159     {
160         if (equalIgnoringCase(type, "text/plain"))
161             return TextPlain;
162         if (equalIgnoringCase(type, "multipart/form-data"))
163             return MultipartFormData;
164         return FormURLEncoded;
165     }
166
167 private:
168     FormData();
169     FormData(const FormData&);
170
171     void appendKeyValuePairItems(const FormDataList&, const TextEncoding&, bool isMultiPartForm, Document*, EncodingType = FormURLEncoded);
172
173     Vector<FormDataElement> m_elements;
174
175     int64_t m_identifier;
176     bool m_hasGeneratedFiles;
177     bool m_alwaysStream;
178     Vector<char> m_boundary;
179     bool m_containsPasswordData;
180 };
181
182 inline bool operator==(const FormData& a, const FormData& b)
183 {
184     return a.elements() == b.elements();
185 }
186
187 inline bool operator!=(const FormData& a, const FormData& b)
188 {
189     return !(a == b);
190 }
191
192 } // namespace WebCore
193
194 #endif