Parcel.h revision 5c0106e134366312206702f1b072347e20c90374
1db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn/* 2db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn * Copyright (C) 2005 The Android Open Source Project 36d8dfbd8149942f25f2b9643a12f1fb38f3be834Dianne Hackborn * 46d8dfbd8149942f25f2b9643a12f1fb38f3be834Dianne Hackborn * Licensed under the Apache License, Version 2.0 (the "License"); 5db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn * you may not use this file except in compliance with the License. 6db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn * You may obtain a copy of the License at 7db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn * 8db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn * http://www.apache.org/licenses/LICENSE-2.0 9db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn * 10db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn * Unless required by applicable law or agreed to in writing, software 11db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn * distributed under the License is distributed on an "AS IS" BASIS, 12db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn * See the License for the specific language governing permissions and 14db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn * limitations under the License. 15db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn */ 16db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn 17db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn#ifndef ANDROID_PARCEL_H 18b3d4cb369e37b1b7e85832cc035226dc7cc8f380Dianne Hackborn#define ANDROID_PARCEL_H 19e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn 20e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn#include <cutils/native_handle.h> 21e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn#include <utils/Errors.h> 22e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn#include <utils/RefBase.h> 23e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn#include <utils/String16.h> 24e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn#include <utils/Vector.h> 25e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn#include <utils/Flattenable.h> 26e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn 27e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn// --------------------------------------------------------------------------- 28e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackbornnamespace android { 29e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn 30e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborntemplate <typename T> class Flattenable; 31e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborntemplate <typename T> class LightFlattenable; 32e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackbornclass IBinder; 33e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackbornclass IPCThreadState; 34e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackbornclass ProcessState; 35e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackbornclass String8; 36e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackbornclass TextOutput; 378c84109b9fbbf473b225707a38261ff5f99d95fbDianne Hackborn 388c84109b9fbbf473b225707a38261ff5f99d95fbDianne Hackbornstruct flat_binder_object; // defined in support_p/binder_module.h 39db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn 40db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackbornclass Parcel { 41db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackbornpublic: 42e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn class ReadableBlob; 43e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn class WritableBlob; 448c84109b9fbbf473b225707a38261ff5f99d95fbDianne Hackborn 458c84109b9fbbf473b225707a38261ff5f99d95fbDianne Hackborn Parcel(); 466d8dfbd8149942f25f2b9643a12f1fb38f3be834Dianne Hackborn ~Parcel(); 478c84109b9fbbf473b225707a38261ff5f99d95fbDianne Hackborn 48db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn const uint8_t* data() const; 498c84109b9fbbf473b225707a38261ff5f99d95fbDianne Hackborn size_t dataSize() const; 508c84109b9fbbf473b225707a38261ff5f99d95fbDianne Hackborn size_t dataAvail() const; 51e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn size_t dataPosition() const; 52db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn size_t dataCapacity() const; 53db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn 54db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn status_t setDataSize(size_t size); 55db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn void setDataPosition(size_t pos) const; 56db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn status_t setDataCapacity(size_t size); 57db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn 58db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn status_t setData(const uint8_t* buffer, size_t len); 59db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn 60db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn status_t appendFrom(const Parcel *parcel, 61db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn size_t start, size_t len); 62db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn 63db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn bool pushAllowFds(bool allowFds); 648c84109b9fbbf473b225707a38261ff5f99d95fbDianne Hackborn void restoreAllowFds(bool lastValue); 65db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn 66db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn bool hasFileDescriptors() const; 67db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn 68db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn // Writes the RPC header. 69db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn status_t writeInterfaceToken(const String16& interface); 70db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn 71db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn // Parses the RPC header, returning true if the interface name 72db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn // in the header matches the expected interface from the caller. 73db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn // 74db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn // Additionally, enforceInterface does part of the work of 75db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn // propagating the StrictMode policy mask, populating the current 76db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn // IPCThreadState, which as an optimization may optionally be 77db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn // passed in. 78db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn bool enforceInterface(const String16& interface, 79db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn IPCThreadState* threadState = NULL) const; 80db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn bool checkInterface(IBinder*) const; 81db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn 828c84109b9fbbf473b225707a38261ff5f99d95fbDianne Hackborn void freeData(); 838c84109b9fbbf473b225707a38261ff5f99d95fbDianne Hackborn 848c84109b9fbbf473b225707a38261ff5f99d95fbDianne Hackborn const size_t* objects() const; 858c84109b9fbbf473b225707a38261ff5f99d95fbDianne Hackborn size_t objectsCount() const; 868c84109b9fbbf473b225707a38261ff5f99d95fbDianne Hackborn 878c84109b9fbbf473b225707a38261ff5f99d95fbDianne Hackborn status_t errorCheck() const; 888c84109b9fbbf473b225707a38261ff5f99d95fbDianne Hackborn void setError(status_t err); 898c84109b9fbbf473b225707a38261ff5f99d95fbDianne Hackborn 908c84109b9fbbf473b225707a38261ff5f99d95fbDianne Hackborn status_t write(const void* data, size_t len); 918c84109b9fbbf473b225707a38261ff5f99d95fbDianne Hackborn void* writeInplace(size_t len); 928c84109b9fbbf473b225707a38261ff5f99d95fbDianne Hackborn status_t writeUnpadded(const void* data, size_t len); 938c84109b9fbbf473b225707a38261ff5f99d95fbDianne Hackborn status_t writeInt32(int32_t val); 948c84109b9fbbf473b225707a38261ff5f99d95fbDianne Hackborn status_t writeInt64(int64_t val); 958c84109b9fbbf473b225707a38261ff5f99d95fbDianne Hackborn status_t writeFloat(float val); 968c84109b9fbbf473b225707a38261ff5f99d95fbDianne Hackborn status_t writeDouble(double val); 978c84109b9fbbf473b225707a38261ff5f99d95fbDianne Hackborn status_t writeIntPtr(intptr_t val); 988c84109b9fbbf473b225707a38261ff5f99d95fbDianne Hackborn status_t writeCString(const char* str); 998c84109b9fbbf473b225707a38261ff5f99d95fbDianne Hackborn status_t writeString8(const String8& str); 1008c84109b9fbbf473b225707a38261ff5f99d95fbDianne Hackborn status_t writeString16(const String16& str); 1018c84109b9fbbf473b225707a38261ff5f99d95fbDianne Hackborn status_t writeString16(const char16_t* str, size_t len); 1028c84109b9fbbf473b225707a38261ff5f99d95fbDianne Hackborn status_t writeStrongBinder(const sp<IBinder>& val); 103b3d4cb369e37b1b7e85832cc035226dc7cc8f380Dianne Hackborn status_t writeWeakBinder(const wp<IBinder>& val); 1048c84109b9fbbf473b225707a38261ff5f99d95fbDianne Hackborn status_t writeInt32Array(size_t len, const int32_t *val); 1058c84109b9fbbf473b225707a38261ff5f99d95fbDianne Hackborn 1068c84109b9fbbf473b225707a38261ff5f99d95fbDianne Hackborn template<typename T> 1078c84109b9fbbf473b225707a38261ff5f99d95fbDianne Hackborn status_t write(const Flattenable<T>& val); 1088c84109b9fbbf473b225707a38261ff5f99d95fbDianne Hackborn 1098c84109b9fbbf473b225707a38261ff5f99d95fbDianne Hackborn template<typename T> 110db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn status_t write(const LightFlattenable<T>& val); 111e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn 1126d8dfbd8149942f25f2b9643a12f1fb38f3be834Dianne Hackborn 113e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn // Place a native_handle into the parcel (the native_handle's file- 114e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn // descriptors are dup'ed, so it is safe to delete the native_handle 115db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn // when this function returns). 116db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn // Doesn't take ownership of the native_handle. 117db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn status_t writeNativeHandle(const native_handle* handle); 118db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn 119db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn // Place a file descriptor into the parcel. The given fd must remain 120db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn // valid for the lifetime of the parcel. 121db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn // The Parcel does not take ownership of the given fd unless you ask it to. 122db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn status_t writeFileDescriptor(int fd, bool takeOwnership = false); 1238c84109b9fbbf473b225707a38261ff5f99d95fbDianne Hackborn 1248c84109b9fbbf473b225707a38261ff5f99d95fbDianne Hackborn // Place a file descriptor into the parcel. A dup of the fd is made, which 1258c84109b9fbbf473b225707a38261ff5f99d95fbDianne Hackborn // will be closed once the parcel is destroyed. 1268c84109b9fbbf473b225707a38261ff5f99d95fbDianne Hackborn status_t writeDupFileDescriptor(int fd); 127db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn 128db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn // Writes a raw fd and optional comm channel fd to the parcel as a ParcelFileDescriptor. 129db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn // A dup's of the fds are made, which will be closed once the parcel is destroyed. 130db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn // Null values are passed as -1. 131db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn status_t writeParcelFileDescriptor(int fd, int commChannel = -1); 132db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn 1338c84109b9fbbf473b225707a38261ff5f99d95fbDianne Hackborn // Writes a blob to the parcel. 134db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn // If the blob is small, then it is stored in-place, otherwise it is 135db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn // transferred by way of an anonymous shared memory region. 136db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn // The caller should call release() on the blob after writing its contents. 1376d8dfbd8149942f25f2b9643a12f1fb38f3be834Dianne Hackborn status_t writeBlob(size_t len, WritableBlob* outBlob); 138db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn 139db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn status_t writeObject(const flat_binder_object& val, bool nullMetaData); 140db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn 141db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn // Like Parcel.java's writeNoException(). Just writes a zero int32. 142db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn // Currently the native implementation doesn't do any of the StrictMode 143db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn // stack gathering and serialization that the Java implementation does. 144db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn status_t writeNoException(); 145db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn 146db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn void remove(size_t start, size_t amt); 147db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn 148db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn status_t read(void* outData, size_t len) const; 149db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn const void* readInplace(size_t len) const; 150db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn int32_t readInt32() const; 1518c84109b9fbbf473b225707a38261ff5f99d95fbDianne Hackborn status_t readInt32(int32_t *pArg) const; 1528c84109b9fbbf473b225707a38261ff5f99d95fbDianne Hackborn int64_t readInt64() const; 1538c84109b9fbbf473b225707a38261ff5f99d95fbDianne Hackborn status_t readInt64(int64_t *pArg) const; 1548c84109b9fbbf473b225707a38261ff5f99d95fbDianne Hackborn float readFloat() const; 1556d8dfbd8149942f25f2b9643a12f1fb38f3be834Dianne Hackborn status_t readFloat(float *pArg) const; 1568c84109b9fbbf473b225707a38261ff5f99d95fbDianne Hackborn double readDouble() const; 1578c84109b9fbbf473b225707a38261ff5f99d95fbDianne Hackborn status_t readDouble(double *pArg) const; 1588c84109b9fbbf473b225707a38261ff5f99d95fbDianne Hackborn intptr_t readIntPtr() const; 1598c84109b9fbbf473b225707a38261ff5f99d95fbDianne Hackborn status_t readIntPtr(intptr_t *pArg) const; 1608c84109b9fbbf473b225707a38261ff5f99d95fbDianne Hackborn 1618c84109b9fbbf473b225707a38261ff5f99d95fbDianne Hackborn const char* readCString() const; 1628c84109b9fbbf473b225707a38261ff5f99d95fbDianne Hackborn String8 readString8() const; 1638c84109b9fbbf473b225707a38261ff5f99d95fbDianne Hackborn String16 readString16() const; 1648c84109b9fbbf473b225707a38261ff5f99d95fbDianne Hackborn const char16_t* readString16Inplace(size_t* outLen) const; 1658c84109b9fbbf473b225707a38261ff5f99d95fbDianne Hackborn sp<IBinder> readStrongBinder() const; 1668c84109b9fbbf473b225707a38261ff5f99d95fbDianne Hackborn wp<IBinder> readWeakBinder() const; 1678c84109b9fbbf473b225707a38261ff5f99d95fbDianne Hackborn 1688c84109b9fbbf473b225707a38261ff5f99d95fbDianne Hackborn template<typename T> 1698c84109b9fbbf473b225707a38261ff5f99d95fbDianne Hackborn status_t read(Flattenable<T>& val) const; 1708c84109b9fbbf473b225707a38261ff5f99d95fbDianne Hackborn 1718c84109b9fbbf473b225707a38261ff5f99d95fbDianne Hackborn template<typename T> 172b3d4cb369e37b1b7e85832cc035226dc7cc8f380Dianne Hackborn status_t read(LightFlattenable<T>& val) const; 1738c84109b9fbbf473b225707a38261ff5f99d95fbDianne Hackborn 1748c84109b9fbbf473b225707a38261ff5f99d95fbDianne Hackborn // Like Parcel.java's readExceptionCode(). Reads the first int32 1758c84109b9fbbf473b225707a38261ff5f99d95fbDianne Hackborn // off of a Parcel's header, returning 0 or the negative error 1768c84109b9fbbf473b225707a38261ff5f99d95fbDianne Hackborn // code on exceptions, but also deals with skipping over rich 1778c84109b9fbbf473b225707a38261ff5f99d95fbDianne Hackborn // response headers. Callers should use this to read & parse the 1788c84109b9fbbf473b225707a38261ff5f99d95fbDianne Hackborn // response headers rather than doing it by hand. 179db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn int32_t readExceptionCode() const; 180e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn 1816d8dfbd8149942f25f2b9643a12f1fb38f3be834Dianne Hackborn // Retrieve native_handle from the parcel. This returns a copy of the 182e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn // parcel's native_handle (the caller takes ownership). The caller 183e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn // must free the native_handle with native_handle_close() and 184db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn // native_handle_delete(). 185db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn native_handle* readNativeHandle() const; 186db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn 1876d8dfbd8149942f25f2b9643a12f1fb38f3be834Dianne Hackborn 1886d8dfbd8149942f25f2b9643a12f1fb38f3be834Dianne Hackborn // Retrieve a file descriptor from the parcel. This returns the raw fd 1896d8dfbd8149942f25f2b9643a12f1fb38f3be834Dianne Hackborn // in the parcel, which you do not own -- use dup() to get your own copy. 1906d8dfbd8149942f25f2b9643a12f1fb38f3be834Dianne Hackborn int readFileDescriptor() const; 1916d8dfbd8149942f25f2b9643a12f1fb38f3be834Dianne Hackborn 1926d8dfbd8149942f25f2b9643a12f1fb38f3be834Dianne Hackborn // Reads a ParcelFileDescriptor from the parcel. Returns the raw fd as 1936d8dfbd8149942f25f2b9643a12f1fb38f3be834Dianne Hackborn // the result, and the optional comm channel fd in outCommChannel. 1946d8dfbd8149942f25f2b9643a12f1fb38f3be834Dianne Hackborn // Null values are returned as -1. 1956d8dfbd8149942f25f2b9643a12f1fb38f3be834Dianne Hackborn int readParcelFileDescriptor(int& outCommChannel) const; 1966d8dfbd8149942f25f2b9643a12f1fb38f3be834Dianne Hackborn 1976d8dfbd8149942f25f2b9643a12f1fb38f3be834Dianne Hackborn // Reads a blob from the parcel. 1986d8dfbd8149942f25f2b9643a12f1fb38f3be834Dianne Hackborn // The caller should call release() on the blob after reading its contents. 1996d8dfbd8149942f25f2b9643a12f1fb38f3be834Dianne Hackborn status_t readBlob(size_t len, ReadableBlob* outBlob) const; 2006d8dfbd8149942f25f2b9643a12f1fb38f3be834Dianne Hackborn 2016d8dfbd8149942f25f2b9643a12f1fb38f3be834Dianne Hackborn const flat_binder_object* readObject(bool nullMetaData) const; 2026d8dfbd8149942f25f2b9643a12f1fb38f3be834Dianne Hackborn 2036d8dfbd8149942f25f2b9643a12f1fb38f3be834Dianne Hackborn // Explicitly close all file descriptors in the parcel. 2046d8dfbd8149942f25f2b9643a12f1fb38f3be834Dianne Hackborn void closeFileDescriptors(); 2056d8dfbd8149942f25f2b9643a12f1fb38f3be834Dianne Hackborn 2066d8dfbd8149942f25f2b9643a12f1fb38f3be834Dianne Hackborn typedef void (*release_func)(Parcel* parcel, 2076d8dfbd8149942f25f2b9643a12f1fb38f3be834Dianne Hackborn const uint8_t* data, size_t dataSize, 2086d8dfbd8149942f25f2b9643a12f1fb38f3be834Dianne Hackborn const size_t* objects, size_t objectsSize, 2096d8dfbd8149942f25f2b9643a12f1fb38f3be834Dianne Hackborn void* cookie); 2106d8dfbd8149942f25f2b9643a12f1fb38f3be834Dianne Hackborn 2116d8dfbd8149942f25f2b9643a12f1fb38f3be834Dianne Hackborn const uint8_t* ipcData() const; 2126d8dfbd8149942f25f2b9643a12f1fb38f3be834Dianne Hackborn size_t ipcDataSize() const; 2136d8dfbd8149942f25f2b9643a12f1fb38f3be834Dianne Hackborn const size_t* ipcObjects() const; 2146d8dfbd8149942f25f2b9643a12f1fb38f3be834Dianne Hackborn size_t ipcObjectsCount() const; 215b3d4cb369e37b1b7e85832cc035226dc7cc8f380Dianne Hackborn void ipcSetDataReference(const uint8_t* data, size_t dataSize, 2166d8dfbd8149942f25f2b9643a12f1fb38f3be834Dianne Hackborn const size_t* objects, size_t objectsCount, 2176d8dfbd8149942f25f2b9643a12f1fb38f3be834Dianne Hackborn release_func relFunc, void* relCookie); 2186d8dfbd8149942f25f2b9643a12f1fb38f3be834Dianne Hackborn 2196d8dfbd8149942f25f2b9643a12f1fb38f3be834Dianne Hackborn void print(TextOutput& to, uint32_t flags = 0) const; 2206d8dfbd8149942f25f2b9643a12f1fb38f3be834Dianne Hackborn 2216d8dfbd8149942f25f2b9643a12f1fb38f3be834Dianne Hackbornprivate: 2226d8dfbd8149942f25f2b9643a12f1fb38f3be834Dianne Hackborn Parcel(const Parcel& o); 2236d8dfbd8149942f25f2b9643a12f1fb38f3be834Dianne Hackborn Parcel& operator=(const Parcel& o); 2246d8dfbd8149942f25f2b9643a12f1fb38f3be834Dianne Hackborn 2256d8dfbd8149942f25f2b9643a12f1fb38f3be834Dianne Hackborn status_t finishWrite(size_t len); 2266d8dfbd8149942f25f2b9643a12f1fb38f3be834Dianne Hackborn void releaseObjects(); 2276d8dfbd8149942f25f2b9643a12f1fb38f3be834Dianne Hackborn void acquireObjects(); 2286d8dfbd8149942f25f2b9643a12f1fb38f3be834Dianne Hackborn status_t growData(size_t len); 2296d8dfbd8149942f25f2b9643a12f1fb38f3be834Dianne Hackborn status_t restartWrite(size_t desired); 230e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn status_t continueWrite(size_t desired); 231e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn void freeDataNoInit(); 232e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn void initState(); 233e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn void scanForFds() const; 234e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn 235e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn template<class T> 236e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn status_t readAligned(T *pArg) const; 237e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn 238db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn template<class T> T readAligned() const; 239db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn 240db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn template<class T> 241e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn status_t writeAligned(T val); 242db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn 243e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn status_t mError; 244e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn uint8_t* mData; 245e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn size_t mDataSize; 246e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn size_t mDataCapacity; 247db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn mutable size_t mDataPos; 248e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn size_t* mObjects; 249e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn size_t mObjectsSize; 250e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn size_t mObjectsCapacity; 251e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn mutable size_t mNextObjectHint; 252e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn 253db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn mutable bool mFdsKnown; 254db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn mutable bool mHasFds; 255db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn bool mAllowFds; 256e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn 257e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn release_func mOwner; 258db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn void* mOwnerCookie; 259e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn 260e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn class Blob { 261e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn public: 262e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn Blob(); 263db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn ~Blob(); 264db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn 265e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn void release(); 266e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn inline size_t size() const { return mSize; } 267db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn 268e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn protected: 269e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn void init(bool mapped, void* data, size_t size); 270e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn void clear(); 271db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn 272db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn bool mMapped; 273db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn void* mData; 274db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn size_t mSize; 275db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn }; 276db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn 277db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn class FlattenableHelperInterface { 278db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn protected: 279db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn ~FlattenableHelperInterface() { } 280e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn public: 281db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn virtual size_t getFlattenedSize() const = 0; 2828c84109b9fbbf473b225707a38261ff5f99d95fbDianne Hackborn virtual size_t getFdCount() const = 0; 283e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn virtual status_t flatten(void* buffer, size_t size, int* fds, size_t count) const = 0; 284db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn virtual status_t unflatten(void const* buffer, size_t size, int const* fds, size_t count) = 0; 285db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn }; 286db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn 287db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn template<typename T> 288db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn class FlattenableHelper : public FlattenableHelperInterface { 289db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn friend class Parcel; 290e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn const Flattenable<T>& val; 2918c84109b9fbbf473b225707a38261ff5f99d95fbDianne Hackborn explicit FlattenableHelper(const Flattenable<T>& val) : val(val) { } 292db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn 293db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn public: 294db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn virtual size_t getFlattenedSize() const { 295db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn return val.getFlattenedSize(); 296e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn } 297db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn virtual size_t getFdCount() const { 298db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn return val.getFdCount(); 299db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn } 300db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn virtual status_t flatten(void* buffer, size_t size, int* fds, size_t count) const { 301db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn return val.flatten(buffer, size, fds, count); 302db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn } 303e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn virtual status_t unflatten(void const* buffer, size_t size, int const* fds, size_t count) { 304db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn return const_cast<Flattenable<T>&>(val).unflatten(buffer, size, fds, count); 305db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn } 306db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn }; 307db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn status_t write(const FlattenableHelperInterface& val); 308db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn status_t read(FlattenableHelperInterface& val) const; 309db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn 310e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackbornpublic: 3118c84109b9fbbf473b225707a38261ff5f99d95fbDianne Hackborn class ReadableBlob : public Blob { 312db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn friend class Parcel; 313db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn public: 314db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn inline const void* data() const { return mData; } 315db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn }; 316e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn 317db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn class WritableBlob : public Blob { 318db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn friend class Parcel; 319db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn public: 320db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn inline void* data() { return mData; } 321db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn }; 322db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn}; 323e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn 324db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn// --------------------------------------------------------------------------- 325db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn 326db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborntemplate<typename T> 327db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackbornstatus_t Parcel::write(const Flattenable<T>& val) { 328db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn const FlattenableHelper<T> helper(val); 329db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn return write(helper); 330e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn} 331db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn 332db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborntemplate<typename T> 333db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackbornstatus_t Parcel::write(const LightFlattenable<T>& val) { 334db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn size_t size(val.getFlattenedSize()); 335db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn if (!val.isFixedSize()) { 336db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn status_t err = writeInt32(size); 337db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn if (err != NO_ERROR) { 338db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn return err; 339e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn } 340db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn } 341db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn if (size) { 342db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn void* buffer = writeInplace(size); 343db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn if (buffer == NULL) 344db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn return NO_MEMORY; 345db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn return val.flatten(buffer, size); 346db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn } 347db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn return NO_ERROR; 348db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn} 349e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn 350db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborntemplate<typename T> 351db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackbornstatus_t Parcel::read(Flattenable<T>& val) const { 352db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn FlattenableHelper<T> helper(val); 353db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn return read(helper); 354db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn} 355e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn 356db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborntemplate<typename T> 3576d8dfbd8149942f25f2b9643a12f1fb38f3be834Dianne Hackbornstatus_t Parcel::read(LightFlattenable<T>& val) const { 358e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn size_t size; 359e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn if (val.isFixedSize()) { 3606d8dfbd8149942f25f2b9643a12f1fb38f3be834Dianne Hackborn size = val.getFlattenedSize(); 3616d8dfbd8149942f25f2b9643a12f1fb38f3be834Dianne Hackborn } else { 3626d8dfbd8149942f25f2b9643a12f1fb38f3be834Dianne Hackborn int32_t s; 3636d8dfbd8149942f25f2b9643a12f1fb38f3be834Dianne Hackborn status_t err = readInt32(&s); 3646d8dfbd8149942f25f2b9643a12f1fb38f3be834Dianne Hackborn if (err != NO_ERROR) { 3656d8dfbd8149942f25f2b9643a12f1fb38f3be834Dianne Hackborn return err; 3666d8dfbd8149942f25f2b9643a12f1fb38f3be834Dianne Hackborn } 3676d8dfbd8149942f25f2b9643a12f1fb38f3be834Dianne Hackborn size = s; 3686d8dfbd8149942f25f2b9643a12f1fb38f3be834Dianne Hackborn } 3696d8dfbd8149942f25f2b9643a12f1fb38f3be834Dianne Hackborn if (size) { 3706d8dfbd8149942f25f2b9643a12f1fb38f3be834Dianne Hackborn void const* buffer = readInplace(size); 3716d8dfbd8149942f25f2b9643a12f1fb38f3be834Dianne Hackborn return buffer == NULL ? NO_MEMORY : 3726d8dfbd8149942f25f2b9643a12f1fb38f3be834Dianne Hackborn val.unflatten(buffer, size); 373db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn } 374db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn return NO_ERROR; 375db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn} 376db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn 377db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn// --------------------------------------------------------------------------- 378db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn 379db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborninline TextOutput& operator<<(TextOutput& to, const Parcel& parcel) 380db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn{ 381db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn parcel.print(to); 382db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn return to; 383db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn} 384db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn 385e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn// --------------------------------------------------------------------------- 386e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn 387e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn// Generic acquire and release of objects. 388e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackbornvoid acquire_object(const sp<ProcessState>& proc, 389e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn const flat_binder_object& obj, const void* who); 3906d8dfbd8149942f25f2b9643a12f1fb38f3be834Dianne Hackbornvoid release_object(const sp<ProcessState>& proc, 391e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn const flat_binder_object& obj, const void* who); 392e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn 393e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackbornvoid flatten_binder(const sp<ProcessState>& proc, 394e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn const sp<IBinder>& binder, flat_binder_object* out); 395e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackbornvoid flatten_binder(const sp<ProcessState>& proc, 396e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn const wp<IBinder>& binder, flat_binder_object* out); 397e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackbornstatus_t unflatten_binder(const sp<ProcessState>& proc, 398e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn const flat_binder_object& flat, sp<IBinder>* out); 399e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackbornstatus_t unflatten_binder(const sp<ProcessState>& proc, 400e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn const flat_binder_object& flat, wp<IBinder>* out); 401e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn 402e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn}; // namespace android 403e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn 404e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn// --------------------------------------------------------------------------- 405e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn 4066d8dfbd8149942f25f2b9643a12f1fb38f3be834Dianne Hackborn#endif // ANDROID_PARCEL_H 407e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn