1 /* 2 ** Copyright 2006, The Android Open Source Project 3 ** 4 ** Licensed under the Apache License, Version 2.0 (the "License"); 5 ** you may not use this file except in compliance with the License. 6 ** You may obtain a copy of the License at 7 ** 8 ** http://www.apache.org/licenses/LICENSE-2.0 9 ** 10 ** Unless required by applicable law or agreed to in writing, software 11 ** distributed under the License is distributed on an "AS IS" BASIS, 12 ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 ** See the License for the specific language governing permissions and 14 ** limitations under the License. 15 */ 16 17 #ifndef ANDROID_BLUETOOTH_COMMON_H 18 #define ANDROID_BLUETOOTH_COMMON_H 19 20 // Set to 0 to enable verbose bluetooth logging 21 #define LOG_NDEBUG 1 22 23 #include "jni.h" 24 #include "utils/Log.h" 25 26 #include <errno.h> 27 #include <pthread.h> 28 #include <stdint.h> 29 #include <sys/poll.h> 30 31 #ifdef HAVE_BLUETOOTH 32 #include <dbus/dbus.h> 33 #include <bluetooth/bluetooth.h> 34 #endif 35 36 namespace android { 37 38 #ifdef HAVE_BLUETOOTH 39 #define BLUEZ_DBUS_BASE_PATH "/org/bluez" 40 #define BLUEZ_DBUS_BASE_IFC "org.bluez" 41 42 // It would be nicer to retrieve this from bluez using GetDefaultAdapter, 43 // but this is only possible when the adapter is up (and hcid is running). 44 // It is much easier just to hardcode bluetooth adapter to hci0 45 #define BLUETOOTH_ADAPTER_HCI_NUM 0 46 #define BLUEZ_ADAPTER_OBJECT_NAME BLUEZ_DBUS_BASE_PATH "/hci0" 47 48 #define BTADDR_SIZE 18 // size of BT address character array (including null) 49 50 // size of the dbus event loops pollfd structure, hopefully never to be grown 51 #define DEFAULT_INITIAL_POLLFD_COUNT 8 52 53 jfieldID get_field(JNIEnv *env, 54 jclass clazz, 55 const char *member, 56 const char *mtype); 57 58 // LOGE and free a D-Bus error 59 // Using #define so that __FUNCTION__ resolves usefully 60 #define LOG_AND_FREE_DBUS_ERROR_WITH_MSG(err, msg) \ 61 { LOGE("%s: D-Bus error in %s: %s (%s)", __FUNCTION__, \ 62 dbus_message_get_member((msg)), (err)->name, (err)->message); \ 63 dbus_error_free((err)); } 64 #define LOG_AND_FREE_DBUS_ERROR(err) \ 65 { LOGE("%s: D-Bus error: %s (%s)", __FUNCTION__, \ 66 (err)->name, (err)->message); \ 67 dbus_error_free((err)); } 68 69 struct event_loop_native_data_t { 70 DBusConnection *conn; 71 const char *adapter; 72 73 /* protects the thread */ 74 pthread_mutex_t thread_mutex; 75 pthread_t thread; 76 /* our comms socket */ 77 /* mem for the list of sockets to listen to */ 78 struct pollfd *pollData; 79 int pollMemberCount; 80 int pollDataSize; 81 /* mem for matching set of dbus watch ptrs */ 82 DBusWatch **watchData; 83 /* pair of sockets for event loop control, Reader and Writer */ 84 int controlFdR; 85 int controlFdW; 86 /* our vm and env Version for future env generation */ 87 JavaVM *vm; 88 int envVer; 89 /* reference to our java self */ 90 jobject me; 91 /* flag to indicate if the event loop thread is running */ 92 bool running; 93 }; 94 95 struct _Properties { 96 char name[32]; 97 int type; 98 }; 99 typedef struct _Properties Properties; 100 101 dbus_bool_t dbus_func_args_async(JNIEnv *env, 102 DBusConnection *conn, 103 int timeout_ms, 104 void (*reply)(DBusMessage *, void *, void *), 105 void *user, 106 void *nat, 107 const char *path, 108 const char *ifc, 109 const char *func, 110 int first_arg_type, 111 ...); 112 113 DBusMessage * dbus_func_args(JNIEnv *env, 114 DBusConnection *conn, 115 const char *path, 116 const char *ifc, 117 const char *func, 118 int first_arg_type, 119 ...); 120 121 DBusMessage * dbus_func_args_error(JNIEnv *env, 122 DBusConnection *conn, 123 DBusError *err, 124 const char *path, 125 const char *ifc, 126 const char *func, 127 int first_arg_type, 128 ...); 129 130 DBusMessage * dbus_func_args_timeout(JNIEnv *env, 131 DBusConnection *conn, 132 int timeout_ms, 133 const char *path, 134 const char *ifc, 135 const char *func, 136 int first_arg_type, 137 ...); 138 139 DBusMessage * dbus_func_args_timeout_valist(JNIEnv *env, 140 DBusConnection *conn, 141 int timeout_ms, 142 DBusError *err, 143 const char *path, 144 const char *ifc, 145 const char *func, 146 int first_arg_type, 147 va_list args); 148 149 jint dbus_returns_int32(JNIEnv *env, DBusMessage *reply); 150 jint dbus_returns_uint32(JNIEnv *env, DBusMessage *reply); 151 jstring dbus_returns_string(JNIEnv *env, DBusMessage *reply); 152 jboolean dbus_returns_boolean(JNIEnv *env, DBusMessage *reply); 153 jobjectArray dbus_returns_array_of_strings(JNIEnv *env, DBusMessage *reply); 154 jobjectArray dbus_returns_array_of_object_path(JNIEnv *env, DBusMessage *reply); 155 jbyteArray dbus_returns_array_of_bytes(JNIEnv *env, DBusMessage *reply); 156 157 jobjectArray parse_properties(JNIEnv *env, DBusMessageIter *iter, Properties *properties, 158 const int max_num_properties); 159 jobjectArray parse_property_change(JNIEnv *env, DBusMessage *msg, 160 Properties *properties, int max_num_properties); 161 jobjectArray parse_adapter_properties(JNIEnv *env, DBusMessageIter *iter); 162 jobjectArray parse_remote_device_properties(JNIEnv *env, DBusMessageIter *iter); 163 jobjectArray parse_remote_device_property_change(JNIEnv *env, DBusMessage *msg); 164 jobjectArray parse_adapter_property_change(JNIEnv *env, DBusMessage *msg); 165 void append_variant(DBusMessageIter *iter, int type, void *val); 166 int get_bdaddr(const char *str, bdaddr_t *ba); 167 void get_bdaddr_as_string(const bdaddr_t *ba, char *str); 168 169 bool debug_no_encrypt(); 170 171 #endif 172 } /* namespace android */ 173 174 #endif/*ANDROID_BLUETOOTH_COMMON_H*/ 175