blob: 3c321009f8d0ba20ae2d0c73bf74c89b094c0fff [file] [log] [blame]
Steven Moreland2e87adc2018-08-20 19:47:00 -07001/*
2 * Copyright (C) 2018 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17#include <android/binder_parcel.h>
Steven Moreland4d5ad492018-09-13 12:49:16 -070018#include "parcel_internal.h"
Steven Moreland2e87adc2018-08-20 19:47:00 -070019
Steven Moreland4d5ad492018-09-13 12:49:16 -070020#include "ibinder_internal.h"
Steven Moreland5d62e442018-09-13 15:01:02 -070021#include "status_internal.h"
Steven Moreland2e87adc2018-08-20 19:47:00 -070022
Steven Moreland7b06f592018-10-03 19:25:32 -070023#include <limits>
24
25#include <android-base/logging.h>
Steven Moreland063f2362018-10-18 12:49:11 -070026#include <android-base/unique_fd.h>
Steven Moreland2e87adc2018-08-20 19:47:00 -070027#include <binder/Parcel.h>
Steven Moreland063f2362018-10-18 12:49:11 -070028#include <binder/ParcelFileDescriptor.h>
Steven Moreland7b06f592018-10-03 19:25:32 -070029#include <utils/Unicode.h>
Steven Moreland2e87adc2018-08-20 19:47:00 -070030
31using ::android::IBinder;
32using ::android::Parcel;
33using ::android::sp;
Steven Moreland5d62e442018-09-13 15:01:02 -070034using ::android::status_t;
Steven Moreland063f2362018-10-18 12:49:11 -070035using ::android::base::unique_fd;
36using ::android::os::ParcelFileDescriptor;
Steven Moreland2e87adc2018-08-20 19:47:00 -070037
Steven Morelanda8845662018-10-12 11:53:03 -070038template <typename T>
Steven Moreland01ebcf72018-11-15 15:06:26 -080039using ContiguousArrayAllocator = bool (*)(void* arrayData, int32_t length, T** outBuffer);
Steven Moreland71872f82018-10-29 11:46:56 -070040
41template <typename T>
Steven Moreland01ebcf72018-11-15 15:06:26 -080042using ArrayAllocator = bool (*)(void* arrayData, int32_t length);
Steven Morelanda8845662018-10-12 11:53:03 -070043template <typename T>
44using ArrayGetter = T (*)(const void* arrayData, size_t index);
45template <typename T>
46using ArraySetter = void (*)(void* arrayData, size_t index, T value);
47
Steven Moreland01ebcf72018-11-15 15:06:26 -080048binder_status_t WriteAndValidateArraySize(AParcel* parcel, bool isNullArray, int32_t length) {
49 // only -1 can be used to represent a null array
50 if (length < -1) return STATUS_BAD_VALUE;
51
52 if (!isNullArray && length < 0) {
53 LOG(ERROR) << __func__ << ": null array must be used with length == -1.";
54 return STATUS_BAD_VALUE;
55 }
56 if (isNullArray && length > 0) {
57 LOG(ERROR) << __func__ << ": null buffer cannot be for size " << length << " array.";
58 return STATUS_BAD_VALUE;
59 }
Steven Morelanda8845662018-10-12 11:53:03 -070060
61 Parcel* rawParcel = parcel->get();
62
63 status_t status = rawParcel->writeInt32(static_cast<int32_t>(length));
64 if (status != STATUS_OK) return PruneStatusT(status);
65
Steven Moreland01ebcf72018-11-15 15:06:26 -080066 return STATUS_OK;
67}
68
69template <typename T>
70binder_status_t WriteArray(AParcel* parcel, const T* array, int32_t length) {
71 binder_status_t status = WriteAndValidateArraySize(parcel, array == nullptr, length);
72 if (status != STATUS_OK) return status;
73 if (length <= 0) return STATUS_OK;
74
Steven Morelanda8845662018-10-12 11:53:03 -070075 int32_t size = 0;
76 if (__builtin_smul_overflow(sizeof(T), length, &size)) return STATUS_NO_MEMORY;
77
Steven Moreland01ebcf72018-11-15 15:06:26 -080078 void* const data = parcel->get()->writeInplace(size);
Steven Morelanda8845662018-10-12 11:53:03 -070079 if (data == nullptr) return STATUS_NO_MEMORY;
80
81 memcpy(data, array, size);
82
83 return STATUS_OK;
84}
85
86// Each element in a char16_t array is converted to an int32_t (not packed).
87template <>
Steven Moreland01ebcf72018-11-15 15:06:26 -080088binder_status_t WriteArray<char16_t>(AParcel* parcel, const char16_t* array, int32_t length) {
89 binder_status_t status = WriteAndValidateArraySize(parcel, array == nullptr, length);
90 if (status != STATUS_OK) return status;
91 if (length <= 0) return STATUS_OK;
Steven Morelanda8845662018-10-12 11:53:03 -070092
93 int32_t size = 0;
94 if (__builtin_smul_overflow(sizeof(char16_t), length, &size)) return STATUS_NO_MEMORY;
95
Steven Moreland01ebcf72018-11-15 15:06:26 -080096 Parcel* rawParcel = parcel->get();
97
Steven Morelanda8845662018-10-12 11:53:03 -070098 for (int32_t i = 0; i < length; i++) {
99 status = rawParcel->writeChar(array[i]);
100
101 if (status != STATUS_OK) return PruneStatusT(status);
102 }
103
104 return STATUS_OK;
105}
106
107template <typename T>
Steven Moreland71872f82018-10-29 11:46:56 -0700108binder_status_t ReadArray(const AParcel* parcel, void* arrayData,
109 ContiguousArrayAllocator<T> allocator) {
Steven Morelanda8845662018-10-12 11:53:03 -0700110 const Parcel* rawParcel = parcel->get();
111
112 int32_t length;
113 status_t status = rawParcel->readInt32(&length);
114
115 if (status != STATUS_OK) return PruneStatusT(status);
Steven Moreland01ebcf72018-11-15 15:06:26 -0800116 if (length < -1) return STATUS_BAD_VALUE;
Steven Morelanda8845662018-10-12 11:53:03 -0700117
Steven Moreland01ebcf72018-11-15 15:06:26 -0800118 T* array;
119 if (!allocator(arrayData, length, &array)) return STATUS_NO_MEMORY;
120
121 if (length <= 0) return STATUS_OK;
Steven Morelanda8845662018-10-12 11:53:03 -0700122 if (array == nullptr) return STATUS_NO_MEMORY;
123
124 int32_t size = 0;
125 if (__builtin_smul_overflow(sizeof(T), length, &size)) return STATUS_NO_MEMORY;
126
127 const void* data = rawParcel->readInplace(size);
128 if (data == nullptr) return STATUS_NO_MEMORY;
129
130 memcpy(array, data, size);
131
132 return STATUS_OK;
133}
134
135// Each element in a char16_t array is converted to an int32_t (not packed)
136template <>
Steven Moreland71872f82018-10-29 11:46:56 -0700137binder_status_t ReadArray<char16_t>(const AParcel* parcel, void* arrayData,
138 ContiguousArrayAllocator<char16_t> allocator) {
Steven Morelanda8845662018-10-12 11:53:03 -0700139 const Parcel* rawParcel = parcel->get();
140
141 int32_t length;
142 status_t status = rawParcel->readInt32(&length);
143
144 if (status != STATUS_OK) return PruneStatusT(status);
Steven Moreland01ebcf72018-11-15 15:06:26 -0800145 if (length < -1) return STATUS_BAD_VALUE;
Steven Morelanda8845662018-10-12 11:53:03 -0700146
Steven Moreland01ebcf72018-11-15 15:06:26 -0800147 char16_t* array;
148 if (!allocator(arrayData, length, &array)) return STATUS_NO_MEMORY;
149
150 if (length <= 0) return STATUS_OK;
Steven Morelanda8845662018-10-12 11:53:03 -0700151 if (array == nullptr) return STATUS_NO_MEMORY;
152
153 int32_t size = 0;
154 if (__builtin_smul_overflow(sizeof(char16_t), length, &size)) return STATUS_NO_MEMORY;
155
156 for (int32_t i = 0; i < length; i++) {
157 status = rawParcel->readChar(array + i);
158
159 if (status != STATUS_OK) return PruneStatusT(status);
160 }
161
162 return STATUS_OK;
163}
164
165template <typename T>
Steven Moreland01ebcf72018-11-15 15:06:26 -0800166binder_status_t WriteArray(AParcel* parcel, const void* arrayData, int32_t length,
Steven Moreland16e1eae2018-11-01 09:51:53 -0700167 ArrayGetter<T> getter, status_t (Parcel::*write)(T)) {
Steven Moreland01ebcf72018-11-15 15:06:26 -0800168 // we have no clue if arrayData represents a null object or not, we can only infer from length
169 bool arrayIsNull = length < 0;
170 binder_status_t status = WriteAndValidateArraySize(parcel, arrayIsNull, length);
171 if (status != STATUS_OK) return status;
172 if (length <= 0) return STATUS_OK;
Steven Morelanda8845662018-10-12 11:53:03 -0700173
174 Parcel* rawParcel = parcel->get();
175
Steven Morelanda8845662018-10-12 11:53:03 -0700176 for (size_t i = 0; i < length; i++) {
177 status = (rawParcel->*write)(getter(arrayData, i));
178
179 if (status != STATUS_OK) return PruneStatusT(status);
180 }
181
182 return STATUS_OK;
183}
184
185template <typename T>
Steven Moreland71872f82018-10-29 11:46:56 -0700186binder_status_t ReadArray(const AParcel* parcel, void* arrayData, ArrayAllocator<T> allocator,
187 ArraySetter<T> setter, status_t (Parcel::*read)(T*) const) {
Steven Morelanda8845662018-10-12 11:53:03 -0700188 const Parcel* rawParcel = parcel->get();
189
190 int32_t length;
191 status_t status = rawParcel->readInt32(&length);
192
193 if (status != STATUS_OK) return PruneStatusT(status);
Steven Moreland01ebcf72018-11-15 15:06:26 -0800194 if (length < -1) return STATUS_BAD_VALUE;
Steven Morelanda8845662018-10-12 11:53:03 -0700195
Steven Moreland71872f82018-10-29 11:46:56 -0700196 if (!allocator(arrayData, length)) return STATUS_NO_MEMORY;
Steven Morelanda8845662018-10-12 11:53:03 -0700197
Steven Moreland01ebcf72018-11-15 15:06:26 -0800198 if (length <= 0) return STATUS_OK;
199
Steven Morelanda8845662018-10-12 11:53:03 -0700200 for (size_t i = 0; i < length; i++) {
201 T readTarget;
202 status = (rawParcel->*read)(&readTarget);
203 if (status != STATUS_OK) return PruneStatusT(status);
204
Steven Moreland71872f82018-10-29 11:46:56 -0700205 setter(arrayData, i, readTarget);
Steven Morelanda8845662018-10-12 11:53:03 -0700206 }
207
208 return STATUS_OK;
209}
210
Steven Moreland9b80e282018-09-19 13:57:23 -0700211void AParcel_delete(AParcel* parcel) {
212 delete parcel;
Steven Morelandcaa776c2018-09-04 13:48:11 -0700213}
214
Steven Moreland2e87adc2018-08-20 19:47:00 -0700215binder_status_t AParcel_writeStrongBinder(AParcel* parcel, AIBinder* binder) {
Steven Morelandc0e46d32018-09-12 15:40:49 -0700216 sp<IBinder> writeBinder = binder != nullptr ? binder->getBinder() : nullptr;
Steven Morelandf18615b2018-09-14 11:43:06 -0700217 return parcel->get()->writeStrongBinder(writeBinder);
Steven Moreland2e87adc2018-08-20 19:47:00 -0700218}
219binder_status_t AParcel_readStrongBinder(const AParcel* parcel, AIBinder** binder) {
220 sp<IBinder> readBinder = nullptr;
Steven Morelandf18615b2018-09-14 11:43:06 -0700221 status_t status = parcel->get()->readNullableStrongBinder(&readBinder);
Steven Moreland5d62e442018-09-13 15:01:02 -0700222 if (status != STATUS_OK) {
223 return PruneStatusT(status);
Steven Moreland2e87adc2018-08-20 19:47:00 -0700224 }
Steven Moreland94968952018-09-05 14:42:59 -0700225 sp<AIBinder> ret = ABpBinder::lookupOrCreateFromBinder(readBinder);
Steven Moreland71cddc32018-08-30 23:39:22 -0700226 AIBinder_incStrong(ret.get());
227 *binder = ret.get();
Steven Moreland5d62e442018-09-13 15:01:02 -0700228 return PruneStatusT(status);
Steven Moreland2e87adc2018-08-20 19:47:00 -0700229}
Steven Moreland063f2362018-10-18 12:49:11 -0700230
231binder_status_t AParcel_writeParcelFileDescriptor(AParcel* parcel, int fd) {
Steven Moreland4ce59c72018-11-16 15:21:15 -0800232 std::unique_ptr<ParcelFileDescriptor> parcelFd;
Steven Moreland063f2362018-10-18 12:49:11 -0700233
Steven Moreland4ce59c72018-11-16 15:21:15 -0800234 if (fd < 0) {
235 if (fd != -1) {
236 return STATUS_UNKNOWN_ERROR;
237 }
238 // parcelFd = nullptr
239 } else { // fd >= 0
240 parcelFd = std::make_unique<ParcelFileDescriptor>(unique_fd(fd));
241 }
242
243 status_t status = parcel->get()->writeNullableParcelable(parcelFd);
Steven Moreland063f2362018-10-18 12:49:11 -0700244
245 // ownership is retained by caller
Steven Moreland4ce59c72018-11-16 15:21:15 -0800246 if (parcelFd != nullptr) {
247 (void)parcelFd->release().release();
248 }
Steven Moreland063f2362018-10-18 12:49:11 -0700249
250 return PruneStatusT(status);
251}
252
253binder_status_t AParcel_readParcelFileDescriptor(const AParcel* parcel, int* fd) {
Steven Moreland4ce59c72018-11-16 15:21:15 -0800254 std::unique_ptr<ParcelFileDescriptor> parcelFd;
255
Steven Moreland063f2362018-10-18 12:49:11 -0700256 status_t status = parcel->get()->readParcelable(&parcelFd);
257 if (status != STATUS_OK) return PruneStatusT(status);
258
Steven Moreland4ce59c72018-11-16 15:21:15 -0800259 if (parcelFd) {
260 *fd = parcelFd->release().release();
261 } else {
262 *fd = -1;
263 }
264
Steven Moreland063f2362018-10-18 12:49:11 -0700265 return STATUS_OK;
266}
267
Steven Moreland9a51db82018-09-14 10:59:35 -0700268binder_status_t AParcel_writeStatusHeader(AParcel* parcel, const AStatus* status) {
269 return PruneStatusT(status->get()->writeToParcel(parcel->get()));
270}
271binder_status_t AParcel_readStatusHeader(const AParcel* parcel, AStatus** status) {
272 ::android::binder::Status bstatus;
273 binder_status_t ret = PruneStatusT(bstatus.readFromParcel(*parcel->get()));
Steven Morelandc1a11b82018-10-29 18:47:23 -0700274 if (ret == STATUS_OK) {
Steven Moreland9a51db82018-09-14 10:59:35 -0700275 *status = new AStatus(std::move(bstatus));
276 }
Steven Morelandc1a11b82018-10-29 18:47:23 -0700277 return PruneStatusT(ret);
Steven Moreland9a51db82018-09-14 10:59:35 -0700278}
Steven Moreland2e87adc2018-08-20 19:47:00 -0700279
Steven Morelandb4e14612018-11-14 17:25:45 -0800280binder_status_t AParcel_writeString(AParcel* parcel, const char* string, int32_t length) {
281 if (string == nullptr) {
282 if (length != -1) {
283 LOG(WARNING) << __func__ << ": null string must be used with length == -1.";
284 return STATUS_BAD_VALUE;
285 }
Steven Moreland7b06f592018-10-03 19:25:32 -0700286
Steven Morelandb4e14612018-11-14 17:25:45 -0800287 status_t err = parcel->get()->writeInt32(-1);
288 return PruneStatusT(err);
289 }
290
291 if (length < 0) {
292 LOG(WARNING) << __func__ << ": Negative string length: " << length;
293 return STATUS_BAD_VALUE;
294 }
295
296 const uint8_t* str8 = (uint8_t*)string;
Steven Moreland7b06f592018-10-03 19:25:32 -0700297 const ssize_t len16 = utf8_to_utf16_length(str8, length);
298
299 if (len16 < 0 || len16 >= std::numeric_limits<int32_t>::max()) {
300 LOG(WARNING) << __func__ << ": Invalid string length: " << len16;
301 return STATUS_BAD_VALUE;
302 }
303
304 status_t err = parcel->get()->writeInt32(len16);
305 if (err) {
306 return PruneStatusT(err);
307 }
308
309 void* str16 = parcel->get()->writeInplace((len16 + 1) * sizeof(char16_t));
310 if (str16 == nullptr) {
311 return STATUS_NO_MEMORY;
312 }
313
314 utf8_to_utf16(str8, length, (char16_t*)str16, (size_t)len16 + 1);
315
316 return STATUS_OK;
317}
318
Steven Moreland07fb9c92018-11-01 17:14:29 -0700319binder_status_t AParcel_readString(const AParcel* parcel, void* stringData,
320 AParcel_stringAllocator allocator) {
Steven Moreland7b06f592018-10-03 19:25:32 -0700321 size_t len16;
322 const char16_t* str16 = parcel->get()->readString16Inplace(&len16);
323
324 if (str16 == nullptr) {
Steven Morelandb4e14612018-11-14 17:25:45 -0800325 if (allocator(stringData, -1, nullptr)) {
326 return STATUS_OK;
327 }
328
Steven Moreland7b06f592018-10-03 19:25:32 -0700329 return STATUS_UNEXPECTED_NULL;
330 }
331
332 ssize_t len8;
333
334 if (len16 == 0) {
335 len8 = 1;
336 } else {
337 len8 = utf16_to_utf8_length(str16, len16) + 1;
338 }
339
Steven Moreland07fb9c92018-11-01 17:14:29 -0700340 if (len8 <= 0 || len8 > std::numeric_limits<int32_t>::max()) {
Steven Moreland7b06f592018-10-03 19:25:32 -0700341 LOG(WARNING) << __func__ << ": Invalid string length: " << len8;
342 return STATUS_BAD_VALUE;
343 }
344
Steven Morelandb4e14612018-11-14 17:25:45 -0800345 char* str8;
346 bool success = allocator(stringData, len8, &str8);
Steven Moreland7b06f592018-10-03 19:25:32 -0700347
Steven Morelandb4e14612018-11-14 17:25:45 -0800348 if (!success || str8 == nullptr) {
Steven Moreland71872f82018-10-29 11:46:56 -0700349 LOG(WARNING) << __func__ << ": AParcel_stringAllocator failed to allocate.";
Steven Moreland7b06f592018-10-03 19:25:32 -0700350 return STATUS_NO_MEMORY;
351 }
352
353 utf16_to_utf8(str16, len16, str8, len8);
354
355 return STATUS_OK;
356}
357
Steven Morelandb4e14612018-11-14 17:25:45 -0800358binder_status_t AParcel_writeStringArray(AParcel* parcel, const void* arrayData, int32_t length,
Steven Moreland07fb9c92018-11-01 17:14:29 -0700359 AParcel_stringArrayElementGetter getter) {
Steven Moreland01ebcf72018-11-15 15:06:26 -0800360 // we have no clue if arrayData represents a null object or not, we can only infer from length
361 bool arrayIsNull = length < 0;
362 binder_status_t status = WriteAndValidateArraySize(parcel, arrayIsNull, length);
363 if (status != STATUS_OK) return status;
364 if (length <= 0) return STATUS_OK;
Steven Moreland07fb9c92018-11-01 17:14:29 -0700365
366 for (size_t i = 0; i < length; i++) {
367 size_t length = 0;
368 const char* str = getter(arrayData, i, &length);
Steven Morelandb4e14612018-11-14 17:25:45 -0800369 if (str == nullptr && length != -1) return STATUS_BAD_VALUE;
Steven Moreland07fb9c92018-11-01 17:14:29 -0700370
371 binder_status_t status = AParcel_writeString(parcel, str, length);
372 if (status != STATUS_OK) return status;
373 }
374
375 return STATUS_OK;
376}
377
378// This implements AParcel_stringAllocator for a string using an array, index, and element
379// allocator.
380struct StringArrayElementAllocationAdapter {
Steven Moreland6cf66ac2018-11-02 18:14:54 -0700381 void* arrayData; // stringData from the NDK
382 size_t index; // index into the string array
Steven Moreland07fb9c92018-11-01 17:14:29 -0700383 AParcel_stringArrayElementAllocator elementAllocator;
384
Steven Morelandb4e14612018-11-14 17:25:45 -0800385 static bool Allocator(void* stringData, int32_t length, char** buffer) {
Steven Moreland07fb9c92018-11-01 17:14:29 -0700386 StringArrayElementAllocationAdapter* adapter =
387 static_cast<StringArrayElementAllocationAdapter*>(stringData);
Steven Morelandb4e14612018-11-14 17:25:45 -0800388 return adapter->elementAllocator(adapter->arrayData, adapter->index, length, buffer);
Steven Moreland07fb9c92018-11-01 17:14:29 -0700389 }
390};
391
392binder_status_t AParcel_readStringArray(const AParcel* parcel, void* arrayData,
393 AParcel_stringArrayAllocator allocator,
394 AParcel_stringArrayElementAllocator elementAllocator) {
395 const Parcel* rawParcel = parcel->get();
396
397 int32_t length;
398 status_t status = rawParcel->readInt32(&length);
399
400 if (status != STATUS_OK) return PruneStatusT(status);
Steven Morelandb4e14612018-11-14 17:25:45 -0800401 if (length < -1) return STATUS_BAD_VALUE;
Steven Moreland07fb9c92018-11-01 17:14:29 -0700402
403 if (!allocator(arrayData, length)) return STATUS_NO_MEMORY;
404
Steven Morelandb4e14612018-11-14 17:25:45 -0800405 if (length == -1) return STATUS_OK; // null string array
406
Steven Moreland07fb9c92018-11-01 17:14:29 -0700407 StringArrayElementAllocationAdapter adapter{
408 .arrayData = arrayData,
409 .index = 0,
410 .elementAllocator = elementAllocator,
411 };
412
413 for (; adapter.index < length; adapter.index++) {
Steven Morelandb4e14612018-11-14 17:25:45 -0800414 binder_status_t status = AParcel_readString(parcel, static_cast<void*>(&adapter),
415 StringArrayElementAllocationAdapter::Allocator);
416
417 if (status != STATUS_OK) return status;
Steven Moreland07fb9c92018-11-01 17:14:29 -0700418 }
419
420 return STATUS_OK;
421}
422
Steven Moreland2e87adc2018-08-20 19:47:00 -0700423// See gen_parcel_helper.py. These auto-generated read/write methods use the same types for
424// libbinder and this library.
425// @START
426binder_status_t AParcel_writeInt32(AParcel* parcel, int32_t value) {
Steven Morelandf18615b2018-09-14 11:43:06 -0700427 status_t status = parcel->get()->writeInt32(value);
Steven Moreland5d62e442018-09-13 15:01:02 -0700428 return PruneStatusT(status);
Steven Moreland2e87adc2018-08-20 19:47:00 -0700429}
430
431binder_status_t AParcel_writeUint32(AParcel* parcel, uint32_t value) {
Steven Morelandf18615b2018-09-14 11:43:06 -0700432 status_t status = parcel->get()->writeUint32(value);
Steven Moreland5d62e442018-09-13 15:01:02 -0700433 return PruneStatusT(status);
Steven Moreland2e87adc2018-08-20 19:47:00 -0700434}
435
436binder_status_t AParcel_writeInt64(AParcel* parcel, int64_t value) {
Steven Morelandf18615b2018-09-14 11:43:06 -0700437 status_t status = parcel->get()->writeInt64(value);
Steven Moreland5d62e442018-09-13 15:01:02 -0700438 return PruneStatusT(status);
Steven Moreland2e87adc2018-08-20 19:47:00 -0700439}
440
441binder_status_t AParcel_writeUint64(AParcel* parcel, uint64_t value) {
Steven Morelandf18615b2018-09-14 11:43:06 -0700442 status_t status = parcel->get()->writeUint64(value);
Steven Moreland5d62e442018-09-13 15:01:02 -0700443 return PruneStatusT(status);
Steven Moreland2e87adc2018-08-20 19:47:00 -0700444}
445
446binder_status_t AParcel_writeFloat(AParcel* parcel, float value) {
Steven Morelandf18615b2018-09-14 11:43:06 -0700447 status_t status = parcel->get()->writeFloat(value);
Steven Moreland5d62e442018-09-13 15:01:02 -0700448 return PruneStatusT(status);
Steven Moreland2e87adc2018-08-20 19:47:00 -0700449}
450
451binder_status_t AParcel_writeDouble(AParcel* parcel, double value) {
Steven Morelandf18615b2018-09-14 11:43:06 -0700452 status_t status = parcel->get()->writeDouble(value);
Steven Moreland5d62e442018-09-13 15:01:02 -0700453 return PruneStatusT(status);
Steven Moreland2e87adc2018-08-20 19:47:00 -0700454}
455
456binder_status_t AParcel_writeBool(AParcel* parcel, bool value) {
Steven Morelandf18615b2018-09-14 11:43:06 -0700457 status_t status = parcel->get()->writeBool(value);
Steven Moreland5d62e442018-09-13 15:01:02 -0700458 return PruneStatusT(status);
Steven Moreland2e87adc2018-08-20 19:47:00 -0700459}
460
461binder_status_t AParcel_writeChar(AParcel* parcel, char16_t value) {
Steven Morelandf18615b2018-09-14 11:43:06 -0700462 status_t status = parcel->get()->writeChar(value);
Steven Moreland5d62e442018-09-13 15:01:02 -0700463 return PruneStatusT(status);
Steven Moreland2e87adc2018-08-20 19:47:00 -0700464}
465
466binder_status_t AParcel_writeByte(AParcel* parcel, int8_t value) {
Steven Morelandf18615b2018-09-14 11:43:06 -0700467 status_t status = parcel->get()->writeByte(value);
Steven Moreland5d62e442018-09-13 15:01:02 -0700468 return PruneStatusT(status);
Steven Moreland2e87adc2018-08-20 19:47:00 -0700469}
470
471binder_status_t AParcel_readInt32(const AParcel* parcel, int32_t* value) {
Steven Morelandf18615b2018-09-14 11:43:06 -0700472 status_t status = parcel->get()->readInt32(value);
Steven Moreland5d62e442018-09-13 15:01:02 -0700473 return PruneStatusT(status);
Steven Moreland2e87adc2018-08-20 19:47:00 -0700474}
475
476binder_status_t AParcel_readUint32(const AParcel* parcel, uint32_t* value) {
Steven Morelandf18615b2018-09-14 11:43:06 -0700477 status_t status = parcel->get()->readUint32(value);
Steven Moreland5d62e442018-09-13 15:01:02 -0700478 return PruneStatusT(status);
Steven Moreland2e87adc2018-08-20 19:47:00 -0700479}
480
481binder_status_t AParcel_readInt64(const AParcel* parcel, int64_t* value) {
Steven Morelandf18615b2018-09-14 11:43:06 -0700482 status_t status = parcel->get()->readInt64(value);
Steven Moreland5d62e442018-09-13 15:01:02 -0700483 return PruneStatusT(status);
Steven Moreland2e87adc2018-08-20 19:47:00 -0700484}
485
486binder_status_t AParcel_readUint64(const AParcel* parcel, uint64_t* value) {
Steven Morelandf18615b2018-09-14 11:43:06 -0700487 status_t status = parcel->get()->readUint64(value);
Steven Moreland5d62e442018-09-13 15:01:02 -0700488 return PruneStatusT(status);
Steven Moreland2e87adc2018-08-20 19:47:00 -0700489}
490
491binder_status_t AParcel_readFloat(const AParcel* parcel, float* value) {
Steven Morelandf18615b2018-09-14 11:43:06 -0700492 status_t status = parcel->get()->readFloat(value);
Steven Moreland5d62e442018-09-13 15:01:02 -0700493 return PruneStatusT(status);
Steven Moreland2e87adc2018-08-20 19:47:00 -0700494}
495
496binder_status_t AParcel_readDouble(const AParcel* parcel, double* value) {
Steven Morelandf18615b2018-09-14 11:43:06 -0700497 status_t status = parcel->get()->readDouble(value);
Steven Moreland5d62e442018-09-13 15:01:02 -0700498 return PruneStatusT(status);
Steven Moreland2e87adc2018-08-20 19:47:00 -0700499}
500
501binder_status_t AParcel_readBool(const AParcel* parcel, bool* value) {
Steven Morelandf18615b2018-09-14 11:43:06 -0700502 status_t status = parcel->get()->readBool(value);
Steven Moreland5d62e442018-09-13 15:01:02 -0700503 return PruneStatusT(status);
Steven Moreland2e87adc2018-08-20 19:47:00 -0700504}
505
506binder_status_t AParcel_readChar(const AParcel* parcel, char16_t* value) {
Steven Morelandf18615b2018-09-14 11:43:06 -0700507 status_t status = parcel->get()->readChar(value);
Steven Moreland5d62e442018-09-13 15:01:02 -0700508 return PruneStatusT(status);
Steven Moreland2e87adc2018-08-20 19:47:00 -0700509}
510
511binder_status_t AParcel_readByte(const AParcel* parcel, int8_t* value) {
Steven Morelandf18615b2018-09-14 11:43:06 -0700512 status_t status = parcel->get()->readByte(value);
Steven Moreland5d62e442018-09-13 15:01:02 -0700513 return PruneStatusT(status);
Steven Moreland2e87adc2018-08-20 19:47:00 -0700514}
515
Steven Moreland01ebcf72018-11-15 15:06:26 -0800516binder_status_t AParcel_writeInt32Array(AParcel* parcel, const int32_t* arrayData, int32_t length) {
Steven Morelande3d09582018-11-02 19:29:36 -0700517 return WriteArray<int32_t>(parcel, arrayData, length);
Steven Morelanda8845662018-10-12 11:53:03 -0700518}
519
Steven Morelande3d09582018-11-02 19:29:36 -0700520binder_status_t AParcel_writeUint32Array(AParcel* parcel, const uint32_t* arrayData,
Steven Moreland01ebcf72018-11-15 15:06:26 -0800521 int32_t length) {
Steven Morelande3d09582018-11-02 19:29:36 -0700522 return WriteArray<uint32_t>(parcel, arrayData, length);
Steven Morelanda8845662018-10-12 11:53:03 -0700523}
524
Steven Moreland01ebcf72018-11-15 15:06:26 -0800525binder_status_t AParcel_writeInt64Array(AParcel* parcel, const int64_t* arrayData, int32_t length) {
Steven Morelande3d09582018-11-02 19:29:36 -0700526 return WriteArray<int64_t>(parcel, arrayData, length);
Steven Morelanda8845662018-10-12 11:53:03 -0700527}
528
Steven Morelande3d09582018-11-02 19:29:36 -0700529binder_status_t AParcel_writeUint64Array(AParcel* parcel, const uint64_t* arrayData,
Steven Moreland01ebcf72018-11-15 15:06:26 -0800530 int32_t length) {
Steven Morelande3d09582018-11-02 19:29:36 -0700531 return WriteArray<uint64_t>(parcel, arrayData, length);
Steven Morelanda8845662018-10-12 11:53:03 -0700532}
533
Steven Moreland01ebcf72018-11-15 15:06:26 -0800534binder_status_t AParcel_writeFloatArray(AParcel* parcel, const float* arrayData, int32_t length) {
Steven Morelande3d09582018-11-02 19:29:36 -0700535 return WriteArray<float>(parcel, arrayData, length);
Steven Morelanda8845662018-10-12 11:53:03 -0700536}
537
Steven Moreland01ebcf72018-11-15 15:06:26 -0800538binder_status_t AParcel_writeDoubleArray(AParcel* parcel, const double* arrayData, int32_t length) {
Steven Morelande3d09582018-11-02 19:29:36 -0700539 return WriteArray<double>(parcel, arrayData, length);
Steven Morelanda8845662018-10-12 11:53:03 -0700540}
541
Steven Moreland01ebcf72018-11-15 15:06:26 -0800542binder_status_t AParcel_writeBoolArray(AParcel* parcel, const void* arrayData, int32_t length,
Steven Moreland16e1eae2018-11-01 09:51:53 -0700543 AParcel_boolArrayGetter getter) {
544 return WriteArray<bool>(parcel, arrayData, length, getter, &Parcel::writeBool);
Steven Morelanda8845662018-10-12 11:53:03 -0700545}
546
Steven Moreland01ebcf72018-11-15 15:06:26 -0800547binder_status_t AParcel_writeCharArray(AParcel* parcel, const char16_t* arrayData, int32_t length) {
Steven Morelande3d09582018-11-02 19:29:36 -0700548 return WriteArray<char16_t>(parcel, arrayData, length);
Steven Morelanda8845662018-10-12 11:53:03 -0700549}
550
Steven Moreland01ebcf72018-11-15 15:06:26 -0800551binder_status_t AParcel_writeByteArray(AParcel* parcel, const int8_t* arrayData, int32_t length) {
Steven Morelande3d09582018-11-02 19:29:36 -0700552 return WriteArray<int8_t>(parcel, arrayData, length);
Steven Morelanda8845662018-10-12 11:53:03 -0700553}
554
Steven Moreland71872f82018-10-29 11:46:56 -0700555binder_status_t AParcel_readInt32Array(const AParcel* parcel, void* arrayData,
Steven Moreland9ac9dca2018-11-01 10:07:31 -0700556 AParcel_int32ArrayAllocator allocator) {
Steven Moreland71872f82018-10-29 11:46:56 -0700557 return ReadArray<int32_t>(parcel, arrayData, allocator);
Steven Morelanda8845662018-10-12 11:53:03 -0700558}
559
Steven Moreland71872f82018-10-29 11:46:56 -0700560binder_status_t AParcel_readUint32Array(const AParcel* parcel, void* arrayData,
Steven Moreland9ac9dca2018-11-01 10:07:31 -0700561 AParcel_uint32ArrayAllocator allocator) {
Steven Moreland71872f82018-10-29 11:46:56 -0700562 return ReadArray<uint32_t>(parcel, arrayData, allocator);
Steven Morelanda8845662018-10-12 11:53:03 -0700563}
564
Steven Moreland71872f82018-10-29 11:46:56 -0700565binder_status_t AParcel_readInt64Array(const AParcel* parcel, void* arrayData,
Steven Moreland9ac9dca2018-11-01 10:07:31 -0700566 AParcel_int64ArrayAllocator allocator) {
Steven Moreland71872f82018-10-29 11:46:56 -0700567 return ReadArray<int64_t>(parcel, arrayData, allocator);
Steven Morelanda8845662018-10-12 11:53:03 -0700568}
569
Steven Moreland71872f82018-10-29 11:46:56 -0700570binder_status_t AParcel_readUint64Array(const AParcel* parcel, void* arrayData,
Steven Moreland9ac9dca2018-11-01 10:07:31 -0700571 AParcel_uint64ArrayAllocator allocator) {
Steven Moreland71872f82018-10-29 11:46:56 -0700572 return ReadArray<uint64_t>(parcel, arrayData, allocator);
Steven Morelanda8845662018-10-12 11:53:03 -0700573}
574
Steven Moreland71872f82018-10-29 11:46:56 -0700575binder_status_t AParcel_readFloatArray(const AParcel* parcel, void* arrayData,
Steven Moreland9ac9dca2018-11-01 10:07:31 -0700576 AParcel_floatArrayAllocator allocator) {
Steven Moreland71872f82018-10-29 11:46:56 -0700577 return ReadArray<float>(parcel, arrayData, allocator);
Steven Morelanda8845662018-10-12 11:53:03 -0700578}
579
Steven Moreland71872f82018-10-29 11:46:56 -0700580binder_status_t AParcel_readDoubleArray(const AParcel* parcel, void* arrayData,
Steven Moreland9ac9dca2018-11-01 10:07:31 -0700581 AParcel_doubleArrayAllocator allocator) {
Steven Moreland71872f82018-10-29 11:46:56 -0700582 return ReadArray<double>(parcel, arrayData, allocator);
Steven Morelanda8845662018-10-12 11:53:03 -0700583}
584
Steven Moreland71872f82018-10-29 11:46:56 -0700585binder_status_t AParcel_readBoolArray(const AParcel* parcel, void* arrayData,
Steven Moreland9ac9dca2018-11-01 10:07:31 -0700586 AParcel_boolArrayAllocator allocator,
Steven Morelanda8845662018-10-12 11:53:03 -0700587 AParcel_boolArraySetter setter) {
Steven Moreland71872f82018-10-29 11:46:56 -0700588 return ReadArray<bool>(parcel, arrayData, allocator, setter, &Parcel::readBool);
Steven Morelanda8845662018-10-12 11:53:03 -0700589}
590
Steven Moreland71872f82018-10-29 11:46:56 -0700591binder_status_t AParcel_readCharArray(const AParcel* parcel, void* arrayData,
Steven Moreland9ac9dca2018-11-01 10:07:31 -0700592 AParcel_charArrayAllocator allocator) {
Steven Moreland71872f82018-10-29 11:46:56 -0700593 return ReadArray<char16_t>(parcel, arrayData, allocator);
Steven Morelanda8845662018-10-12 11:53:03 -0700594}
595
Steven Moreland71872f82018-10-29 11:46:56 -0700596binder_status_t AParcel_readByteArray(const AParcel* parcel, void* arrayData,
Steven Moreland9ac9dca2018-11-01 10:07:31 -0700597 AParcel_byteArrayAllocator allocator) {
Steven Moreland71872f82018-10-29 11:46:56 -0700598 return ReadArray<int8_t>(parcel, arrayData, allocator);
Steven Morelanda8845662018-10-12 11:53:03 -0700599}
600
Steven Moreland2e87adc2018-08-20 19:47:00 -0700601// @END