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*)▮ 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