freerdp: merge with master

This commit is contained in:
Marc-André Moreau
2013-04-09 10:18:03 -04:00
63 changed files with 1214 additions and 1197 deletions

5
.gitignore vendored
View File

@@ -43,6 +43,11 @@ client/X11/xfreerdp.1
*.xcodeproj/
DerivedData/
# iOS
FreeRDP.build
Debug-*
Release-*
# Windows
*.vcxproj
*.vcxproj.*

View File

@@ -178,13 +178,14 @@ if(WIN32)
endif()
if(IOS)
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -isysroot ${CMAKE_IOS_SDK_ROOT}")
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -isysroot ${CMAKE_IOS_SDK_ROOT} -g")
endif()
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DWINPR_EXPORTS")
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DFREERDP_EXPORTS")
# Include files
if(NOT IOS)
check_include_files(fcntl.h HAVE_FCNTL_H)
check_include_files(unistd.h HAVE_UNISTD_H)
check_include_files(stdint.h HAVE_STDINT_H)
@@ -192,8 +193,19 @@ check_include_files(inttypes.h HAVE_INTTYPES_H)
check_include_files(sys/modem.h HAVE_SYS_MODEM_H)
check_include_files(sys/filio.h HAVE_SYS_FILIO_H)
check_include_files(sys/strtio.h HAVE_SYS_STRTIO_H)
else()
set(HAVE_FCNTL_H 1)
set(HAVE_UNISTD_H 1)
set(HAVE_STDINT_H 1)
set(HAVE_INTTYPES_H 1)
set(HAVE_SYS_FILIO_H 1)
endif()
if(NOT IOS)
check_struct_has_member("struct tm" tm_gmtoff time.h HAVE_TM_GMTOFF)
else()
set(HAVE_TM_GMTOFF 1)
endif()
# Mac OS X
if(APPLE)
@@ -202,7 +214,8 @@ if(APPLE)
message(STATUS "FREERDP_IOS_EXTERNAL_SSL_PATH not set! Required if openssl is not found in the iOS SDK (which usually isn't")
endif()
set(CMAKE_FIND_ROOT_PATH ${CMAKE_FIND_ROOT_PATH} ${FREERDP_IOS_EXTERNAL_SSL_PATH})
else()
set_property(GLOBAL PROPERTY XCODE_ATTRIBUTE_SKIP_INSTALL YES)
else()
if(IS_DIRECTORY /opt/local/include)
include_directories(/opt/local/include)
link_directories(/opt/local/lib)
@@ -229,7 +242,7 @@ if(ANDROID)
endif()
set(CMAKE_THREAD_PREFER_PTHREAD TRUE)
if(NOT ANDROID)
if(NOT IOS AND NOT ANDROID)
find_package(Threads REQUIRED)
endif()
@@ -298,6 +311,7 @@ endif()
if(APPLE)
set(DIRECTFB_FEATURE_TYPE "DISABLED")
set(FFMPEG_FEATURE_TYPE "OPTIONAL")
set(GSTREAMER_FEATURE_TYPE "OPTIONAL")
if(IOS)
set(X11_FEATURE_TYPE "DISABLED")
set(ALSA_FEATURE_TYPE "DISABLED")
@@ -410,6 +424,13 @@ endif()
# Sub-directories
if(WITH_THIRD_PARTY)
add_subdirectory(third-party)
if (NOT "${THIRD_PARTY_INCLUDES}" STREQUAL "")
include_directories(${THIRD_PARTY_INCLUDES})
endif()
endif()
add_subdirectory(include)
add_subdirectory(libfreerdp)
@@ -418,6 +439,10 @@ if(WITH_CHANNELS)
add_subdirectory(channels)
endif()
if (IOS)
set(CMAKE_OSX_DEPLOYMENT_TARGET "")
set(CMAKE_OSX_SYSROOT "iphoneos")
endif()
if(WITH_CLIENT)
add_subdirectory(client)
endif()
@@ -426,10 +451,6 @@ if(WITH_SERVER)
add_subdirectory(server)
endif()
if(WITH_THIRD_PARTY)
add_subdirectory(third-party)
endif()
# Packaging
SET(CPACK_BINARY_ZIP "ON")
@@ -536,4 +557,6 @@ if (ANDROID AND CMAKE_EXTRA_GENERATOR STREQUAL "Eclipse CDT4")
message(STATUS "Disabled CXX system defines for eclipse (workaround).")
endif()
include(CPack)

View File

@@ -57,9 +57,15 @@ if(WITH_FFMPEG)
add_channel_client_subsystem(${MODULE_PREFIX} ${CHANNEL_NAME} "ffmpeg" "decoder")
endif()
if(WITH_XRANDR)
if(GSTREAMER_FOUND)
if(WITH_GSTREAMER)
set(XRANDR_FEATURE_TYPE "REQUIRED")
set(XRANDR_FEATURE_PURPOSE "X11 randr")
set(XRANDR_FEATURE_DESCRIPTION "X11 randr extension")
find_feature(XRandR ${XRANDR_FEATURE_TYPE} ${XRANDR_FEATURE_PURPOSE} ${XRANDR_FEATURE_DESCRIPTION})
if (WITH_XRANDR)
add_channel_client_subsystem(${MODULE_PREFIX} ${CHANNEL_NAME} "gstreamer" "decoder")
else()
message(WARNING "Disabling tsmf gstreamer because XRandR wasn't found")
endif()
endif()

View File

@@ -536,8 +536,12 @@ JNIEXPORT void JNICALL jni_freerdp_set_data_directory(JNIEnv *env, jclass cls, j
free(settings->HomePath);
free(settings->ConfigPath);
int config_dir_len = strlen(directory) + 10; /* +9 chars for /.freerdp and +1 for \0 */
char* config_dir_buf = (char*)malloc(config_dir_len);
strcpy(config_dir_buf, directory);
strcat(config_dir_buf, "/.freerdp");
settings->HomePath = strdup(directory);
settings->ConfigPath = NULL;
settings->ConfigPath = config_dir_buf; /* will be freed by freerdp library */
(*env)->ReleaseStringUTFChars(env, jdirectory, directory);
}
@@ -597,6 +601,7 @@ JNIEXPORT void JNICALL jni_freerdp_set_connection_info(JNIEnv *env, jclass cls,
/* enable NSCodec */
settings->NSCodec = TRUE;
settings->BitmapCacheV3Enabled = TRUE;
switch ((int) security)
{

View File

@@ -61,16 +61,3 @@ if(BUILD_TESTING)
add_subdirectory(test)
endif()
if(IOS AND MONOLITHIC_BUILD AND (NOT BUILD_SHARED_LIBS))
# generate combined library
foreach(af ${${MODULE_PREFIX}_LIBS})
get_target_property(LOC ${af} LOCATION)
if ((NOT (${LOC} MATCHES ".*libfreerdp.a$")) AND (NOT (${LOC} MATCHES ".*libwinpr.a$")))
set(ALIST ${ALIST} ${LOC})
endif()
endforeach()
get_target_property(LOC ${MODULE_NAME} LOCATION)
set(ALIST ${ALIST} ${LOC})
message(${ALIST})
add_custom_command(TARGET ${MODULE_NAME} POST_BUILD COMMAND libtool -static -o libfreerdp-client-combined.a ${ALIST})
endif()

View File

@@ -29,6 +29,7 @@
#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>
@interface UIView (Toast)

View File

@@ -1,8 +1,7 @@
# FreeRDP: A Remote Desktop Protocol Implementation
# Android Client
# FreeRDP X11 Client
#
# Copyright 2012 Marc-Andre Moreau <marcandre.moreau@gmail.com>
# Copyright 2013 Martin Fleisz <mfleisz@thinstuff.at>
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
@@ -15,40 +14,122 @@
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
project(iFreeRDP)
set(IOS_SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR})
set(IOS_PACKAGE_NAME "iFreeRDP")
set(MODULE_NAME "iFreeRDP")
set(MODULE_PREFIX "IFREERDP_CLIENT")
set(APP_TYPE MACOSX_BUNDLE)
CONFIGURE_FILE(${CMAKE_CURRENT_SOURCE_DIR}/iFreeRDP.xcodeproj/project.pbxproj.cmake ${CMAKE_CURRENT_SOURCE_DIR}/iFreeRDP.xcodeproj/project.pbxproj @ONLY)
set(IOS_CLIENT_DIR ${CMAKE_CURRENT_SOURCE_DIR})
set(IOS_CLIENT_ADDITIONS_DIR ${IOS_CLIENT_DIR}/Additions)
set(IOS_CLIENT_CONTROLLERS_DIR ${IOS_CLIENT_DIR}/Controllers)
set(IOS_CLIENT_FREERDP_DIR ${IOS_CLIENT_DIR}/FreeRDP)
set(IOS_CLIENT_MISC_DIR ${IOS_CLIENT_DIR}/Misc)
set(IOS_CLIENT_MODELS_DIR ${IOS_CLIENT_DIR}/Models)
set(IOS_CLIENT_VIEWS_DIR ${IOS_CLIENT_DIR}/Views)
set(IOS_CLIENT_RESOURCES_DIR ${IOS_CLIENT_DIR}/Resources)
if(IOS_BUILD_OBJC)
# And isn't shiped with the android ndk/sdk so
# we need to find it on the local machine
SET(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER, BOTH)
find_program(XCODEBUILD_COMMAND xcodebuild)
SET(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER, ONLY)
include_directories(${IOS_CLIENT_DIR})
include_directories(${IOS_CLIENT_ADDITIONS_DIR})
include_directories(${IOS_CLIENT_CONTROLLERS_DIR})
include_directories(${IOS_CLIENT_FREERDP_DIR})
include_directories(${IOS_CLIENT_MISC_DIR})
include_directories(${IOS_CLIENT_MODELS_DIR})
include_directories(${IOS_CLIENT_VIEWS_DIR})
include_directories(${OPENSSL_INCLUDE_DIR})
if(XCODEBUILD_COMMAND STREQUAL "XCODEBUILD_COMMAND-NOTFOUND")
message(FATAL_ERROR "xcodebuild not found but required to build ios objective-c")
endif()
# Add sources
set(${MODULE_PREFIX}_SRCS
AppDelegate.m
AppDelegate.h
main.m)
if(IOS_BUILD_OBJC_DEBUG)
set(IOS_BUILD_TYPE "Debug")
else()
set(IOS_BUILD_TYPE "Release")
endif()
file(GLOB IOS_CLIENT_ADDITIONS_SRCS ${IOS_CLIENT_ADDITIONS_DIR}/*.m)
file(GLOB IOS_CLIENT_ADDITIONS_HDRS ${IOS_CLIENT_ADDITIONS_DIR}/*.h)
set(IOS_APP_OUTPUT_DIR "${IOS_SOURCE_DIR}/bin/${IOS_BUILD_TYPE}")
set(IOS_APP "${IOS_APP_OUTPUT_DIR}/${IOS_PACKAGE_NAME}.app")
# command to create the ios package
add_custom_command(
OUTPUT "${IOS_APP}"
COMMAND ${XCODEBUILD_COMMAND} -project "${IOS_SOURCE_DIR}/iFreeRDP.xcodeproj" -sdk ${CMAKE_IOS_SDK_ROOT} -configuration ${IOS_BUILD_TYPE} CONFIGURATION_BUILD_DIR="${IOS_APP_OUTPUT_DIR}"
WORKING_DIRECTORY "${IOS_SOURCE_DIR}"
MAIN_DEPENDENCY ${CMAKE_CURRENT_SOURCE_DIR}/iFreeRDP.xcodeproj/project.pbxproj
DEPENDS freerdp winpr
file(GLOB IOS_CLIENT_CONTROLLERS_SRCS ${IOS_CLIENT_CONTROLLERS_DIR}/*.m)
file(GLOB IOS_CLIENT_CONTROLLERS_HDRS ${IOS_CLIENT_CONTROLLERS_DIR}/*.h)
file(GLOB IOS_CLIENT_FREERDP_SRCS ${IOS_CLIENT_FREERDP_DIR}/*.m)
file(GLOB IOS_CLIENT_FREERDP_HDRS ${IOS_CLIENT_FREERDP_DIR}/*.h)
file(GLOB IOS_CLIENT_MISC_SRCS ${IOS_CLIENT_MISC_DIR}/*.m)
file(GLOB IOS_CLIENT_MISC_HDRS ${IOS_CLIENT_MISC_DIR}/*.h)
file(GLOB IOS_CLIENT_MODELS_SRCS ${IOS_CLIENT_MODELS_DIR}/*.m)
file(GLOB IOS_CLIENT_MODELS_HDRS ${IOS_CLIENT_MODELS_DIR}/*.h)
file(GLOB IOS_CLIENT_VIEWS_SRCS ${IOS_CLIENT_VIEWS_DIR}/*.m)
file(GLOB IOS_CLIENT_VIEWS_HDRS ${IOS_CLIENT_VIEWS_DIR}/*.h)
# add resources
file(GLOB IOS_CLIENT_RESOURCES_XIBS ${IOS_CLIENT_RESOURCES_DIR}/*.xib)
file(GLOB IOS_CLIENT_RESOURCES_PNGS ${IOS_CLIENT_RESOURCES_DIR}/*.png)
# Specify source grouping
source_group(Additions FILES ${IOS_CLIENT_ADDITIONS_SRCS} ${IOS_CLIENT_ADDITIONS_HDRS})
source_group(Controllers FILES ${IOS_CLIENT_CONTROLLERS_SRCS} ${IOS_CLIENT_CONTROLLERS_HDRS})
source_group(FreeRDP FILES ${IOS_CLIENT_FREERDP_SRCS} ${IOS_CLIENT_FREERDP_HDRS})
source_group(Misc FILES ${IOS_CLIENT_MISC_SRCS} ${IOS_CLIENT_MISC_HDRS})
source_group(Models FILES ${IOS_CLIENT_MODELS_SRCS} ${IOS_CLIENT_MODELS_HDRS})
source_group(Views FILES ${IOS_CLIENT_RESOURCES_XIBS} ${IOS_CLIENT_VIEWS_SRCS} ${IOS_CLIENT_VIEWS_HDRS})
source_group(Resources FILES ${IOS_CLIENT_RESOURCES_PNGS} ${IOS_CLIENT_RESOURCES_DIR}/about_page ${IOS_CLIENT_RESOURCES_DIR}/help_page ${IOS_CLIENT_RESOURCES_DIR}/en.lproj)
# import libraries
find_library(FOUNDATION_FRAMEWORK Foundation)
find_library(COREGRAPHICS_FRAMEWORK CoreGraphics)
find_library(SECURITY_FRAMEWORK Security)
find_library(UIKIT_FRAMEWORK UIKit)
find_library(SYSTEMCONFIGURATION_FRAMEWORK SystemConfiguration)
mark_as_advanced(FOUNDATION_FRAMEWORK COREGRAPHICS_FRAMEWORK SECURITY_FRAMEWORK UIKIT_FRAMEWORK SYSTEMCONFIGURATION_FRAMEWORK)
set(EXTRA_LIBS ${FOUNDATION_FRAMEWORK} ${COREGRAPHICS_FRAMEWORK} ${SECURITY_FRAMEWORK} ${UIKIT_FRAMEWORK} ${SYSTEMCONFIGURATION_FRAMEWORK})
set(${MODULE_NAME}_RESOURCES ${IOS_CLIENT_RESOURCES_XIBS})
set(${MODULE_NAME}_RESOURCES ${${MODULE_NAME}_RESOURCES} ${IOS_CLIENT_RESOURCES_PNGS})
set(${MODULE_NAME}_RESOURCES ${${MODULE_NAME}_RESOURCES} ${IOS_CLIENT_RESOURCES_DIR}/about_page ${IOS_CLIENT_RESOURCES_DIR}/help_page ${IOS_CLIENT_RESOURCES_DIR}/en.lproj)
set(${MODULE_NAME}_RESOURCES ${${MODULE_NAME}_RESOURCES} ${IOS_CLIENT_DIR}/Defaults.plist)
add_executable(${MODULE_NAME}
${APP_TYPE}
${${MODULE_PREFIX}_SRCS}
${IOS_CLIENT_ADDITIONS_SRCS} ${IOS_CLIENT_ADDITIONS_HDRS}
${IOS_CLIENT_CONTROLLERS_SRCS} ${IOS_CLIENT_CONTROLLERS_HDRS}
${IOS_CLIENT_FREERDP_SRCS} ${IOS_CLIENT_FREERDP_HDRS}
${IOS_CLIENT_MISC_SRCS} ${IOS_CLIENT_MISC_HDRS}
${IOS_CLIENT_MODELS_SRCS} ${IOS_CLIENT_MODELS_HDRS}
${IOS_CLIENT_VIEWS_SRCS} ${IOS_CLIENT_VIEWS_HDRS}
${${MODULE_NAME}_RESOURCES}
)
add_custom_target(ios-package ALL SOURCES "${IOS_APP}")
SET_DIRECTORY_PROPERTIES(PROPERTIES ADDITIONAL_MAKE_CLEAN_FILES "bin;build")
endif()
set_target_properties(${MODULE_NAME} PROPERTIES RESOURCE "${${MODULE_NAME}_RESOURCES}")
set(EXECUTABLE_NAME "\${EXECUTABLE_NAME}")
set_target_properties(${MODULE_NAME} PROPERTIES MACOSX_BUNDLE_INFO_PLIST ${IOS_CLIENT_DIR}/iFreeRDP.plist)
set_target_properties(${MODULE_NAME} PROPERTIES XCODE_ATTRIBUTE_IPHONEOS_DEPLOYMENT_TARGET "4.3")
set_target_properties(${MODULE_NAME} PROPERTIES XCODE_ATTRIBUTE_CLANG_CXX_LANGUAGE_STANDARD "gnu++0x")
set_target_properties(${MODULE_NAME} PROPERTIES XCODE_ATTRIBUTE_CLANG_CXX_LIBRARY "libc++")
set_target_properties(${MODULE_NAME} PROPERTIES XCODE_ATTRIBUTE_CLANG_ENABLE_OBJC_ARC NO)
set_target_properties(${MODULE_NAME} PROPERTIES XCODE_ATTRIBUTE_GCC_C_LANGUAGE_STANDARD "gnu99")
set_target_properties(${MODULE_NAME} PROPERTIES XCODE_ATTRIBUTE_TARGETED_DEVICE_FAMILY "1,2")
set_target_properties(${MODULE_NAME} PROPERTIES XCODE_ATTRIBUTE_COMBINE_HIDPI_IMAGES "NO")
set_target_properties(${MODULE_NAME} PROPERTIES XCODE_ATTRIBUTE_SKIP_INSTALL NO)
set_target_properties(${MODULE_NAME} PROPERTIES XCODE_ATTRIBUTE_INSTALL_PATH "/Applications")
set_target_properties(${MODULE_NAME} PROPERTIES XCODE_ATTRIBUTE_GCC_GENERATE_DEBUGGING_SYMBOLS YES)
set(${MODULE_PREFIX}_LIBS ${${MODULE_PREFIX}_LIBS} ${EXTRA_LIBS})
set(${MODULE_PREFIX}_LIBS ${${MODULE_PREFIX}_LIBS} freerdp-client)
set_complex_link_libraries(VARIABLE ${MODULE_PREFIX}_LIBS MONOLITHIC ${MONOLITHIC_BUILD}
MODULE freerdp
MODULES freerdp-core freerdp-gdi freerdp-locale freerdp-primitives freerdp-cache freerdp-utils)
set_complex_link_libraries(VARIABLE ${MODULE_PREFIX}_LIBS MONOLITHIC ${MONOLITHIC_BUILD}
MODULE winpr
MODULES winpr-input winpr-crt winpr-utils)
target_link_libraries(${MODULE_NAME} ${${MODULE_PREFIX}_LIBS})
set_property(TARGET ${MODULE_NAME} PROPERTY FOLDER "Client/iOS")

View File

@@ -10,7 +10,7 @@
#import <UIKit/UIKit.h>
@interface AboutController : UIViewController <UIWebViewDelegate, UIAlertViewDelegate>
@interface AboutController : UIViewController <UIWebViewDelegate>
{
NSString* last_link_clicked;
UIWebView* webView;

View File

@@ -9,6 +9,7 @@
#import "AboutController.h"
#import "Utils.h"
#import "BlockAlertView.h"
@implementation AboutController
@@ -76,24 +77,19 @@
{
[last_link_clicked release];
last_link_clicked = [[[request URL] absoluteString] retain];
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:NSLocalizedString(@"External Link", @"External Link Alert Title")
message:[NSString stringWithFormat:NSLocalizedString(@"Open [%@] in Browser?", @"Open link in browser (with link as parameter)"), last_link_clicked]
delegate:self
cancelButtonTitle:NSLocalizedString(@"OK", @"OK Button")
otherButtonTitles:NSLocalizedString(@"No", @"No Button"), nil];
[alert show];
[alert release];
BlockAlertView *alert = [BlockAlertView alertWithTitle:NSLocalizedString(@"External Link", @"External Link Alert Title")
message:[NSString stringWithFormat:NSLocalizedString(@"Open [%@] in Browser?", @"Open link in browser (with link as parameter)"), last_link_clicked]];
[alert setCancelButtonWithTitle:NSLocalizedString(@"No", @"No Button") block:nil];
[alert addButtonWithTitle:NSLocalizedString(@"OK", @"OK Button") block:^{
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:last_link_clicked]];
}];
[alert show];
return NO;
}
return YES;
}
#pragma mark UIAlertView delegate
- (void)alertView:(UIAlertView *)alertView didDismissWithButtonIndex:(NSInteger)buttonIndex
{
if (buttonIndex == 0)
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:last_link_clicked]];
}
@end

View File

@@ -21,7 +21,7 @@
@end
@interface BookmarkEditorController : EditorBaseController <UIAlertViewDelegate>
@interface BookmarkEditorController : EditorBaseController
{
@private
ComputerBookmark* _bookmark;

View File

@@ -14,6 +14,7 @@
#import "PerformanceEditorController.h"
#import "CredentialsEditorController.h"
#import "AdvancedBookmarkEditorController.h"
#import "BlockAlertView.h"
@implementation BookmarkEditorController
@@ -32,8 +33,11 @@
if ((self = [super initWithStyle:UITableViewStyleGrouped]))
{
// set additional settings state according to bookmark data
_bookmark = [bookmark retain];
_params = [bookmark params];
if ([[bookmark uuid] length] == 0)
_bookmark = [bookmark copy];
else
_bookmark = [bookmark copyWithUUID];
_params = [_bookmark params];
// if this is a TSX Connect bookmark - disable server settings
if([_bookmark isKindOfClass:NSClassFromString(@"TSXConnectComputerBookmark")])
@@ -335,18 +339,6 @@
return YES;
}
#pragma mark - UIAlertViewDelegate methods
- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex
{
// clicked yes?
if (buttonIndex == 0)
{
// cancel bookmark editing and return to previous view controller
[[self navigationController] popViewControllerAnimated:YES];
}
}
#pragma mark -
#pragma mark Action Handlers
@@ -360,8 +352,13 @@
{
if ([[_bookmark label] length] == 0 || [[_params StringForKey:@"hostname"] length] == 0 || [_params intForKey:@"port"] == 0)
{
UIAlertView* alertView = [[[UIAlertView alloc] initWithTitle:NSLocalizedString(@"Cancel without saving?", @"Incomplete bookmark error title") message:NSLocalizedString(@"Press 'Cancel' to abort!\nPress 'Continue' to specify the required fields!", @"Incomplete bookmark error message") delegate:self cancelButtonTitle:NSLocalizedString(@"Cancel", @"Cancel Button") otherButtonTitles:NSLocalizedString(@"Continue", @"Continue Button"), nil] autorelease];
[alertView show];
BlockAlertView* alertView = [BlockAlertView alertWithTitle:NSLocalizedString(@"Cancel without saving?", @"Incomplete bookmark error title") message:NSLocalizedString(@"Press 'Cancel' to abort!\nPress 'Continue' to specify the required fields!", @"Incomplete bookmark error message")];
[alertView setCancelButtonWithTitle:NSLocalizedString(@"Cancel", @"Cancel Button") block:^{
// cancel bookmark editing and return to previous view controller
[[self navigationController] popViewControllerAnimated:YES];
}];
[alertView addButtonWithTitle:NSLocalizedString(@"Continue", @"Continue Button") block:nil];
[alertView show];
return;
}
}

View File

@@ -14,7 +14,7 @@
#import "BookmarkEditorController.h"
#import "Reachability.h"
@interface BookmarkListController : UIViewController <UISearchBarDelegate, UITableViewDelegate, UITableViewDataSource, UIAlertViewDelegate, BookmarkEditorDelegate>
@interface BookmarkListController : UIViewController <UISearchBarDelegate, UITableViewDelegate, UITableViewDataSource, BookmarkEditorDelegate>
{
// custom bookmark and session table cells
BookmarkTableCell* _bmTableCell;

View File

@@ -14,6 +14,7 @@
#import "Toast+UIView.h"
#import "Reachability.h"
#import "GlobalDefaults.h"
#import "BlockAlertView.h"
#define SECTION_SESSIONS 0
#define SECTION_BOOKMARKS 1
@@ -633,8 +634,17 @@
// ask the user if he wants to save the bookmark
NSString* title = NSLocalizedString(@"Save Connection Settings?", @"Save connection settings title");
NSString* message = NSLocalizedString(@"Your Connection Settings have not been saved. Do you want to save them?", @"Save connection settings message");
UIAlertView* alert = [[UIAlertView alloc] initWithTitle:title message:message delegate:self
cancelButtonTitle:NSLocalizedString(@"Yes", @"Yes Button") otherButtonTitles:NSLocalizedString(@"No", @"No Button"), nil];
BlockAlertView* alert = [BlockAlertView alertWithTitle:title message:message];
[alert setCancelButtonWithTitle:NSLocalizedString(@"No", @"No Button") block:nil];
[alert addButtonWithTitle:NSLocalizedString(@"Yes", @"Yes Button") block:^{
if (_temporary_bookmark)
{
[_manual_bookmarks addObject:_temporary_bookmark];
[_tableView reloadSections:[NSIndexSet indexSetWithIndex:SECTION_BOOKMARKS] withRowAnimation:UITableViewRowAnimationNone];
[_temporary_bookmark autorelease];
_temporary_bookmark = nil;
}
}];
[alert show];
}
}
@@ -649,21 +659,6 @@
[[self view] makeToast:NSLocalizedString(@"Failed to connect to session!", @"Failed to connect error message") duration:ToastDurationNormal position:@"center"];
}
#pragma mark - UIAlertView delegates
- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex
{
// yes clicked?
if (buttonIndex == 0 && _temporary_bookmark)
{
[_manual_bookmarks addObject:_temporary_bookmark];
[_tableView reloadSections:[NSIndexSet indexSetWithIndex:SECTION_BOOKMARKS] withRowAnimation:UITableViewRowAnimationNone];
}
[_temporary_bookmark autorelease];
_temporary_bookmark = nil;
}
#pragma mark - Reachability notification
- (void)reachabilityChanged:(NSNotification*)notification
{
@@ -680,10 +675,20 @@
- (void)commitBookmark:(ComputerBookmark *)bookmark
{
// if we got a manual bookmark that is not in the list yet - add it
if (![_manual_bookmarks containsObject:bookmark])
// if we got a manual bookmark that is not in the list yet - add it otherwise replace it
BOOL found = NO;
for (int idx = 0; idx < [_manual_bookmarks count]; ++idx)
{
if ([[bookmark uuid] isEqualToString:[[_manual_bookmarks objectAtIndex:idx] uuid]])
{
[_manual_bookmarks replaceObjectAtIndex:idx withObject:bookmark];
found = YES;
break;
}
}
if (!found)
[_manual_bookmarks addObject:bookmark];
// remove any quick connect history entry with the same hostname
NSString* hostname = [[bookmark params] StringForKey:@"hostname"];
if ([_connection_history containsObject:hostname])

View File

@@ -55,27 +55,4 @@
return YES;
}
#pragma mark -
#pragma mark UIWebView callbacks
- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType
{
if([[request URL] isFileURL])
return YES;
if(navigationType == UIWebViewNavigationTypeLinkClicked)
{
NSString* lastClickedLink = [[request URL] absoluteString];
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"External Link"
message:[NSString stringWithFormat:@"Open [%@] in Browser?", lastClickedLink]
delegate:self
cancelButtonTitle:@"OK"
otherButtonTitles:@"No", nil];
[alert show];
[alert release];
return NO;
}
return YES;
}
@end

View File

@@ -8,7 +8,7 @@
*/
#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>
@interface MainTabBarController : UITabBarController {

View File

@@ -14,7 +14,7 @@
#import "TouchPointerView.h"
#import "AdvancedKeyboardView.h"
@interface RDPSessionViewController : UIViewController <RDPSessionDelegate, TouchPointerDelegate, AdvancedKeyboardDelegate, RDPKeyboardDelegate, UIScrollViewDelegate, UITextFieldDelegate, UIAlertViewDelegate>
@interface RDPSessionViewController : UIViewController <RDPSessionDelegate, TouchPointerDelegate, AdvancedKeyboardDelegate, RDPKeyboardDelegate, UIScrollViewDelegate, UITextFieldDelegate>
{
// scrollview that hosts the rdp session view
IBOutlet UIScrollView* _session_scrollview;

View File

@@ -15,6 +15,7 @@
#import "ConnectionParams.h"
#import "CredentialsInputController.h"
#import "VerifyCertificateController.h"
#import "BlockAlertView.h"
#define TOOLBAR_HEIGHT 30
@@ -415,8 +416,12 @@
- (void)showGoProScreen:(RDPSession*)session
{
UIAlertView* alertView = [[[UIAlertView alloc] initWithTitle:NSLocalizedString(@"Pro Version", @"Pro version dialog title")
message:NSLocalizedString(@"Do you want to buy Thinstuff RDC Pro and enable the full RDP Experience", @"Pro version dialog message") delegate:self cancelButtonTitle:NSLocalizedString(@"No", @"No Button title") otherButtonTitles:NSLocalizedString(@"Yes", @"Yes button title"), nil] autorelease];
BlockAlertView* alertView = [BlockAlertView alertWithTitle:NSLocalizedString(@"Unlicensed Client", @"Pro version dialog title") message:NSLocalizedString(@"You are connected to Thinstuff Remote Desktop Host (RDH). Do you want to purchase an access license for this client which allows you to connect to any computer running Thinstuff RDH?", @"Pro version dialog message")];
[alertView setCancelButtonWithTitle:NSLocalizedString(@"No", @"No Button title") block:nil];
[alertView addButtonWithTitle:NSLocalizedString(@"Yes", @"Yes button title") block:^ {
}];
[alertView show];
}
@@ -556,16 +561,20 @@
- (void)onTransactionSuccess:(NSNotification*)notification
{
UIAlertView* alertView = [[[UIAlertView alloc] initWithTitle:NSLocalizedString(@"Transaction Succeeded", @"Pro version bought dialog title")
message:NSLocalizedString(@"Thanks for buying Thinstuff RDC Pro. In order for the purchase to take effect please reconnect your current session.", @"Pro version bought dialog message") delegate:nil cancelButtonTitle:NSLocalizedString(@"OK", @"OK Button title") otherButtonTitles:nil] autorelease];
BlockAlertView* alertView = [BlockAlertView alertWithTitle:NSLocalizedString(@"Transaction Succeeded", @"Pro version bought dialog title")
message:NSLocalizedString(@"Thanks for buying Thinstuff RDC Pro. In order for the purchase to take effect please reconnect your current session.", @"Pro version bought dialog message")];
[alertView setCancelButtonWithTitle:NSLocalizedString(@"OK", @"OK Button title") block:nil];
[alertView show];
}
- (void)onTransactionFailed:(NSNotification*)notification
{
UIAlertView* alertView = [[[UIAlertView alloc] initWithTitle:NSLocalizedString(@"Transaction Failed", @"Pro version buy failed dialog title")
message:NSLocalizedString(@"The transaction did not complete successfully!", @"Pro version buy failed dialog message") delegate:nil cancelButtonTitle:NSLocalizedString(@"OK", @"OK Button title") otherButtonTitles:nil] autorelease];
[alertView show];
BlockAlertView* alertView = [BlockAlertView alertWithTitle:NSLocalizedString(@"Transaction Failed", @"Pro version buy failed dialog title")
message:NSLocalizedString(@"The transaction did not complete successfully!", @"Pro version buy failed dialog message")];
[alertView setCancelButtonWithTitle:NSLocalizedString(@"OK", @"OK Button title") block:nil];
[alertView show];
}
#pragma mark -

View File

@@ -7,6 +7,8 @@
If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
*/
#import <CoreGraphics/CoreGraphics.h>
#import <freerdp/freerdp.h>
#import <freerdp/channels/channels.h>
#import "TSXTypes.h"

View File

@@ -9,7 +9,9 @@
#import <freerdp/utils/event.h>
#import <freerdp/gdi/gdi.h>
#import <freerdp/utils/file.h>
#import <freerdp/channels/channels.h>
#import <freerdp/client/channels.h>
#import <freerdp/client/cmdline.h>
#import "ios_freerdp.h"
#import "ios_freerdp_ui.h"
@@ -64,7 +66,9 @@ ios_pre_connect(freerdp * instance)
settings->FrameAcknowledge = 10;
// freerdp_channels_pre_connect(instance->context->channels, instance);
freerdp_client_load_addins(instance->context->channels, instance->settings);
freerdp_channels_pre_connect(instance->context->channels, instance);
return TRUE;
}
@@ -82,12 +86,24 @@ static BOOL ios_post_connect(freerdp* instance)
instance->update->DesktopResize = ios_ui_resize_window;
// Channel allocation
// freerdp_channels_post_connect(instance->context->channels, instance);
freerdp_channels_post_connect(instance->context->channels, instance);
[mfi->session performSelectorOnMainThread:@selector(sessionDidConnect) withObject:nil waitUntilDone:YES];
return TRUE;
}
static int ios_receive_channel_data(freerdp* instance, int channelId, UINT8* data, int size, int flags, int total_size)
{
return freerdp_channels_data(instance, channelId, data, size, flags, total_size);
}
void ios_process_channel_event(rdpChannels* channels, freerdp* instance)
{
wMessage* event = freerdp_channels_pop_event(channels);
if (event)
freerdp_event_free(event);
}
#pragma mark -
#pragma mark Running the connection
@@ -96,7 +112,7 @@ ios_run_freerdp(freerdp * instance)
{
mfContext* context = (mfContext*)instance->context;
mfInfo* mfi = context->mfi;
// rdpChannels* channels = instance->context->channels;
rdpChannels* channels = instance->context->channels;
mfi->connection_state = TSXConnectionConnecting;
@@ -138,12 +154,12 @@ ios_run_freerdp(freerdp * instance)
break;
}
/* if (freerdp_channels_get_fds(channels, instance, rfds, &rcount, wfds, &wcount) != TRUE)
if (freerdp_channels_get_fds(channels, instance, rfds, &rcount, wfds, &wcount) != TRUE)
{
NSLog(@"%s: freerdp_chanman_get_fds failed", __func__);
break;
}
*/
if (ios_events_get_fds(mfi, rfds, &rcount, wfds, &wcount) != TRUE)
{
NSLog(@"%s: ios_events_get_fds", __func__);
@@ -196,20 +212,20 @@ ios_run_freerdp(freerdp * instance)
}
// Check channel fds
/* if (freerdp_channels_check_fds(channels, instance) != TRUE)
if (freerdp_channels_check_fds(channels, instance) != TRUE)
{
NSLog(@"%s: freerdp_chanman_check_fds failed", __func__);
break;
}
*/
ios_process_channel_event(channels, instance);
[pool release]; pool = nil;
}
mfi->connection_state = TSXConnectionDisconnected;
// Cleanup
// freerdp_channels_close(channels, instance);
// freerdp_channels_free(channels);
freerdp_channels_close(channels, instance);
freerdp_disconnect(instance);
gdi_free(instance);
cache_free(instance->context->cache);
@@ -225,7 +241,7 @@ void ios_context_new(freerdp* instance, rdpContext* context)
{
mfInfo* mfi = (mfInfo*)calloc(1, sizeof(mfInfo));
((mfContext*) context)->mfi = mfi;
// context->channels = freerdp_channels_new();
context->channels = freerdp_channels_new();
ios_events_create_pipe(mfi);
mfi->_context = context;
@@ -237,6 +253,7 @@ void ios_context_new(freerdp* instance, rdpContext* context)
void ios_context_free(freerdp* instance, rdpContext* context)
{
mfInfo* mfi = ((mfContext*) context)->mfi;
freerdp_channels_free(context->channels);
ios_events_free_pipe(mfi);
free(mfi);
}
@@ -253,19 +270,19 @@ freerdp* ios_freerdp_new()
inst->Authenticate = ios_ui_authenticate;
inst->VerifyCertificate = ios_ui_check_certificate;
inst->VerifyChangedCertificate = ios_ui_check_changed_certificate;
inst->ReceiveChannelData = ios_receive_channel_data;
inst->context_size = sizeof(mfContext);
inst->ContextNew = ios_context_new;
inst->ContextFree = ios_context_free;
freerdp_context_new(inst);
// determine new home path
NSString* home_path = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
free(inst->settings->HomePath);
free(inst->settings->ConfigPath);
inst->settings->HomePath = strdup([home_path UTF8String]);
inst->settings->ConfigPath = NULL;
freerdp_detect_paths(inst->settings);
inst->settings->ConfigPath = strdup([[home_path stringByAppendingPathComponent:@".freerdp"] UTF8String]);
return inst;
}
@@ -279,11 +296,12 @@ void ios_freerdp_free(freerdp* instance)
void ios_init_freerdp()
{
signal(SIGPIPE, SIG_IGN);
// freerdp_channels_global_init();
freerdp_channels_global_init();
freerdp_register_addin_provider(freerdp_channels_load_static_addin_entry, 0);
}
void ios_uninit_freerdp()
{
// freerdp_channels_global_uninit();
freerdp_channels_global_uninit();
}

View File

@@ -10,6 +10,7 @@
#ifndef IOS_RDP_EVENT_H
#define IOS_RDP_EVENT_H
#import <Foundation/Foundation.h>
#import "ios_freerdp.h"
// For UI: use to send events

View File

@@ -8,6 +8,7 @@
*/
#import <Foundation/Foundation.h>
#import <CoreGraphics/CoreGraphics.h>
#import "TSXTypes.h"
// helper macro to encode a table path into a tag value (used to identify controls in their delegate handlers)

View File

@@ -9,6 +9,7 @@
#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>
#import "ConnectionParams.h"
@interface ComputerBookmark : NSObject <NSCoding> {
@@ -29,6 +30,7 @@
// Creates a copy of this object, with a new UUID
- (id)copy;
- (id)copyWithUUID;
// Whether user can delete, move, or rename this entry
- (BOOL)isDeletable;

View File

@@ -39,7 +39,7 @@
// Designated initializer.
- (id)initWithConnectionParameters:(ConnectionParams*)params
{
if (!(self = [super init]))
if (!(self = [self init]))
return nil;
_connection_params = [params copy];
@@ -87,6 +87,13 @@
return copy;
}
- (id)copyWithUUID
{
ComputerBookmark* copy = [self copy];
copy->_uuid = [[self uuid] copy];
return copy;
}
- (void)encodeWithCoder:(NSCoder *)coder
{
if (![coder allowsKeyedCoding])

View File

@@ -8,6 +8,7 @@
*/
#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>
#include <freerdp/freerdp.h>

View File

@@ -104,6 +104,7 @@ NSString* TSXSessionDidFailToConnectNotification = @"TSXSessionDidFailToConnect"
// enable NSCodec
settings->NSCodec = TRUE;
settings->BitmapCacheV3Enabled = TRUE;
// Performance flags
settings->DisableWallpaper = ![_params boolForKey:@"perf_show_desktop" with3GEnabled:connected_via_3g];

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.4 KiB

View File

@@ -148,7 +148,7 @@ a:hover, a:active, a:focus { /* this group of selectors will give a keyboard nav
<div id="content">
<h1>Gestures</h1>
<p>
aFreeRDP is designed for touch sensitive devices.
iFreeRDP is designed for touch sensitive devices.
These gestures let you do the most usual operations with your fingers.</p>
<p> <img src="gestures.png"></p>

View File

@@ -147,7 +147,7 @@ a:hover, a:active, a:focus { /* this group of selectors will give a keyboard nav
<div id="content">
<h2> Gestures</h2>
<p>
aFreeRDP is designed for touch sensitive devices.
iFreeRDP is designed for touch sensitive devices.
These gestures let you do the most usual operations with your fingers.</p>
<p> <img src="gestures_phone.png"></p>

View File

@@ -0,0 +1,41 @@
//
// BlockAlertView.h
//
//
#import <UIKit/UIKit.h>
@interface BlockAlertView : NSObject {
@protected
UIView *_view;
NSMutableArray *_blocks;
CGFloat _height;
NSString *_title;
NSString *_message;
BOOL _shown;
BOOL _cancelBounce;
}
+ (BlockAlertView *)alertWithTitle:(NSString *)title message:(NSString *)message;
+ (void)showInfoAlertWithTitle:(NSString *)title message:(NSString *)message;
+ (void)showErrorAlert:(NSError *)error;
- (id)initWithTitle:(NSString *)title message:(NSString *)message;
- (void)setDestructiveButtonWithTitle:(NSString *)title block:(void (^)())block;
- (void)setCancelButtonWithTitle:(NSString *)title block:(void (^)())block;
- (void)addButtonWithTitle:(NSString *)title block:(void (^)())block;
- (void)addComponents:(CGRect)frame;
- (void)show;
- (void)dismissWithClickedButtonIndex:(NSInteger)buttonIndex animated:(BOOL)animated;
- (void)setupDisplay;
@property (nonatomic, retain) UIImage *backgroundImage;
@property (nonatomic, readonly) UIView *view;
@property (nonatomic, readwrite) BOOL vignetteBackground;
@end

447
client/iOS/Views/BlockAlertView.m Executable file
View File

@@ -0,0 +1,447 @@
//
// BlockAlertView.m
//
//
#import "BlockAlertView.h"
#import "BlockBackground.h"
#import "BlockUI.h"
@implementation BlockAlertView
@synthesize view = _view;
@synthesize backgroundImage = _backgroundImage;
@synthesize vignetteBackground = _vignetteBackground;
static UIImage *background = nil;
static UIImage *backgroundlandscape = nil;
static UIFont *titleFont = nil;
static UIFont *messageFont = nil;
static UIFont *buttonFont = nil;
#pragma mark - init
+ (void)initialize
{
if (self == [BlockAlertView class])
{
background = [UIImage imageNamed:kAlertViewBackground];
background = [[background stretchableImageWithLeftCapWidth:0 topCapHeight:kAlertViewBackgroundCapHeight] retain];
backgroundlandscape = [UIImage imageNamed:kAlertViewBackgroundLandscape];
backgroundlandscape = [[backgroundlandscape stretchableImageWithLeftCapWidth:0 topCapHeight:kAlertViewBackgroundCapHeight] retain];
titleFont = [kAlertViewTitleFont retain];
messageFont = [kAlertViewMessageFont retain];
buttonFont = [kAlertViewButtonFont retain];
}
}
+ (BlockAlertView *)alertWithTitle:(NSString *)title message:(NSString *)message
{
return [[[BlockAlertView alloc] initWithTitle:title message:message] autorelease];
}
+ (void)showInfoAlertWithTitle:(NSString *)title message:(NSString *)message
{
BlockAlertView *alert = [[BlockAlertView alloc] initWithTitle:title message:message];
[alert setCancelButtonWithTitle:NSLocalizedString(@"Dismiss", nil) block:nil];
[alert show];
[alert release];
}
+ (void)showErrorAlert:(NSError *)error
{
BlockAlertView *alert = [[BlockAlertView alloc] initWithTitle:NSLocalizedString(@"Operation Failed", nil) message:[NSString stringWithFormat:NSLocalizedString(@"The operation did not complete successfully: %@", nil), error]];
[alert setCancelButtonWithTitle:@"Dismiss" block:nil];
[alert show];
[alert release];
}
///////////////////////////////////////////////////////////////////////////////////////////////////
#pragma mark - NSObject
- (void)addComponents:(CGRect)frame {
if (_title)
{
CGSize size = [_title sizeWithFont:titleFont
constrainedToSize:CGSizeMake(frame.size.width-kAlertViewBorder*2, 1000)
lineBreakMode:NSLineBreakByWordWrapping];
UILabel *labelView = [[UILabel alloc] initWithFrame:CGRectMake(kAlertViewBorder, _height, frame.size.width-kAlertViewBorder*2, size.height)];
labelView.font = titleFont;
labelView.numberOfLines = 0;
labelView.lineBreakMode = NSLineBreakByWordWrapping;
labelView.textColor = kAlertViewTitleTextColor;
labelView.backgroundColor = [UIColor clearColor];
labelView.textAlignment = NSTextAlignmentCenter;
labelView.shadowColor = kAlertViewTitleShadowColor;
labelView.shadowOffset = kAlertViewTitleShadowOffset;
labelView.text = _title;
[_view addSubview:labelView];
[labelView release];
_height += size.height + kAlertViewBorder;
}
if (_message)
{
CGSize size = [_message sizeWithFont:messageFont
constrainedToSize:CGSizeMake(frame.size.width-kAlertViewBorder*2, 1000)
lineBreakMode:NSLineBreakByWordWrapping];
UILabel *labelView = [[UILabel alloc] initWithFrame:CGRectMake(kAlertViewBorder, _height, frame.size.width-kAlertViewBorder*2, size.height)];
labelView.font = messageFont;
labelView.numberOfLines = 0;
labelView.lineBreakMode = NSLineBreakByWordWrapping;
labelView.textColor = kAlertViewMessageTextColor;
labelView.backgroundColor = [UIColor clearColor];
labelView.textAlignment = NSTextAlignmentCenter;
labelView.shadowColor = kAlertViewMessageShadowColor;
labelView.shadowOffset = kAlertViewMessageShadowOffset;
labelView.text = _message;
[_view addSubview:labelView];
[labelView release];
_height += size.height + kAlertViewBorder;
}
}
- (void)setupDisplay
{
[[_view subviews] enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
[obj removeFromSuperview];
}];
UIWindow *parentView = [BlockBackground sharedInstance];
CGRect frame = parentView.bounds;
frame.origin.x = floorf((frame.size.width - background.size.width) * 0.5);
frame.size.width = background.size.width;
UIInterfaceOrientation orientation = [[UIApplication sharedApplication] statusBarOrientation];
if (UIInterfaceOrientationIsLandscape(orientation)) {
frame.size.width += 150;
frame.origin.x -= 75;
}
_view.frame = frame;
_height = kAlertViewBorder + 15;
if (NeedsLandscapePhoneTweaks) {
_height -= 15; // landscape phones need to trimmed a bit
}
[self addComponents:frame];
if (_shown)
[self show];
}
- (id)initWithTitle:(NSString *)title message:(NSString *)message
{
self = [super init];
if (self)
{
_title = [title copy];
_message = [message copy];
_view = [[UIView alloc] init];
_view.autoresizingMask = UIViewAutoresizingFlexibleBottomMargin | UIViewAutoresizingFlexibleTopMargin | UIViewAutoresizingFlexibleLeftMargin | UIViewAutoresizingFlexibleRightMargin;
_blocks = [[NSMutableArray alloc] init];
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(setupDisplay)
name:UIApplicationDidChangeStatusBarOrientationNotification
object:nil];
if ([self class] == [BlockAlertView class])
[self setupDisplay];
_vignetteBackground = NO;
}
return self;
}
- (void)dealloc
{
[_title release];
[_message release];
[_backgroundImage release];
[_view release];
[_blocks release];
[super dealloc];
}
///////////////////////////////////////////////////////////////////////////////////////////////////
#pragma mark - Public
- (void)addButtonWithTitle:(NSString *)title color:(NSString*)color block:(void (^)())block
{
[_blocks addObject:[NSArray arrayWithObjects:
block ? [[block copy] autorelease] : [NSNull null],
title,
color,
nil]];
}
- (void)addButtonWithTitle:(NSString *)title block:(void (^)())block
{
[self addButtonWithTitle:title color:@"gray" block:block];
}
- (void)setCancelButtonWithTitle:(NSString *)title block:(void (^)())block
{
[self addButtonWithTitle:title color:@"black" block:block];
}
- (void)setDestructiveButtonWithTitle:(NSString *)title block:(void (^)())block
{
[self addButtonWithTitle:title color:@"red" block:block];
}
- (void)show
{
_shown = YES;
BOOL isSecondButton = NO;
NSUInteger index = 0;
for (NSUInteger i = 0; i < _blocks.count; i++)
{
NSArray *block = [_blocks objectAtIndex:i];
NSString *title = [block objectAtIndex:1];
NSString *color = [block objectAtIndex:2];
UIImage *image = [UIImage imageNamed:[NSString stringWithFormat:@"alert-%@-button.png", color]];
image = [image stretchableImageWithLeftCapWidth:(int)(image.size.width+1)>>1 topCapHeight:0];
CGFloat maxHalfWidth = floorf((_view.bounds.size.width-kAlertViewBorder*3)*0.5);
CGFloat width = _view.bounds.size.width-kAlertViewBorder*2;
CGFloat xOffset = kAlertViewBorder;
if (isSecondButton)
{
width = maxHalfWidth;
xOffset = width + kAlertViewBorder * 2;
isSecondButton = NO;
}
else if (i + 1 < _blocks.count)
{
// In this case there's another button.
// Let's check if they fit on the same line.
CGSize size = [title sizeWithFont:buttonFont
minFontSize:10
actualFontSize:nil
forWidth:_view.bounds.size.width-kAlertViewBorder*2
lineBreakMode:NSLineBreakByClipping];
if (size.width < maxHalfWidth - kAlertViewBorder)
{
// It might fit. Check the next Button
NSArray *block2 = [_blocks objectAtIndex:i+1];
NSString *title2 = [block2 objectAtIndex:1];
size = [title2 sizeWithFont:buttonFont
minFontSize:10
actualFontSize:nil
forWidth:_view.bounds.size.width-kAlertViewBorder*2
lineBreakMode:NSLineBreakByClipping];
if (size.width < maxHalfWidth - kAlertViewBorder)
{
// They'll fit!
isSecondButton = YES; // For the next iteration
width = maxHalfWidth;
}
}
}
else if (_blocks.count == 1)
{
// In this case this is the ony button. We'll size according to the text
CGSize size = [title sizeWithFont:buttonFont
minFontSize:10
actualFontSize:nil
forWidth:_view.bounds.size.width-kAlertViewBorder*2
lineBreakMode:UILineBreakModeClip];
size.width = MAX(size.width, 80);
if (size.width + 2 * kAlertViewBorder < width)
{
width = size.width + 2 * kAlertViewBorder;
xOffset = floorf((_view.bounds.size.width - width) * 0.5);
}
}
UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];
button.frame = CGRectMake(xOffset, _height, width, kAlertButtonHeight);
button.titleLabel.font = buttonFont;
if (IOS_LESS_THAN_6) {
#pragma clan diagnostic push
#pragma clang diagnostic ignored "-Wdeprecated-declarations"
button.titleLabel.minimumFontSize = 10;
#pragma clan diagnostic pop
}
else {
button.titleLabel.adjustsFontSizeToFitWidth = YES;
button.titleLabel.adjustsLetterSpacingToFitWidth = YES;
button.titleLabel.minimumScaleFactor = 0.1;
}
button.titleLabel.textAlignment = NSTextAlignmentCenter;
button.titleLabel.shadowOffset = kAlertViewButtonShadowOffset;
button.backgroundColor = [UIColor clearColor];
button.tag = i+1;
[button setBackgroundImage:image forState:UIControlStateNormal];
[button setTitleColor:kAlertViewButtonTextColor forState:UIControlStateNormal];
[button setTitleShadowColor:kAlertViewButtonShadowColor forState:UIControlStateNormal];
[button setTitle:title forState:UIControlStateNormal];
button.accessibilityLabel = title;
[button addTarget:self action:@selector(buttonClicked:) forControlEvents:UIControlEventTouchUpInside];
[_view addSubview:button];
if (!isSecondButton)
_height += kAlertButtonHeight + kAlertViewBorder;
index++;
}
_height += 10; // Margin for the shadow
if (_height < background.size.height)
{
CGFloat offset = background.size.height - _height;
_height = background.size.height;
CGRect frame;
for (NSUInteger i = 0; i < _blocks.count; i++)
{
UIButton *btn = (UIButton *)[_view viewWithTag:i+1];
frame = btn.frame;
frame.origin.y += offset;
btn.frame = frame;
}
}
CGRect frame = _view.frame;
frame.origin.y = - _height;
frame.size.height = _height;
_view.frame = frame;
UIImageView *modalBackground = [[UIImageView alloc] initWithFrame:_view.bounds];
if (UIInterfaceOrientationIsLandscape([[UIApplication sharedApplication] statusBarOrientation]))
modalBackground.image = backgroundlandscape;
else
modalBackground.image = background;
modalBackground.contentMode = UIViewContentModeScaleToFill;
modalBackground.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
[_view insertSubview:modalBackground atIndex:0];
[modalBackground release];
if (_backgroundImage)
{
[BlockBackground sharedInstance].backgroundImage = _backgroundImage;
[_backgroundImage release];
_backgroundImage = nil;
}
[BlockBackground sharedInstance].vignetteBackground = _vignetteBackground;
[[BlockBackground sharedInstance] addToMainWindow:_view];
__block CGPoint center = _view.center;
center.y = floorf([BlockBackground sharedInstance].bounds.size.height * 0.5) + kAlertViewBounce;
_cancelBounce = NO;
[UIView animateWithDuration:0.4
delay:0.0
options:UIViewAnimationCurveEaseOut
animations:^{
[BlockBackground sharedInstance].alpha = 1.0f;
_view.center = center;
}
completion:^(BOOL finished) {
if (_cancelBounce) return;
[UIView animateWithDuration:0.1
delay:0.0
options:0
animations:^{
center.y -= kAlertViewBounce;
_view.center = center;
}
completion:^(BOOL finished) {
[[NSNotificationCenter defaultCenter] postNotificationName:@"AlertViewFinishedAnimations" object:nil];
}];
}];
[self retain];
}
- (void)dismissWithClickedButtonIndex:(NSInteger)buttonIndex animated:(BOOL)animated
{
_shown = NO;
[[NSNotificationCenter defaultCenter] removeObserver:self];
if (buttonIndex >= 0 && buttonIndex < [_blocks count])
{
id obj = [[_blocks objectAtIndex: buttonIndex] objectAtIndex:0];
if (![obj isEqual:[NSNull null]])
{
((void (^)())obj)();
}
}
if (animated)
{
[UIView animateWithDuration:0.1
delay:0.0
options:0
animations:^{
CGPoint center = _view.center;
center.y += 20;
_view.center = center;
}
completion:^(BOOL finished) {
[UIView animateWithDuration:0.4
delay:0.0
options:UIViewAnimationCurveEaseIn
animations:^{
CGRect frame = _view.frame;
frame.origin.y = -frame.size.height;
_view.frame = frame;
[[BlockBackground sharedInstance] reduceAlphaIfEmpty];
}
completion:^(BOOL finished) {
[[BlockBackground sharedInstance] removeView:_view];
[_view release]; _view = nil;
[self autorelease];
}];
}];
}
else
{
[[BlockBackground sharedInstance] removeView:_view];
[_view release]; _view = nil;
[self autorelease];
}
}
///////////////////////////////////////////////////////////////////////////////////////////////////
#pragma mark - Action
- (void)buttonClicked:(id)sender
{
/* Run the button's block */
int buttonIndex = [sender tag] - 1;
[self dismissWithClickedButtonIndex:buttonIndex animated:YES];
}
@end

View File

@@ -0,0 +1,25 @@
//
// BlockBackground.h
// arrived
//
// Created by Gustavo Ambrozio on 29/11/11.
// Copyright (c) 2011 N/A. All rights reserved.
//
#import <UIKit/UIKit.h>
@interface BlockBackground : UIWindow {
@private
UIWindow *_previousKeyWindow;
}
+ (BlockBackground *) sharedInstance;
- (void)addToMainWindow:(UIView *)view;
- (void)reduceAlphaIfEmpty;
- (void)removeView:(UIView *)view;
@property (nonatomic, retain) UIImage *backgroundImage;
@property (nonatomic, readwrite) BOOL vignetteBackground;
@end

View File

@@ -0,0 +1,227 @@
//
// BlockBackground.m
// arrived
//
// Created by Gustavo Ambrozio on 29/11/11.
// Copyright (c) 2011 N/A. All rights reserved.
//
#import "BlockBackground.h"
@implementation BlockBackground
@synthesize backgroundImage = _backgroundImage;
@synthesize vignetteBackground = _vignetteBackground;
static BlockBackground *_sharedInstance = nil;
+ (BlockBackground*)sharedInstance
{
if (_sharedInstance != nil) {
return _sharedInstance;
}
@synchronized(self) {
if (_sharedInstance == nil) {
[[[self alloc] init] autorelease];
}
}
return _sharedInstance;
}
+ (id)allocWithZone:(NSZone*)zone
{
@synchronized(self) {
if (_sharedInstance == nil) {
_sharedInstance = [super allocWithZone:zone];
return _sharedInstance;
}
}
NSAssert(NO, @ "[BlockBackground alloc] explicitly called on singleton class.");
return nil;
}
- (id)copyWithZone:(NSZone*)zone
{
return self;
}
- (id)retain
{
return self;
}
- (unsigned)retainCount
{
return UINT_MAX;
}
- (oneway void)release
{
}
- (id)autorelease
{
return self;
}
- (void)setRotation:(NSNotification*)notification
{
UIInterfaceOrientation orientation = [[UIApplication sharedApplication] statusBarOrientation];
CGRect orientationFrame = [UIScreen mainScreen].bounds;
if(
(UIInterfaceOrientationIsLandscape(orientation) && orientationFrame.size.height > orientationFrame.size.width) ||
(UIInterfaceOrientationIsPortrait(orientation) && orientationFrame.size.width > orientationFrame.size.height)
) {
float temp = orientationFrame.size.width;
orientationFrame.size.width = orientationFrame.size.height;
orientationFrame.size.height = temp;
}
self.transform = CGAffineTransformIdentity;
self.frame = orientationFrame;
CGFloat posY = orientationFrame.size.height/2;
CGFloat posX = orientationFrame.size.width/2;
CGPoint newCenter;
CGFloat rotateAngle;
switch (orientation) {
case UIInterfaceOrientationPortraitUpsideDown:
rotateAngle = M_PI;
newCenter = CGPointMake(posX, orientationFrame.size.height-posY);
break;
case UIInterfaceOrientationLandscapeLeft:
rotateAngle = -M_PI/2.0f;
newCenter = CGPointMake(posY, posX);
break;
case UIInterfaceOrientationLandscapeRight:
rotateAngle = M_PI/2.0f;
newCenter = CGPointMake(orientationFrame.size.height-posY, posX);
break;
default: // UIInterfaceOrientationPortrait
rotateAngle = 0.0;
newCenter = CGPointMake(posX, posY);
break;
}
self.transform = CGAffineTransformMakeRotation(rotateAngle);
self.center = newCenter;
[self setNeedsLayout];
[self layoutSubviews];
}
- (id)init
{
self = [super initWithFrame:[[UIScreen mainScreen] bounds]];
if (self) {
self.windowLevel = UIWindowLevelStatusBar;
self.hidden = YES;
self.userInteractionEnabled = NO;
self.backgroundColor = [UIColor colorWithWhite:0.4 alpha:0.5f];
self.vignetteBackground = NO;
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(setRotation:)
name:UIApplicationDidChangeStatusBarOrientationNotification
object:nil];
[self setRotation:nil];
}
return self;
}
- (void)addToMainWindow:(UIView *)view
{
[self setRotation:nil];
if ([self.subviews containsObject:view]) return;
if (self.hidden)
{
_previousKeyWindow = [[[UIApplication sharedApplication] keyWindow] retain];
self.alpha = 0.0f;
self.hidden = NO;
self.userInteractionEnabled = YES;
[self makeKeyWindow];
}
if (self.subviews.count > 0)
{
((UIView*)[self.subviews lastObject]).userInteractionEnabled = NO;
}
if (_backgroundImage)
{
UIImageView *backgroundView = [[UIImageView alloc] initWithImage:_backgroundImage];
backgroundView.frame = self.bounds;
backgroundView.contentMode = UIViewContentModeScaleToFill;
[self addSubview:backgroundView];
[backgroundView release];
[_backgroundImage release];
_backgroundImage = nil;
}
[self addSubview:view];
}
- (void)reduceAlphaIfEmpty
{
if (self.subviews.count == 1 || (self.subviews.count == 2 && [[self.subviews objectAtIndex:0] isKindOfClass:[UIImageView class]]))
{
self.alpha = 0.0f;
self.userInteractionEnabled = NO;
}
}
- (void)removeView:(UIView *)view
{
[view removeFromSuperview];
UIView *topView = [self.subviews lastObject];
if ([topView isKindOfClass:[UIImageView class]])
{
// It's a background. Remove it too
[topView removeFromSuperview];
}
if (self.subviews.count == 0)
{
self.hidden = YES;
[_previousKeyWindow makeKeyWindow];
[_previousKeyWindow release];
_previousKeyWindow = nil;
}
else
{
((UIView*)[self.subviews lastObject]).userInteractionEnabled = YES;
}
}
- (void)drawRect:(CGRect)rect
{
if (_backgroundImage || !_vignetteBackground) return;
CGContextRef context = UIGraphicsGetCurrentContext();
size_t locationsCount = 2;
CGFloat locations[2] = {0.0f, 1.0f};
CGFloat colors[8] = {0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,0.75f};
CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
CGGradientRef gradient = CGGradientCreateWithColorComponents(colorSpace, colors, locations, locationsCount);
CGColorSpaceRelease(colorSpace);
CGPoint center = CGPointMake(self.bounds.size.width/2, self.bounds.size.height/2);
float radius = MIN(self.bounds.size.width , self.bounds.size.height) ;
CGContextDrawRadialGradient (context, gradient, center, 0, center, radius, kCGGradientDrawsAfterEndLocation);
CGGradientRelease(gradient);
}
@end

View File

@@ -0,0 +1,72 @@
//
// BlockUI.h
//
// Created by Gustavo Ambrozio on 14/2/12.
//
#ifndef BlockUI_h
#define BlockUI_h
#if __IPHONE_OS_VERSION_MAX_ALLOWED < 60000
#define NSTextAlignmentCenter UITextAlignmentCenter
#define NSLineBreakByWordWrapping UILineBreakModeWordWrap
#define NSLineBreakByClipping UILineBreakModeClip
#endif
#ifndef IOS_LESS_THAN_6
#define IOS_LESS_THAN_6 !([[[UIDevice currentDevice] systemVersion] compare:@"6.0" options:NSNumericSearch] != NSOrderedAscending)
#endif
#define NeedsLandscapePhoneTweaks (UIInterfaceOrientationIsLandscape([[UIApplication sharedApplication] statusBarOrientation]) && UI_USER_INTERFACE_IDIOM() != UIUserInterfaceIdiomPad)
// Action Sheet constants
#define kActionSheetBounce 10
#define kActionSheetBorder 10
#define kActionSheetButtonHeight 45
#define kActionSheetTopMargin 15
#define kActionSheetTitleFont [UIFont systemFontOfSize:18]
#define kActionSheetTitleTextColor [UIColor whiteColor]
#define kActionSheetTitleShadowColor [UIColor blackColor]
#define kActionSheetTitleShadowOffset CGSizeMake(0, -1)
#define kActionSheetButtonFont [UIFont boldSystemFontOfSize:20]
#define kActionSheetButtonTextColor [UIColor whiteColor]
#define kActionSheetButtonShadowColor [UIColor blackColor]
#define kActionSheetButtonShadowOffset CGSizeMake(0, -1)
#define kActionSheetBackground @"action-sheet-panel.png"
#define kActionSheetBackgroundCapHeight 30
// Alert View constants
#define kAlertViewBounce 20
#define kAlertViewBorder (NeedsLandscapePhoneTweaks ? 5 : 10)
#define kAlertButtonHeight (NeedsLandscapePhoneTweaks ? 35 : 44)
#define kAlertViewTitleFont [UIFont boldSystemFontOfSize:20]
#define kAlertViewTitleTextColor [UIColor colorWithWhite:244.0/255.0 alpha:1.0]
#define kAlertViewTitleShadowColor [UIColor blackColor]
#define kAlertViewTitleShadowOffset CGSizeMake(0, -1)
#define kAlertViewMessageFont [UIFont systemFontOfSize:18]
#define kAlertViewMessageTextColor [UIColor colorWithWhite:244.0/255.0 alpha:1.0]
#define kAlertViewMessageShadowColor [UIColor blackColor]
#define kAlertViewMessageShadowOffset CGSizeMake(0, -1)
#define kAlertViewButtonFont [UIFont boldSystemFontOfSize:18]
#define kAlertViewButtonTextColor [UIColor whiteColor]
#define kAlertViewButtonShadowColor [UIColor blackColor]
#define kAlertViewButtonShadowOffset CGSizeMake(0, -1)
#define kAlertViewBackground @"alert-window.png"
#define kAlertViewBackgroundLandscape @"alert-window-landscape.png"
#define kAlertViewBackgroundCapHeight 38
#endif

View File

@@ -1,865 +0,0 @@
// !$*UTF8*$!
{
archiveVersion = 1;
classes = {
};
objectVersion = 46;
objects = {
/* Begin PBXBuildFile section */
C495EE3416B8372D0041304E /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C495EE3316B8372D0041304E /* UIKit.framework */; };
C495EE3616B8372D0041304E /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C495EE3516B8372D0041304E /* Foundation.framework */; };
C495EE3816B8372D0041304E /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C495EE3716B8372D0041304E /* CoreGraphics.framework */; };
C495EE7016B9107D0041304E /* Defaults.plist in Resources */ = {isa = PBXBuildFile; fileRef = C495EE6F16B9107D0041304E /* Defaults.plist */; };
C495EE7716B910BC0041304E /* OrderedDictionary.m in Sources */ = {isa = PBXBuildFile; fileRef = C495EE7216B910BC0041304E /* OrderedDictionary.m */; };
C495EE7816B910BC0041304E /* Toast+UIView.m in Sources */ = {isa = PBXBuildFile; fileRef = C495EE7416B910BC0041304E /* Toast+UIView.m */; };
C495EE7916B910BC0041304E /* TSXAdditions.m in Sources */ = {isa = PBXBuildFile; fileRef = C495EE7616B910BC0041304E /* TSXAdditions.m */; };
C495EE9B16B910DE0041304E /* AboutController.m in Sources */ = {isa = PBXBuildFile; fileRef = C495EE7C16B910DE0041304E /* AboutController.m */; };
C495EE9C16B910DE0041304E /* AdvancedBookmarkEditorController.m in Sources */ = {isa = PBXBuildFile; fileRef = C495EE7E16B910DE0041304E /* AdvancedBookmarkEditorController.m */; };
C495EE9D16B910DE0041304E /* AppSettingsController.m in Sources */ = {isa = PBXBuildFile; fileRef = C495EE8016B910DE0041304E /* AppSettingsController.m */; };
C495EE9E16B910DE0041304E /* BookmarkEditorController.m in Sources */ = {isa = PBXBuildFile; fileRef = C495EE8216B910DE0041304E /* BookmarkEditorController.m */; };
C495EE9F16B910DE0041304E /* BookmarkListController.m in Sources */ = {isa = PBXBuildFile; fileRef = C495EE8416B910DE0041304E /* BookmarkListController.m */; };
C495EEA016B910DE0041304E /* CredentialsEditorController.m in Sources */ = {isa = PBXBuildFile; fileRef = C495EE8616B910DE0041304E /* CredentialsEditorController.m */; };
C495EEA116B910DE0041304E /* CredentialsInputController.m in Sources */ = {isa = PBXBuildFile; fileRef = C495EE8816B910DE0041304E /* CredentialsInputController.m */; };
C495EEA216B910DE0041304E /* EditorBaseController.m in Sources */ = {isa = PBXBuildFile; fileRef = C495EE8A16B910DE0041304E /* EditorBaseController.m */; };
C495EEA316B910DE0041304E /* EditorSelectionController.m in Sources */ = {isa = PBXBuildFile; fileRef = C495EE8C16B910DE0041304E /* EditorSelectionController.m */; };
C495EEA416B910DE0041304E /* EncryptionController.m in Sources */ = {isa = PBXBuildFile; fileRef = C495EE8E16B910DE0041304E /* EncryptionController.m */; };
C495EEA516B910DE0041304E /* HelpController.m in Sources */ = {isa = PBXBuildFile; fileRef = C495EE9016B910DE0041304E /* HelpController.m */; };
C495EEA616B910DE0041304E /* MainTabBarController.m in Sources */ = {isa = PBXBuildFile; fileRef = C495EE9216B910DE0041304E /* MainTabBarController.m */; };
C495EEA716B910DE0041304E /* PerformanceEditorController.m in Sources */ = {isa = PBXBuildFile; fileRef = C495EE9416B910DE0041304E /* PerformanceEditorController.m */; };
C495EEA816B910DE0041304E /* RDPSessionViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = C495EE9616B910DE0041304E /* RDPSessionViewController.m */; };
C495EEA916B910DE0041304E /* ScreenSelectionController.m in Sources */ = {isa = PBXBuildFile; fileRef = C495EE9816B910DE0041304E /* ScreenSelectionController.m */; };
C495EEAA16B910DE0041304E /* VerifyCertificateController.m in Sources */ = {isa = PBXBuildFile; fileRef = C495EE9A16B910DE0041304E /* VerifyCertificateController.m */; };
C495EEB216B910F60041304E /* ios_freerdp_events.m in Sources */ = {isa = PBXBuildFile; fileRef = C495EEAD16B910F60041304E /* ios_freerdp_events.m */; };
C495EEB316B910F60041304E /* ios_freerdp_ui.m in Sources */ = {isa = PBXBuildFile; fileRef = C495EEAF16B910F60041304E /* ios_freerdp_ui.m */; };
C495EEB416B910F60041304E /* ios_freerdp.m in Sources */ = {isa = PBXBuildFile; fileRef = C495EEB116B910F60041304E /* ios_freerdp.m */; };
C495EEBD16B9111A0041304E /* Reachability.m in Sources */ = {isa = PBXBuildFile; fileRef = C495EEB716B9111A0041304E /* Reachability.m */; };
C495EEBE16B9111A0041304E /* SFHFKeychainUtils.m in Sources */ = {isa = PBXBuildFile; fileRef = C495EEB916B9111A0041304E /* SFHFKeychainUtils.m */; };
C495EEBF16B9111A0041304E /* Utils.m in Sources */ = {isa = PBXBuildFile; fileRef = C495EEBC16B9111A0041304E /* Utils.m */; };
C495EECD16B911290041304E /* Bookmark.m in Sources */ = {isa = PBXBuildFile; fileRef = C495EEC216B911290041304E /* Bookmark.m */; };
C495EECE16B911290041304E /* ConnectionParams.m in Sources */ = {isa = PBXBuildFile; fileRef = C495EEC416B911290041304E /* ConnectionParams.m */; };
C495EECF16B911290041304E /* Encryptor.m in Sources */ = {isa = PBXBuildFile; fileRef = C495EEC616B911290041304E /* Encryptor.m */; };
C495EED016B911290041304E /* GlobalDefaults.m in Sources */ = {isa = PBXBuildFile; fileRef = C495EEC816B911290041304E /* GlobalDefaults.m */; };
C495EED116B911290041304E /* RDPKeyboard.m in Sources */ = {isa = PBXBuildFile; fileRef = C495EECA16B911290041304E /* RDPKeyboard.m */; };
C495EED216B911290041304E /* RDPSession.m in Sources */ = {isa = PBXBuildFile; fileRef = C495EECC16B911290041304E /* RDPSession.m */; };
C495EF3216B911450041304E /* BookmarkListView.xib in Resources */ = {isa = PBXBuildFile; fileRef = C495EEDA16B911450041304E /* BookmarkListView.xib */; };
C495EF3316B911450041304E /* BookmarkTableViewCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = C495EEDB16B911450041304E /* BookmarkTableViewCell.xib */; };
C495EF3416B911450041304E /* cancel_button_background.png in Resources */ = {isa = PBXBuildFile; fileRef = C495EEDC16B911450041304E /* cancel_button_background.png */; };
C495EF3516B911450041304E /* CredentialsInputView.xib in Resources */ = {isa = PBXBuildFile; fileRef = C495EEDD16B911450041304E /* CredentialsInputView.xib */; };
C495EF3616B911450041304E /* Default-Landscape@2x~ipad.png in Resources */ = {isa = PBXBuildFile; fileRef = C495EEDE16B911450041304E /* Default-Landscape@2x~ipad.png */; };
C495EF3716B911450041304E /* Default-Landscape~ipad.png in Resources */ = {isa = PBXBuildFile; fileRef = C495EEDF16B911450041304E /* Default-Landscape~ipad.png */; };
C495EF3816B911450041304E /* Default-Portrait@2x~ipad.png in Resources */ = {isa = PBXBuildFile; fileRef = C495EEE016B911450041304E /* Default-Portrait@2x~ipad.png */; };
C495EF3916B911450041304E /* Default-Portrait~ipad.png in Resources */ = {isa = PBXBuildFile; fileRef = C495EEE116B911450041304E /* Default-Portrait~ipad.png */; };
C495EF3A16B911450041304E /* Default.png in Resources */ = {isa = PBXBuildFile; fileRef = C495EEE216B911450041304E /* Default.png */; };
C495EF3B16B911450041304E /* Default@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = C495EEE316B911450041304E /* Default@2x.png */; };
C495EF3C16B911450041304E /* EditButtonTableViewCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = C495EEE416B911450041304E /* EditButtonTableViewCell.xib */; };
C495EF3D16B911450041304E /* EditFlagTableViewCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = C495EEE516B911450041304E /* EditFlagTableViewCell.xib */; };
C495EF3E16B911450041304E /* EditSecretTextTableViewCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = C495EEE616B911450041304E /* EditSecretTextTableViewCell.xib */; };
C495EF3F16B911450041304E /* EditSelectionTableViewCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = C495EEE716B911450041304E /* EditSelectionTableViewCell.xib */; };
C495EF4016B911450041304E /* EditSubEditTableViewCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = C495EEE816B911450041304E /* EditSubEditTableViewCell.xib */; };
C495EF4116B911450041304E /* EditTextTableViewCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = C495EEE916B911450041304E /* EditTextTableViewCell.xib */; };
C495EF5316B911450041304E /* icon_accessory_star_off.png in Resources */ = {isa = PBXBuildFile; fileRef = C495EEFE16B911450041304E /* icon_accessory_star_off.png */; };
C495EF5416B911450041304E /* icon_accessory_star_on.png in Resources */ = {isa = PBXBuildFile; fileRef = C495EEFF16B911450041304E /* icon_accessory_star_on.png */; };
C495EF5516B911450041304E /* icon_key_arrow_down.png in Resources */ = {isa = PBXBuildFile; fileRef = C495EF0016B911450041304E /* icon_key_arrow_down.png */; };
C495EF5616B911450041304E /* icon_key_arrow_left.png in Resources */ = {isa = PBXBuildFile; fileRef = C495EF0116B911450041304E /* icon_key_arrow_left.png */; };
C495EF5716B911450041304E /* icon_key_arrow_right.png in Resources */ = {isa = PBXBuildFile; fileRef = C495EF0216B911450041304E /* icon_key_arrow_right.png */; };
C495EF5816B911450041304E /* icon_key_arrow_up.png in Resources */ = {isa = PBXBuildFile; fileRef = C495EF0316B911450041304E /* icon_key_arrow_up.png */; };
C495EF5916B911450041304E /* icon_key_arrows.png in Resources */ = {isa = PBXBuildFile; fileRef = C495EF0416B911450041304E /* icon_key_arrows.png */; };
C495EF5A16B911450041304E /* icon_key_backspace.png in Resources */ = {isa = PBXBuildFile; fileRef = C495EF0516B911450041304E /* icon_key_backspace.png */; };
C495EF5B16B911450041304E /* icon_key_menu.png in Resources */ = {isa = PBXBuildFile; fileRef = C495EF0616B911450041304E /* icon_key_menu.png */; };
C495EF5C16B911450041304E /* icon_key_return.png in Resources */ = {isa = PBXBuildFile; fileRef = C495EF0716B911450041304E /* icon_key_return.png */; };
C495EF5D16B911450041304E /* icon_key_win.png in Resources */ = {isa = PBXBuildFile; fileRef = C495EF0816B911450041304E /* icon_key_win.png */; };
C495EF5E16B911450041304E /* Icon-72.png in Resources */ = {isa = PBXBuildFile; fileRef = C495EF0916B911450041304E /* Icon-72.png */; };
C495EF5F16B911450041304E /* Icon-72@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = C495EF0A16B911450041304E /* Icon-72@2x.png */; };
C495EF6016B911450041304E /* Icon.png in Resources */ = {isa = PBXBuildFile; fileRef = C495EF0B16B911450041304E /* Icon.png */; };
C495EF6116B911450041304E /* Icon@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = C495EF0C16B911450041304E /* Icon@2x.png */; };
C495EF6216B911450041304E /* keyboard_button_background.png in Resources */ = {isa = PBXBuildFile; fileRef = C495EF0D16B911450041304E /* keyboard_button_background.png */; };
C495EF6316B911450041304E /* MainWindow.xib in Resources */ = {isa = PBXBuildFile; fileRef = C495EF0E16B911450041304E /* MainWindow.xib */; };
C495EF6416B911450041304E /* RDPConnectingView.xib in Resources */ = {isa = PBXBuildFile; fileRef = C495EF0F16B911450041304E /* RDPConnectingView.xib */; };
C495EF6516B911450041304E /* RDPSessionView.xib in Resources */ = {isa = PBXBuildFile; fileRef = C495EF1016B911450041304E /* RDPSessionView.xib */; };
C495EF6616B911450041304E /* SessionTableViewCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = C495EF1116B911450041304E /* SessionTableViewCell.xib */; };
C495EF6716B911450041304E /* tabbar_icon_about.png in Resources */ = {isa = PBXBuildFile; fileRef = C495EF1216B911450041304E /* tabbar_icon_about.png */; };
C495EF6816B911450041304E /* tabbar_icon_help.png in Resources */ = {isa = PBXBuildFile; fileRef = C495EF1316B911450041304E /* tabbar_icon_help.png */; };
C495EF6916B911450041304E /* tabbar_icon_settings.png in Resources */ = {isa = PBXBuildFile; fileRef = C495EF1416B911450041304E /* tabbar_icon_settings.png */; };
C495EF6A16B911450041304E /* toolbar_icon_disconnect.png in Resources */ = {isa = PBXBuildFile; fileRef = C495EF1516B911450041304E /* toolbar_icon_disconnect.png */; };
C495EF6B16B911450041304E /* toolbar_icon_extkeyboad.png in Resources */ = {isa = PBXBuildFile; fileRef = C495EF1616B911450041304E /* toolbar_icon_extkeyboad.png */; };
C495EF6C16B911450041304E /* toolbar_icon_home.png in Resources */ = {isa = PBXBuildFile; fileRef = C495EF1716B911450041304E /* toolbar_icon_home.png */; };
C495EF6D16B911450041304E /* toolbar_icon_keyboard.png in Resources */ = {isa = PBXBuildFile; fileRef = C495EF1816B911450041304E /* toolbar_icon_keyboard.png */; };
C495EF6E16B911450041304E /* toolbar_icon_touchpointer.png in Resources */ = {isa = PBXBuildFile; fileRef = C495EF1916B911450041304E /* toolbar_icon_touchpointer.png */; };
C495EF6F16B911450041304E /* toolbar_icon_win.png in Resources */ = {isa = PBXBuildFile; fileRef = C495EF1A16B911450041304E /* toolbar_icon_win.png */; };
C495EF7016B911450041304E /* touch_pointer_active.png in Resources */ = {isa = PBXBuildFile; fileRef = C495EF1B16B911450041304E /* touch_pointer_active.png */; };
C495EF7116B911450041304E /* touch_pointer_default.png in Resources */ = {isa = PBXBuildFile; fileRef = C495EF1C16B911450041304E /* touch_pointer_default.png */; };
C495EF7216B911450041304E /* touch_pointer_extkeyboard.png in Resources */ = {isa = PBXBuildFile; fileRef = C495EF1D16B911450041304E /* touch_pointer_extkeyboard.png */; };
C495EF7316B911450041304E /* touch_pointer_keyboard.png in Resources */ = {isa = PBXBuildFile; fileRef = C495EF1E16B911450041304E /* touch_pointer_keyboard.png */; };
C495EF7416B911450041304E /* touch_pointer_lclick.png in Resources */ = {isa = PBXBuildFile; fileRef = C495EF1F16B911450041304E /* touch_pointer_lclick.png */; };
C495EF7516B911450041304E /* touch_pointer_rclick.png in Resources */ = {isa = PBXBuildFile; fileRef = C495EF2016B911450041304E /* touch_pointer_rclick.png */; };
C495EF7616B911450041304E /* touch_pointer_reset.png in Resources */ = {isa = PBXBuildFile; fileRef = C495EF2116B911450041304E /* touch_pointer_reset.png */; };
C495EF7716B911450041304E /* touch_pointer_scroll.png in Resources */ = {isa = PBXBuildFile; fileRef = C495EF2216B911450041304E /* touch_pointer_scroll.png */; };
C495EF7816B911450041304E /* VerifyCertificateView.xib in Resources */ = {isa = PBXBuildFile; fileRef = C495EF2316B911450041304E /* VerifyCertificateView.xib */; };
C495EF9A16B911AC0041304E /* AdvancedKeyboardView.m in Sources */ = {isa = PBXBuildFile; fileRef = C495EF8316B911AB0041304E /* AdvancedKeyboardView.m */; };
C495EF9B16B911AC0041304E /* BookmarkTableCell.m in Sources */ = {isa = PBXBuildFile; fileRef = C495EF8516B911AB0041304E /* BookmarkTableCell.m */; };
C495EF9C16B911AC0041304E /* EditButtonTableViewCell.m in Sources */ = {isa = PBXBuildFile; fileRef = C495EF8716B911AB0041304E /* EditButtonTableViewCell.m */; };
C495EF9D16B911AC0041304E /* EditFlagTableViewCell.m in Sources */ = {isa = PBXBuildFile; fileRef = C495EF8916B911AB0041304E /* EditFlagTableViewCell.m */; };
C495EF9E16B911AC0041304E /* EditSecretTextTableViewCell.m in Sources */ = {isa = PBXBuildFile; fileRef = C495EF8B16B911AB0041304E /* EditSecretTextTableViewCell.m */; };
C495EF9F16B911AC0041304E /* EditSelectionTableViewCell.m in Sources */ = {isa = PBXBuildFile; fileRef = C495EF8D16B911AB0041304E /* EditSelectionTableViewCell.m */; };
C495EFA016B911AC0041304E /* EditSubEditTableViewCell.m in Sources */ = {isa = PBXBuildFile; fileRef = C495EF8F16B911AB0041304E /* EditSubEditTableViewCell.m */; };
C495EFA116B911AC0041304E /* EditTextTableViewCell.m in Sources */ = {isa = PBXBuildFile; fileRef = C495EF9116B911AB0041304E /* EditTextTableViewCell.m */; };
C495EFA216B911AC0041304E /* RDPSessionView.m in Sources */ = {isa = PBXBuildFile; fileRef = C495EF9316B911AB0041304E /* RDPSessionView.m */; };
C495EFA316B911AC0041304E /* SessionTableCell.m in Sources */ = {isa = PBXBuildFile; fileRef = C495EF9516B911AB0041304E /* SessionTableCell.m */; };
C495EFA416B911AC0041304E /* TouchPointerView.m in Sources */ = {isa = PBXBuildFile; fileRef = C495EF9716B911AB0041304E /* TouchPointerView.m */; };
C495EFAB16B912C40041304E /* libfreerdp.a in Frameworks */ = {isa = PBXBuildFile; fileRef = C495EFAA16B912C40041304E /* libfreerdp.a */; };
C495EFAE16B913980041304E /* libwinpr.a in Frameworks */ = {isa = PBXBuildFile; fileRef = C495EFAD16B913980041304E /* libwinpr.a */; };
C495EFBB16B92E170041304E /* about_page in Resources */ = {isa = PBXBuildFile; fileRef = C495EFBA16B92E170041304E /* about_page */; };
C495EFBD16B92E270041304E /* help_page in Resources */ = {isa = PBXBuildFile; fileRef = C495EFBC16B92E270041304E /* help_page */; };
C495EFC216B92EA20041304E /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = C495EFC016B92EA20041304E /* Localizable.strings */; };
C495EFCB16B933230041304E /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = C495EFC916B933230041304E /* AppDelegate.m */; };
C495EFCC16B933230041304E /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = C495EFCA16B933230041304E /* main.m */; };
C495F01716B937F90041304E /* libcrypto.a in Frameworks */ = {isa = PBXBuildFile; fileRef = C495F01516B937F80041304E /* libcrypto.a */; };
C495F01816B937F90041304E /* libssl.a in Frameworks */ = {isa = PBXBuildFile; fileRef = C495F01616B937F90041304E /* libssl.a */; };
C495F01A16B938210041304E /* Security.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C495F01916B938210041304E /* Security.framework */; };
C495F01E16B938CB0041304E /* SystemConfiguration.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C495F01D16B938CA0041304E /* SystemConfiguration.framework */; };
C4B6A8821701979900AA836E /* libfreerdp-client-combined.a in Frameworks */ = {isa = PBXBuildFile; fileRef = C4B6A8811701979900AA836E /* libfreerdp-client-combined.a */; };
C4C31C6F16BAD1890087BB12 /* Default-568h@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = C4C31C6E16BAD1890087BB12 /* Default-568h@2x.png */; };
/* End PBXBuildFile section */
/* Begin PBXFileReference section */
C495EE2F16B8372D0041304E /* iFreeRDP.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = iFreeRDP.app; sourceTree = BUILT_PRODUCTS_DIR; };
C495EE3316B8372D0041304E /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = System/Library/Frameworks/UIKit.framework; sourceTree = SDKROOT; };
C495EE3516B8372D0041304E /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; };
C495EE3716B8372D0041304E /* CoreGraphics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreGraphics.framework; path = System/Library/Frameworks/CoreGraphics.framework; sourceTree = SDKROOT; };
C495EE4116B8372D0041304E /* iFreeRDP-Prefix.pch */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "iFreeRDP-Prefix.pch"; sourceTree = "<group>"; };
C495EE6D16B910510041304E /* iFreeRDP.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = iFreeRDP.plist; sourceTree = SOURCE_ROOT; };
C495EE6F16B9107D0041304E /* Defaults.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Defaults.plist; sourceTree = SOURCE_ROOT; };
C495EE7116B910BC0041304E /* OrderedDictionary.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = OrderedDictionary.h; path = Additions/OrderedDictionary.h; sourceTree = SOURCE_ROOT; };
C495EE7216B910BC0041304E /* OrderedDictionary.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = OrderedDictionary.m; path = Additions/OrderedDictionary.m; sourceTree = SOURCE_ROOT; };
C495EE7316B910BC0041304E /* Toast+UIView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "Toast+UIView.h"; path = "Additions/Toast+UIView.h"; sourceTree = SOURCE_ROOT; };
C495EE7416B910BC0041304E /* Toast+UIView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = "Toast+UIView.m"; path = "Additions/Toast+UIView.m"; sourceTree = SOURCE_ROOT; };
C495EE7516B910BC0041304E /* TSXAdditions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = TSXAdditions.h; path = Additions/TSXAdditions.h; sourceTree = SOURCE_ROOT; };
C495EE7616B910BC0041304E /* TSXAdditions.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = TSXAdditions.m; path = Additions/TSXAdditions.m; sourceTree = SOURCE_ROOT; };
C495EE7B16B910DE0041304E /* AboutController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = AboutController.h; path = Controllers/AboutController.h; sourceTree = SOURCE_ROOT; };
C495EE7C16B910DE0041304E /* AboutController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = AboutController.m; path = Controllers/AboutController.m; sourceTree = SOURCE_ROOT; };
C495EE7D16B910DE0041304E /* AdvancedBookmarkEditorController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = AdvancedBookmarkEditorController.h; path = Controllers/AdvancedBookmarkEditorController.h; sourceTree = SOURCE_ROOT; };
C495EE7E16B910DE0041304E /* AdvancedBookmarkEditorController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = AdvancedBookmarkEditorController.m; path = Controllers/AdvancedBookmarkEditorController.m; sourceTree = SOURCE_ROOT; };
C495EE7F16B910DE0041304E /* AppSettingsController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = AppSettingsController.h; path = Controllers/AppSettingsController.h; sourceTree = SOURCE_ROOT; };
C495EE8016B910DE0041304E /* AppSettingsController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = AppSettingsController.m; path = Controllers/AppSettingsController.m; sourceTree = SOURCE_ROOT; };
C495EE8116B910DE0041304E /* BookmarkEditorController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = BookmarkEditorController.h; path = Controllers/BookmarkEditorController.h; sourceTree = SOURCE_ROOT; };
C495EE8216B910DE0041304E /* BookmarkEditorController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = BookmarkEditorController.m; path = Controllers/BookmarkEditorController.m; sourceTree = SOURCE_ROOT; };
C495EE8316B910DE0041304E /* BookmarkListController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = BookmarkListController.h; path = Controllers/BookmarkListController.h; sourceTree = SOURCE_ROOT; };
C495EE8416B910DE0041304E /* BookmarkListController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = BookmarkListController.m; path = Controllers/BookmarkListController.m; sourceTree = SOURCE_ROOT; };
C495EE8516B910DE0041304E /* CredentialsEditorController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CredentialsEditorController.h; path = Controllers/CredentialsEditorController.h; sourceTree = SOURCE_ROOT; };
C495EE8616B910DE0041304E /* CredentialsEditorController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = CredentialsEditorController.m; path = Controllers/CredentialsEditorController.m; sourceTree = SOURCE_ROOT; };
C495EE8716B910DE0041304E /* CredentialsInputController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CredentialsInputController.h; path = Controllers/CredentialsInputController.h; sourceTree = SOURCE_ROOT; };
C495EE8816B910DE0041304E /* CredentialsInputController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = CredentialsInputController.m; path = Controllers/CredentialsInputController.m; sourceTree = SOURCE_ROOT; };
C495EE8916B910DE0041304E /* EditorBaseController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = EditorBaseController.h; path = Controllers/EditorBaseController.h; sourceTree = SOURCE_ROOT; };
C495EE8A16B910DE0041304E /* EditorBaseController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = EditorBaseController.m; path = Controllers/EditorBaseController.m; sourceTree = SOURCE_ROOT; };
C495EE8B16B910DE0041304E /* EditorSelectionController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = EditorSelectionController.h; path = Controllers/EditorSelectionController.h; sourceTree = SOURCE_ROOT; };
C495EE8C16B910DE0041304E /* EditorSelectionController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = EditorSelectionController.m; path = Controllers/EditorSelectionController.m; sourceTree = SOURCE_ROOT; };
C495EE8D16B910DE0041304E /* EncryptionController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = EncryptionController.h; path = Controllers/EncryptionController.h; sourceTree = SOURCE_ROOT; };
C495EE8E16B910DE0041304E /* EncryptionController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = EncryptionController.m; path = Controllers/EncryptionController.m; sourceTree = SOURCE_ROOT; };
C495EE8F16B910DE0041304E /* HelpController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = HelpController.h; path = Controllers/HelpController.h; sourceTree = SOURCE_ROOT; };
C495EE9016B910DE0041304E /* HelpController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = HelpController.m; path = Controllers/HelpController.m; sourceTree = SOURCE_ROOT; };
C495EE9116B910DE0041304E /* MainTabBarController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = MainTabBarController.h; path = Controllers/MainTabBarController.h; sourceTree = SOURCE_ROOT; };
C495EE9216B910DE0041304E /* MainTabBarController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = MainTabBarController.m; path = Controllers/MainTabBarController.m; sourceTree = SOURCE_ROOT; };
C495EE9316B910DE0041304E /* PerformanceEditorController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = PerformanceEditorController.h; path = Controllers/PerformanceEditorController.h; sourceTree = SOURCE_ROOT; };
C495EE9416B910DE0041304E /* PerformanceEditorController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = PerformanceEditorController.m; path = Controllers/PerformanceEditorController.m; sourceTree = SOURCE_ROOT; };
C495EE9516B910DE0041304E /* RDPSessionViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = RDPSessionViewController.h; path = Controllers/RDPSessionViewController.h; sourceTree = SOURCE_ROOT; };
C495EE9616B910DE0041304E /* RDPSessionViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = RDPSessionViewController.m; path = Controllers/RDPSessionViewController.m; sourceTree = SOURCE_ROOT; };
C495EE9716B910DE0041304E /* ScreenSelectionController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ScreenSelectionController.h; path = Controllers/ScreenSelectionController.h; sourceTree = SOURCE_ROOT; };
C495EE9816B910DE0041304E /* ScreenSelectionController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = ScreenSelectionController.m; path = Controllers/ScreenSelectionController.m; sourceTree = SOURCE_ROOT; };
C495EE9916B910DE0041304E /* VerifyCertificateController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = VerifyCertificateController.h; path = Controllers/VerifyCertificateController.h; sourceTree = SOURCE_ROOT; };
C495EE9A16B910DE0041304E /* VerifyCertificateController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = VerifyCertificateController.m; path = Controllers/VerifyCertificateController.m; sourceTree = SOURCE_ROOT; };
C495EEAC16B910F60041304E /* ios_freerdp_events.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ios_freerdp_events.h; path = FreeRDP/ios_freerdp_events.h; sourceTree = SOURCE_ROOT; };
C495EEAD16B910F60041304E /* ios_freerdp_events.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = ios_freerdp_events.m; path = FreeRDP/ios_freerdp_events.m; sourceTree = SOURCE_ROOT; };
C495EEAE16B910F60041304E /* ios_freerdp_ui.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ios_freerdp_ui.h; path = FreeRDP/ios_freerdp_ui.h; sourceTree = SOURCE_ROOT; };
C495EEAF16B910F60041304E /* ios_freerdp_ui.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = ios_freerdp_ui.m; path = FreeRDP/ios_freerdp_ui.m; sourceTree = SOURCE_ROOT; };
C495EEB016B910F60041304E /* ios_freerdp.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ios_freerdp.h; path = FreeRDP/ios_freerdp.h; sourceTree = SOURCE_ROOT; };
C495EEB116B910F60041304E /* ios_freerdp.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = ios_freerdp.m; path = FreeRDP/ios_freerdp.m; sourceTree = SOURCE_ROOT; };
C495EEB616B9111A0041304E /* Reachability.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = Reachability.h; path = Misc/Reachability.h; sourceTree = SOURCE_ROOT; };
C495EEB716B9111A0041304E /* Reachability.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = Reachability.m; path = Misc/Reachability.m; sourceTree = SOURCE_ROOT; };
C495EEB816B9111A0041304E /* SFHFKeychainUtils.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = SFHFKeychainUtils.h; path = Misc/SFHFKeychainUtils.h; sourceTree = SOURCE_ROOT; };
C495EEB916B9111A0041304E /* SFHFKeychainUtils.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = SFHFKeychainUtils.m; path = Misc/SFHFKeychainUtils.m; sourceTree = SOURCE_ROOT; };
C495EEBA16B9111A0041304E /* TSXTypes.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = TSXTypes.h; path = Misc/TSXTypes.h; sourceTree = SOURCE_ROOT; };
C495EEBB16B9111A0041304E /* Utils.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = Utils.h; path = Misc/Utils.h; sourceTree = SOURCE_ROOT; };
C495EEBC16B9111A0041304E /* Utils.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = Utils.m; path = Misc/Utils.m; sourceTree = SOURCE_ROOT; };
C495EEC116B911290041304E /* Bookmark.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = Bookmark.h; path = Models/Bookmark.h; sourceTree = SOURCE_ROOT; };
C495EEC216B911290041304E /* Bookmark.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = Bookmark.m; path = Models/Bookmark.m; sourceTree = SOURCE_ROOT; };
C495EEC316B911290041304E /* ConnectionParams.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ConnectionParams.h; path = Models/ConnectionParams.h; sourceTree = SOURCE_ROOT; };
C495EEC416B911290041304E /* ConnectionParams.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = ConnectionParams.m; path = Models/ConnectionParams.m; sourceTree = SOURCE_ROOT; };
C495EEC516B911290041304E /* Encryptor.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = Encryptor.h; path = Models/Encryptor.h; sourceTree = SOURCE_ROOT; };
C495EEC616B911290041304E /* Encryptor.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = Encryptor.m; path = Models/Encryptor.m; sourceTree = SOURCE_ROOT; };
C495EEC716B911290041304E /* GlobalDefaults.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GlobalDefaults.h; path = Models/GlobalDefaults.h; sourceTree = SOURCE_ROOT; };
C495EEC816B911290041304E /* GlobalDefaults.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GlobalDefaults.m; path = Models/GlobalDefaults.m; sourceTree = SOURCE_ROOT; };
C495EEC916B911290041304E /* RDPKeyboard.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = RDPKeyboard.h; path = Models/RDPKeyboard.h; sourceTree = SOURCE_ROOT; };
C495EECA16B911290041304E /* RDPKeyboard.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = RDPKeyboard.m; path = Models/RDPKeyboard.m; sourceTree = SOURCE_ROOT; };
C495EECB16B911290041304E /* RDPSession.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = RDPSession.h; path = Models/RDPSession.h; sourceTree = SOURCE_ROOT; };
C495EECC16B911290041304E /* RDPSession.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = RDPSession.m; path = Models/RDPSession.m; sourceTree = SOURCE_ROOT; };
C495EEDA16B911450041304E /* BookmarkListView.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; name = BookmarkListView.xib; path = Resources/BookmarkListView.xib; sourceTree = SOURCE_ROOT; };
C495EEDB16B911450041304E /* BookmarkTableViewCell.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; name = BookmarkTableViewCell.xib; path = Resources/BookmarkTableViewCell.xib; sourceTree = SOURCE_ROOT; };
C495EEDC16B911450041304E /* cancel_button_background.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = cancel_button_background.png; path = Resources/cancel_button_background.png; sourceTree = SOURCE_ROOT; };
C495EEDD16B911450041304E /* CredentialsInputView.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; name = CredentialsInputView.xib; path = Resources/CredentialsInputView.xib; sourceTree = SOURCE_ROOT; };
C495EEDE16B911450041304E /* Default-Landscape@2x~ipad.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "Default-Landscape@2x~ipad.png"; path = "Resources/Default-Landscape@2x~ipad.png"; sourceTree = SOURCE_ROOT; };
C495EEDF16B911450041304E /* Default-Landscape~ipad.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "Default-Landscape~ipad.png"; path = "Resources/Default-Landscape~ipad.png"; sourceTree = SOURCE_ROOT; };
C495EEE016B911450041304E /* Default-Portrait@2x~ipad.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "Default-Portrait@2x~ipad.png"; path = "Resources/Default-Portrait@2x~ipad.png"; sourceTree = SOURCE_ROOT; };
C495EEE116B911450041304E /* Default-Portrait~ipad.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "Default-Portrait~ipad.png"; path = "Resources/Default-Portrait~ipad.png"; sourceTree = SOURCE_ROOT; };
C495EEE216B911450041304E /* Default.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Default.png; path = Resources/Default.png; sourceTree = SOURCE_ROOT; };
C495EEE316B911450041304E /* Default@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "Default@2x.png"; path = "Resources/Default@2x.png"; sourceTree = SOURCE_ROOT; };
C495EEE416B911450041304E /* EditButtonTableViewCell.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; name = EditButtonTableViewCell.xib; path = Resources/EditButtonTableViewCell.xib; sourceTree = SOURCE_ROOT; };
C495EEE516B911450041304E /* EditFlagTableViewCell.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; name = EditFlagTableViewCell.xib; path = Resources/EditFlagTableViewCell.xib; sourceTree = SOURCE_ROOT; };
C495EEE616B911450041304E /* EditSecretTextTableViewCell.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; name = EditSecretTextTableViewCell.xib; path = Resources/EditSecretTextTableViewCell.xib; sourceTree = SOURCE_ROOT; };
C495EEE716B911450041304E /* EditSelectionTableViewCell.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; name = EditSelectionTableViewCell.xib; path = Resources/EditSelectionTableViewCell.xib; sourceTree = SOURCE_ROOT; };
C495EEE816B911450041304E /* EditSubEditTableViewCell.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; name = EditSubEditTableViewCell.xib; path = Resources/EditSubEditTableViewCell.xib; sourceTree = SOURCE_ROOT; };
C495EEE916B911450041304E /* EditTextTableViewCell.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; name = EditTextTableViewCell.xib; path = Resources/EditTextTableViewCell.xib; sourceTree = SOURCE_ROOT; };
C495EEFE16B911450041304E /* icon_accessory_star_off.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = icon_accessory_star_off.png; path = Resources/icon_accessory_star_off.png; sourceTree = SOURCE_ROOT; };
C495EEFF16B911450041304E /* icon_accessory_star_on.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = icon_accessory_star_on.png; path = Resources/icon_accessory_star_on.png; sourceTree = SOURCE_ROOT; };
C495EF0016B911450041304E /* icon_key_arrow_down.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = icon_key_arrow_down.png; path = Resources/icon_key_arrow_down.png; sourceTree = SOURCE_ROOT; };
C495EF0116B911450041304E /* icon_key_arrow_left.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = icon_key_arrow_left.png; path = Resources/icon_key_arrow_left.png; sourceTree = SOURCE_ROOT; };
C495EF0216B911450041304E /* icon_key_arrow_right.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = icon_key_arrow_right.png; path = Resources/icon_key_arrow_right.png; sourceTree = SOURCE_ROOT; };
C495EF0316B911450041304E /* icon_key_arrow_up.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = icon_key_arrow_up.png; path = Resources/icon_key_arrow_up.png; sourceTree = SOURCE_ROOT; };
C495EF0416B911450041304E /* icon_key_arrows.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = icon_key_arrows.png; path = Resources/icon_key_arrows.png; sourceTree = SOURCE_ROOT; };
C495EF0516B911450041304E /* icon_key_backspace.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = icon_key_backspace.png; path = Resources/icon_key_backspace.png; sourceTree = SOURCE_ROOT; };
C495EF0616B911450041304E /* icon_key_menu.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = icon_key_menu.png; path = Resources/icon_key_menu.png; sourceTree = SOURCE_ROOT; };
C495EF0716B911450041304E /* icon_key_return.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = icon_key_return.png; path = Resources/icon_key_return.png; sourceTree = SOURCE_ROOT; };
C495EF0816B911450041304E /* icon_key_win.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = icon_key_win.png; path = Resources/icon_key_win.png; sourceTree = SOURCE_ROOT; };
C495EF0916B911450041304E /* Icon-72.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "Icon-72.png"; path = "Resources/Icon-72.png"; sourceTree = SOURCE_ROOT; };
C495EF0A16B911450041304E /* Icon-72@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "Icon-72@2x.png"; path = "Resources/Icon-72@2x.png"; sourceTree = SOURCE_ROOT; };
C495EF0B16B911450041304E /* Icon.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Icon.png; path = Resources/Icon.png; sourceTree = SOURCE_ROOT; };
C495EF0C16B911450041304E /* Icon@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "Icon@2x.png"; path = "Resources/Icon@2x.png"; sourceTree = SOURCE_ROOT; };
C495EF0D16B911450041304E /* keyboard_button_background.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = keyboard_button_background.png; path = Resources/keyboard_button_background.png; sourceTree = SOURCE_ROOT; };
C495EF0E16B911450041304E /* MainWindow.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; name = MainWindow.xib; path = Resources/MainWindow.xib; sourceTree = SOURCE_ROOT; };
C495EF0F16B911450041304E /* RDPConnectingView.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; name = RDPConnectingView.xib; path = Resources/RDPConnectingView.xib; sourceTree = SOURCE_ROOT; };
C495EF1016B911450041304E /* RDPSessionView.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; name = RDPSessionView.xib; path = Resources/RDPSessionView.xib; sourceTree = SOURCE_ROOT; };
C495EF1116B911450041304E /* SessionTableViewCell.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; name = SessionTableViewCell.xib; path = Resources/SessionTableViewCell.xib; sourceTree = SOURCE_ROOT; };
C495EF1216B911450041304E /* tabbar_icon_about.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = tabbar_icon_about.png; path = Resources/tabbar_icon_about.png; sourceTree = SOURCE_ROOT; };
C495EF1316B911450041304E /* tabbar_icon_help.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = tabbar_icon_help.png; path = Resources/tabbar_icon_help.png; sourceTree = SOURCE_ROOT; };
C495EF1416B911450041304E /* tabbar_icon_settings.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = tabbar_icon_settings.png; path = Resources/tabbar_icon_settings.png; sourceTree = SOURCE_ROOT; };
C495EF1516B911450041304E /* toolbar_icon_disconnect.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = toolbar_icon_disconnect.png; path = Resources/toolbar_icon_disconnect.png; sourceTree = SOURCE_ROOT; };
C495EF1616B911450041304E /* toolbar_icon_extkeyboad.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = toolbar_icon_extkeyboad.png; path = Resources/toolbar_icon_extkeyboad.png; sourceTree = SOURCE_ROOT; };
C495EF1716B911450041304E /* toolbar_icon_home.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = toolbar_icon_home.png; path = Resources/toolbar_icon_home.png; sourceTree = SOURCE_ROOT; };
C495EF1816B911450041304E /* toolbar_icon_keyboard.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = toolbar_icon_keyboard.png; path = Resources/toolbar_icon_keyboard.png; sourceTree = SOURCE_ROOT; };
C495EF1916B911450041304E /* toolbar_icon_touchpointer.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = toolbar_icon_touchpointer.png; path = Resources/toolbar_icon_touchpointer.png; sourceTree = SOURCE_ROOT; };
C495EF1A16B911450041304E /* toolbar_icon_win.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = toolbar_icon_win.png; path = Resources/toolbar_icon_win.png; sourceTree = SOURCE_ROOT; };
C495EF1B16B911450041304E /* touch_pointer_active.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = touch_pointer_active.png; path = Resources/touch_pointer_active.png; sourceTree = SOURCE_ROOT; };
C495EF1C16B911450041304E /* touch_pointer_default.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = touch_pointer_default.png; path = Resources/touch_pointer_default.png; sourceTree = SOURCE_ROOT; };
C495EF1D16B911450041304E /* touch_pointer_extkeyboard.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = touch_pointer_extkeyboard.png; path = Resources/touch_pointer_extkeyboard.png; sourceTree = SOURCE_ROOT; };
C495EF1E16B911450041304E /* touch_pointer_keyboard.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = touch_pointer_keyboard.png; path = Resources/touch_pointer_keyboard.png; sourceTree = SOURCE_ROOT; };
C495EF1F16B911450041304E /* touch_pointer_lclick.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = touch_pointer_lclick.png; path = Resources/touch_pointer_lclick.png; sourceTree = SOURCE_ROOT; };
C495EF2016B911450041304E /* touch_pointer_rclick.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = touch_pointer_rclick.png; path = Resources/touch_pointer_rclick.png; sourceTree = SOURCE_ROOT; };
C495EF2116B911450041304E /* touch_pointer_reset.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = touch_pointer_reset.png; path = Resources/touch_pointer_reset.png; sourceTree = SOURCE_ROOT; };
C495EF2216B911450041304E /* touch_pointer_scroll.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = touch_pointer_scroll.png; path = Resources/touch_pointer_scroll.png; sourceTree = SOURCE_ROOT; };
C495EF2316B911450041304E /* VerifyCertificateView.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; name = VerifyCertificateView.xib; path = Resources/VerifyCertificateView.xib; sourceTree = SOURCE_ROOT; };
C495EF8216B911AB0041304E /* AdvancedKeyboardView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = AdvancedKeyboardView.h; path = Views/AdvancedKeyboardView.h; sourceTree = SOURCE_ROOT; };
C495EF8316B911AB0041304E /* AdvancedKeyboardView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = AdvancedKeyboardView.m; path = Views/AdvancedKeyboardView.m; sourceTree = SOURCE_ROOT; };
C495EF8416B911AB0041304E /* BookmarkTableCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = BookmarkTableCell.h; path = Views/BookmarkTableCell.h; sourceTree = SOURCE_ROOT; };
C495EF8516B911AB0041304E /* BookmarkTableCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = BookmarkTableCell.m; path = Views/BookmarkTableCell.m; sourceTree = SOURCE_ROOT; };
C495EF8616B911AB0041304E /* EditButtonTableViewCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = EditButtonTableViewCell.h; path = Views/EditButtonTableViewCell.h; sourceTree = SOURCE_ROOT; };
C495EF8716B911AB0041304E /* EditButtonTableViewCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = EditButtonTableViewCell.m; path = Views/EditButtonTableViewCell.m; sourceTree = SOURCE_ROOT; };
C495EF8816B911AB0041304E /* EditFlagTableViewCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = EditFlagTableViewCell.h; path = Views/EditFlagTableViewCell.h; sourceTree = SOURCE_ROOT; };
C495EF8916B911AB0041304E /* EditFlagTableViewCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = EditFlagTableViewCell.m; path = Views/EditFlagTableViewCell.m; sourceTree = SOURCE_ROOT; };
C495EF8A16B911AB0041304E /* EditSecretTextTableViewCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = EditSecretTextTableViewCell.h; path = Views/EditSecretTextTableViewCell.h; sourceTree = SOURCE_ROOT; };
C495EF8B16B911AB0041304E /* EditSecretTextTableViewCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = EditSecretTextTableViewCell.m; path = Views/EditSecretTextTableViewCell.m; sourceTree = SOURCE_ROOT; };
C495EF8C16B911AB0041304E /* EditSelectionTableViewCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = EditSelectionTableViewCell.h; path = Views/EditSelectionTableViewCell.h; sourceTree = SOURCE_ROOT; };
C495EF8D16B911AB0041304E /* EditSelectionTableViewCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = EditSelectionTableViewCell.m; path = Views/EditSelectionTableViewCell.m; sourceTree = SOURCE_ROOT; };
C495EF8E16B911AB0041304E /* EditSubEditTableViewCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = EditSubEditTableViewCell.h; path = Views/EditSubEditTableViewCell.h; sourceTree = SOURCE_ROOT; };
C495EF8F16B911AB0041304E /* EditSubEditTableViewCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = EditSubEditTableViewCell.m; path = Views/EditSubEditTableViewCell.m; sourceTree = SOURCE_ROOT; };
C495EF9016B911AB0041304E /* EditTextTableViewCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = EditTextTableViewCell.h; path = Views/EditTextTableViewCell.h; sourceTree = SOURCE_ROOT; };
C495EF9116B911AB0041304E /* EditTextTableViewCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = EditTextTableViewCell.m; path = Views/EditTextTableViewCell.m; sourceTree = SOURCE_ROOT; };
C495EF9216B911AB0041304E /* RDPSessionView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = RDPSessionView.h; path = Views/RDPSessionView.h; sourceTree = SOURCE_ROOT; };
C495EF9316B911AB0041304E /* RDPSessionView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = RDPSessionView.m; path = Views/RDPSessionView.m; sourceTree = SOURCE_ROOT; };
C495EF9416B911AB0041304E /* SessionTableCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = SessionTableCell.h; path = Views/SessionTableCell.h; sourceTree = SOURCE_ROOT; };
C495EF9516B911AB0041304E /* SessionTableCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = SessionTableCell.m; path = Views/SessionTableCell.m; sourceTree = SOURCE_ROOT; };
C495EF9616B911AB0041304E /* TouchPointerView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = TouchPointerView.h; path = Views/TouchPointerView.h; sourceTree = SOURCE_ROOT; };
C495EF9716B911AB0041304E /* TouchPointerView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = TouchPointerView.m; path = Views/TouchPointerView.m; sourceTree = SOURCE_ROOT; };
C495EFAA16B912C40041304E /* libfreerdp.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libfreerdp.a; path = ../../libfreerdp/libfreerdp.a; sourceTree = "<group>"; };
C495EFAD16B913980041304E /* libwinpr.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libwinpr.a; path = ../../winpr/libwinpr/libwinpr.a; sourceTree = "<group>"; };
C495EFBA16B92E170041304E /* about_page */ = {isa = PBXFileReference; lastKnownFileType = folder; name = about_page; path = Resources/about_page; sourceTree = SOURCE_ROOT; };
C495EFBC16B92E270041304E /* help_page */ = {isa = PBXFileReference; lastKnownFileType = folder; name = help_page; path = Resources/help_page; sourceTree = SOURCE_ROOT; };
C495EFC116B92EA20041304E /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = Resources/en.lproj/Localizable.strings; sourceTree = SOURCE_ROOT; };
C495EFC816B933220041304E /* AppDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = SOURCE_ROOT; };
C495EFC916B933230041304E /* AppDelegate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AppDelegate.m; sourceTree = SOURCE_ROOT; };
C495EFCA16B933230041304E /* main.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = SOURCE_ROOT; };
C495F01516B937F80041304E /* libcrypto.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libcrypto.a; path = @FREERDP_IOS_EXTERNAL_SSL_PATH@/lib/libcrypto.a; sourceTree = "<group>"; };
C495F01616B937F90041304E /* libssl.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libssl.a; path = @FREERDP_IOS_EXTERNAL_SSL_PATH@/lib/libssl.a; sourceTree = "<group>"; };
C495F01916B938210041304E /* Security.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Security.framework; path = System/Library/Frameworks/Security.framework; sourceTree = SDKROOT; };
C495F01D16B938CA0041304E /* SystemConfiguration.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = SystemConfiguration.framework; path = System/Library/Frameworks/SystemConfiguration.framework; sourceTree = SDKROOT; };
C4B6A8811701979900AA836E /* libfreerdp-client-combined.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = "libfreerdp-client-combined.a"; path = "../common/libfreerdp-client-combined.a"; sourceTree = "<group>"; };
C4C31C6E16BAD1890087BB12 /* Default-568h@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "Default-568h@2x.png"; path = "Resources/Default-568h@2x.png"; sourceTree = SOURCE_ROOT; };
/* End PBXFileReference section */
/* Begin PBXFrameworksBuildPhase section */
C495EE2C16B8372D0041304E /* Frameworks */ = {
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
C495F01716B937F90041304E /* libcrypto.a in Frameworks */,
C495F01816B937F90041304E /* libssl.a in Frameworks */,
C495EFAE16B913980041304E /* libwinpr.a in Frameworks */,
C495EFAB16B912C40041304E /* libfreerdp.a in Frameworks */,
C495EE3416B8372D0041304E /* UIKit.framework in Frameworks */,
C495EE3616B8372D0041304E /* Foundation.framework in Frameworks */,
C495EE3816B8372D0041304E /* CoreGraphics.framework in Frameworks */,
C495F01A16B938210041304E /* Security.framework in Frameworks */,
C495F01E16B938CB0041304E /* SystemConfiguration.framework in Frameworks */,
C4B6A8821701979900AA836E /* libfreerdp-client-combined.a in Frameworks */,
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXFrameworksBuildPhase section */
/* Begin PBXGroup section */
C495EE2416B8372D0041304E = {
isa = PBXGroup;
children = (
C495EE3916B8372D0041304E /* iFreeRDP */,
C495EE3216B8372D0041304E /* Frameworks */,
C495EE3016B8372D0041304E /* Products */,
);
sourceTree = "<group>";
};
C495EE3016B8372D0041304E /* Products */ = {
isa = PBXGroup;
children = (
C495EE2F16B8372D0041304E /* iFreeRDP.app */,
);
name = Products;
sourceTree = "<group>";
};
C495EE3216B8372D0041304E /* Frameworks */ = {
isa = PBXGroup;
children = (
C4B6A8811701979900AA836E /* libfreerdp-client-combined.a */,
C495EFAA16B912C40041304E /* libfreerdp.a */,
C495EFAD16B913980041304E /* libwinpr.a */,
C495F01516B937F80041304E /* libcrypto.a */,
C495F01616B937F90041304E /* libssl.a */,
C495F01D16B938CA0041304E /* SystemConfiguration.framework */,
C495F01916B938210041304E /* Security.framework */,
C495EE3316B8372D0041304E /* UIKit.framework */,
C495EE3516B8372D0041304E /* Foundation.framework */,
C495EE3716B8372D0041304E /* CoreGraphics.framework */,
);
name = Frameworks;
sourceTree = "<group>";
};
C495EE3916B8372D0041304E /* iFreeRDP */ = {
isa = PBXGroup;
children = (
C495EE3A16B8372D0041304E /* Cocoa and Foundation Additions */,
C495EE7A16B910CB0041304E /* Controllers */,
C495EEAB16B910E90041304E /* FreeRDP */,
C495EEB516B910FA0041304E /* Misc */,
C495EEC016B9111E0041304E /* Models */,
C495EED316B9112E0041304E /* Resources */,
C495EF8116B911940041304E /* Views */,
C495EFC816B933220041304E /* AppDelegate.h */,
C495EFC916B933230041304E /* AppDelegate.m */,
C495EFCA16B933230041304E /* main.m */,
C495EE6F16B9107D0041304E /* Defaults.plist */,
C495EE6D16B910510041304E /* iFreeRDP.plist */,
C495EE4116B8372D0041304E /* iFreeRDP-Prefix.pch */,
);
path = iFreeRDP;
sourceTree = "<group>";
};
C495EE3A16B8372D0041304E /* Cocoa and Foundation Additions */ = {
isa = PBXGroup;
children = (
C495EE7116B910BC0041304E /* OrderedDictionary.h */,
C495EE7216B910BC0041304E /* OrderedDictionary.m */,
C495EE7316B910BC0041304E /* Toast+UIView.h */,
C495EE7416B910BC0041304E /* Toast+UIView.m */,
C495EE7516B910BC0041304E /* TSXAdditions.h */,
C495EE7616B910BC0041304E /* TSXAdditions.m */,
);
name = "Cocoa and Foundation Additions";
sourceTree = "<group>";
};
C495EE7A16B910CB0041304E /* Controllers */ = {
isa = PBXGroup;
children = (
C495EE7B16B910DE0041304E /* AboutController.h */,
C495EE7C16B910DE0041304E /* AboutController.m */,
C495EE7D16B910DE0041304E /* AdvancedBookmarkEditorController.h */,
C495EE7E16B910DE0041304E /* AdvancedBookmarkEditorController.m */,
C495EE7F16B910DE0041304E /* AppSettingsController.h */,
C495EE8016B910DE0041304E /* AppSettingsController.m */,
C495EE8116B910DE0041304E /* BookmarkEditorController.h */,
C495EE8216B910DE0041304E /* BookmarkEditorController.m */,
C495EE8316B910DE0041304E /* BookmarkListController.h */,
C495EE8416B910DE0041304E /* BookmarkListController.m */,
C495EE8516B910DE0041304E /* CredentialsEditorController.h */,
C495EE8616B910DE0041304E /* CredentialsEditorController.m */,
C495EE8716B910DE0041304E /* CredentialsInputController.h */,
C495EE8816B910DE0041304E /* CredentialsInputController.m */,
C495EE8916B910DE0041304E /* EditorBaseController.h */,
C495EE8A16B910DE0041304E /* EditorBaseController.m */,
C495EE8B16B910DE0041304E /* EditorSelectionController.h */,
C495EE8C16B910DE0041304E /* EditorSelectionController.m */,
C495EE8D16B910DE0041304E /* EncryptionController.h */,
C495EE8E16B910DE0041304E /* EncryptionController.m */,
C495EE8F16B910DE0041304E /* HelpController.h */,
C495EE9016B910DE0041304E /* HelpController.m */,
C495EE9116B910DE0041304E /* MainTabBarController.h */,
C495EE9216B910DE0041304E /* MainTabBarController.m */,
C495EE9316B910DE0041304E /* PerformanceEditorController.h */,
C495EE9416B910DE0041304E /* PerformanceEditorController.m */,
C495EE9516B910DE0041304E /* RDPSessionViewController.h */,
C495EE9616B910DE0041304E /* RDPSessionViewController.m */,
C495EE9716B910DE0041304E /* ScreenSelectionController.h */,
C495EE9816B910DE0041304E /* ScreenSelectionController.m */,
C495EE9916B910DE0041304E /* VerifyCertificateController.h */,
C495EE9A16B910DE0041304E /* VerifyCertificateController.m */,
);
name = Controllers;
sourceTree = "<group>";
};
C495EEAB16B910E90041304E /* FreeRDP */ = {
isa = PBXGroup;
children = (
C495EEAC16B910F60041304E /* ios_freerdp_events.h */,
C495EEAD16B910F60041304E /* ios_freerdp_events.m */,
C495EEAE16B910F60041304E /* ios_freerdp_ui.h */,
C495EEAF16B910F60041304E /* ios_freerdp_ui.m */,
C495EEB016B910F60041304E /* ios_freerdp.h */,
C495EEB116B910F60041304E /* ios_freerdp.m */,
);
name = FreeRDP;
sourceTree = "<group>";
};
C495EEB516B910FA0041304E /* Misc */ = {
isa = PBXGroup;
children = (
C495EEB616B9111A0041304E /* Reachability.h */,
C495EEB716B9111A0041304E /* Reachability.m */,
C495EEB816B9111A0041304E /* SFHFKeychainUtils.h */,
C495EEB916B9111A0041304E /* SFHFKeychainUtils.m */,
C495EEBA16B9111A0041304E /* TSXTypes.h */,
C495EEBB16B9111A0041304E /* Utils.h */,
C495EEBC16B9111A0041304E /* Utils.m */,
);
name = Misc;
sourceTree = "<group>";
};
C495EEC016B9111E0041304E /* Models */ = {
isa = PBXGroup;
children = (
C495EEC116B911290041304E /* Bookmark.h */,
C495EEC216B911290041304E /* Bookmark.m */,
C495EEC316B911290041304E /* ConnectionParams.h */,
C495EEC416B911290041304E /* ConnectionParams.m */,
C495EEC516B911290041304E /* Encryptor.h */,
C495EEC616B911290041304E /* Encryptor.m */,
C495EEC716B911290041304E /* GlobalDefaults.h */,
C495EEC816B911290041304E /* GlobalDefaults.m */,
C495EEC916B911290041304E /* RDPKeyboard.h */,
C495EECA16B911290041304E /* RDPKeyboard.m */,
C495EECB16B911290041304E /* RDPSession.h */,
C495EECC16B911290041304E /* RDPSession.m */,
);
name = Models;
sourceTree = "<group>";
};
C495EED316B9112E0041304E /* Resources */ = {
isa = PBXGroup;
children = (
C4C31C6E16BAD1890087BB12 /* Default-568h@2x.png */,
C495EFC016B92EA20041304E /* Localizable.strings */,
C495EFBC16B92E270041304E /* help_page */,
C495EFBA16B92E170041304E /* about_page */,
C495EEDC16B911450041304E /* cancel_button_background.png */,
C495EEDE16B911450041304E /* Default-Landscape@2x~ipad.png */,
C495EEDF16B911450041304E /* Default-Landscape~ipad.png */,
C495EEE016B911450041304E /* Default-Portrait@2x~ipad.png */,
C495EEE116B911450041304E /* Default-Portrait~ipad.png */,
C495EEE216B911450041304E /* Default.png */,
C495EEE316B911450041304E /* Default@2x.png */,
C495EEFE16B911450041304E /* icon_accessory_star_off.png */,
C495EEFF16B911450041304E /* icon_accessory_star_on.png */,
C495EF0016B911450041304E /* icon_key_arrow_down.png */,
C495EF0116B911450041304E /* icon_key_arrow_left.png */,
C495EF0216B911450041304E /* icon_key_arrow_right.png */,
C495EF0316B911450041304E /* icon_key_arrow_up.png */,
C495EF0416B911450041304E /* icon_key_arrows.png */,
C495EF0516B911450041304E /* icon_key_backspace.png */,
C495EF0616B911450041304E /* icon_key_menu.png */,
C495EF0716B911450041304E /* icon_key_return.png */,
C495EF0816B911450041304E /* icon_key_win.png */,
C495EF0916B911450041304E /* Icon-72.png */,
C495EF0A16B911450041304E /* Icon-72@2x.png */,
C495EF0B16B911450041304E /* Icon.png */,
C495EF0C16B911450041304E /* Icon@2x.png */,
C495EF0D16B911450041304E /* keyboard_button_background.png */,
C495EF1216B911450041304E /* tabbar_icon_about.png */,
C495EF1316B911450041304E /* tabbar_icon_help.png */,
C495EF1416B911450041304E /* tabbar_icon_settings.png */,
C495EF1516B911450041304E /* toolbar_icon_disconnect.png */,
C495EF1616B911450041304E /* toolbar_icon_extkeyboad.png */,
C495EF1716B911450041304E /* toolbar_icon_home.png */,
C495EF1816B911450041304E /* toolbar_icon_keyboard.png */,
C495EF1916B911450041304E /* toolbar_icon_touchpointer.png */,
C495EF1A16B911450041304E /* toolbar_icon_win.png */,
C495EF1B16B911450041304E /* touch_pointer_active.png */,
C495EF1C16B911450041304E /* touch_pointer_default.png */,
C495EF1D16B911450041304E /* touch_pointer_extkeyboard.png */,
C495EF1E16B911450041304E /* touch_pointer_keyboard.png */,
C495EF1F16B911450041304E /* touch_pointer_lclick.png */,
C495EF2016B911450041304E /* touch_pointer_rclick.png */,
C495EF2116B911450041304E /* touch_pointer_reset.png */,
C495EF2216B911450041304E /* touch_pointer_scroll.png */,
);
name = Resources;
sourceTree = "<group>";
};
C495EF8116B911940041304E /* Views */ = {
isa = PBXGroup;
children = (
C495EEDA16B911450041304E /* BookmarkListView.xib */,
C495EEDB16B911450041304E /* BookmarkTableViewCell.xib */,
C495EEDD16B911450041304E /* CredentialsInputView.xib */,
C495EEE416B911450041304E /* EditButtonTableViewCell.xib */,
C495EEE516B911450041304E /* EditFlagTableViewCell.xib */,
C495EEE616B911450041304E /* EditSecretTextTableViewCell.xib */,
C495EEE716B911450041304E /* EditSelectionTableViewCell.xib */,
C495EEE816B911450041304E /* EditSubEditTableViewCell.xib */,
C495EEE916B911450041304E /* EditTextTableViewCell.xib */,
C495EF0E16B911450041304E /* MainWindow.xib */,
C495EF0F16B911450041304E /* RDPConnectingView.xib */,
C495EF1016B911450041304E /* RDPSessionView.xib */,
C495EF1116B911450041304E /* SessionTableViewCell.xib */,
C495EF2316B911450041304E /* VerifyCertificateView.xib */,
C495EF8216B911AB0041304E /* AdvancedKeyboardView.h */,
C495EF8316B911AB0041304E /* AdvancedKeyboardView.m */,
C495EF8416B911AB0041304E /* BookmarkTableCell.h */,
C495EF8516B911AB0041304E /* BookmarkTableCell.m */,
C495EF8616B911AB0041304E /* EditButtonTableViewCell.h */,
C495EF8716B911AB0041304E /* EditButtonTableViewCell.m */,
C495EF8816B911AB0041304E /* EditFlagTableViewCell.h */,
C495EF8916B911AB0041304E /* EditFlagTableViewCell.m */,
C495EF8A16B911AB0041304E /* EditSecretTextTableViewCell.h */,
C495EF8B16B911AB0041304E /* EditSecretTextTableViewCell.m */,
C495EF8C16B911AB0041304E /* EditSelectionTableViewCell.h */,
C495EF8D16B911AB0041304E /* EditSelectionTableViewCell.m */,
C495EF8E16B911AB0041304E /* EditSubEditTableViewCell.h */,
C495EF8F16B911AB0041304E /* EditSubEditTableViewCell.m */,
C495EF9016B911AB0041304E /* EditTextTableViewCell.h */,
C495EF9116B911AB0041304E /* EditTextTableViewCell.m */,
C495EF9216B911AB0041304E /* RDPSessionView.h */,
C495EF9316B911AB0041304E /* RDPSessionView.m */,
C495EF9416B911AB0041304E /* SessionTableCell.h */,
C495EF9516B911AB0041304E /* SessionTableCell.m */,
C495EF9616B911AB0041304E /* TouchPointerView.h */,
C495EF9716B911AB0041304E /* TouchPointerView.m */,
);
name = Views;
sourceTree = "<group>";
};
/* End PBXGroup section */
/* Begin PBXNativeTarget section */
C495EE2E16B8372D0041304E /* iFreeRDP */ = {
isa = PBXNativeTarget;
buildConfigurationList = C495EE6216B8372D0041304E /* Build configuration list for PBXNativeTarget "iFreeRDP" */;
buildPhases = (
C495EE2B16B8372D0041304E /* Sources */,
C495EE2C16B8372D0041304E /* Frameworks */,
C495EE2D16B8372D0041304E /* Resources */,
);
buildRules = (
);
dependencies = (
);
name = iFreeRDP;
productName = iFreeRDP;
productReference = C495EE2F16B8372D0041304E /* iFreeRDP.app */;
productType = "com.apple.product-type.application";
};
/* End PBXNativeTarget section */
/* Begin PBXProject section */
C495EE2616B8372D0041304E /* Project object */ = {
isa = PBXProject;
attributes = {
LastUpgradeCheck = 0450;
ORGANIZATIONNAME = freerdp;
};
buildConfigurationList = C495EE2916B8372D0041304E /* Build configuration list for PBXProject "iFreeRDP" */;
compatibilityVersion = "Xcode 3.2";
developmentRegion = English;
hasScannedForEncodings = 0;
knownRegions = (
en,
);
mainGroup = C495EE2416B8372D0041304E;
productRefGroup = C495EE3016B8372D0041304E /* Products */;
projectDirPath = "";
projectRoot = "";
targets = (
C495EE2E16B8372D0041304E /* iFreeRDP */,
);
};
/* End PBXProject section */
/* Begin PBXResourcesBuildPhase section */
C495EE2D16B8372D0041304E /* Resources */ = {
isa = PBXResourcesBuildPhase;
buildActionMask = 2147483647;
files = (
C495EE7016B9107D0041304E /* Defaults.plist in Resources */,
C495EF3216B911450041304E /* BookmarkListView.xib in Resources */,
C495EF3316B911450041304E /* BookmarkTableViewCell.xib in Resources */,
C495EF3416B911450041304E /* cancel_button_background.png in Resources */,
C495EF3516B911450041304E /* CredentialsInputView.xib in Resources */,
C495EF3616B911450041304E /* Default-Landscape@2x~ipad.png in Resources */,
C495EF3716B911450041304E /* Default-Landscape~ipad.png in Resources */,
C495EF3816B911450041304E /* Default-Portrait@2x~ipad.png in Resources */,
C495EF3916B911450041304E /* Default-Portrait~ipad.png in Resources */,
C495EF3A16B911450041304E /* Default.png in Resources */,
C495EF3B16B911450041304E /* Default@2x.png in Resources */,
C495EF3C16B911450041304E /* EditButtonTableViewCell.xib in Resources */,
C495EF3D16B911450041304E /* EditFlagTableViewCell.xib in Resources */,
C495EF3E16B911450041304E /* EditSecretTextTableViewCell.xib in Resources */,
C495EF3F16B911450041304E /* EditSelectionTableViewCell.xib in Resources */,
C495EF4016B911450041304E /* EditSubEditTableViewCell.xib in Resources */,
C495EF4116B911450041304E /* EditTextTableViewCell.xib in Resources */,
C495EF5316B911450041304E /* icon_accessory_star_off.png in Resources */,
C495EF5416B911450041304E /* icon_accessory_star_on.png in Resources */,
C495EF5516B911450041304E /* icon_key_arrow_down.png in Resources */,
C495EF5616B911450041304E /* icon_key_arrow_left.png in Resources */,
C495EF5716B911450041304E /* icon_key_arrow_right.png in Resources */,
C495EF5816B911450041304E /* icon_key_arrow_up.png in Resources */,
C495EF5916B911450041304E /* icon_key_arrows.png in Resources */,
C495EF5A16B911450041304E /* icon_key_backspace.png in Resources */,
C495EF5B16B911450041304E /* icon_key_menu.png in Resources */,
C495EF5C16B911450041304E /* icon_key_return.png in Resources */,
C495EF5D16B911450041304E /* icon_key_win.png in Resources */,
C495EF5E16B911450041304E /* Icon-72.png in Resources */,
C495EF5F16B911450041304E /* Icon-72@2x.png in Resources */,
C495EF6016B911450041304E /* Icon.png in Resources */,
C495EF6116B911450041304E /* Icon@2x.png in Resources */,
C495EF6216B911450041304E /* keyboard_button_background.png in Resources */,
C495EF6316B911450041304E /* MainWindow.xib in Resources */,
C495EF6416B911450041304E /* RDPConnectingView.xib in Resources */,
C495EF6516B911450041304E /* RDPSessionView.xib in Resources */,
C495EF6616B911450041304E /* SessionTableViewCell.xib in Resources */,
C495EF6716B911450041304E /* tabbar_icon_about.png in Resources */,
C495EF6816B911450041304E /* tabbar_icon_help.png in Resources */,
C495EF6916B911450041304E /* tabbar_icon_settings.png in Resources */,
C495EF6A16B911450041304E /* toolbar_icon_disconnect.png in Resources */,
C495EF6B16B911450041304E /* toolbar_icon_extkeyboad.png in Resources */,
C495EF6C16B911450041304E /* toolbar_icon_home.png in Resources */,
C495EF6D16B911450041304E /* toolbar_icon_keyboard.png in Resources */,
C495EF6E16B911450041304E /* toolbar_icon_touchpointer.png in Resources */,
C495EF6F16B911450041304E /* toolbar_icon_win.png in Resources */,
C495EF7016B911450041304E /* touch_pointer_active.png in Resources */,
C495EF7116B911450041304E /* touch_pointer_default.png in Resources */,
C495EF7216B911450041304E /* touch_pointer_extkeyboard.png in Resources */,
C495EF7316B911450041304E /* touch_pointer_keyboard.png in Resources */,
C495EF7416B911450041304E /* touch_pointer_lclick.png in Resources */,
C495EF7516B911450041304E /* touch_pointer_rclick.png in Resources */,
C495EF7616B911450041304E /* touch_pointer_reset.png in Resources */,
C495EF7716B911450041304E /* touch_pointer_scroll.png in Resources */,
C495EF7816B911450041304E /* VerifyCertificateView.xib in Resources */,
C495EFBB16B92E170041304E /* about_page in Resources */,
C495EFBD16B92E270041304E /* help_page in Resources */,
C495EFC216B92EA20041304E /* Localizable.strings in Resources */,
C4C31C6F16BAD1890087BB12 /* Default-568h@2x.png in Resources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXResourcesBuildPhase section */
/* Begin PBXSourcesBuildPhase section */
C495EE2B16B8372D0041304E /* Sources */ = {
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
files = (
C495EE7716B910BC0041304E /* OrderedDictionary.m in Sources */,
C495EE7816B910BC0041304E /* Toast+UIView.m in Sources */,
C495EE7916B910BC0041304E /* TSXAdditions.m in Sources */,
C495EE9B16B910DE0041304E /* AboutController.m in Sources */,
C495EE9C16B910DE0041304E /* AdvancedBookmarkEditorController.m in Sources */,
C495EE9D16B910DE0041304E /* AppSettingsController.m in Sources */,
C495EE9E16B910DE0041304E /* BookmarkEditorController.m in Sources */,
C495EE9F16B910DE0041304E /* BookmarkListController.m in Sources */,
C495EEA016B910DE0041304E /* CredentialsEditorController.m in Sources */,
C495EEA116B910DE0041304E /* CredentialsInputController.m in Sources */,
C495EEA216B910DE0041304E /* EditorBaseController.m in Sources */,
C495EEA316B910DE0041304E /* EditorSelectionController.m in Sources */,
C495EEA416B910DE0041304E /* EncryptionController.m in Sources */,
C495EEA516B910DE0041304E /* HelpController.m in Sources */,
C495EEA616B910DE0041304E /* MainTabBarController.m in Sources */,
C495EEA716B910DE0041304E /* PerformanceEditorController.m in Sources */,
C495EEA816B910DE0041304E /* RDPSessionViewController.m in Sources */,
C495EEA916B910DE0041304E /* ScreenSelectionController.m in Sources */,
C495EEAA16B910DE0041304E /* VerifyCertificateController.m in Sources */,
C495EEB216B910F60041304E /* ios_freerdp_events.m in Sources */,
C495EEB316B910F60041304E /* ios_freerdp_ui.m in Sources */,
C495EEB416B910F60041304E /* ios_freerdp.m in Sources */,
C495EEBD16B9111A0041304E /* Reachability.m in Sources */,
C495EEBE16B9111A0041304E /* SFHFKeychainUtils.m in Sources */,
C495EEBF16B9111A0041304E /* Utils.m in Sources */,
C495EECD16B911290041304E /* Bookmark.m in Sources */,
C495EECE16B911290041304E /* ConnectionParams.m in Sources */,
C495EECF16B911290041304E /* Encryptor.m in Sources */,
C495EED016B911290041304E /* GlobalDefaults.m in Sources */,
C495EED116B911290041304E /* RDPKeyboard.m in Sources */,
C495EED216B911290041304E /* RDPSession.m in Sources */,
C495EF9A16B911AC0041304E /* AdvancedKeyboardView.m in Sources */,
C495EF9B16B911AC0041304E /* BookmarkTableCell.m in Sources */,
C495EF9C16B911AC0041304E /* EditButtonTableViewCell.m in Sources */,
C495EF9D16B911AC0041304E /* EditFlagTableViewCell.m in Sources */,
C495EF9E16B911AC0041304E /* EditSecretTextTableViewCell.m in Sources */,
C495EF9F16B911AC0041304E /* EditSelectionTableViewCell.m in Sources */,
C495EFA016B911AC0041304E /* EditSubEditTableViewCell.m in Sources */,
C495EFA116B911AC0041304E /* EditTextTableViewCell.m in Sources */,
C495EFA216B911AC0041304E /* RDPSessionView.m in Sources */,
C495EFA316B911AC0041304E /* SessionTableCell.m in Sources */,
C495EFA416B911AC0041304E /* TouchPointerView.m in Sources */,
C495EFCB16B933230041304E /* AppDelegate.m in Sources */,
C495EFCC16B933230041304E /* main.m in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXSourcesBuildPhase section */
/* Begin PBXVariantGroup section */
C495EFC016B92EA20041304E /* Localizable.strings */ = {
isa = PBXVariantGroup;
children = (
C495EFC116B92EA20041304E /* en */,
);
name = Localizable.strings;
sourceTree = "<group>";
};
/* End PBXVariantGroup section */
/* Begin XCBuildConfiguration section */
C495EE6016B8372D0041304E /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO;
CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
CLANG_CXX_LIBRARY = "libc++";
CLANG_ENABLE_OBJC_ARC = NO;
CLANG_WARN_EMPTY_BODY = YES;
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
CODE_SIGN_IDENTITY = "iPhone Developer";
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
COPY_PHASE_STRIP = NO;
GCC_C_LANGUAGE_STANDARD = gnu99;
GCC_DYNAMIC_NO_PIC = NO;
GCC_OPTIMIZATION_LEVEL = 0;
GCC_PREPROCESSOR_DEFINITIONS = "DEBUG=1";
GCC_SYMBOLS_PRIVATE_EXTERN = NO;
GCC_WARN_ABOUT_RETURN_TYPE = YES;
GCC_WARN_UNINITIALIZED_AUTOS = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
IPHONEOS_DEPLOYMENT_TARGET = 4.3;
ONLY_ACTIVE_ARCH = YES;
PROVISIONING_PROFILE = "";
SDKROOT = iphoneos;
TARGETED_DEVICE_FAMILY = "1,2";
};
name = Debug;
};
C495EE6116B8372D0041304E /* Release */ = {
isa = XCBuildConfiguration;
buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO;
CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
CLANG_CXX_LIBRARY = "libc++";
CLANG_ENABLE_OBJC_ARC = NO;
CLANG_WARN_EMPTY_BODY = YES;
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
CODE_SIGN_IDENTITY = "iPhone Developer";
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
COPY_PHASE_STRIP = YES;
GCC_C_LANGUAGE_STANDARD = gnu99;
GCC_WARN_ABOUT_RETURN_TYPE = YES;
GCC_WARN_UNINITIALIZED_AUTOS = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
IPHONEOS_DEPLOYMENT_TARGET = 4.3;
OTHER_CFLAGS = "-DNS_BLOCK_ASSERTIONS=1";
PROVISIONING_PROFILE = "";
SDKROOT = iphoneos;
TARGETED_DEVICE_FAMILY = "1,2";
VALIDATE_PRODUCT = YES;
};
name = Release;
};
C495EE6316B8372D0041304E /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
CLANG_ENABLE_OBJC_ARC = "$(INHERIT)";
DEAD_CODE_STRIPPING = "$(INHERIT)";
GCC_PRECOMPILE_PREFIX_HEADER = YES;
GCC_PREFIX_HEADER = "$(SRCROOT)/iFreeRDP-Prefix.pch";
HEADER_SEARCH_PATHS = (
"\"$(SRCROOT)/../../include\"",
"\"$(SRCROOT)/../../winpr/include\"",
"\"$(SRCROOT)/../../\"",
"\"@FREERDP_IOS_EXTERNAL_SSL_PATH@/include\"",
);
INFOPLIST_FILE = "$(SRCROOT)/iFreeRDP.plist";
IPHONEOS_DEPLOYMENT_TARGET = 4.3;
LIBRARY_SEARCH_PATHS = (
"\"$(SRCROOT)/../../libfreerdp\"",
"\"$(SRCROOT)/../../winpr/libwinpr\"",
"\"@FREERDP_IOS_EXTERNAL_SSL_PATH@/lib\"",
"\"$(SRCROOT)/../common\"",
);
PRODUCT_NAME = "$(TARGET_NAME)";
WRAPPER_EXTENSION = app;
};
name = Debug;
};
C495EE6416B8372D0041304E /* Release */ = {
isa = XCBuildConfiguration;
buildSettings = {
CLANG_ENABLE_OBJC_ARC = "$(INHERIT)";
DEAD_CODE_STRIPPING = "$(INHERIT)";
GCC_PRECOMPILE_PREFIX_HEADER = YES;
GCC_PREFIX_HEADER = "$(SRCROOT)/iFreeRDP-Prefix.pch";
HEADER_SEARCH_PATHS = (
"\"$(SRCROOT)/../../include\"",
"\"$(SRCROOT)/../../winpr/include\"",
"\"$(SRCROOT)/../../\"",
"\"@FREERDP_IOS_EXTERNAL_SSL_PATH@/include\"",
);
INFOPLIST_FILE = "$(SRCROOT)/iFreeRDP.plist";
IPHONEOS_DEPLOYMENT_TARGET = 4.3;
LIBRARY_SEARCH_PATHS = (
"\"$(SRCROOT)/../../libfreerdp\"",
"\"$(SRCROOT)/../../winpr/libwinpr\"",
"\"@FREERDP_IOS_EXTERNAL_SSL_PATH@/lib\"",
"\"$(SRCROOT)/../common\"",
);
PRODUCT_NAME = "$(TARGET_NAME)";
WRAPPER_EXTENSION = app;
};
name = Release;
};
/* End XCBuildConfiguration section */
/* Begin XCConfigurationList section */
C495EE2916B8372D0041304E /* Build configuration list for PBXProject "iFreeRDP" */ = {
isa = XCConfigurationList;
buildConfigurations = (
C495EE6016B8372D0041304E /* Debug */,
C495EE6116B8372D0041304E /* Release */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
C495EE6216B8372D0041304E /* Build configuration list for PBXNativeTarget "iFreeRDP" */ = {
isa = XCConfigurationList;
buildConfigurations = (
C495EE6316B8372D0041304E /* Debug */,
C495EE6416B8372D0041304E /* Release */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
/* End XCConfigurationList section */
};
rootObject = C495EE2616B8372D0041304E /* Project object */;
}

View File

@@ -52,7 +52,7 @@ option(BUILD_TESTING "Build unit tests" OFF)
option(WITH_SAMPLE "Build sample code" OFF)
if(${CMAKE_VERSION} VERSION_GREATER 2.8.8)
if(ANDROID OR IOS)
if(ANDROID)
option(MONOLITHIC_BUILD "Use monolithic build" ON)
else()
option(MONOLITHIC_BUILD "Use monolithic build" OFF)

View File

@@ -15,8 +15,6 @@
# See the License for the specific language governing permissions and
# limitations under the License.
option(IOS_BUILD_OBJC "Automatically build iOS objective-c code - build type depends on CMAKE_BUILD_TYPE" ON)
option(IOS_BUILD_OBJC_DEBUG "Create an iOS debug package" ON)
if (NOT FREERDP_IOS_EXTERNAL_SSL_PATH)
set(FREERDP_IOS_EXTERNAL_SSL_PATH "${CMAKE_CURRENT_SOURCE_DIR}/external/openssl")
endif()

View File

@@ -1,20 +1,12 @@
include(FindPkgConfig)
pkg_check_modules(PC_GSTREAMER_0_10 gstreamer-0.10)
pkg_check_modules(PC_GSTREAMER_PLUGINS_BASE_0_10 gstreamer-plugins-base-0.10)
if(PC_GSTREAMER_0_10_FOUND AND PC_GSTREAMER_PLUGINS_BASE_0_10_FOUND)
set(GSTREAMER_FOUND TRUE)
endif()
include(FindPackageHandleStandardArgs)
FIND_PACKAGE_HANDLE_STANDARD_ARGS(GSTREAMER DEFAULT_MSG GSTREAMER_FOUND)
if(GSTREAMER_FOUND)
set(GSTREAMER_INCLUDE_DIRS ${PC_GSTREAMER_0_10_INCLUDE_DIRS} ${PC_GSTREAMER_PLUGINS_BASE_0_10_INCLUDE_DIRS})
set(GSTREAMER_LIBRARIES ${PC_GSTREAMER_0_10_LIBRARIES} ${PC_GSTREAMER_PLUGINS_BASE_0_10_LIBRARIES})
endif()
mark_as_advanced(GSTREAMER_FOUND GSTREAMER_INCLUDE_DIRS GSTREAMER_LIBRARIES)
include(FindPackageHandleStandardArgs)
FIND_PACKAGE_HANDLE_STANDARD_ARGS(GSTREAMER DEFAULT_MSG GSTREAMER_LIBRARIES GSTREAMER_INCLUDE_DIRS)

View File

@@ -2,15 +2,7 @@ Overview
========
The FreeRDP iOS port allows users to enjoy FreeRDP features on Apple iOS devices.
The application was written to be compatible with devices running iOS 3.2 or higher.
Please note that Apple dropped armv6 support in their latest Xcode releases.
If you want to compile for armv6 devices you will have to use an older Xcode version and build the OpenSSL libraries for armv6 as well.
For building the GUI part there are two possibilities:
* integrated build - have cmake to operate Xcode and build everything
* manual build - build FreeRDP libraries and invoke xcodebuild or Xcode manually for the frontend
Manual builds should be used for development.
The application was written to be compatible with devices running iOS 4.3 or higher.
Build requirements
@@ -20,7 +12,6 @@ The following prerequisites are required in order to build the iOS port:
- cmake version >= 2.8.9
- latest Xcode installed (>= 4.6)
- installed "Command Line Tools" component
- installed Provisioning Profile and iOS Developer Certificate for code signing
- pre-build static OpenSSL libraries (see below)
@@ -43,35 +34,23 @@ If you build OpenSSL youself you need to set FREERDP_IOS_EXTERNAL_SSL_PATH when
Building
========
Integrated build
----------------
Run the following commands in the top level FreeRDP directory:
cmake -DCMAKE_TOOLCHAIN_FILE=cmake/iOSToolchain.cmake
make
cmake -DCMAKE_TOOLCHAIN_FILE=cmake/iOSToolchain.cmake -GXcode
After that you should have a client/iOS/bin/<Debug or Release>/iFreeRDP.app application package.
This command will create a XCode project in the FreeRDP root folder called FreeRDP.xcodeproj.
Open the project in XCode and modify, build or run the app.
Manual iOS builds
-----------------
Alternatively you can also build the project from the command line using xcodebuild:
First run cmake to prepare the build:
cmake -DCMAKE_TOOLCHAIN_FILE=cmake/iOSToolchain.cmake -DIOS_BUILD_OBJC=OFF
make
Now you can run your favourite xcodebuild command in client/iOS like this:
cd client/iOS
xcodebuild -project iFreeRDP.xcodeproj -configuration Debug -sdk iphoneos6.1 install
xcodebuild -project FreeRDP.xcodeproj -configuration Debug -sdk iphoneos6.1
Notes:
* XCode, by default will build the application into its derived data location (usually in ~/Library/Developer/...).
If you want to specify an output directory add CONFIGURATION_BUILD_DIR=<output-path-here> to the end of above command line.
* If using XCode choose "Open Other" from the welcome screen, browse to the client/iOS directory in your FreeRDP folder and select iFreeRDP.xcodeproj.
* If using XCode choose "Open Other" from the welcome screen, browse to the FreeRDP root directory and select FreeRDP.xcodeproj.
cmake variables
@@ -92,8 +71,3 @@ CMAKE_IOS_SDK_ROOT (used by toolchain file)
FREERDP_IOS_EXTERNAL_SSL_PATH (used by FindOpenSSL)
* absolut root path to the pre-built static OpenSSL libraries
IOS_BUILD_OBJC (used by client/iOS/CMakeLists.txt)
* can be ON/OFF (default ON) whether or not to build the objective-c UI with cmake
IOS_BUILD_OBJC_DEBUG (used by client/iOS/CMakeLists.txt)
* can be ON/OFF (default ON) whether or not to build a debug version of the objective-c UI

View File

@@ -8,6 +8,6 @@ Description: A free remote desktop protocol client
URL: http://www.freerdp.com/
Version: @FREERDP_VERSION_FULL@
Requires:
Libs: -L${libdir} -lfreerdp-cache -lfreerdp-codec -lfreerdp-core -lfreerdp-crypto -lfreerdp-gdi -lfreerdp-locale -lfreerdp-rail -lfreerdp-utils -lwinpr-sspi -lwinpr-rpc
Libs: -L${libdir} -lfreerdp-cache -lfreerdp-codec -lfreerdp-core -lfreerdp-crypto -lfreerdp-gdi -lfreerdp-locale -lfreerdp-rail -lfreerdp-utils -lwinpr-sspi -lwinpr-rpc -lwinpr-utils
Cflags: -I${includedir}

View File

@@ -483,7 +483,7 @@ typedef struct _RDPDR_PARALLEL RDPDR_PARALLEL;
#define FreeRDP_ClientBuild 133
#define FreeRDP_ClientHostname 134
#define FreeRDP_ClientProductId 135
#define FreeRDP_EarlyCapabilitiesFlag 136
#define FreeRDP_EarlyCapabilityFlags 136
#define FreeRDP_NetworkAutoDetect 137
#define FreeRDP_SupportAsymetricKeys 138
#define FreeRDP_SupportErrorInfoPdu 139
@@ -689,6 +689,7 @@ typedef struct _RDPDR_PARALLEL RDPDR_PARALLEL;
#define FreeRDP_RemoteFxCodecId 3650
#define FreeRDP_RemoteFxCodecMode 3651
#define FreeRDP_RemoteFxImageCodec 3652
#define FreeRDP_RemoteFxCaptureFlags 3653
#define FreeRDP_NSCodec 3712
#define FreeRDP_NSCodecId 3713
#define FreeRDP_FrameAcknowledge 3714
@@ -762,7 +763,7 @@ struct rdp_settings
ALIGN64 UINT32 ClientBuild; /* 133 */
ALIGN64 char* ClientHostname; /* 134 */
ALIGN64 char* ClientProductId; /* 135 */
ALIGN64 UINT32 EarlyCapabilitiesFlag; /* 136 */
ALIGN64 UINT32 EarlyCapabilityFlags; /* 136 */
ALIGN64 BOOL NetworkAutoDetect; /* 137 */
ALIGN64 BOOL SupportAsymetricKeys; /* 138 */
ALIGN64 BOOL SupportErrorInfoPdu; /* 139 */
@@ -1155,7 +1156,8 @@ struct rdp_settings
ALIGN64 UINT32 RemoteFxCodecId; /* 3650 */
ALIGN64 UINT32 RemoteFxCodecMode; /* 3651 */
ALIGN64 BOOL RemoteFxImageCodec; /* 3652 */
UINT64 padding3712[3712 - 3653]; /* 3653 */
ALIGN64 UINT32 RemoteFxCaptureFlags; /* 3653 */
UINT64 padding3712[3712 - 3654]; /* 3654 */
/* NSCodec */
ALIGN64 BOOL NSCodec; /* 3712 */

View File

@@ -1209,8 +1209,8 @@ UINT32 freerdp_get_param_uint32(rdpSettings* settings, int id)
return settings->ClientBuild;
break;
case FreeRDP_EarlyCapabilitiesFlag:
return settings->EarlyCapabilitiesFlag;
case FreeRDP_EarlyCapabilityFlags:
return settings->EarlyCapabilityFlags;
break;
case FreeRDP_EncryptionMethods:
@@ -1517,8 +1517,8 @@ int freerdp_set_param_uint32(rdpSettings* settings, int id, UINT32 param)
settings->ClientBuild = param;
break;
case FreeRDP_EarlyCapabilitiesFlag:
settings->EarlyCapabilitiesFlag = param;
case FreeRDP_EarlyCapabilityFlags:
settings->EarlyCapabilityFlags = param;
break;
case FreeRDP_EncryptionMethods:

View File

@@ -2487,6 +2487,21 @@ BOOL rdp_read_bitmap_codecs_capability_set(wStream* s, UINT16 length, rdpSetting
if (remainingLength < codecPropertiesLength)
return FALSE;
if (settings->ServerMode)
{
if (UuidEqual(&codecGuid, &CODEC_GUID_REMOTEFX, &rpc_status))
{
stream_seek_UINT32(s); /* length */
stream_read_UINT32(s, settings->RemoteFxCaptureFlags); /* captureFlags */
stream_rewind(s, 8);
if (settings->RemoteFxCaptureFlags & CARDP_CAPS_CAPTURE_NON_CAC)
{
settings->RemoteFxOnly = TRUE;
}
}
}
stream_seek(s, codecPropertiesLength); /* codecProperties */
remainingLength -= codecPropertiesLength;
@@ -2506,7 +2521,7 @@ void rdp_write_rfx_client_capability_container(wStream* s, rdpSettings* settings
UINT32 captureFlags;
BYTE codecMode;
captureFlags = settings->RemoteFxOnly ? CARDP_CAPS_CAPTURE_NON_CAC : 0;
captureFlags = settings->RemoteFxOnly ? 0 : CARDP_CAPS_CAPTURE_NON_CAC;
codecMode = settings->RemoteFxCodecMode;
stream_write_UINT16(s, 49); /* codecPropertiesLength */
@@ -3222,19 +3237,12 @@ BOOL rdp_read_capability_sets(wStream* s, rdpSettings* settings, UINT16 numberCa
return TRUE;
}
BOOL rdp_recv_demand_active(rdpRdp* rdp, wStream* s)
BOOL rdp_recv_get_active_header(rdpRdp* rdp, wStream* s, UINT16* pChannelId)
{
UINT16 length;
UINT16 channelId;
UINT16 pduType;
UINT16 pduLength;
UINT16 pduSource;
UINT16 numberCapabilities;
UINT16 lengthSourceDescriptor;
UINT16 lengthCombinedCapabilities;
UINT16 securityFlags;
if (!rdp_read_header(rdp, s, &length, &channelId))
if (!rdp_read_header(rdp, s, &length, pChannelId))
return FALSE;
if (rdp->disconnect)
@@ -3255,12 +3263,31 @@ BOOL rdp_recv_demand_active(rdpRdp* rdp, wStream* s)
}
}
if (channelId != MCS_GLOBAL_CHANNEL_ID)
if (*pChannelId != MCS_GLOBAL_CHANNEL_ID)
{
fprintf(stderr, "expected MCS_GLOBAL_CHANNEL_ID %04x, got %04x\n", MCS_GLOBAL_CHANNEL_ID, channelId);
fprintf(stderr, "expected MCS_GLOBAL_CHANNEL_ID %04x, got %04x\n", MCS_GLOBAL_CHANNEL_ID, *pChannelId);
return FALSE;
}
return TRUE;
}
BOOL rdp_recv_demand_active(rdpRdp* rdp, wStream* s)
{
UINT16 channelId;
UINT16 pduType;
UINT16 pduLength;
UINT16 pduSource;
UINT16 numberCapabilities;
UINT16 lengthSourceDescriptor;
UINT16 lengthCombinedCapabilities;
if (!rdp_recv_get_active_header(rdp, s, &channelId))
return FALSE;
if (rdp->disconnect)
return TRUE;
if (!rdp_read_share_control_header(s, &pduLength, &pduType, &pduSource))
{
fprintf(stderr, "rdp_read_share_control_header failed\n");
@@ -3375,7 +3402,6 @@ BOOL rdp_send_demand_active(rdpRdp* rdp)
BOOL rdp_recv_confirm_active(rdpRdp* rdp, wStream* s)
{
UINT16 length;
UINT16 channelId;
UINT16 pduType;
UINT16 pduLength;
@@ -3383,27 +3409,8 @@ BOOL rdp_recv_confirm_active(rdpRdp* rdp, wStream* s)
UINT16 lengthSourceDescriptor;
UINT16 lengthCombinedCapabilities;
UINT16 numberCapabilities;
UINT16 securityFlags;
if (!rdp_read_header(rdp, s, &length, &channelId))
return FALSE;
if (rdp->settings->DisableEncryption)
{
if (!rdp_read_security_header(s, &securityFlags))
return FALSE;
if (securityFlags & SEC_ENCRYPT)
{
if (!rdp_decrypt(rdp, s, length - 4, securityFlags))
{
fprintf(stderr, "rdp_decrypt failed\n");
return FALSE;
}
}
}
if (channelId != MCS_GLOBAL_CHANNEL_ID)
if (!rdp_recv_get_active_header(rdp, s, &channelId))
return FALSE;
if (!rdp_read_share_control_header(s, &pduLength, &pduType, &pduSource))

View File

@@ -165,6 +165,7 @@
#define CLW_ENTROPY_RLGR1 0x01
#define CLW_ENTROPY_RLGR3 0x04
BOOL rdp_recv_get_active_header(rdpRdp* rdp, wStream* s, UINT16* pChannelId);
BOOL rdp_recv_demand_active(rdpRdp* rdp, wStream* s);
void rdp_write_demand_active(wStream* s, rdpSettings* settings);
BOOL rdp_send_demand_active(rdpRdp* rdp);

View File

@@ -529,8 +529,13 @@ BOOL rdp_client_connect_demand_active(rdpRdp* rdp, wStream* s)
if (!rdp_recv_demand_active(rdp, s))
{
UINT16 channelId;
stream_set_mark(s, mark);
stream_seek(s, RDP_PACKET_HEADER_MAX_LENGTH);
rdp_recv_get_active_header(rdp, s, &channelId);
/* Was stream_seek(s, RDP_PACKET_HEADER_MAX_LENGTH);
* but the headers aren't always that length,
* so that could result in a bad offset.
*/
if (rdp_recv_out_of_sequence_pdu(rdp, s) != TRUE)
return FALSE;

View File

@@ -495,7 +495,6 @@ BOOL gcc_read_client_core_data(wStream* s, rdpSettings* settings, UINT16 blockLe
UINT16 postBeta2ColorDepth = 0;
UINT16 highColorDepth = 0;
UINT16 supportedColorDepths = 0;
UINT16 earlyCapabilityFlags = 0;
UINT32 serverSelectedProtocol = 0;
/* Length of all required fields, until imeFileName */
@@ -564,7 +563,7 @@ BOOL gcc_read_client_core_data(wStream* s, rdpSettings* settings, UINT16 blockLe
if (blockLength < 2)
break;
stream_read_UINT16(s, earlyCapabilityFlags); /* earlyCapabilityFlags */
stream_read_UINT16(s, settings->EarlyCapabilityFlags); /* earlyCapabilityFlags */
blockLength -= 2;
if (blockLength < 64)
@@ -597,7 +596,7 @@ BOOL gcc_read_client_core_data(wStream* s, rdpSettings* settings, UINT16 blockLe
if (highColorDepth > 0)
{
if (earlyCapabilityFlags & RNS_UD_CS_WANT_32BPP_SESSION)
if (settings->EarlyCapabilityFlags & RNS_UD_CS_WANT_32BPP_SESSION)
color_depth = 32;
else
color_depth = highColorDepth;

View File

@@ -117,9 +117,6 @@ BOOL rdp_read_client_time_zone(wStream* s, rdpSettings* settings)
void rdp_write_client_time_zone(wStream* s, rdpSettings* settings)
{
UINT32 bias;
INT32 sbias;
UINT32 bias2c;
WCHAR* standardName = NULL;
WCHAR* daylightName = NULL;
int standardNameLength;
@@ -138,57 +135,34 @@ void rdp_write_client_time_zone(wStream* s, rdpSettings* settings)
if (daylightNameLength > 62)
daylightNameLength = 62;
/* UTC = LocalTime + Bias <-> Bias = UTC - LocalTime */
/* Translate from biases used throughout libfreerdp-locale/timezone.c
* to what RDP expects, which is minutes *west* of UTC.
* Though MS-RDPBCGR specifies bias as unsigned, two's complement
* (a negative integer) works fine for zones east of UTC.
*/
if (clientTimeZone->bias <= 720)
bias = -1 * clientTimeZone->bias;
else
bias = 1440 - clientTimeZone->bias;
stream_write_UINT32(s, bias); /* Bias */
/* Bias */
stream_write_UINT32(s, clientTimeZone->bias);
/* standardName (64 bytes) */
stream_write(s, standardName, standardNameLength);
stream_write_zero(s, 64 - standardNameLength);
rdp_write_system_time(s, &clientTimeZone->standardDate); /* StandardDate */
/* StandardDate */
rdp_write_system_time(s, &clientTimeZone->standardDate);
DEBUG_TIMEZONE("bias=%d stdName='%s' dlName='%s'",
bias, clientTimeZone->standardName, clientTimeZone->daylightName);
sbias = clientTimeZone->standardBias - clientTimeZone->bias;
if (sbias < 0)
bias2c = (UINT32) sbias;
else
bias2c = ~((UINT32) sbias) + 1;
DEBUG_TIMEZONE("bias=%d stdName='%s' dlName='%s'", clientTimeZone->bias, clientTimeZone->standardName, clientTimeZone->daylightName);
/* Note that StandardBias is ignored if no valid standardDate is provided. */
stream_write_UINT32(s, bias2c); /* StandardBias */
DEBUG_TIMEZONE("StandardBias=%d", bias2c);
/* StandardBias */
stream_write_UINT32(s, clientTimeZone->standardBias);
DEBUG_TIMEZONE("StandardBias=%d", clientTimeZone->standardBias);
/* daylightName (64 bytes) */
stream_write(s, daylightName, daylightNameLength);
stream_write_zero(s, 64 - daylightNameLength);
stream_write(s, daylightName, daylightNameLength);
stream_write_zero(s, 64 - daylightNameLength);
rdp_write_system_time(s, &clientTimeZone->daylightDate); /* DaylightDate */
sbias = clientTimeZone->daylightBias - clientTimeZone->bias;
if (sbias < 0)
bias2c = (UINT32) sbias;
else
bias2c = ~((UINT32) sbias) + 1;
/* DaylightDate */
rdp_write_system_time(s, &clientTimeZone->daylightDate);
/* Note that DaylightBias is ignored if no valid daylightDate is provided. */
stream_write_UINT32(s, bias2c); /* DaylightBias */
DEBUG_TIMEZONE("DaylightBias=%d", bias2c);
/* DaylightBias */
stream_write_UINT32(s, clientTimeZone->daylightBias);
DEBUG_TIMEZONE("DaylightBias=%d", clientTimeZone->daylightBias);
free(standardName);
free(daylightName);

View File

@@ -30,6 +30,7 @@
#include <freerdp/gdi/bitmap.h>
#include <freerdp/codec/jpeg.h>
#include <freerdp/codec/rfx.h>
#include <freerdp/codec/nsc.h>
#include <freerdp/gdi/drawing.h>
#include <freerdp/gdi/clipping.h>
#include <freerdp/codec/color.h>
@@ -116,7 +117,9 @@ void gdi_Bitmap_Decompress(rdpContext* context, rdpBitmap* bitmap,
switch (codec_id)
{
case RDP_CODEC_ID_NSCODEC:
fprintf(stderr, "gdi_Bitmap_Decompress: nsc not done\n");
gdi = context->gdi;
nsc_process_message(gdi->nsc_context, bpp, width, height, data, length);
freerdp_image_flip(((NSC_CONTEXT*)gdi->nsc_context)->bmpdata, bitmap->data, width, height, bpp);
break;
case RDP_CODEC_ID_REMOTEFX:
gdi = context->gdi;

View File

@@ -1640,7 +1640,7 @@ TIME_ZONE_RULE_ENTRY* freerdp_get_current_time_zone_rule(TIME_ZONE_RULE_ENTRY* r
for (i = 0; i < (int) count; i++)
{
if ((rules[i].TicksStart <= windows_time) && (windows_time >= rules[i].TicksEnd))
if ((rules[i].TicksStart >= windows_time) && (windows_time >= rules[i].TicksEnd))
{
/*fprintf(stderr, "Got rule %d from table at %p with count %u\n", i, rules, count);*/
return &rules[i];
@@ -1657,14 +1657,14 @@ void freerdp_time_zone_detect(TIME_ZONE_INFO* clientTimeZone)
TIME_ZONE_ENTRY* tz;
struct tm* local_time;
clientTimeZone->standardBias = 0;
time(&t);
local_time = localtime(&t);
#ifdef HAVE_TM_GMTOFF
if (local_time->tm_gmtoff >= 0)
clientTimeZone->bias = (UINT32) (local_time->tm_gmtoff / 60);
else
clientTimeZone->bias = (UINT32) (1440 + (INT32) (local_time->tm_gmtoff / 60));
clientTimeZone->bias = timezone / 60;
DEBUG_TIMEZONE("tzname[std]: %s, tzname[dst]: %s, timezone: %ld, Daylight: %d", tzname[0], tzname[1], timezone, daylight);
#elif defined(sun)
if (local_time->tm_isdst > 0)
clientTimeZone->bias = (UINT32) (altzone / 3600);
@@ -1673,19 +1673,6 @@ void freerdp_time_zone_detect(TIME_ZONE_INFO* clientTimeZone)
#else
clientTimeZone->bias = 0;
#endif
if (local_time->tm_isdst > 0)
{
clientTimeZone->standardBias = clientTimeZone->bias - 60;
clientTimeZone->daylightBias = clientTimeZone->bias;
}
else
{
clientTimeZone->standardBias = clientTimeZone->bias;
clientTimeZone->daylightBias = clientTimeZone->bias + 60;
}
DEBUG_TIMEZONE("Bias: %d, StandardBias: %d, DaylightBias: %d",
clientTimeZone->bias, clientTimeZone->standardBias,
clientTimeZone->daylightBias);
tz = freerdp_detect_windows_time_zone(clientTimeZone->bias);
@@ -1694,8 +1681,7 @@ void freerdp_time_zone_detect(TIME_ZONE_INFO* clientTimeZone)
DEBUG_TIMEZONE("tz: Id='%s' Bias=%d DST=%d dn='%s' sn='%s' dln='%s'",
tz->Id, tz->Bias, tz->SupportsDST, tz->DisplayName,
tz->StandardName, tz->DaylightName);
/* Not printed: RuleTable, RuleTableCount */
clientTimeZone->bias = tz->Bias;
sprintf(clientTimeZone->standardName, "%s", tz->StandardName);
sprintf(clientTimeZone->daylightName, "%s", tz->DaylightName);
@@ -1704,11 +1690,9 @@ void freerdp_time_zone_detect(TIME_ZONE_INFO* clientTimeZone)
TIME_ZONE_RULE_ENTRY* rule;
rule = freerdp_get_current_time_zone_rule(tz->RuleTable, tz->RuleTableCount);
/* issue #574 -- temporarily disabled this block as it seems to be setting the wrong time
if (rule != NULL)
{
clientTimeZone->standardBias = 0;
clientTimeZone->daylightBias = rule->DaylightDelta;
clientTimeZone->daylightBias = -rule->DaylightDelta;
clientTimeZone->standardDate.wYear = rule->StandardDate.wYear;
clientTimeZone->standardDate.wMonth = rule->StandardDate.wMonth;
@@ -1728,9 +1712,7 @@ void freerdp_time_zone_detect(TIME_ZONE_INFO* clientTimeZone)
clientTimeZone->daylightDate.wSecond = rule->DaylightDate.wSecond;
clientTimeZone->daylightDate.wMilliseconds = rule->DaylightDate.wMilliseconds;
}
*/
}
free(tz);
}
else

View File

@@ -43,7 +43,7 @@ UINT64 freerdp_windows_gmtime()
UINT64 freerdp_get_windows_time_from_unix_time(time_t unix_time)
{
UINT64 windows_time;
windows_time = (unix_time * 10000000) + 621355968000000000ULL;
windows_time = ((UINT64)unix_time * 10000000) + 621355968000000000ULL;
return windows_time;
}

View File

@@ -29,3 +29,4 @@ foreach(dir ${all_valid_subdirs})
endif()
endforeach(dir)
set(THIRD_PARTY_INCLUDES ${THIRD_PARTY_INCLUDES} PARENT_SCOPE)

View File

@@ -26,6 +26,10 @@
#include <wchar.h>
#include <winpr/windows.h>
#if defined(__OBJC__) && defined(__APPLE__)
#include <objc/objc.h>
#endif
#ifndef _WIN32
#define __int8 char

View File

@@ -567,28 +567,25 @@ DWORD KBD7X[128] =
DWORD GetVirtualKeyCodeFromVirtualScanCode(DWORD scancode, DWORD dwKeyboardType)
{
DWORD vkcode;
DWORD code_index;
vkcode = VK_NONE;
code_index = scancode & 0xff;
if (code_index > 127)
return VK_NONE;
if ((dwKeyboardType != 4) && (dwKeyboardType != 7))
dwKeyboardType = 4;
if (dwKeyboardType == 4)
{
if (vkcode < 128)
vkcode = (scancode & KBDEXT) ? KBD4X[scancode] : KBD4T[scancode];
return (scancode & KBDEXT) ? KBD4X[code_index] : KBD4T[code_index];
}
else if (dwKeyboardType == 7)
{
if (vkcode < 128)
vkcode = (scancode & KBDEXT) ? KBD7X[scancode] : KBD7T[scancode];
return (scancode & KBDEXT) ? KBD7X[code_index] : KBD7T[code_index];
}
if (!vkcode)
vkcode = VK_NONE;
return vkcode;
return VK_NONE;
}
DWORD GetVirtualScanCodeFromVirtualKeyCode(DWORD vkcode, DWORD dwKeyboardType)

View File

@@ -66,6 +66,9 @@ char* GetPath_HOME()
#ifdef _WIN32
path = GetEnvAlloc("UserProfile");
#elif defined(ANDROID)
path = malloc(2);
strcpy(path, "/");
#else
path = GetEnvAlloc("HOME");
#endif

View File

@@ -39,15 +39,18 @@
HANDLE CreateMutexW(LPSECURITY_ATTRIBUTES lpMutexAttributes, BOOL bInitialOwner, LPCWSTR lpName)
{
HANDLE handle;
HANDLE handle = NULL;
pthread_mutex_t* pMutex;
pMutex = (pthread_mutex_t*) malloc(sizeof(pthread_mutex_t));
if (pMutex)
{
pthread_mutex_init(pMutex, 0);
handle = winpr_Handle_Insert(HANDLE_TYPE_MUTEX, pMutex);
handle = winpr_Handle_Insert(HANDLE_TYPE_MUTEX, pMutex);
if (bInitialOwner)
pthread_mutex_lock(pMutex);
}
return handle;
}