1*77b80299SAndroid Build Coastguard Worker /* 2*77b80299SAndroid Build Coastguard Worker * Copyright (C) 2005 The Android Open Source Project 3*77b80299SAndroid Build Coastguard Worker * 4*77b80299SAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License"); 5*77b80299SAndroid Build Coastguard Worker * you may not use this file except in compliance with the License. 6*77b80299SAndroid Build Coastguard Worker * You may obtain a copy of the License at 7*77b80299SAndroid Build Coastguard Worker * 8*77b80299SAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0 9*77b80299SAndroid Build Coastguard Worker * 10*77b80299SAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software 11*77b80299SAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS, 12*77b80299SAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13*77b80299SAndroid Build Coastguard Worker * See the License for the specific language governing permissions and 14*77b80299SAndroid Build Coastguard Worker * limitations under the License. 15*77b80299SAndroid Build Coastguard Worker */ 16*77b80299SAndroid Build Coastguard Worker 17*77b80299SAndroid Build Coastguard Worker #ifndef ANDROID_HARDWARE_PARCEL_H 18*77b80299SAndroid Build Coastguard Worker #define ANDROID_HARDWARE_PARCEL_H 19*77b80299SAndroid Build Coastguard Worker 20*77b80299SAndroid Build Coastguard Worker #include <string> 21*77b80299SAndroid Build Coastguard Worker #include <vector> 22*77b80299SAndroid Build Coastguard Worker 23*77b80299SAndroid Build Coastguard Worker #include <cutils/native_handle.h> 24*77b80299SAndroid Build Coastguard Worker #include <utils/Errors.h> 25*77b80299SAndroid Build Coastguard Worker #include <utils/RefBase.h> 26*77b80299SAndroid Build Coastguard Worker #include <utils/String16.h> 27*77b80299SAndroid Build Coastguard Worker 28*77b80299SAndroid Build Coastguard Worker #include <hwbinder/IInterface.h> 29*77b80299SAndroid Build Coastguard Worker 30*77b80299SAndroid Build Coastguard Worker // WARNING: this code is part of libhwbinder, a fork of libbinder. Generally, 31*77b80299SAndroid Build Coastguard Worker // this means that it is only relevant to HIDL. Any AIDL- or libbinder-specific 32*77b80299SAndroid Build Coastguard Worker // code should not try to use these things. 33*77b80299SAndroid Build Coastguard Worker 34*77b80299SAndroid Build Coastguard Worker struct binder_buffer_object; 35*77b80299SAndroid Build Coastguard Worker struct flat_binder_object; 36*77b80299SAndroid Build Coastguard Worker 37*77b80299SAndroid Build Coastguard Worker // --------------------------------------------------------------------------- 38*77b80299SAndroid Build Coastguard Worker namespace android { 39*77b80299SAndroid Build Coastguard Worker namespace hardware { 40*77b80299SAndroid Build Coastguard Worker 41*77b80299SAndroid Build Coastguard Worker #ifdef BINDER_IPC_32BIT 42*77b80299SAndroid Build Coastguard Worker typedef unsigned int binder_size_t; 43*77b80299SAndroid Build Coastguard Worker typedef unsigned int binder_uintptr_t; 44*77b80299SAndroid Build Coastguard Worker #else 45*77b80299SAndroid Build Coastguard Worker typedef unsigned long long binder_size_t; 46*77b80299SAndroid Build Coastguard Worker typedef unsigned long long binder_uintptr_t; 47*77b80299SAndroid Build Coastguard Worker #endif 48*77b80299SAndroid Build Coastguard Worker 49*77b80299SAndroid Build Coastguard Worker class IBinder; 50*77b80299SAndroid Build Coastguard Worker class IPCThreadState; 51*77b80299SAndroid Build Coastguard Worker class ProcessState; 52*77b80299SAndroid Build Coastguard Worker class TextOutput; 53*77b80299SAndroid Build Coastguard Worker 54*77b80299SAndroid Build Coastguard Worker class Parcel { 55*77b80299SAndroid Build Coastguard Worker friend class IPCThreadState; 56*77b80299SAndroid Build Coastguard Worker public: 57*77b80299SAndroid Build Coastguard Worker 58*77b80299SAndroid Build Coastguard Worker Parcel(); 59*77b80299SAndroid Build Coastguard Worker ~Parcel(); 60*77b80299SAndroid Build Coastguard Worker 61*77b80299SAndroid Build Coastguard Worker const uint8_t* data() const; 62*77b80299SAndroid Build Coastguard Worker size_t dataSize() const; 63*77b80299SAndroid Build Coastguard Worker size_t dataAvail() const; 64*77b80299SAndroid Build Coastguard Worker size_t dataPosition() const; 65*77b80299SAndroid Build Coastguard Worker size_t dataCapacity() const; 66*77b80299SAndroid Build Coastguard Worker 67*77b80299SAndroid Build Coastguard Worker status_t setDataSize(size_t size); 68*77b80299SAndroid Build Coastguard Worker void setDataPosition(size_t pos) const; 69*77b80299SAndroid Build Coastguard Worker status_t setDataCapacity(size_t size); 70*77b80299SAndroid Build Coastguard Worker 71*77b80299SAndroid Build Coastguard Worker // Zeros data when reallocating. Other mitigations may be added 72*77b80299SAndroid Build Coastguard Worker // in the future. 73*77b80299SAndroid Build Coastguard Worker // 74*77b80299SAndroid Build Coastguard Worker // WARNING: some read methods may make additional copies of data. 75*77b80299SAndroid Build Coastguard Worker // In order to verify this, heap dumps should be used. 76*77b80299SAndroid Build Coastguard Worker void markSensitive() const; 77*77b80299SAndroid Build Coastguard Worker 78*77b80299SAndroid Build Coastguard Worker // Writes the RPC header. 79*77b80299SAndroid Build Coastguard Worker status_t writeInterfaceToken(const char* interface); 80*77b80299SAndroid Build Coastguard Worker 81*77b80299SAndroid Build Coastguard Worker // Parses the RPC header, returning true if the interface name 82*77b80299SAndroid Build Coastguard Worker // in the header matches the expected interface from the caller. 83*77b80299SAndroid Build Coastguard Worker bool enforceInterface(const char* interface) const; 84*77b80299SAndroid Build Coastguard Worker 85*77b80299SAndroid Build Coastguard Worker void freeData(); 86*77b80299SAndroid Build Coastguard Worker 87*77b80299SAndroid Build Coastguard Worker private: 88*77b80299SAndroid Build Coastguard Worker const binder_size_t* objects() const; 89*77b80299SAndroid Build Coastguard Worker 90*77b80299SAndroid Build Coastguard Worker public: 91*77b80299SAndroid Build Coastguard Worker size_t objectsCount() const; 92*77b80299SAndroid Build Coastguard Worker 93*77b80299SAndroid Build Coastguard Worker status_t errorCheck() const; 94*77b80299SAndroid Build Coastguard Worker void setError(status_t err); 95*77b80299SAndroid Build Coastguard Worker 96*77b80299SAndroid Build Coastguard Worker status_t write(const void* data, size_t len); 97*77b80299SAndroid Build Coastguard Worker void* writeInplace(size_t len); 98*77b80299SAndroid Build Coastguard Worker status_t writeInt8(int8_t val); 99*77b80299SAndroid Build Coastguard Worker status_t writeUint8(uint8_t val); 100*77b80299SAndroid Build Coastguard Worker status_t writeInt16(int16_t val); 101*77b80299SAndroid Build Coastguard Worker status_t writeUint16(uint16_t val); 102*77b80299SAndroid Build Coastguard Worker status_t writeInt32(int32_t val); 103*77b80299SAndroid Build Coastguard Worker status_t writeUint32(uint32_t val); 104*77b80299SAndroid Build Coastguard Worker status_t writeInt64(int64_t val); 105*77b80299SAndroid Build Coastguard Worker status_t writeUint64(uint64_t val); 106*77b80299SAndroid Build Coastguard Worker status_t writeFloat(float val); 107*77b80299SAndroid Build Coastguard Worker status_t writeDouble(double val); 108*77b80299SAndroid Build Coastguard Worker status_t writeCString(const char* str); 109*77b80299SAndroid Build Coastguard Worker status_t writeString16(const String16& str); 110*77b80299SAndroid Build Coastguard Worker status_t writeString16(const std::unique_ptr<String16>& str); 111*77b80299SAndroid Build Coastguard Worker status_t writeString16(const char16_t* str, size_t len); 112*77b80299SAndroid Build Coastguard Worker status_t writeStrongBinder(const sp<IBinder>& val); 113*77b80299SAndroid Build Coastguard Worker status_t writeBool(bool val); 114*77b80299SAndroid Build Coastguard Worker 115*77b80299SAndroid Build Coastguard Worker template<typename T> 116*77b80299SAndroid Build Coastguard Worker status_t writeObject(const T& val); 117*77b80299SAndroid Build Coastguard Worker 118*77b80299SAndroid Build Coastguard Worker status_t writeBuffer(const void *buffer, size_t length, size_t *handle); 119*77b80299SAndroid Build Coastguard Worker status_t writeEmbeddedBuffer(const void *buffer, size_t length, size_t *handle, 120*77b80299SAndroid Build Coastguard Worker size_t parent_buffer_handle, size_t parent_offset); 121*77b80299SAndroid Build Coastguard Worker public: 122*77b80299SAndroid Build Coastguard Worker status_t writeEmbeddedNativeHandle(const native_handle_t *handle, 123*77b80299SAndroid Build Coastguard Worker size_t parent_buffer_handle, size_t parent_offset); 124*77b80299SAndroid Build Coastguard Worker status_t writeNativeHandleNoDup(const native_handle* handle, bool embedded, 125*77b80299SAndroid Build Coastguard Worker size_t parent_buffer_handle = 0, 126*77b80299SAndroid Build Coastguard Worker size_t parent_offset = 0); 127*77b80299SAndroid Build Coastguard Worker status_t writeNativeHandleNoDup(const native_handle* handle); 128*77b80299SAndroid Build Coastguard Worker 129*77b80299SAndroid Build Coastguard Worker status_t read(void* outData, size_t len) const; 130*77b80299SAndroid Build Coastguard Worker const void* readInplace(size_t len) const; 131*77b80299SAndroid Build Coastguard Worker status_t readInt8(int8_t *pArg) const; 132*77b80299SAndroid Build Coastguard Worker status_t readUint8(uint8_t *pArg) const; 133*77b80299SAndroid Build Coastguard Worker status_t readInt16(int16_t *pArg) const; 134*77b80299SAndroid Build Coastguard Worker status_t readUint16(uint16_t *pArg) const; 135*77b80299SAndroid Build Coastguard Worker int32_t readInt32() const; 136*77b80299SAndroid Build Coastguard Worker status_t readInt32(int32_t *pArg) const; 137*77b80299SAndroid Build Coastguard Worker uint32_t readUint32() const; 138*77b80299SAndroid Build Coastguard Worker status_t readUint32(uint32_t *pArg) const; 139*77b80299SAndroid Build Coastguard Worker int64_t readInt64() const; 140*77b80299SAndroid Build Coastguard Worker status_t readInt64(int64_t *pArg) const; 141*77b80299SAndroid Build Coastguard Worker uint64_t readUint64() const; 142*77b80299SAndroid Build Coastguard Worker status_t readUint64(uint64_t *pArg) const; 143*77b80299SAndroid Build Coastguard Worker float readFloat() const; 144*77b80299SAndroid Build Coastguard Worker status_t readFloat(float *pArg) const; 145*77b80299SAndroid Build Coastguard Worker double readDouble() const; 146*77b80299SAndroid Build Coastguard Worker status_t readDouble(double *pArg) const; 147*77b80299SAndroid Build Coastguard Worker 148*77b80299SAndroid Build Coastguard Worker bool readBool() const; 149*77b80299SAndroid Build Coastguard Worker status_t readBool(bool *pArg) const; 150*77b80299SAndroid Build Coastguard Worker const char* readCString() const; 151*77b80299SAndroid Build Coastguard Worker String16 readString16() const; 152*77b80299SAndroid Build Coastguard Worker status_t readString16(String16* pArg) const; 153*77b80299SAndroid Build Coastguard Worker status_t readString16(std::unique_ptr<String16>* pArg) const; 154*77b80299SAndroid Build Coastguard Worker const char16_t* readString16Inplace(size_t* outLen) const; 155*77b80299SAndroid Build Coastguard Worker sp<IBinder> readStrongBinder() const; 156*77b80299SAndroid Build Coastguard Worker status_t readStrongBinder(sp<IBinder>* val) const; 157*77b80299SAndroid Build Coastguard Worker status_t readNullableStrongBinder(sp<IBinder>* val) const; 158*77b80299SAndroid Build Coastguard Worker 159*77b80299SAndroid Build Coastguard Worker template<typename T> 160*77b80299SAndroid Build Coastguard Worker const T* readObject(size_t *objects_offset = nullptr) const; 161*77b80299SAndroid Build Coastguard Worker 162*77b80299SAndroid Build Coastguard Worker status_t readBuffer(size_t buffer_size, size_t *buffer_handle, 163*77b80299SAndroid Build Coastguard Worker const void **buffer_out) const; 164*77b80299SAndroid Build Coastguard Worker status_t readNullableBuffer(size_t buffer_size, size_t *buffer_handle, 165*77b80299SAndroid Build Coastguard Worker const void **buffer_out) const; 166*77b80299SAndroid Build Coastguard Worker status_t readEmbeddedBuffer(size_t buffer_size, size_t *buffer_handle, 167*77b80299SAndroid Build Coastguard Worker size_t parent_buffer_handle, size_t parent_offset, 168*77b80299SAndroid Build Coastguard Worker const void **buffer_out) const; 169*77b80299SAndroid Build Coastguard Worker status_t readNullableEmbeddedBuffer(size_t buffer_size, 170*77b80299SAndroid Build Coastguard Worker size_t *buffer_handle, 171*77b80299SAndroid Build Coastguard Worker size_t parent_buffer_handle, 172*77b80299SAndroid Build Coastguard Worker size_t parent_offset, 173*77b80299SAndroid Build Coastguard Worker const void **buffer_out) const; 174*77b80299SAndroid Build Coastguard Worker 175*77b80299SAndroid Build Coastguard Worker status_t readEmbeddedNativeHandle(size_t parent_buffer_handle, 176*77b80299SAndroid Build Coastguard Worker size_t parent_offset, const native_handle_t **handle) const; 177*77b80299SAndroid Build Coastguard Worker status_t readNullableEmbeddedNativeHandle(size_t parent_buffer_handle, 178*77b80299SAndroid Build Coastguard Worker size_t parent_offset, const native_handle_t **handle) const; 179*77b80299SAndroid Build Coastguard Worker status_t readNativeHandleNoDup(const native_handle_t **handle) const; 180*77b80299SAndroid Build Coastguard Worker status_t readNullableNativeHandleNoDup(const native_handle_t **handle) const; 181*77b80299SAndroid Build Coastguard Worker 182*77b80299SAndroid Build Coastguard Worker // Explicitly close all file descriptors in the parcel. 183*77b80299SAndroid Build Coastguard Worker void closeFileDescriptors(); 184*77b80299SAndroid Build Coastguard Worker 185*77b80299SAndroid Build Coastguard Worker // Debugging: get metrics on current allocations. 186*77b80299SAndroid Build Coastguard Worker static size_t getGlobalAllocSize(); 187*77b80299SAndroid Build Coastguard Worker static size_t getGlobalAllocCount(); 188*77b80299SAndroid Build Coastguard Worker 189*77b80299SAndroid Build Coastguard Worker private: 190*77b80299SAndroid Build Coastguard Worker // Below is a cache that records some information about all actual buffers 191*77b80299SAndroid Build Coastguard Worker // in this parcel. 192*77b80299SAndroid Build Coastguard Worker struct BufferInfo { 193*77b80299SAndroid Build Coastguard Worker size_t index; 194*77b80299SAndroid Build Coastguard Worker binder_uintptr_t buffer; 195*77b80299SAndroid Build Coastguard Worker binder_uintptr_t bufend; // buffer + length 196*77b80299SAndroid Build Coastguard Worker }; 197*77b80299SAndroid Build Coastguard Worker // value of mObjectSize when mBufCache is last updated. 198*77b80299SAndroid Build Coastguard Worker mutable size_t mBufCachePos; 199*77b80299SAndroid Build Coastguard Worker mutable std::vector<BufferInfo> mBufCache; 200*77b80299SAndroid Build Coastguard Worker // clear mBufCachePos and mBufCache. 201*77b80299SAndroid Build Coastguard Worker void clearCache() const; 202*77b80299SAndroid Build Coastguard Worker // update mBufCache for all objects between mBufCachePos and mObjectsSize 203*77b80299SAndroid Build Coastguard Worker void updateCache() const; 204*77b80299SAndroid Build Coastguard Worker 205*77b80299SAndroid Build Coastguard Worker bool verifyBufferObject(const binder_buffer_object *buffer_obj, 206*77b80299SAndroid Build Coastguard Worker size_t size, uint32_t flags, size_t parent, 207*77b80299SAndroid Build Coastguard Worker size_t parentOffset) const; 208*77b80299SAndroid Build Coastguard Worker 209*77b80299SAndroid Build Coastguard Worker status_t readBuffer(size_t buffer_size, size_t *buffer_handle, 210*77b80299SAndroid Build Coastguard Worker uint32_t flags, size_t parent, size_t parentOffset, 211*77b80299SAndroid Build Coastguard Worker const void **buffer_out) const; 212*77b80299SAndroid Build Coastguard Worker 213*77b80299SAndroid Build Coastguard Worker status_t readNullableNativeHandleNoDup(const native_handle_t **handle, 214*77b80299SAndroid Build Coastguard Worker bool embedded, 215*77b80299SAndroid Build Coastguard Worker size_t parent_buffer_handle = 0, 216*77b80299SAndroid Build Coastguard Worker size_t parent_offset = 0) const; 217*77b80299SAndroid Build Coastguard Worker public: 218*77b80299SAndroid Build Coastguard Worker 219*77b80299SAndroid Build Coastguard Worker // The following two methods attempt to find if a chunk of memory ("buffer") 220*77b80299SAndroid Build Coastguard Worker // is written / read before (by (read|write)(Embedded)?Buffer methods. ) 221*77b80299SAndroid Build Coastguard Worker // 1. Call findBuffer if the chunk of memory could be a small part of a larger 222*77b80299SAndroid Build Coastguard Worker // buffer written before (for example, an element of a hidl_vec). The 223*77b80299SAndroid Build Coastguard Worker // method will also ensure that the end address (ptr + length) is also 224*77b80299SAndroid Build Coastguard Worker // within the buffer. 225*77b80299SAndroid Build Coastguard Worker // 2. Call quickFindBuffer if the buffer could only be written previously 226*77b80299SAndroid Build Coastguard Worker // by itself (for example, the mBuffer field of a hidl_vec). No lengths 227*77b80299SAndroid Build Coastguard Worker // are checked. 228*77b80299SAndroid Build Coastguard Worker status_t findBuffer(const void *ptr, 229*77b80299SAndroid Build Coastguard Worker size_t length, 230*77b80299SAndroid Build Coastguard Worker bool *found, 231*77b80299SAndroid Build Coastguard Worker size_t *handle, 232*77b80299SAndroid Build Coastguard Worker size_t *offset // valid if found 233*77b80299SAndroid Build Coastguard Worker ) const; 234*77b80299SAndroid Build Coastguard Worker status_t quickFindBuffer(const void *ptr, 235*77b80299SAndroid Build Coastguard Worker size_t *handle // valid if found 236*77b80299SAndroid Build Coastguard Worker ) const; 237*77b80299SAndroid Build Coastguard Worker 238*77b80299SAndroid Build Coastguard Worker private: 239*77b80299SAndroid Build Coastguard Worker bool validateBufferChild(size_t child_buffer_handle, 240*77b80299SAndroid Build Coastguard Worker size_t child_offset) const; 241*77b80299SAndroid Build Coastguard Worker bool validateBufferParent(size_t parent_buffer_handle, 242*77b80299SAndroid Build Coastguard Worker size_t parent_offset) const; 243*77b80299SAndroid Build Coastguard Worker 244*77b80299SAndroid Build Coastguard Worker private: 245*77b80299SAndroid Build Coastguard Worker typedef void (*release_func)(Parcel* parcel, 246*77b80299SAndroid Build Coastguard Worker const uint8_t* data, size_t dataSize, 247*77b80299SAndroid Build Coastguard Worker const binder_size_t* objects, size_t objectsSize, 248*77b80299SAndroid Build Coastguard Worker void* cookie); 249*77b80299SAndroid Build Coastguard Worker 250*77b80299SAndroid Build Coastguard Worker uintptr_t ipcData() const; 251*77b80299SAndroid Build Coastguard Worker size_t ipcDataSize() const; 252*77b80299SAndroid Build Coastguard Worker uintptr_t ipcObjects() const; 253*77b80299SAndroid Build Coastguard Worker size_t ipcObjectsCount() const; 254*77b80299SAndroid Build Coastguard Worker size_t ipcBufferSize() const; 255*77b80299SAndroid Build Coastguard Worker void ipcSetDataReference(const uint8_t* data, size_t dataSize, 256*77b80299SAndroid Build Coastguard Worker const binder_size_t* objects, size_t objectsCount, 257*77b80299SAndroid Build Coastguard Worker release_func relFunc, void* relCookie); 258*77b80299SAndroid Build Coastguard Worker 259*77b80299SAndroid Build Coastguard Worker public: 260*77b80299SAndroid Build Coastguard Worker void print(TextOutput& to, uint32_t flags = 0) const; 261*77b80299SAndroid Build Coastguard Worker 262*77b80299SAndroid Build Coastguard Worker private: 263*77b80299SAndroid Build Coastguard Worker Parcel(const Parcel& o); 264*77b80299SAndroid Build Coastguard Worker Parcel& operator=(const Parcel& o); 265*77b80299SAndroid Build Coastguard Worker 266*77b80299SAndroid Build Coastguard Worker status_t finishWrite(size_t len); 267*77b80299SAndroid Build Coastguard Worker void releaseObjects(); 268*77b80299SAndroid Build Coastguard Worker void acquireObjects(); 269*77b80299SAndroid Build Coastguard Worker status_t growData(size_t len); 270*77b80299SAndroid Build Coastguard Worker status_t continueWrite(size_t desired); 271*77b80299SAndroid Build Coastguard Worker status_t writePointer(uintptr_t val); 272*77b80299SAndroid Build Coastguard Worker status_t readPointer(uintptr_t *pArg) const; 273*77b80299SAndroid Build Coastguard Worker uintptr_t readPointer() const; 274*77b80299SAndroid Build Coastguard Worker void freeDataNoInit(); 275*77b80299SAndroid Build Coastguard Worker void initState(); 276*77b80299SAndroid Build Coastguard Worker void scanForFds() const; 277*77b80299SAndroid Build Coastguard Worker 278*77b80299SAndroid Build Coastguard Worker template<class T> 279*77b80299SAndroid Build Coastguard Worker status_t readAligned(T *pArg) const; 280*77b80299SAndroid Build Coastguard Worker 281*77b80299SAndroid Build Coastguard Worker template<class T> T readAligned() const; 282*77b80299SAndroid Build Coastguard Worker 283*77b80299SAndroid Build Coastguard Worker template<class T> 284*77b80299SAndroid Build Coastguard Worker status_t writeAligned(T val); 285*77b80299SAndroid Build Coastguard Worker 286*77b80299SAndroid Build Coastguard Worker status_t mError; 287*77b80299SAndroid Build Coastguard Worker uint8_t* mData; 288*77b80299SAndroid Build Coastguard Worker size_t mDataSize; 289*77b80299SAndroid Build Coastguard Worker size_t mDataCapacity; 290*77b80299SAndroid Build Coastguard Worker mutable size_t mDataPos; 291*77b80299SAndroid Build Coastguard Worker binder_size_t* mObjects; 292*77b80299SAndroid Build Coastguard Worker size_t mObjectsSize; 293*77b80299SAndroid Build Coastguard Worker size_t mObjectsCapacity; 294*77b80299SAndroid Build Coastguard Worker mutable size_t mNextObjectHint; 295*77b80299SAndroid Build Coastguard Worker 296*77b80299SAndroid Build Coastguard Worker [[deprecated]] size_t mNumRef; 297*77b80299SAndroid Build Coastguard Worker 298*77b80299SAndroid Build Coastguard Worker mutable bool mFdsKnown; 299*77b80299SAndroid Build Coastguard Worker mutable bool mHasFds; 300*77b80299SAndroid Build Coastguard Worker bool mAllowFds; 301*77b80299SAndroid Build Coastguard Worker 302*77b80299SAndroid Build Coastguard Worker // if this parcelable is involved in a secure transaction, force the 303*77b80299SAndroid Build Coastguard Worker // data to be overridden with zero when deallocated 304*77b80299SAndroid Build Coastguard Worker mutable bool mDeallocZero; 305*77b80299SAndroid Build Coastguard Worker 306*77b80299SAndroid Build Coastguard Worker release_func mOwner; 307*77b80299SAndroid Build Coastguard Worker void* mOwnerCookie; 308*77b80299SAndroid Build Coastguard Worker }; 309*77b80299SAndroid Build Coastguard Worker // --------------------------------------------------------------------------- 310*77b80299SAndroid Build Coastguard Worker 311*77b80299SAndroid Build Coastguard Worker inline TextOutput& operator<<(TextOutput& to, const Parcel& parcel) 312*77b80299SAndroid Build Coastguard Worker { 313*77b80299SAndroid Build Coastguard Worker parcel.print(to); 314*77b80299SAndroid Build Coastguard Worker return to; 315*77b80299SAndroid Build Coastguard Worker } 316*77b80299SAndroid Build Coastguard Worker 317*77b80299SAndroid Build Coastguard Worker // --------------------------------------------------------------------------- 318*77b80299SAndroid Build Coastguard Worker 319*77b80299SAndroid Build Coastguard Worker // Generic acquire and release of objects. 320*77b80299SAndroid Build Coastguard Worker void acquire_object(const sp<ProcessState>& proc, 321*77b80299SAndroid Build Coastguard Worker const flat_binder_object& obj, const void* who); 322*77b80299SAndroid Build Coastguard Worker void release_object(const sp<ProcessState>& proc, 323*77b80299SAndroid Build Coastguard Worker const flat_binder_object& obj, const void* who); 324*77b80299SAndroid Build Coastguard Worker 325*77b80299SAndroid Build Coastguard Worker void flatten_binder(const sp<ProcessState>& proc, 326*77b80299SAndroid Build Coastguard Worker const sp<IBinder>& binder, flat_binder_object* out); 327*77b80299SAndroid Build Coastguard Worker void flatten_binder(const sp<ProcessState>& proc, 328*77b80299SAndroid Build Coastguard Worker const wp<IBinder>& binder, flat_binder_object* out); 329*77b80299SAndroid Build Coastguard Worker status_t unflatten_binder(const sp<ProcessState>& proc, 330*77b80299SAndroid Build Coastguard Worker const flat_binder_object& flat, sp<IBinder>* out); 331*77b80299SAndroid Build Coastguard Worker status_t unflatten_binder(const sp<ProcessState>& proc, 332*77b80299SAndroid Build Coastguard Worker const flat_binder_object& flat, wp<IBinder>* out); 333*77b80299SAndroid Build Coastguard Worker 334*77b80299SAndroid Build Coastguard Worker } // namespace hardware 335*77b80299SAndroid Build Coastguard Worker } // namespace android 336*77b80299SAndroid Build Coastguard Worker 337*77b80299SAndroid Build Coastguard Worker // --------------------------------------------------------------------------- 338*77b80299SAndroid Build Coastguard Worker 339*77b80299SAndroid Build Coastguard Worker #endif // ANDROID_HARDWARE_PARCEL_H 340