blob: 3e03e907bb4b9200f77b9dd874b2e378ba5a964f [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 Moreland2e87adc2018-08-20 19:47:00 -070026#include <binder/Parcel.h>
Steven Moreland7b06f592018-10-03 19:25:32 -070027#include <utils/Unicode.h>
Steven Moreland2e87adc2018-08-20 19:47:00 -070028
29using ::android::IBinder;
30using ::android::Parcel;
31using ::android::sp;
Steven Moreland5d62e442018-09-13 15:01:02 -070032using ::android::status_t;
Steven Moreland2e87adc2018-08-20 19:47:00 -070033
Steven Moreland9b80e282018-09-19 13:57:23 -070034void AParcel_delete(AParcel* parcel) {
35 delete parcel;
Steven Morelandcaa776c2018-09-04 13:48:11 -070036}
37
Steven Moreland2e87adc2018-08-20 19:47:00 -070038binder_status_t AParcel_writeStrongBinder(AParcel* parcel, AIBinder* binder) {
Steven Morelandc0e46d32018-09-12 15:40:49 -070039 sp<IBinder> writeBinder = binder != nullptr ? binder->getBinder() : nullptr;
Steven Morelandf18615b2018-09-14 11:43:06 -070040 return parcel->get()->writeStrongBinder(writeBinder);
Steven Moreland2e87adc2018-08-20 19:47:00 -070041}
42binder_status_t AParcel_readStrongBinder(const AParcel* parcel, AIBinder** binder) {
43 sp<IBinder> readBinder = nullptr;
Steven Morelandf18615b2018-09-14 11:43:06 -070044 status_t status = parcel->get()->readStrongBinder(&readBinder);
Steven Moreland5d62e442018-09-13 15:01:02 -070045 if (status != STATUS_OK) {
46 return PruneStatusT(status);
Steven Moreland2e87adc2018-08-20 19:47:00 -070047 }
Steven Moreland94968952018-09-05 14:42:59 -070048 sp<AIBinder> ret = ABpBinder::lookupOrCreateFromBinder(readBinder);
Steven Moreland71cddc32018-08-30 23:39:22 -070049 AIBinder_incStrong(ret.get());
50 *binder = ret.get();
Steven Moreland5d62e442018-09-13 15:01:02 -070051 return PruneStatusT(status);
Steven Moreland2e87adc2018-08-20 19:47:00 -070052}
53binder_status_t AParcel_readNullableStrongBinder(const AParcel* parcel, AIBinder** binder) {
54 sp<IBinder> readBinder = nullptr;
Steven Morelandf18615b2018-09-14 11:43:06 -070055 status_t status = parcel->get()->readNullableStrongBinder(&readBinder);
Steven Moreland5d62e442018-09-13 15:01:02 -070056 if (status != STATUS_OK) {
57 return PruneStatusT(status);
Steven Moreland2e87adc2018-08-20 19:47:00 -070058 }
Steven Moreland94968952018-09-05 14:42:59 -070059 sp<AIBinder> ret = ABpBinder::lookupOrCreateFromBinder(readBinder);
Steven Moreland71cddc32018-08-30 23:39:22 -070060 AIBinder_incStrong(ret.get());
61 *binder = ret.get();
Steven Moreland5d62e442018-09-13 15:01:02 -070062 return PruneStatusT(status);
Steven Moreland2e87adc2018-08-20 19:47:00 -070063}
Steven Moreland9a51db82018-09-14 10:59:35 -070064binder_status_t AParcel_writeStatusHeader(AParcel* parcel, const AStatus* status) {
65 return PruneStatusT(status->get()->writeToParcel(parcel->get()));
66}
67binder_status_t AParcel_readStatusHeader(const AParcel* parcel, AStatus** status) {
68 ::android::binder::Status bstatus;
69 binder_status_t ret = PruneStatusT(bstatus.readFromParcel(*parcel->get()));
70 if (ret == EX_NONE) {
71 *status = new AStatus(std::move(bstatus));
72 }
73 return ret;
74}
Steven Moreland2e87adc2018-08-20 19:47:00 -070075
Steven Moreland7b06f592018-10-03 19:25:32 -070076binder_status_t AParcel_writeString(AParcel* parcel, const char* string, size_t length) {
77 const uint8_t* str8 = (uint8_t*)string;
78
79 const ssize_t len16 = utf8_to_utf16_length(str8, length);
80
81 if (len16 < 0 || len16 >= std::numeric_limits<int32_t>::max()) {
82 LOG(WARNING) << __func__ << ": Invalid string length: " << len16;
83 return STATUS_BAD_VALUE;
84 }
85
86 status_t err = parcel->get()->writeInt32(len16);
87 if (err) {
88 return PruneStatusT(err);
89 }
90
91 void* str16 = parcel->get()->writeInplace((len16 + 1) * sizeof(char16_t));
92 if (str16 == nullptr) {
93 return STATUS_NO_MEMORY;
94 }
95
96 utf8_to_utf16(str8, length, (char16_t*)str16, (size_t)len16 + 1);
97
98 return STATUS_OK;
99}
100
101binder_status_t AParcel_readString(const AParcel* parcel, AParcel_string_reallocator reallocator,
102 AParcel_string_getter getter, void** stringData) {
103 size_t len16;
104 const char16_t* str16 = parcel->get()->readString16Inplace(&len16);
105
106 if (str16 == nullptr) {
107 LOG(WARNING) << __func__ << ": Failed to read string in place.";
108 return STATUS_UNEXPECTED_NULL;
109 }
110
111 ssize_t len8;
112
113 if (len16 == 0) {
114 len8 = 1;
115 } else {
116 len8 = utf16_to_utf8_length(str16, len16) + 1;
117 }
118
119 if (len8 <= 0 || len8 >= std::numeric_limits<int32_t>::max()) {
120 LOG(WARNING) << __func__ << ": Invalid string length: " << len8;
121 return STATUS_BAD_VALUE;
122 }
123
124 *stringData = reallocator(*stringData, len8);
125 char* str8 = getter(*stringData);
126
127 if (str8 == nullptr) {
128 LOG(WARNING) << __func__ << ": AParcel_string_allocator failed to allocate.";
129 return STATUS_NO_MEMORY;
130 }
131
132 utf16_to_utf8(str16, len16, str8, len8);
133
134 return STATUS_OK;
135}
136
Steven Moreland2e87adc2018-08-20 19:47:00 -0700137// See gen_parcel_helper.py. These auto-generated read/write methods use the same types for
138// libbinder and this library.
139// @START
140binder_status_t AParcel_writeInt32(AParcel* parcel, int32_t value) {
Steven Morelandf18615b2018-09-14 11:43:06 -0700141 status_t status = parcel->get()->writeInt32(value);
Steven Moreland5d62e442018-09-13 15:01:02 -0700142 return PruneStatusT(status);
Steven Moreland2e87adc2018-08-20 19:47:00 -0700143}
144
145binder_status_t AParcel_writeUint32(AParcel* parcel, uint32_t value) {
Steven Morelandf18615b2018-09-14 11:43:06 -0700146 status_t status = parcel->get()->writeUint32(value);
Steven Moreland5d62e442018-09-13 15:01:02 -0700147 return PruneStatusT(status);
Steven Moreland2e87adc2018-08-20 19:47:00 -0700148}
149
150binder_status_t AParcel_writeInt64(AParcel* parcel, int64_t value) {
Steven Morelandf18615b2018-09-14 11:43:06 -0700151 status_t status = parcel->get()->writeInt64(value);
Steven Moreland5d62e442018-09-13 15:01:02 -0700152 return PruneStatusT(status);
Steven Moreland2e87adc2018-08-20 19:47:00 -0700153}
154
155binder_status_t AParcel_writeUint64(AParcel* parcel, uint64_t value) {
Steven Morelandf18615b2018-09-14 11:43:06 -0700156 status_t status = parcel->get()->writeUint64(value);
Steven Moreland5d62e442018-09-13 15:01:02 -0700157 return PruneStatusT(status);
Steven Moreland2e87adc2018-08-20 19:47:00 -0700158}
159
160binder_status_t AParcel_writeFloat(AParcel* parcel, float value) {
Steven Morelandf18615b2018-09-14 11:43:06 -0700161 status_t status = parcel->get()->writeFloat(value);
Steven Moreland5d62e442018-09-13 15:01:02 -0700162 return PruneStatusT(status);
Steven Moreland2e87adc2018-08-20 19:47:00 -0700163}
164
165binder_status_t AParcel_writeDouble(AParcel* parcel, double value) {
Steven Morelandf18615b2018-09-14 11:43:06 -0700166 status_t status = parcel->get()->writeDouble(value);
Steven Moreland5d62e442018-09-13 15:01:02 -0700167 return PruneStatusT(status);
Steven Moreland2e87adc2018-08-20 19:47:00 -0700168}
169
170binder_status_t AParcel_writeBool(AParcel* parcel, bool value) {
Steven Morelandf18615b2018-09-14 11:43:06 -0700171 status_t status = parcel->get()->writeBool(value);
Steven Moreland5d62e442018-09-13 15:01:02 -0700172 return PruneStatusT(status);
Steven Moreland2e87adc2018-08-20 19:47:00 -0700173}
174
175binder_status_t AParcel_writeChar(AParcel* parcel, char16_t value) {
Steven Morelandf18615b2018-09-14 11:43:06 -0700176 status_t status = parcel->get()->writeChar(value);
Steven Moreland5d62e442018-09-13 15:01:02 -0700177 return PruneStatusT(status);
Steven Moreland2e87adc2018-08-20 19:47:00 -0700178}
179
180binder_status_t AParcel_writeByte(AParcel* parcel, int8_t value) {
Steven Morelandf18615b2018-09-14 11:43:06 -0700181 status_t status = parcel->get()->writeByte(value);
Steven Moreland5d62e442018-09-13 15:01:02 -0700182 return PruneStatusT(status);
Steven Moreland2e87adc2018-08-20 19:47:00 -0700183}
184
185binder_status_t AParcel_readInt32(const AParcel* parcel, int32_t* value) {
Steven Morelandf18615b2018-09-14 11:43:06 -0700186 status_t status = parcel->get()->readInt32(value);
Steven Moreland5d62e442018-09-13 15:01:02 -0700187 return PruneStatusT(status);
Steven Moreland2e87adc2018-08-20 19:47:00 -0700188}
189
190binder_status_t AParcel_readUint32(const AParcel* parcel, uint32_t* value) {
Steven Morelandf18615b2018-09-14 11:43:06 -0700191 status_t status = parcel->get()->readUint32(value);
Steven Moreland5d62e442018-09-13 15:01:02 -0700192 return PruneStatusT(status);
Steven Moreland2e87adc2018-08-20 19:47:00 -0700193}
194
195binder_status_t AParcel_readInt64(const AParcel* parcel, int64_t* value) {
Steven Morelandf18615b2018-09-14 11:43:06 -0700196 status_t status = parcel->get()->readInt64(value);
Steven Moreland5d62e442018-09-13 15:01:02 -0700197 return PruneStatusT(status);
Steven Moreland2e87adc2018-08-20 19:47:00 -0700198}
199
200binder_status_t AParcel_readUint64(const AParcel* parcel, uint64_t* value) {
Steven Morelandf18615b2018-09-14 11:43:06 -0700201 status_t status = parcel->get()->readUint64(value);
Steven Moreland5d62e442018-09-13 15:01:02 -0700202 return PruneStatusT(status);
Steven Moreland2e87adc2018-08-20 19:47:00 -0700203}
204
205binder_status_t AParcel_readFloat(const AParcel* parcel, float* value) {
Steven Morelandf18615b2018-09-14 11:43:06 -0700206 status_t status = parcel->get()->readFloat(value);
Steven Moreland5d62e442018-09-13 15:01:02 -0700207 return PruneStatusT(status);
Steven Moreland2e87adc2018-08-20 19:47:00 -0700208}
209
210binder_status_t AParcel_readDouble(const AParcel* parcel, double* value) {
Steven Morelandf18615b2018-09-14 11:43:06 -0700211 status_t status = parcel->get()->readDouble(value);
Steven Moreland5d62e442018-09-13 15:01:02 -0700212 return PruneStatusT(status);
Steven Moreland2e87adc2018-08-20 19:47:00 -0700213}
214
215binder_status_t AParcel_readBool(const AParcel* parcel, bool* value) {
Steven Morelandf18615b2018-09-14 11:43:06 -0700216 status_t status = parcel->get()->readBool(value);
Steven Moreland5d62e442018-09-13 15:01:02 -0700217 return PruneStatusT(status);
Steven Moreland2e87adc2018-08-20 19:47:00 -0700218}
219
220binder_status_t AParcel_readChar(const AParcel* parcel, char16_t* value) {
Steven Morelandf18615b2018-09-14 11:43:06 -0700221 status_t status = parcel->get()->readChar(value);
Steven Moreland5d62e442018-09-13 15:01:02 -0700222 return PruneStatusT(status);
Steven Moreland2e87adc2018-08-20 19:47:00 -0700223}
224
225binder_status_t AParcel_readByte(const AParcel* parcel, int8_t* value) {
Steven Morelandf18615b2018-09-14 11:43:06 -0700226 status_t status = parcel->get()->readByte(value);
Steven Moreland5d62e442018-09-13 15:01:02 -0700227 return PruneStatusT(status);
Steven Moreland2e87adc2018-08-20 19:47:00 -0700228}
229
230// @END