android_os_HwParcel.cpp revision 9f0268695c046538a1887f54172454dbc89157e7
1dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber/*
2dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber * Copyright (C) 2016 The Android Open Source Project
3dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber *
4dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber * Licensed under the Apache License, Version 2.0 (the "License");
5dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber * you may not use this file except in compliance with the License.
6dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber * You may obtain a copy of the License at
7dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber *
8dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber *      http://www.apache.org/licenses/LICENSE-2.0
9dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber *
10dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber * Unless required by applicable law or agreed to in writing, software
11dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber * distributed under the License is distributed on an "AS IS" BASIS,
12dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber * See the License for the specific language governing permissions and
14dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber * limitations under the License.
15dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber */
16dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber
17dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber//#define LOG_NDEBUG 0
18dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber#define LOG_TAG "android_os_HwParcel"
19dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber#include <android-base/logging.h>
20dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber
21dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber#include "android_os_HwParcel.h"
22dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber
23dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber#include "android_os_HwBinder.h"
249266f9928d5b3431982cd04f4d6946b70f40766aAndreas Huber#include "android_os_HwBlob.h"
25dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber#include "android_os_HwRemoteBinder.h"
26dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber
27dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber#include <JNIHelp.h>
28dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber#include <android_runtime/AndroidRuntime.h>
29aa2c32f92b199cb40b808554ced67af1edaffef5Martijn Coenen#include <hidl/Status.h>
30dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber#include <nativehelper/ScopedLocalRef.h>
31dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber
32dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber#include "core_jni_helpers.h"
33dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber
34dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huberusing android::AndroidRuntime;
35dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber
36dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huberusing ::android::hardware::hidl_string;
37dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huberusing ::android::hardware::hidl_vec;
38dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber
39dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber#define PACKAGE_PATH    "android/os"
40dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber#define CLASS_NAME      "HwParcel"
41dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber#define CLASS_PATH      PACKAGE_PATH "/" CLASS_NAME
42dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber
43dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Hubernamespace android {
44dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber
45dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huberstatic struct fields_t {
46dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber    jfieldID contextID;
47dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber    jmethodID constructID;
48dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber
49dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber} gFields;
50dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber
51dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Hubervoid signalExceptionForError(JNIEnv *env, status_t err) {
52dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber    switch (err) {
53dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber        case OK:
54dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber            break;
55dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber
56dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber        case NO_MEMORY:
57dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber        {
58dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber            jniThrowException(env, "java/lang/OutOfMemoryError", NULL);
59dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber            break;
60dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber        }
61dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber
62dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber        case INVALID_OPERATION:
63dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber        {
64dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber            jniThrowException(
65dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber                    env, "java/lang/UnsupportedOperationException", NULL);
66dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber            break;
67dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber        }
68dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber
69dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber        case BAD_VALUE:
70dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber        {
71dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber            jniThrowException(env, "java/lang/IllegalArgumentException", NULL);
72dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber            break;
73dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber        }
74dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber
759266f9928d5b3431982cd04f4d6946b70f40766aAndreas Huber        case -ERANGE:
76dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber        case BAD_INDEX:
77dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber        {
78dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber            jniThrowException(env, "java/lang/IndexOutOfBoundsException", NULL);
79dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber            break;
80dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber        }
81dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber
82dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber        case BAD_TYPE:
83dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber        {
84dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber            jniThrowException(env, "java/lang/IllegalArgumentException", NULL);
85dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber            break;
86dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber        }
87dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber
88dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber        case NAME_NOT_FOUND:
89dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber        {
90dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber            jniThrowException(env, "java/util/NoSuchElementException", NULL);
91dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber            break;
92dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber        }
93dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber
94dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber        case PERMISSION_DENIED:
95dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber        {
96dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber            jniThrowException(env, "java/lang/SecurityException", NULL);
97dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber            break;
98dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber        }
99dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber
100dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber        case NO_INIT:
101dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber        {
102dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber            jniThrowException(
103dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber                    env, "java/lang/RuntimeException", "Not initialized");
104dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber            break;
105dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber        }
106dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber
107dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber        case ALREADY_EXISTS:
108dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber        {
109dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber            jniThrowException(
110dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber                    env, "java/lang/RuntimeException", "Item already exists");
111dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber            break;
112dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber        }
113dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber
114dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber        default:
115dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber        {
116dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber            jniThrowException(
117dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber                    env, "java/lang/RuntimeException", "Unknown error");
118dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber
119dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber            break;
120dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber        }
121dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber    }
122dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber}
123dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber
124dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber// static
125dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Hubervoid JHwParcel::InitClass(JNIEnv *env) {
126dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber    ScopedLocalRef<jclass> clazz(
127dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber            env, FindClassOrDie(env, CLASS_PATH));
128dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber
129dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber    gFields.contextID =
130dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber        GetFieldIDOrDie(env, clazz.get(), "mNativeContext", "J");
131dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber
132dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber    gFields.constructID = GetMethodIDOrDie(env, clazz.get(), "<init>", "(Z)V");
133dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber}
134dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber
135dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber// static
136dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Hubersp<JHwParcel> JHwParcel::SetNativeContext(
137dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber        JNIEnv *env, jobject thiz, const sp<JHwParcel> &context) {
138dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber    sp<JHwParcel> old = (JHwParcel *)env->GetLongField(thiz, gFields.contextID);
139dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber
140dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber    if (context != NULL) {
141dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber        context->incStrong(NULL /* id */);
142dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber    }
143dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber
144dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber    if (old != NULL) {
145dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber        old->decStrong(NULL /* id */);
146dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber    }
147dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber
148dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber    env->SetLongField(thiz, gFields.contextID, (long)context.get());
149dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber
150dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber    return old;
151dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber}
152dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber
153dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber// static
154dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Hubersp<JHwParcel> JHwParcel::GetNativeContext(JNIEnv *env, jobject thiz) {
155dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber    return (JHwParcel *)env->GetLongField(thiz, gFields.contextID);
156dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber}
157dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber
158dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas HuberJHwParcel::JHwParcel(JNIEnv *env, jobject thiz)
159dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber    : mParcel(NULL),
160dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber      mOwnsParcel(false),
161dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber      mTransactCallback(nullptr),
162dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber      mWasSent(false) {
163dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber    jclass clazz = env->GetObjectClass(thiz);
164dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber    CHECK(clazz != NULL);
165dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber
166dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber    mClass = (jclass)env->NewGlobalRef(clazz);
167dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber    mObject = env->NewWeakGlobalRef(thiz);
168dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber}
169dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber
170dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas HuberJHwParcel::~JHwParcel() {
171dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber    JNIEnv *env = AndroidRuntime::getJNIEnv();
172dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber
173dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber    mStorage.release(env);
174dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber
175dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber    setParcel(NULL, false /* assumeOwnership */);
176dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber
177dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber    env->DeleteWeakGlobalRef(mObject);
178dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber    mObject = NULL;
179dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber
180dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber    env->DeleteGlobalRef(mClass);
181dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber    mClass = NULL;
182dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber}
183dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber
184dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huberhardware::Parcel *JHwParcel::getParcel() {
185dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber    return mParcel;
186dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber}
187dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber
188dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas HuberEphemeralStorage *JHwParcel::getStorage() {
189dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber    return &mStorage;
190dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber}
191dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber
192dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Hubervoid JHwParcel::setParcel(hardware::Parcel *parcel, bool assumeOwnership) {
193dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber    if (mParcel && mOwnsParcel) {
194dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber        delete mParcel;
195dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber    }
196dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber
197dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber    mParcel = parcel;
198dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber    mOwnsParcel = assumeOwnership;
199dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber}
200dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber
201dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber// static
202dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huberjobject JHwParcel::NewObject(JNIEnv *env) {
203dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber    ScopedLocalRef<jclass> clazz(env, FindClassOrDie(env, CLASS_PATH));
204dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber
2059266f9928d5b3431982cd04f4d6946b70f40766aAndreas Huber    jmethodID constructID =
2069266f9928d5b3431982cd04f4d6946b70f40766aAndreas Huber        GetMethodIDOrDie(env, clazz.get(), "<init>", "(Z)V");
2079266f9928d5b3431982cd04f4d6946b70f40766aAndreas Huber
2089266f9928d5b3431982cd04f4d6946b70f40766aAndreas Huber    return env->NewObject(clazz.get(), constructID, false /* allocate */);
209dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber}
210dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber
211dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Hubervoid JHwParcel::setTransactCallback(
212dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber        ::android::hardware::IBinder::TransactCallback cb) {
213dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber    mTransactCallback = cb;
214dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber}
215dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber
216dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Hubervoid JHwParcel::send() {
217dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber    CHECK(mTransactCallback != nullptr);
218dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber    CHECK(mParcel != nullptr);
219dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber
220dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber    mTransactCallback(*mParcel);
221dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber    mTransactCallback = nullptr;
222dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber
223dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber    mWasSent = true;
224dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber}
225dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber
226dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huberbool JHwParcel::wasSent() const {
227dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber    return mWasSent;
228dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber}
229dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber
230dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber}  // namespace android
231dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber
232dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber////////////////////////////////////////////////////////////////////////////////
233dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber
234dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huberusing namespace android;
235dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber
236dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huberstatic void releaseNativeContext(void *nativeContext) {
237dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber    sp<JHwParcel> parcel = (JHwParcel *)nativeContext;
238dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber
239dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber    if (parcel != NULL) {
240dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber        parcel->decStrong(NULL /* id */);
241dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber    }
242dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber}
243dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber
244dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huberstatic jlong JHwParcel_native_init(JNIEnv *env) {
245dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber    JHwParcel::InitClass(env);
246dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber
247dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber    return reinterpret_cast<jlong>(&releaseNativeContext);
248dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber}
249dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber
250dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huberstatic void JHwParcel_native_setup(
251dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber        JNIEnv *env, jobject thiz, jboolean allocate) {
252dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber    sp<JHwParcel> context = new JHwParcel(env, thiz);
253dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber
254dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber    if (allocate) {
255dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber        context->setParcel(new hardware::Parcel, true /* assumeOwnership */);
256dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber    }
257dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber
258dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber    JHwParcel::SetNativeContext(env, thiz, context);
259dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber}
260dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber
261dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huberstatic void JHwParcel_native_writeInterfaceToken(
262dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber        JNIEnv *env, jobject thiz, jstring interfaceNameObj) {
263dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber    if (interfaceNameObj == NULL) {
264dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber        jniThrowException(env, "java/lang/NullPointerException", NULL);
265dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber        return;
266dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber    }
267dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber
268dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber    const jchar *interfaceName = env->GetStringCritical(interfaceNameObj, NULL);
269dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber    if (interfaceName) {
2709f0268695c046538a1887f54172454dbc89157e7Andreas Huber        String16 nameCopy(
2719f0268695c046538a1887f54172454dbc89157e7Andreas Huber                reinterpret_cast<const char16_t *>(interfaceName),
2729f0268695c046538a1887f54172454dbc89157e7Andreas Huber                env->GetStringLength(interfaceNameObj));
273dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber
274dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber        env->ReleaseStringCritical(interfaceNameObj, interfaceName);
275dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber        interfaceName = NULL;
276dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber
2779f0268695c046538a1887f54172454dbc89157e7Andreas Huber        hardware::Parcel *parcel =
2789f0268695c046538a1887f54172454dbc89157e7Andreas Huber            JHwParcel::GetNativeContext(env, thiz)->getParcel();
2799f0268695c046538a1887f54172454dbc89157e7Andreas Huber
2809f0268695c046538a1887f54172454dbc89157e7Andreas Huber        status_t err = parcel->writeInterfaceToken(nameCopy);
281dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber        signalExceptionForError(env, err);
282dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber    }
283dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber}
284dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber
285dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huberstatic void JHwParcel_native_enforceInterface(
286dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber        JNIEnv *env, jobject thiz, jstring interfaceNameObj) {
287dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber    // XXX original binder Parcel enforceInterface implementation does some
288dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber    // mysterious things regarding strictModePolicy(), figure out if we need
289dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber    // that here as well.
290dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber    if (interfaceNameObj == NULL) {
291dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber        jniThrowException(env, "java/lang/NullPointerException", NULL);
292dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber        return;
293dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber    }
294dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber
295dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber    const jchar *interfaceName = env->GetStringCritical(interfaceNameObj, NULL);
296dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber    if (interfaceName) {
2979f0268695c046538a1887f54172454dbc89157e7Andreas Huber        String16 interfaceNameCopy(
2989f0268695c046538a1887f54172454dbc89157e7Andreas Huber                reinterpret_cast<const char16_t *>(interfaceName),
2999f0268695c046538a1887f54172454dbc89157e7Andreas Huber                env->GetStringLength(interfaceNameObj));
300dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber
301dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber        env->ReleaseStringCritical(interfaceNameObj, interfaceName);
302dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber        interfaceName = NULL;
303dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber
3049f0268695c046538a1887f54172454dbc89157e7Andreas Huber        hardware::Parcel *parcel =
3059f0268695c046538a1887f54172454dbc89157e7Andreas Huber            JHwParcel::GetNativeContext(env, thiz)->getParcel();
3069f0268695c046538a1887f54172454dbc89157e7Andreas Huber
3079f0268695c046538a1887f54172454dbc89157e7Andreas Huber        bool valid = parcel->enforceInterface(interfaceNameCopy);
3089f0268695c046538a1887f54172454dbc89157e7Andreas Huber
309dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber        if (!valid) {
310dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber            jniThrowException(
311dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber                    env,
312dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber                    "java/lang/SecurityException",
313dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber                    "HWBinder invocation to an incorrect interface");
314dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber        }
315dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber    }
316dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber}
317dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber
318dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber#define DEFINE_PARCEL_WRITER(Suffix,Type)                               \
319dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huberstatic void JHwParcel_native_write ## Suffix(                           \
320dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber        JNIEnv *env, jobject thiz, Type val) {                          \
321dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber    hardware::Parcel *parcel =                                          \
322dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber        JHwParcel::GetNativeContext(env, thiz)->getParcel();            \
323dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber                                                                        \
324dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber    status_t err = parcel->write ## Suffix(val);                        \
325dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber    signalExceptionForError(env, err);                                  \
326dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber}
327dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber
328dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber#define DEFINE_PARCEL_READER(Suffix,Type)                               \
329dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huberstatic Type JHwParcel_native_read ## Suffix(                            \
330dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber        JNIEnv *env, jobject thiz) {                                    \
331dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber    hardware::Parcel *parcel =                                          \
332dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber        JHwParcel::GetNativeContext(env, thiz)->getParcel();            \
333dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber                                                                        \
334dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber    Type val;                                                           \
335dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber    status_t err = parcel->read ## Suffix(&val);                        \
336dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber    signalExceptionForError(env, err);                                  \
337dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber                                                                        \
338dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber    return val;                                                         \
339dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber}
340dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber
34186635bb45ee1ddeb3059a8a925659964c7858cc3Andreas HuberDEFINE_PARCEL_WRITER(Bool,jboolean)
342dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas HuberDEFINE_PARCEL_WRITER(Int8,jbyte)
343dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas HuberDEFINE_PARCEL_WRITER(Int16,jshort)
344dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas HuberDEFINE_PARCEL_WRITER(Int32,jint)
345dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas HuberDEFINE_PARCEL_WRITER(Int64,jlong)
346dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas HuberDEFINE_PARCEL_WRITER(Float,jfloat)
347dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas HuberDEFINE_PARCEL_WRITER(Double,jdouble)
348dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber
349dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas HuberDEFINE_PARCEL_READER(Int8,jbyte)
350dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas HuberDEFINE_PARCEL_READER(Int16,jshort)
351dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas HuberDEFINE_PARCEL_READER(Int32,jint)
352dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas HuberDEFINE_PARCEL_READER(Int64,jlong)
353dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas HuberDEFINE_PARCEL_READER(Float,jfloat)
354dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas HuberDEFINE_PARCEL_READER(Double,jdouble)
355dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber
35686635bb45ee1ddeb3059a8a925659964c7858cc3Andreas Huberstatic jboolean JHwParcel_native_readBool(JNIEnv *env, jobject thiz) {
35786635bb45ee1ddeb3059a8a925659964c7858cc3Andreas Huber    hardware::Parcel *parcel =
35886635bb45ee1ddeb3059a8a925659964c7858cc3Andreas Huber        JHwParcel::GetNativeContext(env, thiz)->getParcel();
35986635bb45ee1ddeb3059a8a925659964c7858cc3Andreas Huber
36086635bb45ee1ddeb3059a8a925659964c7858cc3Andreas Huber    bool val;
36186635bb45ee1ddeb3059a8a925659964c7858cc3Andreas Huber    status_t err = parcel->readBool(&val);
36286635bb45ee1ddeb3059a8a925659964c7858cc3Andreas Huber    signalExceptionForError(env, err);
36386635bb45ee1ddeb3059a8a925659964c7858cc3Andreas Huber
36486635bb45ee1ddeb3059a8a925659964c7858cc3Andreas Huber    return (jboolean)val;
36586635bb45ee1ddeb3059a8a925659964c7858cc3Andreas Huber}
36686635bb45ee1ddeb3059a8a925659964c7858cc3Andreas Huber
367dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huberstatic void JHwParcel_native_writeStatus(
368dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber        JNIEnv *env, jobject thiz, jint statusCode) {
369dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber    using hardware::Status;
370dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber
371dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber    Status status;
372dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber    switch (statusCode) {
373dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber        case 0:  // kStatusSuccess
374dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber            status = Status::ok();
375dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber            break;
376dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber        case -1:  // kStatusError
377dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber            status = Status::fromStatusT(UNKNOWN_ERROR);
378dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber            break;
379dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber        default:
380dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber            CHECK(!"Should not be here");
381dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber    }
382dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber
383dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber    hardware::Parcel *parcel =
384dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber        JHwParcel::GetNativeContext(env, thiz)->getParcel();
385dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber
386dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber    status_t err = status.writeToParcel(parcel);
387dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber    signalExceptionForError(env, err);
388dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber}
389dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber
390dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huberstatic void JHwParcel_native_verifySuccess(JNIEnv *env, jobject thiz) {
391dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber    using hardware::Status;
392dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber
393dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber    hardware::Parcel *parcel =
394dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber        JHwParcel::GetNativeContext(env, thiz)->getParcel();
395dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber
396dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber    Status status;
397dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber    status_t err = status.readFromParcel(*parcel);
398dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber    signalExceptionForError(env, err);
399dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber}
400dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber
401dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huberstatic void JHwParcel_native_releaseTemporaryStorage(
402dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber        JNIEnv *env, jobject thiz) {
403dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber    JHwParcel::GetNativeContext(env, thiz)->getStorage()->release(env);
404dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber}
405dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber
406dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huberstatic void JHwParcel_native_send(JNIEnv *env, jobject thiz) {
407dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber    JHwParcel::GetNativeContext(env, thiz)->send();
408dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber}
409dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber
410dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huberstatic void JHwParcel_native_writeString(
411dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber        JNIEnv *env, jobject thiz, jstring valObj) {
412dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber    if (valObj == NULL) {
413dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber        jniThrowException(env, "java/lang/NullPointerException", NULL);
414dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber        return;
415dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber    }
416dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber
417dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber    sp<JHwParcel> impl = JHwParcel::GetNativeContext(env, thiz);
418dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber
419dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber    const hidl_string *s =
420dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber        impl->getStorage()->allocTemporaryString(env, valObj);
421dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber
422dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber    hardware::Parcel *parcel = impl->getParcel();
423dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber
424dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber    size_t parentHandle;
425dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber    status_t err = parcel->writeBuffer(s, sizeof(*s), &parentHandle);
426dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber
427dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber    if (err == OK) {
428dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber        err = s->writeEmbeddedToParcel(
429dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber                parcel, parentHandle, 0 /* parentOffset */);
430dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber    }
431dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber
432dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber    signalExceptionForError(env, err);
433dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber}
434dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber
435dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber#define DEFINE_PARCEL_VECTOR_WRITER(Suffix,Type)                               \
436dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huberstatic void JHwParcel_native_write ## Suffix ## Vector(                        \
437dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber        JNIEnv *env, jobject thiz, Type ## Array valObj) {                     \
438dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber    if (valObj == NULL) {                                                      \
439dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber        jniThrowException(env, "java/lang/NullPointerException", NULL);        \
440dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber        return;                                                                \
441dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber    }                                                                          \
442dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber                                                                               \
443dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber    sp<JHwParcel> impl = JHwParcel::GetNativeContext(env, thiz);               \
444dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber                                                                               \
445dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber    const hidl_vec<Type> *vec =                                                \
446dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber        impl->getStorage()->allocTemporary ## Suffix ## Vector(env, valObj);   \
447dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber                                                                               \
448dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber    hardware::Parcel *parcel = impl->getParcel();                              \
449dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber                                                                               \
450dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber    size_t parentHandle;                                                       \
451dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber    status_t err = parcel->writeBuffer(vec, sizeof(*vec), &parentHandle);      \
452dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber                                                                               \
453dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber    if (err == OK) {                                                           \
454dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber        size_t childHandle;                                                    \
455dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber                                                                               \
456dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber        err = vec->writeEmbeddedToParcel(                                      \
457dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber                parcel,                                                        \
458dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber                parentHandle,                                                  \
459dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber                0 /* parentOffset */,                                          \
460dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber                &childHandle);                                                 \
461dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber    }                                                                          \
462dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber                                                                               \
463dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber    signalExceptionForError(env, err);                                         \
464dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber}
465dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber
466dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas HuberDEFINE_PARCEL_VECTOR_WRITER(Int8,jbyte)
467dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas HuberDEFINE_PARCEL_VECTOR_WRITER(Int16,jshort)
468dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas HuberDEFINE_PARCEL_VECTOR_WRITER(Int32,jint)
469dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas HuberDEFINE_PARCEL_VECTOR_WRITER(Int64,jlong)
470dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas HuberDEFINE_PARCEL_VECTOR_WRITER(Float,jfloat)
471dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas HuberDEFINE_PARCEL_VECTOR_WRITER(Double,jdouble)
472dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber
47386635bb45ee1ddeb3059a8a925659964c7858cc3Andreas Huberstatic void JHwParcel_native_writeBoolVector(
47486635bb45ee1ddeb3059a8a925659964c7858cc3Andreas Huber        JNIEnv *env, jobject thiz, jbooleanArray valObj) {
47586635bb45ee1ddeb3059a8a925659964c7858cc3Andreas Huber    if (valObj == NULL) {
47686635bb45ee1ddeb3059a8a925659964c7858cc3Andreas Huber        jniThrowException(env, "java/lang/NullPointerException", NULL);
47786635bb45ee1ddeb3059a8a925659964c7858cc3Andreas Huber        return;
47886635bb45ee1ddeb3059a8a925659964c7858cc3Andreas Huber    }
47986635bb45ee1ddeb3059a8a925659964c7858cc3Andreas Huber
48086635bb45ee1ddeb3059a8a925659964c7858cc3Andreas Huber    sp<JHwParcel> impl = JHwParcel::GetNativeContext(env, thiz);
48186635bb45ee1ddeb3059a8a925659964c7858cc3Andreas Huber
4829266f9928d5b3431982cd04f4d6946b70f40766aAndreas Huber    void *vecPtr =
4839266f9928d5b3431982cd04f4d6946b70f40766aAndreas Huber        impl->getStorage()->allocTemporaryStorage(sizeof(hidl_vec<bool>));
4849266f9928d5b3431982cd04f4d6946b70f40766aAndreas Huber
4859266f9928d5b3431982cd04f4d6946b70f40766aAndreas Huber    hidl_vec<bool> *vec = new (vecPtr) hidl_vec<bool>;
48686635bb45ee1ddeb3059a8a925659964c7858cc3Andreas Huber
48786635bb45ee1ddeb3059a8a925659964c7858cc3Andreas Huber    jsize len = env->GetArrayLength(valObj);
48886635bb45ee1ddeb3059a8a925659964c7858cc3Andreas Huber
48986635bb45ee1ddeb3059a8a925659964c7858cc3Andreas Huber    jboolean *src = env->GetBooleanArrayElements(valObj, nullptr);
49086635bb45ee1ddeb3059a8a925659964c7858cc3Andreas Huber
49186635bb45ee1ddeb3059a8a925659964c7858cc3Andreas Huber    bool *dst =
49286635bb45ee1ddeb3059a8a925659964c7858cc3Andreas Huber        (bool *)impl->getStorage()->allocTemporaryStorage(len * sizeof(bool));
49386635bb45ee1ddeb3059a8a925659964c7858cc3Andreas Huber
49486635bb45ee1ddeb3059a8a925659964c7858cc3Andreas Huber    for (jsize i = 0; i < len; ++i) {
49586635bb45ee1ddeb3059a8a925659964c7858cc3Andreas Huber        dst[i] = src[i];
49686635bb45ee1ddeb3059a8a925659964c7858cc3Andreas Huber    }
49786635bb45ee1ddeb3059a8a925659964c7858cc3Andreas Huber
49886635bb45ee1ddeb3059a8a925659964c7858cc3Andreas Huber    env->ReleaseBooleanArrayElements(valObj, src, 0 /* mode */);
49986635bb45ee1ddeb3059a8a925659964c7858cc3Andreas Huber    src = nullptr;
50086635bb45ee1ddeb3059a8a925659964c7858cc3Andreas Huber
50186635bb45ee1ddeb3059a8a925659964c7858cc3Andreas Huber    vec->setToExternal(dst, len);
50286635bb45ee1ddeb3059a8a925659964c7858cc3Andreas Huber
50386635bb45ee1ddeb3059a8a925659964c7858cc3Andreas Huber    hardware::Parcel *parcel = impl->getParcel();
50486635bb45ee1ddeb3059a8a925659964c7858cc3Andreas Huber
50586635bb45ee1ddeb3059a8a925659964c7858cc3Andreas Huber    size_t parentHandle;
50686635bb45ee1ddeb3059a8a925659964c7858cc3Andreas Huber    status_t err = parcel->writeBuffer(vec, sizeof(*vec), &parentHandle);
50786635bb45ee1ddeb3059a8a925659964c7858cc3Andreas Huber
50886635bb45ee1ddeb3059a8a925659964c7858cc3Andreas Huber    if (err == OK) {
50986635bb45ee1ddeb3059a8a925659964c7858cc3Andreas Huber        size_t childHandle;
51086635bb45ee1ddeb3059a8a925659964c7858cc3Andreas Huber
51186635bb45ee1ddeb3059a8a925659964c7858cc3Andreas Huber        err = vec->writeEmbeddedToParcel(
51286635bb45ee1ddeb3059a8a925659964c7858cc3Andreas Huber                parcel,
51386635bb45ee1ddeb3059a8a925659964c7858cc3Andreas Huber                parentHandle,
51486635bb45ee1ddeb3059a8a925659964c7858cc3Andreas Huber                0 /* parentOffset */,
51586635bb45ee1ddeb3059a8a925659964c7858cc3Andreas Huber                &childHandle);
51686635bb45ee1ddeb3059a8a925659964c7858cc3Andreas Huber    }
51786635bb45ee1ddeb3059a8a925659964c7858cc3Andreas Huber
51886635bb45ee1ddeb3059a8a925659964c7858cc3Andreas Huber    signalExceptionForError(env, err);
51986635bb45ee1ddeb3059a8a925659964c7858cc3Andreas Huber}
52086635bb45ee1ddeb3059a8a925659964c7858cc3Andreas Huber
521dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huberstatic void JHwParcel_native_writeStrongBinder(
522dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber        JNIEnv *env, jobject thiz, jobject binderObj) {
523dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber    sp<hardware::IBinder> binder;
524dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber    if (binderObj != NULL) {
525dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber        ScopedLocalRef<jclass> hwBinderKlass(
526dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber                env, FindClassOrDie(env, PACKAGE_PATH "/HwBinder"));
527dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber
528dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber        ScopedLocalRef<jclass> hwRemoteBinderKlass(
529dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber                env, FindClassOrDie(env, PACKAGE_PATH "/HwRemoteBinder"));
530dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber
531dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber        if (env->IsInstanceOf(binderObj, hwBinderKlass.get())) {
532dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber            binder = JHwBinder::GetNativeContext(env, binderObj);
533dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber        } else if (env->IsInstanceOf(binderObj, hwRemoteBinderKlass.get())) {
534dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber            binder = JHwRemoteBinder::GetNativeContext(
535dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber                    env, binderObj)->getBinder();
536dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber        } else {
537dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber            signalExceptionForError(env, INVALID_OPERATION);
538dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber            return;
539dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber        }
540dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber    }
541dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber
542dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber    hardware::Parcel *parcel =
543dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber        JHwParcel::GetNativeContext(env, thiz)->getParcel();
544dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber
545dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber    status_t err = parcel->writeStrongBinder(binder);
546dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber    signalExceptionForError(env, err);
547dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber}
548dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber
549dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huberstatic jstring MakeStringObjFromHidlString(JNIEnv *env, const hidl_string &s) {
550dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber    String16 utf16String(s.c_str(), s.size());
551dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber
552dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber    return env->NewString(
553dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber            reinterpret_cast<const jchar *>(utf16String.string()),
554dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber            utf16String.size());
555dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber}
556dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber
557dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huberstatic jstring JHwParcel_native_readString(JNIEnv *env, jobject thiz) {
558dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber    hardware::Parcel *parcel =
559dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber        JHwParcel::GetNativeContext(env, thiz)->getParcel();
560dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber
561dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber    size_t parentHandle;
562dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber
563dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber    const hidl_string *s = static_cast<const hidl_string *>(
564dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber            parcel->readBuffer(&parentHandle));
565dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber
566dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber    if (s == NULL) {
567dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber        signalExceptionForError(env, UNKNOWN_ERROR);
568dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber        return NULL;
569dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber    }
570dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber
571dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber    status_t err = const_cast<hidl_string *>(s)->readEmbeddedFromParcel(
572dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber            *parcel, parentHandle, 0 /* parentOffset */);
573dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber
574dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber    if (err != OK) {
575dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber        signalExceptionForError(env, err);
576dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber        return NULL;
577dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber    }
578dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber
579dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber    return MakeStringObjFromHidlString(env, *s);
580dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber}
581dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber
582dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber#define DEFINE_PARCEL_VECTOR_READER(Suffix,Type,NewType)                       \
583dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huberstatic Type ## Array JHwParcel_native_read ## Suffix ## Vector(                \
584dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber        JNIEnv *env, jobject thiz) {                                           \
585dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber    hardware::Parcel *parcel =                                                 \
586dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber        JHwParcel::GetNativeContext(env, thiz)->getParcel();                   \
587dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber                                                                               \
588dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber    size_t parentHandle;                                                       \
589dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber                                                                               \
590dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber    const hidl_vec<Type> *vec =                                                \
591dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber        (const hidl_vec<Type> *)parcel->readBuffer(&parentHandle);             \
592dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber                                                                               \
593dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber    if (vec == NULL) {                                                         \
594dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber        signalExceptionForError(env, UNKNOWN_ERROR);                           \
595dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber        return NULL;                                                           \
596dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber    }                                                                          \
597dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber                                                                               \
598dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber    size_t childHandle;                                                        \
599dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber                                                                               \
600dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber    status_t err = const_cast<hidl_vec<Type> *>(vec)                           \
601dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber        ->readEmbeddedFromParcel(                                              \
602dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber                *parcel,                                                       \
603dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber                parentHandle,                                                  \
604dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber                0 /* parentOffset */,                                          \
605dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber                &childHandle);                                                 \
606dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber                                                                               \
607dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber    if (err != OK) {                                                           \
608dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber        signalExceptionForError(env, err);                                     \
609dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber        return NULL;                                                           \
610dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber    }                                                                          \
611dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber                                                                               \
612dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber    Type ## Array valObj = env->New ## NewType ## Array(vec->size());          \
613dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber    env->Set ## NewType ## ArrayRegion(valObj, 0, vec->size(), &(*vec)[0]);    \
614dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber                                                                               \
615dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber    return valObj;                                                             \
616dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber}
617dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber
618dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas HuberDEFINE_PARCEL_VECTOR_READER(Int8,jbyte,Byte)
619dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas HuberDEFINE_PARCEL_VECTOR_READER(Int16,jshort,Short)
620dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas HuberDEFINE_PARCEL_VECTOR_READER(Int32,jint,Int)
621dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas HuberDEFINE_PARCEL_VECTOR_READER(Int64,jlong,Long)
622dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas HuberDEFINE_PARCEL_VECTOR_READER(Float,jfloat,Float)
623dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas HuberDEFINE_PARCEL_VECTOR_READER(Double,jdouble,Double)
624dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber
62586635bb45ee1ddeb3059a8a925659964c7858cc3Andreas Huberstatic jbooleanArray JHwParcel_native_readBoolVector(
62686635bb45ee1ddeb3059a8a925659964c7858cc3Andreas Huber        JNIEnv *env, jobject thiz) {
62786635bb45ee1ddeb3059a8a925659964c7858cc3Andreas Huber    hardware::Parcel *parcel =
62886635bb45ee1ddeb3059a8a925659964c7858cc3Andreas Huber        JHwParcel::GetNativeContext(env, thiz)->getParcel();
62986635bb45ee1ddeb3059a8a925659964c7858cc3Andreas Huber
63086635bb45ee1ddeb3059a8a925659964c7858cc3Andreas Huber    size_t parentHandle;
63186635bb45ee1ddeb3059a8a925659964c7858cc3Andreas Huber
63286635bb45ee1ddeb3059a8a925659964c7858cc3Andreas Huber    const hidl_vec<bool> *vec =
63386635bb45ee1ddeb3059a8a925659964c7858cc3Andreas Huber        (const hidl_vec<bool> *)parcel->readBuffer(&parentHandle);
63486635bb45ee1ddeb3059a8a925659964c7858cc3Andreas Huber
63586635bb45ee1ddeb3059a8a925659964c7858cc3Andreas Huber    if (vec == NULL) {
63686635bb45ee1ddeb3059a8a925659964c7858cc3Andreas Huber        signalExceptionForError(env, UNKNOWN_ERROR);
63786635bb45ee1ddeb3059a8a925659964c7858cc3Andreas Huber        return NULL;
63886635bb45ee1ddeb3059a8a925659964c7858cc3Andreas Huber    }
63986635bb45ee1ddeb3059a8a925659964c7858cc3Andreas Huber
64086635bb45ee1ddeb3059a8a925659964c7858cc3Andreas Huber    size_t childHandle;
64186635bb45ee1ddeb3059a8a925659964c7858cc3Andreas Huber
64286635bb45ee1ddeb3059a8a925659964c7858cc3Andreas Huber    status_t err = const_cast<hidl_vec<bool> *>(vec)
64386635bb45ee1ddeb3059a8a925659964c7858cc3Andreas Huber        ->readEmbeddedFromParcel(
64486635bb45ee1ddeb3059a8a925659964c7858cc3Andreas Huber                *parcel,
64586635bb45ee1ddeb3059a8a925659964c7858cc3Andreas Huber                parentHandle,
64686635bb45ee1ddeb3059a8a925659964c7858cc3Andreas Huber                0 /* parentOffset */,
64786635bb45ee1ddeb3059a8a925659964c7858cc3Andreas Huber                &childHandle);
64886635bb45ee1ddeb3059a8a925659964c7858cc3Andreas Huber
64986635bb45ee1ddeb3059a8a925659964c7858cc3Andreas Huber    if (err != OK) {
65086635bb45ee1ddeb3059a8a925659964c7858cc3Andreas Huber        signalExceptionForError(env, err);
65186635bb45ee1ddeb3059a8a925659964c7858cc3Andreas Huber        return NULL;
65286635bb45ee1ddeb3059a8a925659964c7858cc3Andreas Huber    }
65386635bb45ee1ddeb3059a8a925659964c7858cc3Andreas Huber
65486635bb45ee1ddeb3059a8a925659964c7858cc3Andreas Huber    jbooleanArray valObj = env->NewBooleanArray(vec->size());
65586635bb45ee1ddeb3059a8a925659964c7858cc3Andreas Huber
65686635bb45ee1ddeb3059a8a925659964c7858cc3Andreas Huber    for (size_t i = 0; i < vec->size(); ++i) {
65786635bb45ee1ddeb3059a8a925659964c7858cc3Andreas Huber        jboolean x = (*vec)[i];
65886635bb45ee1ddeb3059a8a925659964c7858cc3Andreas Huber        env->SetBooleanArrayRegion(valObj, i, 1, &x);
65986635bb45ee1ddeb3059a8a925659964c7858cc3Andreas Huber    }
66086635bb45ee1ddeb3059a8a925659964c7858cc3Andreas Huber
66186635bb45ee1ddeb3059a8a925659964c7858cc3Andreas Huber    return valObj;
66286635bb45ee1ddeb3059a8a925659964c7858cc3Andreas Huber}
66386635bb45ee1ddeb3059a8a925659964c7858cc3Andreas Huber
664dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huberstatic jobjectArray MakeStringArray(
665dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber        JNIEnv *env, const hidl_string *array, size_t size) {
666dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber    ScopedLocalRef<jclass> stringKlass(
667dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber            env,
668dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber            env->FindClass("java/lang/String"));
669dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber
670dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber    // XXX Why can't I use ScopedLocalRef<> for the arrayObj and the stringObjs?
671dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber
672dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber    jobjectArray arrayObj = env->NewObjectArray(size, stringKlass.get(), NULL);
673dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber
674dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber    for (size_t i = 0; i < size; ++i) {
675dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber        jstring stringObj = MakeStringObjFromHidlString(env, array[i]);
676dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber
677dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber        env->SetObjectArrayElement(
678dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber                arrayObj,
679dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber                i,
680dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber                stringObj);
681dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber    }
682dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber
683dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber    return arrayObj;
684dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber}
685dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber
686dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huberstatic jobjectArray JHwParcel_native_readStringVector(
687dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber        JNIEnv *env, jobject thiz) {
688dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber    typedef hidl_vec<hidl_string> string_vec;
689dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber
690dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber    hardware::Parcel *parcel =
691dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber        JHwParcel::GetNativeContext(env, thiz)->getParcel();
692dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber
693dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber    size_t parentHandle;
694dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber
695dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber    const string_vec *vec=
696dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber        (const string_vec *)parcel->readBuffer(&parentHandle);
697dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber
698dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber    if (vec == NULL) {
699dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber        signalExceptionForError(env, UNKNOWN_ERROR);
700dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber        return NULL;
701dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber    }
702dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber
703dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber    size_t childHandle;
704dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber    status_t err = const_cast<string_vec *>(vec)->readEmbeddedFromParcel(
705dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber            *parcel, parentHandle, 0 /* parentOffset */, &childHandle);
706dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber
707dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber    for (size_t i = 0; (err == OK) && (i < vec->size()); ++i) {
708dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber        err = const_cast<hidl_vec<hidl_string> *>(vec)
709dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber            ->readEmbeddedFromParcel(
710dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber                    *parcel,
711dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber                    childHandle,
712dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber                    i * sizeof(hidl_string),
713dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber                    nullptr /* childHandle */);
714dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber    }
715dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber
716dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber    if (err != OK) {
717dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber        signalExceptionForError(env, err);
718dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber        return NULL;
719dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber    }
720dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber
721dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber    return MakeStringArray(env, &(*vec)[0], vec->size());
722dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber}
723dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber
724dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huberstatic void JHwParcel_native_writeStringVector(
725dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber        JNIEnv *env, jobject thiz, jobjectArray arrayObj) {
726dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber    typedef hidl_vec<hidl_string> string_vec;
727dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber
728dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber    if (arrayObj == NULL) {
729dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber        jniThrowException(env, "java/lang/NullPointerException", NULL);
730dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber        return;
731dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber    }
732dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber
733dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber    jsize len = env->GetArrayLength(arrayObj);
734dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber
735dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber    sp<JHwParcel> impl = JHwParcel::GetNativeContext(env, thiz);
736dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber
7379266f9928d5b3431982cd04f4d6946b70f40766aAndreas Huber    void *vecPtr =
7389266f9928d5b3431982cd04f4d6946b70f40766aAndreas Huber        impl->getStorage()->allocTemporaryStorage(sizeof(string_vec));
7399266f9928d5b3431982cd04f4d6946b70f40766aAndreas Huber
7409266f9928d5b3431982cd04f4d6946b70f40766aAndreas Huber    string_vec *vec = new (vecPtr) string_vec;
741dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber
742dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber    hidl_string *strings = impl->getStorage()->allocStringArray(len);
743dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber    vec->setToExternal(strings, len);
744dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber
745dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber    for (jsize i = 0; i < len; ++i) {
746dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber        ScopedLocalRef<jstring> stringObj(
747dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber                env,
748dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber                (jstring)env->GetObjectArrayElement(arrayObj, i));
749dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber
750dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber        const hidl_string *s =
751dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber            impl->getStorage()->allocTemporaryString(env, stringObj.get());
752dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber
753dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber        strings[i].setToExternal(s->c_str(), s->size());
754dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber    }
755dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber
756dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber    hardware::Parcel *parcel = impl->getParcel();
757dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber
758dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber    size_t parentHandle;
759dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber    status_t err = parcel->writeBuffer(vec, sizeof(*vec), &parentHandle);
760dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber
761dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber    if (err == OK) {
762dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber        size_t childHandle;
763dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber        err = vec->writeEmbeddedToParcel(
764dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber                parcel,
765dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber                parentHandle,
766dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber                0 /* parentOffset */,
767dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber                &childHandle);
768dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber
769dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber        for (size_t i = 0; (err == OK) && (i < vec->size()); ++i) {
770dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber            err = (*vec)[i].writeEmbeddedToParcel(
771dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber                    parcel,
772dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber                    childHandle,
773dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber                    i * sizeof(hidl_string));
774dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber        }
775dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber    }
776dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber
777dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber    signalExceptionForError(env, err);
778dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber}
779dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber
780dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huberstatic jobject JHwParcel_native_readStrongBinder(JNIEnv *env, jobject thiz) {
781dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber    hardware::Parcel *parcel =
782dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber        JHwParcel::GetNativeContext(env, thiz)->getParcel();
783dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber
784dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber    sp<hardware::IBinder> binder = parcel->readStrongBinder();
785dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber
786dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber    if (binder == NULL) {
787dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber        return NULL;
788dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber    }
789dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber
790dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber    return JHwRemoteBinder::NewObject(env, binder);
791dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber}
792dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber
7939266f9928d5b3431982cd04f4d6946b70f40766aAndreas Huberstatic jobject JHwParcel_native_readBuffer(JNIEnv *env, jobject thiz) {
7949266f9928d5b3431982cd04f4d6946b70f40766aAndreas Huber    hardware::Parcel *parcel =
7959266f9928d5b3431982cd04f4d6946b70f40766aAndreas Huber        JHwParcel::GetNativeContext(env, thiz)->getParcel();
7969266f9928d5b3431982cd04f4d6946b70f40766aAndreas Huber
7979266f9928d5b3431982cd04f4d6946b70f40766aAndreas Huber    size_t handle;
7989266f9928d5b3431982cd04f4d6946b70f40766aAndreas Huber    const void *ptr = parcel->readBuffer(&handle);
7999266f9928d5b3431982cd04f4d6946b70f40766aAndreas Huber
8009266f9928d5b3431982cd04f4d6946b70f40766aAndreas Huber    if (ptr == nullptr) {
8019266f9928d5b3431982cd04f4d6946b70f40766aAndreas Huber        jniThrowException(env, "java/util/NoSuchElementException", NULL);
8029266f9928d5b3431982cd04f4d6946b70f40766aAndreas Huber        return nullptr;
8039266f9928d5b3431982cd04f4d6946b70f40766aAndreas Huber    }
8049266f9928d5b3431982cd04f4d6946b70f40766aAndreas Huber
8059266f9928d5b3431982cd04f4d6946b70f40766aAndreas Huber    return JHwBlob::NewObject(env, ptr, handle);
8069266f9928d5b3431982cd04f4d6946b70f40766aAndreas Huber}
8079266f9928d5b3431982cd04f4d6946b70f40766aAndreas Huber
8089266f9928d5b3431982cd04f4d6946b70f40766aAndreas Huberstatic jobject JHwParcel_native_readEmbeddedBuffer(
8099266f9928d5b3431982cd04f4d6946b70f40766aAndreas Huber        JNIEnv *env, jobject thiz, jlong parentHandle, jlong offset) {
8109266f9928d5b3431982cd04f4d6946b70f40766aAndreas Huber    hardware::Parcel *parcel =
8119266f9928d5b3431982cd04f4d6946b70f40766aAndreas Huber        JHwParcel::GetNativeContext(env, thiz)->getParcel();
8129266f9928d5b3431982cd04f4d6946b70f40766aAndreas Huber
8139266f9928d5b3431982cd04f4d6946b70f40766aAndreas Huber    size_t childHandle;
8149266f9928d5b3431982cd04f4d6946b70f40766aAndreas Huber
8159266f9928d5b3431982cd04f4d6946b70f40766aAndreas Huber    const void *ptr =
8169266f9928d5b3431982cd04f4d6946b70f40766aAndreas Huber        parcel->readEmbeddedBuffer(&childHandle, parentHandle, offset);
8179266f9928d5b3431982cd04f4d6946b70f40766aAndreas Huber
8189266f9928d5b3431982cd04f4d6946b70f40766aAndreas Huber    if (ptr == nullptr) {
8199266f9928d5b3431982cd04f4d6946b70f40766aAndreas Huber        jniThrowException(env, "java/util/NoSuchElementException", NULL);
8209266f9928d5b3431982cd04f4d6946b70f40766aAndreas Huber        return 0;
8219266f9928d5b3431982cd04f4d6946b70f40766aAndreas Huber    }
8229266f9928d5b3431982cd04f4d6946b70f40766aAndreas Huber
8239266f9928d5b3431982cd04f4d6946b70f40766aAndreas Huber    return JHwBlob::NewObject(env, ptr, childHandle);
8249266f9928d5b3431982cd04f4d6946b70f40766aAndreas Huber}
8259266f9928d5b3431982cd04f4d6946b70f40766aAndreas Huber
8269266f9928d5b3431982cd04f4d6946b70f40766aAndreas Huberstatic void JHwParcel_native_writeBuffer(
8279266f9928d5b3431982cd04f4d6946b70f40766aAndreas Huber        JNIEnv *env, jobject thiz, jobject blobObj) {
8289266f9928d5b3431982cd04f4d6946b70f40766aAndreas Huber    if (blobObj == nullptr) {
8299266f9928d5b3431982cd04f4d6946b70f40766aAndreas Huber        jniThrowException(env, "java/lang/NullPointerException", NULL);
8309266f9928d5b3431982cd04f4d6946b70f40766aAndreas Huber        return;
8319266f9928d5b3431982cd04f4d6946b70f40766aAndreas Huber    }
8329266f9928d5b3431982cd04f4d6946b70f40766aAndreas Huber
8339266f9928d5b3431982cd04f4d6946b70f40766aAndreas Huber    hardware::Parcel *parcel =
8349266f9928d5b3431982cd04f4d6946b70f40766aAndreas Huber        JHwParcel::GetNativeContext(env, thiz)->getParcel();
8359266f9928d5b3431982cd04f4d6946b70f40766aAndreas Huber
8369266f9928d5b3431982cd04f4d6946b70f40766aAndreas Huber    sp<JHwBlob> blob = JHwBlob::GetNativeContext(env, blobObj);
8379266f9928d5b3431982cd04f4d6946b70f40766aAndreas Huber    status_t err = blob->writeToParcel(parcel);
8389266f9928d5b3431982cd04f4d6946b70f40766aAndreas Huber
8399266f9928d5b3431982cd04f4d6946b70f40766aAndreas Huber    if (err != OK) {
8409266f9928d5b3431982cd04f4d6946b70f40766aAndreas Huber        signalExceptionForError(env, err);
8419266f9928d5b3431982cd04f4d6946b70f40766aAndreas Huber    }
8429266f9928d5b3431982cd04f4d6946b70f40766aAndreas Huber}
8439266f9928d5b3431982cd04f4d6946b70f40766aAndreas Huber
844dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huberstatic JNINativeMethod gMethods[] = {
845dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber    { "native_init", "()J", (void *)JHwParcel_native_init },
846dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber    { "native_setup", "(Z)V", (void *)JHwParcel_native_setup },
847dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber
848dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber    { "writeInterfaceToken", "(Ljava/lang/String;)V",
849dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber        (void *)JHwParcel_native_writeInterfaceToken },
850dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber
85186635bb45ee1ddeb3059a8a925659964c7858cc3Andreas Huber    { "writeBool", "(Z)V", (void *)JHwParcel_native_writeBool },
852dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber    { "writeInt8", "(B)V", (void *)JHwParcel_native_writeInt8 },
853dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber    { "writeInt16", "(S)V", (void *)JHwParcel_native_writeInt16 },
854dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber    { "writeInt32", "(I)V", (void *)JHwParcel_native_writeInt32 },
855dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber    { "writeInt64", "(J)V", (void *)JHwParcel_native_writeInt64 },
856dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber    { "writeFloat", "(F)V", (void *)JHwParcel_native_writeFloat },
857dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber    { "writeDouble", "(D)V", (void *)JHwParcel_native_writeDouble },
858dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber
859dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber    { "writeString", "(Ljava/lang/String;)V",
860dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber        (void *)JHwParcel_native_writeString },
861dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber
86286635bb45ee1ddeb3059a8a925659964c7858cc3Andreas Huber    { "writeBoolVector", "([Z)V", (void *)JHwParcel_native_writeBoolVector },
863dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber    { "writeInt8Vector", "([B)V", (void *)JHwParcel_native_writeInt8Vector },
864dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber    { "writeInt16Vector", "([S)V", (void *)JHwParcel_native_writeInt16Vector },
865dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber    { "writeInt32Vector", "([I)V", (void *)JHwParcel_native_writeInt32Vector },
866dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber    { "writeInt64Vector", "([J)V", (void *)JHwParcel_native_writeInt64Vector },
867dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber    { "writeFloatVector", "([F)V", (void *)JHwParcel_native_writeFloatVector },
868dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber
869dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber    { "writeDoubleVector", "([D)V",
870dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber        (void *)JHwParcel_native_writeDoubleVector },
871dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber
872dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber    { "writeStringVector", "([Ljava/lang/String;)V",
873dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber        (void *)JHwParcel_native_writeStringVector },
874dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber
875dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber    { "writeStrongBinder", "(L" PACKAGE_PATH "/IHwBinder;)V",
876dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber        (void *)JHwParcel_native_writeStrongBinder },
877dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber
878dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber    { "enforceInterface", "(Ljava/lang/String;)V",
879dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber        (void *)JHwParcel_native_enforceInterface },
880dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber
88186635bb45ee1ddeb3059a8a925659964c7858cc3Andreas Huber    { "readBool", "()Z", (void *)JHwParcel_native_readBool },
882dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber    { "readInt8", "()B", (void *)JHwParcel_native_readInt8 },
883dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber    { "readInt16", "()S", (void *)JHwParcel_native_readInt16 },
884dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber    { "readInt32", "()I", (void *)JHwParcel_native_readInt32 },
885dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber    { "readInt64", "()J", (void *)JHwParcel_native_readInt64 },
886dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber    { "readFloat", "()F", (void *)JHwParcel_native_readFloat },
887dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber    { "readDouble", "()D", (void *)JHwParcel_native_readDouble },
888dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber
889dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber    { "readString", "()Ljava/lang/String;",
890dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber        (void *)JHwParcel_native_readString },
891dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber
892ef1a565bd4e96646e6848a6a40a53ee4dfe33293Andreas Huber    { "readBoolVectorAsArray", "()[Z",
893ef1a565bd4e96646e6848a6a40a53ee4dfe33293Andreas Huber        (void *)JHwParcel_native_readBoolVector },
894ef1a565bd4e96646e6848a6a40a53ee4dfe33293Andreas Huber
895ef1a565bd4e96646e6848a6a40a53ee4dfe33293Andreas Huber    { "readInt8VectorAsArray", "()[B",
896ef1a565bd4e96646e6848a6a40a53ee4dfe33293Andreas Huber        (void *)JHwParcel_native_readInt8Vector },
897ef1a565bd4e96646e6848a6a40a53ee4dfe33293Andreas Huber
898ef1a565bd4e96646e6848a6a40a53ee4dfe33293Andreas Huber    { "readInt16VectorAsArray", "()[S",
899ef1a565bd4e96646e6848a6a40a53ee4dfe33293Andreas Huber        (void *)JHwParcel_native_readInt16Vector },
900ef1a565bd4e96646e6848a6a40a53ee4dfe33293Andreas Huber
901ef1a565bd4e96646e6848a6a40a53ee4dfe33293Andreas Huber    { "readInt32VectorAsArray", "()[I",
902ef1a565bd4e96646e6848a6a40a53ee4dfe33293Andreas Huber        (void *)JHwParcel_native_readInt32Vector },
903ef1a565bd4e96646e6848a6a40a53ee4dfe33293Andreas Huber
904ef1a565bd4e96646e6848a6a40a53ee4dfe33293Andreas Huber    { "readInt64VectorAsArray", "()[J",
905ef1a565bd4e96646e6848a6a40a53ee4dfe33293Andreas Huber        (void *)JHwParcel_native_readInt64Vector },
906ef1a565bd4e96646e6848a6a40a53ee4dfe33293Andreas Huber
907ef1a565bd4e96646e6848a6a40a53ee4dfe33293Andreas Huber    { "readFloatVectorAsArray", "()[F",
908ef1a565bd4e96646e6848a6a40a53ee4dfe33293Andreas Huber        (void *)JHwParcel_native_readFloatVector },
909ef1a565bd4e96646e6848a6a40a53ee4dfe33293Andreas Huber
910ef1a565bd4e96646e6848a6a40a53ee4dfe33293Andreas Huber    { "readDoubleVectorAsArray", "()[D",
911ef1a565bd4e96646e6848a6a40a53ee4dfe33293Andreas Huber        (void *)JHwParcel_native_readDoubleVector },
912ef1a565bd4e96646e6848a6a40a53ee4dfe33293Andreas Huber
913ef1a565bd4e96646e6848a6a40a53ee4dfe33293Andreas Huber    { "readStringVectorAsArray", "()[Ljava/lang/String;",
914dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber        (void *)JHwParcel_native_readStringVector },
915dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber
916dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber    { "readStrongBinder", "()L" PACKAGE_PATH "/IHwBinder;",
917dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber        (void *)JHwParcel_native_readStrongBinder },
918dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber
919dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber    { "writeStatus", "(I)V", (void *)JHwParcel_native_writeStatus },
920dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber
921dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber    { "verifySuccess", "()V", (void *)JHwParcel_native_verifySuccess },
922dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber
923dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber    { "releaseTemporaryStorage", "()V",
924dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber        (void *)JHwParcel_native_releaseTemporaryStorage },
925dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber
926dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber    { "send", "()V", (void *)JHwParcel_native_send },
9279266f9928d5b3431982cd04f4d6946b70f40766aAndreas Huber
9289266f9928d5b3431982cd04f4d6946b70f40766aAndreas Huber    { "readBuffer", "()L" PACKAGE_PATH "/HwBlob;",
9299266f9928d5b3431982cd04f4d6946b70f40766aAndreas Huber        (void *)JHwParcel_native_readBuffer },
9309266f9928d5b3431982cd04f4d6946b70f40766aAndreas Huber
9319266f9928d5b3431982cd04f4d6946b70f40766aAndreas Huber    { "readEmbeddedBuffer", "(JJ)L" PACKAGE_PATH "/HwBlob;",
9329266f9928d5b3431982cd04f4d6946b70f40766aAndreas Huber        (void *)JHwParcel_native_readEmbeddedBuffer },
9339266f9928d5b3431982cd04f4d6946b70f40766aAndreas Huber
9349266f9928d5b3431982cd04f4d6946b70f40766aAndreas Huber    { "writeBuffer", "(L" PACKAGE_PATH "/HwBlob;)V",
9359266f9928d5b3431982cd04f4d6946b70f40766aAndreas Huber        (void *)JHwParcel_native_writeBuffer },
936dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber};
937dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber
938dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Hubernamespace android {
939dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber
940dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huberint register_android_os_HwParcel(JNIEnv *env) {
941dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber    return RegisterMethodsOrDie(env, CLASS_PATH, gMethods, NELEM(gMethods));
942dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber}
943dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber
944dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber}  // namespace android
945