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