Blame client/Android/Studio/freeRDPCore/src/main/java/com/freerdp/freerdpcore/services/LibFreeRDP.java

Packit Service fa4841
/*
Packit Service fa4841
   Android FreeRDP JNI Wrapper
Packit Service fa4841
Packit Service fa4841
   Copyright 2013 Thincast Technologies GmbH, Author: Martin Fleisz
Packit Service fa4841
Packit Service fa4841
   This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0.
Packit Service fa4841
   If a copy of the MPL was not distributed with this file, You can obtain one at
Packit Service fa4841
   http://mozilla.org/MPL/2.0/.
Packit Service fa4841
*/
Packit Service fa4841
Packit Service fa4841
package com.freerdp.freerdpcore.services;
Packit Service fa4841
Packit Service fa4841
import android.content.Context;
Packit Service fa4841
import android.graphics.Bitmap;
Packit Service fa4841
import android.net.Uri;
Packit Service fa4841
import android.support.v4.util.LongSparseArray;
Packit Service fa4841
import android.util.Log;
Packit Service fa4841
Packit Service fa4841
import com.freerdp.freerdpcore.application.GlobalApp;
Packit Service fa4841
import com.freerdp.freerdpcore.application.SessionState;
Packit Service fa4841
import com.freerdp.freerdpcore.domain.BookmarkBase;
Packit Service fa4841
import com.freerdp.freerdpcore.domain.ManualBookmark;
Packit Service fa4841
import com.freerdp.freerdpcore.presentation.ApplicationSettingsActivity;
Packit Service fa4841
Packit Service fa4841
import java.util.ArrayList;
Packit Service fa4841
Packit Service fa4841
public class LibFreeRDP
Packit Service fa4841
{
Packit Service fa4841
	private static final String TAG = "LibFreeRDP";
Packit Service fa4841
	private static EventListener listener;
Packit Service fa4841
	private static boolean mHasH264 = true;
Packit Service fa4841
Packit Service fa4841
	private static final LongSparseArray<Boolean> mInstanceState = new LongSparseArray<>();
Packit Service fa4841
Packit Service fa4841
	static
Packit Service fa4841
	{
Packit Service fa4841
		final String h264 = "openh264";
Packit Service fa4841
		final String[] libraries = { h264,
Packit Service fa4841
			                         "freerdp-openssl",
Packit Service fa4841
			                         "ssl",
Packit Service fa4841
			                         "crypto",
Packit Service fa4841
			                         "jpeg",
Packit Service fa4841
			                         "winpr2",
Packit Service fa4841
			                         "freerdp2",
Packit Service fa4841
			                         "freerdp-client2",
Packit Service fa4841
			                         "freerdp-android2" };
Packit Service fa4841
		final String LD_PATH = System.getProperty("java.library.path");
Packit Service fa4841
Packit Service fa4841
		for (String lib : libraries)
Packit Service fa4841
		{
Packit Service fa4841
			try
Packit Service fa4841
			{
Packit Service fa4841
				Log.v(TAG, "Trying to load library " + lib + " from LD_PATH: " + LD_PATH);
Packit Service fa4841
				System.loadLibrary(lib);
Packit Service fa4841
			}
Packit Service fa4841
			catch (UnsatisfiedLinkError e)
Packit Service fa4841
			{
Packit Service fa4841
				Log.e(TAG, "Failed to load library " + lib + ": " + e.toString());
Packit Service fa4841
				if (lib.equals(h264))
Packit Service fa4841
				{
Packit Service fa4841
					mHasH264 = false;
Packit Service fa4841
				}
Packit Service fa4841
			}
Packit Service fa4841
		}
Packit Service fa4841
	}
Packit Service fa4841
Packit Service fa4841
	public static boolean hasH264Support()
Packit Service fa4841
	{
Packit Service fa4841
		return mHasH264;
Packit Service fa4841
	}
Packit Service fa4841
Packit Service fa4841
	private static native String freerdp_get_jni_version();
Packit Service fa4841
Packit Service fa4841
	private static native String freerdp_get_version();
Packit Service fa4841
Packit Service fa4841
	private static native String freerdp_get_build_date();
Packit Service fa4841
Packit Service fa4841
	private static native String freerdp_get_build_revision();
Packit Service fa4841
Packit Service fa4841
	private static native String freerdp_get_build_config();
Packit Service fa4841
Packit Service fa4841
	private static native long freerdp_new(Context context);
Packit Service fa4841
Packit Service fa4841
	private static native void freerdp_free(long inst);
Packit Service fa4841
Packit Service fa4841
	private static native boolean freerdp_parse_arguments(long inst, String[] args);
Packit Service fa4841
Packit Service fa4841
	private static native boolean freerdp_connect(long inst);
Packit Service fa4841
Packit Service fa4841
	private static native boolean freerdp_disconnect(long inst);
Packit Service fa4841
Packit Service fa4841
	private static native boolean freerdp_update_graphics(long inst, Bitmap bitmap, int x, int y,
Packit Service fa4841
	                                                      int width, int height);
Packit Service fa4841
Packit Service fa4841
	private static native boolean freerdp_send_cursor_event(long inst, int x, int y, int flags);
Packit Service fa4841
Packit Service fa4841
	private static native boolean freerdp_send_key_event(long inst, int keycode, boolean down);
Packit Service fa4841
Packit Service fa4841
	private static native boolean freerdp_send_unicodekey_event(long inst, int keycode,
Packit Service fa4841
	                                                            boolean down);
Packit Service fa4841
Packit Service fa4841
	private static native boolean freerdp_send_clipboard_data(long inst, String data);
Packit Service fa4841
Packit Service fa4841
	private static native String freerdp_get_last_error_string(long inst);
Packit Service fa4841
Packit Service fa4841
	public static void setEventListener(EventListener l)
Packit Service fa4841
	{
Packit Service fa4841
		listener = l;
Packit Service fa4841
	}
Packit Service fa4841
Packit Service fa4841
	public static long newInstance(Context context)
Packit Service fa4841
	{
Packit Service fa4841
		return freerdp_new(context);
Packit Service fa4841
	}
Packit Service fa4841
Packit Service fa4841
	public static void freeInstance(long inst)
Packit Service fa4841
	{
Packit Service fa4841
		synchronized (mInstanceState)
Packit Service fa4841
		{
Packit Service fa4841
			if (mInstanceState.get(inst, false))
Packit Service fa4841
			{
Packit Service fa4841
				freerdp_disconnect(inst);
Packit Service fa4841
			}
Packit Service fa4841
			while (mInstanceState.get(inst, false))
Packit Service fa4841
			{
Packit Service fa4841
				try
Packit Service fa4841
				{
Packit Service fa4841
					mInstanceState.wait();
Packit Service fa4841
				}
Packit Service fa4841
				catch (InterruptedException e)
Packit Service fa4841
				{
Packit Service fa4841
					throw new RuntimeException();
Packit Service fa4841
				}
Packit Service fa4841
			}
Packit Service fa4841
		}
Packit Service fa4841
		freerdp_free(inst);
Packit Service fa4841
	}
Packit Service fa4841
Packit Service fa4841
	public static boolean connect(long inst)
Packit Service fa4841
	{
Packit Service fa4841
		synchronized (mInstanceState)
Packit Service fa4841
		{
Packit Service fa4841
			if (mInstanceState.get(inst, false))
Packit Service fa4841
			{
Packit Service fa4841
				throw new RuntimeException("instance already connected");
Packit Service fa4841
			}
Packit Service fa4841
		}
Packit Service fa4841
		return freerdp_connect(inst);
Packit Service fa4841
	}
Packit Service fa4841
Packit Service fa4841
	public static boolean disconnect(long inst)
Packit Service fa4841
	{
Packit Service fa4841
		synchronized (mInstanceState)
Packit Service fa4841
		{
Packit Service fa4841
			if (mInstanceState.get(inst, false))
Packit Service fa4841
			{
Packit Service fa4841
				return freerdp_disconnect(inst);
Packit Service fa4841
			}
Packit Service fa4841
			return true;
Packit Service fa4841
		}
Packit Service fa4841
	}
Packit Service fa4841
Packit Service fa4841
	public static boolean cancelConnection(long inst)
Packit Service fa4841
	{
Packit Service fa4841
		synchronized (mInstanceState)
Packit Service fa4841
		{
Packit Service fa4841
			if (mInstanceState.get(inst, false))
Packit Service fa4841
			{
Packit Service fa4841
				return freerdp_disconnect(inst);
Packit Service fa4841
			}
Packit Service fa4841
			return true;
Packit Service fa4841
		}
Packit Service fa4841
	}
Packit Service fa4841
Packit Service fa4841
	private static String addFlag(String name, boolean enabled)
Packit Service fa4841
	{
Packit Service fa4841
		if (enabled)
Packit Service fa4841
		{
Packit Service fa4841
			return "+" + name;
Packit Service fa4841
		}
Packit Service fa4841
		return "-" + name;
Packit Service fa4841
	}
Packit Service fa4841
Packit Service fa4841
	public static boolean setConnectionInfo(Context context, long inst, BookmarkBase bookmark)
Packit Service fa4841
	{
Packit Service fa4841
		BookmarkBase.ScreenSettings screenSettings = bookmark.getActiveScreenSettings();
Packit Service fa4841
		BookmarkBase.AdvancedSettings advanced = bookmark.getAdvancedSettings();
Packit Service fa4841
		BookmarkBase.DebugSettings debug = bookmark.getDebugSettings();
Packit Service fa4841
Packit Service fa4841
		String arg;
Packit Service fa4841
		ArrayList<String> args = new ArrayList<String>();
Packit Service fa4841
Packit Service fa4841
		args.add(TAG);
Packit Service fa4841
		args.add("/gdi:sw");
Packit Service fa4841
Packit Service fa4841
		final String clientName = ApplicationSettingsActivity.getClientName(context);
Packit Service fa4841
		if (!clientName.isEmpty())
Packit Service fa4841
		{
Packit Service fa4841
			args.add("/client-hostname:" + clientName);
Packit Service fa4841
		}
Packit Service fa4841
		String certName = "";
Packit Service fa4841
		if (bookmark.getType() != BookmarkBase.TYPE_MANUAL)
Packit Service fa4841
		{
Packit Service fa4841
			return false;
Packit Service fa4841
		}
Packit Service fa4841
Packit Service fa4841
		int port = bookmark.<ManualBookmark>get().getPort();
Packit Service fa4841
		String hostname = bookmark.<ManualBookmark>get().getHostname();
Packit Service fa4841
Packit Service fa4841
		args.add("/v:" + hostname);
Packit Service fa4841
		args.add("/port:" + String.valueOf(port));
Packit Service fa4841
Packit Service fa4841
		arg = bookmark.getUsername();
Packit Service fa4841
		if (!arg.isEmpty())
Packit Service fa4841
		{
Packit Service fa4841
			args.add("/u:" + arg);
Packit Service fa4841
		}
Packit Service fa4841
		arg = bookmark.getDomain();
Packit Service fa4841
		if (!arg.isEmpty())
Packit Service fa4841
		{
Packit Service fa4841
			args.add("/d:" + arg);
Packit Service fa4841
		}
Packit Service fa4841
		arg = bookmark.getPassword();
Packit Service fa4841
		if (!arg.isEmpty())
Packit Service fa4841
		{
Packit Service fa4841
			args.add("/p:" + arg);
Packit Service fa4841
		}
Packit Service fa4841
Packit Service fa4841
		args.add(
Packit Service fa4841
		    String.format("/size:%dx%d", screenSettings.getWidth(), screenSettings.getHeight()));
Packit Service fa4841
		args.add("/bpp:" + String.valueOf(screenSettings.getColors()));
Packit Service fa4841
Packit Service fa4841
		if (advanced.getConsoleMode())
Packit Service fa4841
		{
Packit Service fa4841
			args.add("/admin");
Packit Service fa4841
		}
Packit Service fa4841
Packit Service fa4841
		switch (advanced.getSecurity())
Packit Service fa4841
		{
Packit Service fa4841
			case 3: // NLA
Packit Service fa4841
				args.add("/sec-nla");
Packit Service fa4841
				break;
Packit Service fa4841
			case 2: // TLS
Packit Service fa4841
				args.add("/sec-tls");
Packit Service fa4841
				break;
Packit Service fa4841
			case 1: // RDP
Packit Service fa4841
				args.add("/sec-rdp");
Packit Service fa4841
				break;
Packit Service fa4841
			default:
Packit Service fa4841
				break;
Packit Service fa4841
		}
Packit Service fa4841
Packit Service fa4841
		if (!certName.isEmpty())
Packit Service fa4841
		{
Packit Service fa4841
			args.add("/cert-name:" + certName);
Packit Service fa4841
		}
Packit Service fa4841
Packit Service fa4841
		BookmarkBase.PerformanceFlags flags = bookmark.getActivePerformanceFlags();
Packit Service fa4841
		if (flags.getRemoteFX())
Packit Service fa4841
		{
Packit Service fa4841
			args.add("/rfx");
Packit Service fa4841
		}
Packit Service fa4841
Packit Service fa4841
		if (flags.getGfx())
Packit Service fa4841
		{
Packit Service fa4841
			args.add("/gfx");
Packit Service fa4841
		}
Packit Service fa4841
Packit Service fa4841
		if (flags.getH264() && mHasH264)
Packit Service fa4841
		{
Packit Service fa4841
			args.add("/gfx:AVC444");
Packit Service fa4841
		}
Packit Service fa4841
Packit Service fa4841
		args.add(addFlag("wallpaper", flags.getWallpaper()));
Packit Service fa4841
		args.add(addFlag("window-drag", flags.getFullWindowDrag()));
Packit Service fa4841
		args.add(addFlag("menu-anims", flags.getMenuAnimations()));
Packit Service fa4841
		args.add(addFlag("themes", flags.getTheming()));
Packit Service fa4841
		args.add(addFlag("fonts", flags.getFontSmoothing()));
Packit Service fa4841
		args.add(addFlag("aero", flags.getDesktopComposition()));
Packit Service fa4841
		args.add(addFlag("glyph-cache", false));
Packit Service fa4841
Packit Service fa4841
		if (!advanced.getRemoteProgram().isEmpty())
Packit Service fa4841
		{
Packit Service fa4841
			args.add("/shell:" + advanced.getRemoteProgram());
Packit Service fa4841
		}
Packit Service fa4841
Packit Service fa4841
		if (!advanced.getWorkDir().isEmpty())
Packit Service fa4841
		{
Packit Service fa4841
			args.add("/shell-dir:" + advanced.getWorkDir());
Packit Service fa4841
		}
Packit Service fa4841
Packit Service fa4841
		args.add(addFlag("async-channels", debug.getAsyncChannel()));
Packit Service fa4841
		args.add(addFlag("async-input", debug.getAsyncInput()));
Packit Service fa4841
		args.add(addFlag("async-update", debug.getAsyncUpdate()));
Packit Service fa4841
Packit Service fa4841
		if (advanced.getRedirectSDCard())
Packit Service fa4841
		{
Packit Service fa4841
			String path = android.os.Environment.getExternalStorageDirectory().getPath();
Packit Service fa4841
			args.add("/drive:sdcard," + path);
Packit Service fa4841
		}
Packit Service fa4841
Packit Service fa4841
		args.add("/clipboard");
Packit Service fa4841
Packit Service fa4841
		// Gateway enabled?
Packit Service fa4841
		if (bookmark.getType() == BookmarkBase.TYPE_MANUAL &&
Packit Service fa4841
		    bookmark.<ManualBookmark>get().getEnableGatewaySettings())
Packit Service fa4841
		{
Packit Service fa4841
			ManualBookmark.GatewaySettings gateway =
Packit Service fa4841
			    bookmark.<ManualBookmark>get().getGatewaySettings();
Packit Service fa4841
Packit Service fa4841
			args.add(String.format("/g:%s:%d", gateway.getHostname(), gateway.getPort()));
Packit Service fa4841
Packit Service fa4841
			arg = gateway.getUsername();
Packit Service fa4841
			if (!arg.isEmpty())
Packit Service fa4841
			{
Packit Service fa4841
				args.add("/gu:" + arg);
Packit Service fa4841
			}
Packit Service fa4841
			arg = gateway.getDomain();
Packit Service fa4841
			if (!arg.isEmpty())
Packit Service fa4841
			{
Packit Service fa4841
				args.add("/gd:" + arg);
Packit Service fa4841
			}
Packit Service fa4841
			arg = gateway.getPassword();
Packit Service fa4841
			if (!arg.isEmpty())
Packit Service fa4841
			{
Packit Service fa4841
				args.add("/gp:" + arg);
Packit Service fa4841
			}
Packit Service fa4841
		}
Packit Service fa4841
Packit Service fa4841
		/* 0 ... local
Packit Service fa4841
		   1 ... remote
Packit Service fa4841
		   2 ... disable */
Packit Service fa4841
		args.add("/audio-mode:" + String.valueOf(advanced.getRedirectSound()));
Packit Service fa4841
		if (advanced.getRedirectSound() == 0)
Packit Service fa4841
		{
Packit Service fa4841
			args.add("/sound");
Packit Service fa4841
		}
Packit Service fa4841
Packit Service fa4841
		if (advanced.getRedirectMicrophone())
Packit Service fa4841
		{
Packit Service fa4841
			args.add("/microphone");
Packit Service fa4841
		}
Packit Service fa4841
Packit Service fa4841
		args.add("/cert-ignore");
Packit Service fa4841
		args.add("/log-level:" + debug.getDebugLevel());
Packit Service fa4841
		String[] arrayArgs = args.toArray(new String[args.size()]);
Packit Service fa4841
		return freerdp_parse_arguments(inst, arrayArgs);
Packit Service fa4841
	}
Packit Service fa4841
Packit Service fa4841
	public static boolean setConnectionInfo(Context context, long inst, Uri openUri)
Packit Service fa4841
	{
Packit Service fa4841
		ArrayList<String> args = new ArrayList<>();
Packit Service fa4841
Packit Service fa4841
		// Parse URI from query string. Same key overwrite previous one
Packit Service fa4841
		// freerdp://user@ip:port/connect?sound=&rfx=&p=password&clipboard=%2b&themes=-
Packit Service fa4841
Packit Service fa4841
		// Now we only support Software GDI
Packit Service fa4841
		args.add(TAG);
Packit Service fa4841
		args.add("/gdi:sw");
Packit Service fa4841
Packit Service fa4841
		final String clientName = ApplicationSettingsActivity.getClientName(context);
Packit Service fa4841
		if (!clientName.isEmpty())
Packit Service fa4841
		{
Packit Service fa4841
			args.add("/client-hostname:" + clientName);
Packit Service fa4841
		}
Packit Service fa4841
Packit Service fa4841
		// Parse hostname and port. Set to 'v' argument
Packit Service fa4841
		String hostname = openUri.getHost();
Packit Service fa4841
		int port = openUri.getPort();
Packit Service fa4841
		if (hostname != null)
Packit Service fa4841
		{
Packit Service fa4841
			hostname = hostname + ((port == -1) ? "" : (":" + String.valueOf(port)));
Packit Service fa4841
			args.add("/v:" + hostname);
Packit Service fa4841
		}
Packit Service fa4841
Packit Service fa4841
		String user = openUri.getUserInfo();
Packit Service fa4841
		if (user != null)
Packit Service fa4841
		{
Packit Service fa4841
			args.add("/u:" + user);
Packit Service fa4841
		}
Packit Service fa4841
Packit Service fa4841
		for (String key : openUri.getQueryParameterNames())
Packit Service fa4841
		{
Packit Service fa4841
			String value = openUri.getQueryParameter(key);
Packit Service fa4841
Packit Service fa4841
			if (value.isEmpty())
Packit Service fa4841
			{
Packit Service fa4841
				// Query: key=
Packit Service fa4841
				// To freerdp argument: /key
Packit Service fa4841
				args.add("/" + key);
Packit Service fa4841
			}
Packit Service fa4841
			else if (value.equals("-") || value.equals("+"))
Packit Service fa4841
			{
Packit Service fa4841
				// Query: key=- or key=+
Packit Service fa4841
				// To freerdp argument: -key or +key
Packit Service fa4841
				args.add(value + key);
Packit Service fa4841
			}
Packit Service fa4841
			else
Packit Service fa4841
			{
Packit Service fa4841
				// Query: key=value
Packit Service fa4841
				// To freerdp argument: /key:value
Packit Service fa4841
				if (key.equals("drive") && value.equals("sdcard"))
Packit Service fa4841
				{
Packit Service fa4841
					// Special for sdcard redirect
Packit Service fa4841
					String path = android.os.Environment.getExternalStorageDirectory().getPath();
Packit Service fa4841
					value = "sdcard," + path;
Packit Service fa4841
				}
Packit Service fa4841
Packit Service fa4841
				args.add("/" + key + ":" + value);
Packit Service fa4841
			}
Packit Service fa4841
		}
Packit Service fa4841
Packit Service fa4841
		String[] arrayArgs = args.toArray(new String[args.size()]);
Packit Service fa4841
		return freerdp_parse_arguments(inst, arrayArgs);
Packit Service fa4841
	}
Packit Service fa4841
Packit Service fa4841
	public static boolean updateGraphics(long inst, Bitmap bitmap, int x, int y, int width,
Packit Service fa4841
	                                     int height)
Packit Service fa4841
	{
Packit Service fa4841
		return freerdp_update_graphics(inst, bitmap, x, y, width, height);
Packit Service fa4841
	}
Packit Service fa4841
Packit Service fa4841
	public static boolean sendCursorEvent(long inst, int x, int y, int flags)
Packit Service fa4841
	{
Packit Service fa4841
		return freerdp_send_cursor_event(inst, x, y, flags);
Packit Service fa4841
	}
Packit Service fa4841
Packit Service fa4841
	public static boolean sendKeyEvent(long inst, int keycode, boolean down)
Packit Service fa4841
	{
Packit Service fa4841
		return freerdp_send_key_event(inst, keycode, down);
Packit Service fa4841
	}
Packit Service fa4841
Packit Service fa4841
	public static boolean sendUnicodeKeyEvent(long inst, int keycode, boolean down)
Packit Service fa4841
	{
Packit Service fa4841
		return freerdp_send_unicodekey_event(inst, keycode, down);
Packit Service fa4841
	}
Packit Service fa4841
Packit Service fa4841
	public static boolean sendClipboardData(long inst, String data)
Packit Service fa4841
	{
Packit Service fa4841
		return freerdp_send_clipboard_data(inst, data);
Packit Service fa4841
	}
Packit Service fa4841
Packit Service fa4841
	private static void OnConnectionSuccess(long inst)
Packit Service fa4841
	{
Packit Service fa4841
		if (listener != null)
Packit Service fa4841
			listener.OnConnectionSuccess(inst);
Packit Service fa4841
		synchronized (mInstanceState)
Packit Service fa4841
		{
Packit Service fa4841
			mInstanceState.append(inst, true);
Packit Service fa4841
			mInstanceState.notifyAll();
Packit Service fa4841
		}
Packit Service fa4841
	}
Packit Service fa4841
Packit Service fa4841
	private static void OnConnectionFailure(long inst)
Packit Service fa4841
	{
Packit Service fa4841
		if (listener != null)
Packit Service fa4841
			listener.OnConnectionFailure(inst);
Packit Service fa4841
		synchronized (mInstanceState)
Packit Service fa4841
		{
Packit Service fa4841
			mInstanceState.remove(inst);
Packit Service fa4841
			mInstanceState.notifyAll();
Packit Service fa4841
		}
Packit Service fa4841
	}
Packit Service fa4841
Packit Service fa4841
	private static void OnPreConnect(long inst)
Packit Service fa4841
	{
Packit Service fa4841
		if (listener != null)
Packit Service fa4841
			listener.OnPreConnect(inst);
Packit Service fa4841
	}
Packit Service fa4841
Packit Service fa4841
	private static void OnDisconnecting(long inst)
Packit Service fa4841
	{
Packit Service fa4841
		if (listener != null)
Packit Service fa4841
			listener.OnDisconnecting(inst);
Packit Service fa4841
	}
Packit Service fa4841
Packit Service fa4841
	private static void OnDisconnected(long inst)
Packit Service fa4841
	{
Packit Service fa4841
		if (listener != null)
Packit Service fa4841
			listener.OnDisconnected(inst);
Packit Service fa4841
		synchronized (mInstanceState)
Packit Service fa4841
		{
Packit Service fa4841
			mInstanceState.remove(inst);
Packit Service fa4841
			mInstanceState.notifyAll();
Packit Service fa4841
		}
Packit Service fa4841
	}
Packit Service fa4841
Packit Service fa4841
	private static void OnSettingsChanged(long inst, int width, int height, int bpp)
Packit Service fa4841
	{
Packit Service fa4841
		SessionState s = GlobalApp.getSession(inst);
Packit Service fa4841
		if (s == null)
Packit Service fa4841
			return;
Packit Service fa4841
		UIEventListener uiEventListener = s.getUIEventListener();
Packit Service fa4841
		if (uiEventListener != null)
Packit Service fa4841
			uiEventListener.OnSettingsChanged(width, height, bpp);
Packit Service fa4841
	}
Packit Service fa4841
Packit Service fa4841
	private static boolean OnAuthenticate(long inst, StringBuilder username, StringBuilder domain,
Packit Service fa4841
	                                      StringBuilder password)
Packit Service fa4841
	{
Packit Service fa4841
		SessionState s = GlobalApp.getSession(inst);
Packit Service fa4841
		if (s == null)
Packit Service fa4841
			return false;
Packit Service fa4841
		UIEventListener uiEventListener = s.getUIEventListener();
Packit Service fa4841
		if (uiEventListener != null)
Packit Service fa4841
			return uiEventListener.OnAuthenticate(username, domain, password);
Packit Service fa4841
		return false;
Packit Service fa4841
	}
Packit Service fa4841
Packit Service fa4841
	private static boolean OnGatewayAuthenticate(long inst, StringBuilder username,
Packit Service fa4841
	                                             StringBuilder domain, StringBuilder password)
Packit Service fa4841
	{
Packit Service fa4841
		SessionState s = GlobalApp.getSession(inst);
Packit Service fa4841
		if (s == null)
Packit Service fa4841
			return false;
Packit Service fa4841
		UIEventListener uiEventListener = s.getUIEventListener();
Packit Service fa4841
		if (uiEventListener != null)
Packit Service fa4841
			return uiEventListener.OnGatewayAuthenticate(username, domain, password);
Packit Service fa4841
		return false;
Packit Service fa4841
	}
Packit Service fa4841
Packit Service fa4841
	private static int OnVerifyCertificate(long inst, String commonName, String subject,
Packit Service fa4841
	                                       String issuer, String fingerprint, boolean hostMismatch)
Packit Service fa4841
	{
Packit Service fa4841
		SessionState s = GlobalApp.getSession(inst);
Packit Service fa4841
		if (s == null)
Packit Service fa4841
			return 0;
Packit Service fa4841
		UIEventListener uiEventListener = s.getUIEventListener();
Packit Service fa4841
		if (uiEventListener != null)
Packit Service fa4841
			return uiEventListener.OnVerifiyCertificate(commonName, subject, issuer, fingerprint,
Packit Service fa4841
			                                            hostMismatch);
Packit Service fa4841
		return 0;
Packit Service fa4841
	}
Packit Service fa4841
Packit Service fa4841
	private static int OnVerifyChangedCertificate(long inst, String commonName, String subject,
Packit Service fa4841
	                                              String issuer, String fingerprint,
Packit Service fa4841
	                                              String oldSubject, String oldIssuer,
Packit Service fa4841
	                                              String oldFingerprint)
Packit Service fa4841
	{
Packit Service fa4841
		SessionState s = GlobalApp.getSession(inst);
Packit Service fa4841
		if (s == null)
Packit Service fa4841
			return 0;
Packit Service fa4841
		UIEventListener uiEventListener = s.getUIEventListener();
Packit Service fa4841
		if (uiEventListener != null)
Packit Service fa4841
			return uiEventListener.OnVerifyChangedCertificate(
Packit Service fa4841
			    commonName, subject, issuer, fingerprint, oldSubject, oldIssuer, oldFingerprint);
Packit Service fa4841
		return 0;
Packit Service fa4841
	}
Packit Service fa4841
Packit Service fa4841
	private static void OnGraphicsUpdate(long inst, int x, int y, int width, int height)
Packit Service fa4841
	{
Packit Service fa4841
		SessionState s = GlobalApp.getSession(inst);
Packit Service fa4841
		if (s == null)
Packit Service fa4841
			return;
Packit Service fa4841
		UIEventListener uiEventListener = s.getUIEventListener();
Packit Service fa4841
		if (uiEventListener != null)
Packit Service fa4841
			uiEventListener.OnGraphicsUpdate(x, y, width, height);
Packit Service fa4841
	}
Packit Service fa4841
Packit Service fa4841
	private static void OnGraphicsResize(long inst, int width, int height, int bpp)
Packit Service fa4841
	{
Packit Service fa4841
		SessionState s = GlobalApp.getSession(inst);
Packit Service fa4841
		if (s == null)
Packit Service fa4841
			return;
Packit Service fa4841
		UIEventListener uiEventListener = s.getUIEventListener();
Packit Service fa4841
		if (uiEventListener != null)
Packit Service fa4841
			uiEventListener.OnGraphicsResize(width, height, bpp);
Packit Service fa4841
	}
Packit Service fa4841
Packit Service fa4841
	private static void OnRemoteClipboardChanged(long inst, String data)
Packit Service fa4841
	{
Packit Service fa4841
		SessionState s = GlobalApp.getSession(inst);
Packit Service fa4841
		if (s == null)
Packit Service fa4841
			return;
Packit Service fa4841
		UIEventListener uiEventListener = s.getUIEventListener();
Packit Service fa4841
		if (uiEventListener != null)
Packit Service fa4841
			uiEventListener.OnRemoteClipboardChanged(data);
Packit Service fa4841
	}
Packit Service fa4841
Packit Service fa4841
	public static String getVersion()
Packit Service fa4841
	{
Packit Service fa4841
		return freerdp_get_version();
Packit Service fa4841
	}
Packit Service fa4841
Packit Service fa4841
	public static interface EventListener {
Packit Service fa4841
		void OnPreConnect(long instance);
Packit Service fa4841
Packit Service fa4841
		void OnConnectionSuccess(long instance);
Packit Service fa4841
Packit Service fa4841
		void OnConnectionFailure(long instance);
Packit Service fa4841
Packit Service fa4841
		void OnDisconnecting(long instance);
Packit Service fa4841
Packit Service fa4841
		void OnDisconnected(long instance);
Packit Service fa4841
	}
Packit Service fa4841
Packit Service fa4841
	public static interface UIEventListener {
Packit Service fa4841
		void OnSettingsChanged(int width, int height, int bpp);
Packit Service fa4841
Packit Service fa4841
		boolean OnAuthenticate(StringBuilder username, StringBuilder domain,
Packit Service fa4841
		                       StringBuilder password);
Packit Service fa4841
Packit Service fa4841
		boolean OnGatewayAuthenticate(StringBuilder username, StringBuilder domain,
Packit Service fa4841
		                              StringBuilder password);
Packit Service fa4841
Packit Service fa4841
		int OnVerifiyCertificate(String commonName, String subject, String issuer,
Packit Service fa4841
		                         String fingerprint, boolean mismatch);
Packit Service fa4841
Packit Service fa4841
		int OnVerifyChangedCertificate(String commonName, String subject, String issuer,
Packit Service fa4841
		                               String fingerprint, String oldSubject, String oldIssuer,
Packit Service fa4841
		                               String oldFingerprint);
Packit Service fa4841
Packit Service fa4841
		void OnGraphicsUpdate(int x, int y, int width, int height);
Packit Service fa4841
Packit Service fa4841
		void OnGraphicsResize(int width, int height, int bpp);
Packit Service fa4841
Packit Service fa4841
		void OnRemoteClipboardChanged(String data);
Packit Service fa4841
	}
Packit Service fa4841
}