Пример #1
0
/**
 * 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;
}
Пример #2
0
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();
			}
		}
	}
}