diff options
author | Christopher Wiley <wiley@google.com> | 2015-11-23 18:19:16 +0000 |
---|---|---|
committer | android-build-merger <android-build-merger@google.com> | 2015-11-23 18:19:16 +0000 |
commit | 6c31acd969ffc754e514885fa7f4d0c25403f580 (patch) | |
tree | 5fe06d88f3c5a1b3b9173fe7dcb0bac3d64571b9 | |
parent | 709ae9a0a5775c75b81d011ae9624f28787e5b15 (diff) | |
parent | 49b5443a49d737d13c8d05dfd9b827b2c4198edc (diff) | |
download | native-6c31acd969ffc754e514885fa7f4d0c25403f580.tar.gz |
Merge "libbinder: Add support for C++ Parcelable"
am: 49b5443a49
* commit '49b5443a49d737d13c8d05dfd9b827b2c4198edc':
libbinder: Add support for C++ Parcelable
-rw-r--r-- | include/binder/Parcel.h | 19 | ||||
-rw-r--r-- | include/binder/Parcelable.h | 51 | ||||
-rw-r--r-- | libs/binder/Parcel.cpp | 20 |
3 files changed, 90 insertions, 0 deletions
diff --git a/include/binder/Parcel.h b/include/binder/Parcel.h index f50463e550..b6106ba54d 100644 --- a/include/binder/Parcel.h +++ b/include/binder/Parcel.h @@ -28,6 +28,7 @@ #include <linux/binder.h> #include <binder/IInterface.h> +#include <binder/Parcelable.h> // --------------------------------------------------------------------------- namespace android { @@ -128,6 +129,10 @@ public: status_t writeStrongBinderVector(const std::vector<sp<IBinder>>& val); template<typename T> + status_t writeParcelableVector(const std::vector<T>& val); + status_t writeParcelable(const Parcelable& parcelable); + + template<typename T> status_t write(const Flattenable<T>& val); template<typename T> @@ -204,6 +209,10 @@ public: wp<IBinder> readWeakBinder() const; template<typename T> + status_t readParcelableVector(std::vector<T>* val) const; + status_t readParcelable(Parcelable* parcelable) const; + + template<typename T> status_t readStrongBinder(sp<T>* val) const; status_t readStrongBinderVector(std::vector<sp<IBinder>>* val) const; @@ -545,6 +554,16 @@ status_t Parcel::writeTypedVector(const std::vector<T>& val, return unsafeWriteTypedVector(val, write_func); } +template<typename T> +status_t Parcel::readParcelableVector(std::vector<T>* val) const { + return unsafeReadTypedVector(val, &Parcel::readParcelable); +} + +template<typename T> +status_t Parcel::writeParcelableVector(const std::vector<T>& val) { + return unsafeWriteTypedVector(val, &Parcel::writeParcelable); +} + // --------------------------------------------------------------------------- inline TextOutput& operator<<(TextOutput& to, const Parcel& parcel) diff --git a/include/binder/Parcelable.h b/include/binder/Parcelable.h new file mode 100644 index 0000000000..faf0d34e9f --- /dev/null +++ b/include/binder/Parcelable.h @@ -0,0 +1,51 @@ +/* + * Copyright (C) 2015 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef ANDROID_PARCELABLE_H +#define ANDROID_PARCELABLE_H + +#include <vector> + +#include <utils/Errors.h> +#include <utils/String16.h> + +namespace android { + +class Parcel; + +// Abstract interface of all parcelables. +class Parcelable { +public: + virtual ~Parcelable() = default; + + // Write |this| parcelable to the given |parcel|. Keep in mind that + // implementations of writeToParcel must be manually kept in sync + // with readFromParcel and the Java equivalent versions of these methods. + // + // Returns android::OK on success and an appropriate error otherwise. + virtual status_t writeToParcel(Parcel* parcel) const = 0; + + // Read data from the given |parcel| into |this|. After readFromParcel + // completes, |this| should have equivalent state to the object that + // wrote itself to the parcel. + // + // Returns android::OK on success and an appropriate error otherwise. + virtual status_t readFromParcel(const Parcel* parcel) = 0; +}; // class Parcelable + +} // namespace android + +#endif // ANDROID_PARCELABLE_H diff --git a/libs/binder/Parcel.cpp b/libs/binder/Parcel.cpp index 15c785b8a3..a693c7189c 100644 --- a/libs/binder/Parcel.cpp +++ b/libs/binder/Parcel.cpp @@ -959,6 +959,14 @@ status_t Parcel::writeWeakBinder(const wp<IBinder>& val) return flatten_binder(ProcessState::self(), val, this); } +status_t Parcel::writeParcelable(const Parcelable& parcelable) { + status_t status = writeInt32(1); // parcelable is not null. + if (status != OK) { + return status; + } + return parcelable.writeToParcel(this); +} + status_t Parcel::writeNativeHandle(const native_handle* handle) { if (!handle || handle->version != sizeof(native_handle)) @@ -1569,6 +1577,18 @@ wp<IBinder> Parcel::readWeakBinder() const return val; } +status_t Parcel::readParcelable(Parcelable* parcelable) const { + int32_t have_parcelable = 0; + status_t status = readInt32(&have_parcelable); + if (status != OK) { + return status; + } + if (!have_parcelable) { + return UNEXPECTED_NULL; + } + return parcelable->readFromParcel(this); +} + int32_t Parcel::readExceptionCode() const { binder::Status status; |