OSDN Git Service

Add readStrongBinder that takes an interface
authorCasey Dahlin <sadmac@google.com>
Wed, 28 Oct 2015 01:33:56 +0000 (18:33 -0700)
committerCasey Dahlin <sadmac@google.com>
Wed, 28 Oct 2015 21:35:24 +0000 (14:35 -0700)
We use a template function to let us pass arbitrary interfaces, all of which
can be cast to IBinder.

Change-Id: Iadf21c495cde43e8a5adb85a49e6592196f401ff
Test: unit tests
Bug: 23600713
Signed-off-by: Casey Dahlin <sadmac@google.com>
include/binder/Parcel.h
libs/binder/Parcel.cpp

index 5a37e6a..637a1e9 100644 (file)
@@ -27,6 +27,8 @@
 #include <utils/Flattenable.h>
 #include <linux/binder.h>
 
+#include <binder/IInterface.h>
+
 // ---------------------------------------------------------------------------
 namespace android {
 
@@ -196,8 +198,12 @@ public:
     status_t            readString16(String16* pArg) const;
     const char16_t*     readString16Inplace(size_t* outLen) const;
     sp<IBinder>         readStrongBinder() const;
+    status_t            readStrongBinder(sp<IBinder>* val) const;
     wp<IBinder>         readWeakBinder() const;
 
+    template<typename T>
+    status_t readStrongBinder(sp<T>* val) const;
+
     status_t            readByteVector(std::vector<int8_t>* val) const;
     status_t            readInt32Vector(std::vector<int32_t>* val) const;
     status_t            readInt64Vector(std::vector<int64_t>* val) const;
@@ -430,6 +436,22 @@ status_t Parcel::read(LightFlattenable<T>& val) const {
     return NO_ERROR;
 }
 
+template<typename T>
+status_t Parcel::readStrongBinder(sp<T>* val) const {
+    sp<IBinder> tmp;
+    status_t ret = readStrongBinder(&tmp);
+
+    if (ret == OK) {
+        *val = interface_cast<T>(tmp);
+
+        if (val->get() == nullptr) {
+            return UNKNOWN_ERROR;
+        }
+    }
+
+    return ret;
+}
+
 // ---------------------------------------------------------------------------
 
 inline TextOutput& operator<<(TextOutput& to, const Parcel& parcel)
index 48bf799..ab2cdab 100644 (file)
@@ -1781,10 +1781,15 @@ const char16_t* Parcel::readString16Inplace(size_t* outLen) const
     return NULL;
 }
 
+status_t Parcel::readStrongBinder(sp<IBinder>* val) const
+{
+    return unflatten_binder(ProcessState::self(), *this, val);
+}
+
 sp<IBinder> Parcel::readStrongBinder() const
 {
     sp<IBinder> val;
-    unflatten_binder(ProcessState::self(), *this, &val);
+    readStrongBinder(&val);
     return val;
 }