blob: 4ba1144742db01dd1e0e33bacbe442c67899b055 [file] [log] [blame]
Andreas Huberdab5fc62016-08-15 09:25:02 -07001/*
2 * Copyright (C) 2016 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
17package android.os;
18
Andreas Huberef1a5652016-10-18 09:24:04 -070019import java.util.ArrayList;
20import java.util.Arrays;
21
Andreas Huberdab5fc62016-08-15 09:25:02 -070022import libcore.util.NativeAllocationRegistry;
23
24/** @hide */
25public class HwParcel {
26 private static final String TAG = "HwParcel";
27
28 public static final int STATUS_SUCCESS = 0;
29 public static final int STATUS_ERROR = -1;
30
31 private static final NativeAllocationRegistry sNativeRegistry;
32
33 private HwParcel(boolean allocate) {
34 native_setup(allocate);
35
36 sNativeRegistry.registerNativeAllocation(
37 this,
38 mNativeContext);
39 }
40
41 public HwParcel() {
42 native_setup(true /* allocate */);
43
44 sNativeRegistry.registerNativeAllocation(
45 this,
46 mNativeContext);
47 }
48
49 public native final void writeInterfaceToken(String interfaceName);
Andreas Huber86635bb2016-08-24 16:19:03 -070050 public native final void writeBool(boolean val);
Andreas Huberdab5fc62016-08-15 09:25:02 -070051 public native final void writeInt8(byte val);
52 public native final void writeInt16(short val);
53 public native final void writeInt32(int val);
54 public native final void writeInt64(long val);
55 public native final void writeFloat(float val);
56 public native final void writeDouble(double val);
57 public native final void writeString(String val);
58
Andreas Huberef1a5652016-10-18 09:24:04 -070059 private native final void writeBoolVector(boolean[] val);
60 private native final void writeInt8Vector(byte[] val);
61 private native final void writeInt16Vector(short[] val);
62 private native final void writeInt32Vector(int[] val);
63 private native final void writeInt64Vector(long[] val);
64 private native final void writeFloatVector(float[] val);
65 private native final void writeDoubleVector(double[] val);
66 private native final void writeStringVector(String[] val);
67
68 public final void writeBoolVector(ArrayList<Boolean> val) {
69 final int n = val.size();
70 boolean[] array = new boolean[n];
71 for (int i = 0; i < n; ++i) {
72 array[i] = val.get(i);
73 }
74
75 writeBoolVector(array);
76 }
77
78 public final void writeInt8Vector(ArrayList<Byte> val) {
79 final int n = val.size();
80 byte[] array = new byte[n];
81 for (int i = 0; i < n; ++i) {
82 array[i] = val.get(i);
83 }
84
85 writeInt8Vector(array);
86 }
87
88 public final void writeInt16Vector(ArrayList<Short> val) {
89 final int n = val.size();
90 short[] array = new short[n];
91 for (int i = 0; i < n; ++i) {
92 array[i] = val.get(i);
93 }
94
95 writeInt16Vector(array);
96 }
97
98 public final void writeInt32Vector(ArrayList<Integer> val) {
99 final int n = val.size();
100 int[] array = new int[n];
101 for (int i = 0; i < n; ++i) {
102 array[i] = val.get(i);
103 }
104
105 writeInt32Vector(array);
106 }
107
108 public final void writeInt64Vector(ArrayList<Long> val) {
109 final int n = val.size();
110 long[] array = new long[n];
111 for (int i = 0; i < n; ++i) {
112 array[i] = val.get(i);
113 }
114
115 writeInt64Vector(array);
116 }
117
118 public final void writeFloatVector(ArrayList<Float> val) {
119 final int n = val.size();
120 float[] array = new float[n];
121 for (int i = 0; i < n; ++i) {
122 array[i] = val.get(i);
123 }
124
125 writeFloatVector(array);
126 }
127
128 public final void writeDoubleVector(ArrayList<Double> val) {
129 final int n = val.size();
130 double[] array = new double[n];
131 for (int i = 0; i < n; ++i) {
132 array[i] = val.get(i);
133 }
134
135 writeDoubleVector(array);
136 }
137
138 public final void writeStringVector(ArrayList<String> val) {
139 writeStringVector(val.toArray(new String[val.size()]));
140 }
Andreas Huberdab5fc62016-08-15 09:25:02 -0700141
142 public native final void writeStrongBinder(IHwBinder binder);
143
144 public native final void enforceInterface(String interfaceName);
Andreas Huber86635bb2016-08-24 16:19:03 -0700145 public native final boolean readBool();
Andreas Huberdab5fc62016-08-15 09:25:02 -0700146 public native final byte readInt8();
147 public native final short readInt16();
148 public native final int readInt32();
149 public native final long readInt64();
150 public native final float readFloat();
151 public native final double readDouble();
152 public native final String readString();
153
Andreas Huberef1a5652016-10-18 09:24:04 -0700154 private native final boolean[] readBoolVectorAsArray();
155 private native final byte[] readInt8VectorAsArray();
156 private native final short[] readInt16VectorAsArray();
157 private native final int[] readInt32VectorAsArray();
158 private native final long[] readInt64VectorAsArray();
159 private native final float[] readFloatVectorAsArray();
160 private native final double[] readDoubleVectorAsArray();
161 private native final String[] readStringVectorAsArray();
162
163 public final ArrayList<Boolean> readBoolVector() {
164 Boolean[] array = HwBlob.wrapArray(readBoolVectorAsArray());
165
166 return new ArrayList<Boolean>(Arrays.asList(array));
167 }
168
169 public final ArrayList<Byte> readInt8Vector() {
170 Byte[] array = HwBlob.wrapArray(readInt8VectorAsArray());
171
172 return new ArrayList<Byte>(Arrays.asList(array));
173 }
174
175 public final ArrayList<Short> readInt16Vector() {
176 Short[] array = HwBlob.wrapArray(readInt16VectorAsArray());
177
178 return new ArrayList<Short>(Arrays.asList(array));
179 }
180
181 public final ArrayList<Integer> readInt32Vector() {
182 Integer[] array = HwBlob.wrapArray(readInt32VectorAsArray());
183
184 return new ArrayList<Integer>(Arrays.asList(array));
185 }
186
187 public final ArrayList<Long> readInt64Vector() {
188 Long[] array = HwBlob.wrapArray(readInt64VectorAsArray());
189
190 return new ArrayList<Long>(Arrays.asList(array));
191 }
192
193 public final ArrayList<Float> readFloatVector() {
194 Float[] array = HwBlob.wrapArray(readFloatVectorAsArray());
195
196 return new ArrayList<Float>(Arrays.asList(array));
197 }
198
199 public final ArrayList<Double> readDoubleVector() {
200 Double[] array = HwBlob.wrapArray(readDoubleVectorAsArray());
201
202 return new ArrayList<Double>(Arrays.asList(array));
203 }
204
205 public final ArrayList<String> readStringVector() {
206 return new ArrayList<String>(Arrays.asList(readStringVectorAsArray()));
207 }
Andreas Huberdab5fc62016-08-15 09:25:02 -0700208
209 public native final IHwBinder readStrongBinder();
210
Andreas Huber9266f992016-08-25 11:21:21 -0700211 // Handle is stored as part of the blob.
Martijn Coenen932b5042017-04-18 15:54:43 -0700212 public native final HwBlob readBuffer(long expectedSize);
Andreas Huber9266f992016-08-25 11:21:21 -0700213
214 public native final HwBlob readEmbeddedBuffer(
Martijn Coenen932b5042017-04-18 15:54:43 -0700215 long expectedSize, long parentHandle, long offset,
216 boolean nullable);
Andreas Huber9266f992016-08-25 11:21:21 -0700217
218 public native final void writeBuffer(HwBlob blob);
219
Andreas Huberdab5fc62016-08-15 09:25:02 -0700220 public native final void writeStatus(int status);
221 public native final void verifySuccess();
222 public native final void releaseTemporaryStorage();
Martijn Coenen3d726d12017-03-16 18:46:42 +0100223 public native final void release();
Andreas Huberdab5fc62016-08-15 09:25:02 -0700224
225 public native final void send();
226
227 // Returns address of the "freeFunction".
228 private static native final long native_init();
229
230 private native final void native_setup(boolean allocate);
231
232 static {
233 long freeFunction = native_init();
234
235 sNativeRegistry = new NativeAllocationRegistry(
236 HwParcel.class.getClassLoader(),
237 freeFunction,
238 128 /* size */);
239 }
240
241 private long mNativeContext;
242}
243