summaryrefslogtreecommitdiff
path: root/protocols/Telegram/tdlib/td/example/java/td_jni.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'protocols/Telegram/tdlib/td/example/java/td_jni.cpp')
-rw-r--r--protocols/Telegram/tdlib/td/example/java/td_jni.cpp182
1 files changed, 0 insertions, 182 deletions
diff --git a/protocols/Telegram/tdlib/td/example/java/td_jni.cpp b/protocols/Telegram/tdlib/td/example/java/td_jni.cpp
deleted file mode 100644
index 15c60a9545..0000000000
--- a/protocols/Telegram/tdlib/td/example/java/td_jni.cpp
+++ /dev/null
@@ -1,182 +0,0 @@
-//
-// Copyright Aliaksei Levin (levlam@telegram.org), Arseny Smirnov (arseny30@gmail.com) 2014-2022
-//
-// Distributed under the Boost Software License, Version 1.0. (See accompanying
-// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
-//
-#include <td/telegram/Client.h>
-#include <td/telegram/td_api.h>
-
-#include <td/tl/tl_jni_object.h>
-
-#include <cstdint>
-#include <cstdlib>
-#include <string>
-#include <utility>
-
-namespace td_jni {
-
-static td::td_api::object_ptr<td::td_api::Function> fetch_function(JNIEnv *env, jobject function) {
- td::jni::reset_parse_error();
- auto result = td::td_api::Function::fetch(env, function);
- if (td::jni::have_parse_error()) {
- std::abort();
- }
- return result;
-}
-
-static td::ClientManager *get_manager() {
- return td::ClientManager::get_manager_singleton();
-}
-
-static jint Client_createNativeClient(JNIEnv *env, jclass clazz) {
- return static_cast<jint>(get_manager()->create_client_id());
-}
-
-static void Client_nativeClientSend(JNIEnv *env, jclass clazz, jint client_id, jlong id, jobject function) {
- get_manager()->send(static_cast<std::int32_t>(client_id), static_cast<std::uint64_t>(id),
- fetch_function(env, function));
-}
-
-static jint Client_nativeClientReceive(JNIEnv *env, jclass clazz, jintArray client_ids, jlongArray ids,
- jobjectArray events, jdouble timeout) {
- jsize events_size = env->GetArrayLength(ids); // client_ids, ids and events must be of equal size
- if (events_size == 0) {
- return 0;
- }
- jsize result_size = 0;
-
- auto *manager = get_manager();
- auto response = manager->receive(timeout);
- while (response.object) {
- auto client_id = static_cast<jint>(response.client_id);
- env->SetIntArrayRegion(client_ids, result_size, 1, &client_id);
-
- auto request_id = static_cast<jlong>(response.request_id);
- env->SetLongArrayRegion(ids, result_size, 1, &request_id);
-
- jobject object;
- response.object->store(env, object);
- env->SetObjectArrayElement(events, result_size, object);
- env->DeleteLocalRef(object);
-
- result_size++;
- if (result_size == events_size) {
- break;
- }
-
- response = manager->receive(0);
- }
- return result_size;
-}
-
-static jobject Client_nativeClientExecute(JNIEnv *env, jclass clazz, jobject function) {
- jobject result;
- td::ClientManager::execute(fetch_function(env, function))->store(env, result);
- return result;
-}
-
-static jstring Object_toString(JNIEnv *env, jobject object) {
- return td::jni::to_jstring(env, to_string(td::td_api::Object::fetch(env, object)));
-}
-
-static jstring Function_toString(JNIEnv *env, jobject object) {
- return td::jni::to_jstring(env, to_string(td::td_api::Function::fetch(env, object)));
-}
-
-static constexpr jint JAVA_VERSION = JNI_VERSION_1_6;
-static JavaVM *java_vm;
-static jobject log_message_handler;
-
-static void on_log_message(int verbosity_level, const char *log_message) {
- auto env = td::jni::get_jni_env(java_vm, JAVA_VERSION);
- if (env == nullptr) {
- return;
- }
-
- jobject handler = env->NewLocalRef(log_message_handler);
- if (!handler) {
- return;
- }
-
- jclass handler_class = env->GetObjectClass(handler);
- if (handler_class) {
- jmethodID on_log_message_method = env->GetMethodID(handler_class, "onLogMessage", "(ILjava/lang/String;)V");
- if (on_log_message_method) {
- jstring log_message_str = td::jni::to_jstring(env.get(), log_message);
- if (log_message_str) {
- env->CallVoidMethod(handler, on_log_message_method, static_cast<jint>(verbosity_level), log_message_str);
- env->DeleteLocalRef((jobject)log_message_str);
- }
- }
- env->DeleteLocalRef((jobject)handler_class);
- }
-
- env->DeleteLocalRef(handler);
-}
-
-static void Client_nativeClientSetLogMessageHandler(JNIEnv *env, jclass clazz, jint max_verbosity_level,
- jobject new_log_message_handler) {
- if (log_message_handler) {
- td::ClientManager::set_log_message_callback(0, nullptr);
- jobject old_log_message_handler = log_message_handler;
- log_message_handler = jobject();
- env->DeleteGlobalRef(old_log_message_handler);
- }
-
- if (new_log_message_handler) {
- log_message_handler = env->NewGlobalRef(new_log_message_handler);
- if (!log_message_handler) {
- // out of memory
- return;
- }
-
- td::ClientManager::set_log_message_callback(static_cast<int>(max_verbosity_level), on_log_message);
- }
-}
-
-static jint register_native(JavaVM *vm) {
- JNIEnv *env;
- if (vm->GetEnv(reinterpret_cast<void **>(&env), JAVA_VERSION) != JNI_OK) {
- return -1;
- }
-
- java_vm = vm;
-
- auto register_method = [env](jclass clazz, std::string name, std::string signature, auto function_ptr) {
- td::jni::register_native_method(env, clazz, std::move(name), std::move(signature),
- reinterpret_cast<void *>(function_ptr));
- };
-
- auto client_class = td::jni::get_jclass(env, PACKAGE_NAME "/Client");
- auto object_class = td::jni::get_jclass(env, PACKAGE_NAME "/TdApi$Object");
- auto function_class = td::jni::get_jclass(env, PACKAGE_NAME "/TdApi$Function");
-
-#define TD_OBJECT "L" PACKAGE_NAME "/TdApi$Object;"
-#define TD_FUNCTION "L" PACKAGE_NAME "/TdApi$Function;"
- register_method(client_class, "createNativeClient", "()I", Client_createNativeClient);
- register_method(client_class, "nativeClientSend", "(IJ" TD_FUNCTION ")V", Client_nativeClientSend);
- register_method(client_class, "nativeClientReceive", "([I[J[" TD_OBJECT "D)I", Client_nativeClientReceive);
- register_method(client_class, "nativeClientExecute", "(" TD_FUNCTION ")" TD_OBJECT, Client_nativeClientExecute);
- register_method(client_class, "nativeClientSetLogMessageHandler", "(IL" PACKAGE_NAME "/Client$LogMessageHandler;)V",
- Client_nativeClientSetLogMessageHandler);
-
- register_method(object_class, "toString", "()Ljava/lang/String;", Object_toString);
-
- register_method(function_class, "toString", "()Ljava/lang/String;", Function_toString);
-#undef TD_FUNCTION
-#undef TD_OBJECT
-
- td::jni::init_vars(env, PACKAGE_NAME);
- td::td_api::Object::init_jni_vars(env, PACKAGE_NAME);
- td::td_api::Function::init_jni_vars(env, PACKAGE_NAME);
-
- return JAVA_VERSION;
-}
-
-} // namespace td_jni
-
-JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM *vm, void *reserved) {
- static jint jni_version = td_jni::register_native(vm); // call_once
- return jni_version;
-}