18e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/*
28e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Copyright (C) 2006 Apple Computer, Inc.  All rights reserved.
3d0825bca7fe65beaee391d30da42e937db621564Steve Block * Copyright (C) Research In Motion Limited 2009-2010. All rights reserved.
48e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
58e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Redistribution and use in source and binary forms, with or without
68e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * modification, are permitted provided that the following conditions
78e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * are met:
88e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 1. Redistributions of source code must retain the above copyright
98e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *    notice, this list of conditions and the following disclaimer.
108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 2. Redistributions in binary form must reproduce the above copyright
118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *    notice, this list of conditions and the following disclaimer in the
128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *    documentation and/or other materials provided with the distribution.
138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR
188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project */
268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#ifndef SharedBuffer_h
278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#define SharedBuffer_h
288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "PlatformString.h"
308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include <wtf/Forward.h>
31635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#include <wtf/OwnPtr.h>
32635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#include <wtf/RefCounted.h>
338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include <wtf/Vector.h>
348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch#if USE(CF)
368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include <wtf/RetainPtr.h>
378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif
388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#if PLATFORM(MAC)
408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#ifdef __OBJC__
418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project@class NSData;
428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#else
438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectclass NSData;
448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif
458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif
478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectnamespace WebCore {
49635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
50635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectclass PurgeableBuffer;
518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectclass SharedBuffer : public RefCounted<SharedBuffer> {
538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectpublic:
548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    static PassRefPtr<SharedBuffer> create() { return adoptRef(new SharedBuffer); }
558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    static PassRefPtr<SharedBuffer> create(const char* c, int i) { return adoptRef(new SharedBuffer(c, i)); }
568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    static PassRefPtr<SharedBuffer> create(const unsigned char* c, int i) { return adoptRef(new SharedBuffer(c, i)); }
578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    static PassRefPtr<SharedBuffer> createWithContentsOfFile(const String& filePath);
598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    static PassRefPtr<SharedBuffer> adoptVector(Vector<char>& vector);
618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
62635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    // The buffer must be in non-purgeable state before adopted to a SharedBuffer.
63635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    // It will stay that way until released.
64e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke    static PassRefPtr<SharedBuffer> adoptPurgeableBuffer(PassOwnPtr<PurgeableBuffer>);
65a101f778588252e4b72f2083fad0dd95346f8702Steve Block
660516e5ebbe0e0ced8bd40f67f06c38a4d373be9cAndrei Popescu#if PLATFORM(ANDROID)
670516e5ebbe0e0ced8bd40f67f06c38a4d373be9cAndrei Popescu    virtual
680516e5ebbe0e0ced8bd40f67f06c38a4d373be9cAndrei Popescu#endif
69635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    ~SharedBuffer();
70635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#if PLATFORM(MAC)
728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    NSData *createNSData();
738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    static PassRefPtr<SharedBuffer> wrapNSData(NSData *data);
748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif
7581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch#if USE(CF)
768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    CFDataRef createCFData();
775f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    static PassRefPtr<SharedBuffer> wrapCFData(CFDataRef);
788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif
798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
800516e5ebbe0e0ced8bd40f67f06c38a4d373be9cAndrei Popescu#if PLATFORM(ANDROID)
810516e5ebbe0e0ced8bd40f67f06c38a4d373be9cAndrei Popescu    virtual
820516e5ebbe0e0ced8bd40f67f06c38a4d373be9cAndrei Popescu#endif
83d0825bca7fe65beaee391d30da42e937db621564Steve Block    // Calling this function will force internal segmented buffers
84d0825bca7fe65beaee391d30da42e937db621564Steve Block    // to be merged into a flat buffer. Use getSomeData() whenever possible
85d0825bca7fe65beaee391d30da42e937db621564Steve Block    // for better performance.
86d0825bca7fe65beaee391d30da42e937db621564Steve Block    const char* data() const;
876140756452d66f35970067d531fbcd4391001994Steve Block#if PLATFORM(ANDROID)
886140756452d66f35970067d531fbcd4391001994Steve Block    virtual
896140756452d66f35970067d531fbcd4391001994Steve Block#endif
908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    unsigned size() const;
918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
93d0825bca7fe65beaee391d30da42e937db621564Steve Block    bool isEmpty() const { return !size(); }
94d0825bca7fe65beaee391d30da42e937db621564Steve Block
95d0825bca7fe65beaee391d30da42e937db621564Steve Block    void append(const char*, unsigned);
968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    void clear();
978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    const char* platformData() const;
988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    unsigned platformDataSize() const;
998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1002bde8e466a4451c7319e3a072d118917957d6554Steve Block#if HAVE(CFNETWORK_DATA_ARRAY_CALLBACK)
1012bde8e466a4451c7319e3a072d118917957d6554Steve Block    void append(CFDataRef);
1022bde8e466a4451c7319e3a072d118917957d6554Steve Block#endif
1032bde8e466a4451c7319e3a072d118917957d6554Steve Block
1048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    PassRefPtr<SharedBuffer> copy() const;
1058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
106635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    bool hasPurgeableBuffer() const { return m_purgeableBuffer.get(); }
107635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
108635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    // Ensure this buffer has no other clients before calling this.
109e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke    PassOwnPtr<PurgeableBuffer> releasePurgeableBuffer();
110d0825bca7fe65beaee391d30da42e937db621564Steve Block
111d0825bca7fe65beaee391d30da42e937db621564Steve Block    // Return the number of consecutive bytes after "position". "data"
112d0825bca7fe65beaee391d30da42e937db621564Steve Block    // points to the first byte.
113d0825bca7fe65beaee391d30da42e937db621564Steve Block    // Return 0 when no more data left.
114d0825bca7fe65beaee391d30da42e937db621564Steve Block    // When extracting all data with getSomeData(), the caller should
115d0825bca7fe65beaee391d30da42e937db621564Steve Block    // repeat calling it until it returns 0.
116d0825bca7fe65beaee391d30da42e937db621564Steve Block    // Usage:
117d0825bca7fe65beaee391d30da42e937db621564Steve Block    //      const char* segment;
118d0825bca7fe65beaee391d30da42e937db621564Steve Block    //      unsigned pos = 0;
119d0825bca7fe65beaee391d30da42e937db621564Steve Block    //      while (unsigned length = sharedBuffer->getSomeData(segment, pos)) {
120d0825bca7fe65beaee391d30da42e937db621564Steve Block    //          // Use the data. for example: decoder->decode(segment, length);
121d0825bca7fe65beaee391d30da42e937db621564Steve Block    //          pos += length;
122d0825bca7fe65beaee391d30da42e937db621564Steve Block    //      }
123d0825bca7fe65beaee391d30da42e937db621564Steve Block    unsigned getSomeData(const char*& data, unsigned position = 0) const;
124d0825bca7fe65beaee391d30da42e937db621564Steve Block
1258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectprivate:
1268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    SharedBuffer();
1278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    SharedBuffer(const char*, int);
1288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    SharedBuffer(const unsigned char*, int);
1298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
13081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    // Calling this function will force internal segmented buffers
13181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    // to be merged into a flat buffer. Use getSomeData() whenever possible
13281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    // for better performance.
13381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    // As well, be aware that this method does *not* return any purgeable
13481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    // memory, which can be a source of bugs.
13581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    const Vector<char>& buffer() const;
13681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
1378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    void clearPlatformData();
1388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    void maybeTransferPlatformData();
1398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    bool hasPlatformData() const;
1408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
141d0825bca7fe65beaee391d30da42e937db621564Steve Block    unsigned m_size;
142d0825bca7fe65beaee391d30da42e937db621564Steve Block    mutable Vector<char> m_buffer;
143d0825bca7fe65beaee391d30da42e937db621564Steve Block    mutable Vector<char*> m_segments;
144635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    OwnPtr<PurgeableBuffer> m_purgeableBuffer;
1452bde8e466a4451c7319e3a072d118917957d6554Steve Block#if HAVE(CFNETWORK_DATA_ARRAY_CALLBACK)
1462bde8e466a4451c7319e3a072d118917957d6554Steve Block    mutable Vector<RetainPtr<CFDataRef> > m_dataArray;
1472bde8e466a4451c7319e3a072d118917957d6554Steve Block    void copyDataArrayAndClear(char *destination, unsigned bytesToCopy) const;
1482bde8e466a4451c7319e3a072d118917957d6554Steve Block#endif
14981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch#if USE(CF)
1508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    SharedBuffer(CFDataRef);
1518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    RetainPtr<CFDataRef> m_cfData;
1528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif
1538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project};
1548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
157d0825bca7fe65beaee391d30da42e937db621564Steve Block#endif // SharedBuffer_h
158