/* * Author: Andrei Vasiliu * Copyright (c) 2016 Intel Corporation. * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the * "Software"), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ #include "tinyb/BluetoothGattCharacteristic.hpp" #include "tinyb/BluetoothGattDescriptor.hpp" #include "tinyb/BluetoothGattService.hpp" #include "tinyb/BluetoothObject.hpp" #include "tinyb_dbus_DBusGattCharacteristic.h" #include "helper_tinyb.hpp" using namespace tinyb; using namespace jau; jobject Java_tinyb_dbus_DBusGattCharacteristic_getBluetoothType(JNIEnv *env, jobject obj) { try { (void)obj; return get_bluetooth_type(env, "GATT_CHARACTERISTIC"); } catch(...) { rethrow_and_raise_java_exception(env); } return nullptr; } jobject Java_tinyb_dbus_DBusGattCharacteristic_clone(JNIEnv *env, jobject obj) { try { return generic_clone(env, obj); } catch(...) { rethrow_and_raise_java_exception(env); } return nullptr; } jbyteArray Java_tinyb_dbus_DBusGattCharacteristic_readValue(JNIEnv *env, jobject obj) { try { BluetoothGattCharacteristic *obj_gatt_char = getInstance(env, obj); std::vector array = obj_gatt_char->read_value(); unsigned int array_size = array.size(); jbyteArray result = env->NewByteArray((jsize)array_size); env->SetByteArrayRegion(result, 0, (jsize)array_size, (const jbyte *)&array[0]); return result; } catch(...) { rethrow_and_raise_java_exception(env); } return nullptr; } jboolean Java_tinyb_dbus_DBusGattCharacteristic_writeValue(JNIEnv *env, jobject obj, jbyteArray argValue) { try { if (!argValue) { throw std::invalid_argument("byte array is null"); return JNI_FALSE; } BluetoothGattCharacteristic *obj_gatt_char = getInstance(env, obj); jboolean is_copy = false; jbyte *native_array = env->GetByteArrayElements(argValue, &is_copy); jsize native_array_length = env->GetArrayLength(argValue); std::vector array(native_array, native_array + native_array_length); return obj_gatt_char->write_value(array) ? JNI_TRUE : JNI_FALSE; } catch(...) { rethrow_and_raise_java_exception(env); } return JNI_FALSE; } void Java_tinyb_dbus_DBusGattCharacteristic_enableValueNotifications(JNIEnv *env, jobject obj, jobject callback) { try { BluetoothGattCharacteristic *obj_gatt_char = getInstance(env, obj); std::shared_ptr callback_ptr(new JNIGlobalRef(callback)); obj_gatt_char->enable_value_notifications([ callback_ptr ] (std::vector &v) { jclass notification = search_class(*jni_env, **callback_ptr); jmethodID method = search_method(*jni_env, notification, "run", "(Ljava/lang/Object;)V", false); jni_env->DeleteLocalRef(notification); unsigned int size = v.size(); jbyteArray result = jni_env->NewByteArray((jsize)size); jni_env->SetByteArrayRegion(result, 0, (jsize)size, (const jbyte *)&v[0]); jni_env->CallVoidMethod(**callback_ptr, method, result); jni_env->DeleteLocalRef(result); }); } catch(...) { rethrow_and_raise_java_exception(env); } } void Java_tinyb_dbus_DBusGattCharacteristic_disableValueNotifications(JNIEnv *env, jobject obj) { try { BluetoothGattCharacteristic *obj_gatt_char = getInstance(env, obj); obj_gatt_char->disable_value_notifications(); } catch(...) { rethrow_and_raise_java_exception(env); } } jstring Java_tinyb_dbus_DBusGattCharacteristic_getUUID(JNIEnv *env, jobject obj) { try { BluetoothGattCharacteristic *obj_gatt_char = getInstance(env, obj); std::string uuid = obj_gatt_char->get_uuid(); return env->NewStringUTF((const char *)uuid.c_str()); } catch(...) { rethrow_and_raise_java_exception(env); } return nullptr; } jobject Java_tinyb_dbus_DBusGattCharacteristic_getService(JNIEnv *env, jobject obj) { try { BluetoothGattCharacteristic *obj_gatt_char = getInstance(env, obj); BluetoothGattService *obj_gatt_serv = obj_gatt_char->get_service().clone(); jclass b_gatt_serv_class = search_class(env, *obj_gatt_serv); jmethodID b_gatt_serv_ctor = search_method(env, b_gatt_serv_class, "", "(J)V", false); jobject result = env->NewObject(b_gatt_serv_class, b_gatt_serv_ctor, (jlong)obj_gatt_serv); if (result == NULL) { throw std::runtime_error("cannot create instance of class\n"); } return result; } catch(...) { rethrow_and_raise_java_exception(env); } return nullptr; } jbyteArray Java_tinyb_dbus_DBusGattCharacteristic_getValue(JNIEnv *env, jobject obj) { try { BluetoothGattCharacteristic *obj_gatt_char = getInstance(env, obj); std::vector array = obj_gatt_char->get_value(); unsigned int array_size = array.size(); jbyteArray result = env->NewByteArray((jsize)array_size); env->SetByteArrayRegion(result, 0, (jsize)array_size, (const jbyte *)&array[0]); return result; } catch(...) { rethrow_and_raise_java_exception(env); } return nullptr; } jboolean Java_tinyb_dbus_DBusGattCharacteristic_getNotifying(JNIEnv *env, jobject obj) { try { BluetoothGattCharacteristic *obj_gatt_char = getInstance(env, obj); return obj_gatt_char->get_notifying() ? JNI_TRUE : JNI_FALSE; } catch(...) { rethrow_and_raise_java_exception(env); } return JNI_FALSE; } jobjectArray Java_tinyb_dbus_DBusGattCharacteristic_getFlags(JNIEnv *env, jobject obj) { try { BluetoothGattCharacteristic *obj_gatt_char = getInstance(env, obj); std::vector flags = obj_gatt_char->get_flags(); unsigned int flags_size = flags.size(); jclass string_class = search_class(env, "Ljava/lang/String;"); jobjectArray result = env->NewObjectArray(flags_size, string_class, 0); for (unsigned int i = 0; i < flags_size; ++i) { std::string str_elem = flags.at(i); jobject elem = env->NewStringUTF((const char *)str_elem.c_str()); env->SetObjectArrayElement(result, i, elem); } return result; } catch(...) { rethrow_and_raise_java_exception(env); } return nullptr; } jobject Java_tinyb_dbus_DBusGattCharacteristic_getDescriptors(JNIEnv *env, jobject obj) { try { BluetoothGattCharacteristic *obj_gatt_char = getInstance(env, obj); std::vector> array = obj_gatt_char->get_descriptors(); jobject result = convert_vector_uniqueptr_to_jarraylist>, BluetoothGattDescriptor>( env, array, "(J)V"); return result; } catch(...) { rethrow_and_raise_java_exception(env); } return nullptr; } void Java_tinyb_dbus_DBusGattCharacteristic_delete(JNIEnv *env, jobject obj) { try { BluetoothGattCharacteristic *obj_gatt_char = getInstance(env, obj); delete obj_gatt_char; } catch(...) { rethrow_and_raise_java_exception(env); } }