From 0927114e83854b7da8ffb142bd2c6a9209b10f75 Mon Sep 17 00:00:00 2001 From: "zihao.jiang" Date: Sat, 27 Feb 2016 18:31:43 +0800 Subject: [PATCH] android: Allow freerdp mobile version to be launched from URI (freerdp://) It would be good if we have a easy way to call aFreeRDP in another Android APP (Requirement also mentioned in #2720) We can define a scheme (freerdp://) as unified way to launch FreeRDP from another APP or browser and connect to compatible RDP server 1. Define scheme freerdp:// 2. General form could be freerdp://user@hostname:port/connect?key1=value&key2=-&key3=%2b&key4= 3. [user] part would be translated to /u: 4. [hostname:port] would be translated to /v: 5. The [user@hostname:port] part would be used as app title, currently it's just the progress dialog title 6. query parameters would be translated to command line arguments. Later same arguments will overwrite the formers: a. key1=value: => /key1:value b. key2=-: => -key2 c. key3=%2b => +key3 (%2b is url encoded +) d. key4= => /key4 e. Especially, drive=sdcard will be properly handled with local sdcard path. On my device it will be translated to /drive:sdcard,/storage/emulated/0 Owing to the refactor work in PR #3097, we now pass same command line argument to JNI for freerdp settings. We just need to make the SessionActivity accept freerdp scheme and translate argument from URI form to command line form. --- .../freeRDPCore/src/main/AndroidManifest.xml | 6 +++ .../freerdp/freerdpcore/application/GlobalApp.java | 7 +++ .../freerdpcore/application/SessionState.java | 23 ++++++++- .../freerdpcore/presentation/SessionActivity.java | 37 ++++++++++++-- .../freerdp/freerdpcore/services/LibFreeRDP.java | 56 ++++++++++++++++++++-- 5 files changed, 120 insertions(+), 9 deletions(-) diff --git a/client/Android/Studio/freeRDPCore/src/main/AndroidManifest.xml b/client/Android/Studio/freeRDPCore/src/main/AndroidManifest.xml index 7860018..e50a4dc 100644 --- a/client/Android/Studio/freeRDPCore/src/main/AndroidManifest.xml +++ b/client/Android/Studio/freeRDPCore/src/main/AndroidManifest.xml @@ -69,6 +69,12 @@ android:theme="@style/Theme.Main" android:configChanges="orientation|keyboardHidden|keyboard" android:windowSoftInputMode="adjustResize"> + + + + + + args = new ArrayList(); + + // Parse URI from query string. Same key overwrite previous one + // freerdp://user@ip:port/connect?sound=&rfx=&p=password&clipboard=%2b&themes=- + + // Now we only support Software GDI + args.add(TAG); + args.add("/gdi:sw"); + + // Parse hostname and port. Set to 'v' argument + String hostname = openUri.getHost(); + int port = openUri.getPort(); + if (hostname != null) { + hostname = hostname + ((port == -1) ? "" : (":" + String.valueOf(port))); + args.add("/v:" + hostname); + } + + String user = openUri.getUserInfo(); + if (user != null) { + args.add("/u:" + user); + } + + for (String key: openUri.getQueryParameterNames()) { + String value = openUri.getQueryParameter(key); + + if (value.isEmpty()) { + // Query: key= + // To freerdp argument: /key + args.add("/" + key); + } else if (value.equals("-") || value.equals("+")) { + // Query: key=- or key=+ + // To freerdp argument: -key or +key + args.add(value+key); + } else { + // Query: key=value + // To freerdp argument: /key:value + if (key.equals("drive") && value.equals("sdcard")) { + // Special for sdcard redirect + String path = android.os.Environment.getExternalStorageDirectory().getPath(); + value = "sdcard," + path; + } + + args.add("/" + key + ":" + value); + } + } + + String[] arrayArgs = args.toArray(new String[args.size()]); + return freerdp_parse_arguments(inst, arrayArgs); + } public static boolean updateGraphics(int inst, Bitmap bitmap, int x, int y, int width, int height) { return freerdp_update_graphics(inst, bitmap, x, y, width, height); -- 2.7.4