static BOOL android_process_event(ANDROID_EVENT_QUEUE* queue, freerdp* inst) { ANDROID_EVENT* event; rdpContext* context = inst->context; androidContext* afc = (androidContext*) context; while (android_peek_event(queue)) { event = android_pop_event(queue); if (event->type == EVENT_TYPE_KEY) { ANDROID_EVENT_KEY* key_event = (ANDROID_EVENT_KEY*) event; inst->input->KeyboardEvent(inst->input, key_event->flags, key_event->scancode); android_event_free((ANDROID_EVENT*)key_event); } else if (event->type == EVENT_TYPE_KEY_UNICODE) { ANDROID_EVENT_KEY* key_event = (ANDROID_EVENT_KEY*) event; inst->input->UnicodeKeyboardEvent(inst->input, key_event->flags, key_event->scancode); android_event_free((ANDROID_EVENT*)key_event); } else if (event->type == EVENT_TYPE_CURSOR) { ANDROID_EVENT_CURSOR* cursor_event = (ANDROID_EVENT_CURSOR*) event; inst->input->MouseEvent(inst->input, cursor_event->flags, cursor_event->x, cursor_event->y); android_event_free((ANDROID_EVENT*)cursor_event); } else if (event->type == EVENT_TYPE_CLIPBOARD) { UINT32 size; UINT32 formatId; ANDROID_EVENT_CLIPBOARD* clipboard_event = (ANDROID_EVENT_CLIPBOARD*) event; formatId = ClipboardRegisterFormat(afc->clipboard, "UTF8_STRING"); size = clipboard_event->data_length; if (size) ClipboardSetData(afc->clipboard, formatId, clipboard_event->data, size); else ClipboardEmpty(afc->clipboard); android_cliprdr_send_client_format_list(afc->cliprdr); android_event_free((ANDROID_EVENT*)clipboard_event); } else if (event->type == EVENT_TYPE_DISCONNECT) { android_event_free(event); return FALSE; } } return 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; }
static 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_free(event); goto out_fail; } WLog_DBG(TAG, "send_clipboard_data: (%s)", data); ret = JNI_TRUE; out_fail: if (data) (*env)->ReleaseStringUTFChars(env, jdata, data); return ret; }
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; }