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