.: Blob.slice support.
[WebKit-https.git] / WebCore / platform / network / FormData.h
1 /*
2  * Copyright (C) 2004, 2006, 2008 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 "PlatformString.h"
24 #include <wtf/RefCounted.h>
25 #include <wtf/Vector.h>
26
27 namespace WebCore {
28
29 class ChromeClient;
30
31 class FormDataElement {
32 public:
33     FormDataElement() : m_type(data) { }
34     FormDataElement(const Vector<char>& array) : m_type(data), m_data(array) { }
35 #if ENABLE(BLOB_SLICE)
36     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) { }
37 #else
38     FormDataElement(const String& filename, bool shouldGenerateFile) : m_type(encodedFile), m_filename(filename), m_shouldGenerateFile(shouldGenerateFile) { }
39 #endif
40
41     enum { data, encodedFile } m_type;
42     Vector<char> m_data;
43     String m_filename;
44 #if ENABLE(BLOB_SLICE)
45     long long m_fileStart;
46     long long m_fileLength;
47     double m_expectedFileModificationTime;
48 #endif
49     String m_generatedFilename;
50     bool m_shouldGenerateFile;
51 };
52
53 inline bool operator==(const FormDataElement& a, const FormDataElement& b)
54 {
55     if (&a == &b)
56         return true;
57     
58     if (a.m_type != b.m_type)
59         return false;
60     if (a.m_data != b.m_data)
61         return false;
62 #if ENABLE(BLOB_SLICE)
63     if (a.m_filename != b.m_filename || a.m_fileStart != b.m_fileStart || a.m_fileLength != b.m_fileLength || a.m_expectedFileModificationTime != b.m_expectedFileModificationTime)
64 #else
65     if (a.m_filename != b.m_filename)
66 #endif
67         return false;
68
69     return true;
70 }
71  
72 inline bool operator!=(const FormDataElement& a, const FormDataElement& b)
73 {
74     return !(a == b);
75 }
76  
77 class FormData : public RefCounted<FormData> {
78 public:
79     static PassRefPtr<FormData> create();
80     static PassRefPtr<FormData> create(const void*, size_t);
81     static PassRefPtr<FormData> create(const CString&);
82     static PassRefPtr<FormData> create(const Vector<char>&);
83     PassRefPtr<FormData> copy() const;
84     PassRefPtr<FormData> deepCopy() const;
85     ~FormData();
86     
87     void appendData(const void* data, size_t);
88     void appendFile(const String& filename, bool shouldGenerateFile = false);
89 #if ENABLE(BLOB_SLICE)
90     void appendFileRange(const String& filename, long long start, long long length, double expectedModificationTime, bool shouldGenerateFile = false);
91 #endif
92
93     void flatten(Vector<char>&) const; // omits files
94     String flattenToString() const; // omits files
95
96     bool isEmpty() const { return m_elements.isEmpty(); }
97     const Vector<FormDataElement>& elements() const { return m_elements; }
98
99     void generateFiles(ChromeClient*);
100     void removeGeneratedFilesIfNeeded();
101
102     bool alwaysStream() const { return m_alwaysStream; }
103     void setAlwaysStream(bool alwaysStream) { m_alwaysStream = alwaysStream; }
104
105     // Identifies a particular form submission instance.  A value of 0 is used
106     // to indicate an unspecified identifier.
107     void setIdentifier(int64_t identifier) { m_identifier = identifier; }
108     int64_t identifier() const { return m_identifier; }
109
110 private:
111     FormData();
112     FormData(const FormData&);
113
114     Vector<FormDataElement> m_elements;
115     int64_t m_identifier;
116     bool m_hasGeneratedFiles;
117     bool m_alwaysStream;
118 };
119
120 inline bool operator==(const FormData& a, const FormData& b)
121 {
122     return a.elements() == b.elements();
123 }
124
125 inline bool operator!=(const FormData& a, const FormData& b)
126 {
127     return a.elements() != b.elements();
128 }
129
130 } // namespace WebCore
131
132 #endif