Home | History | Annotate | Download | only in binder
      1 /*
      2  * Copyright (C) 2005 The Android Open Source Project
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *      http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License.
     15  */
     16 
     17 #ifndef ANDROID_PARCEL_H
     18 #define ANDROID_PARCEL_H
     19 
     20 #include <string>
     21 #include <vector>
     22 
     23 #include <linux/android/binder.h>
     24 
     25 #include <android-base/unique_fd.h>
     26 #include <cutils/native_handle.h>
     27 #include <utils/Errors.h>
     28 #include <utils/RefBase.h>
     29 #include <utils/String16.h>
     30 #include <utils/Vector.h>
     31 #include <utils/Flattenable.h>
     32 
     33 #include <binder/IInterface.h>
     34 #include <binder/Parcelable.h>
     35 #include <binder/Map.h>
     36 
     37 // ---------------------------------------------------------------------------
     38 namespace android {
     39 
     40 template <typename T> class Flattenable;
     41 template <typename T> class LightFlattenable;
     42 class IBinder;
     43 class IPCThreadState;
     44 class ProcessState;
     45 class String8;
     46 class TextOutput;
     47 
     48 namespace binder {
     49 class Value;
     50 };
     51 
     52 class Parcel {
     53     friend class IPCThreadState;
     54 public:
     55     class ReadableBlob;
     56     class WritableBlob;
     57 
     58                         Parcel();
     59                         ~Parcel();
     60 
     61     const uint8_t*      data() const;
     62     size_t              dataSize() const;
     63     size_t              dataAvail() const;
     64     size_t              dataPosition() const;
     65     size_t              dataCapacity() const;
     66 
     67     status_t            setDataSize(size_t size);
     68     void                setDataPosition(size_t pos) const;
     69     status_t            setDataCapacity(size_t size);
     70 
     71     status_t            setData(const uint8_t* buffer, size_t len);
     72 
     73     status_t            appendFrom(const Parcel *parcel,
     74                                    size_t start, size_t len);
     75 
     76     int                 compareData(const Parcel& other);
     77 
     78     bool                allowFds() const;
     79     bool                pushAllowFds(bool allowFds);
     80     void                restoreAllowFds(bool lastValue);
     81 
     82     bool                hasFileDescriptors() const;
     83 
     84     // Writes the RPC header.
     85     status_t            writeInterfaceToken(const String16& interface);
     86 
     87     // Parses the RPC header, returning true if the interface name
     88     // in the header matches the expected interface from the caller.
     89     //
     90     // Additionally, enforceInterface does part of the work of
     91     // propagating the StrictMode policy mask, populating the current
     92     // IPCThreadState, which as an optimization may optionally be
     93     // passed in.
     94     bool                enforceInterface(const String16& interface,
     95                                          IPCThreadState* threadState = nullptr) const;
     96     bool                checkInterface(IBinder*) const;
     97 
     98     void                freeData();
     99 
    100 private:
    101     const binder_size_t* objects() const;
    102 
    103 public:
    104     size_t              objectsCount() const;
    105 
    106     status_t            errorCheck() const;
    107     void                setError(status_t err);
    108 
    109     status_t            write(const void* data, size_t len);
    110     void*               writeInplace(size_t len);
    111     status_t            writeUnpadded(const void* data, size_t len);
    112     status_t            writeInt32(int32_t val);
    113     status_t            writeUint32(uint32_t val);
    114     status_t            writeInt64(int64_t val);
    115     status_t            writeUint64(uint64_t val);
    116     status_t            writeFloat(float val);
    117     status_t            writeDouble(double val);
    118     status_t            writeCString(const char* str);
    119     status_t            writeString8(const String8& str);
    120     status_t            writeString16(const String16& str);
    121     status_t            writeString16(const std::unique_ptr<String16>& str);
    122     status_t            writeString16(const char16_t* str, size_t len);
    123     status_t            writeStrongBinder(const sp<IBinder>& val);
    124     status_t            writeWeakBinder(const wp<IBinder>& val);
    125     status_t            writeInt32Array(size_t len, const int32_t *val);
    126     status_t            writeByteArray(size_t len, const uint8_t *val);
    127     status_t            writeBool(bool val);
    128     status_t            writeChar(char16_t val);
    129     status_t            writeByte(int8_t val);
    130 
    131     // Take a UTF8 encoded string, convert to UTF16, write it to the parcel.
    132     status_t            writeUtf8AsUtf16(const std::string& str);
    133     status_t            writeUtf8AsUtf16(const std::unique_ptr<std::string>& str);
    134 
    135     status_t            writeByteVector(const std::unique_ptr<std::vector<int8_t>>& val);
    136     status_t            writeByteVector(const std::vector<int8_t>& val);
    137     status_t            writeByteVector(const std::unique_ptr<std::vector<uint8_t>>& val);
    138     status_t            writeByteVector(const std::vector<uint8_t>& val);
    139     status_t            writeInt32Vector(const std::unique_ptr<std::vector<int32_t>>& val);
    140     status_t            writeInt32Vector(const std::vector<int32_t>& val);
    141     status_t            writeInt64Vector(const std::unique_ptr<std::vector<int64_t>>& val);
    142     status_t            writeInt64Vector(const std::vector<int64_t>& val);
    143     status_t            writeUint64Vector(const std::unique_ptr<std::vector<uint64_t>>& val);
    144     status_t            writeUint64Vector(const std::vector<uint64_t>& val);
    145     status_t            writeFloatVector(const std::unique_ptr<std::vector<float>>& val);
    146     status_t            writeFloatVector(const std::vector<float>& val);
    147     status_t            writeDoubleVector(const std::unique_ptr<std::vector<double>>& val);
    148     status_t            writeDoubleVector(const std::vector<double>& val);
    149     status_t            writeBoolVector(const std::unique_ptr<std::vector<bool>>& val);
    150     status_t            writeBoolVector(const std::vector<bool>& val);
    151     status_t            writeCharVector(const std::unique_ptr<std::vector<char16_t>>& val);
    152     status_t            writeCharVector(const std::vector<char16_t>& val);
    153     status_t            writeString16Vector(
    154                             const std::unique_ptr<std::vector<std::unique_ptr<String16>>>& val);
    155     status_t            writeString16Vector(const std::vector<String16>& val);
    156     status_t            writeUtf8VectorAsUtf16Vector(
    157                             const std::unique_ptr<std::vector<std::unique_ptr<std::string>>>& val);
    158     status_t            writeUtf8VectorAsUtf16Vector(const std::vector<std::string>& val);
    159 
    160     status_t            writeStrongBinderVector(const std::unique_ptr<std::vector<sp<IBinder>>>& val);
    161     status_t            writeStrongBinderVector(const std::vector<sp<IBinder>>& val);
    162 
    163     template<typename T>
    164     status_t            writeParcelableVector(const std::unique_ptr<std::vector<std::unique_ptr<T>>>& val);
    165     template<typename T>
    166     status_t            writeParcelableVector(const std::shared_ptr<std::vector<std::unique_ptr<T>>>& val);
    167     template<typename T>
    168     status_t            writeParcelableVector(const std::vector<T>& val);
    169 
    170     template<typename T>
    171     status_t            writeNullableParcelable(const std::unique_ptr<T>& parcelable);
    172 
    173     status_t            writeParcelable(const Parcelable& parcelable);
    174 
    175     status_t            writeValue(const binder::Value& value);
    176 
    177     template<typename T>
    178     status_t            write(const Flattenable<T>& val);
    179 
    180     template<typename T>
    181     status_t            write(const LightFlattenable<T>& val);
    182 
    183     template<typename T>
    184     status_t            writeVectorSize(const std::vector<T>& val);
    185     template<typename T>
    186     status_t            writeVectorSize(const std::unique_ptr<std::vector<T>>& val);
    187 
    188     status_t            writeMap(const binder::Map& map);
    189     status_t            writeNullableMap(const std::unique_ptr<binder::Map>& map);
    190 
    191     // Place a native_handle into the parcel (the native_handle's file-
    192     // descriptors are dup'ed, so it is safe to delete the native_handle
    193     // when this function returns).
    194     // Doesn't take ownership of the native_handle.
    195     status_t            writeNativeHandle(const native_handle* handle);
    196 
    197     // Place a file descriptor into the parcel.  The given fd must remain
    198     // valid for the lifetime of the parcel.
    199     // The Parcel does not take ownership of the given fd unless you ask it to.
    200     status_t            writeFileDescriptor(int fd, bool takeOwnership = false);
    201 
    202     // Place a file descriptor into the parcel.  A dup of the fd is made, which
    203     // will be closed once the parcel is destroyed.
    204     status_t            writeDupFileDescriptor(int fd);
    205 
    206     // Place a Java "parcel file descriptor" into the parcel.  The given fd must remain
    207     // valid for the lifetime of the parcel.
    208     // The Parcel does not take ownership of the given fd unless you ask it to.
    209     status_t            writeParcelFileDescriptor(int fd, bool takeOwnership = false);
    210 
    211     // Place a Java "parcel file descriptor" into the parcel.  A dup of the fd is made, which will
    212     // be closed once the parcel is destroyed.
    213     status_t            writeDupParcelFileDescriptor(int fd);
    214 
    215     // Place a file descriptor into the parcel.  This will not affect the
    216     // semantics of the smart file descriptor. A new descriptor will be
    217     // created, and will be closed when the parcel is destroyed.
    218     status_t            writeUniqueFileDescriptor(
    219                             const base::unique_fd& fd);
    220 
    221     // Place a vector of file desciptors into the parcel. Each descriptor is
    222     // dup'd as in writeDupFileDescriptor
    223     status_t            writeUniqueFileDescriptorVector(
    224                             const std::unique_ptr<std::vector<base::unique_fd>>& val);
    225     status_t            writeUniqueFileDescriptorVector(
    226                             const std::vector<base::unique_fd>& val);
    227 
    228     // Writes a blob to the parcel.
    229     // If the blob is small, then it is stored in-place, otherwise it is
    230     // transferred by way of an anonymous shared memory region.  Prefer sending
    231     // immutable blobs if possible since they may be subsequently transferred between
    232     // processes without further copying whereas mutable blobs always need to be copied.
    233     // The caller should call release() on the blob after writing its contents.
    234     status_t            writeBlob(size_t len, bool mutableCopy, WritableBlob* outBlob);
    235 
    236     // Write an existing immutable blob file descriptor to the parcel.
    237     // This allows the client to send the same blob to multiple processes
    238     // as long as it keeps a dup of the blob file descriptor handy for later.
    239     status_t            writeDupImmutableBlobFileDescriptor(int fd);
    240 
    241     status_t            writeObject(const flat_binder_object& val, bool nullMetaData);
    242 
    243     // Like Parcel.java's writeNoException().  Just writes a zero int32.
    244     // Currently the native implementation doesn't do any of the StrictMode
    245     // stack gathering and serialization that the Java implementation does.
    246     status_t            writeNoException();
    247 
    248     void                remove(size_t start, size_t amt);
    249 
    250     status_t            read(void* outData, size_t len) const;
    251     const void*         readInplace(size_t len) const;
    252     int32_t             readInt32() const;
    253     status_t            readInt32(int32_t *pArg) const;
    254     uint32_t            readUint32() const;
    255     status_t            readUint32(uint32_t *pArg) const;
    256     int64_t             readInt64() const;
    257     status_t            readInt64(int64_t *pArg) const;
    258     uint64_t            readUint64() const;
    259     status_t            readUint64(uint64_t *pArg) const;
    260     float               readFloat() const;
    261     status_t            readFloat(float *pArg) const;
    262     double              readDouble() const;
    263     status_t            readDouble(double *pArg) const;
    264     intptr_t            readIntPtr() const;
    265     status_t            readIntPtr(intptr_t *pArg) const;
    266     bool                readBool() const;
    267     status_t            readBool(bool *pArg) const;
    268     char16_t            readChar() const;
    269     status_t            readChar(char16_t *pArg) const;
    270     int8_t              readByte() const;
    271     status_t            readByte(int8_t *pArg) const;
    272 
    273     // Read a UTF16 encoded string, convert to UTF8
    274     status_t            readUtf8FromUtf16(std::string* str) const;
    275     status_t            readUtf8FromUtf16(std::unique_ptr<std::string>* str) const;
    276 
    277     const char*         readCString() const;
    278     String8             readString8() const;
    279     status_t            readString8(String8* pArg) const;
    280     String16            readString16() const;
    281     status_t            readString16(String16* pArg) const;
    282     status_t            readString16(std::unique_ptr<String16>* pArg) const;
    283     const char16_t*     readString16Inplace(size_t* outLen) const;
    284     sp<IBinder>         readStrongBinder() const;
    285     status_t            readStrongBinder(sp<IBinder>* val) const;
    286     status_t            readNullableStrongBinder(sp<IBinder>* val) const;
    287     wp<IBinder>         readWeakBinder() const;
    288 
    289     template<typename T>
    290     status_t            readParcelableVector(
    291                             std::unique_ptr<std::vector<std::unique_ptr<T>>>* val) const;
    292     template<typename T>
    293     status_t            readParcelableVector(std::vector<T>* val) const;
    294 
    295     status_t            readParcelable(Parcelable* parcelable) const;
    296 
    297     template<typename T>
    298     status_t            readParcelable(std::unique_ptr<T>* parcelable) const;
    299 
    300     status_t            readValue(binder::Value* value) const;
    301 
    302     template<typename T>
    303     status_t            readStrongBinder(sp<T>* val) const;
    304 
    305     template<typename T>
    306     status_t            readNullableStrongBinder(sp<T>* val) const;
    307 
    308     status_t            readStrongBinderVector(std::unique_ptr<std::vector<sp<IBinder>>>* val) const;
    309     status_t            readStrongBinderVector(std::vector<sp<IBinder>>* val) const;
    310 
    311     status_t            readByteVector(std::unique_ptr<std::vector<int8_t>>* val) const;
    312     status_t            readByteVector(std::vector<int8_t>* val) const;
    313     status_t            readByteVector(std::unique_ptr<std::vector<uint8_t>>* val) const;
    314     status_t            readByteVector(std::vector<uint8_t>* val) const;
    315     status_t            readInt32Vector(std::unique_ptr<std::vector<int32_t>>* val) const;
    316     status_t            readInt32Vector(std::vector<int32_t>* val) const;
    317     status_t            readInt64Vector(std::unique_ptr<std::vector<int64_t>>* val) const;
    318     status_t            readInt64Vector(std::vector<int64_t>* val) const;
    319     status_t            readUint64Vector(std::unique_ptr<std::vector<uint64_t>>* val) const;
    320     status_t            readUint64Vector(std::vector<uint64_t>* val) const;
    321     status_t            readFloatVector(std::unique_ptr<std::vector<float>>* val) const;
    322     status_t            readFloatVector(std::vector<float>* val) const;
    323     status_t            readDoubleVector(std::unique_ptr<std::vector<double>>* val) const;
    324     status_t            readDoubleVector(std::vector<double>* val) const;
    325     status_t            readBoolVector(std::unique_ptr<std::vector<bool>>* val) const;
    326     status_t            readBoolVector(std::vector<bool>* val) const;
    327     status_t            readCharVector(std::unique_ptr<std::vector<char16_t>>* val) const;
    328     status_t            readCharVector(std::vector<char16_t>* val) const;
    329     status_t            readString16Vector(
    330                             std::unique_ptr<std::vector<std::unique_ptr<String16>>>* val) const;
    331     status_t            readString16Vector(std::vector<String16>* val) const;
    332     status_t            readUtf8VectorFromUtf16Vector(
    333                             std::unique_ptr<std::vector<std::unique_ptr<std::string>>>* val) const;
    334     status_t            readUtf8VectorFromUtf16Vector(std::vector<std::string>* val) const;
    335 
    336     template<typename T>
    337     status_t            read(Flattenable<T>& val) const;
    338 
    339     template<typename T>
    340     status_t            read(LightFlattenable<T>& val) const;
    341 
    342     template<typename T>
    343     status_t            resizeOutVector(std::vector<T>* val) const;
    344     template<typename T>
    345     status_t            resizeOutVector(std::unique_ptr<std::vector<T>>* val) const;
    346 
    347     status_t            readMap(binder::Map* map)const;
    348     status_t            readNullableMap(std::unique_ptr<binder::Map>* map) const;
    349 
    350     // Like Parcel.java's readExceptionCode().  Reads the first int32
    351     // off of a Parcel's header, returning 0 or the negative error
    352     // code on exceptions, but also deals with skipping over rich
    353     // response headers.  Callers should use this to read & parse the
    354     // response headers rather than doing it by hand.
    355     int32_t             readExceptionCode() const;
    356 
    357     // Retrieve native_handle from the parcel. This returns a copy of the
    358     // parcel's native_handle (the caller takes ownership). The caller
    359     // must free the native_handle with native_handle_close() and
    360     // native_handle_delete().
    361     native_handle*     readNativeHandle() const;
    362 
    363 
    364     // Retrieve a file descriptor from the parcel.  This returns the raw fd
    365     // in the parcel, which you do not own -- use dup() to get your own copy.
    366     int                 readFileDescriptor() const;
    367 
    368     // Retrieve a Java "parcel file descriptor" from the parcel.  This returns the raw fd
    369     // in the parcel, which you do not own -- use dup() to get your own copy.
    370     int                 readParcelFileDescriptor() const;
    371 
    372     // Retrieve a smart file descriptor from the parcel.
    373     status_t            readUniqueFileDescriptor(
    374                             base::unique_fd* val) const;
    375 
    376     // Retrieve a Java "parcel file descriptor" from the parcel.
    377     status_t            readUniqueParcelFileDescriptor(base::unique_fd* val) const;
    378 
    379 
    380     // Retrieve a vector of smart file descriptors from the parcel.
    381     status_t            readUniqueFileDescriptorVector(
    382                             std::unique_ptr<std::vector<base::unique_fd>>* val) const;
    383     status_t            readUniqueFileDescriptorVector(
    384                             std::vector<base::unique_fd>* val) const;
    385 
    386     // Reads a blob from the parcel.
    387     // The caller should call release() on the blob after reading its contents.
    388     status_t            readBlob(size_t len, ReadableBlob* outBlob) const;
    389 
    390     const flat_binder_object* readObject(bool nullMetaData) const;
    391 
    392     // Explicitly close all file descriptors in the parcel.
    393     void                closeFileDescriptors();
    394 
    395     // Debugging: get metrics on current allocations.
    396     static size_t       getGlobalAllocSize();
    397     static size_t       getGlobalAllocCount();
    398 
    399     bool                replaceCallingWorkSourceUid(uid_t uid);
    400     // Returns the work source provided by the caller. This can only be trusted for trusted calling
    401     // uid.
    402     uid_t               readCallingWorkSourceUid();
    403     void                readRequestHeaders() const;
    404 
    405 private:
    406     typedef void        (*release_func)(Parcel* parcel,
    407                                         const uint8_t* data, size_t dataSize,
    408                                         const binder_size_t* objects, size_t objectsSize,
    409                                         void* cookie);
    410 
    411     uintptr_t           ipcData() const;
    412     size_t              ipcDataSize() const;
    413     uintptr_t           ipcObjects() const;
    414     size_t              ipcObjectsCount() const;
    415     void                ipcSetDataReference(const uint8_t* data, size_t dataSize,
    416                                             const binder_size_t* objects, size_t objectsCount,
    417                                             release_func relFunc, void* relCookie);
    418 
    419 public:
    420     void                print(TextOutput& to, uint32_t flags = 0) const;
    421 
    422 private:
    423                         Parcel(const Parcel& o);
    424     Parcel&             operator=(const Parcel& o);
    425 
    426     status_t            finishWrite(size_t len);
    427     void                releaseObjects();
    428     void                acquireObjects();
    429     status_t            growData(size_t len);
    430     status_t            restartWrite(size_t desired);
    431     status_t            continueWrite(size_t desired);
    432     status_t            writePointer(uintptr_t val);
    433     status_t            readPointer(uintptr_t *pArg) const;
    434     uintptr_t           readPointer() const;
    435     void                freeDataNoInit();
    436     void                initState();
    437     void                scanForFds() const;
    438     status_t            validateReadData(size_t len) const;
    439     void                updateWorkSourceRequestHeaderPosition() const;
    440 
    441     template<class T>
    442     status_t            readAligned(T *pArg) const;
    443 
    444     template<class T>   T readAligned() const;
    445 
    446     template<class T>
    447     status_t            writeAligned(T val);
    448 
    449     status_t            writeRawNullableParcelable(const Parcelable*
    450                                                    parcelable);
    451 
    452     template<typename T, typename U>
    453     status_t            unsafeReadTypedVector(std::vector<T>* val,
    454                                               status_t(Parcel::*read_func)(U*) const) const;
    455     template<typename T>
    456     status_t            readNullableTypedVector(std::unique_ptr<std::vector<T>>* val,
    457                                                 status_t(Parcel::*read_func)(T*) const) const;
    458     template<typename T>
    459     status_t            readTypedVector(std::vector<T>* val,
    460                                         status_t(Parcel::*read_func)(T*) const) const;
    461     template<typename T, typename U>
    462     status_t            unsafeWriteTypedVector(const std::vector<T>& val,
    463                                                status_t(Parcel::*write_func)(U));
    464     template<typename T>
    465     status_t            writeNullableTypedVector(const std::unique_ptr<std::vector<T>>& val,
    466                                                  status_t(Parcel::*write_func)(const T&));
    467     template<typename T>
    468     status_t            writeNullableTypedVector(const std::unique_ptr<std::vector<T>>& val,
    469                                                  status_t(Parcel::*write_func)(T));
    470     template<typename T>
    471     status_t            writeTypedVector(const std::vector<T>& val,
    472                                          status_t(Parcel::*write_func)(const T&));
    473     template<typename T>
    474     status_t            writeTypedVector(const std::vector<T>& val,
    475                                          status_t(Parcel::*write_func)(T));
    476 
    477     status_t            mError;
    478     uint8_t*            mData;
    479     size_t              mDataSize;
    480     size_t              mDataCapacity;
    481     mutable size_t      mDataPos;
    482     binder_size_t*      mObjects;
    483     size_t              mObjectsSize;
    484     size_t              mObjectsCapacity;
    485     mutable size_t      mNextObjectHint;
    486     mutable bool        mObjectsSorted;
    487 
    488     mutable bool        mRequestHeaderPresent;
    489     mutable size_t      mWorkSourceRequestHeaderPosition;
    490 
    491     mutable bool        mFdsKnown;
    492     mutable bool        mHasFds;
    493     bool                mAllowFds;
    494 
    495     release_func        mOwner;
    496     void*               mOwnerCookie;
    497 
    498     class Blob {
    499     public:
    500         Blob();
    501         ~Blob();
    502 
    503         void clear();
    504         void release();
    505         inline size_t size() const { return mSize; }
    506         inline int fd() const { return mFd; }
    507         inline bool isMutable() const { return mMutable; }
    508 
    509     protected:
    510         void init(int fd, void* data, size_t size, bool isMutable);
    511 
    512         int mFd; // owned by parcel so not closed when released
    513         void* mData;
    514         size_t mSize;
    515         bool mMutable;
    516     };
    517 
    518     #if defined(__clang__)
    519     #pragma clang diagnostic push
    520     #pragma clang diagnostic ignored "-Wweak-vtables"
    521     #endif
    522 
    523     // FlattenableHelperInterface and FlattenableHelper avoid generating a vtable entry in objects
    524     // following Flattenable template/protocol.
    525     class FlattenableHelperInterface {
    526     protected:
    527         ~FlattenableHelperInterface() { }
    528     public:
    529         virtual size_t getFlattenedSize() const = 0;
    530         virtual size_t getFdCount() const = 0;
    531         virtual status_t flatten(void* buffer, size_t size, int* fds, size_t count) const = 0;
    532         virtual status_t unflatten(void const* buffer, size_t size, int const* fds, size_t count) = 0;
    533     };
    534 
    535     #if defined(__clang__)
    536     #pragma clang diagnostic pop
    537     #endif
    538 
    539     // Concrete implementation of FlattenableHelperInterface that delegates virtual calls to the
    540     // specified class T implementing the Flattenable protocol. It "virtualizes" a compile-time
    541     // protocol.
    542     template<typename T>
    543     class FlattenableHelper : public FlattenableHelperInterface {
    544         friend class Parcel;
    545         const Flattenable<T>& val;
    546         explicit FlattenableHelper(const Flattenable<T>& _val) : val(_val) { }
    547 
    548     protected:
    549         ~FlattenableHelper() = default;
    550     public:
    551         virtual size_t getFlattenedSize() const {
    552             return val.getFlattenedSize();
    553         }
    554         virtual size_t getFdCount() const {
    555             return val.getFdCount();
    556         }
    557         virtual status_t flatten(void* buffer, size_t size, int* fds, size_t count) const {
    558             return val.flatten(buffer, size, fds, count);
    559         }
    560         virtual status_t unflatten(void const* buffer, size_t size, int const* fds, size_t count) {
    561             return const_cast<Flattenable<T>&>(val).unflatten(buffer, size, fds, count);
    562         }
    563     };
    564     status_t write(const FlattenableHelperInterface& val);
    565     status_t read(FlattenableHelperInterface& val) const;
    566 
    567 public:
    568     class ReadableBlob : public Blob {
    569         friend class Parcel;
    570     public:
    571         inline const void* data() const { return mData; }
    572         inline void* mutableData() { return isMutable() ? mData : nullptr; }
    573     };
    574 
    575     class WritableBlob : public Blob {
    576         friend class Parcel;
    577     public:
    578         inline void* data() { return mData; }
    579     };
    580 
    581 private:
    582     size_t mOpenAshmemSize;
    583 
    584 public:
    585     // TODO: Remove once ABI can be changed.
    586     size_t getBlobAshmemSize() const;
    587     size_t getOpenAshmemSize() const;
    588 };
    589 
    590 // ---------------------------------------------------------------------------
    591 
    592 template<typename T>
    593 status_t Parcel::write(const Flattenable<T>& val) {
    594     const FlattenableHelper<T> helper(val);
    595     return write(helper);
    596 }
    597 
    598 template<typename T>
    599 status_t Parcel::write(const LightFlattenable<T>& val) {
    600     size_t size(val.getFlattenedSize());
    601     if (!val.isFixedSize()) {
    602         if (size > INT32_MAX) {
    603             return BAD_VALUE;
    604         }
    605         status_t err = writeInt32(static_cast<int32_t>(size));
    606         if (err != NO_ERROR) {
    607             return err;
    608         }
    609     }
    610     if (size) {
    611         void* buffer = writeInplace(size);
    612         if (buffer == nullptr)
    613             return NO_MEMORY;
    614         return val.flatten(buffer, size);
    615     }
    616     return NO_ERROR;
    617 }
    618 
    619 template<typename T>
    620 status_t Parcel::read(Flattenable<T>& val) const {
    621     FlattenableHelper<T> helper(val);
    622     return read(helper);
    623 }
    624 
    625 template<typename T>
    626 status_t Parcel::read(LightFlattenable<T>& val) const {
    627     size_t size;
    628     if (val.isFixedSize()) {
    629         size = val.getFlattenedSize();
    630     } else {
    631         int32_t s;
    632         status_t err = readInt32(&s);
    633         if (err != NO_ERROR) {
    634             return err;
    635         }
    636         size = static_cast<size_t>(s);
    637     }
    638     if (size) {
    639         void const* buffer = readInplace(size);
    640         return buffer == nullptr ? NO_MEMORY :
    641                 val.unflatten(buffer, size);
    642     }
    643     return NO_ERROR;
    644 }
    645 
    646 template<typename T>
    647 status_t Parcel::writeVectorSize(const std::vector<T>& val) {
    648     if (val.size() > INT32_MAX) {
    649         return BAD_VALUE;
    650     }
    651     return writeInt32(static_cast<int32_t>(val.size()));
    652 }
    653 
    654 template<typename T>
    655 status_t Parcel::writeVectorSize(const std::unique_ptr<std::vector<T>>& val) {
    656     if (!val) {
    657         return writeInt32(-1);
    658     }
    659 
    660     return writeVectorSize(*val);
    661 }
    662 
    663 template<typename T>
    664 status_t Parcel::resizeOutVector(std::vector<T>* val) const {
    665     int32_t size;
    666     status_t err = readInt32(&size);
    667     if (err != NO_ERROR) {
    668         return err;
    669     }
    670 
    671     if (size < 0) {
    672         return UNEXPECTED_NULL;
    673     }
    674     val->resize(size_t(size));
    675     return OK;
    676 }
    677 
    678 template<typename T>
    679 status_t Parcel::resizeOutVector(std::unique_ptr<std::vector<T>>* val) const {
    680     int32_t size;
    681     status_t err = readInt32(&size);
    682     if (err != NO_ERROR) {
    683         return err;
    684     }
    685 
    686     val->reset();
    687     if (size >= 0) {
    688         val->reset(new std::vector<T>(size_t(size)));
    689     }
    690 
    691     return OK;
    692 }
    693 
    694 template<typename T>
    695 status_t Parcel::readStrongBinder(sp<T>* val) const {
    696     sp<IBinder> tmp;
    697     status_t ret = readStrongBinder(&tmp);
    698 
    699     if (ret == OK) {
    700         *val = interface_cast<T>(tmp);
    701 
    702         if (val->get() == nullptr) {
    703             return UNKNOWN_ERROR;
    704         }
    705     }
    706 
    707     return ret;
    708 }
    709 
    710 template<typename T>
    711 status_t Parcel::readNullableStrongBinder(sp<T>* val) const {
    712     sp<IBinder> tmp;
    713     status_t ret = readNullableStrongBinder(&tmp);
    714 
    715     if (ret == OK) {
    716         *val = interface_cast<T>(tmp);
    717 
    718         if (val->get() == nullptr && tmp.get() != nullptr) {
    719             ret = UNKNOWN_ERROR;
    720         }
    721     }
    722 
    723     return ret;
    724 }
    725 
    726 template<typename T, typename U>
    727 status_t Parcel::unsafeReadTypedVector(
    728         std::vector<T>* val,
    729         status_t(Parcel::*read_func)(U*) const) const {
    730     int32_t size;
    731     status_t status = this->readInt32(&size);
    732 
    733     if (status != OK) {
    734         return status;
    735     }
    736 
    737     if (size < 0) {
    738         return UNEXPECTED_NULL;
    739     }
    740 
    741     if (val->max_size() < static_cast<size_t>(size)) {
    742         return NO_MEMORY;
    743     }
    744 
    745     val->resize(static_cast<size_t>(size));
    746 
    747     if (val->size() < static_cast<size_t>(size)) {
    748         return NO_MEMORY;
    749     }
    750 
    751     for (auto& v: *val) {
    752         status = (this->*read_func)(&v);
    753 
    754         if (status != OK) {
    755             return status;
    756         }
    757     }
    758 
    759     return OK;
    760 }
    761 
    762 template<typename T>
    763 status_t Parcel::readTypedVector(std::vector<T>* val,
    764                                  status_t(Parcel::*read_func)(T*) const) const {
    765     return unsafeReadTypedVector(val, read_func);
    766 }
    767 
    768 template<typename T>
    769 status_t Parcel::readNullableTypedVector(std::unique_ptr<std::vector<T>>* val,
    770                                          status_t(Parcel::*read_func)(T*) const) const {
    771     const size_t start = dataPosition();
    772     int32_t size;
    773     status_t status = readInt32(&size);
    774     val->reset();
    775 
    776     if (status != OK || size < 0) {
    777         return status;
    778     }
    779 
    780     setDataPosition(start);
    781     val->reset(new std::vector<T>());
    782 
    783     status = unsafeReadTypedVector(val->get(), read_func);
    784 
    785     if (status != OK) {
    786         val->reset();
    787     }
    788 
    789     return status;
    790 }
    791 
    792 template<typename T, typename U>
    793 status_t Parcel::unsafeWriteTypedVector(const std::vector<T>& val,
    794                                         status_t(Parcel::*write_func)(U)) {
    795     if (val.size() > std::numeric_limits<int32_t>::max()) {
    796         return BAD_VALUE;
    797     }
    798 
    799     status_t status = this->writeInt32(static_cast<int32_t>(val.size()));
    800 
    801     if (status != OK) {
    802         return status;
    803     }
    804 
    805     for (const auto& item : val) {
    806         status = (this->*write_func)(item);
    807 
    808         if (status != OK) {
    809             return status;
    810         }
    811     }
    812 
    813     return OK;
    814 }
    815 
    816 template<typename T>
    817 status_t Parcel::writeTypedVector(const std::vector<T>& val,
    818                                   status_t(Parcel::*write_func)(const T&)) {
    819     return unsafeWriteTypedVector(val, write_func);
    820 }
    821 
    822 template<typename T>
    823 status_t Parcel::writeTypedVector(const std::vector<T>& val,
    824                                   status_t(Parcel::*write_func)(T)) {
    825     return unsafeWriteTypedVector(val, write_func);
    826 }
    827 
    828 template<typename T>
    829 status_t Parcel::writeNullableTypedVector(const std::unique_ptr<std::vector<T>>& val,
    830                                           status_t(Parcel::*write_func)(const T&)) {
    831     if (val.get() == nullptr) {
    832         return this->writeInt32(-1);
    833     }
    834 
    835     return unsafeWriteTypedVector(*val, write_func);
    836 }
    837 
    838 template<typename T>
    839 status_t Parcel::writeNullableTypedVector(const std::unique_ptr<std::vector<T>>& val,
    840                                           status_t(Parcel::*write_func)(T)) {
    841     if (val.get() == nullptr) {
    842         return this->writeInt32(-1);
    843     }
    844 
    845     return unsafeWriteTypedVector(*val, write_func);
    846 }
    847 
    848 template<typename T>
    849 status_t Parcel::readParcelableVector(std::vector<T>* val) const {
    850     return unsafeReadTypedVector<T, Parcelable>(val, &Parcel::readParcelable);
    851 }
    852 
    853 template<typename T>
    854 status_t Parcel::readParcelableVector(std::unique_ptr<std::vector<std::unique_ptr<T>>>* val) const {
    855     const size_t start = dataPosition();
    856     int32_t size;
    857     status_t status = readInt32(&size);
    858     val->reset();
    859 
    860     if (status != OK || size < 0) {
    861         return status;
    862     }
    863 
    864     setDataPosition(start);
    865     val->reset(new std::vector<std::unique_ptr<T>>());
    866 
    867     status = unsafeReadTypedVector(val->get(), &Parcel::readParcelable<T>);
    868 
    869     if (status != OK) {
    870         val->reset();
    871     }
    872 
    873     return status;
    874 }
    875 
    876 template<typename T>
    877 status_t Parcel::readParcelable(std::unique_ptr<T>* parcelable) const {
    878     const size_t start = dataPosition();
    879     int32_t present;
    880     status_t status = readInt32(&present);
    881     parcelable->reset();
    882 
    883     if (status != OK || !present) {
    884         return status;
    885     }
    886 
    887     setDataPosition(start);
    888     parcelable->reset(new T());
    889 
    890     status = readParcelable(parcelable->get());
    891 
    892     if (status != OK) {
    893         parcelable->reset();
    894     }
    895 
    896     return status;
    897 }
    898 
    899 template<typename T>
    900 status_t Parcel::writeNullableParcelable(const std::unique_ptr<T>& parcelable) {
    901     return writeRawNullableParcelable(parcelable.get());
    902 }
    903 
    904 template<typename T>
    905 status_t Parcel::writeParcelableVector(const std::vector<T>& val) {
    906     return unsafeWriteTypedVector<T,const Parcelable&>(val, &Parcel::writeParcelable);
    907 }
    908 
    909 template<typename T>
    910 status_t Parcel::writeParcelableVector(const std::unique_ptr<std::vector<std::unique_ptr<T>>>& val) {
    911     if (val.get() == nullptr) {
    912         return this->writeInt32(-1);
    913     }
    914 
    915     return unsafeWriteTypedVector(*val, &Parcel::writeNullableParcelable<T>);
    916 }
    917 
    918 template<typename T>
    919 status_t Parcel::writeParcelableVector(const std::shared_ptr<std::vector<std::unique_ptr<T>>>& val) {
    920     if (val.get() == nullptr) {
    921         return this->writeInt32(-1);
    922     }
    923 
    924     return unsafeWriteTypedVector(*val, &Parcel::writeNullableParcelable<T>);
    925 }
    926 
    927 // ---------------------------------------------------------------------------
    928 
    929 inline TextOutput& operator<<(TextOutput& to, const Parcel& parcel)
    930 {
    931     parcel.print(to);
    932     return to;
    933 }
    934 
    935 // ---------------------------------------------------------------------------
    936 
    937 // Generic acquire and release of objects.
    938 void acquire_object(const sp<ProcessState>& proc,
    939                     const flat_binder_object& obj, const void* who);
    940 void release_object(const sp<ProcessState>& proc,
    941                     const flat_binder_object& obj, const void* who);
    942 
    943 void flatten_binder(const sp<ProcessState>& proc,
    944                     const sp<IBinder>& binder, flat_binder_object* out);
    945 void flatten_binder(const sp<ProcessState>& proc,
    946                     const wp<IBinder>& binder, flat_binder_object* out);
    947 status_t unflatten_binder(const sp<ProcessState>& proc,
    948                           const flat_binder_object& flat, sp<IBinder>* out);
    949 status_t unflatten_binder(const sp<ProcessState>& proc,
    950                           const flat_binder_object& flat, wp<IBinder>* out);
    951 
    952 }; // namespace android
    953 
    954 // ---------------------------------------------------------------------------
    955 
    956 #endif // ANDROID_PARCEL_H
    957