Add support for reading/writing a vector of binders
Change-Id: Iaa8da704b2ae3c1ca5456177441a335991b40e8a
Test: unit tests pass
Bug: 24470786
Signed-off-by: Casey Dahlin <sadmac@google.com>
diff --git a/include/binder/Parcel.h b/include/binder/Parcel.h
index 637a1e9..695d5f1 100644
--- a/include/binder/Parcel.h
+++ b/include/binder/Parcel.h
@@ -125,6 +125,8 @@
status_t writeCharVector(const std::vector<char16_t>& val);
status_t writeString16Vector(const std::vector<String16>& val);
+ status_t writeStrongBinderVector(const std::vector<sp<IBinder>>& val);
+
template<typename T>
status_t write(const Flattenable<T>& val);
@@ -202,7 +204,9 @@
wp<IBinder> readWeakBinder() const;
template<typename T>
- status_t readStrongBinder(sp<T>* val) const;
+ status_t readStrongBinder(sp<T>* val) const;
+
+ status_t readStrongBinderVector(std::vector<sp<IBinder>>* val) const;
status_t readByteVector(std::vector<int8_t>* val) const;
status_t readInt32Vector(std::vector<int32_t>* val) const;
diff --git a/libs/binder/Parcel.cpp b/libs/binder/Parcel.cpp
index 694916c..db1fc5c 100644
--- a/libs/binder/Parcel.cpp
+++ b/libs/binder/Parcel.cpp
@@ -1045,6 +1045,56 @@
return flatten_binder(ProcessState::self(), val, this);
}
+status_t Parcel::writeStrongBinderVector(const std::vector<sp<IBinder>>& val)
+{
+ if (val.size() > std::numeric_limits<int32_t>::max()) {
+ return BAD_VALUE;
+ }
+
+ status_t status = writeInt32(val.size());
+
+ if (status != OK) {
+ return status;
+ }
+
+ for (const auto& item : val) {
+ status = writeStrongBinder(item);
+
+ if (status != OK) {
+ return status;
+ }
+ }
+
+ return OK;
+}
+
+status_t Parcel::readStrongBinderVector(std::vector<sp<IBinder>>* val) const {
+ val->clear();
+
+ int32_t size;
+ status_t status = readInt32(&size);
+
+ if (status != OK) {
+ return status;
+ }
+
+ if (size < 0) {
+ return BAD_VALUE;
+ }
+
+ val->resize(size);
+
+ for (auto& v : *val) {
+ status = readStrongBinder(&v);
+
+ if (status != OK) {
+ return status;
+ }
+ }
+
+ return OK;
+}
+
status_t Parcel::writeWeakBinder(const wp<IBinder>& val)
{
return flatten_binder(ProcessState::self(), val, this);