JNIEXPORT jboolean JNICALL jni_freerdp_disconnect(JNIEnv *env, jclass cls, jint instance) { freerdp* inst = (freerdp*)instance; androidContext* ctx = (androidContext*)inst->context; ANDROID_EVENT* event = (ANDROID_EVENT*)android_event_disconnect_new(); if (!event) return JNI_FALSE; DEBUG_ANDROID("DISCONNECT!"); assert(inst); assert(ctx); assert(event); if (!android_push_event(inst, event)) { android_event_disconnect_free(event); return JNI_FALSE; } WaitForSingleObject(ctx->thread, INFINITE); CloseHandle(ctx->thread); ctx->thread = NULL; freerdp_callback("OnDisconnecting", "(I)V", instance); return (jboolean) JNI_TRUE; }
static jboolean JNICALL jni_freerdp_disconnect(JNIEnv* env, jclass cls, jint instance) { freerdp* inst = (freerdp*)instance; androidContext* ctx; ANDROID_EVENT* event; if (!inst || !inst->context || !cls || !env) { WLog_FATAL(TAG, "%s(env=%p, cls=%p, instance=%d", __FUNCTION__, env, cls, instance); return JNI_FALSE; } ctx = (androidContext*)inst->context; event = (ANDROID_EVENT*)android_event_disconnect_new(); if (!event) return JNI_FALSE; if (!android_push_event(inst, event)) { android_event_free((ANDROID_EVENT*)event); return JNI_FALSE; } if (!freerdp_abort_connect(inst)) return JNI_FALSE; return JNI_TRUE; }
JNIEXPORT jboolean JNICALL jni_freerdp_send_clipboard_data(JNIEnv *env, jclass cls, jint instance, jstring jdata) { ANDROID_EVENT* event; freerdp* inst = (freerdp*)instance; const jbyte *data = jdata != NULL ? (*env)->GetStringUTFChars(env, jdata, NULL) : NULL; int data_length = data ? strlen(data) : 0; jboolean ret = JNI_FALSE;; event = (ANDROID_EVENT*) android_event_clipboard_new((void*)data, data_length); if (!event) goto out_fail; if (!android_push_event(inst, event)) { android_event_clipboard_free((ANDROID_EVENT_CLIPBOARD *)event); goto out_fail; } DEBUG_ANDROID("send_clipboard_data: (%s)", data); ret = JNI_TRUE; out_fail: if (data) (*env)->ReleaseStringUTFChars(env, jdata, data); return ret; }
JNIEXPORT void JNICALL jni_freerdp_cancel_connection(JNIEnv *env, jclass cls, jint instance) { DEBUG_ANDROID("Cancelling connection ..."); freerdp* inst = (freerdp*)instance; ANDROID_EVENT* event = (ANDROID_EVENT*)android_event_disconnect_new(); android_push_event(inst, event); freerdp_callback("OnDisconnecting", "(I)V", instance); }
JNIEXPORT jboolean JNICALL jni_freerdp_disconnect(JNIEnv *env, jclass cls, jint instance) { freerdp* inst = (freerdp*)instance; ANDROID_EVENT* event = (ANDROID_EVENT*)android_event_disconnect_new(); android_push_event(inst, event); freerdp_callback("OnDisconnecting", "(I)V", instance); return (jboolean) JNI_TRUE; }
JNIEXPORT void JNICALL jni_freerdp_send_cursor_event( JNIEnv *env, jclass cls, jint instance, jint x, jint y, jint flags) { ANDROID_EVENT* event; freerdp* inst = (freerdp*)instance; event = (ANDROID_EVENT*) android_event_cursor_new(flags, x, y); android_push_event(inst, event); DEBUG_ANDROID("send_cursor_event: (%d, %d), %d", x, y, flags); }
JNIEXPORT void JNICALL jni_freerdp_send_unicodekey_event( JNIEnv *env, jclass cls, jint instance, jint keycode) { ANDROID_EVENT* event; freerdp* inst = (freerdp*)instance; event = (ANDROID_EVENT*) android_event_unicodekey_new(keycode); android_push_event(inst, event); DEBUG_ANDROID("send_unicodekey_event: %d", keycode); }
JNIEXPORT void JNICALL jni_freerdp_send_clipboard_data(JNIEnv *env, jclass cls, jint instance, jstring jdata) { ANDROID_EVENT* event; freerdp* inst = (freerdp*)instance; const jbyte *data = jdata != NULL ? (*env)->GetStringUTFChars(env, jdata, NULL) : NULL; int data_length = data ? strlen(data) : 0; event = (ANDROID_EVENT*) android_event_clipboard_new((void*)data, data_length); android_push_event(inst, event); DEBUG_ANDROID("send_clipboard_data: (%s)", data); if (data) (*env)->ReleaseStringUTFChars(env, jdata, data); }
JNIEXPORT void JNICALL jni_freerdp_send_key_event( JNIEnv *env, jclass cls, jint instance, jint keycode, jboolean down) { DWORD scancode; ANDROID_EVENT* event; freerdp* inst = (freerdp*)instance; scancode = GetVirtualScanCodeFromVirtualKeyCode(keycode, 4); int flags = (down == JNI_TRUE) ? KBD_FLAGS_DOWN : KBD_FLAGS_RELEASE; flags |= (scancode & KBDEXT) ? KBD_FLAGS_EXTENDED : 0; event = (ANDROID_EVENT*) android_event_key_new(flags, scancode & 0xFF); android_push_event(inst, event); DEBUG_ANDROID("send_key_event: %d, %d", (int)scancode, flags); }
JNIEXPORT jboolean JNICALL jni_freerdp_send_unicodekey_event( JNIEnv *env, jclass cls, jint instance, jint keycode) { ANDROID_EVENT* event; freerdp* inst = (freerdp*)instance; event = (ANDROID_EVENT*) android_event_unicodekey_new(keycode); if (!event) return JNI_FALSE; if (!android_push_event(inst, event)) { android_event_unicodekey_free((ANDROID_EVENT_KEY *)event); return JNI_FALSE; } DEBUG_ANDROID("send_unicodekey_event: %d", keycode); return JNI_TRUE; }
JNIEXPORT jboolean JNICALL jni_freerdp_send_cursor_event( JNIEnv *env, jclass cls, jint instance, jint x, jint y, jint flags) { ANDROID_EVENT* event; freerdp* inst = (freerdp*)instance; event = (ANDROID_EVENT*) android_event_cursor_new(flags, x, y); if (!event) return JNI_FALSE; if (!android_push_event(inst, event)) { android_event_cursor_free((ANDROID_EVENT_CURSOR *)event); return JNI_FALSE; } DEBUG_ANDROID("send_cursor_event: (%d, %d), %d", x, y, flags); return JNI_TRUE; }
static jboolean JNICALL jni_freerdp_send_cursor_event( JNIEnv* env, jclass cls, jint instance, jint x, jint y, jint flags) { ANDROID_EVENT* event; freerdp* inst = (freerdp*)instance; event = (ANDROID_EVENT*) android_event_cursor_new(flags, x, y); if (!event) return JNI_FALSE; if (!android_push_event(inst, event)) { android_event_free(event); return JNI_FALSE; } WLog_DBG(TAG, "send_cursor_event: (%d, %d), %d", x, y, flags); return JNI_TRUE; }
static jboolean JNICALL jni_freerdp_send_unicodekey_event( JNIEnv* env, jclass cls, jint instance, jint keycode) { ANDROID_EVENT* event; freerdp* inst = (freerdp*)instance; event = (ANDROID_EVENT*) android_event_unicodekey_new(keycode); if (!event) return JNI_FALSE; if (!android_push_event(inst, event)) { android_event_free(event); return JNI_FALSE; } WLog_DBG(TAG, "send_unicodekey_event: %d", keycode); return JNI_TRUE; }
static jboolean JNICALL jni_freerdp_send_key_event( JNIEnv* env, jclass cls, jint instance, jint keycode, jboolean down) { DWORD scancode; ANDROID_EVENT* event; freerdp* inst = (freerdp*)instance; scancode = GetVirtualScanCodeFromVirtualKeyCode(keycode, 4); int flags = (down == JNI_TRUE) ? KBD_FLAGS_DOWN : KBD_FLAGS_RELEASE; flags |= (scancode & KBDEXT) ? KBD_FLAGS_EXTENDED : 0; event = (ANDROID_EVENT*) android_event_key_new(flags, scancode & 0xFF); if (!event) return JNI_FALSE; if (!android_push_event(inst, event)) { android_event_free(event); return JNI_FALSE; } WLog_DBG(TAG, "send_key_event: %d, %d", (int)scancode, flags); return JNI_TRUE; }