1b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood/*
2b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood * Copyright (C) 2011 The Android Open Source Project
3b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood *
4b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood * Licensed under the Apache License, Version 2.0 (the "License");
5b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood * you may not use this file except in compliance with the License.
6b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood * You may obtain a copy of the License at
7b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood *
8b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood *      http://www.apache.org/licenses/LICENSE-2.0
9b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood *
10b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood * Unless required by applicable law or agreed to in writing, software
11b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood * distributed under the License is distributed on an "AS IS" BASIS,
12b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood * See the License for the specific language governing permissions and
14b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood * limitations under the License.
15b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood */
16b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood
17b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood#define LOG_TAG "SerialServiceJNI"
18b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood#include "utils/Log.h"
19b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood
20b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood#include "jni.h"
21b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood#include "JNIHelp.h"
22b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood#include "android_runtime/AndroidRuntime.h"
23b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood
24b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood#include <sys/types.h>
25b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood#include <sys/stat.h>
26b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood#include <fcntl.h>
27b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood
28b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwoodnamespace android
29b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood{
30b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood
31b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwoodstatic struct parcel_file_descriptor_offsets_t
32b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood{
33b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood    jclass mClass;
34b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood    jmethodID mConstructor;
35b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood} gParcelFileDescriptorOffsets;
36b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood
37b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwoodstatic jobject android_server_SerialService_open(JNIEnv *env, jobject thiz, jstring path)
38b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood{
39b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood    const char *pathStr = env->GetStringUTFChars(path, NULL);
40b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood
41b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood    int fd = open(pathStr, O_RDWR | O_NOCTTY);
42b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood    if (fd < 0) {
43b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood        ALOGE("could not open %s", pathStr);
44b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood        env->ReleaseStringUTFChars(path, pathStr);
45b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood        return NULL;
46b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood    }
47b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood    env->ReleaseStringUTFChars(path, pathStr);
48b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood
49b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood    jobject fileDescriptor = jniCreateFileDescriptor(env, fd);
50b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood    if (fileDescriptor == NULL) {
51b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood        return NULL;
52b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood    }
53b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood    return env->NewObject(gParcelFileDescriptorOffsets.mClass,
54b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood        gParcelFileDescriptorOffsets.mConstructor, fileDescriptor);
55b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood}
56b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood
57b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood
58b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwoodstatic JNINativeMethod method_table[] = {
59b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood    { "native_open",                "(Ljava/lang/String;)Landroid/os/ParcelFileDescriptor;",
60b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood                                    (void*)android_server_SerialService_open },
61b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood};
62b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood
63b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwoodint register_android_server_SerialService(JNIEnv *env)
64b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood{
65b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood    jclass clazz = env->FindClass("com/android/server/SerialService");
66b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood    if (clazz == NULL) {
67b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood        ALOGE("Can't find com/android/server/SerialService");
68b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood        return -1;
69b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood    }
70b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood
71b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood    clazz = env->FindClass("android/os/ParcelFileDescriptor");
72b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood    LOG_FATAL_IF(clazz == NULL, "Unable to find class android.os.ParcelFileDescriptor");
73b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood    gParcelFileDescriptorOffsets.mClass = (jclass) env->NewGlobalRef(clazz);
74b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood    gParcelFileDescriptorOffsets.mConstructor = env->GetMethodID(clazz, "<init>", "(Ljava/io/FileDescriptor;)V");
75b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood    LOG_FATAL_IF(gParcelFileDescriptorOffsets.mConstructor == NULL,
76b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood                 "Unable to find constructor for android.os.ParcelFileDescriptor");
77b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood
78b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood    return jniRegisterNativeMethods(env, "com/android/server/SerialService",
79b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood            method_table, NELEM(method_table));
80b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood}
81b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood
82b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood};
83