blob: ed2d811d9330d030a4f44d8f95ed6d446823d37c [file] [log] [blame]
/*
* Copyright (C) 2004, 2006, 2008 Apple Inc. All rights reserved.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Library General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Library General Public License for more details.
*
* You should have received a copy of the GNU Library General Public License
* along with this library; see the file COPYING.LIB. If not, write to
* the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
* Boston, MA 02110-1301, USA.
*/
#include "config.h"
#include "FormData.h"
#include "CString.h"
#include "TextEncoding.h"
namespace WebCore {
FormData::FormData(const void* data, size_t size)
{
appendData(data, size);
}
FormData::FormData(const CString& s)
{
appendData(s.data(), s.length());
}
FormData::FormData(const FormData& data)
: RefCounted<FormData>()
, m_elements(data.m_elements)
{
}
PassRefPtr<FormData> FormData::copy() const
{
return new FormData(*this);
}
void FormData::appendData(const void* data, size_t size)
{
if (m_elements.isEmpty() || m_elements.last().m_type != FormDataElement::data)
m_elements.append(FormDataElement());
FormDataElement& e = m_elements.last();
size_t oldSize = e.m_data.size();
e.m_data.grow(oldSize + size);
memcpy(e.m_data.data() + oldSize, data, size);
}
void FormData::appendFile(const String& filename)
{
m_elements.append(filename);
}
void FormData::flatten(Vector<char>& data) const
{
// Concatenate all the byte arrays, but omit any files.
data.clear();
size_t n = m_elements.size();
for (size_t i = 0; i < n; ++i) {
const FormDataElement& e = m_elements[i];
if (e.m_type == FormDataElement::data) {
size_t oldSize = data.size();
size_t delta = e.m_data.size();
data.grow(oldSize + delta);
memcpy(data.data() + oldSize, e.m_data.data(), delta);
}
}
}
String FormData::flattenToString() const
{
Vector<char> bytes;
flatten(bytes);
return Latin1Encoding().decode(bytes.data(), bytes.size());
}
} // namespace WebCore