summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChristopher Wiley <wiley@google.com>2015-11-23 18:19:16 +0000
committerandroid-build-merger <android-build-merger@google.com>2015-11-23 18:19:16 +0000
commit6c31acd969ffc754e514885fa7f4d0c25403f580 (patch)
tree5fe06d88f3c5a1b3b9173fe7dcb0bac3d64571b9
parent709ae9a0a5775c75b81d011ae9624f28787e5b15 (diff)
parent49b5443a49d737d13c8d05dfd9b827b2c4198edc (diff)
downloadnative-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.h19
-rw-r--r--include/binder/Parcelable.h51
-rw-r--r--libs/binder/Parcel.cpp20
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;