Parcel.h revision 7746cc318829358bb2c4dc0a03d40a7856a6d13e
10835d42be9b215f845e30db03211c86670cfa12aJason Sams/*
20835d42be9b215f845e30db03211c86670cfa12aJason Sams * Copyright (C) 2005 The Android Open Source Project
30835d42be9b215f845e30db03211c86670cfa12aJason Sams *
40835d42be9b215f845e30db03211c86670cfa12aJason Sams * Licensed under the Apache License, Version 2.0 (the "License");
50835d42be9b215f845e30db03211c86670cfa12aJason Sams * you may not use this file except in compliance with the License.
60835d42be9b215f845e30db03211c86670cfa12aJason Sams * You may obtain a copy of the License at
70835d42be9b215f845e30db03211c86670cfa12aJason Sams *
80835d42be9b215f845e30db03211c86670cfa12aJason Sams *      http://www.apache.org/licenses/LICENSE-2.0
90835d42be9b215f845e30db03211c86670cfa12aJason Sams *
100835d42be9b215f845e30db03211c86670cfa12aJason Sams * Unless required by applicable law or agreed to in writing, software
110835d42be9b215f845e30db03211c86670cfa12aJason Sams * distributed under the License is distributed on an "AS IS" BASIS,
120835d42be9b215f845e30db03211c86670cfa12aJason Sams * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
130835d42be9b215f845e30db03211c86670cfa12aJason Sams * See the License for the specific language governing permissions and
140835d42be9b215f845e30db03211c86670cfa12aJason Sams * limitations under the License.
150835d42be9b215f845e30db03211c86670cfa12aJason Sams */
160835d42be9b215f845e30db03211c86670cfa12aJason Sams
170835d42be9b215f845e30db03211c86670cfa12aJason Sams#ifndef ANDROID_PARCEL_H
180835d42be9b215f845e30db03211c86670cfa12aJason Sams#define ANDROID_PARCEL_H
199c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines
20c11e25c4e653124def1fb18e203b894f42106cbeTim Murray#include <cutils/native_handle.h>
21c11e25c4e653124def1fb18e203b894f42106cbeTim Murray#include <utils/Errors.h>
22c11e25c4e653124def1fb18e203b894f42106cbeTim Murray#include <utils/RefBase.h>
23c11e25c4e653124def1fb18e203b894f42106cbeTim Murray#include <utils/String16.h>
24c11e25c4e653124def1fb18e203b894f42106cbeTim Murray#include <utils/Vector.h>
25c11e25c4e653124def1fb18e203b894f42106cbeTim Murray
26c11e25c4e653124def1fb18e203b894f42106cbeTim Murray// ---------------------------------------------------------------------------
27c11e25c4e653124def1fb18e203b894f42106cbeTim Murraynamespace android {
280835d42be9b215f845e30db03211c86670cfa12aJason Sams
290835d42be9b215f845e30db03211c86670cfa12aJason Samsclass Flattenable;
300835d42be9b215f845e30db03211c86670cfa12aJason Samsclass IBinder;
310835d42be9b215f845e30db03211c86670cfa12aJason Samsclass IPCThreadState;
320835d42be9b215f845e30db03211c86670cfa12aJason Samsclass ProcessState;
330835d42be9b215f845e30db03211c86670cfa12aJason Samsclass String8;
340857196107d55bae312c12b72b115d25d5fee4f9Alex Sakhartchoukclass TextOutput;
350835d42be9b215f845e30db03211c86670cfa12aJason Sams
366b9b2caf2bf977508e223792bb5eba75091c232dTim Murraystruct flat_binder_object;  // defined in support_p/binder_module.h
376b9b2caf2bf977508e223792bb5eba75091c232dTim Murray
380835d42be9b215f845e30db03211c86670cfa12aJason Samsclass Parcel
390835d42be9b215f845e30db03211c86670cfa12aJason Sams{
400835d42be9b215f845e30db03211c86670cfa12aJason Samspublic:
410835d42be9b215f845e30db03211c86670cfa12aJason Sams    class ReadableBlob;
420835d42be9b215f845e30db03211c86670cfa12aJason Sams    class WritableBlob;
430835d42be9b215f845e30db03211c86670cfa12aJason Sams
440835d42be9b215f845e30db03211c86670cfa12aJason Sams                        Parcel();
457d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk                        ~Parcel();
467d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk
477d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk    const uint8_t*      data() const;
487d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk    size_t              dataSize() const;
497d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk    size_t              dataAvail() const;
507d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk    size_t              dataPosition() const;
517d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk    size_t              dataCapacity() const;
520e0c0885aed99a119052a792becb5a0c5a93632dAshok Bhat
530de9444aa6c25d2c586e8204a6168d10e67376e0Alex Sakhartchouk    status_t            setDataSize(size_t size);
54eb4dd08ec132f83745b8b28fa7da58eb4478b5b9Yang Ni    void                setDataPosition(size_t pos) const;
550835d42be9b215f845e30db03211c86670cfa12aJason Sams    status_t            setDataCapacity(size_t size);
560835d42be9b215f845e30db03211c86670cfa12aJason Sams
579c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines    status_t            setData(const uint8_t* buffer, size_t len);
587d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk
597d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk    status_t            appendFrom(const Parcel *parcel,
607d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk                                   size_t start, size_t len);
617d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk
627d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk    bool                pushAllowFds(bool allowFds);
637d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk    void                restoreAllowFds(bool lastValue);
649c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines
657d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk    bool                hasFileDescriptors() const;
667d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk
677d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk    // Writes the RPC header.
687d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk    status_t            writeInterfaceToken(const String16& interface);
697d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk
707d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk    // Parses the RPC header, returning true if the interface name
719c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines    // in the header matches the expected interface from the caller.
727d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk    //
737d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk    // Additionally, enforceInterface does part of the work of
747d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk    // propagating the StrictMode policy mask, populating the current
757d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk    // IPCThreadState, which as an optimization may optionally be
767d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk    // passed in.
777d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk    bool                enforceInterface(const String16& interface,
789c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines                                         IPCThreadState* threadState = NULL) const;
797d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk    bool                checkInterface(IBinder*) const;
807d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk
817d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk    void                freeData();
827d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk
837d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk    const size_t*       objects() const;
847d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk    size_t              objectsCount() const;
859c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines
867d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk    status_t            errorCheck() const;
877d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk    void                setError(status_t err);
887d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk
897d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk    status_t            write(const void* data, size_t len);
907d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk    void*               writeInplace(size_t len);
917d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk    status_t            writeUnpadded(const void* data, size_t len);
929c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines    status_t            writeInt32(int32_t val);
93bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams    status_t            writeInt64(int64_t val);
94bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams    status_t            writeFloat(float val);
95bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams    status_t            writeDouble(double val);
96f5c876e82d7cc647ba94d29eb914e64b7977c303Alex Sakhartchouk    status_t            writeIntPtr(intptr_t val);
97bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams    status_t            writeCString(const char* str);
98bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams    status_t            writeString8(const String8& str);
99bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams    status_t            writeString16(const String16& str);
1004d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams    status_t            writeString16(const char16_t* str, size_t len);
1014d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams    status_t            writeStrongBinder(const sp<IBinder>& val);
1024d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams    status_t            writeWeakBinder(const wp<IBinder>& val);
103b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk    status_t            write(const Flattenable& val);
104b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk
1054d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams    // Place a native_handle into the parcel (the native_handle's file-
1064d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams    // descriptors are dup'ed, so it is safe to delete the native_handle
1074d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams    // when this function returns).
1084d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams    // Doesn't take ownership of the native_handle.
1094d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams    status_t            writeNativeHandle(const native_handle* handle);
1104d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams
1114d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams    // Place a file descriptor into the parcel.  The given fd must remain
1129c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines    // valid for the lifetime of the parcel.
113bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams    status_t            writeFileDescriptor(int fd);
114bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams
115bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams    // Place a file descriptor into the parcel.  A dup of the fd is made, which
116f5c876e82d7cc647ba94d29eb914e64b7977c303Alex Sakhartchouk    // will be closed once the parcel is destroyed.
117bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams    status_t            writeDupFileDescriptor(int fd);
118bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams
119bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams    // Writes a blob to the parcel.
1204d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams    // If the blob is small, then it is stored in-place, otherwise it is
1214d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams    // transferred by way of an anonymous shared memory region.
1224d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams    // The caller should call release() on the blob after writing its contents.
123b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk    status_t            writeBlob(size_t len, WritableBlob* outBlob);
124b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk
1254d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams    status_t            writeObject(const flat_binder_object& val, bool nullMetaData);
1264d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams
1274d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams    // Like Parcel.java's writeNoException().  Just writes a zero int32.
1284d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams    // Currently the native implementation doesn't do any of the StrictMode
1294d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams    // stack gathering and serialization that the Java implementation does.
1304d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams    status_t            writeNoException();
1314d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams
1329c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines    void                remove(size_t start, size_t amt);
1336b9b2caf2bf977508e223792bb5eba75091c232dTim Murray
1346b9b2caf2bf977508e223792bb5eba75091c232dTim Murray    status_t            read(void* outData, size_t len) const;
135bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams    const void*         readInplace(size_t len) const;
136f5c876e82d7cc647ba94d29eb914e64b7977c303Alex Sakhartchouk    int32_t             readInt32() const;
137bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams    status_t            readInt32(int32_t *pArg) const;
138bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams    int64_t             readInt64() const;
139bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams    status_t            readInt64(int64_t *pArg) const;
1404d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams    float               readFloat() const;
1414d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams    status_t            readFloat(float *pArg) const;
1424d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams    double              readDouble() const;
143b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk    status_t            readDouble(double *pArg) const;
144b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk    intptr_t            readIntPtr() const;
1454d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams    status_t            readIntPtr(intptr_t *pArg) const;
1464d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams
1474d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams    const char*         readCString() const;
1484d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams    String8             readString8() const;
1494d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams    String16            readString16() const;
1504d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams    const char16_t*     readString16Inplace(size_t* outLen) const;
1514d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams    sp<IBinder>         readStrongBinder() const;
1529c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines    wp<IBinder>         readWeakBinder() const;
153bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams    status_t            read(Flattenable& val) const;
154bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams
155bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams    // Like Parcel.java's readExceptionCode().  Reads the first int32
156f5c876e82d7cc647ba94d29eb914e64b7977c303Alex Sakhartchouk    // off of a Parcel's header, returning 0 or the negative error
157bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams    // code on exceptions, but also deals with skipping over rich
158bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams    // response headers.  Callers should use this to read & parse the
159bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams    // response headers rather than doing it by hand.
1604d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams    int32_t             readExceptionCode() const;
1614d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams
1624d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams    // Retrieve native_handle from the parcel. This returns a copy of the
163b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk    // parcel's native_handle (the caller takes ownership). The caller
164b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk    // must free the native_handle with native_handle_close() and
1654d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams    // native_handle_delete().
1664d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams    native_handle*     readNativeHandle() const;
1674d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams
1684d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams
1694d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams    // Retrieve a file descriptor from the parcel.  This returns the raw fd
1704d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams    // in the parcel, which you do not own -- use dup() to get your own copy.
1714d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams    int                 readFileDescriptor() const;
1729c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines
1736b9b2caf2bf977508e223792bb5eba75091c232dTim Murray    // Reads a blob from the parcel.
174bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams    // The caller should call release() on the blob after reading its contents.
175bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams    status_t            readBlob(size_t len, ReadableBlob* outBlob) const;
176f5c876e82d7cc647ba94d29eb914e64b7977c303Alex Sakhartchouk
177bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams    const flat_binder_object* readObject(bool nullMetaData) const;
178bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams
179bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams    // Explicitly close all file descriptors in the parcel.
1804d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams    void                closeFileDescriptors();
1814d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams
1824d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams    typedef void        (*release_func)(Parcel* parcel,
183b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk                                        const uint8_t* data, size_t dataSize,
184b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk                                        const size_t* objects, size_t objectsSize,
1854d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams                                        void* cookie);
1864d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams
1874d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams    const uint8_t*      ipcData() const;
1884d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams    size_t              ipcDataSize() const;
1894d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams    const size_t*       ipcObjects() const;
1904d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams    size_t              ipcObjectsCount() const;
1914d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams    void                ipcSetDataReference(const uint8_t* data, size_t dataSize,
1929c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines                                            const size_t* objects, size_t objectsCount,
1936b9b2caf2bf977508e223792bb5eba75091c232dTim Murray                                            release_func relFunc, void* relCookie);
1946b9b2caf2bf977508e223792bb5eba75091c232dTim Murray
195bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams    void                print(TextOutput& to, uint32_t flags = 0) const;
196f5c876e82d7cc647ba94d29eb914e64b7977c303Alex Sakhartchouk
197bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Samsprivate:
198bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams                        Parcel(const Parcel& o);
199bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams    Parcel&             operator=(const Parcel& o);
2004d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams
2014d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams    status_t            finishWrite(size_t len);
2024d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams    void                releaseObjects();
203b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk    void                acquireObjects();
204b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk    status_t            growData(size_t len);
2054d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams    status_t            restartWrite(size_t desired);
2064d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams    status_t            continueWrite(size_t desired);
2074d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams    void                freeDataNoInit();
2084d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams    void                initState();
2094d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams    void                scanForFds() const;
2104d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams
2114d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams    template<class T>
2126b9b2caf2bf977508e223792bb5eba75091c232dTim Murray    status_t            readAligned(T *pArg) const;
2136b9b2caf2bf977508e223792bb5eba75091c232dTim Murray
2146b9b2caf2bf977508e223792bb5eba75091c232dTim Murray    template<class T>   T readAligned() const;
2156b9b2caf2bf977508e223792bb5eba75091c232dTim Murray
2166b9b2caf2bf977508e223792bb5eba75091c232dTim Murray    template<class T>
2176b9b2caf2bf977508e223792bb5eba75091c232dTim Murray    status_t            writeAligned(T val);
2186b9b2caf2bf977508e223792bb5eba75091c232dTim Murray
2196b9b2caf2bf977508e223792bb5eba75091c232dTim Murray    status_t            mError;
2206b9b2caf2bf977508e223792bb5eba75091c232dTim Murray    uint8_t*            mData;
2216b9b2caf2bf977508e223792bb5eba75091c232dTim Murray    size_t              mDataSize;
2226b9b2caf2bf977508e223792bb5eba75091c232dTim Murray    size_t              mDataCapacity;
2236b9b2caf2bf977508e223792bb5eba75091c232dTim Murray    mutable size_t      mDataPos;
2246b9b2caf2bf977508e223792bb5eba75091c232dTim Murray    size_t*             mObjects;
2256b9b2caf2bf977508e223792bb5eba75091c232dTim Murray    size_t              mObjectsSize;
2266b9b2caf2bf977508e223792bb5eba75091c232dTim Murray    size_t              mObjectsCapacity;
2276b9b2caf2bf977508e223792bb5eba75091c232dTim Murray    mutable size_t      mNextObjectHint;
2286b9b2caf2bf977508e223792bb5eba75091c232dTim Murray
2296b9b2caf2bf977508e223792bb5eba75091c232dTim Murray    mutable bool        mFdsKnown;
2306b9b2caf2bf977508e223792bb5eba75091c232dTim Murray    mutable bool        mHasFds;
2316b9b2caf2bf977508e223792bb5eba75091c232dTim Murray    bool                mAllowFds;
2326b9b2caf2bf977508e223792bb5eba75091c232dTim Murray
2336b9b2caf2bf977508e223792bb5eba75091c232dTim Murray    release_func        mOwner;
2346b9b2caf2bf977508e223792bb5eba75091c232dTim Murray    void*               mOwnerCookie;
2356b9b2caf2bf977508e223792bb5eba75091c232dTim Murray
2366b9b2caf2bf977508e223792bb5eba75091c232dTim Murray    class Blob {
2376b9b2caf2bf977508e223792bb5eba75091c232dTim Murray    public:
2386b9b2caf2bf977508e223792bb5eba75091c232dTim Murray        Blob();
2396b9b2caf2bf977508e223792bb5eba75091c232dTim Murray        ~Blob();
2406b9b2caf2bf977508e223792bb5eba75091c232dTim Murray
2416b9b2caf2bf977508e223792bb5eba75091c232dTim Murray        void release();
2426b9b2caf2bf977508e223792bb5eba75091c232dTim Murray        inline size_t size() const { return mSize; }
2436b9b2caf2bf977508e223792bb5eba75091c232dTim Murray
2446b9b2caf2bf977508e223792bb5eba75091c232dTim Murray    protected:
2456b9b2caf2bf977508e223792bb5eba75091c232dTim Murray        void init(bool mapped, void* data, size_t size);
2466b9b2caf2bf977508e223792bb5eba75091c232dTim Murray        void clear();
2476b9b2caf2bf977508e223792bb5eba75091c232dTim Murray
2486b9b2caf2bf977508e223792bb5eba75091c232dTim Murray        bool mMapped;
2496b9b2caf2bf977508e223792bb5eba75091c232dTim Murray        void* mData;
2506b9b2caf2bf977508e223792bb5eba75091c232dTim Murray        size_t mSize;
2516b9b2caf2bf977508e223792bb5eba75091c232dTim Murray    };
2526b9b2caf2bf977508e223792bb5eba75091c232dTim Murray
2536b9b2caf2bf977508e223792bb5eba75091c232dTim Murraypublic:
2546b9b2caf2bf977508e223792bb5eba75091c232dTim Murray    class ReadableBlob : public Blob {
2556b9b2caf2bf977508e223792bb5eba75091c232dTim Murray        friend class Parcel;
2566b9b2caf2bf977508e223792bb5eba75091c232dTim Murray    public:
2576b9b2caf2bf977508e223792bb5eba75091c232dTim Murray        inline const void* data() const { return mData; }
2586b9b2caf2bf977508e223792bb5eba75091c232dTim Murray    };
2596b9b2caf2bf977508e223792bb5eba75091c232dTim Murray
2606b9b2caf2bf977508e223792bb5eba75091c232dTim Murray    class WritableBlob : public Blob {
2616b9b2caf2bf977508e223792bb5eba75091c232dTim Murray        friend class Parcel;
2626b9b2caf2bf977508e223792bb5eba75091c232dTim Murray    public:
2636b9b2caf2bf977508e223792bb5eba75091c232dTim Murray        inline void* data() { return mData; }
2646b9b2caf2bf977508e223792bb5eba75091c232dTim Murray    };
2656b9b2caf2bf977508e223792bb5eba75091c232dTim Murray};
2666b9b2caf2bf977508e223792bb5eba75091c232dTim Murray
2676b9b2caf2bf977508e223792bb5eba75091c232dTim Murray// ---------------------------------------------------------------------------
2686b9b2caf2bf977508e223792bb5eba75091c232dTim Murray
2696b9b2caf2bf977508e223792bb5eba75091c232dTim Murrayinline TextOutput& operator<<(TextOutput& to, const Parcel& parcel)
2706b9b2caf2bf977508e223792bb5eba75091c232dTim Murray{
2714d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams    parcel.print(to);
2729c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines    return to;
273c11e25c4e653124def1fb18e203b894f42106cbeTim Murray}
274c11e25c4e653124def1fb18e203b894f42106cbeTim Murray
275bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams// ---------------------------------------------------------------------------
2760835d42be9b215f845e30db03211c86670cfa12aJason Sams
2770835d42be9b215f845e30db03211c86670cfa12aJason Sams// Generic acquire and release of objects.
2780835d42be9b215f845e30db03211c86670cfa12aJason Samsvoid acquire_object(const sp<ProcessState>& proc,
2790835d42be9b215f845e30db03211c86670cfa12aJason Sams                    const flat_binder_object& obj, const void* who);
2800835d42be9b215f845e30db03211c86670cfa12aJason Samsvoid release_object(const sp<ProcessState>& proc,
2810835d42be9b215f845e30db03211c86670cfa12aJason Sams                    const flat_binder_object& obj, const void* who);
2820835d42be9b215f845e30db03211c86670cfa12aJason Sams
283f5b3510c706ed1f7611760dff0c94f2111531c68Alex Sakhartchoukvoid flatten_binder(const sp<ProcessState>& proc,
2840835d42be9b215f845e30db03211c86670cfa12aJason Sams                    const sp<IBinder>& binder, flat_binder_object* out);
2850835d42be9b215f845e30db03211c86670cfa12aJason Samsvoid flatten_binder(const sp<ProcessState>& proc,
2860835d42be9b215f845e30db03211c86670cfa12aJason Sams                    const wp<IBinder>& binder, flat_binder_object* out);
2870835d42be9b215f845e30db03211c86670cfa12aJason Samsstatus_t unflatten_binder(const sp<ProcessState>& proc,
2880835d42be9b215f845e30db03211c86670cfa12aJason Sams                          const flat_binder_object& flat, sp<IBinder>* out);
2890835d42be9b215f845e30db03211c86670cfa12aJason Samsstatus_t unflatten_binder(const sp<ProcessState>& proc,
2900835d42be9b215f845e30db03211c86670cfa12aJason Sams                          const flat_binder_object& flat, wp<IBinder>* out);
2910835d42be9b215f845e30db03211c86670cfa12aJason Sams
292f5b3510c706ed1f7611760dff0c94f2111531c68Alex Sakhartchouk}; // namespace android
2930835d42be9b215f845e30db03211c86670cfa12aJason Sams
2940835d42be9b215f845e30db03211c86670cfa12aJason Sams// ---------------------------------------------------------------------------
295b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk
2968bb41dd61474e977aa61048ba8f733a984a3b22dJason Sams#endif // ANDROID_PARCEL_H
2978bb41dd61474e977aa61048ba8f733a984a3b22dJason Sams