1/*
2 * Copyright (C) 2010 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 "WebBlobData.h"
33
34#include "BlobData.h"
35#include <wtf/PassOwnPtr.h>
36
37using namespace WebCore;
38
39namespace WebKit {
40
41class WebBlobDataPrivate : public BlobData {
42};
43
44void WebBlobData::initialize()
45{
46    assign(BlobData::create());
47}
48
49void WebBlobData::reset()
50{
51    assign(0);
52}
53
54size_t WebBlobData::itemCount() const
55{
56    ASSERT(!isNull());
57    return m_private->items().size();
58}
59
60bool WebBlobData::itemAt(size_t index, Item& result) const
61{
62    ASSERT(!isNull());
63
64    if (index >= m_private->items().size())
65        return false;
66
67    const BlobDataItem& item = m_private->items()[index];
68    result.data.reset();
69    result.filePath.reset();
70    result.blobURL = KURL();
71    result.offset = item.offset;
72    result.length = item.length;
73    result.expectedModificationTime = item.expectedModificationTime;
74
75    switch (item.type) {
76    case BlobDataItem::Data:
77        result.type = Item::TypeData;
78        result.data = item.data;
79        return true;
80    case BlobDataItem::File:
81        result.type = Item::TypeFile;
82        result.filePath = item.path;
83        return true;
84    case BlobDataItem::Blob:
85        result.type = Item::TypeBlob;
86        result.blobURL = item.url;
87        return true;
88    }
89    ASSERT_NOT_REACHED();
90    return false;
91}
92
93WebString WebBlobData::contentType() const
94{
95    ASSERT(!isNull());
96    return m_private->contentType();
97}
98
99WebString WebBlobData::contentDisposition() const
100{
101    ASSERT(!isNull());
102    return m_private->contentDisposition();
103}
104
105WebBlobData::WebBlobData(const PassOwnPtr<BlobData>& data)
106    : m_private(0)
107{
108    assign(data);
109}
110
111WebBlobData& WebBlobData::operator=(const PassOwnPtr<BlobData>& data)
112{
113    assign(data);
114    return *this;
115}
116
117WebBlobData::operator PassOwnPtr<BlobData>()
118{
119    WebBlobDataPrivate* temp = m_private;
120    m_private = 0;
121    return adoptPtr(temp);
122}
123
124void WebBlobData::assign(const PassOwnPtr<BlobData>& data)
125{
126    if (m_private)
127        delete m_private;
128    m_private = static_cast<WebBlobDataPrivate*>(data.leakPtr());
129}
130
131} // namespace WebKit
132