19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/*
29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project** Copyright 2006, The Android Open Source Project
39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project**
42653a1e7ca55b03f5230dffa85dfe2705757e2b7Jaikumar Ganesh** Licensed under the Apache License, Version 2.0 (the "License");
52653a1e7ca55b03f5230dffa85dfe2705757e2b7Jaikumar Ganesh** you may not use this file except in compliance with the License.
62653a1e7ca55b03f5230dffa85dfe2705757e2b7Jaikumar Ganesh** You may obtain a copy of the License at
79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project**
82653a1e7ca55b03f5230dffa85dfe2705757e2b7Jaikumar Ganesh**     http://www.apache.org/licenses/LICENSE-2.0
99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project**
102653a1e7ca55b03f5230dffa85dfe2705757e2b7Jaikumar Ganesh** Unless required by applicable law or agreed to in writing, software
112653a1e7ca55b03f5230dffa85dfe2705757e2b7Jaikumar Ganesh** distributed under the License is distributed on an "AS IS" BASIS,
122653a1e7ca55b03f5230dffa85dfe2705757e2b7Jaikumar Ganesh** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
132653a1e7ca55b03f5230dffa85dfe2705757e2b7Jaikumar Ganesh** See the License for the specific language governing permissions and
149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project** limitations under the License.
159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project*/
169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
17d5ac1ae36b4e096eb97984334f86d0c68abea2f7Jaikumar Ganesh#define DBUS_ADAPTER_IFACE BLUEZ_DBUS_BASE_IFC ".Adapter"
18d5ac1ae36b4e096eb97984334f86d0c68abea2f7Jaikumar Ganesh#define DBUS_DEVICE_IFACE BLUEZ_DBUS_BASE_IFC ".Device"
19545e6708adda6859932b55fd824794b1401f5318Jaikumar Ganesh#define DBUS_INPUT_IFACE BLUEZ_DBUS_BASE_IFC ".Input"
206fdd0c6274c81b337ad35b70480f881daf7354c3Danica Chang#define DBUS_NETWORK_IFACE BLUEZ_DBUS_BASE_IFC ".Network"
216fdd0c6274c81b337ad35b70480f881daf7354c3Danica Chang#define DBUS_NETWORKSERVER_IFACE BLUEZ_DBUS_BASE_IFC ".NetworkServer"
222ea1e85dcb57d17f5782dbafa1d25eb51c630e4bJaikumar Ganesh#define DBUS_HEALTH_MANAGER_PATH "/org/bluez"
232ea1e85dcb57d17f5782dbafa1d25eb51c630e4bJaikumar Ganesh#define DBUS_HEALTH_MANAGER_IFACE BLUEZ_DBUS_BASE_IFC ".HealthManager"
242ea1e85dcb57d17f5782dbafa1d25eb51c630e4bJaikumar Ganesh#define DBUS_HEALTH_DEVICE_IFACE BLUEZ_DBUS_BASE_IFC ".HealthDevice"
252ea1e85dcb57d17f5782dbafa1d25eb51c630e4bJaikumar Ganesh#define DBUS_HEALTH_CHANNEL_IFACE BLUEZ_DBUS_BASE_IFC ".HealthChannel"
26545e6708adda6859932b55fd824794b1401f5318Jaikumar Ganesh
27bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pelly#define LOG_TAG "BluetoothService.cpp"
289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include "android_bluetooth_common.h"
309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include "android_runtime/AndroidRuntime.h"
312ea1e85dcb57d17f5782dbafa1d25eb51c630e4bJaikumar Ganesh#include "android_util_Binder.h"
329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include "JNIHelp.h"
339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include "jni.h"
349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include "utils/Log.h"
359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include "utils/misc.h"
369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <ctype.h>
389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <stdio.h>
399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <string.h>
409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <stdlib.h>
419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <errno.h>
429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <unistd.h>
439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <sys/socket.h>
459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <sys/ioctl.h>
469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <fcntl.h>
479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#ifdef HAVE_BLUETOOTH
499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <dbus/dbus.h>
509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <bluedroid/bluetooth.h>
519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#endif
529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <cutils/properties.h>
549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectnamespace android {
569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
572b5be0748d160c6df1a9197272a776dc35879081Nick Pelly#define BLUETOOTH_CLASS_ERROR 0xFF000000
586d56b530e189d7213ec77d43d3d8af97fee04179Jaikumar Ganesh#define PROPERTIES_NREFS 10
592b5be0748d160c6df1a9197272a776dc35879081Nick Pelly
609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#ifdef HAVE_BLUETOOTH
619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// We initialize these variables when we load class
62bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pelly// android.server.BluetoothService
639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jfieldID field_mNativeData;
6428d139fa953c0b3bf2c66d92587e5287ec4dd5abRobert Greenwaltstatic jfieldID field_mEventLoop;
659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projecttypedef struct {
679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    JNIEnv *env;
689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    DBusConnection *conn;
699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    const char *adapter;  // dbus object name of the local adapter
709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} native_data_t;
719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7228d139fa953c0b3bf2c66d92587e5287ec4dd5abRobert Greenwaltextern event_loop_native_data_t *get_EventLoop_native_data(JNIEnv *,
7328d139fa953c0b3bf2c66d92587e5287ec4dd5abRobert Greenwalt                                                           jobject);
74d5ac1ae36b4e096eb97984334f86d0c68abea2f7Jaikumar Ganeshextern DBusHandlerResult agent_event_filter(DBusConnection *conn,
75d5ac1ae36b4e096eb97984334f86d0c68abea2f7Jaikumar Ganesh                                            DBusMessage *msg,
76d5ac1ae36b4e096eb97984334f86d0c68abea2f7Jaikumar Ganesh                                            void *data);
77d5ac1ae36b4e096eb97984334f86d0c68abea2f7Jaikumar Ganeshvoid onCreatePairedDeviceResult(DBusMessage *msg, void *user, void *nat);
781caa6d111eff6814760ec156b14adc29aa3aae6cJaikumar Ganeshvoid onDiscoverServicesResult(DBusMessage *msg, void *user, void *nat);
791caa6d111eff6814760ec156b14adc29aa3aae6cJaikumar Ganeshvoid onCreateDeviceResult(DBusMessage *msg, void *user, void *nat);
80de07503a382e81ba82f4cd4dee81ff2fbf3295bcJaikumar Ganeshvoid onInputDeviceConnectionResult(DBusMessage *msg, void *user, void *nat);
816fdd0c6274c81b337ad35b70480f881daf7354c3Danica Changvoid onPanDeviceConnectionResult(DBusMessage *msg, void *user, void *nat);
82b5d2d4526cd2c0117b7a33b1297ac683c37ac5c7Jaikumar Ganeshvoid onHealthDeviceConnectionResult(DBusMessage *msg, void *user, void *nat);
83d5ac1ae36b4e096eb97984334f86d0c68abea2f7Jaikumar Ganesh
849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/** Get native data stored in the opaque (Java code maintained) pointer mNativeData
869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *  Perform quick sanity check, if there are any problems return NULL
879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic inline native_data_t * get_native_data(JNIEnv *env, jobject object) {
899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    native_data_t *nat =
909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            (native_data_t *)(env->GetIntField(object, field_mNativeData));
919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (nat == NULL || nat->conn == NULL) {
929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        LOGE("Uninitialized native data\n");
939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return NULL;
949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return nat;
969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#endif
989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic void classInitNative(JNIEnv* env, jclass clazz) {
1002653a1e7ca55b03f5230dffa85dfe2705757e2b7Jaikumar Ganesh    LOGV("%s", __FUNCTION__);
1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#ifdef HAVE_BLUETOOTH
1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    field_mNativeData = get_field(env, clazz, "mNativeData", "I");
10328d139fa953c0b3bf2c66d92587e5287ec4dd5abRobert Greenwalt    field_mEventLoop = get_field(env, clazz, "mEventLoop",
10428d139fa953c0b3bf2c66d92587e5287ec4dd5abRobert Greenwalt            "Landroid/server/BluetoothEventLoop;");
1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#endif
1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/* Returns true on success (even if adapter is present but disabled).
1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Return false if dbus is down, or another serious error (out of memory)
1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project*/
1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic bool initializeNativeDataNative(JNIEnv* env, jobject object) {
1122653a1e7ca55b03f5230dffa85dfe2705757e2b7Jaikumar Ganesh    LOGV("%s", __FUNCTION__);
1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#ifdef HAVE_BLUETOOTH
1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    native_data_t *nat = (native_data_t *)calloc(1, sizeof(native_data_t));
1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (NULL == nat) {
1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        LOGE("%s: out of memory!", __FUNCTION__);
1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return false;
1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    nat->env = env;
1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    env->SetIntField(object, field_mNativeData, (jint)nat);
1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    DBusError err;
1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    dbus_error_init(&err);
1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    dbus_threads_init_default();
1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    nat->conn = dbus_bus_get(DBUS_BUS_SYSTEM, &err);
1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (dbus_error_is_set(&err)) {
1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        LOGE("Could not get onto the system bus: %s", err.message);
1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        dbus_error_free(&err);
1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return false;
1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1319e0a19515b9047a00a6e98ce7f20690dff511f43Nick Pelly    dbus_connection_set_exit_on_disconnect(nat->conn, FALSE);
1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#endif  /*HAVE_BLUETOOTH*/
1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return true;
1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
136d5ac1ae36b4e096eb97984334f86d0c68abea2f7Jaikumar Ganeshstatic const char *get_adapter_path(JNIEnv* env, jobject object) {
13782aea4abef3a1753425e4486af13710c27383588Jaikumar Ganesh#ifdef HAVE_BLUETOOTH
138d5ac1ae36b4e096eb97984334f86d0c68abea2f7Jaikumar Ganesh    event_loop_native_data_t *event_nat =
139d5ac1ae36b4e096eb97984334f86d0c68abea2f7Jaikumar Ganesh        get_EventLoop_native_data(env, env->GetObjectField(object,
140d5ac1ae36b4e096eb97984334f86d0c68abea2f7Jaikumar Ganesh                                                           field_mEventLoop));
141d5ac1ae36b4e096eb97984334f86d0c68abea2f7Jaikumar Ganesh    if (event_nat == NULL)
142d5ac1ae36b4e096eb97984334f86d0c68abea2f7Jaikumar Ganesh        return NULL;
143d5ac1ae36b4e096eb97984334f86d0c68abea2f7Jaikumar Ganesh    return event_nat->adapter;
14482aea4abef3a1753425e4486af13710c27383588Jaikumar Ganesh#else
14582aea4abef3a1753425e4486af13710c27383588Jaikumar Ganesh    return NULL;
14682aea4abef3a1753425e4486af13710c27383588Jaikumar Ganesh#endif
147d5ac1ae36b4e096eb97984334f86d0c68abea2f7Jaikumar Ganesh}
148d5ac1ae36b4e096eb97984334f86d0c68abea2f7Jaikumar Ganesh
149d5ac1ae36b4e096eb97984334f86d0c68abea2f7Jaikumar Ganesh// This function is called when the adapter is enabled.
150d5ac1ae36b4e096eb97984334f86d0c68abea2f7Jaikumar Ganeshstatic jboolean setupNativeDataNative(JNIEnv* env, jobject object) {
1512653a1e7ca55b03f5230dffa85dfe2705757e2b7Jaikumar Ganesh    LOGV("%s", __FUNCTION__);
1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#ifdef HAVE_BLUETOOTH
1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    native_data_t *nat =
1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        (native_data_t *)env->GetIntField(object, field_mNativeData);
155d5ac1ae36b4e096eb97984334f86d0c68abea2f7Jaikumar Ganesh    event_loop_native_data_t *event_nat =
156d5ac1ae36b4e096eb97984334f86d0c68abea2f7Jaikumar Ganesh        get_EventLoop_native_data(env, env->GetObjectField(object,
157d5ac1ae36b4e096eb97984334f86d0c68abea2f7Jaikumar Ganesh                                                           field_mEventLoop));
158d5ac1ae36b4e096eb97984334f86d0c68abea2f7Jaikumar Ganesh    // Register agent for remote devices.
159d5ac1ae36b4e096eb97984334f86d0c68abea2f7Jaikumar Ganesh    const char *device_agent_path = "/android/bluetooth/remote_device_agent";
160d5ac1ae36b4e096eb97984334f86d0c68abea2f7Jaikumar Ganesh    static const DBusObjectPathVTable agent_vtable = {
161d5ac1ae36b4e096eb97984334f86d0c68abea2f7Jaikumar Ganesh                 NULL, agent_event_filter, NULL, NULL, NULL, NULL };
162d5ac1ae36b4e096eb97984334f86d0c68abea2f7Jaikumar Ganesh
163d5ac1ae36b4e096eb97984334f86d0c68abea2f7Jaikumar Ganesh    if (!dbus_connection_register_object_path(nat->conn, device_agent_path,
164d5ac1ae36b4e096eb97984334f86d0c68abea2f7Jaikumar Ganesh                                              &agent_vtable, event_nat)) {
165d5ac1ae36b4e096eb97984334f86d0c68abea2f7Jaikumar Ganesh        LOGE("%s: Can't register object path %s for remote device agent!",
166d5ac1ae36b4e096eb97984334f86d0c68abea2f7Jaikumar Ganesh                               __FUNCTION__, device_agent_path);
167d5ac1ae36b4e096eb97984334f86d0c68abea2f7Jaikumar Ganesh        return JNI_FALSE;
1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
169d5ac1ae36b4e096eb97984334f86d0c68abea2f7Jaikumar Ganesh#endif /*HAVE_BLUETOOTH*/
170d5ac1ae36b4e096eb97984334f86d0c68abea2f7Jaikumar Ganesh    return JNI_TRUE;
1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
173d5ac1ae36b4e096eb97984334f86d0c68abea2f7Jaikumar Ganeshstatic jboolean tearDownNativeDataNative(JNIEnv *env, jobject object) {
1742653a1e7ca55b03f5230dffa85dfe2705757e2b7Jaikumar Ganesh    LOGV("%s", __FUNCTION__);
1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#ifdef HAVE_BLUETOOTH
176d5ac1ae36b4e096eb97984334f86d0c68abea2f7Jaikumar Ganesh    native_data_t *nat =
177d5ac1ae36b4e096eb97984334f86d0c68abea2f7Jaikumar Ganesh               (native_data_t *)env->GetIntField(object, field_mNativeData);
178d5ac1ae36b4e096eb97984334f86d0c68abea2f7Jaikumar Ganesh    if (nat != NULL) {
179d5ac1ae36b4e096eb97984334f86d0c68abea2f7Jaikumar Ganesh        const char *device_agent_path =
180d5ac1ae36b4e096eb97984334f86d0c68abea2f7Jaikumar Ganesh            "/android/bluetooth/remote_device_agent";
181d5ac1ae36b4e096eb97984334f86d0c68abea2f7Jaikumar Ganesh        dbus_connection_unregister_object_path (nat->conn, device_agent_path);
182d5ac1ae36b4e096eb97984334f86d0c68abea2f7Jaikumar Ganesh    }
183d5ac1ae36b4e096eb97984334f86d0c68abea2f7Jaikumar Ganesh#endif /*HAVE_BLUETOOTH*/
184d5ac1ae36b4e096eb97984334f86d0c68abea2f7Jaikumar Ganesh    return JNI_TRUE;
185d5ac1ae36b4e096eb97984334f86d0c68abea2f7Jaikumar Ganesh}
186d5ac1ae36b4e096eb97984334f86d0c68abea2f7Jaikumar Ganesh
187d5ac1ae36b4e096eb97984334f86d0c68abea2f7Jaikumar Ganeshstatic void cleanupNativeDataNative(JNIEnv* env, jobject object) {
1882653a1e7ca55b03f5230dffa85dfe2705757e2b7Jaikumar Ganesh    LOGV("%s", __FUNCTION__);
189d5ac1ae36b4e096eb97984334f86d0c68abea2f7Jaikumar Ganesh#ifdef HAVE_BLUETOOTH
190d5ac1ae36b4e096eb97984334f86d0c68abea2f7Jaikumar Ganesh    native_data_t *nat =
191d5ac1ae36b4e096eb97984334f86d0c68abea2f7Jaikumar Ganesh        (native_data_t *)env->GetIntField(object, field_mNativeData);
1929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (nat) {
193d5ac1ae36b4e096eb97984334f86d0c68abea2f7Jaikumar Ganesh        free(nat);
194d5ac1ae36b4e096eb97984334f86d0c68abea2f7Jaikumar Ganesh        nat = NULL;
1959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#endif
1979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
1989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jstring getAdapterPathNative(JNIEnv *env, jobject object) {
2002653a1e7ca55b03f5230dffa85dfe2705757e2b7Jaikumar Ganesh    LOGV("%s", __FUNCTION__);
2019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#ifdef HAVE_BLUETOOTH
2029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    native_data_t *nat = get_native_data(env, object);
2039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (nat) {
204d5ac1ae36b4e096eb97984334f86d0c68abea2f7Jaikumar Ganesh        return (env->NewStringUTF(get_adapter_path(env, object)));
2059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#endif
2079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return NULL;
2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jboolean startDiscoveryNative(JNIEnv *env, jobject object) {
2122653a1e7ca55b03f5230dffa85dfe2705757e2b7Jaikumar Ganesh    LOGV("%s", __FUNCTION__);
2139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#ifdef HAVE_BLUETOOTH
2149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    DBusMessage *msg = NULL;
2159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    DBusMessage *reply = NULL;
2169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    DBusError err;
2179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    const char *name;
2189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    jboolean ret = JNI_FALSE;
2199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    native_data_t *nat = get_native_data(env, object);
2219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (nat == NULL) {
2229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        goto done;
2239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    dbus_error_init(&err);
2269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /* Compose the command */
228d5ac1ae36b4e096eb97984334f86d0c68abea2f7Jaikumar Ganesh    msg = dbus_message_new_method_call(BLUEZ_DBUS_BASE_IFC,
229d5ac1ae36b4e096eb97984334f86d0c68abea2f7Jaikumar Ganesh                                       get_adapter_path(env, object),
230d5ac1ae36b4e096eb97984334f86d0c68abea2f7Jaikumar Ganesh                                       DBUS_ADAPTER_IFACE, "StartDiscovery");
2319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (msg == NULL) {
233d5ac1ae36b4e096eb97984334f86d0c68abea2f7Jaikumar Ganesh        if (dbus_error_is_set(&err)) {
234d5ac1ae36b4e096eb97984334f86d0c68abea2f7Jaikumar Ganesh            LOG_AND_FREE_DBUS_ERROR_WITH_MSG(&err, msg);
235d5ac1ae36b4e096eb97984334f86d0c68abea2f7Jaikumar Ganesh        }
2369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        goto done;
2379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /* Send the command. */
2409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    reply = dbus_connection_send_with_reply_and_block(nat->conn, msg, -1, &err);
2419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (dbus_error_is_set(&err)) {
242d5ac1ae36b4e096eb97984334f86d0c68abea2f7Jaikumar Ganesh         LOG_AND_FREE_DBUS_ERROR_WITH_MSG(&err, msg);
243d5ac1ae36b4e096eb97984334f86d0c68abea2f7Jaikumar Ganesh         ret = JNI_FALSE;
244d5ac1ae36b4e096eb97984334f86d0c68abea2f7Jaikumar Ganesh         goto done;
2459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    ret = JNI_TRUE;
2489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectdone:
2499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (reply) dbus_message_unref(reply);
2509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (msg) dbus_message_unref(msg);
2519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return ret;
2529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#else
2539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return JNI_FALSE;
2549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#endif
2559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
2569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
257efc1d16374955f04d713c770ab47d90d190afe83Albert Mojirstatic jboolean stopDiscoveryNative(JNIEnv *env, jobject object) {
258a0c680393f2dd03a937c598b2cb9abf98a58152cMatthew Xie    LOGV("%s", __FUNCTION__);
2599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#ifdef HAVE_BLUETOOTH
2609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    DBusMessage *msg = NULL;
2619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    DBusMessage *reply = NULL;
2629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    DBusError err;
2639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    const char *name;
2649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    native_data_t *nat;
265efc1d16374955f04d713c770ab47d90d190afe83Albert Mojir    jboolean ret = JNI_FALSE;
2669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    dbus_error_init(&err);
2689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    nat = get_native_data(env, object);
2709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (nat == NULL) {
2719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        goto done;
2729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /* Compose the command */
275d5ac1ae36b4e096eb97984334f86d0c68abea2f7Jaikumar Ganesh    msg = dbus_message_new_method_call(BLUEZ_DBUS_BASE_IFC,
276d5ac1ae36b4e096eb97984334f86d0c68abea2f7Jaikumar Ganesh                                       get_adapter_path(env, object),
277d5ac1ae36b4e096eb97984334f86d0c68abea2f7Jaikumar Ganesh                                       DBUS_ADAPTER_IFACE, "StopDiscovery");
2789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (msg == NULL) {
279d5ac1ae36b4e096eb97984334f86d0c68abea2f7Jaikumar Ganesh        if (dbus_error_is_set(&err))
280d5ac1ae36b4e096eb97984334f86d0c68abea2f7Jaikumar Ganesh            LOG_AND_FREE_DBUS_ERROR_WITH_MSG(&err, msg);
2819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        goto done;
2829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /* Send the command. */
2859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    reply = dbus_connection_send_with_reply_and_block(nat->conn, msg, -1, &err);
2869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (dbus_error_is_set(&err)) {
287d5ac1ae36b4e096eb97984334f86d0c68abea2f7Jaikumar Ganesh        if(strncmp(err.name, BLUEZ_DBUS_BASE_IFC ".Error.NotAuthorized",
288d5ac1ae36b4e096eb97984334f86d0c68abea2f7Jaikumar Ganesh                   strlen(BLUEZ_DBUS_BASE_IFC ".Error.NotAuthorized")) == 0) {
2899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // hcid sends this if there is no active discovery to cancel
2909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            LOGV("%s: There was no active discovery to cancel", __FUNCTION__);
2919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            dbus_error_free(&err);
2929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else {
2939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            LOG_AND_FREE_DBUS_ERROR_WITH_MSG(&err, msg);
2949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
295efc1d16374955f04d713c770ab47d90d190afe83Albert Mojir        goto done;
2969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
298efc1d16374955f04d713c770ab47d90d190afe83Albert Mojir    ret = JNI_TRUE;
2999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectdone:
3009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (msg) dbus_message_unref(msg);
3019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (reply) dbus_message_unref(reply);
302efc1d16374955f04d713c770ab47d90d190afe83Albert Mojir    return ret;
303efc1d16374955f04d713c770ab47d90d190afe83Albert Mojir#else
304efc1d16374955f04d713c770ab47d90d190afe83Albert Mojir    return JNI_FALSE;
3059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#endif
3069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
3079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
308cc5494c9996f809e36539b24e8b6b67683383d29Jaikumar Ganeshstatic jbyteArray readAdapterOutOfBandDataNative(JNIEnv *env, jobject object) {
3092653a1e7ca55b03f5230dffa85dfe2705757e2b7Jaikumar Ganesh    LOGV("%s", __FUNCTION__);
310cc5494c9996f809e36539b24e8b6b67683383d29Jaikumar Ganesh#ifdef HAVE_BLUETOOTH
311cc5494c9996f809e36539b24e8b6b67683383d29Jaikumar Ganesh    native_data_t *nat = get_native_data(env, object);
312cc5494c9996f809e36539b24e8b6b67683383d29Jaikumar Ganesh    DBusError err;
313cc5494c9996f809e36539b24e8b6b67683383d29Jaikumar Ganesh    jbyte *hash, *randomizer;
314cc5494c9996f809e36539b24e8b6b67683383d29Jaikumar Ganesh    jbyteArray byteArray = NULL;
315cc5494c9996f809e36539b24e8b6b67683383d29Jaikumar Ganesh    int hash_len, r_len;
316cc5494c9996f809e36539b24e8b6b67683383d29Jaikumar Ganesh    if (nat) {
317cc5494c9996f809e36539b24e8b6b67683383d29Jaikumar Ganesh       DBusMessage *reply = dbus_func_args(env, nat->conn,
318cc5494c9996f809e36539b24e8b6b67683383d29Jaikumar Ganesh                           get_adapter_path(env, object),
319cc5494c9996f809e36539b24e8b6b67683383d29Jaikumar Ganesh                           DBUS_ADAPTER_IFACE, "ReadLocalOutOfBandData",
320cc5494c9996f809e36539b24e8b6b67683383d29Jaikumar Ganesh                           DBUS_TYPE_INVALID);
321cc5494c9996f809e36539b24e8b6b67683383d29Jaikumar Ganesh       if (!reply) return NULL;
322cc5494c9996f809e36539b24e8b6b67683383d29Jaikumar Ganesh
323cc5494c9996f809e36539b24e8b6b67683383d29Jaikumar Ganesh       dbus_error_init(&err);
324cc5494c9996f809e36539b24e8b6b67683383d29Jaikumar Ganesh       if (dbus_message_get_args(reply, &err,
325cc5494c9996f809e36539b24e8b6b67683383d29Jaikumar Ganesh                                DBUS_TYPE_ARRAY, DBUS_TYPE_BYTE, &hash, &hash_len,
326cc5494c9996f809e36539b24e8b6b67683383d29Jaikumar Ganesh                                DBUS_TYPE_ARRAY, DBUS_TYPE_BYTE, &randomizer, &r_len,
327cc5494c9996f809e36539b24e8b6b67683383d29Jaikumar Ganesh                                DBUS_TYPE_INVALID)) {
328cc5494c9996f809e36539b24e8b6b67683383d29Jaikumar Ganesh          if (hash_len == 16 && r_len == 16) {
329cc5494c9996f809e36539b24e8b6b67683383d29Jaikumar Ganesh               byteArray = env->NewByteArray(32);
330cc5494c9996f809e36539b24e8b6b67683383d29Jaikumar Ganesh               if (byteArray) {
331cc5494c9996f809e36539b24e8b6b67683383d29Jaikumar Ganesh                   env->SetByteArrayRegion(byteArray, 0, 16, hash);
332cc5494c9996f809e36539b24e8b6b67683383d29Jaikumar Ganesh                   env->SetByteArrayRegion(byteArray, 16, 16, randomizer);
333cc5494c9996f809e36539b24e8b6b67683383d29Jaikumar Ganesh               }
334cc5494c9996f809e36539b24e8b6b67683383d29Jaikumar Ganesh           } else {
335cc5494c9996f809e36539b24e8b6b67683383d29Jaikumar Ganesh               LOGE("readAdapterOutOfBandDataNative: Hash len = %d, R len = %d",
336cc5494c9996f809e36539b24e8b6b67683383d29Jaikumar Ganesh                                                                  hash_len, r_len);
337cc5494c9996f809e36539b24e8b6b67683383d29Jaikumar Ganesh           }
338cc5494c9996f809e36539b24e8b6b67683383d29Jaikumar Ganesh       } else {
339cc5494c9996f809e36539b24e8b6b67683383d29Jaikumar Ganesh          LOG_AND_FREE_DBUS_ERROR(&err);
340cc5494c9996f809e36539b24e8b6b67683383d29Jaikumar Ganesh       }
341cc5494c9996f809e36539b24e8b6b67683383d29Jaikumar Ganesh       dbus_message_unref(reply);
342cc5494c9996f809e36539b24e8b6b67683383d29Jaikumar Ganesh       return byteArray;
343cc5494c9996f809e36539b24e8b6b67683383d29Jaikumar Ganesh    }
344cc5494c9996f809e36539b24e8b6b67683383d29Jaikumar Ganesh#endif
345cc5494c9996f809e36539b24e8b6b67683383d29Jaikumar Ganesh    return NULL;
346cc5494c9996f809e36539b24e8b6b67683383d29Jaikumar Ganesh}
347cc5494c9996f809e36539b24e8b6b67683383d29Jaikumar Ganesh
348d5ac1ae36b4e096eb97984334f86d0c68abea2f7Jaikumar Ganeshstatic jboolean createPairedDeviceNative(JNIEnv *env, jobject object,
349d5ac1ae36b4e096eb97984334f86d0c68abea2f7Jaikumar Ganesh                                         jstring address, jint timeout_ms) {
3502653a1e7ca55b03f5230dffa85dfe2705757e2b7Jaikumar Ganesh    LOGV("%s", __FUNCTION__);
3519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#ifdef HAVE_BLUETOOTH
3529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    native_data_t *nat = get_native_data(env, object);
35328d139fa953c0b3bf2c66d92587e5287ec4dd5abRobert Greenwalt    jobject eventLoop = env->GetObjectField(object, field_mEventLoop);
35428d139fa953c0b3bf2c66d92587e5287ec4dd5abRobert Greenwalt    struct event_loop_native_data_t *eventLoopNat =
35528d139fa953c0b3bf2c66d92587e5287ec4dd5abRobert Greenwalt            get_EventLoop_native_data(env, eventLoop);
35628d139fa953c0b3bf2c66d92587e5287ec4dd5abRobert Greenwalt
35728d139fa953c0b3bf2c66d92587e5287ec4dd5abRobert Greenwalt    if (nat && eventLoopNat) {
3589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        const char *c_address = env->GetStringUTFChars(address, NULL);
3599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        LOGV("... address = %s", c_address);
3609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        char *context_address = (char *)calloc(BTADDR_SIZE, sizeof(char));
361d5ac1ae36b4e096eb97984334f86d0c68abea2f7Jaikumar Ganesh        const char *capabilities = "DisplayYesNo";
362d5ac1ae36b4e096eb97984334f86d0c68abea2f7Jaikumar Ganesh        const char *agent_path = "/android/bluetooth/remote_device_agent";
363d5ac1ae36b4e096eb97984334f86d0c68abea2f7Jaikumar Ganesh
3649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        strlcpy(context_address, c_address, BTADDR_SIZE);  // for callback
3659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        bool ret = dbus_func_args_async(env, nat->conn, (int)timeout_ms,
366d5ac1ae36b4e096eb97984334f86d0c68abea2f7Jaikumar Ganesh                                        onCreatePairedDeviceResult, // callback
36728d139fa953c0b3bf2c66d92587e5287ec4dd5abRobert Greenwalt                                        context_address,
36828d139fa953c0b3bf2c66d92587e5287ec4dd5abRobert Greenwalt                                        eventLoopNat,
369d5ac1ae36b4e096eb97984334f86d0c68abea2f7Jaikumar Ganesh                                        get_adapter_path(env, object),
370d5ac1ae36b4e096eb97984334f86d0c68abea2f7Jaikumar Ganesh                                        DBUS_ADAPTER_IFACE,
371d5ac1ae36b4e096eb97984334f86d0c68abea2f7Jaikumar Ganesh                                        "CreatePairedDevice",
3729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                        DBUS_TYPE_STRING, &c_address,
373d5ac1ae36b4e096eb97984334f86d0c68abea2f7Jaikumar Ganesh                                        DBUS_TYPE_OBJECT_PATH, &agent_path,
374d5ac1ae36b4e096eb97984334f86d0c68abea2f7Jaikumar Ganesh                                        DBUS_TYPE_STRING, &capabilities,
3759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                        DBUS_TYPE_INVALID);
3769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        env->ReleaseStringUTFChars(address, c_address);
3779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return ret ? JNI_TRUE : JNI_FALSE;
3789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#endif
3819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return JNI_FALSE;
3829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
3839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
384cc5494c9996f809e36539b24e8b6b67683383d29Jaikumar Ganeshstatic jboolean createPairedDeviceOutOfBandNative(JNIEnv *env, jobject object,
385cc5494c9996f809e36539b24e8b6b67683383d29Jaikumar Ganesh                                                jstring address, jint timeout_ms) {
3862653a1e7ca55b03f5230dffa85dfe2705757e2b7Jaikumar Ganesh    LOGV("%s", __FUNCTION__);
387cc5494c9996f809e36539b24e8b6b67683383d29Jaikumar Ganesh#ifdef HAVE_BLUETOOTH
388cc5494c9996f809e36539b24e8b6b67683383d29Jaikumar Ganesh    native_data_t *nat = get_native_data(env, object);
389cc5494c9996f809e36539b24e8b6b67683383d29Jaikumar Ganesh    jobject eventLoop = env->GetObjectField(object, field_mEventLoop);
390cc5494c9996f809e36539b24e8b6b67683383d29Jaikumar Ganesh    struct event_loop_native_data_t *eventLoopNat =
391cc5494c9996f809e36539b24e8b6b67683383d29Jaikumar Ganesh            get_EventLoop_native_data(env, eventLoop);
392cc5494c9996f809e36539b24e8b6b67683383d29Jaikumar Ganesh
393cc5494c9996f809e36539b24e8b6b67683383d29Jaikumar Ganesh    if (nat && eventLoopNat) {
394cc5494c9996f809e36539b24e8b6b67683383d29Jaikumar Ganesh        const char *c_address = env->GetStringUTFChars(address, NULL);
395cc5494c9996f809e36539b24e8b6b67683383d29Jaikumar Ganesh        LOGV("... address = %s", c_address);
396cc5494c9996f809e36539b24e8b6b67683383d29Jaikumar Ganesh        char *context_address = (char *)calloc(BTADDR_SIZE, sizeof(char));
397cc5494c9996f809e36539b24e8b6b67683383d29Jaikumar Ganesh        const char *capabilities = "DisplayYesNo";
398cc5494c9996f809e36539b24e8b6b67683383d29Jaikumar Ganesh        const char *agent_path = "/android/bluetooth/remote_device_agent";
399cc5494c9996f809e36539b24e8b6b67683383d29Jaikumar Ganesh
400cc5494c9996f809e36539b24e8b6b67683383d29Jaikumar Ganesh        strlcpy(context_address, c_address, BTADDR_SIZE);  // for callback
401cc5494c9996f809e36539b24e8b6b67683383d29Jaikumar Ganesh        bool ret = dbus_func_args_async(env, nat->conn, (int)timeout_ms,
402cc5494c9996f809e36539b24e8b6b67683383d29Jaikumar Ganesh                                        onCreatePairedDeviceResult, // callback
403cc5494c9996f809e36539b24e8b6b67683383d29Jaikumar Ganesh                                        context_address,
404cc5494c9996f809e36539b24e8b6b67683383d29Jaikumar Ganesh                                        eventLoopNat,
405cc5494c9996f809e36539b24e8b6b67683383d29Jaikumar Ganesh                                        get_adapter_path(env, object),
406cc5494c9996f809e36539b24e8b6b67683383d29Jaikumar Ganesh                                        DBUS_ADAPTER_IFACE,
407cc5494c9996f809e36539b24e8b6b67683383d29Jaikumar Ganesh                                        "CreatePairedDeviceOutOfBand",
408cc5494c9996f809e36539b24e8b6b67683383d29Jaikumar Ganesh                                        DBUS_TYPE_STRING, &c_address,
409cc5494c9996f809e36539b24e8b6b67683383d29Jaikumar Ganesh                                        DBUS_TYPE_OBJECT_PATH, &agent_path,
410cc5494c9996f809e36539b24e8b6b67683383d29Jaikumar Ganesh                                        DBUS_TYPE_STRING, &capabilities,
411cc5494c9996f809e36539b24e8b6b67683383d29Jaikumar Ganesh                                        DBUS_TYPE_INVALID);
412cc5494c9996f809e36539b24e8b6b67683383d29Jaikumar Ganesh        env->ReleaseStringUTFChars(address, c_address);
413cc5494c9996f809e36539b24e8b6b67683383d29Jaikumar Ganesh        return ret ? JNI_TRUE : JNI_FALSE;
414cc5494c9996f809e36539b24e8b6b67683383d29Jaikumar Ganesh    }
415cc5494c9996f809e36539b24e8b6b67683383d29Jaikumar Ganesh#endif
416cc5494c9996f809e36539b24e8b6b67683383d29Jaikumar Ganesh    return JNI_FALSE;
417cc5494c9996f809e36539b24e8b6b67683383d29Jaikumar Ganesh}
418cc5494c9996f809e36539b24e8b6b67683383d29Jaikumar Ganesh
419d5ac1ae36b4e096eb97984334f86d0c68abea2f7Jaikumar Ganeshstatic jint getDeviceServiceChannelNative(JNIEnv *env, jobject object,
420d5ac1ae36b4e096eb97984334f86d0c68abea2f7Jaikumar Ganesh                                          jstring path,
421d5ac1ae36b4e096eb97984334f86d0c68abea2f7Jaikumar Ganesh                                          jstring pattern, jint attr_id) {
4229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#ifdef HAVE_BLUETOOTH
4232653a1e7ca55b03f5230dffa85dfe2705757e2b7Jaikumar Ganesh    LOGV("%s", __FUNCTION__);
4249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    native_data_t *nat = get_native_data(env, object);
425d5ac1ae36b4e096eb97984334f86d0c68abea2f7Jaikumar Ganesh    jobject eventLoop = env->GetObjectField(object, field_mEventLoop);
426d5ac1ae36b4e096eb97984334f86d0c68abea2f7Jaikumar Ganesh    struct event_loop_native_data_t *eventLoopNat =
427d5ac1ae36b4e096eb97984334f86d0c68abea2f7Jaikumar Ganesh            get_EventLoop_native_data(env, eventLoop);
428d5ac1ae36b4e096eb97984334f86d0c68abea2f7Jaikumar Ganesh    if (nat && eventLoopNat) {
429d5ac1ae36b4e096eb97984334f86d0c68abea2f7Jaikumar Ganesh        const char *c_pattern = env->GetStringUTFChars(pattern, NULL);
430d5ac1ae36b4e096eb97984334f86d0c68abea2f7Jaikumar Ganesh        const char *c_path = env->GetStringUTFChars(path, NULL);
431d5ac1ae36b4e096eb97984334f86d0c68abea2f7Jaikumar Ganesh        LOGV("... pattern = %s", c_pattern);
432d5ac1ae36b4e096eb97984334f86d0c68abea2f7Jaikumar Ganesh        LOGV("... attr_id = %#X", attr_id);
4339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        DBusMessage *reply =
434d5ac1ae36b4e096eb97984334f86d0c68abea2f7Jaikumar Ganesh            dbus_func_args(env, nat->conn, c_path,
435d5ac1ae36b4e096eb97984334f86d0c68abea2f7Jaikumar Ganesh                           DBUS_DEVICE_IFACE, "GetServiceAttributeValue",
436d5ac1ae36b4e096eb97984334f86d0c68abea2f7Jaikumar Ganesh                           DBUS_TYPE_STRING, &c_pattern,
437d5ac1ae36b4e096eb97984334f86d0c68abea2f7Jaikumar Ganesh                           DBUS_TYPE_UINT16, &attr_id,
438d5ac1ae36b4e096eb97984334f86d0c68abea2f7Jaikumar Ganesh                           DBUS_TYPE_INVALID);
439d5ac1ae36b4e096eb97984334f86d0c68abea2f7Jaikumar Ganesh        env->ReleaseStringUTFChars(pattern, c_pattern);
440d5ac1ae36b4e096eb97984334f86d0c68abea2f7Jaikumar Ganesh        env->ReleaseStringUTFChars(path, c_path);
441d5ac1ae36b4e096eb97984334f86d0c68abea2f7Jaikumar Ganesh        return reply ? dbus_returns_int32(env, reply) : -1;
4429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#endif
444d5ac1ae36b4e096eb97984334f86d0c68abea2f7Jaikumar Ganesh    return -1;
4459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
4469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
447d5ac1ae36b4e096eb97984334f86d0c68abea2f7Jaikumar Ganeshstatic jboolean cancelDeviceCreationNative(JNIEnv *env, jobject object,
448d5ac1ae36b4e096eb97984334f86d0c68abea2f7Jaikumar Ganesh                                           jstring address) {
4492653a1e7ca55b03f5230dffa85dfe2705757e2b7Jaikumar Ganesh    LOGV("%s", __FUNCTION__);
4509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    jboolean result = JNI_FALSE;
4519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#ifdef HAVE_BLUETOOTH
4529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    native_data_t *nat = get_native_data(env, object);
4539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (nat) {
4549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        const char *c_address = env->GetStringUTFChars(address, NULL);
4559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        DBusError err;
4569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        dbus_error_init(&err);
457d5ac1ae36b4e096eb97984334f86d0c68abea2f7Jaikumar Ganesh        LOGV("... address = %s", c_address);
4589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        DBusMessage *reply =
459d5ac1ae36b4e096eb97984334f86d0c68abea2f7Jaikumar Ganesh            dbus_func_args_timeout(env, nat->conn, -1,
460d5ac1ae36b4e096eb97984334f86d0c68abea2f7Jaikumar Ganesh                                   get_adapter_path(env, object),
461d5ac1ae36b4e096eb97984334f86d0c68abea2f7Jaikumar Ganesh                                   DBUS_ADAPTER_IFACE, "CancelDeviceCreation",
462d5ac1ae36b4e096eb97984334f86d0c68abea2f7Jaikumar Ganesh                                   DBUS_TYPE_STRING, &c_address,
463d5ac1ae36b4e096eb97984334f86d0c68abea2f7Jaikumar Ganesh                                   DBUS_TYPE_INVALID);
4649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        env->ReleaseStringUTFChars(address, c_address);
465d5ac1ae36b4e096eb97984334f86d0c68abea2f7Jaikumar Ganesh        if (!reply) {
466d5ac1ae36b4e096eb97984334f86d0c68abea2f7Jaikumar Ganesh            if (dbus_error_is_set(&err)) {
467d5ac1ae36b4e096eb97984334f86d0c68abea2f7Jaikumar Ganesh                LOG_AND_FREE_DBUS_ERROR(&err);
468d5ac1ae36b4e096eb97984334f86d0c68abea2f7Jaikumar Ganesh            } else
469d5ac1ae36b4e096eb97984334f86d0c68abea2f7Jaikumar Ganesh                LOGE("DBus reply is NULL in function %s", __FUNCTION__);
470d5ac1ae36b4e096eb97984334f86d0c68abea2f7Jaikumar Ganesh            return JNI_FALSE;
4719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else {
472d5ac1ae36b4e096eb97984334f86d0c68abea2f7Jaikumar Ganesh            result = JNI_TRUE;
4739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
474d5ac1ae36b4e096eb97984334f86d0c68abea2f7Jaikumar Ganesh        dbus_message_unref(reply);
4759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#endif
4779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return JNI_FALSE;
4789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
4799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
480d5ac1ae36b4e096eb97984334f86d0c68abea2f7Jaikumar Ganeshstatic jboolean removeDeviceNative(JNIEnv *env, jobject object, jstring object_path) {
4812653a1e7ca55b03f5230dffa85dfe2705757e2b7Jaikumar Ganesh    LOGV("%s", __FUNCTION__);
4829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#ifdef HAVE_BLUETOOTH
4839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    native_data_t *nat = get_native_data(env, object);
4849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (nat) {
485d5ac1ae36b4e096eb97984334f86d0c68abea2f7Jaikumar Ganesh        const char *c_object_path = env->GetStringUTFChars(object_path, NULL);
486995ae82f38d93050a5f1b80433e8ae844a05953dJaikumar Ganesh        bool ret = dbus_func_args_async(env, nat->conn, -1,
487995ae82f38d93050a5f1b80433e8ae844a05953dJaikumar Ganesh                                        NULL,
488995ae82f38d93050a5f1b80433e8ae844a05953dJaikumar Ganesh                                        NULL,
489995ae82f38d93050a5f1b80433e8ae844a05953dJaikumar Ganesh                                        NULL,
490995ae82f38d93050a5f1b80433e8ae844a05953dJaikumar Ganesh                                        get_adapter_path(env, object),
491995ae82f38d93050a5f1b80433e8ae844a05953dJaikumar Ganesh                                        DBUS_ADAPTER_IFACE,
492995ae82f38d93050a5f1b80433e8ae844a05953dJaikumar Ganesh                                        "RemoveDevice",
493995ae82f38d93050a5f1b80433e8ae844a05953dJaikumar Ganesh                                        DBUS_TYPE_OBJECT_PATH, &c_object_path,
494995ae82f38d93050a5f1b80433e8ae844a05953dJaikumar Ganesh                                        DBUS_TYPE_INVALID);
495d5ac1ae36b4e096eb97984334f86d0c68abea2f7Jaikumar Ganesh        env->ReleaseStringUTFChars(object_path, c_object_path);
496995ae82f38d93050a5f1b80433e8ae844a05953dJaikumar Ganesh        return ret ? JNI_TRUE : JNI_FALSE;
4979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#endif
499995ae82f38d93050a5f1b80433e8ae844a05953dJaikumar Ganesh    return JNI_FALSE;
5009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
5019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jint enableNative(JNIEnv *env, jobject object) {
5039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#ifdef HAVE_BLUETOOTH
5042653a1e7ca55b03f5230dffa85dfe2705757e2b7Jaikumar Ganesh    LOGV("%s", __FUNCTION__);
5059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return bt_enable();
5069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#endif
5079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return -1;
5089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
5099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jint disableNative(JNIEnv *env, jobject object) {
5119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#ifdef HAVE_BLUETOOTH
5122653a1e7ca55b03f5230dffa85dfe2705757e2b7Jaikumar Ganesh    LOGV("%s", __FUNCTION__);
5139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return bt_disable();
5149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#endif
5159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return -1;
5169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
5179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jint isEnabledNative(JNIEnv *env, jobject object) {
5199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#ifdef HAVE_BLUETOOTH
5202653a1e7ca55b03f5230dffa85dfe2705757e2b7Jaikumar Ganesh    LOGV("%s", __FUNCTION__);
5219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return bt_is_enabled();
5229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#endif
5239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return -1;
5249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
5259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
526b0eca41de0bb6747d8648b134912782e45e4cbefJaikumar Ganeshstatic jboolean setPairingConfirmationNative(JNIEnv *env, jobject object,
527b0eca41de0bb6747d8648b134912782e45e4cbefJaikumar Ganesh                                             jstring address, bool confirm,
528b0eca41de0bb6747d8648b134912782e45e4cbefJaikumar Ganesh                                             int nativeData) {
529b0eca41de0bb6747d8648b134912782e45e4cbefJaikumar Ganesh#ifdef HAVE_BLUETOOTH
5302653a1e7ca55b03f5230dffa85dfe2705757e2b7Jaikumar Ganesh    LOGV("%s", __FUNCTION__);
531b0eca41de0bb6747d8648b134912782e45e4cbefJaikumar Ganesh    native_data_t *nat = get_native_data(env, object);
532b0eca41de0bb6747d8648b134912782e45e4cbefJaikumar Ganesh    if (nat) {
533b0eca41de0bb6747d8648b134912782e45e4cbefJaikumar Ganesh        DBusMessage *msg = (DBusMessage *)nativeData;
534b0eca41de0bb6747d8648b134912782e45e4cbefJaikumar Ganesh        DBusMessage *reply;
535b0eca41de0bb6747d8648b134912782e45e4cbefJaikumar Ganesh        if (confirm) {
536b0eca41de0bb6747d8648b134912782e45e4cbefJaikumar Ganesh            reply = dbus_message_new_method_return(msg);
537b0eca41de0bb6747d8648b134912782e45e4cbefJaikumar Ganesh        } else {
538b0eca41de0bb6747d8648b134912782e45e4cbefJaikumar Ganesh            reply = dbus_message_new_error(msg,
539b0eca41de0bb6747d8648b134912782e45e4cbefJaikumar Ganesh                "org.bluez.Error.Rejected", "User rejected confirmation");
540b0eca41de0bb6747d8648b134912782e45e4cbefJaikumar Ganesh        }
541b0eca41de0bb6747d8648b134912782e45e4cbefJaikumar Ganesh
542b0eca41de0bb6747d8648b134912782e45e4cbefJaikumar Ganesh        if (!reply) {
54332d8571f509c392dca732c243e9b2138c15daecfJaikumar Ganesh            LOGE("%s: Cannot create message reply to RequestPasskeyConfirmation or"
54432d8571f509c392dca732c243e9b2138c15daecfJaikumar Ganesh                  "RequestPairingConsent to D-Bus\n", __FUNCTION__);
545b0eca41de0bb6747d8648b134912782e45e4cbefJaikumar Ganesh            dbus_message_unref(msg);
546b0eca41de0bb6747d8648b134912782e45e4cbefJaikumar Ganesh            return JNI_FALSE;
547b0eca41de0bb6747d8648b134912782e45e4cbefJaikumar Ganesh        }
548b0eca41de0bb6747d8648b134912782e45e4cbefJaikumar Ganesh
549b0eca41de0bb6747d8648b134912782e45e4cbefJaikumar Ganesh        dbus_connection_send(nat->conn, reply, NULL);
550b0eca41de0bb6747d8648b134912782e45e4cbefJaikumar Ganesh        dbus_message_unref(msg);
551b0eca41de0bb6747d8648b134912782e45e4cbefJaikumar Ganesh        dbus_message_unref(reply);
552b0eca41de0bb6747d8648b134912782e45e4cbefJaikumar Ganesh        return JNI_TRUE;
553b0eca41de0bb6747d8648b134912782e45e4cbefJaikumar Ganesh    }
554b0eca41de0bb6747d8648b134912782e45e4cbefJaikumar Ganesh#endif
555b0eca41de0bb6747d8648b134912782e45e4cbefJaikumar Ganesh    return JNI_FALSE;
556b0eca41de0bb6747d8648b134912782e45e4cbefJaikumar Ganesh}
557b0eca41de0bb6747d8648b134912782e45e4cbefJaikumar Ganesh
558b0eca41de0bb6747d8648b134912782e45e4cbefJaikumar Ganeshstatic jboolean setPasskeyNative(JNIEnv *env, jobject object, jstring address,
559b0eca41de0bb6747d8648b134912782e45e4cbefJaikumar Ganesh                         int passkey, int nativeData) {
560b0eca41de0bb6747d8648b134912782e45e4cbefJaikumar Ganesh#ifdef HAVE_BLUETOOTH
5612653a1e7ca55b03f5230dffa85dfe2705757e2b7Jaikumar Ganesh    LOGV("%s", __FUNCTION__);
562b0eca41de0bb6747d8648b134912782e45e4cbefJaikumar Ganesh    native_data_t *nat = get_native_data(env, object);
563b0eca41de0bb6747d8648b134912782e45e4cbefJaikumar Ganesh    if (nat) {
564b0eca41de0bb6747d8648b134912782e45e4cbefJaikumar Ganesh        DBusMessage *msg = (DBusMessage *)nativeData;
565b0eca41de0bb6747d8648b134912782e45e4cbefJaikumar Ganesh        DBusMessage *reply = dbus_message_new_method_return(msg);
566b0eca41de0bb6747d8648b134912782e45e4cbefJaikumar Ganesh        if (!reply) {
567b0eca41de0bb6747d8648b134912782e45e4cbefJaikumar Ganesh            LOGE("%s: Cannot create message reply to return Passkey code to "
568b0eca41de0bb6747d8648b134912782e45e4cbefJaikumar Ganesh                 "D-Bus\n", __FUNCTION__);
569b0eca41de0bb6747d8648b134912782e45e4cbefJaikumar Ganesh            dbus_message_unref(msg);
570b0eca41de0bb6747d8648b134912782e45e4cbefJaikumar Ganesh            return JNI_FALSE;
571b0eca41de0bb6747d8648b134912782e45e4cbefJaikumar Ganesh        }
572b0eca41de0bb6747d8648b134912782e45e4cbefJaikumar Ganesh
573b0eca41de0bb6747d8648b134912782e45e4cbefJaikumar Ganesh        dbus_message_append_args(reply, DBUS_TYPE_UINT32, (uint32_t *)&passkey,
574b0eca41de0bb6747d8648b134912782e45e4cbefJaikumar Ganesh                                 DBUS_TYPE_INVALID);
575b0eca41de0bb6747d8648b134912782e45e4cbefJaikumar Ganesh
576b0eca41de0bb6747d8648b134912782e45e4cbefJaikumar Ganesh        dbus_connection_send(nat->conn, reply, NULL);
577b0eca41de0bb6747d8648b134912782e45e4cbefJaikumar Ganesh        dbus_message_unref(msg);
578b0eca41de0bb6747d8648b134912782e45e4cbefJaikumar Ganesh        dbus_message_unref(reply);
579b0eca41de0bb6747d8648b134912782e45e4cbefJaikumar Ganesh        return JNI_TRUE;
580b0eca41de0bb6747d8648b134912782e45e4cbefJaikumar Ganesh    }
581b0eca41de0bb6747d8648b134912782e45e4cbefJaikumar Ganesh#endif
582b0eca41de0bb6747d8648b134912782e45e4cbefJaikumar Ganesh    return JNI_FALSE;
583b0eca41de0bb6747d8648b134912782e45e4cbefJaikumar Ganesh}
584b0eca41de0bb6747d8648b134912782e45e4cbefJaikumar Ganesh
585cc5494c9996f809e36539b24e8b6b67683383d29Jaikumar Ganeshstatic jboolean setRemoteOutOfBandDataNative(JNIEnv *env, jobject object, jstring address,
586cc5494c9996f809e36539b24e8b6b67683383d29Jaikumar Ganesh                         jbyteArray hash, jbyteArray randomizer, int nativeData) {
587cc5494c9996f809e36539b24e8b6b67683383d29Jaikumar Ganesh#ifdef HAVE_BLUETOOTH
5882653a1e7ca55b03f5230dffa85dfe2705757e2b7Jaikumar Ganesh    LOGV("%s", __FUNCTION__);
589cc5494c9996f809e36539b24e8b6b67683383d29Jaikumar Ganesh    native_data_t *nat = get_native_data(env, object);
590cc5494c9996f809e36539b24e8b6b67683383d29Jaikumar Ganesh    if (nat) {
591cc5494c9996f809e36539b24e8b6b67683383d29Jaikumar Ganesh        DBusMessage *msg = (DBusMessage *)nativeData;
592cc5494c9996f809e36539b24e8b6b67683383d29Jaikumar Ganesh        DBusMessage *reply = dbus_message_new_method_return(msg);
593cc5494c9996f809e36539b24e8b6b67683383d29Jaikumar Ganesh        jbyte *h_ptr = env->GetByteArrayElements(hash, NULL);
594cc5494c9996f809e36539b24e8b6b67683383d29Jaikumar Ganesh        jbyte *r_ptr = env->GetByteArrayElements(randomizer, NULL);
595cc5494c9996f809e36539b24e8b6b67683383d29Jaikumar Ganesh        if (!reply) {
596cc5494c9996f809e36539b24e8b6b67683383d29Jaikumar Ganesh            LOGE("%s: Cannot create message reply to return remote OOB data to "
597cc5494c9996f809e36539b24e8b6b67683383d29Jaikumar Ganesh                 "D-Bus\n", __FUNCTION__);
598cc5494c9996f809e36539b24e8b6b67683383d29Jaikumar Ganesh            dbus_message_unref(msg);
599cc5494c9996f809e36539b24e8b6b67683383d29Jaikumar Ganesh            return JNI_FALSE;
600cc5494c9996f809e36539b24e8b6b67683383d29Jaikumar Ganesh        }
601cc5494c9996f809e36539b24e8b6b67683383d29Jaikumar Ganesh
602cc5494c9996f809e36539b24e8b6b67683383d29Jaikumar Ganesh        dbus_message_append_args(reply,
603cc5494c9996f809e36539b24e8b6b67683383d29Jaikumar Ganesh                                DBUS_TYPE_ARRAY, DBUS_TYPE_BYTE, &h_ptr, 16,
604cc5494c9996f809e36539b24e8b6b67683383d29Jaikumar Ganesh                                DBUS_TYPE_ARRAY, DBUS_TYPE_BYTE, &r_ptr, 16,
605cc5494c9996f809e36539b24e8b6b67683383d29Jaikumar Ganesh                                DBUS_TYPE_INVALID);
606cc5494c9996f809e36539b24e8b6b67683383d29Jaikumar Ganesh
607cc5494c9996f809e36539b24e8b6b67683383d29Jaikumar Ganesh        env->ReleaseByteArrayElements(hash, h_ptr, 0);
608cc5494c9996f809e36539b24e8b6b67683383d29Jaikumar Ganesh        env->ReleaseByteArrayElements(randomizer, r_ptr, 0);
609cc5494c9996f809e36539b24e8b6b67683383d29Jaikumar Ganesh
610cc5494c9996f809e36539b24e8b6b67683383d29Jaikumar Ganesh        dbus_connection_send(nat->conn, reply, NULL);
611cc5494c9996f809e36539b24e8b6b67683383d29Jaikumar Ganesh        dbus_message_unref(msg);
612cc5494c9996f809e36539b24e8b6b67683383d29Jaikumar Ganesh        dbus_message_unref(reply);
613cc5494c9996f809e36539b24e8b6b67683383d29Jaikumar Ganesh        return JNI_TRUE;
614cc5494c9996f809e36539b24e8b6b67683383d29Jaikumar Ganesh    }
615cc5494c9996f809e36539b24e8b6b67683383d29Jaikumar Ganesh#endif
616cc5494c9996f809e36539b24e8b6b67683383d29Jaikumar Ganesh    return JNI_FALSE;
617cc5494c9996f809e36539b24e8b6b67683383d29Jaikumar Ganesh}
618cc5494c9996f809e36539b24e8b6b67683383d29Jaikumar Ganesh
619a0c680393f2dd03a937c598b2cb9abf98a58152cMatthew Xiestatic jboolean setAuthorizationNative(JNIEnv *env, jobject object, jstring address,
620a0c680393f2dd03a937c598b2cb9abf98a58152cMatthew Xie                         jboolean val, int nativeData) {
621a0c680393f2dd03a937c598b2cb9abf98a58152cMatthew Xie#ifdef HAVE_BLUETOOTH
622a0c680393f2dd03a937c598b2cb9abf98a58152cMatthew Xie  LOGV("%s", __FUNCTION__);
623a0c680393f2dd03a937c598b2cb9abf98a58152cMatthew Xie    native_data_t *nat = get_native_data(env, object);
624a0c680393f2dd03a937c598b2cb9abf98a58152cMatthew Xie    if (nat) {
625a0c680393f2dd03a937c598b2cb9abf98a58152cMatthew Xie        DBusMessage *msg = (DBusMessage *)nativeData;
626a0c680393f2dd03a937c598b2cb9abf98a58152cMatthew Xie        DBusMessage *reply;
627a0c680393f2dd03a937c598b2cb9abf98a58152cMatthew Xie        if (val) {
628a0c680393f2dd03a937c598b2cb9abf98a58152cMatthew Xie            reply = dbus_message_new_method_return(msg);
629a0c680393f2dd03a937c598b2cb9abf98a58152cMatthew Xie        } else {
630a0c680393f2dd03a937c598b2cb9abf98a58152cMatthew Xie            reply = dbus_message_new_error(msg,
631a0c680393f2dd03a937c598b2cb9abf98a58152cMatthew Xie                    "org.bluez.Error.Rejected", "Authorization rejected");
632a0c680393f2dd03a937c598b2cb9abf98a58152cMatthew Xie        }
633a0c680393f2dd03a937c598b2cb9abf98a58152cMatthew Xie        if (!reply) {
634a0c680393f2dd03a937c598b2cb9abf98a58152cMatthew Xie            LOGE("%s: Cannot create message reply D-Bus\n", __FUNCTION__);
635a0c680393f2dd03a937c598b2cb9abf98a58152cMatthew Xie            dbus_message_unref(msg);
636a0c680393f2dd03a937c598b2cb9abf98a58152cMatthew Xie            return JNI_FALSE;
637a0c680393f2dd03a937c598b2cb9abf98a58152cMatthew Xie        }
638a0c680393f2dd03a937c598b2cb9abf98a58152cMatthew Xie
639a0c680393f2dd03a937c598b2cb9abf98a58152cMatthew Xie        dbus_connection_send(nat->conn, reply, NULL);
640a0c680393f2dd03a937c598b2cb9abf98a58152cMatthew Xie        dbus_message_unref(msg);
641a0c680393f2dd03a937c598b2cb9abf98a58152cMatthew Xie        dbus_message_unref(reply);
642a0c680393f2dd03a937c598b2cb9abf98a58152cMatthew Xie        return JNI_TRUE;
643a0c680393f2dd03a937c598b2cb9abf98a58152cMatthew Xie    }
644a0c680393f2dd03a937c598b2cb9abf98a58152cMatthew Xie#endif
645a0c680393f2dd03a937c598b2cb9abf98a58152cMatthew Xie    return JNI_FALSE;
646a0c680393f2dd03a937c598b2cb9abf98a58152cMatthew Xie}
647a0c680393f2dd03a937c598b2cb9abf98a58152cMatthew Xie
6489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jboolean setPinNative(JNIEnv *env, jobject object, jstring address,
6499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                         jstring pin, int nativeData) {
6509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#ifdef HAVE_BLUETOOTH
6512653a1e7ca55b03f5230dffa85dfe2705757e2b7Jaikumar Ganesh    LOGV("%s", __FUNCTION__);
6529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    native_data_t *nat = get_native_data(env, object);
6539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (nat) {
6549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        DBusMessage *msg = (DBusMessage *)nativeData;
6559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        DBusMessage *reply = dbus_message_new_method_return(msg);
6569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!reply) {
6579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            LOGE("%s: Cannot create message reply to return PIN code to "
6589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 "D-Bus\n", __FUNCTION__);
6599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            dbus_message_unref(msg);
6609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return JNI_FALSE;
6619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
6629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        const char *c_pin = env->GetStringUTFChars(pin, NULL);
6649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        dbus_message_append_args(reply, DBUS_TYPE_STRING, &c_pin,
6669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                 DBUS_TYPE_INVALID);
6679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        dbus_connection_send(nat->conn, reply, NULL);
6699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        dbus_message_unref(msg);
6709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        dbus_message_unref(reply);
6719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        env->ReleaseStringUTFChars(pin, c_pin);
6729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return JNI_TRUE;
6739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#endif
6759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return JNI_FALSE;
6769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
6779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
678b0eca41de0bb6747d8648b134912782e45e4cbefJaikumar Ganeshstatic jboolean cancelPairingUserInputNative(JNIEnv *env, jobject object,
679b0eca41de0bb6747d8648b134912782e45e4cbefJaikumar Ganesh                                            jstring address, int nativeData) {
6809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#ifdef HAVE_BLUETOOTH
6812653a1e7ca55b03f5230dffa85dfe2705757e2b7Jaikumar Ganesh    LOGV("%s", __FUNCTION__);
6829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    native_data_t *nat = get_native_data(env, object);
6839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (nat) {
6849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        DBusMessage *msg = (DBusMessage *)nativeData;
6859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        DBusMessage *reply = dbus_message_new_error(msg,
686b0eca41de0bb6747d8648b134912782e45e4cbefJaikumar Ganesh                "org.bluez.Error.Canceled", "Pairing User Input was canceled");
6879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!reply) {
688b0eca41de0bb6747d8648b134912782e45e4cbefJaikumar Ganesh            LOGE("%s: Cannot create message reply to return cancelUserInput to"
6899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 "D-BUS\n", __FUNCTION__);
6909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            dbus_message_unref(msg);
6919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return JNI_FALSE;
6929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
6939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        dbus_connection_send(nat->conn, reply, NULL);
6959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        dbus_message_unref(msg);
6969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        dbus_message_unref(reply);
6979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return JNI_TRUE;
6989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#endif
7009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return JNI_FALSE;
7019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
7029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
703d5ac1ae36b4e096eb97984334f86d0c68abea2f7Jaikumar Ganeshstatic jobjectArray getDevicePropertiesNative(JNIEnv *env, jobject object,
704d5ac1ae36b4e096eb97984334f86d0c68abea2f7Jaikumar Ganesh                                                    jstring path)
705d5ac1ae36b4e096eb97984334f86d0c68abea2f7Jaikumar Ganesh{
706d5ac1ae36b4e096eb97984334f86d0c68abea2f7Jaikumar Ganesh#ifdef HAVE_BLUETOOTH
7072653a1e7ca55b03f5230dffa85dfe2705757e2b7Jaikumar Ganesh    LOGV("%s", __FUNCTION__);
708d5ac1ae36b4e096eb97984334f86d0c68abea2f7Jaikumar Ganesh    native_data_t *nat = get_native_data(env, object);
709d5ac1ae36b4e096eb97984334f86d0c68abea2f7Jaikumar Ganesh    if (nat) {
710d5ac1ae36b4e096eb97984334f86d0c68abea2f7Jaikumar Ganesh        DBusMessage *msg, *reply;
711d5ac1ae36b4e096eb97984334f86d0c68abea2f7Jaikumar Ganesh        DBusError err;
712d5ac1ae36b4e096eb97984334f86d0c68abea2f7Jaikumar Ganesh        dbus_error_init(&err);
713d5ac1ae36b4e096eb97984334f86d0c68abea2f7Jaikumar Ganesh
714d5ac1ae36b4e096eb97984334f86d0c68abea2f7Jaikumar Ganesh        const char *c_path = env->GetStringUTFChars(path, NULL);
715d5ac1ae36b4e096eb97984334f86d0c68abea2f7Jaikumar Ganesh        reply = dbus_func_args_timeout(env,
716d5ac1ae36b4e096eb97984334f86d0c68abea2f7Jaikumar Ganesh                                   nat->conn, -1, c_path,
717d5ac1ae36b4e096eb97984334f86d0c68abea2f7Jaikumar Ganesh                                   DBUS_DEVICE_IFACE, "GetProperties",
718d5ac1ae36b4e096eb97984334f86d0c68abea2f7Jaikumar Ganesh                                   DBUS_TYPE_INVALID);
719d5ac1ae36b4e096eb97984334f86d0c68abea2f7Jaikumar Ganesh        env->ReleaseStringUTFChars(path, c_path);
720d5ac1ae36b4e096eb97984334f86d0c68abea2f7Jaikumar Ganesh
721d5ac1ae36b4e096eb97984334f86d0c68abea2f7Jaikumar Ganesh        if (!reply) {
722d5ac1ae36b4e096eb97984334f86d0c68abea2f7Jaikumar Ganesh            if (dbus_error_is_set(&err)) {
723d5ac1ae36b4e096eb97984334f86d0c68abea2f7Jaikumar Ganesh                LOG_AND_FREE_DBUS_ERROR(&err);
724d5ac1ae36b4e096eb97984334f86d0c68abea2f7Jaikumar Ganesh            } else
725d5ac1ae36b4e096eb97984334f86d0c68abea2f7Jaikumar Ganesh                LOGE("DBus reply is NULL in function %s", __FUNCTION__);
726d5ac1ae36b4e096eb97984334f86d0c68abea2f7Jaikumar Ganesh            return NULL;
727d5ac1ae36b4e096eb97984334f86d0c68abea2f7Jaikumar Ganesh        }
7286d56b530e189d7213ec77d43d3d8af97fee04179Jaikumar Ganesh        env->PushLocalFrame(PROPERTIES_NREFS);
7296d56b530e189d7213ec77d43d3d8af97fee04179Jaikumar Ganesh
730d5ac1ae36b4e096eb97984334f86d0c68abea2f7Jaikumar Ganesh        DBusMessageIter iter;
731d5ac1ae36b4e096eb97984334f86d0c68abea2f7Jaikumar Ganesh        jobjectArray str_array = NULL;
732d5ac1ae36b4e096eb97984334f86d0c68abea2f7Jaikumar Ganesh        if (dbus_message_iter_init(reply, &iter))
733d5ac1ae36b4e096eb97984334f86d0c68abea2f7Jaikumar Ganesh           str_array =  parse_remote_device_properties(env, &iter);
734d5ac1ae36b4e096eb97984334f86d0c68abea2f7Jaikumar Ganesh        dbus_message_unref(reply);
7356d56b530e189d7213ec77d43d3d8af97fee04179Jaikumar Ganesh
736b32b1ddf722a94962321f78c8cd87c6924e1e9a9Brian Carlstrom        return (jobjectArray) env->PopLocalFrame(str_array);
737d5ac1ae36b4e096eb97984334f86d0c68abea2f7Jaikumar Ganesh    }
738d5ac1ae36b4e096eb97984334f86d0c68abea2f7Jaikumar Ganesh#endif
739d5ac1ae36b4e096eb97984334f86d0c68abea2f7Jaikumar Ganesh    return NULL;
740d5ac1ae36b4e096eb97984334f86d0c68abea2f7Jaikumar Ganesh}
741d5ac1ae36b4e096eb97984334f86d0c68abea2f7Jaikumar Ganesh
742d5ac1ae36b4e096eb97984334f86d0c68abea2f7Jaikumar Ganeshstatic jobjectArray getAdapterPropertiesNative(JNIEnv *env, jobject object) {
743d5ac1ae36b4e096eb97984334f86d0c68abea2f7Jaikumar Ganesh#ifdef HAVE_BLUETOOTH
7442653a1e7ca55b03f5230dffa85dfe2705757e2b7Jaikumar Ganesh    LOGV("%s", __FUNCTION__);
745d5ac1ae36b4e096eb97984334f86d0c68abea2f7Jaikumar Ganesh    native_data_t *nat = get_native_data(env, object);
746d5ac1ae36b4e096eb97984334f86d0c68abea2f7Jaikumar Ganesh    if (nat) {
747d5ac1ae36b4e096eb97984334f86d0c68abea2f7Jaikumar Ganesh        DBusMessage *msg, *reply;
748d5ac1ae36b4e096eb97984334f86d0c68abea2f7Jaikumar Ganesh        DBusError err;
749d5ac1ae36b4e096eb97984334f86d0c68abea2f7Jaikumar Ganesh        dbus_error_init(&err);
750d5ac1ae36b4e096eb97984334f86d0c68abea2f7Jaikumar Ganesh
751d5ac1ae36b4e096eb97984334f86d0c68abea2f7Jaikumar Ganesh        reply = dbus_func_args_timeout(env,
752d5ac1ae36b4e096eb97984334f86d0c68abea2f7Jaikumar Ganesh                                   nat->conn, -1, get_adapter_path(env, object),
753d5ac1ae36b4e096eb97984334f86d0c68abea2f7Jaikumar Ganesh                                   DBUS_ADAPTER_IFACE, "GetProperties",
754d5ac1ae36b4e096eb97984334f86d0c68abea2f7Jaikumar Ganesh                                   DBUS_TYPE_INVALID);
755d5ac1ae36b4e096eb97984334f86d0c68abea2f7Jaikumar Ganesh        if (!reply) {
756d5ac1ae36b4e096eb97984334f86d0c68abea2f7Jaikumar Ganesh            if (dbus_error_is_set(&err)) {
757d5ac1ae36b4e096eb97984334f86d0c68abea2f7Jaikumar Ganesh                LOG_AND_FREE_DBUS_ERROR(&err);
758d5ac1ae36b4e096eb97984334f86d0c68abea2f7Jaikumar Ganesh            } else
759d5ac1ae36b4e096eb97984334f86d0c68abea2f7Jaikumar Ganesh                LOGE("DBus reply is NULL in function %s", __FUNCTION__);
760d5ac1ae36b4e096eb97984334f86d0c68abea2f7Jaikumar Ganesh            return NULL;
761d5ac1ae36b4e096eb97984334f86d0c68abea2f7Jaikumar Ganesh        }
7626d56b530e189d7213ec77d43d3d8af97fee04179Jaikumar Ganesh        env->PushLocalFrame(PROPERTIES_NREFS);
7636d56b530e189d7213ec77d43d3d8af97fee04179Jaikumar Ganesh
764d5ac1ae36b4e096eb97984334f86d0c68abea2f7Jaikumar Ganesh        DBusMessageIter iter;
765d5ac1ae36b4e096eb97984334f86d0c68abea2f7Jaikumar Ganesh        jobjectArray str_array = NULL;
766d5ac1ae36b4e096eb97984334f86d0c68abea2f7Jaikumar Ganesh        if (dbus_message_iter_init(reply, &iter))
767d5ac1ae36b4e096eb97984334f86d0c68abea2f7Jaikumar Ganesh            str_array = parse_adapter_properties(env, &iter);
768d5ac1ae36b4e096eb97984334f86d0c68abea2f7Jaikumar Ganesh        dbus_message_unref(reply);
7696d56b530e189d7213ec77d43d3d8af97fee04179Jaikumar Ganesh
770b32b1ddf722a94962321f78c8cd87c6924e1e9a9Brian Carlstrom        return (jobjectArray) env->PopLocalFrame(str_array);
771d5ac1ae36b4e096eb97984334f86d0c68abea2f7Jaikumar Ganesh    }
772d5ac1ae36b4e096eb97984334f86d0c68abea2f7Jaikumar Ganesh#endif
773d5ac1ae36b4e096eb97984334f86d0c68abea2f7Jaikumar Ganesh    return NULL;
774d5ac1ae36b4e096eb97984334f86d0c68abea2f7Jaikumar Ganesh}
775d5ac1ae36b4e096eb97984334f86d0c68abea2f7Jaikumar Ganesh
776d5ac1ae36b4e096eb97984334f86d0c68abea2f7Jaikumar Ganeshstatic jboolean setAdapterPropertyNative(JNIEnv *env, jobject object, jstring key,
777d5ac1ae36b4e096eb97984334f86d0c68abea2f7Jaikumar Ganesh                                         void *value, jint type) {
778d5ac1ae36b4e096eb97984334f86d0c68abea2f7Jaikumar Ganesh#ifdef HAVE_BLUETOOTH
7792653a1e7ca55b03f5230dffa85dfe2705757e2b7Jaikumar Ganesh    LOGV("%s", __FUNCTION__);
780d5ac1ae36b4e096eb97984334f86d0c68abea2f7Jaikumar Ganesh    native_data_t *nat = get_native_data(env, object);
781d5ac1ae36b4e096eb97984334f86d0c68abea2f7Jaikumar Ganesh    if (nat) {
782ff7db40be166844000749de17382e424617e11b2Jaikumar Ganesh        DBusMessage *msg;
783d5ac1ae36b4e096eb97984334f86d0c68abea2f7Jaikumar Ganesh        DBusMessageIter iter;
784ff7db40be166844000749de17382e424617e11b2Jaikumar Ganesh        dbus_bool_t reply = JNI_FALSE;
785d5ac1ae36b4e096eb97984334f86d0c68abea2f7Jaikumar Ganesh        const char *c_key = env->GetStringUTFChars(key, NULL);
786d5ac1ae36b4e096eb97984334f86d0c68abea2f7Jaikumar Ganesh
787d5ac1ae36b4e096eb97984334f86d0c68abea2f7Jaikumar Ganesh        msg = dbus_message_new_method_call(BLUEZ_DBUS_BASE_IFC,
788d5ac1ae36b4e096eb97984334f86d0c68abea2f7Jaikumar Ganesh                                           get_adapter_path(env, object),
789d5ac1ae36b4e096eb97984334f86d0c68abea2f7Jaikumar Ganesh                                           DBUS_ADAPTER_IFACE, "SetProperty");
790d5ac1ae36b4e096eb97984334f86d0c68abea2f7Jaikumar Ganesh        if (!msg) {
791d5ac1ae36b4e096eb97984334f86d0c68abea2f7Jaikumar Ganesh            LOGE("%s: Can't allocate new method call for GetProperties!",
792d5ac1ae36b4e096eb97984334f86d0c68abea2f7Jaikumar Ganesh                  __FUNCTION__);
793efa1dd716da3372cc74a201d11de5e0ef1a9fe9aLixin Yue            env->ReleaseStringUTFChars(key, c_key);
794d5ac1ae36b4e096eb97984334f86d0c68abea2f7Jaikumar Ganesh            return JNI_FALSE;
795d5ac1ae36b4e096eb97984334f86d0c68abea2f7Jaikumar Ganesh        }
796d5ac1ae36b4e096eb97984334f86d0c68abea2f7Jaikumar Ganesh
797d5ac1ae36b4e096eb97984334f86d0c68abea2f7Jaikumar Ganesh        dbus_message_append_args(msg, DBUS_TYPE_STRING, &c_key, DBUS_TYPE_INVALID);
798d5ac1ae36b4e096eb97984334f86d0c68abea2f7Jaikumar Ganesh        dbus_message_iter_init_append(msg, &iter);
799d5ac1ae36b4e096eb97984334f86d0c68abea2f7Jaikumar Ganesh        append_variant(&iter, type, value);
800d5ac1ae36b4e096eb97984334f86d0c68abea2f7Jaikumar Ganesh
801ff7db40be166844000749de17382e424617e11b2Jaikumar Ganesh        // Asynchronous call - the callbacks come via propertyChange
802ff7db40be166844000749de17382e424617e11b2Jaikumar Ganesh        reply = dbus_connection_send_with_reply(nat->conn, msg, NULL, -1);
803d5ac1ae36b4e096eb97984334f86d0c68abea2f7Jaikumar Ganesh        dbus_message_unref(msg);
804d5ac1ae36b4e096eb97984334f86d0c68abea2f7Jaikumar Ganesh
805d5ac1ae36b4e096eb97984334f86d0c68abea2f7Jaikumar Ganesh        env->ReleaseStringUTFChars(key, c_key);
806ff7db40be166844000749de17382e424617e11b2Jaikumar Ganesh        return reply ? JNI_TRUE : JNI_FALSE;
807d5ac1ae36b4e096eb97984334f86d0c68abea2f7Jaikumar Ganesh
808d5ac1ae36b4e096eb97984334f86d0c68abea2f7Jaikumar Ganesh    }
809d5ac1ae36b4e096eb97984334f86d0c68abea2f7Jaikumar Ganesh#endif
810d5ac1ae36b4e096eb97984334f86d0c68abea2f7Jaikumar Ganesh    return JNI_FALSE;
811d5ac1ae36b4e096eb97984334f86d0c68abea2f7Jaikumar Ganesh}
812d5ac1ae36b4e096eb97984334f86d0c68abea2f7Jaikumar Ganesh
813d5ac1ae36b4e096eb97984334f86d0c68abea2f7Jaikumar Ganeshstatic jboolean setAdapterPropertyStringNative(JNIEnv *env, jobject object, jstring key,
814d5ac1ae36b4e096eb97984334f86d0c68abea2f7Jaikumar Ganesh                                               jstring value) {
815d46134946dd6c227d60cc27915b6fd477e36a598Jaikumar Ganesh#ifdef HAVE_BLUETOOTH
816d5ac1ae36b4e096eb97984334f86d0c68abea2f7Jaikumar Ganesh    const char *c_value = env->GetStringUTFChars(value, NULL);
817d5ac1ae36b4e096eb97984334f86d0c68abea2f7Jaikumar Ganesh    jboolean ret =  setAdapterPropertyNative(env, object, key, (void *)&c_value, DBUS_TYPE_STRING);
818d5ac1ae36b4e096eb97984334f86d0c68abea2f7Jaikumar Ganesh    env->ReleaseStringUTFChars(value, (char *)c_value);
819d5ac1ae36b4e096eb97984334f86d0c68abea2f7Jaikumar Ganesh    return ret;
820d46134946dd6c227d60cc27915b6fd477e36a598Jaikumar Ganesh#else
821d46134946dd6c227d60cc27915b6fd477e36a598Jaikumar Ganesh    return JNI_FALSE;
822d46134946dd6c227d60cc27915b6fd477e36a598Jaikumar Ganesh#endif
823d5ac1ae36b4e096eb97984334f86d0c68abea2f7Jaikumar Ganesh}
824d5ac1ae36b4e096eb97984334f86d0c68abea2f7Jaikumar Ganesh
825d5ac1ae36b4e096eb97984334f86d0c68abea2f7Jaikumar Ganeshstatic jboolean setAdapterPropertyIntegerNative(JNIEnv *env, jobject object, jstring key,
826d5ac1ae36b4e096eb97984334f86d0c68abea2f7Jaikumar Ganesh                                               jint value) {
827d46134946dd6c227d60cc27915b6fd477e36a598Jaikumar Ganesh#ifdef HAVE_BLUETOOTH
828d5ac1ae36b4e096eb97984334f86d0c68abea2f7Jaikumar Ganesh    return setAdapterPropertyNative(env, object, key, (void *)&value, DBUS_TYPE_UINT32);
829d46134946dd6c227d60cc27915b6fd477e36a598Jaikumar Ganesh#else
830d46134946dd6c227d60cc27915b6fd477e36a598Jaikumar Ganesh    return JNI_FALSE;
831d46134946dd6c227d60cc27915b6fd477e36a598Jaikumar Ganesh#endif
832d5ac1ae36b4e096eb97984334f86d0c68abea2f7Jaikumar Ganesh}
833d5ac1ae36b4e096eb97984334f86d0c68abea2f7Jaikumar Ganesh
834d5ac1ae36b4e096eb97984334f86d0c68abea2f7Jaikumar Ganeshstatic jboolean setAdapterPropertyBooleanNative(JNIEnv *env, jobject object, jstring key,
835d5ac1ae36b4e096eb97984334f86d0c68abea2f7Jaikumar Ganesh                                               jint value) {
836d46134946dd6c227d60cc27915b6fd477e36a598Jaikumar Ganesh#ifdef HAVE_BLUETOOTH
837d5ac1ae36b4e096eb97984334f86d0c68abea2f7Jaikumar Ganesh    return setAdapterPropertyNative(env, object, key, (void *)&value, DBUS_TYPE_BOOLEAN);
838d46134946dd6c227d60cc27915b6fd477e36a598Jaikumar Ganesh#else
839d46134946dd6c227d60cc27915b6fd477e36a598Jaikumar Ganesh    return JNI_FALSE;
840d46134946dd6c227d60cc27915b6fd477e36a598Jaikumar Ganesh#endif
841d5ac1ae36b4e096eb97984334f86d0c68abea2f7Jaikumar Ganesh}
842d5ac1ae36b4e096eb97984334f86d0c68abea2f7Jaikumar Ganesh
843efa1dd716da3372cc74a201d11de5e0ef1a9fe9aLixin Yuestatic jboolean setDevicePropertyNative(JNIEnv *env, jobject object, jstring path,
844efa1dd716da3372cc74a201d11de5e0ef1a9fe9aLixin Yue                                               jstring key, void *value, jint type) {
845efa1dd716da3372cc74a201d11de5e0ef1a9fe9aLixin Yue#ifdef HAVE_BLUETOOTH
8462653a1e7ca55b03f5230dffa85dfe2705757e2b7Jaikumar Ganesh    LOGV("%s", __FUNCTION__);
847efa1dd716da3372cc74a201d11de5e0ef1a9fe9aLixin Yue    native_data_t *nat = get_native_data(env, object);
848efa1dd716da3372cc74a201d11de5e0ef1a9fe9aLixin Yue    if (nat) {
8493fd36737b3bdf0100045cf46fe98534431c3fd5cMatthew Xie        DBusMessage *msg;
850efa1dd716da3372cc74a201d11de5e0ef1a9fe9aLixin Yue        DBusMessageIter iter;
8513fd36737b3bdf0100045cf46fe98534431c3fd5cMatthew Xie        dbus_bool_t reply = JNI_FALSE;
852efa1dd716da3372cc74a201d11de5e0ef1a9fe9aLixin Yue
853efa1dd716da3372cc74a201d11de5e0ef1a9fe9aLixin Yue        const char *c_key = env->GetStringUTFChars(key, NULL);
854efa1dd716da3372cc74a201d11de5e0ef1a9fe9aLixin Yue        const char *c_path = env->GetStringUTFChars(path, NULL);
855efa1dd716da3372cc74a201d11de5e0ef1a9fe9aLixin Yue
856efa1dd716da3372cc74a201d11de5e0ef1a9fe9aLixin Yue        msg = dbus_message_new_method_call(BLUEZ_DBUS_BASE_IFC,
857efa1dd716da3372cc74a201d11de5e0ef1a9fe9aLixin Yue                                          c_path, DBUS_DEVICE_IFACE, "SetProperty");
858efa1dd716da3372cc74a201d11de5e0ef1a9fe9aLixin Yue        if (!msg) {
859efa1dd716da3372cc74a201d11de5e0ef1a9fe9aLixin Yue            LOGE("%s: Can't allocate new method call for device SetProperty!", __FUNCTION__);
860efa1dd716da3372cc74a201d11de5e0ef1a9fe9aLixin Yue            env->ReleaseStringUTFChars(key, c_key);
861efa1dd716da3372cc74a201d11de5e0ef1a9fe9aLixin Yue            env->ReleaseStringUTFChars(path, c_path);
862efa1dd716da3372cc74a201d11de5e0ef1a9fe9aLixin Yue            return JNI_FALSE;
863efa1dd716da3372cc74a201d11de5e0ef1a9fe9aLixin Yue        }
864efa1dd716da3372cc74a201d11de5e0ef1a9fe9aLixin Yue
865efa1dd716da3372cc74a201d11de5e0ef1a9fe9aLixin Yue        dbus_message_append_args(msg, DBUS_TYPE_STRING, &c_key, DBUS_TYPE_INVALID);
866efa1dd716da3372cc74a201d11de5e0ef1a9fe9aLixin Yue        dbus_message_iter_init_append(msg, &iter);
867efa1dd716da3372cc74a201d11de5e0ef1a9fe9aLixin Yue        append_variant(&iter, type, value);
868efa1dd716da3372cc74a201d11de5e0ef1a9fe9aLixin Yue
8693fd36737b3bdf0100045cf46fe98534431c3fd5cMatthew Xie        // Asynchronous call - the callbacks come via Device propertyChange
8703fd36737b3bdf0100045cf46fe98534431c3fd5cMatthew Xie        reply = dbus_connection_send_with_reply(nat->conn, msg, NULL, -1);
871efa1dd716da3372cc74a201d11de5e0ef1a9fe9aLixin Yue        dbus_message_unref(msg);
872efa1dd716da3372cc74a201d11de5e0ef1a9fe9aLixin Yue
873efa1dd716da3372cc74a201d11de5e0ef1a9fe9aLixin Yue        env->ReleaseStringUTFChars(path, c_path);
8743fd36737b3bdf0100045cf46fe98534431c3fd5cMatthew Xie        env->ReleaseStringUTFChars(key, c_key);
8753fd36737b3bdf0100045cf46fe98534431c3fd5cMatthew Xie
8763fd36737b3bdf0100045cf46fe98534431c3fd5cMatthew Xie        return reply ? JNI_TRUE : JNI_FALSE;
877efa1dd716da3372cc74a201d11de5e0ef1a9fe9aLixin Yue    }
878efa1dd716da3372cc74a201d11de5e0ef1a9fe9aLixin Yue#endif
879efa1dd716da3372cc74a201d11de5e0ef1a9fe9aLixin Yue    return JNI_FALSE;
880efa1dd716da3372cc74a201d11de5e0ef1a9fe9aLixin Yue}
881efa1dd716da3372cc74a201d11de5e0ef1a9fe9aLixin Yue
882efa1dd716da3372cc74a201d11de5e0ef1a9fe9aLixin Yuestatic jboolean setDevicePropertyBooleanNative(JNIEnv *env, jobject object,
883efa1dd716da3372cc74a201d11de5e0ef1a9fe9aLixin Yue                                                     jstring path, jstring key, jint value) {
884efa1dd716da3372cc74a201d11de5e0ef1a9fe9aLixin Yue#ifdef HAVE_BLUETOOTH
885efa1dd716da3372cc74a201d11de5e0ef1a9fe9aLixin Yue    return setDevicePropertyNative(env, object, path, key,
886efa1dd716da3372cc74a201d11de5e0ef1a9fe9aLixin Yue                                        (void *)&value, DBUS_TYPE_BOOLEAN);
887efa1dd716da3372cc74a201d11de5e0ef1a9fe9aLixin Yue#else
888efa1dd716da3372cc74a201d11de5e0ef1a9fe9aLixin Yue    return JNI_FALSE;
889efa1dd716da3372cc74a201d11de5e0ef1a9fe9aLixin Yue#endif
890efa1dd716da3372cc74a201d11de5e0ef1a9fe9aLixin Yue}
891d5ac1ae36b4e096eb97984334f86d0c68abea2f7Jaikumar Ganesh
892269e81a563cfe080d7f241d0d46411d3c946c111Matthew Xiestatic jboolean setDevicePropertyStringNative(JNIEnv *env, jobject object,
893269e81a563cfe080d7f241d0d46411d3c946c111Matthew Xie                                              jstring path, jstring key, jstring value) {
894269e81a563cfe080d7f241d0d46411d3c946c111Matthew Xie#ifdef HAVE_BLUETOOTH
895269e81a563cfe080d7f241d0d46411d3c946c111Matthew Xie    const char *c_value = env->GetStringUTFChars(value, NULL);
896269e81a563cfe080d7f241d0d46411d3c946c111Matthew Xie    jboolean ret = setDevicePropertyNative(env, object, path, key,
897269e81a563cfe080d7f241d0d46411d3c946c111Matthew Xie                                           (void *)&c_value, DBUS_TYPE_STRING);
898269e81a563cfe080d7f241d0d46411d3c946c111Matthew Xie    env->ReleaseStringUTFChars(value, (char *)c_value);
899269e81a563cfe080d7f241d0d46411d3c946c111Matthew Xie    return ret;
900269e81a563cfe080d7f241d0d46411d3c946c111Matthew Xie#else
901269e81a563cfe080d7f241d0d46411d3c946c111Matthew Xie    return JNI_FALSE;
902269e81a563cfe080d7f241d0d46411d3c946c111Matthew Xie#endif
903269e81a563cfe080d7f241d0d46411d3c946c111Matthew Xie}
9041caa6d111eff6814760ec156b14adc29aa3aae6cJaikumar Ganesh
9051caa6d111eff6814760ec156b14adc29aa3aae6cJaikumar Ganeshstatic jboolean createDeviceNative(JNIEnv *env, jobject object,
9061caa6d111eff6814760ec156b14adc29aa3aae6cJaikumar Ganesh                                                jstring address) {
9072653a1e7ca55b03f5230dffa85dfe2705757e2b7Jaikumar Ganesh    LOGV("%s", __FUNCTION__);
9081caa6d111eff6814760ec156b14adc29aa3aae6cJaikumar Ganesh#ifdef HAVE_BLUETOOTH
9091caa6d111eff6814760ec156b14adc29aa3aae6cJaikumar Ganesh    native_data_t *nat = get_native_data(env, object);
9101caa6d111eff6814760ec156b14adc29aa3aae6cJaikumar Ganesh    jobject eventLoop = env->GetObjectField(object, field_mEventLoop);
9111caa6d111eff6814760ec156b14adc29aa3aae6cJaikumar Ganesh    struct event_loop_native_data_t *eventLoopNat =
9121caa6d111eff6814760ec156b14adc29aa3aae6cJaikumar Ganesh            get_EventLoop_native_data(env, eventLoop);
9131caa6d111eff6814760ec156b14adc29aa3aae6cJaikumar Ganesh
9141caa6d111eff6814760ec156b14adc29aa3aae6cJaikumar Ganesh    if (nat && eventLoopNat) {
9151caa6d111eff6814760ec156b14adc29aa3aae6cJaikumar Ganesh        const char *c_address = env->GetStringUTFChars(address, NULL);
9161caa6d111eff6814760ec156b14adc29aa3aae6cJaikumar Ganesh        LOGV("... address = %s", c_address);
9171caa6d111eff6814760ec156b14adc29aa3aae6cJaikumar Ganesh        char *context_address = (char *)calloc(BTADDR_SIZE, sizeof(char));
9181caa6d111eff6814760ec156b14adc29aa3aae6cJaikumar Ganesh        strlcpy(context_address, c_address, BTADDR_SIZE);  // for callback
9191caa6d111eff6814760ec156b14adc29aa3aae6cJaikumar Ganesh
9201caa6d111eff6814760ec156b14adc29aa3aae6cJaikumar Ganesh        bool ret = dbus_func_args_async(env, nat->conn, -1,
9211caa6d111eff6814760ec156b14adc29aa3aae6cJaikumar Ganesh                                        onCreateDeviceResult,
9221caa6d111eff6814760ec156b14adc29aa3aae6cJaikumar Ganesh                                        context_address,
9231caa6d111eff6814760ec156b14adc29aa3aae6cJaikumar Ganesh                                        eventLoopNat,
9241caa6d111eff6814760ec156b14adc29aa3aae6cJaikumar Ganesh                                        get_adapter_path(env, object),
9251caa6d111eff6814760ec156b14adc29aa3aae6cJaikumar Ganesh                                        DBUS_ADAPTER_IFACE,
9261caa6d111eff6814760ec156b14adc29aa3aae6cJaikumar Ganesh                                        "CreateDevice",
9271caa6d111eff6814760ec156b14adc29aa3aae6cJaikumar Ganesh                                        DBUS_TYPE_STRING, &c_address,
9281caa6d111eff6814760ec156b14adc29aa3aae6cJaikumar Ganesh                                        DBUS_TYPE_INVALID);
9291caa6d111eff6814760ec156b14adc29aa3aae6cJaikumar Ganesh        env->ReleaseStringUTFChars(address, c_address);
9301caa6d111eff6814760ec156b14adc29aa3aae6cJaikumar Ganesh        return ret ? JNI_TRUE : JNI_FALSE;
9311caa6d111eff6814760ec156b14adc29aa3aae6cJaikumar Ganesh    }
9321caa6d111eff6814760ec156b14adc29aa3aae6cJaikumar Ganesh#endif
9331caa6d111eff6814760ec156b14adc29aa3aae6cJaikumar Ganesh    return JNI_FALSE;
9341caa6d111eff6814760ec156b14adc29aa3aae6cJaikumar Ganesh}
9351caa6d111eff6814760ec156b14adc29aa3aae6cJaikumar Ganesh
9361caa6d111eff6814760ec156b14adc29aa3aae6cJaikumar Ganeshstatic jboolean discoverServicesNative(JNIEnv *env, jobject object,
9371caa6d111eff6814760ec156b14adc29aa3aae6cJaikumar Ganesh                                               jstring path, jstring pattern) {
9382653a1e7ca55b03f5230dffa85dfe2705757e2b7Jaikumar Ganesh    LOGV("%s", __FUNCTION__);
9391caa6d111eff6814760ec156b14adc29aa3aae6cJaikumar Ganesh#ifdef HAVE_BLUETOOTH
9401caa6d111eff6814760ec156b14adc29aa3aae6cJaikumar Ganesh    native_data_t *nat = get_native_data(env, object);
9411caa6d111eff6814760ec156b14adc29aa3aae6cJaikumar Ganesh    jobject eventLoop = env->GetObjectField(object, field_mEventLoop);
9421caa6d111eff6814760ec156b14adc29aa3aae6cJaikumar Ganesh    struct event_loop_native_data_t *eventLoopNat =
9431caa6d111eff6814760ec156b14adc29aa3aae6cJaikumar Ganesh            get_EventLoop_native_data(env, eventLoop);
9441caa6d111eff6814760ec156b14adc29aa3aae6cJaikumar Ganesh
9451caa6d111eff6814760ec156b14adc29aa3aae6cJaikumar Ganesh    if (nat && eventLoopNat) {
9461caa6d111eff6814760ec156b14adc29aa3aae6cJaikumar Ganesh        const char *c_path = env->GetStringUTFChars(path, NULL);
9471caa6d111eff6814760ec156b14adc29aa3aae6cJaikumar Ganesh        const char *c_pattern = env->GetStringUTFChars(pattern, NULL);
9481caa6d111eff6814760ec156b14adc29aa3aae6cJaikumar Ganesh        int len = env->GetStringLength(path) + 1;
9491caa6d111eff6814760ec156b14adc29aa3aae6cJaikumar Ganesh        char *context_path = (char *)calloc(len, sizeof(char));
9501caa6d111eff6814760ec156b14adc29aa3aae6cJaikumar Ganesh        strlcpy(context_path, c_path, len);  // for callback
9511caa6d111eff6814760ec156b14adc29aa3aae6cJaikumar Ganesh
9521caa6d111eff6814760ec156b14adc29aa3aae6cJaikumar Ganesh        LOGV("... Object Path = %s", c_path);
9531caa6d111eff6814760ec156b14adc29aa3aae6cJaikumar Ganesh        LOGV("... Pattern = %s, strlen = %d", c_pattern, strlen(c_pattern));
9541caa6d111eff6814760ec156b14adc29aa3aae6cJaikumar Ganesh
9551caa6d111eff6814760ec156b14adc29aa3aae6cJaikumar Ganesh        bool ret = dbus_func_args_async(env, nat->conn, -1,
9561caa6d111eff6814760ec156b14adc29aa3aae6cJaikumar Ganesh                                        onDiscoverServicesResult,
9571caa6d111eff6814760ec156b14adc29aa3aae6cJaikumar Ganesh                                        context_path,
9581caa6d111eff6814760ec156b14adc29aa3aae6cJaikumar Ganesh                                        eventLoopNat,
9591caa6d111eff6814760ec156b14adc29aa3aae6cJaikumar Ganesh                                        c_path,
9601caa6d111eff6814760ec156b14adc29aa3aae6cJaikumar Ganesh                                        DBUS_DEVICE_IFACE,
9611caa6d111eff6814760ec156b14adc29aa3aae6cJaikumar Ganesh                                        "DiscoverServices",
9621caa6d111eff6814760ec156b14adc29aa3aae6cJaikumar Ganesh                                        DBUS_TYPE_STRING, &c_pattern,
9631caa6d111eff6814760ec156b14adc29aa3aae6cJaikumar Ganesh                                        DBUS_TYPE_INVALID);
9641caa6d111eff6814760ec156b14adc29aa3aae6cJaikumar Ganesh        env->ReleaseStringUTFChars(path, c_path);
9651caa6d111eff6814760ec156b14adc29aa3aae6cJaikumar Ganesh        env->ReleaseStringUTFChars(pattern, c_pattern);
9661caa6d111eff6814760ec156b14adc29aa3aae6cJaikumar Ganesh        return ret ? JNI_TRUE : JNI_FALSE;
9671caa6d111eff6814760ec156b14adc29aa3aae6cJaikumar Ganesh    }
9681caa6d111eff6814760ec156b14adc29aa3aae6cJaikumar Ganesh#endif
9691caa6d111eff6814760ec156b14adc29aa3aae6cJaikumar Ganesh    return JNI_FALSE;
9701caa6d111eff6814760ec156b14adc29aa3aae6cJaikumar Ganesh}
9711caa6d111eff6814760ec156b14adc29aa3aae6cJaikumar Ganesh
97284690c88f37f395094147d27ace8319a2803a522Jaikumar Ganesh#ifdef HAVE_BLUETOOTH
973aecb2c5f709d38a46cf448f986b60f590651d3faJaikumar Ganeshstatic jintArray extract_handles(JNIEnv *env, DBusMessage *reply) {
97484690c88f37f395094147d27ace8319a2803a522Jaikumar Ganesh    jint *handles;
97584690c88f37f395094147d27ace8319a2803a522Jaikumar Ganesh    jintArray handleArray = NULL;
97684690c88f37f395094147d27ace8319a2803a522Jaikumar Ganesh    int len;
97784690c88f37f395094147d27ace8319a2803a522Jaikumar Ganesh
97884690c88f37f395094147d27ace8319a2803a522Jaikumar Ganesh    DBusError err;
97984690c88f37f395094147d27ace8319a2803a522Jaikumar Ganesh    dbus_error_init(&err);
98084690c88f37f395094147d27ace8319a2803a522Jaikumar Ganesh
98184690c88f37f395094147d27ace8319a2803a522Jaikumar Ganesh    if (dbus_message_get_args(reply, &err,
98284690c88f37f395094147d27ace8319a2803a522Jaikumar Ganesh                              DBUS_TYPE_ARRAY, DBUS_TYPE_UINT32, &handles, &len,
98384690c88f37f395094147d27ace8319a2803a522Jaikumar Ganesh                              DBUS_TYPE_INVALID)) {
98484690c88f37f395094147d27ace8319a2803a522Jaikumar Ganesh        handleArray = env->NewIntArray(len);
98584690c88f37f395094147d27ace8319a2803a522Jaikumar Ganesh        if (handleArray) {
98684690c88f37f395094147d27ace8319a2803a522Jaikumar Ganesh            env->SetIntArrayRegion(handleArray, 0, len, handles);
98784690c88f37f395094147d27ace8319a2803a522Jaikumar Ganesh        } else {
98884690c88f37f395094147d27ace8319a2803a522Jaikumar Ganesh            LOGE("Null array in extract_handles");
98984690c88f37f395094147d27ace8319a2803a522Jaikumar Ganesh        }
99084690c88f37f395094147d27ace8319a2803a522Jaikumar Ganesh    } else {
99184690c88f37f395094147d27ace8319a2803a522Jaikumar Ganesh        LOG_AND_FREE_DBUS_ERROR(&err);
99284690c88f37f395094147d27ace8319a2803a522Jaikumar Ganesh    }
99384690c88f37f395094147d27ace8319a2803a522Jaikumar Ganesh    return handleArray;
99484690c88f37f395094147d27ace8319a2803a522Jaikumar Ganesh}
995aecb2c5f709d38a46cf448f986b60f590651d3faJaikumar Ganesh#endif
99684690c88f37f395094147d27ace8319a2803a522Jaikumar Ganesh
99784690c88f37f395094147d27ace8319a2803a522Jaikumar Ganeshstatic jintArray addReservedServiceRecordsNative(JNIEnv *env, jobject object,
99884690c88f37f395094147d27ace8319a2803a522Jaikumar Ganesh                                                jintArray uuids) {
9992653a1e7ca55b03f5230dffa85dfe2705757e2b7Jaikumar Ganesh    LOGV("%s", __FUNCTION__);
100084690c88f37f395094147d27ace8319a2803a522Jaikumar Ganesh#ifdef HAVE_BLUETOOTH
100184690c88f37f395094147d27ace8319a2803a522Jaikumar Ganesh    DBusMessage *reply = NULL;
100284690c88f37f395094147d27ace8319a2803a522Jaikumar Ganesh
100384690c88f37f395094147d27ace8319a2803a522Jaikumar Ganesh    native_data_t *nat = get_native_data(env, object);
100484690c88f37f395094147d27ace8319a2803a522Jaikumar Ganesh
100584690c88f37f395094147d27ace8319a2803a522Jaikumar Ganesh    jint* svc_classes = env->GetIntArrayElements(uuids, NULL);
100684690c88f37f395094147d27ace8319a2803a522Jaikumar Ganesh    if (!svc_classes) return NULL;
100784690c88f37f395094147d27ace8319a2803a522Jaikumar Ganesh
100884690c88f37f395094147d27ace8319a2803a522Jaikumar Ganesh    int len = env->GetArrayLength(uuids);
100984690c88f37f395094147d27ace8319a2803a522Jaikumar Ganesh    reply = dbus_func_args(env, nat->conn,
101084690c88f37f395094147d27ace8319a2803a522Jaikumar Ganesh                            get_adapter_path(env, object),
101184690c88f37f395094147d27ace8319a2803a522Jaikumar Ganesh                            DBUS_ADAPTER_IFACE, "AddReservedServiceRecords",
101284690c88f37f395094147d27ace8319a2803a522Jaikumar Ganesh                            DBUS_TYPE_ARRAY, DBUS_TYPE_UINT32,
101384690c88f37f395094147d27ace8319a2803a522Jaikumar Ganesh                            &svc_classes, len, DBUS_TYPE_INVALID);
101484690c88f37f395094147d27ace8319a2803a522Jaikumar Ganesh    env->ReleaseIntArrayElements(uuids, svc_classes, 0);
101584690c88f37f395094147d27ace8319a2803a522Jaikumar Ganesh    return reply ? extract_handles(env, reply) : NULL;
101684690c88f37f395094147d27ace8319a2803a522Jaikumar Ganesh
101784690c88f37f395094147d27ace8319a2803a522Jaikumar Ganesh#endif
101884690c88f37f395094147d27ace8319a2803a522Jaikumar Ganesh    return NULL;
101984690c88f37f395094147d27ace8319a2803a522Jaikumar Ganesh}
102084690c88f37f395094147d27ace8319a2803a522Jaikumar Ganesh
102184690c88f37f395094147d27ace8319a2803a522Jaikumar Ganeshstatic jboolean removeReservedServiceRecordsNative(JNIEnv *env, jobject object,
102284690c88f37f395094147d27ace8319a2803a522Jaikumar Ganesh                                                   jintArray handles) {
10232653a1e7ca55b03f5230dffa85dfe2705757e2b7Jaikumar Ganesh    LOGV("%s", __FUNCTION__);
102484690c88f37f395094147d27ace8319a2803a522Jaikumar Ganesh#ifdef HAVE_BLUETOOTH
102584690c88f37f395094147d27ace8319a2803a522Jaikumar Ganesh    native_data_t *nat = get_native_data(env, object);
102684690c88f37f395094147d27ace8319a2803a522Jaikumar Ganesh    jint *values = env->GetIntArrayElements(handles, NULL);
102784690c88f37f395094147d27ace8319a2803a522Jaikumar Ganesh    DBusMessage *msg = NULL;
102884690c88f37f395094147d27ace8319a2803a522Jaikumar Ganesh    DBusMessage *reply = NULL;
102984690c88f37f395094147d27ace8319a2803a522Jaikumar Ganesh    if (values == NULL) return JNI_FALSE;
103084690c88f37f395094147d27ace8319a2803a522Jaikumar Ganesh
103184690c88f37f395094147d27ace8319a2803a522Jaikumar Ganesh    jsize len = env->GetArrayLength(handles);
103284690c88f37f395094147d27ace8319a2803a522Jaikumar Ganesh
103384690c88f37f395094147d27ace8319a2803a522Jaikumar Ganesh    reply = dbus_func_args(env, nat->conn,
103484690c88f37f395094147d27ace8319a2803a522Jaikumar Ganesh                            get_adapter_path(env, object),
103584690c88f37f395094147d27ace8319a2803a522Jaikumar Ganesh                            DBUS_ADAPTER_IFACE, "RemoveReservedServiceRecords",
103684690c88f37f395094147d27ace8319a2803a522Jaikumar Ganesh                            DBUS_TYPE_ARRAY, DBUS_TYPE_UINT32,
103784690c88f37f395094147d27ace8319a2803a522Jaikumar Ganesh                            &values, len, DBUS_TYPE_INVALID);
103884690c88f37f395094147d27ace8319a2803a522Jaikumar Ganesh    env->ReleaseIntArrayElements(handles, values, NULL);
103984690c88f37f395094147d27ace8319a2803a522Jaikumar Ganesh    return reply ? JNI_TRUE : JNI_FALSE;
104084690c88f37f395094147d27ace8319a2803a522Jaikumar Ganesh#endif
104184690c88f37f395094147d27ace8319a2803a522Jaikumar Ganesh    return JNI_FALSE;
104284690c88f37f395094147d27ace8319a2803a522Jaikumar Ganesh}
104384690c88f37f395094147d27ace8319a2803a522Jaikumar Ganesh
104424bb9b8af4ff691538fe9e517e8156016b0da6cdNick Pellystatic jint addRfcommServiceRecordNative(JNIEnv *env, jobject object,
104524bb9b8af4ff691538fe9e517e8156016b0da6cdNick Pelly        jstring name, jlong uuidMsb, jlong uuidLsb, jshort channel) {
10462653a1e7ca55b03f5230dffa85dfe2705757e2b7Jaikumar Ganesh    LOGV("%s", __FUNCTION__);
104724bb9b8af4ff691538fe9e517e8156016b0da6cdNick Pelly#ifdef HAVE_BLUETOOTH
104824bb9b8af4ff691538fe9e517e8156016b0da6cdNick Pelly    native_data_t *nat = get_native_data(env, object);
104924bb9b8af4ff691538fe9e517e8156016b0da6cdNick Pelly    if (nat) {
105024bb9b8af4ff691538fe9e517e8156016b0da6cdNick Pelly        const char *c_name = env->GetStringUTFChars(name, NULL);
105124bb9b8af4ff691538fe9e517e8156016b0da6cdNick Pelly        LOGV("... name = %s", c_name);
105224bb9b8af4ff691538fe9e517e8156016b0da6cdNick Pelly        LOGV("... uuid1 = %llX", uuidMsb);
105324bb9b8af4ff691538fe9e517e8156016b0da6cdNick Pelly        LOGV("... uuid2 = %llX", uuidLsb);
105424bb9b8af4ff691538fe9e517e8156016b0da6cdNick Pelly        LOGV("... channel = %d", channel);
105524bb9b8af4ff691538fe9e517e8156016b0da6cdNick Pelly        DBusMessage *reply = dbus_func_args(env, nat->conn,
105624bb9b8af4ff691538fe9e517e8156016b0da6cdNick Pelly                           get_adapter_path(env, object),
105724bb9b8af4ff691538fe9e517e8156016b0da6cdNick Pelly                           DBUS_ADAPTER_IFACE, "AddRfcommServiceRecord",
105824bb9b8af4ff691538fe9e517e8156016b0da6cdNick Pelly                           DBUS_TYPE_STRING, &c_name,
105924bb9b8af4ff691538fe9e517e8156016b0da6cdNick Pelly                           DBUS_TYPE_UINT64, &uuidMsb,
106024bb9b8af4ff691538fe9e517e8156016b0da6cdNick Pelly                           DBUS_TYPE_UINT64, &uuidLsb,
106124bb9b8af4ff691538fe9e517e8156016b0da6cdNick Pelly                           DBUS_TYPE_UINT16, &channel,
106224bb9b8af4ff691538fe9e517e8156016b0da6cdNick Pelly                           DBUS_TYPE_INVALID);
106324bb9b8af4ff691538fe9e517e8156016b0da6cdNick Pelly        env->ReleaseStringUTFChars(name, c_name);
106424bb9b8af4ff691538fe9e517e8156016b0da6cdNick Pelly        return reply ? dbus_returns_uint32(env, reply) : -1;
106524bb9b8af4ff691538fe9e517e8156016b0da6cdNick Pelly    }
106624bb9b8af4ff691538fe9e517e8156016b0da6cdNick Pelly#endif
106724bb9b8af4ff691538fe9e517e8156016b0da6cdNick Pelly    return -1;
106824bb9b8af4ff691538fe9e517e8156016b0da6cdNick Pelly}
106924bb9b8af4ff691538fe9e517e8156016b0da6cdNick Pelly
107024bb9b8af4ff691538fe9e517e8156016b0da6cdNick Pellystatic jboolean removeServiceRecordNative(JNIEnv *env, jobject object, jint handle) {
10712653a1e7ca55b03f5230dffa85dfe2705757e2b7Jaikumar Ganesh    LOGV("%s", __FUNCTION__);
107224bb9b8af4ff691538fe9e517e8156016b0da6cdNick Pelly#ifdef HAVE_BLUETOOTH
107324bb9b8af4ff691538fe9e517e8156016b0da6cdNick Pelly    native_data_t *nat = get_native_data(env, object);
107424bb9b8af4ff691538fe9e517e8156016b0da6cdNick Pelly    if (nat) {
107524bb9b8af4ff691538fe9e517e8156016b0da6cdNick Pelly        LOGV("... handle = %X", handle);
107624bb9b8af4ff691538fe9e517e8156016b0da6cdNick Pelly        DBusMessage *reply = dbus_func_args(env, nat->conn,
107724bb9b8af4ff691538fe9e517e8156016b0da6cdNick Pelly                           get_adapter_path(env, object),
107824bb9b8af4ff691538fe9e517e8156016b0da6cdNick Pelly                           DBUS_ADAPTER_IFACE, "RemoveServiceRecord",
107924bb9b8af4ff691538fe9e517e8156016b0da6cdNick Pelly                           DBUS_TYPE_UINT32, &handle,
108024bb9b8af4ff691538fe9e517e8156016b0da6cdNick Pelly                           DBUS_TYPE_INVALID);
108124bb9b8af4ff691538fe9e517e8156016b0da6cdNick Pelly        return reply ? JNI_TRUE : JNI_FALSE;
108224bb9b8af4ff691538fe9e517e8156016b0da6cdNick Pelly    }
108324bb9b8af4ff691538fe9e517e8156016b0da6cdNick Pelly#endif
108424bb9b8af4ff691538fe9e517e8156016b0da6cdNick Pelly    return JNI_FALSE;
108524bb9b8af4ff691538fe9e517e8156016b0da6cdNick Pelly}
10861caa6d111eff6814760ec156b14adc29aa3aae6cJaikumar Ganesh
1087b7e029d03c115ed65cdea9b2bba307e882c308e2Jaikumar Ganeshstatic jboolean setLinkTimeoutNative(JNIEnv *env, jobject object, jstring object_path,
1088b7e029d03c115ed65cdea9b2bba307e882c308e2Jaikumar Ganesh                                     jint num_slots) {
10892653a1e7ca55b03f5230dffa85dfe2705757e2b7Jaikumar Ganesh    LOGV("%s", __FUNCTION__);
1090b7e029d03c115ed65cdea9b2bba307e882c308e2Jaikumar Ganesh#ifdef HAVE_BLUETOOTH
1091b7e029d03c115ed65cdea9b2bba307e882c308e2Jaikumar Ganesh    native_data_t *nat = get_native_data(env, object);
1092b7e029d03c115ed65cdea9b2bba307e882c308e2Jaikumar Ganesh    if (nat) {
1093b7e029d03c115ed65cdea9b2bba307e882c308e2Jaikumar Ganesh        const char *c_object_path = env->GetStringUTFChars(object_path, NULL);
1094b7e029d03c115ed65cdea9b2bba307e882c308e2Jaikumar Ganesh        DBusMessage *reply = dbus_func_args(env, nat->conn,
1095b7e029d03c115ed65cdea9b2bba307e882c308e2Jaikumar Ganesh                           get_adapter_path(env, object),
1096b7e029d03c115ed65cdea9b2bba307e882c308e2Jaikumar Ganesh                           DBUS_ADAPTER_IFACE, "SetLinkTimeout",
1097b7e029d03c115ed65cdea9b2bba307e882c308e2Jaikumar Ganesh                           DBUS_TYPE_OBJECT_PATH, &c_object_path,
1098b7e029d03c115ed65cdea9b2bba307e882c308e2Jaikumar Ganesh                           DBUS_TYPE_UINT32, &num_slots,
1099b7e029d03c115ed65cdea9b2bba307e882c308e2Jaikumar Ganesh                           DBUS_TYPE_INVALID);
1100b7e029d03c115ed65cdea9b2bba307e882c308e2Jaikumar Ganesh        env->ReleaseStringUTFChars(object_path, c_object_path);
1101b7e029d03c115ed65cdea9b2bba307e882c308e2Jaikumar Ganesh        return reply ? JNI_TRUE : JNI_FALSE;
1102b7e029d03c115ed65cdea9b2bba307e882c308e2Jaikumar Ganesh    }
1103b7e029d03c115ed65cdea9b2bba307e882c308e2Jaikumar Ganesh#endif
1104b7e029d03c115ed65cdea9b2bba307e882c308e2Jaikumar Ganesh    return JNI_FALSE;
1105b7e029d03c115ed65cdea9b2bba307e882c308e2Jaikumar Ganesh}
1106b7e029d03c115ed65cdea9b2bba307e882c308e2Jaikumar Ganesh
1107545e6708adda6859932b55fd824794b1401f5318Jaikumar Ganeshstatic jboolean connectInputDeviceNative(JNIEnv *env, jobject object, jstring path) {
11082653a1e7ca55b03f5230dffa85dfe2705757e2b7Jaikumar Ganesh    LOGV("%s", __FUNCTION__);
1109545e6708adda6859932b55fd824794b1401f5318Jaikumar Ganesh#ifdef HAVE_BLUETOOTH
1110545e6708adda6859932b55fd824794b1401f5318Jaikumar Ganesh    native_data_t *nat = get_native_data(env, object);
1111de07503a382e81ba82f4cd4dee81ff2fbf3295bcJaikumar Ganesh    jobject eventLoop = env->GetObjectField(object, field_mEventLoop);
1112de07503a382e81ba82f4cd4dee81ff2fbf3295bcJaikumar Ganesh    struct event_loop_native_data_t *eventLoopNat =
1113de07503a382e81ba82f4cd4dee81ff2fbf3295bcJaikumar Ganesh            get_EventLoop_native_data(env, eventLoop);
1114de07503a382e81ba82f4cd4dee81ff2fbf3295bcJaikumar Ganesh
1115de07503a382e81ba82f4cd4dee81ff2fbf3295bcJaikumar Ganesh    if (nat && eventLoopNat) {
1116545e6708adda6859932b55fd824794b1401f5318Jaikumar Ganesh        const char *c_path = env->GetStringUTFChars(path, NULL);
1117545e6708adda6859932b55fd824794b1401f5318Jaikumar Ganesh
1118de07503a382e81ba82f4cd4dee81ff2fbf3295bcJaikumar Ganesh        int len = env->GetStringLength(path) + 1;
1119de07503a382e81ba82f4cd4dee81ff2fbf3295bcJaikumar Ganesh        char *context_path = (char *)calloc(len, sizeof(char));
1120de07503a382e81ba82f4cd4dee81ff2fbf3295bcJaikumar Ganesh        strlcpy(context_path, c_path, len);  // for callback
1121de07503a382e81ba82f4cd4dee81ff2fbf3295bcJaikumar Ganesh
1122de07503a382e81ba82f4cd4dee81ff2fbf3295bcJaikumar Ganesh        bool ret = dbus_func_args_async(env, nat->conn, -1, onInputDeviceConnectionResult,
1123de07503a382e81ba82f4cd4dee81ff2fbf3295bcJaikumar Ganesh                                        context_path, eventLoopNat, c_path, DBUS_INPUT_IFACE,
1124de07503a382e81ba82f4cd4dee81ff2fbf3295bcJaikumar Ganesh                                        "Connect",
1125de07503a382e81ba82f4cd4dee81ff2fbf3295bcJaikumar Ganesh                                        DBUS_TYPE_INVALID);
1126545e6708adda6859932b55fd824794b1401f5318Jaikumar Ganesh
1127545e6708adda6859932b55fd824794b1401f5318Jaikumar Ganesh        env->ReleaseStringUTFChars(path, c_path);
1128545e6708adda6859932b55fd824794b1401f5318Jaikumar Ganesh        return ret ? JNI_TRUE : JNI_FALSE;
1129545e6708adda6859932b55fd824794b1401f5318Jaikumar Ganesh    }
1130545e6708adda6859932b55fd824794b1401f5318Jaikumar Ganesh#endif
1131545e6708adda6859932b55fd824794b1401f5318Jaikumar Ganesh    return JNI_FALSE;
1132545e6708adda6859932b55fd824794b1401f5318Jaikumar Ganesh}
1133545e6708adda6859932b55fd824794b1401f5318Jaikumar Ganesh
1134545e6708adda6859932b55fd824794b1401f5318Jaikumar Ganeshstatic jboolean disconnectInputDeviceNative(JNIEnv *env, jobject object,
1135545e6708adda6859932b55fd824794b1401f5318Jaikumar Ganesh                                     jstring path) {
11362653a1e7ca55b03f5230dffa85dfe2705757e2b7Jaikumar Ganesh    LOGV("%s", __FUNCTION__);
1137545e6708adda6859932b55fd824794b1401f5318Jaikumar Ganesh#ifdef HAVE_BLUETOOTH
1138545e6708adda6859932b55fd824794b1401f5318Jaikumar Ganesh    native_data_t *nat = get_native_data(env, object);
1139de07503a382e81ba82f4cd4dee81ff2fbf3295bcJaikumar Ganesh    jobject eventLoop = env->GetObjectField(object, field_mEventLoop);
1140de07503a382e81ba82f4cd4dee81ff2fbf3295bcJaikumar Ganesh    struct event_loop_native_data_t *eventLoopNat =
1141de07503a382e81ba82f4cd4dee81ff2fbf3295bcJaikumar Ganesh            get_EventLoop_native_data(env, eventLoop);
1142de07503a382e81ba82f4cd4dee81ff2fbf3295bcJaikumar Ganesh
1143de07503a382e81ba82f4cd4dee81ff2fbf3295bcJaikumar Ganesh    if (nat && eventLoopNat) {
1144545e6708adda6859932b55fd824794b1401f5318Jaikumar Ganesh        const char *c_path = env->GetStringUTFChars(path, NULL);
1145545e6708adda6859932b55fd824794b1401f5318Jaikumar Ganesh
1146de07503a382e81ba82f4cd4dee81ff2fbf3295bcJaikumar Ganesh        int len = env->GetStringLength(path) + 1;
1147de07503a382e81ba82f4cd4dee81ff2fbf3295bcJaikumar Ganesh        char *context_path = (char *)calloc(len, sizeof(char));
1148de07503a382e81ba82f4cd4dee81ff2fbf3295bcJaikumar Ganesh        strlcpy(context_path, c_path, len);  // for callback
1149de07503a382e81ba82f4cd4dee81ff2fbf3295bcJaikumar Ganesh
1150de07503a382e81ba82f4cd4dee81ff2fbf3295bcJaikumar Ganesh        bool ret = dbus_func_args_async(env, nat->conn, -1, onInputDeviceConnectionResult,
1151de07503a382e81ba82f4cd4dee81ff2fbf3295bcJaikumar Ganesh                                        context_path, eventLoopNat, c_path, DBUS_INPUT_IFACE,
1152de07503a382e81ba82f4cd4dee81ff2fbf3295bcJaikumar Ganesh                                        "Disconnect",
1153de07503a382e81ba82f4cd4dee81ff2fbf3295bcJaikumar Ganesh                                        DBUS_TYPE_INVALID);
1154545e6708adda6859932b55fd824794b1401f5318Jaikumar Ganesh
1155545e6708adda6859932b55fd824794b1401f5318Jaikumar Ganesh        env->ReleaseStringUTFChars(path, c_path);
1156545e6708adda6859932b55fd824794b1401f5318Jaikumar Ganesh        return ret ? JNI_TRUE : JNI_FALSE;
1157545e6708adda6859932b55fd824794b1401f5318Jaikumar Ganesh    }
1158545e6708adda6859932b55fd824794b1401f5318Jaikumar Ganesh#endif
1159545e6708adda6859932b55fd824794b1401f5318Jaikumar Ganesh    return JNI_FALSE;
1160545e6708adda6859932b55fd824794b1401f5318Jaikumar Ganesh}
1161545e6708adda6859932b55fd824794b1401f5318Jaikumar Ganesh
11626fdd0c6274c81b337ad35b70480f881daf7354c3Danica Changstatic jboolean setBluetoothTetheringNative(JNIEnv *env, jobject object, jboolean value,
11636fdd0c6274c81b337ad35b70480f881daf7354c3Danica Chang                                            jstring src_role, jstring bridge) {
11642653a1e7ca55b03f5230dffa85dfe2705757e2b7Jaikumar Ganesh    LOGV("%s", __FUNCTION__);
11656fdd0c6274c81b337ad35b70480f881daf7354c3Danica Chang#ifdef HAVE_BLUETOOTH
11666fdd0c6274c81b337ad35b70480f881daf7354c3Danica Chang    native_data_t *nat = get_native_data(env, object);
11676fdd0c6274c81b337ad35b70480f881daf7354c3Danica Chang    if (nat) {
11686fdd0c6274c81b337ad35b70480f881daf7354c3Danica Chang        DBusMessage *reply;
11696fdd0c6274c81b337ad35b70480f881daf7354c3Danica Chang        const char *c_role = env->GetStringUTFChars(src_role, NULL);
11706fdd0c6274c81b337ad35b70480f881daf7354c3Danica Chang        const char *c_bridge = env->GetStringUTFChars(bridge, NULL);
11716fdd0c6274c81b337ad35b70480f881daf7354c3Danica Chang        if (value) {
11726fdd0c6274c81b337ad35b70480f881daf7354c3Danica Chang            LOGE("setBluetoothTetheringNative true");
11736fdd0c6274c81b337ad35b70480f881daf7354c3Danica Chang            reply = dbus_func_args(env, nat->conn,
11746fdd0c6274c81b337ad35b70480f881daf7354c3Danica Chang                                  get_adapter_path(env, object),
11756fdd0c6274c81b337ad35b70480f881daf7354c3Danica Chang                                  DBUS_NETWORKSERVER_IFACE,
11766fdd0c6274c81b337ad35b70480f881daf7354c3Danica Chang                                  "Register",
11776fdd0c6274c81b337ad35b70480f881daf7354c3Danica Chang                                  DBUS_TYPE_STRING, &c_role,
11786fdd0c6274c81b337ad35b70480f881daf7354c3Danica Chang                                  DBUS_TYPE_STRING, &c_bridge,
11796fdd0c6274c81b337ad35b70480f881daf7354c3Danica Chang                                  DBUS_TYPE_INVALID);
11806fdd0c6274c81b337ad35b70480f881daf7354c3Danica Chang        } else {
11816fdd0c6274c81b337ad35b70480f881daf7354c3Danica Chang            LOGE("setBluetoothTetheringNative false");
11826fdd0c6274c81b337ad35b70480f881daf7354c3Danica Chang            reply = dbus_func_args(env, nat->conn,
11836fdd0c6274c81b337ad35b70480f881daf7354c3Danica Chang                                  get_adapter_path(env, object),
11846fdd0c6274c81b337ad35b70480f881daf7354c3Danica Chang                                  DBUS_NETWORKSERVER_IFACE,
11856fdd0c6274c81b337ad35b70480f881daf7354c3Danica Chang                                  "Unregister",
11866fdd0c6274c81b337ad35b70480f881daf7354c3Danica Chang                                  DBUS_TYPE_STRING, &c_role,
11876fdd0c6274c81b337ad35b70480f881daf7354c3Danica Chang                                  DBUS_TYPE_INVALID);
11886fdd0c6274c81b337ad35b70480f881daf7354c3Danica Chang        }
11896fdd0c6274c81b337ad35b70480f881daf7354c3Danica Chang        env->ReleaseStringUTFChars(src_role, c_role);
11906fdd0c6274c81b337ad35b70480f881daf7354c3Danica Chang        env->ReleaseStringUTFChars(bridge, c_bridge);
11916fdd0c6274c81b337ad35b70480f881daf7354c3Danica Chang        return reply ? JNI_TRUE : JNI_FALSE;
11926fdd0c6274c81b337ad35b70480f881daf7354c3Danica Chang    }
11936fdd0c6274c81b337ad35b70480f881daf7354c3Danica Chang#endif
11946fdd0c6274c81b337ad35b70480f881daf7354c3Danica Chang    return JNI_FALSE;
11956fdd0c6274c81b337ad35b70480f881daf7354c3Danica Chang}
11966fdd0c6274c81b337ad35b70480f881daf7354c3Danica Chang
11976fdd0c6274c81b337ad35b70480f881daf7354c3Danica Changstatic jboolean connectPanDeviceNative(JNIEnv *env, jobject object, jstring path,
1198b7ec3e10194084e2a198602e20589c5bdecbda37Jaikumar Ganesh                                       jstring dstRole) {
11992653a1e7ca55b03f5230dffa85dfe2705757e2b7Jaikumar Ganesh    LOGV("%s", __FUNCTION__);
12006fdd0c6274c81b337ad35b70480f881daf7354c3Danica Chang#ifdef HAVE_BLUETOOTH
12016fdd0c6274c81b337ad35b70480f881daf7354c3Danica Chang    LOGE("connectPanDeviceNative");
12026fdd0c6274c81b337ad35b70480f881daf7354c3Danica Chang    native_data_t *nat = get_native_data(env, object);
12036fdd0c6274c81b337ad35b70480f881daf7354c3Danica Chang    jobject eventLoop = env->GetObjectField(object, field_mEventLoop);
12046fdd0c6274c81b337ad35b70480f881daf7354c3Danica Chang    struct event_loop_native_data_t *eventLoopNat =
12056fdd0c6274c81b337ad35b70480f881daf7354c3Danica Chang            get_EventLoop_native_data(env, eventLoop);
12066fdd0c6274c81b337ad35b70480f881daf7354c3Danica Chang
12076fdd0c6274c81b337ad35b70480f881daf7354c3Danica Chang    if (nat && eventLoopNat) {
12086fdd0c6274c81b337ad35b70480f881daf7354c3Danica Chang        const char *c_path = env->GetStringUTFChars(path, NULL);
12096fdd0c6274c81b337ad35b70480f881daf7354c3Danica Chang        const char *dst = env->GetStringUTFChars(dstRole, NULL);
12106fdd0c6274c81b337ad35b70480f881daf7354c3Danica Chang
12116fdd0c6274c81b337ad35b70480f881daf7354c3Danica Chang        int len = env->GetStringLength(path) + 1;
12126fdd0c6274c81b337ad35b70480f881daf7354c3Danica Chang        char *context_path = (char *)calloc(len, sizeof(char));
12136fdd0c6274c81b337ad35b70480f881daf7354c3Danica Chang        strlcpy(context_path, c_path, len);  // for callback
12146fdd0c6274c81b337ad35b70480f881daf7354c3Danica Chang
12156fdd0c6274c81b337ad35b70480f881daf7354c3Danica Chang        bool ret = dbus_func_args_async(env, nat->conn, -1,onPanDeviceConnectionResult,
12166fdd0c6274c81b337ad35b70480f881daf7354c3Danica Chang                                    context_path, eventLoopNat, c_path,
12176fdd0c6274c81b337ad35b70480f881daf7354c3Danica Chang                                    DBUS_NETWORK_IFACE, "Connect",
12186fdd0c6274c81b337ad35b70480f881daf7354c3Danica Chang                                    DBUS_TYPE_STRING, &dst,
12196fdd0c6274c81b337ad35b70480f881daf7354c3Danica Chang                                    DBUS_TYPE_INVALID);
12206fdd0c6274c81b337ad35b70480f881daf7354c3Danica Chang
12216fdd0c6274c81b337ad35b70480f881daf7354c3Danica Chang        env->ReleaseStringUTFChars(path, c_path);
12226fdd0c6274c81b337ad35b70480f881daf7354c3Danica Chang        env->ReleaseStringUTFChars(dstRole, dst);
12236fdd0c6274c81b337ad35b70480f881daf7354c3Danica Chang        return ret ? JNI_TRUE : JNI_FALSE;
12246fdd0c6274c81b337ad35b70480f881daf7354c3Danica Chang    }
12256fdd0c6274c81b337ad35b70480f881daf7354c3Danica Chang#endif
12266fdd0c6274c81b337ad35b70480f881daf7354c3Danica Chang    return JNI_FALSE;
12276fdd0c6274c81b337ad35b70480f881daf7354c3Danica Chang}
12286fdd0c6274c81b337ad35b70480f881daf7354c3Danica Chang
12296fdd0c6274c81b337ad35b70480f881daf7354c3Danica Changstatic jboolean disconnectPanDeviceNative(JNIEnv *env, jobject object,
12306fdd0c6274c81b337ad35b70480f881daf7354c3Danica Chang                                     jstring path) {
12312653a1e7ca55b03f5230dffa85dfe2705757e2b7Jaikumar Ganesh    LOGV("%s", __FUNCTION__);
12326fdd0c6274c81b337ad35b70480f881daf7354c3Danica Chang#ifdef HAVE_BLUETOOTH
12336fdd0c6274c81b337ad35b70480f881daf7354c3Danica Chang    LOGE("disconnectPanDeviceNative");
12346fdd0c6274c81b337ad35b70480f881daf7354c3Danica Chang    native_data_t *nat = get_native_data(env, object);
12356fdd0c6274c81b337ad35b70480f881daf7354c3Danica Chang    jobject eventLoop = env->GetObjectField(object, field_mEventLoop);
12366fdd0c6274c81b337ad35b70480f881daf7354c3Danica Chang    struct event_loop_native_data_t *eventLoopNat =
12376fdd0c6274c81b337ad35b70480f881daf7354c3Danica Chang            get_EventLoop_native_data(env, eventLoop);
12386fdd0c6274c81b337ad35b70480f881daf7354c3Danica Chang
12396fdd0c6274c81b337ad35b70480f881daf7354c3Danica Chang    if (nat && eventLoopNat) {
12406fdd0c6274c81b337ad35b70480f881daf7354c3Danica Chang        const char *c_path = env->GetStringUTFChars(path, NULL);
12416fdd0c6274c81b337ad35b70480f881daf7354c3Danica Chang
12426fdd0c6274c81b337ad35b70480f881daf7354c3Danica Chang        int len = env->GetStringLength(path) + 1;
12436fdd0c6274c81b337ad35b70480f881daf7354c3Danica Chang        char *context_path = (char *)calloc(len, sizeof(char));
12446fdd0c6274c81b337ad35b70480f881daf7354c3Danica Chang        strlcpy(context_path, c_path, len);  // for callback
12456fdd0c6274c81b337ad35b70480f881daf7354c3Danica Chang
12466fdd0c6274c81b337ad35b70480f881daf7354c3Danica Chang        bool ret = dbus_func_args_async(env, nat->conn, -1,onPanDeviceConnectionResult,
12476fdd0c6274c81b337ad35b70480f881daf7354c3Danica Chang                                        context_path, eventLoopNat, c_path,
12486fdd0c6274c81b337ad35b70480f881daf7354c3Danica Chang                                        DBUS_NETWORK_IFACE, "Disconnect",
12496fdd0c6274c81b337ad35b70480f881daf7354c3Danica Chang                                        DBUS_TYPE_INVALID);
12506fdd0c6274c81b337ad35b70480f881daf7354c3Danica Chang
12516fdd0c6274c81b337ad35b70480f881daf7354c3Danica Chang        env->ReleaseStringUTFChars(path, c_path);
12526fdd0c6274c81b337ad35b70480f881daf7354c3Danica Chang        return ret ? JNI_TRUE : JNI_FALSE;
12536fdd0c6274c81b337ad35b70480f881daf7354c3Danica Chang    }
12546fdd0c6274c81b337ad35b70480f881daf7354c3Danica Chang#endif
12556fdd0c6274c81b337ad35b70480f881daf7354c3Danica Chang    return JNI_FALSE;
12566fdd0c6274c81b337ad35b70480f881daf7354c3Danica Chang}
12576fdd0c6274c81b337ad35b70480f881daf7354c3Danica Chang
1258a44a1e77ef435942b2ff60e9e60d3a64b43d775bJaikumar Ganeshstatic jboolean disconnectPanServerDeviceNative(JNIEnv *env, jobject object,
1259a44a1e77ef435942b2ff60e9e60d3a64b43d775bJaikumar Ganesh                                                jstring path, jstring address,
1260a44a1e77ef435942b2ff60e9e60d3a64b43d775bJaikumar Ganesh                                                jstring iface) {
12612653a1e7ca55b03f5230dffa85dfe2705757e2b7Jaikumar Ganesh    LOGV("%s", __FUNCTION__);
1262a44a1e77ef435942b2ff60e9e60d3a64b43d775bJaikumar Ganesh#ifdef HAVE_BLUETOOTH
1263a44a1e77ef435942b2ff60e9e60d3a64b43d775bJaikumar Ganesh    LOGE("disconnectPanServerDeviceNative");
1264a44a1e77ef435942b2ff60e9e60d3a64b43d775bJaikumar Ganesh    native_data_t *nat = get_native_data(env, object);
1265a44a1e77ef435942b2ff60e9e60d3a64b43d775bJaikumar Ganesh    jobject eventLoop = env->GetObjectField(object, field_mEventLoop);
1266a44a1e77ef435942b2ff60e9e60d3a64b43d775bJaikumar Ganesh    struct event_loop_native_data_t *eventLoopNat =
1267a44a1e77ef435942b2ff60e9e60d3a64b43d775bJaikumar Ganesh            get_EventLoop_native_data(env, eventLoop);
1268a44a1e77ef435942b2ff60e9e60d3a64b43d775bJaikumar Ganesh
1269a44a1e77ef435942b2ff60e9e60d3a64b43d775bJaikumar Ganesh    if (nat && eventLoopNat) {
1270a44a1e77ef435942b2ff60e9e60d3a64b43d775bJaikumar Ganesh        const char *c_address = env->GetStringUTFChars(address, NULL);
1271a44a1e77ef435942b2ff60e9e60d3a64b43d775bJaikumar Ganesh        const char *c_path = env->GetStringUTFChars(path, NULL);
1272a44a1e77ef435942b2ff60e9e60d3a64b43d775bJaikumar Ganesh        const char *c_iface = env->GetStringUTFChars(iface, NULL);
1273a44a1e77ef435942b2ff60e9e60d3a64b43d775bJaikumar Ganesh
1274a44a1e77ef435942b2ff60e9e60d3a64b43d775bJaikumar Ganesh        int len = env->GetStringLength(path) + 1;
1275a44a1e77ef435942b2ff60e9e60d3a64b43d775bJaikumar Ganesh        char *context_path = (char *)calloc(len, sizeof(char));
1276a44a1e77ef435942b2ff60e9e60d3a64b43d775bJaikumar Ganesh        strlcpy(context_path, c_path, len);  // for callback
1277a44a1e77ef435942b2ff60e9e60d3a64b43d775bJaikumar Ganesh
1278a44a1e77ef435942b2ff60e9e60d3a64b43d775bJaikumar Ganesh        bool ret = dbus_func_args_async(env, nat->conn, -1,
1279a44a1e77ef435942b2ff60e9e60d3a64b43d775bJaikumar Ganesh                                        onPanDeviceConnectionResult,
1280a44a1e77ef435942b2ff60e9e60d3a64b43d775bJaikumar Ganesh                                        context_path, eventLoopNat,
1281a44a1e77ef435942b2ff60e9e60d3a64b43d775bJaikumar Ganesh                                        get_adapter_path(env, object),
1282a44a1e77ef435942b2ff60e9e60d3a64b43d775bJaikumar Ganesh                                        DBUS_NETWORKSERVER_IFACE,
1283a44a1e77ef435942b2ff60e9e60d3a64b43d775bJaikumar Ganesh                                        "DisconnectDevice",
1284a44a1e77ef435942b2ff60e9e60d3a64b43d775bJaikumar Ganesh                                        DBUS_TYPE_STRING, &c_address,
1285a44a1e77ef435942b2ff60e9e60d3a64b43d775bJaikumar Ganesh                                        DBUS_TYPE_STRING, &c_iface,
1286a44a1e77ef435942b2ff60e9e60d3a64b43d775bJaikumar Ganesh                                        DBUS_TYPE_INVALID);
1287a44a1e77ef435942b2ff60e9e60d3a64b43d775bJaikumar Ganesh
1288a44a1e77ef435942b2ff60e9e60d3a64b43d775bJaikumar Ganesh        env->ReleaseStringUTFChars(address, c_address);
1289a44a1e77ef435942b2ff60e9e60d3a64b43d775bJaikumar Ganesh        env->ReleaseStringUTFChars(iface, c_iface);
1290a44a1e77ef435942b2ff60e9e60d3a64b43d775bJaikumar Ganesh        env->ReleaseStringUTFChars(path, c_path);
1291a44a1e77ef435942b2ff60e9e60d3a64b43d775bJaikumar Ganesh        return ret ? JNI_TRUE : JNI_FALSE;
1292a44a1e77ef435942b2ff60e9e60d3a64b43d775bJaikumar Ganesh    }
1293a44a1e77ef435942b2ff60e9e60d3a64b43d775bJaikumar Ganesh#endif
1294a44a1e77ef435942b2ff60e9e60d3a64b43d775bJaikumar Ganesh    return JNI_FALSE;
1295a44a1e77ef435942b2ff60e9e60d3a64b43d775bJaikumar Ganesh}
1296a44a1e77ef435942b2ff60e9e60d3a64b43d775bJaikumar Ganesh
12972ea1e85dcb57d17f5782dbafa1d25eb51c630e4bJaikumar Ganeshstatic jstring registerHealthApplicationNative(JNIEnv *env, jobject object,
12982ea1e85dcb57d17f5782dbafa1d25eb51c630e4bJaikumar Ganesh                                           jint dataType, jstring role,
12992ea1e85dcb57d17f5782dbafa1d25eb51c630e4bJaikumar Ganesh                                           jstring name, jstring channelType) {
13002ea1e85dcb57d17f5782dbafa1d25eb51c630e4bJaikumar Ganesh    LOGV("%s", __FUNCTION__);
13012ea1e85dcb57d17f5782dbafa1d25eb51c630e4bJaikumar Ganesh    jstring path = NULL;
13022ea1e85dcb57d17f5782dbafa1d25eb51c630e4bJaikumar Ganesh#ifdef HAVE_BLUETOOTH
13032ea1e85dcb57d17f5782dbafa1d25eb51c630e4bJaikumar Ganesh    native_data_t *nat = get_native_data(env, object);
13042ea1e85dcb57d17f5782dbafa1d25eb51c630e4bJaikumar Ganesh    if (nat) {
13052ea1e85dcb57d17f5782dbafa1d25eb51c630e4bJaikumar Ganesh        const char *c_role = env->GetStringUTFChars(role, NULL);
13062ea1e85dcb57d17f5782dbafa1d25eb51c630e4bJaikumar Ganesh        const char *c_name = env->GetStringUTFChars(name, NULL);
13072ea1e85dcb57d17f5782dbafa1d25eb51c630e4bJaikumar Ganesh        const char *c_channel_type = env->GetStringUTFChars(channelType, NULL);
13082ea1e85dcb57d17f5782dbafa1d25eb51c630e4bJaikumar Ganesh        char *c_path;
13092ea1e85dcb57d17f5782dbafa1d25eb51c630e4bJaikumar Ganesh        DBusMessage *msg, *reply;
13102ea1e85dcb57d17f5782dbafa1d25eb51c630e4bJaikumar Ganesh        DBusError err;
13112ea1e85dcb57d17f5782dbafa1d25eb51c630e4bJaikumar Ganesh        dbus_error_init(&err);
13122ea1e85dcb57d17f5782dbafa1d25eb51c630e4bJaikumar Ganesh
13132ea1e85dcb57d17f5782dbafa1d25eb51c630e4bJaikumar Ganesh        msg = dbus_message_new_method_call(BLUEZ_DBUS_BASE_IFC,
13142ea1e85dcb57d17f5782dbafa1d25eb51c630e4bJaikumar Ganesh                                            DBUS_HEALTH_MANAGER_PATH,
13152ea1e85dcb57d17f5782dbafa1d25eb51c630e4bJaikumar Ganesh                                            DBUS_HEALTH_MANAGER_IFACE,
13162ea1e85dcb57d17f5782dbafa1d25eb51c630e4bJaikumar Ganesh                                            "CreateApplication");
13172ea1e85dcb57d17f5782dbafa1d25eb51c630e4bJaikumar Ganesh
13182ea1e85dcb57d17f5782dbafa1d25eb51c630e4bJaikumar Ganesh        if (msg == NULL) {
13192ea1e85dcb57d17f5782dbafa1d25eb51c630e4bJaikumar Ganesh            LOGE("Could not allocate D-Bus message object!");
13202ea1e85dcb57d17f5782dbafa1d25eb51c630e4bJaikumar Ganesh            return NULL;
13212ea1e85dcb57d17f5782dbafa1d25eb51c630e4bJaikumar Ganesh        }
13222ea1e85dcb57d17f5782dbafa1d25eb51c630e4bJaikumar Ganesh
13232ea1e85dcb57d17f5782dbafa1d25eb51c630e4bJaikumar Ganesh        /* append arguments */
13242ea1e85dcb57d17f5782dbafa1d25eb51c630e4bJaikumar Ganesh        append_dict_args(msg,
13252ea1e85dcb57d17f5782dbafa1d25eb51c630e4bJaikumar Ganesh                         "DataType", DBUS_TYPE_UINT16, &dataType,
13262ea1e85dcb57d17f5782dbafa1d25eb51c630e4bJaikumar Ganesh                         "Role", DBUS_TYPE_STRING, &c_role,
13272ea1e85dcb57d17f5782dbafa1d25eb51c630e4bJaikumar Ganesh                         "Description", DBUS_TYPE_STRING, &c_name,
13282ea1e85dcb57d17f5782dbafa1d25eb51c630e4bJaikumar Ganesh                         "ChannelType", DBUS_TYPE_STRING, &c_channel_type,
13292ea1e85dcb57d17f5782dbafa1d25eb51c630e4bJaikumar Ganesh                         DBUS_TYPE_INVALID);
13302ea1e85dcb57d17f5782dbafa1d25eb51c630e4bJaikumar Ganesh
13312ea1e85dcb57d17f5782dbafa1d25eb51c630e4bJaikumar Ganesh
13322ea1e85dcb57d17f5782dbafa1d25eb51c630e4bJaikumar Ganesh        /* Make the call. */
13332ea1e85dcb57d17f5782dbafa1d25eb51c630e4bJaikumar Ganesh        reply = dbus_connection_send_with_reply_and_block(nat->conn, msg, -1, &err);
13342ea1e85dcb57d17f5782dbafa1d25eb51c630e4bJaikumar Ganesh
13352ea1e85dcb57d17f5782dbafa1d25eb51c630e4bJaikumar Ganesh        env->ReleaseStringUTFChars(role, c_role);
13362ea1e85dcb57d17f5782dbafa1d25eb51c630e4bJaikumar Ganesh        env->ReleaseStringUTFChars(name, c_name);
13372ea1e85dcb57d17f5782dbafa1d25eb51c630e4bJaikumar Ganesh        env->ReleaseStringUTFChars(channelType, c_channel_type);
13382ea1e85dcb57d17f5782dbafa1d25eb51c630e4bJaikumar Ganesh
13392ea1e85dcb57d17f5782dbafa1d25eb51c630e4bJaikumar Ganesh        if (!reply) {
13402ea1e85dcb57d17f5782dbafa1d25eb51c630e4bJaikumar Ganesh            if (dbus_error_is_set(&err)) {
13412ea1e85dcb57d17f5782dbafa1d25eb51c630e4bJaikumar Ganesh                LOG_AND_FREE_DBUS_ERROR(&err);
13422ea1e85dcb57d17f5782dbafa1d25eb51c630e4bJaikumar Ganesh            }
13432ea1e85dcb57d17f5782dbafa1d25eb51c630e4bJaikumar Ganesh        } else {
13442ea1e85dcb57d17f5782dbafa1d25eb51c630e4bJaikumar Ganesh            if (!dbus_message_get_args(reply, &err,
13452ea1e85dcb57d17f5782dbafa1d25eb51c630e4bJaikumar Ganesh                                      DBUS_TYPE_OBJECT_PATH, &c_path,
13462ea1e85dcb57d17f5782dbafa1d25eb51c630e4bJaikumar Ganesh                                      DBUS_TYPE_INVALID)) {
13472ea1e85dcb57d17f5782dbafa1d25eb51c630e4bJaikumar Ganesh                if (dbus_error_is_set(&err)) {
13482ea1e85dcb57d17f5782dbafa1d25eb51c630e4bJaikumar Ganesh                    LOG_AND_FREE_DBUS_ERROR(&err);
13492ea1e85dcb57d17f5782dbafa1d25eb51c630e4bJaikumar Ganesh                }
13502ea1e85dcb57d17f5782dbafa1d25eb51c630e4bJaikumar Ganesh            } else {
13512ea1e85dcb57d17f5782dbafa1d25eb51c630e4bJaikumar Ganesh               path = env->NewStringUTF(c_path);
13522ea1e85dcb57d17f5782dbafa1d25eb51c630e4bJaikumar Ganesh            }
13532ea1e85dcb57d17f5782dbafa1d25eb51c630e4bJaikumar Ganesh            dbus_message_unref(reply);
13542ea1e85dcb57d17f5782dbafa1d25eb51c630e4bJaikumar Ganesh        }
13552ea1e85dcb57d17f5782dbafa1d25eb51c630e4bJaikumar Ganesh    }
13562ea1e85dcb57d17f5782dbafa1d25eb51c630e4bJaikumar Ganesh#endif
13572ea1e85dcb57d17f5782dbafa1d25eb51c630e4bJaikumar Ganesh    return path;
13582ea1e85dcb57d17f5782dbafa1d25eb51c630e4bJaikumar Ganesh}
13592ea1e85dcb57d17f5782dbafa1d25eb51c630e4bJaikumar Ganesh
13602ea1e85dcb57d17f5782dbafa1d25eb51c630e4bJaikumar Ganeshstatic jstring registerSinkHealthApplicationNative(JNIEnv *env, jobject object,
13612ea1e85dcb57d17f5782dbafa1d25eb51c630e4bJaikumar Ganesh                                           jint dataType, jstring role,
13622ea1e85dcb57d17f5782dbafa1d25eb51c630e4bJaikumar Ganesh                                           jstring name) {
13632ea1e85dcb57d17f5782dbafa1d25eb51c630e4bJaikumar Ganesh    LOGV("%s", __FUNCTION__);
13642ea1e85dcb57d17f5782dbafa1d25eb51c630e4bJaikumar Ganesh    jstring path = NULL;
13652ea1e85dcb57d17f5782dbafa1d25eb51c630e4bJaikumar Ganesh#ifdef HAVE_BLUETOOTH
13662ea1e85dcb57d17f5782dbafa1d25eb51c630e4bJaikumar Ganesh    native_data_t *nat = get_native_data(env, object);
13672ea1e85dcb57d17f5782dbafa1d25eb51c630e4bJaikumar Ganesh    if (nat) {
13682ea1e85dcb57d17f5782dbafa1d25eb51c630e4bJaikumar Ganesh        const char *c_role = env->GetStringUTFChars(role, NULL);
13692ea1e85dcb57d17f5782dbafa1d25eb51c630e4bJaikumar Ganesh        const char *c_name = env->GetStringUTFChars(name, NULL);
13702ea1e85dcb57d17f5782dbafa1d25eb51c630e4bJaikumar Ganesh        char *c_path;
13712ea1e85dcb57d17f5782dbafa1d25eb51c630e4bJaikumar Ganesh
13722ea1e85dcb57d17f5782dbafa1d25eb51c630e4bJaikumar Ganesh        DBusMessage *msg, *reply;
13732ea1e85dcb57d17f5782dbafa1d25eb51c630e4bJaikumar Ganesh        DBusError err;
13742ea1e85dcb57d17f5782dbafa1d25eb51c630e4bJaikumar Ganesh        dbus_error_init(&err);
13752ea1e85dcb57d17f5782dbafa1d25eb51c630e4bJaikumar Ganesh
13762ea1e85dcb57d17f5782dbafa1d25eb51c630e4bJaikumar Ganesh        msg = dbus_message_new_method_call(BLUEZ_DBUS_BASE_IFC,
13772ea1e85dcb57d17f5782dbafa1d25eb51c630e4bJaikumar Ganesh                                            DBUS_HEALTH_MANAGER_PATH,
13782ea1e85dcb57d17f5782dbafa1d25eb51c630e4bJaikumar Ganesh                                            DBUS_HEALTH_MANAGER_IFACE,
13792ea1e85dcb57d17f5782dbafa1d25eb51c630e4bJaikumar Ganesh                                            "CreateApplication");
13802ea1e85dcb57d17f5782dbafa1d25eb51c630e4bJaikumar Ganesh
13812ea1e85dcb57d17f5782dbafa1d25eb51c630e4bJaikumar Ganesh        if (msg == NULL) {
13822ea1e85dcb57d17f5782dbafa1d25eb51c630e4bJaikumar Ganesh            LOGE("Could not allocate D-Bus message object!");
13832ea1e85dcb57d17f5782dbafa1d25eb51c630e4bJaikumar Ganesh            return NULL;
13842ea1e85dcb57d17f5782dbafa1d25eb51c630e4bJaikumar Ganesh        }
13852ea1e85dcb57d17f5782dbafa1d25eb51c630e4bJaikumar Ganesh
13862ea1e85dcb57d17f5782dbafa1d25eb51c630e4bJaikumar Ganesh        /* append arguments */
13872ea1e85dcb57d17f5782dbafa1d25eb51c630e4bJaikumar Ganesh        append_dict_args(msg,
13882ea1e85dcb57d17f5782dbafa1d25eb51c630e4bJaikumar Ganesh                         "DataType", DBUS_TYPE_UINT16, &dataType,
13892ea1e85dcb57d17f5782dbafa1d25eb51c630e4bJaikumar Ganesh                         "Role", DBUS_TYPE_STRING, &c_role,
13902ea1e85dcb57d17f5782dbafa1d25eb51c630e4bJaikumar Ganesh                         "Description", DBUS_TYPE_STRING, &c_name,
13912ea1e85dcb57d17f5782dbafa1d25eb51c630e4bJaikumar Ganesh                         DBUS_TYPE_INVALID);
13922ea1e85dcb57d17f5782dbafa1d25eb51c630e4bJaikumar Ganesh
13932ea1e85dcb57d17f5782dbafa1d25eb51c630e4bJaikumar Ganesh
13942ea1e85dcb57d17f5782dbafa1d25eb51c630e4bJaikumar Ganesh        /* Make the call. */
13952ea1e85dcb57d17f5782dbafa1d25eb51c630e4bJaikumar Ganesh        reply = dbus_connection_send_with_reply_and_block(nat->conn, msg, -1, &err);
13962ea1e85dcb57d17f5782dbafa1d25eb51c630e4bJaikumar Ganesh
13972ea1e85dcb57d17f5782dbafa1d25eb51c630e4bJaikumar Ganesh        env->ReleaseStringUTFChars(role, c_role);
13982ea1e85dcb57d17f5782dbafa1d25eb51c630e4bJaikumar Ganesh        env->ReleaseStringUTFChars(name, c_name);
13992ea1e85dcb57d17f5782dbafa1d25eb51c630e4bJaikumar Ganesh
14002ea1e85dcb57d17f5782dbafa1d25eb51c630e4bJaikumar Ganesh        if (!reply) {
14012ea1e85dcb57d17f5782dbafa1d25eb51c630e4bJaikumar Ganesh            if (dbus_error_is_set(&err)) {
14022ea1e85dcb57d17f5782dbafa1d25eb51c630e4bJaikumar Ganesh                LOG_AND_FREE_DBUS_ERROR(&err);
14032ea1e85dcb57d17f5782dbafa1d25eb51c630e4bJaikumar Ganesh            }
14042ea1e85dcb57d17f5782dbafa1d25eb51c630e4bJaikumar Ganesh        } else {
14052ea1e85dcb57d17f5782dbafa1d25eb51c630e4bJaikumar Ganesh            if (!dbus_message_get_args(reply, &err,
14062ea1e85dcb57d17f5782dbafa1d25eb51c630e4bJaikumar Ganesh                                      DBUS_TYPE_OBJECT_PATH, &c_path,
14072ea1e85dcb57d17f5782dbafa1d25eb51c630e4bJaikumar Ganesh                                      DBUS_TYPE_INVALID)) {
14082ea1e85dcb57d17f5782dbafa1d25eb51c630e4bJaikumar Ganesh                if (dbus_error_is_set(&err)) {
14092ea1e85dcb57d17f5782dbafa1d25eb51c630e4bJaikumar Ganesh                    LOG_AND_FREE_DBUS_ERROR(&err);
14102ea1e85dcb57d17f5782dbafa1d25eb51c630e4bJaikumar Ganesh                }
14112ea1e85dcb57d17f5782dbafa1d25eb51c630e4bJaikumar Ganesh            } else {
14122ea1e85dcb57d17f5782dbafa1d25eb51c630e4bJaikumar Ganesh                path = env->NewStringUTF(c_path);
14132ea1e85dcb57d17f5782dbafa1d25eb51c630e4bJaikumar Ganesh            }
14142ea1e85dcb57d17f5782dbafa1d25eb51c630e4bJaikumar Ganesh            dbus_message_unref(reply);
14152ea1e85dcb57d17f5782dbafa1d25eb51c630e4bJaikumar Ganesh        }
14162ea1e85dcb57d17f5782dbafa1d25eb51c630e4bJaikumar Ganesh    }
14172ea1e85dcb57d17f5782dbafa1d25eb51c630e4bJaikumar Ganesh#endif
14182ea1e85dcb57d17f5782dbafa1d25eb51c630e4bJaikumar Ganesh    return path;
14192ea1e85dcb57d17f5782dbafa1d25eb51c630e4bJaikumar Ganesh}
14202ea1e85dcb57d17f5782dbafa1d25eb51c630e4bJaikumar Ganesh
14212ea1e85dcb57d17f5782dbafa1d25eb51c630e4bJaikumar Ganeshstatic jboolean unregisterHealthApplicationNative(JNIEnv *env, jobject object,
14222ea1e85dcb57d17f5782dbafa1d25eb51c630e4bJaikumar Ganesh                                                    jstring path) {
14232ea1e85dcb57d17f5782dbafa1d25eb51c630e4bJaikumar Ganesh    LOGV("%s", __FUNCTION__);
14242ea1e85dcb57d17f5782dbafa1d25eb51c630e4bJaikumar Ganesh    jboolean result = JNI_FALSE;
14252ea1e85dcb57d17f5782dbafa1d25eb51c630e4bJaikumar Ganesh#ifdef HAVE_BLUETOOTH
14262ea1e85dcb57d17f5782dbafa1d25eb51c630e4bJaikumar Ganesh    native_data_t *nat = get_native_data(env, object);
14272ea1e85dcb57d17f5782dbafa1d25eb51c630e4bJaikumar Ganesh    if (nat) {
14282ea1e85dcb57d17f5782dbafa1d25eb51c630e4bJaikumar Ganesh        const char *c_path = env->GetStringUTFChars(path, NULL);
14292ea1e85dcb57d17f5782dbafa1d25eb51c630e4bJaikumar Ganesh        DBusError err;
14302ea1e85dcb57d17f5782dbafa1d25eb51c630e4bJaikumar Ganesh        dbus_error_init(&err);
14312ea1e85dcb57d17f5782dbafa1d25eb51c630e4bJaikumar Ganesh        DBusMessage *reply =
14322ea1e85dcb57d17f5782dbafa1d25eb51c630e4bJaikumar Ganesh            dbus_func_args_timeout(env, nat->conn, -1,
14332ea1e85dcb57d17f5782dbafa1d25eb51c630e4bJaikumar Ganesh                                   DBUS_HEALTH_MANAGER_PATH,
14342ea1e85dcb57d17f5782dbafa1d25eb51c630e4bJaikumar Ganesh                                   DBUS_HEALTH_MANAGER_IFACE, "DestroyApplication",
14352ea1e85dcb57d17f5782dbafa1d25eb51c630e4bJaikumar Ganesh                                   DBUS_TYPE_OBJECT_PATH, &c_path,
14362ea1e85dcb57d17f5782dbafa1d25eb51c630e4bJaikumar Ganesh                                   DBUS_TYPE_INVALID);
14372ea1e85dcb57d17f5782dbafa1d25eb51c630e4bJaikumar Ganesh
14382ea1e85dcb57d17f5782dbafa1d25eb51c630e4bJaikumar Ganesh        env->ReleaseStringUTFChars(path, c_path);
14392ea1e85dcb57d17f5782dbafa1d25eb51c630e4bJaikumar Ganesh
14402ea1e85dcb57d17f5782dbafa1d25eb51c630e4bJaikumar Ganesh        if (!reply) {
14412ea1e85dcb57d17f5782dbafa1d25eb51c630e4bJaikumar Ganesh            if (dbus_error_is_set(&err)) {
14422ea1e85dcb57d17f5782dbafa1d25eb51c630e4bJaikumar Ganesh                LOG_AND_FREE_DBUS_ERROR(&err);
14432ea1e85dcb57d17f5782dbafa1d25eb51c630e4bJaikumar Ganesh            }
14442ea1e85dcb57d17f5782dbafa1d25eb51c630e4bJaikumar Ganesh        } else {
14452ea1e85dcb57d17f5782dbafa1d25eb51c630e4bJaikumar Ganesh            result = JNI_TRUE;
14462ea1e85dcb57d17f5782dbafa1d25eb51c630e4bJaikumar Ganesh        }
14472ea1e85dcb57d17f5782dbafa1d25eb51c630e4bJaikumar Ganesh    }
14482ea1e85dcb57d17f5782dbafa1d25eb51c630e4bJaikumar Ganesh#endif
14492ea1e85dcb57d17f5782dbafa1d25eb51c630e4bJaikumar Ganesh    return result;
14502ea1e85dcb57d17f5782dbafa1d25eb51c630e4bJaikumar Ganesh}
14512ea1e85dcb57d17f5782dbafa1d25eb51c630e4bJaikumar Ganesh
14522ea1e85dcb57d17f5782dbafa1d25eb51c630e4bJaikumar Ganeshstatic jboolean createChannelNative(JNIEnv *env, jobject object,
1453b5d2d4526cd2c0117b7a33b1297ac683c37ac5c7Jaikumar Ganesh                                       jstring devicePath, jstring appPath, jstring config,
1454b5d2d4526cd2c0117b7a33b1297ac683c37ac5c7Jaikumar Ganesh                                       jint code) {
14552ea1e85dcb57d17f5782dbafa1d25eb51c630e4bJaikumar Ganesh    LOGV("%s", __FUNCTION__);
14562ea1e85dcb57d17f5782dbafa1d25eb51c630e4bJaikumar Ganesh#ifdef HAVE_BLUETOOTH
14572ea1e85dcb57d17f5782dbafa1d25eb51c630e4bJaikumar Ganesh    native_data_t *nat = get_native_data(env, object);
1458b5d2d4526cd2c0117b7a33b1297ac683c37ac5c7Jaikumar Ganesh    jobject eventLoop = env->GetObjectField(object, field_mEventLoop);
1459b5d2d4526cd2c0117b7a33b1297ac683c37ac5c7Jaikumar Ganesh    struct event_loop_native_data_t *eventLoopNat =
1460b5d2d4526cd2c0117b7a33b1297ac683c37ac5c7Jaikumar Ganesh            get_EventLoop_native_data(env, eventLoop);
14612ea1e85dcb57d17f5782dbafa1d25eb51c630e4bJaikumar Ganesh
1462b5d2d4526cd2c0117b7a33b1297ac683c37ac5c7Jaikumar Ganesh    if (nat && eventLoopNat) {
14632ea1e85dcb57d17f5782dbafa1d25eb51c630e4bJaikumar Ganesh        const char *c_device_path = env->GetStringUTFChars(devicePath, NULL);
14642ea1e85dcb57d17f5782dbafa1d25eb51c630e4bJaikumar Ganesh        const char *c_app_path = env->GetStringUTFChars(appPath, NULL);
14652ea1e85dcb57d17f5782dbafa1d25eb51c630e4bJaikumar Ganesh        const char *c_config = env->GetStringUTFChars(config, NULL);
1466b5d2d4526cd2c0117b7a33b1297ac683c37ac5c7Jaikumar Ganesh        int *data = (int *) malloc(sizeof(int));
1467b5d2d4526cd2c0117b7a33b1297ac683c37ac5c7Jaikumar Ganesh        if (data == NULL) return JNI_FALSE;
1468b5d2d4526cd2c0117b7a33b1297ac683c37ac5c7Jaikumar Ganesh
1469b5d2d4526cd2c0117b7a33b1297ac683c37ac5c7Jaikumar Ganesh        *data = code;
1470b5d2d4526cd2c0117b7a33b1297ac683c37ac5c7Jaikumar Ganesh        bool ret = dbus_func_args_async(env, nat->conn, -1, onHealthDeviceConnectionResult,
1471b5d2d4526cd2c0117b7a33b1297ac683c37ac5c7Jaikumar Ganesh                                        data, eventLoopNat, c_device_path,
1472b5d2d4526cd2c0117b7a33b1297ac683c37ac5c7Jaikumar Ganesh                                        DBUS_HEALTH_DEVICE_IFACE, "CreateChannel",
1473b5d2d4526cd2c0117b7a33b1297ac683c37ac5c7Jaikumar Ganesh                                        DBUS_TYPE_OBJECT_PATH, &c_app_path,
1474b5d2d4526cd2c0117b7a33b1297ac683c37ac5c7Jaikumar Ganesh                                        DBUS_TYPE_STRING, &c_config,
1475b5d2d4526cd2c0117b7a33b1297ac683c37ac5c7Jaikumar Ganesh                                        DBUS_TYPE_INVALID);
14762ea1e85dcb57d17f5782dbafa1d25eb51c630e4bJaikumar Ganesh
14772ea1e85dcb57d17f5782dbafa1d25eb51c630e4bJaikumar Ganesh
14782ea1e85dcb57d17f5782dbafa1d25eb51c630e4bJaikumar Ganesh        env->ReleaseStringUTFChars(devicePath, c_device_path);
14792ea1e85dcb57d17f5782dbafa1d25eb51c630e4bJaikumar Ganesh        env->ReleaseStringUTFChars(appPath, c_app_path);
14802ea1e85dcb57d17f5782dbafa1d25eb51c630e4bJaikumar Ganesh        env->ReleaseStringUTFChars(config, c_config);
14812ea1e85dcb57d17f5782dbafa1d25eb51c630e4bJaikumar Ganesh
1482b5d2d4526cd2c0117b7a33b1297ac683c37ac5c7Jaikumar Ganesh        return ret ? JNI_TRUE : JNI_FALSE;
14832ea1e85dcb57d17f5782dbafa1d25eb51c630e4bJaikumar Ganesh    }
14842ea1e85dcb57d17f5782dbafa1d25eb51c630e4bJaikumar Ganesh#endif
1485b5d2d4526cd2c0117b7a33b1297ac683c37ac5c7Jaikumar Ganesh    return JNI_FALSE;
14862ea1e85dcb57d17f5782dbafa1d25eb51c630e4bJaikumar Ganesh}
14872ea1e85dcb57d17f5782dbafa1d25eb51c630e4bJaikumar Ganesh
14882ea1e85dcb57d17f5782dbafa1d25eb51c630e4bJaikumar Ganeshstatic jboolean destroyChannelNative(JNIEnv *env, jobject object, jstring devicePath,
1489b5d2d4526cd2c0117b7a33b1297ac683c37ac5c7Jaikumar Ganesh                                     jstring channelPath, jint code) {
14902ea1e85dcb57d17f5782dbafa1d25eb51c630e4bJaikumar Ganesh    LOGE("%s", __FUNCTION__);
14912ea1e85dcb57d17f5782dbafa1d25eb51c630e4bJaikumar Ganesh#ifdef HAVE_BLUETOOTH
14922ea1e85dcb57d17f5782dbafa1d25eb51c630e4bJaikumar Ganesh    native_data_t *nat = get_native_data(env, object);
1493b5d2d4526cd2c0117b7a33b1297ac683c37ac5c7Jaikumar Ganesh    jobject eventLoop = env->GetObjectField(object, field_mEventLoop);
1494b5d2d4526cd2c0117b7a33b1297ac683c37ac5c7Jaikumar Ganesh    struct event_loop_native_data_t *eventLoopNat =
1495b5d2d4526cd2c0117b7a33b1297ac683c37ac5c7Jaikumar Ganesh            get_EventLoop_native_data(env, eventLoop);
14962ea1e85dcb57d17f5782dbafa1d25eb51c630e4bJaikumar Ganesh
1497b5d2d4526cd2c0117b7a33b1297ac683c37ac5c7Jaikumar Ganesh    if (nat && eventLoopNat) {
14982ea1e85dcb57d17f5782dbafa1d25eb51c630e4bJaikumar Ganesh        const char *c_device_path = env->GetStringUTFChars(devicePath, NULL);
14992ea1e85dcb57d17f5782dbafa1d25eb51c630e4bJaikumar Ganesh        const char *c_channel_path = env->GetStringUTFChars(channelPath, NULL);
1500b5d2d4526cd2c0117b7a33b1297ac683c37ac5c7Jaikumar Ganesh        int *data = (int *) malloc(sizeof(int));
1501b5d2d4526cd2c0117b7a33b1297ac683c37ac5c7Jaikumar Ganesh        if (data == NULL) return JNI_FALSE;
1502b5d2d4526cd2c0117b7a33b1297ac683c37ac5c7Jaikumar Ganesh
1503b5d2d4526cd2c0117b7a33b1297ac683c37ac5c7Jaikumar Ganesh        *data = code;
1504b5d2d4526cd2c0117b7a33b1297ac683c37ac5c7Jaikumar Ganesh        bool ret = dbus_func_args_async(env, nat->conn, -1, onHealthDeviceConnectionResult,
1505b5d2d4526cd2c0117b7a33b1297ac683c37ac5c7Jaikumar Ganesh                                        data, eventLoopNat, c_device_path,
1506b5d2d4526cd2c0117b7a33b1297ac683c37ac5c7Jaikumar Ganesh                                        DBUS_HEALTH_DEVICE_IFACE, "DestroyChannel",
1507b5d2d4526cd2c0117b7a33b1297ac683c37ac5c7Jaikumar Ganesh                                        DBUS_TYPE_OBJECT_PATH, &c_channel_path,
1508b5d2d4526cd2c0117b7a33b1297ac683c37ac5c7Jaikumar Ganesh                                        DBUS_TYPE_INVALID);
15092ea1e85dcb57d17f5782dbafa1d25eb51c630e4bJaikumar Ganesh
15102ea1e85dcb57d17f5782dbafa1d25eb51c630e4bJaikumar Ganesh        env->ReleaseStringUTFChars(devicePath, c_device_path);
15112ea1e85dcb57d17f5782dbafa1d25eb51c630e4bJaikumar Ganesh        env->ReleaseStringUTFChars(channelPath, c_channel_path);
15122ea1e85dcb57d17f5782dbafa1d25eb51c630e4bJaikumar Ganesh
1513b5d2d4526cd2c0117b7a33b1297ac683c37ac5c7Jaikumar Ganesh        return ret ? JNI_TRUE : JNI_FALSE;
15142ea1e85dcb57d17f5782dbafa1d25eb51c630e4bJaikumar Ganesh    }
15152ea1e85dcb57d17f5782dbafa1d25eb51c630e4bJaikumar Ganesh#endif
1516b5d2d4526cd2c0117b7a33b1297ac683c37ac5c7Jaikumar Ganesh    return JNI_FALSE;
15172ea1e85dcb57d17f5782dbafa1d25eb51c630e4bJaikumar Ganesh}
15182ea1e85dcb57d17f5782dbafa1d25eb51c630e4bJaikumar Ganesh
15192ea1e85dcb57d17f5782dbafa1d25eb51c630e4bJaikumar Ganeshstatic jstring getMainChannelNative(JNIEnv *env, jobject object, jstring devicePath) {
15202ea1e85dcb57d17f5782dbafa1d25eb51c630e4bJaikumar Ganesh    LOGE("%s", __FUNCTION__);
15212ea1e85dcb57d17f5782dbafa1d25eb51c630e4bJaikumar Ganesh#ifdef HAVE_BLUETOOTH
15222ea1e85dcb57d17f5782dbafa1d25eb51c630e4bJaikumar Ganesh    native_data_t *nat = get_native_data(env, object);
15232ea1e85dcb57d17f5782dbafa1d25eb51c630e4bJaikumar Ganesh    if (nat) {
15242ea1e85dcb57d17f5782dbafa1d25eb51c630e4bJaikumar Ganesh        const char *c_device_path = env->GetStringUTFChars(devicePath, NULL);
15252ea1e85dcb57d17f5782dbafa1d25eb51c630e4bJaikumar Ganesh        DBusError err;
15262ea1e85dcb57d17f5782dbafa1d25eb51c630e4bJaikumar Ganesh        dbus_error_init(&err);
15272ea1e85dcb57d17f5782dbafa1d25eb51c630e4bJaikumar Ganesh
15282ea1e85dcb57d17f5782dbafa1d25eb51c630e4bJaikumar Ganesh        DBusMessage *reply = dbus_func_args(env, nat->conn,
15292ea1e85dcb57d17f5782dbafa1d25eb51c630e4bJaikumar Ganesh                           c_device_path,
15302ea1e85dcb57d17f5782dbafa1d25eb51c630e4bJaikumar Ganesh                           DBUS_HEALTH_DEVICE_IFACE, "GetProperties",
15312ea1e85dcb57d17f5782dbafa1d25eb51c630e4bJaikumar Ganesh                           DBUS_TYPE_INVALID);
15322ea1e85dcb57d17f5782dbafa1d25eb51c630e4bJaikumar Ganesh        env->ReleaseStringUTFChars(devicePath, c_device_path);
15332ea1e85dcb57d17f5782dbafa1d25eb51c630e4bJaikumar Ganesh
15342ea1e85dcb57d17f5782dbafa1d25eb51c630e4bJaikumar Ganesh        if (!reply) {
15352ea1e85dcb57d17f5782dbafa1d25eb51c630e4bJaikumar Ganesh            if (dbus_error_is_set(&err)) {
15362ea1e85dcb57d17f5782dbafa1d25eb51c630e4bJaikumar Ganesh                LOG_AND_FREE_DBUS_ERROR(&err);
15372ea1e85dcb57d17f5782dbafa1d25eb51c630e4bJaikumar Ganesh            }
15382ea1e85dcb57d17f5782dbafa1d25eb51c630e4bJaikumar Ganesh        } else {
15392ea1e85dcb57d17f5782dbafa1d25eb51c630e4bJaikumar Ganesh            DBusMessageIter iter;
15402ea1e85dcb57d17f5782dbafa1d25eb51c630e4bJaikumar Ganesh            jobjectArray str_array = NULL;
15412ea1e85dcb57d17f5782dbafa1d25eb51c630e4bJaikumar Ganesh            if (dbus_message_iter_init(reply, &iter))
15422ea1e85dcb57d17f5782dbafa1d25eb51c630e4bJaikumar Ganesh                str_array = parse_health_device_properties(env, &iter);
15432ea1e85dcb57d17f5782dbafa1d25eb51c630e4bJaikumar Ganesh            dbus_message_unref(reply);
15442ea1e85dcb57d17f5782dbafa1d25eb51c630e4bJaikumar Ganesh            jstring path = (jstring) env->GetObjectArrayElement(str_array, 1);
15452ea1e85dcb57d17f5782dbafa1d25eb51c630e4bJaikumar Ganesh
15462ea1e85dcb57d17f5782dbafa1d25eb51c630e4bJaikumar Ganesh            return path;
15472ea1e85dcb57d17f5782dbafa1d25eb51c630e4bJaikumar Ganesh        }
15482ea1e85dcb57d17f5782dbafa1d25eb51c630e4bJaikumar Ganesh    }
15492ea1e85dcb57d17f5782dbafa1d25eb51c630e4bJaikumar Ganesh#endif
15502ea1e85dcb57d17f5782dbafa1d25eb51c630e4bJaikumar Ganesh    return NULL;
15512ea1e85dcb57d17f5782dbafa1d25eb51c630e4bJaikumar Ganesh}
15522ea1e85dcb57d17f5782dbafa1d25eb51c630e4bJaikumar Ganesh
15532ea1e85dcb57d17f5782dbafa1d25eb51c630e4bJaikumar Ganeshstatic jstring getChannelApplicationNative(JNIEnv *env, jobject object, jstring channelPath) {
15542ea1e85dcb57d17f5782dbafa1d25eb51c630e4bJaikumar Ganesh    LOGE("%s", __FUNCTION__);
15552ea1e85dcb57d17f5782dbafa1d25eb51c630e4bJaikumar Ganesh#ifdef HAVE_BLUETOOTH
15562ea1e85dcb57d17f5782dbafa1d25eb51c630e4bJaikumar Ganesh    native_data_t *nat = get_native_data(env, object);
15572ea1e85dcb57d17f5782dbafa1d25eb51c630e4bJaikumar Ganesh    if (nat) {
15582ea1e85dcb57d17f5782dbafa1d25eb51c630e4bJaikumar Ganesh        const char *c_channel_path = env->GetStringUTFChars(channelPath, NULL);
15592ea1e85dcb57d17f5782dbafa1d25eb51c630e4bJaikumar Ganesh        DBusError err;
15602ea1e85dcb57d17f5782dbafa1d25eb51c630e4bJaikumar Ganesh        dbus_error_init(&err);
15612ea1e85dcb57d17f5782dbafa1d25eb51c630e4bJaikumar Ganesh
15622ea1e85dcb57d17f5782dbafa1d25eb51c630e4bJaikumar Ganesh        DBusMessage *reply = dbus_func_args(env, nat->conn,
15632ea1e85dcb57d17f5782dbafa1d25eb51c630e4bJaikumar Ganesh                                            c_channel_path,
15642ea1e85dcb57d17f5782dbafa1d25eb51c630e4bJaikumar Ganesh                                            DBUS_HEALTH_CHANNEL_IFACE, "GetProperties",
15652ea1e85dcb57d17f5782dbafa1d25eb51c630e4bJaikumar Ganesh                                            DBUS_TYPE_INVALID);
15662ea1e85dcb57d17f5782dbafa1d25eb51c630e4bJaikumar Ganesh        env->ReleaseStringUTFChars(channelPath, c_channel_path);
15672ea1e85dcb57d17f5782dbafa1d25eb51c630e4bJaikumar Ganesh
15682ea1e85dcb57d17f5782dbafa1d25eb51c630e4bJaikumar Ganesh        if (!reply) {
15692ea1e85dcb57d17f5782dbafa1d25eb51c630e4bJaikumar Ganesh            if (dbus_error_is_set(&err)) {
15702ea1e85dcb57d17f5782dbafa1d25eb51c630e4bJaikumar Ganesh                LOG_AND_FREE_DBUS_ERROR(&err);
15712ea1e85dcb57d17f5782dbafa1d25eb51c630e4bJaikumar Ganesh            }
15722ea1e85dcb57d17f5782dbafa1d25eb51c630e4bJaikumar Ganesh        } else {
15732ea1e85dcb57d17f5782dbafa1d25eb51c630e4bJaikumar Ganesh            DBusMessageIter iter;
15742ea1e85dcb57d17f5782dbafa1d25eb51c630e4bJaikumar Ganesh            jobjectArray str_array = NULL;
15752ea1e85dcb57d17f5782dbafa1d25eb51c630e4bJaikumar Ganesh            if (dbus_message_iter_init(reply, &iter))
15762ea1e85dcb57d17f5782dbafa1d25eb51c630e4bJaikumar Ganesh                str_array = parse_health_channel_properties(env, &iter);
15772ea1e85dcb57d17f5782dbafa1d25eb51c630e4bJaikumar Ganesh            dbus_message_unref(reply);
15782ea1e85dcb57d17f5782dbafa1d25eb51c630e4bJaikumar Ganesh
15792ea1e85dcb57d17f5782dbafa1d25eb51c630e4bJaikumar Ganesh            jint len = env->GetArrayLength(str_array);
15802ea1e85dcb57d17f5782dbafa1d25eb51c630e4bJaikumar Ganesh
15812ea1e85dcb57d17f5782dbafa1d25eb51c630e4bJaikumar Ganesh            jstring name, path;
15822ea1e85dcb57d17f5782dbafa1d25eb51c630e4bJaikumar Ganesh            const char *c_name;
15832ea1e85dcb57d17f5782dbafa1d25eb51c630e4bJaikumar Ganesh
15842ea1e85dcb57d17f5782dbafa1d25eb51c630e4bJaikumar Ganesh            for (int i = 0; i < len; i+=2) {
15852ea1e85dcb57d17f5782dbafa1d25eb51c630e4bJaikumar Ganesh                name = (jstring) env->GetObjectArrayElement(str_array, i);
15862ea1e85dcb57d17f5782dbafa1d25eb51c630e4bJaikumar Ganesh                c_name = env->GetStringUTFChars(name, NULL);
15872ea1e85dcb57d17f5782dbafa1d25eb51c630e4bJaikumar Ganesh
15882ea1e85dcb57d17f5782dbafa1d25eb51c630e4bJaikumar Ganesh                if (!strcmp(c_name, "Application")) {
15892ea1e85dcb57d17f5782dbafa1d25eb51c630e4bJaikumar Ganesh                    path = (jstring) env->GetObjectArrayElement(str_array, i+1);
15902ea1e85dcb57d17f5782dbafa1d25eb51c630e4bJaikumar Ganesh                    env->ReleaseStringUTFChars(name, c_name);
15912ea1e85dcb57d17f5782dbafa1d25eb51c630e4bJaikumar Ganesh                    return path;
15922ea1e85dcb57d17f5782dbafa1d25eb51c630e4bJaikumar Ganesh                }
15932ea1e85dcb57d17f5782dbafa1d25eb51c630e4bJaikumar Ganesh                env->ReleaseStringUTFChars(name, c_name);
15942ea1e85dcb57d17f5782dbafa1d25eb51c630e4bJaikumar Ganesh            }
15952ea1e85dcb57d17f5782dbafa1d25eb51c630e4bJaikumar Ganesh        }
15962ea1e85dcb57d17f5782dbafa1d25eb51c630e4bJaikumar Ganesh    }
15972ea1e85dcb57d17f5782dbafa1d25eb51c630e4bJaikumar Ganesh#endif
15982ea1e85dcb57d17f5782dbafa1d25eb51c630e4bJaikumar Ganesh    return NULL;
15992ea1e85dcb57d17f5782dbafa1d25eb51c630e4bJaikumar Ganesh}
16002ea1e85dcb57d17f5782dbafa1d25eb51c630e4bJaikumar Ganesh
16012ea1e85dcb57d17f5782dbafa1d25eb51c630e4bJaikumar Ganeshstatic jboolean releaseChannelFdNative(JNIEnv *env, jobject object, jstring channelPath) {
16022ea1e85dcb57d17f5782dbafa1d25eb51c630e4bJaikumar Ganesh    LOGV("%s", __FUNCTION__);
16032ea1e85dcb57d17f5782dbafa1d25eb51c630e4bJaikumar Ganesh#ifdef HAVE_BLUETOOTH
16042ea1e85dcb57d17f5782dbafa1d25eb51c630e4bJaikumar Ganesh    native_data_t *nat = get_native_data(env, object);
16052ea1e85dcb57d17f5782dbafa1d25eb51c630e4bJaikumar Ganesh    if (nat) {
16062ea1e85dcb57d17f5782dbafa1d25eb51c630e4bJaikumar Ganesh        const char *c_channel_path = env->GetStringUTFChars(channelPath, NULL);
16072ea1e85dcb57d17f5782dbafa1d25eb51c630e4bJaikumar Ganesh        DBusError err;
16082ea1e85dcb57d17f5782dbafa1d25eb51c630e4bJaikumar Ganesh        dbus_error_init(&err);
16092ea1e85dcb57d17f5782dbafa1d25eb51c630e4bJaikumar Ganesh
16102ea1e85dcb57d17f5782dbafa1d25eb51c630e4bJaikumar Ganesh        DBusMessage *reply = dbus_func_args(env, nat->conn,
16112ea1e85dcb57d17f5782dbafa1d25eb51c630e4bJaikumar Ganesh                                            c_channel_path,
16122ea1e85dcb57d17f5782dbafa1d25eb51c630e4bJaikumar Ganesh                                            DBUS_HEALTH_CHANNEL_IFACE, "Release",
16132ea1e85dcb57d17f5782dbafa1d25eb51c630e4bJaikumar Ganesh                                            DBUS_TYPE_INVALID);
16142ea1e85dcb57d17f5782dbafa1d25eb51c630e4bJaikumar Ganesh        env->ReleaseStringUTFChars(channelPath, c_channel_path);
16152ea1e85dcb57d17f5782dbafa1d25eb51c630e4bJaikumar Ganesh
16162ea1e85dcb57d17f5782dbafa1d25eb51c630e4bJaikumar Ganesh        return reply ? JNI_TRUE : JNI_FALSE;
16172ea1e85dcb57d17f5782dbafa1d25eb51c630e4bJaikumar Ganesh    }
16182ea1e85dcb57d17f5782dbafa1d25eb51c630e4bJaikumar Ganesh#endif
16192ea1e85dcb57d17f5782dbafa1d25eb51c630e4bJaikumar Ganesh    return JNI_FALSE;
16202ea1e85dcb57d17f5782dbafa1d25eb51c630e4bJaikumar Ganesh}
16212ea1e85dcb57d17f5782dbafa1d25eb51c630e4bJaikumar Ganesh
16222ea1e85dcb57d17f5782dbafa1d25eb51c630e4bJaikumar Ganeshstatic jobject getChannelFdNative(JNIEnv *env, jobject object, jstring channelPath) {
16232ea1e85dcb57d17f5782dbafa1d25eb51c630e4bJaikumar Ganesh    LOGV("%s", __FUNCTION__);
16242ea1e85dcb57d17f5782dbafa1d25eb51c630e4bJaikumar Ganesh#ifdef HAVE_BLUETOOTH
16252ea1e85dcb57d17f5782dbafa1d25eb51c630e4bJaikumar Ganesh    native_data_t *nat = get_native_data(env, object);
16262ea1e85dcb57d17f5782dbafa1d25eb51c630e4bJaikumar Ganesh    if (nat) {
16272ea1e85dcb57d17f5782dbafa1d25eb51c630e4bJaikumar Ganesh        const char *c_channel_path = env->GetStringUTFChars(channelPath, NULL);
16282ea1e85dcb57d17f5782dbafa1d25eb51c630e4bJaikumar Ganesh        int32_t fd;
16292ea1e85dcb57d17f5782dbafa1d25eb51c630e4bJaikumar Ganesh        DBusError err;
16302ea1e85dcb57d17f5782dbafa1d25eb51c630e4bJaikumar Ganesh        dbus_error_init(&err);
16312ea1e85dcb57d17f5782dbafa1d25eb51c630e4bJaikumar Ganesh
16322ea1e85dcb57d17f5782dbafa1d25eb51c630e4bJaikumar Ganesh        DBusMessage *reply = dbus_func_args(env, nat->conn,
16332ea1e85dcb57d17f5782dbafa1d25eb51c630e4bJaikumar Ganesh                                            c_channel_path,
16342ea1e85dcb57d17f5782dbafa1d25eb51c630e4bJaikumar Ganesh                                            DBUS_HEALTH_CHANNEL_IFACE, "Acquire",
16352ea1e85dcb57d17f5782dbafa1d25eb51c630e4bJaikumar Ganesh                                            DBUS_TYPE_INVALID);
16362ea1e85dcb57d17f5782dbafa1d25eb51c630e4bJaikumar Ganesh        env->ReleaseStringUTFChars(channelPath, c_channel_path);
16372ea1e85dcb57d17f5782dbafa1d25eb51c630e4bJaikumar Ganesh
16382ea1e85dcb57d17f5782dbafa1d25eb51c630e4bJaikumar Ganesh        if (!reply) {
16392ea1e85dcb57d17f5782dbafa1d25eb51c630e4bJaikumar Ganesh            if (dbus_error_is_set(&err)) {
16402ea1e85dcb57d17f5782dbafa1d25eb51c630e4bJaikumar Ganesh                LOG_AND_FREE_DBUS_ERROR(&err);
16412ea1e85dcb57d17f5782dbafa1d25eb51c630e4bJaikumar Ganesh            }
16422ea1e85dcb57d17f5782dbafa1d25eb51c630e4bJaikumar Ganesh            return NULL;
16432ea1e85dcb57d17f5782dbafa1d25eb51c630e4bJaikumar Ganesh        }
16442ea1e85dcb57d17f5782dbafa1d25eb51c630e4bJaikumar Ganesh
16452ea1e85dcb57d17f5782dbafa1d25eb51c630e4bJaikumar Ganesh        fd = dbus_returns_unixfd(env, reply);
16462ea1e85dcb57d17f5782dbafa1d25eb51c630e4bJaikumar Ganesh        if (fd == -1) return NULL;
16472ea1e85dcb57d17f5782dbafa1d25eb51c630e4bJaikumar Ganesh
16482ea1e85dcb57d17f5782dbafa1d25eb51c630e4bJaikumar Ganesh        // Create FileDescriptor object
16492ea1e85dcb57d17f5782dbafa1d25eb51c630e4bJaikumar Ganesh        jobject fileDesc = jniCreateFileDescriptor(env, fd);
16502ea1e85dcb57d17f5782dbafa1d25eb51c630e4bJaikumar Ganesh        if (fileDesc == NULL) {
16512ea1e85dcb57d17f5782dbafa1d25eb51c630e4bJaikumar Ganesh            // FileDescriptor constructor has thrown an exception
16522ea1e85dcb57d17f5782dbafa1d25eb51c630e4bJaikumar Ganesh            releaseChannelFdNative(env, object, channelPath);
1653eb9d34630f74d0260690287f2df57c0cd3d7ba1dJaikumar Ganesh            close(fd);
16542ea1e85dcb57d17f5782dbafa1d25eb51c630e4bJaikumar Ganesh            return NULL;
16552ea1e85dcb57d17f5782dbafa1d25eb51c630e4bJaikumar Ganesh        }
16562ea1e85dcb57d17f5782dbafa1d25eb51c630e4bJaikumar Ganesh
16572ea1e85dcb57d17f5782dbafa1d25eb51c630e4bJaikumar Ganesh        // Wrap it in a ParcelFileDescriptor
16582ea1e85dcb57d17f5782dbafa1d25eb51c630e4bJaikumar Ganesh        jobject parcelFileDesc = newParcelFileDescriptor(env, fileDesc);
16592ea1e85dcb57d17f5782dbafa1d25eb51c630e4bJaikumar Ganesh        if (parcelFileDesc == NULL) {
16602ea1e85dcb57d17f5782dbafa1d25eb51c630e4bJaikumar Ganesh            // ParcelFileDescriptor constructor has thrown an exception
16612ea1e85dcb57d17f5782dbafa1d25eb51c630e4bJaikumar Ganesh            releaseChannelFdNative(env, object, channelPath);
1662eb9d34630f74d0260690287f2df57c0cd3d7ba1dJaikumar Ganesh            close(fd);
16632ea1e85dcb57d17f5782dbafa1d25eb51c630e4bJaikumar Ganesh            return NULL;
16642ea1e85dcb57d17f5782dbafa1d25eb51c630e4bJaikumar Ganesh        }
16652ea1e85dcb57d17f5782dbafa1d25eb51c630e4bJaikumar Ganesh
16662ea1e85dcb57d17f5782dbafa1d25eb51c630e4bJaikumar Ganesh        return parcelFileDesc;
16672ea1e85dcb57d17f5782dbafa1d25eb51c630e4bJaikumar Ganesh    }
16682ea1e85dcb57d17f5782dbafa1d25eb51c630e4bJaikumar Ganesh#endif
16692ea1e85dcb57d17f5782dbafa1d25eb51c630e4bJaikumar Ganesh    return NULL;
16702ea1e85dcb57d17f5782dbafa1d25eb51c630e4bJaikumar Ganesh}
16712ea1e85dcb57d17f5782dbafa1d25eb51c630e4bJaikumar Ganesh
16722ea1e85dcb57d17f5782dbafa1d25eb51c630e4bJaikumar Ganesh
16732ea1e85dcb57d17f5782dbafa1d25eb51c630e4bJaikumar Ganesh
16749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic JNINativeMethod sMethods[] = {
16759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     /* name, signature, funcPtr */
16769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    {"classInitNative", "()V", (void*)classInitNative},
16779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    {"initializeNativeDataNative", "()V", (void *)initializeNativeDataNative},
1678d5ac1ae36b4e096eb97984334f86d0c68abea2f7Jaikumar Ganesh    {"setupNativeDataNative", "()Z", (void *)setupNativeDataNative},
1679d5ac1ae36b4e096eb97984334f86d0c68abea2f7Jaikumar Ganesh    {"tearDownNativeDataNative", "()Z", (void *)tearDownNativeDataNative},
16809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    {"cleanupNativeDataNative", "()V", (void *)cleanupNativeDataNative},
16819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    {"getAdapterPathNative", "()Ljava/lang/String;", (void*)getAdapterPathNative},
16829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
16839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    {"isEnabledNative", "()I", (void *)isEnabledNative},
16849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    {"enableNative", "()I", (void *)enableNative},
16859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    {"disableNative", "()I", (void *)disableNative},
16869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1687d5ac1ae36b4e096eb97984334f86d0c68abea2f7Jaikumar Ganesh    {"getAdapterPropertiesNative", "()[Ljava/lang/Object;", (void *)getAdapterPropertiesNative},
1688d5ac1ae36b4e096eb97984334f86d0c68abea2f7Jaikumar Ganesh    {"getDevicePropertiesNative", "(Ljava/lang/String;)[Ljava/lang/Object;",
1689d5ac1ae36b4e096eb97984334f86d0c68abea2f7Jaikumar Ganesh      (void *)getDevicePropertiesNative},
1690d5ac1ae36b4e096eb97984334f86d0c68abea2f7Jaikumar Ganesh    {"setAdapterPropertyStringNative", "(Ljava/lang/String;Ljava/lang/String;)Z",
1691d5ac1ae36b4e096eb97984334f86d0c68abea2f7Jaikumar Ganesh      (void *)setAdapterPropertyStringNative},
1692d5ac1ae36b4e096eb97984334f86d0c68abea2f7Jaikumar Ganesh    {"setAdapterPropertyBooleanNative", "(Ljava/lang/String;I)Z",
1693d5ac1ae36b4e096eb97984334f86d0c68abea2f7Jaikumar Ganesh      (void *)setAdapterPropertyBooleanNative},
1694d5ac1ae36b4e096eb97984334f86d0c68abea2f7Jaikumar Ganesh    {"setAdapterPropertyIntegerNative", "(Ljava/lang/String;I)Z",
1695d5ac1ae36b4e096eb97984334f86d0c68abea2f7Jaikumar Ganesh      (void *)setAdapterPropertyIntegerNative},
1696d5ac1ae36b4e096eb97984334f86d0c68abea2f7Jaikumar Ganesh
1697d5ac1ae36b4e096eb97984334f86d0c68abea2f7Jaikumar Ganesh    {"startDiscoveryNative", "()Z", (void*)startDiscoveryNative},
1698d5ac1ae36b4e096eb97984334f86d0c68abea2f7Jaikumar Ganesh    {"stopDiscoveryNative", "()Z", (void *)stopDiscoveryNative},
1699d5ac1ae36b4e096eb97984334f86d0c68abea2f7Jaikumar Ganesh
1700cc5494c9996f809e36539b24e8b6b67683383d29Jaikumar Ganesh    {"readAdapterOutOfBandDataNative", "()[B", (void *)readAdapterOutOfBandDataNative},
1701d5ac1ae36b4e096eb97984334f86d0c68abea2f7Jaikumar Ganesh    {"createPairedDeviceNative", "(Ljava/lang/String;I)Z", (void *)createPairedDeviceNative},
1702cc5494c9996f809e36539b24e8b6b67683383d29Jaikumar Ganesh    {"createPairedDeviceOutOfBandNative", "(Ljava/lang/String;I)Z",
1703cc5494c9996f809e36539b24e8b6b67683383d29Jaikumar Ganesh                                    (void *)createPairedDeviceOutOfBandNative},
1704d5ac1ae36b4e096eb97984334f86d0c68abea2f7Jaikumar Ganesh    {"cancelDeviceCreationNative", "(Ljava/lang/String;)Z", (void *)cancelDeviceCreationNative},
1705d5ac1ae36b4e096eb97984334f86d0c68abea2f7Jaikumar Ganesh    {"removeDeviceNative", "(Ljava/lang/String;)Z", (void *)removeDeviceNative},
1706d5ac1ae36b4e096eb97984334f86d0c68abea2f7Jaikumar Ganesh    {"getDeviceServiceChannelNative", "(Ljava/lang/String;Ljava/lang/String;I)I",
1707d5ac1ae36b4e096eb97984334f86d0c68abea2f7Jaikumar Ganesh      (void *)getDeviceServiceChannelNative},
1708d5ac1ae36b4e096eb97984334f86d0c68abea2f7Jaikumar Ganesh
1709b0eca41de0bb6747d8648b134912782e45e4cbefJaikumar Ganesh    {"setPairingConfirmationNative", "(Ljava/lang/String;ZI)Z",
1710b0eca41de0bb6747d8648b134912782e45e4cbefJaikumar Ganesh            (void *)setPairingConfirmationNative},
1711b0eca41de0bb6747d8648b134912782e45e4cbefJaikumar Ganesh    {"setPasskeyNative", "(Ljava/lang/String;II)Z", (void *)setPasskeyNative},
1712cc5494c9996f809e36539b24e8b6b67683383d29Jaikumar Ganesh    {"setRemoteOutOfBandDataNative", "(Ljava/lang/String;[B[BI)Z", (void *)setRemoteOutOfBandDataNative},
1713a0c680393f2dd03a937c598b2cb9abf98a58152cMatthew Xie    {"setAuthorizationNative", "(Ljava/lang/String;ZI)Z", (void *)setAuthorizationNative},
17149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    {"setPinNative", "(Ljava/lang/String;Ljava/lang/String;I)Z", (void *)setPinNative},
1715b0eca41de0bb6747d8648b134912782e45e4cbefJaikumar Ganesh    {"cancelPairingUserInputNative", "(Ljava/lang/String;I)Z",
1716b0eca41de0bb6747d8648b134912782e45e4cbefJaikumar Ganesh            (void *)cancelPairingUserInputNative},
1717efa1dd716da3372cc74a201d11de5e0ef1a9fe9aLixin Yue    {"setDevicePropertyBooleanNative", "(Ljava/lang/String;Ljava/lang/String;I)Z",
1718efa1dd716da3372cc74a201d11de5e0ef1a9fe9aLixin Yue            (void *)setDevicePropertyBooleanNative},
1719269e81a563cfe080d7f241d0d46411d3c946c111Matthew Xie    {"setDevicePropertyStringNative", "(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Z",
1720269e81a563cfe080d7f241d0d46411d3c946c111Matthew Xie            (void *)setDevicePropertyStringNative},
17211caa6d111eff6814760ec156b14adc29aa3aae6cJaikumar Ganesh    {"createDeviceNative", "(Ljava/lang/String;)Z", (void *)createDeviceNative},
17221caa6d111eff6814760ec156b14adc29aa3aae6cJaikumar Ganesh    {"discoverServicesNative", "(Ljava/lang/String;Ljava/lang/String;)Z", (void *)discoverServicesNative},
172324bb9b8af4ff691538fe9e517e8156016b0da6cdNick Pelly    {"addRfcommServiceRecordNative", "(Ljava/lang/String;JJS)I", (void *)addRfcommServiceRecordNative},
172424bb9b8af4ff691538fe9e517e8156016b0da6cdNick Pelly    {"removeServiceRecordNative", "(I)Z", (void *)removeServiceRecordNative},
172584690c88f37f395094147d27ace8319a2803a522Jaikumar Ganesh    {"addReservedServiceRecordsNative", "([I)[I", (void *) addReservedServiceRecordsNative},
172684690c88f37f395094147d27ace8319a2803a522Jaikumar Ganesh    {"removeReservedServiceRecordsNative", "([I)Z", (void *) removeReservedServiceRecordsNative},
1727b7e029d03c115ed65cdea9b2bba307e882c308e2Jaikumar Ganesh    {"setLinkTimeoutNative", "(Ljava/lang/String;I)Z", (void *)setLinkTimeoutNative},
1728545e6708adda6859932b55fd824794b1401f5318Jaikumar Ganesh    // HID functions
1729545e6708adda6859932b55fd824794b1401f5318Jaikumar Ganesh    {"connectInputDeviceNative", "(Ljava/lang/String;)Z", (void *)connectInputDeviceNative},
1730545e6708adda6859932b55fd824794b1401f5318Jaikumar Ganesh    {"disconnectInputDeviceNative", "(Ljava/lang/String;)Z", (void *)disconnectInputDeviceNative},
17316fdd0c6274c81b337ad35b70480f881daf7354c3Danica Chang
17326fdd0c6274c81b337ad35b70480f881daf7354c3Danica Chang    {"setBluetoothTetheringNative", "(ZLjava/lang/String;Ljava/lang/String;)Z",
17336fdd0c6274c81b337ad35b70480f881daf7354c3Danica Chang              (void *)setBluetoothTetheringNative},
1734b7ec3e10194084e2a198602e20589c5bdecbda37Jaikumar Ganesh    {"connectPanDeviceNative", "(Ljava/lang/String;Ljava/lang/String;)Z",
17356fdd0c6274c81b337ad35b70480f881daf7354c3Danica Chang              (void *)connectPanDeviceNative},
17366fdd0c6274c81b337ad35b70480f881daf7354c3Danica Chang    {"disconnectPanDeviceNative", "(Ljava/lang/String;)Z", (void *)disconnectPanDeviceNative},
1737a44a1e77ef435942b2ff60e9e60d3a64b43d775bJaikumar Ganesh    {"disconnectPanServerDeviceNative", "(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Z",
1738a44a1e77ef435942b2ff60e9e60d3a64b43d775bJaikumar Ganesh              (void *)disconnectPanServerDeviceNative},
17392ea1e85dcb57d17f5782dbafa1d25eb51c630e4bJaikumar Ganesh    // Health function
17402ea1e85dcb57d17f5782dbafa1d25eb51c630e4bJaikumar Ganesh    {"registerHealthApplicationNative",
17412ea1e85dcb57d17f5782dbafa1d25eb51c630e4bJaikumar Ganesh              "(ILjava/lang/String;Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;",
17422ea1e85dcb57d17f5782dbafa1d25eb51c630e4bJaikumar Ganesh              (void *)registerHealthApplicationNative},
17432ea1e85dcb57d17f5782dbafa1d25eb51c630e4bJaikumar Ganesh    {"registerHealthApplicationNative",
17442ea1e85dcb57d17f5782dbafa1d25eb51c630e4bJaikumar Ganesh            "(ILjava/lang/String;Ljava/lang/String;)Ljava/lang/String;",
17452ea1e85dcb57d17f5782dbafa1d25eb51c630e4bJaikumar Ganesh            (void *)registerSinkHealthApplicationNative},
17462ea1e85dcb57d17f5782dbafa1d25eb51c630e4bJaikumar Ganesh
17472ea1e85dcb57d17f5782dbafa1d25eb51c630e4bJaikumar Ganesh    {"unregisterHealthApplicationNative", "(Ljava/lang/String;)Z",
17482ea1e85dcb57d17f5782dbafa1d25eb51c630e4bJaikumar Ganesh              (void *)unregisterHealthApplicationNative},
1749b5d2d4526cd2c0117b7a33b1297ac683c37ac5c7Jaikumar Ganesh    {"createChannelNative", "(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;I)Z",
17502ea1e85dcb57d17f5782dbafa1d25eb51c630e4bJaikumar Ganesh              (void *)createChannelNative},
1751b5d2d4526cd2c0117b7a33b1297ac683c37ac5c7Jaikumar Ganesh    {"destroyChannelNative", "(Ljava/lang/String;Ljava/lang/String;I)Z",
1752b5d2d4526cd2c0117b7a33b1297ac683c37ac5c7Jaikumar Ganesh              (void *)destroyChannelNative},
17532ea1e85dcb57d17f5782dbafa1d25eb51c630e4bJaikumar Ganesh    {"getMainChannelNative", "(Ljava/lang/String;)Ljava/lang/String;", (void *)getMainChannelNative},
17542ea1e85dcb57d17f5782dbafa1d25eb51c630e4bJaikumar Ganesh    {"getChannelApplicationNative", "(Ljava/lang/String;)Ljava/lang/String;",
17552ea1e85dcb57d17f5782dbafa1d25eb51c630e4bJaikumar Ganesh              (void *)getChannelApplicationNative},
17562ea1e85dcb57d17f5782dbafa1d25eb51c630e4bJaikumar Ganesh    {"getChannelFdNative", "(Ljava/lang/String;)Landroid/os/ParcelFileDescriptor;", (void *)getChannelFdNative},
17572ea1e85dcb57d17f5782dbafa1d25eb51c630e4bJaikumar Ganesh    {"releaseChannelFdNative", "(Ljava/lang/String;)Z", (void *)releaseChannelFdNative},
17589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project};
17599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
17606fdd0c6274c81b337ad35b70480f881daf7354c3Danica Chang
1761bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pellyint register_android_server_BluetoothService(JNIEnv *env) {
17629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return AndroidRuntime::registerNativeMethods(env,
1763bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pelly                "android/server/BluetoothService", sMethods, NELEM(sMethods));
17649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
17659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
17669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} /* namespace android */
1767