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