+
+
+
+
iFreeRDP Remote Desktop Client
+
+
+
+
+
+ iFreeRDP is an open source client
+ capable of natively using Remote Desktop Protocol (RDP) in order to remotely access your Windows desktop.
+
+
+
+
Version Information
+
+
+
+ iFreeRDP Version | %@ |
+ System Name | %@ |
+ System Version | %@ |
+ Model | %@ |
+
+
+
+
+
+
+
Credits
+
+
+ iFreeRDP is a part of
FreeRDP
+
+
+
+
+
+
License
+
+
+ This program is free software; you can redistribute it and/or modify it under the terms of the Mozilla Public License, v. 2.0.
+ You can obtain an online version of the License from
http://mozilla.org/MPL/2.0/.
+
+
+ This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+
+
+ A copy of the product's source code can be obtained from the FreeRDP GitHub repository at https://github.com/FreeRDP/FreeRDP.
+
+
+
+
diff --git a/client/iOS/Resources/about_page/about_phone.html b/client/iOS/Resources/about_page/about_phone.html
new file mode 100755
index 000000000..7e40ef244
--- /dev/null
+++ b/client/iOS/Resources/about_page/about_phone.html
@@ -0,0 +1,201 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
iFreeRDPRemote Desktop Client
+
+
+
+
+
+ iFreeRDP is an open source client for Windows Remote Services using Remote Desktop Protocol (RDP) in order to remotely access your Windows desktop.
+
+
+
+
Version Information
+
+
+
+ iFreerdp Version | %@ |
+ System Name | %@ |
+ System Version | %@ |
+ Model | %@ |
+
+
+
+
+
+
+
Credits
+
+ iFreeRDP is part of
FreeRDP
+
+
+
+
License
+
+
+ This program is free software; you can redistribute it and/or modify it under the terms of the Mozilla Public License, v. 2.0.
+ You can obtain an online version of the License from
http://mozilla.org/MPL/2.0/.
+
+
+ This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+
+
+ A copy of the product's source code can be obtained from the FreeRDP GitHub repository at https://github.com/FreeRDP/FreeRDP.
+
+
+
+
diff --git a/client/iOS/Resources/about_page/back.jpg b/client/iOS/Resources/about_page/back.jpg
new file mode 100755
index 000000000..3bf3455bf
Binary files /dev/null and b/client/iOS/Resources/about_page/back.jpg differ
diff --git a/client/iOS/Resources/about_page/background_transparent.png b/client/iOS/Resources/about_page/background_transparent.png
new file mode 100755
index 000000000..0eba5b5d2
Binary files /dev/null and b/client/iOS/Resources/about_page/background_transparent.png differ
diff --git a/client/iOS/Resources/cancel_button_background.png b/client/iOS/Resources/cancel_button_background.png
new file mode 100644
index 000000000..ae12d407d
Binary files /dev/null and b/client/iOS/Resources/cancel_button_background.png differ
diff --git a/client/iOS/Resources/en.lproj/Localizable.strings b/client/iOS/Resources/en.lproj/Localizable.strings
new file mode 100644
index 000000000..3c0f66365
Binary files /dev/null and b/client/iOS/Resources/en.lproj/Localizable.strings differ
diff --git a/client/iOS/Resources/help_page/back.jpg b/client/iOS/Resources/help_page/back.jpg
new file mode 100755
index 000000000..3bf3455bf
Binary files /dev/null and b/client/iOS/Resources/help_page/back.jpg differ
diff --git a/client/iOS/Resources/help_page/gestures.html b/client/iOS/Resources/help_page/gestures.html
new file mode 100755
index 000000000..858387773
--- /dev/null
+++ b/client/iOS/Resources/help_page/gestures.html
@@ -0,0 +1,159 @@
+
+
+
+
+
+
+
+
Help
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Gestures
+
+aFreeRDP is designed for touch sensitive devices.
+These gestures let you do the most usual operations with your fingers.
+
+
+
+
+
+
+
diff --git a/client/iOS/Resources/help_page/gestures.png b/client/iOS/Resources/help_page/gestures.png
new file mode 100755
index 000000000..e49a45b8f
Binary files /dev/null and b/client/iOS/Resources/help_page/gestures.png differ
diff --git a/client/iOS/Resources/help_page/gestures_phone.html b/client/iOS/Resources/help_page/gestures_phone.html
new file mode 100755
index 000000000..156d7c94d
--- /dev/null
+++ b/client/iOS/Resources/help_page/gestures_phone.html
@@ -0,0 +1,159 @@
+
+
+
+
+
+
+
+
Help
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Gestures
+
+aFreeRDP is designed for touch sensitive devices.
+These gestures let you do the most usual operations with your fingers.
+
+
+
+
+
+
+
+
diff --git a/client/iOS/Resources/help_page/gestures_phone.png b/client/iOS/Resources/help_page/gestures_phone.png
new file mode 100755
index 000000000..1b90a1f65
Binary files /dev/null and b/client/iOS/Resources/help_page/gestures_phone.png differ
diff --git a/client/iOS/Resources/help_page/nav_gestures.png b/client/iOS/Resources/help_page/nav_gestures.png
new file mode 100755
index 000000000..ab1b36fba
Binary files /dev/null and b/client/iOS/Resources/help_page/nav_gestures.png differ
diff --git a/client/iOS/Resources/help_page/nav_toolbar.png b/client/iOS/Resources/help_page/nav_toolbar.png
new file mode 100755
index 000000000..703c0013a
Binary files /dev/null and b/client/iOS/Resources/help_page/nav_toolbar.png differ
diff --git a/client/iOS/Resources/help_page/nav_touch_pointer.png b/client/iOS/Resources/help_page/nav_touch_pointer.png
new file mode 100755
index 000000000..30e04568e
Binary files /dev/null and b/client/iOS/Resources/help_page/nav_touch_pointer.png differ
diff --git a/client/iOS/Resources/help_page/toolbar.html b/client/iOS/Resources/help_page/toolbar.html
new file mode 100755
index 000000000..e9ea27ab5
--- /dev/null
+++ b/client/iOS/Resources/help_page/toolbar.html
@@ -0,0 +1,178 @@
+
+
+
+
+
+
+
+
Help
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Toolbar
+
+With the toolbar you'll be able to display and hide the main tools in your session. This allows together with the touch pointer and the gestures an intuitiv workflow for remote computing on touch sensitive screens.
+
+
+
+
+
+
Keyboards
+Display/hide the default keyboard as well as an extended keyboard with function keys
+
+
Touch Pointer
+Display/hide the gesture controlled cursor
+
+
Disconnect
+Disconnect your current session. Please be aware that a disconnect is not the same as a log out.
+
+
+
+
+
+
+
diff --git a/client/iOS/Resources/help_page/toolbar.png b/client/iOS/Resources/help_page/toolbar.png
new file mode 100755
index 000000000..10c23b62b
Binary files /dev/null and b/client/iOS/Resources/help_page/toolbar.png differ
diff --git a/client/iOS/Resources/help_page/toolbar_phone.html b/client/iOS/Resources/help_page/toolbar_phone.html
new file mode 100755
index 000000000..f810d4b08
--- /dev/null
+++ b/client/iOS/Resources/help_page/toolbar_phone.html
@@ -0,0 +1,176 @@
+
+
+
+
+
+
+
+
Help
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Toolbar
+
+With the toolbar you'll be able to display and hide the main tools in your session. This allows together with the touch pointer and the gestures an intuitiv workflow for remote computing on touch sensitive screens.
+
+
+
+
+
+
Keyboards
+Display/hide the default keyboard as well as an extended keyboard with function keys
+
+
Touch Pointer
+Display/hide the gesture controlled cursor
+
+
Disconnect
+Disconnect your current session. Please be aware that a disconnect is not the same as a log out.
+
+
+
+
+
+
+
diff --git a/client/iOS/Resources/help_page/toolbar_phone.png b/client/iOS/Resources/help_page/toolbar_phone.png
new file mode 100755
index 000000000..a01279ce0
Binary files /dev/null and b/client/iOS/Resources/help_page/toolbar_phone.png differ
diff --git a/client/iOS/Resources/help_page/touch_pointer.html b/client/iOS/Resources/help_page/touch_pointer.html
new file mode 100755
index 000000000..8072a1bac
--- /dev/null
+++ b/client/iOS/Resources/help_page/touch_pointer.html
@@ -0,0 +1,164 @@
+
+
+
+
+
+
+
+
Help
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Touch Pointer
+
+
+
+
+
+
+
+
diff --git a/client/iOS/Resources/help_page/touch_pointer.png b/client/iOS/Resources/help_page/touch_pointer.png
new file mode 100755
index 000000000..f06e3889f
Binary files /dev/null and b/client/iOS/Resources/help_page/touch_pointer.png differ
diff --git a/client/iOS/Resources/help_page/touch_pointer_phone.html b/client/iOS/Resources/help_page/touch_pointer_phone.html
new file mode 100755
index 000000000..89d2e8de0
--- /dev/null
+++ b/client/iOS/Resources/help_page/touch_pointer_phone.html
@@ -0,0 +1,161 @@
+
+
+
+
+
+
+
+
Help
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Touch Pointer
+
+
+
+
+
+
+
+
+
diff --git a/client/iOS/Resources/help_page/touch_pointer_phone.png b/client/iOS/Resources/help_page/touch_pointer_phone.png
new file mode 100755
index 000000000..168749fd0
Binary files /dev/null and b/client/iOS/Resources/help_page/touch_pointer_phone.png differ
diff --git a/client/iOS/Resources/icon_accessory_star_off.png b/client/iOS/Resources/icon_accessory_star_off.png
new file mode 100755
index 000000000..f0f1eb845
Binary files /dev/null and b/client/iOS/Resources/icon_accessory_star_off.png differ
diff --git a/client/iOS/Resources/icon_accessory_star_on.png b/client/iOS/Resources/icon_accessory_star_on.png
new file mode 100755
index 000000000..cf5ed353b
Binary files /dev/null and b/client/iOS/Resources/icon_accessory_star_on.png differ
diff --git a/client/iOS/Resources/icon_key_arrow_down.png b/client/iOS/Resources/icon_key_arrow_down.png
new file mode 100755
index 000000000..3baf19cab
Binary files /dev/null and b/client/iOS/Resources/icon_key_arrow_down.png differ
diff --git a/client/iOS/Resources/icon_key_arrow_left.png b/client/iOS/Resources/icon_key_arrow_left.png
new file mode 100755
index 000000000..4c0c8eb14
Binary files /dev/null and b/client/iOS/Resources/icon_key_arrow_left.png differ
diff --git a/client/iOS/Resources/icon_key_arrow_right.png b/client/iOS/Resources/icon_key_arrow_right.png
new file mode 100755
index 000000000..10c7d8e27
Binary files /dev/null and b/client/iOS/Resources/icon_key_arrow_right.png differ
diff --git a/client/iOS/Resources/icon_key_arrow_up.png b/client/iOS/Resources/icon_key_arrow_up.png
new file mode 100755
index 000000000..b8e3f2820
Binary files /dev/null and b/client/iOS/Resources/icon_key_arrow_up.png differ
diff --git a/client/iOS/Resources/icon_key_arrows.png b/client/iOS/Resources/icon_key_arrows.png
new file mode 100755
index 000000000..56c915369
Binary files /dev/null and b/client/iOS/Resources/icon_key_arrows.png differ
diff --git a/client/iOS/Resources/icon_key_backspace.png b/client/iOS/Resources/icon_key_backspace.png
new file mode 100755
index 000000000..7e9d29541
Binary files /dev/null and b/client/iOS/Resources/icon_key_backspace.png differ
diff --git a/client/iOS/Resources/icon_key_menu.png b/client/iOS/Resources/icon_key_menu.png
new file mode 100755
index 000000000..0b4445263
Binary files /dev/null and b/client/iOS/Resources/icon_key_menu.png differ
diff --git a/client/iOS/Resources/icon_key_return.png b/client/iOS/Resources/icon_key_return.png
new file mode 100755
index 000000000..9311ad171
Binary files /dev/null and b/client/iOS/Resources/icon_key_return.png differ
diff --git a/client/iOS/Resources/icon_key_win.png b/client/iOS/Resources/icon_key_win.png
new file mode 100755
index 000000000..1ab7b2b46
Binary files /dev/null and b/client/iOS/Resources/icon_key_win.png differ
diff --git a/client/iOS/Resources/keyboard_button_background.png b/client/iOS/Resources/keyboard_button_background.png
new file mode 100755
index 000000000..c6cd5795b
Binary files /dev/null and b/client/iOS/Resources/keyboard_button_background.png differ
diff --git a/client/iOS/Resources/tabbar_icon_about.png b/client/iOS/Resources/tabbar_icon_about.png
new file mode 100755
index 000000000..8d03924a8
Binary files /dev/null and b/client/iOS/Resources/tabbar_icon_about.png differ
diff --git a/client/iOS/Resources/tabbar_icon_help.png b/client/iOS/Resources/tabbar_icon_help.png
new file mode 100755
index 000000000..0732b7d15
Binary files /dev/null and b/client/iOS/Resources/tabbar_icon_help.png differ
diff --git a/client/iOS/Resources/tabbar_icon_settings.png b/client/iOS/Resources/tabbar_icon_settings.png
new file mode 100755
index 000000000..04578f02c
Binary files /dev/null and b/client/iOS/Resources/tabbar_icon_settings.png differ
diff --git a/client/iOS/Resources/toolbar_icon_disconnect.png b/client/iOS/Resources/toolbar_icon_disconnect.png
new file mode 100755
index 000000000..cb823d4ec
Binary files /dev/null and b/client/iOS/Resources/toolbar_icon_disconnect.png differ
diff --git a/client/iOS/Resources/toolbar_icon_extkeyboad.png b/client/iOS/Resources/toolbar_icon_extkeyboad.png
new file mode 100755
index 000000000..9436c07c3
Binary files /dev/null and b/client/iOS/Resources/toolbar_icon_extkeyboad.png differ
diff --git a/client/iOS/Resources/toolbar_icon_home.png b/client/iOS/Resources/toolbar_icon_home.png
new file mode 100755
index 000000000..afcd9e4a9
Binary files /dev/null and b/client/iOS/Resources/toolbar_icon_home.png differ
diff --git a/client/iOS/Resources/toolbar_icon_keyboard.png b/client/iOS/Resources/toolbar_icon_keyboard.png
new file mode 100755
index 000000000..c2a068531
Binary files /dev/null and b/client/iOS/Resources/toolbar_icon_keyboard.png differ
diff --git a/client/iOS/Resources/toolbar_icon_touchpointer.png b/client/iOS/Resources/toolbar_icon_touchpointer.png
new file mode 100755
index 000000000..fc44508c9
Binary files /dev/null and b/client/iOS/Resources/toolbar_icon_touchpointer.png differ
diff --git a/client/iOS/Resources/toolbar_icon_win.png b/client/iOS/Resources/toolbar_icon_win.png
new file mode 100755
index 000000000..73328db1a
Binary files /dev/null and b/client/iOS/Resources/toolbar_icon_win.png differ
diff --git a/client/iOS/Resources/touch_pointer_active.png b/client/iOS/Resources/touch_pointer_active.png
new file mode 100755
index 000000000..c153de484
Binary files /dev/null and b/client/iOS/Resources/touch_pointer_active.png differ
diff --git a/client/iOS/Resources/touch_pointer_default.png b/client/iOS/Resources/touch_pointer_default.png
new file mode 100755
index 000000000..ba16a47c8
Binary files /dev/null and b/client/iOS/Resources/touch_pointer_default.png differ
diff --git a/client/iOS/Resources/touch_pointer_extkeyboard.png b/client/iOS/Resources/touch_pointer_extkeyboard.png
new file mode 100755
index 000000000..6f0c8cd10
Binary files /dev/null and b/client/iOS/Resources/touch_pointer_extkeyboard.png differ
diff --git a/client/iOS/Resources/touch_pointer_keyboard.png b/client/iOS/Resources/touch_pointer_keyboard.png
new file mode 100755
index 000000000..1a6d60dbd
Binary files /dev/null and b/client/iOS/Resources/touch_pointer_keyboard.png differ
diff --git a/client/iOS/Resources/touch_pointer_lclick.png b/client/iOS/Resources/touch_pointer_lclick.png
new file mode 100755
index 000000000..447d8abae
Binary files /dev/null and b/client/iOS/Resources/touch_pointer_lclick.png differ
diff --git a/client/iOS/Resources/touch_pointer_rclick.png b/client/iOS/Resources/touch_pointer_rclick.png
new file mode 100755
index 000000000..ad3ca8543
Binary files /dev/null and b/client/iOS/Resources/touch_pointer_rclick.png differ
diff --git a/client/iOS/Resources/touch_pointer_reset.png b/client/iOS/Resources/touch_pointer_reset.png
new file mode 100755
index 000000000..41ef8402a
Binary files /dev/null and b/client/iOS/Resources/touch_pointer_reset.png differ
diff --git a/client/iOS/Resources/touch_pointer_scroll.png b/client/iOS/Resources/touch_pointer_scroll.png
new file mode 100755
index 000000000..2855e0165
Binary files /dev/null and b/client/iOS/Resources/touch_pointer_scroll.png differ
diff --git a/client/iOS/Views/AdvancedKeyboardView.h b/client/iOS/Views/AdvancedKeyboardView.h
new file mode 100644
index 000000000..c24dad292
--- /dev/null
+++ b/client/iOS/Views/AdvancedKeyboardView.h
@@ -0,0 +1,50 @@
+/*
+ Advanced keyboard view interface
+
+ Copyright 2013 Thinstuff Technologies GmbH, Author: Martin Fleisz
+
+ This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0.
+ If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+
+#import
+
+// forward declaration
+@protocol AdvancedKeyboardDelegate
+@optional
+// called when a function key was pressed and a virtual keycode is provided
+// @key: virtual key code
+-(void)advancedKeyPressedVKey:(int)key;
+// called when a function key was pressed and the keys unicode is provided
+// @key: unicode character
+-(void)advancedKeyPressedUnicode:(int)key;
+@end
+
+
+@interface AdvancedKeyboardView : UIView
+{
+@private
+ // view containing function keys (F-keys) and function block (ins, del, home, end, ...)
+ UIView* _function_keys_view;
+
+ // view containing numpad keys (0-9, +-/*)
+ UIView* _numpad_keys_view;
+
+ // view containing cursor keys (up, down, left, right)
+ UIView* _cursor_keys_view;
+
+ // currently visible view
+ UIView* _cur_view;
+
+ // delegate
+ NSObject* _delegate;
+}
+
+@property (assign) NSObject* delegate;
+
+// init keyboard view with frame and delegate
+- (id)initWithFrame:(CGRect)frame delegate:(NSObject*)delegate;
+
+@end
+
diff --git a/client/iOS/Views/AdvancedKeyboardView.m b/client/iOS/Views/AdvancedKeyboardView.m
new file mode 100644
index 000000000..cadaf639e
--- /dev/null
+++ b/client/iOS/Views/AdvancedKeyboardView.m
@@ -0,0 +1,346 @@
+/*
+ Advanced keyboard view interface
+
+ Copyright 2013 Thinstuff Technologies GmbH, Author: Martin Fleisz
+
+ This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0.
+ If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+
+#import "AdvancedKeyboardView.h"
+#include
+
+// helper struct to define button layouts/settings
+struct ButtonItem
+{
+ NSString* title;
+ int tag;
+};
+
+@interface AdvancedKeyboardView (Private)
+- (UIView*)keyboardViewForItems:(struct ButtonItem*)items columns:(int)columns rows:(int)rows;
+@end
+
+@implementation AdvancedKeyboardView
+
+@synthesize delegate = _delegate;
+
+// defines for the different views
+#define KEY_SHOW_FUNCVIEW 0x1000
+#define KEY_SHOW_CURSORVIEW 0x1001
+#define KEY_SHOW_NUMPADVIEW 0x1002
+#define KEY_SKIP 0x8000
+#define KEY_MERGE_COLUMN 0x8001
+
+#define KEYCODE_UNICODE 0x80000000
+
+struct ButtonItem functionKeysItems[24] =
+{
+ { @"F1", VK_F1 },
+ { @"F2", VK_F2 },
+ { @"F3", VK_F3 },
+ { @"F4", VK_F4 },
+ { @"F5", VK_F5 },
+ { @"F6", VK_F6 },
+ { @"F7", VK_F7 },
+ { @"F8", VK_F8 },
+ { @"F9", VK_F9 },
+ { @"F10", VK_F10 },
+ { @"F11", VK_F11 },
+ { @"F12", VK_F12 },
+
+ { @"img:icon_key_arrows", KEY_SHOW_CURSORVIEW },
+ { @"Tab", VK_TAB },
+ { @"Ins", VK_INSERT },
+ { @"Home", VK_HOME },
+ { @"PgUp", VK_PRIOR },
+ { @"img:icon_key_win", VK_LWIN },
+
+ { @"123", KEY_SHOW_NUMPADVIEW },
+ { @"Print", VK_PRINT },
+ { @"Del", VK_DELETE },
+ { @"End", VK_END },
+ { @"PgDn", VK_NEXT },
+ { @"img:icon_key_menu", VK_APPS }
+};
+
+
+struct ButtonItem numPadKeysItems[24] =
+{
+ { @"(", KEYCODE_UNICODE | 40 },
+ { @")", KEYCODE_UNICODE | 41 },
+ { @"7", VK_NUMPAD7 },
+ { @"8", VK_NUMPAD8 },
+ { @"9", VK_NUMPAD9 },
+ { @"-", VK_SUBTRACT },
+
+ { @"/", VK_DIVIDE },
+ { @"*", VK_MULTIPLY },
+ { @"4", VK_NUMPAD4 },
+ { @"5", VK_NUMPAD5 },
+ { @"6", VK_NUMPAD6 },
+ { @"+", VK_ADD },
+
+ { @"Fn", KEY_SHOW_FUNCVIEW },
+ { @"Num", VK_NUMLOCK },
+ { @"1", VK_NUMPAD1 },
+ { @"2", VK_NUMPAD2 },
+ { @"3", VK_NUMPAD3 },
+ { @"img:icon_key_backspace", VK_BACK },
+
+ { @"img:icon_key_arrows", KEY_SHOW_CURSORVIEW },
+ { @"=", KEYCODE_UNICODE | 61 },
+ { @"", KEY_MERGE_COLUMN },
+ { @"0", VK_NUMPAD0 },
+ { @".", VK_DECIMAL },
+ { @"img:icon_key_return", VK_RETURN }
+};
+
+
+struct ButtonItem cursorKeysItems[24] =
+{
+ { @"", KEY_SKIP },
+ { @"", KEY_SKIP },
+ { @"", KEY_SKIP },
+ { @"", KEY_SKIP },
+ { @"", KEY_SKIP },
+ { @"", KEY_SKIP },
+
+ { @"", KEY_SKIP },
+ { @"", KEY_SKIP },
+ { @"", KEY_SKIP },
+ { @"img:icon_key_arrow_up", VK_UP },
+ { @"", KEY_SKIP },
+ { @"", KEY_SKIP },
+
+ { @"Fn", KEY_SHOW_FUNCVIEW },
+ { @"", KEY_SKIP },
+ { @"img:icon_key_arrow_left", VK_LEFT },
+ { @"", KEY_SKIP },
+ { @"img:icon_key_arrow_right", VK_RIGHT },
+ { @"img:icon_key_backspace", VK_BACK },
+
+ { @"123", KEY_SHOW_NUMPADVIEW },
+ { @"", KEY_SKIP },
+ { @"", KEY_SKIP },
+ { @"img:icon_key_arrow_down", VK_DOWN },
+ { @"", KEY_SKIP },
+ { @"img:icon_key_return", VK_RETURN }
+};
+
+
+- (void)initFunctionKeysView
+{
+ _function_keys_view = [[self keyboardViewForItems:functionKeysItems columns:6 rows:4] retain];
+ [self addSubview:_function_keys_view];
+}
+
+- (void)initNumPadKeysView
+{
+ _numpad_keys_view = [[self keyboardViewForItems:numPadKeysItems columns:6 rows:4] retain];
+ [self addSubview:_numpad_keys_view];
+}
+
+- (void)initCursorKeysView
+{
+ _cursor_keys_view = [[self keyboardViewForItems:cursorKeysItems columns:6 rows:4] retain];
+ [self addSubview:_cursor_keys_view];
+}
+
+
+- (id)initWithFrame:(CGRect)frame delegate:(NSObject*)delegate
+{
+ self = [super initWithFrame:frame];
+ if (self)
+ {
+ _delegate = delegate;
+
+ self.autoresizingMask = UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleWidth;
+ self.backgroundColor = [UIColor blackColor];
+ // Initialization code
+
+ [self initCursorKeysView];
+ [self initNumPadKeysView];
+ [self initFunctionKeysView];
+
+ // set function keys view to the initial view and hide others
+ _cur_view = _function_keys_view;
+ [_numpad_keys_view setHidden:YES];
+ [_cursor_keys_view setHidden:YES];
+ }
+ return self;
+}
+
+
+/*
+// Only override drawRect: if you perform custom drawing.
+// An empty implementation adversely affects performance during animation.
+- (void)drawRect:(CGRect)rect
+{
+ // Drawing code
+}
+*/
+
+- (void)drawRect:(CGRect)rect
+{
+ // draw a nice background gradient
+ CGContextRef currentContext = UIGraphicsGetCurrentContext();
+
+ CGGradientRef glossGradient;
+ CGColorSpaceRef rgbColorspace;
+ size_t num_locations = 2;
+ CGFloat locations[2] = { 0.0, 1.0 };
+ CGFloat components[8] = { 1.0, 1.0, 1.0, 0.35, // Start color
+ 1.0, 1.0, 1.0, 0.06 }; // End color
+
+ rgbColorspace = CGColorSpaceCreateDeviceRGB();
+ glossGradient = CGGradientCreateWithColorComponents(rgbColorspace, components, locations, num_locations);
+
+ CGRect currentBounds = self.bounds;
+ CGPoint topCenter = CGPointMake(CGRectGetMidX(currentBounds), 0.0f);
+ CGPoint midCenter = CGPointMake(CGRectGetMidX(currentBounds), currentBounds.size.height);
+ CGContextDrawLinearGradient(currentContext, glossGradient, topCenter, midCenter, 0);
+
+ CGGradientRelease(glossGradient);
+ CGColorSpaceRelease(rgbColorspace);
+}
+
+
+- (void)dealloc
+{
+ [_function_keys_view autorelease];
+ [_numpad_keys_view autorelease];
+ [_cursor_keys_view autorelease];
+ [super dealloc];
+}
+
+#pragma mark -
+#pragma mark button events
+
+-(IBAction)keyPressed:(id)sender
+{
+ UIButton* btn = (UIButton*)sender;
+ switch([btn tag])
+ {
+ case KEY_SHOW_CURSORVIEW:
+ // switch to cursor view
+ [_cur_view setHidden:YES];
+ [_cursor_keys_view setHidden:NO];
+ _cur_view = _cursor_keys_view;
+ break;
+
+ case KEY_SHOW_NUMPADVIEW:
+ // switch to numpad view
+ [_cur_view setHidden:YES];
+ [_numpad_keys_view setHidden:NO];
+ _cur_view = _numpad_keys_view;
+ break;
+
+ case KEY_SHOW_FUNCVIEW:
+ // switch to function keys view
+ [_cur_view setHidden:YES];
+ [_function_keys_view setHidden:NO];
+ _cur_view = _function_keys_view;
+ break;
+
+ default:
+ if([btn tag] & KEYCODE_UNICODE)
+ {
+ if ([[self delegate] respondsToSelector:@selector(advancedKeyPressedUnicode:)])
+ [[self delegate] advancedKeyPressedUnicode:([btn tag] & ~KEYCODE_UNICODE)];
+ }
+ else
+ {
+ if ([[self delegate] respondsToSelector:@selector(advancedKeyPressedVKey:)])
+ [[self delegate] advancedKeyPressedVKey:[btn tag]];
+ }
+ break;
+ }
+}
+
+@end
+
+
+#pragma mark -
+@implementation AdvancedKeyboardView (Private)
+
+- (UIView*)keyboardViewForItems:(struct ButtonItem*)items columns:(int)columns rows:(int)rows
+{
+ UIView* result_view = [[[UIView alloc] initWithFrame:self.bounds] autorelease];
+ result_view.autoresizingMask = UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleWidth;
+
+ // calculate maximum button size
+ int max_btn_width = result_view.bounds.size.width / ((columns * 2) + 1);
+ int max_btn_height = result_view.bounds.size.height / ((rows * 2) + 1);
+
+ // ensure minimum button size
+ CGSize btn_size = CGSizeMake(45, 30);
+ if(btn_size.width < max_btn_width)
+ btn_size.width = max_btn_width;
+ if(btn_size.height < max_btn_height)
+ btn_size.height = max_btn_height;
+
+ // calc distance width and height between buttons
+ int dist_width = (result_view.bounds.size.width - (columns * btn_size.width)) / (columns + 1);
+ int dist_height = (result_view.bounds.size.height - (rows * btn_size.height)) / (rows + 1);
+
+ UIImage* btn_background_img = [UIImage imageWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"keyboard_button_background" ofType:@"png"]];
+ for(int j = 0; j < rows; j++)
+ {
+ for(int i = 0; i < columns; i++)
+ {
+ struct ButtonItem* curItem = &items[j * columns + i];
+
+ // skip this spot?
+ if(curItem->tag == KEY_SKIP)
+ continue;
+
+ // create button, set autoresizing mask and add action handler
+ UIButton* btn = [UIButton buttonWithType:UIButtonTypeRoundedRect];
+ [btn setAutoresizingMask:(UIViewAutoresizingFlexibleLeftMargin | UIViewAutoresizingFlexibleRightMargin | UIViewAutoresizingFlexibleTopMargin | UIViewAutoresizingFlexibleBottomMargin | UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight)];
+ [btn addTarget:self action:@selector(keyPressed:) forControlEvents:UIControlEventTouchUpInside];
+
+ // if merge is specified we merge this button's position with the next one
+ if(curItem->tag == KEY_MERGE_COLUMN)
+ {
+ // calc merged frame
+ [btn setFrame:CGRectMake(dist_width + (i * dist_width) + (i * btn_size.width),
+ dist_height + (j * dist_height) + (j * btn_size.height),
+ btn_size.width * 2 + dist_width, btn_size.height)];
+
+ // proceed to the next column item
+ i++;
+ curItem = &items[j * columns + i];
+ }
+ else
+ {
+ [btn setFrame:CGRectMake(dist_width + (i * dist_width) + (i * btn_size.width),
+ dist_height + (j * dist_height) + (j * btn_size.height),
+ btn_size.width, btn_size.height)];
+ }
+
+ // set button text or image parameters
+ if([curItem->title hasPrefix:@"img:"] == YES)
+ {
+ UIImage* btn_image = [UIImage imageWithContentsOfFile:[[NSBundle mainBundle] pathForResource:[curItem->title substringFromIndex:4] ofType:@"png"]];
+ [btn setImage:btn_image forState:UIControlStateNormal];
+ }
+ else
+ {
+ [btn setTitle:curItem->title forState:UIControlStateNormal];
+ [btn setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];
+ }
+
+ [btn setBackgroundImage:btn_background_img forState:UIControlStateNormal];
+ [btn setTag:curItem->tag];
+
+ // add button to view
+ [result_view addSubview:btn];
+ }
+ }
+
+ return result_view;
+}
+
+@end
diff --git a/client/iOS/Views/BookmarkTableCell.h b/client/iOS/Views/BookmarkTableCell.h
new file mode 100644
index 000000000..4d8909555
--- /dev/null
+++ b/client/iOS/Views/BookmarkTableCell.h
@@ -0,0 +1,25 @@
+/*
+ Custom bookmark table cell
+
+ Copyright 2013 Thinstuff Technologies GmbH, Author: Martin Fleisz
+
+ This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0.
+ If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#import
+
+
+@interface BookmarkTableCell : UITableViewCell
+{
+ IBOutlet UILabel* _title;
+ IBOutlet UILabel* _sub_title;
+ IBOutlet UIImageView* _connection_state_icon;
+}
+
+@property (retain, nonatomic) UILabel* title;
+@property (retain, nonatomic) UILabel* subTitle;
+@property (retain, nonatomic) UIImageView* connectionStateIcon;
+
+
+@end
diff --git a/client/iOS/Views/BookmarkTableCell.m b/client/iOS/Views/BookmarkTableCell.m
new file mode 100644
index 000000000..83fbf7094
--- /dev/null
+++ b/client/iOS/Views/BookmarkTableCell.m
@@ -0,0 +1,38 @@
+/*
+ Custom bookmark table cell
+
+ Copyright 2013 Thinstuff Technologies GmbH, Author: Martin Fleisz
+
+ This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0.
+ If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#import "BookmarkTableCell.h"
+
+
+@implementation BookmarkTableCell
+
+@synthesize title = _title, subTitle = _sub_title, connectionStateIcon = _connection_state_icon;
+
+- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier {
+ if ((self = [super initWithStyle:style reuseIdentifier:reuseIdentifier])) {
+ // Initialization code
+ }
+ return self;
+}
+
+
+- (void)setSelected:(BOOL)selected animated:(BOOL)animated {
+
+ [super setSelected:selected animated:animated];
+
+ // Configure the view for the selected state
+}
+
+
+- (void)dealloc {
+ [super dealloc];
+}
+
+
+@end
diff --git a/client/iOS/Views/EditButtonTableViewCell.h b/client/iOS/Views/EditButtonTableViewCell.h
new file mode 100644
index 000000000..7c755ae61
--- /dev/null
+++ b/client/iOS/Views/EditButtonTableViewCell.h
@@ -0,0 +1,21 @@
+/*
+ Custom table cell with a button
+
+ Copyright 2013 Thinstuff Technologies GmbH, Author: Martin Fleisz
+
+ This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0.
+ If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#import
+
+@interface EditButtonTableViewCell : UITableViewCell
+{
+ IBOutlet UILabel* _label;
+ IBOutlet UIButton* _button;
+}
+
+@property (retain, nonatomic) UILabel* label;
+@property (retain, nonatomic) UIButton* button;
+
+@end
diff --git a/client/iOS/Views/EditButtonTableViewCell.m b/client/iOS/Views/EditButtonTableViewCell.m
new file mode 100644
index 000000000..bf627ab4f
--- /dev/null
+++ b/client/iOS/Views/EditButtonTableViewCell.m
@@ -0,0 +1,32 @@
+/*
+ Custom table cell with a button
+
+ Copyright 2013 Thinstuff Technologies GmbH, Author: Martin Fleisz
+
+ This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0.
+ If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#import "EditButtonTableViewCell.h"
+
+@implementation EditButtonTableViewCell
+
+@synthesize label = _label, button = _button;
+
+- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier
+{
+ self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];
+ if (self) {
+ // Initialization code
+ }
+ return self;
+}
+
+- (void)setSelected:(BOOL)selected animated:(BOOL)animated
+{
+ [super setSelected:selected animated:animated];
+
+ // Configure the view for the selected state
+}
+
+@end
diff --git a/client/iOS/Views/EditFlagTableViewCell.h b/client/iOS/Views/EditFlagTableViewCell.h
new file mode 100644
index 000000000..f8a9f779d
--- /dev/null
+++ b/client/iOS/Views/EditFlagTableViewCell.h
@@ -0,0 +1,21 @@
+/*
+ Custom table cell with toggle switch
+
+ Copyright 2013 Thinstuff Technologies GmbH, Author: Martin Fleisz
+
+ This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0.
+ If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#import
+
+@interface EditFlagTableViewCell : UITableViewCell
+{
+ IBOutlet UILabel* _label;
+ IBOutlet UISwitch* _toggle;
+}
+
+@property (retain, nonatomic) UILabel* label;
+@property (retain, nonatomic) UISwitch* toggle;
+
+@end
diff --git a/client/iOS/Views/EditFlagTableViewCell.m b/client/iOS/Views/EditFlagTableViewCell.m
new file mode 100644
index 000000000..0b7fa694a
--- /dev/null
+++ b/client/iOS/Views/EditFlagTableViewCell.m
@@ -0,0 +1,32 @@
+/*
+ Custom table cell with toggle switch
+
+ Copyright 2013 Thinstuff Technologies GmbH, Author: Martin Fleisz
+
+ This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0.
+ If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#import "EditFlagTableViewCell.h"
+
+@implementation EditFlagTableViewCell
+
+@synthesize label = _label, toggle = _toggle;
+
+- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier
+{
+ self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];
+ if (self) {
+ // Initialization code
+ }
+ return self;
+}
+
+- (void)setSelected:(BOOL)selected animated:(BOOL)animated
+{
+ [super setSelected:selected animated:animated];
+
+ // Configure the view for the selected state
+}
+
+@end
diff --git a/client/iOS/Views/EditSecretTextTableViewCell.h b/client/iOS/Views/EditSecretTextTableViewCell.h
new file mode 100644
index 000000000..aef3b516f
--- /dev/null
+++ b/client/iOS/Views/EditSecretTextTableViewCell.h
@@ -0,0 +1,24 @@
+/*
+ Custom table cell with secret edit text field
+
+ Copyright 2013 Thinstuff Technologies GmbH, Author: Martin Fleisz
+
+ This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0.
+ If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#import
+
+@interface EditSecretTextTableViewCell : UITableViewCell
+{
+ IBOutlet UILabel* _label;
+ IBOutlet UITextField* _textfield;
+ IBOutlet UIButton* _unhide_button;
+}
+
+@property (retain, nonatomic) UILabel* label;
+@property (retain, nonatomic) UITextField* textfield;
+
+- (void)setEnabled:(BOOL)enabled;
+
+@end
diff --git a/client/iOS/Views/EditSecretTextTableViewCell.m b/client/iOS/Views/EditSecretTextTableViewCell.m
new file mode 100644
index 000000000..a9b888793
--- /dev/null
+++ b/client/iOS/Views/EditSecretTextTableViewCell.m
@@ -0,0 +1,54 @@
+/*
+ Custom table cell with secret edit text field
+
+ Copyright 2013 Thinstuff Technologies GmbH, Author: Martin Fleisz
+
+ This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0.
+ If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#import "EditSecretTextTableViewCell.h"
+
+@implementation EditSecretTextTableViewCell
+
+@synthesize label = _label, textfield = _textfield;
+
+- (void)awakeFromNib
+{
+ [super awakeFromNib];
+ [_unhide_button setTitle:NSLocalizedString(@"Unhide", @"Button title 'Unhide'") forState:UIControlStateNormal];
+ [_unhide_button addTarget:self action:@selector(togglePasswordMode:) forControlEvents:UIControlEventTouchUpInside];
+}
+
+- (void)setEnabled:(BOOL)enabled
+{
+ [_label setEnabled:enabled];
+ [_textfield setEnabled:enabled];
+ [_unhide_button setEnabled:enabled];
+}
+
+#pragma mark - action handlers
+- (void)togglePasswordMode:(id)sender
+{
+ BOOL isSecure = [_textfield isSecureTextEntry];
+
+ if (isSecure)
+ {
+ [_unhide_button setTitle:NSLocalizedString(@"Hide", @"Button title 'Hide'") forState:UIControlStateNormal];
+ [_textfield setSecureTextEntry:NO];
+ }
+ else
+ {
+ BOOL first_responder = [_textfield isFirstResponder];
+ // little trick to make non-secure to secure transition working - this seems to be an ios bug:
+ // http://stackoverflow.com/questions/6710019/uitextfield-securetextentry-works-going-from-yes-to-no-but-changing-back-to-y
+ [_textfield setEnabled:NO];
+ [_unhide_button setTitle:NSLocalizedString(@"Unhide", @"Button title 'Unhide'") forState:UIControlStateNormal];
+ [_textfield setSecureTextEntry:YES];
+ [_textfield setEnabled:YES];
+ if (first_responder)
+ [_textfield becomeFirstResponder];
+ }
+}
+
+@end
diff --git a/client/iOS/Views/EditSelectionTableViewCell.h b/client/iOS/Views/EditSelectionTableViewCell.h
new file mode 100644
index 000000000..0023ce643
--- /dev/null
+++ b/client/iOS/Views/EditSelectionTableViewCell.h
@@ -0,0 +1,21 @@
+/*
+ Custom table cell with a label on the right, showing the current selection
+
+ Copyright 2013 Thinstuff Technologies GmbH, Author: Martin Fleisz
+
+ This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0.
+ If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#import
+
+@interface EditSelectionTableViewCell : UITableViewCell
+{
+ IBOutlet UILabel* _label;
+ IBOutlet UILabel* _selection;
+}
+
+@property (retain, nonatomic) UILabel* label;
+@property (retain, nonatomic) UILabel* selection;
+
+@end
diff --git a/client/iOS/Views/EditSelectionTableViewCell.m b/client/iOS/Views/EditSelectionTableViewCell.m
new file mode 100644
index 000000000..4ad6233b0
--- /dev/null
+++ b/client/iOS/Views/EditSelectionTableViewCell.m
@@ -0,0 +1,32 @@
+/*
+ Custom table cell with a label on the right, showing the current selection
+
+ Copyright 2013 Thinstuff Technologies GmbH, Author: Martin Fleisz
+
+ This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0.
+ If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#import "EditSelectionTableViewCell.h"
+
+@implementation EditSelectionTableViewCell
+
+@synthesize label = _label, selection = _selection;
+
+- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier
+{
+ self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];
+ if (self) {
+ // Initialization code
+ }
+ return self;
+}
+
+- (void)setSelected:(BOOL)selected animated:(BOOL)animated
+{
+ [super setSelected:selected animated:animated];
+
+ // Configure the view for the selected state
+}
+
+@end
diff --git a/client/iOS/Views/EditSubEditTableViewCell.h b/client/iOS/Views/EditSubEditTableViewCell.h
new file mode 100644
index 000000000..541a7c764
--- /dev/null
+++ b/client/iOS/Views/EditSubEditTableViewCell.h
@@ -0,0 +1,19 @@
+/*
+ Custom table cell indicating a switch to a sub-view
+
+ Copyright 2013 Thinstuff Technologies GmbH, Author: Martin Fleisz
+
+ This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0.
+ If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#import
+
+@interface EditSubEditTableViewCell : UITableViewCell
+{
+ IBOutlet UILabel* _label;
+}
+
+@property (retain, nonatomic) UILabel* label;
+
+@end
diff --git a/client/iOS/Views/EditSubEditTableViewCell.m b/client/iOS/Views/EditSubEditTableViewCell.m
new file mode 100644
index 000000000..0ecc37ff7
--- /dev/null
+++ b/client/iOS/Views/EditSubEditTableViewCell.m
@@ -0,0 +1,32 @@
+/*
+ Custom table cell indicating a switch to a sub-view
+
+ Copyright 2013 Thinstuff Technologies GmbH, Author: Martin Fleisz
+
+ This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0.
+ If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#import "EditSubEditTableViewCell.h"
+
+@implementation EditSubEditTableViewCell
+
+@synthesize label = _label;
+
+- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier
+{
+ self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];
+ if (self) {
+ // Initialization code
+ }
+ return self;
+}
+
+- (void)setSelected:(BOOL)selected animated:(BOOL)animated
+{
+ [super setSelected:selected animated:animated];
+
+ // Configure the view for the selected state
+}
+
+@end
diff --git a/client/iOS/Views/EditTextTableViewCell.h b/client/iOS/Views/EditTextTableViewCell.h
new file mode 100644
index 000000000..22a55a679
--- /dev/null
+++ b/client/iOS/Views/EditTextTableViewCell.h
@@ -0,0 +1,21 @@
+/*
+ Custom table cell with edit text field
+
+ Copyright 2013 Thinstuff Technologies GmbH, Author: Martin Fleisz
+
+ This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0.
+ If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#import
+
+@interface EditTextTableViewCell : UITableViewCell
+{
+ IBOutlet UILabel* _label;
+ IBOutlet UITextField* _textfield;
+}
+
+@property (retain, nonatomic) UILabel* label;
+@property (retain, nonatomic) UITextField* textfield;
+
+@end
diff --git a/client/iOS/Views/EditTextTableViewCell.m b/client/iOS/Views/EditTextTableViewCell.m
new file mode 100644
index 000000000..afbf417d6
--- /dev/null
+++ b/client/iOS/Views/EditTextTableViewCell.m
@@ -0,0 +1,32 @@
+/*
+ Custom table cell with edit text field
+
+ Copyright 2013 Thinstuff Technologies GmbH, Author: Martin Fleisz
+
+ This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0.
+ If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#import "EditTextTableViewCell.h"
+
+@implementation EditTextTableViewCell
+
+@synthesize label = _label, textfield = _textfield;
+
+- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier
+{
+ self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];
+ if (self) {
+ // Initialization code
+ }
+ return self;
+}
+
+- (void)setSelected:(BOOL)selected animated:(BOOL)animated
+{
+ [super setSelected:selected animated:animated];
+
+ // Configure the view for the selected state
+}
+
+@end
diff --git a/client/iOS/Views/RDPSessionView.h b/client/iOS/Views/RDPSessionView.h
new file mode 100644
index 000000000..17eb17429
--- /dev/null
+++ b/client/iOS/Views/RDPSessionView.h
@@ -0,0 +1,20 @@
+/*
+ RDP Session View
+
+ Copyright 2013 Thinstuff Technologies GmbH, Author: Martin Fleisz
+
+ This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0.
+ If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#import
+#import "RDPSession.h"
+
+@interface RDPSessionView : UIView
+{
+ RDPSession* _session;
+}
+
+- (void)setSession:(RDPSession*)session;
+
+@end
diff --git a/client/iOS/Views/RDPSessionView.m b/client/iOS/Views/RDPSessionView.m
new file mode 100644
index 000000000..d36f315c1
--- /dev/null
+++ b/client/iOS/Views/RDPSessionView.m
@@ -0,0 +1,51 @@
+/*
+ RDP Session View
+
+ Copyright 2013 Thinstuff Technologies GmbH, Author: Martin Fleisz
+
+ This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0.
+ If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#import "RDPSessionView.h"
+
+@implementation RDPSessionView
+
+- (void)setSession:(RDPSession*)session
+{
+ _session = session;
+}
+
+- (void)awakeFromNib
+{
+ [super awakeFromNib];
+ _session = nil;
+}
+
+- (void)drawRect:(CGRect)rect
+{
+ if(_session != nil)
+ {
+ CGContextRef context = UIGraphicsGetCurrentContext();
+ CGImageRef cgImage = CGBitmapContextCreateImage([_session bitmapContext]);
+
+ CGContextTranslateCTM(context, 0, [self bounds].size.height);
+ CGContextScaleCTM(context, 1.0, -1.0);
+ CGContextClipToRect(context, CGRectMake(rect.origin.x, [self bounds].size.height - rect.origin.y - rect.size.height, rect.size.width, rect.size.height));
+ CGContextDrawImage(context, CGRectMake(0, 0, [self bounds].size.width, [self bounds].size.height), cgImage);
+
+ CGImageRelease(cgImage);
+ }
+ else
+ {
+ // just clear the screen with black
+ [[UIColor blackColor] set];
+ UIRectFill([self bounds]);
+ }
+}
+
+- (void)dealloc {
+ [super dealloc];
+}
+
+@end
diff --git a/client/iOS/Views/SessionTableCell.h b/client/iOS/Views/SessionTableCell.h
new file mode 100644
index 000000000..5090fa5bc
--- /dev/null
+++ b/client/iOS/Views/SessionTableCell.h
@@ -0,0 +1,28 @@
+/*
+ Custom session table cell
+
+ Copyright 2013 Thinstuff Technologies GmbH, Author: Martin Fleisz
+
+ This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0.
+ If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#import
+
+
+@interface SessionTableCell : UITableViewCell
+{
+ IBOutlet UILabel* _title;
+ IBOutlet UILabel* _server;
+ IBOutlet UILabel* _username;
+ IBOutlet UIImageView* _screenshot;
+ IBOutlet UIButton* _disconnect_button;
+}
+
+@property (retain, nonatomic) UILabel* title;
+@property (retain, nonatomic) UILabel* server;
+@property (retain, nonatomic) UILabel* username;
+@property (retain, nonatomic) UIImageView* screenshot;
+@property (retain, nonatomic) UIButton* disconnectButton;
+
+@end
diff --git a/client/iOS/Views/SessionTableCell.m b/client/iOS/Views/SessionTableCell.m
new file mode 100644
index 000000000..f57a4c816
--- /dev/null
+++ b/client/iOS/Views/SessionTableCell.m
@@ -0,0 +1,40 @@
+/*
+ Custom session table cell
+
+ Copyright 2013 Thinstuff Technologies GmbH, Author: Martin Fleisz
+
+ This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0.
+ If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#import "SessionTableCell.h"
+
+
+@implementation SessionTableCell
+
+@synthesize title = _title, server = _server, username = _username, screenshot = _screenshot, disconnectButton = _disconnect_button;
+
+- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier {
+
+ self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];
+ if (self) {
+ // Initialization code.
+ }
+ return self;
+}
+
+
+- (void)setSelected:(BOOL)selected animated:(BOOL)animated {
+
+ [super setSelected:selected animated:animated];
+
+ // Configure the view for the selected state.
+}
+
+
+- (void)dealloc {
+ [super dealloc];
+}
+
+
+@end
diff --git a/client/iOS/Views/TouchPointerView.h b/client/iOS/Views/TouchPointerView.h
new file mode 100644
index 000000000..1c0b036cc
--- /dev/null
+++ b/client/iOS/Views/TouchPointerView.h
@@ -0,0 +1,73 @@
+/*
+ RDP Touch Pointer View
+
+ Copyright 2013 Thinstuff Technologies GmbH, Author: Martin Fleisz
+
+ This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0.
+ If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#import
+
+// protocol for touch pointer callbacks
+@protocol TouchPointerDelegate
+// callback if touch pointer should be closed
+-(void)touchPointerClose;
+// callback for a left click action
+-(void)touchPointerLeftClick:(CGPoint)pos down:(BOOL)down;
+// callback for a right click action
+-(void)touchPointerRightClick:(CGPoint)pos down:(BOOL)down;
+// callback for pointer move action
+-(void)touchPointerMove:(CGPoint)pos;
+// callback if scrolling is performed
+-(void)touchPointerScrollDown:(BOOL)down;
+// callback for toggling the standard keyboard
+-(void)touchPointerToggleKeyboard;
+// callback for toggling the extended keyboard
+-(void)touchPointerToggleExtendedKeyboard;
+// callback for reset session view
+-(void)touchPointerResetSessionView;
+@end
+
+
+@interface TouchPointerView : UIView
+{
+ // transformation and image currently drawn
+ CGAffineTransform _pointer_transformation;
+ UIImage* _cur_pointer_img;
+
+ // action images
+ UIImage* _default_pointer_img;
+ UIImage* _active_pointer_img;
+ UIImage* _lclick_pointer_img;
+ UIImage* _rclick_pointer_img;
+ UIImage* _scroll_pointer_img;
+ UIImage* _extkeyboard_pointer_img;
+ UIImage* _keyboard_pointer_img;
+ UIImage* _reset_pointer_img;
+
+ // predefined areas for all actions
+ CGRect _pointer_areas[9];
+
+ // scroll/drag n drop handling
+ CGPoint _prev_touch_location;
+ BOOL _pointer_moving;
+ BOOL _pointer_scrolling;
+
+ NSObject* _delegate;
+}
+
+@property (assign) IBOutlet NSObject* delegate;
+
+// positions the pointer on screen if it got offscreen after an orentation change or after displaying the keyboard
+-(void)ensurePointerIsVisible;
+
+// returns the extent required for the scrollview to use the touch pointer near the edges of the session view
+-(UIEdgeInsets)getEdgeInsets;
+
+// return pointer dimension and position information
+- (CGPoint)getPointerPosition;
+- (int)getPointerWidth;
+- (int)getPointerHeight;
+
+@end
diff --git a/client/iOS/Views/TouchPointerView.m b/client/iOS/Views/TouchPointerView.m
new file mode 100644
index 000000000..db2108da9
--- /dev/null
+++ b/client/iOS/Views/TouchPointerView.m
@@ -0,0 +1,328 @@
+/*
+ RDP Touch Pointer View
+
+ Copyright 2013 Thinstuff Technologies GmbH, Author: Martin Fleisz
+
+ This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0.
+ If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#import "TouchPointerView.h"
+#import "Utils.h"
+
+
+#define RESET_DEFAULT_POINTER_IMAGE_DELAY 0.15
+
+#define POINTER_ACTION_CURSOR 0
+#define POINTER_ACTION_CLOSE 3
+#define POINTER_ACTION_RCLICK 2
+#define POINTER_ACTION_LCLICK 4
+#define POINTER_ACTION_MOVE 4
+#define POINTER_ACTION_SCROLL 5
+#define POINTER_ACTION_KEYBOARD 7
+#define POINTER_ACTION_EXTKEYBOARD 8
+#define POINTER_ACTION_RESET 6
+
+@interface TouchPointerView (Private)
+- (void)setCurrentPointerImage:(UIImage*)image;
+- (void)displayPointerActionImage:(UIImage*)image;
+- (BOOL)pointInsidePointer:(CGPoint)point;
+- (BOOL)pointInsidePointerArea:(int)area point:(CGPoint)point;
+- (CGPoint)getCursorPosition;
+- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event;
+- (void)handleSingleTap:(UITapGestureRecognizer*)gesture;
+- (void)handlerForGesture:(UIGestureRecognizer*)gesture sendClick:(BOOL)sendClick;
+@end
+
+@implementation TouchPointerView
+
+@synthesize delegate = _delegate;
+
+- (void)awakeFromNib
+{
+ [super awakeFromNib];
+
+ // set content mode when rotating (keep aspect ratio)
+ [self setContentMode:UIViewContentModeTopLeft];
+
+ // load touchPointerImage
+ _default_pointer_img = [[UIImage imageWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"touch_pointer_default" ofType:@"png"]] retain];
+ _active_pointer_img = [[UIImage imageWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"touch_pointer_active" ofType:@"png"]] retain];
+ _lclick_pointer_img = [[UIImage imageWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"touch_pointer_lclick" ofType:@"png"]] retain];
+ _rclick_pointer_img = [[UIImage imageWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"touch_pointer_rclick" ofType:@"png"]] retain];
+ _scroll_pointer_img = [[UIImage imageWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"touch_pointer_scroll" ofType:@"png"]] retain];
+ _extkeyboard_pointer_img = [[UIImage imageWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"touch_pointer_ext_keyboard" ofType:@"png"]] retain];
+ _keyboard_pointer_img = [[UIImage imageWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"touch_pointer_keyboard" ofType:@"png"]] retain];
+ _reset_pointer_img = [[UIImage imageWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"touch_pointer_reset" ofType:@"png"]] retain];
+ _cur_pointer_img = _default_pointer_img;
+ _pointer_transformation = CGAffineTransformMake(1, 0, 0, 1, 0, 0);
+
+ // init flags
+ _pointer_moving = NO;
+ _pointer_scrolling = NO;
+
+ // create areas array
+ int i, j;
+ CGFloat area_width = [_cur_pointer_img size].width / 3.0f;
+ CGFloat area_height = [_cur_pointer_img size].height / 3.0f;
+ for(i = 0; i < 3; i++)
+ {
+ for(j = 0; j < 3; j++)
+ {
+ _pointer_areas[j + i * 3] = CGRectMake(j * area_width, i * area_height, area_width, area_height);
+ }
+ }
+
+ // init gesture recognizers
+ UITapGestureRecognizer* singleTapRecognizer = [[[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleSingleTap:)] autorelease];
+ [singleTapRecognizer setNumberOfTouchesRequired:1];
+ [singleTapRecognizer setNumberOfTapsRequired:1];
+
+ UILongPressGestureRecognizer* dragDropRecognizer = [[[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(handleDragDrop:)] autorelease];
+ dragDropRecognizer.minimumPressDuration = 0.4;
+ // dragDropRecognizer.allowableMovement = 1000.0;
+
+ UILongPressGestureRecognizer* pointerMoveScrollRecognizer = [[[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(handlePointerMoveScroll:)] autorelease];
+ pointerMoveScrollRecognizer.minimumPressDuration = 0.15;
+ pointerMoveScrollRecognizer.allowableMovement = 1000.0;
+ [pointerMoveScrollRecognizer requireGestureRecognizerToFail:dragDropRecognizer];
+
+ [self addGestureRecognizer:singleTapRecognizer];
+ [self addGestureRecognizer:dragDropRecognizer];
+ [self addGestureRecognizer:pointerMoveScrollRecognizer];
+}
+
+- (void)dealloc
+{
+ [super dealloc];
+ [_default_pointer_img autorelease];
+ [_active_pointer_img autorelease];
+ [_lclick_pointer_img autorelease];
+ [_rclick_pointer_img autorelease];
+ [_scroll_pointer_img autorelease];
+ [_extkeyboard_pointer_img autorelease];
+ [_keyboard_pointer_img autorelease];
+ [_reset_pointer_img autorelease];
+}
+
+#pragma mark - Public interface
+
+// positions the pointer on screen if it got offscreen after an orentation change
+-(void)ensurePointerIsVisible
+{
+ CGRect bounds = [self bounds];
+ if(_pointer_transformation.tx > (bounds.size.width - _cur_pointer_img.size.width))
+ _pointer_transformation.tx = bounds.size.width - _cur_pointer_img.size.width;
+ if(_pointer_transformation.ty > (bounds.size.height - _cur_pointer_img.size.height))
+ _pointer_transformation.ty = bounds.size.height - _cur_pointer_img.size.height;
+ [self setNeedsDisplay];
+}
+
+// show/hides the touch pointer
+-(void)setHidden:(BOOL)hidden
+{
+ [super setHidden:hidden];
+
+ // if shown center pointer in view
+ if(!hidden)
+ {
+ _pointer_transformation = CGAffineTransformMakeTranslation(([self bounds].size.width - [_cur_pointer_img size].width) / 2,
+ ([self bounds].size.height - [_cur_pointer_img size].height) / 2);
+ [self setNeedsDisplay];
+ }
+}
+
+-(UIEdgeInsets)getEdgeInsets
+{
+ return UIEdgeInsetsMake(0, 0, [_cur_pointer_img size].width, [_cur_pointer_img size].height);
+}
+
+- (CGPoint)getPointerPosition
+{
+ return CGPointMake(_pointer_transformation.tx, _pointer_transformation.ty);
+}
+
+- (int)getPointerWidth
+{
+ return [_cur_pointer_img size].width;
+}
+
+- (int)getPointerHeight
+{
+ return [_cur_pointer_img size].height;
+}
+
+
+@end
+
+@implementation TouchPointerView (Private)
+
+- (void)setCurrentPointerImage:(UIImage*)image
+{
+ _cur_pointer_img = image;
+ [self setNeedsDisplay];
+}
+
+- (void)displayPointerActionImage:(UIImage*)image
+{
+ [self setCurrentPointerImage:image];
+ [self performSelector:@selector(setCurrentPointerImage:) withObject:_default_pointer_img afterDelay:RESET_DEFAULT_POINTER_IMAGE_DELAY];
+}
+
+// Only override drawRect: if you perform custom drawing.
+// An empty implementation adversely affects performance during animation.
+- (void)drawRect:(CGRect)rect
+{
+ // Drawing code
+ CGContextRef context = UIGraphicsGetCurrentContext();
+ CGContextSaveGState(context);
+ CGContextConcatCTM(context, _pointer_transformation);
+ CGContextDrawImage(context, CGRectMake(0, 0, [_cur_pointer_img size].width, [_cur_pointer_img size].height), [_cur_pointer_img CGImage]);
+ CGContextRestoreGState(context);
+}
+
+// helper that returns YES if the given point is within the pointer
+-(BOOL) pointInsidePointer:(CGPoint)point
+{
+ CGRect rec = CGRectMake(0, 0, [_cur_pointer_img size].width, [_cur_pointer_img size].height);
+ return CGRectContainsPoint(CGRectApplyAffineTransform(rec, _pointer_transformation), point);
+}
+
+// helper that returns YES if the given point is within the given pointer area
+-(BOOL) pointInsidePointerArea:(int)area point:(CGPoint)point
+{
+ CGRect rec = _pointer_areas[area];
+ return CGRectContainsPoint(CGRectApplyAffineTransform(rec, _pointer_transformation), point);
+}
+
+// returns the position of the cursor
+-(CGPoint) getCursorPosition
+{
+ CGRect transPointerArea = CGRectApplyAffineTransform(_pointer_areas[POINTER_ACTION_CURSOR], _pointer_transformation);
+ return CGPointMake(CGRectGetMidX(transPointerArea), CGRectGetMidY(transPointerArea));
+}
+
+// this filters events - if the pointer was clicked the scrollview won't get any events
+-(BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event
+{
+ return [self pointInsidePointer:point];
+}
+
+#pragma mark - Action handlers
+
+// handles single tap gestures, returns YES if the event was handled by the pointer, NO otherwise
+-(void) handleSingleTap:(UITapGestureRecognizer*)gesture
+{
+ // get touch position within our view
+ CGPoint touchPos = [gesture locationInView:self];
+
+ // look if pointer was in one of our action areas
+ if([self pointInsidePointerArea:POINTER_ACTION_CLOSE point:touchPos])
+ [[self delegate] touchPointerClose];
+ else if([self pointInsidePointerArea:POINTER_ACTION_LCLICK point:touchPos])
+ {
+ [self displayPointerActionImage:_lclick_pointer_img];
+ [[self delegate] touchPointerLeftClick:[self getCursorPosition] down:YES];
+ [[self delegate] touchPointerLeftClick:[self getCursorPosition] down:NO];
+ }
+ else if([self pointInsidePointerArea:POINTER_ACTION_RCLICK point:touchPos])
+ {
+ [self displayPointerActionImage:_rclick_pointer_img];
+ [[self delegate] touchPointerRightClick:[self getCursorPosition] down:YES];
+ [[self delegate] touchPointerRightClick:[self getCursorPosition] down:NO];
+ }
+ else if([self pointInsidePointerArea:POINTER_ACTION_KEYBOARD point:touchPos])
+ {
+ [self displayPointerActionImage:_keyboard_pointer_img];
+ [[self delegate] touchPointerToggleKeyboard];
+ }
+ else if([self pointInsidePointerArea:POINTER_ACTION_EXTKEYBOARD point:touchPos])
+ {
+ [self displayPointerActionImage:_extkeyboard_pointer_img];
+ [[self delegate] touchPointerToggleExtendedKeyboard];
+ }
+ else if([self pointInsidePointerArea:POINTER_ACTION_RESET point:touchPos])
+ {
+ [self displayPointerActionImage:_reset_pointer_img];
+ [[self delegate] touchPointerResetSessionView];
+ }
+}
+
+-(void) handlerForGesture:(UIGestureRecognizer*)gesture sendClick:(BOOL)sendClick
+{
+ if([gesture state] == UIGestureRecognizerStateBegan)
+ {
+ CGPoint touchPos = [gesture locationInView:self];
+ if([self pointInsidePointerArea:POINTER_ACTION_LCLICK point:touchPos])
+ {
+ _prev_touch_location = touchPos;
+ _pointer_moving = YES;
+ if(sendClick == YES)
+ {
+ [[self delegate] touchPointerLeftClick:[self getCursorPosition] down:YES];
+ [self setCurrentPointerImage:_active_pointer_img];
+ }
+ }
+ else if([self pointInsidePointerArea:POINTER_ACTION_SCROLL point:touchPos])
+ {
+ [self setCurrentPointerImage:_scroll_pointer_img];
+ _prev_touch_location = touchPos;
+ _pointer_scrolling = YES;
+ }
+ }
+ else if([gesture state] == UIGestureRecognizerStateChanged)
+ {
+ if(_pointer_moving)
+ {
+ CGPoint touchPos = [gesture locationInView:self];
+ _pointer_transformation = CGAffineTransformTranslate(_pointer_transformation, touchPos.x - _prev_touch_location.x, touchPos.y - _prev_touch_location.y);
+ [[self delegate] touchPointerMove:[self getCursorPosition]];
+ _prev_touch_location = touchPos;
+ [self setNeedsDisplay];
+ }
+ else if(_pointer_scrolling)
+ {
+ CGPoint touchPos = [gesture locationInView:self];
+ float delta = touchPos.y - _prev_touch_location.y;
+ if(delta > GetScrollGestureDelta())
+ {
+ [[self delegate] touchPointerScrollDown:YES];
+ _prev_touch_location = touchPos;
+ }
+ else if(delta < -GetScrollGestureDelta())
+ {
+ [[self delegate] touchPointerScrollDown:NO];
+ _prev_touch_location = touchPos;
+ }
+ }
+ }
+ else if([gesture state] == UIGestureRecognizerStateEnded)
+ {
+ if(_pointer_moving)
+ {
+ if(sendClick == YES)
+ [[self delegate] touchPointerLeftClick:[self getCursorPosition] down:NO];
+ _pointer_moving = NO;
+ [self setCurrentPointerImage:_default_pointer_img];
+ }
+
+ if(_pointer_scrolling)
+ {
+ [self setCurrentPointerImage:_default_pointer_img];
+ _pointer_scrolling = NO;
+ }
+ }
+}
+
+// handles long press gestures
+-(void) handleDragDrop:(UILongPressGestureRecognizer*)gesture
+{
+ [self handlerForGesture:gesture sendClick:YES];
+}
+
+-(void) handlePointerMoveScroll:(UILongPressGestureRecognizer*)gesture
+{
+ [self handlerForGesture:gesture sendClick:NO];
+}
+
+@end
diff --git a/client/iOS/iFreeRDP-Prefix.pch b/client/iOS/iFreeRDP-Prefix.pch
new file mode 100644
index 000000000..ecb2e5ace
--- /dev/null
+++ b/client/iOS/iFreeRDP-Prefix.pch
@@ -0,0 +1,23 @@
+/*
+ PCH
+
+ Copyright 2013 Thinstuff Technologies GmbH, Author: Martin Fleisz
+
+ This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0.
+ If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+//
+// Prefix header for all source files of the 'iFreeRDP' target in the 'iFreeRDP' project
+//
+
+#import
+
+#ifndef __IPHONE_3_0
+#warning "This project uses features only available in iPhone SDK 3.0 and later."
+#endif
+
+#ifdef __OBJC__
+ #import
+ #import
+#endif
diff --git a/client/iOS/iFreeRDP.plist b/client/iOS/iFreeRDP.plist
new file mode 100644
index 000000000..a60778e01
--- /dev/null
+++ b/client/iOS/iFreeRDP.plist
@@ -0,0 +1,53 @@
+
+
+
+
+ CFBundleDevelopmentRegion
+ English
+ CFBundleDisplayName
+ iFreeRDP
+ CFBundleExecutable
+ ${EXECUTABLE_NAME}
+ CFBundleIconFiles
+
+ Icon.png
+ Icon-72.png
+ Icon@2x.png
+ Icon-72@2x.png
+
+ CFBundleIdentifier
+ at.thinstuff.ifreerdp
+ CFBundleInfoDictionaryVersion
+ 6.0
+ CFBundleName
+ ${PRODUCT_NAME}
+ CFBundlePackageType
+ APPL
+ CFBundleShortVersionString
+ 1.0
+ CFBundleSignature
+ ????
+ CFBundleVersion
+ 0
+ LSRequiresIPhoneOS
+
+ NSMainNibFile
+ MainWindow
+ UIPrerenderedIcon
+
+ UISupportedInterfaceOrientations
+
+ UIInterfaceOrientationPortrait
+ UIInterfaceOrientationPortraitUpsideDown
+ UIInterfaceOrientationLandscapeLeft
+ UIInterfaceOrientationLandscapeRight
+
+ UISupportedInterfaceOrientations~ipad
+
+ UIInterfaceOrientationPortrait
+ UIInterfaceOrientationPortraitUpsideDown
+ UIInterfaceOrientationLandscapeLeft
+ UIInterfaceOrientationLandscapeRight
+
+
+
diff --git a/client/iOS/iFreeRDP.xcodeproj/project.pbxproj.cmake b/client/iOS/iFreeRDP.xcodeproj/project.pbxproj.cmake
new file mode 100644
index 000000000..4a92220c1
--- /dev/null
+++ b/client/iOS/iFreeRDP.xcodeproj/project.pbxproj.cmake
@@ -0,0 +1,863 @@
+// !$*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 */; };
+ 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 = ""; };
+ 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 = ""; };
+ C495EFAD16B913980041304E /* libwinpr.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libwinpr.a; path = ../../winpr/libwinpr/libwinpr.a; sourceTree = ""; };
+ 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 = ""; };
+ C495F01616B937F90041304E /* libssl.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libssl.a; path = @FREERDP_IOS_EXTERNAL_SSL_PATH@/lib/libssl.a; sourceTree = ""; };
+ 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; };
+ 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 */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXFrameworksBuildPhase section */
+
+/* Begin PBXGroup section */
+ C495EE2416B8372D0041304E = {
+ isa = PBXGroup;
+ children = (
+ C495EE3916B8372D0041304E /* iFreeRDP */,
+ C495EE3216B8372D0041304E /* Frameworks */,
+ C495EE3016B8372D0041304E /* Products */,
+ );
+ sourceTree = "";
+ };
+ C495EE3016B8372D0041304E /* Products */ = {
+ isa = PBXGroup;
+ children = (
+ C495EE2F16B8372D0041304E /* iFreeRDP.app */,
+ );
+ name = Products;
+ sourceTree = "";
+ };
+ C495EE3216B8372D0041304E /* Frameworks */ = {
+ isa = PBXGroup;
+ children = (
+ 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 = "";
+ };
+ 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 = "";
+ };
+ 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 = "";
+ };
+ 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 = "";
+ };
+ 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 = "";
+ };
+ 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 = "";
+ };
+ 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 = "";
+ };
+ 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 = "";
+ };
+ 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 = "";
+ };
+/* 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 = "";
+ };
+/* 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 = 3.2;
+ 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 = 3.2;
+ 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 = 3.2;
+ 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 = 3.2;
+ 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 */;
+}
diff --git a/client/iOS/main.m b/client/iOS/main.m
new file mode 100644
index 000000000..99cabbbcd
--- /dev/null
+++ b/client/iOS/main.m
@@ -0,0 +1,18 @@
+/*
+ Main App Entry
+
+ Copyright 2013 Thinstuff Technologies GmbH, Author: Martin Fleisz
+
+ This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0.
+ If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#import
+
+int main(int argc, char *argv[])
+{
+ NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
+ int retVal = UIApplicationMain(argc, argv, nil, nil);
+ [pool release];
+ return retVal;
+}
diff --git a/cmake/CheckCmakeCompat.cmake b/cmake/CheckCmakeCompat.cmake
index ae769638a..8568454de 100644
--- a/cmake/CheckCmakeCompat.cmake
+++ b/cmake/CheckCmakeCompat.cmake
@@ -39,3 +39,9 @@ endif(MONOLITHIC_BUILD)
if(${CMAKE_VERSION} VERSION_LESS 2.8.2)
message(WARNING "GetGitRevisionDescription reqires (FindGit) cmake >= 2.8.2 to work properly - GIT_REVISION will be set to n/a")
endif()
+
+# Since cmake 2.8.9 modules/library names without lib/.so can be used
+# for dependencies
+if(IOS AND ${CMAKE_VERSION} VERSION_LESS 2.8.9)
+ message(FATAL_ERROR "CMAKE version >= 2.8.9 required to build the IOS client")
+endif()
diff --git a/cmake/ConfigOptions.cmake b/cmake/ConfigOptions.cmake
index 805299c11..0f63c742c 100644
--- a/cmake/ConfigOptions.cmake
+++ b/cmake/ConfigOptions.cmake
@@ -39,7 +39,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)
+ if(ANDROID OR IOS)
option(MONOLITHIC_BUILD "Use monolithic build" ON)
else()
option(MONOLITHIC_BUILD "Use monolithic build" OFF)
@@ -103,3 +103,7 @@ option(WITH_DEBUG_XV "Print XVideo debug messages" ${DEFAULT_DEBUG_OPTION})
if(ANDROID)
include(ConfigOptionsAndroid)
endif(ANDROID)
+
+if(IOS)
+include(ConfigOptionsiOS)
+endif(IOS)
diff --git a/cmake/ConfigOptionsiOS.cmake b/cmake/ConfigOptionsiOS.cmake
new file mode 100644
index 000000000..289057692
--- /dev/null
+++ b/cmake/ConfigOptionsiOS.cmake
@@ -0,0 +1,24 @@
+# FreeRDP cmake ios options
+#
+# Copyright 2013 Thinstuff Technologies GmbH
+# Copyright 2013 Martin Fleisz
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# 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.
+
+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()
+mark_as_advanced(FREERDP_IOS_EXTERNAL_SSL_PATH)
+
diff --git a/cmake/iOSToolchain.cmake b/cmake/iOSToolchain.cmake
index 2c68dc2c0..6635e9803 100644
--- a/cmake/iOSToolchain.cmake
+++ b/cmake/iOSToolchain.cmake
@@ -10,7 +10,7 @@
# SIMULATOR - used to build for the Simulator platforms, which have an x86 arch.
#
# CMAKE_IOS_DEVELOPER_ROOT = automatic(default) or /path/to/platform/Developer folder
-# By default this location is automatically chosen based on the IOS_PLATFORM value above.
+# By default this location is automatcially chosen based on the IOS_PLATFORM value above.
# If set manually, it will override the default location and force the user of a particular Developer Platform
#
# CMAKE_IOS_SDK_ROOT = automatic(default) or /path/to/platform/Developer/SDKs/SDK folder
@@ -36,10 +36,6 @@ set (UNIX True)
set (APPLE True)
set (IOS True)
-# Workaround for FindThreads.cmake
-set(Threads_FOUND TRUE)
-set(CMAKE_THREAD_LIBS_INIT "-pthread")
-
# Determine the cmake host system version so we know where to find the iOS SDKs
find_program (CMAKE_UNAME uname /bin /usr/bin /usr/local/bin)
if (CMAKE_UNAME)
@@ -48,13 +44,15 @@ if (CMAKE_UNAME)
endif (CMAKE_UNAME)
# Force the compilers to gcc for iOS
-include (CMakeForceCompiler)
-CMAKE_FORCE_C_COMPILER (gcc gcc)
-CMAKE_FORCE_CXX_COMPILER (g++ g++)
+if(NOT CMAKE_C_COMPILER)
+ include (CMakeForceCompiler)
+ CMAKE_FORCE_C_COMPILER (gcc gcc)
+ CMAKE_FORCE_CXX_COMPILER (g++ g++)
+endif()
# Skip the platform compiler checks for cross compiling
-set (CMAKE_CXX_COMPILER_WORKS TRUE)
-set (CMAKE_C_COMPILER_WORKS TRUE)
+#set (CMAKE_CXX_COMPILER_WORKS TRUE)
+#set (CMAKE_C_COMPILER_WORKS TRUE)
# All iOS/Darwin specific settings - some may be redundant
set (CMAKE_SHARED_LIBRARY_PREFIX "lib")
@@ -125,7 +123,7 @@ if (NOT DEFINED CMAKE_IOS_DEVELOPER_ROOT)
endif (NOT DEFINED CMAKE_IOS_DEVELOPER_ROOT)
set (CMAKE_IOS_DEVELOPER_ROOT ${CMAKE_IOS_DEVELOPER_ROOT} CACHE PATH "Location of iOS Platform")
-# Find and use the most recent iOS SDK unless specified manually with CMAKE_IOS_SDK_ROOT
+# Find and use the most recent iOS sdk unless specified manually with CMAKE_IOS_SDK_ROOT
if (NOT DEFINED CMAKE_IOS_SDK_ROOT)
file (GLOB _CMAKE_IOS_SDKS "${CMAKE_IOS_DEVELOPER_ROOT}/SDKs/*")
if (_CMAKE_IOS_SDKS)
@@ -133,9 +131,9 @@ if (NOT DEFINED CMAKE_IOS_SDK_ROOT)
list (REVERSE _CMAKE_IOS_SDKS)
list (GET _CMAKE_IOS_SDKS 0 CMAKE_IOS_SDK_ROOT)
else (_CMAKE_IOS_SDKS)
- message (FATAL_ERROR "No iOS SDK's found in default search path ${CMAKE_IOS_DEVELOPER_ROOT}. Manually set CMAKE_IOS_SDK_ROOT or install the iOS SDK.")
+ message (FATAL_ERROR "No iOS SDK's found in default seach path ${CMAKE_IOS_DEVELOPER_ROOT}. Manually set CMAKE_IOS_SDK_ROOT or install the iOS SDK.")
endif (_CMAKE_IOS_SDKS)
- message (STATUS "iOS SDK root: ${CMAKE_IOS_SDK_ROOT}")
+ message (STATUS "Toolchain using default iOS SDK: ${CMAKE_IOS_SDK_ROOT}")
endif (NOT DEFINED CMAKE_IOS_SDK_ROOT)
set (CMAKE_IOS_SDK_ROOT ${CMAKE_IOS_SDK_ROOT} CACHE PATH "Location of the selected iOS SDK")
@@ -145,16 +143,13 @@ set (CMAKE_OSX_SYSROOT ${CMAKE_IOS_SDK_ROOT} CACHE PATH "Sysroot used for iOS su
# set the architecture for iOS
# NOTE: Currently both ARCHS_STANDARD_32_BIT and ARCHS_UNIVERSAL_IPHONE_OS set armv7 only, so set both manually
if (${IOS_PLATFORM} STREQUAL "OS")
- set (IOS_ARCH armv6 armv7)
+ set (IOS_ARCH armv7 armv7s)
else (${IOS_PLATFORM} STREQUAL "OS")
set (IOS_ARCH i386)
endif (${IOS_PLATFORM} STREQUAL "OS")
set (CMAKE_OSX_ARCHITECTURES ${IOS_ARCH} CACHE string "Build architecture for iOS")
-set (CMAKE_PREFIX_PATH "${CMAKE_IOS_SDK_ROOT}/usr")
-set (CMAKE_REQUIRED_INCLUDES "${CMAKE_IOS_SDK_ROOT}/usr/include")
-
# Set the find root to the iOS developer roots and to user defined paths
set (CMAKE_FIND_ROOT_PATH ${CMAKE_IOS_DEVELOPER_ROOT} ${CMAKE_IOS_SDK_ROOT} ${CMAKE_PREFIX_PATH} CACHE string "iOS find search path root")
@@ -165,13 +160,15 @@ set (CMAKE_FIND_FRAMEWORK FIRST)
set (CMAKE_SYSTEM_FRAMEWORK_PATH
${CMAKE_IOS_SDK_ROOT}/System/Library/Frameworks
${CMAKE_IOS_SDK_ROOT}/System/Library/PrivateFrameworks
- ${CMAKE_IOS_SDK_ROOT}/Developer/Library/Frameworks)
+ ${CMAKE_IOS_SDK_ROOT}/Developer/Library/Frameworks
+)
# only search the iOS sdks, not the remainder of the host filesystem
set (CMAKE_FIND_ROOT_PATH_MODE_PROGRAM ONLY)
set (CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
set (CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
+
# This little macro lets you set any XCode specific property
macro (set_xcode_property TARGET XCODE_PROPERTY XCODE_VALUE)
set_property (TARGET ${TARGET} PROPERTY XCODE_ATTRIBUTE_${XCODE_PROPERTY} ${XCODE_VALUE})
diff --git a/docs/README.ios b/docs/README.ios
new file mode 100644
index 000000000..bc4a0c420
--- /dev/null
+++ b/docs/README.ios
@@ -0,0 +1,99 @@
+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.
+
+
+Build requirements
+==================
+
+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)
+
+FreeRDP requires OpenSSL libraries for building but they are not part of the iOS SDK and therefore they need to be pre-build manually.
+There are various versions and builds of static OpenSSL libraries floating around like iOSPorts.
+At the time of writing we have tested and used a small script (OpenSSL-DownloadAndBuild.command) that downloads and builds armv7, armv7s and i386 versions of the OpenSSL 1.0.0e libraries.
+
+If you don't care about modifying the OpenSSL build you can run the following command in the FreeRDP root directory:
+
+./scripts/OpenSSL-DownloadAndBuild.command
+
+The script is using the latest iOS SDK 6.1 to build the OpenSSL libraries.
+If you want to use a different SDK version simply edit the OpenSSL-iFreeRDP.diff file and modify the -isysroot parameters to point to the SDK version you want to build with.
+
+When the script finishes the external/openssl/lib subfolder will contain libcrypto.a and libssl.a, both universal binary libraries containing arm and i386 targets in order to compile FreeRDP for iOS devices and the simulator.
+
+If you build OpenSSL youself you need to set FREERDP_IOS_EXTERNAL_SSL_PATH when running cmake.
+
+
+Building
+========
+
+Integrated build
+----------------
+
+Run the following commands in the top level FreeRDP directory:
+
+cmake -DCMAKE_TOOLCHAIN_FILE=cmake/iOSToolchain.cmake
+make
+
+After that you should have a client/iOS/bin//iFreeRDP.app application package.
+
+Manual iOS builds
+-----------------
+
+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
+
+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= 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.
+
+
+cmake variables
+===============
+
+CMAKE_TOOLCHAIN_FILE
+* the toolchain file to use must be cmake/iOSToolchain.cmake
+
+IOS_PLATFORM (OS (default), SIMULATOR)
+* the platform for which to build iFreeRDP. OS compiles for iOS devices (using armv7 and armv7s ABIs) and SIMULATOR compiles for the iOS Simulator (i386)
+
+CMAKE_IOS_DEVELOPER_ROOT (used by toolchain file)
+* absolute path to the iOS developer platform (i.e. /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer) the toolchain file will usually auto-detect the correct Developer platform depending on IOS_PLATFORM
+
+CMAKE_IOS_SDK_ROOT (used by toolchain file)
+* absolute path to the iOS SDK (i.e. /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS6.1.sdk) the toolchain file will usually auto-detect the correct SDK, depending on IOS_PLATFORM
+
+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
diff --git a/libfreerdp/core/activation.c b/libfreerdp/core/activation.c
index 115cd1218..ca39ce5f9 100644
--- a/libfreerdp/core/activation.c
+++ b/libfreerdp/core/activation.c
@@ -248,14 +248,14 @@ BOOL rdp_recv_server_font_map_pdu(rdpRdp* rdp, STREAM* s)
BOOL rdp_recv_client_font_map_pdu(rdpRdp* rdp, STREAM* s)
{
- if(stream_get_left(s) < 8)
- return FALSE;
rdp->finalize_sc_pdus |= FINALIZE_SC_FONT_MAP_PDU;
-
- stream_seek_UINT16(s); /* numberEntries (2 bytes) */
- stream_seek_UINT16(s); /* totalNumEntries (2 bytes) */
- stream_seek_UINT16(s); /* mapFlags (2 bytes) */
- stream_seek_UINT16(s); /* entrySize (2 bytes) */
+ if(stream_get_left(s) >= 8)
+ {
+ stream_seek_UINT16(s); /* numberEntries (2 bytes) */
+ stream_seek_UINT16(s); /* totalNumEntries (2 bytes) */
+ stream_seek_UINT16(s); /* mapFlags (2 bytes) */
+ stream_seek_UINT16(s); /* entrySize (2 bytes) */
+ }
return TRUE;
}
diff --git a/scripts/OpenSSL-DownloadAndBuild.command b/scripts/OpenSSL-DownloadAndBuild.command
new file mode 100755
index 000000000..58901fed4
--- /dev/null
+++ b/scripts/OpenSSL-DownloadAndBuild.command
@@ -0,0 +1,104 @@
+#!/bin/sh
+#
+# Copyright 2013 Thinstuff Technologies GmbH
+#
+# This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# This script will download and build openssl for iOS (armv7, armv7s) and i386
+#
+
+OPENSSLVERSION="1.0.0e"
+MD5SUM="7040b89c4c58c7a1016c0dfa6e821c86"
+OPENSSLPATCH="../../scripts/OpenSSL-iFreeRDP.diff"
+CORES=`sysctl hw.ncpu | awk '{print $2}'`
+
+MAKEOPTS="-j $CORES"
+# disable parallell builds since openssl build
+# fails sometimes
+MAKEOPTS=""
+
+cd external
+if [ ! -d openssl ];then
+ mkdir openssl
+fi
+cd openssl
+CS=`md5 -q "openssl-$OPENSSLVERSION.tar.gz" 2>/dev/null`
+if [ ! "$CS" = "$MD5SUM" ]; then
+ echo "Downloading OpenSSL Version $OPENSSLVERSION ..."
+ rm -f "openssl-$OPENSSLVERSION.tar.gz"
+ curl -o "openssl-$OPENSSLVERSION.tar.gz" http://www.openssl.org/source/openssl-$OPENSSLVERSION.tar.gz
+
+ CS=`md5 -q "openssl-$OPENSSLVERSION.tar.gz" 2>/dev/null`
+ if [ ! "$CS" = "$MD5SUM" ]; then
+ echo "Download failed or invalid checksum. Have a nice day."
+ exit 1
+ fi
+fi
+
+rm -rf openssltmp
+mkdir openssltmp
+cd openssltmp
+
+echo "Unpacking OpenSSL ..."
+tar xfz "../openssl-$OPENSSLVERSION.tar.gz"
+if [ ! $? = 0 ]; then
+ echo "Unpacking failed."
+ exit 1
+fi
+echo
+
+echo "Applying iFreeRDP patch ..."
+
+cd "openssl-$OPENSSLVERSION"
+patch -p1 < "../../$OPENSSLPATCH"
+
+if [ ! $? = 0 ]; then
+ echo "Patch failed."
+ exit 1
+fi
+echo
+
+mkdir -p ../../include/openssl
+rm -f ../../include/openssl/*.h
+
+mkdir -p ../../lib
+rm -f ../../lib/*.a
+
+echo "Copying header hiles ..."
+cp include/openssl/*.h ../../include/openssl/
+echo
+
+echo "Building sim version (for simulator). Please wait ..."
+./Configure darwin-sim-cc >BuildLog.darwin-sim.txt
+make ${MAKEOPTS} >>BuildLog.darwin-sim.txt 2>&1
+echo "Done. Build log saved in BuildLog.darwin-sim.txt"
+cp libcrypto.a ../../lib/libcrypto_sim.a
+cp libssl.a ../../lib/libssl_sim.a
+make clean >/dev/null 2>&1
+echo
+
+echo "Building armv7 version (for iPhone). Please wait ..."
+./Configure darwin-armv7-cc >BuildLog.darwin-armv7.txt
+make ${MAKEOPTS} >>BuildLog.darwin-armv7.txt 2>&1
+echo "Done. Build log saved in BuildLog.darwin-armv7.txt"
+cp libcrypto.a ../../lib/libcrypto_armv7.a
+cp libssl.a ../../lib/libssl_armv7.a
+make clean >/dev/null 2>&1
+echo
+
+echo "Building armv7s version (for iPhone). Please wait ..."
+./Configure darwin-armv7s-cc >BuildLog.darwin-armv7s.txt
+make ${MAKEOPTS} >>BuildLog.darwin-armv7s.txt 2>&1
+echo "Done. Build log saved in BuildLog.darwin-armv7s.txt"
+cp libcrypto.a ../../lib/libcrypto_armv7s.a
+cp libssl.a ../../lib/libssl_armv7s.a
+make clean >/dev/null 2>&1
+echo
+
+echo "Combining to unversal binary"
+lipo -create ../../lib/libcrypto_sim.a ../../lib/libcrypto_armv7.a ../../lib/libcrypto_armv7s.a -o ../../lib/libcrypto.a
+lipo -create ../../lib/libssl_sim.a ../../lib/libssl_armv7.a ../../lib/libssl_armv7s.a -o ../../lib/libssl.a
+
+echo "Finished. Please verify the contens of the openssl folder in your main project folder"
+
diff --git a/scripts/OpenSSL-iFreeRDP.diff b/scripts/OpenSSL-iFreeRDP.diff
new file mode 100644
index 000000000..1348cdb2e
--- /dev/null
+++ b/scripts/OpenSSL-iFreeRDP.diff
@@ -0,0 +1,25 @@
+diff -rupN openssl-1.0.0e-ori/Configure openssl-1.0.0e/Configure
+--- openssl-1.0.0e-ori/Configure 2012-02-06 14:44:42.000000000 +0100
++++ openssl-1.0.0e/Configure 2012-02-06 14:45:31.000000000 +0100
+@@ -555,6 +555,9 @@ my %table=(
+ "debug-darwin-i386-cc","cc:-arch i386 -g3 -DL_ENDIAN::-D_REENTRANT:MACOSX:-Wl,-search_paths_first%:BN_LLONG RC4_INT RC4_CHUNK DES_UNROLL BF_PTR:${x86_asm}:macosx:dlfcn:darwin-shared:-fPIC -fno-common:-arch i386 -dynamiclib:.\$(SHLIB_MAJOR).\$(SHLIB_MINOR).dylib",
+ "darwin64-x86_64-cc","cc:-arch x86_64 -O3 -DL_ENDIAN -DMD32_REG_T=int -Wall::-D_REENTRANT:MACOSX:-Wl,-search_paths_first%:SIXTY_FOUR_BIT_LONG RC4_CHAR RC4_CHUNK DES_INT DES_UNROLL:${x86_64_asm}:macosx:dlfcn:darwin-shared:-fPIC -fno-common:-arch x86_64 -dynamiclib:.\$(SHLIB_MAJOR).\$(SHLIB_MINOR).dylib",
+ "debug-darwin-ppc-cc","cc:-DBN_DEBUG -DREF_CHECK -DCONF_DEBUG -DCRYPTO_MDEBUG -DB_ENDIAN -g -Wall -O::-D_REENTRANT:MACOSX::BN_LLONG RC4_CHAR RC4_CHUNK DES_UNROLL BF_PTR:${ppc32_asm}:osx32:dlfcn:darwin-shared:-fPIC:-dynamiclib:.\$(SHLIB_MAJOR).\$(SHLIB_MINOR).dylib",
++"darwin-armv7s-cc","/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/gcc:-arch armv7s -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS6.1.sdk -O3 -fomit-frame-pointer -DL_ENDIAN::-D_REENTRANT:MACOSX:-Wl,-search_paths_first%:BN_LLONG RC4_CHAR RC4_CHUNK DES_UNROLL BF_PTR:${no_asm}:dlfcn:darwin-shared:-fPIC -fno-common:-arch armv4 -dynamiclib:.\$(SHLIB_MAJOR).\$(SHLIB_MINOR).dylib",
++"darwin-armv7-cc","/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/gcc:-arch armv7 -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS6.1.sdk -O3 -fomit-frame-pointer -DL_ENDIAN::-D_REENTRANT:MACOSX:-Wl,-search_paths_first%:BN_LLONG RC4_CHAR RC4_CHUNK DES_UNROLL BF_PTR:${no_asm}:dlfcn:darwin-shared:-fPIC -fno-common:-arch armv4 -dynamiclib:.\$(SHLIB_MAJOR).\$(SHLIB_MINOR).dylib",
++"darwin-sim-cc","/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/usr/bin/gcc: -arch i386 -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator6.1.sdk -O3 -fomit-frame-pointer -DL_ENDIAN::-D_REENTRANT:MACOSX:-Wl,-search_paths_first%:BN_LLONG RC4_CHAR RC4_CHUNK DES_UNROLL BF_PTR:${no_asm}:dlfcn:darwin-shared:-fPIC -fno-common: -dynamiclib:.\$(SHLIB_MAJOR).\$(SHLIB_MINOR).dylib",
+
+ ##### A/UX
+ "aux3-gcc","gcc:-O2 -DTERMIO::(unknown):AUX:-lbsd:RC4_CHAR RC4_CHUNK DES_UNROLL BF_PTR:::",
+diff -rupN openssl-1.0.0e-ori/crypto/ui/ui_openssl.c openssl-1.0.0e/crypto/ui/ui_openssl.c
+--- openssl-1.0.0e-ori/crypto/ui/ui_openssl.c 2012-02-06 14:44:43.000000000 +0100
++++ openssl-1.0.0e/crypto/ui/ui_openssl.c 2012-02-06 14:46:10.000000000 +0100
+@@ -404,7 +404,7 @@ static int read_till_nl(FILE *in)
+ return 1;
+ }
+
+-static volatile sig_atomic_t intr_signal;
++static volatile int intr_signal;
+ #endif
+
+ static int read_string_inner(UI *ui, UI_STRING *uis, int echo, int strip_nl)
diff --git a/winpr/include/winpr/interlocked.h b/winpr/include/winpr/interlocked.h
index c9a798b23..0fea91a72 100644
--- a/winpr/include/winpr/interlocked.h
+++ b/winpr/include/winpr/interlocked.h
@@ -23,9 +23,15 @@
#include
#include
#include
+#include
#ifndef _WIN32
+/* workaround for SLIST_ENTRY conflict */
+
+#include
+#undef SLIST_ENTRY
+
#ifndef CONTAINING_RECORD
#define CONTAINING_RECORD(address, type, field) \
((type *)(((ULONG_PTR) address) - (ULONG_PTR)(&(((type *) 0)->field))))
diff --git a/winpr/include/winpr/wtypes.h b/winpr/include/winpr/wtypes.h
index 255aa1b47..d16bd2647 100644
--- a/winpr/include/winpr/wtypes.h
+++ b/winpr/include/winpr/wtypes.h
@@ -40,8 +40,12 @@
#endif
#ifndef __OBJC__
+#if defined(__APPLE__)
+typedef signed char BOOL;
+#else
typedef int BOOL;
#endif
+#endif
typedef BOOL *PBOOL, *LPBOOL;