16316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum/*
26316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum * Copyright (C) 2015 The Android Open Source Project
36316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum *
46316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum * Licensed under the Apache License, Version 2.0 (the "License");
56316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum * you may not use this file except in compliance with the License.
66316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum * You may obtain a copy of the License at
76316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum *
86316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum *      http://www.apache.org/licenses/LICENSE-2.0
96316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum *
106316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum * Unless required by applicable law or agreed to in writing, software
116316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum * distributed under the License is distributed on an "AS IS" BASIS,
126316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
136316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum * See the License for the specific language governing permissions and
146316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum * limitations under the License.
156316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum */
166316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum
176316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum#define LOG_TAG "Value"
186316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum
196316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum#include <binder/Value.h>
206316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum
216316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum#include <limits>
226316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum
236316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum#include <binder/IBinder.h>
246316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum#include <binder/Parcel.h>
256316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum#include <binder/Map.h>
266316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum#include <private/binder/ParcelValTypes.h>
276316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum#include <log/log.h>
286316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum#include <utils/Errors.h>
296316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum
306316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaumusing android::BAD_TYPE;
316316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaumusing android::BAD_VALUE;
326316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaumusing android::NO_ERROR;
336316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaumusing android::UNEXPECTED_NULL;
346316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaumusing android::Parcel;
356316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaumusing android::sp;
366316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaumusing android::status_t;
376316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaumusing std::map;
386316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaumusing std::set;
396316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaumusing std::vector;
406316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaumusing android::binder::Value;
416316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaumusing android::IBinder;
426316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaumusing android::os::PersistableBundle;
436316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaumusing namespace android::binder;
446316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum
456316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum// ====================================================================
466316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum
476316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum#define RETURN_IF_FAILED(calledOnce)                                     \
486316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum    do {                                                                 \
496316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum        status_t returnStatus = calledOnce;                              \
506316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum        if (returnStatus) {                                              \
516316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum            ALOGE("Failed at %s:%d (%s)", __FILE__, __LINE__, __func__); \
526316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum            return returnStatus;                                         \
536316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum         }                                                               \
546316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum    } while(false)
556316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum
566316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum// ====================================================================
576316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum
586316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum/* These `internal_type_ptr()` functions allow this
596316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum * class to work without C++ RTTI support. This technique
606316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum * only works properly when called directly from this file,
616316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum * but that is OK because that is the only place we will
626316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum * be calling them from. */
636316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaumtemplate<class T> const void* internal_type_ptr()
646316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum{
656316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum    static const T *marker;
666316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum    return (void*)&marker;
676316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum}
686316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum
696316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum/* Allows the type to be specified by the argument
706316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum * instead of inside angle brackets. */
716316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaumtemplate<class T> const void* internal_type_ptr(const T&)
726316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum{
736316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum    return internal_type_ptr<T>();
746316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum}
756316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum
766316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum// ====================================================================
776316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum
786316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaumnamespace android {
796316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum
806316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaumnamespace binder {
816316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum
826316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaumclass Value::ContentBase {
836316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaumpublic:
846316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum    virtual ~ContentBase() = default;
856316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum    virtual const void* type_ptr() const = 0;
866316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum    virtual ContentBase * clone() const = 0;
876316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum    virtual bool operator==(const ContentBase& rhs) const = 0;
886316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum
896316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum#ifdef LIBBINDER_VALUE_SUPPORTS_TYPE_INFO
906316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum    virtual const std::type_info &type() const = 0;
916316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum#endif
926316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum
936316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum    template<typename T> bool get(T* out) const;
946316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum};
956316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum
966316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum/* This is the actual class that holds the value. */
976316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaumtemplate<typename T> class Value::Content : public Value::ContentBase {
986316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaumpublic:
996316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum    Content() = default;
1006316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum    Content(const T & value) : mValue(value) { }
1016316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum
1026316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum    virtual ~Content() = default;
1036316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum
1046316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum#ifdef LIBBINDER_VALUE_SUPPORTS_TYPE_INFO
1056316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum    virtual const std::type_info &type() const override
1066316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum    {
1076316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum        return typeid(T);
1086316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum    }
1096316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum#endif
1106316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum
1116316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum    virtual const void* type_ptr() const override
1126316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum    {
1136316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum        return internal_type_ptr<T>();
1146316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum    }
1156316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum
1166316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum    virtual ContentBase * clone() const override
1176316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum    {
1186316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum        return new Content(mValue);
1196316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum    };
1206316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum
1216316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum    virtual bool operator==(const ContentBase& rhs) const override
1226316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum    {
1236316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum        if (type_ptr() != rhs.type_ptr()) {
1246316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum            return false;
1256316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum        }
1266316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum        return mValue == static_cast<const Content<T>* >(&rhs)->mValue;
1276316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum    }
1286316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum
1296316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum    T mValue;
1306316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum};
1316316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum
1326316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaumtemplate<typename T> bool Value::ContentBase::get(T* out) const
1336316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum{
1346316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum    if (internal_type_ptr(*out) != type_ptr())
1356316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum    {
1366316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum        return false;
1376316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum    }
1386316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum
1396316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum    *out = static_cast<const Content<T>*>(this)->mValue;
1406316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum
1416316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum    return true;
1426316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum}
1436316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum
1446316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum// ====================================================================
1456316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum
1466316f5b8df30422b247c2bfd1a805dcd4069b54eRobert QuattlebaumValue::Value() : mContent(NULL)
1476316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum{
1486316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum}
1496316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum
1506316f5b8df30422b247c2bfd1a805dcd4069b54eRobert QuattlebaumValue::Value(const Value& value)
1516316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum    : mContent(value.mContent ? value.mContent->clone() : NULL)
1526316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum{
1536316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum}
1546316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum
1556316f5b8df30422b247c2bfd1a805dcd4069b54eRobert QuattlebaumValue::~Value()
1566316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum{
1576316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum    delete mContent;
1586316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum}
1596316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum
1606316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaumbool Value::operator==(const Value& rhs) const
1616316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum{
1626316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum    const Value& lhs(*this);
1636316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum
1646316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum    if (lhs.empty() && rhs.empty()) {
1656316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum        return true;
1666316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum    }
1676316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum
1686316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum    if ( (lhs.mContent == NULL)
1696316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum      || (rhs.mContent == NULL)
1706316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum    ) {
1716316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum        return false;
1726316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum    }
1736316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum
1746316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum    return *lhs.mContent == *rhs.mContent;
1756316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum}
1766316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum
1776316f5b8df30422b247c2bfd1a805dcd4069b54eRobert QuattlebaumValue& Value::swap(Value &rhs)
1786316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum{
1796316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum    std::swap(mContent, rhs.mContent);
1806316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum    return *this;
1816316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum}
1826316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum
1836316f5b8df30422b247c2bfd1a805dcd4069b54eRobert QuattlebaumValue& Value::operator=(const Value& rhs)
1846316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum{
1856316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum    delete mContent;
1866316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum    mContent = rhs.mContent
1876316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum        ? rhs.mContent->clone()
1886316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum        : NULL;
1896316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum    return *this;
1906316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum}
1916316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum
1926316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaumbool Value::empty() const
1936316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum{
1946316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum    return mContent == NULL;
1956316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum}
1966316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum
1976316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaumvoid Value::clear()
1986316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum{
1996316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum    delete mContent;
2006316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum    mContent = NULL;
2016316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum}
2026316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum
2036316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaumint32_t Value::parcelType() const
2046316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum{
2056316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum    const void* t_info(mContent ? mContent->type_ptr() : NULL);
2066316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum
2076316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum    if (t_info == internal_type_ptr<bool>()) return VAL_BOOLEAN;
2086316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum    if (t_info == internal_type_ptr<uint8_t>()) return VAL_BYTE;
2096316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum    if (t_info == internal_type_ptr<int32_t>()) return VAL_INTEGER;
2106316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum    if (t_info == internal_type_ptr<int64_t>()) return VAL_LONG;
2116316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum    if (t_info == internal_type_ptr<double>()) return VAL_DOUBLE;
2126316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum    if (t_info == internal_type_ptr<String16>()) return VAL_STRING;
2136316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum
2146316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum    if (t_info == internal_type_ptr<vector<bool>>()) return VAL_BOOLEANARRAY;
2156316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum    if (t_info == internal_type_ptr<vector<uint8_t>>()) return VAL_BYTEARRAY;
2166316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum    if (t_info == internal_type_ptr<vector<int32_t>>()) return VAL_INTARRAY;
2176316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum    if (t_info == internal_type_ptr<vector<int64_t>>()) return VAL_LONGARRAY;
2186316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum    if (t_info == internal_type_ptr<vector<double>>()) return VAL_DOUBLEARRAY;
2196316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum    if (t_info == internal_type_ptr<vector<String16>>()) return VAL_STRINGARRAY;
2206316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum
2216316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum    if (t_info == internal_type_ptr<Map>()) return VAL_MAP;
2226316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum    if (t_info == internal_type_ptr<PersistableBundle>()) return VAL_PERSISTABLEBUNDLE;
2236316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum
2246316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum    return VAL_NULL;
2256316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum}
2266316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum
2276316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum#ifdef LIBBINDER_VALUE_SUPPORTS_TYPE_INFO
2286316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaumconst std::type_info& Value::type() const
2296316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum{
2306316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum    return mContent != NULL
2316316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum        ? mContent->type()
2326316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum        : typeid(void);
2336316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum}
2346316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum#endif // ifdef LIBBINDER_VALUE_SUPPORTS_TYPE_INFO
2356316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum
2366316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum#define DEF_TYPE_ACCESSORS(T, TYPENAME)                      \
2376316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum    bool Value::is ## TYPENAME() const                       \
2386316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum    {                                                        \
2396316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum        return mContent                                      \
2406316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum            ? internal_type_ptr<T>() == mContent->type_ptr() \
2416316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum            : false;                                         \
2426316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum    }                                                        \
2436316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum    bool Value::get ## TYPENAME(T* out) const                \
2446316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum    {                                                        \
2456316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum        return mContent                                      \
2466316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum            ? mContent->get(out)                             \
2476316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum            : false;                                         \
2486316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum    }                                                        \
2496316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum    void Value::put ## TYPENAME(const T& in)                 \
2506316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum    {                                                        \
2516316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum        *this = in;                                          \
2526316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum    }                                                        \
2536316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum    Value& Value::operator=(const T& rhs)                    \
2546316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum    {                                                        \
2556316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum        delete mContent;                                     \
2566316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum        mContent = new Content< T >(rhs);                    \
2576316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum        return *this;                                        \
2586316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum    }                                                        \
2596316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum    Value::Value(const T& value)                             \
2606316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum        : mContent(new Content< T >(value))                  \
2616316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum    { }
2626316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum
2636316f5b8df30422b247c2bfd1a805dcd4069b54eRobert QuattlebaumDEF_TYPE_ACCESSORS(bool, Boolean)
2646316f5b8df30422b247c2bfd1a805dcd4069b54eRobert QuattlebaumDEF_TYPE_ACCESSORS(int8_t, Byte)
2656316f5b8df30422b247c2bfd1a805dcd4069b54eRobert QuattlebaumDEF_TYPE_ACCESSORS(int32_t, Int)
2666316f5b8df30422b247c2bfd1a805dcd4069b54eRobert QuattlebaumDEF_TYPE_ACCESSORS(int64_t, Long)
2676316f5b8df30422b247c2bfd1a805dcd4069b54eRobert QuattlebaumDEF_TYPE_ACCESSORS(double, Double)
2686316f5b8df30422b247c2bfd1a805dcd4069b54eRobert QuattlebaumDEF_TYPE_ACCESSORS(String16, String)
2696316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum
2706316f5b8df30422b247c2bfd1a805dcd4069b54eRobert QuattlebaumDEF_TYPE_ACCESSORS(std::vector<bool>, BooleanVector)
2716316f5b8df30422b247c2bfd1a805dcd4069b54eRobert QuattlebaumDEF_TYPE_ACCESSORS(std::vector<uint8_t>, ByteVector)
2726316f5b8df30422b247c2bfd1a805dcd4069b54eRobert QuattlebaumDEF_TYPE_ACCESSORS(std::vector<int32_t>, IntVector)
2736316f5b8df30422b247c2bfd1a805dcd4069b54eRobert QuattlebaumDEF_TYPE_ACCESSORS(std::vector<int64_t>, LongVector)
2746316f5b8df30422b247c2bfd1a805dcd4069b54eRobert QuattlebaumDEF_TYPE_ACCESSORS(std::vector<double>, DoubleVector)
2756316f5b8df30422b247c2bfd1a805dcd4069b54eRobert QuattlebaumDEF_TYPE_ACCESSORS(std::vector<String16>, StringVector)
2766316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum
2776316f5b8df30422b247c2bfd1a805dcd4069b54eRobert QuattlebaumDEF_TYPE_ACCESSORS(::android::binder::Map, Map)
2786316f5b8df30422b247c2bfd1a805dcd4069b54eRobert QuattlebaumDEF_TYPE_ACCESSORS(PersistableBundle, PersistableBundle)
2796316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum
2806316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaumbool Value::getString(String8* out) const
2816316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum{
2826316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum    String16 val;
2836316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum    bool ret = getString(&val);
2846316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum    if (ret) {
2856316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum        *out = String8(val);
2866316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum    }
2876316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum    return ret;
2886316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum}
2896316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum
2906316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaumbool Value::getString(::std::string* out) const
2916316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum{
2926316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum    String8 val;
2936316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum    bool ret = getString(&val);
2946316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum    if (ret) {
2956316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum        *out = val.string();
2966316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum    }
2976316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum    return ret;
2986316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum}
2996316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum
3006316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaumstatus_t Value::writeToParcel(Parcel* parcel) const
3016316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum{
3026316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum    // This implementation needs to be kept in sync with the writeValue
3036316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum    // implementation in frameworks/base/core/java/android/os/Parcel.java
3046316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum
3056316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum#define BEGIN_HANDLE_WRITE()                                                                      \
3066316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum    do {                                                                                          \
3076316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum        const void* t_info(mContent?mContent->type_ptr():NULL);                                   \
3086316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum        if (false) { }
3096316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum#define HANDLE_WRITE_TYPE(T, TYPEVAL, TYPEMETHOD)                                                 \
3106316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum    else if (t_info == internal_type_ptr<T>()) {                                                  \
3116316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum        RETURN_IF_FAILED(parcel->writeInt32(TYPEVAL));                                            \
3126316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum        RETURN_IF_FAILED(parcel->TYPEMETHOD(static_cast<const Content<T>*>(mContent)->mValue));   \
3136316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum    }
3146316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum#define HANDLE_WRITE_PARCELABLE(T, TYPEVAL)                                                       \
3156316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum    else if (t_info == internal_type_ptr<T>()) {                                                  \
3166316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum        RETURN_IF_FAILED(parcel->writeInt32(TYPEVAL));                                            \
3176316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum        RETURN_IF_FAILED(static_cast<const Content<T>*>(mContent)->mValue.writeToParcel(parcel)); \
3186316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum    }
3196316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum#define END_HANDLE_WRITE()                                                                        \
3206316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum        else {                                                                                    \
3216316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum            ALOGE("writeToParcel: Type not supported");                                           \
3226316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum            return BAD_TYPE;                                                                      \
3236316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum        }                                                                                         \
3246316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum    } while (false);
3256316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum
3266316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum    BEGIN_HANDLE_WRITE()
3276316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum
3286316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum    HANDLE_WRITE_TYPE(bool,     VAL_BOOLEAN, writeBool)
3296316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum    HANDLE_WRITE_TYPE(int8_t,   VAL_BYTE,    writeByte)
3306316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum    HANDLE_WRITE_TYPE(int8_t,   VAL_BYTE,    writeByte)
3316316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum    HANDLE_WRITE_TYPE(int32_t,  VAL_INTEGER, writeInt32)
3326316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum    HANDLE_WRITE_TYPE(int64_t,  VAL_LONG,    writeInt64)
3336316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum    HANDLE_WRITE_TYPE(double,   VAL_DOUBLE,  writeDouble)
3346316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum    HANDLE_WRITE_TYPE(String16, VAL_STRING,  writeString16)
3356316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum
3366316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum    HANDLE_WRITE_TYPE(vector<bool>,     VAL_BOOLEANARRAY, writeBoolVector)
3376316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum    HANDLE_WRITE_TYPE(vector<uint8_t>,  VAL_BYTEARRAY,    writeByteVector)
3386316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum    HANDLE_WRITE_TYPE(vector<int8_t>,   VAL_BYTEARRAY,    writeByteVector)
3396316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum    HANDLE_WRITE_TYPE(vector<int32_t>,  VAL_INTARRAY,     writeInt32Vector)
3406316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum    HANDLE_WRITE_TYPE(vector<int64_t>,  VAL_LONGARRAY,    writeInt64Vector)
3416316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum    HANDLE_WRITE_TYPE(vector<double>,   VAL_DOUBLEARRAY,  writeDoubleVector)
3426316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum    HANDLE_WRITE_TYPE(vector<String16>, VAL_STRINGARRAY,  writeString16Vector)
3436316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum
3446316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum    HANDLE_WRITE_PARCELABLE(PersistableBundle, VAL_PERSISTABLEBUNDLE)
3456316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum
3466316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum    END_HANDLE_WRITE()
3476316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum
3486316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum    return NO_ERROR;
3496316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum
3506316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum#undef BEGIN_HANDLE_WRITE
3516316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum#undef HANDLE_WRITE_TYPE
3526316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum#undef HANDLE_WRITE_PARCELABLE
3536316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum#undef END_HANDLE_WRITE
3546316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum}
3556316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum
3566316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaumstatus_t Value::readFromParcel(const Parcel* parcel)
3576316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum{
3586316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum    // This implementation needs to be kept in sync with the readValue
3596316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum    // implementation in frameworks/base/core/java/android/os/Parcel.javai
3606316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum
3616316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum#define BEGIN_HANDLE_READ()                                                                      \
3626316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum    switch(value_type) {                                                                         \
3636316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum        default:                                                                                 \
3646316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum            ALOGE("readFromParcel: Parcel type %d is not supported", value_type);                \
3656316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum            return BAD_TYPE;
3666316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum#define HANDLE_READ_TYPE(T, TYPEVAL, TYPEMETHOD)                                                 \
3676316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum        case TYPEVAL:                                                                            \
3686316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum            mContent = new Content<T>();                                                         \
3696316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum            RETURN_IF_FAILED(parcel->TYPEMETHOD(&static_cast<Content<T>*>(mContent)->mValue));   \
3706316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum            break;
3716316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum#define HANDLE_READ_PARCELABLE(T, TYPEVAL)                                                       \
3726316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum        case TYPEVAL:                                                                            \
3736316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum            mContent = new Content<T>();                                                         \
3746316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum            RETURN_IF_FAILED(static_cast<Content<T>*>(mContent)->mValue.readFromParcel(parcel)); \
3756316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum            break;
3766316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum#define END_HANDLE_READ()                                                                        \
3776316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum    }
3786316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum
3796316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum    int32_t value_type = VAL_NULL;
3806316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum
3816316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum    delete mContent;
3826316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum    mContent = NULL;
3836316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum
3846316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum    RETURN_IF_FAILED(parcel->readInt32(&value_type));
3856316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum
3866316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum    BEGIN_HANDLE_READ()
3876316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum
3886316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum    HANDLE_READ_TYPE(bool,     VAL_BOOLEAN, readBool)
3896316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum    HANDLE_READ_TYPE(int8_t,   VAL_BYTE,    readByte)
3906316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum    HANDLE_READ_TYPE(int32_t,  VAL_INTEGER, readInt32)
3916316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum    HANDLE_READ_TYPE(int64_t,  VAL_LONG,    readInt64)
3926316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum    HANDLE_READ_TYPE(double,   VAL_DOUBLE,  readDouble)
3936316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum    HANDLE_READ_TYPE(String16, VAL_STRING,  readString16)
3946316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum
3956316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum    HANDLE_READ_TYPE(vector<bool>,     VAL_BOOLEANARRAY, readBoolVector)
3966316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum    HANDLE_READ_TYPE(vector<uint8_t>,  VAL_BYTEARRAY,    readByteVector)
3976316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum    HANDLE_READ_TYPE(vector<int32_t>,  VAL_INTARRAY,     readInt32Vector)
3986316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum    HANDLE_READ_TYPE(vector<int64_t>,  VAL_LONGARRAY,    readInt64Vector)
3996316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum    HANDLE_READ_TYPE(vector<double>,   VAL_DOUBLEARRAY,  readDoubleVector)
4006316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum    HANDLE_READ_TYPE(vector<String16>, VAL_STRINGARRAY,  readString16Vector)
4016316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum
4026316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum    HANDLE_READ_PARCELABLE(PersistableBundle, VAL_PERSISTABLEBUNDLE)
4036316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum
4046316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum    END_HANDLE_READ()
4056316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum
4066316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum    return NO_ERROR;
4076316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum
4086316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum#undef BEGIN_HANDLE_READ
4096316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum#undef HANDLE_READ_TYPE
4106316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum#undef HANDLE_READ_PARCELABLE
4116316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum#undef END_HANDLE_READ
4126316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum}
4136316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum
4146316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum}  // namespace binder
4156316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum
4166316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum}  // namespace android
4176316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum
4186316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum/* vim: set ts=4 sw=4 tw=0 et :*/
419