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