1edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project/*
2edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * Copyright (C) 2005 The Android Open Source Project
3edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project *
4edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
5edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * you may not use this file except in compliance with the License.
6edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * You may obtain a copy of the License at
7edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project *
8edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
9edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project *
10edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * Unless required by applicable law or agreed to in writing, software
11edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
12edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * See the License for the specific language governing permissions and
14edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * limitations under the License.
15edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project */
16edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
17edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#ifndef ANDROID_PARCEL_H
18edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#define ANDROID_PARCEL_H
19edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
209a5e32f141fdb43edc1bb31ceacec781b35281b3Christopher Wiley#include <string>
21451ff582d730e27f4e22d9f158f8ee24d1bc2729Casey Dahlin#include <vector>
22451ff582d730e27f4e22d9f158f8ee24d1bc2729Casey Dahlin
2383e6b989c0cbea66e98becd60611c7d1e58e1001Christopher Wiley#include <android-base/unique_fd.h>
24edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <cutils/native_handle.h>
25edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <utils/Errors.h>
26edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <utils/RefBase.h>
27edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <utils/String16.h>
28edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <utils/Vector.h>
298683fca395d01734ec7946e9f0595ec5d7b754c6Mathias Agopian#include <utils/Flattenable.h>
300170cd016c8c649da3a3d845276e6c5ffa350481Christopher Ferris#include <linux/android/binder.h>
31edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
32f0c13772d95486d98f034361883b2415bb26a614Casey Dahlin#include <binder/IInterface.h>
3397f048d19e51da4ea6ff98d8a9daf38f2577f182Christopher Wiley#include <binder/Parcelable.h>
346316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum#include <binder/Map.h>
35f0c13772d95486d98f034361883b2415bb26a614Casey Dahlin
36edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------
37edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectnamespace android {
38edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
39e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopiantemplate <typename T> class Flattenable;
408683fca395d01734ec7946e9f0595ec5d7b754c6Mathias Agopiantemplate <typename T> class LightFlattenable;
41edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectclass IBinder;
4270081a1511955f53bd0ed7f2aec9a1bf09f0f379Brad Fitzpatrickclass IPCThreadState;
43edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectclass ProcessState;
44edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectclass String8;
45edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectclass TextOutput;
46edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
476316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaumnamespace binder {
486316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaumclass Value;
496316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum};
506316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum
51e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopianclass Parcel {
52f683e0163a84d93448b9388126902242367cd961Serban Constantinescu    friend class IPCThreadState;
53edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectpublic:
545707dbf15d0b44c88fbaa6dd271097f2d42932e0Jeff Brown    class ReadableBlob;
555707dbf15d0b44c88fbaa6dd271097f2d42932e0Jeff Brown    class WritableBlob;
565707dbf15d0b44c88fbaa6dd271097f2d42932e0Jeff Brown
57edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                        Parcel();
58edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                        ~Parcel();
59edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
60edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    const uint8_t*      data() const;
61edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    size_t              dataSize() const;
62edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    size_t              dataAvail() const;
63edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    size_t              dataPosition() const;
64edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    size_t              dataCapacity() const;
658938ed2c8e906fc332301b64787728d4d34da571Dianne Hackborn
66edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    status_t            setDataSize(size_t size);
67edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    void                setDataPosition(size_t pos) const;
68edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    status_t            setDataCapacity(size_t size);
69edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
70edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    status_t            setData(const uint8_t* buffer, size_t len);
71edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
7251faf46e2958c57dab46d9420e585319125c7c42Andreas Huber    status_t            appendFrom(const Parcel *parcel,
7351faf46e2958c57dab46d9420e585319125c7c42Andreas Huber                                   size_t start, size_t len);
74edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
7515feb9b55a0ea1d4a4e21a6425965b1004fdbc8bDianne Hackborn    int                 compareData(const Parcel& other);
7615feb9b55a0ea1d4a4e21a6425965b1004fdbc8bDianne Hackborn
7713b1604018968408bcc5553e1fa5ea9df3e4e009Jeff Brown    bool                allowFds() const;
787746cc318829358bb2c4dc0a03d40a7856a6d13eDianne Hackborn    bool                pushAllowFds(bool allowFds);
797746cc318829358bb2c4dc0a03d40a7856a6d13eDianne Hackborn    void                restoreAllowFds(bool lastValue);
808938ed2c8e906fc332301b64787728d4d34da571Dianne Hackborn
81edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    bool                hasFileDescriptors() const;
82edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
83702ea9d42f52fc145090c0f0bfbe64993e4b8b33Brad Fitzpatrick    // Writes the RPC header.
84edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    status_t            writeInterfaceToken(const String16& interface);
85a877cd85b5a026384542e3271fc310d6a8fe24c6Brad Fitzpatrick
86702ea9d42f52fc145090c0f0bfbe64993e4b8b33Brad Fitzpatrick    // Parses the RPC header, returning true if the interface name
87702ea9d42f52fc145090c0f0bfbe64993e4b8b33Brad Fitzpatrick    // in the header matches the expected interface from the caller.
8870081a1511955f53bd0ed7f2aec9a1bf09f0f379Brad Fitzpatrick    //
8970081a1511955f53bd0ed7f2aec9a1bf09f0f379Brad Fitzpatrick    // Additionally, enforceInterface does part of the work of
9070081a1511955f53bd0ed7f2aec9a1bf09f0f379Brad Fitzpatrick    // propagating the StrictMode policy mask, populating the current
9170081a1511955f53bd0ed7f2aec9a1bf09f0f379Brad Fitzpatrick    // IPCThreadState, which as an optimization may optionally be
9270081a1511955f53bd0ed7f2aec9a1bf09f0f379Brad Fitzpatrick    // passed in.
93a877cd85b5a026384542e3271fc310d6a8fe24c6Brad Fitzpatrick    bool                enforceInterface(const String16& interface,
9470081a1511955f53bd0ed7f2aec9a1bf09f0f379Brad Fitzpatrick                                         IPCThreadState* threadState = NULL) const;
95702ea9d42f52fc145090c0f0bfbe64993e4b8b33Brad Fitzpatrick    bool                checkInterface(IBinder*) const;
9683c0446f27b9542d6c2e724817b2b2d8d1f55085Mathias Agopian
97edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    void                freeData();
98edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
9984e625ac1e01f5a9c3ed16664da6498212ed662bArve Hjønnevågprivate:
10084e625ac1e01f5a9c3ed16664da6498212ed662bArve Hjønnevåg    const binder_size_t* objects() const;
10184e625ac1e01f5a9c3ed16664da6498212ed662bArve Hjønnevåg
10284e625ac1e01f5a9c3ed16664da6498212ed662bArve Hjønnevågpublic:
103edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    size_t              objectsCount() const;
104edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
105edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    status_t            errorCheck() const;
106edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    void                setError(status_t err);
107edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
108edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    status_t            write(const void* data, size_t len);
109edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    void*               writeInplace(size_t len);
110edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    status_t            writeUnpadded(const void* data, size_t len);
111edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    status_t            writeInt32(int32_t val);
11241a0f2f86c0ca7d2fef50aef6215987f445a7231Dan Stoza    status_t            writeUint32(uint32_t val);
113edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    status_t            writeInt64(int64_t val);
1142d13afdfa1f43973bf3cb917c7d6496a38baa446Ronghua Wu    status_t            writeUint64(uint64_t val);
115edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    status_t            writeFloat(float val);
116edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    status_t            writeDouble(double val);
117edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    status_t            writeCString(const char* str);
118edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    status_t            writeString8(const String8& str);
119edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    status_t            writeString16(const String16& str);
120b9872623ca0f2366c348d6d40a8ba45ee0e87710Casey Dahlin    status_t            writeString16(const std::unique_ptr<String16>& str);
121edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    status_t            writeString16(const char16_t* str, size_t len);
122edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    status_t            writeStrongBinder(const sp<IBinder>& val);
123edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    status_t            writeWeakBinder(const wp<IBinder>& val);
1245c0106e134366312206702f1b072347e20c90374Marco Nelissen    status_t            writeInt32Array(size_t len, const int32_t *val);
125f0190bff38b6c29abbfc4a877442f71fc3d7dad8Marco Nelissen    status_t            writeByteArray(size_t len, const uint8_t *val);
126d6848f52e60be17b7f0992be7827dcae4ea2efb1Casey Dahlin    status_t            writeBool(bool val);
127d6848f52e60be17b7f0992be7827dcae4ea2efb1Casey Dahlin    status_t            writeChar(char16_t val);
128d6848f52e60be17b7f0992be7827dcae4ea2efb1Casey Dahlin    status_t            writeByte(int8_t val);
129e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian
1309a5e32f141fdb43edc1bb31ceacec781b35281b3Christopher Wiley    // Take a UTF8 encoded string, convert to UTF16, write it to the parcel.
1319a5e32f141fdb43edc1bb31ceacec781b35281b3Christopher Wiley    status_t            writeUtf8AsUtf16(const std::string& str);
1329a5e32f141fdb43edc1bb31ceacec781b35281b3Christopher Wiley    status_t            writeUtf8AsUtf16(const std::unique_ptr<std::string>& str);
1339a5e32f141fdb43edc1bb31ceacec781b35281b3Christopher Wiley
134b9872623ca0f2366c348d6d40a8ba45ee0e87710Casey Dahlin    status_t            writeByteVector(const std::unique_ptr<std::vector<int8_t>>& val);
135451ff582d730e27f4e22d9f158f8ee24d1bc2729Casey Dahlin    status_t            writeByteVector(const std::vector<int8_t>& val);
136185d3447d8a62d4d93d19125b82dbc3f9e12dda2Casey Dahlin    status_t            writeByteVector(const std::unique_ptr<std::vector<uint8_t>>& val);
137185d3447d8a62d4d93d19125b82dbc3f9e12dda2Casey Dahlin    status_t            writeByteVector(const std::vector<uint8_t>& val);
138b9872623ca0f2366c348d6d40a8ba45ee0e87710Casey Dahlin    status_t            writeInt32Vector(const std::unique_ptr<std::vector<int32_t>>& val);
139451ff582d730e27f4e22d9f158f8ee24d1bc2729Casey Dahlin    status_t            writeInt32Vector(const std::vector<int32_t>& val);
140b9872623ca0f2366c348d6d40a8ba45ee0e87710Casey Dahlin    status_t            writeInt64Vector(const std::unique_ptr<std::vector<int64_t>>& val);
141451ff582d730e27f4e22d9f158f8ee24d1bc2729Casey Dahlin    status_t            writeInt64Vector(const std::vector<int64_t>& val);
142b9872623ca0f2366c348d6d40a8ba45ee0e87710Casey Dahlin    status_t            writeFloatVector(const std::unique_ptr<std::vector<float>>& val);
143451ff582d730e27f4e22d9f158f8ee24d1bc2729Casey Dahlin    status_t            writeFloatVector(const std::vector<float>& val);
144b9872623ca0f2366c348d6d40a8ba45ee0e87710Casey Dahlin    status_t            writeDoubleVector(const std::unique_ptr<std::vector<double>>& val);
145451ff582d730e27f4e22d9f158f8ee24d1bc2729Casey Dahlin    status_t            writeDoubleVector(const std::vector<double>& val);
146b9872623ca0f2366c348d6d40a8ba45ee0e87710Casey Dahlin    status_t            writeBoolVector(const std::unique_ptr<std::vector<bool>>& val);
147451ff582d730e27f4e22d9f158f8ee24d1bc2729Casey Dahlin    status_t            writeBoolVector(const std::vector<bool>& val);
148b9872623ca0f2366c348d6d40a8ba45ee0e87710Casey Dahlin    status_t            writeCharVector(const std::unique_ptr<std::vector<char16_t>>& val);
149451ff582d730e27f4e22d9f158f8ee24d1bc2729Casey Dahlin    status_t            writeCharVector(const std::vector<char16_t>& val);
150b9872623ca0f2366c348d6d40a8ba45ee0e87710Casey Dahlin    status_t            writeString16Vector(
151b9872623ca0f2366c348d6d40a8ba45ee0e87710Casey Dahlin                            const std::unique_ptr<std::vector<std::unique_ptr<String16>>>& val);
152451ff582d730e27f4e22d9f158f8ee24d1bc2729Casey Dahlin    status_t            writeString16Vector(const std::vector<String16>& val);
1539a5e32f141fdb43edc1bb31ceacec781b35281b3Christopher Wiley    status_t            writeUtf8VectorAsUtf16Vector(
1549a5e32f141fdb43edc1bb31ceacec781b35281b3Christopher Wiley                            const std::unique_ptr<std::vector<std::unique_ptr<std::string>>>& val);
1559a5e32f141fdb43edc1bb31ceacec781b35281b3Christopher Wiley    status_t            writeUtf8VectorAsUtf16Vector(const std::vector<std::string>& val);
156451ff582d730e27f4e22d9f158f8ee24d1bc2729Casey Dahlin
157b9872623ca0f2366c348d6d40a8ba45ee0e87710Casey Dahlin    status_t            writeStrongBinderVector(const std::unique_ptr<std::vector<sp<IBinder>>>& val);
158eb8e15f9bb29f8794f8be819530631c358fd6a15Casey Dahlin    status_t            writeStrongBinderVector(const std::vector<sp<IBinder>>& val);
159eb8e15f9bb29f8794f8be819530631c358fd6a15Casey Dahlin
160e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian    template<typename T>
161b9872623ca0f2366c348d6d40a8ba45ee0e87710Casey Dahlin    status_t            writeParcelableVector(const std::unique_ptr<std::vector<std::unique_ptr<T>>>& val);
162b9872623ca0f2366c348d6d40a8ba45ee0e87710Casey Dahlin    template<typename T>
1638d747090a48488b143eac072855fda931fa25ab3Janis Danisevskis    status_t            writeParcelableVector(const std::shared_ptr<std::vector<std::unique_ptr<T>>>& val);
1648d747090a48488b143eac072855fda931fa25ab3Janis Danisevskis    template<typename T>
16597f048d19e51da4ea6ff98d8a9daf38f2577f182Christopher Wiley    status_t            writeParcelableVector(const std::vector<T>& val);
166b9872623ca0f2366c348d6d40a8ba45ee0e87710Casey Dahlin
167b9872623ca0f2366c348d6d40a8ba45ee0e87710Casey Dahlin    template<typename T>
168b9872623ca0f2366c348d6d40a8ba45ee0e87710Casey Dahlin    status_t            writeNullableParcelable(const std::unique_ptr<T>& parcelable);
169b9872623ca0f2366c348d6d40a8ba45ee0e87710Casey Dahlin
17097f048d19e51da4ea6ff98d8a9daf38f2577f182Christopher Wiley    status_t            writeParcelable(const Parcelable& parcelable);
17197f048d19e51da4ea6ff98d8a9daf38f2577f182Christopher Wiley
1726316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum    status_t            writeValue(const binder::Value& value);
1736316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum
17497f048d19e51da4ea6ff98d8a9daf38f2577f182Christopher Wiley    template<typename T>
175e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian    status_t            write(const Flattenable<T>& val);
176edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1778683fca395d01734ec7946e9f0595ec5d7b754c6Mathias Agopian    template<typename T>
1788683fca395d01734ec7946e9f0595ec5d7b754c6Mathias Agopian    status_t            write(const LightFlattenable<T>& val);
1798683fca395d01734ec7946e9f0595ec5d7b754c6Mathias Agopian
18031c1beb1d8de373f7734a54e25ad80b01024adb0Christopher Wiley    template<typename T>
18131c1beb1d8de373f7734a54e25ad80b01024adb0Christopher Wiley    status_t            writeVectorSize(const std::vector<T>& val);
18231c1beb1d8de373f7734a54e25ad80b01024adb0Christopher Wiley    template<typename T>
18331c1beb1d8de373f7734a54e25ad80b01024adb0Christopher Wiley    status_t            writeVectorSize(const std::unique_ptr<std::vector<T>>& val);
1848683fca395d01734ec7946e9f0595ec5d7b754c6Mathias Agopian
1856316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum    status_t            writeMap(const binder::Map& map);
1866316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum    status_t            writeNullableMap(const std::unique_ptr<binder::Map>& map);
1876316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum
188a47f02afb1e1f2c4abd9379c13903a5dde89d354Mathias Agopian    // Place a native_handle into the parcel (the native_handle's file-
189a47f02afb1e1f2c4abd9379c13903a5dde89d354Mathias Agopian    // descriptors are dup'ed, so it is safe to delete the native_handle
190451ff582d730e27f4e22d9f158f8ee24d1bc2729Casey Dahlin    // when this function returns).
191a47f02afb1e1f2c4abd9379c13903a5dde89d354Mathias Agopian    // Doesn't take ownership of the native_handle.
192a47f02afb1e1f2c4abd9379c13903a5dde89d354Mathias Agopian    status_t            writeNativeHandle(const native_handle* handle);
1931941a404d642b3dfaac365ba494f1e9912876f00Dianne Hackborn
194edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // Place a file descriptor into the parcel.  The given fd must remain
195edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // valid for the lifetime of the parcel.
19693ff1f985e233fe04412a65041e977c9f0c21f5bJeff Brown    // The Parcel does not take ownership of the given fd unless you ask it to.
19793ff1f985e233fe04412a65041e977c9f0c21f5bJeff Brown    status_t            writeFileDescriptor(int fd, bool takeOwnership = false);
1981941a404d642b3dfaac365ba494f1e9912876f00Dianne Hackborn
199edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // Place a file descriptor into the parcel.  A dup of the fd is made, which
200edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // will be closed once the parcel is destroyed.
201edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    status_t            writeDupFileDescriptor(int fd);
2025707dbf15d0b44c88fbaa6dd271097f2d42932e0Jeff Brown
2031941a404d642b3dfaac365ba494f1e9912876f00Dianne Hackborn    // Place a Java "parcel file descriptor" into the parcel.  The given fd must remain
2041941a404d642b3dfaac365ba494f1e9912876f00Dianne Hackborn    // valid for the lifetime of the parcel.
2051941a404d642b3dfaac365ba494f1e9912876f00Dianne Hackborn    // The Parcel does not take ownership of the given fd unless you ask it to.
2061941a404d642b3dfaac365ba494f1e9912876f00Dianne Hackborn    status_t            writeParcelFileDescriptor(int fd, bool takeOwnership = false);
2071941a404d642b3dfaac365ba494f1e9912876f00Dianne Hackborn
20806673e38983baad380e818c5493b7faccf3b2393Casey Dahlin    // Place a file descriptor into the parcel.  This will not affect the
20906673e38983baad380e818c5493b7faccf3b2393Casey Dahlin    // semantics of the smart file descriptor. A new descriptor will be
21006673e38983baad380e818c5493b7faccf3b2393Casey Dahlin    // created, and will be closed when the parcel is destroyed.
21106673e38983baad380e818c5493b7faccf3b2393Casey Dahlin    status_t            writeUniqueFileDescriptor(
2122cf1995d3d1cdca8e0ba2d8fab9a322c4096f809Christopher Wiley                            const base::unique_fd& fd);
21306673e38983baad380e818c5493b7faccf3b2393Casey Dahlin
21406673e38983baad380e818c5493b7faccf3b2393Casey Dahlin    // Place a vector of file desciptors into the parcel. Each descriptor is
21506673e38983baad380e818c5493b7faccf3b2393Casey Dahlin    // dup'd as in writeDupFileDescriptor
21606673e38983baad380e818c5493b7faccf3b2393Casey Dahlin    status_t            writeUniqueFileDescriptorVector(
2172cf1995d3d1cdca8e0ba2d8fab9a322c4096f809Christopher Wiley                            const std::unique_ptr<std::vector<base::unique_fd>>& val);
218b9872623ca0f2366c348d6d40a8ba45ee0e87710Casey Dahlin    status_t            writeUniqueFileDescriptorVector(
2192cf1995d3d1cdca8e0ba2d8fab9a322c4096f809Christopher Wiley                            const std::vector<base::unique_fd>& val);
22006673e38983baad380e818c5493b7faccf3b2393Casey Dahlin
2215707dbf15d0b44c88fbaa6dd271097f2d42932e0Jeff Brown    // Writes a blob to the parcel.
2225707dbf15d0b44c88fbaa6dd271097f2d42932e0Jeff Brown    // If the blob is small, then it is stored in-place, otherwise it is
22313b1604018968408bcc5553e1fa5ea9df3e4e009Jeff Brown    // transferred by way of an anonymous shared memory region.  Prefer sending
22413b1604018968408bcc5553e1fa5ea9df3e4e009Jeff Brown    // immutable blobs if possible since they may be subsequently transferred between
22513b1604018968408bcc5553e1fa5ea9df3e4e009Jeff Brown    // processes without further copying whereas mutable blobs always need to be copied.
2265707dbf15d0b44c88fbaa6dd271097f2d42932e0Jeff Brown    // The caller should call release() on the blob after writing its contents.
22713b1604018968408bcc5553e1fa5ea9df3e4e009Jeff Brown    status_t            writeBlob(size_t len, bool mutableCopy, WritableBlob* outBlob);
22813b1604018968408bcc5553e1fa5ea9df3e4e009Jeff Brown
22913b1604018968408bcc5553e1fa5ea9df3e4e009Jeff Brown    // Write an existing immutable blob file descriptor to the parcel.
23013b1604018968408bcc5553e1fa5ea9df3e4e009Jeff Brown    // This allows the client to send the same blob to multiple processes
23113b1604018968408bcc5553e1fa5ea9df3e4e009Jeff Brown    // as long as it keeps a dup of the blob file descriptor handy for later.
23213b1604018968408bcc5553e1fa5ea9df3e4e009Jeff Brown    status_t            writeDupImmutableBlobFileDescriptor(int fd);
2335707dbf15d0b44c88fbaa6dd271097f2d42932e0Jeff Brown
234edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    status_t            writeObject(const flat_binder_object& val, bool nullMetaData);
235edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
236837a0d0fb2c3fba8082d47d04cb6120af1eb9a54Brad Fitzpatrick    // Like Parcel.java's writeNoException().  Just writes a zero int32.
237837a0d0fb2c3fba8082d47d04cb6120af1eb9a54Brad Fitzpatrick    // Currently the native implementation doesn't do any of the StrictMode
238837a0d0fb2c3fba8082d47d04cb6120af1eb9a54Brad Fitzpatrick    // stack gathering and serialization that the Java implementation does.
239837a0d0fb2c3fba8082d47d04cb6120af1eb9a54Brad Fitzpatrick    status_t            writeNoException();
240837a0d0fb2c3fba8082d47d04cb6120af1eb9a54Brad Fitzpatrick
241edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    void                remove(size_t start, size_t amt);
242edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
243edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    status_t            read(void* outData, size_t len) const;
244edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    const void*         readInplace(size_t len) const;
245edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    int32_t             readInt32() const;
246edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    status_t            readInt32(int32_t *pArg) const;
24741a0f2f86c0ca7d2fef50aef6215987f445a7231Dan Stoza    uint32_t            readUint32() const;
24841a0f2f86c0ca7d2fef50aef6215987f445a7231Dan Stoza    status_t            readUint32(uint32_t *pArg) const;
249edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    int64_t             readInt64() const;
250edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    status_t            readInt64(int64_t *pArg) const;
2512d13afdfa1f43973bf3cb917c7d6496a38baa446Ronghua Wu    uint64_t            readUint64() const;
2522d13afdfa1f43973bf3cb917c7d6496a38baa446Ronghua Wu    status_t            readUint64(uint64_t *pArg) const;
253edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    float               readFloat() const;
254edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    status_t            readFloat(float *pArg) const;
255edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    double              readDouble() const;
256edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    status_t            readDouble(double *pArg) const;
25784a6d041e2c69d4d0b69269a0b59e725c9f119a3Andreas Huber    intptr_t            readIntPtr() const;
25884a6d041e2c69d4d0b69269a0b59e725c9f119a3Andreas Huber    status_t            readIntPtr(intptr_t *pArg) const;
259d6848f52e60be17b7f0992be7827dcae4ea2efb1Casey Dahlin    bool                readBool() const;
260d6848f52e60be17b7f0992be7827dcae4ea2efb1Casey Dahlin    status_t            readBool(bool *pArg) const;
261d6848f52e60be17b7f0992be7827dcae4ea2efb1Casey Dahlin    char16_t            readChar() const;
262d6848f52e60be17b7f0992be7827dcae4ea2efb1Casey Dahlin    status_t            readChar(char16_t *pArg) const;
263d6848f52e60be17b7f0992be7827dcae4ea2efb1Casey Dahlin    int8_t              readByte() const;
264d6848f52e60be17b7f0992be7827dcae4ea2efb1Casey Dahlin    status_t            readByte(int8_t *pArg) const;
265edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
2669a5e32f141fdb43edc1bb31ceacec781b35281b3Christopher Wiley    // Read a UTF16 encoded string, convert to UTF8
2679a5e32f141fdb43edc1bb31ceacec781b35281b3Christopher Wiley    status_t            readUtf8FromUtf16(std::string* str) const;
2689a5e32f141fdb43edc1bb31ceacec781b35281b3Christopher Wiley    status_t            readUtf8FromUtf16(std::unique_ptr<std::string>* str) const;
2699a5e32f141fdb43edc1bb31ceacec781b35281b3Christopher Wiley
270edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    const char*         readCString() const;
271edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    String8             readString8() const;
27287b64d2a0e6aa35f39d612ecbd688f36f1046d5aRoshan Pius    status_t            readString8(String8* pArg) const;
273edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    String16            readString16() const;
274451ff582d730e27f4e22d9f158f8ee24d1bc2729Casey Dahlin    status_t            readString16(String16* pArg) const;
275b9872623ca0f2366c348d6d40a8ba45ee0e87710Casey Dahlin    status_t            readString16(std::unique_ptr<String16>* pArg) const;
276edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    const char16_t*     readString16Inplace(size_t* outLen) const;
277edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    sp<IBinder>         readStrongBinder() const;
278f0c13772d95486d98f034361883b2415bb26a614Casey Dahlin    status_t            readStrongBinder(sp<IBinder>* val) const;
27935d77caf8e7e34fa6ac8f4bbc75a52631adc0272Christopher Wiley    status_t            readNullableStrongBinder(sp<IBinder>* val) const;
280edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    wp<IBinder>         readWeakBinder() const;
281e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian
282f0c13772d95486d98f034361883b2415bb26a614Casey Dahlin    template<typename T>
283b9872623ca0f2366c348d6d40a8ba45ee0e87710Casey Dahlin    status_t            readParcelableVector(
284b9872623ca0f2366c348d6d40a8ba45ee0e87710Casey Dahlin                            std::unique_ptr<std::vector<std::unique_ptr<T>>>* val) const;
285b9872623ca0f2366c348d6d40a8ba45ee0e87710Casey Dahlin    template<typename T>
28697f048d19e51da4ea6ff98d8a9daf38f2577f182Christopher Wiley    status_t            readParcelableVector(std::vector<T>* val) const;
287b9872623ca0f2366c348d6d40a8ba45ee0e87710Casey Dahlin
28897f048d19e51da4ea6ff98d8a9daf38f2577f182Christopher Wiley    status_t            readParcelable(Parcelable* parcelable) const;
28997f048d19e51da4ea6ff98d8a9daf38f2577f182Christopher Wiley
29097f048d19e51da4ea6ff98d8a9daf38f2577f182Christopher Wiley    template<typename T>
291b9872623ca0f2366c348d6d40a8ba45ee0e87710Casey Dahlin    status_t            readParcelable(std::unique_ptr<T>* parcelable) const;
292b9872623ca0f2366c348d6d40a8ba45ee0e87710Casey Dahlin
2936316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum    status_t            readValue(binder::Value* value) const;
2946316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum
295b9872623ca0f2366c348d6d40a8ba45ee0e87710Casey Dahlin    template<typename T>
296eb8e15f9bb29f8794f8be819530631c358fd6a15Casey Dahlin    status_t            readStrongBinder(sp<T>* val) const;
297eb8e15f9bb29f8794f8be819530631c358fd6a15Casey Dahlin
29835d77caf8e7e34fa6ac8f4bbc75a52631adc0272Christopher Wiley    template<typename T>
29935d77caf8e7e34fa6ac8f4bbc75a52631adc0272Christopher Wiley    status_t            readNullableStrongBinder(sp<T>* val) const;
30035d77caf8e7e34fa6ac8f4bbc75a52631adc0272Christopher Wiley
301b9872623ca0f2366c348d6d40a8ba45ee0e87710Casey Dahlin    status_t            readStrongBinderVector(std::unique_ptr<std::vector<sp<IBinder>>>* val) const;
302eb8e15f9bb29f8794f8be819530631c358fd6a15Casey Dahlin    status_t            readStrongBinderVector(std::vector<sp<IBinder>>* val) const;
303f0c13772d95486d98f034361883b2415bb26a614Casey Dahlin
304b9872623ca0f2366c348d6d40a8ba45ee0e87710Casey Dahlin    status_t            readByteVector(std::unique_ptr<std::vector<int8_t>>* val) const;
305451ff582d730e27f4e22d9f158f8ee24d1bc2729Casey Dahlin    status_t            readByteVector(std::vector<int8_t>* val) const;
306185d3447d8a62d4d93d19125b82dbc3f9e12dda2Casey Dahlin    status_t            readByteVector(std::unique_ptr<std::vector<uint8_t>>* val) const;
307185d3447d8a62d4d93d19125b82dbc3f9e12dda2Casey Dahlin    status_t            readByteVector(std::vector<uint8_t>* val) const;
308b9872623ca0f2366c348d6d40a8ba45ee0e87710Casey Dahlin    status_t            readInt32Vector(std::unique_ptr<std::vector<int32_t>>* val) const;
309451ff582d730e27f4e22d9f158f8ee24d1bc2729Casey Dahlin    status_t            readInt32Vector(std::vector<int32_t>* val) const;
310b9872623ca0f2366c348d6d40a8ba45ee0e87710Casey Dahlin    status_t            readInt64Vector(std::unique_ptr<std::vector<int64_t>>* val) const;
311451ff582d730e27f4e22d9f158f8ee24d1bc2729Casey Dahlin    status_t            readInt64Vector(std::vector<int64_t>* val) const;
312b9872623ca0f2366c348d6d40a8ba45ee0e87710Casey Dahlin    status_t            readFloatVector(std::unique_ptr<std::vector<float>>* val) const;
313451ff582d730e27f4e22d9f158f8ee24d1bc2729Casey Dahlin    status_t            readFloatVector(std::vector<float>* val) const;
314b9872623ca0f2366c348d6d40a8ba45ee0e87710Casey Dahlin    status_t            readDoubleVector(std::unique_ptr<std::vector<double>>* val) const;
315451ff582d730e27f4e22d9f158f8ee24d1bc2729Casey Dahlin    status_t            readDoubleVector(std::vector<double>* val) const;
316b9872623ca0f2366c348d6d40a8ba45ee0e87710Casey Dahlin    status_t            readBoolVector(std::unique_ptr<std::vector<bool>>* val) const;
317451ff582d730e27f4e22d9f158f8ee24d1bc2729Casey Dahlin    status_t            readBoolVector(std::vector<bool>* val) const;
318b9872623ca0f2366c348d6d40a8ba45ee0e87710Casey Dahlin    status_t            readCharVector(std::unique_ptr<std::vector<char16_t>>* val) const;
319451ff582d730e27f4e22d9f158f8ee24d1bc2729Casey Dahlin    status_t            readCharVector(std::vector<char16_t>* val) const;
320b9872623ca0f2366c348d6d40a8ba45ee0e87710Casey Dahlin    status_t            readString16Vector(
321b9872623ca0f2366c348d6d40a8ba45ee0e87710Casey Dahlin                            std::unique_ptr<std::vector<std::unique_ptr<String16>>>* val) const;
322451ff582d730e27f4e22d9f158f8ee24d1bc2729Casey Dahlin    status_t            readString16Vector(std::vector<String16>* val) const;
3239a5e32f141fdb43edc1bb31ceacec781b35281b3Christopher Wiley    status_t            readUtf8VectorFromUtf16Vector(
3249a5e32f141fdb43edc1bb31ceacec781b35281b3Christopher Wiley                            std::unique_ptr<std::vector<std::unique_ptr<std::string>>>* val) const;
3259a5e32f141fdb43edc1bb31ceacec781b35281b3Christopher Wiley    status_t            readUtf8VectorFromUtf16Vector(std::vector<std::string>* val) const;
326451ff582d730e27f4e22d9f158f8ee24d1bc2729Casey Dahlin
327e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian    template<typename T>
328e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian    status_t            read(Flattenable<T>& val) const;
329837a0d0fb2c3fba8082d47d04cb6120af1eb9a54Brad Fitzpatrick
3308683fca395d01734ec7946e9f0595ec5d7b754c6Mathias Agopian    template<typename T>
3318683fca395d01734ec7946e9f0595ec5d7b754c6Mathias Agopian    status_t            read(LightFlattenable<T>& val) const;
3328683fca395d01734ec7946e9f0595ec5d7b754c6Mathias Agopian
33331c1beb1d8de373f7734a54e25ad80b01024adb0Christopher Wiley    template<typename T>
33431c1beb1d8de373f7734a54e25ad80b01024adb0Christopher Wiley    status_t            resizeOutVector(std::vector<T>* val) const;
33531c1beb1d8de373f7734a54e25ad80b01024adb0Christopher Wiley    template<typename T>
33631c1beb1d8de373f7734a54e25ad80b01024adb0Christopher Wiley    status_t            resizeOutVector(std::unique_ptr<std::vector<T>>* val) const;
33731c1beb1d8de373f7734a54e25ad80b01024adb0Christopher Wiley
3386316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum    status_t            readMap(binder::Map* map)const;
3396316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum    status_t            readNullableMap(std::unique_ptr<binder::Map>* map) const;
3406316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum
341837a0d0fb2c3fba8082d47d04cb6120af1eb9a54Brad Fitzpatrick    // Like Parcel.java's readExceptionCode().  Reads the first int32
342837a0d0fb2c3fba8082d47d04cb6120af1eb9a54Brad Fitzpatrick    // off of a Parcel's header, returning 0 or the negative error
343837a0d0fb2c3fba8082d47d04cb6120af1eb9a54Brad Fitzpatrick    // code on exceptions, but also deals with skipping over rich
344837a0d0fb2c3fba8082d47d04cb6120af1eb9a54Brad Fitzpatrick    // response headers.  Callers should use this to read & parse the
345837a0d0fb2c3fba8082d47d04cb6120af1eb9a54Brad Fitzpatrick    // response headers rather than doing it by hand.
346837a0d0fb2c3fba8082d47d04cb6120af1eb9a54Brad Fitzpatrick    int32_t             readExceptionCode() const;
347837a0d0fb2c3fba8082d47d04cb6120af1eb9a54Brad Fitzpatrick
348a47f02afb1e1f2c4abd9379c13903a5dde89d354Mathias Agopian    // Retrieve native_handle from the parcel. This returns a copy of the
349a47f02afb1e1f2c4abd9379c13903a5dde89d354Mathias Agopian    // parcel's native_handle (the caller takes ownership). The caller
350a47f02afb1e1f2c4abd9379c13903a5dde89d354Mathias Agopian    // must free the native_handle with native_handle_close() and
351a47f02afb1e1f2c4abd9379c13903a5dde89d354Mathias Agopian    // native_handle_delete().
352a47f02afb1e1f2c4abd9379c13903a5dde89d354Mathias Agopian    native_handle*     readNativeHandle() const;
353edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
354edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
355edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // Retrieve a file descriptor from the parcel.  This returns the raw fd
356edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // in the parcel, which you do not own -- use dup() to get your own copy.
357edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    int                 readFileDescriptor() const;
3585707dbf15d0b44c88fbaa6dd271097f2d42932e0Jeff Brown
3591941a404d642b3dfaac365ba494f1e9912876f00Dianne Hackborn    // Retrieve a Java "parcel file descriptor" from the parcel.  This returns the raw fd
3601941a404d642b3dfaac365ba494f1e9912876f00Dianne Hackborn    // in the parcel, which you do not own -- use dup() to get your own copy.
3611941a404d642b3dfaac365ba494f1e9912876f00Dianne Hackborn    int                 readParcelFileDescriptor() const;
3621941a404d642b3dfaac365ba494f1e9912876f00Dianne Hackborn
36306673e38983baad380e818c5493b7faccf3b2393Casey Dahlin    // Retrieve a smart file descriptor from the parcel.
36406673e38983baad380e818c5493b7faccf3b2393Casey Dahlin    status_t            readUniqueFileDescriptor(
3652cf1995d3d1cdca8e0ba2d8fab9a322c4096f809Christopher Wiley                            base::unique_fd* val) const;
36606673e38983baad380e818c5493b7faccf3b2393Casey Dahlin
36706673e38983baad380e818c5493b7faccf3b2393Casey Dahlin
36806673e38983baad380e818c5493b7faccf3b2393Casey Dahlin    // Retrieve a vector of smart file descriptors from the parcel.
36906673e38983baad380e818c5493b7faccf3b2393Casey Dahlin    status_t            readUniqueFileDescriptorVector(
3702cf1995d3d1cdca8e0ba2d8fab9a322c4096f809Christopher Wiley                            std::unique_ptr<std::vector<base::unique_fd>>* val) const;
371b9872623ca0f2366c348d6d40a8ba45ee0e87710Casey Dahlin    status_t            readUniqueFileDescriptorVector(
3722cf1995d3d1cdca8e0ba2d8fab9a322c4096f809Christopher Wiley                            std::vector<base::unique_fd>* val) const;
37306673e38983baad380e818c5493b7faccf3b2393Casey Dahlin
3745707dbf15d0b44c88fbaa6dd271097f2d42932e0Jeff Brown    // Reads a blob from the parcel.
3755707dbf15d0b44c88fbaa6dd271097f2d42932e0Jeff Brown    // The caller should call release() on the blob after reading its contents.
3765707dbf15d0b44c88fbaa6dd271097f2d42932e0Jeff Brown    status_t            readBlob(size_t len, ReadableBlob* outBlob) const;
3775707dbf15d0b44c88fbaa6dd271097f2d42932e0Jeff Brown
378edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    const flat_binder_object* readObject(bool nullMetaData) const;
379edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
380edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // Explicitly close all file descriptors in the parcel.
381edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    void                closeFileDescriptors();
3827e790af756d7891cb1cf1374bb283a8fbcbe6b49Dianne Hackborn
3837e790af756d7891cb1cf1374bb283a8fbcbe6b49Dianne Hackborn    // Debugging: get metrics on current allocations.
3847e790af756d7891cb1cf1374bb283a8fbcbe6b49Dianne Hackborn    static size_t       getGlobalAllocSize();
3857e790af756d7891cb1cf1374bb283a8fbcbe6b49Dianne Hackborn    static size_t       getGlobalAllocCount();
3867e790af756d7891cb1cf1374bb283a8fbcbe6b49Dianne Hackborn
38784e625ac1e01f5a9c3ed16664da6498212ed662bArve Hjønnevågprivate:
388edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    typedef void        (*release_func)(Parcel* parcel,
389edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                                        const uint8_t* data, size_t dataSize,
39084e625ac1e01f5a9c3ed16664da6498212ed662bArve Hjønnevåg                                        const binder_size_t* objects, size_t objectsSize,
391edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                                        void* cookie);
392edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
39384e625ac1e01f5a9c3ed16664da6498212ed662bArve Hjønnevåg    uintptr_t           ipcData() const;
394edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    size_t              ipcDataSize() const;
39584e625ac1e01f5a9c3ed16664da6498212ed662bArve Hjønnevåg    uintptr_t           ipcObjects() const;
396edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    size_t              ipcObjectsCount() const;
397edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    void                ipcSetDataReference(const uint8_t* data, size_t dataSize,
39884e625ac1e01f5a9c3ed16664da6498212ed662bArve Hjønnevåg                                            const binder_size_t* objects, size_t objectsCount,
399edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                                            release_func relFunc, void* relCookie);
400edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
40184e625ac1e01f5a9c3ed16664da6498212ed662bArve Hjønnevågpublic:
402edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    void                print(TextOutput& to, uint32_t flags = 0) const;
4035707dbf15d0b44c88fbaa6dd271097f2d42932e0Jeff Brown
404edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectprivate:
405edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                        Parcel(const Parcel& o);
406edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    Parcel&             operator=(const Parcel& o);
407edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
408edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    status_t            finishWrite(size_t len);
409edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    void                releaseObjects();
410edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    void                acquireObjects();
411edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    status_t            growData(size_t len);
412edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    status_t            restartWrite(size_t desired);
413edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    status_t            continueWrite(size_t desired);
414f683e0163a84d93448b9388126902242367cd961Serban Constantinescu    status_t            writePointer(uintptr_t val);
415f683e0163a84d93448b9388126902242367cd961Serban Constantinescu    status_t            readPointer(uintptr_t *pArg) const;
416f683e0163a84d93448b9388126902242367cd961Serban Constantinescu    uintptr_t           readPointer() const;
417edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    void                freeDataNoInit();
418edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    void                initState();
419edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    void                scanForFds() const;
420c517681c66a1a387be657e0cf06da8d19659dd14Michael Wachenschwanz    status_t            validateReadData(size_t len) const;
421edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
42284a6d041e2c69d4d0b69269a0b59e725c9f119a3Andreas Huber    template<class T>
42384a6d041e2c69d4d0b69269a0b59e725c9f119a3Andreas Huber    status_t            readAligned(T *pArg) const;
42484a6d041e2c69d4d0b69269a0b59e725c9f119a3Andreas Huber
42584a6d041e2c69d4d0b69269a0b59e725c9f119a3Andreas Huber    template<class T>   T readAligned() const;
42684a6d041e2c69d4d0b69269a0b59e725c9f119a3Andreas Huber
42784a6d041e2c69d4d0b69269a0b59e725c9f119a3Andreas Huber    template<class T>
42884a6d041e2c69d4d0b69269a0b59e725c9f119a3Andreas Huber    status_t            writeAligned(T val);
42984a6d041e2c69d4d0b69269a0b59e725c9f119a3Andreas Huber
430b9872623ca0f2366c348d6d40a8ba45ee0e87710Casey Dahlin    status_t            writeRawNullableParcelable(const Parcelable*
431b9872623ca0f2366c348d6d40a8ba45ee0e87710Casey Dahlin                                                   parcelable);
432b9872623ca0f2366c348d6d40a8ba45ee0e87710Casey Dahlin
43303d1eb6bf90bcd0a04b176988478d2e939d3fba0Christopher Wiley    template<typename T, typename U>
43403d1eb6bf90bcd0a04b176988478d2e939d3fba0Christopher Wiley    status_t            unsafeReadTypedVector(std::vector<T>* val,
43503d1eb6bf90bcd0a04b176988478d2e939d3fba0Christopher Wiley                                              status_t(Parcel::*read_func)(U*) const) const;
43603d1eb6bf90bcd0a04b176988478d2e939d3fba0Christopher Wiley    template<typename T>
437b9872623ca0f2366c348d6d40a8ba45ee0e87710Casey Dahlin    status_t            readNullableTypedVector(std::unique_ptr<std::vector<T>>* val,
438b9872623ca0f2366c348d6d40a8ba45ee0e87710Casey Dahlin                                                status_t(Parcel::*read_func)(T*) const) const;
439b9872623ca0f2366c348d6d40a8ba45ee0e87710Casey Dahlin    template<typename T>
44003d1eb6bf90bcd0a04b176988478d2e939d3fba0Christopher Wiley    status_t            readTypedVector(std::vector<T>* val,
44103d1eb6bf90bcd0a04b176988478d2e939d3fba0Christopher Wiley                                        status_t(Parcel::*read_func)(T*) const) const;
44203d1eb6bf90bcd0a04b176988478d2e939d3fba0Christopher Wiley    template<typename T, typename U>
44303d1eb6bf90bcd0a04b176988478d2e939d3fba0Christopher Wiley    status_t            unsafeWriteTypedVector(const std::vector<T>& val,
44403d1eb6bf90bcd0a04b176988478d2e939d3fba0Christopher Wiley                                               status_t(Parcel::*write_func)(U));
44503d1eb6bf90bcd0a04b176988478d2e939d3fba0Christopher Wiley    template<typename T>
446b9872623ca0f2366c348d6d40a8ba45ee0e87710Casey Dahlin    status_t            writeNullableTypedVector(const std::unique_ptr<std::vector<T>>& val,
447b9872623ca0f2366c348d6d40a8ba45ee0e87710Casey Dahlin                                                 status_t(Parcel::*write_func)(const T&));
448b9872623ca0f2366c348d6d40a8ba45ee0e87710Casey Dahlin    template<typename T>
449b9872623ca0f2366c348d6d40a8ba45ee0e87710Casey Dahlin    status_t            writeNullableTypedVector(const std::unique_ptr<std::vector<T>>& val,
450b9872623ca0f2366c348d6d40a8ba45ee0e87710Casey Dahlin                                                 status_t(Parcel::*write_func)(T));
451b9872623ca0f2366c348d6d40a8ba45ee0e87710Casey Dahlin    template<typename T>
45203d1eb6bf90bcd0a04b176988478d2e939d3fba0Christopher Wiley    status_t            writeTypedVector(const std::vector<T>& val,
45303d1eb6bf90bcd0a04b176988478d2e939d3fba0Christopher Wiley                                         status_t(Parcel::*write_func)(const T&));
45403d1eb6bf90bcd0a04b176988478d2e939d3fba0Christopher Wiley    template<typename T>
45503d1eb6bf90bcd0a04b176988478d2e939d3fba0Christopher Wiley    status_t            writeTypedVector(const std::vector<T>& val,
45603d1eb6bf90bcd0a04b176988478d2e939d3fba0Christopher Wiley                                         status_t(Parcel::*write_func)(T));
45703d1eb6bf90bcd0a04b176988478d2e939d3fba0Christopher Wiley
458edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    status_t            mError;
459edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    uint8_t*            mData;
460edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    size_t              mDataSize;
461edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    size_t              mDataCapacity;
462edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    mutable size_t      mDataPos;
46384e625ac1e01f5a9c3ed16664da6498212ed662bArve Hjønnevåg    binder_size_t*      mObjects;
464edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    size_t              mObjectsSize;
465edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    size_t              mObjectsCapacity;
466edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    mutable size_t      mNextObjectHint;
467c517681c66a1a387be657e0cf06da8d19659dd14Michael Wachenschwanz    mutable bool        mObjectsSorted;
468edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
469edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    mutable bool        mFdsKnown;
470edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    mutable bool        mHasFds;
4718938ed2c8e906fc332301b64787728d4d34da571Dianne Hackborn    bool                mAllowFds;
472e4e0ae8abc7f612960fc381a792d0bef4c3eb6f9Christopher Tate
473edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    release_func        mOwner;
474edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    void*               mOwnerCookie;
4755707dbf15d0b44c88fbaa6dd271097f2d42932e0Jeff Brown
4765707dbf15d0b44c88fbaa6dd271097f2d42932e0Jeff Brown    class Blob {
4775707dbf15d0b44c88fbaa6dd271097f2d42932e0Jeff Brown    public:
4785707dbf15d0b44c88fbaa6dd271097f2d42932e0Jeff Brown        Blob();
4795707dbf15d0b44c88fbaa6dd271097f2d42932e0Jeff Brown        ~Blob();
4805707dbf15d0b44c88fbaa6dd271097f2d42932e0Jeff Brown
48113b1604018968408bcc5553e1fa5ea9df3e4e009Jeff Brown        void clear();
4825707dbf15d0b44c88fbaa6dd271097f2d42932e0Jeff Brown        void release();
4835707dbf15d0b44c88fbaa6dd271097f2d42932e0Jeff Brown        inline size_t size() const { return mSize; }
48417576de056a57753eb4af797545db88ef4f81ef0Colin Cross        inline int fd() const { return mFd; }
48513b1604018968408bcc5553e1fa5ea9df3e4e009Jeff Brown        inline bool isMutable() const { return mMutable; }
4865707dbf15d0b44c88fbaa6dd271097f2d42932e0Jeff Brown
4875707dbf15d0b44c88fbaa6dd271097f2d42932e0Jeff Brown    protected:
48813b1604018968408bcc5553e1fa5ea9df3e4e009Jeff Brown        void init(int fd, void* data, size_t size, bool isMutable);
4895707dbf15d0b44c88fbaa6dd271097f2d42932e0Jeff Brown
49013b1604018968408bcc5553e1fa5ea9df3e4e009Jeff Brown        int mFd; // owned by parcel so not closed when released
4915707dbf15d0b44c88fbaa6dd271097f2d42932e0Jeff Brown        void* mData;
4925707dbf15d0b44c88fbaa6dd271097f2d42932e0Jeff Brown        size_t mSize;
49313b1604018968408bcc5553e1fa5ea9df3e4e009Jeff Brown        bool mMutable;
4945707dbf15d0b44c88fbaa6dd271097f2d42932e0Jeff Brown    };
4955707dbf15d0b44c88fbaa6dd271097f2d42932e0Jeff Brown
49697b64dbe717b7daf29962f44c1b621c633473556Colin Cross    #if defined(__clang__)
49797b64dbe717b7daf29962f44c1b621c633473556Colin Cross    #pragma clang diagnostic push
49897b64dbe717b7daf29962f44c1b621c633473556Colin Cross    #pragma clang diagnostic ignored "-Wweak-vtables"
49997b64dbe717b7daf29962f44c1b621c633473556Colin Cross    #endif
50097b64dbe717b7daf29962f44c1b621c633473556Colin Cross
501c38992fe636af5b42a1089a0c260633f629e1f84Fabien Sanglard    // FlattenableHelperInterface and FlattenableHelper avoid generating a vtable entry in objects
502c38992fe636af5b42a1089a0c260633f629e1f84Fabien Sanglard    // following Flattenable template/protocol.
503e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian    class FlattenableHelperInterface {
504e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian    protected:
505e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian        ~FlattenableHelperInterface() { }
506e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian    public:
507e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian        virtual size_t getFlattenedSize() const = 0;
508e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian        virtual size_t getFdCount() const = 0;
509e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian        virtual status_t flatten(void* buffer, size_t size, int* fds, size_t count) const = 0;
510e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian        virtual status_t unflatten(void const* buffer, size_t size, int const* fds, size_t count) = 0;
511e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian    };
512e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian
51397b64dbe717b7daf29962f44c1b621c633473556Colin Cross    #if defined(__clang__)
51497b64dbe717b7daf29962f44c1b621c633473556Colin Cross    #pragma clang diagnostic pop
51597b64dbe717b7daf29962f44c1b621c633473556Colin Cross    #endif
51697b64dbe717b7daf29962f44c1b621c633473556Colin Cross
517c38992fe636af5b42a1089a0c260633f629e1f84Fabien Sanglard    // Concrete implementation of FlattenableHelperInterface that delegates virtual calls to the
518c38992fe636af5b42a1089a0c260633f629e1f84Fabien Sanglard    // specified class T implementing the Flattenable protocol. It "virtualizes" a compile-time
519c38992fe636af5b42a1089a0c260633f629e1f84Fabien Sanglard    // protocol.
520e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian    template<typename T>
521e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian    class FlattenableHelper : public FlattenableHelperInterface {
522e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian        friend class Parcel;
523e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian        const Flattenable<T>& val;
524382ecd3d6345aeeda158a8d94cc0aee1bd3a45dcColin Cross        explicit FlattenableHelper(const Flattenable<T>& _val) : val(_val) { }
525e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian
52697b64dbe717b7daf29962f44c1b621c633473556Colin Cross    protected:
52797b64dbe717b7daf29962f44c1b621c633473556Colin Cross        ~FlattenableHelper() = default;
528e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian    public:
529e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian        virtual size_t getFlattenedSize() const {
530e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian            return val.getFlattenedSize();
531e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian        }
532e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian        virtual size_t getFdCount() const {
533e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian            return val.getFdCount();
534e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian        }
535e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian        virtual status_t flatten(void* buffer, size_t size, int* fds, size_t count) const {
536e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian            return val.flatten(buffer, size, fds, count);
537e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian        }
538e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian        virtual status_t unflatten(void const* buffer, size_t size, int const* fds, size_t count) {
539e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian            return const_cast<Flattenable<T>&>(val).unflatten(buffer, size, fds, count);
540e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian        }
541e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian    };
542e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian    status_t write(const FlattenableHelperInterface& val);
543e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian    status_t read(FlattenableHelperInterface& val) const;
544e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian
5455707dbf15d0b44c88fbaa6dd271097f2d42932e0Jeff Brownpublic:
5465707dbf15d0b44c88fbaa6dd271097f2d42932e0Jeff Brown    class ReadableBlob : public Blob {
5475707dbf15d0b44c88fbaa6dd271097f2d42932e0Jeff Brown        friend class Parcel;
5485707dbf15d0b44c88fbaa6dd271097f2d42932e0Jeff Brown    public:
5495707dbf15d0b44c88fbaa6dd271097f2d42932e0Jeff Brown        inline const void* data() const { return mData; }
55013b1604018968408bcc5553e1fa5ea9df3e4e009Jeff Brown        inline void* mutableData() { return isMutable() ? mData : NULL; }
5515707dbf15d0b44c88fbaa6dd271097f2d42932e0Jeff Brown    };
5525707dbf15d0b44c88fbaa6dd271097f2d42932e0Jeff Brown
5535707dbf15d0b44c88fbaa6dd271097f2d42932e0Jeff Brown    class WritableBlob : public Blob {
5545707dbf15d0b44c88fbaa6dd271097f2d42932e0Jeff Brown        friend class Parcel;
5555707dbf15d0b44c88fbaa6dd271097f2d42932e0Jeff Brown    public:
5565707dbf15d0b44c88fbaa6dd271097f2d42932e0Jeff Brown        inline void* data() { return mData; }
5575707dbf15d0b44c88fbaa6dd271097f2d42932e0Jeff Brown    };
558aa5c2346c7291465aaca53f59878582dccbe4835Dan Sandler
559aa5c2346c7291465aaca53f59878582dccbe4835Dan Sandlerprivate:
560cbf3726357966539c2a685f46e61c3fc8937f19eAdrian Roos    size_t mOpenAshmemSize;
561aa5c2346c7291465aaca53f59878582dccbe4835Dan Sandler
562aa5c2346c7291465aaca53f59878582dccbe4835Dan Sandlerpublic:
5636bb3114246f6f6aa406e65452dbaa12b135029eaAdrian Roos    // TODO: Remove once ABI can be changed.
564aa5c2346c7291465aaca53f59878582dccbe4835Dan Sandler    size_t getBlobAshmemSize() const;
565cbf3726357966539c2a685f46e61c3fc8937f19eAdrian Roos    size_t getOpenAshmemSize() const;
566edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project};
567edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
568edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------
569edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
5708683fca395d01734ec7946e9f0595ec5d7b754c6Mathias Agopiantemplate<typename T>
571e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopianstatus_t Parcel::write(const Flattenable<T>& val) {
572e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian    const FlattenableHelper<T> helper(val);
573e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian    return write(helper);
574e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian}
575e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian
576e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopiantemplate<typename T>
5778683fca395d01734ec7946e9f0595ec5d7b754c6Mathias Agopianstatus_t Parcel::write(const LightFlattenable<T>& val) {
578e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian    size_t size(val.getFlattenedSize());
5798683fca395d01734ec7946e9f0595ec5d7b754c6Mathias Agopian    if (!val.isFixedSize()) {
5804c62b4f924e587da13bbba0e10a431864bded461Colin Cross        if (size > INT32_MAX) {
5814c62b4f924e587da13bbba0e10a431864bded461Colin Cross            return BAD_VALUE;
5824c62b4f924e587da13bbba0e10a431864bded461Colin Cross        }
5834c62b4f924e587da13bbba0e10a431864bded461Colin Cross        status_t err = writeInt32(static_cast<int32_t>(size));
5848683fca395d01734ec7946e9f0595ec5d7b754c6Mathias Agopian        if (err != NO_ERROR) {
5858683fca395d01734ec7946e9f0595ec5d7b754c6Mathias Agopian            return err;
5868683fca395d01734ec7946e9f0595ec5d7b754c6Mathias Agopian        }
5878683fca395d01734ec7946e9f0595ec5d7b754c6Mathias Agopian    }
5882098517e3e12a401005d7a7510d6c4943707b98dMathias Agopian    if (size) {
5892098517e3e12a401005d7a7510d6c4943707b98dMathias Agopian        void* buffer = writeInplace(size);
590e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian        if (buffer == NULL)
591e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian            return NO_MEMORY;
592e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian        return val.flatten(buffer, size);
5932098517e3e12a401005d7a7510d6c4943707b98dMathias Agopian    }
5942098517e3e12a401005d7a7510d6c4943707b98dMathias Agopian    return NO_ERROR;
5958683fca395d01734ec7946e9f0595ec5d7b754c6Mathias Agopian}
5968683fca395d01734ec7946e9f0595ec5d7b754c6Mathias Agopian
5978683fca395d01734ec7946e9f0595ec5d7b754c6Mathias Agopiantemplate<typename T>
598e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopianstatus_t Parcel::read(Flattenable<T>& val) const {
599e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian    FlattenableHelper<T> helper(val);
600e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian    return read(helper);
601e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian}
602e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian
603e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopiantemplate<typename T>
6048683fca395d01734ec7946e9f0595ec5d7b754c6Mathias Agopianstatus_t Parcel::read(LightFlattenable<T>& val) const {
6058683fca395d01734ec7946e9f0595ec5d7b754c6Mathias Agopian    size_t size;
6068683fca395d01734ec7946e9f0595ec5d7b754c6Mathias Agopian    if (val.isFixedSize()) {
607e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian        size = val.getFlattenedSize();
6088683fca395d01734ec7946e9f0595ec5d7b754c6Mathias Agopian    } else {
6098683fca395d01734ec7946e9f0595ec5d7b754c6Mathias Agopian        int32_t s;
6108683fca395d01734ec7946e9f0595ec5d7b754c6Mathias Agopian        status_t err = readInt32(&s);
6118683fca395d01734ec7946e9f0595ec5d7b754c6Mathias Agopian        if (err != NO_ERROR) {
6128683fca395d01734ec7946e9f0595ec5d7b754c6Mathias Agopian            return err;
6138683fca395d01734ec7946e9f0595ec5d7b754c6Mathias Agopian        }
6144c62b4f924e587da13bbba0e10a431864bded461Colin Cross        size = static_cast<size_t>(s);
6158683fca395d01734ec7946e9f0595ec5d7b754c6Mathias Agopian    }
6162098517e3e12a401005d7a7510d6c4943707b98dMathias Agopian    if (size) {
6172098517e3e12a401005d7a7510d6c4943707b98dMathias Agopian        void const* buffer = readInplace(size);
6182098517e3e12a401005d7a7510d6c4943707b98dMathias Agopian        return buffer == NULL ? NO_MEMORY :
6192098517e3e12a401005d7a7510d6c4943707b98dMathias Agopian                val.unflatten(buffer, size);
6202098517e3e12a401005d7a7510d6c4943707b98dMathias Agopian    }
6212098517e3e12a401005d7a7510d6c4943707b98dMathias Agopian    return NO_ERROR;
6228683fca395d01734ec7946e9f0595ec5d7b754c6Mathias Agopian}
6238683fca395d01734ec7946e9f0595ec5d7b754c6Mathias Agopian
624f0c13772d95486d98f034361883b2415bb26a614Casey Dahlintemplate<typename T>
62531c1beb1d8de373f7734a54e25ad80b01024adb0Christopher Wileystatus_t Parcel::writeVectorSize(const std::vector<T>& val) {
62631c1beb1d8de373f7734a54e25ad80b01024adb0Christopher Wiley    if (val.size() > INT32_MAX) {
62731c1beb1d8de373f7734a54e25ad80b01024adb0Christopher Wiley        return BAD_VALUE;
62831c1beb1d8de373f7734a54e25ad80b01024adb0Christopher Wiley    }
6294c62b4f924e587da13bbba0e10a431864bded461Colin Cross    return writeInt32(static_cast<int32_t>(val.size()));
63031c1beb1d8de373f7734a54e25ad80b01024adb0Christopher Wiley}
63131c1beb1d8de373f7734a54e25ad80b01024adb0Christopher Wiley
63231c1beb1d8de373f7734a54e25ad80b01024adb0Christopher Wileytemplate<typename T>
63331c1beb1d8de373f7734a54e25ad80b01024adb0Christopher Wileystatus_t Parcel::writeVectorSize(const std::unique_ptr<std::vector<T>>& val) {
63431c1beb1d8de373f7734a54e25ad80b01024adb0Christopher Wiley    if (!val) {
63531c1beb1d8de373f7734a54e25ad80b01024adb0Christopher Wiley        return writeInt32(-1);
63631c1beb1d8de373f7734a54e25ad80b01024adb0Christopher Wiley    }
63731c1beb1d8de373f7734a54e25ad80b01024adb0Christopher Wiley
63831c1beb1d8de373f7734a54e25ad80b01024adb0Christopher Wiley    return writeVectorSize(*val);
63931c1beb1d8de373f7734a54e25ad80b01024adb0Christopher Wiley}
64031c1beb1d8de373f7734a54e25ad80b01024adb0Christopher Wiley
64131c1beb1d8de373f7734a54e25ad80b01024adb0Christopher Wileytemplate<typename T>
64231c1beb1d8de373f7734a54e25ad80b01024adb0Christopher Wileystatus_t Parcel::resizeOutVector(std::vector<T>* val) const {
64331c1beb1d8de373f7734a54e25ad80b01024adb0Christopher Wiley    int32_t size;
64431c1beb1d8de373f7734a54e25ad80b01024adb0Christopher Wiley    status_t err = readInt32(&size);
64531c1beb1d8de373f7734a54e25ad80b01024adb0Christopher Wiley    if (err != NO_ERROR) {
64631c1beb1d8de373f7734a54e25ad80b01024adb0Christopher Wiley        return err;
64731c1beb1d8de373f7734a54e25ad80b01024adb0Christopher Wiley    }
64831c1beb1d8de373f7734a54e25ad80b01024adb0Christopher Wiley
64931c1beb1d8de373f7734a54e25ad80b01024adb0Christopher Wiley    if (size < 0) {
65031c1beb1d8de373f7734a54e25ad80b01024adb0Christopher Wiley        return UNEXPECTED_NULL;
65131c1beb1d8de373f7734a54e25ad80b01024adb0Christopher Wiley    }
65231c1beb1d8de373f7734a54e25ad80b01024adb0Christopher Wiley    val->resize(size_t(size));
65331c1beb1d8de373f7734a54e25ad80b01024adb0Christopher Wiley    return OK;
65431c1beb1d8de373f7734a54e25ad80b01024adb0Christopher Wiley}
65531c1beb1d8de373f7734a54e25ad80b01024adb0Christopher Wiley
65631c1beb1d8de373f7734a54e25ad80b01024adb0Christopher Wileytemplate<typename T>
65731c1beb1d8de373f7734a54e25ad80b01024adb0Christopher Wileystatus_t Parcel::resizeOutVector(std::unique_ptr<std::vector<T>>* val) const {
65831c1beb1d8de373f7734a54e25ad80b01024adb0Christopher Wiley    int32_t size;
65931c1beb1d8de373f7734a54e25ad80b01024adb0Christopher Wiley    status_t err = readInt32(&size);
66031c1beb1d8de373f7734a54e25ad80b01024adb0Christopher Wiley    if (err != NO_ERROR) {
66131c1beb1d8de373f7734a54e25ad80b01024adb0Christopher Wiley        return err;
66231c1beb1d8de373f7734a54e25ad80b01024adb0Christopher Wiley    }
66331c1beb1d8de373f7734a54e25ad80b01024adb0Christopher Wiley
66431c1beb1d8de373f7734a54e25ad80b01024adb0Christopher Wiley    val->reset();
66531c1beb1d8de373f7734a54e25ad80b01024adb0Christopher Wiley    if (size >= 0) {
66631c1beb1d8de373f7734a54e25ad80b01024adb0Christopher Wiley        val->reset(new std::vector<T>(size_t(size)));
66731c1beb1d8de373f7734a54e25ad80b01024adb0Christopher Wiley    }
66831c1beb1d8de373f7734a54e25ad80b01024adb0Christopher Wiley
66931c1beb1d8de373f7734a54e25ad80b01024adb0Christopher Wiley    return OK;
67031c1beb1d8de373f7734a54e25ad80b01024adb0Christopher Wiley}
67131c1beb1d8de373f7734a54e25ad80b01024adb0Christopher Wiley
67231c1beb1d8de373f7734a54e25ad80b01024adb0Christopher Wileytemplate<typename T>
673f0c13772d95486d98f034361883b2415bb26a614Casey Dahlinstatus_t Parcel::readStrongBinder(sp<T>* val) const {
674f0c13772d95486d98f034361883b2415bb26a614Casey Dahlin    sp<IBinder> tmp;
675f0c13772d95486d98f034361883b2415bb26a614Casey Dahlin    status_t ret = readStrongBinder(&tmp);
676f0c13772d95486d98f034361883b2415bb26a614Casey Dahlin
677f0c13772d95486d98f034361883b2415bb26a614Casey Dahlin    if (ret == OK) {
678f0c13772d95486d98f034361883b2415bb26a614Casey Dahlin        *val = interface_cast<T>(tmp);
679f0c13772d95486d98f034361883b2415bb26a614Casey Dahlin
680f0c13772d95486d98f034361883b2415bb26a614Casey Dahlin        if (val->get() == nullptr) {
681f0c13772d95486d98f034361883b2415bb26a614Casey Dahlin            return UNKNOWN_ERROR;
682f0c13772d95486d98f034361883b2415bb26a614Casey Dahlin        }
683f0c13772d95486d98f034361883b2415bb26a614Casey Dahlin    }
684f0c13772d95486d98f034361883b2415bb26a614Casey Dahlin
685f0c13772d95486d98f034361883b2415bb26a614Casey Dahlin    return ret;
686f0c13772d95486d98f034361883b2415bb26a614Casey Dahlin}
687f0c13772d95486d98f034361883b2415bb26a614Casey Dahlin
68835d77caf8e7e34fa6ac8f4bbc75a52631adc0272Christopher Wileytemplate<typename T>
68935d77caf8e7e34fa6ac8f4bbc75a52631adc0272Christopher Wileystatus_t Parcel::readNullableStrongBinder(sp<T>* val) const {
69035d77caf8e7e34fa6ac8f4bbc75a52631adc0272Christopher Wiley    sp<IBinder> tmp;
69135d77caf8e7e34fa6ac8f4bbc75a52631adc0272Christopher Wiley    status_t ret = readNullableStrongBinder(&tmp);
69235d77caf8e7e34fa6ac8f4bbc75a52631adc0272Christopher Wiley
69335d77caf8e7e34fa6ac8f4bbc75a52631adc0272Christopher Wiley    if (ret == OK) {
69435d77caf8e7e34fa6ac8f4bbc75a52631adc0272Christopher Wiley        *val = interface_cast<T>(tmp);
69535d77caf8e7e34fa6ac8f4bbc75a52631adc0272Christopher Wiley
696447b00fd55c90a7b2ad3cef74fb3754fec243fa6Christopher Wiley        if (val->get() == nullptr && tmp.get() != nullptr) {
697447b00fd55c90a7b2ad3cef74fb3754fec243fa6Christopher Wiley            ret = UNKNOWN_ERROR;
69835d77caf8e7e34fa6ac8f4bbc75a52631adc0272Christopher Wiley        }
69935d77caf8e7e34fa6ac8f4bbc75a52631adc0272Christopher Wiley    }
700447b00fd55c90a7b2ad3cef74fb3754fec243fa6Christopher Wiley
701447b00fd55c90a7b2ad3cef74fb3754fec243fa6Christopher Wiley    return ret;
70235d77caf8e7e34fa6ac8f4bbc75a52631adc0272Christopher Wiley}
70335d77caf8e7e34fa6ac8f4bbc75a52631adc0272Christopher Wiley
70403d1eb6bf90bcd0a04b176988478d2e939d3fba0Christopher Wileytemplate<typename T, typename U>
70503d1eb6bf90bcd0a04b176988478d2e939d3fba0Christopher Wileystatus_t Parcel::unsafeReadTypedVector(
706b9872623ca0f2366c348d6d40a8ba45ee0e87710Casey Dahlin        std::vector<T>* val,
707b9872623ca0f2366c348d6d40a8ba45ee0e87710Casey Dahlin        status_t(Parcel::*read_func)(U*) const) const {
70803d1eb6bf90bcd0a04b176988478d2e939d3fba0Christopher Wiley    int32_t size;
70903d1eb6bf90bcd0a04b176988478d2e939d3fba0Christopher Wiley    status_t status = this->readInt32(&size);
71003d1eb6bf90bcd0a04b176988478d2e939d3fba0Christopher Wiley
71103d1eb6bf90bcd0a04b176988478d2e939d3fba0Christopher Wiley    if (status != OK) {
71203d1eb6bf90bcd0a04b176988478d2e939d3fba0Christopher Wiley        return status;
71303d1eb6bf90bcd0a04b176988478d2e939d3fba0Christopher Wiley    }
71403d1eb6bf90bcd0a04b176988478d2e939d3fba0Christopher Wiley
71503d1eb6bf90bcd0a04b176988478d2e939d3fba0Christopher Wiley    if (size < 0) {
71603d1eb6bf90bcd0a04b176988478d2e939d3fba0Christopher Wiley        return UNEXPECTED_NULL;
71703d1eb6bf90bcd0a04b176988478d2e939d3fba0Christopher Wiley    }
71803d1eb6bf90bcd0a04b176988478d2e939d3fba0Christopher Wiley
719803ed2903b90e69af8644b34637994ec74e562afStephen Hines    if (val->max_size() < static_cast<size_t>(size)) {
72065a8f07e57a492289798ca709a311650b5bd5af1Casey Dahlin        return NO_MEMORY;
72165a8f07e57a492289798ca709a311650b5bd5af1Casey Dahlin    }
72265a8f07e57a492289798ca709a311650b5bd5af1Casey Dahlin
7234c62b4f924e587da13bbba0e10a431864bded461Colin Cross    val->resize(static_cast<size_t>(size));
72403d1eb6bf90bcd0a04b176988478d2e939d3fba0Christopher Wiley
725803ed2903b90e69af8644b34637994ec74e562afStephen Hines    if (val->size() < static_cast<size_t>(size)) {
72665a8f07e57a492289798ca709a311650b5bd5af1Casey Dahlin        return NO_MEMORY;
72765a8f07e57a492289798ca709a311650b5bd5af1Casey Dahlin    }
72865a8f07e57a492289798ca709a311650b5bd5af1Casey Dahlin
72903d1eb6bf90bcd0a04b176988478d2e939d3fba0Christopher Wiley    for (auto& v: *val) {
73003d1eb6bf90bcd0a04b176988478d2e939d3fba0Christopher Wiley        status = (this->*read_func)(&v);
73103d1eb6bf90bcd0a04b176988478d2e939d3fba0Christopher Wiley
73203d1eb6bf90bcd0a04b176988478d2e939d3fba0Christopher Wiley        if (status != OK) {
73303d1eb6bf90bcd0a04b176988478d2e939d3fba0Christopher Wiley            return status;
73403d1eb6bf90bcd0a04b176988478d2e939d3fba0Christopher Wiley        }
73503d1eb6bf90bcd0a04b176988478d2e939d3fba0Christopher Wiley    }
73603d1eb6bf90bcd0a04b176988478d2e939d3fba0Christopher Wiley
73703d1eb6bf90bcd0a04b176988478d2e939d3fba0Christopher Wiley    return OK;
73803d1eb6bf90bcd0a04b176988478d2e939d3fba0Christopher Wiley}
73903d1eb6bf90bcd0a04b176988478d2e939d3fba0Christopher Wiley
74003d1eb6bf90bcd0a04b176988478d2e939d3fba0Christopher Wileytemplate<typename T>
74103d1eb6bf90bcd0a04b176988478d2e939d3fba0Christopher Wileystatus_t Parcel::readTypedVector(std::vector<T>* val,
74203d1eb6bf90bcd0a04b176988478d2e939d3fba0Christopher Wiley                                 status_t(Parcel::*read_func)(T*) const) const {
74303d1eb6bf90bcd0a04b176988478d2e939d3fba0Christopher Wiley    return unsafeReadTypedVector(val, read_func);
74403d1eb6bf90bcd0a04b176988478d2e939d3fba0Christopher Wiley}
74503d1eb6bf90bcd0a04b176988478d2e939d3fba0Christopher Wiley
746b9872623ca0f2366c348d6d40a8ba45ee0e87710Casey Dahlintemplate<typename T>
747b9872623ca0f2366c348d6d40a8ba45ee0e87710Casey Dahlinstatus_t Parcel::readNullableTypedVector(std::unique_ptr<std::vector<T>>* val,
748b9872623ca0f2366c348d6d40a8ba45ee0e87710Casey Dahlin                                         status_t(Parcel::*read_func)(T*) const) const {
7494c62b4f924e587da13bbba0e10a431864bded461Colin Cross    const size_t start = dataPosition();
750b9872623ca0f2366c348d6d40a8ba45ee0e87710Casey Dahlin    int32_t size;
751b9872623ca0f2366c348d6d40a8ba45ee0e87710Casey Dahlin    status_t status = readInt32(&size);
752b9872623ca0f2366c348d6d40a8ba45ee0e87710Casey Dahlin    val->reset();
753b9872623ca0f2366c348d6d40a8ba45ee0e87710Casey Dahlin
754b9872623ca0f2366c348d6d40a8ba45ee0e87710Casey Dahlin    if (status != OK || size < 0) {
755b9872623ca0f2366c348d6d40a8ba45ee0e87710Casey Dahlin        return status;
756b9872623ca0f2366c348d6d40a8ba45ee0e87710Casey Dahlin    }
757b9872623ca0f2366c348d6d40a8ba45ee0e87710Casey Dahlin
758b9872623ca0f2366c348d6d40a8ba45ee0e87710Casey Dahlin    setDataPosition(start);
759b9872623ca0f2366c348d6d40a8ba45ee0e87710Casey Dahlin    val->reset(new std::vector<T>());
760b9872623ca0f2366c348d6d40a8ba45ee0e87710Casey Dahlin
761b9872623ca0f2366c348d6d40a8ba45ee0e87710Casey Dahlin    status = unsafeReadTypedVector(val->get(), read_func);
762b9872623ca0f2366c348d6d40a8ba45ee0e87710Casey Dahlin
763b9872623ca0f2366c348d6d40a8ba45ee0e87710Casey Dahlin    if (status != OK) {
764b9872623ca0f2366c348d6d40a8ba45ee0e87710Casey Dahlin        val->reset();
765b9872623ca0f2366c348d6d40a8ba45ee0e87710Casey Dahlin    }
766b9872623ca0f2366c348d6d40a8ba45ee0e87710Casey Dahlin
767b9872623ca0f2366c348d6d40a8ba45ee0e87710Casey Dahlin    return status;
768b9872623ca0f2366c348d6d40a8ba45ee0e87710Casey Dahlin}
769b9872623ca0f2366c348d6d40a8ba45ee0e87710Casey Dahlin
77003d1eb6bf90bcd0a04b176988478d2e939d3fba0Christopher Wileytemplate<typename T, typename U>
77103d1eb6bf90bcd0a04b176988478d2e939d3fba0Christopher Wileystatus_t Parcel::unsafeWriteTypedVector(const std::vector<T>& val,
77203d1eb6bf90bcd0a04b176988478d2e939d3fba0Christopher Wiley                                        status_t(Parcel::*write_func)(U)) {
77303d1eb6bf90bcd0a04b176988478d2e939d3fba0Christopher Wiley    if (val.size() > std::numeric_limits<int32_t>::max()) {
77403d1eb6bf90bcd0a04b176988478d2e939d3fba0Christopher Wiley        return BAD_VALUE;
77503d1eb6bf90bcd0a04b176988478d2e939d3fba0Christopher Wiley    }
77603d1eb6bf90bcd0a04b176988478d2e939d3fba0Christopher Wiley
7774c62b4f924e587da13bbba0e10a431864bded461Colin Cross    status_t status = this->writeInt32(static_cast<int32_t>(val.size()));
77803d1eb6bf90bcd0a04b176988478d2e939d3fba0Christopher Wiley
77903d1eb6bf90bcd0a04b176988478d2e939d3fba0Christopher Wiley    if (status != OK) {
78003d1eb6bf90bcd0a04b176988478d2e939d3fba0Christopher Wiley        return status;
78103d1eb6bf90bcd0a04b176988478d2e939d3fba0Christopher Wiley    }
78203d1eb6bf90bcd0a04b176988478d2e939d3fba0Christopher Wiley
78303d1eb6bf90bcd0a04b176988478d2e939d3fba0Christopher Wiley    for (const auto& item : val) {
78403d1eb6bf90bcd0a04b176988478d2e939d3fba0Christopher Wiley        status = (this->*write_func)(item);
78503d1eb6bf90bcd0a04b176988478d2e939d3fba0Christopher Wiley
78603d1eb6bf90bcd0a04b176988478d2e939d3fba0Christopher Wiley        if (status != OK) {
78703d1eb6bf90bcd0a04b176988478d2e939d3fba0Christopher Wiley            return status;
78803d1eb6bf90bcd0a04b176988478d2e939d3fba0Christopher Wiley        }
78903d1eb6bf90bcd0a04b176988478d2e939d3fba0Christopher Wiley    }
79003d1eb6bf90bcd0a04b176988478d2e939d3fba0Christopher Wiley
79103d1eb6bf90bcd0a04b176988478d2e939d3fba0Christopher Wiley    return OK;
79203d1eb6bf90bcd0a04b176988478d2e939d3fba0Christopher Wiley}
79303d1eb6bf90bcd0a04b176988478d2e939d3fba0Christopher Wiley
79403d1eb6bf90bcd0a04b176988478d2e939d3fba0Christopher Wileytemplate<typename T>
79503d1eb6bf90bcd0a04b176988478d2e939d3fba0Christopher Wileystatus_t Parcel::writeTypedVector(const std::vector<T>& val,
796b9872623ca0f2366c348d6d40a8ba45ee0e87710Casey Dahlin                                  status_t(Parcel::*write_func)(const T&)) {
79703d1eb6bf90bcd0a04b176988478d2e939d3fba0Christopher Wiley    return unsafeWriteTypedVector(val, write_func);
79803d1eb6bf90bcd0a04b176988478d2e939d3fba0Christopher Wiley}
79903d1eb6bf90bcd0a04b176988478d2e939d3fba0Christopher Wiley
80003d1eb6bf90bcd0a04b176988478d2e939d3fba0Christopher Wileytemplate<typename T>
80103d1eb6bf90bcd0a04b176988478d2e939d3fba0Christopher Wileystatus_t Parcel::writeTypedVector(const std::vector<T>& val,
802b9872623ca0f2366c348d6d40a8ba45ee0e87710Casey Dahlin                                  status_t(Parcel::*write_func)(T)) {
80303d1eb6bf90bcd0a04b176988478d2e939d3fba0Christopher Wiley    return unsafeWriteTypedVector(val, write_func);
80403d1eb6bf90bcd0a04b176988478d2e939d3fba0Christopher Wiley}
80503d1eb6bf90bcd0a04b176988478d2e939d3fba0Christopher Wiley
80697f048d19e51da4ea6ff98d8a9daf38f2577f182Christopher Wileytemplate<typename T>
807b9872623ca0f2366c348d6d40a8ba45ee0e87710Casey Dahlinstatus_t Parcel::writeNullableTypedVector(const std::unique_ptr<std::vector<T>>& val,
808b9872623ca0f2366c348d6d40a8ba45ee0e87710Casey Dahlin                                          status_t(Parcel::*write_func)(const T&)) {
809b9872623ca0f2366c348d6d40a8ba45ee0e87710Casey Dahlin    if (val.get() == nullptr) {
810b9872623ca0f2366c348d6d40a8ba45ee0e87710Casey Dahlin        return this->writeInt32(-1);
811b9872623ca0f2366c348d6d40a8ba45ee0e87710Casey Dahlin    }
812b9872623ca0f2366c348d6d40a8ba45ee0e87710Casey Dahlin
813b9872623ca0f2366c348d6d40a8ba45ee0e87710Casey Dahlin    return unsafeWriteTypedVector(*val, write_func);
814b9872623ca0f2366c348d6d40a8ba45ee0e87710Casey Dahlin}
815b9872623ca0f2366c348d6d40a8ba45ee0e87710Casey Dahlin
816b9872623ca0f2366c348d6d40a8ba45ee0e87710Casey Dahlintemplate<typename T>
817b9872623ca0f2366c348d6d40a8ba45ee0e87710Casey Dahlinstatus_t Parcel::writeNullableTypedVector(const std::unique_ptr<std::vector<T>>& val,
818b9872623ca0f2366c348d6d40a8ba45ee0e87710Casey Dahlin                                          status_t(Parcel::*write_func)(T)) {
819b9872623ca0f2366c348d6d40a8ba45ee0e87710Casey Dahlin    if (val.get() == nullptr) {
820b9872623ca0f2366c348d6d40a8ba45ee0e87710Casey Dahlin        return this->writeInt32(-1);
821b9872623ca0f2366c348d6d40a8ba45ee0e87710Casey Dahlin    }
822b9872623ca0f2366c348d6d40a8ba45ee0e87710Casey Dahlin
823b9872623ca0f2366c348d6d40a8ba45ee0e87710Casey Dahlin    return unsafeWriteTypedVector(*val, write_func);
824b9872623ca0f2366c348d6d40a8ba45ee0e87710Casey Dahlin}
825b9872623ca0f2366c348d6d40a8ba45ee0e87710Casey Dahlin
826b9872623ca0f2366c348d6d40a8ba45ee0e87710Casey Dahlintemplate<typename T>
82797f048d19e51da4ea6ff98d8a9daf38f2577f182Christopher Wileystatus_t Parcel::readParcelableVector(std::vector<T>* val) const {
828b9872623ca0f2366c348d6d40a8ba45ee0e87710Casey Dahlin    return unsafeReadTypedVector<T, Parcelable>(val, &Parcel::readParcelable);
829b9872623ca0f2366c348d6d40a8ba45ee0e87710Casey Dahlin}
830b9872623ca0f2366c348d6d40a8ba45ee0e87710Casey Dahlin
831b9872623ca0f2366c348d6d40a8ba45ee0e87710Casey Dahlintemplate<typename T>
832b9872623ca0f2366c348d6d40a8ba45ee0e87710Casey Dahlinstatus_t Parcel::readParcelableVector(std::unique_ptr<std::vector<std::unique_ptr<T>>>* val) const {
8334c62b4f924e587da13bbba0e10a431864bded461Colin Cross    const size_t start = dataPosition();
834b9872623ca0f2366c348d6d40a8ba45ee0e87710Casey Dahlin    int32_t size;
835b9872623ca0f2366c348d6d40a8ba45ee0e87710Casey Dahlin    status_t status = readInt32(&size);
836b9872623ca0f2366c348d6d40a8ba45ee0e87710Casey Dahlin    val->reset();
837b9872623ca0f2366c348d6d40a8ba45ee0e87710Casey Dahlin
838b9872623ca0f2366c348d6d40a8ba45ee0e87710Casey Dahlin    if (status != OK || size < 0) {
839b9872623ca0f2366c348d6d40a8ba45ee0e87710Casey Dahlin        return status;
840b9872623ca0f2366c348d6d40a8ba45ee0e87710Casey Dahlin    }
841b9872623ca0f2366c348d6d40a8ba45ee0e87710Casey Dahlin
842b9872623ca0f2366c348d6d40a8ba45ee0e87710Casey Dahlin    setDataPosition(start);
843f26a3ab7758bdbc1c87940216e542b2cc58c4377Janis Danisevskis    val->reset(new std::vector<std::unique_ptr<T>>());
844b9872623ca0f2366c348d6d40a8ba45ee0e87710Casey Dahlin
845f26a3ab7758bdbc1c87940216e542b2cc58c4377Janis Danisevskis    status = unsafeReadTypedVector(val->get(), &Parcel::readParcelable<T>);
846b9872623ca0f2366c348d6d40a8ba45ee0e87710Casey Dahlin
847b9872623ca0f2366c348d6d40a8ba45ee0e87710Casey Dahlin    if (status != OK) {
848b9872623ca0f2366c348d6d40a8ba45ee0e87710Casey Dahlin        val->reset();
849b9872623ca0f2366c348d6d40a8ba45ee0e87710Casey Dahlin    }
850b9872623ca0f2366c348d6d40a8ba45ee0e87710Casey Dahlin
851b9872623ca0f2366c348d6d40a8ba45ee0e87710Casey Dahlin    return status;
852b9872623ca0f2366c348d6d40a8ba45ee0e87710Casey Dahlin}
853b9872623ca0f2366c348d6d40a8ba45ee0e87710Casey Dahlin
854b9872623ca0f2366c348d6d40a8ba45ee0e87710Casey Dahlintemplate<typename T>
855b9872623ca0f2366c348d6d40a8ba45ee0e87710Casey Dahlinstatus_t Parcel::readParcelable(std::unique_ptr<T>* parcelable) const {
8564c62b4f924e587da13bbba0e10a431864bded461Colin Cross    const size_t start = dataPosition();
857b9872623ca0f2366c348d6d40a8ba45ee0e87710Casey Dahlin    int32_t present;
858b9872623ca0f2366c348d6d40a8ba45ee0e87710Casey Dahlin    status_t status = readInt32(&present);
859b9872623ca0f2366c348d6d40a8ba45ee0e87710Casey Dahlin    parcelable->reset();
860b9872623ca0f2366c348d6d40a8ba45ee0e87710Casey Dahlin
861b9872623ca0f2366c348d6d40a8ba45ee0e87710Casey Dahlin    if (status != OK || !present) {
862b9872623ca0f2366c348d6d40a8ba45ee0e87710Casey Dahlin        return status;
863b9872623ca0f2366c348d6d40a8ba45ee0e87710Casey Dahlin    }
864b9872623ca0f2366c348d6d40a8ba45ee0e87710Casey Dahlin
865b9872623ca0f2366c348d6d40a8ba45ee0e87710Casey Dahlin    setDataPosition(start);
866b9872623ca0f2366c348d6d40a8ba45ee0e87710Casey Dahlin    parcelable->reset(new T());
867b9872623ca0f2366c348d6d40a8ba45ee0e87710Casey Dahlin
868b9872623ca0f2366c348d6d40a8ba45ee0e87710Casey Dahlin    status = readParcelable(parcelable->get());
869b9872623ca0f2366c348d6d40a8ba45ee0e87710Casey Dahlin
870b9872623ca0f2366c348d6d40a8ba45ee0e87710Casey Dahlin    if (status != OK) {
871b9872623ca0f2366c348d6d40a8ba45ee0e87710Casey Dahlin        parcelable->reset();
872b9872623ca0f2366c348d6d40a8ba45ee0e87710Casey Dahlin    }
873b9872623ca0f2366c348d6d40a8ba45ee0e87710Casey Dahlin
874b9872623ca0f2366c348d6d40a8ba45ee0e87710Casey Dahlin    return status;
875b9872623ca0f2366c348d6d40a8ba45ee0e87710Casey Dahlin}
876b9872623ca0f2366c348d6d40a8ba45ee0e87710Casey Dahlin
877b9872623ca0f2366c348d6d40a8ba45ee0e87710Casey Dahlintemplate<typename T>
878b9872623ca0f2366c348d6d40a8ba45ee0e87710Casey Dahlinstatus_t Parcel::writeNullableParcelable(const std::unique_ptr<T>& parcelable) {
879b9872623ca0f2366c348d6d40a8ba45ee0e87710Casey Dahlin    return writeRawNullableParcelable(parcelable.get());
88097f048d19e51da4ea6ff98d8a9daf38f2577f182Christopher Wiley}
88197f048d19e51da4ea6ff98d8a9daf38f2577f182Christopher Wiley
88297f048d19e51da4ea6ff98d8a9daf38f2577f182Christopher Wileytemplate<typename T>
88397f048d19e51da4ea6ff98d8a9daf38f2577f182Christopher Wileystatus_t Parcel::writeParcelableVector(const std::vector<T>& val) {
884b9872623ca0f2366c348d6d40a8ba45ee0e87710Casey Dahlin    return unsafeWriteTypedVector<T,const Parcelable&>(val, &Parcel::writeParcelable);
885b9872623ca0f2366c348d6d40a8ba45ee0e87710Casey Dahlin}
886b9872623ca0f2366c348d6d40a8ba45ee0e87710Casey Dahlin
887b9872623ca0f2366c348d6d40a8ba45ee0e87710Casey Dahlintemplate<typename T>
888b9872623ca0f2366c348d6d40a8ba45ee0e87710Casey Dahlinstatus_t Parcel::writeParcelableVector(const std::unique_ptr<std::vector<std::unique_ptr<T>>>& val) {
889b9872623ca0f2366c348d6d40a8ba45ee0e87710Casey Dahlin    if (val.get() == nullptr) {
890b9872623ca0f2366c348d6d40a8ba45ee0e87710Casey Dahlin        return this->writeInt32(-1);
891b9872623ca0f2366c348d6d40a8ba45ee0e87710Casey Dahlin    }
892b9872623ca0f2366c348d6d40a8ba45ee0e87710Casey Dahlin
8938d747090a48488b143eac072855fda931fa25ab3Janis Danisevskis    return unsafeWriteTypedVector(*val, &Parcel::writeNullableParcelable<T>);
8948d747090a48488b143eac072855fda931fa25ab3Janis Danisevskis}
8958d747090a48488b143eac072855fda931fa25ab3Janis Danisevskis
8968d747090a48488b143eac072855fda931fa25ab3Janis Danisevskistemplate<typename T>
8978d747090a48488b143eac072855fda931fa25ab3Janis Danisevskisstatus_t Parcel::writeParcelableVector(const std::shared_ptr<std::vector<std::unique_ptr<T>>>& val) {
8988d747090a48488b143eac072855fda931fa25ab3Janis Danisevskis    if (val.get() == nullptr) {
8998d747090a48488b143eac072855fda931fa25ab3Janis Danisevskis        return this->writeInt32(-1);
9008d747090a48488b143eac072855fda931fa25ab3Janis Danisevskis    }
9018d747090a48488b143eac072855fda931fa25ab3Janis Danisevskis
9028d747090a48488b143eac072855fda931fa25ab3Janis Danisevskis    return unsafeWriteTypedVector(*val, &Parcel::writeNullableParcelable<T>);
90397f048d19e51da4ea6ff98d8a9daf38f2577f182Christopher Wiley}
90497f048d19e51da4ea6ff98d8a9daf38f2577f182Christopher Wiley
9058683fca395d01734ec7946e9f0595ec5d7b754c6Mathias Agopian// ---------------------------------------------------------------------------
9068683fca395d01734ec7946e9f0595ec5d7b754c6Mathias Agopian
907edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectinline TextOutput& operator<<(TextOutput& to, const Parcel& parcel)
908edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
909edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    parcel.print(to);
910edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return to;
911edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
912edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
913edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------
914edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
915edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// Generic acquire and release of objects.
916edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid acquire_object(const sp<ProcessState>& proc,
9176880307e8e35a6c484942443fb4ddd6173126152Ian Pedowitz                    const flat_binder_object& obj, const void* who);
918edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid release_object(const sp<ProcessState>& proc,
9196880307e8e35a6c484942443fb4ddd6173126152Ian Pedowitz                    const flat_binder_object& obj, const void* who);
920edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
921edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid flatten_binder(const sp<ProcessState>& proc,
922edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    const sp<IBinder>& binder, flat_binder_object* out);
923edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid flatten_binder(const sp<ProcessState>& proc,
924edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    const wp<IBinder>& binder, flat_binder_object* out);
925edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatus_t unflatten_binder(const sp<ProcessState>& proc,
926edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                          const flat_binder_object& flat, sp<IBinder>* out);
927edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatus_t unflatten_binder(const sp<ProcessState>& proc,
928edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                          const flat_binder_object& flat, wp<IBinder>* out);
929edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
930edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; // namespace android
931edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
932edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------
933edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
934edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#endif // ANDROID_PARCEL_H
935