1/*
2 * Copyright (C) 2009 Apple 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
6 * are met:
7 * 1. Redistributions of source code must retain the above copyright
8 *    notice, this list of conditions and the following disclaimer.
9 * 2. Redistributions in binary form must reproduce the above copyright
10 *    notice, this list of conditions and the following disclaimer in the
11 *    documentation and/or other materials provided with the distribution.
12 *
13 * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
14 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16 * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR
17 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
18 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
19 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
20 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
21 * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
22 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
23 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
24 */
25
26#include "config.h"
27#include "wtf/ArrayBuffer.h"
28
29#include "wtf/ArrayBufferView.h"
30#include "wtf/RefPtr.h"
31
32namespace WTF {
33
34bool ArrayBuffer::transfer(ArrayBufferContents& result)
35{
36    RefPtr<ArrayBuffer> keepAlive(this);
37
38    if (!m_contents.data()) {
39        result.clear();
40        return false;
41    }
42
43    bool allViewsAreNeuterable = true;
44    for (ArrayBufferView* i = m_firstView; i; i = i->m_nextView) {
45        if (!i->isNeuterable())
46            allViewsAreNeuterable = false;
47    }
48
49    if (allViewsAreNeuterable) {
50        m_contents.transfer(result);
51    } else {
52        m_contents.copyTo(result);
53        if (!result.data())
54            return false;
55    }
56
57    while (m_firstView) {
58        ArrayBufferView* current = m_firstView;
59        removeView(current);
60        if (allViewsAreNeuterable || current->isNeuterable())
61            current->neuter();
62    }
63
64    m_isNeutered = true;
65
66    return true;
67}
68
69void ArrayBuffer::addView(ArrayBufferView* view)
70{
71    view->m_buffer = this;
72    view->m_prevView = 0;
73    view->m_nextView = m_firstView;
74    if (m_firstView)
75        m_firstView->m_prevView = view;
76    m_firstView = view;
77}
78
79void ArrayBuffer::removeView(ArrayBufferView* view)
80{
81    ASSERT(this == view->m_buffer);
82    if (view->m_nextView)
83        view->m_nextView->m_prevView = view->m_prevView;
84    if (view->m_prevView)
85        view->m_prevView->m_nextView = view->m_nextView;
86    if (m_firstView == view)
87        m_firstView = view->m_nextView;
88    view->m_prevView = view->m_nextView = 0;
89}
90
91}
92