1cfe2669028074a204fc55afebbae630423a806f2Robin Lee/* 2cfe2669028074a204fc55afebbae630423a806f2Robin Lee * Copyright (C) 2016 The Android Open Source Project 3cfe2669028074a204fc55afebbae630423a806f2Robin Lee * 4cfe2669028074a204fc55afebbae630423a806f2Robin Lee * Licensed under the Apache License, Version 2.0 (the "License"); 5cfe2669028074a204fc55afebbae630423a806f2Robin Lee * you may not use this file except in compliance with the License. 6cfe2669028074a204fc55afebbae630423a806f2Robin Lee * You may obtain a copy of the License at 7cfe2669028074a204fc55afebbae630423a806f2Robin Lee * 8cfe2669028074a204fc55afebbae630423a806f2Robin Lee * http://www.apache.org/licenses/LICENSE-2.0 9cfe2669028074a204fc55afebbae630423a806f2Robin Lee * 10cfe2669028074a204fc55afebbae630423a806f2Robin Lee * Unless required by applicable law or agreed to in writing, software 11cfe2669028074a204fc55afebbae630423a806f2Robin Lee * distributed under the License is distributed on an "AS IS" BASIS, 12cfe2669028074a204fc55afebbae630423a806f2Robin Lee * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13cfe2669028074a204fc55afebbae630423a806f2Robin Lee * See the License for the specific language governing permissions and 14cfe2669028074a204fc55afebbae630423a806f2Robin Lee * limitations under the License. 15cfe2669028074a204fc55afebbae630423a806f2Robin Lee */ 16cfe2669028074a204fc55afebbae630423a806f2Robin Lee 17cfe2669028074a204fc55afebbae630423a806f2Robin Lee#include <memory> 18cfe2669028074a204fc55afebbae630423a806f2Robin Lee 19cfe2669028074a204fc55afebbae630423a806f2Robin Lee#include <binder/Parcel.h> 20cfe2669028074a204fc55afebbae630423a806f2Robin Lee 21cfe2669028074a204fc55afebbae630423a806f2Robin Lee#include "UidRangeTest.h" 22cfe2669028074a204fc55afebbae630423a806f2Robin Lee 23cfe2669028074a204fc55afebbae630423a806f2Robin Leeusing android::net::UidRange; 24cfe2669028074a204fc55afebbae630423a806f2Robin Lee 25cfe2669028074a204fc55afebbae630423a806f2Robin Leeextern "C" 26cfe2669028074a204fc55afebbae630423a806f2Robin LeeJNIEXPORT jbyteArray Java_android_net_UidRangeTest_readAndWriteNative(JNIEnv* env, jclass, 27cfe2669028074a204fc55afebbae630423a806f2Robin Lee jbyteArray inParcel) { 28cfe2669028074a204fc55afebbae630423a806f2Robin Lee const UidRange range = unmarshall(env, inParcel); 29cfe2669028074a204fc55afebbae630423a806f2Robin Lee return marshall(env, range); 30cfe2669028074a204fc55afebbae630423a806f2Robin Lee} 31cfe2669028074a204fc55afebbae630423a806f2Robin Lee 32cfe2669028074a204fc55afebbae630423a806f2Robin Leeextern "C" 33cfe2669028074a204fc55afebbae630423a806f2Robin LeeJNIEXPORT jint Java_android_net_UidRangeTest_getStart(JNIEnv* env, jclass, jbyteArray inParcel) { 34cfe2669028074a204fc55afebbae630423a806f2Robin Lee const UidRange range = unmarshall(env, inParcel); 35cfe2669028074a204fc55afebbae630423a806f2Robin Lee return range.getStart(); 36cfe2669028074a204fc55afebbae630423a806f2Robin Lee} 37cfe2669028074a204fc55afebbae630423a806f2Robin Lee 38cfe2669028074a204fc55afebbae630423a806f2Robin Leeextern "C" 39cfe2669028074a204fc55afebbae630423a806f2Robin LeeJNIEXPORT jint Java_android_net_UidRangeTest_getStop(JNIEnv* env, jclass, jbyteArray inParcel) { 40cfe2669028074a204fc55afebbae630423a806f2Robin Lee const UidRange range = unmarshall(env, inParcel); 41cfe2669028074a204fc55afebbae630423a806f2Robin Lee return range.getStop(); 42cfe2669028074a204fc55afebbae630423a806f2Robin Lee} 43cfe2669028074a204fc55afebbae630423a806f2Robin Lee 44cfe2669028074a204fc55afebbae630423a806f2Robin Lee 45cfe2669028074a204fc55afebbae630423a806f2Robin Lee/** 46cfe2669028074a204fc55afebbae630423a806f2Robin Lee * Reads exactly one UidRange from 'parcelData' assuming that it is a Parcel. Any bytes afterward 47cfe2669028074a204fc55afebbae630423a806f2Robin Lee * are ignored. 48cfe2669028074a204fc55afebbae630423a806f2Robin Lee */ 49cfe2669028074a204fc55afebbae630423a806f2Robin LeeUidRange unmarshall(JNIEnv* env, jbyteArray parcelData) { 50cfe2669028074a204fc55afebbae630423a806f2Robin Lee const int length = env->GetArrayLength(parcelData); 51cfe2669028074a204fc55afebbae630423a806f2Robin Lee 52cfe2669028074a204fc55afebbae630423a806f2Robin Lee std::unique_ptr<uint8_t> bytes(new uint8_t[length]); 53cfe2669028074a204fc55afebbae630423a806f2Robin Lee env->GetByteArrayRegion(parcelData, 0, length, reinterpret_cast<jbyte*>(bytes.get())); 54cfe2669028074a204fc55afebbae630423a806f2Robin Lee 55cfe2669028074a204fc55afebbae630423a806f2Robin Lee android::Parcel p; 56cfe2669028074a204fc55afebbae630423a806f2Robin Lee p.setData(bytes.get(), length); 57cfe2669028074a204fc55afebbae630423a806f2Robin Lee 58cfe2669028074a204fc55afebbae630423a806f2Robin Lee UidRange range; 59cfe2669028074a204fc55afebbae630423a806f2Robin Lee range.readFromParcel(&p); 60cfe2669028074a204fc55afebbae630423a806f2Robin Lee return range; 61cfe2669028074a204fc55afebbae630423a806f2Robin Lee} 62cfe2669028074a204fc55afebbae630423a806f2Robin Lee 63cfe2669028074a204fc55afebbae630423a806f2Robin Lee/** 64cfe2669028074a204fc55afebbae630423a806f2Robin Lee * Creates a Java byte[] array and writes the contents of 'range' to it as a Parcel containing 65cfe2669028074a204fc55afebbae630423a806f2Robin Lee * exactly one object. 66cfe2669028074a204fc55afebbae630423a806f2Robin Lee * 67cfe2669028074a204fc55afebbae630423a806f2Robin Lee * Every UidRange maps to a unique parcel object, so both 'marshall(e, unmarshall(e, x))' and 68cfe2669028074a204fc55afebbae630423a806f2Robin Lee * 'unmarshall(e, marshall(e, x))' should be fixed points. 69cfe2669028074a204fc55afebbae630423a806f2Robin Lee */ 70cfe2669028074a204fc55afebbae630423a806f2Robin LeejbyteArray marshall(JNIEnv* env, const UidRange& range) { 71cfe2669028074a204fc55afebbae630423a806f2Robin Lee android::Parcel p; 72cfe2669028074a204fc55afebbae630423a806f2Robin Lee range.writeToParcel(&p); 73cfe2669028074a204fc55afebbae630423a806f2Robin Lee const int length = p.dataSize(); 74cfe2669028074a204fc55afebbae630423a806f2Robin Lee 75cfe2669028074a204fc55afebbae630423a806f2Robin Lee jbyteArray parcelData = env->NewByteArray(length); 76cfe2669028074a204fc55afebbae630423a806f2Robin Lee env->SetByteArrayRegion(parcelData, 0, length, reinterpret_cast<const jbyte*>(p.data())); 77cfe2669028074a204fc55afebbae630423a806f2Robin Lee 78cfe2669028074a204fc55afebbae630423a806f2Robin Lee return parcelData; 79cfe2669028074a204fc55afebbae630423a806f2Robin Lee} 80