static jint addRfcommServiceRecordNative(JNIEnv *env, jobject object, jstring name, jlong uuidMsb, jlong uuidLsb, jshort channel) { LOGV(__FUNCTION__); #ifdef HAVE_BLUETOOTH native_data_t *nat = get_native_data(env, object); if (nat) { const char *c_name = env->GetStringUTFChars(name, NULL); LOGV("... name = %s", c_name); LOGV("... uuid1 = %llX", uuidMsb); LOGV("... uuid2 = %llX", uuidLsb); LOGV("... channel = %d", channel); DBusMessage *reply = dbus_func_args(env, nat->conn, get_adapter_path(env, object), DBUS_ADAPTER_IFACE, "AddRfcommServiceRecord", DBUS_TYPE_STRING, &c_name, DBUS_TYPE_UINT64, &uuidMsb, DBUS_TYPE_UINT64, &uuidLsb, DBUS_TYPE_UINT16, &channel, DBUS_TYPE_INVALID); env->ReleaseStringUTFChars(name, c_name); return reply ? dbus_returns_uint32(env, reply) : -1; } #endif return -1; }
static jint getDeviceServiceChannelNative(JNIEnv *env, jobject object, jstring path, jstring pattern, jint attr_id) { #ifdef HAVE_BLUETOOTH LOGV(__FUNCTION__); native_data_t *nat = get_native_data(env, object); jobject eventLoop = env->GetObjectField(object, field_mEventLoop); struct event_loop_native_data_t *eventLoopNat = get_EventLoop_native_data(env, eventLoop); if (nat && eventLoopNat) { const char *c_pattern = env->GetStringUTFChars(pattern, NULL); const char *c_path = env->GetStringUTFChars(path, NULL); LOGV("... pattern = %s", c_pattern); LOGV("... attr_id = %#X", attr_id); DBusMessage *reply = dbus_func_args(env, nat->conn, c_path, DBUS_DEVICE_IFACE, "GetServiceAttributeValue", DBUS_TYPE_STRING, &c_pattern, DBUS_TYPE_UINT16, &attr_id, DBUS_TYPE_INVALID); env->ReleaseStringUTFChars(pattern, c_pattern); env->ReleaseStringUTFChars(path, c_path); return reply ? dbus_returns_int32(env, reply) : -1; } #endif return -1; }
static jobjectArray listHeadsetsNative(JNIEnv *env, jobject object) { #ifdef HAVE_BLUETOOTH LOGV(__FUNCTION__); if (nat) { DBusMessage *reply = dbus_func_args(env, nat->conn, "/org/bluez/audio", "org.bluez.audio.Manager", "ListHeadsets", DBUS_TYPE_INVALID); return reply ? dbus_returns_array_of_strings(env, reply) : NULL; } #endif return NULL; }
static jboolean isSinkConnectedNative(JNIEnv *env, jobject object, jstring path) { #ifdef HAVE_BLUETOOTH LOGV(__FUNCTION__); if (nat) { const char *c_path = env->GetStringUTFChars(path, NULL); DBusMessage *reply = dbus_func_args(env, nat->conn, c_path, "org.bluez.audio.Sink", "IsConnected", DBUS_TYPE_INVALID); env->ReleaseStringUTFChars(path, c_path); return reply ? dbus_returns_boolean(env, reply) : JNI_FALSE; } #endif return JNI_FALSE; }
static jstring getAddressNative(JNIEnv *env, jobject object, jstring path) { #ifdef HAVE_BLUETOOTH LOGV(__FUNCTION__); if (nat) { const char *c_path = env->GetStringUTFChars(path, NULL); DBusMessage *reply = dbus_func_args(env, nat->conn, c_path, "org.bluez.audio.Device", "GetAddress", DBUS_TYPE_INVALID); env->ReleaseStringUTFChars(path, c_path); return reply ? dbus_returns_string(env, reply) : NULL; } #endif return NULL; }
/* private static native void removeServiceRecordNative(int handle); */ static void removeServiceRecordNative(JNIEnv *env, jobject object, jint handle) { LOGV(__FUNCTION__); #ifdef HAVE_BLUETOOTH if (conn != NULL) { DBusMessage *reply = dbus_func_args(env, conn, BLUEZ_DBUS_BASE_PATH, DBUS_CLASS_NAME, "RemoveServiceRecord", DBUS_TYPE_UINT32, &handle, DBUS_TYPE_INVALID); } #endif }
static jstring removeHeadsetNative(JNIEnv *env, jobject object, jstring path) { #ifdef HAVE_BLUETOOTH LOGV(__FUNCTION__); if (nat) { const char *c_path = env->GetStringUTFChars(path, NULL); DBusMessage *reply = dbus_func_args(env, nat->conn, "/org/bluez/audio", "org.bluez.audio.Manager", "RemoveHeadset", DBUS_TYPE_STRING, &c_path, DBUS_TYPE_INVALID); env->ReleaseStringUTFChars(path, c_path); return reply ? dbus_returns_string(env, reply) : NULL; } #endif return NULL; }
static jboolean removeServiceRecordNative(JNIEnv *env, jobject object, jint handle) { LOGV(__FUNCTION__); #ifdef HAVE_BLUETOOTH native_data_t *nat = get_native_data(env, object); if (nat) { LOGV("... handle = %X", handle); DBusMessage *reply = dbus_func_args(env, nat->conn, get_adapter_path(env, object), DBUS_ADAPTER_IFACE, "RemoveServiceRecord", DBUS_TYPE_UINT32, &handle, DBUS_TYPE_INVALID); return reply ? JNI_TRUE : JNI_FALSE; } #endif return JNI_FALSE; }
static jint addServiceRecordFromXmlNative(JNIEnv *env, jobject object, jstring record) { LOGV(__FUNCTION__); #ifdef HAVE_BLUETOOTH if (conn != NULL) { const char *c_record = env->GetStringUTFChars(record, NULL); DBusMessage *reply = dbus_func_args(env, conn, BLUEZ_DBUS_BASE_PATH, DBUS_CLASS_NAME, "AddServiceRecordFromXML", DBUS_TYPE_STRING, &c_record, DBUS_TYPE_INVALID); env->ReleaseStringUTFChars(record, c_record); return reply ? dbus_returns_uint32(env, reply) : -1; } #endif return -1; }
static void updateServiceRecordFromXmlNative(JNIEnv *env, jobject object, jint handle, jstring record) { LOGV(__FUNCTION__); #ifdef HAVE_BLUETOOTH if (conn != NULL) { const char *c_record = env->GetStringUTFChars(record, NULL); DBusMessage *reply = dbus_func_args(env, conn, BLUEZ_DBUS_BASE_PATH, DBUS_CLASS_NAME, "UpdateServiceRecordFromXML", DBUS_TYPE_UINT32, &handle, DBUS_TYPE_STRING, &c_record, DBUS_TYPE_INVALID); env->ReleaseStringUTFChars(record, c_record); } #endif }
static jboolean setLinkTimeoutNative(JNIEnv *env, jobject object, jstring object_path, jint num_slots) { LOGV(__FUNCTION__); #ifdef HAVE_BLUETOOTH native_data_t *nat = get_native_data(env, object); if (nat) { const char *c_object_path = env->GetStringUTFChars(object_path, NULL); DBusMessage *reply = dbus_func_args(env, nat->conn, get_adapter_path(env, object), DBUS_ADAPTER_IFACE, "SetLinkTimeout", DBUS_TYPE_OBJECT_PATH, &c_object_path, DBUS_TYPE_UINT32, &num_slots, DBUS_TYPE_INVALID); env->ReleaseStringUTFChars(object_path, c_object_path); return reply ? JNI_TRUE : JNI_FALSE; } #endif return JNI_FALSE; }
static jint addServiceRecordNative(JNIEnv *env, jobject object, jbyteArray record) { LOGV(__FUNCTION__); #ifdef HAVE_BLUETOOTH if (conn != NULL) { jbyte* c_record = env->GetByteArrayElements(record, NULL); DBusMessage *reply = dbus_func_args(env, conn, BLUEZ_DBUS_BASE_PATH, DBUS_CLASS_NAME, "AddServiceRecord", DBUS_TYPE_ARRAY, DBUS_TYPE_BYTE, &c_record, env->GetArrayLength(record), DBUS_TYPE_INVALID); env->ReleaseByteArrayElements(record, c_record, JNI_ABORT); return reply ? dbus_returns_uint32(env, reply) : -1; } #endif return -1; }
static void updateServiceRecordNative(JNIEnv *env, jobject object, jint handle, jbyteArray record) { LOGV(__FUNCTION__); #ifdef HAVE_BLUETOOTH if (conn != NULL) { jbyte* c_record = env->GetByteArrayElements(record, NULL); DBusMessage *reply = dbus_func_args(env, conn, BLUEZ_DBUS_BASE_PATH, DBUS_CLASS_NAME, "UpdateServiceRecord", DBUS_TYPE_UINT32, &handle, DBUS_TYPE_ARRAY, DBUS_TYPE_BYTE, &c_record, env->GetArrayLength(record), DBUS_TYPE_INVALID); env->ReleaseByteArrayElements(record, c_record, JNI_ABORT); } #endif }
static jbyteArray readAdapterOutOfBandDataNative(JNIEnv *env, jobject object) { LOGV(__FUNCTION__); #ifdef HAVE_BLUETOOTH native_data_t *nat = get_native_data(env, object); DBusError err; jbyte *hash, *randomizer; jbyteArray byteArray = NULL; int hash_len, r_len; if (nat) { DBusMessage *reply = dbus_func_args(env, nat->conn, get_adapter_path(env, object), DBUS_ADAPTER_IFACE, "ReadLocalOutOfBandData", DBUS_TYPE_INVALID); if (!reply) return NULL; dbus_error_init(&err); if (dbus_message_get_args(reply, &err, DBUS_TYPE_ARRAY, DBUS_TYPE_BYTE, &hash, &hash_len, DBUS_TYPE_ARRAY, DBUS_TYPE_BYTE, &randomizer, &r_len, DBUS_TYPE_INVALID)) { if (hash_len == 16 && r_len == 16) { byteArray = env->NewByteArray(32); if (byteArray) { env->SetByteArrayRegion(byteArray, 0, 16, hash); env->SetByteArrayRegion(byteArray, 16, 16, randomizer); } } else { LOGE("readAdapterOutOfBandDataNative: Hash len = %d, R len = %d", hash_len, r_len); } } else { LOG_AND_FREE_DBUS_ERROR(&err); } dbus_message_unref(reply); return byteArray; } #endif return NULL; }