Parcel.h revision 7e790af756d7891cb1cf1374bb283a8fbcbe6b49
1bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell/* 2bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell * Copyright (C) 2005 The Android Open Source Project 3bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell * 4bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell * Licensed under the Apache License, Version 2.0 (the "License"); 5bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell * you may not use this file except in compliance with the License. 6bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell * You may obtain a copy of the License at 7bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell * 8bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell * http://www.apache.org/licenses/LICENSE-2.0 9bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell * 10bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell * Unless required by applicable law or agreed to in writing, software 11bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell * distributed under the License is distributed on an "AS IS" BASIS, 12bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell * See the License for the specific language governing permissions and 14bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell * limitations under the License. 15bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell */ 16acce58688e2c3e5abd0b13e78dcf2c26710eabd0Chris Banes 17ac5fe7c617c66850fff75a9fce9979c6e5674b0fAurimas Liutikas#ifndef ANDROID_PARCEL_H 18bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell#define ANDROID_PARCEL_H 19bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 20bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell#include <cutils/native_handle.h> 21bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell#include <utils/Errors.h> 22bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell#include <utils/RefBase.h> 2349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes#include <utils/String16.h> 2449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes#include <utils/Vector.h> 2546be6a08e9d1b4b989f74f800b71a1221321ab6eChris Banes#include <utils/Flattenable.h> 26bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell#include <linux/binder.h> 27bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 28bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell// --------------------------------------------------------------------------- 293de8a4e8305507475d7890205184946a25cf45e7Aurimas Liutikasnamespace android { 303de8a4e8305507475d7890205184946a25cf45e7Aurimas Liutikas 313de8a4e8305507475d7890205184946a25cf45e7Aurimas Liutikastemplate <typename T> class Flattenable; 323de8a4e8305507475d7890205184946a25cf45e7Aurimas Liutikastemplate <typename T> class LightFlattenable; 333de8a4e8305507475d7890205184946a25cf45e7Aurimas Liutikasclass IBinder; 3479e7a9ef79920c7daa10c90339db126a4c3c592eChris Banesclass IPCThreadState; 3549c78900da0d43140fb602431fb93212bd7f6c70Chris Banesclass ProcessState; 36bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powellclass String8; 3749c78900da0d43140fb602431fb93212bd7f6c70Chris Banesclass TextOutput; 38bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 3949c78900da0d43140fb602431fb93212bd7f6c70Chris Banesclass Parcel { 4049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes friend class IPCThreadState; 41bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powellpublic: 4249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes class ReadableBlob; 4349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes class WritableBlob; 4420ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns 4520ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns Parcel(); 4649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes ~Parcel(); 4720ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns 4846be6a08e9d1b4b989f74f800b71a1221321ab6eChris Banes const uint8_t* data() const; 4946be6a08e9d1b4b989f74f800b71a1221321ab6eChris Banes size_t dataSize() const; 5046be6a08e9d1b4b989f74f800b71a1221321ab6eChris Banes size_t dataAvail() const; 5179e7a9ef79920c7daa10c90339db126a4c3c592eChris Banes size_t dataPosition() const; 5249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes size_t dataCapacity() const; 5320ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns 5420ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns status_t setDataSize(size_t size); 5579e7a9ef79920c7daa10c90339db126a4c3c592eChris Banes void setDataPosition(size_t pos) const; 5649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes status_t setDataCapacity(size_t size); 5720ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns 5820ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns status_t setData(const uint8_t* buffer, size_t len); 5979e7a9ef79920c7daa10c90339db126a4c3c592eChris Banes 6020ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns status_t appendFrom(const Parcel *parcel, 6149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes size_t start, size_t len); 6249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 6349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes bool pushAllowFds(bool allowFds); 6449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes void restoreAllowFds(bool lastValue); 6549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 6649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes bool hasFileDescriptors() const; 6749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 6849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes // Writes the RPC header. 6920ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns status_t writeInterfaceToken(const String16& interface); 7020ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns 7120ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns // Parses the RPC header, returning true if the interface name 7220ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns // in the header matches the expected interface from the caller. 7364dbe1d454f1190b3cd8426d09b9119949a10709Kirill Grouchnikov // 7420ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns // Additionally, enforceInterface does part of the work of 7520ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns // propagating the StrictMode policy mask, populating the current 7620ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns // IPCThreadState, which as an optimization may optionally be 7720ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns // passed in. 7820ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns bool enforceInterface(const String16& interface, 7920ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns IPCThreadState* threadState = NULL) const; 8020ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns bool checkInterface(IBinder*) const; 8149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 8220ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns void freeData(); 8320ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns 8420ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johnsprivate: 8520ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns const binder_size_t* objects() const; 8620ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns 8746be6a08e9d1b4b989f74f800b71a1221321ab6eChris Banespublic: 8846be6a08e9d1b4b989f74f800b71a1221321ab6eChris Banes size_t objectsCount() const; 8946be6a08e9d1b4b989f74f800b71a1221321ab6eChris Banes 9046be6a08e9d1b4b989f74f800b71a1221321ab6eChris Banes status_t errorCheck() const; 9146be6a08e9d1b4b989f74f800b71a1221321ab6eChris Banes void setError(status_t err); 9246be6a08e9d1b4b989f74f800b71a1221321ab6eChris Banes 9346be6a08e9d1b4b989f74f800b71a1221321ab6eChris Banes status_t write(const void* data, size_t len); 946ed40c1f86bcb172a1f0f069cde1c571a7781aeeAurimas Liutikas void* writeInplace(size_t len); 9546be6a08e9d1b4b989f74f800b71a1221321ab6eChris Banes status_t writeUnpadded(const void* data, size_t len); 9646be6a08e9d1b4b989f74f800b71a1221321ab6eChris Banes status_t writeInt32(int32_t val); 9746be6a08e9d1b4b989f74f800b71a1221321ab6eChris Banes status_t writeInt64(int64_t val); 9846be6a08e9d1b4b989f74f800b71a1221321ab6eChris Banes status_t writeFloat(float val); 9946be6a08e9d1b4b989f74f800b71a1221321ab6eChris Banes status_t writeDouble(double val); 10046be6a08e9d1b4b989f74f800b71a1221321ab6eChris Banes status_t writeCString(const char* str); 10146be6a08e9d1b4b989f74f800b71a1221321ab6eChris Banes status_t writeString8(const String8& str); 10246be6a08e9d1b4b989f74f800b71a1221321ab6eChris Banes status_t writeString16(const String16& str); 10346be6a08e9d1b4b989f74f800b71a1221321ab6eChris Banes status_t writeString16(const char16_t* str, size_t len); 10446be6a08e9d1b4b989f74f800b71a1221321ab6eChris Banes status_t writeStrongBinder(const sp<IBinder>& val); 10546be6a08e9d1b4b989f74f800b71a1221321ab6eChris Banes status_t writeWeakBinder(const wp<IBinder>& val); 10646be6a08e9d1b4b989f74f800b71a1221321ab6eChris Banes status_t writeInt32Array(size_t len, const int32_t *val); 10746be6a08e9d1b4b989f74f800b71a1221321ab6eChris Banes status_t writeByteArray(size_t len, const uint8_t *val); 10846be6a08e9d1b4b989f74f800b71a1221321ab6eChris Banes 10946be6a08e9d1b4b989f74f800b71a1221321ab6eChris Banes template<typename T> 11046be6a08e9d1b4b989f74f800b71a1221321ab6eChris Banes status_t write(const Flattenable<T>& val); 11146be6a08e9d1b4b989f74f800b71a1221321ab6eChris Banes 11246be6a08e9d1b4b989f74f800b71a1221321ab6eChris Banes template<typename T> 11346be6a08e9d1b4b989f74f800b71a1221321ab6eChris Banes status_t write(const LightFlattenable<T>& val); 11446be6a08e9d1b4b989f74f800b71a1221321ab6eChris Banes 11546be6a08e9d1b4b989f74f800b71a1221321ab6eChris Banes 11646be6a08e9d1b4b989f74f800b71a1221321ab6eChris Banes // Place a native_handle into the parcel (the native_handle's file- 11746be6a08e9d1b4b989f74f800b71a1221321ab6eChris Banes // descriptors are dup'ed, so it is safe to delete the native_handle 1186ed40c1f86bcb172a1f0f069cde1c571a7781aeeAurimas Liutikas // when this function returns). 1196ed40c1f86bcb172a1f0f069cde1c571a7781aeeAurimas Liutikas // Doesn't take ownership of the native_handle. 12046be6a08e9d1b4b989f74f800b71a1221321ab6eChris Banes status_t writeNativeHandle(const native_handle* handle); 12146be6a08e9d1b4b989f74f800b71a1221321ab6eChris Banes 12246be6a08e9d1b4b989f74f800b71a1221321ab6eChris Banes // Place a file descriptor into the parcel. The given fd must remain 12346be6a08e9d1b4b989f74f800b71a1221321ab6eChris Banes // valid for the lifetime of the parcel. 12446be6a08e9d1b4b989f74f800b71a1221321ab6eChris Banes // The Parcel does not take ownership of the given fd unless you ask it to. 1256ed40c1f86bcb172a1f0f069cde1c571a7781aeeAurimas Liutikas status_t writeFileDescriptor(int fd, bool takeOwnership = false); 12646be6a08e9d1b4b989f74f800b71a1221321ab6eChris Banes 12746be6a08e9d1b4b989f74f800b71a1221321ab6eChris Banes // Place a file descriptor into the parcel. A dup of the fd is made, which 12846be6a08e9d1b4b989f74f800b71a1221321ab6eChris Banes // will be closed once the parcel is destroyed. 12946be6a08e9d1b4b989f74f800b71a1221321ab6eChris Banes status_t writeDupFileDescriptor(int fd); 1306ed40c1f86bcb172a1f0f069cde1c571a7781aeeAurimas Liutikas 13146be6a08e9d1b4b989f74f800b71a1221321ab6eChris Banes // Writes a raw fd and optional comm channel fd to the parcel as a ParcelFileDescriptor. 13246be6a08e9d1b4b989f74f800b71a1221321ab6eChris Banes // A dup's of the fds are made, which will be closed once the parcel is destroyed. 13346be6a08e9d1b4b989f74f800b71a1221321ab6eChris Banes // Null values are passed as -1. 13446be6a08e9d1b4b989f74f800b71a1221321ab6eChris Banes status_t writeParcelFileDescriptor(int fd, int commChannel = -1); 13546be6a08e9d1b4b989f74f800b71a1221321ab6eChris Banes 13646be6a08e9d1b4b989f74f800b71a1221321ab6eChris Banes // Writes a blob to the parcel. 13746be6a08e9d1b4b989f74f800b71a1221321ab6eChris Banes // If the blob is small, then it is stored in-place, otherwise it is 13820ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns // transferred by way of an anonymous shared memory region. 13920ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns // The caller should call release() on the blob after writing its contents. 14020ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns status_t writeBlob(size_t len, WritableBlob* outBlob); 14120ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns 14220ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns status_t writeObject(const flat_binder_object& val, bool nullMetaData); 14320ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns 14420ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns // Like Parcel.java's writeNoException(). Just writes a zero int32. 14520ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns // Currently the native implementation doesn't do any of the StrictMode 14620ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns // stack gathering and serialization that the Java implementation does. 14720ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns status_t writeNoException(); 14820ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns 14920ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns void remove(size_t start, size_t amt); 15020ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns 15149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes status_t read(void* outData, size_t len) const; 15249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes const void* readInplace(size_t len) const; 15349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes int32_t readInt32() const; 15420ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns status_t readInt32(int32_t *pArg) const; 15520ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns int64_t readInt64() const; 15620ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns status_t readInt64(int64_t *pArg) const; 157acce58688e2c3e5abd0b13e78dcf2c26710eabd0Chris Banes float readFloat() const; 15849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes status_t readFloat(float *pArg) const; 15949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes double readDouble() const; 16049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes status_t readDouble(double *pArg) const; 161acce58688e2c3e5abd0b13e78dcf2c26710eabd0Chris Banes intptr_t readIntPtr() const; 16249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes status_t readIntPtr(intptr_t *pArg) const; 16349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 164fa0f82f629bf95681c14ed559922f77a3030aa18Aurimas Liutikas const char* readCString() const; 16549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes String8 readString8() const; 16649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes String16 readString16() const; 167acce58688e2c3e5abd0b13e78dcf2c26710eabd0Chris Banes const char16_t* readString16Inplace(size_t* outLen) const; 168acce58688e2c3e5abd0b13e78dcf2c26710eabd0Chris Banes sp<IBinder> readStrongBinder() const; 169acce58688e2c3e5abd0b13e78dcf2c26710eabd0Chris Banes wp<IBinder> readWeakBinder() const; 17049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 17149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes template<typename T> 172acce58688e2c3e5abd0b13e78dcf2c26710eabd0Chris Banes status_t read(Flattenable<T>& val) const; 173acce58688e2c3e5abd0b13e78dcf2c26710eabd0Chris Banes 174acce58688e2c3e5abd0b13e78dcf2c26710eabd0Chris Banes template<typename T> 175acce58688e2c3e5abd0b13e78dcf2c26710eabd0Chris Banes status_t read(LightFlattenable<T>& val) const; 176acce58688e2c3e5abd0b13e78dcf2c26710eabd0Chris Banes 177acce58688e2c3e5abd0b13e78dcf2c26710eabd0Chris Banes // Like Parcel.java's readExceptionCode(). Reads the first int32 178acce58688e2c3e5abd0b13e78dcf2c26710eabd0Chris Banes // off of a Parcel's header, returning 0 or the negative error 179acce58688e2c3e5abd0b13e78dcf2c26710eabd0Chris Banes // code on exceptions, but also deals with skipping over rich 180acce58688e2c3e5abd0b13e78dcf2c26710eabd0Chris Banes // response headers. Callers should use this to read & parse the 181acce58688e2c3e5abd0b13e78dcf2c26710eabd0Chris Banes // response headers rather than doing it by hand. 182acce58688e2c3e5abd0b13e78dcf2c26710eabd0Chris Banes int32_t readExceptionCode() const; 183acce58688e2c3e5abd0b13e78dcf2c26710eabd0Chris Banes 184acce58688e2c3e5abd0b13e78dcf2c26710eabd0Chris Banes // Retrieve native_handle from the parcel. This returns a copy of the 185acce58688e2c3e5abd0b13e78dcf2c26710eabd0Chris Banes // parcel's native_handle (the caller takes ownership). The caller 186acce58688e2c3e5abd0b13e78dcf2c26710eabd0Chris Banes // must free the native_handle with native_handle_close() and 187acce58688e2c3e5abd0b13e78dcf2c26710eabd0Chris Banes // native_handle_delete(). 1889addcff1698f71fb4145f39dacaf33a9c1fef24fChris Banes native_handle* readNativeHandle() const; 189acce58688e2c3e5abd0b13e78dcf2c26710eabd0Chris Banes 1909addcff1698f71fb4145f39dacaf33a9c1fef24fChris Banes 19120ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns // Retrieve a file descriptor from the parcel. This returns the raw fd 19220ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns // in the parcel, which you do not own -- use dup() to get your own copy. 19320ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns int readFileDescriptor() const; 19420ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns 19520ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns // Reads a ParcelFileDescriptor from the parcel. Returns the raw fd as 19620ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns // the result, and the optional comm channel fd in outCommChannel. 19720ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns // Null values are returned as -1. 19820ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns int readParcelFileDescriptor(int& outCommChannel) const; 19920ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns 20020ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns // Reads a blob from the parcel. 20120ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns // The caller should call release() on the blob after reading its contents. 202e2104f4b5c8e3ad63570306a25e61502dfe4c418Aurimas Liutikas status_t readBlob(size_t len, ReadableBlob* outBlob) const; 20320ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns 20420ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns const flat_binder_object* readObject(bool nullMetaData) const; 20520ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns 20620ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns // Explicitly close all file descriptors in the parcel. 20720ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns void closeFileDescriptors(); 20820ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns 20920ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns // Debugging: get metrics on current allocations. 21020ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns static size_t getGlobalAllocSize(); 21120ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns static size_t getGlobalAllocCount(); 21220ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns 21320ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johnsprivate: 21420ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns typedef void (*release_func)(Parcel* parcel, 21520ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns const uint8_t* data, size_t dataSize, 21620ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns const binder_size_t* objects, size_t objectsSize, 21720ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns void* cookie); 21820ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns 21920ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns uintptr_t ipcData() const; 22020ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns size_t ipcDataSize() const; 22120ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns uintptr_t ipcObjects() const; 22220ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns size_t ipcObjectsCount() const; 22349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes void ipcSetDataReference(const uint8_t* data, size_t dataSize, 22449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes const binder_size_t* objects, size_t objectsCount, 22549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes release_func relFunc, void* relCookie); 22649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 22749c78900da0d43140fb602431fb93212bd7f6c70Chris Banespublic: 22849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes void print(TextOutput& to, uint32_t flags = 0) const; 22949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 23020ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johnsprivate: 23120ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns Parcel(const Parcel& o); 23220ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns Parcel& operator=(const Parcel& o); 23320ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns 23449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes status_t finishWrite(size_t len); 23549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes void releaseObjects(); 23649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes void acquireObjects(); 23749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes status_t growData(size_t len); 23820ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns status_t restartWrite(size_t desired); 23920ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns status_t continueWrite(size_t desired); 24020ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns status_t writePointer(uintptr_t val); 24120ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns status_t readPointer(uintptr_t *pArg) const; 24220ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns uintptr_t readPointer() const; 24320ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns void freeDataNoInit(); 24420ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns void initState(); 24520ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns void scanForFds() const; 24620ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns 24720ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns template<class T> 24820ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns status_t readAligned(T *pArg) const; 24920ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns 25020ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns template<class T> T readAligned() const; 25120ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns 25220ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns template<class T> 25320ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns status_t writeAligned(T val); 25420ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns 25549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes status_t mError; 25649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes uint8_t* mData; 25749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes size_t mDataSize; 25849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes size_t mDataCapacity; 25949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mutable size_t mDataPos; 26020ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns binder_size_t* mObjects; 26120ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns size_t mObjectsSize; 26220ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns size_t mObjectsCapacity; 26320ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns mutable size_t mNextObjectHint; 26449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 26549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mutable bool mFdsKnown; 26649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mutable bool mHasFds; 26749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes bool mAllowFds; 26849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 26920ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns release_func mOwner; 27049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes void* mOwnerCookie; 27120ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns 27220ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns class Blob { 27349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes public: 27449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes Blob(); 27549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes ~Blob(); 27620ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns 27749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes void release(); 27849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes inline size_t size() const { return mSize; } 27949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 28049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes protected: 28149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes void init(bool mapped, void* data, size_t size); 28249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes void clear(); 28320ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns 28449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes bool mMapped; 28549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes void* mData; 286acce58688e2c3e5abd0b13e78dcf2c26710eabd0Chris Banes size_t mSize; 28749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes }; 28849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 28949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes class FlattenableHelperInterface { 29049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes protected: 29149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes ~FlattenableHelperInterface() { } 29249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes public: 293bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell virtual size_t getFlattenedSize() const = 0; 29449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes virtual size_t getFdCount() const = 0; 295acce58688e2c3e5abd0b13e78dcf2c26710eabd0Chris Banes virtual status_t flatten(void* buffer, size_t size, int* fds, size_t count) const = 0; 29649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes virtual status_t unflatten(void const* buffer, size_t size, int const* fds, size_t count) = 0; 29749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes }; 29849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 29949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes template<typename T> 30049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes class FlattenableHelper : public FlattenableHelperInterface { 30149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes friend class Parcel; 30249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes const Flattenable<T>& val; 303bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell explicit FlattenableHelper(const Flattenable<T>& val) : val(val) { } 304 305 public: 306 virtual size_t getFlattenedSize() const { 307 return val.getFlattenedSize(); 308 } 309 virtual size_t getFdCount() const { 310 return val.getFdCount(); 311 } 312 virtual status_t flatten(void* buffer, size_t size, int* fds, size_t count) const { 313 return val.flatten(buffer, size, fds, count); 314 } 315 virtual status_t unflatten(void const* buffer, size_t size, int const* fds, size_t count) { 316 return const_cast<Flattenable<T>&>(val).unflatten(buffer, size, fds, count); 317 } 318 }; 319 status_t write(const FlattenableHelperInterface& val); 320 status_t read(FlattenableHelperInterface& val) const; 321 322public: 323 class ReadableBlob : public Blob { 324 friend class Parcel; 325 public: 326 inline const void* data() const { return mData; } 327 }; 328 329 class WritableBlob : public Blob { 330 friend class Parcel; 331 public: 332 inline void* data() { return mData; } 333 }; 334}; 335 336// --------------------------------------------------------------------------- 337 338template<typename T> 339status_t Parcel::write(const Flattenable<T>& val) { 340 const FlattenableHelper<T> helper(val); 341 return write(helper); 342} 343 344template<typename T> 345status_t Parcel::write(const LightFlattenable<T>& val) { 346 size_t size(val.getFlattenedSize()); 347 if (!val.isFixedSize()) { 348 status_t err = writeInt32(size); 349 if (err != NO_ERROR) { 350 return err; 351 } 352 } 353 if (size) { 354 void* buffer = writeInplace(size); 355 if (buffer == NULL) 356 return NO_MEMORY; 357 return val.flatten(buffer, size); 358 } 359 return NO_ERROR; 360} 361 362template<typename T> 363status_t Parcel::read(Flattenable<T>& val) const { 364 FlattenableHelper<T> helper(val); 365 return read(helper); 366} 367 368template<typename T> 369status_t Parcel::read(LightFlattenable<T>& val) const { 370 size_t size; 371 if (val.isFixedSize()) { 372 size = val.getFlattenedSize(); 373 } else { 374 int32_t s; 375 status_t err = readInt32(&s); 376 if (err != NO_ERROR) { 377 return err; 378 } 379 size = s; 380 } 381 if (size) { 382 void const* buffer = readInplace(size); 383 return buffer == NULL ? NO_MEMORY : 384 val.unflatten(buffer, size); 385 } 386 return NO_ERROR; 387} 388 389// --------------------------------------------------------------------------- 390 391inline TextOutput& operator<<(TextOutput& to, const Parcel& parcel) 392{ 393 parcel.print(to); 394 return to; 395} 396 397// --------------------------------------------------------------------------- 398 399// Generic acquire and release of objects. 400void acquire_object(const sp<ProcessState>& proc, 401 const flat_binder_object& obj, const void* who); 402void release_object(const sp<ProcessState>& proc, 403 const flat_binder_object& obj, const void* who); 404 405void flatten_binder(const sp<ProcessState>& proc, 406 const sp<IBinder>& binder, flat_binder_object* out); 407void flatten_binder(const sp<ProcessState>& proc, 408 const wp<IBinder>& binder, flat_binder_object* out); 409status_t unflatten_binder(const sp<ProcessState>& proc, 410 const flat_binder_object& flat, sp<IBinder>* out); 411status_t unflatten_binder(const sp<ProcessState>& proc, 412 const flat_binder_object& flat, wp<IBinder>* out); 413 414}; // namespace android 415 416// --------------------------------------------------------------------------- 417 418#endif // ANDROID_PARCEL_H 419