File::lastModifiedDate should use NaN or separate boolean flag for null Date value
[WebKit-https.git] / Source / WebCore / platform / chromium / support / WebHTTPBody.cpp
1 /*
2  * Copyright (C) 2009 Google Inc. All rights reserved.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions are
6  * met:
7  *
8  *     * Redistributions of source code must retain the above copyright
9  * notice, this list of conditions and the following disclaimer.
10  *     * Redistributions in binary form must reproduce the above
11  * copyright notice, this list of conditions and the following disclaimer
12  * in the documentation and/or other materials provided with the
13  * distribution.
14  *     * Neither the name of Google Inc. nor the names of its
15  * contributors may be used to endorse or promote products derived from
16  * this software without specific prior written permission.
17  *
18  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
19  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
20  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
21  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
22  * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
23  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
24  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
25  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
26  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
27  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
28  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29  */
30
31 #include "config.h"
32 #include <public/WebHTTPBody.h>
33
34 #include "FileSystem.h"
35 #include "FormData.h"
36
37 using namespace WebCore;
38
39 namespace WebKit {
40
41 class WebHTTPBodyPrivate : public FormData {
42 };
43
44 void WebHTTPBody::initialize()
45 {
46     assign(static_cast<WebHTTPBodyPrivate*>(FormData::create().leakRef()));
47 }
48
49 void WebHTTPBody::reset()
50 {
51     assign(0);
52 }
53
54 void WebHTTPBody::assign(const WebHTTPBody& other)
55 {
56     WebHTTPBodyPrivate* p = const_cast<WebHTTPBodyPrivate*>(other.m_private);
57     if (p)
58         p->ref();
59     assign(p);
60 }
61
62 size_t WebHTTPBody::elementCount() const
63 {
64     ASSERT(!isNull());
65     return m_private->elements().size();
66 }
67
68 bool WebHTTPBody::elementAt(size_t index, Element& result) const
69 {
70     ASSERT(!isNull());
71
72     if (index >= m_private->elements().size())
73         return false;
74
75     const FormDataElement& element = m_private->elements()[index];
76
77     result.data.reset();
78     result.filePath.reset();
79     result.fileStart = 0;
80     result.fileLength = 0;
81     result.modificationTime = invalidFileTime();
82     result.blobURL = KURL();
83
84     switch (element.m_type) {
85     case FormDataElement::data:
86         result.type = Element::TypeData;
87         result.data.assign(element.m_data.data(), element.m_data.size());
88         break;
89     case FormDataElement::encodedFile:
90         result.type = Element::TypeFile;
91         result.filePath = element.m_filename;
92 #if ENABLE(BLOB)
93         result.fileStart = element.m_fileStart;
94         result.fileLength = element.m_fileLength;
95         result.modificationTime = element.m_expectedFileModificationTime;
96 #endif
97         break;
98 #if ENABLE(BLOB)
99     case FormDataElement::encodedBlob:
100         result.type = Element::TypeBlob;
101         result.blobURL = element.m_blobURL;
102         break;
103 #endif
104     default:
105         ASSERT_NOT_REACHED();
106         return false;
107     }
108
109     return true;
110 }
111
112 void WebHTTPBody::appendData(const WebData& data)
113 {
114     ensureMutable();
115     // FIXME: FormDataElement::m_data should be a SharedBuffer<char>.  Then we
116     // could avoid this buffer copy.
117     m_private->appendData(data.data(), data.size());
118 }
119
120 void WebHTTPBody::appendFile(const WebString& filePath)
121 {
122     ensureMutable();
123     m_private->appendFile(filePath);
124 }
125
126 void WebHTTPBody::appendFileRange(const WebString& filePath, long long fileStart, long long fileLength, double modificationTime)
127 {
128 #if ENABLE(BLOB)
129     ensureMutable();
130     m_private->appendFileRange(filePath, fileStart, fileLength, modificationTime);
131 #endif
132 }
133
134 void WebHTTPBody::appendBlob(const WebURL& blobURL)
135 {
136 #if ENABLE(BLOB)
137     ensureMutable();
138     m_private->appendBlob(blobURL);
139 #endif
140 }
141
142 long long WebHTTPBody::identifier() const
143 {
144     ASSERT(!isNull());
145     return m_private->identifier();
146 }
147
148 void WebHTTPBody::setIdentifier(long long identifier)
149 {
150     ensureMutable();
151     return m_private->setIdentifier(identifier);
152 }
153
154 bool WebHTTPBody::containsPasswordData() const
155 {
156     return m_private->containsPasswordData();
157 }
158
159 void WebHTTPBody::setContainsPasswordData(bool containsPasswordData)
160 {
161     m_private->setContainsPasswordData(containsPasswordData);
162 }
163
164 WebHTTPBody::WebHTTPBody(const PassRefPtr<FormData>& data)
165     : m_private(static_cast<WebHTTPBodyPrivate*>(data.leakRef()))
166 {
167 }
168
169 WebHTTPBody& WebHTTPBody::operator=(const PassRefPtr<FormData>& data)
170 {
171     assign(static_cast<WebHTTPBodyPrivate*>(data.leakRef()));
172     return *this;
173 }
174
175 WebHTTPBody::operator PassRefPtr<FormData>() const
176 {
177     return m_private;
178 }
179
180 void WebHTTPBody::assign(WebHTTPBodyPrivate* p)
181 {
182     // p is already ref'd for us by the caller
183     if (m_private)
184         m_private->deref();
185     m_private = p;
186 }
187
188 void WebHTTPBody::ensureMutable()
189 {
190     ASSERT(!isNull());
191     if (!m_private->hasOneRef())
192         assign(static_cast<WebHTTPBodyPrivate*>(m_private->copy().leakRef()));
193 }
194
195 } // namespace WebKit