220 lines
8.1 KiB
C
220 lines
8.1 KiB
C
|
/*
|
||
|
** Copyright 2006, The Android Open Source Project
|
||
|
**
|
||
|
** Licensed under the Apache License, Version 2.0 (the "License");
|
||
|
** you may not use this file except in compliance with the License.
|
||
|
** You may obtain a copy of the License at
|
||
|
**
|
||
|
** http://www.apache.org/licenses/LICENSE-2.0
|
||
|
**
|
||
|
** Unless required by applicable law or agreed to in writing, software
|
||
|
** distributed under the License is distributed on an "AS IS" BASIS,
|
||
|
** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||
|
** See the License for the specific language governing permissions and
|
||
|
** limitations under the License.
|
||
|
*/
|
||
|
|
||
|
#ifndef ANDROID_BLUETOOTH_COMMON_H
|
||
|
#define ANDROID_BLUETOOTH_COMMON_H
|
||
|
|
||
|
// Set to 0 to enable verbose bluetooth logging
|
||
|
//#define LOG_NDEBUG 1
|
||
|
|
||
|
|
||
|
//#undef NDEBUG
|
||
|
|
||
|
//#define LOG_NIDEBUG 0
|
||
|
//#define LOG_NDEBUG 0
|
||
|
//#define LOG_NDDEBUG 0
|
||
|
|
||
|
#include "jni.h"
|
||
|
#include "utils/Log.h"
|
||
|
|
||
|
#include <errno.h>
|
||
|
#include <pthread.h>
|
||
|
#include <stdint.h>
|
||
|
#include <sys/poll.h>
|
||
|
|
||
|
#ifdef HAVE_BLUETOOTH
|
||
|
#include <dbus/dbus.h>
|
||
|
#include <bluetooth/bluetooth.h>
|
||
|
#endif
|
||
|
|
||
|
namespace android {
|
||
|
|
||
|
#ifdef HAVE_BLUETOOTH
|
||
|
#define BLUEZ_DBUS_BASE_PATH "/org/bluez"
|
||
|
#define BLUEZ_DBUS_BASE_IFC "org.bluez"
|
||
|
|
||
|
// It would be nicer to retrieve this from bluez using GetDefaultAdapter,
|
||
|
// but this is only possible when the adapter is up (and hcid is running).
|
||
|
// It is much easier just to hardcode bluetooth adapter to hci0
|
||
|
#define BLUETOOTH_ADAPTER_HCI_NUM 0
|
||
|
#define BLUEZ_ADAPTER_OBJECT_NAME BLUEZ_DBUS_BASE_PATH "/hci0"
|
||
|
|
||
|
#define BTADDR_SIZE 18 // size of BT address character array (including null)
|
||
|
|
||
|
// size of the dbus event loops pollfd structure, hopefully never to be grown
|
||
|
#define DEFAULT_INITIAL_POLLFD_COUNT 8
|
||
|
|
||
|
jfieldID get_field(JNIEnv *env,
|
||
|
jclass clazz,
|
||
|
const char *member,
|
||
|
const char *mtype);
|
||
|
|
||
|
// LOGE and free a D-Bus error
|
||
|
// Using #define so that __FUNCTION__ resolves usefully
|
||
|
#define LOG_AND_FREE_DBUS_ERROR_WITH_MSG(err, msg) \
|
||
|
{ LOGE("%s: D-Bus error in %s: %s (%s)", __FUNCTION__, \
|
||
|
dbus_message_get_member((msg)), (err)->name, (err)->message); \
|
||
|
dbus_error_free((err)); }
|
||
|
#define LOG_AND_FREE_DBUS_ERROR(err) \
|
||
|
{ LOGE("%s: D-Bus error: %s (%s)", __FUNCTION__, \
|
||
|
(err)->name, (err)->message); \
|
||
|
dbus_error_free((err)); }
|
||
|
|
||
|
struct event_loop_native_data_t {
|
||
|
DBusConnection *conn;
|
||
|
const char *adapter;
|
||
|
|
||
|
/* protects the thread */
|
||
|
pthread_mutex_t thread_mutex;
|
||
|
pthread_t thread;
|
||
|
/* our comms socket */
|
||
|
/* mem for the list of sockets to listen to */
|
||
|
struct pollfd *pollData;
|
||
|
int pollMemberCount;
|
||
|
int pollDataSize;
|
||
|
/* mem for matching set of dbus watch ptrs */
|
||
|
DBusWatch **watchData;
|
||
|
/* pair of sockets for event loop control, Reader and Writer */
|
||
|
int controlFdR;
|
||
|
int controlFdW;
|
||
|
/* our vm and env Version for future env generation */
|
||
|
JavaVM *vm;
|
||
|
int envVer;
|
||
|
/* reference to our java self */
|
||
|
jobject me;
|
||
|
/* flag to indicate if the event loop thread is running */
|
||
|
bool running;
|
||
|
};
|
||
|
|
||
|
struct _Properties {
|
||
|
char name[32];
|
||
|
int type;
|
||
|
};
|
||
|
typedef struct _Properties Properties;
|
||
|
|
||
|
typedef struct {
|
||
|
void (*user_cb)(DBusMessage *, void *, void *);
|
||
|
void *user;
|
||
|
void *nat;
|
||
|
JNIEnv *env;
|
||
|
} dbus_async_call_t;
|
||
|
|
||
|
struct set_characteristic_property_t {
|
||
|
char * path;
|
||
|
char * property;
|
||
|
};
|
||
|
|
||
|
dbus_bool_t dbus_func_args_async(JNIEnv *env,
|
||
|
DBusConnection *conn,
|
||
|
int timeout_ms,
|
||
|
void (*reply)(DBusMessage *, void *, void *),
|
||
|
void *user,
|
||
|
void *nat,
|
||
|
const char *path,
|
||
|
const char *ifc,
|
||
|
const char *func,
|
||
|
int first_arg_type,
|
||
|
...);
|
||
|
|
||
|
DBusMessage * dbus_func_args(JNIEnv *env,
|
||
|
DBusConnection *conn,
|
||
|
const char *path,
|
||
|
const char *ifc,
|
||
|
const char *func,
|
||
|
int first_arg_type,
|
||
|
...);
|
||
|
|
||
|
DBusMessage * dbus_func_args_generic(JNIEnv *env,
|
||
|
DBusConnection *conn,
|
||
|
const char *service,
|
||
|
const char *path,
|
||
|
const char *ifc,
|
||
|
const char *func,
|
||
|
int first_arg_type,
|
||
|
...);
|
||
|
|
||
|
DBusMessage * dbus_func_args_error(JNIEnv *env,
|
||
|
DBusConnection *conn,
|
||
|
DBusError *err,
|
||
|
const char *path,
|
||
|
const char *ifc,
|
||
|
const char *func,
|
||
|
int first_arg_type,
|
||
|
...);
|
||
|
|
||
|
DBusMessage * dbus_func_args_timeout(JNIEnv *env,
|
||
|
DBusConnection *conn,
|
||
|
int timeout_ms,
|
||
|
const char *path,
|
||
|
const char *ifc,
|
||
|
const char *func,
|
||
|
int first_arg_type,
|
||
|
...);
|
||
|
|
||
|
DBusMessage * dbus_func_args_timeout_valist(JNIEnv *env,
|
||
|
DBusConnection *conn,
|
||
|
int timeout_ms,
|
||
|
DBusError *err,
|
||
|
const char *path,
|
||
|
const char *ifc,
|
||
|
const char *func,
|
||
|
int first_arg_type,
|
||
|
va_list args);
|
||
|
|
||
|
|
||
|
DBusMessage * dbus_func_args_generic_timeout_valist(JNIEnv *env,
|
||
|
DBusConnection *conn,
|
||
|
int timeout_ms,
|
||
|
DBusError *err,
|
||
|
const char *service,
|
||
|
const char *path,
|
||
|
const char *ifc,
|
||
|
const char *func,
|
||
|
int first_arg_type,
|
||
|
va_list args);
|
||
|
|
||
|
void dbus_func_args_async_callback(DBusPendingCall *call, void *data);
|
||
|
|
||
|
jint dbus_returns_int32(JNIEnv *env, DBusMessage *reply);
|
||
|
jint dbus_returns_uint32(JNIEnv *env, DBusMessage *reply);
|
||
|
jstring dbus_returns_string(JNIEnv *env, DBusMessage *reply);
|
||
|
jboolean dbus_returns_boolean(JNIEnv *env, DBusMessage *reply);
|
||
|
jobjectArray dbus_returns_array_of_strings(JNIEnv *env, DBusMessage *reply);
|
||
|
jobjectArray dbus_returns_array_of_object_path(JNIEnv *env, DBusMessage *reply);
|
||
|
jbyteArray dbus_returns_array_of_bytes(JNIEnv *env, DBusMessage *reply);
|
||
|
|
||
|
jobjectArray parse_properties(JNIEnv *env, DBusMessageIter *iter, Properties *properties,
|
||
|
const int max_num_properties);
|
||
|
jobjectArray parse_property_change(JNIEnv *env, DBusMessage *msg,
|
||
|
Properties *properties, int max_num_properties);
|
||
|
jobjectArray parse_adapter_properties(JNIEnv *env, DBusMessageIter *iter);
|
||
|
jobjectArray parse_remote_device_properties(JNIEnv *env, DBusMessageIter *iter);
|
||
|
jobjectArray parse_gatt_service_properties(JNIEnv *env, DBusMessageIter *iter);
|
||
|
jobjectArray parse_gatt_characteristic_properties(JNIEnv *env, DBusMessageIter *iter);
|
||
|
jobjectArray parse_remote_device_property_change(JNIEnv *env, DBusMessage *msg);
|
||
|
jobjectArray parse_adapter_property_change(JNIEnv *env, DBusMessage *msg);
|
||
|
void append_variant(DBusMessageIter *iter, int type, void *val);
|
||
|
void append_array_variant(DBusMessageIter *iter, int type, void *val, int n_elements);
|
||
|
int get_bdaddr(const char *str, bdaddr_t *ba);
|
||
|
void get_bdaddr_as_string(const bdaddr_t *ba, char *str);
|
||
|
|
||
|
bool debug_no_encrypt();
|
||
|
|
||
|
#endif
|
||
|
} /* namespace android */
|
||
|
|
||
|
#endif/*ANDROID_BLUETOOTH_COMMON_H*/
|