android_os_Parcel.cpp revision 0a7a913683cb52cc847d52e4217b6637646a3c49
1d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey/* 2d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey * Copyright (C) 2012 The Android Open Source Project 3d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey * 4d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey * Licensed under the Apache License, Version 2.0 (the "License"); 5d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey * you may not use this file except in compliance with the License. 6d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey * You may obtain a copy of the License at 7d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey * 8d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey * http://www.apache.org/licenses/LICENSE-2.0 9d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey * 10d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey * Unless required by applicable law or agreed to in writing, software 11d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey * distributed under the License is distributed on an "AS IS" BASIS, 12d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey * See the License for the specific language governing permissions and 14d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey * limitations under the License. 15d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey */ 16d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey 17d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey#define LOG_TAG "Parcel" 18d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey//#define LOG_NDEBUG 0 19d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey 20d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey#include "android_os_Parcel.h" 21d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey#include "android_util_Binder.h" 22d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey 23d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey#include "JNIHelp.h" 24d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey 25d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey#include <fcntl.h> 26d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey#include <stdio.h> 27d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey#include <sys/stat.h> 28d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey#include <sys/types.h> 29d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey#include <unistd.h> 30d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey 31d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey#include <utils/Atomic.h> 32d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey#include <binder/IInterface.h> 33d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey#include <binder/IPCThreadState.h> 34d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey#include <utils/Log.h> 35d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey#include <utils/SystemClock.h> 36d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey#include <utils/List.h> 37d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey#include <utils/KeyedVector.h> 38d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey#include <binder/Parcel.h> 39d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey#include <binder/ProcessState.h> 40d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey#include <binder/IServiceManager.h> 41d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey#include <utils/threads.h> 42d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey#include <utils/String8.h> 43d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey 44d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey#include <ScopedUtfChars.h> 45d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey#include <ScopedLocalRef.h> 46d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey 47d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey#include <android_runtime/AndroidRuntime.h> 48d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey 49987f79f60bb1f0a4bcd3ef22e57301c743f0b94fAndreas Gampe#include "core_jni_helpers.h" 50987f79f60bb1f0a4bcd3ef22e57301c743f0b94fAndreas Gampe 51d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey//#undef ALOGV 52d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey//#define ALOGV(...) fprintf(stderr, __VA_ARGS__) 53d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey 54d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey#define DEBUG_DEATH 0 55d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey#if DEBUG_DEATH 56d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey#define LOGDEATH ALOGD 57d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey#else 58d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey#define LOGDEATH ALOGV 59d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey#endif 60d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey 61d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkeynamespace android { 62d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey 63d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkeystatic struct parcel_offsets_t 64d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey{ 658902097bb686752ff207e3bda12713be1a8c74ebInsun Kang jclass clazz; 66047238ced42eea812de9d39a9f32e94d002bfa5cJeff Sharkey jfieldID mNativePtr; 678902097bb686752ff207e3bda12713be1a8c74ebInsun Kang jmethodID obtain; 688902097bb686752ff207e3bda12713be1a8c74ebInsun Kang jmethodID recycle; 69d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey} gParcelOffsets; 70d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey 71d84e1ce0b535128f03416145554fb405f9fade3eJeff SharkeyParcel* parcelForJavaObject(JNIEnv* env, jobject obj) 72d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey{ 73d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey if (obj) { 748ab665dda40ab10e60fc69392022171f454af530Ashok Bhat Parcel* p = (Parcel*)env->GetLongField(obj, gParcelOffsets.mNativePtr); 75d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey if (p != NULL) { 76d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey return p; 77d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey } 78d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey jniThrowException(env, "java/lang/IllegalStateException", "Parcel has been finalized!"); 79d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey } 80d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey return NULL; 81d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey} 82d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey 838902097bb686752ff207e3bda12713be1a8c74ebInsun Kangjobject createJavaParcelObject(JNIEnv* env) 848902097bb686752ff207e3bda12713be1a8c74ebInsun Kang{ 858902097bb686752ff207e3bda12713be1a8c74ebInsun Kang return env->CallStaticObjectMethod(gParcelOffsets.clazz, gParcelOffsets.obtain); 868902097bb686752ff207e3bda12713be1a8c74ebInsun Kang} 878902097bb686752ff207e3bda12713be1a8c74ebInsun Kang 888902097bb686752ff207e3bda12713be1a8c74ebInsun Kangvoid recycleJavaParcelObject(JNIEnv* env, jobject parcelObj) 898902097bb686752ff207e3bda12713be1a8c74ebInsun Kang{ 908902097bb686752ff207e3bda12713be1a8c74ebInsun Kang env->CallVoidMethod(parcelObj, gParcelOffsets.recycle); 918902097bb686752ff207e3bda12713be1a8c74ebInsun Kang} 928902097bb686752ff207e3bda12713be1a8c74ebInsun Kang 938ab665dda40ab10e60fc69392022171f454af530Ashok Bhatstatic jint android_os_Parcel_dataSize(JNIEnv* env, jclass clazz, jlong nativePtr) 94d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey{ 95047238ced42eea812de9d39a9f32e94d002bfa5cJeff Sharkey Parcel* parcel = reinterpret_cast<Parcel*>(nativePtr); 96d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey return parcel ? parcel->dataSize() : 0; 97d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey} 98d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey 998ab665dda40ab10e60fc69392022171f454af530Ashok Bhatstatic jint android_os_Parcel_dataAvail(JNIEnv* env, jclass clazz, jlong nativePtr) 100d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey{ 101047238ced42eea812de9d39a9f32e94d002bfa5cJeff Sharkey Parcel* parcel = reinterpret_cast<Parcel*>(nativePtr); 102d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey return parcel ? parcel->dataAvail() : 0; 103d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey} 104d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey 1058ab665dda40ab10e60fc69392022171f454af530Ashok Bhatstatic jint android_os_Parcel_dataPosition(JNIEnv* env, jclass clazz, jlong nativePtr) 106d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey{ 107047238ced42eea812de9d39a9f32e94d002bfa5cJeff Sharkey Parcel* parcel = reinterpret_cast<Parcel*>(nativePtr); 108d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey return parcel ? parcel->dataPosition() : 0; 109d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey} 110d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey 1118ab665dda40ab10e60fc69392022171f454af530Ashok Bhatstatic jint android_os_Parcel_dataCapacity(JNIEnv* env, jclass clazz, jlong nativePtr) 112d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey{ 113047238ced42eea812de9d39a9f32e94d002bfa5cJeff Sharkey Parcel* parcel = reinterpret_cast<Parcel*>(nativePtr); 114d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey return parcel ? parcel->dataCapacity() : 0; 115d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey} 116d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey 1170450565d9a6de0f0828c9ad8ce16c8645c6f394cAdrian Roosstatic jlong android_os_Parcel_setDataSize(JNIEnv* env, jclass clazz, jlong nativePtr, jint size) 118d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey{ 119047238ced42eea812de9d39a9f32e94d002bfa5cJeff Sharkey Parcel* parcel = reinterpret_cast<Parcel*>(nativePtr); 120d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey if (parcel != NULL) { 121d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey const status_t err = parcel->setDataSize(size); 122d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey if (err != NO_ERROR) { 123d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey signalExceptionForError(env, clazz, err); 124d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey } 1250450565d9a6de0f0828c9ad8ce16c8645c6f394cAdrian Roos return parcel->getOpenAshmemSize(); 126d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey } 1270450565d9a6de0f0828c9ad8ce16c8645c6f394cAdrian Roos return 0; 128d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey} 129d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey 1308ab665dda40ab10e60fc69392022171f454af530Ashok Bhatstatic void android_os_Parcel_setDataPosition(JNIEnv* env, jclass clazz, jlong nativePtr, jint pos) 131d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey{ 132047238ced42eea812de9d39a9f32e94d002bfa5cJeff Sharkey Parcel* parcel = reinterpret_cast<Parcel*>(nativePtr); 133d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey if (parcel != NULL) { 134d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey parcel->setDataPosition(pos); 135d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey } 136d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey} 137d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey 1388ab665dda40ab10e60fc69392022171f454af530Ashok Bhatstatic void android_os_Parcel_setDataCapacity(JNIEnv* env, jclass clazz, jlong nativePtr, jint size) 139d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey{ 140047238ced42eea812de9d39a9f32e94d002bfa5cJeff Sharkey Parcel* parcel = reinterpret_cast<Parcel*>(nativePtr); 141d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey if (parcel != NULL) { 142d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey const status_t err = parcel->setDataCapacity(size); 143d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey if (err != NO_ERROR) { 144d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey signalExceptionForError(env, clazz, err); 145d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey } 146d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey } 147d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey} 148d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey 1498ab665dda40ab10e60fc69392022171f454af530Ashok Bhatstatic jboolean android_os_Parcel_pushAllowFds(JNIEnv* env, jclass clazz, jlong nativePtr, jboolean allowFds) 150d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey{ 151047238ced42eea812de9d39a9f32e94d002bfa5cJeff Sharkey Parcel* parcel = reinterpret_cast<Parcel*>(nativePtr); 152d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey jboolean ret = JNI_TRUE; 153d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey if (parcel != NULL) { 154d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey ret = (jboolean)parcel->pushAllowFds(allowFds); 155d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey } 156d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey return ret; 157d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey} 158d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey 1598ab665dda40ab10e60fc69392022171f454af530Ashok Bhatstatic void android_os_Parcel_restoreAllowFds(JNIEnv* env, jclass clazz, jlong nativePtr, jboolean lastValue) 160d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey{ 161047238ced42eea812de9d39a9f32e94d002bfa5cJeff Sharkey Parcel* parcel = reinterpret_cast<Parcel*>(nativePtr); 162d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey if (parcel != NULL) { 163d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey parcel->restoreAllowFds((bool)lastValue); 164d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey } 165d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey} 166d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey 1678ab665dda40ab10e60fc69392022171f454af530Ashok Bhatstatic void android_os_Parcel_writeNative(JNIEnv* env, jclass clazz, jlong nativePtr, jobject data, 168047238ced42eea812de9d39a9f32e94d002bfa5cJeff Sharkey jint offset, jint length) 169d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey{ 170047238ced42eea812de9d39a9f32e94d002bfa5cJeff Sharkey Parcel* parcel = reinterpret_cast<Parcel*>(nativePtr); 171d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey if (parcel == NULL) { 172d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey return; 173d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey } 174d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey 175d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey const status_t err = parcel->writeInt32(length); 176d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey if (err != NO_ERROR) { 177d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey signalExceptionForError(env, clazz, err); 178d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey return; 179d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey } 180d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey 181d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey void* dest = parcel->writeInplace(length); 182d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey if (dest == NULL) { 183d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey signalExceptionForError(env, clazz, NO_MEMORY); 184d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey return; 185d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey } 186d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey 187d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey jbyte* ar = (jbyte*)env->GetPrimitiveArrayCritical((jarray)data, 0); 188d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey if (ar) { 189d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey memcpy(dest, ar + offset, length); 190d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey env->ReleasePrimitiveArrayCritical((jarray)data, ar, 0); 191d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey } 192d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey} 193d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey 19490d7a3e996ee3a6e33e655341c5d301fbe30cd58Sandeep Siddharthastatic void android_os_Parcel_writeBlob(JNIEnv* env, jclass clazz, jlong nativePtr, jobject data, 19590d7a3e996ee3a6e33e655341c5d301fbe30cd58Sandeep Siddhartha jint offset, jint length) { 19690d7a3e996ee3a6e33e655341c5d301fbe30cd58Sandeep Siddhartha Parcel* parcel = reinterpret_cast<Parcel*>(nativePtr); 19790d7a3e996ee3a6e33e655341c5d301fbe30cd58Sandeep Siddhartha if (parcel == NULL) { 19890d7a3e996ee3a6e33e655341c5d301fbe30cd58Sandeep Siddhartha return; 19990d7a3e996ee3a6e33e655341c5d301fbe30cd58Sandeep Siddhartha } 20090d7a3e996ee3a6e33e655341c5d301fbe30cd58Sandeep Siddhartha 20139c12fab49075b715c253c68c84b5c10c3150197Sandeep Siddhartha if (data == NULL) { 20239c12fab49075b715c253c68c84b5c10c3150197Sandeep Siddhartha const status_t err = parcel->writeInt32(-1); 20339c12fab49075b715c253c68c84b5c10c3150197Sandeep Siddhartha if (err != NO_ERROR) { 20439c12fab49075b715c253c68c84b5c10c3150197Sandeep Siddhartha signalExceptionForError(env, clazz, err); 20539c12fab49075b715c253c68c84b5c10c3150197Sandeep Siddhartha } 20639c12fab49075b715c253c68c84b5c10c3150197Sandeep Siddhartha return; 20739c12fab49075b715c253c68c84b5c10c3150197Sandeep Siddhartha } 20839c12fab49075b715c253c68c84b5c10c3150197Sandeep Siddhartha 20990d7a3e996ee3a6e33e655341c5d301fbe30cd58Sandeep Siddhartha const status_t err = parcel->writeInt32(length); 21090d7a3e996ee3a6e33e655341c5d301fbe30cd58Sandeep Siddhartha if (err != NO_ERROR) { 21190d7a3e996ee3a6e33e655341c5d301fbe30cd58Sandeep Siddhartha signalExceptionForError(env, clazz, err); 21290d7a3e996ee3a6e33e655341c5d301fbe30cd58Sandeep Siddhartha return; 21390d7a3e996ee3a6e33e655341c5d301fbe30cd58Sandeep Siddhartha } 21490d7a3e996ee3a6e33e655341c5d301fbe30cd58Sandeep Siddhartha 21590d7a3e996ee3a6e33e655341c5d301fbe30cd58Sandeep Siddhartha android::Parcel::WritableBlob blob; 216a316c5dfbc6355f536d765959cacb06bbfed76adJeff Brown android::status_t err2 = parcel->writeBlob(length, false, &blob); 21790d7a3e996ee3a6e33e655341c5d301fbe30cd58Sandeep Siddhartha if (err2 != NO_ERROR) { 21890d7a3e996ee3a6e33e655341c5d301fbe30cd58Sandeep Siddhartha signalExceptionForError(env, clazz, err2); 21990d7a3e996ee3a6e33e655341c5d301fbe30cd58Sandeep Siddhartha return; 22090d7a3e996ee3a6e33e655341c5d301fbe30cd58Sandeep Siddhartha } 22190d7a3e996ee3a6e33e655341c5d301fbe30cd58Sandeep Siddhartha 22290d7a3e996ee3a6e33e655341c5d301fbe30cd58Sandeep Siddhartha jbyte* ar = (jbyte*)env->GetPrimitiveArrayCritical((jarray)data, 0); 22390d7a3e996ee3a6e33e655341c5d301fbe30cd58Sandeep Siddhartha if (ar == NULL) { 22490d7a3e996ee3a6e33e655341c5d301fbe30cd58Sandeep Siddhartha memset(blob.data(), 0, length); 22590d7a3e996ee3a6e33e655341c5d301fbe30cd58Sandeep Siddhartha } else { 22690d7a3e996ee3a6e33e655341c5d301fbe30cd58Sandeep Siddhartha memcpy(blob.data(), ar + offset, length); 22790d7a3e996ee3a6e33e655341c5d301fbe30cd58Sandeep Siddhartha env->ReleasePrimitiveArrayCritical((jarray)data, ar, 0); 22890d7a3e996ee3a6e33e655341c5d301fbe30cd58Sandeep Siddhartha } 22990d7a3e996ee3a6e33e655341c5d301fbe30cd58Sandeep Siddhartha 23090d7a3e996ee3a6e33e655341c5d301fbe30cd58Sandeep Siddhartha blob.release(); 23190d7a3e996ee3a6e33e655341c5d301fbe30cd58Sandeep Siddhartha} 23290d7a3e996ee3a6e33e655341c5d301fbe30cd58Sandeep Siddhartha 2338ab665dda40ab10e60fc69392022171f454af530Ashok Bhatstatic void android_os_Parcel_writeInt(JNIEnv* env, jclass clazz, jlong nativePtr, jint val) { 234047238ced42eea812de9d39a9f32e94d002bfa5cJeff Sharkey Parcel* parcel = reinterpret_cast<Parcel*>(nativePtr); 235849ea026824d51761591a18cf6689d755f70bda4Brian Carlstrom if (parcel != NULL) { 236849ea026824d51761591a18cf6689d755f70bda4Brian Carlstrom const status_t err = parcel->writeInt32(val); 237849ea026824d51761591a18cf6689d755f70bda4Brian Carlstrom if (err != NO_ERROR) { 238849ea026824d51761591a18cf6689d755f70bda4Brian Carlstrom signalExceptionForError(env, clazz, err); 239849ea026824d51761591a18cf6689d755f70bda4Brian Carlstrom } 240d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey } 241d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey} 242d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey 2438ab665dda40ab10e60fc69392022171f454af530Ashok Bhatstatic void android_os_Parcel_writeLong(JNIEnv* env, jclass clazz, jlong nativePtr, jlong val) 244d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey{ 245047238ced42eea812de9d39a9f32e94d002bfa5cJeff Sharkey Parcel* parcel = reinterpret_cast<Parcel*>(nativePtr); 246d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey if (parcel != NULL) { 247d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey const status_t err = parcel->writeInt64(val); 248d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey if (err != NO_ERROR) { 249d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey signalExceptionForError(env, clazz, err); 250d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey } 251d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey } 252d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey} 253d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey 2548ab665dda40ab10e60fc69392022171f454af530Ashok Bhatstatic void android_os_Parcel_writeFloat(JNIEnv* env, jclass clazz, jlong nativePtr, jfloat val) 255d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey{ 256047238ced42eea812de9d39a9f32e94d002bfa5cJeff Sharkey Parcel* parcel = reinterpret_cast<Parcel*>(nativePtr); 257d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey if (parcel != NULL) { 258d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey const status_t err = parcel->writeFloat(val); 259d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey if (err != NO_ERROR) { 260d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey signalExceptionForError(env, clazz, err); 261d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey } 262d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey } 263d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey} 264d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey 2658ab665dda40ab10e60fc69392022171f454af530Ashok Bhatstatic void android_os_Parcel_writeDouble(JNIEnv* env, jclass clazz, jlong nativePtr, jdouble val) 266d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey{ 267047238ced42eea812de9d39a9f32e94d002bfa5cJeff Sharkey Parcel* parcel = reinterpret_cast<Parcel*>(nativePtr); 268d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey if (parcel != NULL) { 269d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey const status_t err = parcel->writeDouble(val); 270d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey if (err != NO_ERROR) { 271d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey signalExceptionForError(env, clazz, err); 272d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey } 273d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey } 274d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey} 275d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey 2768ab665dda40ab10e60fc69392022171f454af530Ashok Bhatstatic void android_os_Parcel_writeString(JNIEnv* env, jclass clazz, jlong nativePtr, jstring val) 277d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey{ 278047238ced42eea812de9d39a9f32e94d002bfa5cJeff Sharkey Parcel* parcel = reinterpret_cast<Parcel*>(nativePtr); 279d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey if (parcel != NULL) { 280d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey status_t err = NO_MEMORY; 281d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey if (val) { 282d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey const jchar* str = env->GetStringCritical(val, 0); 283d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey if (str) { 2846698749dd4d4d6513b26aa9071af290b956b68a7Dan Albert err = parcel->writeString16( 2856698749dd4d4d6513b26aa9071af290b956b68a7Dan Albert reinterpret_cast<const char16_t*>(str), 2866698749dd4d4d6513b26aa9071af290b956b68a7Dan Albert env->GetStringLength(val)); 287d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey env->ReleaseStringCritical(val, str); 288d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey } 289d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey } else { 290d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey err = parcel->writeString16(NULL, 0); 291d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey } 292d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey if (err != NO_ERROR) { 293d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey signalExceptionForError(env, clazz, err); 294d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey } 295d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey } 296d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey} 297d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey 2988ab665dda40ab10e60fc69392022171f454af530Ashok Bhatstatic void android_os_Parcel_writeStrongBinder(JNIEnv* env, jclass clazz, jlong nativePtr, jobject object) 299d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey{ 300047238ced42eea812de9d39a9f32e94d002bfa5cJeff Sharkey Parcel* parcel = reinterpret_cast<Parcel*>(nativePtr); 301d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey if (parcel != NULL) { 302d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey const status_t err = parcel->writeStrongBinder(ibinderForJavaObject(env, object)); 303d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey if (err != NO_ERROR) { 304d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey signalExceptionForError(env, clazz, err); 305d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey } 306d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey } 307d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey} 308d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey 3090450565d9a6de0f0828c9ad8ce16c8645c6f394cAdrian Roosstatic jlong android_os_Parcel_writeFileDescriptor(JNIEnv* env, jclass clazz, jlong nativePtr, jobject object) 310d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey{ 311047238ced42eea812de9d39a9f32e94d002bfa5cJeff Sharkey Parcel* parcel = reinterpret_cast<Parcel*>(nativePtr); 312d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey if (parcel != NULL) { 313d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey const status_t err = 314d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey parcel->writeDupFileDescriptor(jniGetFDFromFileDescriptor(env, object)); 315d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey if (err != NO_ERROR) { 316d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey signalExceptionForError(env, clazz, err); 317d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey } 3180450565d9a6de0f0828c9ad8ce16c8645c6f394cAdrian Roos return parcel->getOpenAshmemSize(); 319d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey } 3200450565d9a6de0f0828c9ad8ce16c8645c6f394cAdrian Roos return 0; 321d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey} 322d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey 3238ab665dda40ab10e60fc69392022171f454af530Ashok Bhatstatic jbyteArray android_os_Parcel_createByteArray(JNIEnv* env, jclass clazz, jlong nativePtr) 324d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey{ 325d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey jbyteArray ret = NULL; 326d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey 327047238ced42eea812de9d39a9f32e94d002bfa5cJeff Sharkey Parcel* parcel = reinterpret_cast<Parcel*>(nativePtr); 328d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey if (parcel != NULL) { 329d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey int32_t len = parcel->readInt32(); 330d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey 331d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey // sanity check the stored length against the true data size 332d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey if (len >= 0 && len <= (int32_t)parcel->dataAvail()) { 333d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey ret = env->NewByteArray(len); 334d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey 335d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey if (ret != NULL) { 336d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey jbyte* a2 = (jbyte*)env->GetPrimitiveArrayCritical(ret, 0); 337d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey if (a2) { 338d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey const void* data = parcel->readInplace(len); 339d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey memcpy(a2, data, len); 340d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey env->ReleasePrimitiveArrayCritical(ret, a2, 0); 341d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey } 342d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey } 343d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey } 344d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey } 345d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey 346d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey return ret; 347d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey} 348d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey 34990d7a3e996ee3a6e33e655341c5d301fbe30cd58Sandeep Siddharthastatic jbyteArray android_os_Parcel_readBlob(JNIEnv* env, jclass clazz, jlong nativePtr) 35090d7a3e996ee3a6e33e655341c5d301fbe30cd58Sandeep Siddhartha{ 35190d7a3e996ee3a6e33e655341c5d301fbe30cd58Sandeep Siddhartha jbyteArray ret = NULL; 35290d7a3e996ee3a6e33e655341c5d301fbe30cd58Sandeep Siddhartha 35390d7a3e996ee3a6e33e655341c5d301fbe30cd58Sandeep Siddhartha Parcel* parcel = reinterpret_cast<Parcel*>(nativePtr); 35490d7a3e996ee3a6e33e655341c5d301fbe30cd58Sandeep Siddhartha if (parcel != NULL) { 35590d7a3e996ee3a6e33e655341c5d301fbe30cd58Sandeep Siddhartha int32_t len = parcel->readInt32(); 35690d7a3e996ee3a6e33e655341c5d301fbe30cd58Sandeep Siddhartha if (len >= 0) { 35790d7a3e996ee3a6e33e655341c5d301fbe30cd58Sandeep Siddhartha android::Parcel::ReadableBlob blob; 35890d7a3e996ee3a6e33e655341c5d301fbe30cd58Sandeep Siddhartha android::status_t err = parcel->readBlob(len, &blob); 35990d7a3e996ee3a6e33e655341c5d301fbe30cd58Sandeep Siddhartha if (err != NO_ERROR) { 36090d7a3e996ee3a6e33e655341c5d301fbe30cd58Sandeep Siddhartha signalExceptionForError(env, clazz, err); 36190d7a3e996ee3a6e33e655341c5d301fbe30cd58Sandeep Siddhartha return NULL; 36290d7a3e996ee3a6e33e655341c5d301fbe30cd58Sandeep Siddhartha } 36390d7a3e996ee3a6e33e655341c5d301fbe30cd58Sandeep Siddhartha 36490d7a3e996ee3a6e33e655341c5d301fbe30cd58Sandeep Siddhartha ret = env->NewByteArray(len); 36590d7a3e996ee3a6e33e655341c5d301fbe30cd58Sandeep Siddhartha if (ret != NULL) { 36690d7a3e996ee3a6e33e655341c5d301fbe30cd58Sandeep Siddhartha jbyte* a2 = (jbyte*)env->GetPrimitiveArrayCritical(ret, 0); 36790d7a3e996ee3a6e33e655341c5d301fbe30cd58Sandeep Siddhartha if (a2) { 36890d7a3e996ee3a6e33e655341c5d301fbe30cd58Sandeep Siddhartha memcpy(a2, blob.data(), len); 36990d7a3e996ee3a6e33e655341c5d301fbe30cd58Sandeep Siddhartha env->ReleasePrimitiveArrayCritical(ret, a2, 0); 37090d7a3e996ee3a6e33e655341c5d301fbe30cd58Sandeep Siddhartha } 37190d7a3e996ee3a6e33e655341c5d301fbe30cd58Sandeep Siddhartha } 37290d7a3e996ee3a6e33e655341c5d301fbe30cd58Sandeep Siddhartha blob.release(); 37390d7a3e996ee3a6e33e655341c5d301fbe30cd58Sandeep Siddhartha } 37490d7a3e996ee3a6e33e655341c5d301fbe30cd58Sandeep Siddhartha } 37590d7a3e996ee3a6e33e655341c5d301fbe30cd58Sandeep Siddhartha 37690d7a3e996ee3a6e33e655341c5d301fbe30cd58Sandeep Siddhartha return ret; 37790d7a3e996ee3a6e33e655341c5d301fbe30cd58Sandeep Siddhartha} 37890d7a3e996ee3a6e33e655341c5d301fbe30cd58Sandeep Siddhartha 3798ab665dda40ab10e60fc69392022171f454af530Ashok Bhatstatic jint android_os_Parcel_readInt(JNIEnv* env, jclass clazz, jlong nativePtr) 380d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey{ 381047238ced42eea812de9d39a9f32e94d002bfa5cJeff Sharkey Parcel* parcel = reinterpret_cast<Parcel*>(nativePtr); 382d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey if (parcel != NULL) { 383d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey return parcel->readInt32(); 384d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey } 385d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey return 0; 386d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey} 387d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey 3888ab665dda40ab10e60fc69392022171f454af530Ashok Bhatstatic jlong android_os_Parcel_readLong(JNIEnv* env, jclass clazz, jlong nativePtr) 389d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey{ 390047238ced42eea812de9d39a9f32e94d002bfa5cJeff Sharkey Parcel* parcel = reinterpret_cast<Parcel*>(nativePtr); 391d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey if (parcel != NULL) { 392d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey return parcel->readInt64(); 393d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey } 394d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey return 0; 395d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey} 396d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey 3978ab665dda40ab10e60fc69392022171f454af530Ashok Bhatstatic jfloat android_os_Parcel_readFloat(JNIEnv* env, jclass clazz, jlong nativePtr) 398d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey{ 399047238ced42eea812de9d39a9f32e94d002bfa5cJeff Sharkey Parcel* parcel = reinterpret_cast<Parcel*>(nativePtr); 400d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey if (parcel != NULL) { 401d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey return parcel->readFloat(); 402d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey } 403d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey return 0; 404d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey} 405d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey 4068ab665dda40ab10e60fc69392022171f454af530Ashok Bhatstatic jdouble android_os_Parcel_readDouble(JNIEnv* env, jclass clazz, jlong nativePtr) 407d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey{ 408047238ced42eea812de9d39a9f32e94d002bfa5cJeff Sharkey Parcel* parcel = reinterpret_cast<Parcel*>(nativePtr); 409d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey if (parcel != NULL) { 410d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey return parcel->readDouble(); 411d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey } 412d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey return 0; 413d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey} 414d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey 4158ab665dda40ab10e60fc69392022171f454af530Ashok Bhatstatic jstring android_os_Parcel_readString(JNIEnv* env, jclass clazz, jlong nativePtr) 416d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey{ 417047238ced42eea812de9d39a9f32e94d002bfa5cJeff Sharkey Parcel* parcel = reinterpret_cast<Parcel*>(nativePtr); 418d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey if (parcel != NULL) { 419d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey size_t len; 420d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey const char16_t* str = parcel->readString16Inplace(&len); 421d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey if (str) { 4226698749dd4d4d6513b26aa9071af290b956b68a7Dan Albert return env->NewString(reinterpret_cast<const jchar*>(str), len); 423d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey } 424d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey return NULL; 425d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey } 426d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey return NULL; 427d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey} 428d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey 4298ab665dda40ab10e60fc69392022171f454af530Ashok Bhatstatic jobject android_os_Parcel_readStrongBinder(JNIEnv* env, jclass clazz, jlong nativePtr) 430d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey{ 431047238ced42eea812de9d39a9f32e94d002bfa5cJeff Sharkey Parcel* parcel = reinterpret_cast<Parcel*>(nativePtr); 432d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey if (parcel != NULL) { 433d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey return javaObjectForIBinder(env, parcel->readStrongBinder()); 434d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey } 435d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey return NULL; 436d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey} 437d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey 4388ab665dda40ab10e60fc69392022171f454af530Ashok Bhatstatic jobject android_os_Parcel_readFileDescriptor(JNIEnv* env, jclass clazz, jlong nativePtr) 439d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey{ 440047238ced42eea812de9d39a9f32e94d002bfa5cJeff Sharkey Parcel* parcel = reinterpret_cast<Parcel*>(nativePtr); 441d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey if (parcel != NULL) { 442d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey int fd = parcel->readFileDescriptor(); 443d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey if (fd < 0) return NULL; 444d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey fd = dup(fd); 445d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey if (fd < 0) return NULL; 446d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey return jniCreateFileDescriptor(env, fd); 447d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey } 448d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey return NULL; 449d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey} 450d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey 451047238ced42eea812de9d39a9f32e94d002bfa5cJeff Sharkeystatic jobject android_os_Parcel_openFileDescriptor(JNIEnv* env, jclass clazz, 452d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey jstring name, jint mode) 453d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey{ 454d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey if (name == NULL) { 455d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey jniThrowNullPointerException(env, NULL); 456d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey return NULL; 457d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey } 458d415303c4d02c1d30dd4199bade4694bf2cb4615tao.pei ScopedUtfChars name8(env, name); 459d415303c4d02c1d30dd4199bade4694bf2cb4615tao.pei if (name8.c_str() == NULL) { 460d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey return NULL; 461d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey } 462d415303c4d02c1d30dd4199bade4694bf2cb4615tao.pei 463d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey int flags=0; 464d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey switch (mode&0x30000000) { 465d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey case 0: 466d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey case 0x10000000: 467d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey flags = O_RDONLY; 468d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey break; 469d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey case 0x20000000: 470d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey flags = O_WRONLY; 471d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey break; 472d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey case 0x30000000: 473d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey flags = O_RDWR; 474d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey break; 475d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey } 476d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey 477d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey if (mode&0x08000000) flags |= O_CREAT; 478d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey if (mode&0x04000000) flags |= O_TRUNC; 479d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey if (mode&0x02000000) flags |= O_APPEND; 480d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey 481d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey int realMode = S_IRWXU|S_IRWXG; 482d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey if (mode&0x00000001) realMode |= S_IROTH; 483d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey if (mode&0x00000002) realMode |= S_IWOTH; 484d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey 485d415303c4d02c1d30dd4199bade4694bf2cb4615tao.pei int fd = open(name8.c_str(), flags, realMode); 486d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey if (fd < 0) { 487d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey jniThrowException(env, "java/io/FileNotFoundException", strerror(errno)); 488d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey return NULL; 489d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey } 490d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey jobject object = jniCreateFileDescriptor(env, fd); 491d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey if (object == NULL) { 492d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey close(fd); 493d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey } 494d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey return object; 495d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey} 496d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey 497047238ced42eea812de9d39a9f32e94d002bfa5cJeff Sharkeystatic jobject android_os_Parcel_dupFileDescriptor(JNIEnv* env, jclass clazz, jobject orig) 498d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey{ 499d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey if (orig == NULL) { 500d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey jniThrowNullPointerException(env, NULL); 501d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey return NULL; 502d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey } 503d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey int origfd = jniGetFDFromFileDescriptor(env, orig); 504d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey if (origfd < 0) { 505d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey jniThrowException(env, "java/lang/IllegalArgumentException", "bad FileDescriptor"); 506d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey return NULL; 507d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey } 508d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey 509d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey int fd = dup(origfd); 510d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey if (fd < 0) { 511d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey jniThrowIOException(env, errno); 512d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey return NULL; 513d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey } 514d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey jobject object = jniCreateFileDescriptor(env, fd); 515d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey if (object == NULL) { 516d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey close(fd); 517d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey } 518d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey return object; 519d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey} 520d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey 521047238ced42eea812de9d39a9f32e94d002bfa5cJeff Sharkeystatic void android_os_Parcel_closeFileDescriptor(JNIEnv* env, jclass clazz, jobject object) 522d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey{ 523d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey if (object == NULL) { 524d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey jniThrowNullPointerException(env, NULL); 525d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey return; 526d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey } 527d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey int fd = jniGetFDFromFileDescriptor(env, object); 528d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey if (fd >= 0) { 529d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey jniSetFileDescriptorOfFD(env, object, -1); 530d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey //ALOGI("Closing ParcelFileDescriptor %d\n", fd); 531d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey close(fd); 532d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey } 533d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey} 534d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey 535047238ced42eea812de9d39a9f32e94d002bfa5cJeff Sharkeystatic void android_os_Parcel_clearFileDescriptor(JNIEnv* env, jclass clazz, jobject object) 536d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey{ 537d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey if (object == NULL) { 538d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey jniThrowNullPointerException(env, NULL); 539d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey return; 540d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey } 541d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey int fd = jniGetFDFromFileDescriptor(env, object); 542d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey if (fd >= 0) { 543d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey jniSetFileDescriptorOfFD(env, object, -1); 544d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey } 545d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey} 546d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey 5478ab665dda40ab10e60fc69392022171f454af530Ashok Bhatstatic jlong android_os_Parcel_create(JNIEnv* env, jclass clazz) 548d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey{ 549047238ced42eea812de9d39a9f32e94d002bfa5cJeff Sharkey Parcel* parcel = new Parcel(); 5508ab665dda40ab10e60fc69392022171f454af530Ashok Bhat return reinterpret_cast<jlong>(parcel); 551d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey} 552d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey 5530450565d9a6de0f0828c9ad8ce16c8645c6f394cAdrian Roosstatic jlong android_os_Parcel_freeBuffer(JNIEnv* env, jclass clazz, jlong nativePtr) 554d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey{ 555047238ced42eea812de9d39a9f32e94d002bfa5cJeff Sharkey Parcel* parcel = reinterpret_cast<Parcel*>(nativePtr); 556047238ced42eea812de9d39a9f32e94d002bfa5cJeff Sharkey if (parcel != NULL) { 557047238ced42eea812de9d39a9f32e94d002bfa5cJeff Sharkey parcel->freeData(); 5580450565d9a6de0f0828c9ad8ce16c8645c6f394cAdrian Roos return parcel->getOpenAshmemSize(); 559d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey } 5600450565d9a6de0f0828c9ad8ce16c8645c6f394cAdrian Roos return 0; 561d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey} 562d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey 5638ab665dda40ab10e60fc69392022171f454af530Ashok Bhatstatic void android_os_Parcel_destroy(JNIEnv* env, jclass clazz, jlong nativePtr) 564d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey{ 565047238ced42eea812de9d39a9f32e94d002bfa5cJeff Sharkey Parcel* parcel = reinterpret_cast<Parcel*>(nativePtr); 566047238ced42eea812de9d39a9f32e94d002bfa5cJeff Sharkey delete parcel; 567d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey} 568d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey 5698ab665dda40ab10e60fc69392022171f454af530Ashok Bhatstatic jbyteArray android_os_Parcel_marshall(JNIEnv* env, jclass clazz, jlong nativePtr) 570d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey{ 571047238ced42eea812de9d39a9f32e94d002bfa5cJeff Sharkey Parcel* parcel = reinterpret_cast<Parcel*>(nativePtr); 572d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey if (parcel == NULL) { 573d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey return NULL; 574d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey } 575d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey 576d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey // do not marshall if there are binder objects in the parcel 577d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey if (parcel->objectsCount()) 578d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey { 579d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey jniThrowException(env, "java/lang/RuntimeException", "Tried to marshall a Parcel that contained Binder objects."); 580d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey return NULL; 581d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey } 582d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey 583d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey jbyteArray ret = env->NewByteArray(parcel->dataSize()); 584d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey 585d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey if (ret != NULL) 586d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey { 587d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey jbyte* array = (jbyte*)env->GetPrimitiveArrayCritical(ret, 0); 588d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey if (array != NULL) 589d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey { 590d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey memcpy(array, parcel->data(), parcel->dataSize()); 591d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey env->ReleasePrimitiveArrayCritical(ret, array, 0); 592d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey } 593d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey } 594d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey 595d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey return ret; 596d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey} 597d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey 5980450565d9a6de0f0828c9ad8ce16c8645c6f394cAdrian Roosstatic jlong android_os_Parcel_unmarshall(JNIEnv* env, jclass clazz, jlong nativePtr, 5990450565d9a6de0f0828c9ad8ce16c8645c6f394cAdrian Roos jbyteArray data, jint offset, jint length) 600d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey{ 601047238ced42eea812de9d39a9f32e94d002bfa5cJeff Sharkey Parcel* parcel = reinterpret_cast<Parcel*>(nativePtr); 602d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey if (parcel == NULL || length < 0) { 6030450565d9a6de0f0828c9ad8ce16c8645c6f394cAdrian Roos return 0; 604d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey } 605d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey 606d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey jbyte* array = (jbyte*)env->GetPrimitiveArrayCritical(data, 0); 607d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey if (array) 608d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey { 609d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey parcel->setDataSize(length); 610d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey parcel->setDataPosition(0); 611d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey 612d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey void* raw = parcel->writeInplace(length); 613d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey memcpy(raw, (array + offset), length); 614d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey 615d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey env->ReleasePrimitiveArrayCritical(data, array, 0); 616d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey } 6170450565d9a6de0f0828c9ad8ce16c8645c6f394cAdrian Roos return parcel->getOpenAshmemSize(); 618d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey} 619d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey 6200450565d9a6de0f0828c9ad8ce16c8645c6f394cAdrian Roosstatic jlong android_os_Parcel_appendFrom(JNIEnv* env, jclass clazz, jlong thisNativePtr, 6210450565d9a6de0f0828c9ad8ce16c8645c6f394cAdrian Roos jlong otherNativePtr, jint offset, jint length) 622d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey{ 623047238ced42eea812de9d39a9f32e94d002bfa5cJeff Sharkey Parcel* thisParcel = reinterpret_cast<Parcel*>(thisNativePtr); 624d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey if (thisParcel == NULL) { 6250450565d9a6de0f0828c9ad8ce16c8645c6f394cAdrian Roos return 0; 626d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey } 627047238ced42eea812de9d39a9f32e94d002bfa5cJeff Sharkey Parcel* otherParcel = reinterpret_cast<Parcel*>(otherNativePtr); 628d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey if (otherParcel == NULL) { 6290450565d9a6de0f0828c9ad8ce16c8645c6f394cAdrian Roos return thisParcel->getOpenAshmemSize(); 630d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey } 631d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey 632d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey status_t err = thisParcel->appendFrom(otherParcel, offset, length); 633d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey if (err != NO_ERROR) { 634d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey signalExceptionForError(env, clazz, err); 635d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey } 6360450565d9a6de0f0828c9ad8ce16c8645c6f394cAdrian Roos return thisParcel->getOpenAshmemSize(); 637d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey} 638d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey 6398ab665dda40ab10e60fc69392022171f454af530Ashok Bhatstatic jboolean android_os_Parcel_hasFileDescriptors(JNIEnv* env, jclass clazz, jlong nativePtr) 640d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey{ 641d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey jboolean ret = JNI_FALSE; 642047238ced42eea812de9d39a9f32e94d002bfa5cJeff Sharkey Parcel* parcel = reinterpret_cast<Parcel*>(nativePtr); 643d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey if (parcel != NULL) { 644d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey if (parcel->hasFileDescriptors()) { 645d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey ret = JNI_TRUE; 646d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey } 647d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey } 648d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey return ret; 649d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey} 650d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey 6518ab665dda40ab10e60fc69392022171f454af530Ashok Bhatstatic void android_os_Parcel_writeInterfaceToken(JNIEnv* env, jclass clazz, jlong nativePtr, 652047238ced42eea812de9d39a9f32e94d002bfa5cJeff Sharkey jstring name) 653d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey{ 654047238ced42eea812de9d39a9f32e94d002bfa5cJeff Sharkey Parcel* parcel = reinterpret_cast<Parcel*>(nativePtr); 655d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey if (parcel != NULL) { 656d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey // In the current implementation, the token is just the serialized interface name that 657d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey // the caller expects to be invoking 658d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey const jchar* str = env->GetStringCritical(name, 0); 659d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey if (str != NULL) { 6606698749dd4d4d6513b26aa9071af290b956b68a7Dan Albert parcel->writeInterfaceToken(String16( 6616698749dd4d4d6513b26aa9071af290b956b68a7Dan Albert reinterpret_cast<const char16_t*>(str), 6626698749dd4d4d6513b26aa9071af290b956b68a7Dan Albert env->GetStringLength(name))); 663d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey env->ReleaseStringCritical(name, str); 664d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey } 665d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey } 666d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey} 667d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey 6688ab665dda40ab10e60fc69392022171f454af530Ashok Bhatstatic void android_os_Parcel_enforceInterface(JNIEnv* env, jclass clazz, jlong nativePtr, jstring name) 669d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey{ 670047238ced42eea812de9d39a9f32e94d002bfa5cJeff Sharkey Parcel* parcel = reinterpret_cast<Parcel*>(nativePtr); 671d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey if (parcel != NULL) { 672d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey const jchar* str = env->GetStringCritical(name, 0); 673d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey if (str) { 674d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey IPCThreadState* threadState = IPCThreadState::self(); 675d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey const int32_t oldPolicy = threadState->getStrictModePolicy(); 676d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey const bool isValid = parcel->enforceInterface( 6776698749dd4d4d6513b26aa9071af290b956b68a7Dan Albert String16(reinterpret_cast<const char16_t*>(str), 6786698749dd4d4d6513b26aa9071af290b956b68a7Dan Albert env->GetStringLength(name)), 679d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey threadState); 680d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey env->ReleaseStringCritical(name, str); 681d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey if (isValid) { 682d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey const int32_t newPolicy = threadState->getStrictModePolicy(); 683d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey if (oldPolicy != newPolicy) { 684d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey // Need to keep the Java-level thread-local strict 685d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey // mode policy in sync for the libcore 686d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey // enforcements, which involves an upcall back 687d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey // into Java. (We can't modify the 688d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey // Parcel.enforceInterface signature, as it's 689d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey // pseudo-public, and used via AIDL 690d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey // auto-generation...) 691d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey set_dalvik_blockguard_policy(env, newPolicy); 692d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey } 693d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey return; // everything was correct -> return silently 694d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey } 695d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey } 696d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey } 697d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey 698d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey // all error conditions wind up here 699d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey jniThrowException(env, "java/lang/SecurityException", 700d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey "Binder invocation to an incorrect interface"); 701d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey} 702d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey 703fabb70b2efbd125f74923d19ab12bc8e1371ed1fDianne Hackbornstatic jlong android_os_Parcel_getGlobalAllocSize(JNIEnv* env, jclass clazz) 704fabb70b2efbd125f74923d19ab12bc8e1371ed1fDianne Hackborn{ 705fabb70b2efbd125f74923d19ab12bc8e1371ed1fDianne Hackborn return Parcel::getGlobalAllocSize(); 706fabb70b2efbd125f74923d19ab12bc8e1371ed1fDianne Hackborn} 707fabb70b2efbd125f74923d19ab12bc8e1371ed1fDianne Hackborn 708fabb70b2efbd125f74923d19ab12bc8e1371ed1fDianne Hackbornstatic jlong android_os_Parcel_getGlobalAllocCount(JNIEnv* env, jclass clazz) 709fabb70b2efbd125f74923d19ab12bc8e1371ed1fDianne Hackborn{ 710fabb70b2efbd125f74923d19ab12bc8e1371ed1fDianne Hackborn return Parcel::getGlobalAllocCount(); 711fabb70b2efbd125f74923d19ab12bc8e1371ed1fDianne Hackborn} 712fabb70b2efbd125f74923d19ab12bc8e1371ed1fDianne Hackborn 7135ce0430edfc176de29c0cf503975570dfda8111fDan Sandlerstatic jlong android_os_Parcel_getBlobAshmemSize(JNIEnv* env, jclass clazz, jlong nativePtr) 7145ce0430edfc176de29c0cf503975570dfda8111fDan Sandler{ 7155ce0430edfc176de29c0cf503975570dfda8111fDan Sandler Parcel* parcel = reinterpret_cast<Parcel*>(nativePtr); 7165ce0430edfc176de29c0cf503975570dfda8111fDan Sandler if (parcel != NULL) { 7175ce0430edfc176de29c0cf503975570dfda8111fDan Sandler return parcel->getBlobAshmemSize(); 7185ce0430edfc176de29c0cf503975570dfda8111fDan Sandler } 7195ce0430edfc176de29c0cf503975570dfda8111fDan Sandler return 0; 7205ce0430edfc176de29c0cf503975570dfda8111fDan Sandler} 7215ce0430edfc176de29c0cf503975570dfda8111fDan Sandler 722d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey// ---------------------------------------------------------------------------- 723d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey 724d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkeystatic const JNINativeMethod gParcelMethods[] = { 7250a7a913683cb52cc847d52e4217b6637646a3c49Jeff Sharkey {"nativeDataSize", "!(J)I", (void*)android_os_Parcel_dataSize}, 7260a7a913683cb52cc847d52e4217b6637646a3c49Jeff Sharkey {"nativeDataAvail", "!(J)I", (void*)android_os_Parcel_dataAvail}, 7270a7a913683cb52cc847d52e4217b6637646a3c49Jeff Sharkey {"nativeDataPosition", "!(J)I", (void*)android_os_Parcel_dataPosition}, 7280a7a913683cb52cc847d52e4217b6637646a3c49Jeff Sharkey {"nativeDataCapacity", "!(J)I", (void*)android_os_Parcel_dataCapacity}, 7290a7a913683cb52cc847d52e4217b6637646a3c49Jeff Sharkey {"nativeSetDataSize", "!(JI)J", (void*)android_os_Parcel_setDataSize}, 7300a7a913683cb52cc847d52e4217b6637646a3c49Jeff Sharkey {"nativeSetDataPosition", "!(JI)V", (void*)android_os_Parcel_setDataPosition}, 7310a7a913683cb52cc847d52e4217b6637646a3c49Jeff Sharkey {"nativeSetDataCapacity", "!(JI)V", (void*)android_os_Parcel_setDataCapacity}, 7328ab665dda40ab10e60fc69392022171f454af530Ashok Bhat 7330a7a913683cb52cc847d52e4217b6637646a3c49Jeff Sharkey {"nativePushAllowFds", "!(JZ)Z", (void*)android_os_Parcel_pushAllowFds}, 7340a7a913683cb52cc847d52e4217b6637646a3c49Jeff Sharkey {"nativeRestoreAllowFds", "!(JZ)V", (void*)android_os_Parcel_restoreAllowFds}, 7358ab665dda40ab10e60fc69392022171f454af530Ashok Bhat 7368ab665dda40ab10e60fc69392022171f454af530Ashok Bhat {"nativeWriteByteArray", "(J[BII)V", (void*)android_os_Parcel_writeNative}, 73790d7a3e996ee3a6e33e655341c5d301fbe30cd58Sandeep Siddhartha {"nativeWriteBlob", "(J[BII)V", (void*)android_os_Parcel_writeBlob}, 7380a7a913683cb52cc847d52e4217b6637646a3c49Jeff Sharkey {"nativeWriteInt", "!(JI)V", (void*)android_os_Parcel_writeInt}, 7390a7a913683cb52cc847d52e4217b6637646a3c49Jeff Sharkey {"nativeWriteLong", "!(JJ)V", (void*)android_os_Parcel_writeLong}, 7400a7a913683cb52cc847d52e4217b6637646a3c49Jeff Sharkey {"nativeWriteFloat", "!(JF)V", (void*)android_os_Parcel_writeFloat}, 7410a7a913683cb52cc847d52e4217b6637646a3c49Jeff Sharkey {"nativeWriteDouble", "!(JD)V", (void*)android_os_Parcel_writeDouble}, 7428ab665dda40ab10e60fc69392022171f454af530Ashok Bhat {"nativeWriteString", "(JLjava/lang/String;)V", (void*)android_os_Parcel_writeString}, 7438ab665dda40ab10e60fc69392022171f454af530Ashok Bhat {"nativeWriteStrongBinder", "(JLandroid/os/IBinder;)V", (void*)android_os_Parcel_writeStrongBinder}, 7440450565d9a6de0f0828c9ad8ce16c8645c6f394cAdrian Roos {"nativeWriteFileDescriptor", "(JLjava/io/FileDescriptor;)J", (void*)android_os_Parcel_writeFileDescriptor}, 7458ab665dda40ab10e60fc69392022171f454af530Ashok Bhat 7468ab665dda40ab10e60fc69392022171f454af530Ashok Bhat {"nativeCreateByteArray", "(J)[B", (void*)android_os_Parcel_createByteArray}, 74790d7a3e996ee3a6e33e655341c5d301fbe30cd58Sandeep Siddhartha {"nativeReadBlob", "(J)[B", (void*)android_os_Parcel_readBlob}, 7480a7a913683cb52cc847d52e4217b6637646a3c49Jeff Sharkey {"nativeReadInt", "!(J)I", (void*)android_os_Parcel_readInt}, 7490a7a913683cb52cc847d52e4217b6637646a3c49Jeff Sharkey {"nativeReadLong", "!(J)J", (void*)android_os_Parcel_readLong}, 7500a7a913683cb52cc847d52e4217b6637646a3c49Jeff Sharkey {"nativeReadFloat", "!(J)F", (void*)android_os_Parcel_readFloat}, 7510a7a913683cb52cc847d52e4217b6637646a3c49Jeff Sharkey {"nativeReadDouble", "!(J)D", (void*)android_os_Parcel_readDouble}, 7528ab665dda40ab10e60fc69392022171f454af530Ashok Bhat {"nativeReadString", "(J)Ljava/lang/String;", (void*)android_os_Parcel_readString}, 7538ab665dda40ab10e60fc69392022171f454af530Ashok Bhat {"nativeReadStrongBinder", "(J)Landroid/os/IBinder;", (void*)android_os_Parcel_readStrongBinder}, 7548ab665dda40ab10e60fc69392022171f454af530Ashok Bhat {"nativeReadFileDescriptor", "(J)Ljava/io/FileDescriptor;", (void*)android_os_Parcel_readFileDescriptor}, 755047238ced42eea812de9d39a9f32e94d002bfa5cJeff Sharkey 756047238ced42eea812de9d39a9f32e94d002bfa5cJeff Sharkey {"openFileDescriptor", "(Ljava/lang/String;I)Ljava/io/FileDescriptor;", (void*)android_os_Parcel_openFileDescriptor}, 757047238ced42eea812de9d39a9f32e94d002bfa5cJeff Sharkey {"dupFileDescriptor", "(Ljava/io/FileDescriptor;)Ljava/io/FileDescriptor;", (void*)android_os_Parcel_dupFileDescriptor}, 758047238ced42eea812de9d39a9f32e94d002bfa5cJeff Sharkey {"closeFileDescriptor", "(Ljava/io/FileDescriptor;)V", (void*)android_os_Parcel_closeFileDescriptor}, 759047238ced42eea812de9d39a9f32e94d002bfa5cJeff Sharkey {"clearFileDescriptor", "(Ljava/io/FileDescriptor;)V", (void*)android_os_Parcel_clearFileDescriptor}, 760047238ced42eea812de9d39a9f32e94d002bfa5cJeff Sharkey 7618ab665dda40ab10e60fc69392022171f454af530Ashok Bhat {"nativeCreate", "()J", (void*)android_os_Parcel_create}, 7620450565d9a6de0f0828c9ad8ce16c8645c6f394cAdrian Roos {"nativeFreeBuffer", "(J)J", (void*)android_os_Parcel_freeBuffer}, 7638ab665dda40ab10e60fc69392022171f454af530Ashok Bhat {"nativeDestroy", "(J)V", (void*)android_os_Parcel_destroy}, 764047238ced42eea812de9d39a9f32e94d002bfa5cJeff Sharkey 7658ab665dda40ab10e60fc69392022171f454af530Ashok Bhat {"nativeMarshall", "(J)[B", (void*)android_os_Parcel_marshall}, 7660450565d9a6de0f0828c9ad8ce16c8645c6f394cAdrian Roos {"nativeUnmarshall", "(J[BII)J", (void*)android_os_Parcel_unmarshall}, 7670450565d9a6de0f0828c9ad8ce16c8645c6f394cAdrian Roos {"nativeAppendFrom", "(JJII)J", (void*)android_os_Parcel_appendFrom}, 7680a7a913683cb52cc847d52e4217b6637646a3c49Jeff Sharkey {"nativeHasFileDescriptors", "!(J)Z", (void*)android_os_Parcel_hasFileDescriptors}, 7698ab665dda40ab10e60fc69392022171f454af530Ashok Bhat {"nativeWriteInterfaceToken", "(JLjava/lang/String;)V", (void*)android_os_Parcel_writeInterfaceToken}, 7708ab665dda40ab10e60fc69392022171f454af530Ashok Bhat {"nativeEnforceInterface", "(JLjava/lang/String;)V", (void*)android_os_Parcel_enforceInterface}, 771fabb70b2efbd125f74923d19ab12bc8e1371ed1fDianne Hackborn 772fabb70b2efbd125f74923d19ab12bc8e1371ed1fDianne Hackborn {"getGlobalAllocSize", "()J", (void*)android_os_Parcel_getGlobalAllocSize}, 773fabb70b2efbd125f74923d19ab12bc8e1371ed1fDianne Hackborn {"getGlobalAllocCount", "()J", (void*)android_os_Parcel_getGlobalAllocCount}, 7745ce0430edfc176de29c0cf503975570dfda8111fDan Sandler 775aa861666ed537389e335f586bc84fe8ddb9fb026Dan Sandler {"nativeGetBlobAshmemSize", "(J)J", (void*)android_os_Parcel_getBlobAshmemSize}, 776d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey}; 777d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey 778d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkeyconst char* const kParcelPathName = "android/os/Parcel"; 779d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey 780d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkeyint register_android_os_Parcel(JNIEnv* env) 781d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey{ 782987f79f60bb1f0a4bcd3ef22e57301c743f0b94fAndreas Gampe jclass clazz = FindClassOrDie(env, kParcelPathName); 783d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey 784987f79f60bb1f0a4bcd3ef22e57301c743f0b94fAndreas Gampe gParcelOffsets.clazz = MakeGlobalRefOrDie(env, clazz); 785987f79f60bb1f0a4bcd3ef22e57301c743f0b94fAndreas Gampe gParcelOffsets.mNativePtr = GetFieldIDOrDie(env, clazz, "mNativePtr", "J"); 786987f79f60bb1f0a4bcd3ef22e57301c743f0b94fAndreas Gampe gParcelOffsets.obtain = GetStaticMethodIDOrDie(env, clazz, "obtain", "()Landroid/os/Parcel;"); 787987f79f60bb1f0a4bcd3ef22e57301c743f0b94fAndreas Gampe gParcelOffsets.recycle = GetMethodIDOrDie(env, clazz, "recycle", "()V"); 788d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey 789987f79f60bb1f0a4bcd3ef22e57301c743f0b94fAndreas Gampe return RegisterMethodsOrDie(env, kParcelPathName, gParcelMethods, NELEM(gParcelMethods)); 790d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey} 791d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey 792d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey}; 793