blob: a063657dd6c9fa6b9b50f5370391057099166c60 [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
23#include <binder/Parcel.h>
24
25using ::android::IBinder;
26using ::android::Parcel;
27using ::android::sp;
Steven Moreland5d62e442018-09-13 15:01:02 -070028using ::android::status_t;
Steven Moreland2e87adc2018-08-20 19:47:00 -070029
Steven Morelandcaa776c2018-09-04 13:48:11 -070030void AParcel_delete(AParcel** parcel) {
31 if (parcel == nullptr) {
32 return;
33 }
34
35 delete *parcel;
36 *parcel = nullptr;
37}
38
Steven Moreland2e87adc2018-08-20 19:47:00 -070039binder_status_t AParcel_writeStrongBinder(AParcel* parcel, AIBinder* binder) {
Steven Morelandc0e46d32018-09-12 15:40:49 -070040 sp<IBinder> writeBinder = binder != nullptr ? binder->getBinder() : nullptr;
Steven Morelandf18615b2018-09-14 11:43:06 -070041 return parcel->get()->writeStrongBinder(writeBinder);
Steven Moreland2e87adc2018-08-20 19:47:00 -070042}
43binder_status_t AParcel_readStrongBinder(const AParcel* parcel, AIBinder** binder) {
44 sp<IBinder> readBinder = nullptr;
Steven Morelandf18615b2018-09-14 11:43:06 -070045 status_t status = parcel->get()->readStrongBinder(&readBinder);
Steven Moreland5d62e442018-09-13 15:01:02 -070046 if (status != STATUS_OK) {
47 return PruneStatusT(status);
Steven Moreland2e87adc2018-08-20 19:47:00 -070048 }
Steven Moreland94968952018-09-05 14:42:59 -070049 sp<AIBinder> ret = ABpBinder::lookupOrCreateFromBinder(readBinder);
Steven Moreland71cddc32018-08-30 23:39:22 -070050 AIBinder_incStrong(ret.get());
51 *binder = ret.get();
Steven Moreland5d62e442018-09-13 15:01:02 -070052 return PruneStatusT(status);
Steven Moreland2e87adc2018-08-20 19:47:00 -070053}
54binder_status_t AParcel_readNullableStrongBinder(const AParcel* parcel, AIBinder** binder) {
55 sp<IBinder> readBinder = nullptr;
Steven Morelandf18615b2018-09-14 11:43:06 -070056 status_t status = parcel->get()->readNullableStrongBinder(&readBinder);
Steven Moreland5d62e442018-09-13 15:01:02 -070057 if (status != STATUS_OK) {
58 return PruneStatusT(status);
Steven Moreland2e87adc2018-08-20 19:47:00 -070059 }
Steven Moreland94968952018-09-05 14:42:59 -070060 sp<AIBinder> ret = ABpBinder::lookupOrCreateFromBinder(readBinder);
Steven Moreland71cddc32018-08-30 23:39:22 -070061 AIBinder_incStrong(ret.get());
62 *binder = ret.get();
Steven Moreland5d62e442018-09-13 15:01:02 -070063 return PruneStatusT(status);
Steven Moreland2e87adc2018-08-20 19:47:00 -070064}
Steven Moreland9a51db82018-09-14 10:59:35 -070065binder_status_t AParcel_writeStatusHeader(AParcel* parcel, const AStatus* status) {
66 return PruneStatusT(status->get()->writeToParcel(parcel->get()));
67}
68binder_status_t AParcel_readStatusHeader(const AParcel* parcel, AStatus** status) {
69 ::android::binder::Status bstatus;
70 binder_status_t ret = PruneStatusT(bstatus.readFromParcel(*parcel->get()));
71 if (ret == EX_NONE) {
72 *status = new AStatus(std::move(bstatus));
73 }
74 return ret;
75}
Steven Moreland2e87adc2018-08-20 19:47:00 -070076
77// See gen_parcel_helper.py. These auto-generated read/write methods use the same types for
78// libbinder and this library.
79// @START
80binder_status_t AParcel_writeInt32(AParcel* parcel, int32_t value) {
Steven Morelandf18615b2018-09-14 11:43:06 -070081 status_t status = parcel->get()->writeInt32(value);
Steven Moreland5d62e442018-09-13 15:01:02 -070082 return PruneStatusT(status);
Steven Moreland2e87adc2018-08-20 19:47:00 -070083}
84
85binder_status_t AParcel_writeUint32(AParcel* parcel, uint32_t value) {
Steven Morelandf18615b2018-09-14 11:43:06 -070086 status_t status = parcel->get()->writeUint32(value);
Steven Moreland5d62e442018-09-13 15:01:02 -070087 return PruneStatusT(status);
Steven Moreland2e87adc2018-08-20 19:47:00 -070088}
89
90binder_status_t AParcel_writeInt64(AParcel* parcel, int64_t value) {
Steven Morelandf18615b2018-09-14 11:43:06 -070091 status_t status = parcel->get()->writeInt64(value);
Steven Moreland5d62e442018-09-13 15:01:02 -070092 return PruneStatusT(status);
Steven Moreland2e87adc2018-08-20 19:47:00 -070093}
94
95binder_status_t AParcel_writeUint64(AParcel* parcel, uint64_t value) {
Steven Morelandf18615b2018-09-14 11:43:06 -070096 status_t status = parcel->get()->writeUint64(value);
Steven Moreland5d62e442018-09-13 15:01:02 -070097 return PruneStatusT(status);
Steven Moreland2e87adc2018-08-20 19:47:00 -070098}
99
100binder_status_t AParcel_writeFloat(AParcel* parcel, float value) {
Steven Morelandf18615b2018-09-14 11:43:06 -0700101 status_t status = parcel->get()->writeFloat(value);
Steven Moreland5d62e442018-09-13 15:01:02 -0700102 return PruneStatusT(status);
Steven Moreland2e87adc2018-08-20 19:47:00 -0700103}
104
105binder_status_t AParcel_writeDouble(AParcel* parcel, double value) {
Steven Morelandf18615b2018-09-14 11:43:06 -0700106 status_t status = parcel->get()->writeDouble(value);
Steven Moreland5d62e442018-09-13 15:01:02 -0700107 return PruneStatusT(status);
Steven Moreland2e87adc2018-08-20 19:47:00 -0700108}
109
110binder_status_t AParcel_writeBool(AParcel* parcel, bool value) {
Steven Morelandf18615b2018-09-14 11:43:06 -0700111 status_t status = parcel->get()->writeBool(value);
Steven Moreland5d62e442018-09-13 15:01:02 -0700112 return PruneStatusT(status);
Steven Moreland2e87adc2018-08-20 19:47:00 -0700113}
114
115binder_status_t AParcel_writeChar(AParcel* parcel, char16_t value) {
Steven Morelandf18615b2018-09-14 11:43:06 -0700116 status_t status = parcel->get()->writeChar(value);
Steven Moreland5d62e442018-09-13 15:01:02 -0700117 return PruneStatusT(status);
Steven Moreland2e87adc2018-08-20 19:47:00 -0700118}
119
120binder_status_t AParcel_writeByte(AParcel* parcel, int8_t value) {
Steven Morelandf18615b2018-09-14 11:43:06 -0700121 status_t status = parcel->get()->writeByte(value);
Steven Moreland5d62e442018-09-13 15:01:02 -0700122 return PruneStatusT(status);
Steven Moreland2e87adc2018-08-20 19:47:00 -0700123}
124
125binder_status_t AParcel_readInt32(const AParcel* parcel, int32_t* value) {
Steven Morelandf18615b2018-09-14 11:43:06 -0700126 status_t status = parcel->get()->readInt32(value);
Steven Moreland5d62e442018-09-13 15:01:02 -0700127 return PruneStatusT(status);
Steven Moreland2e87adc2018-08-20 19:47:00 -0700128}
129
130binder_status_t AParcel_readUint32(const AParcel* parcel, uint32_t* value) {
Steven Morelandf18615b2018-09-14 11:43:06 -0700131 status_t status = parcel->get()->readUint32(value);
Steven Moreland5d62e442018-09-13 15:01:02 -0700132 return PruneStatusT(status);
Steven Moreland2e87adc2018-08-20 19:47:00 -0700133}
134
135binder_status_t AParcel_readInt64(const AParcel* parcel, int64_t* value) {
Steven Morelandf18615b2018-09-14 11:43:06 -0700136 status_t status = parcel->get()->readInt64(value);
Steven Moreland5d62e442018-09-13 15:01:02 -0700137 return PruneStatusT(status);
Steven Moreland2e87adc2018-08-20 19:47:00 -0700138}
139
140binder_status_t AParcel_readUint64(const AParcel* parcel, uint64_t* value) {
Steven Morelandf18615b2018-09-14 11:43:06 -0700141 status_t status = parcel->get()->readUint64(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_readFloat(const AParcel* parcel, float* value) {
Steven Morelandf18615b2018-09-14 11:43:06 -0700146 status_t status = parcel->get()->readFloat(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_readDouble(const AParcel* parcel, double* value) {
Steven Morelandf18615b2018-09-14 11:43:06 -0700151 status_t status = parcel->get()->readDouble(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_readBool(const AParcel* parcel, bool* value) {
Steven Morelandf18615b2018-09-14 11:43:06 -0700156 status_t status = parcel->get()->readBool(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_readChar(const AParcel* parcel, char16_t* value) {
Steven Morelandf18615b2018-09-14 11:43:06 -0700161 status_t status = parcel->get()->readChar(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_readByte(const AParcel* parcel, int8_t* value) {
Steven Morelandf18615b2018-09-14 11:43:06 -0700166 status_t status = parcel->get()->readByte(value);
Steven Moreland5d62e442018-09-13 15:01:02 -0700167 return PruneStatusT(status);
Steven Moreland2e87adc2018-08-20 19:47:00 -0700168}
169
170// @END