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