17c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project/*
27c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project * Copyright (C) 2005 The Android Open Source Project
37c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project *
47c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
57c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project * you may not use this file except in compliance with the License.
67c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project * You may obtain a copy of the License at
77c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project *
87c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
97c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project *
107c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project * Unless required by applicable law or agreed to in writing, software
117c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
127c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
137c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project * See the License for the specific language governing permissions and
147c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project * limitations under the License.
157c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project */
167c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project
177c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project#define LOG_TAG "Parcel"
187c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project//#define LOG_NDEBUG 0
197c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project
20abed7f7aebdbdd20fdb37d0d6e79e50905c7f5d5Mark Salyzyn#include <errno.h>
2170f3665f8272b2f6d05e77ff0c17683b4b7f82b7Mark Salyzyn#include <fcntl.h>
22abed7f7aebdbdd20fdb37d0d6e79e50905c7f5d5Mark Salyzyn#include <inttypes.h>
2370f3665f8272b2f6d05e77ff0c17683b4b7f82b7Mark Salyzyn#include <pthread.h>
24abed7f7aebdbdd20fdb37d0d6e79e50905c7f5d5Mark Salyzyn#include <stdint.h>
25abed7f7aebdbdd20fdb37d0d6e79e50905c7f5d5Mark Salyzyn#include <stdio.h>
26abed7f7aebdbdd20fdb37d0d6e79e50905c7f5d5Mark Salyzyn#include <stdlib.h>
27abed7f7aebdbdd20fdb37d0d6e79e50905c7f5d5Mark Salyzyn#include <sys/mman.h>
28eab2afc7ac5183750a23693ecee89dad7f7abf5fMark Salyzyn#include <sys/stat.h>
29eab2afc7ac5183750a23693ecee89dad7f7abf5fMark Salyzyn#include <sys/types.h>
30e4e0ae8abc7f612960fc381a792d0bef4c3eb6f9Christopher Tate#include <sys/resource.h>
31eab2afc7ac5183750a23693ecee89dad7f7abf5fMark Salyzyn#include <unistd.h>
327c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project
33c5b2c0bf8007562536b822eb060fc54a01f8e08bMathias Agopian#include <binder/Binder.h>
34c5b2c0bf8007562536b822eb060fc54a01f8e08bMathias Agopian#include <binder/BpBinder.h>
35abed7f7aebdbdd20fdb37d0d6e79e50905c7f5d5Mark Salyzyn#include <binder/IPCThreadState.h>
36abed7f7aebdbdd20fdb37d0d6e79e50905c7f5d5Mark Salyzyn#include <binder/Parcel.h>
37c5b2c0bf8007562536b822eb060fc54a01f8e08bMathias Agopian#include <binder/ProcessState.h>
3809eb749704afd9e226e1347cb20c90be2016cd21Christopher Wiley#include <binder/Status.h>
39002e1e58dfe19dd3e49a59c6827cbf51573941a2Mathias Agopian#include <binder/TextOutput.h>
406316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum#include <binder/Value.h>
41002e1e58dfe19dd3e49a59c6827cbf51573941a2Mathias Agopian
42abed7f7aebdbdd20fdb37d0d6e79e50905c7f5d5Mark Salyzyn#include <cutils/ashmem.h>
43002e1e58dfe19dd3e49a59c6827cbf51573941a2Mathias Agopian#include <utils/Debug.h>
44abed7f7aebdbdd20fdb37d0d6e79e50905c7f5d5Mark Salyzyn#include <utils/Flattenable.h>
457c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project#include <utils/Log.h>
46abed7f7aebdbdd20fdb37d0d6e79e50905c7f5d5Mark Salyzyn#include <utils/misc.h>
477c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project#include <utils/String8.h>
487c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project#include <utils/String16.h>
497c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project
50208059f67ed2dd9fa025e07fcb6954d3cb61c79eMathias Agopian#include <private/binder/binder_module.h>
517e790af756d7891cb1cf1374bb283a8fbcbe6b49Dianne Hackborn#include <private/binder/Static.h>
527c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project
537c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project#ifndef INT32_MAX
547c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project#define INT32_MAX ((int32_t)(2147483647))
557c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project#endif
567c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project
577c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project#define LOG_REFS(...)
58e93390b0bd336cd1b69abebf6eeffd18881f531bMark Salyzyn//#define LOG_REFS(...) ALOG(LOG_DEBUG, LOG_TAG, __VA_ARGS__)
597e790af756d7891cb1cf1374bb283a8fbcbe6b49Dianne Hackborn#define LOG_ALLOC(...)
60e93390b0bd336cd1b69abebf6eeffd18881f531bMark Salyzyn//#define LOG_ALLOC(...) ALOG(LOG_DEBUG, LOG_TAG, __VA_ARGS__)
617c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project
627c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project// ---------------------------------------------------------------------------
637c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project
64b6b1423c87e457097875dc304fbbe38db6c41abdNick Kralevich// This macro should never be used at runtime, as a too large value
65b6b1423c87e457097875dc304fbbe38db6c41abdNick Kralevich// of s could cause an integer overflow. Instead, you should always
66b6b1423c87e457097875dc304fbbe38db6c41abdNick Kralevich// use the wrapper function pad_size()
67b6b1423c87e457097875dc304fbbe38db6c41abdNick Kralevich#define PAD_SIZE_UNSAFE(s) (((s)+3)&~3)
68b6b1423c87e457097875dc304fbbe38db6c41abdNick Kralevich
69b6b1423c87e457097875dc304fbbe38db6c41abdNick Kralevichstatic size_t pad_size(size_t s) {
70b6b1423c87e457097875dc304fbbe38db6c41abdNick Kralevich    if (s > (SIZE_T_MAX - 3)) {
71b6b1423c87e457097875dc304fbbe38db6c41abdNick Kralevich        abort();
72b6b1423c87e457097875dc304fbbe38db6c41abdNick Kralevich    }
73b6b1423c87e457097875dc304fbbe38db6c41abdNick Kralevich    return PAD_SIZE_UNSAFE(s);
74b6b1423c87e457097875dc304fbbe38db6c41abdNick Kralevich}
757c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project
76a877cd85b5a026384542e3271fc310d6a8fe24c6Brad Fitzpatrick// Note: must be kept in sync with android/os/StrictMode.java's PENALTY_GATHER
770c1f5cbb8a41d19195ab49dcfeb5caaea2d3fcdaJeff Sharkey#define STRICT_MODE_PENALTY_GATHER (0x40 << 16)
78a877cd85b5a026384542e3271fc310d6a8fe24c6Brad Fitzpatrick
797c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project// XXX This can be made public if we want to provide
807c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project// support for typed data.
817c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Projectstruct small_flat_data
827c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project{
837c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project    uint32_t type;
847c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project    uint32_t data;
857c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project};
867c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project
877c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Projectnamespace android {
887c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project
89a4cff88d80bf1acbdbd063af88ecad83a8b9b7b4Dianne Hackbornstatic pthread_mutex_t gParcelGlobalAllocSizeLock = PTHREAD_MUTEX_INITIALIZER;
90a4cff88d80bf1acbdbd063af88ecad83a8b9b7b4Dianne Hackbornstatic size_t gParcelGlobalAllocSize = 0;
91a4cff88d80bf1acbdbd063af88ecad83a8b9b7b4Dianne Hackbornstatic size_t gParcelGlobalAllocCount = 0;
92a4cff88d80bf1acbdbd063af88ecad83a8b9b7b4Dianne Hackborn
93e4e0ae8abc7f612960fc381a792d0bef4c3eb6f9Christopher Tatestatic size_t gMaxFds = 0;
94e4e0ae8abc7f612960fc381a792d0bef4c3eb6f9Christopher Tate
9513b1604018968408bcc5553e1fa5ea9df3e4e009Jeff Brown// Maximum size of a blob to transfer in-place.
9613b1604018968408bcc5553e1fa5ea9df3e4e009Jeff Brownstatic const size_t BLOB_INPLACE_LIMIT = 16 * 1024;
9713b1604018968408bcc5553e1fa5ea9df3e4e009Jeff Brown
9813b1604018968408bcc5553e1fa5ea9df3e4e009Jeff Brownenum {
9913b1604018968408bcc5553e1fa5ea9df3e4e009Jeff Brown    BLOB_INPLACE = 0,
10013b1604018968408bcc5553e1fa5ea9df3e4e009Jeff Brown    BLOB_ASHMEM_IMMUTABLE = 1,
10113b1604018968408bcc5553e1fa5ea9df3e4e009Jeff Brown    BLOB_ASHMEM_MUTABLE = 2,
10213b1604018968408bcc5553e1fa5ea9df3e4e009Jeff Brown};
10313b1604018968408bcc5553e1fa5ea9df3e4e009Jeff Brown
1047c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Projectvoid acquire_object(const sp<ProcessState>& proc,
105cbf3726357966539c2a685f46e61c3fc8937f19eAdrian Roos    const flat_binder_object& obj, const void* who, size_t* outAshmemSize)
1067c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project{
1077c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project    switch (obj.type) {
1087c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project        case BINDER_TYPE_BINDER:
1097c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project            if (obj.binder) {
1107c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project                LOG_REFS("Parcel %p acquiring reference on local %p", who, obj.cookie);
11184e625ac1e01f5a9c3ed16664da6498212ed662bArve Hjønnevåg                reinterpret_cast<IBinder*>(obj.cookie)->incStrong(who);
1127c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project            }
1137c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project            return;
1147c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project        case BINDER_TYPE_WEAK_BINDER:
1157c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project            if (obj.binder)
11684e625ac1e01f5a9c3ed16664da6498212ed662bArve Hjønnevåg                reinterpret_cast<RefBase::weakref_type*>(obj.binder)->incWeak(who);
1177c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project            return;
1187c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project        case BINDER_TYPE_HANDLE: {
1197c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project            const sp<IBinder> b = proc->getStrongProxyForHandle(obj.handle);
1207c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project            if (b != NULL) {
1217c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project                LOG_REFS("Parcel %p acquiring reference on remote %p", who, b.get());
1227c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project                b->incStrong(who);
1237c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project            }
1247c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project            return;
1257c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project        }
1267c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project        case BINDER_TYPE_WEAK_HANDLE: {
1277c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project            const wp<IBinder> b = proc->getWeakProxyForHandle(obj.handle);
1287c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project            if (b != NULL) b.get_refs()->incWeak(who);
1297c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project            return;
1307c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project        }
1317c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project        case BINDER_TYPE_FD: {
1328058936f866a16001f1894c0688f87bf5a6c76d9Mark Salyzyn            if ((obj.cookie != 0) && (outAshmemSize != NULL) && ashmem_valid(obj.handle)) {
1338058936f866a16001f1894c0688f87bf5a6c76d9Mark Salyzyn                // If we own an ashmem fd, keep track of how much memory it refers to.
1348058936f866a16001f1894c0688f87bf5a6c76d9Mark Salyzyn                int size = ashmem_get_size_region(obj.handle);
1358058936f866a16001f1894c0688f87bf5a6c76d9Mark Salyzyn                if (size > 0) {
1368058936f866a16001f1894c0688f87bf5a6c76d9Mark Salyzyn                    *outAshmemSize += size;
137cbf3726357966539c2a685f46e61c3fc8937f19eAdrian Roos                }
138cbf3726357966539c2a685f46e61c3fc8937f19eAdrian Roos            }
1397c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project            return;
1407c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project        }
1417c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project    }
1427c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project
1436f4f3ab36c5ed1df84eb3a9f7475f0ac42952f58Colin Cross    ALOGD("Invalid object type 0x%08x", obj.type);
1447c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project}
1457c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project
1466bb3114246f6f6aa406e65452dbaa12b135029eaAdrian Roosvoid acquire_object(const sp<ProcessState>& proc,
1477c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project    const flat_binder_object& obj, const void* who)
1487c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project{
1496bb3114246f6f6aa406e65452dbaa12b135029eaAdrian Roos    acquire_object(proc, obj, who, NULL);
1506bb3114246f6f6aa406e65452dbaa12b135029eaAdrian Roos}
1516bb3114246f6f6aa406e65452dbaa12b135029eaAdrian Roos
1526bb3114246f6f6aa406e65452dbaa12b135029eaAdrian Roosstatic void release_object(const sp<ProcessState>& proc,
153cbf3726357966539c2a685f46e61c3fc8937f19eAdrian Roos    const flat_binder_object& obj, const void* who, size_t* outAshmemSize)
1547c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project{
1557c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project    switch (obj.type) {
1567c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project        case BINDER_TYPE_BINDER:
1577c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project            if (obj.binder) {
1587c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project                LOG_REFS("Parcel %p releasing reference on local %p", who, obj.cookie);
15984e625ac1e01f5a9c3ed16664da6498212ed662bArve Hjønnevåg                reinterpret_cast<IBinder*>(obj.cookie)->decStrong(who);
1607c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project            }
1617c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project            return;
1627c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project        case BINDER_TYPE_WEAK_BINDER:
1637c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project            if (obj.binder)
16484e625ac1e01f5a9c3ed16664da6498212ed662bArve Hjønnevåg                reinterpret_cast<RefBase::weakref_type*>(obj.binder)->decWeak(who);
1657c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project            return;
1667c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project        case BINDER_TYPE_HANDLE: {
1677c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project            const sp<IBinder> b = proc->getStrongProxyForHandle(obj.handle);
1687c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project            if (b != NULL) {
1697c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project                LOG_REFS("Parcel %p releasing reference on remote %p", who, b.get());
1707c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project                b->decStrong(who);
1717c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project            }
1727c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project            return;
1737c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project        }
1747c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project        case BINDER_TYPE_WEAK_HANDLE: {
1757c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project            const wp<IBinder> b = proc->getWeakProxyForHandle(obj.handle);
1767c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project            if (b != NULL) b.get_refs()->decWeak(who);
1777c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project            return;
1787c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project        }
1797c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project        case BINDER_TYPE_FD: {
180b454d8ffa928e33dd54c979a747994acbd117397Mark Salyzyn            if (obj.cookie != 0) { // owned
1818058936f866a16001f1894c0688f87bf5a6c76d9Mark Salyzyn                if ((outAshmemSize != NULL) && ashmem_valid(obj.handle)) {
1828058936f866a16001f1894c0688f87bf5a6c76d9Mark Salyzyn                    int size = ashmem_get_size_region(obj.handle);
1838058936f866a16001f1894c0688f87bf5a6c76d9Mark Salyzyn                    if (size > 0) {
1848058936f866a16001f1894c0688f87bf5a6c76d9Mark Salyzyn                        *outAshmemSize -= size;
1856bb3114246f6f6aa406e65452dbaa12b135029eaAdrian Roos                    }
1866bb3114246f6f6aa406e65452dbaa12b135029eaAdrian Roos                }
187b454d8ffa928e33dd54c979a747994acbd117397Mark Salyzyn
188b454d8ffa928e33dd54c979a747994acbd117397Mark Salyzyn                close(obj.handle);
189cbf3726357966539c2a685f46e61c3fc8937f19eAdrian Roos            }
1907c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project            return;
1917c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project        }
1927c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project    }
1937c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project
1946f4f3ab36c5ed1df84eb3a9f7475f0ac42952f58Colin Cross    ALOGE("Invalid object type 0x%08x", obj.type);
1957c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project}
1967c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project
1976bb3114246f6f6aa406e65452dbaa12b135029eaAdrian Roosvoid release_object(const sp<ProcessState>& proc,
1986bb3114246f6f6aa406e65452dbaa12b135029eaAdrian Roos    const flat_binder_object& obj, const void* who)
1996bb3114246f6f6aa406e65452dbaa12b135029eaAdrian Roos{
2006bb3114246f6f6aa406e65452dbaa12b135029eaAdrian Roos    release_object(proc, obj, who, NULL);
2016bb3114246f6f6aa406e65452dbaa12b135029eaAdrian Roos}
2026bb3114246f6f6aa406e65452dbaa12b135029eaAdrian Roos
2037c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Projectinline static status_t finish_flatten_binder(
2046f4f3ab36c5ed1df84eb3a9f7475f0ac42952f58Colin Cross    const sp<IBinder>& /*binder*/, const flat_binder_object& flat, Parcel* out)
2057c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project{
2067c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project    return out->writeObject(flat, false);
2077c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project}
2087c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project
2096f4f3ab36c5ed1df84eb3a9f7475f0ac42952f58Colin Crossstatus_t flatten_binder(const sp<ProcessState>& /*proc*/,
2107c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project    const sp<IBinder>& binder, Parcel* out)
2117c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project{
2127c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project    flat_binder_object obj;
213d4ecccfd206604a9b2d8a1220844fc2df85a5998Mark Salyzyn
2142b6317436d2035ce98331906aaaca87e6026c9c8Martijn Coenen    if (IPCThreadState::self()->backgroundSchedulingDisabled()) {
2152b6317436d2035ce98331906aaaca87e6026c9c8Martijn Coenen        /* minimum priority for all nodes is nice 0 */
2162b6317436d2035ce98331906aaaca87e6026c9c8Martijn Coenen        obj.flags = FLAT_BINDER_FLAG_ACCEPTS_FDS;
2172b6317436d2035ce98331906aaaca87e6026c9c8Martijn Coenen    } else {
2182b6317436d2035ce98331906aaaca87e6026c9c8Martijn Coenen        /* minimum priority for all nodes is MAX_NICE(19) */
2192b6317436d2035ce98331906aaaca87e6026c9c8Martijn Coenen        obj.flags = 0x13 | FLAT_BINDER_FLAG_ACCEPTS_FDS;
2202b6317436d2035ce98331906aaaca87e6026c9c8Martijn Coenen    }
2212b6317436d2035ce98331906aaaca87e6026c9c8Martijn Coenen
2227c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project    if (binder != NULL) {
2237c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project        IBinder *local = binder->localBinder();
2247c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project        if (!local) {
2257c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project            BpBinder *proxy = binder->remoteBinder();
2267c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project            if (proxy == NULL) {
227e6f43ddce78d6846af12550ff9193c5c6fe5844bSteve Block                ALOGE("null proxy");
2287c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project            }
2297c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project            const int32_t handle = proxy ? proxy->handle() : 0;
2307c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project            obj.type = BINDER_TYPE_HANDLE;
23107fd0f195db6d341cab4e54257f508d802c98832Arve Hjønnevåg            obj.binder = 0; /* Don't pass uninitialized stack data to a remote process */
2327c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project            obj.handle = handle;
23384e625ac1e01f5a9c3ed16664da6498212ed662bArve Hjønnevåg            obj.cookie = 0;
2347c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project        } else {
2357c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project            obj.type = BINDER_TYPE_BINDER;
23684e625ac1e01f5a9c3ed16664da6498212ed662bArve Hjønnevåg            obj.binder = reinterpret_cast<uintptr_t>(local->getWeakRefs());
23784e625ac1e01f5a9c3ed16664da6498212ed662bArve Hjønnevåg            obj.cookie = reinterpret_cast<uintptr_t>(local);
2387c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project        }
2397c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project    } else {
2407c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project        obj.type = BINDER_TYPE_BINDER;
24184e625ac1e01f5a9c3ed16664da6498212ed662bArve Hjønnevåg        obj.binder = 0;
24284e625ac1e01f5a9c3ed16664da6498212ed662bArve Hjønnevåg        obj.cookie = 0;
2437c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project    }
244d4ecccfd206604a9b2d8a1220844fc2df85a5998Mark Salyzyn
2457c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project    return finish_flatten_binder(binder, obj, out);
2467c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project}
2477c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project
2486f4f3ab36c5ed1df84eb3a9f7475f0ac42952f58Colin Crossstatus_t flatten_binder(const sp<ProcessState>& /*proc*/,
2497c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project    const wp<IBinder>& binder, Parcel* out)
2507c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project{
2517c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project    flat_binder_object obj;
252d4ecccfd206604a9b2d8a1220844fc2df85a5998Mark Salyzyn
2537c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project    obj.flags = 0x7f | FLAT_BINDER_FLAG_ACCEPTS_FDS;
2547c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project    if (binder != NULL) {
2557c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project        sp<IBinder> real = binder.promote();
2567c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project        if (real != NULL) {
2577c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project            IBinder *local = real->localBinder();
2587c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project            if (!local) {
2597c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project                BpBinder *proxy = real->remoteBinder();
2607c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project                if (proxy == NULL) {
261e6f43ddce78d6846af12550ff9193c5c6fe5844bSteve Block                    ALOGE("null proxy");
2627c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project                }
2637c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project                const int32_t handle = proxy ? proxy->handle() : 0;
2647c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project                obj.type = BINDER_TYPE_WEAK_HANDLE;
26507fd0f195db6d341cab4e54257f508d802c98832Arve Hjønnevåg                obj.binder = 0; /* Don't pass uninitialized stack data to a remote process */
2667c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project                obj.handle = handle;
26784e625ac1e01f5a9c3ed16664da6498212ed662bArve Hjønnevåg                obj.cookie = 0;
2687c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project            } else {
2697c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project                obj.type = BINDER_TYPE_WEAK_BINDER;
27084e625ac1e01f5a9c3ed16664da6498212ed662bArve Hjønnevåg                obj.binder = reinterpret_cast<uintptr_t>(binder.get_refs());
27184e625ac1e01f5a9c3ed16664da6498212ed662bArve Hjønnevåg                obj.cookie = reinterpret_cast<uintptr_t>(binder.unsafe_get());
2727c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project            }
2737c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project            return finish_flatten_binder(real, obj, out);
2747c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project        }
275d4ecccfd206604a9b2d8a1220844fc2df85a5998Mark Salyzyn
2767c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project        // XXX How to deal?  In order to flatten the given binder,
2777c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project        // we need to probe it for information, which requires a primary
2787c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project        // reference...  but we don't have one.
2797c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project        //
2807c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project        // The OpenBinder implementation uses a dynamic_cast<> here,
2817c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project        // but we can't do that with the different reference counting
2827c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project        // implementation we are using.
283e6f43ddce78d6846af12550ff9193c5c6fe5844bSteve Block        ALOGE("Unable to unflatten Binder weak reference!");
2847c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project        obj.type = BINDER_TYPE_BINDER;
28584e625ac1e01f5a9c3ed16664da6498212ed662bArve Hjønnevåg        obj.binder = 0;
28684e625ac1e01f5a9c3ed16664da6498212ed662bArve Hjønnevåg        obj.cookie = 0;
2877c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project        return finish_flatten_binder(NULL, obj, out);
288d4ecccfd206604a9b2d8a1220844fc2df85a5998Mark Salyzyn
2897c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project    } else {
2907c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project        obj.type = BINDER_TYPE_BINDER;
29184e625ac1e01f5a9c3ed16664da6498212ed662bArve Hjønnevåg        obj.binder = 0;
29284e625ac1e01f5a9c3ed16664da6498212ed662bArve Hjønnevåg        obj.cookie = 0;
2937c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project        return finish_flatten_binder(NULL, obj, out);
2947c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project    }
2957c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project}
2967c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project
2977c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Projectinline static status_t finish_unflatten_binder(
2986f4f3ab36c5ed1df84eb3a9f7475f0ac42952f58Colin Cross    BpBinder* /*proxy*/, const flat_binder_object& /*flat*/,
2996f4f3ab36c5ed1df84eb3a9f7475f0ac42952f58Colin Cross    const Parcel& /*in*/)
3007c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project{
3017c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project    return NO_ERROR;
3027c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project}
303d4ecccfd206604a9b2d8a1220844fc2df85a5998Mark Salyzyn
3047c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Projectstatus_t unflatten_binder(const sp<ProcessState>& proc,
3057c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project    const Parcel& in, sp<IBinder>* out)
3067c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project{
3077c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project    const flat_binder_object* flat = in.readObject(false);
308d4ecccfd206604a9b2d8a1220844fc2df85a5998Mark Salyzyn
3097c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project    if (flat) {
3107c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project        switch (flat->type) {
3117c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project            case BINDER_TYPE_BINDER:
31284e625ac1e01f5a9c3ed16664da6498212ed662bArve Hjønnevåg                *out = reinterpret_cast<IBinder*>(flat->cookie);
3137c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project                return finish_unflatten_binder(NULL, *flat, in);
3147c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project            case BINDER_TYPE_HANDLE:
3157c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project                *out = proc->getStrongProxyForHandle(flat->handle);
3167c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project                return finish_unflatten_binder(
3177c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project                    static_cast<BpBinder*>(out->get()), *flat, in);
318d4ecccfd206604a9b2d8a1220844fc2df85a5998Mark Salyzyn        }
3197c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project    }
3207c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project    return BAD_TYPE;
3217c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project}
3227c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project
3237c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Projectstatus_t unflatten_binder(const sp<ProcessState>& proc,
3247c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project    const Parcel& in, wp<IBinder>* out)
3257c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project{
3267c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project    const flat_binder_object* flat = in.readObject(false);
327d4ecccfd206604a9b2d8a1220844fc2df85a5998Mark Salyzyn
3287c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project    if (flat) {
3297c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project        switch (flat->type) {
3307c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project            case BINDER_TYPE_BINDER:
33184e625ac1e01f5a9c3ed16664da6498212ed662bArve Hjønnevåg                *out = reinterpret_cast<IBinder*>(flat->cookie);
3327c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project                return finish_unflatten_binder(NULL, *flat, in);
3337c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project            case BINDER_TYPE_WEAK_BINDER:
33484e625ac1e01f5a9c3ed16664da6498212ed662bArve Hjønnevåg                if (flat->binder != 0) {
3357c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project                    out->set_object_and_refs(
33684e625ac1e01f5a9c3ed16664da6498212ed662bArve Hjønnevåg                        reinterpret_cast<IBinder*>(flat->cookie),
33784e625ac1e01f5a9c3ed16664da6498212ed662bArve Hjønnevåg                        reinterpret_cast<RefBase::weakref_type*>(flat->binder));
3387c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project                } else {
3397c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project                    *out = NULL;
3407c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project                }
3417c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project                return finish_unflatten_binder(NULL, *flat, in);
3427c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project            case BINDER_TYPE_HANDLE:
3437c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project            case BINDER_TYPE_WEAK_HANDLE:
3447c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project                *out = proc->getWeakProxyForHandle(flat->handle);
3457c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project                return finish_unflatten_binder(
3467c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project                    static_cast<BpBinder*>(out->unsafe_get()), *flat, in);
3477c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project        }
3487c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project    }
3497c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project    return BAD_TYPE;
3507c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project}
3517c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project
3527c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project// ---------------------------------------------------------------------------
3537c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project
3547c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source ProjectParcel::Parcel()
3557c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project{
3567e790af756d7891cb1cf1374bb283a8fbcbe6b49Dianne Hackborn    LOG_ALLOC("Parcel %p: constructing", this);
3577c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project    initState();
3587c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project}
3597c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project
3607c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source ProjectParcel::~Parcel()
3617c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project{
3627c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project    freeDataNoInit();
3637e790af756d7891cb1cf1374bb283a8fbcbe6b49Dianne Hackborn    LOG_ALLOC("Parcel %p: destroyed", this);
3647e790af756d7891cb1cf1374bb283a8fbcbe6b49Dianne Hackborn}
3657e790af756d7891cb1cf1374bb283a8fbcbe6b49Dianne Hackborn
3667e790af756d7891cb1cf1374bb283a8fbcbe6b49Dianne Hackbornsize_t Parcel::getGlobalAllocSize() {
367a4cff88d80bf1acbdbd063af88ecad83a8b9b7b4Dianne Hackborn    pthread_mutex_lock(&gParcelGlobalAllocSizeLock);
368a4cff88d80bf1acbdbd063af88ecad83a8b9b7b4Dianne Hackborn    size_t size = gParcelGlobalAllocSize;
369a4cff88d80bf1acbdbd063af88ecad83a8b9b7b4Dianne Hackborn    pthread_mutex_unlock(&gParcelGlobalAllocSizeLock);
370a4cff88d80bf1acbdbd063af88ecad83a8b9b7b4Dianne Hackborn    return size;
3717e790af756d7891cb1cf1374bb283a8fbcbe6b49Dianne Hackborn}
3727e790af756d7891cb1cf1374bb283a8fbcbe6b49Dianne Hackborn
3737e790af756d7891cb1cf1374bb283a8fbcbe6b49Dianne Hackbornsize_t Parcel::getGlobalAllocCount() {
374a4cff88d80bf1acbdbd063af88ecad83a8b9b7b4Dianne Hackborn    pthread_mutex_lock(&gParcelGlobalAllocSizeLock);
375a4cff88d80bf1acbdbd063af88ecad83a8b9b7b4Dianne Hackborn    size_t count = gParcelGlobalAllocCount;
376a4cff88d80bf1acbdbd063af88ecad83a8b9b7b4Dianne Hackborn    pthread_mutex_unlock(&gParcelGlobalAllocSizeLock);
377a4cff88d80bf1acbdbd063af88ecad83a8b9b7b4Dianne Hackborn    return count;
3787c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project}
3797c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project
3807c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Projectconst uint8_t* Parcel::data() const
3817c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project{
3827c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project    return mData;
3837c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project}
3847c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project
3857c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Projectsize_t Parcel::dataSize() const
3867c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project{
3877c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project    return (mDataSize > mDataPos ? mDataSize : mDataPos);
3887c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project}
3897c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project
3907c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Projectsize_t Parcel::dataAvail() const
3917c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project{
392cfe27deac7e0ede89a78b9f03fb4a4159d68be8eNick Kralevich    size_t result = dataSize() - dataPosition();
393cfe27deac7e0ede89a78b9f03fb4a4159d68be8eNick Kralevich    if (result > INT32_MAX) {
394cfe27deac7e0ede89a78b9f03fb4a4159d68be8eNick Kralevich        abort();
395cfe27deac7e0ede89a78b9f03fb4a4159d68be8eNick Kralevich    }
396cfe27deac7e0ede89a78b9f03fb4a4159d68be8eNick Kralevich    return result;
3977c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project}
3987c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project
3997c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Projectsize_t Parcel::dataPosition() const
4007c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project{
4017c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project    return mDataPos;
4027c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project}
4037c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project
4047c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Projectsize_t Parcel::dataCapacity() const
4057c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project{
4067c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project    return mDataCapacity;
4077c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project}
4087c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project
4097c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Projectstatus_t Parcel::setDataSize(size_t size)
4107c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project{
411b6b1423c87e457097875dc304fbbe38db6c41abdNick Kralevich    if (size > INT32_MAX) {
412b6b1423c87e457097875dc304fbbe38db6c41abdNick Kralevich        // don't accept size_t values which may have come from an
413b6b1423c87e457097875dc304fbbe38db6c41abdNick Kralevich        // inadvertent conversion from a negative int.
414b6b1423c87e457097875dc304fbbe38db6c41abdNick Kralevich        return BAD_VALUE;
415b6b1423c87e457097875dc304fbbe38db6c41abdNick Kralevich    }
416b6b1423c87e457097875dc304fbbe38db6c41abdNick Kralevich
4177c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project    status_t err;
4187c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project    err = continueWrite(size);
4197c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project    if (err == NO_ERROR) {
4207c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project        mDataSize = size;
421d4ecccfd206604a9b2d8a1220844fc2df85a5998Mark Salyzyn        ALOGV("setDataSize Setting data size of %p to %zu", this, mDataSize);
4227c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project    }
4237c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project    return err;
4247c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project}
4257c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project
4267c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Projectvoid Parcel::setDataPosition(size_t pos) const
4277c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project{
428b6b1423c87e457097875dc304fbbe38db6c41abdNick Kralevich    if (pos > INT32_MAX) {
429b6b1423c87e457097875dc304fbbe38db6c41abdNick Kralevich        // don't accept size_t values which may have come from an
430b6b1423c87e457097875dc304fbbe38db6c41abdNick Kralevich        // inadvertent conversion from a negative int.
431b6b1423c87e457097875dc304fbbe38db6c41abdNick Kralevich        abort();
432b6b1423c87e457097875dc304fbbe38db6c41abdNick Kralevich    }
433b6b1423c87e457097875dc304fbbe38db6c41abdNick Kralevich
4347c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project    mDataPos = pos;
4357c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project    mNextObjectHint = 0;
4367c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project}
4377c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project
4387c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Projectstatus_t Parcel::setDataCapacity(size_t size)
4397c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project{
440b6b1423c87e457097875dc304fbbe38db6c41abdNick Kralevich    if (size > INT32_MAX) {
441b6b1423c87e457097875dc304fbbe38db6c41abdNick Kralevich        // don't accept size_t values which may have come from an
442b6b1423c87e457097875dc304fbbe38db6c41abdNick Kralevich        // inadvertent conversion from a negative int.
443b6b1423c87e457097875dc304fbbe38db6c41abdNick Kralevich        return BAD_VALUE;
444b6b1423c87e457097875dc304fbbe38db6c41abdNick Kralevich    }
445b6b1423c87e457097875dc304fbbe38db6c41abdNick Kralevich
44697e2bcd76021b31c5064fd3f669bc3f450b4c952Dianne Hackborn    if (size > mDataCapacity) return continueWrite(size);
4477c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project    return NO_ERROR;
4487c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project}
4497c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project
4507c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Projectstatus_t Parcel::setData(const uint8_t* buffer, size_t len)
4517c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project{
452b6b1423c87e457097875dc304fbbe38db6c41abdNick Kralevich    if (len > INT32_MAX) {
453b6b1423c87e457097875dc304fbbe38db6c41abdNick Kralevich        // don't accept size_t values which may have come from an
454b6b1423c87e457097875dc304fbbe38db6c41abdNick Kralevich        // inadvertent conversion from a negative int.
455b6b1423c87e457097875dc304fbbe38db6c41abdNick Kralevich        return BAD_VALUE;
456b6b1423c87e457097875dc304fbbe38db6c41abdNick Kralevich    }
457b6b1423c87e457097875dc304fbbe38db6c41abdNick Kralevich
4587c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project    status_t err = restartWrite(len);
4597c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project    if (err == NO_ERROR) {
4607c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project        memcpy(const_cast<uint8_t*>(data()), buffer, len);
4617c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project        mDataSize = len;
4627c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project        mFdsKnown = false;
4637c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project    }
4647c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project    return err;
4657c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project}
4667c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project
46751faf46e2958c57dab46d9420e585319125c7c42Andreas Huberstatus_t Parcel::appendFrom(const Parcel *parcel, size_t offset, size_t len)
4687c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project{
4697c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project    const sp<ProcessState> proc(ProcessState::self());
4707c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project    status_t err;
47151faf46e2958c57dab46d9420e585319125c7c42Andreas Huber    const uint8_t *data = parcel->mData;
47284e625ac1e01f5a9c3ed16664da6498212ed662bArve Hjønnevåg    const binder_size_t *objects = parcel->mObjects;
4737c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project    size_t size = parcel->mObjectsSize;
4747c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project    int startPos = mDataPos;
4757c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project    int firstIndex = -1, lastIndex = -2;
4767c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project
4777c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project    if (len == 0) {
4787c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project        return NO_ERROR;
4797c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project    }
4807c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project
481b6b1423c87e457097875dc304fbbe38db6c41abdNick Kralevich    if (len > INT32_MAX) {
482b6b1423c87e457097875dc304fbbe38db6c41abdNick Kralevich        // don't accept size_t values which may have come from an
483b6b1423c87e457097875dc304fbbe38db6c41abdNick Kralevich        // inadvertent conversion from a negative int.
484b6b1423c87e457097875dc304fbbe38db6c41abdNick Kralevich        return BAD_VALUE;
485b6b1423c87e457097875dc304fbbe38db6c41abdNick Kralevich    }
486b6b1423c87e457097875dc304fbbe38db6c41abdNick Kralevich
4877c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project    // range checks against the source parcel size
4887c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project    if ((offset > parcel->mDataSize)
4897c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project            || (len > parcel->mDataSize)
4907c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project            || (offset + len > parcel->mDataSize)) {
4917c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project        return BAD_VALUE;
4927c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project    }
4937c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project
4947c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project    // Count objects in range
4957c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project    for (int i = 0; i < (int) size; i++) {
4967c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project        size_t off = objects[i];
49727182be9f20f4f5b48316666429f09b9ecc1f22eChristopher Tate        if ((off >= offset) && (off + sizeof(flat_binder_object) <= offset + len)) {
4987c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project            if (firstIndex == -1) {
4997c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project                firstIndex = i;
5007c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project            }
5017c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project            lastIndex = i;
5027c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project        }
5037c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project    }
5047c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project    int numObjects = lastIndex - firstIndex + 1;
5057c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project
50697e2bcd76021b31c5064fd3f669bc3f450b4c952Dianne Hackborn    if ((mDataSize+len) > mDataCapacity) {
50797e2bcd76021b31c5064fd3f669bc3f450b4c952Dianne Hackborn        // grow data
50897e2bcd76021b31c5064fd3f669bc3f450b4c952Dianne Hackborn        err = growData(len);
50997e2bcd76021b31c5064fd3f669bc3f450b4c952Dianne Hackborn        if (err != NO_ERROR) {
51097e2bcd76021b31c5064fd3f669bc3f450b4c952Dianne Hackborn            return err;
51197e2bcd76021b31c5064fd3f669bc3f450b4c952Dianne Hackborn        }
5127c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project    }
5137c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project
5147c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project    // append data
5157c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project    memcpy(mData + mDataPos, data + offset, len);
5167c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project    mDataPos += len;
5177c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project    mDataSize += len;
5187c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project
5198938ed2c8e906fc332301b64787728d4d34da571Dianne Hackborn    err = NO_ERROR;
5208938ed2c8e906fc332301b64787728d4d34da571Dianne Hackborn
5217c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project    if (numObjects > 0) {
5227c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project        // grow objects
5237c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project        if (mObjectsCapacity < mObjectsSize + numObjects) {
524ed7a50cc7d490ae7aece2d16422c5f7941876468Christopher Tate            size_t newSize = ((mObjectsSize + numObjects)*3)/2;
525442351128906471310730663613013ce7051dd18Christopher Tate            if (newSize*sizeof(binder_size_t) < mObjectsSize) return NO_MEMORY;   // overflow
52684e625ac1e01f5a9c3ed16664da6498212ed662bArve Hjønnevåg            binder_size_t *objects =
52784e625ac1e01f5a9c3ed16664da6498212ed662bArve Hjønnevåg                (binder_size_t*)realloc(mObjects, newSize*sizeof(binder_size_t));
52884e625ac1e01f5a9c3ed16664da6498212ed662bArve Hjønnevåg            if (objects == (binder_size_t*)0) {
5297c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project                return NO_MEMORY;
5307c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project            }
5317c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project            mObjects = objects;
5327c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project            mObjectsCapacity = newSize;
5337c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project        }
534d4ecccfd206604a9b2d8a1220844fc2df85a5998Mark Salyzyn
5357c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project        // append and acquire objects
5367c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project        int idx = mObjectsSize;
5377c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project        for (int i = firstIndex; i <= lastIndex; i++) {
5387c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project            size_t off = objects[i] - offset + startPos;
5397c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project            mObjects[idx++] = off;
5407c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project            mObjectsSize++;
5417c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project
5428af0f82d89b029edf7e104a36a9a6e48a92f9e93Dianne Hackborn            flat_binder_object* flat
5437c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project                = reinterpret_cast<flat_binder_object*>(mData + off);
544cbf3726357966539c2a685f46e61c3fc8937f19eAdrian Roos            acquire_object(proc, *flat, this, &mOpenAshmemSize);
5457c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project
5467c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project            if (flat->type == BINDER_TYPE_FD) {
5478af0f82d89b029edf7e104a36a9a6e48a92f9e93Dianne Hackborn                // If this is a file descriptor, we need to dup it so the
5488af0f82d89b029edf7e104a36a9a6e48a92f9e93Dianne Hackborn                // new Parcel now owns its own fd, and can declare that we
5498af0f82d89b029edf7e104a36a9a6e48a92f9e93Dianne Hackborn                // officially know we have fds.
550ec9ec7d55c63f791ab3ed9221e68d6215f7b928aNick Kralevich                flat->handle = fcntl(flat->handle, F_DUPFD_CLOEXEC, 0);
55184e625ac1e01f5a9c3ed16664da6498212ed662bArve Hjønnevåg                flat->cookie = 1;
5527c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project                mHasFds = mFdsKnown = true;
5538938ed2c8e906fc332301b64787728d4d34da571Dianne Hackborn                if (!mAllowFds) {
5548938ed2c8e906fc332301b64787728d4d34da571Dianne Hackborn                    err = FDS_NOT_ALLOWED;
5558938ed2c8e906fc332301b64787728d4d34da571Dianne Hackborn                }
5567c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project            }
5577c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project        }
5587c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project    }
5597c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project
5608938ed2c8e906fc332301b64787728d4d34da571Dianne Hackborn    return err;
5618938ed2c8e906fc332301b64787728d4d34da571Dianne Hackborn}
5628938ed2c8e906fc332301b64787728d4d34da571Dianne Hackborn
56315feb9b55a0ea1d4a4e21a6425965b1004fdbc8bDianne Hackbornint Parcel::compareData(const Parcel& other) {
56415feb9b55a0ea1d4a4e21a6425965b1004fdbc8bDianne Hackborn    size_t size = dataSize();
56515feb9b55a0ea1d4a4e21a6425965b1004fdbc8bDianne Hackborn    if (size != other.dataSize()) {
56615feb9b55a0ea1d4a4e21a6425965b1004fdbc8bDianne Hackborn        return size < other.dataSize() ? -1 : 1;
56715feb9b55a0ea1d4a4e21a6425965b1004fdbc8bDianne Hackborn    }
56815feb9b55a0ea1d4a4e21a6425965b1004fdbc8bDianne Hackborn    return memcmp(data(), other.data(), size);
56915feb9b55a0ea1d4a4e21a6425965b1004fdbc8bDianne Hackborn}
57015feb9b55a0ea1d4a4e21a6425965b1004fdbc8bDianne Hackborn
57113b1604018968408bcc5553e1fa5ea9df3e4e009Jeff Brownbool Parcel::allowFds() const
57213b1604018968408bcc5553e1fa5ea9df3e4e009Jeff Brown{
57313b1604018968408bcc5553e1fa5ea9df3e4e009Jeff Brown    return mAllowFds;
57413b1604018968408bcc5553e1fa5ea9df3e4e009Jeff Brown}
57513b1604018968408bcc5553e1fa5ea9df3e4e009Jeff Brown
5767746cc318829358bb2c4dc0a03d40a7856a6d13eDianne Hackbornbool Parcel::pushAllowFds(bool allowFds)
5778938ed2c8e906fc332301b64787728d4d34da571Dianne Hackborn{
5788938ed2c8e906fc332301b64787728d4d34da571Dianne Hackborn    const bool origValue = mAllowFds;
5797746cc318829358bb2c4dc0a03d40a7856a6d13eDianne Hackborn    if (!allowFds) {
5807746cc318829358bb2c4dc0a03d40a7856a6d13eDianne Hackborn        mAllowFds = false;
5817746cc318829358bb2c4dc0a03d40a7856a6d13eDianne Hackborn    }
5828938ed2c8e906fc332301b64787728d4d34da571Dianne Hackborn    return origValue;
5837c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project}
5847c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project
5857746cc318829358bb2c4dc0a03d40a7856a6d13eDianne Hackbornvoid Parcel::restoreAllowFds(bool lastValue)
5867746cc318829358bb2c4dc0a03d40a7856a6d13eDianne Hackborn{
5877746cc318829358bb2c4dc0a03d40a7856a6d13eDianne Hackborn    mAllowFds = lastValue;
5887746cc318829358bb2c4dc0a03d40a7856a6d13eDianne Hackborn}
5897746cc318829358bb2c4dc0a03d40a7856a6d13eDianne Hackborn
5907c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Projectbool Parcel::hasFileDescriptors() const
5917c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project{
5927c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project    if (!mFdsKnown) {
5937c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project        scanForFds();
5947c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project    }
5957c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project    return mHasFds;
5967c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project}
5977c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project
598702ea9d42f52fc145090c0f0bfbe64993e4b8b33Brad Fitzpatrick// Write RPC headers.  (previously just the interface token)
5997c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Projectstatus_t Parcel::writeInterfaceToken(const String16& interface)
6007c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project{
601a877cd85b5a026384542e3271fc310d6a8fe24c6Brad Fitzpatrick    writeInt32(IPCThreadState::self()->getStrictModePolicy() |
602a877cd85b5a026384542e3271fc310d6a8fe24c6Brad Fitzpatrick               STRICT_MODE_PENALTY_GATHER);
6037c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project    // currently the interface identification token is just its name as a string
6047c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project    return writeString16(interface);
6057c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project}
6067c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project
60783c0446f27b9542d6c2e724817b2b2d8d1f55085Mathias Agopianbool Parcel::checkInterface(IBinder* binder) const
60883c0446f27b9542d6c2e724817b2b2d8d1f55085Mathias Agopian{
609702ea9d42f52fc145090c0f0bfbe64993e4b8b33Brad Fitzpatrick    return enforceInterface(binder->getInterfaceDescriptor());
61083c0446f27b9542d6c2e724817b2b2d8d1f55085Mathias Agopian}
61183c0446f27b9542d6c2e724817b2b2d8d1f55085Mathias Agopian
612a877cd85b5a026384542e3271fc310d6a8fe24c6Brad Fitzpatrickbool Parcel::enforceInterface(const String16& interface,
61370081a1511955f53bd0ed7f2aec9a1bf09f0f379Brad Fitzpatrick                              IPCThreadState* threadState) const
6147c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project{
61570081a1511955f53bd0ed7f2aec9a1bf09f0f379Brad Fitzpatrick    int32_t strictPolicy = readInt32();
61670081a1511955f53bd0ed7f2aec9a1bf09f0f379Brad Fitzpatrick    if (threadState == NULL) {
61770081a1511955f53bd0ed7f2aec9a1bf09f0f379Brad Fitzpatrick        threadState = IPCThreadState::self();
618a877cd85b5a026384542e3271fc310d6a8fe24c6Brad Fitzpatrick    }
6195273603e98d2db3bac656b7bcf5352c04c86d62fBrad Fitzpatrick    if ((threadState->getLastTransactionBinderFlags() &
6205273603e98d2db3bac656b7bcf5352c04c86d62fBrad Fitzpatrick         IBinder::FLAG_ONEWAY) != 0) {
6215273603e98d2db3bac656b7bcf5352c04c86d62fBrad Fitzpatrick      // For one-way calls, the callee is running entirely
6225273603e98d2db3bac656b7bcf5352c04c86d62fBrad Fitzpatrick      // disconnected from the caller, so disable StrictMode entirely.
6235273603e98d2db3bac656b7bcf5352c04c86d62fBrad Fitzpatrick      // Not only does disk/network usage not impact the caller, but
6245273603e98d2db3bac656b7bcf5352c04c86d62fBrad Fitzpatrick      // there's no way to commuicate back any violations anyway.
6255273603e98d2db3bac656b7bcf5352c04c86d62fBrad Fitzpatrick      threadState->setStrictModePolicy(0);
6265273603e98d2db3bac656b7bcf5352c04c86d62fBrad Fitzpatrick    } else {
6275273603e98d2db3bac656b7bcf5352c04c86d62fBrad Fitzpatrick      threadState->setStrictModePolicy(strictPolicy);
6285273603e98d2db3bac656b7bcf5352c04c86d62fBrad Fitzpatrick    }
62983c0446f27b9542d6c2e724817b2b2d8d1f55085Mathias Agopian    const String16 str(readString16());
6307c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project    if (str == interface) {
6317c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project        return true;
6327c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project    } else {
633d4ecccfd206604a9b2d8a1220844fc2df85a5998Mark Salyzyn        ALOGW("**** enforceInterface() expected '%s' but read '%s'",
6347c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project                String8(interface).string(), String8(str).string());
6357c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project        return false;
6367c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project    }
637702ea9d42f52fc145090c0f0bfbe64993e4b8b33Brad Fitzpatrick}
6387c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project
63984e625ac1e01f5a9c3ed16664da6498212ed662bArve Hjønnevågconst binder_size_t* Parcel::objects() const
6407c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project{
6417c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project    return mObjects;
6427c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project}
6437c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project
6447c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Projectsize_t Parcel::objectsCount() const
6457c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project{
6467c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project    return mObjectsSize;
6477c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project}
6487c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project
6497c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Projectstatus_t Parcel::errorCheck() const
6507c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project{
6517c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project    return mError;
6527c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project}
6537c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project
6547c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Projectvoid Parcel::setError(status_t err)
6557c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project{
6567c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project    mError = err;
6577c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project}
6587c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project
6597c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Projectstatus_t Parcel::finishWrite(size_t len)
6607c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project{
661b6b1423c87e457097875dc304fbbe38db6c41abdNick Kralevich    if (len > INT32_MAX) {
662b6b1423c87e457097875dc304fbbe38db6c41abdNick Kralevich        // don't accept size_t values which may have come from an
663b6b1423c87e457097875dc304fbbe38db6c41abdNick Kralevich        // inadvertent conversion from a negative int.
664b6b1423c87e457097875dc304fbbe38db6c41abdNick Kralevich        return BAD_VALUE;
665b6b1423c87e457097875dc304fbbe38db6c41abdNick Kralevich    }
666b6b1423c87e457097875dc304fbbe38db6c41abdNick Kralevich
6677c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project    //printf("Finish write of %d\n", len);
6687c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project    mDataPos += len;
669d4ecccfd206604a9b2d8a1220844fc2df85a5998Mark Salyzyn    ALOGV("finishWrite Setting data pos of %p to %zu", this, mDataPos);
6707c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project    if (mDataPos > mDataSize) {
6717c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project        mDataSize = mDataPos;
672d4ecccfd206604a9b2d8a1220844fc2df85a5998Mark Salyzyn        ALOGV("finishWrite Setting data size of %p to %zu", this, mDataSize);
6737c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project    }
6747c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project    //printf("New pos=%d, size=%d\n", mDataPos, mDataSize);
6757c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project    return NO_ERROR;
6767c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project}
6777c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project
6787c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Projectstatus_t Parcel::writeUnpadded(const void* data, size_t len)
6797c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project{
680b6b1423c87e457097875dc304fbbe38db6c41abdNick Kralevich    if (len > INT32_MAX) {
681b6b1423c87e457097875dc304fbbe38db6c41abdNick Kralevich        // don't accept size_t values which may have come from an
682b6b1423c87e457097875dc304fbbe38db6c41abdNick Kralevich        // inadvertent conversion from a negative int.
683b6b1423c87e457097875dc304fbbe38db6c41abdNick Kralevich        return BAD_VALUE;
684b6b1423c87e457097875dc304fbbe38db6c41abdNick Kralevich    }
685b6b1423c87e457097875dc304fbbe38db6c41abdNick Kralevich
6867c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project    size_t end = mDataPos + len;
6877c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project    if (end < mDataPos) {
6887c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project        // integer overflow
6897c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project        return BAD_VALUE;
6907c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project    }
6917c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project
6927c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project    if (end <= mDataCapacity) {
6937c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Projectrestart_write:
6947c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project        memcpy(mData+mDataPos, data, len);
6957c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project        return finishWrite(len);
6967c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project    }
6977c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project
6987c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project    status_t err = growData(len);
6997c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project    if (err == NO_ERROR) goto restart_write;
7007c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project    return err;
7017c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project}
7027c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project
7037c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Projectstatus_t Parcel::write(const void* data, size_t len)
7047c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project{
705b6b1423c87e457097875dc304fbbe38db6c41abdNick Kralevich    if (len > INT32_MAX) {
706b6b1423c87e457097875dc304fbbe38db6c41abdNick Kralevich        // don't accept size_t values which may have come from an
707b6b1423c87e457097875dc304fbbe38db6c41abdNick Kralevich        // inadvertent conversion from a negative int.
708b6b1423c87e457097875dc304fbbe38db6c41abdNick Kralevich        return BAD_VALUE;
709b6b1423c87e457097875dc304fbbe38db6c41abdNick Kralevich    }
710b6b1423c87e457097875dc304fbbe38db6c41abdNick Kralevich
7117c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project    void* const d = writeInplace(len);
7127c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project    if (d) {
7137c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project        memcpy(d, data, len);
7147c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project        return NO_ERROR;
7157c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project    }
7167c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project    return mError;
7177c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project}
7187c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project
7197c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Projectvoid* Parcel::writeInplace(size_t len)
7207c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project{
721b6b1423c87e457097875dc304fbbe38db6c41abdNick Kralevich    if (len > INT32_MAX) {
722b6b1423c87e457097875dc304fbbe38db6c41abdNick Kralevich        // don't accept size_t values which may have come from an
723b6b1423c87e457097875dc304fbbe38db6c41abdNick Kralevich        // inadvertent conversion from a negative int.
724b6b1423c87e457097875dc304fbbe38db6c41abdNick Kralevich        return NULL;
725b6b1423c87e457097875dc304fbbe38db6c41abdNick Kralevich    }
726b6b1423c87e457097875dc304fbbe38db6c41abdNick Kralevich
727b6b1423c87e457097875dc304fbbe38db6c41abdNick Kralevich    const size_t padded = pad_size(len);
7287c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project
7297c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project    // sanity check for integer overflow
7307c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project    if (mDataPos+padded < mDataPos) {
7317c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project        return NULL;
7327c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project    }
7337c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project
7347c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project    if ((mDataPos+padded) <= mDataCapacity) {
7357c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Projectrestart_write:
7367c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project        //printf("Writing %ld bytes, padded to %ld\n", len, padded);
7377c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project        uint8_t* const data = mData+mDataPos;
7387c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project
7397c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project        // Need to pad at end?
7407c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project        if (padded != len) {
7417c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project#if BYTE_ORDER == BIG_ENDIAN
7427c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project            static const uint32_t mask[4] = {
7437c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project                0x00000000, 0xffffff00, 0xffff0000, 0xff000000
7447c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project            };
7457c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project#endif
7467c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project#if BYTE_ORDER == LITTLE_ENDIAN
7477c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project            static const uint32_t mask[4] = {
7487c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project                0x00000000, 0x00ffffff, 0x0000ffff, 0x000000ff
7497c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project            };
7507c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project#endif
7517c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project            //printf("Applying pad mask: %p to %p\n", (void*)mask[padded-len],
7527c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project            //    *reinterpret_cast<void**>(data+padded-4));
7537c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project            *reinterpret_cast<uint32_t*>(data+padded-4) &= mask[padded-len];
7547c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project        }
7557c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project
7567c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project        finishWrite(padded);
7577c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project        return data;
7587c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project    }
7597c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project
7607c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project    status_t err = growData(padded);
7617c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project    if (err == NO_ERROR) goto restart_write;
7627c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project    return NULL;
7637c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project}
7647c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project
7659a5e32f141fdb43edc1bb31ceacec781b35281b3Christopher Wileystatus_t Parcel::writeUtf8AsUtf16(const std::string& str) {
7669a5e32f141fdb43edc1bb31ceacec781b35281b3Christopher Wiley    const uint8_t* strData = (uint8_t*)str.data();
7679a5e32f141fdb43edc1bb31ceacec781b35281b3Christopher Wiley    const size_t strLen= str.length();
7689a5e32f141fdb43edc1bb31ceacec781b35281b3Christopher Wiley    const ssize_t utf16Len = utf8_to_utf16_length(strData, strLen);
769f4607438f2df5f33c77d86e1b84db92af4f60f62Sergio Giro    if (utf16Len < 0 || utf16Len > std::numeric_limits<int32_t>::max()) {
7709a5e32f141fdb43edc1bb31ceacec781b35281b3Christopher Wiley        return BAD_VALUE;
7719a5e32f141fdb43edc1bb31ceacec781b35281b3Christopher Wiley    }
7729a5e32f141fdb43edc1bb31ceacec781b35281b3Christopher Wiley
7739a5e32f141fdb43edc1bb31ceacec781b35281b3Christopher Wiley    status_t err = writeInt32(utf16Len);
7749a5e32f141fdb43edc1bb31ceacec781b35281b3Christopher Wiley    if (err) {
7759a5e32f141fdb43edc1bb31ceacec781b35281b3Christopher Wiley        return err;
7769a5e32f141fdb43edc1bb31ceacec781b35281b3Christopher Wiley    }
7779a5e32f141fdb43edc1bb31ceacec781b35281b3Christopher Wiley
7789a5e32f141fdb43edc1bb31ceacec781b35281b3Christopher Wiley    // Allocate enough bytes to hold our converted string and its terminating NULL.
7799a5e32f141fdb43edc1bb31ceacec781b35281b3Christopher Wiley    void* dst = writeInplace((utf16Len + 1) * sizeof(char16_t));
7809a5e32f141fdb43edc1bb31ceacec781b35281b3Christopher Wiley    if (!dst) {
7819a5e32f141fdb43edc1bb31ceacec781b35281b3Christopher Wiley        return NO_MEMORY;
7829a5e32f141fdb43edc1bb31ceacec781b35281b3Christopher Wiley    }
7839a5e32f141fdb43edc1bb31ceacec781b35281b3Christopher Wiley
784f4607438f2df5f33c77d86e1b84db92af4f60f62Sergio Giro    utf8_to_utf16(strData, strLen, (char16_t*)dst, (size_t) utf16Len + 1);
7859a5e32f141fdb43edc1bb31ceacec781b35281b3Christopher Wiley
7869a5e32f141fdb43edc1bb31ceacec781b35281b3Christopher Wiley    return NO_ERROR;
7879a5e32f141fdb43edc1bb31ceacec781b35281b3Christopher Wiley}
7889a5e32f141fdb43edc1bb31ceacec781b35281b3Christopher Wiley
7899a5e32f141fdb43edc1bb31ceacec781b35281b3Christopher Wileystatus_t Parcel::writeUtf8AsUtf16(const std::unique_ptr<std::string>& str) {
7909a5e32f141fdb43edc1bb31ceacec781b35281b3Christopher Wiley  if (!str) {
7919a5e32f141fdb43edc1bb31ceacec781b35281b3Christopher Wiley    return writeInt32(-1);
7929a5e32f141fdb43edc1bb31ceacec781b35281b3Christopher Wiley  }
7939a5e32f141fdb43edc1bb31ceacec781b35281b3Christopher Wiley  return writeUtf8AsUtf16(*str);
7949a5e32f141fdb43edc1bb31ceacec781b35281b3Christopher Wiley}
7959a5e32f141fdb43edc1bb31ceacec781b35281b3Christopher Wiley
796185d3447d8a62d4d93d19125b82dbc3f9e12dda2Casey Dahlinnamespace {
797b9872623ca0f2366c348d6d40a8ba45ee0e87710Casey Dahlin
798185d3447d8a62d4d93d19125b82dbc3f9e12dda2Casey Dahlintemplate<typename T>
799185d3447d8a62d4d93d19125b82dbc3f9e12dda2Casey Dahlinstatus_t writeByteVectorInternal(Parcel* parcel, const std::vector<T>& val)
800451ff582d730e27f4e22d9f158f8ee24d1bc2729Casey Dahlin{
8015f0625695ce6999ec70f5699f70a8a0fa84a1bf6Casey Dahlin    status_t status;
802451ff582d730e27f4e22d9f158f8ee24d1bc2729Casey Dahlin    if (val.size() > std::numeric_limits<int32_t>::max()) {
8035f0625695ce6999ec70f5699f70a8a0fa84a1bf6Casey Dahlin        status = BAD_VALUE;
8045f0625695ce6999ec70f5699f70a8a0fa84a1bf6Casey Dahlin        return status;
805451ff582d730e27f4e22d9f158f8ee24d1bc2729Casey Dahlin    }
806451ff582d730e27f4e22d9f158f8ee24d1bc2729Casey Dahlin
807185d3447d8a62d4d93d19125b82dbc3f9e12dda2Casey Dahlin    status = parcel->writeInt32(val.size());
808451ff582d730e27f4e22d9f158f8ee24d1bc2729Casey Dahlin    if (status != OK) {
809451ff582d730e27f4e22d9f158f8ee24d1bc2729Casey Dahlin        return status;
810451ff582d730e27f4e22d9f158f8ee24d1bc2729Casey Dahlin    }
811451ff582d730e27f4e22d9f158f8ee24d1bc2729Casey Dahlin
812185d3447d8a62d4d93d19125b82dbc3f9e12dda2Casey Dahlin    void* data = parcel->writeInplace(val.size());
8135f0625695ce6999ec70f5699f70a8a0fa84a1bf6Casey Dahlin    if (!data) {
8145f0625695ce6999ec70f5699f70a8a0fa84a1bf6Casey Dahlin        status = BAD_VALUE;
8155f0625695ce6999ec70f5699f70a8a0fa84a1bf6Casey Dahlin        return status;
816451ff582d730e27f4e22d9f158f8ee24d1bc2729Casey Dahlin    }
817451ff582d730e27f4e22d9f158f8ee24d1bc2729Casey Dahlin
8185f0625695ce6999ec70f5699f70a8a0fa84a1bf6Casey Dahlin    memcpy(data, val.data(), val.size());
8195f0625695ce6999ec70f5699f70a8a0fa84a1bf6Casey Dahlin    return status;
820451ff582d730e27f4e22d9f158f8ee24d1bc2729Casey Dahlin}
821451ff582d730e27f4e22d9f158f8ee24d1bc2729Casey Dahlin
822185d3447d8a62d4d93d19125b82dbc3f9e12dda2Casey Dahlintemplate<typename T>
823185d3447d8a62d4d93d19125b82dbc3f9e12dda2Casey Dahlinstatus_t writeByteVectorInternalPtr(Parcel* parcel,
824185d3447d8a62d4d93d19125b82dbc3f9e12dda2Casey Dahlin                                    const std::unique_ptr<std::vector<T>>& val)
825185d3447d8a62d4d93d19125b82dbc3f9e12dda2Casey Dahlin{
826185d3447d8a62d4d93d19125b82dbc3f9e12dda2Casey Dahlin    if (!val) {
827185d3447d8a62d4d93d19125b82dbc3f9e12dda2Casey Dahlin        return parcel->writeInt32(-1);
828185d3447d8a62d4d93d19125b82dbc3f9e12dda2Casey Dahlin    }
829185d3447d8a62d4d93d19125b82dbc3f9e12dda2Casey Dahlin
830185d3447d8a62d4d93d19125b82dbc3f9e12dda2Casey Dahlin    return writeByteVectorInternal(parcel, *val);
831185d3447d8a62d4d93d19125b82dbc3f9e12dda2Casey Dahlin}
832185d3447d8a62d4d93d19125b82dbc3f9e12dda2Casey Dahlin
833185d3447d8a62d4d93d19125b82dbc3f9e12dda2Casey Dahlin}  // namespace
834185d3447d8a62d4d93d19125b82dbc3f9e12dda2Casey Dahlin
835185d3447d8a62d4d93d19125b82dbc3f9e12dda2Casey Dahlinstatus_t Parcel::writeByteVector(const std::vector<int8_t>& val) {
836185d3447d8a62d4d93d19125b82dbc3f9e12dda2Casey Dahlin    return writeByteVectorInternal(this, val);
837185d3447d8a62d4d93d19125b82dbc3f9e12dda2Casey Dahlin}
838185d3447d8a62d4d93d19125b82dbc3f9e12dda2Casey Dahlin
839185d3447d8a62d4d93d19125b82dbc3f9e12dda2Casey Dahlinstatus_t Parcel::writeByteVector(const std::unique_ptr<std::vector<int8_t>>& val)
840185d3447d8a62d4d93d19125b82dbc3f9e12dda2Casey Dahlin{
841185d3447d8a62d4d93d19125b82dbc3f9e12dda2Casey Dahlin    return writeByteVectorInternalPtr(this, val);
842185d3447d8a62d4d93d19125b82dbc3f9e12dda2Casey Dahlin}
843185d3447d8a62d4d93d19125b82dbc3f9e12dda2Casey Dahlin
844185d3447d8a62d4d93d19125b82dbc3f9e12dda2Casey Dahlinstatus_t Parcel::writeByteVector(const std::vector<uint8_t>& val) {
845185d3447d8a62d4d93d19125b82dbc3f9e12dda2Casey Dahlin    return writeByteVectorInternal(this, val);
846185d3447d8a62d4d93d19125b82dbc3f9e12dda2Casey Dahlin}
847185d3447d8a62d4d93d19125b82dbc3f9e12dda2Casey Dahlin
848185d3447d8a62d4d93d19125b82dbc3f9e12dda2Casey Dahlinstatus_t Parcel::writeByteVector(const std::unique_ptr<std::vector<uint8_t>>& val)
849185d3447d8a62d4d93d19125b82dbc3f9e12dda2Casey Dahlin{
850185d3447d8a62d4d93d19125b82dbc3f9e12dda2Casey Dahlin    return writeByteVectorInternalPtr(this, val);
851185d3447d8a62d4d93d19125b82dbc3f9e12dda2Casey Dahlin}
852185d3447d8a62d4d93d19125b82dbc3f9e12dda2Casey Dahlin
8535f0625695ce6999ec70f5699f70a8a0fa84a1bf6Casey Dahlinstatus_t Parcel::writeInt32Vector(const std::vector<int32_t>& val)
854451ff582d730e27f4e22d9f158f8ee24d1bc2729Casey Dahlin{
85503d1eb6bf90bcd0a04b176988478d2e939d3fba0Christopher Wiley    return writeTypedVector(val, &Parcel::writeInt32);
8565f0625695ce6999ec70f5699f70a8a0fa84a1bf6Casey Dahlin}
857451ff582d730e27f4e22d9f158f8ee24d1bc2729Casey Dahlin
858b9872623ca0f2366c348d6d40a8ba45ee0e87710Casey Dahlinstatus_t Parcel::writeInt32Vector(const std::unique_ptr<std::vector<int32_t>>& val)
859b9872623ca0f2366c348d6d40a8ba45ee0e87710Casey Dahlin{
860b9872623ca0f2366c348d6d40a8ba45ee0e87710Casey Dahlin    return writeNullableTypedVector(val, &Parcel::writeInt32);
861b9872623ca0f2366c348d6d40a8ba45ee0e87710Casey Dahlin}
862b9872623ca0f2366c348d6d40a8ba45ee0e87710Casey Dahlin
8635f0625695ce6999ec70f5699f70a8a0fa84a1bf6Casey Dahlinstatus_t Parcel::writeInt64Vector(const std::vector<int64_t>& val)
8645f0625695ce6999ec70f5699f70a8a0fa84a1bf6Casey Dahlin{
86503d1eb6bf90bcd0a04b176988478d2e939d3fba0Christopher Wiley    return writeTypedVector(val, &Parcel::writeInt64);
8665f0625695ce6999ec70f5699f70a8a0fa84a1bf6Casey Dahlin}
867451ff582d730e27f4e22d9f158f8ee24d1bc2729Casey Dahlin
868b9872623ca0f2366c348d6d40a8ba45ee0e87710Casey Dahlinstatus_t Parcel::writeInt64Vector(const std::unique_ptr<std::vector<int64_t>>& val)
869b9872623ca0f2366c348d6d40a8ba45ee0e87710Casey Dahlin{
870b9872623ca0f2366c348d6d40a8ba45ee0e87710Casey Dahlin    return writeNullableTypedVector(val, &Parcel::writeInt64);
871b9872623ca0f2366c348d6d40a8ba45ee0e87710Casey Dahlin}
872b9872623ca0f2366c348d6d40a8ba45ee0e87710Casey Dahlin
8735f0625695ce6999ec70f5699f70a8a0fa84a1bf6Casey Dahlinstatus_t Parcel::writeFloatVector(const std::vector<float>& val)
8745f0625695ce6999ec70f5699f70a8a0fa84a1bf6Casey Dahlin{
87503d1eb6bf90bcd0a04b176988478d2e939d3fba0Christopher Wiley    return writeTypedVector(val, &Parcel::writeFloat);
8765f0625695ce6999ec70f5699f70a8a0fa84a1bf6Casey Dahlin}
877451ff582d730e27f4e22d9f158f8ee24d1bc2729Casey Dahlin
878b9872623ca0f2366c348d6d40a8ba45ee0e87710Casey Dahlinstatus_t Parcel::writeFloatVector(const std::unique_ptr<std::vector<float>>& val)
879b9872623ca0f2366c348d6d40a8ba45ee0e87710Casey Dahlin{
880b9872623ca0f2366c348d6d40a8ba45ee0e87710Casey Dahlin    return writeNullableTypedVector(val, &Parcel::writeFloat);
881b9872623ca0f2366c348d6d40a8ba45ee0e87710Casey Dahlin}
882b9872623ca0f2366c348d6d40a8ba45ee0e87710Casey Dahlin
8835f0625695ce6999ec70f5699f70a8a0fa84a1bf6Casey Dahlinstatus_t Parcel::writeDoubleVector(const std::vector<double>& val)
8845f0625695ce6999ec70f5699f70a8a0fa84a1bf6Casey Dahlin{
88503d1eb6bf90bcd0a04b176988478d2e939d3fba0Christopher Wiley    return writeTypedVector(val, &Parcel::writeDouble);
886451ff582d730e27f4e22d9f158f8ee24d1bc2729Casey Dahlin}
887451ff582d730e27f4e22d9f158f8ee24d1bc2729Casey Dahlin
888b9872623ca0f2366c348d6d40a8ba45ee0e87710Casey Dahlinstatus_t Parcel::writeDoubleVector(const std::unique_ptr<std::vector<double>>& val)
889b9872623ca0f2366c348d6d40a8ba45ee0e87710Casey Dahlin{
890b9872623ca0f2366c348d6d40a8ba45ee0e87710Casey Dahlin    return writeNullableTypedVector(val, &Parcel::writeDouble);
891b9872623ca0f2366c348d6d40a8ba45ee0e87710Casey Dahlin}
892b9872623ca0f2366c348d6d40a8ba45ee0e87710Casey Dahlin
893451ff582d730e27f4e22d9f158f8ee24d1bc2729Casey Dahlinstatus_t Parcel::writeBoolVector(const std::vector<bool>& val)
894451ff582d730e27f4e22d9f158f8ee24d1bc2729Casey Dahlin{
89503d1eb6bf90bcd0a04b176988478d2e939d3fba0Christopher Wiley    return writeTypedVector(val, &Parcel::writeBool);
896451ff582d730e27f4e22d9f158f8ee24d1bc2729Casey Dahlin}
897451ff582d730e27f4e22d9f158f8ee24d1bc2729Casey Dahlin
898b9872623ca0f2366c348d6d40a8ba45ee0e87710Casey Dahlinstatus_t Parcel::writeBoolVector(const std::unique_ptr<std::vector<bool>>& val)
899b9872623ca0f2366c348d6d40a8ba45ee0e87710Casey Dahlin{
900b9872623ca0f2366c348d6d40a8ba45ee0e87710Casey Dahlin    return writeNullableTypedVector(val, &Parcel::writeBool);
901b9872623ca0f2366c348d6d40a8ba45ee0e87710Casey Dahlin}
902b9872623ca0f2366c348d6d40a8ba45ee0e87710Casey Dahlin
903451ff582d730e27f4e22d9f158f8ee24d1bc2729Casey Dahlinstatus_t Parcel::writeCharVector(const std::vector<char16_t>& val)
904451ff582d730e27f4e22d9f158f8ee24d1bc2729Casey Dahlin{
90503d1eb6bf90bcd0a04b176988478d2e939d3fba0Christopher Wiley    return writeTypedVector(val, &Parcel::writeChar);
906451ff582d730e27f4e22d9f158f8ee24d1bc2729Casey Dahlin}
907451ff582d730e27f4e22d9f158f8ee24d1bc2729Casey Dahlin
908b9872623ca0f2366c348d6d40a8ba45ee0e87710Casey Dahlinstatus_t Parcel::writeCharVector(const std::unique_ptr<std::vector<char16_t>>& val)
909b9872623ca0f2366c348d6d40a8ba45ee0e87710Casey Dahlin{
910b9872623ca0f2366c348d6d40a8ba45ee0e87710Casey Dahlin    return writeNullableTypedVector(val, &Parcel::writeChar);
911b9872623ca0f2366c348d6d40a8ba45ee0e87710Casey Dahlin}
912b9872623ca0f2366c348d6d40a8ba45ee0e87710Casey Dahlin
913451ff582d730e27f4e22d9f158f8ee24d1bc2729Casey Dahlinstatus_t Parcel::writeString16Vector(const std::vector<String16>& val)
914451ff582d730e27f4e22d9f158f8ee24d1bc2729Casey Dahlin{
91503d1eb6bf90bcd0a04b176988478d2e939d3fba0Christopher Wiley    return writeTypedVector(val, &Parcel::writeString16);
916451ff582d730e27f4e22d9f158f8ee24d1bc2729Casey Dahlin}
917451ff582d730e27f4e22d9f158f8ee24d1bc2729Casey Dahlin
918b9872623ca0f2366c348d6d40a8ba45ee0e87710Casey Dahlinstatus_t Parcel::writeString16Vector(
919b9872623ca0f2366c348d6d40a8ba45ee0e87710Casey Dahlin        const std::unique_ptr<std::vector<std::unique_ptr<String16>>>& val)
920b9872623ca0f2366c348d6d40a8ba45ee0e87710Casey Dahlin{
921b9872623ca0f2366c348d6d40a8ba45ee0e87710Casey Dahlin    return writeNullableTypedVector(val, &Parcel::writeString16);
922b9872623ca0f2366c348d6d40a8ba45ee0e87710Casey Dahlin}
923b9872623ca0f2366c348d6d40a8ba45ee0e87710Casey Dahlin
9249a5e32f141fdb43edc1bb31ceacec781b35281b3Christopher Wileystatus_t Parcel::writeUtf8VectorAsUtf16Vector(
9259a5e32f141fdb43edc1bb31ceacec781b35281b3Christopher Wiley                        const std::unique_ptr<std::vector<std::unique_ptr<std::string>>>& val) {
9269a5e32f141fdb43edc1bb31ceacec781b35281b3Christopher Wiley    return writeNullableTypedVector(val, &Parcel::writeUtf8AsUtf16);
9279a5e32f141fdb43edc1bb31ceacec781b35281b3Christopher Wiley}
9289a5e32f141fdb43edc1bb31ceacec781b35281b3Christopher Wiley
9299a5e32f141fdb43edc1bb31ceacec781b35281b3Christopher Wileystatus_t Parcel::writeUtf8VectorAsUtf16Vector(const std::vector<std::string>& val) {
9309a5e32f141fdb43edc1bb31ceacec781b35281b3Christopher Wiley    return writeTypedVector(val, &Parcel::writeUtf8AsUtf16);
9319a5e32f141fdb43edc1bb31ceacec781b35281b3Christopher Wiley}
9329a5e32f141fdb43edc1bb31ceacec781b35281b3Christopher Wiley
9337c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Projectstatus_t Parcel::writeInt32(int32_t val)
9347c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project{
93584a6d041e2c69d4d0b69269a0b59e725c9f119a3Andreas Huber    return writeAligned(val);
9367c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project}
93741a0f2f86c0ca7d2fef50aef6215987f445a7231Dan Stoza
93841a0f2f86c0ca7d2fef50aef6215987f445a7231Dan Stozastatus_t Parcel::writeUint32(uint32_t val)
93941a0f2f86c0ca7d2fef50aef6215987f445a7231Dan Stoza{
94041a0f2f86c0ca7d2fef50aef6215987f445a7231Dan Stoza    return writeAligned(val);
94141a0f2f86c0ca7d2fef50aef6215987f445a7231Dan Stoza}
94241a0f2f86c0ca7d2fef50aef6215987f445a7231Dan Stoza
9435c0106e134366312206702f1b072347e20c90374Marco Nelissenstatus_t Parcel::writeInt32Array(size_t len, const int32_t *val) {
944b6b1423c87e457097875dc304fbbe38db6c41abdNick Kralevich    if (len > INT32_MAX) {
945b6b1423c87e457097875dc304fbbe38db6c41abdNick Kralevich        // don't accept size_t values which may have come from an
946b6b1423c87e457097875dc304fbbe38db6c41abdNick Kralevich        // inadvertent conversion from a negative int.
947b6b1423c87e457097875dc304fbbe38db6c41abdNick Kralevich        return BAD_VALUE;
948b6b1423c87e457097875dc304fbbe38db6c41abdNick Kralevich    }
949b6b1423c87e457097875dc304fbbe38db6c41abdNick Kralevich
9505c0106e134366312206702f1b072347e20c90374Marco Nelissen    if (!val) {
951e59cb43edad0eff28a81b18c3c4484442ff680ddChad Brubaker        return writeInt32(-1);
9525c0106e134366312206702f1b072347e20c90374Marco Nelissen    }
953e59cb43edad0eff28a81b18c3c4484442ff680ddChad Brubaker    status_t ret = writeInt32(static_cast<uint32_t>(len));
9545c0106e134366312206702f1b072347e20c90374Marco Nelissen    if (ret == NO_ERROR) {
9555c0106e134366312206702f1b072347e20c90374Marco Nelissen        ret = write(val, len * sizeof(*val));
9565c0106e134366312206702f1b072347e20c90374Marco Nelissen    }
9575c0106e134366312206702f1b072347e20c90374Marco Nelissen    return ret;
9585c0106e134366312206702f1b072347e20c90374Marco Nelissen}
959f0190bff38b6c29abbfc4a877442f71fc3d7dad8Marco Nelissenstatus_t Parcel::writeByteArray(size_t len, const uint8_t *val) {
960b6b1423c87e457097875dc304fbbe38db6c41abdNick Kralevich    if (len > INT32_MAX) {
961b6b1423c87e457097875dc304fbbe38db6c41abdNick Kralevich        // don't accept size_t values which may have come from an
962b6b1423c87e457097875dc304fbbe38db6c41abdNick Kralevich        // inadvertent conversion from a negative int.
963b6b1423c87e457097875dc304fbbe38db6c41abdNick Kralevich        return BAD_VALUE;
964b6b1423c87e457097875dc304fbbe38db6c41abdNick Kralevich    }
965b6b1423c87e457097875dc304fbbe38db6c41abdNick Kralevich
966f0190bff38b6c29abbfc4a877442f71fc3d7dad8Marco Nelissen    if (!val) {
967e59cb43edad0eff28a81b18c3c4484442ff680ddChad Brubaker        return writeInt32(-1);
968f0190bff38b6c29abbfc4a877442f71fc3d7dad8Marco Nelissen    }
969e59cb43edad0eff28a81b18c3c4484442ff680ddChad Brubaker    status_t ret = writeInt32(static_cast<uint32_t>(len));
970f0190bff38b6c29abbfc4a877442f71fc3d7dad8Marco Nelissen    if (ret == NO_ERROR) {
971f0190bff38b6c29abbfc4a877442f71fc3d7dad8Marco Nelissen        ret = write(val, len * sizeof(*val));
972f0190bff38b6c29abbfc4a877442f71fc3d7dad8Marco Nelissen    }
973f0190bff38b6c29abbfc4a877442f71fc3d7dad8Marco Nelissen    return ret;
974f0190bff38b6c29abbfc4a877442f71fc3d7dad8Marco Nelissen}
9757c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project
976d6848f52e60be17b7f0992be7827dcae4ea2efb1Casey Dahlinstatus_t Parcel::writeBool(bool val)
977d6848f52e60be17b7f0992be7827dcae4ea2efb1Casey Dahlin{
978d6848f52e60be17b7f0992be7827dcae4ea2efb1Casey Dahlin    return writeInt32(int32_t(val));
979d6848f52e60be17b7f0992be7827dcae4ea2efb1Casey Dahlin}
980d6848f52e60be17b7f0992be7827dcae4ea2efb1Casey Dahlin
981d6848f52e60be17b7f0992be7827dcae4ea2efb1Casey Dahlinstatus_t Parcel::writeChar(char16_t val)
982d6848f52e60be17b7f0992be7827dcae4ea2efb1Casey Dahlin{
983d6848f52e60be17b7f0992be7827dcae4ea2efb1Casey Dahlin    return writeInt32(int32_t(val));
984d6848f52e60be17b7f0992be7827dcae4ea2efb1Casey Dahlin}
985d6848f52e60be17b7f0992be7827dcae4ea2efb1Casey Dahlin
986d6848f52e60be17b7f0992be7827dcae4ea2efb1Casey Dahlinstatus_t Parcel::writeByte(int8_t val)
987d6848f52e60be17b7f0992be7827dcae4ea2efb1Casey Dahlin{
988d6848f52e60be17b7f0992be7827dcae4ea2efb1Casey Dahlin    return writeInt32(int32_t(val));
989d6848f52e60be17b7f0992be7827dcae4ea2efb1Casey Dahlin}
990d6848f52e60be17b7f0992be7827dcae4ea2efb1Casey Dahlin
9917c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Projectstatus_t Parcel::writeInt64(int64_t val)
9927c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project{
99384a6d041e2c69d4d0b69269a0b59e725c9f119a3Andreas Huber    return writeAligned(val);
9947c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project}
9957c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project
9962d13afdfa1f43973bf3cb917c7d6496a38baa446Ronghua Wustatus_t Parcel::writeUint64(uint64_t val)
9972d13afdfa1f43973bf3cb917c7d6496a38baa446Ronghua Wu{
9982d13afdfa1f43973bf3cb917c7d6496a38baa446Ronghua Wu    return writeAligned(val);
9992d13afdfa1f43973bf3cb917c7d6496a38baa446Ronghua Wu}
10002d13afdfa1f43973bf3cb917c7d6496a38baa446Ronghua Wu
1001f683e0163a84d93448b9388126902242367cd961Serban Constantinescustatus_t Parcel::writePointer(uintptr_t val)
1002f683e0163a84d93448b9388126902242367cd961Serban Constantinescu{
100384e625ac1e01f5a9c3ed16664da6498212ed662bArve Hjønnevåg    return writeAligned<binder_uintptr_t>(val);
1004f683e0163a84d93448b9388126902242367cd961Serban Constantinescu}
1005f683e0163a84d93448b9388126902242367cd961Serban Constantinescu
10067c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Projectstatus_t Parcel::writeFloat(float val)
10077c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project{
100884a6d041e2c69d4d0b69269a0b59e725c9f119a3Andreas Huber    return writeAligned(val);
10097c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project}
10107c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project
1011cc1a4bb1e1da3f2f38bdaf1f76348c7bc9fb6adbDouglas Leung#if defined(__mips__) && defined(__mips_hard_float)
1012cc1a4bb1e1da3f2f38bdaf1f76348c7bc9fb6adbDouglas Leung
1013cc1a4bb1e1da3f2f38bdaf1f76348c7bc9fb6adbDouglas Leungstatus_t Parcel::writeDouble(double val)
1014cc1a4bb1e1da3f2f38bdaf1f76348c7bc9fb6adbDouglas Leung{
1015cc1a4bb1e1da3f2f38bdaf1f76348c7bc9fb6adbDouglas Leung    union {
1016cc1a4bb1e1da3f2f38bdaf1f76348c7bc9fb6adbDouglas Leung        double d;
1017cc1a4bb1e1da3f2f38bdaf1f76348c7bc9fb6adbDouglas Leung        unsigned long long ll;
1018cc1a4bb1e1da3f2f38bdaf1f76348c7bc9fb6adbDouglas Leung    } u;
1019cc1a4bb1e1da3f2f38bdaf1f76348c7bc9fb6adbDouglas Leung    u.d = val;
1020cc1a4bb1e1da3f2f38bdaf1f76348c7bc9fb6adbDouglas Leung    return writeAligned(u.ll);
1021cc1a4bb1e1da3f2f38bdaf1f76348c7bc9fb6adbDouglas Leung}
1022cc1a4bb1e1da3f2f38bdaf1f76348c7bc9fb6adbDouglas Leung
1023cc1a4bb1e1da3f2f38bdaf1f76348c7bc9fb6adbDouglas Leung#else
1024cc1a4bb1e1da3f2f38bdaf1f76348c7bc9fb6adbDouglas Leung
10257c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Projectstatus_t Parcel::writeDouble(double val)
10267c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project{
102784a6d041e2c69d4d0b69269a0b59e725c9f119a3Andreas Huber    return writeAligned(val);
102884a6d041e2c69d4d0b69269a0b59e725c9f119a3Andreas Huber}
10297c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project
1030cc1a4bb1e1da3f2f38bdaf1f76348c7bc9fb6adbDouglas Leung#endif
1031cc1a4bb1e1da3f2f38bdaf1f76348c7bc9fb6adbDouglas Leung
10327c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Projectstatus_t Parcel::writeCString(const char* str)
10337c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project{
10347c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project    return write(str, strlen(str)+1);
10357c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project}
10367c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project
10377c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Projectstatus_t Parcel::writeString8(const String8& str)
10387c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project{
10397c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project    status_t err = writeInt32(str.bytes());
1040d1dff8d4d47a5f9142a22b11950adc55ea2b36dfPravat Dalbehera    // only write string if its length is more than zero characters,
1041d1dff8d4d47a5f9142a22b11950adc55ea2b36dfPravat Dalbehera    // as readString8 will only read if the length field is non-zero.
1042d1dff8d4d47a5f9142a22b11950adc55ea2b36dfPravat Dalbehera    // this is slightly different from how writeString16 works.
1043d1dff8d4d47a5f9142a22b11950adc55ea2b36dfPravat Dalbehera    if (str.bytes() > 0 && err == NO_ERROR) {
10447c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project        err = write(str.string(), str.bytes()+1);
10457c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project    }
10467c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project    return err;
10477c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project}
10487c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project
1049b9872623ca0f2366c348d6d40a8ba45ee0e87710Casey Dahlinstatus_t Parcel::writeString16(const std::unique_ptr<String16>& str)
1050b9872623ca0f2366c348d6d40a8ba45ee0e87710Casey Dahlin{
1051b9872623ca0f2366c348d6d40a8ba45ee0e87710Casey Dahlin    if (!str) {
1052b9872623ca0f2366c348d6d40a8ba45ee0e87710Casey Dahlin        return writeInt32(-1);
1053b9872623ca0f2366c348d6d40a8ba45ee0e87710Casey Dahlin    }
1054b9872623ca0f2366c348d6d40a8ba45ee0e87710Casey Dahlin
1055b9872623ca0f2366c348d6d40a8ba45ee0e87710Casey Dahlin    return writeString16(*str);
1056b9872623ca0f2366c348d6d40a8ba45ee0e87710Casey Dahlin}
1057b9872623ca0f2366c348d6d40a8ba45ee0e87710Casey Dahlin
10587c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Projectstatus_t Parcel::writeString16(const String16& str)
10597c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project{
10607c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project    return writeString16(str.string(), str.size());
10617c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project}
10627c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project
10637c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Projectstatus_t Parcel::writeString16(const char16_t* str, size_t len)
10647c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project{
10657c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project    if (str == NULL) return writeInt32(-1);
1066d4ecccfd206604a9b2d8a1220844fc2df85a5998Mark Salyzyn
10677c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project    status_t err = writeInt32(len);
10687c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project    if (err == NO_ERROR) {
10697c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project        len *= sizeof(char16_t);
10707c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project        uint8_t* data = (uint8_t*)writeInplace(len+sizeof(char16_t));
10717c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project        if (data) {
10727c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project            memcpy(data, str, len);
10737c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project            *reinterpret_cast<char16_t*>(data+len) = 0;
10747c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project            return NO_ERROR;
10757c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project        }
10767c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project        err = mError;
10777c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project    }
10787c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project    return err;
10797c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project}
10807c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project
10817c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Projectstatus_t Parcel::writeStrongBinder(const sp<IBinder>& val)
10827c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project{
10837c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project    return flatten_binder(ProcessState::self(), val, this);
10847c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project}
10857c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project
1086eb8e15f9bb29f8794f8be819530631c358fd6a15Casey Dahlinstatus_t Parcel::writeStrongBinderVector(const std::vector<sp<IBinder>>& val)
1087eb8e15f9bb29f8794f8be819530631c358fd6a15Casey Dahlin{
108803d1eb6bf90bcd0a04b176988478d2e939d3fba0Christopher Wiley    return writeTypedVector(val, &Parcel::writeStrongBinder);
1089eb8e15f9bb29f8794f8be819530631c358fd6a15Casey Dahlin}
1090eb8e15f9bb29f8794f8be819530631c358fd6a15Casey Dahlin
1091b9872623ca0f2366c348d6d40a8ba45ee0e87710Casey Dahlinstatus_t Parcel::writeStrongBinderVector(const std::unique_ptr<std::vector<sp<IBinder>>>& val)
1092b9872623ca0f2366c348d6d40a8ba45ee0e87710Casey Dahlin{
1093b9872623ca0f2366c348d6d40a8ba45ee0e87710Casey Dahlin    return writeNullableTypedVector(val, &Parcel::writeStrongBinder);
1094b9872623ca0f2366c348d6d40a8ba45ee0e87710Casey Dahlin}
1095b9872623ca0f2366c348d6d40a8ba45ee0e87710Casey Dahlin
1096b9872623ca0f2366c348d6d40a8ba45ee0e87710Casey Dahlinstatus_t Parcel::readStrongBinderVector(std::unique_ptr<std::vector<sp<IBinder>>>* val) const {
109735d77caf8e7e34fa6ac8f4bbc75a52631adc0272Christopher Wiley    return readNullableTypedVector(val, &Parcel::readNullableStrongBinder);
1098b9872623ca0f2366c348d6d40a8ba45ee0e87710Casey Dahlin}
1099b9872623ca0f2366c348d6d40a8ba45ee0e87710Casey Dahlin
1100eb8e15f9bb29f8794f8be819530631c358fd6a15Casey Dahlinstatus_t Parcel::readStrongBinderVector(std::vector<sp<IBinder>>* val) const {
110103d1eb6bf90bcd0a04b176988478d2e939d3fba0Christopher Wiley    return readTypedVector(val, &Parcel::readStrongBinder);
1102eb8e15f9bb29f8794f8be819530631c358fd6a15Casey Dahlin}
1103eb8e15f9bb29f8794f8be819530631c358fd6a15Casey Dahlin
11047c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Projectstatus_t Parcel::writeWeakBinder(const wp<IBinder>& val)
11057c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project{
11067c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project    return flatten_binder(ProcessState::self(), val, this);
11077c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project}
11087c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project
1109b9872623ca0f2366c348d6d40a8ba45ee0e87710Casey Dahlinstatus_t Parcel::writeRawNullableParcelable(const Parcelable* parcelable) {
1110b9872623ca0f2366c348d6d40a8ba45ee0e87710Casey Dahlin    if (!parcelable) {
1111b9872623ca0f2366c348d6d40a8ba45ee0e87710Casey Dahlin        return writeInt32(0);
1112b9872623ca0f2366c348d6d40a8ba45ee0e87710Casey Dahlin    }
1113b9872623ca0f2366c348d6d40a8ba45ee0e87710Casey Dahlin
1114b9872623ca0f2366c348d6d40a8ba45ee0e87710Casey Dahlin    return writeParcelable(*parcelable);
1115b9872623ca0f2366c348d6d40a8ba45ee0e87710Casey Dahlin}
1116b9872623ca0f2366c348d6d40a8ba45ee0e87710Casey Dahlin
111797f048d19e51da4ea6ff98d8a9daf38f2577f182Christopher Wileystatus_t Parcel::writeParcelable(const Parcelable& parcelable) {
111897f048d19e51da4ea6ff98d8a9daf38f2577f182Christopher Wiley    status_t status = writeInt32(1);  // parcelable is not null.
111997f048d19e51da4ea6ff98d8a9daf38f2577f182Christopher Wiley    if (status != OK) {
112097f048d19e51da4ea6ff98d8a9daf38f2577f182Christopher Wiley        return status;
112197f048d19e51da4ea6ff98d8a9daf38f2577f182Christopher Wiley    }
112297f048d19e51da4ea6ff98d8a9daf38f2577f182Christopher Wiley    return parcelable.writeToParcel(this);
112397f048d19e51da4ea6ff98d8a9daf38f2577f182Christopher Wiley}
112497f048d19e51da4ea6ff98d8a9daf38f2577f182Christopher Wiley
11256316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaumstatus_t Parcel::writeValue(const binder::Value& value) {
11266316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum    return value.writeToParcel(this);
11276316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum}
11286316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum
1129a47f02afb1e1f2c4abd9379c13903a5dde89d354Mathias Agopianstatus_t Parcel::writeNativeHandle(const native_handle* handle)
11305f78a48bb8f7714ee231fca67d60fad77bc1cad9The Android Open Source Project{
11311d0a95b12a9194f64dd436224ec3bf8e0622d678Mathias Agopian    if (!handle || handle->version != sizeof(native_handle))
11325f78a48bb8f7714ee231fca67d60fad77bc1cad9The Android Open Source Project        return BAD_TYPE;
11335f78a48bb8f7714ee231fca67d60fad77bc1cad9The Android Open Source Project
11345f78a48bb8f7714ee231fca67d60fad77bc1cad9The Android Open Source Project    status_t err;
1135a47f02afb1e1f2c4abd9379c13903a5dde89d354Mathias Agopian    err = writeInt32(handle->numFds);
11365f78a48bb8f7714ee231fca67d60fad77bc1cad9The Android Open Source Project    if (err != NO_ERROR) return err;
1137edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1138a47f02afb1e1f2c4abd9379c13903a5dde89d354Mathias Agopian    err = writeInt32(handle->numInts);
11395f78a48bb8f7714ee231fca67d60fad77bc1cad9The Android Open Source Project    if (err != NO_ERROR) return err;
1140edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1141a47f02afb1e1f2c4abd9379c13903a5dde89d354Mathias Agopian    for (int i=0 ; err==NO_ERROR && i<handle->numFds ; i++)
1142a47f02afb1e1f2c4abd9379c13903a5dde89d354Mathias Agopian        err = writeDupFileDescriptor(handle->data[i]);
1143edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1144edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (err != NO_ERROR) {
11459d4536835248525f32f1504a3d28d5bbfa0a2910Steve Block        ALOGD("write native handle, write dup fd failed");
1146edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return err;
1147edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1148a47f02afb1e1f2c4abd9379c13903a5dde89d354Mathias Agopian    err = write(handle->data + handle->numFds, sizeof(int)*handle->numInts);
11495f78a48bb8f7714ee231fca67d60fad77bc1cad9The Android Open Source Project    return err;
11505f78a48bb8f7714ee231fca67d60fad77bc1cad9The Android Open Source Project}
11515f78a48bb8f7714ee231fca67d60fad77bc1cad9The Android Open Source Project
115293ff1f985e233fe04412a65041e977c9f0c21f5bJeff Brownstatus_t Parcel::writeFileDescriptor(int fd, bool takeOwnership)
11537c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project{
11547c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project    flat_binder_object obj;
11557c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project    obj.type = BINDER_TYPE_FD;
11567c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project    obj.flags = 0x7f | FLAT_BINDER_FLAG_ACCEPTS_FDS;
115707fd0f195db6d341cab4e54257f508d802c98832Arve Hjønnevåg    obj.binder = 0; /* Don't pass uninitialized stack data to a remote process */
11587c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project    obj.handle = fd;
115984e625ac1e01f5a9c3ed16664da6498212ed662bArve Hjønnevåg    obj.cookie = takeOwnership ? 1 : 0;
11607c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project    return writeObject(obj, true);
11617c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project}
11627c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project
11637c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Projectstatus_t Parcel::writeDupFileDescriptor(int fd)
11647c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project{
1165ec9ec7d55c63f791ab3ed9221e68d6215f7b928aNick Kralevich    int dupFd = fcntl(fd, F_DUPFD_CLOEXEC, 0);
1166d341c7178fffc7ad5b57645c2bcf5a395ca95591Jeff Brown    if (dupFd < 0) {
1167d341c7178fffc7ad5b57645c2bcf5a395ca95591Jeff Brown        return -errno;
1168d341c7178fffc7ad5b57645c2bcf5a395ca95591Jeff Brown    }
1169d341c7178fffc7ad5b57645c2bcf5a395ca95591Jeff Brown    status_t err = writeFileDescriptor(dupFd, true /*takeOwnership*/);
117006673e38983baad380e818c5493b7faccf3b2393Casey Dahlin    if (err != OK) {
1171d341c7178fffc7ad5b57645c2bcf5a395ca95591Jeff Brown        close(dupFd);
1172d341c7178fffc7ad5b57645c2bcf5a395ca95591Jeff Brown    }
1173d341c7178fffc7ad5b57645c2bcf5a395ca95591Jeff Brown    return err;
11747c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project}
11757c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project
11761941a404d642b3dfaac365ba494f1e9912876f00Dianne Hackbornstatus_t Parcel::writeParcelFileDescriptor(int fd, bool takeOwnership)
11771941a404d642b3dfaac365ba494f1e9912876f00Dianne Hackborn{
11781941a404d642b3dfaac365ba494f1e9912876f00Dianne Hackborn    writeInt32(0);
11791941a404d642b3dfaac365ba494f1e9912876f00Dianne Hackborn    return writeFileDescriptor(fd, takeOwnership);
11801941a404d642b3dfaac365ba494f1e9912876f00Dianne Hackborn}
11811941a404d642b3dfaac365ba494f1e9912876f00Dianne Hackborn
11822cf1995d3d1cdca8e0ba2d8fab9a322c4096f809Christopher Wileystatus_t Parcel::writeUniqueFileDescriptor(const base::unique_fd& fd) {
118306673e38983baad380e818c5493b7faccf3b2393Casey Dahlin    return writeDupFileDescriptor(fd.get());
118406673e38983baad380e818c5493b7faccf3b2393Casey Dahlin}
118506673e38983baad380e818c5493b7faccf3b2393Casey Dahlin
11862cf1995d3d1cdca8e0ba2d8fab9a322c4096f809Christopher Wileystatus_t Parcel::writeUniqueFileDescriptorVector(const std::vector<base::unique_fd>& val) {
118706673e38983baad380e818c5493b7faccf3b2393Casey Dahlin    return writeTypedVector(val, &Parcel::writeUniqueFileDescriptor);
118806673e38983baad380e818c5493b7faccf3b2393Casey Dahlin}
118906673e38983baad380e818c5493b7faccf3b2393Casey Dahlin
11902cf1995d3d1cdca8e0ba2d8fab9a322c4096f809Christopher Wileystatus_t Parcel::writeUniqueFileDescriptorVector(const std::unique_ptr<std::vector<base::unique_fd>>& val) {
1191b9872623ca0f2366c348d6d40a8ba45ee0e87710Casey Dahlin    return writeNullableTypedVector(val, &Parcel::writeUniqueFileDescriptor);
1192b9872623ca0f2366c348d6d40a8ba45ee0e87710Casey Dahlin}
1193b9872623ca0f2366c348d6d40a8ba45ee0e87710Casey Dahlin
119413b1604018968408bcc5553e1fa5ea9df3e4e009Jeff Brownstatus_t Parcel::writeBlob(size_t len, bool mutableCopy, WritableBlob* outBlob)
11955707dbf15d0b44c88fbaa6dd271097f2d42932e0Jeff Brown{
1196b6b1423c87e457097875dc304fbbe38db6c41abdNick Kralevich    if (len > INT32_MAX) {
1197b6b1423c87e457097875dc304fbbe38db6c41abdNick Kralevich        // don't accept size_t values which may have come from an
1198b6b1423c87e457097875dc304fbbe38db6c41abdNick Kralevich        // inadvertent conversion from a negative int.
1199b6b1423c87e457097875dc304fbbe38db6c41abdNick Kralevich        return BAD_VALUE;
1200b6b1423c87e457097875dc304fbbe38db6c41abdNick Kralevich    }
1201b6b1423c87e457097875dc304fbbe38db6c41abdNick Kralevich
120213b1604018968408bcc5553e1fa5ea9df3e4e009Jeff Brown    status_t status;
120313b1604018968408bcc5553e1fa5ea9df3e4e009Jeff Brown    if (!mAllowFds || len <= BLOB_INPLACE_LIMIT) {
12046807e59e0ff943cc6225d46e3c33a8a7eae9b3d7Steve Block        ALOGV("writeBlob: write in place");
120513b1604018968408bcc5553e1fa5ea9df3e4e009Jeff Brown        status = writeInt32(BLOB_INPLACE);
12065707dbf15d0b44c88fbaa6dd271097f2d42932e0Jeff Brown        if (status) return status;
12075707dbf15d0b44c88fbaa6dd271097f2d42932e0Jeff Brown
12085707dbf15d0b44c88fbaa6dd271097f2d42932e0Jeff Brown        void* ptr = writeInplace(len);
12095707dbf15d0b44c88fbaa6dd271097f2d42932e0Jeff Brown        if (!ptr) return NO_MEMORY;
12105707dbf15d0b44c88fbaa6dd271097f2d42932e0Jeff Brown
121113b1604018968408bcc5553e1fa5ea9df3e4e009Jeff Brown        outBlob->init(-1, ptr, len, false);
12125707dbf15d0b44c88fbaa6dd271097f2d42932e0Jeff Brown        return NO_ERROR;
12135707dbf15d0b44c88fbaa6dd271097f2d42932e0Jeff Brown    }
12145707dbf15d0b44c88fbaa6dd271097f2d42932e0Jeff Brown
12156807e59e0ff943cc6225d46e3c33a8a7eae9b3d7Steve Block    ALOGV("writeBlob: write to ashmem");
12165707dbf15d0b44c88fbaa6dd271097f2d42932e0Jeff Brown    int fd = ashmem_create_region("Parcel Blob", len);
12175707dbf15d0b44c88fbaa6dd271097f2d42932e0Jeff Brown    if (fd < 0) return NO_MEMORY;
12185707dbf15d0b44c88fbaa6dd271097f2d42932e0Jeff Brown
12195707dbf15d0b44c88fbaa6dd271097f2d42932e0Jeff Brown    int result = ashmem_set_prot_region(fd, PROT_READ | PROT_WRITE);
12205707dbf15d0b44c88fbaa6dd271097f2d42932e0Jeff Brown    if (result < 0) {
1221ec4e0063a1c5cc6e01472cc2a9d27609ce3827d7Jeff Brown        status = result;
12225707dbf15d0b44c88fbaa6dd271097f2d42932e0Jeff Brown    } else {
12235707dbf15d0b44c88fbaa6dd271097f2d42932e0Jeff Brown        void* ptr = ::mmap(NULL, len, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
12245707dbf15d0b44c88fbaa6dd271097f2d42932e0Jeff Brown        if (ptr == MAP_FAILED) {
12255707dbf15d0b44c88fbaa6dd271097f2d42932e0Jeff Brown            status = -errno;
12265707dbf15d0b44c88fbaa6dd271097f2d42932e0Jeff Brown        } else {
122713b1604018968408bcc5553e1fa5ea9df3e4e009Jeff Brown            if (!mutableCopy) {
122813b1604018968408bcc5553e1fa5ea9df3e4e009Jeff Brown                result = ashmem_set_prot_region(fd, PROT_READ);
122913b1604018968408bcc5553e1fa5ea9df3e4e009Jeff Brown            }
12305707dbf15d0b44c88fbaa6dd271097f2d42932e0Jeff Brown            if (result < 0) {
1231ec4e0063a1c5cc6e01472cc2a9d27609ce3827d7Jeff Brown                status = result;
12325707dbf15d0b44c88fbaa6dd271097f2d42932e0Jeff Brown            } else {
123313b1604018968408bcc5553e1fa5ea9df3e4e009Jeff Brown                status = writeInt32(mutableCopy ? BLOB_ASHMEM_MUTABLE : BLOB_ASHMEM_IMMUTABLE);
12345707dbf15d0b44c88fbaa6dd271097f2d42932e0Jeff Brown                if (!status) {
123593ff1f985e233fe04412a65041e977c9f0c21f5bJeff Brown                    status = writeFileDescriptor(fd, true /*takeOwnership*/);
12365707dbf15d0b44c88fbaa6dd271097f2d42932e0Jeff Brown                    if (!status) {
123713b1604018968408bcc5553e1fa5ea9df3e4e009Jeff Brown                        outBlob->init(fd, ptr, len, mutableCopy);
12385707dbf15d0b44c88fbaa6dd271097f2d42932e0Jeff Brown                        return NO_ERROR;
12395707dbf15d0b44c88fbaa6dd271097f2d42932e0Jeff Brown                    }
12405707dbf15d0b44c88fbaa6dd271097f2d42932e0Jeff Brown                }
12415707dbf15d0b44c88fbaa6dd271097f2d42932e0Jeff Brown            }
12425707dbf15d0b44c88fbaa6dd271097f2d42932e0Jeff Brown        }
12435707dbf15d0b44c88fbaa6dd271097f2d42932e0Jeff Brown        ::munmap(ptr, len);
12445707dbf15d0b44c88fbaa6dd271097f2d42932e0Jeff Brown    }
12455707dbf15d0b44c88fbaa6dd271097f2d42932e0Jeff Brown    ::close(fd);
12465707dbf15d0b44c88fbaa6dd271097f2d42932e0Jeff Brown    return status;
12475707dbf15d0b44c88fbaa6dd271097f2d42932e0Jeff Brown}
12485707dbf15d0b44c88fbaa6dd271097f2d42932e0Jeff Brown
124913b1604018968408bcc5553e1fa5ea9df3e4e009Jeff Brownstatus_t Parcel::writeDupImmutableBlobFileDescriptor(int fd)
125013b1604018968408bcc5553e1fa5ea9df3e4e009Jeff Brown{
125113b1604018968408bcc5553e1fa5ea9df3e4e009Jeff Brown    // Must match up with what's done in writeBlob.
125213b1604018968408bcc5553e1fa5ea9df3e4e009Jeff Brown    if (!mAllowFds) return FDS_NOT_ALLOWED;
125313b1604018968408bcc5553e1fa5ea9df3e4e009Jeff Brown    status_t status = writeInt32(BLOB_ASHMEM_IMMUTABLE);
125413b1604018968408bcc5553e1fa5ea9df3e4e009Jeff Brown    if (status) return status;
125513b1604018968408bcc5553e1fa5ea9df3e4e009Jeff Brown    return writeDupFileDescriptor(fd);
125613b1604018968408bcc5553e1fa5ea9df3e4e009Jeff Brown}
125713b1604018968408bcc5553e1fa5ea9df3e4e009Jeff Brown
1258e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopianstatus_t Parcel::write(const FlattenableHelperInterface& val)
125998e71ddaede9a0bfb681fd237bec1f66c6c53193Mathias Agopian{
126098e71ddaede9a0bfb681fd237bec1f66c6c53193Mathias Agopian    status_t err;
126198e71ddaede9a0bfb681fd237bec1f66c6c53193Mathias Agopian
126298e71ddaede9a0bfb681fd237bec1f66c6c53193Mathias Agopian    // size if needed
1263e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian    const size_t len = val.getFlattenedSize();
1264e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian    const size_t fd_count = val.getFdCount();
126598e71ddaede9a0bfb681fd237bec1f66c6c53193Mathias Agopian
1266e4e0ae8abc7f612960fc381a792d0bef4c3eb6f9Christopher Tate    if ((len > INT32_MAX) || (fd_count >= gMaxFds)) {
1267b6b1423c87e457097875dc304fbbe38db6c41abdNick Kralevich        // don't accept size_t values which may have come from an
1268b6b1423c87e457097875dc304fbbe38db6c41abdNick Kralevich        // inadvertent conversion from a negative int.
1269b6b1423c87e457097875dc304fbbe38db6c41abdNick Kralevich        return BAD_VALUE;
1270b6b1423c87e457097875dc304fbbe38db6c41abdNick Kralevich    }
1271b6b1423c87e457097875dc304fbbe38db6c41abdNick Kralevich
127298e71ddaede9a0bfb681fd237bec1f66c6c53193Mathias Agopian    err = this->writeInt32(len);
127398e71ddaede9a0bfb681fd237bec1f66c6c53193Mathias Agopian    if (err) return err;
127498e71ddaede9a0bfb681fd237bec1f66c6c53193Mathias Agopian
127598e71ddaede9a0bfb681fd237bec1f66c6c53193Mathias Agopian    err = this->writeInt32(fd_count);
127698e71ddaede9a0bfb681fd237bec1f66c6c53193Mathias Agopian    if (err) return err;
127798e71ddaede9a0bfb681fd237bec1f66c6c53193Mathias Agopian
127898e71ddaede9a0bfb681fd237bec1f66c6c53193Mathias Agopian    // payload
1279b6b1423c87e457097875dc304fbbe38db6c41abdNick Kralevich    void* const buf = this->writeInplace(pad_size(len));
128098e71ddaede9a0bfb681fd237bec1f66c6c53193Mathias Agopian    if (buf == NULL)
128198e71ddaede9a0bfb681fd237bec1f66c6c53193Mathias Agopian        return BAD_VALUE;
128298e71ddaede9a0bfb681fd237bec1f66c6c53193Mathias Agopian
128398e71ddaede9a0bfb681fd237bec1f66c6c53193Mathias Agopian    int* fds = NULL;
128498e71ddaede9a0bfb681fd237bec1f66c6c53193Mathias Agopian    if (fd_count) {
1285e4e0ae8abc7f612960fc381a792d0bef4c3eb6f9Christopher Tate        fds = new (std::nothrow) int[fd_count];
1286e4e0ae8abc7f612960fc381a792d0bef4c3eb6f9Christopher Tate        if (fds == nullptr) {
1287e4e0ae8abc7f612960fc381a792d0bef4c3eb6f9Christopher Tate            ALOGE("write: failed to allocate requested %zu fds", fd_count);
1288e4e0ae8abc7f612960fc381a792d0bef4c3eb6f9Christopher Tate            return BAD_VALUE;
1289e4e0ae8abc7f612960fc381a792d0bef4c3eb6f9Christopher Tate        }
129098e71ddaede9a0bfb681fd237bec1f66c6c53193Mathias Agopian    }
129198e71ddaede9a0bfb681fd237bec1f66c6c53193Mathias Agopian
129298e71ddaede9a0bfb681fd237bec1f66c6c53193Mathias Agopian    err = val.flatten(buf, len, fds, fd_count);
129398e71ddaede9a0bfb681fd237bec1f66c6c53193Mathias Agopian    for (size_t i=0 ; i<fd_count && err==NO_ERROR ; i++) {
129498e71ddaede9a0bfb681fd237bec1f66c6c53193Mathias Agopian        err = this->writeDupFileDescriptor( fds[i] );
129598e71ddaede9a0bfb681fd237bec1f66c6c53193Mathias Agopian    }
129698e71ddaede9a0bfb681fd237bec1f66c6c53193Mathias Agopian
129798e71ddaede9a0bfb681fd237bec1f66c6c53193Mathias Agopian    if (fd_count) {
129898e71ddaede9a0bfb681fd237bec1f66c6c53193Mathias Agopian        delete [] fds;
129998e71ddaede9a0bfb681fd237bec1f66c6c53193Mathias Agopian    }
130098e71ddaede9a0bfb681fd237bec1f66c6c53193Mathias Agopian
130198e71ddaede9a0bfb681fd237bec1f66c6c53193Mathias Agopian    return err;
130298e71ddaede9a0bfb681fd237bec1f66c6c53193Mathias Agopian}
130398e71ddaede9a0bfb681fd237bec1f66c6c53193Mathias Agopian
13047c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Projectstatus_t Parcel::writeObject(const flat_binder_object& val, bool nullMetaData)
13057c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project{
13067c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project    const bool enoughData = (mDataPos+sizeof(val)) <= mDataCapacity;
13077c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project    const bool enoughObjects = mObjectsSize < mObjectsCapacity;
13087c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project    if (enoughData && enoughObjects) {
13097c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Projectrestart_write:
13107c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project        *reinterpret_cast<flat_binder_object*>(mData+mDataPos) = val;
1311d4ecccfd206604a9b2d8a1220844fc2df85a5998Mark Salyzyn
13127c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project        // remember if it's a file descriptor
13137c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project        if (val.type == BINDER_TYPE_FD) {
13148938ed2c8e906fc332301b64787728d4d34da571Dianne Hackborn            if (!mAllowFds) {
131598e67d352b8805a868ca0e7c2be3ea830fb7c338Christopher Tate                // fail before modifying our object index
13168938ed2c8e906fc332301b64787728d4d34da571Dianne Hackborn                return FDS_NOT_ALLOWED;
13178938ed2c8e906fc332301b64787728d4d34da571Dianne Hackborn            }
13187c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project            mHasFds = mFdsKnown = true;
13197c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project        }
13207c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project
132198e67d352b8805a868ca0e7c2be3ea830fb7c338Christopher Tate        // Need to write meta-data?
132298e67d352b8805a868ca0e7c2be3ea830fb7c338Christopher Tate        if (nullMetaData || val.binder != 0) {
132398e67d352b8805a868ca0e7c2be3ea830fb7c338Christopher Tate            mObjects[mObjectsSize] = mDataPos;
1324cbf3726357966539c2a685f46e61c3fc8937f19eAdrian Roos            acquire_object(ProcessState::self(), val, this, &mOpenAshmemSize);
132598e67d352b8805a868ca0e7c2be3ea830fb7c338Christopher Tate            mObjectsSize++;
132698e67d352b8805a868ca0e7c2be3ea830fb7c338Christopher Tate        }
132798e67d352b8805a868ca0e7c2be3ea830fb7c338Christopher Tate
13287c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project        return finishWrite(sizeof(flat_binder_object));
13297c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project    }
13307c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project
13317c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project    if (!enoughData) {
13327c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project        const status_t err = growData(sizeof(val));
13337c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project        if (err != NO_ERROR) return err;
13347c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project    }
13357c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project    if (!enoughObjects) {
13367c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project        size_t newSize = ((mObjectsSize+2)*3)/2;
1337442351128906471310730663613013ce7051dd18Christopher Tate        if (newSize*sizeof(binder_size_t) < mObjectsSize) return NO_MEMORY;   // overflow
133884e625ac1e01f5a9c3ed16664da6498212ed662bArve Hjønnevåg        binder_size_t* objects = (binder_size_t*)realloc(mObjects, newSize*sizeof(binder_size_t));
13397c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project        if (objects == NULL) return NO_MEMORY;
13407c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project        mObjects = objects;
13417c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project        mObjectsCapacity = newSize;
13427c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project    }
1343d4ecccfd206604a9b2d8a1220844fc2df85a5998Mark Salyzyn
13447c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project    goto restart_write;
13457c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project}
13467c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project
1347837a0d0fb2c3fba8082d47d04cb6120af1eb9a54Brad Fitzpatrickstatus_t Parcel::writeNoException()
1348837a0d0fb2c3fba8082d47d04cb6120af1eb9a54Brad Fitzpatrick{
134909eb749704afd9e226e1347cb20c90be2016cd21Christopher Wiley    binder::Status status;
135009eb749704afd9e226e1347cb20c90be2016cd21Christopher Wiley    return status.writeToParcel(this);
1351837a0d0fb2c3fba8082d47d04cb6120af1eb9a54Brad Fitzpatrick}
1352837a0d0fb2c3fba8082d47d04cb6120af1eb9a54Brad Fitzpatrick
13536316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaumstatus_t Parcel::writeMap(const ::android::binder::Map& map_in)
13546316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum{
13556316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum    using ::std::map;
13566316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum    using ::android::binder::Value;
13576316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum    using ::android::binder::Map;
13586316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum
13596316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum    Map::const_iterator iter;
13606316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum    status_t ret;
13616316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum
13626316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum    ret = writeInt32(map_in.size());
13636316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum
13646316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum    if (ret != NO_ERROR) {
13656316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum        return ret;
13666316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum    }
13676316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum
13686316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum    for (iter = map_in.begin(); iter != map_in.end(); ++iter) {
13696316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum        ret = writeValue(Value(iter->first));
13706316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum        if (ret != NO_ERROR) {
13716316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum            return ret;
13726316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum        }
13736316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum
13746316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum        ret = writeValue(iter->second);
13756316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum        if (ret != NO_ERROR) {
13766316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum            return ret;
13776316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum        }
13786316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum    }
13796316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum
13806316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum    return ret;
13816316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum}
13826316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum
13836316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaumstatus_t Parcel::writeNullableMap(const std::unique_ptr<binder::Map>& map)
13846316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum{
13856316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum    if (map == NULL) {
13866316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum        return writeInt32(-1);
13876316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum    }
13886316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum
13896316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum    return writeMap(*map.get());
13906316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum}
13916316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum
13926316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaumstatus_t Parcel::readMap(::android::binder::Map* map_out)const
13936316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum{
13946316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum    using ::std::map;
13956316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum    using ::android::String16;
13966316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum    using ::android::String8;
13976316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum    using ::android::binder::Value;
13986316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum    using ::android::binder::Map;
13996316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum
14006316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum    status_t ret = NO_ERROR;
14016316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum    int32_t count;
14026316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum
14036316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum    ret = readInt32(&count);
14046316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum    if (ret != NO_ERROR) {
14056316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum        return ret;
14066316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum    }
14076316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum
14086316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum    if (count < 0) {
14096316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum        ALOGE("readMap: Unexpected count: %d", count);
14106316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum        return (count == -1)
14116316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum            ? UNEXPECTED_NULL
14126316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum            : BAD_VALUE;
14136316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum    }
14146316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum
14156316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum    map_out->clear();
14166316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum
14176316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum    while (count--) {
14186316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum        Map::key_type key;
14196316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum        Value value;
14206316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum
14216316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum        ret = readValue(&value);
14226316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum        if (ret != NO_ERROR) {
14236316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum            return ret;
14246316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum        }
14256316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum
14266316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum        if (!value.getString(&key)) {
14276316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum            ALOGE("readMap: Key type not a string (parcelType = %d)", value.parcelType());
14286316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum            return BAD_VALUE;
14296316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum        }
14306316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum
14316316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum        ret = readValue(&value);
14326316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum        if (ret != NO_ERROR) {
14336316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum            return ret;
14346316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum        }
14356316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum
14366316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum        (*map_out)[key] = value;
14376316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum    }
14386316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum
14396316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum    return ret;
14406316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum}
14416316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum
14426316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaumstatus_t Parcel::readNullableMap(std::unique_ptr<binder::Map>* map) const
14436316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum{
14446316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum    const size_t start = dataPosition();
14456316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum    int32_t count;
14466316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum    status_t status = readInt32(&count);
14476316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum    map->reset();
14486316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum
14496316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum    if (status != OK || count == -1) {
14506316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum        return status;
14516316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum    }
14526316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum
14536316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum    setDataPosition(start);
14546316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum    map->reset(new binder::Map());
14556316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum
14566316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum    status = readMap(map->get());
14576316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum
14586316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum    if (status != OK) {
14596316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum        map->reset();
14606316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum    }
14616316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum
14626316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum    return status;
14636316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum}
14646316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum
14656316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum
14666316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum
14676f4f3ab36c5ed1df84eb3a9f7475f0ac42952f58Colin Crossvoid Parcel::remove(size_t /*start*/, size_t /*amt*/)
14687c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project{
14697c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project    LOG_ALWAYS_FATAL("Parcel::remove() not yet implemented!");
14707c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project}
14717c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project
14727c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Projectstatus_t Parcel::read(void* outData, size_t len) const
14737c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project{
1474b6b1423c87e457097875dc304fbbe38db6c41abdNick Kralevich    if (len > INT32_MAX) {
1475b6b1423c87e457097875dc304fbbe38db6c41abdNick Kralevich        // don't accept size_t values which may have come from an
1476b6b1423c87e457097875dc304fbbe38db6c41abdNick Kralevich        // inadvertent conversion from a negative int.
1477b6b1423c87e457097875dc304fbbe38db6c41abdNick Kralevich        return BAD_VALUE;
1478b6b1423c87e457097875dc304fbbe38db6c41abdNick Kralevich    }
1479b6b1423c87e457097875dc304fbbe38db6c41abdNick Kralevich
1480b6b1423c87e457097875dc304fbbe38db6c41abdNick Kralevich    if ((mDataPos+pad_size(len)) >= mDataPos && (mDataPos+pad_size(len)) <= mDataSize
1481b6b1423c87e457097875dc304fbbe38db6c41abdNick Kralevich            && len <= pad_size(len)) {
14827c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project        memcpy(outData, mData+mDataPos, len);
1483b6b1423c87e457097875dc304fbbe38db6c41abdNick Kralevich        mDataPos += pad_size(len);
1484d4ecccfd206604a9b2d8a1220844fc2df85a5998Mark Salyzyn        ALOGV("read Setting data pos of %p to %zu", this, mDataPos);
14857c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project        return NO_ERROR;
14867c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project    }
14877c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project    return NOT_ENOUGH_DATA;
14887c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project}
14897c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project
14907c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Projectconst void* Parcel::readInplace(size_t len) const
14917c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project{
1492b6b1423c87e457097875dc304fbbe38db6c41abdNick Kralevich    if (len > INT32_MAX) {
1493b6b1423c87e457097875dc304fbbe38db6c41abdNick Kralevich        // don't accept size_t values which may have come from an
1494b6b1423c87e457097875dc304fbbe38db6c41abdNick Kralevich        // inadvertent conversion from a negative int.
1495b6b1423c87e457097875dc304fbbe38db6c41abdNick Kralevich        return NULL;
1496b6b1423c87e457097875dc304fbbe38db6c41abdNick Kralevich    }
1497b6b1423c87e457097875dc304fbbe38db6c41abdNick Kralevich
1498b6b1423c87e457097875dc304fbbe38db6c41abdNick Kralevich    if ((mDataPos+pad_size(len)) >= mDataPos && (mDataPos+pad_size(len)) <= mDataSize
1499b6b1423c87e457097875dc304fbbe38db6c41abdNick Kralevich            && len <= pad_size(len)) {
15007c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project        const void* data = mData+mDataPos;
1501b6b1423c87e457097875dc304fbbe38db6c41abdNick Kralevich        mDataPos += pad_size(len);
1502d4ecccfd206604a9b2d8a1220844fc2df85a5998Mark Salyzyn        ALOGV("readInplace Setting data pos of %p to %zu", this, mDataPos);
15037c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project        return data;
15047c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project    }
15057c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project    return NULL;
15067c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project}
15077c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project
150884a6d041e2c69d4d0b69269a0b59e725c9f119a3Andreas Hubertemplate<class T>
150984a6d041e2c69d4d0b69269a0b59e725c9f119a3Andreas Huberstatus_t Parcel::readAligned(T *pArg) const {
1510b6b1423c87e457097875dc304fbbe38db6c41abdNick Kralevich    COMPILE_TIME_ASSERT_FUNCTION_SCOPE(PAD_SIZE_UNSAFE(sizeof(T)) == sizeof(T));
151184a6d041e2c69d4d0b69269a0b59e725c9f119a3Andreas Huber
151284a6d041e2c69d4d0b69269a0b59e725c9f119a3Andreas Huber    if ((mDataPos+sizeof(T)) <= mDataSize) {
15137c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project        const void* data = mData+mDataPos;
151484a6d041e2c69d4d0b69269a0b59e725c9f119a3Andreas Huber        mDataPos += sizeof(T);
151584a6d041e2c69d4d0b69269a0b59e725c9f119a3Andreas Huber        *pArg =  *reinterpret_cast<const T*>(data);
15167c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project        return NO_ERROR;
15177c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project    } else {
15187c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project        return NOT_ENOUGH_DATA;
15197c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project    }
15207c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project}
15217c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project
152284a6d041e2c69d4d0b69269a0b59e725c9f119a3Andreas Hubertemplate<class T>
152384a6d041e2c69d4d0b69269a0b59e725c9f119a3Andreas HuberT Parcel::readAligned() const {
152484a6d041e2c69d4d0b69269a0b59e725c9f119a3Andreas Huber    T result;
152584a6d041e2c69d4d0b69269a0b59e725c9f119a3Andreas Huber    if (readAligned(&result) != NO_ERROR) {
152684a6d041e2c69d4d0b69269a0b59e725c9f119a3Andreas Huber        result = 0;
152784a6d041e2c69d4d0b69269a0b59e725c9f119a3Andreas Huber    }
152884a6d041e2c69d4d0b69269a0b59e725c9f119a3Andreas Huber
152984a6d041e2c69d4d0b69269a0b59e725c9f119a3Andreas Huber    return result;
153084a6d041e2c69d4d0b69269a0b59e725c9f119a3Andreas Huber}
153184a6d041e2c69d4d0b69269a0b59e725c9f119a3Andreas Huber
153284a6d041e2c69d4d0b69269a0b59e725c9f119a3Andreas Hubertemplate<class T>
153384a6d041e2c69d4d0b69269a0b59e725c9f119a3Andreas Huberstatus_t Parcel::writeAligned(T val) {
1534b6b1423c87e457097875dc304fbbe38db6c41abdNick Kralevich    COMPILE_TIME_ASSERT_FUNCTION_SCOPE(PAD_SIZE_UNSAFE(sizeof(T)) == sizeof(T));
153584a6d041e2c69d4d0b69269a0b59e725c9f119a3Andreas Huber
153684a6d041e2c69d4d0b69269a0b59e725c9f119a3Andreas Huber    if ((mDataPos+sizeof(val)) <= mDataCapacity) {
153784a6d041e2c69d4d0b69269a0b59e725c9f119a3Andreas Huberrestart_write:
153884a6d041e2c69d4d0b69269a0b59e725c9f119a3Andreas Huber        *reinterpret_cast<T*>(mData+mDataPos) = val;
153984a6d041e2c69d4d0b69269a0b59e725c9f119a3Andreas Huber        return finishWrite(sizeof(val));
154084a6d041e2c69d4d0b69269a0b59e725c9f119a3Andreas Huber    }
154184a6d041e2c69d4d0b69269a0b59e725c9f119a3Andreas Huber
154284a6d041e2c69d4d0b69269a0b59e725c9f119a3Andreas Huber    status_t err = growData(sizeof(val));
154384a6d041e2c69d4d0b69269a0b59e725c9f119a3Andreas Huber    if (err == NO_ERROR) goto restart_write;
154484a6d041e2c69d4d0b69269a0b59e725c9f119a3Andreas Huber    return err;
154584a6d041e2c69d4d0b69269a0b59e725c9f119a3Andreas Huber}
154684a6d041e2c69d4d0b69269a0b59e725c9f119a3Andreas Huber
1547185d3447d8a62d4d93d19125b82dbc3f9e12dda2Casey Dahlinnamespace {
1548185d3447d8a62d4d93d19125b82dbc3f9e12dda2Casey Dahlin
1549185d3447d8a62d4d93d19125b82dbc3f9e12dda2Casey Dahlintemplate<typename T>
1550185d3447d8a62d4d93d19125b82dbc3f9e12dda2Casey Dahlinstatus_t readByteVectorInternal(const Parcel* parcel,
1551185d3447d8a62d4d93d19125b82dbc3f9e12dda2Casey Dahlin                                std::vector<T>* val) {
1552451ff582d730e27f4e22d9f158f8ee24d1bc2729Casey Dahlin    val->clear();
1553451ff582d730e27f4e22d9f158f8ee24d1bc2729Casey Dahlin
1554451ff582d730e27f4e22d9f158f8ee24d1bc2729Casey Dahlin    int32_t size;
1555185d3447d8a62d4d93d19125b82dbc3f9e12dda2Casey Dahlin    status_t status = parcel->readInt32(&size);
1556451ff582d730e27f4e22d9f158f8ee24d1bc2729Casey Dahlin
1557451ff582d730e27f4e22d9f158f8ee24d1bc2729Casey Dahlin    if (status != OK) {
1558451ff582d730e27f4e22d9f158f8ee24d1bc2729Casey Dahlin        return status;
1559451ff582d730e27f4e22d9f158f8ee24d1bc2729Casey Dahlin    }
1560451ff582d730e27f4e22d9f158f8ee24d1bc2729Casey Dahlin
15614db672ddccb02b2bd70ddb4812c00a5060174c93Christopher Wiley    if (size < 0) {
15624db672ddccb02b2bd70ddb4812c00a5060174c93Christopher Wiley        status = UNEXPECTED_NULL;
15634db672ddccb02b2bd70ddb4812c00a5060174c93Christopher Wiley        return status;
15644db672ddccb02b2bd70ddb4812c00a5060174c93Christopher Wiley    }
1565185d3447d8a62d4d93d19125b82dbc3f9e12dda2Casey Dahlin    if (size_t(size) > parcel->dataAvail()) {
1566f0fc52b59be0bf39912f7b698d9bde26415a6096Christopher Wiley        status = BAD_VALUE;
1567f0fc52b59be0bf39912f7b698d9bde26415a6096Christopher Wiley        return status;
1568451ff582d730e27f4e22d9f158f8ee24d1bc2729Casey Dahlin    }
15694db672ddccb02b2bd70ddb4812c00a5060174c93Christopher Wiley
1570433e87b221b871727c3bde70c600014b43776dcfPaul Lietar    T* data = const_cast<T*>(reinterpret_cast<const T*>(parcel->readInplace(size)));
1571f0fc52b59be0bf39912f7b698d9bde26415a6096Christopher Wiley    if (!data) {
1572f0fc52b59be0bf39912f7b698d9bde26415a6096Christopher Wiley        status = BAD_VALUE;
1573f0fc52b59be0bf39912f7b698d9bde26415a6096Christopher Wiley        return status;
1574451ff582d730e27f4e22d9f158f8ee24d1bc2729Casey Dahlin    }
1575433e87b221b871727c3bde70c600014b43776dcfPaul Lietar    val->reserve(size);
1576433e87b221b871727c3bde70c600014b43776dcfPaul Lietar    val->insert(val->end(), data, data + size);
1577451ff582d730e27f4e22d9f158f8ee24d1bc2729Casey Dahlin
1578f0fc52b59be0bf39912f7b698d9bde26415a6096Christopher Wiley    return status;
1579451ff582d730e27f4e22d9f158f8ee24d1bc2729Casey Dahlin}
1580451ff582d730e27f4e22d9f158f8ee24d1bc2729Casey Dahlin
1581185d3447d8a62d4d93d19125b82dbc3f9e12dda2Casey Dahlintemplate<typename T>
1582185d3447d8a62d4d93d19125b82dbc3f9e12dda2Casey Dahlinstatus_t readByteVectorInternalPtr(
1583185d3447d8a62d4d93d19125b82dbc3f9e12dda2Casey Dahlin        const Parcel* parcel,
1584185d3447d8a62d4d93d19125b82dbc3f9e12dda2Casey Dahlin        std::unique_ptr<std::vector<T>>* val) {
1585185d3447d8a62d4d93d19125b82dbc3f9e12dda2Casey Dahlin    const int32_t start = parcel->dataPosition();
1586b9872623ca0f2366c348d6d40a8ba45ee0e87710Casey Dahlin    int32_t size;
1587185d3447d8a62d4d93d19125b82dbc3f9e12dda2Casey Dahlin    status_t status = parcel->readInt32(&size);
1588b9872623ca0f2366c348d6d40a8ba45ee0e87710Casey Dahlin    val->reset();
1589b9872623ca0f2366c348d6d40a8ba45ee0e87710Casey Dahlin
1590b9872623ca0f2366c348d6d40a8ba45ee0e87710Casey Dahlin    if (status != OK || size < 0) {
1591b9872623ca0f2366c348d6d40a8ba45ee0e87710Casey Dahlin        return status;
1592b9872623ca0f2366c348d6d40a8ba45ee0e87710Casey Dahlin    }
1593b9872623ca0f2366c348d6d40a8ba45ee0e87710Casey Dahlin
1594185d3447d8a62d4d93d19125b82dbc3f9e12dda2Casey Dahlin    parcel->setDataPosition(start);
1595e4e0ae8abc7f612960fc381a792d0bef4c3eb6f9Christopher Tate    val->reset(new (std::nothrow) std::vector<T>());
1596b9872623ca0f2366c348d6d40a8ba45ee0e87710Casey Dahlin
1597185d3447d8a62d4d93d19125b82dbc3f9e12dda2Casey Dahlin    status = readByteVectorInternal(parcel, val->get());
1598b9872623ca0f2366c348d6d40a8ba45ee0e87710Casey Dahlin
1599b9872623ca0f2366c348d6d40a8ba45ee0e87710Casey Dahlin    if (status != OK) {
1600b9872623ca0f2366c348d6d40a8ba45ee0e87710Casey Dahlin        val->reset();
1601b9872623ca0f2366c348d6d40a8ba45ee0e87710Casey Dahlin    }
1602b9872623ca0f2366c348d6d40a8ba45ee0e87710Casey Dahlin
1603b9872623ca0f2366c348d6d40a8ba45ee0e87710Casey Dahlin    return status;
1604b9872623ca0f2366c348d6d40a8ba45ee0e87710Casey Dahlin}
1605b9872623ca0f2366c348d6d40a8ba45ee0e87710Casey Dahlin
1606185d3447d8a62d4d93d19125b82dbc3f9e12dda2Casey Dahlin}  // namespace
1607185d3447d8a62d4d93d19125b82dbc3f9e12dda2Casey Dahlin
1608185d3447d8a62d4d93d19125b82dbc3f9e12dda2Casey Dahlinstatus_t Parcel::readByteVector(std::vector<int8_t>* val) const {
1609185d3447d8a62d4d93d19125b82dbc3f9e12dda2Casey Dahlin    return readByteVectorInternal(this, val);
1610185d3447d8a62d4d93d19125b82dbc3f9e12dda2Casey Dahlin}
1611185d3447d8a62d4d93d19125b82dbc3f9e12dda2Casey Dahlin
1612185d3447d8a62d4d93d19125b82dbc3f9e12dda2Casey Dahlinstatus_t Parcel::readByteVector(std::vector<uint8_t>* val) const {
1613185d3447d8a62d4d93d19125b82dbc3f9e12dda2Casey Dahlin    return readByteVectorInternal(this, val);
1614185d3447d8a62d4d93d19125b82dbc3f9e12dda2Casey Dahlin}
1615185d3447d8a62d4d93d19125b82dbc3f9e12dda2Casey Dahlin
1616185d3447d8a62d4d93d19125b82dbc3f9e12dda2Casey Dahlinstatus_t Parcel::readByteVector(std::unique_ptr<std::vector<int8_t>>* val) const {
1617185d3447d8a62d4d93d19125b82dbc3f9e12dda2Casey Dahlin    return readByteVectorInternalPtr(this, val);
1618185d3447d8a62d4d93d19125b82dbc3f9e12dda2Casey Dahlin}
1619185d3447d8a62d4d93d19125b82dbc3f9e12dda2Casey Dahlin
1620185d3447d8a62d4d93d19125b82dbc3f9e12dda2Casey Dahlinstatus_t Parcel::readByteVector(std::unique_ptr<std::vector<uint8_t>>* val) const {
1621185d3447d8a62d4d93d19125b82dbc3f9e12dda2Casey Dahlin    return readByteVectorInternalPtr(this, val);
1622185d3447d8a62d4d93d19125b82dbc3f9e12dda2Casey Dahlin}
1623185d3447d8a62d4d93d19125b82dbc3f9e12dda2Casey Dahlin
1624b9872623ca0f2366c348d6d40a8ba45ee0e87710Casey Dahlinstatus_t Parcel::readInt32Vector(std::unique_ptr<std::vector<int32_t>>* val) const {
1625b9872623ca0f2366c348d6d40a8ba45ee0e87710Casey Dahlin    return readNullableTypedVector(val, &Parcel::readInt32);
1626b9872623ca0f2366c348d6d40a8ba45ee0e87710Casey Dahlin}
1627b9872623ca0f2366c348d6d40a8ba45ee0e87710Casey Dahlin
1628451ff582d730e27f4e22d9f158f8ee24d1bc2729Casey Dahlinstatus_t Parcel::readInt32Vector(std::vector<int32_t>* val) const {
162903d1eb6bf90bcd0a04b176988478d2e939d3fba0Christopher Wiley    return readTypedVector(val, &Parcel::readInt32);
1630451ff582d730e27f4e22d9f158f8ee24d1bc2729Casey Dahlin}
1631451ff582d730e27f4e22d9f158f8ee24d1bc2729Casey Dahlin
1632b9872623ca0f2366c348d6d40a8ba45ee0e87710Casey Dahlinstatus_t Parcel::readInt64Vector(std::unique_ptr<std::vector<int64_t>>* val) const {
1633b9872623ca0f2366c348d6d40a8ba45ee0e87710Casey Dahlin    return readNullableTypedVector(val, &Parcel::readInt64);
1634b9872623ca0f2366c348d6d40a8ba45ee0e87710Casey Dahlin}
1635b9872623ca0f2366c348d6d40a8ba45ee0e87710Casey Dahlin
1636451ff582d730e27f4e22d9f158f8ee24d1bc2729Casey Dahlinstatus_t Parcel::readInt64Vector(std::vector<int64_t>* val) const {
163703d1eb6bf90bcd0a04b176988478d2e939d3fba0Christopher Wiley    return readTypedVector(val, &Parcel::readInt64);
1638451ff582d730e27f4e22d9f158f8ee24d1bc2729Casey Dahlin}
1639451ff582d730e27f4e22d9f158f8ee24d1bc2729Casey Dahlin
1640b9872623ca0f2366c348d6d40a8ba45ee0e87710Casey Dahlinstatus_t Parcel::readFloatVector(std::unique_ptr<std::vector<float>>* val) const {
1641b9872623ca0f2366c348d6d40a8ba45ee0e87710Casey Dahlin    return readNullableTypedVector(val, &Parcel::readFloat);
1642b9872623ca0f2366c348d6d40a8ba45ee0e87710Casey Dahlin}
1643b9872623ca0f2366c348d6d40a8ba45ee0e87710Casey Dahlin
1644451ff582d730e27f4e22d9f158f8ee24d1bc2729Casey Dahlinstatus_t Parcel::readFloatVector(std::vector<float>* val) const {
164503d1eb6bf90bcd0a04b176988478d2e939d3fba0Christopher Wiley    return readTypedVector(val, &Parcel::readFloat);
1646451ff582d730e27f4e22d9f158f8ee24d1bc2729Casey Dahlin}
1647451ff582d730e27f4e22d9f158f8ee24d1bc2729Casey Dahlin
1648b9872623ca0f2366c348d6d40a8ba45ee0e87710Casey Dahlinstatus_t Parcel::readDoubleVector(std::unique_ptr<std::vector<double>>* val) const {
1649b9872623ca0f2366c348d6d40a8ba45ee0e87710Casey Dahlin    return readNullableTypedVector(val, &Parcel::readDouble);
1650b9872623ca0f2366c348d6d40a8ba45ee0e87710Casey Dahlin}
1651b9872623ca0f2366c348d6d40a8ba45ee0e87710Casey Dahlin
1652451ff582d730e27f4e22d9f158f8ee24d1bc2729Casey Dahlinstatus_t Parcel::readDoubleVector(std::vector<double>* val) const {
165303d1eb6bf90bcd0a04b176988478d2e939d3fba0Christopher Wiley    return readTypedVector(val, &Parcel::readDouble);
1654451ff582d730e27f4e22d9f158f8ee24d1bc2729Casey Dahlin}
1655451ff582d730e27f4e22d9f158f8ee24d1bc2729Casey Dahlin
1656b9872623ca0f2366c348d6d40a8ba45ee0e87710Casey Dahlinstatus_t Parcel::readBoolVector(std::unique_ptr<std::vector<bool>>* val) const {
1657b9872623ca0f2366c348d6d40a8ba45ee0e87710Casey Dahlin    const int32_t start = dataPosition();
1658b9872623ca0f2366c348d6d40a8ba45ee0e87710Casey Dahlin    int32_t size;
1659b9872623ca0f2366c348d6d40a8ba45ee0e87710Casey Dahlin    status_t status = readInt32(&size);
1660b9872623ca0f2366c348d6d40a8ba45ee0e87710Casey Dahlin    val->reset();
1661b9872623ca0f2366c348d6d40a8ba45ee0e87710Casey Dahlin
1662b9872623ca0f2366c348d6d40a8ba45ee0e87710Casey Dahlin    if (status != OK || size < 0) {
1663b9872623ca0f2366c348d6d40a8ba45ee0e87710Casey Dahlin        return status;
1664b9872623ca0f2366c348d6d40a8ba45ee0e87710Casey Dahlin    }
1665b9872623ca0f2366c348d6d40a8ba45ee0e87710Casey Dahlin
1666b9872623ca0f2366c348d6d40a8ba45ee0e87710Casey Dahlin    setDataPosition(start);
1667e4e0ae8abc7f612960fc381a792d0bef4c3eb6f9Christopher Tate    val->reset(new (std::nothrow) std::vector<bool>());
1668b9872623ca0f2366c348d6d40a8ba45ee0e87710Casey Dahlin
1669b9872623ca0f2366c348d6d40a8ba45ee0e87710Casey Dahlin    status = readBoolVector(val->get());
1670b9872623ca0f2366c348d6d40a8ba45ee0e87710Casey Dahlin
1671b9872623ca0f2366c348d6d40a8ba45ee0e87710Casey Dahlin    if (status != OK) {
1672b9872623ca0f2366c348d6d40a8ba45ee0e87710Casey Dahlin        val->reset();
1673b9872623ca0f2366c348d6d40a8ba45ee0e87710Casey Dahlin    }
1674b9872623ca0f2366c348d6d40a8ba45ee0e87710Casey Dahlin
1675b9872623ca0f2366c348d6d40a8ba45ee0e87710Casey Dahlin    return status;
1676b9872623ca0f2366c348d6d40a8ba45ee0e87710Casey Dahlin}
1677451ff582d730e27f4e22d9f158f8ee24d1bc2729Casey Dahlin
1678b9872623ca0f2366c348d6d40a8ba45ee0e87710Casey Dahlinstatus_t Parcel::readBoolVector(std::vector<bool>* val) const {
1679451ff582d730e27f4e22d9f158f8ee24d1bc2729Casey Dahlin    int32_t size;
1680451ff582d730e27f4e22d9f158f8ee24d1bc2729Casey Dahlin    status_t status = readInt32(&size);
1681451ff582d730e27f4e22d9f158f8ee24d1bc2729Casey Dahlin
1682451ff582d730e27f4e22d9f158f8ee24d1bc2729Casey Dahlin    if (status != OK) {
1683451ff582d730e27f4e22d9f158f8ee24d1bc2729Casey Dahlin        return status;
1684451ff582d730e27f4e22d9f158f8ee24d1bc2729Casey Dahlin    }
1685451ff582d730e27f4e22d9f158f8ee24d1bc2729Casey Dahlin
1686451ff582d730e27f4e22d9f158f8ee24d1bc2729Casey Dahlin    if (size < 0) {
16874db672ddccb02b2bd70ddb4812c00a5060174c93Christopher Wiley        return UNEXPECTED_NULL;
1688451ff582d730e27f4e22d9f158f8ee24d1bc2729Casey Dahlin    }
1689451ff582d730e27f4e22d9f158f8ee24d1bc2729Casey Dahlin
1690451ff582d730e27f4e22d9f158f8ee24d1bc2729Casey Dahlin    val->resize(size);
1691451ff582d730e27f4e22d9f158f8ee24d1bc2729Casey Dahlin
1692451ff582d730e27f4e22d9f158f8ee24d1bc2729Casey Dahlin    /* C++ bool handling means a vector of bools isn't necessarily addressable
1693451ff582d730e27f4e22d9f158f8ee24d1bc2729Casey Dahlin     * (we might use individual bits)
1694451ff582d730e27f4e22d9f158f8ee24d1bc2729Casey Dahlin     */
169597887989495318803643c91b196b6bcabf2a7a03Christopher Wiley    bool data;
169697887989495318803643c91b196b6bcabf2a7a03Christopher Wiley    for (int32_t i = 0; i < size; ++i) {
1697451ff582d730e27f4e22d9f158f8ee24d1bc2729Casey Dahlin        status = readBool(&data);
1698451ff582d730e27f4e22d9f158f8ee24d1bc2729Casey Dahlin        (*val)[i] = data;
1699451ff582d730e27f4e22d9f158f8ee24d1bc2729Casey Dahlin
1700451ff582d730e27f4e22d9f158f8ee24d1bc2729Casey Dahlin        if (status != OK) {
1701451ff582d730e27f4e22d9f158f8ee24d1bc2729Casey Dahlin            return status;
1702451ff582d730e27f4e22d9f158f8ee24d1bc2729Casey Dahlin        }
1703451ff582d730e27f4e22d9f158f8ee24d1bc2729Casey Dahlin    }
1704451ff582d730e27f4e22d9f158f8ee24d1bc2729Casey Dahlin
1705451ff582d730e27f4e22d9f158f8ee24d1bc2729Casey Dahlin    return OK;
1706451ff582d730e27f4e22d9f158f8ee24d1bc2729Casey Dahlin}
1707451ff582d730e27f4e22d9f158f8ee24d1bc2729Casey Dahlin
1708b9872623ca0f2366c348d6d40a8ba45ee0e87710Casey Dahlinstatus_t Parcel::readCharVector(std::unique_ptr<std::vector<char16_t>>* val) const {
1709b9872623ca0f2366c348d6d40a8ba45ee0e87710Casey Dahlin    return readNullableTypedVector(val, &Parcel::readChar);
1710b9872623ca0f2366c348d6d40a8ba45ee0e87710Casey Dahlin}
1711b9872623ca0f2366c348d6d40a8ba45ee0e87710Casey Dahlin
1712451ff582d730e27f4e22d9f158f8ee24d1bc2729Casey Dahlinstatus_t Parcel::readCharVector(std::vector<char16_t>* val) const {
171303d1eb6bf90bcd0a04b176988478d2e939d3fba0Christopher Wiley    return readTypedVector(val, &Parcel::readChar);
1714451ff582d730e27f4e22d9f158f8ee24d1bc2729Casey Dahlin}
1715451ff582d730e27f4e22d9f158f8ee24d1bc2729Casey Dahlin
1716b9872623ca0f2366c348d6d40a8ba45ee0e87710Casey Dahlinstatus_t Parcel::readString16Vector(
1717b9872623ca0f2366c348d6d40a8ba45ee0e87710Casey Dahlin        std::unique_ptr<std::vector<std::unique_ptr<String16>>>* val) const {
1718b9872623ca0f2366c348d6d40a8ba45ee0e87710Casey Dahlin    return readNullableTypedVector(val, &Parcel::readString16);
1719b9872623ca0f2366c348d6d40a8ba45ee0e87710Casey Dahlin}
1720b9872623ca0f2366c348d6d40a8ba45ee0e87710Casey Dahlin
1721451ff582d730e27f4e22d9f158f8ee24d1bc2729Casey Dahlinstatus_t Parcel::readString16Vector(std::vector<String16>* val) const {
172203d1eb6bf90bcd0a04b176988478d2e939d3fba0Christopher Wiley    return readTypedVector(val, &Parcel::readString16);
1723451ff582d730e27f4e22d9f158f8ee24d1bc2729Casey Dahlin}
1724451ff582d730e27f4e22d9f158f8ee24d1bc2729Casey Dahlin
17259a5e32f141fdb43edc1bb31ceacec781b35281b3Christopher Wileystatus_t Parcel::readUtf8VectorFromUtf16Vector(
17269a5e32f141fdb43edc1bb31ceacec781b35281b3Christopher Wiley        std::unique_ptr<std::vector<std::unique_ptr<std::string>>>* val) const {
17279a5e32f141fdb43edc1bb31ceacec781b35281b3Christopher Wiley    return readNullableTypedVector(val, &Parcel::readUtf8FromUtf16);
17289a5e32f141fdb43edc1bb31ceacec781b35281b3Christopher Wiley}
17299a5e32f141fdb43edc1bb31ceacec781b35281b3Christopher Wiley
17309a5e32f141fdb43edc1bb31ceacec781b35281b3Christopher Wileystatus_t Parcel::readUtf8VectorFromUtf16Vector(std::vector<std::string>* val) const {
17319a5e32f141fdb43edc1bb31ceacec781b35281b3Christopher Wiley    return readTypedVector(val, &Parcel::readUtf8FromUtf16);
17329a5e32f141fdb43edc1bb31ceacec781b35281b3Christopher Wiley}
1733451ff582d730e27f4e22d9f158f8ee24d1bc2729Casey Dahlin
173484a6d041e2c69d4d0b69269a0b59e725c9f119a3Andreas Huberstatus_t Parcel::readInt32(int32_t *pArg) const
173584a6d041e2c69d4d0b69269a0b59e725c9f119a3Andreas Huber{
173684a6d041e2c69d4d0b69269a0b59e725c9f119a3Andreas Huber    return readAligned(pArg);
173784a6d041e2c69d4d0b69269a0b59e725c9f119a3Andreas Huber}
173884a6d041e2c69d4d0b69269a0b59e725c9f119a3Andreas Huber
17397c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Projectint32_t Parcel::readInt32() const
17407c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project{
174184a6d041e2c69d4d0b69269a0b59e725c9f119a3Andreas Huber    return readAligned<int32_t>();
17427c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project}
17437c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project
174441a0f2f86c0ca7d2fef50aef6215987f445a7231Dan Stozastatus_t Parcel::readUint32(uint32_t *pArg) const
174541a0f2f86c0ca7d2fef50aef6215987f445a7231Dan Stoza{
174641a0f2f86c0ca7d2fef50aef6215987f445a7231Dan Stoza    return readAligned(pArg);
174741a0f2f86c0ca7d2fef50aef6215987f445a7231Dan Stoza}
174841a0f2f86c0ca7d2fef50aef6215987f445a7231Dan Stoza
174941a0f2f86c0ca7d2fef50aef6215987f445a7231Dan Stozauint32_t Parcel::readUint32() const
175041a0f2f86c0ca7d2fef50aef6215987f445a7231Dan Stoza{
175141a0f2f86c0ca7d2fef50aef6215987f445a7231Dan Stoza    return readAligned<uint32_t>();
175241a0f2f86c0ca7d2fef50aef6215987f445a7231Dan Stoza}
17537c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project
17547c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Projectstatus_t Parcel::readInt64(int64_t *pArg) const
17557c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project{
175684a6d041e2c69d4d0b69269a0b59e725c9f119a3Andreas Huber    return readAligned(pArg);
17577c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project}
17587c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project
17597c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project
17607c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Projectint64_t Parcel::readInt64() const
17617c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project{
176284a6d041e2c69d4d0b69269a0b59e725c9f119a3Andreas Huber    return readAligned<int64_t>();
17637c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project}
17647c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project
17652d13afdfa1f43973bf3cb917c7d6496a38baa446Ronghua Wustatus_t Parcel::readUint64(uint64_t *pArg) const
17662d13afdfa1f43973bf3cb917c7d6496a38baa446Ronghua Wu{
17672d13afdfa1f43973bf3cb917c7d6496a38baa446Ronghua Wu    return readAligned(pArg);
17682d13afdfa1f43973bf3cb917c7d6496a38baa446Ronghua Wu}
17692d13afdfa1f43973bf3cb917c7d6496a38baa446Ronghua Wu
17702d13afdfa1f43973bf3cb917c7d6496a38baa446Ronghua Wuuint64_t Parcel::readUint64() const
17712d13afdfa1f43973bf3cb917c7d6496a38baa446Ronghua Wu{
17722d13afdfa1f43973bf3cb917c7d6496a38baa446Ronghua Wu    return readAligned<uint64_t>();
17732d13afdfa1f43973bf3cb917c7d6496a38baa446Ronghua Wu}
17742d13afdfa1f43973bf3cb917c7d6496a38baa446Ronghua Wu
1775f683e0163a84d93448b9388126902242367cd961Serban Constantinescustatus_t Parcel::readPointer(uintptr_t *pArg) const
1776f683e0163a84d93448b9388126902242367cd961Serban Constantinescu{
177784e625ac1e01f5a9c3ed16664da6498212ed662bArve Hjønnevåg    status_t ret;
177884e625ac1e01f5a9c3ed16664da6498212ed662bArve Hjønnevåg    binder_uintptr_t ptr;
177984e625ac1e01f5a9c3ed16664da6498212ed662bArve Hjønnevåg    ret = readAligned(&ptr);
178084e625ac1e01f5a9c3ed16664da6498212ed662bArve Hjønnevåg    if (!ret)
178184e625ac1e01f5a9c3ed16664da6498212ed662bArve Hjønnevåg        *pArg = ptr;
178284e625ac1e01f5a9c3ed16664da6498212ed662bArve Hjønnevåg    return ret;
1783f683e0163a84d93448b9388126902242367cd961Serban Constantinescu}
1784f683e0163a84d93448b9388126902242367cd961Serban Constantinescu
1785f683e0163a84d93448b9388126902242367cd961Serban Constantinescuuintptr_t Parcel::readPointer() const
1786f683e0163a84d93448b9388126902242367cd961Serban Constantinescu{
178784e625ac1e01f5a9c3ed16664da6498212ed662bArve Hjønnevåg    return readAligned<binder_uintptr_t>();
1788f683e0163a84d93448b9388126902242367cd961Serban Constantinescu}
1789f683e0163a84d93448b9388126902242367cd961Serban Constantinescu
1790f683e0163a84d93448b9388126902242367cd961Serban Constantinescu
17917c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Projectstatus_t Parcel::readFloat(float *pArg) const
17927c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project{
179384a6d041e2c69d4d0b69269a0b59e725c9f119a3Andreas Huber    return readAligned(pArg);
17947c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project}
17957c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project
17967c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project
17977c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Projectfloat Parcel::readFloat() const
17987c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project{
179984a6d041e2c69d4d0b69269a0b59e725c9f119a3Andreas Huber    return readAligned<float>();
18007c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project}
18017c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project
1802cc1a4bb1e1da3f2f38bdaf1f76348c7bc9fb6adbDouglas Leung#if defined(__mips__) && defined(__mips_hard_float)
1803cc1a4bb1e1da3f2f38bdaf1f76348c7bc9fb6adbDouglas Leung
18047c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Projectstatus_t Parcel::readDouble(double *pArg) const
18057c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project{
1806cc1a4bb1e1da3f2f38bdaf1f76348c7bc9fb6adbDouglas Leung    union {
1807cc1a4bb1e1da3f2f38bdaf1f76348c7bc9fb6adbDouglas Leung      double d;
1808cc1a4bb1e1da3f2f38bdaf1f76348c7bc9fb6adbDouglas Leung      unsigned long long ll;
1809cc1a4bb1e1da3f2f38bdaf1f76348c7bc9fb6adbDouglas Leung    } u;
18102c68d380c9ef765a7d46e5a4735f39e6c27849f2Narayan Kamath    u.d = 0;
1811cc1a4bb1e1da3f2f38bdaf1f76348c7bc9fb6adbDouglas Leung    status_t status;
1812cc1a4bb1e1da3f2f38bdaf1f76348c7bc9fb6adbDouglas Leung    status = readAligned(&u.ll);
1813cc1a4bb1e1da3f2f38bdaf1f76348c7bc9fb6adbDouglas Leung    *pArg = u.d;
1814cc1a4bb1e1da3f2f38bdaf1f76348c7bc9fb6adbDouglas Leung    return status;
18157c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project}
18167c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project
1817cc1a4bb1e1da3f2f38bdaf1f76348c7bc9fb6adbDouglas Leungdouble Parcel::readDouble() const
1818cc1a4bb1e1da3f2f38bdaf1f76348c7bc9fb6adbDouglas Leung{
1819cc1a4bb1e1da3f2f38bdaf1f76348c7bc9fb6adbDouglas Leung    union {
1820cc1a4bb1e1da3f2f38bdaf1f76348c7bc9fb6adbDouglas Leung      double d;
1821cc1a4bb1e1da3f2f38bdaf1f76348c7bc9fb6adbDouglas Leung      unsigned long long ll;
1822cc1a4bb1e1da3f2f38bdaf1f76348c7bc9fb6adbDouglas Leung    } u;
1823cc1a4bb1e1da3f2f38bdaf1f76348c7bc9fb6adbDouglas Leung    u.ll = readAligned<unsigned long long>();
1824cc1a4bb1e1da3f2f38bdaf1f76348c7bc9fb6adbDouglas Leung    return u.d;
1825cc1a4bb1e1da3f2f38bdaf1f76348c7bc9fb6adbDouglas Leung}
1826cc1a4bb1e1da3f2f38bdaf1f76348c7bc9fb6adbDouglas Leung
1827cc1a4bb1e1da3f2f38bdaf1f76348c7bc9fb6adbDouglas Leung#else
1828cc1a4bb1e1da3f2f38bdaf1f76348c7bc9fb6adbDouglas Leung
1829cc1a4bb1e1da3f2f38bdaf1f76348c7bc9fb6adbDouglas Leungstatus_t Parcel::readDouble(double *pArg) const
1830cc1a4bb1e1da3f2f38bdaf1f76348c7bc9fb6adbDouglas Leung{
1831cc1a4bb1e1da3f2f38bdaf1f76348c7bc9fb6adbDouglas Leung    return readAligned(pArg);
1832cc1a4bb1e1da3f2f38bdaf1f76348c7bc9fb6adbDouglas Leung}
18337c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project
18347c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Projectdouble Parcel::readDouble() const
18357c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project{
183684a6d041e2c69d4d0b69269a0b59e725c9f119a3Andreas Huber    return readAligned<double>();
183784a6d041e2c69d4d0b69269a0b59e725c9f119a3Andreas Huber}
183884a6d041e2c69d4d0b69269a0b59e725c9f119a3Andreas Huber
1839cc1a4bb1e1da3f2f38bdaf1f76348c7bc9fb6adbDouglas Leung#endif
1840cc1a4bb1e1da3f2f38bdaf1f76348c7bc9fb6adbDouglas Leung
184184a6d041e2c69d4d0b69269a0b59e725c9f119a3Andreas Huberstatus_t Parcel::readIntPtr(intptr_t *pArg) const
184284a6d041e2c69d4d0b69269a0b59e725c9f119a3Andreas Huber{
184384a6d041e2c69d4d0b69269a0b59e725c9f119a3Andreas Huber    return readAligned(pArg);
184484a6d041e2c69d4d0b69269a0b59e725c9f119a3Andreas Huber}
184584a6d041e2c69d4d0b69269a0b59e725c9f119a3Andreas Huber
184684a6d041e2c69d4d0b69269a0b59e725c9f119a3Andreas Huber
184784a6d041e2c69d4d0b69269a0b59e725c9f119a3Andreas Huberintptr_t Parcel::readIntPtr() const
184884a6d041e2c69d4d0b69269a0b59e725c9f119a3Andreas Huber{
184984a6d041e2c69d4d0b69269a0b59e725c9f119a3Andreas Huber    return readAligned<intptr_t>();
18507c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project}
18517c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project
1852d6848f52e60be17b7f0992be7827dcae4ea2efb1Casey Dahlinstatus_t Parcel::readBool(bool *pArg) const
1853d6848f52e60be17b7f0992be7827dcae4ea2efb1Casey Dahlin{
1854d6848f52e60be17b7f0992be7827dcae4ea2efb1Casey Dahlin    int32_t tmp;
1855d6848f52e60be17b7f0992be7827dcae4ea2efb1Casey Dahlin    status_t ret = readInt32(&tmp);
1856d6848f52e60be17b7f0992be7827dcae4ea2efb1Casey Dahlin    *pArg = (tmp != 0);
1857d6848f52e60be17b7f0992be7827dcae4ea2efb1Casey Dahlin    return ret;
1858d6848f52e60be17b7f0992be7827dcae4ea2efb1Casey Dahlin}
1859d6848f52e60be17b7f0992be7827dcae4ea2efb1Casey Dahlin
1860d6848f52e60be17b7f0992be7827dcae4ea2efb1Casey Dahlinbool Parcel::readBool() const
1861d6848f52e60be17b7f0992be7827dcae4ea2efb1Casey Dahlin{
1862d6848f52e60be17b7f0992be7827dcae4ea2efb1Casey Dahlin    return readInt32() != 0;
1863d6848f52e60be17b7f0992be7827dcae4ea2efb1Casey Dahlin}
1864d6848f52e60be17b7f0992be7827dcae4ea2efb1Casey Dahlin
1865d6848f52e60be17b7f0992be7827dcae4ea2efb1Casey Dahlinstatus_t Parcel::readChar(char16_t *pArg) const
1866d6848f52e60be17b7f0992be7827dcae4ea2efb1Casey Dahlin{
1867d6848f52e60be17b7f0992be7827dcae4ea2efb1Casey Dahlin    int32_t tmp;
1868d6848f52e60be17b7f0992be7827dcae4ea2efb1Casey Dahlin    status_t ret = readInt32(&tmp);
1869d6848f52e60be17b7f0992be7827dcae4ea2efb1Casey Dahlin    *pArg = char16_t(tmp);
1870d6848f52e60be17b7f0992be7827dcae4ea2efb1Casey Dahlin    return ret;
1871d6848f52e60be17b7f0992be7827dcae4ea2efb1Casey Dahlin}
1872d6848f52e60be17b7f0992be7827dcae4ea2efb1Casey Dahlin
1873d6848f52e60be17b7f0992be7827dcae4ea2efb1Casey Dahlinchar16_t Parcel::readChar() const
1874d6848f52e60be17b7f0992be7827dcae4ea2efb1Casey Dahlin{
1875d6848f52e60be17b7f0992be7827dcae4ea2efb1Casey Dahlin    return char16_t(readInt32());
1876d6848f52e60be17b7f0992be7827dcae4ea2efb1Casey Dahlin}
1877d6848f52e60be17b7f0992be7827dcae4ea2efb1Casey Dahlin
1878d6848f52e60be17b7f0992be7827dcae4ea2efb1Casey Dahlinstatus_t Parcel::readByte(int8_t *pArg) const
1879d6848f52e60be17b7f0992be7827dcae4ea2efb1Casey Dahlin{
1880d6848f52e60be17b7f0992be7827dcae4ea2efb1Casey Dahlin    int32_t tmp;
1881d6848f52e60be17b7f0992be7827dcae4ea2efb1Casey Dahlin    status_t ret = readInt32(&tmp);
1882d6848f52e60be17b7f0992be7827dcae4ea2efb1Casey Dahlin    *pArg = int8_t(tmp);
1883d6848f52e60be17b7f0992be7827dcae4ea2efb1Casey Dahlin    return ret;
1884d6848f52e60be17b7f0992be7827dcae4ea2efb1Casey Dahlin}
1885d6848f52e60be17b7f0992be7827dcae4ea2efb1Casey Dahlin
1886d6848f52e60be17b7f0992be7827dcae4ea2efb1Casey Dahlinint8_t Parcel::readByte() const
1887d6848f52e60be17b7f0992be7827dcae4ea2efb1Casey Dahlin{
1888d6848f52e60be17b7f0992be7827dcae4ea2efb1Casey Dahlin    return int8_t(readInt32());
1889d6848f52e60be17b7f0992be7827dcae4ea2efb1Casey Dahlin}
18907c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project
18919a5e32f141fdb43edc1bb31ceacec781b35281b3Christopher Wileystatus_t Parcel::readUtf8FromUtf16(std::string* str) const {
18929a5e32f141fdb43edc1bb31ceacec781b35281b3Christopher Wiley    size_t utf16Size = 0;
18939a5e32f141fdb43edc1bb31ceacec781b35281b3Christopher Wiley    const char16_t* src = readString16Inplace(&utf16Size);
18949a5e32f141fdb43edc1bb31ceacec781b35281b3Christopher Wiley    if (!src) {
18959a5e32f141fdb43edc1bb31ceacec781b35281b3Christopher Wiley        return UNEXPECTED_NULL;
18969a5e32f141fdb43edc1bb31ceacec781b35281b3Christopher Wiley    }
18979a5e32f141fdb43edc1bb31ceacec781b35281b3Christopher Wiley
18989a5e32f141fdb43edc1bb31ceacec781b35281b3Christopher Wiley    // Save ourselves the trouble, we're done.
18999a5e32f141fdb43edc1bb31ceacec781b35281b3Christopher Wiley    if (utf16Size == 0u) {
19009a5e32f141fdb43edc1bb31ceacec781b35281b3Christopher Wiley        str->clear();
19019a5e32f141fdb43edc1bb31ceacec781b35281b3Christopher Wiley       return NO_ERROR;
19029a5e32f141fdb43edc1bb31ceacec781b35281b3Christopher Wiley    }
19039a5e32f141fdb43edc1bb31ceacec781b35281b3Christopher Wiley
19049b39ebe132a18f530a5e5885a9faca514257902aSergio Giro    // Allow for closing '\0'
19059b39ebe132a18f530a5e5885a9faca514257902aSergio Giro    ssize_t utf8Size = utf16_to_utf8_length(src, utf16Size) + 1;
19069b39ebe132a18f530a5e5885a9faca514257902aSergio Giro    if (utf8Size < 1) {
19079a5e32f141fdb43edc1bb31ceacec781b35281b3Christopher Wiley        return BAD_VALUE;
19089a5e32f141fdb43edc1bb31ceacec781b35281b3Christopher Wiley    }
19099a5e32f141fdb43edc1bb31ceacec781b35281b3Christopher Wiley    // Note that while it is probably safe to assume string::resize keeps a
19109b39ebe132a18f530a5e5885a9faca514257902aSergio Giro    // spare byte around for the trailing null, we still pass the size including the trailing null
19119a5e32f141fdb43edc1bb31ceacec781b35281b3Christopher Wiley    str->resize(utf8Size);
19129b39ebe132a18f530a5e5885a9faca514257902aSergio Giro    utf16_to_utf8(src, utf16Size, &((*str)[0]), utf8Size);
19139b39ebe132a18f530a5e5885a9faca514257902aSergio Giro    str->resize(utf8Size - 1);
19149a5e32f141fdb43edc1bb31ceacec781b35281b3Christopher Wiley    return NO_ERROR;
19159a5e32f141fdb43edc1bb31ceacec781b35281b3Christopher Wiley}
19169a5e32f141fdb43edc1bb31ceacec781b35281b3Christopher Wiley
19179a5e32f141fdb43edc1bb31ceacec781b35281b3Christopher Wileystatus_t Parcel::readUtf8FromUtf16(std::unique_ptr<std::string>* str) const {
19189a5e32f141fdb43edc1bb31ceacec781b35281b3Christopher Wiley    const int32_t start = dataPosition();
19199a5e32f141fdb43edc1bb31ceacec781b35281b3Christopher Wiley    int32_t size;
19209a5e32f141fdb43edc1bb31ceacec781b35281b3Christopher Wiley    status_t status = readInt32(&size);
19219a5e32f141fdb43edc1bb31ceacec781b35281b3Christopher Wiley    str->reset();
19229a5e32f141fdb43edc1bb31ceacec781b35281b3Christopher Wiley
19239a5e32f141fdb43edc1bb31ceacec781b35281b3Christopher Wiley    if (status != OK || size < 0) {
19249a5e32f141fdb43edc1bb31ceacec781b35281b3Christopher Wiley        return status;
19259a5e32f141fdb43edc1bb31ceacec781b35281b3Christopher Wiley    }
19269a5e32f141fdb43edc1bb31ceacec781b35281b3Christopher Wiley
19279a5e32f141fdb43edc1bb31ceacec781b35281b3Christopher Wiley    setDataPosition(start);
1928e4e0ae8abc7f612960fc381a792d0bef4c3eb6f9Christopher Tate    str->reset(new (std::nothrow) std::string());
19299a5e32f141fdb43edc1bb31ceacec781b35281b3Christopher Wiley    return readUtf8FromUtf16(str->get());
19309a5e32f141fdb43edc1bb31ceacec781b35281b3Christopher Wiley}
19319a5e32f141fdb43edc1bb31ceacec781b35281b3Christopher Wiley
19327c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Projectconst char* Parcel::readCString() const
19337c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project{
19347c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project    const size_t avail = mDataSize-mDataPos;
19357c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project    if (avail > 0) {
19367c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project        const char* str = reinterpret_cast<const char*>(mData+mDataPos);
19377c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project        // is the string's trailing NUL within the parcel's valid bounds?
19387c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project        const char* eos = reinterpret_cast<const char*>(memchr(str, 0, avail));
19397c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project        if (eos) {
19407c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project            const size_t len = eos - str;
1941b6b1423c87e457097875dc304fbbe38db6c41abdNick Kralevich            mDataPos += pad_size(len+1);
1942d4ecccfd206604a9b2d8a1220844fc2df85a5998Mark Salyzyn            ALOGV("readCString Setting data pos of %p to %zu", this, mDataPos);
19437c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project            return str;
19447c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project        }
19457c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project    }
19467c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project    return NULL;
19477c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project}
19487c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project
19497c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source ProjectString8 Parcel::readString8() const
19507c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project{
195187b64d2a0e6aa35f39d612ecbd688f36f1046d5aRoshan Pius    String8 retString;
195287b64d2a0e6aa35f39d612ecbd688f36f1046d5aRoshan Pius    status_t status = readString8(&retString);
195387b64d2a0e6aa35f39d612ecbd688f36f1046d5aRoshan Pius    if (status != OK) {
195487b64d2a0e6aa35f39d612ecbd688f36f1046d5aRoshan Pius        // We don't care about errors here, so just return an empty string.
195587b64d2a0e6aa35f39d612ecbd688f36f1046d5aRoshan Pius        return String8();
19567c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project    }
195787b64d2a0e6aa35f39d612ecbd688f36f1046d5aRoshan Pius    return retString;
195887b64d2a0e6aa35f39d612ecbd688f36f1046d5aRoshan Pius}
195987b64d2a0e6aa35f39d612ecbd688f36f1046d5aRoshan Pius
196087b64d2a0e6aa35f39d612ecbd688f36f1046d5aRoshan Piusstatus_t Parcel::readString8(String8* pArg) const
196187b64d2a0e6aa35f39d612ecbd688f36f1046d5aRoshan Pius{
196287b64d2a0e6aa35f39d612ecbd688f36f1046d5aRoshan Pius    int32_t size;
196387b64d2a0e6aa35f39d612ecbd688f36f1046d5aRoshan Pius    status_t status = readInt32(&size);
196487b64d2a0e6aa35f39d612ecbd688f36f1046d5aRoshan Pius    if (status != OK) {
196587b64d2a0e6aa35f39d612ecbd688f36f1046d5aRoshan Pius        return status;
196687b64d2a0e6aa35f39d612ecbd688f36f1046d5aRoshan Pius    }
196787b64d2a0e6aa35f39d612ecbd688f36f1046d5aRoshan Pius    // watch for potential int overflow from size+1
196887b64d2a0e6aa35f39d612ecbd688f36f1046d5aRoshan Pius    if (size < 0 || size >= INT32_MAX) {
196987b64d2a0e6aa35f39d612ecbd688f36f1046d5aRoshan Pius        return BAD_VALUE;
197087b64d2a0e6aa35f39d612ecbd688f36f1046d5aRoshan Pius    }
197187b64d2a0e6aa35f39d612ecbd688f36f1046d5aRoshan Pius    // |writeString8| writes nothing for empty string.
197287b64d2a0e6aa35f39d612ecbd688f36f1046d5aRoshan Pius    if (size == 0) {
197387b64d2a0e6aa35f39d612ecbd688f36f1046d5aRoshan Pius        *pArg = String8();
197487b64d2a0e6aa35f39d612ecbd688f36f1046d5aRoshan Pius        return OK;
197587b64d2a0e6aa35f39d612ecbd688f36f1046d5aRoshan Pius    }
197687b64d2a0e6aa35f39d612ecbd688f36f1046d5aRoshan Pius    const char* str = (const char*)readInplace(size + 1);
197787b64d2a0e6aa35f39d612ecbd688f36f1046d5aRoshan Pius    if (str == NULL) {
197887b64d2a0e6aa35f39d612ecbd688f36f1046d5aRoshan Pius        return BAD_VALUE;
197987b64d2a0e6aa35f39d612ecbd688f36f1046d5aRoshan Pius    }
198087b64d2a0e6aa35f39d612ecbd688f36f1046d5aRoshan Pius    pArg->setTo(str, size);
198187b64d2a0e6aa35f39d612ecbd688f36f1046d5aRoshan Pius    return OK;
19827c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project}
19837c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project
19847c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source ProjectString16 Parcel::readString16() const
19857c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project{
19867c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project    size_t len;
19877c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project    const char16_t* str = readString16Inplace(&len);
19887c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project    if (str) return String16(str, len);
1989e6f43ddce78d6846af12550ff9193c5c6fe5844bSteve Block    ALOGE("Reading a NULL string not supported here.");
19907c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project    return String16();
19917c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project}
19927c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project
1993b9872623ca0f2366c348d6d40a8ba45ee0e87710Casey Dahlinstatus_t Parcel::readString16(std::unique_ptr<String16>* pArg) const
1994b9872623ca0f2366c348d6d40a8ba45ee0e87710Casey Dahlin{
1995b9872623ca0f2366c348d6d40a8ba45ee0e87710Casey Dahlin    const int32_t start = dataPosition();
1996b9872623ca0f2366c348d6d40a8ba45ee0e87710Casey Dahlin    int32_t size;
1997b9872623ca0f2366c348d6d40a8ba45ee0e87710Casey Dahlin    status_t status = readInt32(&size);
1998b9872623ca0f2366c348d6d40a8ba45ee0e87710Casey Dahlin    pArg->reset();
1999b9872623ca0f2366c348d6d40a8ba45ee0e87710Casey Dahlin
2000b9872623ca0f2366c348d6d40a8ba45ee0e87710Casey Dahlin    if (status != OK || size < 0) {
2001b9872623ca0f2366c348d6d40a8ba45ee0e87710Casey Dahlin        return status;
2002b9872623ca0f2366c348d6d40a8ba45ee0e87710Casey Dahlin    }
2003b9872623ca0f2366c348d6d40a8ba45ee0e87710Casey Dahlin
2004b9872623ca0f2366c348d6d40a8ba45ee0e87710Casey Dahlin    setDataPosition(start);
2005e4e0ae8abc7f612960fc381a792d0bef4c3eb6f9Christopher Tate    pArg->reset(new (std::nothrow) String16());
2006b9872623ca0f2366c348d6d40a8ba45ee0e87710Casey Dahlin
2007b9872623ca0f2366c348d6d40a8ba45ee0e87710Casey Dahlin    status = readString16(pArg->get());
2008b9872623ca0f2366c348d6d40a8ba45ee0e87710Casey Dahlin
2009b9872623ca0f2366c348d6d40a8ba45ee0e87710Casey Dahlin    if (status != OK) {
2010b9872623ca0f2366c348d6d40a8ba45ee0e87710Casey Dahlin        pArg->reset();
2011b9872623ca0f2366c348d6d40a8ba45ee0e87710Casey Dahlin    }
2012b9872623ca0f2366c348d6d40a8ba45ee0e87710Casey Dahlin
2013b9872623ca0f2366c348d6d40a8ba45ee0e87710Casey Dahlin    return status;
2014b9872623ca0f2366c348d6d40a8ba45ee0e87710Casey Dahlin}
2015b9872623ca0f2366c348d6d40a8ba45ee0e87710Casey Dahlin
2016451ff582d730e27f4e22d9f158f8ee24d1bc2729Casey Dahlinstatus_t Parcel::readString16(String16* pArg) const
2017451ff582d730e27f4e22d9f158f8ee24d1bc2729Casey Dahlin{
2018451ff582d730e27f4e22d9f158f8ee24d1bc2729Casey Dahlin    size_t len;
2019451ff582d730e27f4e22d9f158f8ee24d1bc2729Casey Dahlin    const char16_t* str = readString16Inplace(&len);
2020451ff582d730e27f4e22d9f158f8ee24d1bc2729Casey Dahlin    if (str) {
20211515ea103e00f6672afad4d27f2e0dec5648d7b6Casey Dahlin        pArg->setTo(str, len);
2022451ff582d730e27f4e22d9f158f8ee24d1bc2729Casey Dahlin        return 0;
2023451ff582d730e27f4e22d9f158f8ee24d1bc2729Casey Dahlin    } else {
2024451ff582d730e27f4e22d9f158f8ee24d1bc2729Casey Dahlin        *pArg = String16();
20254db672ddccb02b2bd70ddb4812c00a5060174c93Christopher Wiley        return UNEXPECTED_NULL;
2026451ff582d730e27f4e22d9f158f8ee24d1bc2729Casey Dahlin    }
2027451ff582d730e27f4e22d9f158f8ee24d1bc2729Casey Dahlin}
2028451ff582d730e27f4e22d9f158f8ee24d1bc2729Casey Dahlin
20297c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Projectconst char16_t* Parcel::readString16Inplace(size_t* outLen) const
20307c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project{
20317c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project    int32_t size = readInt32();
20327c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project    // watch for potential int overflow from size+1
20337c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project    if (size >= 0 && size < INT32_MAX) {
20347c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project        *outLen = size;
20357c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project        const char16_t* str = (const char16_t*)readInplace((size+1)*sizeof(char16_t));
20367c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project        if (str != NULL) {
20377c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project            return str;
20387c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project        }
20397c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project    }
20407c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project    *outLen = 0;
20417c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project    return NULL;
20427c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project}
20437c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project
2044f0c13772d95486d98f034361883b2415bb26a614Casey Dahlinstatus_t Parcel::readStrongBinder(sp<IBinder>* val) const
2045f0c13772d95486d98f034361883b2415bb26a614Casey Dahlin{
204635d77caf8e7e34fa6ac8f4bbc75a52631adc0272Christopher Wiley    status_t status = readNullableStrongBinder(val);
204735d77caf8e7e34fa6ac8f4bbc75a52631adc0272Christopher Wiley    if (status == OK && !val->get()) {
204835d77caf8e7e34fa6ac8f4bbc75a52631adc0272Christopher Wiley        status = UNEXPECTED_NULL;
204935d77caf8e7e34fa6ac8f4bbc75a52631adc0272Christopher Wiley    }
205035d77caf8e7e34fa6ac8f4bbc75a52631adc0272Christopher Wiley    return status;
205135d77caf8e7e34fa6ac8f4bbc75a52631adc0272Christopher Wiley}
205235d77caf8e7e34fa6ac8f4bbc75a52631adc0272Christopher Wiley
205335d77caf8e7e34fa6ac8f4bbc75a52631adc0272Christopher Wileystatus_t Parcel::readNullableStrongBinder(sp<IBinder>* val) const
205435d77caf8e7e34fa6ac8f4bbc75a52631adc0272Christopher Wiley{
2055f0c13772d95486d98f034361883b2415bb26a614Casey Dahlin    return unflatten_binder(ProcessState::self(), *this, val);
2056f0c13772d95486d98f034361883b2415bb26a614Casey Dahlin}
2057f0c13772d95486d98f034361883b2415bb26a614Casey Dahlin
20587c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Projectsp<IBinder> Parcel::readStrongBinder() const
20597c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project{
20607c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project    sp<IBinder> val;
206135d77caf8e7e34fa6ac8f4bbc75a52631adc0272Christopher Wiley    // Note that a lot of code in Android reads binders by hand with this
206235d77caf8e7e34fa6ac8f4bbc75a52631adc0272Christopher Wiley    // method, and that code has historically been ok with getting nullptr
206335d77caf8e7e34fa6ac8f4bbc75a52631adc0272Christopher Wiley    // back (while ignoring error codes).
206435d77caf8e7e34fa6ac8f4bbc75a52631adc0272Christopher Wiley    readNullableStrongBinder(&val);
20657c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project    return val;
20667c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project}
20677c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project
20687c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Projectwp<IBinder> Parcel::readWeakBinder() const
20697c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project{
20707c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project    wp<IBinder> val;
20717c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project    unflatten_binder(ProcessState::self(), *this, &val);
20727c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project    return val;
20737c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project}
20747c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project
207597f048d19e51da4ea6ff98d8a9daf38f2577f182Christopher Wileystatus_t Parcel::readParcelable(Parcelable* parcelable) const {
207697f048d19e51da4ea6ff98d8a9daf38f2577f182Christopher Wiley    int32_t have_parcelable = 0;
207797f048d19e51da4ea6ff98d8a9daf38f2577f182Christopher Wiley    status_t status = readInt32(&have_parcelable);
207897f048d19e51da4ea6ff98d8a9daf38f2577f182Christopher Wiley    if (status != OK) {
207997f048d19e51da4ea6ff98d8a9daf38f2577f182Christopher Wiley        return status;
208097f048d19e51da4ea6ff98d8a9daf38f2577f182Christopher Wiley    }
208197f048d19e51da4ea6ff98d8a9daf38f2577f182Christopher Wiley    if (!have_parcelable) {
208297f048d19e51da4ea6ff98d8a9daf38f2577f182Christopher Wiley        return UNEXPECTED_NULL;
208397f048d19e51da4ea6ff98d8a9daf38f2577f182Christopher Wiley    }
208497f048d19e51da4ea6ff98d8a9daf38f2577f182Christopher Wiley    return parcelable->readFromParcel(this);
208597f048d19e51da4ea6ff98d8a9daf38f2577f182Christopher Wiley}
208697f048d19e51da4ea6ff98d8a9daf38f2577f182Christopher Wiley
20876316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaumstatus_t Parcel::readValue(binder::Value* value) const {
20886316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum    return value->readFromParcel(this);
20896316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum}
20906316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum
2091837a0d0fb2c3fba8082d47d04cb6120af1eb9a54Brad Fitzpatrickint32_t Parcel::readExceptionCode() const
2092837a0d0fb2c3fba8082d47d04cb6120af1eb9a54Brad Fitzpatrick{
209309eb749704afd9e226e1347cb20c90be2016cd21Christopher Wiley    binder::Status status;
209409eb749704afd9e226e1347cb20c90be2016cd21Christopher Wiley    status.readFromParcel(*this);
209509eb749704afd9e226e1347cb20c90be2016cd21Christopher Wiley    return status.exceptionCode();
2096837a0d0fb2c3fba8082d47d04cb6120af1eb9a54Brad Fitzpatrick}
20975f78a48bb8f7714ee231fca67d60fad77bc1cad9The Android Open Source Project
2098a47f02afb1e1f2c4abd9379c13903a5dde89d354Mathias Agopiannative_handle* Parcel::readNativeHandle() const
20995f78a48bb8f7714ee231fca67d60fad77bc1cad9The Android Open Source Project{
21005f78a48bb8f7714ee231fca67d60fad77bc1cad9The Android Open Source Project    int numFds, numInts;
21015f78a48bb8f7714ee231fca67d60fad77bc1cad9The Android Open Source Project    status_t err;
21025f78a48bb8f7714ee231fca67d60fad77bc1cad9The Android Open Source Project    err = readInt32(&numFds);
21035f78a48bb8f7714ee231fca67d60fad77bc1cad9The Android Open Source Project    if (err != NO_ERROR) return 0;
21045f78a48bb8f7714ee231fca67d60fad77bc1cad9The Android Open Source Project    err = readInt32(&numInts);
21055f78a48bb8f7714ee231fca67d60fad77bc1cad9The Android Open Source Project    if (err != NO_ERROR) return 0;
21065f78a48bb8f7714ee231fca67d60fad77bc1cad9The Android Open Source Project
2107a47f02afb1e1f2c4abd9379c13903a5dde89d354Mathias Agopian    native_handle* h = native_handle_create(numFds, numInts);
2108eaac99a7172da52a76ba48c26413778a74951b1aAdam Lesinski    if (!h) {
2109eaac99a7172da52a76ba48c26413778a74951b1aAdam Lesinski        return 0;
2110eaac99a7172da52a76ba48c26413778a74951b1aAdam Lesinski    }
2111eaac99a7172da52a76ba48c26413778a74951b1aAdam Lesinski
21125f78a48bb8f7714ee231fca67d60fad77bc1cad9The Android Open Source Project    for (int i=0 ; err==NO_ERROR && i<numFds ; i++) {
2113ec9ec7d55c63f791ab3ed9221e68d6215f7b928aNick Kralevich        h->data[i] = fcntl(readFileDescriptor(), F_DUPFD_CLOEXEC, 0);
21141de7966c72981aebc3c7f9978ab129678ac89258Marco Nelissen        if (h->data[i] < 0) {
21151de7966c72981aebc3c7f9978ab129678ac89258Marco Nelissen            for (int j = 0; j < i; j++) {
21161de7966c72981aebc3c7f9978ab129678ac89258Marco Nelissen                close(h->data[j]);
21171de7966c72981aebc3c7f9978ab129678ac89258Marco Nelissen            }
21181de7966c72981aebc3c7f9978ab129678ac89258Marco Nelissen            native_handle_delete(h);
21191de7966c72981aebc3c7f9978ab129678ac89258Marco Nelissen            return 0;
21201de7966c72981aebc3c7f9978ab129678ac89258Marco Nelissen        }
21215f78a48bb8f7714ee231fca67d60fad77bc1cad9The Android Open Source Project    }
21225f78a48bb8f7714ee231fca67d60fad77bc1cad9The Android Open Source Project    err = read(h->data + numFds, sizeof(int)*numInts);
21235f78a48bb8f7714ee231fca67d60fad77bc1cad9The Android Open Source Project    if (err != NO_ERROR) {
2124a47f02afb1e1f2c4abd9379c13903a5dde89d354Mathias Agopian        native_handle_close(h);
2125a47f02afb1e1f2c4abd9379c13903a5dde89d354Mathias Agopian        native_handle_delete(h);
21265f78a48bb8f7714ee231fca67d60fad77bc1cad9The Android Open Source Project        h = 0;
21275f78a48bb8f7714ee231fca67d60fad77bc1cad9The Android Open Source Project    }
21285f78a48bb8f7714ee231fca67d60fad77bc1cad9The Android Open Source Project    return h;
21295f78a48bb8f7714ee231fca67d60fad77bc1cad9The Android Open Source Project}
21305f78a48bb8f7714ee231fca67d60fad77bc1cad9The Android Open Source Project
21317c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Projectint Parcel::readFileDescriptor() const
21327c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project{
21337c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project    const flat_binder_object* flat = readObject(true);
213406673e38983baad380e818c5493b7faccf3b2393Casey Dahlin
213506673e38983baad380e818c5493b7faccf3b2393Casey Dahlin    if (flat && flat->type == BINDER_TYPE_FD) {
213606673e38983baad380e818c5493b7faccf3b2393Casey Dahlin        return flat->handle;
21377c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project    }
213806673e38983baad380e818c5493b7faccf3b2393Casey Dahlin
21397c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project    return BAD_TYPE;
21407c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project}
21417c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project
21421941a404d642b3dfaac365ba494f1e9912876f00Dianne Hackbornint Parcel::readParcelFileDescriptor() const
21431941a404d642b3dfaac365ba494f1e9912876f00Dianne Hackborn{
21441941a404d642b3dfaac365ba494f1e9912876f00Dianne Hackborn    int32_t hasComm = readInt32();
21451941a404d642b3dfaac365ba494f1e9912876f00Dianne Hackborn    int fd = readFileDescriptor();
21461941a404d642b3dfaac365ba494f1e9912876f00Dianne Hackborn    if (hasComm != 0) {
21471941a404d642b3dfaac365ba494f1e9912876f00Dianne Hackborn        // skip
21481941a404d642b3dfaac365ba494f1e9912876f00Dianne Hackborn        readFileDescriptor();
21491941a404d642b3dfaac365ba494f1e9912876f00Dianne Hackborn    }
21501941a404d642b3dfaac365ba494f1e9912876f00Dianne Hackborn    return fd;
21511941a404d642b3dfaac365ba494f1e9912876f00Dianne Hackborn}
21521941a404d642b3dfaac365ba494f1e9912876f00Dianne Hackborn
21532cf1995d3d1cdca8e0ba2d8fab9a322c4096f809Christopher Wileystatus_t Parcel::readUniqueFileDescriptor(base::unique_fd* val) const
215406673e38983baad380e818c5493b7faccf3b2393Casey Dahlin{
215506673e38983baad380e818c5493b7faccf3b2393Casey Dahlin    int got = readFileDescriptor();
215606673e38983baad380e818c5493b7faccf3b2393Casey Dahlin
215706673e38983baad380e818c5493b7faccf3b2393Casey Dahlin    if (got == BAD_TYPE) {
215806673e38983baad380e818c5493b7faccf3b2393Casey Dahlin        return BAD_TYPE;
215906673e38983baad380e818c5493b7faccf3b2393Casey Dahlin    }
216006673e38983baad380e818c5493b7faccf3b2393Casey Dahlin
2161ec9ec7d55c63f791ab3ed9221e68d6215f7b928aNick Kralevich    val->reset(fcntl(got, F_DUPFD_CLOEXEC, 0));
216206673e38983baad380e818c5493b7faccf3b2393Casey Dahlin
216306673e38983baad380e818c5493b7faccf3b2393Casey Dahlin    if (val->get() < 0) {
216406673e38983baad380e818c5493b7faccf3b2393Casey Dahlin        return BAD_VALUE;
216506673e38983baad380e818c5493b7faccf3b2393Casey Dahlin    }
216606673e38983baad380e818c5493b7faccf3b2393Casey Dahlin
216706673e38983baad380e818c5493b7faccf3b2393Casey Dahlin    return OK;
216806673e38983baad380e818c5493b7faccf3b2393Casey Dahlin}
216906673e38983baad380e818c5493b7faccf3b2393Casey Dahlin
217006673e38983baad380e818c5493b7faccf3b2393Casey Dahlin
21712cf1995d3d1cdca8e0ba2d8fab9a322c4096f809Christopher Wileystatus_t Parcel::readUniqueFileDescriptorVector(std::unique_ptr<std::vector<base::unique_fd>>* val) const {
2172b9872623ca0f2366c348d6d40a8ba45ee0e87710Casey Dahlin    return readNullableTypedVector(val, &Parcel::readUniqueFileDescriptor);
2173b9872623ca0f2366c348d6d40a8ba45ee0e87710Casey Dahlin}
2174b9872623ca0f2366c348d6d40a8ba45ee0e87710Casey Dahlin
21752cf1995d3d1cdca8e0ba2d8fab9a322c4096f809Christopher Wileystatus_t Parcel::readUniqueFileDescriptorVector(std::vector<base::unique_fd>* val) const {
217606673e38983baad380e818c5493b7faccf3b2393Casey Dahlin    return readTypedVector(val, &Parcel::readUniqueFileDescriptor);
217706673e38983baad380e818c5493b7faccf3b2393Casey Dahlin}
217806673e38983baad380e818c5493b7faccf3b2393Casey Dahlin
21795707dbf15d0b44c88fbaa6dd271097f2d42932e0Jeff Brownstatus_t Parcel::readBlob(size_t len, ReadableBlob* outBlob) const
21805707dbf15d0b44c88fbaa6dd271097f2d42932e0Jeff Brown{
218113b1604018968408bcc5553e1fa5ea9df3e4e009Jeff Brown    int32_t blobType;
218213b1604018968408bcc5553e1fa5ea9df3e4e009Jeff Brown    status_t status = readInt32(&blobType);
21835707dbf15d0b44c88fbaa6dd271097f2d42932e0Jeff Brown    if (status) return status;
21845707dbf15d0b44c88fbaa6dd271097f2d42932e0Jeff Brown
218513b1604018968408bcc5553e1fa5ea9df3e4e009Jeff Brown    if (blobType == BLOB_INPLACE) {
21866807e59e0ff943cc6225d46e3c33a8a7eae9b3d7Steve Block        ALOGV("readBlob: read in place");
21875707dbf15d0b44c88fbaa6dd271097f2d42932e0Jeff Brown        const void* ptr = readInplace(len);
21885707dbf15d0b44c88fbaa6dd271097f2d42932e0Jeff Brown        if (!ptr) return BAD_VALUE;
21895707dbf15d0b44c88fbaa6dd271097f2d42932e0Jeff Brown
219013b1604018968408bcc5553e1fa5ea9df3e4e009Jeff Brown        outBlob->init(-1, const_cast<void*>(ptr), len, false);
21915707dbf15d0b44c88fbaa6dd271097f2d42932e0Jeff Brown        return NO_ERROR;
21925707dbf15d0b44c88fbaa6dd271097f2d42932e0Jeff Brown    }
21935707dbf15d0b44c88fbaa6dd271097f2d42932e0Jeff Brown
21946807e59e0ff943cc6225d46e3c33a8a7eae9b3d7Steve Block    ALOGV("readBlob: read from ashmem");
219513b1604018968408bcc5553e1fa5ea9df3e4e009Jeff Brown    bool isMutable = (blobType == BLOB_ASHMEM_MUTABLE);
21965707dbf15d0b44c88fbaa6dd271097f2d42932e0Jeff Brown    int fd = readFileDescriptor();
21975707dbf15d0b44c88fbaa6dd271097f2d42932e0Jeff Brown    if (fd == int(BAD_TYPE)) return BAD_VALUE;
21985707dbf15d0b44c88fbaa6dd271097f2d42932e0Jeff Brown
219913b1604018968408bcc5553e1fa5ea9df3e4e009Jeff Brown    void* ptr = ::mmap(NULL, len, isMutable ? PROT_READ | PROT_WRITE : PROT_READ,
220013b1604018968408bcc5553e1fa5ea9df3e4e009Jeff Brown            MAP_SHARED, fd, 0);
22019ea09757fa63ad2a9bea9c846b51c1210d69c79fNarayan Kamath    if (ptr == MAP_FAILED) return NO_MEMORY;
22025707dbf15d0b44c88fbaa6dd271097f2d42932e0Jeff Brown
220313b1604018968408bcc5553e1fa5ea9df3e4e009Jeff Brown    outBlob->init(fd, ptr, len, isMutable);
22045707dbf15d0b44c88fbaa6dd271097f2d42932e0Jeff Brown    return NO_ERROR;
22055707dbf15d0b44c88fbaa6dd271097f2d42932e0Jeff Brown}
22065707dbf15d0b44c88fbaa6dd271097f2d42932e0Jeff Brown
2207e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopianstatus_t Parcel::read(FlattenableHelperInterface& val) const
220898e71ddaede9a0bfb681fd237bec1f66c6c53193Mathias Agopian{
220998e71ddaede9a0bfb681fd237bec1f66c6c53193Mathias Agopian    // size
221098e71ddaede9a0bfb681fd237bec1f66c6c53193Mathias Agopian    const size_t len = this->readInt32();
221198e71ddaede9a0bfb681fd237bec1f66c6c53193Mathias Agopian    const size_t fd_count = this->readInt32();
221298e71ddaede9a0bfb681fd237bec1f66c6c53193Mathias Agopian
2213e4e0ae8abc7f612960fc381a792d0bef4c3eb6f9Christopher Tate    if ((len > INT32_MAX) || (fd_count >= gMaxFds)) {
2214b6b1423c87e457097875dc304fbbe38db6c41abdNick Kralevich        // don't accept size_t values which may have come from an
2215b6b1423c87e457097875dc304fbbe38db6c41abdNick Kralevich        // inadvertent conversion from a negative int.
2216b6b1423c87e457097875dc304fbbe38db6c41abdNick Kralevich        return BAD_VALUE;
2217b6b1423c87e457097875dc304fbbe38db6c41abdNick Kralevich    }
2218b6b1423c87e457097875dc304fbbe38db6c41abdNick Kralevich
221998e71ddaede9a0bfb681fd237bec1f66c6c53193Mathias Agopian    // payload
2220b6b1423c87e457097875dc304fbbe38db6c41abdNick Kralevich    void const* const buf = this->readInplace(pad_size(len));
222198e71ddaede9a0bfb681fd237bec1f66c6c53193Mathias Agopian    if (buf == NULL)
222298e71ddaede9a0bfb681fd237bec1f66c6c53193Mathias Agopian        return BAD_VALUE;
222398e71ddaede9a0bfb681fd237bec1f66c6c53193Mathias Agopian
222498e71ddaede9a0bfb681fd237bec1f66c6c53193Mathias Agopian    int* fds = NULL;
222598e71ddaede9a0bfb681fd237bec1f66c6c53193Mathias Agopian    if (fd_count) {
2226e4e0ae8abc7f612960fc381a792d0bef4c3eb6f9Christopher Tate        fds = new (std::nothrow) int[fd_count];
2227e4e0ae8abc7f612960fc381a792d0bef4c3eb6f9Christopher Tate        if (fds == nullptr) {
2228e4e0ae8abc7f612960fc381a792d0bef4c3eb6f9Christopher Tate            ALOGE("read: failed to allocate requested %zu fds", fd_count);
2229e4e0ae8abc7f612960fc381a792d0bef4c3eb6f9Christopher Tate            return BAD_VALUE;
2230e4e0ae8abc7f612960fc381a792d0bef4c3eb6f9Christopher Tate        }
223198e71ddaede9a0bfb681fd237bec1f66c6c53193Mathias Agopian    }
223298e71ddaede9a0bfb681fd237bec1f66c6c53193Mathias Agopian
223398e71ddaede9a0bfb681fd237bec1f66c6c53193Mathias Agopian    status_t err = NO_ERROR;
223498e71ddaede9a0bfb681fd237bec1f66c6c53193Mathias Agopian    for (size_t i=0 ; i<fd_count && err==NO_ERROR ; i++) {
2235d84ff3143605f73b5fedb83d7db4224c6d4f1febFabien Sanglard        int fd = this->readFileDescriptor();
2236ec9ec7d55c63f791ab3ed9221e68d6215f7b928aNick Kralevich        if (fd < 0 || ((fds[i] = fcntl(fd, F_DUPFD_CLOEXEC, 0)) < 0)) {
2237abf8a2c608cb5f0d1523ab7d0c56e0da8a09cc87Jun Jiang            err = BAD_VALUE;
2238ec9ec7d55c63f791ab3ed9221e68d6215f7b928aNick Kralevich            ALOGE("fcntl(F_DUPFD_CLOEXEC) failed in Parcel::read, i is %zu, fds[i] is %d, fd_count is %zu, error: %s",
2239d84ff3143605f73b5fedb83d7db4224c6d4f1febFabien Sanglard                  i, fds[i], fd_count, strerror(fd < 0 ? -fd : errno));
2240d84ff3143605f73b5fedb83d7db4224c6d4f1febFabien Sanglard            // Close all the file descriptors that were dup-ed.
2241d84ff3143605f73b5fedb83d7db4224c6d4f1febFabien Sanglard            for (size_t j=0; j<i ;j++) {
2242d84ff3143605f73b5fedb83d7db4224c6d4f1febFabien Sanglard                close(fds[j]);
2243d84ff3143605f73b5fedb83d7db4224c6d4f1febFabien Sanglard            }
2244abf8a2c608cb5f0d1523ab7d0c56e0da8a09cc87Jun Jiang        }
224598e71ddaede9a0bfb681fd237bec1f66c6c53193Mathias Agopian    }
224698e71ddaede9a0bfb681fd237bec1f66c6c53193Mathias Agopian
224798e71ddaede9a0bfb681fd237bec1f66c6c53193Mathias Agopian    if (err == NO_ERROR) {
224898e71ddaede9a0bfb681fd237bec1f66c6c53193Mathias Agopian        err = val.unflatten(buf, len, fds, fd_count);
224998e71ddaede9a0bfb681fd237bec1f66c6c53193Mathias Agopian    }
225098e71ddaede9a0bfb681fd237bec1f66c6c53193Mathias Agopian
225198e71ddaede9a0bfb681fd237bec1f66c6c53193Mathias Agopian    if (fd_count) {
225298e71ddaede9a0bfb681fd237bec1f66c6c53193Mathias Agopian        delete [] fds;
225398e71ddaede9a0bfb681fd237bec1f66c6c53193Mathias Agopian    }
225498e71ddaede9a0bfb681fd237bec1f66c6c53193Mathias Agopian
225598e71ddaede9a0bfb681fd237bec1f66c6c53193Mathias Agopian    return err;
225698e71ddaede9a0bfb681fd237bec1f66c6c53193Mathias Agopian}
22577c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Projectconst flat_binder_object* Parcel::readObject(bool nullMetaData) const
22587c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project{
22597c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project    const size_t DPOS = mDataPos;
22607c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project    if ((DPOS+sizeof(flat_binder_object)) <= mDataSize) {
22617c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project        const flat_binder_object* obj
22627c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project                = reinterpret_cast<const flat_binder_object*>(mData+DPOS);
22637c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project        mDataPos = DPOS + sizeof(flat_binder_object);
226484e625ac1e01f5a9c3ed16664da6498212ed662bArve Hjønnevåg        if (!nullMetaData && (obj->cookie == 0 && obj->binder == 0)) {
22655f78a48bb8f7714ee231fca67d60fad77bc1cad9The Android Open Source Project            // When transferring a NULL object, we don't write it into
22667c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project            // the object list, so we don't want to check for it when
22677c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project            // reading.
2268d4ecccfd206604a9b2d8a1220844fc2df85a5998Mark Salyzyn            ALOGV("readObject Setting data pos of %p to %zu", this, mDataPos);
22697c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project            return obj;
22707c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project        }
2271d4ecccfd206604a9b2d8a1220844fc2df85a5998Mark Salyzyn
22727c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project        // Ensure that this object is valid...
227384e625ac1e01f5a9c3ed16664da6498212ed662bArve Hjønnevåg        binder_size_t* const OBJS = mObjects;
22747c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project        const size_t N = mObjectsSize;
22757c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project        size_t opos = mNextObjectHint;
2276d4ecccfd206604a9b2d8a1220844fc2df85a5998Mark Salyzyn
22777c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project        if (N > 0) {
2278d4ecccfd206604a9b2d8a1220844fc2df85a5998Mark Salyzyn            ALOGV("Parcel %p looking for obj at %zu, hint=%zu",
22797c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project                 this, DPOS, opos);
2280d4ecccfd206604a9b2d8a1220844fc2df85a5998Mark Salyzyn
22817c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project            // Start at the current hint position, looking for an object at
22827c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project            // the current data position.
22837c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project            if (opos < N) {
22847c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project                while (opos < (N-1) && OBJS[opos] < DPOS) {
22857c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project                    opos++;
22867c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project                }
22877c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project            } else {
22887c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project                opos = N-1;
22897c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project            }
22907c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project            if (OBJS[opos] == DPOS) {
22917c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project                // Found it!
2292d4ecccfd206604a9b2d8a1220844fc2df85a5998Mark Salyzyn                ALOGV("Parcel %p found obj %zu at index %zu with forward search",
22937c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project                     this, DPOS, opos);
22947c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project                mNextObjectHint = opos+1;
2295d4ecccfd206604a9b2d8a1220844fc2df85a5998Mark Salyzyn                ALOGV("readObject Setting data pos of %p to %zu", this, mDataPos);
22967c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project                return obj;
22977c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project            }
2298d4ecccfd206604a9b2d8a1220844fc2df85a5998Mark Salyzyn
22997c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project            // Look backwards for it...
23007c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project            while (opos > 0 && OBJS[opos] > DPOS) {
23017c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project                opos--;
23027c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project            }
23037c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project            if (OBJS[opos] == DPOS) {
23047c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project                // Found it!
2305d4ecccfd206604a9b2d8a1220844fc2df85a5998Mark Salyzyn                ALOGV("Parcel %p found obj %zu at index %zu with backward search",
23067c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project                     this, DPOS, opos);
23077c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project                mNextObjectHint = opos+1;
2308d4ecccfd206604a9b2d8a1220844fc2df85a5998Mark Salyzyn                ALOGV("readObject Setting data pos of %p to %zu", this, mDataPos);
23097c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project                return obj;
23107c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project            }
23117c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project        }
23126f4f3ab36c5ed1df84eb3a9f7475f0ac42952f58Colin Cross        ALOGW("Attempt to read object from Parcel %p at offset %zu that is not in the object list",
23137c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project             this, DPOS);
23147c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project    }
23157c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project    return NULL;
23167c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project}
23177c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project
23187c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Projectvoid Parcel::closeFileDescriptors()
23197c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project{
23207c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project    size_t i = mObjectsSize;
23217c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project    if (i > 0) {
2322d4ecccfd206604a9b2d8a1220844fc2df85a5998Mark Salyzyn        //ALOGI("Closing file descriptors for %zu objects...", i);
23237c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project    }
23247c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project    while (i > 0) {
23257c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project        i--;
23267c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project        const flat_binder_object* flat
23277c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project            = reinterpret_cast<flat_binder_object*>(mData+mObjects[i]);
23287c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project        if (flat->type == BINDER_TYPE_FD) {
2329d4ecccfd206604a9b2d8a1220844fc2df85a5998Mark Salyzyn            //ALOGI("Closing fd: %ld", flat->handle);
23307c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project            close(flat->handle);
23317c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project        }
23327c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project    }
23337c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project}
23347c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project
233584e625ac1e01f5a9c3ed16664da6498212ed662bArve Hjønnevåguintptr_t Parcel::ipcData() const
23367c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project{
233784e625ac1e01f5a9c3ed16664da6498212ed662bArve Hjønnevåg    return reinterpret_cast<uintptr_t>(mData);
23387c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project}
23397c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project
23407c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Projectsize_t Parcel::ipcDataSize() const
23417c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project{
23427c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project    return (mDataSize > mDataPos ? mDataSize : mDataPos);
23437c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project}
23447c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project
234584e625ac1e01f5a9c3ed16664da6498212ed662bArve Hjønnevåguintptr_t Parcel::ipcObjects() const
23467c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project{
234784e625ac1e01f5a9c3ed16664da6498212ed662bArve Hjønnevåg    return reinterpret_cast<uintptr_t>(mObjects);
23487c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project}
23497c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project
23507c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Projectsize_t Parcel::ipcObjectsCount() const
23517c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project{
23527c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project    return mObjectsSize;
23537c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project}
23547c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project
23557c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Projectvoid Parcel::ipcSetDataReference(const uint8_t* data, size_t dataSize,
235684e625ac1e01f5a9c3ed16664da6498212ed662bArve Hjønnevåg    const binder_size_t* objects, size_t objectsCount, release_func relFunc, void* relCookie)
23577c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project{
23586f286114ec1d597f3dae987bba6e72dbbc404e32Arve Hjønnevåg    binder_size_t minOffset = 0;
23597c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project    freeDataNoInit();
23607c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project    mError = NO_ERROR;
23617c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project    mData = const_cast<uint8_t*>(data);
23627c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project    mDataSize = mDataCapacity = dataSize;
2363d4ecccfd206604a9b2d8a1220844fc2df85a5998Mark Salyzyn    //ALOGI("setDataReference Setting data size of %p to %lu (pid=%d)", this, mDataSize, getpid());
23647c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project    mDataPos = 0;
2365d4ecccfd206604a9b2d8a1220844fc2df85a5998Mark Salyzyn    ALOGV("setDataReference Setting data pos of %p to %zu", this, mDataPos);
236684e625ac1e01f5a9c3ed16664da6498212ed662bArve Hjønnevåg    mObjects = const_cast<binder_size_t*>(objects);
23677c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project    mObjectsSize = mObjectsCapacity = objectsCount;
23687c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project    mNextObjectHint = 0;
23697c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project    mOwner = relFunc;
23707c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project    mOwnerCookie = relCookie;
2371f50b9eaaeeaeae16981f11b05d3f3a6fb0dea30dArve Hjønnevåg    for (size_t i = 0; i < mObjectsSize; i++) {
23726f286114ec1d597f3dae987bba6e72dbbc404e32Arve Hjønnevåg        binder_size_t offset = mObjects[i];
2373f50b9eaaeeaeae16981f11b05d3f3a6fb0dea30dArve Hjønnevåg        if (offset < minOffset) {
23743bdc5b826803dca10d3625c56de38d6c55d869c8Dan Albert            ALOGE("%s: bad object offset %" PRIu64 " < %" PRIu64 "\n",
23756f286114ec1d597f3dae987bba6e72dbbc404e32Arve Hjønnevåg                  __func__, (uint64_t)offset, (uint64_t)minOffset);
2376f50b9eaaeeaeae16981f11b05d3f3a6fb0dea30dArve Hjønnevåg            mObjectsSize = 0;
2377f50b9eaaeeaeae16981f11b05d3f3a6fb0dea30dArve Hjønnevåg            break;
2378f50b9eaaeeaeae16981f11b05d3f3a6fb0dea30dArve Hjønnevåg        }
2379f50b9eaaeeaeae16981f11b05d3f3a6fb0dea30dArve Hjønnevåg        minOffset = offset + sizeof(flat_binder_object);
2380f50b9eaaeeaeae16981f11b05d3f3a6fb0dea30dArve Hjønnevåg    }
23817c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project    scanForFds();
23827c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project}
23837c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project
23846f4f3ab36c5ed1df84eb3a9f7475f0ac42952f58Colin Crossvoid Parcel::print(TextOutput& to, uint32_t /*flags*/) const
23857c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project{
23867c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project    to << "Parcel(";
2387d4ecccfd206604a9b2d8a1220844fc2df85a5998Mark Salyzyn
23887c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project    if (errorCheck() != NO_ERROR) {
23897c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project        const status_t err = errorCheck();
23906f4f3ab36c5ed1df84eb3a9f7475f0ac42952f58Colin Cross        to << "Error: " << (void*)(intptr_t)err << " \"" << strerror(-err) << "\"";
23917c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project    } else if (dataSize() > 0) {
23927c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project        const uint8_t* DATA = data();
23937c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project        to << indent << HexDump(DATA, dataSize()) << dedent;
239484e625ac1e01f5a9c3ed16664da6498212ed662bArve Hjønnevåg        const binder_size_t* OBJS = objects();
23957c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project        const size_t N = objectsCount();
23967c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project        for (size_t i=0; i<N; i++) {
23977c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project            const flat_binder_object* flat
23987c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project                = reinterpret_cast<const flat_binder_object*>(DATA+OBJS[i]);
23997c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project            to << endl << "Object #" << i << " @ " << (void*)OBJS[i] << ": "
24007c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project                << TypeCode(flat->type & 0x7f7f7f00)
24017c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project                << " = " << flat->binder;
24027c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project        }
24037c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project    } else {
24047c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project        to << "NULL";
24057c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project    }
2406d4ecccfd206604a9b2d8a1220844fc2df85a5998Mark Salyzyn
24077c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project    to << ")";
24087c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project}
24097c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project
24107c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Projectvoid Parcel::releaseObjects()
24117c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project{
24127c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project    const sp<ProcessState> proc(ProcessState::self());
24137c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project    size_t i = mObjectsSize;
24147c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project    uint8_t* const data = mData;
241584e625ac1e01f5a9c3ed16664da6498212ed662bArve Hjønnevåg    binder_size_t* const objects = mObjects;
24167c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project    while (i > 0) {
24177c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project        i--;
24187c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project        const flat_binder_object* flat
24197c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project            = reinterpret_cast<flat_binder_object*>(data+objects[i]);
2420cbf3726357966539c2a685f46e61c3fc8937f19eAdrian Roos        release_object(proc, *flat, this, &mOpenAshmemSize);
24217c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project    }
24227c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project}
24237c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project
24247c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Projectvoid Parcel::acquireObjects()
24257c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project{
24267c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project    const sp<ProcessState> proc(ProcessState::self());
24277c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project    size_t i = mObjectsSize;
24287c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project    uint8_t* const data = mData;
242984e625ac1e01f5a9c3ed16664da6498212ed662bArve Hjønnevåg    binder_size_t* const objects = mObjects;
24307c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project    while (i > 0) {
24317c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project        i--;
24327c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project        const flat_binder_object* flat
24337c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project            = reinterpret_cast<flat_binder_object*>(data+objects[i]);
2434cbf3726357966539c2a685f46e61c3fc8937f19eAdrian Roos        acquire_object(proc, *flat, this, &mOpenAshmemSize);
24357c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project    }
24367c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project}
24377c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project
24387c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Projectvoid Parcel::freeData()
24397c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project{
24407c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project    freeDataNoInit();
24417c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project    initState();
24427c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project}
24437c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project
24447c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Projectvoid Parcel::freeDataNoInit()
24457c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project{
24467c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project    if (mOwner) {
24477e790af756d7891cb1cf1374bb283a8fbcbe6b49Dianne Hackborn        LOG_ALLOC("Parcel %p: freeing other owner data", this);
2448d4ecccfd206604a9b2d8a1220844fc2df85a5998Mark Salyzyn        //ALOGI("Freeing data ref of %p (pid=%d)", this, getpid());
24497c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project        mOwner(this, mData, mDataSize, mObjects, mObjectsSize, mOwnerCookie);
24507c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project    } else {
24517e790af756d7891cb1cf1374bb283a8fbcbe6b49Dianne Hackborn        LOG_ALLOC("Parcel %p: freeing allocated data", this);
24527c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project        releaseObjects();
24537e790af756d7891cb1cf1374bb283a8fbcbe6b49Dianne Hackborn        if (mData) {
24547e790af756d7891cb1cf1374bb283a8fbcbe6b49Dianne Hackborn            LOG_ALLOC("Parcel %p: freeing with %zu capacity", this, mDataCapacity);
2455a4cff88d80bf1acbdbd063af88ecad83a8b9b7b4Dianne Hackborn            pthread_mutex_lock(&gParcelGlobalAllocSizeLock);
245648fd7b457bb0657253d6012e787f50498b32ae42Dan Austin            if (mDataCapacity <= gParcelGlobalAllocSize) {
245748fd7b457bb0657253d6012e787f50498b32ae42Dan Austin              gParcelGlobalAllocSize = gParcelGlobalAllocSize - mDataCapacity;
245848fd7b457bb0657253d6012e787f50498b32ae42Dan Austin            } else {
245948fd7b457bb0657253d6012e787f50498b32ae42Dan Austin              gParcelGlobalAllocSize = 0;
246048fd7b457bb0657253d6012e787f50498b32ae42Dan Austin            }
246148fd7b457bb0657253d6012e787f50498b32ae42Dan Austin            if (gParcelGlobalAllocCount > 0) {
246248fd7b457bb0657253d6012e787f50498b32ae42Dan Austin              gParcelGlobalAllocCount--;
246348fd7b457bb0657253d6012e787f50498b32ae42Dan Austin            }
2464a4cff88d80bf1acbdbd063af88ecad83a8b9b7b4Dianne Hackborn            pthread_mutex_unlock(&gParcelGlobalAllocSizeLock);
24657e790af756d7891cb1cf1374bb283a8fbcbe6b49Dianne Hackborn            free(mData);
24667e790af756d7891cb1cf1374bb283a8fbcbe6b49Dianne Hackborn        }
24677c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project        if (mObjects) free(mObjects);
24687c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project    }
24697c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project}
24707c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project
24717c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Projectstatus_t Parcel::growData(size_t len)
24727c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project{
2473b6b1423c87e457097875dc304fbbe38db6c41abdNick Kralevich    if (len > INT32_MAX) {
2474b6b1423c87e457097875dc304fbbe38db6c41abdNick Kralevich        // don't accept size_t values which may have come from an
2475b6b1423c87e457097875dc304fbbe38db6c41abdNick Kralevich        // inadvertent conversion from a negative int.
2476b6b1423c87e457097875dc304fbbe38db6c41abdNick Kralevich        return BAD_VALUE;
2477b6b1423c87e457097875dc304fbbe38db6c41abdNick Kralevich    }
2478b6b1423c87e457097875dc304fbbe38db6c41abdNick Kralevich
24797c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project    size_t newSize = ((mDataSize+len)*3)/2;
24807c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project    return (newSize <= mDataSize)
24817c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project            ? (status_t) NO_MEMORY
24827c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project            : continueWrite(newSize);
24837c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project}
24847c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project
24857c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Projectstatus_t Parcel::restartWrite(size_t desired)
24867c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project{
2487b6b1423c87e457097875dc304fbbe38db6c41abdNick Kralevich    if (desired > INT32_MAX) {
2488b6b1423c87e457097875dc304fbbe38db6c41abdNick Kralevich        // don't accept size_t values which may have come from an
2489b6b1423c87e457097875dc304fbbe38db6c41abdNick Kralevich        // inadvertent conversion from a negative int.
2490b6b1423c87e457097875dc304fbbe38db6c41abdNick Kralevich        return BAD_VALUE;
2491b6b1423c87e457097875dc304fbbe38db6c41abdNick Kralevich    }
2492b6b1423c87e457097875dc304fbbe38db6c41abdNick Kralevich
24937c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project    if (mOwner) {
24947c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project        freeData();
24957c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project        return continueWrite(desired);
24967c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project    }
2497d4ecccfd206604a9b2d8a1220844fc2df85a5998Mark Salyzyn
24987c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project    uint8_t* data = (uint8_t*)realloc(mData, desired);
24997c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project    if (!data && desired > mDataCapacity) {
25007c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project        mError = NO_MEMORY;
25017c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project        return NO_MEMORY;
25027c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project    }
2503d4ecccfd206604a9b2d8a1220844fc2df85a5998Mark Salyzyn
25047c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project    releaseObjects();
2505d4ecccfd206604a9b2d8a1220844fc2df85a5998Mark Salyzyn
25067c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project    if (data) {
25077e790af756d7891cb1cf1374bb283a8fbcbe6b49Dianne Hackborn        LOG_ALLOC("Parcel %p: restart from %zu to %zu capacity", this, mDataCapacity, desired);
2508a4cff88d80bf1acbdbd063af88ecad83a8b9b7b4Dianne Hackborn        pthread_mutex_lock(&gParcelGlobalAllocSizeLock);
25097e790af756d7891cb1cf1374bb283a8fbcbe6b49Dianne Hackborn        gParcelGlobalAllocSize += desired;
25107e790af756d7891cb1cf1374bb283a8fbcbe6b49Dianne Hackborn        gParcelGlobalAllocSize -= mDataCapacity;
251183ec65e19a8b5e1ae11e789b3d79d08543b09193Colin Cross        if (!mData) {
251283ec65e19a8b5e1ae11e789b3d79d08543b09193Colin Cross            gParcelGlobalAllocCount++;
251383ec65e19a8b5e1ae11e789b3d79d08543b09193Colin Cross        }
2514a4cff88d80bf1acbdbd063af88ecad83a8b9b7b4Dianne Hackborn        pthread_mutex_unlock(&gParcelGlobalAllocSizeLock);
25157c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project        mData = data;
25167c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project        mDataCapacity = desired;
25177c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project    }
2518d4ecccfd206604a9b2d8a1220844fc2df85a5998Mark Salyzyn
25197c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project    mDataSize = mDataPos = 0;
2520d4ecccfd206604a9b2d8a1220844fc2df85a5998Mark Salyzyn    ALOGV("restartWrite Setting data size of %p to %zu", this, mDataSize);
2521d4ecccfd206604a9b2d8a1220844fc2df85a5998Mark Salyzyn    ALOGV("restartWrite Setting data pos of %p to %zu", this, mDataPos);
2522d4ecccfd206604a9b2d8a1220844fc2df85a5998Mark Salyzyn
25237c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project    free(mObjects);
25247c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project    mObjects = NULL;
25257c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project    mObjectsSize = mObjectsCapacity = 0;
25267c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project    mNextObjectHint = 0;
25277c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project    mHasFds = false;
25287c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project    mFdsKnown = true;
25298938ed2c8e906fc332301b64787728d4d34da571Dianne Hackborn    mAllowFds = true;
2530d4ecccfd206604a9b2d8a1220844fc2df85a5998Mark Salyzyn
25317c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project    return NO_ERROR;
25327c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project}
25337c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project
25347c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Projectstatus_t Parcel::continueWrite(size_t desired)
25357c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project{
2536b6b1423c87e457097875dc304fbbe38db6c41abdNick Kralevich    if (desired > INT32_MAX) {
2537b6b1423c87e457097875dc304fbbe38db6c41abdNick Kralevich        // don't accept size_t values which may have come from an
2538b6b1423c87e457097875dc304fbbe38db6c41abdNick Kralevich        // inadvertent conversion from a negative int.
2539b6b1423c87e457097875dc304fbbe38db6c41abdNick Kralevich        return BAD_VALUE;
2540b6b1423c87e457097875dc304fbbe38db6c41abdNick Kralevich    }
2541b6b1423c87e457097875dc304fbbe38db6c41abdNick Kralevich
25427c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project    // If shrinking, first adjust for any objects that appear
25437c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project    // after the new data size.
25447c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project    size_t objectsSize = mObjectsSize;
25457c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project    if (desired < mDataSize) {
25467c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project        if (desired == 0) {
25477c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project            objectsSize = 0;
25487c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project        } else {
25497c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project            while (objectsSize > 0) {
2550a6541637a8a5bf55899564df79b7a14e8029fed3Michael Wachenschwanz                if (mObjects[objectsSize-1] < desired)
25517c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project                    break;
25527c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project                objectsSize--;
25537c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project            }
25547c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project        }
25557c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project    }
2556d4ecccfd206604a9b2d8a1220844fc2df85a5998Mark Salyzyn
25577c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project    if (mOwner) {
25587c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project        // If the size is going to zero, just release the owner's data.
25597c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project        if (desired == 0) {
25607c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project            freeData();
25617c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project            return NO_ERROR;
25627c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project        }
25637c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project
25647c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project        // If there is a different owner, we need to take
25657c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project        // posession.
25667c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project        uint8_t* data = (uint8_t*)malloc(desired);
25677c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project        if (!data) {
25687c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project            mError = NO_MEMORY;
25697c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project            return NO_MEMORY;
25707c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project        }
257184e625ac1e01f5a9c3ed16664da6498212ed662bArve Hjønnevåg        binder_size_t* objects = NULL;
2572d4ecccfd206604a9b2d8a1220844fc2df85a5998Mark Salyzyn
25737c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project        if (objectsSize) {
2574e9881a3961888c4264034473021f42f9f0305026Nick Kralevich            objects = (binder_size_t*)calloc(objectsSize, sizeof(binder_size_t));
25757c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project            if (!objects) {
25763f727c0ea3ad1de512c935c6e80423f2115b46c0Hyejin Kim                free(data);
25773f727c0ea3ad1de512c935c6e80423f2115b46c0Hyejin Kim
25787c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project                mError = NO_MEMORY;
25797c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project                return NO_MEMORY;
25807c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project            }
25817c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project
25827c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project            // Little hack to only acquire references on objects
25837c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project            // we will be keeping.
25847c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project            size_t oldObjectsSize = mObjectsSize;
25857c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project            mObjectsSize = objectsSize;
25867c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project            acquireObjects();
25877c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project            mObjectsSize = oldObjectsSize;
25887c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project        }
2589d4ecccfd206604a9b2d8a1220844fc2df85a5998Mark Salyzyn
25907c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project        if (mData) {
25917c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project            memcpy(data, mData, mDataSize < desired ? mDataSize : desired);
25927c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project        }
25937c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project        if (objects && mObjects) {
259484e625ac1e01f5a9c3ed16664da6498212ed662bArve Hjønnevåg            memcpy(objects, mObjects, objectsSize*sizeof(binder_size_t));
25957c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project        }
2596d4ecccfd206604a9b2d8a1220844fc2df85a5998Mark Salyzyn        //ALOGI("Freeing data ref of %p (pid=%d)", this, getpid());
25977c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project        mOwner(this, mData, mDataSize, mObjects, mObjectsSize, mOwnerCookie);
25987c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project        mOwner = NULL;
25997c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project
26007e790af756d7891cb1cf1374bb283a8fbcbe6b49Dianne Hackborn        LOG_ALLOC("Parcel %p: taking ownership of %zu capacity", this, desired);
2601a4cff88d80bf1acbdbd063af88ecad83a8b9b7b4Dianne Hackborn        pthread_mutex_lock(&gParcelGlobalAllocSizeLock);
26027e790af756d7891cb1cf1374bb283a8fbcbe6b49Dianne Hackborn        gParcelGlobalAllocSize += desired;
26037e790af756d7891cb1cf1374bb283a8fbcbe6b49Dianne Hackborn        gParcelGlobalAllocCount++;
2604a4cff88d80bf1acbdbd063af88ecad83a8b9b7b4Dianne Hackborn        pthread_mutex_unlock(&gParcelGlobalAllocSizeLock);
26057e790af756d7891cb1cf1374bb283a8fbcbe6b49Dianne Hackborn
26067c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project        mData = data;
26077c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project        mObjects = objects;
26087c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project        mDataSize = (mDataSize < desired) ? mDataSize : desired;
2609d4ecccfd206604a9b2d8a1220844fc2df85a5998Mark Salyzyn        ALOGV("continueWrite Setting data size of %p to %zu", this, mDataSize);
26107c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project        mDataCapacity = desired;
26117c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project        mObjectsSize = mObjectsCapacity = objectsSize;
26127c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project        mNextObjectHint = 0;
26137c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project
26147c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project    } else if (mData) {
26157c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project        if (objectsSize < mObjectsSize) {
26167c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project            // Need to release refs on any objects we are dropping.
26177c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project            const sp<ProcessState> proc(ProcessState::self());
26187c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project            for (size_t i=objectsSize; i<mObjectsSize; i++) {
26197c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project                const flat_binder_object* flat
26207c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project                    = reinterpret_cast<flat_binder_object*>(mData+mObjects[i]);
26217c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project                if (flat->type == BINDER_TYPE_FD) {
26227c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project                    // will need to rescan because we may have lopped off the only FDs
26237c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project                    mFdsKnown = false;
26247c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project                }
2625cbf3726357966539c2a685f46e61c3fc8937f19eAdrian Roos                release_object(proc, *flat, this, &mOpenAshmemSize);
26267c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project            }
262784e625ac1e01f5a9c3ed16664da6498212ed662bArve Hjønnevåg            binder_size_t* objects =
262884e625ac1e01f5a9c3ed16664da6498212ed662bArve Hjønnevåg                (binder_size_t*)realloc(mObjects, objectsSize*sizeof(binder_size_t));
26297c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project            if (objects) {
26307c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project                mObjects = objects;
26317c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project            }
26327c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project            mObjectsSize = objectsSize;
26337c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project            mNextObjectHint = 0;
26347c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project        }
26357c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project
26367c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project        // We own the data, so we can just do a realloc().
26377c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project        if (desired > mDataCapacity) {
26387c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project            uint8_t* data = (uint8_t*)realloc(mData, desired);
26397c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project            if (data) {
26407e790af756d7891cb1cf1374bb283a8fbcbe6b49Dianne Hackborn                LOG_ALLOC("Parcel %p: continue from %zu to %zu capacity", this, mDataCapacity,
26417e790af756d7891cb1cf1374bb283a8fbcbe6b49Dianne Hackborn                        desired);
2642a4cff88d80bf1acbdbd063af88ecad83a8b9b7b4Dianne Hackborn                pthread_mutex_lock(&gParcelGlobalAllocSizeLock);
26437e790af756d7891cb1cf1374bb283a8fbcbe6b49Dianne Hackborn                gParcelGlobalAllocSize += desired;
26447e790af756d7891cb1cf1374bb283a8fbcbe6b49Dianne Hackborn                gParcelGlobalAllocSize -= mDataCapacity;
2645a4cff88d80bf1acbdbd063af88ecad83a8b9b7b4Dianne Hackborn                pthread_mutex_unlock(&gParcelGlobalAllocSizeLock);
26467c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project                mData = data;
26477c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project                mDataCapacity = desired;
26487c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project            } else if (desired > mDataCapacity) {
26497c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project                mError = NO_MEMORY;
26507c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project                return NO_MEMORY;
26517c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project            }
26527c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project        } else {
265397e2bcd76021b31c5064fd3f669bc3f450b4c952Dianne Hackborn            if (mDataSize > desired) {
265497e2bcd76021b31c5064fd3f669bc3f450b4c952Dianne Hackborn                mDataSize = desired;
2655d4ecccfd206604a9b2d8a1220844fc2df85a5998Mark Salyzyn                ALOGV("continueWrite Setting data size of %p to %zu", this, mDataSize);
265697e2bcd76021b31c5064fd3f669bc3f450b4c952Dianne Hackborn            }
26577c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project            if (mDataPos > desired) {
26587c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project                mDataPos = desired;
2659d4ecccfd206604a9b2d8a1220844fc2df85a5998Mark Salyzyn                ALOGV("continueWrite Setting data pos of %p to %zu", this, mDataPos);
26607c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project            }
26617c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project        }
2662d4ecccfd206604a9b2d8a1220844fc2df85a5998Mark Salyzyn
26637c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project    } else {
26647c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project        // This is the first data.  Easy!
26657c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project        uint8_t* data = (uint8_t*)malloc(desired);
26667c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project        if (!data) {
26677c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project            mError = NO_MEMORY;
26687c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project            return NO_MEMORY;
26697c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project        }
26703f727c0ea3ad1de512c935c6e80423f2115b46c0Hyejin Kim
26717c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project        if(!(mDataCapacity == 0 && mObjects == NULL
26727c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project             && mObjectsCapacity == 0)) {
26736f4f3ab36c5ed1df84eb3a9f7475f0ac42952f58Colin Cross            ALOGE("continueWrite: %zu/%p/%zu/%zu", mDataCapacity, mObjects, mObjectsCapacity, desired);
26747c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project        }
2675d4ecccfd206604a9b2d8a1220844fc2df85a5998Mark Salyzyn
26767e790af756d7891cb1cf1374bb283a8fbcbe6b49Dianne Hackborn        LOG_ALLOC("Parcel %p: allocating with %zu capacity", this, desired);
2677a4cff88d80bf1acbdbd063af88ecad83a8b9b7b4Dianne Hackborn        pthread_mutex_lock(&gParcelGlobalAllocSizeLock);
26787e790af756d7891cb1cf1374bb283a8fbcbe6b49Dianne Hackborn        gParcelGlobalAllocSize += desired;
26797e790af756d7891cb1cf1374bb283a8fbcbe6b49Dianne Hackborn        gParcelGlobalAllocCount++;
2680a4cff88d80bf1acbdbd063af88ecad83a8b9b7b4Dianne Hackborn        pthread_mutex_unlock(&gParcelGlobalAllocSizeLock);
26817e790af756d7891cb1cf1374bb283a8fbcbe6b49Dianne Hackborn
26827c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project        mData = data;
26837c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project        mDataSize = mDataPos = 0;
2684d4ecccfd206604a9b2d8a1220844fc2df85a5998Mark Salyzyn        ALOGV("continueWrite Setting data size of %p to %zu", this, mDataSize);
2685d4ecccfd206604a9b2d8a1220844fc2df85a5998Mark Salyzyn        ALOGV("continueWrite Setting data pos of %p to %zu", this, mDataPos);
26867c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project        mDataCapacity = desired;
26877c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project    }
26887c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project
26897c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project    return NO_ERROR;
26907c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project}
26917c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project
26927c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Projectvoid Parcel::initState()
26937c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project{
26947e790af756d7891cb1cf1374bb283a8fbcbe6b49Dianne Hackborn    LOG_ALLOC("Parcel %p: initState", this);
26957c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project    mError = NO_ERROR;
26967c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project    mData = 0;
26977c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project    mDataSize = 0;
26987c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project    mDataCapacity = 0;
26997c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project    mDataPos = 0;
2700d4ecccfd206604a9b2d8a1220844fc2df85a5998Mark Salyzyn    ALOGV("initState Setting data size of %p to %zu", this, mDataSize);
2701d4ecccfd206604a9b2d8a1220844fc2df85a5998Mark Salyzyn    ALOGV("initState Setting data pos of %p to %zu", this, mDataPos);
27027c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project    mObjects = NULL;
27037c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project    mObjectsSize = 0;
27047c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project    mObjectsCapacity = 0;
27057c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project    mNextObjectHint = 0;
27067c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project    mHasFds = false;
27077c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project    mFdsKnown = true;
27088938ed2c8e906fc332301b64787728d4d34da571Dianne Hackborn    mAllowFds = true;
27097c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project    mOwner = NULL;
2710cbf3726357966539c2a685f46e61c3fc8937f19eAdrian Roos    mOpenAshmemSize = 0;
2711e4e0ae8abc7f612960fc381a792d0bef4c3eb6f9Christopher Tate
2712e4e0ae8abc7f612960fc381a792d0bef4c3eb6f9Christopher Tate    // racing multiple init leads only to multiple identical write
2713e4e0ae8abc7f612960fc381a792d0bef4c3eb6f9Christopher Tate    if (gMaxFds == 0) {
2714e4e0ae8abc7f612960fc381a792d0bef4c3eb6f9Christopher Tate        struct rlimit result;
2715e4e0ae8abc7f612960fc381a792d0bef4c3eb6f9Christopher Tate        if (!getrlimit(RLIMIT_NOFILE, &result)) {
2716e4e0ae8abc7f612960fc381a792d0bef4c3eb6f9Christopher Tate            gMaxFds = (size_t)result.rlim_cur;
2717bf14e94722a57a545b04396e06e9c5d65e241068Christopher Tate            //ALOGI("parcel fd limit set to %zu", gMaxFds);
2718e4e0ae8abc7f612960fc381a792d0bef4c3eb6f9Christopher Tate        } else {
2719e4e0ae8abc7f612960fc381a792d0bef4c3eb6f9Christopher Tate            ALOGW("Unable to getrlimit: %s", strerror(errno));
2720e4e0ae8abc7f612960fc381a792d0bef4c3eb6f9Christopher Tate            gMaxFds = 1024;
2721e4e0ae8abc7f612960fc381a792d0bef4c3eb6f9Christopher Tate        }
2722e4e0ae8abc7f612960fc381a792d0bef4c3eb6f9Christopher Tate    }
27237c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project}
27247c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project
27257c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Projectvoid Parcel::scanForFds() const
27267c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project{
27277c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project    bool hasFds = false;
27287c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project    for (size_t i=0; i<mObjectsSize; i++) {
27297c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project        const flat_binder_object* flat
27307c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project            = reinterpret_cast<const flat_binder_object*>(mData + mObjects[i]);
27317c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project        if (flat->type == BINDER_TYPE_FD) {
27327c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project            hasFds = true;
27337c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project            break;
27347c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project        }
27357c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project    }
27367c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project    mHasFds = hasFds;
27377c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project    mFdsKnown = true;
27387c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project}
27397c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project
2740aa5c2346c7291465aaca53f59878582dccbe4835Dan Sandlersize_t Parcel::getBlobAshmemSize() const
2741aa5c2346c7291465aaca53f59878582dccbe4835Dan Sandler{
27426bb3114246f6f6aa406e65452dbaa12b135029eaAdrian Roos    // This used to return the size of all blobs that were written to ashmem, now we're returning
27436bb3114246f6f6aa406e65452dbaa12b135029eaAdrian Roos    // the ashmem currently referenced by this Parcel, which should be equivalent.
27446bb3114246f6f6aa406e65452dbaa12b135029eaAdrian Roos    // TODO: Remove method once ABI can be changed.
27456bb3114246f6f6aa406e65452dbaa12b135029eaAdrian Roos    return mOpenAshmemSize;
2746aa5c2346c7291465aaca53f59878582dccbe4835Dan Sandler}
2747aa5c2346c7291465aaca53f59878582dccbe4835Dan Sandler
2748cbf3726357966539c2a685f46e61c3fc8937f19eAdrian Roossize_t Parcel::getOpenAshmemSize() const
2749cbf3726357966539c2a685f46e61c3fc8937f19eAdrian Roos{
2750cbf3726357966539c2a685f46e61c3fc8937f19eAdrian Roos    return mOpenAshmemSize;
2751aa5c2346c7291465aaca53f59878582dccbe4835Dan Sandler}
2752aa5c2346c7291465aaca53f59878582dccbe4835Dan Sandler
27535707dbf15d0b44c88fbaa6dd271097f2d42932e0Jeff Brown// --- Parcel::Blob ---
27545707dbf15d0b44c88fbaa6dd271097f2d42932e0Jeff Brown
27555707dbf15d0b44c88fbaa6dd271097f2d42932e0Jeff BrownParcel::Blob::Blob() :
275613b1604018968408bcc5553e1fa5ea9df3e4e009Jeff Brown        mFd(-1), mData(NULL), mSize(0), mMutable(false) {
27575707dbf15d0b44c88fbaa6dd271097f2d42932e0Jeff Brown}
27585707dbf15d0b44c88fbaa6dd271097f2d42932e0Jeff Brown
27595707dbf15d0b44c88fbaa6dd271097f2d42932e0Jeff BrownParcel::Blob::~Blob() {
27605707dbf15d0b44c88fbaa6dd271097f2d42932e0Jeff Brown    release();
27615707dbf15d0b44c88fbaa6dd271097f2d42932e0Jeff Brown}
27625707dbf15d0b44c88fbaa6dd271097f2d42932e0Jeff Brown
27635707dbf15d0b44c88fbaa6dd271097f2d42932e0Jeff Brownvoid Parcel::Blob::release() {
276413b1604018968408bcc5553e1fa5ea9df3e4e009Jeff Brown    if (mFd != -1 && mData) {
27655707dbf15d0b44c88fbaa6dd271097f2d42932e0Jeff Brown        ::munmap(mData, mSize);
27665707dbf15d0b44c88fbaa6dd271097f2d42932e0Jeff Brown    }
27675707dbf15d0b44c88fbaa6dd271097f2d42932e0Jeff Brown    clear();
27685707dbf15d0b44c88fbaa6dd271097f2d42932e0Jeff Brown}
27695707dbf15d0b44c88fbaa6dd271097f2d42932e0Jeff Brown
277013b1604018968408bcc5553e1fa5ea9df3e4e009Jeff Brownvoid Parcel::Blob::init(int fd, void* data, size_t size, bool isMutable) {
277113b1604018968408bcc5553e1fa5ea9df3e4e009Jeff Brown    mFd = fd;
27725707dbf15d0b44c88fbaa6dd271097f2d42932e0Jeff Brown    mData = data;
27735707dbf15d0b44c88fbaa6dd271097f2d42932e0Jeff Brown    mSize = size;
277413b1604018968408bcc5553e1fa5ea9df3e4e009Jeff Brown    mMutable = isMutable;
27755707dbf15d0b44c88fbaa6dd271097f2d42932e0Jeff Brown}
27765707dbf15d0b44c88fbaa6dd271097f2d42932e0Jeff Brown
27775707dbf15d0b44c88fbaa6dd271097f2d42932e0Jeff Brownvoid Parcel::Blob::clear() {
277813b1604018968408bcc5553e1fa5ea9df3e4e009Jeff Brown    mFd = -1;
27795707dbf15d0b44c88fbaa6dd271097f2d42932e0Jeff Brown    mData = NULL;
27805707dbf15d0b44c88fbaa6dd271097f2d42932e0Jeff Brown    mSize = 0;
278113b1604018968408bcc5553e1fa5ea9df3e4e009Jeff Brown    mMutable = false;
27825707dbf15d0b44c88fbaa6dd271097f2d42932e0Jeff Brown}
27835707dbf15d0b44c88fbaa6dd271097f2d42932e0Jeff Brown
27847c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project}; // namespace android
2785