Android: Add basic .RDP file support
This commit is contained in:
parent
a6f3c50bed
commit
bcbb80fc19
@ -14,6 +14,7 @@ public class ConnectionReference
|
|||||||
public static final String PATH_MANUAL_BOOKMARK_ID = "MBMID/";
|
public static final String PATH_MANUAL_BOOKMARK_ID = "MBMID/";
|
||||||
public static final String PATH_HOSTNAME = "HOST/";
|
public static final String PATH_HOSTNAME = "HOST/";
|
||||||
public static final String PATH_PLACEHOLDER = "PLCHLD/";
|
public static final String PATH_PLACEHOLDER = "PLCHLD/";
|
||||||
|
public static final String PATH_FILE = "FILE/";
|
||||||
|
|
||||||
public static String getManualBookmarkReference(long bookmarkId) {
|
public static String getManualBookmarkReference(long bookmarkId) {
|
||||||
return (PATH_MANUAL_BOOKMARK_ID + bookmarkId);
|
return (PATH_MANUAL_BOOKMARK_ID + bookmarkId);
|
||||||
@ -27,6 +28,10 @@ public class ConnectionReference
|
|||||||
return (PATH_PLACEHOLDER + name);
|
return (PATH_PLACEHOLDER + name);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static String getFileReference(String uri) {
|
||||||
|
return (PATH_FILE + uri);
|
||||||
|
}
|
||||||
|
|
||||||
public static boolean isBookmarkReference(String refStr) {
|
public static boolean isBookmarkReference(String refStr) {
|
||||||
return refStr.startsWith(PATH_MANUAL_BOOKMARK_ID);
|
return refStr.startsWith(PATH_MANUAL_BOOKMARK_ID);
|
||||||
}
|
}
|
||||||
@ -43,6 +48,10 @@ public class ConnectionReference
|
|||||||
return refStr.startsWith(PATH_PLACEHOLDER);
|
return refStr.startsWith(PATH_PLACEHOLDER);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static boolean isFileReference(String refStr) {
|
||||||
|
return refStr.startsWith(PATH_FILE);
|
||||||
|
}
|
||||||
|
|
||||||
public static long getManualBookmarkId(String refStr) {
|
public static long getManualBookmarkId(String refStr) {
|
||||||
return Integer.parseInt(refStr.substring(PATH_MANUAL_BOOKMARK_ID.length()));
|
return Integer.parseInt(refStr.substring(PATH_MANUAL_BOOKMARK_ID.length()));
|
||||||
}
|
}
|
||||||
@ -54,4 +63,8 @@ public class ConnectionReference
|
|||||||
public static String getPlaceholder(String refStr) {
|
public static String getPlaceholder(String refStr) {
|
||||||
return refStr.substring(PATH_PLACEHOLDER.length());
|
return refStr.substring(PATH_PLACEHOLDER.length());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static String getFile(String refStr) {
|
||||||
|
return refStr.substring(PATH_FILE.length());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -9,12 +9,16 @@
|
|||||||
|
|
||||||
package com.freerdp.freerdpcore.presentation;
|
package com.freerdp.freerdpcore.presentation;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
|
import java.io.IOException;
|
||||||
|
|
||||||
import com.freerdp.freerdpcore.R;
|
import com.freerdp.freerdpcore.R;
|
||||||
import com.freerdp.freerdpcore.application.GlobalApp;
|
import com.freerdp.freerdpcore.application.GlobalApp;
|
||||||
import com.freerdp.freerdpcore.domain.BookmarkBase;
|
import com.freerdp.freerdpcore.domain.BookmarkBase;
|
||||||
import com.freerdp.freerdpcore.domain.ConnectionReference;
|
import com.freerdp.freerdpcore.domain.ConnectionReference;
|
||||||
import com.freerdp.freerdpcore.domain.ManualBookmark;
|
import com.freerdp.freerdpcore.domain.ManualBookmark;
|
||||||
import com.freerdp.freerdpcore.services.BookmarkBaseGateway;
|
import com.freerdp.freerdpcore.services.BookmarkBaseGateway;
|
||||||
|
import com.freerdp.freerdpcore.utils.RDPFileParser;
|
||||||
|
|
||||||
import android.app.AlertDialog;
|
import android.app.AlertDialog;
|
||||||
import android.content.ComponentName;
|
import android.content.ComponentName;
|
||||||
@ -25,11 +29,14 @@ import android.os.Bundle;
|
|||||||
import android.preference.ListPreference;
|
import android.preference.ListPreference;
|
||||||
import android.preference.Preference;
|
import android.preference.Preference;
|
||||||
import android.preference.PreferenceActivity;
|
import android.preference.PreferenceActivity;
|
||||||
|
import android.util.Log;
|
||||||
|
|
||||||
public class BookmarkActivity extends PreferenceActivity implements OnSharedPreferenceChangeListener
|
public class BookmarkActivity extends PreferenceActivity implements OnSharedPreferenceChangeListener
|
||||||
{
|
{
|
||||||
public static final String PARAM_CONNECTION_REFERENCE = "conRef";
|
public static final String PARAM_CONNECTION_REFERENCE = "conRef";
|
||||||
|
|
||||||
|
private static final String TAG = "BookmarkActivity";
|
||||||
|
|
||||||
private int current_preferences;
|
private int current_preferences;
|
||||||
private static final int PREFERENCES_BOOKMARK = 1;
|
private static final int PREFERENCES_BOOKMARK = 1;
|
||||||
private static final int PREFERENCES_CREDENTIALS = 2;
|
private static final int PREFERENCES_CREDENTIALS = 2;
|
||||||
@ -78,6 +85,26 @@ public class BookmarkActivity extends PreferenceActivity implements OnSharedPref
|
|||||||
bookmark.<ManualBookmark>get().setHostname(ConnectionReference.getHostname(refStr));
|
bookmark.<ManualBookmark>get().setHostname(ConnectionReference.getHostname(refStr));
|
||||||
new_bookmark = true;
|
new_bookmark = true;
|
||||||
}
|
}
|
||||||
|
else if (ConnectionReference.isFileReference(refStr))
|
||||||
|
{
|
||||||
|
String file = ConnectionReference.getFile(refStr);
|
||||||
|
|
||||||
|
bookmark = new ManualBookmark();
|
||||||
|
bookmark.setLabel(file);
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
RDPFileParser rdpFile = new RDPFileParser(file);
|
||||||
|
updateBookmarkFromFile((ManualBookmark)bookmark, rdpFile);
|
||||||
|
|
||||||
|
bookmark.setLabel(new File(file).getName());
|
||||||
|
new_bookmark = true;
|
||||||
|
}
|
||||||
|
catch (IOException e)
|
||||||
|
{
|
||||||
|
Log.e(TAG, "Failed reading RDP file", e);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -144,6 +171,54 @@ public class BookmarkActivity extends PreferenceActivity implements OnSharedPref
|
|||||||
setIntentComponentNames();
|
setIntentComponentNames();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void updateBookmarkFromFile(ManualBookmark bookmark, RDPFileParser rdpFile)
|
||||||
|
{
|
||||||
|
String s;
|
||||||
|
Integer i;
|
||||||
|
|
||||||
|
s = rdpFile.getString("full address");
|
||||||
|
if (s != null)
|
||||||
|
{
|
||||||
|
// this gets complicated as it can include port
|
||||||
|
if (s.lastIndexOf(":") > s.lastIndexOf("]"))
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
String port = s.substring(s.lastIndexOf(":") + 1);
|
||||||
|
bookmark.setPort(Integer.parseInt(port));
|
||||||
|
}
|
||||||
|
catch (NumberFormatException e)
|
||||||
|
{
|
||||||
|
Log.e(TAG, "Malformed address");
|
||||||
|
}
|
||||||
|
|
||||||
|
s = s.substring(0, s.lastIndexOf(":"));
|
||||||
|
}
|
||||||
|
|
||||||
|
// or even be an ipv6 address
|
||||||
|
if (s.startsWith("[") && s.endsWith("]"))
|
||||||
|
s = s.substring(1, s.length() - 1);
|
||||||
|
|
||||||
|
bookmark.setHostname(s);
|
||||||
|
}
|
||||||
|
|
||||||
|
i = rdpFile.getInteger("server port");
|
||||||
|
if (i != null)
|
||||||
|
bookmark.setPort(i);
|
||||||
|
|
||||||
|
s = rdpFile.getString("username");
|
||||||
|
if (s != null)
|
||||||
|
bookmark.setUsername(s);
|
||||||
|
|
||||||
|
s = rdpFile.getString("domain");
|
||||||
|
if (s != null)
|
||||||
|
bookmark.setDomain(s);
|
||||||
|
|
||||||
|
i = rdpFile.getInteger("connect to console");
|
||||||
|
if (i != null)
|
||||||
|
bookmark.getAdvancedSettings().setConsoleMode(i == 1);
|
||||||
|
}
|
||||||
|
|
||||||
private void setIntentComponentNames()
|
private void setIntentComponentNames()
|
||||||
{
|
{
|
||||||
// we set the component name for our sub-activity calls here because we don't know the package
|
// we set the component name for our sub-activity calls here because we don't know the package
|
||||||
|
@ -26,26 +26,27 @@ import android.app.AlertDialog;
|
|||||||
import android.content.DialogInterface;
|
import android.content.DialogInterface;
|
||||||
import android.content.Intent;
|
import android.content.Intent;
|
||||||
import android.content.res.Configuration;
|
import android.content.res.Configuration;
|
||||||
|
import android.net.Uri;
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
import android.text.Editable;
|
import android.text.Editable;
|
||||||
import android.text.TextWatcher;
|
import android.text.TextWatcher;
|
||||||
import android.util.Log;
|
import android.util.Log;
|
||||||
|
import android.view.ContextMenu;
|
||||||
|
import android.view.ContextMenu.ContextMenuInfo;
|
||||||
import android.view.Menu;
|
import android.view.Menu;
|
||||||
import android.view.MenuInflater;
|
import android.view.MenuInflater;
|
||||||
import android.view.MenuItem;
|
import android.view.MenuItem;
|
||||||
import android.view.View;
|
import android.view.View;
|
||||||
import android.view.ContextMenu;
|
|
||||||
import android.view.View.OnClickListener;
|
import android.view.View.OnClickListener;
|
||||||
import android.view.ContextMenu.ContextMenuInfo;
|
|
||||||
import android.view.View.OnCreateContextMenuListener;
|
import android.view.View.OnCreateContextMenuListener;
|
||||||
import android.webkit.WebView;
|
import android.webkit.WebView;
|
||||||
import android.webkit.WebViewClient;
|
import android.webkit.WebViewClient;
|
||||||
|
import android.widget.AdapterView;
|
||||||
|
import android.widget.AdapterView.AdapterContextMenuInfo;
|
||||||
import android.widget.Button;
|
import android.widget.Button;
|
||||||
import android.widget.CheckBox;
|
import android.widget.CheckBox;
|
||||||
import android.widget.EditText;
|
import android.widget.EditText;
|
||||||
import android.widget.ListView;
|
import android.widget.ListView;
|
||||||
import android.widget.AdapterView;
|
|
||||||
import android.widget.AdapterView.AdapterContextMenuInfo;
|
|
||||||
|
|
||||||
public class HomeActivity extends Activity
|
public class HomeActivity extends Activity
|
||||||
{
|
{
|
||||||
@ -87,6 +88,21 @@ public class HomeActivity extends Activity
|
|||||||
addBookmarkPlaceholder.setName(ADD_BOOKMARK_PLACEHOLDER);
|
addBookmarkPlaceholder.setName(ADD_BOOKMARK_PLACEHOLDER);
|
||||||
addBookmarkPlaceholder.setLabel(getResources().getString(R.string.list_placeholder_add_bookmark));
|
addBookmarkPlaceholder.setLabel(getResources().getString(R.string.list_placeholder_add_bookmark));
|
||||||
|
|
||||||
|
// check for passed .rdp file and open it in a new bookmark
|
||||||
|
Intent caller = getIntent();
|
||||||
|
Uri callParameter = caller.getData();
|
||||||
|
|
||||||
|
if (Intent.ACTION_VIEW.equals(caller.getAction()) && callParameter != null)
|
||||||
|
{
|
||||||
|
String refStr = ConnectionReference.getFileReference(callParameter.getPath());
|
||||||
|
Bundle bundle = new Bundle();
|
||||||
|
bundle.putString(BookmarkActivity.PARAM_CONNECTION_REFERENCE, refStr);
|
||||||
|
|
||||||
|
Intent bookmarkIntent = new Intent(this.getApplicationContext(), BookmarkActivity.class);
|
||||||
|
bookmarkIntent.putExtras(bundle);
|
||||||
|
startActivity(bookmarkIntent);
|
||||||
|
}
|
||||||
|
|
||||||
// load views
|
// load views
|
||||||
clearTextButton = (Button) findViewById(R.id.clear_search_btn);
|
clearTextButton = (Button) findViewById(R.id.clear_search_btn);
|
||||||
superBarEditText = (EditText) findViewById(R.id.superBarEditText);
|
superBarEditText = (EditText) findViewById(R.id.superBarEditText);
|
||||||
|
@ -0,0 +1,101 @@
|
|||||||
|
/*
|
||||||
|
Simple .RDP file parser
|
||||||
|
|
||||||
|
Copyright 2013 Blaz Bacnik
|
||||||
|
|
||||||
|
This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0.
|
||||||
|
If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package com.freerdp.freerdpcore.utils;
|
||||||
|
|
||||||
|
import java.io.BufferedReader;
|
||||||
|
import java.io.FileReader;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.Locale;
|
||||||
|
|
||||||
|
public class RDPFileParser {
|
||||||
|
|
||||||
|
private static final int MAX_ERRORS = 20;
|
||||||
|
private static final int MAX_LINES = 500;
|
||||||
|
|
||||||
|
private HashMap<String, Object> options;
|
||||||
|
|
||||||
|
private void init()
|
||||||
|
{
|
||||||
|
options = new HashMap<String, Object>();
|
||||||
|
}
|
||||||
|
|
||||||
|
public RDPFileParser()
|
||||||
|
{
|
||||||
|
init();
|
||||||
|
}
|
||||||
|
|
||||||
|
public RDPFileParser(String filename) throws IOException
|
||||||
|
{
|
||||||
|
init();
|
||||||
|
parse(filename);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void parse(String filename) throws IOException
|
||||||
|
{
|
||||||
|
BufferedReader br = new BufferedReader(new FileReader(filename));
|
||||||
|
String line = null;
|
||||||
|
|
||||||
|
int errors = 0;
|
||||||
|
int lines = 0;
|
||||||
|
boolean ok;
|
||||||
|
|
||||||
|
while ((line = br.readLine()) != null)
|
||||||
|
{
|
||||||
|
lines++; ok = false;
|
||||||
|
|
||||||
|
if (errors > MAX_ERRORS || lines > MAX_LINES)
|
||||||
|
throw new IOException("Parsing limits exceeded");
|
||||||
|
|
||||||
|
String[] fields = line.split(":", 3);
|
||||||
|
|
||||||
|
if (fields.length == 3)
|
||||||
|
{
|
||||||
|
if (fields[1].equals("s"))
|
||||||
|
{
|
||||||
|
options.put(fields[0].toLowerCase(Locale.ENGLISH), fields[2]);
|
||||||
|
ok = true;
|
||||||
|
}
|
||||||
|
else if (fields[1].equals("i"))
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
Integer i = Integer.parseInt(fields[2]);
|
||||||
|
options.put(fields[0].toLowerCase(Locale.ENGLISH), i);
|
||||||
|
ok = true;
|
||||||
|
}
|
||||||
|
catch (NumberFormatException e) { }
|
||||||
|
}
|
||||||
|
else if (fields[1].equals("b"))
|
||||||
|
{
|
||||||
|
ok = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!ok) errors++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getString(String optionName)
|
||||||
|
{
|
||||||
|
if (options.get(optionName) instanceof String)
|
||||||
|
return (String) options.get(optionName);
|
||||||
|
else
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Integer getInteger(String optionName)
|
||||||
|
{
|
||||||
|
if (options.get(optionName) instanceof Integer)
|
||||||
|
return (Integer) options.get(optionName);
|
||||||
|
else
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
@ -23,6 +23,21 @@
|
|||||||
<action android:name="android.intent.action.MAIN"/>
|
<action android:name="android.intent.action.MAIN"/>
|
||||||
<category android:name="android.intent.category.LAUNCHER"/>
|
<category android:name="android.intent.category.LAUNCHER"/>
|
||||||
</intent-filter>
|
</intent-filter>
|
||||||
|
<intent-filter>
|
||||||
|
<action android:name="android.intent.action.VIEW" />
|
||||||
|
<category android:name="android.intent.category.DEFAULT" />
|
||||||
|
<data
|
||||||
|
android:scheme="file"
|
||||||
|
android:mimeType="application/x-rdp" />
|
||||||
|
</intent-filter>
|
||||||
|
<intent-filter>
|
||||||
|
<action android:name="android.intent.action.VIEW" />
|
||||||
|
<category android:name="android.intent.category.DEFAULT" />
|
||||||
|
<data
|
||||||
|
android:scheme="file"
|
||||||
|
android:pathPattern=".*\\.rdp"
|
||||||
|
android:mimeType="*/*" />
|
||||||
|
</intent-filter>
|
||||||
</activity>
|
</activity>
|
||||||
|
|
||||||
<!-- Session request handler activity - used for search and internally to start sessions -->
|
<!-- Session request handler activity - used for search and internally to start sessions -->
|
||||||
|
Loading…
Reference in New Issue
Block a user