/** * Function description * * @return 0 on success, otherwise a Win32 error code */ UINT android_cliprdr_server_format_data_response(CliprdrClientContext* cliprdr, CLIPRDR_FORMAT_DATA_RESPONSE* formatDataResponse) { BYTE* data; UINT32 size; UINT32 index; UINT32 formatId; CLIPRDR_FORMAT* format = NULL; androidContext* afc = (androidContext*) cliprdr->custom; freerdp* instance = ((rdpContext*) afc)->instance; for (index = 0; index < afc->numServerFormats; index++) { if (afc->requestedFormatId == afc->serverFormats[index].formatId) format = &(afc->serverFormats[index]); } if (!format) { SetEvent(afc->clipboardRequestEvent); return ERROR_INTERNAL_ERROR; } if (format->formatName) formatId = ClipboardRegisterFormat(afc->clipboard, format->formatName); else formatId = format->formatId; size = formatDataResponse->dataLen; data = (BYTE*) malloc(size); CopyMemory(data, formatDataResponse->requestedFormatData, size); ClipboardSetData(afc->clipboard, formatId, data, size); SetEvent(afc->clipboardRequestEvent); if ((formatId == CF_TEXT) || (formatId == CF_UNICODETEXT)) { JNIEnv* env; jstring jdata; jboolean attached; formatId = ClipboardRegisterFormat(afc->clipboard, "UTF8_STRING"); data = (void*) ClipboardGetData(afc->clipboard, formatId, &size); attached = jni_attach_thread(&env); jdata = jniNewStringUTF(env, data, size); freerdp_callback("OnRemoteClipboardChanged", "(ILjava/lang/String;)V", instance, jdata); (*env)->DeleteLocalRef(env, jdata); if (attached == JNI_TRUE) { jni_detach_thread(); } } return CHANNEL_RC_OK; }
static void android_cliprdr_process_cb_data_response_event(clipboardContext* cb, RDP_CB_DATA_RESPONSE_EVENT* event) { DEBUG_ANDROID("size=%d", event->size); if (event->size > 0) { if (cb->data) { free(cb->data); cb->data = NULL; cb->data_length = 0; } switch (cb->data_format) { case CB_FORMAT_RAW: case CB_FORMAT_PNG: case CB_FORMAT_JPEG: case CB_FORMAT_GIF: case CB_FORMAT_DIB: default: DEBUG_ANDROID("unsupported format\n"); break; case CB_FORMAT_TEXT: android_cliprdr_process_text(cb, event->data, event->size - 1); break; case CB_FORMAT_UNICODETEXT: android_cliprdr_process_unicodetext(cb, event->data, event->size - 2); break; case CB_FORMAT_HTML: android_cliprdr_process_html(cb, event->data, event->size); break; } DEBUG_ANDROID("computer_clipboard_data %s ", (char*)cb->data); if (cb->data) { //CALLBACK JNIEnv* env; jboolean attached = jni_attach_thread(&env); jstring jdata = jniNewStringUTF(env, cb->data, cb->data_length); freerdp_callback("OnRemoteClipboardChanged", "(ILjava/lang/String;)V", cb->instance, jdata); (*env)->DeleteLocalRef(env, jdata); if(attached == JNI_TRUE) { jni_detach_thread(); } } } }