Loading include/binder/Parcel.h +4 −0 Original line number Original line Diff line number Diff line Loading @@ -126,6 +126,8 @@ public: status_t writeByteVector(const std::unique_ptr<std::vector<int8_t>>& val); status_t writeByteVector(const std::unique_ptr<std::vector<int8_t>>& val); status_t writeByteVector(const std::vector<int8_t>& val); status_t writeByteVector(const std::vector<int8_t>& val); status_t writeByteVector(const std::unique_ptr<std::vector<uint8_t>>& val); status_t writeByteVector(const std::vector<uint8_t>& val); status_t writeInt32Vector(const std::unique_ptr<std::vector<int32_t>>& val); status_t writeInt32Vector(const std::unique_ptr<std::vector<int32_t>>& val); status_t writeInt32Vector(const std::vector<int32_t>& val); status_t writeInt32Vector(const std::vector<int32_t>& val); status_t writeInt64Vector(const std::unique_ptr<std::vector<int64_t>>& val); status_t writeInt64Vector(const std::unique_ptr<std::vector<int64_t>>& val); Loading Loading @@ -271,6 +273,8 @@ public: status_t readByteVector(std::unique_ptr<std::vector<int8_t>>* val) const; status_t readByteVector(std::unique_ptr<std::vector<int8_t>>* val) const; status_t readByteVector(std::vector<int8_t>* val) const; status_t readByteVector(std::vector<int8_t>* val) const; status_t readByteVector(std::unique_ptr<std::vector<uint8_t>>* val) const; status_t readByteVector(std::vector<uint8_t>* val) const; status_t readInt32Vector(std::unique_ptr<std::vector<int32_t>>* val) const; status_t readInt32Vector(std::unique_ptr<std::vector<int32_t>>* val) const; status_t readInt32Vector(std::vector<int32_t>* val) const; status_t readInt32Vector(std::vector<int32_t>* val) const; status_t readInt64Vector(std::unique_ptr<std::vector<int64_t>>* val) const; status_t readInt64Vector(std::unique_ptr<std::vector<int64_t>>* val) const; Loading libs/binder/Parcel.cpp +71 −21 Original line number Original line Diff line number Diff line Loading @@ -810,16 +810,10 @@ status_t Parcel::writeUtf8AsUtf16(const std::unique_ptr<std::string>& str) { return writeUtf8AsUtf16(*str); return writeUtf8AsUtf16(*str); } } status_t Parcel::writeByteVector(const std::unique_ptr<std::vector<int8_t>>& val) namespace { { if (!val) { return writeInt32(-1); } return writeByteVector(*val); template<typename T> } status_t writeByteVectorInternal(Parcel* parcel, const std::vector<T>& val) status_t Parcel::writeByteVector(const std::vector<int8_t>& val) { { status_t status; status_t status; if (val.size() > std::numeric_limits<int32_t>::max()) { if (val.size() > std::numeric_limits<int32_t>::max()) { Loading @@ -827,12 +821,12 @@ status_t Parcel::writeByteVector(const std::vector<int8_t>& val) return status; return status; } } status = writeInt32(val.size()); status = parcel->writeInt32(val.size()); if (status != OK) { if (status != OK) { return status; return status; } } void* data = writeInplace(val.size()); void* data = parcel->writeInplace(val.size()); if (!data) { if (!data) { status = BAD_VALUE; status = BAD_VALUE; return status; return status; Loading @@ -842,6 +836,37 @@ status_t Parcel::writeByteVector(const std::vector<int8_t>& val) return status; return status; } } template<typename T> status_t writeByteVectorInternalPtr(Parcel* parcel, const std::unique_ptr<std::vector<T>>& val) { if (!val) { return parcel->writeInt32(-1); } return writeByteVectorInternal(parcel, *val); } } // namespace status_t Parcel::writeByteVector(const std::vector<int8_t>& val) { return writeByteVectorInternal(this, val); } status_t Parcel::writeByteVector(const std::unique_ptr<std::vector<int8_t>>& val) { return writeByteVectorInternalPtr(this, val); } status_t Parcel::writeByteVector(const std::vector<uint8_t>& val) { return writeByteVectorInternal(this, val); } status_t Parcel::writeByteVector(const std::unique_ptr<std::vector<uint8_t>>& val) { return writeByteVectorInternalPtr(this, val); } status_t Parcel::writeInt32Vector(const std::vector<int32_t>& val) status_t Parcel::writeInt32Vector(const std::vector<int32_t>& val) { { return writeTypedVector(val, &Parcel::writeInt32); return writeTypedVector(val, &Parcel::writeInt32); Loading Loading @@ -1408,11 +1433,15 @@ restart_write: return err; return err; } } status_t Parcel::readByteVector(std::vector<int8_t>* val) const { namespace { template<typename T> status_t readByteVectorInternal(const Parcel* parcel, std::vector<T>* val) { val->clear(); val->clear(); int32_t size; int32_t size; status_t status = readInt32(&size); status_t status = parcel->readInt32(&size); if (status != OK) { if (status != OK) { return status; return status; Loading @@ -1422,12 +1451,12 @@ status_t Parcel::readByteVector(std::vector<int8_t>* val) const { status = UNEXPECTED_NULL; status = UNEXPECTED_NULL; return status; return status; } } if (size_t(size) > dataAvail()) { if (size_t(size) > parcel->dataAvail()) { status = BAD_VALUE; status = BAD_VALUE; return status; return status; } } const void* data = readInplace(size); const void* data = parcel->readInplace(size); if (!data) { if (!data) { status = BAD_VALUE; status = BAD_VALUE; return status; return status; Loading @@ -1438,20 +1467,23 @@ status_t Parcel::readByteVector(std::vector<int8_t>* val) const { return status; return status; } } status_t Parcel::readByteVector(std::unique_ptr<std::vector<int8_t>>* val) const { template<typename T> const int32_t start = dataPosition(); status_t readByteVectorInternalPtr( const Parcel* parcel, std::unique_ptr<std::vector<T>>* val) { const int32_t start = parcel->dataPosition(); int32_t size; int32_t size; status_t status = readInt32(&size); status_t status = parcel->readInt32(&size); val->reset(); val->reset(); if (status != OK || size < 0) { if (status != OK || size < 0) { return status; return status; } } setDataPosition(start); parcel->setDataPosition(start); val->reset(new std::vector<int8_t>()); val->reset(new std::vector<T>()); status = readByteVector(val->get()); status = readByteVectorInternal(parcel, val->get()); if (status != OK) { if (status != OK) { val->reset(); val->reset(); Loading @@ -1460,6 +1492,24 @@ status_t Parcel::readByteVector(std::unique_ptr<std::vector<int8_t>>* val) const return status; return status; } } } // namespace status_t Parcel::readByteVector(std::vector<int8_t>* val) const { return readByteVectorInternal(this, val); } status_t Parcel::readByteVector(std::vector<uint8_t>* val) const { return readByteVectorInternal(this, val); } status_t Parcel::readByteVector(std::unique_ptr<std::vector<int8_t>>* val) const { return readByteVectorInternalPtr(this, val); } status_t Parcel::readByteVector(std::unique_ptr<std::vector<uint8_t>>* val) const { return readByteVectorInternalPtr(this, val); } status_t Parcel::readInt32Vector(std::unique_ptr<std::vector<int32_t>>* val) const { status_t Parcel::readInt32Vector(std::unique_ptr<std::vector<int32_t>>* val) const { return readNullableTypedVector(val, &Parcel::readInt32); return readNullableTypedVector(val, &Parcel::readInt32); } } Loading Loading
include/binder/Parcel.h +4 −0 Original line number Original line Diff line number Diff line Loading @@ -126,6 +126,8 @@ public: status_t writeByteVector(const std::unique_ptr<std::vector<int8_t>>& val); status_t writeByteVector(const std::unique_ptr<std::vector<int8_t>>& val); status_t writeByteVector(const std::vector<int8_t>& val); status_t writeByteVector(const std::vector<int8_t>& val); status_t writeByteVector(const std::unique_ptr<std::vector<uint8_t>>& val); status_t writeByteVector(const std::vector<uint8_t>& val); status_t writeInt32Vector(const std::unique_ptr<std::vector<int32_t>>& val); status_t writeInt32Vector(const std::unique_ptr<std::vector<int32_t>>& val); status_t writeInt32Vector(const std::vector<int32_t>& val); status_t writeInt32Vector(const std::vector<int32_t>& val); status_t writeInt64Vector(const std::unique_ptr<std::vector<int64_t>>& val); status_t writeInt64Vector(const std::unique_ptr<std::vector<int64_t>>& val); Loading Loading @@ -271,6 +273,8 @@ public: status_t readByteVector(std::unique_ptr<std::vector<int8_t>>* val) const; status_t readByteVector(std::unique_ptr<std::vector<int8_t>>* val) const; status_t readByteVector(std::vector<int8_t>* val) const; status_t readByteVector(std::vector<int8_t>* val) const; status_t readByteVector(std::unique_ptr<std::vector<uint8_t>>* val) const; status_t readByteVector(std::vector<uint8_t>* val) const; status_t readInt32Vector(std::unique_ptr<std::vector<int32_t>>* val) const; status_t readInt32Vector(std::unique_ptr<std::vector<int32_t>>* val) const; status_t readInt32Vector(std::vector<int32_t>* val) const; status_t readInt32Vector(std::vector<int32_t>* val) const; status_t readInt64Vector(std::unique_ptr<std::vector<int64_t>>* val) const; status_t readInt64Vector(std::unique_ptr<std::vector<int64_t>>* val) const; Loading
libs/binder/Parcel.cpp +71 −21 Original line number Original line Diff line number Diff line Loading @@ -810,16 +810,10 @@ status_t Parcel::writeUtf8AsUtf16(const std::unique_ptr<std::string>& str) { return writeUtf8AsUtf16(*str); return writeUtf8AsUtf16(*str); } } status_t Parcel::writeByteVector(const std::unique_ptr<std::vector<int8_t>>& val) namespace { { if (!val) { return writeInt32(-1); } return writeByteVector(*val); template<typename T> } status_t writeByteVectorInternal(Parcel* parcel, const std::vector<T>& val) status_t Parcel::writeByteVector(const std::vector<int8_t>& val) { { status_t status; status_t status; if (val.size() > std::numeric_limits<int32_t>::max()) { if (val.size() > std::numeric_limits<int32_t>::max()) { Loading @@ -827,12 +821,12 @@ status_t Parcel::writeByteVector(const std::vector<int8_t>& val) return status; return status; } } status = writeInt32(val.size()); status = parcel->writeInt32(val.size()); if (status != OK) { if (status != OK) { return status; return status; } } void* data = writeInplace(val.size()); void* data = parcel->writeInplace(val.size()); if (!data) { if (!data) { status = BAD_VALUE; status = BAD_VALUE; return status; return status; Loading @@ -842,6 +836,37 @@ status_t Parcel::writeByteVector(const std::vector<int8_t>& val) return status; return status; } } template<typename T> status_t writeByteVectorInternalPtr(Parcel* parcel, const std::unique_ptr<std::vector<T>>& val) { if (!val) { return parcel->writeInt32(-1); } return writeByteVectorInternal(parcel, *val); } } // namespace status_t Parcel::writeByteVector(const std::vector<int8_t>& val) { return writeByteVectorInternal(this, val); } status_t Parcel::writeByteVector(const std::unique_ptr<std::vector<int8_t>>& val) { return writeByteVectorInternalPtr(this, val); } status_t Parcel::writeByteVector(const std::vector<uint8_t>& val) { return writeByteVectorInternal(this, val); } status_t Parcel::writeByteVector(const std::unique_ptr<std::vector<uint8_t>>& val) { return writeByteVectorInternalPtr(this, val); } status_t Parcel::writeInt32Vector(const std::vector<int32_t>& val) status_t Parcel::writeInt32Vector(const std::vector<int32_t>& val) { { return writeTypedVector(val, &Parcel::writeInt32); return writeTypedVector(val, &Parcel::writeInt32); Loading Loading @@ -1408,11 +1433,15 @@ restart_write: return err; return err; } } status_t Parcel::readByteVector(std::vector<int8_t>* val) const { namespace { template<typename T> status_t readByteVectorInternal(const Parcel* parcel, std::vector<T>* val) { val->clear(); val->clear(); int32_t size; int32_t size; status_t status = readInt32(&size); status_t status = parcel->readInt32(&size); if (status != OK) { if (status != OK) { return status; return status; Loading @@ -1422,12 +1451,12 @@ status_t Parcel::readByteVector(std::vector<int8_t>* val) const { status = UNEXPECTED_NULL; status = UNEXPECTED_NULL; return status; return status; } } if (size_t(size) > dataAvail()) { if (size_t(size) > parcel->dataAvail()) { status = BAD_VALUE; status = BAD_VALUE; return status; return status; } } const void* data = readInplace(size); const void* data = parcel->readInplace(size); if (!data) { if (!data) { status = BAD_VALUE; status = BAD_VALUE; return status; return status; Loading @@ -1438,20 +1467,23 @@ status_t Parcel::readByteVector(std::vector<int8_t>* val) const { return status; return status; } } status_t Parcel::readByteVector(std::unique_ptr<std::vector<int8_t>>* val) const { template<typename T> const int32_t start = dataPosition(); status_t readByteVectorInternalPtr( const Parcel* parcel, std::unique_ptr<std::vector<T>>* val) { const int32_t start = parcel->dataPosition(); int32_t size; int32_t size; status_t status = readInt32(&size); status_t status = parcel->readInt32(&size); val->reset(); val->reset(); if (status != OK || size < 0) { if (status != OK || size < 0) { return status; return status; } } setDataPosition(start); parcel->setDataPosition(start); val->reset(new std::vector<int8_t>()); val->reset(new std::vector<T>()); status = readByteVector(val->get()); status = readByteVectorInternal(parcel, val->get()); if (status != OK) { if (status != OK) { val->reset(); val->reset(); Loading @@ -1460,6 +1492,24 @@ status_t Parcel::readByteVector(std::unique_ptr<std::vector<int8_t>>* val) const return status; return status; } } } // namespace status_t Parcel::readByteVector(std::vector<int8_t>* val) const { return readByteVectorInternal(this, val); } status_t Parcel::readByteVector(std::vector<uint8_t>* val) const { return readByteVectorInternal(this, val); } status_t Parcel::readByteVector(std::unique_ptr<std::vector<int8_t>>* val) const { return readByteVectorInternalPtr(this, val); } status_t Parcel::readByteVector(std::unique_ptr<std::vector<uint8_t>>* val) const { return readByteVectorInternalPtr(this, val); } status_t Parcel::readInt32Vector(std::unique_ptr<std::vector<int32_t>>* val) const { status_t Parcel::readInt32Vector(std::unique_ptr<std::vector<int32_t>>* val) const { return readNullableTypedVector(val, &Parcel::readInt32); return readNullableTypedVector(val, &Parcel::readInt32); } } Loading