summaryrefslogtreecommitdiffstats
path: root/java/jni/direct_bt
diff options
context:
space:
mode:
authorSven Gothel <[email protected]>2020-05-28 06:16:02 +0200
committerSven Gothel <[email protected]>2020-05-28 06:16:02 +0200
commit461354b4033f6a5a5aa6004e1f0227f0242e558b (patch)
tree399f7f0aab3d6f4840066c7f97f5ca3762e1a7e6 /java/jni/direct_bt
parent941f1d84e6662984f38b3eaf3de0a5945824c990 (diff)
BasicTypes: Add getUTF8String(..) safe UTF8 decoding to string; Expose to Java in BluetoothUtils
Using Bjoern Hoehrmann's finite state machine <http://bjoern.hoehrmann.de/utf-8/decoder/dfa/> This method helps to convert unknown GATT values safely to strings, by aborting decoding at - max-length reached - EOS reached - non UTF-8 byte reached (state machine for variable length codes) FIXME: BluetoothUtils::getUTF8String(..) is a JNI call, which is only impl withon direct_bt, JNI code in DBTUtils.cxx. Need to add to dbus library.
Diffstat (limited to 'java/jni/direct_bt')
-rw-r--r--java/jni/direct_bt/CMakeLists.txt1
-rw-r--r--java/jni/direct_bt/DBTUtils.cxx57
2 files changed, 58 insertions, 0 deletions
diff --git a/java/jni/direct_bt/CMakeLists.txt b/java/jni/direct_bt/CMakeLists.txt
index 9fd40026..60eacd6c 100644
--- a/java/jni/direct_bt/CMakeLists.txt
+++ b/java/jni/direct_bt/CMakeLists.txt
@@ -33,6 +33,7 @@ set (direct_bt_JNI_SRCS
${PROJECT_SOURCE_DIR}/java/jni/direct_bt/DBTGattService.cxx
${PROJECT_SOURCE_DIR}/java/jni/direct_bt/DBTManager.cxx
${PROJECT_SOURCE_DIR}/java/jni/direct_bt/DBTObject.cxx
+ ${PROJECT_SOURCE_DIR}/java/jni/direct_bt/DBTUtils.cxx
)
set (CMAKE_SHARED_LINKER_FLAGS "-Wl,--as-needed")
diff --git a/java/jni/direct_bt/DBTUtils.cxx b/java/jni/direct_bt/DBTUtils.cxx
new file mode 100644
index 00000000..5b53dbc6
--- /dev/null
+++ b/java/jni/direct_bt/DBTUtils.cxx
@@ -0,0 +1,57 @@
+/*
+ * Author: Sven Gothel <[email protected]>
+ * Copyright (c) 2020 Gothel Software e.K.
+ * Copyright (c) 2020 ZAFENA AB
+ *
+ * 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 "org_tinyb_BluetoothUtils.h"
+
+#include <cstdint>
+#include <cinttypes>
+
+#include <time.h>
+
+#include "helper_base.hpp"
+#include "helper_dbt.hpp"
+
+jstring Java_org_tinyb_BluetoothUtils_getUTF8String(JNIEnv *env, jclass clazz, jbyteArray jbuffer, jint offset, jint size) {
+ (void)clazz;
+
+ const int buffer_size = env->GetArrayLength(jbuffer);
+ if( 0 == buffer_size ) {
+ return env->NewStringUTF("");
+ }
+ if( buffer_size < offset+size ) {
+ throw direct_bt::IllegalArgumentException("buffer.length "+std::to_string(buffer_size)+
+ " < offset "+std::to_string(offset)+
+ " + size "+std::to_string(size), E_FILE_LINE);
+ }
+
+ JNICriticalArray<uint8_t> criticalArray(env); // RAII - release
+ uint8_t * buffer_ptr = criticalArray.get(jbuffer, criticalArray.Mode::NO_UPDATE_AND_RELEASE);
+ if( NULL == buffer_ptr ) {
+ throw direct_bt::InternalError("GetPrimitiveArrayCritical(byte array) is null", E_FILE_LINE);
+ }
+ std::string sres = direct_bt::getUTF8String(buffer_ptr+offset, size);
+
+ return from_string_to_jstring(env, sres);
+}