Merge "Add readStrongBinder that takes an interface" am: 71b70a244c
am: 6319281c24
* commit '6319281c24284a83f8bab090c6048d864635f0dd':
Add readStrongBinder that takes an interface
diff --git a/include/binder/Parcel.h b/include/binder/Parcel.h
index be3e9b3..ae76ffb 100644
--- a/include/binder/Parcel.h
+++ b/include/binder/Parcel.h
@@ -27,6 +27,8 @@
#include <utils/Flattenable.h>
#include <linux/binder.h>
+#include <binder/IInterface.h>
+
// ---------------------------------------------------------------------------
namespace android {
@@ -196,8 +198,12 @@
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;
@@ -432,6 +438,22 @@
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)
diff --git a/libs/binder/Parcel.cpp b/libs/binder/Parcel.cpp
index ef76cbc..fb5f278 100644
--- a/libs/binder/Parcel.cpp
+++ b/libs/binder/Parcel.cpp
@@ -1807,10 +1807,15 @@
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;
}