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#ifndef ANDROID_VALUE_H 186316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum#define ANDROID_VALUE_H 196316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum 206316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum#include <stdint.h> 216316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum#include <map> 226316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum#include <set> 236316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum#include <vector> 246316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum#include <string> 256316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum 266316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum#include <binder/Parcelable.h> 276316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum#include <binder/PersistableBundle.h> 286316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum#include <binder/Map.h> 296316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum#include <utils/String8.h> 306316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum#include <utils/String16.h> 316316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum#include <utils/StrongPointer.h> 326316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum 336316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaumnamespace android { 346316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum 356316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaumclass Parcel; 366316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum 376316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaumnamespace binder { 386316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum 396316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum/** 406316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum * A limited C++ generic type. The purpose of this class is to allow C++ 416316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum * programs to make use of (or implement) Binder interfaces which make use 426316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum * the Java "Object" generic type (either via the use of the Map type or 436316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum * some other mechanism). 446316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum * 456316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum * This class only supports a limited set of types, but additional types 466316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum * may be easily added to this class in the future as needed---without 476316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum * breaking binary compatability. 486316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum * 496316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum * This class was written in such a way as to help avoid type errors by 506316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum * giving each type their own explicity-named accessor methods (rather than 516316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum * overloaded methods). 526316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum * 536316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum * When reading or writing this class to a Parcel, use the `writeValue()` 546316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum * and `readValue()` methods. 556316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum */ 566316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaumclass Value { 576316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaumpublic: 586316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum Value(); 596316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum virtual ~Value(); 606316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum 616316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum Value& swap(Value &); 626316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum 636316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum bool empty() const; 646316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum 656316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum void clear(); 666316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum 676316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum#ifdef LIBBINDER_VALUE_SUPPORTS_TYPE_INFO 686316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum const std::type_info& type() const; 696316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum#endif 706316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum 716316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum int32_t parcelType() const; 726316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum 736316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum bool operator==(const Value& rhs) const; 746316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum bool operator!=(const Value& rhs) const { return !this->operator==(rhs); } 756316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum 766316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum Value(const Value& value); 776316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum Value(const bool& value); 786316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum Value(const int8_t& value); 796316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum Value(const int32_t& value); 806316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum Value(const int64_t& value); 816316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum Value(const double& value); 826316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum Value(const String16& value); 836316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum Value(const std::vector<bool>& value); 846316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum Value(const std::vector<uint8_t>& value); 856316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum Value(const std::vector<int32_t>& value); 866316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum Value(const std::vector<int64_t>& value); 876316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum Value(const std::vector<double>& value); 886316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum Value(const std::vector<String16>& value); 896316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum Value(const os::PersistableBundle& value); 906316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum Value(const binder::Map& value); 916316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum 926316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum Value& operator=(const Value& rhs); 936316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum Value& operator=(const int8_t& rhs); 946316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum Value& operator=(const bool& rhs); 956316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum Value& operator=(const int32_t& rhs); 966316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum Value& operator=(const int64_t& rhs); 976316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum Value& operator=(const double& rhs); 986316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum Value& operator=(const String16& rhs); 996316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum Value& operator=(const std::vector<bool>& rhs); 1006316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum Value& operator=(const std::vector<uint8_t>& rhs); 1016316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum Value& operator=(const std::vector<int32_t>& rhs); 1026316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum Value& operator=(const std::vector<int64_t>& rhs); 1036316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum Value& operator=(const std::vector<double>& rhs); 1046316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum Value& operator=(const std::vector<String16>& rhs); 1056316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum Value& operator=(const os::PersistableBundle& rhs); 1066316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum Value& operator=(const binder::Map& rhs); 1076316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum 1086316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum void putBoolean(const bool& value); 1096316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum void putByte(const int8_t& value); 1106316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum void putInt(const int32_t& value); 1116316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum void putLong(const int64_t& value); 1126316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum void putDouble(const double& value); 1136316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum void putString(const String16& value); 1146316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum void putBooleanVector(const std::vector<bool>& value); 1156316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum void putByteVector(const std::vector<uint8_t>& value); 1166316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum void putIntVector(const std::vector<int32_t>& value); 1176316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum void putLongVector(const std::vector<int64_t>& value); 1186316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum void putDoubleVector(const std::vector<double>& value); 1196316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum void putStringVector(const std::vector<String16>& value); 1206316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum void putPersistableBundle(const os::PersistableBundle& value); 1216316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum void putMap(const binder::Map& value); 1226316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum 1236316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum bool getBoolean(bool* out) const; 1246316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum bool getByte(int8_t* out) const; 1256316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum bool getInt(int32_t* out) const; 1266316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum bool getLong(int64_t* out) const; 1276316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum bool getDouble(double* out) const; 1286316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum bool getString(String16* out) const; 1296316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum bool getBooleanVector(std::vector<bool>* out) const; 1306316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum bool getByteVector(std::vector<uint8_t>* out) const; 1316316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum bool getIntVector(std::vector<int32_t>* out) const; 1326316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum bool getLongVector(std::vector<int64_t>* out) const; 1336316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum bool getDoubleVector(std::vector<double>* out) const; 1346316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum bool getStringVector(std::vector<String16>* out) const; 1356316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum bool getPersistableBundle(os::PersistableBundle* out) const; 1366316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum bool getMap(binder::Map* out) const; 1376316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum 1386316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum bool isBoolean() const; 1396316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum bool isByte() const; 1406316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum bool isInt() const; 1416316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum bool isLong() const; 1426316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum bool isDouble() const; 1436316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum bool isString() const; 1446316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum bool isBooleanVector() const; 1456316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum bool isByteVector() const; 1466316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum bool isIntVector() const; 1476316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum bool isLongVector() const; 1486316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum bool isDoubleVector() const; 1496316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum bool isStringVector() const; 1506316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum bool isPersistableBundle() const; 1516316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum bool isMap() const; 1526316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum 1536316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum // String Convenience Adapters 1546316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum // --------------------------- 1556316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum 1566316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum Value(const String8& value): Value(String16(value)) { } 1576316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum Value(const ::std::string& value): Value(String8(value.c_str())) { } 1586316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum void putString(const String8& value) { return putString(String16(value)); } 1596316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum void putString(const ::std::string& value) { return putString(String8(value.c_str())); } 1606316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum Value& operator=(const String8& rhs) { return *this = String16(rhs); } 1616316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum Value& operator=(const ::std::string& rhs) { return *this = String8(rhs.c_str()); } 1626316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum bool getString(String8* out) const; 1636316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum bool getString(::std::string* out) const; 1646316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum 1656316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaumprivate: 1666316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum 1676316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum // This allows ::android::Parcel to call the two methods below. 1686316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum friend class ::android::Parcel; 1696316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum 1706316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum // This is called by ::android::Parcel::writeValue() 1716316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum status_t writeToParcel(Parcel* parcel) const; 1726316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum 1736316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum // This is called by ::android::Parcel::readValue() 1746316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum status_t readFromParcel(const Parcel* parcel); 1756316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum 1766316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum template<typename T> class Content; 1776316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum class ContentBase; 1786316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum 1796316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum ContentBase* mContent; 1806316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum}; 1816316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum 1826316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum} // namespace binder 1836316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum 1846316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum} // namespace android 1856316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum 1866316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum#endif // ANDROID_VALUE_H 187