OSDN Git Service

Add support for reading/writing a vector of binders
authorCasey Dahlin <sadmac@google.com>
Tue, 3 Nov 2015 21:50:37 +0000 (13:50 -0800)
committerCasey Dahlin <sadmac@google.com>
Tue, 3 Nov 2015 21:50:37 +0000 (13:50 -0800)
Change-Id: Iaa8da704b2ae3c1ca5456177441a335991b40e8a
Test: unit tests pass
Bug: 24470786
Signed-off-by: Casey Dahlin <sadmac@google.com>
include/binder/Parcel.h
libs/binder/Parcel.cpp

index 637a1e9..695d5f1 100644 (file)
@@ -125,6 +125,8 @@ public:
     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 @@ public:
     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;
index 694916c..db1fc5c 100644 (file)
@@ -1045,6 +1045,56 @@ status_t Parcel::writeStrongBinder(const sp<IBinder>& val)
     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);