xref: /aosp_15_r20/system/libhwbinder/include/hwbinder/Parcel.h (revision 77b80299c8bdfeca3ae6d0ce27ae1ad3db289be3)
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