10a31202370581a91b3425e7b60757268d0f6b539Samuel Tan/* 20a31202370581a91b3425e7b60757268d0f6b539Samuel Tan * Copyright (C) 2015 The Android Open Source Project 30a31202370581a91b3425e7b60757268d0f6b539Samuel Tan * 40a31202370581a91b3425e7b60757268d0f6b539Samuel Tan * Licensed under the Apache License, Version 2.0 (the "License"); 50a31202370581a91b3425e7b60757268d0f6b539Samuel Tan * you may not use this file except in compliance with the License. 60a31202370581a91b3425e7b60757268d0f6b539Samuel Tan * You may obtain a copy of the License at 70a31202370581a91b3425e7b60757268d0f6b539Samuel Tan * 80a31202370581a91b3425e7b60757268d0f6b539Samuel Tan * http://www.apache.org/licenses/LICENSE-2.0 90a31202370581a91b3425e7b60757268d0f6b539Samuel Tan * 100a31202370581a91b3425e7b60757268d0f6b539Samuel Tan * Unless required by applicable law or agreed to in writing, software 110a31202370581a91b3425e7b60757268d0f6b539Samuel Tan * distributed under the License is distributed on an "AS IS" BASIS, 120a31202370581a91b3425e7b60757268d0f6b539Samuel Tan * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 130a31202370581a91b3425e7b60757268d0f6b539Samuel Tan * See the License for the specific language governing permissions and 140a31202370581a91b3425e7b60757268d0f6b539Samuel Tan * limitations under the License. 150a31202370581a91b3425e7b60757268d0f6b539Samuel Tan */ 160a31202370581a91b3425e7b60757268d0f6b539Samuel Tan 170a31202370581a91b3425e7b60757268d0f6b539Samuel Tan#define LOG_TAG "PersistableBundle" 180a31202370581a91b3425e7b60757268d0f6b539Samuel Tan 190a31202370581a91b3425e7b60757268d0f6b539Samuel Tan#include <binder/PersistableBundle.h> 206316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum#include <private/binder/ParcelValTypes.h> 210a31202370581a91b3425e7b60757268d0f6b539Samuel Tan 220a31202370581a91b3425e7b60757268d0f6b539Samuel Tan#include <limits> 230a31202370581a91b3425e7b60757268d0f6b539Samuel Tan 240a31202370581a91b3425e7b60757268d0f6b539Samuel Tan#include <binder/IBinder.h> 250a31202370581a91b3425e7b60757268d0f6b539Samuel Tan#include <binder/Parcel.h> 267823e124e00576e20e47ec717cbe8bc89f0f2bf2Mark Salyzyn#include <log/log.h> 270a31202370581a91b3425e7b60757268d0f6b539Samuel Tan#include <utils/Errors.h> 280a31202370581a91b3425e7b60757268d0f6b539Samuel Tan 290a31202370581a91b3425e7b60757268d0f6b539Samuel Tanusing android::BAD_TYPE; 300a31202370581a91b3425e7b60757268d0f6b539Samuel Tanusing android::BAD_VALUE; 310a31202370581a91b3425e7b60757268d0f6b539Samuel Tanusing android::NO_ERROR; 320a31202370581a91b3425e7b60757268d0f6b539Samuel Tanusing android::Parcel; 330a31202370581a91b3425e7b60757268d0f6b539Samuel Tanusing android::sp; 340a31202370581a91b3425e7b60757268d0f6b539Samuel Tanusing android::status_t; 350a31202370581a91b3425e7b60757268d0f6b539Samuel Tanusing android::UNEXPECTED_NULL; 3652545f2e3c9f942f59b416ba63e1b6068700d783Samuel Tanusing std::map; 3752545f2e3c9f942f59b416ba63e1b6068700d783Samuel Tanusing std::set; 3852545f2e3c9f942f59b416ba63e1b6068700d783Samuel Tanusing std::vector; 396316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaumusing namespace ::android::binder; 400a31202370581a91b3425e7b60757268d0f6b539Samuel Tan 410a31202370581a91b3425e7b60757268d0f6b539Samuel Tanenum { 420a31202370581a91b3425e7b60757268d0f6b539Samuel Tan // Keep in sync with BUNDLE_MAGIC in frameworks/base/core/java/android/os/BaseBundle.java. 430a31202370581a91b3425e7b60757268d0f6b539Samuel Tan BUNDLE_MAGIC = 0x4C444E42, 440a31202370581a91b3425e7b60757268d0f6b539Samuel Tan}; 450a31202370581a91b3425e7b60757268d0f6b539Samuel Tan 460a31202370581a91b3425e7b60757268d0f6b539Samuel Tannamespace { 470a31202370581a91b3425e7b60757268d0f6b539Samuel Tantemplate <typename T> 4852545f2e3c9f942f59b416ba63e1b6068700d783Samuel Tanbool getValue(const android::String16& key, T* out, const map<android::String16, T>& map) { 490a31202370581a91b3425e7b60757268d0f6b539Samuel Tan const auto& it = map.find(key); 500a31202370581a91b3425e7b60757268d0f6b539Samuel Tan if (it == map.end()) return false; 510a31202370581a91b3425e7b60757268d0f6b539Samuel Tan *out = it->second; 520a31202370581a91b3425e7b60757268d0f6b539Samuel Tan return true; 530a31202370581a91b3425e7b60757268d0f6b539Samuel Tan} 5452545f2e3c9f942f59b416ba63e1b6068700d783Samuel Tan 5552545f2e3c9f942f59b416ba63e1b6068700d783Samuel Tantemplate <typename T> 5652545f2e3c9f942f59b416ba63e1b6068700d783Samuel Tanset<android::String16> getKeys(const map<android::String16, T>& map) { 5752545f2e3c9f942f59b416ba63e1b6068700d783Samuel Tan if (map.empty()) return set<android::String16>(); 5852545f2e3c9f942f59b416ba63e1b6068700d783Samuel Tan set<android::String16> keys; 5952545f2e3c9f942f59b416ba63e1b6068700d783Samuel Tan for (const auto& key_value_pair : map) { 6052545f2e3c9f942f59b416ba63e1b6068700d783Samuel Tan keys.emplace(key_value_pair.first); 6152545f2e3c9f942f59b416ba63e1b6068700d783Samuel Tan } 6252545f2e3c9f942f59b416ba63e1b6068700d783Samuel Tan return keys; 6352545f2e3c9f942f59b416ba63e1b6068700d783Samuel Tan} 640a31202370581a91b3425e7b60757268d0f6b539Samuel Tan} // namespace 650a31202370581a91b3425e7b60757268d0f6b539Samuel Tan 660a31202370581a91b3425e7b60757268d0f6b539Samuel Tannamespace android { 670a31202370581a91b3425e7b60757268d0f6b539Samuel Tan 680a31202370581a91b3425e7b60757268d0f6b539Samuel Tannamespace os { 690a31202370581a91b3425e7b60757268d0f6b539Samuel Tan 700a31202370581a91b3425e7b60757268d0f6b539Samuel Tan#define RETURN_IF_FAILED(calledOnce) \ 710a31202370581a91b3425e7b60757268d0f6b539Samuel Tan { \ 720a31202370581a91b3425e7b60757268d0f6b539Samuel Tan status_t returnStatus = calledOnce; \ 730a31202370581a91b3425e7b60757268d0f6b539Samuel Tan if (returnStatus) { \ 740a31202370581a91b3425e7b60757268d0f6b539Samuel Tan ALOGE("Failed at %s:%d (%s)", __FILE__, __LINE__, __func__); \ 750a31202370581a91b3425e7b60757268d0f6b539Samuel Tan return returnStatus; \ 760a31202370581a91b3425e7b60757268d0f6b539Samuel Tan } \ 770a31202370581a91b3425e7b60757268d0f6b539Samuel Tan } 780a31202370581a91b3425e7b60757268d0f6b539Samuel Tan 790a31202370581a91b3425e7b60757268d0f6b539Samuel Tan#define RETURN_IF_ENTRY_ERASED(map, key) \ 800a31202370581a91b3425e7b60757268d0f6b539Samuel Tan { \ 818f6b9b34783357180f100b0a312c264713a7dd70Chih-Hung Hsieh size_t num_erased = (map).erase(key); \ 820a31202370581a91b3425e7b60757268d0f6b539Samuel Tan if (num_erased) { \ 830a31202370581a91b3425e7b60757268d0f6b539Samuel Tan ALOGE("Failed at %s:%d (%s)", __FILE__, __LINE__, __func__); \ 840a31202370581a91b3425e7b60757268d0f6b539Samuel Tan return num_erased; \ 850a31202370581a91b3425e7b60757268d0f6b539Samuel Tan } \ 860a31202370581a91b3425e7b60757268d0f6b539Samuel Tan } 870a31202370581a91b3425e7b60757268d0f6b539Samuel Tan 880a31202370581a91b3425e7b60757268d0f6b539Samuel Tanstatus_t PersistableBundle::writeToParcel(Parcel* parcel) const { 890a31202370581a91b3425e7b60757268d0f6b539Samuel Tan /* 900a31202370581a91b3425e7b60757268d0f6b539Samuel Tan * Keep implementation in sync with writeToParcelInner() in 910a31202370581a91b3425e7b60757268d0f6b539Samuel Tan * frameworks/base/core/java/android/os/BaseBundle.java. 920a31202370581a91b3425e7b60757268d0f6b539Samuel Tan */ 930a31202370581a91b3425e7b60757268d0f6b539Samuel Tan 940a31202370581a91b3425e7b60757268d0f6b539Samuel Tan // Special case for empty bundles. 950a31202370581a91b3425e7b60757268d0f6b539Samuel Tan if (empty()) { 960a31202370581a91b3425e7b60757268d0f6b539Samuel Tan RETURN_IF_FAILED(parcel->writeInt32(0)); 970a31202370581a91b3425e7b60757268d0f6b539Samuel Tan return NO_ERROR; 980a31202370581a91b3425e7b60757268d0f6b539Samuel Tan } 990a31202370581a91b3425e7b60757268d0f6b539Samuel Tan 1000a31202370581a91b3425e7b60757268d0f6b539Samuel Tan size_t length_pos = parcel->dataPosition(); 1010a31202370581a91b3425e7b60757268d0f6b539Samuel Tan RETURN_IF_FAILED(parcel->writeInt32(1)); // dummy, will hold length 1020a31202370581a91b3425e7b60757268d0f6b539Samuel Tan RETURN_IF_FAILED(parcel->writeInt32(BUNDLE_MAGIC)); 1030a31202370581a91b3425e7b60757268d0f6b539Samuel Tan 1040a31202370581a91b3425e7b60757268d0f6b539Samuel Tan size_t start_pos = parcel->dataPosition(); 1050a31202370581a91b3425e7b60757268d0f6b539Samuel Tan RETURN_IF_FAILED(writeToParcelInner(parcel)); 1060a31202370581a91b3425e7b60757268d0f6b539Samuel Tan size_t end_pos = parcel->dataPosition(); 1070a31202370581a91b3425e7b60757268d0f6b539Samuel Tan 1080a31202370581a91b3425e7b60757268d0f6b539Samuel Tan // Backpatch length. This length value includes the length header. 1090a31202370581a91b3425e7b60757268d0f6b539Samuel Tan parcel->setDataPosition(length_pos); 1100a31202370581a91b3425e7b60757268d0f6b539Samuel Tan size_t length = end_pos - start_pos; 1110a31202370581a91b3425e7b60757268d0f6b539Samuel Tan if (length > std::numeric_limits<int32_t>::max()) { 112715dec70e0d3b61679ddac3355e567a787b66f69Samuel Tan ALOGE("Parcel length (%zu) too large to store in 32-bit signed int", length); 1130a31202370581a91b3425e7b60757268d0f6b539Samuel Tan return BAD_VALUE; 1140a31202370581a91b3425e7b60757268d0f6b539Samuel Tan } 1150a31202370581a91b3425e7b60757268d0f6b539Samuel Tan RETURN_IF_FAILED(parcel->writeInt32(static_cast<int32_t>(length))); 1160a31202370581a91b3425e7b60757268d0f6b539Samuel Tan parcel->setDataPosition(end_pos); 1170a31202370581a91b3425e7b60757268d0f6b539Samuel Tan return NO_ERROR; 1180a31202370581a91b3425e7b60757268d0f6b539Samuel Tan} 1190a31202370581a91b3425e7b60757268d0f6b539Samuel Tan 1200a31202370581a91b3425e7b60757268d0f6b539Samuel Tanstatus_t PersistableBundle::readFromParcel(const Parcel* parcel) { 1210a31202370581a91b3425e7b60757268d0f6b539Samuel Tan /* 1220a31202370581a91b3425e7b60757268d0f6b539Samuel Tan * Keep implementation in sync with readFromParcelInner() in 1230a31202370581a91b3425e7b60757268d0f6b539Samuel Tan * frameworks/base/core/java/android/os/BaseBundle.java. 1240a31202370581a91b3425e7b60757268d0f6b539Samuel Tan */ 1250a31202370581a91b3425e7b60757268d0f6b539Samuel Tan int32_t length = parcel->readInt32(); 1260a31202370581a91b3425e7b60757268d0f6b539Samuel Tan if (length < 0) { 1270a31202370581a91b3425e7b60757268d0f6b539Samuel Tan ALOGE("Bad length in parcel: %d", length); 1280a31202370581a91b3425e7b60757268d0f6b539Samuel Tan return UNEXPECTED_NULL; 1290a31202370581a91b3425e7b60757268d0f6b539Samuel Tan } 1300a31202370581a91b3425e7b60757268d0f6b539Samuel Tan 1310a31202370581a91b3425e7b60757268d0f6b539Samuel Tan return readFromParcelInner(parcel, static_cast<size_t>(length)); 1320a31202370581a91b3425e7b60757268d0f6b539Samuel Tan} 1330a31202370581a91b3425e7b60757268d0f6b539Samuel Tan 1340a31202370581a91b3425e7b60757268d0f6b539Samuel Tanbool PersistableBundle::empty() const { 1350a31202370581a91b3425e7b60757268d0f6b539Samuel Tan return size() == 0u; 1360a31202370581a91b3425e7b60757268d0f6b539Samuel Tan} 1370a31202370581a91b3425e7b60757268d0f6b539Samuel Tan 1380a31202370581a91b3425e7b60757268d0f6b539Samuel Tansize_t PersistableBundle::size() const { 1390a31202370581a91b3425e7b60757268d0f6b539Samuel Tan return (mBoolMap.size() + 1400a31202370581a91b3425e7b60757268d0f6b539Samuel Tan mIntMap.size() + 1410a31202370581a91b3425e7b60757268d0f6b539Samuel Tan mLongMap.size() + 1420a31202370581a91b3425e7b60757268d0f6b539Samuel Tan mDoubleMap.size() + 1430a31202370581a91b3425e7b60757268d0f6b539Samuel Tan mStringMap.size() + 1440a31202370581a91b3425e7b60757268d0f6b539Samuel Tan mBoolVectorMap.size() + 1450a31202370581a91b3425e7b60757268d0f6b539Samuel Tan mIntVectorMap.size() + 1460a31202370581a91b3425e7b60757268d0f6b539Samuel Tan mLongVectorMap.size() + 1470a31202370581a91b3425e7b60757268d0f6b539Samuel Tan mDoubleVectorMap.size() + 1480a31202370581a91b3425e7b60757268d0f6b539Samuel Tan mStringVectorMap.size() + 1490a31202370581a91b3425e7b60757268d0f6b539Samuel Tan mPersistableBundleMap.size()); 1500a31202370581a91b3425e7b60757268d0f6b539Samuel Tan} 1510a31202370581a91b3425e7b60757268d0f6b539Samuel Tan 1520a31202370581a91b3425e7b60757268d0f6b539Samuel Tansize_t PersistableBundle::erase(const String16& key) { 1530a31202370581a91b3425e7b60757268d0f6b539Samuel Tan RETURN_IF_ENTRY_ERASED(mBoolMap, key); 1540a31202370581a91b3425e7b60757268d0f6b539Samuel Tan RETURN_IF_ENTRY_ERASED(mIntMap, key); 1550a31202370581a91b3425e7b60757268d0f6b539Samuel Tan RETURN_IF_ENTRY_ERASED(mLongMap, key); 1560a31202370581a91b3425e7b60757268d0f6b539Samuel Tan RETURN_IF_ENTRY_ERASED(mDoubleMap, key); 1570a31202370581a91b3425e7b60757268d0f6b539Samuel Tan RETURN_IF_ENTRY_ERASED(mStringMap, key); 1580a31202370581a91b3425e7b60757268d0f6b539Samuel Tan RETURN_IF_ENTRY_ERASED(mBoolVectorMap, key); 1590a31202370581a91b3425e7b60757268d0f6b539Samuel Tan RETURN_IF_ENTRY_ERASED(mIntVectorMap, key); 1600a31202370581a91b3425e7b60757268d0f6b539Samuel Tan RETURN_IF_ENTRY_ERASED(mLongVectorMap, key); 1610a31202370581a91b3425e7b60757268d0f6b539Samuel Tan RETURN_IF_ENTRY_ERASED(mDoubleVectorMap, key); 1620a31202370581a91b3425e7b60757268d0f6b539Samuel Tan RETURN_IF_ENTRY_ERASED(mStringVectorMap, key); 1630a31202370581a91b3425e7b60757268d0f6b539Samuel Tan return mPersistableBundleMap.erase(key); 1640a31202370581a91b3425e7b60757268d0f6b539Samuel Tan} 1650a31202370581a91b3425e7b60757268d0f6b539Samuel Tan 1660a31202370581a91b3425e7b60757268d0f6b539Samuel Tanvoid PersistableBundle::putBoolean(const String16& key, bool value) { 1670a31202370581a91b3425e7b60757268d0f6b539Samuel Tan erase(key); 1680a31202370581a91b3425e7b60757268d0f6b539Samuel Tan mBoolMap[key] = value; 1690a31202370581a91b3425e7b60757268d0f6b539Samuel Tan} 1700a31202370581a91b3425e7b60757268d0f6b539Samuel Tan 1710a31202370581a91b3425e7b60757268d0f6b539Samuel Tanvoid PersistableBundle::putInt(const String16& key, int32_t value) { 1720a31202370581a91b3425e7b60757268d0f6b539Samuel Tan erase(key); 1730a31202370581a91b3425e7b60757268d0f6b539Samuel Tan mIntMap[key] = value; 1740a31202370581a91b3425e7b60757268d0f6b539Samuel Tan} 1750a31202370581a91b3425e7b60757268d0f6b539Samuel Tan 1760a31202370581a91b3425e7b60757268d0f6b539Samuel Tanvoid PersistableBundle::putLong(const String16& key, int64_t value) { 1770a31202370581a91b3425e7b60757268d0f6b539Samuel Tan erase(key); 1780a31202370581a91b3425e7b60757268d0f6b539Samuel Tan mLongMap[key] = value; 1790a31202370581a91b3425e7b60757268d0f6b539Samuel Tan} 1800a31202370581a91b3425e7b60757268d0f6b539Samuel Tan 1810a31202370581a91b3425e7b60757268d0f6b539Samuel Tanvoid PersistableBundle::putDouble(const String16& key, double value) { 1820a31202370581a91b3425e7b60757268d0f6b539Samuel Tan erase(key); 1830a31202370581a91b3425e7b60757268d0f6b539Samuel Tan mDoubleMap[key] = value; 1840a31202370581a91b3425e7b60757268d0f6b539Samuel Tan} 1850a31202370581a91b3425e7b60757268d0f6b539Samuel Tan 1860a31202370581a91b3425e7b60757268d0f6b539Samuel Tanvoid PersistableBundle::putString(const String16& key, const String16& value) { 1870a31202370581a91b3425e7b60757268d0f6b539Samuel Tan erase(key); 1880a31202370581a91b3425e7b60757268d0f6b539Samuel Tan mStringMap[key] = value; 1890a31202370581a91b3425e7b60757268d0f6b539Samuel Tan} 1900a31202370581a91b3425e7b60757268d0f6b539Samuel Tan 19152545f2e3c9f942f59b416ba63e1b6068700d783Samuel Tanvoid PersistableBundle::putBooleanVector(const String16& key, const vector<bool>& value) { 1920a31202370581a91b3425e7b60757268d0f6b539Samuel Tan erase(key); 1930a31202370581a91b3425e7b60757268d0f6b539Samuel Tan mBoolVectorMap[key] = value; 1940a31202370581a91b3425e7b60757268d0f6b539Samuel Tan} 1950a31202370581a91b3425e7b60757268d0f6b539Samuel Tan 19652545f2e3c9f942f59b416ba63e1b6068700d783Samuel Tanvoid PersistableBundle::putIntVector(const String16& key, const vector<int32_t>& value) { 1970a31202370581a91b3425e7b60757268d0f6b539Samuel Tan erase(key); 1980a31202370581a91b3425e7b60757268d0f6b539Samuel Tan mIntVectorMap[key] = value; 1990a31202370581a91b3425e7b60757268d0f6b539Samuel Tan} 2000a31202370581a91b3425e7b60757268d0f6b539Samuel Tan 20152545f2e3c9f942f59b416ba63e1b6068700d783Samuel Tanvoid PersistableBundle::putLongVector(const String16& key, const vector<int64_t>& value) { 2020a31202370581a91b3425e7b60757268d0f6b539Samuel Tan erase(key); 2030a31202370581a91b3425e7b60757268d0f6b539Samuel Tan mLongVectorMap[key] = value; 2040a31202370581a91b3425e7b60757268d0f6b539Samuel Tan} 2050a31202370581a91b3425e7b60757268d0f6b539Samuel Tan 20652545f2e3c9f942f59b416ba63e1b6068700d783Samuel Tanvoid PersistableBundle::putDoubleVector(const String16& key, const vector<double>& value) { 2070a31202370581a91b3425e7b60757268d0f6b539Samuel Tan erase(key); 2080a31202370581a91b3425e7b60757268d0f6b539Samuel Tan mDoubleVectorMap[key] = value; 2090a31202370581a91b3425e7b60757268d0f6b539Samuel Tan} 2100a31202370581a91b3425e7b60757268d0f6b539Samuel Tan 21152545f2e3c9f942f59b416ba63e1b6068700d783Samuel Tanvoid PersistableBundle::putStringVector(const String16& key, const vector<String16>& value) { 2120a31202370581a91b3425e7b60757268d0f6b539Samuel Tan erase(key); 2130a31202370581a91b3425e7b60757268d0f6b539Samuel Tan mStringVectorMap[key] = value; 2140a31202370581a91b3425e7b60757268d0f6b539Samuel Tan} 2150a31202370581a91b3425e7b60757268d0f6b539Samuel Tan 2160a31202370581a91b3425e7b60757268d0f6b539Samuel Tanvoid PersistableBundle::putPersistableBundle(const String16& key, const PersistableBundle& value) { 2170a31202370581a91b3425e7b60757268d0f6b539Samuel Tan erase(key); 2180a31202370581a91b3425e7b60757268d0f6b539Samuel Tan mPersistableBundleMap[key] = value; 2190a31202370581a91b3425e7b60757268d0f6b539Samuel Tan} 2200a31202370581a91b3425e7b60757268d0f6b539Samuel Tan 2210a31202370581a91b3425e7b60757268d0f6b539Samuel Tanbool PersistableBundle::getBoolean(const String16& key, bool* out) const { 2220a31202370581a91b3425e7b60757268d0f6b539Samuel Tan return getValue(key, out, mBoolMap); 2230a31202370581a91b3425e7b60757268d0f6b539Samuel Tan} 2240a31202370581a91b3425e7b60757268d0f6b539Samuel Tan 2250a31202370581a91b3425e7b60757268d0f6b539Samuel Tanbool PersistableBundle::getInt(const String16& key, int32_t* out) const { 2260a31202370581a91b3425e7b60757268d0f6b539Samuel Tan return getValue(key, out, mIntMap); 2270a31202370581a91b3425e7b60757268d0f6b539Samuel Tan} 2280a31202370581a91b3425e7b60757268d0f6b539Samuel Tan 2290a31202370581a91b3425e7b60757268d0f6b539Samuel Tanbool PersistableBundle::getLong(const String16& key, int64_t* out) const { 2300a31202370581a91b3425e7b60757268d0f6b539Samuel Tan return getValue(key, out, mLongMap); 2310a31202370581a91b3425e7b60757268d0f6b539Samuel Tan} 2320a31202370581a91b3425e7b60757268d0f6b539Samuel Tan 2330a31202370581a91b3425e7b60757268d0f6b539Samuel Tanbool PersistableBundle::getDouble(const String16& key, double* out) const { 2340a31202370581a91b3425e7b60757268d0f6b539Samuel Tan return getValue(key, out, mDoubleMap); 2350a31202370581a91b3425e7b60757268d0f6b539Samuel Tan} 2360a31202370581a91b3425e7b60757268d0f6b539Samuel Tan 2370a31202370581a91b3425e7b60757268d0f6b539Samuel Tanbool PersistableBundle::getString(const String16& key, String16* out) const { 2380a31202370581a91b3425e7b60757268d0f6b539Samuel Tan return getValue(key, out, mStringMap); 2390a31202370581a91b3425e7b60757268d0f6b539Samuel Tan} 2400a31202370581a91b3425e7b60757268d0f6b539Samuel Tan 24152545f2e3c9f942f59b416ba63e1b6068700d783Samuel Tanbool PersistableBundle::getBooleanVector(const String16& key, vector<bool>* out) const { 2420a31202370581a91b3425e7b60757268d0f6b539Samuel Tan return getValue(key, out, mBoolVectorMap); 2430a31202370581a91b3425e7b60757268d0f6b539Samuel Tan} 2440a31202370581a91b3425e7b60757268d0f6b539Samuel Tan 24552545f2e3c9f942f59b416ba63e1b6068700d783Samuel Tanbool PersistableBundle::getIntVector(const String16& key, vector<int32_t>* out) const { 2460a31202370581a91b3425e7b60757268d0f6b539Samuel Tan return getValue(key, out, mIntVectorMap); 2470a31202370581a91b3425e7b60757268d0f6b539Samuel Tan} 2480a31202370581a91b3425e7b60757268d0f6b539Samuel Tan 24952545f2e3c9f942f59b416ba63e1b6068700d783Samuel Tanbool PersistableBundle::getLongVector(const String16& key, vector<int64_t>* out) const { 2500a31202370581a91b3425e7b60757268d0f6b539Samuel Tan return getValue(key, out, mLongVectorMap); 2510a31202370581a91b3425e7b60757268d0f6b539Samuel Tan} 2520a31202370581a91b3425e7b60757268d0f6b539Samuel Tan 25352545f2e3c9f942f59b416ba63e1b6068700d783Samuel Tanbool PersistableBundle::getDoubleVector(const String16& key, vector<double>* out) const { 2540a31202370581a91b3425e7b60757268d0f6b539Samuel Tan return getValue(key, out, mDoubleVectorMap); 2550a31202370581a91b3425e7b60757268d0f6b539Samuel Tan} 2560a31202370581a91b3425e7b60757268d0f6b539Samuel Tan 25752545f2e3c9f942f59b416ba63e1b6068700d783Samuel Tanbool PersistableBundle::getStringVector(const String16& key, vector<String16>* out) const { 2580a31202370581a91b3425e7b60757268d0f6b539Samuel Tan return getValue(key, out, mStringVectorMap); 2590a31202370581a91b3425e7b60757268d0f6b539Samuel Tan} 2600a31202370581a91b3425e7b60757268d0f6b539Samuel Tan 2610a31202370581a91b3425e7b60757268d0f6b539Samuel Tanbool PersistableBundle::getPersistableBundle(const String16& key, PersistableBundle* out) const { 2620a31202370581a91b3425e7b60757268d0f6b539Samuel Tan return getValue(key, out, mPersistableBundleMap); 2630a31202370581a91b3425e7b60757268d0f6b539Samuel Tan} 2640a31202370581a91b3425e7b60757268d0f6b539Samuel Tan 26552545f2e3c9f942f59b416ba63e1b6068700d783Samuel Tanset<String16> PersistableBundle::getBooleanKeys() const { 26652545f2e3c9f942f59b416ba63e1b6068700d783Samuel Tan return getKeys(mBoolMap); 26752545f2e3c9f942f59b416ba63e1b6068700d783Samuel Tan} 26852545f2e3c9f942f59b416ba63e1b6068700d783Samuel Tan 26952545f2e3c9f942f59b416ba63e1b6068700d783Samuel Tanset<String16> PersistableBundle::getIntKeys() const { 27052545f2e3c9f942f59b416ba63e1b6068700d783Samuel Tan return getKeys(mIntMap); 27152545f2e3c9f942f59b416ba63e1b6068700d783Samuel Tan} 27252545f2e3c9f942f59b416ba63e1b6068700d783Samuel Tan 27352545f2e3c9f942f59b416ba63e1b6068700d783Samuel Tanset<String16> PersistableBundle::getLongKeys() const { 27452545f2e3c9f942f59b416ba63e1b6068700d783Samuel Tan return getKeys(mLongMap); 27552545f2e3c9f942f59b416ba63e1b6068700d783Samuel Tan} 27652545f2e3c9f942f59b416ba63e1b6068700d783Samuel Tan 27752545f2e3c9f942f59b416ba63e1b6068700d783Samuel Tanset<String16> PersistableBundle::getDoubleKeys() const { 27852545f2e3c9f942f59b416ba63e1b6068700d783Samuel Tan return getKeys(mDoubleMap); 27952545f2e3c9f942f59b416ba63e1b6068700d783Samuel Tan} 28052545f2e3c9f942f59b416ba63e1b6068700d783Samuel Tan 28152545f2e3c9f942f59b416ba63e1b6068700d783Samuel Tanset<String16> PersistableBundle::getStringKeys() const { 28252545f2e3c9f942f59b416ba63e1b6068700d783Samuel Tan return getKeys(mStringMap); 28352545f2e3c9f942f59b416ba63e1b6068700d783Samuel Tan} 28452545f2e3c9f942f59b416ba63e1b6068700d783Samuel Tan 28552545f2e3c9f942f59b416ba63e1b6068700d783Samuel Tanset<String16> PersistableBundle::getBooleanVectorKeys() const { 28652545f2e3c9f942f59b416ba63e1b6068700d783Samuel Tan return getKeys(mBoolVectorMap); 28752545f2e3c9f942f59b416ba63e1b6068700d783Samuel Tan} 28852545f2e3c9f942f59b416ba63e1b6068700d783Samuel Tan 28952545f2e3c9f942f59b416ba63e1b6068700d783Samuel Tanset<String16> PersistableBundle::getIntVectorKeys() const { 29052545f2e3c9f942f59b416ba63e1b6068700d783Samuel Tan return getKeys(mIntVectorMap); 29152545f2e3c9f942f59b416ba63e1b6068700d783Samuel Tan} 29252545f2e3c9f942f59b416ba63e1b6068700d783Samuel Tan 29352545f2e3c9f942f59b416ba63e1b6068700d783Samuel Tanset<String16> PersistableBundle::getLongVectorKeys() const { 29452545f2e3c9f942f59b416ba63e1b6068700d783Samuel Tan return getKeys(mLongVectorMap); 29552545f2e3c9f942f59b416ba63e1b6068700d783Samuel Tan} 29652545f2e3c9f942f59b416ba63e1b6068700d783Samuel Tan 29752545f2e3c9f942f59b416ba63e1b6068700d783Samuel Tanset<String16> PersistableBundle::getDoubleVectorKeys() const { 29852545f2e3c9f942f59b416ba63e1b6068700d783Samuel Tan return getKeys(mDoubleVectorMap); 29952545f2e3c9f942f59b416ba63e1b6068700d783Samuel Tan} 30052545f2e3c9f942f59b416ba63e1b6068700d783Samuel Tan 30152545f2e3c9f942f59b416ba63e1b6068700d783Samuel Tanset<String16> PersistableBundle::getStringVectorKeys() const { 30252545f2e3c9f942f59b416ba63e1b6068700d783Samuel Tan return getKeys(mStringVectorMap); 30352545f2e3c9f942f59b416ba63e1b6068700d783Samuel Tan} 30452545f2e3c9f942f59b416ba63e1b6068700d783Samuel Tan 30552545f2e3c9f942f59b416ba63e1b6068700d783Samuel Tanset<String16> PersistableBundle::getPersistableBundleKeys() const { 30652545f2e3c9f942f59b416ba63e1b6068700d783Samuel Tan return getKeys(mPersistableBundleMap); 30752545f2e3c9f942f59b416ba63e1b6068700d783Samuel Tan} 30852545f2e3c9f942f59b416ba63e1b6068700d783Samuel Tan 3090a31202370581a91b3425e7b60757268d0f6b539Samuel Tanstatus_t PersistableBundle::writeToParcelInner(Parcel* parcel) const { 3100a31202370581a91b3425e7b60757268d0f6b539Samuel Tan /* 3110a31202370581a91b3425e7b60757268d0f6b539Samuel Tan * To keep this implementation in sync with writeArrayMapInternal() in 3120a31202370581a91b3425e7b60757268d0f6b539Samuel Tan * frameworks/base/core/java/android/os/Parcel.java, the number of key 3130a31202370581a91b3425e7b60757268d0f6b539Samuel Tan * value pairs must be written into the parcel before writing the key-value 3140a31202370581a91b3425e7b60757268d0f6b539Samuel Tan * pairs themselves. 3150a31202370581a91b3425e7b60757268d0f6b539Samuel Tan */ 3160a31202370581a91b3425e7b60757268d0f6b539Samuel Tan size_t num_entries = size(); 3170a31202370581a91b3425e7b60757268d0f6b539Samuel Tan if (num_entries > std::numeric_limits<int32_t>::max()) { 318715dec70e0d3b61679ddac3355e567a787b66f69Samuel Tan ALOGE("The size of this PersistableBundle (%zu) too large to store in 32-bit signed int", 3190a31202370581a91b3425e7b60757268d0f6b539Samuel Tan num_entries); 3200a31202370581a91b3425e7b60757268d0f6b539Samuel Tan return BAD_VALUE; 3210a31202370581a91b3425e7b60757268d0f6b539Samuel Tan } 3220a31202370581a91b3425e7b60757268d0f6b539Samuel Tan RETURN_IF_FAILED(parcel->writeInt32(static_cast<int32_t>(num_entries))); 3230a31202370581a91b3425e7b60757268d0f6b539Samuel Tan 3240a31202370581a91b3425e7b60757268d0f6b539Samuel Tan for (const auto& key_val_pair : mBoolMap) { 3250a31202370581a91b3425e7b60757268d0f6b539Samuel Tan RETURN_IF_FAILED(parcel->writeString16(key_val_pair.first)); 3260a31202370581a91b3425e7b60757268d0f6b539Samuel Tan RETURN_IF_FAILED(parcel->writeInt32(VAL_BOOLEAN)); 3270a31202370581a91b3425e7b60757268d0f6b539Samuel Tan RETURN_IF_FAILED(parcel->writeBool(key_val_pair.second)); 3280a31202370581a91b3425e7b60757268d0f6b539Samuel Tan } 3290a31202370581a91b3425e7b60757268d0f6b539Samuel Tan for (const auto& key_val_pair : mIntMap) { 3300a31202370581a91b3425e7b60757268d0f6b539Samuel Tan RETURN_IF_FAILED(parcel->writeString16(key_val_pair.first)); 3310a31202370581a91b3425e7b60757268d0f6b539Samuel Tan RETURN_IF_FAILED(parcel->writeInt32(VAL_INTEGER)); 3320a31202370581a91b3425e7b60757268d0f6b539Samuel Tan RETURN_IF_FAILED(parcel->writeInt32(key_val_pair.second)); 3330a31202370581a91b3425e7b60757268d0f6b539Samuel Tan } 3340a31202370581a91b3425e7b60757268d0f6b539Samuel Tan for (const auto& key_val_pair : mLongMap) { 3350a31202370581a91b3425e7b60757268d0f6b539Samuel Tan RETURN_IF_FAILED(parcel->writeString16(key_val_pair.first)); 3360a31202370581a91b3425e7b60757268d0f6b539Samuel Tan RETURN_IF_FAILED(parcel->writeInt32(VAL_LONG)); 3370a31202370581a91b3425e7b60757268d0f6b539Samuel Tan RETURN_IF_FAILED(parcel->writeInt64(key_val_pair.second)); 3380a31202370581a91b3425e7b60757268d0f6b539Samuel Tan } 3390a31202370581a91b3425e7b60757268d0f6b539Samuel Tan for (const auto& key_val_pair : mDoubleMap) { 3400a31202370581a91b3425e7b60757268d0f6b539Samuel Tan RETURN_IF_FAILED(parcel->writeString16(key_val_pair.first)); 3410a31202370581a91b3425e7b60757268d0f6b539Samuel Tan RETURN_IF_FAILED(parcel->writeInt32(VAL_DOUBLE)); 3420a31202370581a91b3425e7b60757268d0f6b539Samuel Tan RETURN_IF_FAILED(parcel->writeDouble(key_val_pair.second)); 3430a31202370581a91b3425e7b60757268d0f6b539Samuel Tan } 3440a31202370581a91b3425e7b60757268d0f6b539Samuel Tan for (const auto& key_val_pair : mStringMap) { 3450a31202370581a91b3425e7b60757268d0f6b539Samuel Tan RETURN_IF_FAILED(parcel->writeString16(key_val_pair.first)); 3460a31202370581a91b3425e7b60757268d0f6b539Samuel Tan RETURN_IF_FAILED(parcel->writeInt32(VAL_STRING)); 3470a31202370581a91b3425e7b60757268d0f6b539Samuel Tan RETURN_IF_FAILED(parcel->writeString16(key_val_pair.second)); 3480a31202370581a91b3425e7b60757268d0f6b539Samuel Tan } 3490a31202370581a91b3425e7b60757268d0f6b539Samuel Tan for (const auto& key_val_pair : mBoolVectorMap) { 3500a31202370581a91b3425e7b60757268d0f6b539Samuel Tan RETURN_IF_FAILED(parcel->writeString16(key_val_pair.first)); 3510a31202370581a91b3425e7b60757268d0f6b539Samuel Tan RETURN_IF_FAILED(parcel->writeInt32(VAL_BOOLEANARRAY)); 3520a31202370581a91b3425e7b60757268d0f6b539Samuel Tan RETURN_IF_FAILED(parcel->writeBoolVector(key_val_pair.second)); 3530a31202370581a91b3425e7b60757268d0f6b539Samuel Tan } 3540a31202370581a91b3425e7b60757268d0f6b539Samuel Tan for (const auto& key_val_pair : mIntVectorMap) { 3550a31202370581a91b3425e7b60757268d0f6b539Samuel Tan RETURN_IF_FAILED(parcel->writeString16(key_val_pair.first)); 3560a31202370581a91b3425e7b60757268d0f6b539Samuel Tan RETURN_IF_FAILED(parcel->writeInt32(VAL_INTARRAY)); 3570a31202370581a91b3425e7b60757268d0f6b539Samuel Tan RETURN_IF_FAILED(parcel->writeInt32Vector(key_val_pair.second)); 3580a31202370581a91b3425e7b60757268d0f6b539Samuel Tan } 3590a31202370581a91b3425e7b60757268d0f6b539Samuel Tan for (const auto& key_val_pair : mLongVectorMap) { 3600a31202370581a91b3425e7b60757268d0f6b539Samuel Tan RETURN_IF_FAILED(parcel->writeString16(key_val_pair.first)); 3610a31202370581a91b3425e7b60757268d0f6b539Samuel Tan RETURN_IF_FAILED(parcel->writeInt32(VAL_LONGARRAY)); 3620a31202370581a91b3425e7b60757268d0f6b539Samuel Tan RETURN_IF_FAILED(parcel->writeInt64Vector(key_val_pair.second)); 3630a31202370581a91b3425e7b60757268d0f6b539Samuel Tan } 3640a31202370581a91b3425e7b60757268d0f6b539Samuel Tan for (const auto& key_val_pair : mDoubleVectorMap) { 3650a31202370581a91b3425e7b60757268d0f6b539Samuel Tan RETURN_IF_FAILED(parcel->writeString16(key_val_pair.first)); 3660a31202370581a91b3425e7b60757268d0f6b539Samuel Tan RETURN_IF_FAILED(parcel->writeInt32(VAL_DOUBLEARRAY)); 3670a31202370581a91b3425e7b60757268d0f6b539Samuel Tan RETURN_IF_FAILED(parcel->writeDoubleVector(key_val_pair.second)); 3680a31202370581a91b3425e7b60757268d0f6b539Samuel Tan } 3690a31202370581a91b3425e7b60757268d0f6b539Samuel Tan for (const auto& key_val_pair : mStringVectorMap) { 3700a31202370581a91b3425e7b60757268d0f6b539Samuel Tan RETURN_IF_FAILED(parcel->writeString16(key_val_pair.first)); 3710a31202370581a91b3425e7b60757268d0f6b539Samuel Tan RETURN_IF_FAILED(parcel->writeInt32(VAL_STRINGARRAY)); 3720a31202370581a91b3425e7b60757268d0f6b539Samuel Tan RETURN_IF_FAILED(parcel->writeString16Vector(key_val_pair.second)); 3730a31202370581a91b3425e7b60757268d0f6b539Samuel Tan } 3740a31202370581a91b3425e7b60757268d0f6b539Samuel Tan for (const auto& key_val_pair : mPersistableBundleMap) { 3750a31202370581a91b3425e7b60757268d0f6b539Samuel Tan RETURN_IF_FAILED(parcel->writeString16(key_val_pair.first)); 3760a31202370581a91b3425e7b60757268d0f6b539Samuel Tan RETURN_IF_FAILED(parcel->writeInt32(VAL_PERSISTABLEBUNDLE)); 3770a31202370581a91b3425e7b60757268d0f6b539Samuel Tan RETURN_IF_FAILED(key_val_pair.second.writeToParcel(parcel)); 3780a31202370581a91b3425e7b60757268d0f6b539Samuel Tan } 3790a31202370581a91b3425e7b60757268d0f6b539Samuel Tan return NO_ERROR; 3800a31202370581a91b3425e7b60757268d0f6b539Samuel Tan} 3810a31202370581a91b3425e7b60757268d0f6b539Samuel Tan 3820a31202370581a91b3425e7b60757268d0f6b539Samuel Tanstatus_t PersistableBundle::readFromParcelInner(const Parcel* parcel, size_t length) { 3830a31202370581a91b3425e7b60757268d0f6b539Samuel Tan /* 3840a31202370581a91b3425e7b60757268d0f6b539Samuel Tan * Note: we don't actually use length for anything other than an empty PersistableBundle 3850a31202370581a91b3425e7b60757268d0f6b539Samuel Tan * check, since we do not actually need to copy in an entire Parcel, unlike in the Java 3860a31202370581a91b3425e7b60757268d0f6b539Samuel Tan * implementation. 3870a31202370581a91b3425e7b60757268d0f6b539Samuel Tan */ 3880a31202370581a91b3425e7b60757268d0f6b539Samuel Tan if (length == 0) { 3890a31202370581a91b3425e7b60757268d0f6b539Samuel Tan // Empty PersistableBundle or end of data. 3900a31202370581a91b3425e7b60757268d0f6b539Samuel Tan return NO_ERROR; 3910a31202370581a91b3425e7b60757268d0f6b539Samuel Tan } 3920a31202370581a91b3425e7b60757268d0f6b539Samuel Tan 3930a31202370581a91b3425e7b60757268d0f6b539Samuel Tan int32_t magic; 3940a31202370581a91b3425e7b60757268d0f6b539Samuel Tan RETURN_IF_FAILED(parcel->readInt32(&magic)); 3950a31202370581a91b3425e7b60757268d0f6b539Samuel Tan if (magic != BUNDLE_MAGIC) { 3960a31202370581a91b3425e7b60757268d0f6b539Samuel Tan ALOGE("Bad magic number for PersistableBundle: 0x%08x", magic); 3970a31202370581a91b3425e7b60757268d0f6b539Samuel Tan return BAD_VALUE; 3980a31202370581a91b3425e7b60757268d0f6b539Samuel Tan } 3990a31202370581a91b3425e7b60757268d0f6b539Samuel Tan 4000a31202370581a91b3425e7b60757268d0f6b539Samuel Tan /* 4010a31202370581a91b3425e7b60757268d0f6b539Samuel Tan * To keep this implementation in sync with unparcel() in 4020a31202370581a91b3425e7b60757268d0f6b539Samuel Tan * frameworks/base/core/java/android/os/BaseBundle.java, the number of 4030a31202370581a91b3425e7b60757268d0f6b539Samuel Tan * key-value pairs must be read from the parcel before reading the key-value 4040a31202370581a91b3425e7b60757268d0f6b539Samuel Tan * pairs themselves. 4050a31202370581a91b3425e7b60757268d0f6b539Samuel Tan */ 4060a31202370581a91b3425e7b60757268d0f6b539Samuel Tan int32_t num_entries; 4070a31202370581a91b3425e7b60757268d0f6b539Samuel Tan RETURN_IF_FAILED(parcel->readInt32(&num_entries)); 4080a31202370581a91b3425e7b60757268d0f6b539Samuel Tan 4090a31202370581a91b3425e7b60757268d0f6b539Samuel Tan for (; num_entries > 0; --num_entries) { 4100a31202370581a91b3425e7b60757268d0f6b539Samuel Tan String16 key; 4110a31202370581a91b3425e7b60757268d0f6b539Samuel Tan int32_t value_type; 4120a31202370581a91b3425e7b60757268d0f6b539Samuel Tan RETURN_IF_FAILED(parcel->readString16(&key)); 4130a31202370581a91b3425e7b60757268d0f6b539Samuel Tan RETURN_IF_FAILED(parcel->readInt32(&value_type)); 4140a31202370581a91b3425e7b60757268d0f6b539Samuel Tan 4150a31202370581a91b3425e7b60757268d0f6b539Samuel Tan /* 4160a31202370581a91b3425e7b60757268d0f6b539Samuel Tan * We assume that both the C++ and Java APIs ensure that all keys in a PersistableBundle 4170a31202370581a91b3425e7b60757268d0f6b539Samuel Tan * are unique. 4180a31202370581a91b3425e7b60757268d0f6b539Samuel Tan */ 4190a31202370581a91b3425e7b60757268d0f6b539Samuel Tan switch (value_type) { 4200a31202370581a91b3425e7b60757268d0f6b539Samuel Tan case VAL_STRING: { 4210a31202370581a91b3425e7b60757268d0f6b539Samuel Tan RETURN_IF_FAILED(parcel->readString16(&mStringMap[key])); 4220a31202370581a91b3425e7b60757268d0f6b539Samuel Tan break; 4230a31202370581a91b3425e7b60757268d0f6b539Samuel Tan } 4240a31202370581a91b3425e7b60757268d0f6b539Samuel Tan case VAL_INTEGER: { 4250a31202370581a91b3425e7b60757268d0f6b539Samuel Tan RETURN_IF_FAILED(parcel->readInt32(&mIntMap[key])); 4260a31202370581a91b3425e7b60757268d0f6b539Samuel Tan break; 4270a31202370581a91b3425e7b60757268d0f6b539Samuel Tan } 4280a31202370581a91b3425e7b60757268d0f6b539Samuel Tan case VAL_LONG: { 4290a31202370581a91b3425e7b60757268d0f6b539Samuel Tan RETURN_IF_FAILED(parcel->readInt64(&mLongMap[key])); 4300a31202370581a91b3425e7b60757268d0f6b539Samuel Tan break; 4310a31202370581a91b3425e7b60757268d0f6b539Samuel Tan } 4320a31202370581a91b3425e7b60757268d0f6b539Samuel Tan case VAL_DOUBLE: { 4330a31202370581a91b3425e7b60757268d0f6b539Samuel Tan RETURN_IF_FAILED(parcel->readDouble(&mDoubleMap[key])); 4340a31202370581a91b3425e7b60757268d0f6b539Samuel Tan break; 4350a31202370581a91b3425e7b60757268d0f6b539Samuel Tan } 4360a31202370581a91b3425e7b60757268d0f6b539Samuel Tan case VAL_BOOLEAN: { 4370a31202370581a91b3425e7b60757268d0f6b539Samuel Tan RETURN_IF_FAILED(parcel->readBool(&mBoolMap[key])); 4380a31202370581a91b3425e7b60757268d0f6b539Samuel Tan break; 4390a31202370581a91b3425e7b60757268d0f6b539Samuel Tan } 4400a31202370581a91b3425e7b60757268d0f6b539Samuel Tan case VAL_STRINGARRAY: { 4410a31202370581a91b3425e7b60757268d0f6b539Samuel Tan RETURN_IF_FAILED(parcel->readString16Vector(&mStringVectorMap[key])); 4420a31202370581a91b3425e7b60757268d0f6b539Samuel Tan break; 4430a31202370581a91b3425e7b60757268d0f6b539Samuel Tan } 4440a31202370581a91b3425e7b60757268d0f6b539Samuel Tan case VAL_INTARRAY: { 4450a31202370581a91b3425e7b60757268d0f6b539Samuel Tan RETURN_IF_FAILED(parcel->readInt32Vector(&mIntVectorMap[key])); 4460a31202370581a91b3425e7b60757268d0f6b539Samuel Tan break; 4470a31202370581a91b3425e7b60757268d0f6b539Samuel Tan } 4480a31202370581a91b3425e7b60757268d0f6b539Samuel Tan case VAL_LONGARRAY: { 4490a31202370581a91b3425e7b60757268d0f6b539Samuel Tan RETURN_IF_FAILED(parcel->readInt64Vector(&mLongVectorMap[key])); 4500a31202370581a91b3425e7b60757268d0f6b539Samuel Tan break; 4510a31202370581a91b3425e7b60757268d0f6b539Samuel Tan } 4520a31202370581a91b3425e7b60757268d0f6b539Samuel Tan case VAL_BOOLEANARRAY: { 4530a31202370581a91b3425e7b60757268d0f6b539Samuel Tan RETURN_IF_FAILED(parcel->readBoolVector(&mBoolVectorMap[key])); 4540a31202370581a91b3425e7b60757268d0f6b539Samuel Tan break; 4550a31202370581a91b3425e7b60757268d0f6b539Samuel Tan } 4560a31202370581a91b3425e7b60757268d0f6b539Samuel Tan case VAL_PERSISTABLEBUNDLE: { 4570a31202370581a91b3425e7b60757268d0f6b539Samuel Tan RETURN_IF_FAILED(mPersistableBundleMap[key].readFromParcel(parcel)); 4580a31202370581a91b3425e7b60757268d0f6b539Samuel Tan break; 4590a31202370581a91b3425e7b60757268d0f6b539Samuel Tan } 4600a31202370581a91b3425e7b60757268d0f6b539Samuel Tan case VAL_DOUBLEARRAY: { 4610a31202370581a91b3425e7b60757268d0f6b539Samuel Tan RETURN_IF_FAILED(parcel->readDoubleVector(&mDoubleVectorMap[key])); 4620a31202370581a91b3425e7b60757268d0f6b539Samuel Tan break; 4630a31202370581a91b3425e7b60757268d0f6b539Samuel Tan } 4640a31202370581a91b3425e7b60757268d0f6b539Samuel Tan default: { 4650a31202370581a91b3425e7b60757268d0f6b539Samuel Tan ALOGE("Unrecognized type: %d", value_type); 4660a31202370581a91b3425e7b60757268d0f6b539Samuel Tan return BAD_TYPE; 4670a31202370581a91b3425e7b60757268d0f6b539Samuel Tan break; 4680a31202370581a91b3425e7b60757268d0f6b539Samuel Tan } 4690a31202370581a91b3425e7b60757268d0f6b539Samuel Tan } 4700a31202370581a91b3425e7b60757268d0f6b539Samuel Tan } 4710a31202370581a91b3425e7b60757268d0f6b539Samuel Tan 4720a31202370581a91b3425e7b60757268d0f6b539Samuel Tan return NO_ERROR; 4730a31202370581a91b3425e7b60757268d0f6b539Samuel Tan} 4740a31202370581a91b3425e7b60757268d0f6b539Samuel Tan 4750a31202370581a91b3425e7b60757268d0f6b539Samuel Tan} // namespace os 4760a31202370581a91b3425e7b60757268d0f6b539Samuel Tan 4770a31202370581a91b3425e7b60757268d0f6b539Samuel Tan} // namespace android 478