Merge pull request #1212 from mfleisz/andrdskredir

Android: Added SDCard redirection support
This commit is contained in:
Martin Fleisz 2013-04-26 02:15:01 -07:00
commit 286eb1119e
17 changed files with 185 additions and 45 deletions

View File

@ -3,11 +3,6 @@ set(OPTION_DEFAULT OFF)
set(OPTION_CLIENT_DEFAULT ON) set(OPTION_CLIENT_DEFAULT ON)
set(OPTION_SERVER_DEFAULT OFF) set(OPTION_SERVER_DEFAULT OFF)
if(ANDROID)
set(OPTION_CLIENT_DEFAULT OFF)
set(OPTION_SERVER_DEFAULT OFF)
endif()
define_channel_options(NAME "drive" TYPE "device" define_channel_options(NAME "drive" TYPE "device"
DESCRIPTION "Drive Redirection Virtual Channel Extension" DESCRIPTION "Drive Redirection Virtual Channel Extension"
SPECIFICATIONS "[MS-RDPEFS]" SPECIFICATIONS "[MS-RDPEFS]"

View File

@ -462,7 +462,11 @@ BOOL drive_file_set_information(DRIVE_FILE* file, UINT32 FsInformationClass, UIN
tv[1].tv_usec = 0; tv[1].tv_usec = 0;
#ifndef WIN32 #ifndef WIN32
/* TODO on win32 */ /* TODO on win32 */
futimes(file->fd, tv); #ifdef ANDROID
utimes(file->fullpath, tv);
#else
futimes(file->fd, tv);
#endif
if (FileAttributes > 0) if (FileAttributes > 0)
{ {

View File

@ -63,6 +63,12 @@ typedef UINT32 mode_t;
#define FSTAT fstat #define FSTAT fstat
#define STATVFS statvfs #define STATVFS statvfs
#define O_LARGEFILE 0 #define O_LARGEFILE 0
#elif defined(ANDROID)
#define STAT stat
#define OPEN open
#define LSEEK lseek
#define FSTAT fstat
#define STATVFS statfs
#else #else
#define STAT stat64 #define STAT stat64
#define OPEN open64 #define OPEN open64

View File

@ -407,7 +407,11 @@ static void drive_process_irp_query_volume_information(DRIVE_DEVICE* disk, IRP*
stream_write_UINT32(output, 17 + length); /* Length */ stream_write_UINT32(output, 17 + length); /* Length */
stream_check_size(output, 17 + length); stream_check_size(output, 17 + length);
stream_write_UINT64(output, FILE_TIME_SYSTEM_TO_RDP(st.st_ctime)); /* VolumeCreationTime */ stream_write_UINT64(output, FILE_TIME_SYSTEM_TO_RDP(st.st_ctime)); /* VolumeCreationTime */
#ifdef ANDROID
stream_write_UINT32(output, svfst.f_fsid.__val[0]); /* VolumeSerialNumber */
#else
stream_write_UINT32(output, svfst.f_fsid); /* VolumeSerialNumber */ stream_write_UINT32(output, svfst.f_fsid); /* VolumeSerialNumber */
#endif
stream_write_UINT32(output, length); /* VolumeLabelLength */ stream_write_UINT32(output, length); /* VolumeLabelLength */
stream_write_BYTE(output, 0); /* SupportsObjects */ stream_write_BYTE(output, 0); /* SupportsObjects */
/* Reserved(1), MUST NOT be added! */ /* Reserved(1), MUST NOT be added! */
@ -434,7 +438,11 @@ static void drive_process_irp_query_volume_information(DRIVE_DEVICE* disk, IRP*
FILE_CASE_SENSITIVE_SEARCH | FILE_CASE_SENSITIVE_SEARCH |
FILE_CASE_PRESERVED_NAMES | FILE_CASE_PRESERVED_NAMES |
FILE_UNICODE_ON_DISK); /* FileSystemAttributes */ FILE_UNICODE_ON_DISK); /* FileSystemAttributes */
#ifdef ANDROID
stream_write_UINT32(output, 255); /* MaximumComponentNameLength */
#else
stream_write_UINT32(output, svfst.f_namemax/*510*/); /* MaximumComponentNameLength */ stream_write_UINT32(output, svfst.f_namemax/*510*/); /* MaximumComponentNameLength */
#endif
stream_write_UINT32(output, length); /* FileSystemNameLength */ stream_write_UINT32(output, length); /* FileSystemNameLength */
stream_write(output, outStr, length); /* FileSystemName (Unicode) */ stream_write(output, outStr, length); /* FileSystemName (Unicode) */
free(outStr); free(outStr);

View File

@ -9,6 +9,8 @@
<uses-sdk android:targetSdkVersion="8" android:minSdkVersion="8"/> <uses-sdk android:targetSdkVersion="8" android:minSdkVersion="8"/>
<uses-permission android:name="android.permission.INTERNET"/> <uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<supports-screens android:anyDensity="true" android:smallScreens="true" android:normalScreens="true" android:largeScreens="true" /> <supports-screens android:anyDensity="true" android:smallScreens="true" android:normalScreens="true" android:largeScreens="true" />
<application> <application>

View File

@ -20,6 +20,8 @@
#include <sys/select.h> #include <sys/select.h>
#include <freerdp/codec/rfx.h> #include <freerdp/codec/rfx.h>
#include <freerdp/channels/channels.h> #include <freerdp/channels/channels.h>
#include <freerdp/client/channels.h>
#include <freerdp/client/cmdline.h>
#include <freerdp/gdi/gdi.h> #include <freerdp/gdi/gdi.h>
#include <freerdp/utils/event.h> #include <freerdp/utils/event.h>
#include <freerdp/constants.h> #include <freerdp/constants.h>
@ -119,7 +121,8 @@ BOOL android_pre_connect(freerdp* instance)
settings->FrameAcknowledge = 10; settings->FrameAcknowledge = 10;
freerdp_channels_load_plugin(instance->context->channels, instance->settings, "tsxlc", NULL); freerdp_register_addin_provider(freerdp_channels_load_static_addin_entry, 0);
freerdp_client_load_addins(instance->context->channels, instance->settings);
freerdp_channels_pre_connect(instance->context->channels, instance); freerdp_channels_pre_connect(instance->context->channels, instance);
@ -729,6 +732,22 @@ JNIEXPORT void JNICALL jni_freerdp_set_advanced_settings(JNIEnv *env, jclass cls
(*env)->ReleaseStringUTFChars(env, jWorkDir, work_dir); (*env)->ReleaseStringUTFChars(env, jWorkDir, work_dir);
} }
JNIEXPORT void JNICALL jni_freerdp_set_drive_redirection(JNIEnv *env, jclass cls, jint instance, jstring jpath)
{
freerdp* inst = (freerdp*)instance;
rdpSettings * settings = inst->settings;
char* args[] = {"drive", "Android", ""};
const jbyte *path = (*env)->GetStringUTFChars(env, jpath, NULL);
DEBUG_ANDROID("drive redirect: %s", (char*)path);
args[2] = (char*)path;
freerdp_client_add_device_channel(settings, 3, args);
settings->DeviceRedirection = TRUE;
(*env)->ReleaseStringUTFChars(env, jpath, path);
}
void copy_pixel_buffer(UINT8* dstBuf, UINT8* srcBuf, int x, int y, int width, int height, int wBuf, int hBuf, int bpp) void copy_pixel_buffer(UINT8* dstBuf, UINT8* srcBuf, int x, int y, int width, int height, int wBuf, int hBuf, int bpp)
{ {
int i, j; int i, j;

View File

@ -42,6 +42,7 @@ JNIEXPORT void JNICALL jni_freerdp_set_connection_info(JNIEnv *env, jclass cls,
JNIEXPORT void JNICALL jni_freerdp_set_performance_flags(JNIEnv *env, jclass cls, jint instance, jboolean remotefx, jboolean disableWallpaper, jboolean disableFullWindowDrag, JNIEXPORT void JNICALL jni_freerdp_set_performance_flags(JNIEnv *env, jclass cls, jint instance, jboolean remotefx, jboolean disableWallpaper, jboolean disableFullWindowDrag,
jboolean disableMenuAnimations, jboolean disableTheming, jboolean enableFontSmoothing, jboolean enableDesktopComposition); jboolean disableMenuAnimations, jboolean disableTheming, jboolean enableFontSmoothing, jboolean enableDesktopComposition);
JNIEXPORT void JNICALL jni_freerdp_set_advanced_settings(JNIEnv *env, jclass cls, jint instance, jstring jRemoteProgram, jstring jWorkDir); JNIEXPORT void JNICALL jni_freerdp_set_advanced_settings(JNIEnv *env, jclass cls, jint instance, jstring jRemoteProgram, jstring jWorkDir);
JNIEXPORT void JNICALL jni_freerdp_set_drive_redirection(JNIEnv *env, jclass cls, jint instance, jstring jpath);
JNIEXPORT void JNICALL jni_freerdp_set_data_directory(JNIEnv *env, jclass cls, jint instance, jstring jdirectory); JNIEXPORT void JNICALL jni_freerdp_set_data_directory(JNIEnv *env, jclass cls, jint instance, jstring jdirectory);
JNIEXPORT jboolean JNICALL jni_freerdp_update_graphics(JNIEnv *env, jclass cls, jint instance, jobject bitmap, jint x, jint y, jint width, jint height); JNIEXPORT jboolean JNICALL jni_freerdp_update_graphics(JNIEnv *env, jclass cls, jint instance, jobject bitmap, jint x, jint y, jint width, jint height);
JNIEXPORT void JNICALL jni_freerdp_send_cursor_event(JNIEnv *env, jclass cls, jint instance, jint x, jint y, jint flags); JNIEXPORT void JNICALL jni_freerdp_send_cursor_event(JNIEnv *env, jclass cls, jint instance, jint x, jint y, jint flags);

View File

@ -70,6 +70,12 @@ JNIEXPORT void JNICALL Java_com_freerdp_freerdpcore_services_LibFreeRDP_freerdp_
jni_freerdp_set_performance_flags(env, cls, instance, remotefx, disableWallpaper, disableFullWindowDrag, disableMenuAnimations, disableTheming, enableFontSmoothing, enableDesktopComposition); jni_freerdp_set_performance_flags(env, cls, instance, remotefx, disableWallpaper, disableFullWindowDrag, disableMenuAnimations, disableTheming, enableFontSmoothing, enableDesktopComposition);
} }
JNIEXPORT void JNICALL Java_com_freerdp_freerdpcore_services_LibFreeRDP_freerdp_1set_1drive_1redirection
(JNIEnv *env, jclass cls, jint inst, jstring path)
{
jni_freerdp_set_drive_redirection(env, cls, inst, path);
}
JNIEXPORT jboolean JNICALL Java_com_freerdp_freerdpcore_services_LibFreeRDP_freerdp_1update_1graphics( JNIEXPORT jboolean JNICALL Java_com_freerdp_freerdpcore_services_LibFreeRDP_freerdp_1update_1graphics(
JNIEnv *env, jclass cls, jint instance, jobject bitmap, jint x, jint y, jint width, jint height) JNIEnv *env, jclass cls, jint instance, jobject bitmap, jint x, jint y, jint width, jint height)
{ {

View File

@ -79,6 +79,14 @@ JNIEXPORT void JNICALL Java_com_freerdp_freerdpcore_services_LibFreeRDP_freerdp_
JNIEXPORT void JNICALL Java_com_freerdp_freerdpcore_services_LibFreeRDP_freerdp_1set_1data_1directory JNIEXPORT void JNICALL Java_com_freerdp_freerdpcore_services_LibFreeRDP_freerdp_1set_1data_1directory
(JNIEnv *, jclass, jint, jstring); (JNIEnv *, jclass, jint, jstring);
/*
* Class: com_freerdp_freerdpcore_services_LibFreeRDP
* Method: freerdp_set_drive_redirection
* Signature: (ILjava/lang/String;)V
*/
JNIEXPORT void JNICALL Java_com_freerdp_freerdpcore_services_LibFreeRDP_freerdp_1set_1drive_1redirection
(JNIEnv *, jclass, jint, jstring);
/* /*
* Class: com_freerdp_freerdpcore_services_LibFreeRDP * Class: com_freerdp_freerdpcore_services_LibFreeRDP
* Method: freerdp_update_graphics * Method: freerdp_update_graphics

View File

@ -28,7 +28,7 @@
<string name="section_bookmarks">Conexión Manual</string> <string name="section_bookmarks">Conexión Manual</string>
<string name="section_active_sessions">Sesiones Activas</string> <string name="section_active_sessions">Sesiones Activas</string>
<!-- Search strings --> <!-- Search strings -->
<string name="search_hint">Connectarse a iWinCloud</string> <string name="search_hint">Connect to Computer</string>
<!-- List placeholder labels --> <!-- List placeholder labels -->
<string name="list_placeholder_login">Login</string> <string name="list_placeholder_login">Login</string>
<string name="list_placeholder_no_servers">No hay escritorios virtuales</string> <string name="list_placeholder_no_servers">No hay escritorios virtuales</string>
@ -37,13 +37,13 @@
<string name="list_placeholder_connection_error">Conexión perdida</string> <string name="list_placeholder_connection_error">Conexión perdida</string>
<string name="list_placeholder_wrong_password">Contraseña equivocada</string> <string name="list_placeholder_wrong_password">Contraseña equivocada</string>
<string name="list_placeholder_invalid_username">Usuario Invalido</string> <string name="list_placeholder_invalid_username">Usuario Invalido</string>
<string name="list_placeholder_add_bookmark">Agregar escritorio virtual de iWinCloud</string> <string name="list_placeholder_add_bookmark">Add Connection</string>
<!-- Bookmark settings strings --> <!-- Bookmark settings strings -->
<string name="settings_cat_host">Host</string> <string name="settings_cat_host">Host</string>
<string name="settings_label">Su nombre</string> <string name="settings_label">Su nombre</string>
<string name="settings_hostname">IP</string> <string name="settings_hostname">IP</string>
<string name="settings_port">Puerto</string> <string name="settings_port">Puerto</string>
<string name="settings_cat_credentials">Credenciales de iWinCloud</string> <string name="settings_cat_credentials">Credenciales</string>
<string name="settings_credentials">Credenciales</string> <string name="settings_credentials">Credenciales</string>
<string name="settings_username">Usuario</string> <string name="settings_username">Usuario</string>
<string name="settings_password">Contraseña</string> <string name="settings_password">Contraseña</string>
@ -105,6 +105,7 @@
<string name="settings_enable_3g_settings">Configuracion 3G</string> <string name="settings_enable_3g_settings">Configuracion 3G</string>
<string name="settings_screen_3g">Pantalla 3G</string> <string name="settings_screen_3g">Pantalla 3G</string>
<string name="settings_performance_3g">Rendimiento 3G</string> <string name="settings_performance_3g">Rendimiento 3G</string>
<string name="settings_redirect_sdcard">Redirect SDCard</string>
<string name="settings_security">Seguridad</string> <string name="settings_security">Seguridad</string>
<string-array name="security_array"> <string-array name="security_array">
<item>Automatico</item> <item>Automatico</item>
@ -141,28 +142,28 @@
<!-- Activity titles --> <!-- Activity titles -->
<string name="title_bookmark_settings">Configuración de la conexión</string> <string name="title_bookmark_settings">Configuración de la conexión</string>
<string name="title_application_settings">Configuración</string> <string name="title_application_settings">Configuración</string>
<string name="title_home">iWinCloud - iWinCloud para Android</string> <string name="title_home">aFreeRDP - aFreeRDP para Android</string>
<string name="title_create_shortcut">Conexiones RDP</string> <string name="title_create_shortcut">Conexiones RDP</string>
<string name="title_help">Ayuda</string> <string name="title_help">Ayuda</string>
<string name="title_about">Sobre</string> <string name="title_about">Sobre</string>
<!-- Error message strings --> <!-- Error message strings -->
<string name="error_bookmark_incomplete_title">Cancelar sin guardar?</string> <string name="error_bookmark_incomplete_title">Cancelar sin guardar?</string>
<string name="error_bookmark_incomplete">Pulse el botón "Cancelar" para abortar! \ NPulse "Continuar" para especificar los campos obligatorios!</string> <string name="error_bookmark_incomplete">Pulse el botón "Cancelar" para abortar! \ NPulse "Continuar" para especificar los campos obligatorios!</string>
<string name="error_connection_failure">No se pudo establecer una conexión con iWinCloud!</string> <string name="error_connection_failure">Failed to establish a connection to the server!</string>
<!-- Info message strings --> <!-- Info message strings -->
<string name="info_capabilities_changed">Los ajustes de pantalla se han cambiado porque el escritorio virtual no es compatible con la configuración especificada!</string> <string name="info_capabilities_changed">Los ajustes de pantalla se han cambiado porque el escritorio virtual no es compatible con la configuración especificada!</string>
<string name="info_reset_success">Eliminado el cache del certificado!</string> <string name="info_reset_success">Eliminado el cache del certificado!</string>
<string name="info_reset_failed">No se pudo borrar el caché del certificado!</string> <string name="info_reset_failed">No se pudo borrar el caché del certificado!</string>
<!-- Dialog strings --> <!-- Dialog strings -->
<string name="dlg_title_verify_certificate">verificar el certificado</string> <string name="dlg_title_verify_certificate">verificar el certificado</string>
<string name="dlg_msg_verify_certificate">La identidad de su escritorio de iWinCloud debe ser verificada. ¿Desea conectarse de todos modos?</string> <string name="dlg_msg_verify_certificate">The identity of the remote computer cannot be verified. Do you want to connect anyway?</string>
<string name="dlg_title_credentials">Por favor, introduzca sus credenciales</string> <string name="dlg_title_credentials">Por favor, introduzca sus credenciales</string>
<string name="dlg_title_create_shortcut">Crear acceso directo</string> <string name="dlg_title_create_shortcut">Crear acceso directo</string>
<string name="dlg_msg_create_shortcut">Nombre corto:</string> <string name="dlg_msg_create_shortcut">Nombre corto:</string>
<string name="dlg_msg_connecting">Conectando ...</string> <string name="dlg_msg_connecting">Conectando ...</string>
<string name="dlg_msg_logging_in">Ingresando a ...</string> <string name="dlg_msg_logging_in">Ingresando a ...</string>
<string name="dlg_title_about">Sobre iWinCloud</string> <string name="dlg_title_about">Sobre aFreeRDP</string>
<string name="dlg_msg_about">Version: %1$s\n\u00A9 2012 iWinCloud LLc</string> <string name="dlg_msg_about">Version: %1$s\n\u00A9 2012 Thinstuff Technologies GmbH</string>
<string name="dlg_title_create_bookmark_after_qc">Guardar configuración de conexión?</string> <string name="dlg_title_create_bookmark_after_qc">Guardar configuración de conexión?</string>
<string name="dlg_msg_create_bookmark_after_qc">La configuración de conexión no se han guardado! ¿Quieres guardarlos?</string> <string name="dlg_msg_create_bookmark_after_qc">La configuración de conexión no se han guardado! ¿Quieres guardarlos?</string>
<string name="dlg_title_save_bookmark">Guardar Conexión</string> <string name="dlg_title_save_bookmark">Guardar Conexión</string>

View File

@ -104,6 +104,7 @@
<string name="settings_enable_3g_settings">"Paramètres 3G"</string> <string name="settings_enable_3g_settings">"Paramètres 3G"</string>
<string name="settings_screen_3g">"Écran 3G"</string> <string name="settings_screen_3g">"Écran 3G"</string>
<string name="settings_performance_3g">"Performance 3G"</string> <string name="settings_performance_3g">"Performance 3G"</string>
<string name="settings_redirect_sdcard">"Redirect SDCard"</string>
<string name="settings_security">"Securité"</string> <string name="settings_security">"Securité"</string>
<string-array name="security_array"> <string-array name="security_array">
<item>"Automatique"</item> <item>"Automatique"</item>

View File

@ -105,6 +105,7 @@
<string name="settings_enable_3g_settings">3G Settings</string> <string name="settings_enable_3g_settings">3G Settings</string>
<string name="settings_screen_3g">3G Screen</string> <string name="settings_screen_3g">3G Screen</string>
<string name="settings_performance_3g">3G Performance</string> <string name="settings_performance_3g">3G Performance</string>
<string name="settings_redirect_sdcard">Redirect SDCard</string>
<string name="settings_security">Security</string> <string name="settings_security">Security</string>
<string-array name="security_array"> <string-array name="security_array">
<item>Automatic</item> <item>Automatic</item>

View File

@ -28,6 +28,7 @@
android:data="preferences://performance_flags_3g" /> android:data="preferences://performance_flags_3g" />
</PreferenceScreen> </PreferenceScreen>
<CheckBoxPreference android:key="bookmark.redirect_sdcard" android:title="@string/settings_redirect_sdcard"/>
<com.freerdp.freerdpcore.utils.IntListPreference android:key="bookmark.security" android:title="@string/settings_security" android:entries="@array/security_array" android:entryValues="@array/security_values_array" /> <com.freerdp.freerdpcore.utils.IntListPreference android:key="bookmark.security" android:title="@string/settings_security" android:entries="@array/security_array" android:entryValues="@array/security_values_array" />
<EditTextPreference android:key="bookmark.remote_program" android:title="@string/settings_remote_program" android:summary="notepad.exe"/> <EditTextPreference android:key="bookmark.remote_program" android:title="@string/settings_remote_program" android:summary="notepad.exe"/>
<EditTextPreference android:key="bookmark.work_dir" android:title="@string/settings_work_dir"/> <EditTextPreference android:key="bookmark.work_dir" android:title="@string/settings_work_dir"/>

View File

@ -284,6 +284,7 @@ public class BookmarkBase implements Parcelable, Cloneable
private boolean enable3GSettings; private boolean enable3GSettings;
private ScreenSettings screen3G; private ScreenSettings screen3G;
private PerformanceFlags performance3G; private PerformanceFlags performance3G;
private boolean redirectSDCard;
private int security; private int security;
private boolean consoleMode; private boolean consoleMode;
private String remoteProgram; private String remoteProgram;
@ -297,6 +298,7 @@ public class BookmarkBase implements Parcelable, Cloneable
enable3GSettings = (parcel.readInt() == 1) ? true : false; enable3GSettings = (parcel.readInt() == 1) ? true : false;
screen3G = parcel.readParcelable(ScreenSettings.class.getClassLoader()); screen3G = parcel.readParcelable(ScreenSettings.class.getClassLoader());
performance3G = parcel.readParcelable(PerformanceFlags.class.getClassLoader()); performance3G = parcel.readParcelable(PerformanceFlags.class.getClassLoader());
redirectSDCard = (parcel.readInt() == 1) ? true : false;
security = parcel.readInt(); security = parcel.readInt();
consoleMode = (parcel.readInt() == 1) ? true : false; consoleMode = (parcel.readInt() == 1) ? true : false;
remoteProgram = parcel.readString(); remoteProgram = parcel.readString();
@ -307,6 +309,7 @@ public class BookmarkBase implements Parcelable, Cloneable
enable3GSettings = false; enable3GSettings = false;
screen3G = new ScreenSettings(); screen3G = new ScreenSettings();
performance3G = new PerformanceFlags(); performance3G = new PerformanceFlags();
redirectSDCard = false;
security = 0; security = 0;
consoleMode = false; consoleMode = false;
remoteProgram = ""; remoteProgram = "";
@ -337,6 +340,14 @@ public class BookmarkBase implements Parcelable, Cloneable
this.performance3G = performance3G; this.performance3G = performance3G;
} }
public void setRedirectSDCard(boolean redirectSDCard) {
this.redirectSDCard = redirectSDCard;
}
public boolean getRedirectSDCard() {
return redirectSDCard;
}
public void setSecurity(int security) { public void setSecurity(int security) {
this.security = security; this.security = security;
} }
@ -396,6 +407,7 @@ public class BookmarkBase implements Parcelable, Cloneable
out.writeInt(enable3GSettings ? 1 : 0); out.writeInt(enable3GSettings ? 1 : 0);
out.writeParcelable(screen3G, flags); out.writeParcelable(screen3G, flags);
out.writeParcelable(performance3G, flags); out.writeParcelable(performance3G, flags);
out.writeInt(redirectSDCard ? 1 : 0);
out.writeInt(security); out.writeInt(security);
out.writeInt(consoleMode ? 1 : 0); out.writeInt(consoleMode ? 1 : 0);
out.writeString(remoteProgram); out.writeString(remoteProgram);
@ -597,6 +609,7 @@ public class BookmarkBase implements Parcelable, Cloneable
editor.putBoolean("bookmark.perf_menu_animation_3g", advancedSettings.getPerformance3G().getMenuAnimations()); editor.putBoolean("bookmark.perf_menu_animation_3g", advancedSettings.getPerformance3G().getMenuAnimations());
editor.putBoolean("bookmark.perf_themes_3g", advancedSettings.getPerformance3G().getTheming()); editor.putBoolean("bookmark.perf_themes_3g", advancedSettings.getPerformance3G().getTheming());
editor.putBoolean("bookmark.redirect_sdcard", advancedSettings.getRedirectSDCard());
editor.putInt("bookmark.security", advancedSettings.getSecurity()); editor.putInt("bookmark.security", advancedSettings.getSecurity());
editor.putString("bookmark.remote_program", advancedSettings.getRemoteProgram()); editor.putString("bookmark.remote_program", advancedSettings.getRemoteProgram());
editor.putString("bookmark.work_dir", advancedSettings.getWorkDir()); editor.putString("bookmark.work_dir", advancedSettings.getWorkDir());
@ -638,6 +651,7 @@ public class BookmarkBase implements Parcelable, Cloneable
advancedSettings.getPerformance3G().setMenuAnimations(sharedPrefs.getBoolean("bookmark.perf_menu_animation_3g", false)); advancedSettings.getPerformance3G().setMenuAnimations(sharedPrefs.getBoolean("bookmark.perf_menu_animation_3g", false));
advancedSettings.getPerformance3G().setTheming(sharedPrefs.getBoolean("bookmark.perf_themes_3g", false)); advancedSettings.getPerformance3G().setTheming(sharedPrefs.getBoolean("bookmark.perf_themes_3g", false));
advancedSettings.setRedirectSDCard(sharedPrefs.getBoolean("bookmark.redirect_sdcard", false));
advancedSettings.setSecurity(sharedPrefs.getInt("bookmark.security", 0)); advancedSettings.setSecurity(sharedPrefs.getInt("bookmark.security", 0));
advancedSettings.setRemoteProgram(sharedPrefs.getString("bookmark.remote_program", "")); advancedSettings.setRemoteProgram(sharedPrefs.getString("bookmark.remote_program", ""));
advancedSettings.setWorkDir(sharedPrefs.getString("bookmark.work_dir", "")); advancedSettings.setWorkDir(sharedPrefs.getString("bookmark.work_dir", ""));

View File

@ -63,6 +63,7 @@ public abstract class BookmarkBaseGateway
values.put("screen_3g", rowid); values.put("screen_3g", rowid);
rowid = insertPerformanceFlags(db, bookmark.getAdvancedSettings().getPerformance3G()); rowid = insertPerformanceFlags(db, bookmark.getAdvancedSettings().getPerformance3G());
values.put("performance_3g", rowid); values.put("performance_3g", rowid);
values.put("redirect_sdcard", bookmark.getAdvancedSettings().getRedirectSDCard());
values.put("security", bookmark.getAdvancedSettings().getSecurity()); values.put("security", bookmark.getAdvancedSettings().getSecurity());
values.put("console_mode", bookmark.getAdvancedSettings().getConsoleMode()); values.put("console_mode", bookmark.getAdvancedSettings().getConsoleMode());
values.put("remote_program", bookmark.getAdvancedSettings().getRemoteProgram()); values.put("remote_program", bookmark.getAdvancedSettings().getRemoteProgram());
@ -98,6 +99,7 @@ public abstract class BookmarkBaseGateway
// update 3G screen and 3G performance settings settings // update 3G screen and 3G performance settings settings
updateScreenSettings3G(db, bookmark); updateScreenSettings3G(db, bookmark);
updatePerformanceFlags3G(db, bookmark); updatePerformanceFlags3G(db, bookmark);
values.put("redirect_sdcard", bookmark.getAdvancedSettings().getRedirectSDCard());
values.put("security", bookmark.getAdvancedSettings().getSecurity()); values.put("security", bookmark.getAdvancedSettings().getSecurity());
values.put("console_mode", bookmark.getAdvancedSettings().getConsoleMode()); values.put("console_mode", bookmark.getAdvancedSettings().getConsoleMode());
values.put("remote_program", bookmark.getAdvancedSettings().getRemoteProgram()); values.put("remote_program", bookmark.getAdvancedSettings().getRemoteProgram());
@ -216,6 +218,7 @@ public abstract class BookmarkBaseGateway
// advanced settings // advanced settings
columns.add("enable_3g_settings"); columns.add("enable_3g_settings");
columns.add("redirect_sdcard");
columns.add("security"); columns.add("security");
columns.add("console_mode"); columns.add("console_mode");
columns.add("remote_program"); columns.add("remote_program");
@ -273,6 +276,7 @@ public abstract class BookmarkBaseGateway
bookmark.getAdvancedSettings().setEnable3GSettings(cursor.getInt(cursor.getColumnIndex("enable_3g_settings")) == 0 ? false : true); bookmark.getAdvancedSettings().setEnable3GSettings(cursor.getInt(cursor.getColumnIndex("enable_3g_settings")) == 0 ? false : true);
readScreenSettings3G(bookmark, cursor); readScreenSettings3G(bookmark, cursor);
readPerformanceFlags3G(bookmark, cursor); readPerformanceFlags3G(bookmark, cursor);
bookmark.getAdvancedSettings().setRedirectSDCard(cursor.getInt(cursor.getColumnIndex("redirect_sdcard")) == 0 ? false : true);
bookmark.getAdvancedSettings().setSecurity(cursor.getInt(cursor.getColumnIndex("security"))); bookmark.getAdvancedSettings().setSecurity(cursor.getInt(cursor.getColumnIndex("security")));
bookmark.getAdvancedSettings().setConsoleMode(cursor.getInt(cursor.getColumnIndex("console_mode")) == 0 ? false : true); bookmark.getAdvancedSettings().setConsoleMode(cursor.getInt(cursor.getColumnIndex("console_mode")) == 0 ? false : true);
bookmark.getAdvancedSettings().setRemoteProgram(cursor.getString(cursor.getColumnIndex("remote_program"))); bookmark.getAdvancedSettings().setRemoteProgram(cursor.getString(cursor.getColumnIndex("remote_program")));

View File

@ -9,14 +9,20 @@
package com.freerdp.freerdpcore.services; package com.freerdp.freerdpcore.services;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import android.content.Context; import android.content.Context;
import android.provider.BaseColumns; import android.provider.BaseColumns;
import android.util.Log;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper; import android.database.sqlite.SQLiteOpenHelper;
public class BookmarkDB extends SQLiteOpenHelper public class BookmarkDB extends SQLiteOpenHelper
{ {
private static final int DB_VERSION = 1; private static final int DB_VERSION = 2;
private static final String DB_NAME = "bookmarks.db"; private static final String DB_NAME = "bookmarks.db";
public static final String ID = BaseColumns._ID; public static final String ID = BaseColumns._ID;
@ -52,33 +58,7 @@ public class BookmarkDB extends SQLiteOpenHelper
db.execSQL(sqlPerformanceFlags); db.execSQL(sqlPerformanceFlags);
String sqlManualBookmarks = String sqlManualBookmarks = getManualBookmarksCreationString();
"CREATE TABLE tbl_manual_bookmarks ("
+ ID + " INTEGER PRIMARY KEY, "
+ "label TEXT NOT NULL, "
+ "hostname TEXT NOT NULL, "
+ "username TEXT NOT NULL, "
+ "password TEXT, "
+ "domain TEXT, "
+ "port TEXT, "
+ "screen_settings INTEGER NOT NULL, "
+ "performance_flags INTEGER NOT NULL, "
+ "enable_3g_settings INTEGER DEFAULT 0, "
+ "screen_3g INTEGER NOT NULL, "
+ "performance_3g INTEGER NOT NULL, "
+ "security INTEGER, "
+ "remote_program TEXT, "
+ "work_dir TEXT, "
+ "console_mode INTEGER, "
+ "FOREIGN KEY(screen_settings) REFERENCES tbl_screen_settings(" + ID + "), "
+ "FOREIGN KEY(performance_flags) REFERENCES tbl_performance_flags(" + ID + "), "
+ "FOREIGN KEY(screen_3g) REFERENCES tbl_screen_settings(" + ID + "), "
+ "FOREIGN KEY(performance_3g) REFERENCES tbl_performance_flags(" + ID + ") "
+ ");";
db.execSQL(sqlManualBookmarks); db.execSQL(sqlManualBookmarks);
@ -120,6 +100,7 @@ public class BookmarkDB extends SQLiteOpenHelper
+ "performance_flags, " + "performance_flags, "
+ "screen_3g, " + "screen_3g, "
+ "performance_3g, " + "performance_3g, "
+ "redirect_sdcard, "
+ "security, " + "security, "
+ "remote_program, " + "remote_program, "
+ "work_dir, " + "work_dir, "
@ -131,12 +112,94 @@ public class BookmarkDB extends SQLiteOpenHelper
+ "'', " + "'', "
+ "'', " + "'', "
+ "3389, " + "3389, "
+ "1, 1, 2, 2, 0, '', '', 0);"; + "1, 1, 2, 2, 0, 0, '', '', 0);";
db.execSQL(sqlInsertDefaultSessionEntry); db.execSQL(sqlInsertDefaultSessionEntry);
} }
private String getManualBookmarksCreationString()
{
return (
"CREATE TABLE IF NOT EXISTS tbl_manual_bookmarks ("
+ ID + " INTEGER PRIMARY KEY, "
+ "label TEXT NOT NULL, "
+ "hostname TEXT NOT NULL, "
+ "username TEXT NOT NULL, "
+ "password TEXT, "
+ "domain TEXT, "
+ "port TEXT, "
+ "screen_settings INTEGER NOT NULL, "
+ "performance_flags INTEGER NOT NULL, "
+ "enable_3g_settings INTEGER DEFAULT 0, "
+ "screen_3g INTEGER NOT NULL, "
+ "performance_3g INTEGER NOT NULL, "
+ "redirect_sdcard INTEGER, "
+ "security INTEGER, "
+ "remote_program TEXT, "
+ "work_dir TEXT, "
+ "console_mode INTEGER, "
+ "FOREIGN KEY(screen_settings) REFERENCES tbl_screen_settings(" + ID + "), "
+ "FOREIGN KEY(performance_flags) REFERENCES tbl_performance_flags(" + ID + "), "
+ "FOREIGN KEY(screen_3g) REFERENCES tbl_screen_settings(" + ID + "), "
+ "FOREIGN KEY(performance_3g) REFERENCES tbl_performance_flags(" + ID + ") "
+ ");");
}
// from http://stackoverflow.com/questions/3424156/upgrade-sqlite-database-from-one-version-to-another
@Override @Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)
{ {
db.beginTransaction();
// run a table creation with if not exists (we are doing an upgrade, so the table might
// not exists yet, it will fail alter and drop)
db.execSQL(getManualBookmarksCreationString());
// put in a list the existing columns
List<String> columns = GetColumns(db, "tbl_manual_bookmarks");
// backup table
db.execSQL("ALTER TABLE tbl_manual_bookmarks RENAME TO 'temp_tbl_manual_bookmarks'");
// create new table (with new scheme)
db.execSQL(getManualBookmarksCreationString());
// get the intersection with the new columns, this time columns taken from the upgraded table
columns.retainAll(GetColumns(db, "tbl_manual_bookmarks"));
// restore data
String cols = joinStrings(columns, ",");
db.execSQL(String.format("INSERT INTO %s (%s) SELECT %s from 'temp_%s", "tbl_manual_bookmarks", cols, cols, "tbl_manual_bookmarks'"));
// remove backup table
db.execSQL("DROP table 'temp_tbl_manual_bookmarks'");
db.setTransactionSuccessful();
db.endTransaction();
} }
private static List<String> GetColumns(SQLiteDatabase db, String tableName) {
List<String> ar = null;
Cursor c = null;
try {
c = db.rawQuery("SELECT * FROM " + tableName + " LIMIT 1", null);
if (c != null) {
ar = new ArrayList<String>(Arrays.asList(c.getColumnNames()));
}
} catch (Exception e) {
Log.v(tableName, e.getMessage(), e);
e.printStackTrace();
} finally {
if (c != null)
c.close();
}
return ar;
}
private static String joinStrings(List<String> list, String delim) {
StringBuilder buf = new StringBuilder();
int num = list.size();
for (int i = 0; i < num; i++) {
if (i != 0)
buf.append(delim);
buf.append((String) list.get(i));
}
return buf.toString();
}
} }

View File

@ -39,6 +39,8 @@ public class LibFreeRDP
private static native void freerdp_set_data_directory(int inst, String directory); private static native void freerdp_set_data_directory(int inst, String directory);
private static native void freerdp_set_drive_redirection(int inst, String path);
private static native boolean freerdp_update_graphics(int inst, private static native boolean freerdp_update_graphics(int inst,
Bitmap bitmap, int x, int y, int width, int height); Bitmap bitmap, int x, int y, int width, int height);
@ -143,6 +145,10 @@ public class LibFreeRDP
BookmarkBase.AdvancedSettings advancedSettings = bookmark.getAdvancedSettings(); BookmarkBase.AdvancedSettings advancedSettings = bookmark.getAdvancedSettings();
freerdp_set_advanced_settings(inst, advancedSettings.getRemoteProgram(), advancedSettings.getWorkDir()); freerdp_set_advanced_settings(inst, advancedSettings.getRemoteProgram(), advancedSettings.getWorkDir());
// drive redirection enabled?
if (advancedSettings.getRedirectSDCard())
freerdp_set_drive_redirection(inst, android.os.Environment.getExternalStorageDirectory().getPath());
return true; return true;
} }