summaryrefslogtreecommitdiff
path: root/libs/binder/Parcel.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'libs/binder/Parcel.cpp')
-rw-r--r--libs/binder/Parcel.cpp196
1 files changed, 46 insertions, 150 deletions
diff --git a/libs/binder/Parcel.cpp b/libs/binder/Parcel.cpp
index 45bf636505..c808948e0f 100644
--- a/libs/binder/Parcel.cpp
+++ b/libs/binder/Parcel.cpp
@@ -750,43 +750,23 @@ restart_write:
return NULL;
}
-status_t Parcel::writeByteVector(const std::vector<int8_t>& val)
-{
- status_t status;
- if (val.size() > std::numeric_limits<int32_t>::max()) {
- status = BAD_VALUE;
- return status;
- }
-
- status = writeInt32(val.size());
- if (status != OK) {
- return status;
- }
-
- void* data = writeInplace(val.size());
- if (!data) {
- status = BAD_VALUE;
- return status;
- }
-
- memcpy(data, val.data(), val.size());
- return status;
-}
+namespace {
-status_t Parcel::writeInt32Vector(const std::vector<int32_t>& val)
-{
+template<typename T, typename U>
+status_t unsafeWriteTypedVector(const std::vector<T>& val, Parcel* p,
+ status_t(Parcel::*write_func)(U)) {
if (val.size() > std::numeric_limits<int32_t>::max()) {
return BAD_VALUE;
}
- status_t status = writeInt32(val.size());
+ status_t status = p->writeInt32(val.size());
if (status != OK) {
return status;
}
for (const auto& item : val) {
- status = writeInt32(item);
+ status = (p->*write_func)(item);
if (status != OK) {
return status;
@@ -796,142 +776,76 @@ status_t Parcel::writeInt32Vector(const std::vector<int32_t>& val)
return OK;
}
-status_t Parcel::writeInt64Vector(const std::vector<int64_t>& 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 = writeInt64(item);
-
- if (status != OK) {
- return status;
- }
- }
+template<typename T>
+status_t writeTypedVector(const std::vector<T>& val, Parcel* p,
+ status_t(Parcel::*write_func)(const T&)) {
+ return unsafeWriteTypedVector(val, p, write_func);
+}
- return OK;
+template<typename T>
+status_t writeTypedVector(const std::vector<T>& val, Parcel* p,
+ status_t(Parcel::*write_func)(T)) {
+ return unsafeWriteTypedVector(val, p, write_func);
}
-status_t Parcel::writeFloatVector(const std::vector<float>& val)
+} // namespace
+
+status_t Parcel::writeByteVector(const std::vector<int8_t>& val)
{
+ status_t status;
if (val.size() > std::numeric_limits<int32_t>::max()) {
- return BAD_VALUE;
+ status = BAD_VALUE;
+ return status;
}
- status_t status = writeInt32(val.size());
-
+ status = writeInt32(val.size());
if (status != OK) {
return status;
}
- for (const auto& item : val) {
- status = writeFloat(item);
-
- if (status != OK) {
- return status;
- }
+ void* data = writeInplace(val.size());
+ if (!data) {
+ status = BAD_VALUE;
+ return status;
}
- return OK;
+ memcpy(data, val.data(), val.size());
+ return status;
}
-status_t Parcel::writeDoubleVector(const std::vector<double>& val)
+status_t Parcel::writeInt32Vector(const std::vector<int32_t>& val)
{
- if (val.size() > std::numeric_limits<int32_t>::max()) {
- return BAD_VALUE;
- }
-
- status_t status = writeInt32(val.size());
-
- if (status != OK) {
- return status;
- }
+ return writeTypedVector(val, this, &Parcel::writeInt32);
+}
- for (const auto& item : val) {
- status = writeDouble(item);
+status_t Parcel::writeInt64Vector(const std::vector<int64_t>& val)
+{
+ return writeTypedVector(val, this, &Parcel::writeInt64);
+}
- if (status != OK) {
- return status;
- }
- }
+status_t Parcel::writeFloatVector(const std::vector<float>& val)
+{
+ return writeTypedVector(val, this, &Parcel::writeFloat);
+}
- return OK;
+status_t Parcel::writeDoubleVector(const std::vector<double>& val)
+{
+ return writeTypedVector(val, this, &Parcel::writeDouble);
}
status_t Parcel::writeBoolVector(const std::vector<bool>& 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 = writeBool(item);
-
- if (status != OK) {
- return status;
- }
- }
-
- return OK;
+ return writeTypedVector(val, this, &Parcel::writeBool);
}
status_t Parcel::writeCharVector(const std::vector<char16_t>& 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 = writeChar(item);
-
- if (status != OK) {
- return status;
- }
- }
-
- return OK;
+ return writeTypedVector(val, this, &Parcel::writeChar);
}
status_t Parcel::writeString16Vector(const std::vector<String16>& 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 = writeString16(item);
-
- if (status != OK) {
- return status;
- }
- }
-
- return OK;
+ return writeTypedVector(val, this, &Parcel::writeString16);
}
status_t Parcel::writeInt32(int32_t val)
@@ -1080,25 +994,7 @@ status_t Parcel::writeStrongBinder(const sp<IBinder>& val)
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;
+ return writeTypedVector(val, this, &Parcel::writeStrongBinder);
}
status_t Parcel::readStrongBinderVector(std::vector<sp<IBinder>>* val) const {