From e5cf8ff7fb817017754ce8152abc770c2d798cce Mon Sep 17 00:00:00 2001 From: Bernhard Miklautz Date: Thu, 14 Feb 2013 14:59:12 +0100 Subject: [PATCH] iOS: initial release of iFreeRDP This is the initial release of iFreeRDP the FreeRDP iOS client. Build instructions can be found in docs/README.ios. --- .gitignore | 2 + CMakeLists.txt | 57 +- client/.gitignore | 1 - client/CMakeLists.txt | 11 +- client/iOS/.gitignore | 7 + client/iOS/Additions/OrderedDictionary.h | 40 + client/iOS/Additions/OrderedDictionary.m | 168 +++ client/iOS/Additions/TSXAdditions.h | 30 + client/iOS/Additions/TSXAdditions.m | 217 ++++ client/iOS/Additions/Toast+UIView.h | 50 + client/iOS/Additions/Toast+UIView.m | 307 ++++++ client/iOS/AppDelegate.h | 22 + client/iOS/AppDelegate.m | 106 ++ client/iOS/CMakeLists.txt | 54 + client/iOS/Controllers/AboutController.h | 19 + client/iOS/Controllers/AboutController.m | 99 ++ .../AdvancedBookmarkEditorController.h | 25 + .../AdvancedBookmarkEditorController.m | 310 ++++++ .../iOS/Controllers/AppSettingsController.h | 14 + .../iOS/Controllers/AppSettingsController.m | 309 ++++++ .../Controllers/BookmarkEditorController.h | 40 + .../Controllers/BookmarkEditorController.m | 400 +++++++ .../iOS/Controllers/BookmarkListController.h | 59 ++ .../iOS/Controllers/BookmarkListController.m | 839 +++++++++++++++ .../Controllers/CredentialsEditorController.h | 25 + .../Controllers/CredentialsEditorController.m | 203 ++++ .../Controllers/CredentialsInputController.h | 31 + .../Controllers/CredentialsInputController.m | 133 +++ client/iOS/Controllers/EditorBaseController.h | 44 + client/iOS/Controllers/EditorBaseController.m | 108 ++ .../Controllers/EditorSelectionController.h | 30 + .../Controllers/EditorSelectionController.m | 136 +++ client/iOS/Controllers/EncryptionController.h | 24 + client/iOS/Controllers/EncryptionController.m | 133 +++ client/iOS/Controllers/HelpController.h | 16 + client/iOS/Controllers/HelpController.m | 81 ++ client/iOS/Controllers/MainTabBarController.h | 17 + client/iOS/Controllers/MainTabBarController.m | 20 + .../Controllers/PerformanceEditorController.h | 24 + .../Controllers/PerformanceEditorController.m | 187 ++++ .../Controllers/RDPSessionViewController.h | 69 ++ .../Controllers/RDPSessionViewController.m | 980 ++++++++++++++++++ .../Controllers/ScreenSelectionController.h | 33 + .../Controllers/ScreenSelectionController.m | 234 +++++ .../Controllers/VerifyCertificateController.h | 29 + .../Controllers/VerifyCertificateController.m | 79 ++ client/iOS/Defaults.plist | 72 ++ client/iOS/FreeRDP/ios_freerdp.h | 73 ++ client/iOS/FreeRDP/ios_freerdp.m | 289 ++++++ client/iOS/FreeRDP/ios_freerdp_events.h | 24 + client/iOS/FreeRDP/ios_freerdp_events.m | 145 +++ client/iOS/FreeRDP/ios_freerdp_ui.h | 21 + client/iOS/FreeRDP/ios_freerdp_ui.m | 154 +++ client/iOS/Misc/Reachability.h | 89 ++ client/iOS/Misc/Reachability.m | 273 +++++ client/iOS/Misc/SFHFKeychainUtils.h | 41 + client/iOS/Misc/SFHFKeychainUtils.m | 434 ++++++++ client/iOS/Misc/TSXTypes.h | 49 + client/iOS/Misc/Utils.h | 79 ++ client/iOS/Misc/Utils.m | 371 +++++++ client/iOS/Models/Bookmark.h | 46 + client/iOS/Models/Bookmark.m | 250 +++++ client/iOS/Models/ConnectionParams.h | 47 + client/iOS/Models/ConnectionParams.m | 247 +++++ client/iOS/Models/Encryptor.h | 42 + client/iOS/Models/Encryptor.m | 173 ++++ client/iOS/Models/GlobalDefaults.h | 28 + client/iOS/Models/GlobalDefaults.m | 71 ++ client/iOS/Models/RDPKeyboard.h | 76 ++ client/iOS/Models/RDPKeyboard.m | 306 ++++++ client/iOS/Models/RDPSession.h | 108 ++ client/iOS/Models/RDPSession.m | 430 ++++++++ client/iOS/Resources/BookmarkListView.xib | 365 +++++++ .../iOS/Resources/BookmarkTableViewCell.xib | 428 ++++++++ client/iOS/Resources/CredentialsInputView.xib | 481 +++++++++ client/iOS/Resources/Default-568h@2x.png | Bin 0 -> 22681 bytes .../Resources/Default-Landscape@2x~ipad.png | Bin 0 -> 43289 bytes .../iOS/Resources/Default-Landscape~ipad.png | Bin 0 -> 17059 bytes .../Resources/Default-Portrait@2x~ipad.png | Bin 0 -> 51234 bytes .../iOS/Resources/Default-Portrait~ipad.png | Bin 0 -> 22374 bytes client/iOS/Resources/Default.png | Bin 0 -> 9846 bytes client/iOS/Resources/Default@2x.png | Bin 0 -> 21096 bytes .../iOS/Resources/EditButtonTableViewCell.xib | 408 ++++++++ .../iOS/Resources/EditFlagTableViewCell.xib | 208 ++++ .../Resources/EditSecretTextTableViewCell.xib | 288 +++++ .../Resources/EditSelectionTableViewCell.xib | 347 +++++++ .../Resources/EditSubEditTableViewCell.xib | 179 ++++ .../iOS/Resources/EditTextTableViewCell.xib | 364 +++++++ client/iOS/Resources/Icon-72.png | Bin 0 -> 3203 bytes client/iOS/Resources/Icon-72@2x.png | Bin 0 -> 4940 bytes client/iOS/Resources/Icon.png | Bin 0 -> 2864 bytes client/iOS/Resources/Icon@2x.png | Bin 0 -> 4240 bytes client/iOS/Resources/MainWindow.xib | 183 ++++ client/iOS/Resources/RDPConnectingView.xib | 342 ++++++ client/iOS/Resources/RDPSessionView.xib | 553 ++++++++++ client/iOS/Resources/SessionTableViewCell.xib | 574 ++++++++++ .../iOS/Resources/VerifyCertificateView.xib | 386 +++++++ .../iOS/Resources/about_page/FreeRDP_Logo.png | Bin 0 -> 40572 bytes client/iOS/Resources/about_page/about.html | 203 ++++ .../iOS/Resources/about_page/about_phone.html | 201 ++++ client/iOS/Resources/about_page/back.jpg | Bin 0 -> 143173 bytes .../about_page/background_transparent.png | Bin 0 -> 1129 bytes .../Resources/cancel_button_background.png | Bin 0 -> 3150 bytes .../Resources/en.lproj/Localizable.strings | Bin 0 -> 16548 bytes client/iOS/Resources/help_page/back.jpg | Bin 0 -> 143173 bytes client/iOS/Resources/help_page/gestures.html | 159 +++ client/iOS/Resources/help_page/gestures.png | Bin 0 -> 63377 bytes .../Resources/help_page/gestures_phone.html | 159 +++ .../Resources/help_page/gestures_phone.png | Bin 0 -> 40104 bytes .../iOS/Resources/help_page/nav_gestures.png | Bin 0 -> 3747 bytes .../iOS/Resources/help_page/nav_toolbar.png | Bin 0 -> 3096 bytes .../Resources/help_page/nav_touch_pointer.png | Bin 0 -> 3540 bytes client/iOS/Resources/help_page/toolbar.html | 178 ++++ client/iOS/Resources/help_page/toolbar.png | Bin 0 -> 10926 bytes .../Resources/help_page/toolbar_phone.html | 176 ++++ .../iOS/Resources/help_page/toolbar_phone.png | Bin 0 -> 8780 bytes .../Resources/help_page/touch_pointer.html | 164 +++ .../iOS/Resources/help_page/touch_pointer.png | Bin 0 -> 128248 bytes .../help_page/touch_pointer_phone.html | 161 +++ .../help_page/touch_pointer_phone.png | Bin 0 -> 102192 bytes .../iOS/Resources/icon_accessory_star_off.png | Bin 0 -> 771 bytes .../iOS/Resources/icon_accessory_star_on.png | Bin 0 -> 1176 bytes client/iOS/Resources/icon_key_arrow_down.png | Bin 0 -> 237 bytes client/iOS/Resources/icon_key_arrow_left.png | Bin 0 -> 246 bytes client/iOS/Resources/icon_key_arrow_right.png | Bin 0 -> 249 bytes client/iOS/Resources/icon_key_arrow_up.png | Bin 0 -> 232 bytes client/iOS/Resources/icon_key_arrows.png | Bin 0 -> 317 bytes client/iOS/Resources/icon_key_backspace.png | Bin 0 -> 583 bytes client/iOS/Resources/icon_key_menu.png | Bin 0 -> 606 bytes client/iOS/Resources/icon_key_return.png | Bin 0 -> 265 bytes client/iOS/Resources/icon_key_win.png | Bin 0 -> 588 bytes .../Resources/keyboard_button_background.png | Bin 0 -> 3064 bytes client/iOS/Resources/tabbar_icon_about.png | Bin 0 -> 390 bytes client/iOS/Resources/tabbar_icon_help.png | Bin 0 -> 471 bytes client/iOS/Resources/tabbar_icon_settings.png | Bin 0 -> 541 bytes .../iOS/Resources/toolbar_icon_disconnect.png | Bin 0 -> 3501 bytes .../iOS/Resources/toolbar_icon_extkeyboad.png | Bin 0 -> 3292 bytes client/iOS/Resources/toolbar_icon_home.png | Bin 0 -> 3130 bytes .../iOS/Resources/toolbar_icon_keyboard.png | Bin 0 -> 3378 bytes .../Resources/toolbar_icon_touchpointer.png | Bin 0 -> 3244 bytes client/iOS/Resources/toolbar_icon_win.png | Bin 0 -> 584 bytes client/iOS/Resources/touch_pointer_active.png | Bin 0 -> 14571 bytes .../iOS/Resources/touch_pointer_default.png | Bin 0 -> 14447 bytes .../Resources/touch_pointer_extkeyboard.png | Bin 0 -> 14550 bytes .../iOS/Resources/touch_pointer_keyboard.png | Bin 0 -> 14569 bytes client/iOS/Resources/touch_pointer_lclick.png | Bin 0 -> 14647 bytes client/iOS/Resources/touch_pointer_rclick.png | Bin 0 -> 14506 bytes client/iOS/Resources/touch_pointer_reset.png | Bin 0 -> 14632 bytes client/iOS/Resources/touch_pointer_scroll.png | Bin 0 -> 16307 bytes client/iOS/Views/AdvancedKeyboardView.h | 50 + client/iOS/Views/AdvancedKeyboardView.m | 346 +++++++ client/iOS/Views/BookmarkTableCell.h | 25 + client/iOS/Views/BookmarkTableCell.m | 38 + client/iOS/Views/EditButtonTableViewCell.h | 21 + client/iOS/Views/EditButtonTableViewCell.m | 32 + client/iOS/Views/EditFlagTableViewCell.h | 21 + client/iOS/Views/EditFlagTableViewCell.m | 32 + .../iOS/Views/EditSecretTextTableViewCell.h | 24 + .../iOS/Views/EditSecretTextTableViewCell.m | 54 + client/iOS/Views/EditSelectionTableViewCell.h | 21 + client/iOS/Views/EditSelectionTableViewCell.m | 32 + client/iOS/Views/EditSubEditTableViewCell.h | 19 + client/iOS/Views/EditSubEditTableViewCell.m | 32 + client/iOS/Views/EditTextTableViewCell.h | 21 + client/iOS/Views/EditTextTableViewCell.m | 32 + client/iOS/Views/RDPSessionView.h | 20 + client/iOS/Views/RDPSessionView.m | 51 + client/iOS/Views/SessionTableCell.h | 28 + client/iOS/Views/SessionTableCell.m | 40 + client/iOS/Views/TouchPointerView.h | 73 ++ client/iOS/Views/TouchPointerView.m | 328 ++++++ client/iOS/iFreeRDP-Prefix.pch | 23 + client/iOS/iFreeRDP.plist | 53 + .../iFreeRDP.xcodeproj/project.pbxproj.cmake | 863 +++++++++++++++ client/iOS/main.m | 18 + cmake/CheckCmakeCompat.cmake | 6 + cmake/ConfigOptions.cmake | 6 +- cmake/ConfigOptionsiOS.cmake | 24 + cmake/iOSToolchain.cmake | 33 +- docs/README.ios | 99 ++ scripts/OpenSSL-DownloadAndBuild.command | 104 ++ scripts/OpenSSL-iFreeRDP.diff | 25 + winpr/include/winpr/wtypes.h | 4 + 183 files changed, 18818 insertions(+), 47 deletions(-) create mode 100644 client/iOS/.gitignore create mode 100644 client/iOS/Additions/OrderedDictionary.h create mode 100644 client/iOS/Additions/OrderedDictionary.m create mode 100644 client/iOS/Additions/TSXAdditions.h create mode 100644 client/iOS/Additions/TSXAdditions.m create mode 100644 client/iOS/Additions/Toast+UIView.h create mode 100644 client/iOS/Additions/Toast+UIView.m create mode 100644 client/iOS/AppDelegate.h create mode 100644 client/iOS/AppDelegate.m create mode 100644 client/iOS/CMakeLists.txt create mode 100644 client/iOS/Controllers/AboutController.h create mode 100644 client/iOS/Controllers/AboutController.m create mode 100644 client/iOS/Controllers/AdvancedBookmarkEditorController.h create mode 100644 client/iOS/Controllers/AdvancedBookmarkEditorController.m create mode 100644 client/iOS/Controllers/AppSettingsController.h create mode 100644 client/iOS/Controllers/AppSettingsController.m create mode 100644 client/iOS/Controllers/BookmarkEditorController.h create mode 100644 client/iOS/Controllers/BookmarkEditorController.m create mode 100644 client/iOS/Controllers/BookmarkListController.h create mode 100644 client/iOS/Controllers/BookmarkListController.m create mode 100644 client/iOS/Controllers/CredentialsEditorController.h create mode 100644 client/iOS/Controllers/CredentialsEditorController.m create mode 100644 client/iOS/Controllers/CredentialsInputController.h create mode 100644 client/iOS/Controllers/CredentialsInputController.m create mode 100644 client/iOS/Controllers/EditorBaseController.h create mode 100644 client/iOS/Controllers/EditorBaseController.m create mode 100644 client/iOS/Controllers/EditorSelectionController.h create mode 100644 client/iOS/Controllers/EditorSelectionController.m create mode 100644 client/iOS/Controllers/EncryptionController.h create mode 100644 client/iOS/Controllers/EncryptionController.m create mode 100644 client/iOS/Controllers/HelpController.h create mode 100644 client/iOS/Controllers/HelpController.m create mode 100644 client/iOS/Controllers/MainTabBarController.h create mode 100644 client/iOS/Controllers/MainTabBarController.m create mode 100644 client/iOS/Controllers/PerformanceEditorController.h create mode 100644 client/iOS/Controllers/PerformanceEditorController.m create mode 100644 client/iOS/Controllers/RDPSessionViewController.h create mode 100644 client/iOS/Controllers/RDPSessionViewController.m create mode 100644 client/iOS/Controllers/ScreenSelectionController.h create mode 100644 client/iOS/Controllers/ScreenSelectionController.m create mode 100644 client/iOS/Controllers/VerifyCertificateController.h create mode 100644 client/iOS/Controllers/VerifyCertificateController.m create mode 100644 client/iOS/Defaults.plist create mode 100644 client/iOS/FreeRDP/ios_freerdp.h create mode 100644 client/iOS/FreeRDP/ios_freerdp.m create mode 100755 client/iOS/FreeRDP/ios_freerdp_events.h create mode 100755 client/iOS/FreeRDP/ios_freerdp_events.m create mode 100644 client/iOS/FreeRDP/ios_freerdp_ui.h create mode 100644 client/iOS/FreeRDP/ios_freerdp_ui.m create mode 100755 client/iOS/Misc/Reachability.h create mode 100755 client/iOS/Misc/Reachability.m create mode 100755 client/iOS/Misc/SFHFKeychainUtils.h create mode 100755 client/iOS/Misc/SFHFKeychainUtils.m create mode 100644 client/iOS/Misc/TSXTypes.h create mode 100644 client/iOS/Misc/Utils.h create mode 100644 client/iOS/Misc/Utils.m create mode 100644 client/iOS/Models/Bookmark.h create mode 100644 client/iOS/Models/Bookmark.m create mode 100644 client/iOS/Models/ConnectionParams.h create mode 100644 client/iOS/Models/ConnectionParams.m create mode 100644 client/iOS/Models/Encryptor.h create mode 100644 client/iOS/Models/Encryptor.m create mode 100644 client/iOS/Models/GlobalDefaults.h create mode 100644 client/iOS/Models/GlobalDefaults.m create mode 100644 client/iOS/Models/RDPKeyboard.h create mode 100644 client/iOS/Models/RDPKeyboard.m create mode 100644 client/iOS/Models/RDPSession.h create mode 100644 client/iOS/Models/RDPSession.m create mode 100644 client/iOS/Resources/BookmarkListView.xib create mode 100644 client/iOS/Resources/BookmarkTableViewCell.xib create mode 100644 client/iOS/Resources/CredentialsInputView.xib create mode 100755 client/iOS/Resources/Default-568h@2x.png create mode 100755 client/iOS/Resources/Default-Landscape@2x~ipad.png create mode 100755 client/iOS/Resources/Default-Landscape~ipad.png create mode 100755 client/iOS/Resources/Default-Portrait@2x~ipad.png create mode 100755 client/iOS/Resources/Default-Portrait~ipad.png create mode 100755 client/iOS/Resources/Default.png create mode 100755 client/iOS/Resources/Default@2x.png create mode 100644 client/iOS/Resources/EditButtonTableViewCell.xib create mode 100644 client/iOS/Resources/EditFlagTableViewCell.xib create mode 100644 client/iOS/Resources/EditSecretTextTableViewCell.xib create mode 100644 client/iOS/Resources/EditSelectionTableViewCell.xib create mode 100644 client/iOS/Resources/EditSubEditTableViewCell.xib create mode 100644 client/iOS/Resources/EditTextTableViewCell.xib create mode 100755 client/iOS/Resources/Icon-72.png create mode 100755 client/iOS/Resources/Icon-72@2x.png create mode 100755 client/iOS/Resources/Icon.png create mode 100755 client/iOS/Resources/Icon@2x.png create mode 100644 client/iOS/Resources/MainWindow.xib create mode 100644 client/iOS/Resources/RDPConnectingView.xib create mode 100644 client/iOS/Resources/RDPSessionView.xib create mode 100644 client/iOS/Resources/SessionTableViewCell.xib create mode 100644 client/iOS/Resources/VerifyCertificateView.xib create mode 100755 client/iOS/Resources/about_page/FreeRDP_Logo.png create mode 100755 client/iOS/Resources/about_page/about.html create mode 100755 client/iOS/Resources/about_page/about_phone.html create mode 100755 client/iOS/Resources/about_page/back.jpg create mode 100755 client/iOS/Resources/about_page/background_transparent.png create mode 100644 client/iOS/Resources/cancel_button_background.png create mode 100644 client/iOS/Resources/en.lproj/Localizable.strings create mode 100755 client/iOS/Resources/help_page/back.jpg create mode 100755 client/iOS/Resources/help_page/gestures.html create mode 100755 client/iOS/Resources/help_page/gestures.png create mode 100755 client/iOS/Resources/help_page/gestures_phone.html create mode 100755 client/iOS/Resources/help_page/gestures_phone.png create mode 100755 client/iOS/Resources/help_page/nav_gestures.png create mode 100755 client/iOS/Resources/help_page/nav_toolbar.png create mode 100755 client/iOS/Resources/help_page/nav_touch_pointer.png create mode 100755 client/iOS/Resources/help_page/toolbar.html create mode 100755 client/iOS/Resources/help_page/toolbar.png create mode 100755 client/iOS/Resources/help_page/toolbar_phone.html create mode 100755 client/iOS/Resources/help_page/toolbar_phone.png create mode 100755 client/iOS/Resources/help_page/touch_pointer.html create mode 100755 client/iOS/Resources/help_page/touch_pointer.png create mode 100755 client/iOS/Resources/help_page/touch_pointer_phone.html create mode 100755 client/iOS/Resources/help_page/touch_pointer_phone.png create mode 100755 client/iOS/Resources/icon_accessory_star_off.png create mode 100755 client/iOS/Resources/icon_accessory_star_on.png create mode 100755 client/iOS/Resources/icon_key_arrow_down.png create mode 100755 client/iOS/Resources/icon_key_arrow_left.png create mode 100755 client/iOS/Resources/icon_key_arrow_right.png create mode 100755 client/iOS/Resources/icon_key_arrow_up.png create mode 100755 client/iOS/Resources/icon_key_arrows.png create mode 100755 client/iOS/Resources/icon_key_backspace.png create mode 100755 client/iOS/Resources/icon_key_menu.png create mode 100755 client/iOS/Resources/icon_key_return.png create mode 100755 client/iOS/Resources/icon_key_win.png create mode 100755 client/iOS/Resources/keyboard_button_background.png create mode 100755 client/iOS/Resources/tabbar_icon_about.png create mode 100755 client/iOS/Resources/tabbar_icon_help.png create mode 100755 client/iOS/Resources/tabbar_icon_settings.png create mode 100755 client/iOS/Resources/toolbar_icon_disconnect.png create mode 100755 client/iOS/Resources/toolbar_icon_extkeyboad.png create mode 100755 client/iOS/Resources/toolbar_icon_home.png create mode 100755 client/iOS/Resources/toolbar_icon_keyboard.png create mode 100755 client/iOS/Resources/toolbar_icon_touchpointer.png create mode 100755 client/iOS/Resources/toolbar_icon_win.png create mode 100755 client/iOS/Resources/touch_pointer_active.png create mode 100755 client/iOS/Resources/touch_pointer_default.png create mode 100755 client/iOS/Resources/touch_pointer_extkeyboard.png create mode 100755 client/iOS/Resources/touch_pointer_keyboard.png create mode 100755 client/iOS/Resources/touch_pointer_lclick.png create mode 100755 client/iOS/Resources/touch_pointer_rclick.png create mode 100755 client/iOS/Resources/touch_pointer_reset.png create mode 100755 client/iOS/Resources/touch_pointer_scroll.png create mode 100644 client/iOS/Views/AdvancedKeyboardView.h create mode 100644 client/iOS/Views/AdvancedKeyboardView.m create mode 100644 client/iOS/Views/BookmarkTableCell.h create mode 100644 client/iOS/Views/BookmarkTableCell.m create mode 100644 client/iOS/Views/EditButtonTableViewCell.h create mode 100644 client/iOS/Views/EditButtonTableViewCell.m create mode 100644 client/iOS/Views/EditFlagTableViewCell.h create mode 100644 client/iOS/Views/EditFlagTableViewCell.m create mode 100644 client/iOS/Views/EditSecretTextTableViewCell.h create mode 100644 client/iOS/Views/EditSecretTextTableViewCell.m create mode 100644 client/iOS/Views/EditSelectionTableViewCell.h create mode 100644 client/iOS/Views/EditSelectionTableViewCell.m create mode 100644 client/iOS/Views/EditSubEditTableViewCell.h create mode 100644 client/iOS/Views/EditSubEditTableViewCell.m create mode 100644 client/iOS/Views/EditTextTableViewCell.h create mode 100644 client/iOS/Views/EditTextTableViewCell.m create mode 100644 client/iOS/Views/RDPSessionView.h create mode 100644 client/iOS/Views/RDPSessionView.m create mode 100644 client/iOS/Views/SessionTableCell.h create mode 100644 client/iOS/Views/SessionTableCell.m create mode 100644 client/iOS/Views/TouchPointerView.h create mode 100644 client/iOS/Views/TouchPointerView.m create mode 100644 client/iOS/iFreeRDP-Prefix.pch create mode 100644 client/iOS/iFreeRDP.plist create mode 100644 client/iOS/iFreeRDP.xcodeproj/project.pbxproj.cmake create mode 100644 client/iOS/main.m create mode 100644 cmake/ConfigOptionsiOS.cmake create mode 100644 docs/README.ios create mode 100755 scripts/OpenSSL-DownloadAndBuild.command create mode 100644 scripts/OpenSSL-iFreeRDP.diff diff --git a/.gitignore b/.gitignore index 9eae137ec..10fe97360 100644 --- a/.gitignore +++ b/.gitignore @@ -13,6 +13,8 @@ CPackConfig.cmake CPackSourceConfig.cmake DartConfiguration.tcl _CPack_Packages +external/* +!external/README # Packages *.zip diff --git a/CMakeLists.txt b/CMakeLists.txt index 98c23176f..290b7d6c3 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -60,13 +60,13 @@ else() endif() # Allow to search the host machine for git -if(ANDROID) +if(ANDROID OR IOS) SET(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER, BOTH) -endif(ANDROID) +endif(ANDROID OR IOS) include(GetGitRevisionDescription) -if(ANDROID) +if(ANDROID OR IOS) SET(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER, ONLY) -endif(ANDROID) +endif(ANDROID OR IOS) git_describe(GIT_REVISION --match "[0-9]*" --abbrev=4 --tags --always) message(STATUS "Git Revision ${GIT_REVISION}") @@ -74,14 +74,13 @@ message(STATUS "Git Revision ${GIT_REVISION}") # Turn on solution folders (2.8.4+) set_property(GLOBAL PROPERTY USE_FOLDERS ON) - # Default to release build type if(NOT CMAKE_BUILD_TYPE) set(CMAKE_BUILD_TYPE "Release") endif() if(NOT DEFINED BUILD_SHARED_LIBS) - if(ANDROID) + if(ANDROID OR IOS) set(BUILD_SHARED_LIBS OFF) else() set(BUILD_SHARED_LIBS ON) @@ -167,6 +166,10 @@ if(MSVC) SET(LIBRARY_OUTPUT_PATH ${PROJECT_BINARY_DIR}) endif() +if(IOS) + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -isysroot ${CMAKE_IOS_SDK_ROOT}") +endif() + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DWINPR_EXPORTS") set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DFREERDP_EXPORTS") @@ -183,14 +186,21 @@ check_struct_has_member("struct tm" tm_gmtoff time.h HAVE_TM_GMTOFF) # Mac OS X if(APPLE) - if(IS_DIRECTORY /opt/local/include) - include_directories(/opt/local/include) - link_directories(/opt/local/lib) - endif() - if(WITH_CLANG) - set(CMAKE_C_COMPILER "clang") - endif() - set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -mmacosx-version-min=10.4") + if(IOS) + if (NOT FREERDP_IOS_EXTERNAL_SSL_PATH) + message(STATUS "FREERDP_IOS_EXTERNAL_SSL_PATH not set! Required if openssl is not found in the iOS SDK (which usually isn't") + endif() + set(CMAKE_FIND_ROOT_PATH ${CMAKE_FIND_ROOT_PATH} ${FREERDP_IOS_EXTERNAL_SSL_PATH}) + else() + if(IS_DIRECTORY /opt/local/include) + include_directories(/opt/local/include) + link_directories(/opt/local/lib) + endif() + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -mmacosx-version-min=10.4") + endif() + if(WITH_CLANG) + set(CMAKE_C_COMPILER "clang") + endif() endif() # Android @@ -272,6 +282,14 @@ endif() if(APPLE) set(DIRECTFB_FEATURE_TYPE "DISABLED") set(FFMPEG_FEATURE_TYPE "OPTIONAL") + if(IOS) + set(X11_FEATURE_TYPE "DISABLED") + set(ALSA_FEATURE_TYPE "DISABLED") + set(PULSE_FEATURE_TYPE "DISABLED") + set(CUPS_FEATURE_TYPE "DISABLED") + set(PCSC_FEATURE_TYPE "DISABLED") + set(GSTREAMER_FEATURE_TYPE "DISABLED") + endif() endif() if(ANDROID) @@ -285,17 +303,6 @@ if(ANDROID) set(GSTREAMER_FEATURE_TYPE "DISABLED") endif() -if(IOS) - set(X11_FEATURE_TYPE "DISABLED") - set(DIRECTFB_FEATURE_TYPE "DISABLED") - set(ALSA_FEATURE_TYPE "DISABLED") - set(PULSE_FEATURE_TYPE "DISABLED") - set(CUPS_FEATURE_TYPE "DISABLED") - set(PCSC_FEATURE_TYPE "DISABLED") - set(FFMPEG_FEATURE_TYPE "DISABLED") - set(GSTREAMER_FEATURE_TYPE "DISABLED") -endif() - find_feature(X11 ${X11_FEATURE_TYPE} ${X11_FEATURE_PURPOSE} ${X11_FEATURE_DESCRIPTION}) find_feature(DirectFB ${DIRECTFB_FEATURE_TYPE} ${DIRECTFB_FEATURE_PURPOSE} ${DIRECTFB_FEATURE_DESCRIPTION}) diff --git a/client/.gitignore b/client/.gitignore index 76a6d8d29..e69de29bb 100644 --- a/client/.gitignore +++ b/client/.gitignore @@ -1 +0,0 @@ -iOS diff --git a/client/CMakeLists.txt b/client/CMakeLists.txt index a5eb5b315..68aefcbb9 100644 --- a/client/CMakeLists.txt +++ b/client/CMakeLists.txt @@ -35,8 +35,15 @@ if(WITH_X11) add_subdirectory(X11) endif() -if(APPLE AND (NOT IOS)) - add_subdirectory(Mac) +if(APPLE) + if(IOS) + if(IS_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/iOS") + message(STATUS "Adding iOS client") + add_subdirectory(iOS) + endif() + else() + add_subdirectory(Mac) + endif() endif() if(ANDROID) diff --git a/client/iOS/.gitignore b/client/iOS/.gitignore new file mode 100644 index 000000000..fe0e7b029 --- /dev/null +++ b/client/iOS/.gitignore @@ -0,0 +1,7 @@ +# XCode files +project.xcworkspace/ +xcuserdata/ +bin/ +build/ +project.pbxproj +!iFreeRDP.xcodeproj/ diff --git a/client/iOS/Additions/OrderedDictionary.h b/client/iOS/Additions/OrderedDictionary.h new file mode 100644 index 000000000..ce741fbbe --- /dev/null +++ b/client/iOS/Additions/OrderedDictionary.h @@ -0,0 +1,40 @@ +// +// OrderedDictionary.h +// OrderedDictionary +// +// Modified version (Added indexForKey/Value functions) +// +// Created by Matt Gallagher on 19/12/08. +// Copyright 2008 Matt Gallagher. All rights reserved. +// +// This software is provided 'as-is', without any express or implied +// warranty. In no event will the authors be held liable for any damages +// arising from the use of this software. Permission is granted to anyone to +// use this software for any purpose, including commercial applications, and to +// alter it and redistribute it freely, subject to the following restrictions: +// +// 1. The origin of this software must not be misrepresented; you must not +// claim that you wrote the original software. If you use this software +// in a product, an acknowledgment in the product documentation would be +// appreciated but is not required. +// 2. Altered source versions must be plainly marked as such, and must not be +// misrepresented as being the original software. +// 3. This notice may not be removed or altered from any source +// distribution. +// + +#import + +@interface OrderedDictionary : NSMutableDictionary +{ + NSMutableDictionary *dictionary; + NSMutableArray *array; +} + +- (void)insertObject:(id)anObject forKey:(id)aKey atIndex:(NSUInteger)anIndex; +- (id)keyAtIndex:(NSUInteger)anIndex; +- (NSUInteger)indexForValue:(id)value; +- (NSUInteger)indexForKey:(id)key; +- (NSEnumerator *)reverseKeyEnumerator; + +@end diff --git a/client/iOS/Additions/OrderedDictionary.m b/client/iOS/Additions/OrderedDictionary.m new file mode 100644 index 000000000..63b8cff34 --- /dev/null +++ b/client/iOS/Additions/OrderedDictionary.m @@ -0,0 +1,168 @@ +// +// OrderedDictionary.m +// OrderedDictionary +// +// Modified version (Added indexForKey/Value functions) +// +// Created by Matt Gallagher on 19/12/08. +// Copyright 2008 Matt Gallagher. All rights reserved. +// +// This software is provided 'as-is', without any express or implied +// warranty. In no event will the authors be held liable for any damages +// arising from the use of this software. Permission is granted to anyone to +// use this software for any purpose, including commercial applications, and to +// alter it and redistribute it freely, subject to the following restrictions: +// +// 1. The origin of this software must not be misrepresented; you must not +// claim that you wrote the original software. If you use this software +// in a product, an acknowledgment in the product documentation would be +// appreciated but is not required. +// 2. Altered source versions must be plainly marked as such, and must not be +// misrepresented as being the original software. +// 3. This notice may not be removed or altered from any source +// distribution. +// + +#import "OrderedDictionary.h" + +NSString *DescriptionForObject(NSObject *object, id locale, NSUInteger indent) +{ + NSString *objectString; + if ([object isKindOfClass:[NSString class]]) + { + objectString = (NSString *)[[object retain] autorelease]; + } + else if ([object respondsToSelector:@selector(descriptionWithLocale:indent:)]) + { + objectString = [(NSDictionary *)object descriptionWithLocale:locale indent:indent]; + } + else if ([object respondsToSelector:@selector(descriptionWithLocale:)]) + { + objectString = [(NSSet *)object descriptionWithLocale:locale]; + } + else + { + objectString = [object description]; + } + return objectString; +} + +@implementation OrderedDictionary + +- (id)init +{ + return [self initWithCapacity:0]; +} + +- (id)initWithCapacity:(NSUInteger)capacity +{ + self = [super init]; + if (self != nil) + { + dictionary = [[NSMutableDictionary alloc] initWithCapacity:capacity]; + array = [[NSMutableArray alloc] initWithCapacity:capacity]; + } + return self; +} + +- (void)dealloc +{ + [dictionary release]; + [array release]; + [super dealloc]; +} + +- (id)copy +{ + return [self mutableCopy]; +} + +- (void)setObject:(id)anObject forKey:(id)aKey +{ + if (![dictionary objectForKey:aKey]) + { + [array addObject:aKey]; + } + [dictionary setObject:anObject forKey:aKey]; +} + +- (void)removeObjectForKey:(id)aKey +{ + [dictionary removeObjectForKey:aKey]; + [array removeObject:aKey]; +} + +- (NSUInteger)count +{ + return [dictionary count]; +} + +- (id)objectForKey:(id)aKey +{ + return [dictionary objectForKey:aKey]; +} + +- (NSEnumerator *)keyEnumerator +{ + return [array objectEnumerator]; +} + +- (NSEnumerator *)reverseKeyEnumerator +{ + return [array reverseObjectEnumerator]; +} + +- (void)insertObject:(id)anObject forKey:(id)aKey atIndex:(NSUInteger)anIndex +{ + if ([dictionary objectForKey:aKey]) + { + [self removeObjectForKey:aKey]; + } + [array insertObject:aKey atIndex:anIndex]; + [dictionary setObject:anObject forKey:aKey]; +} + +- (id)keyAtIndex:(NSUInteger)anIndex +{ + return [array objectAtIndex:anIndex]; +} + +- (NSUInteger)indexForKey:(id)key +{ + return [array indexOfObject:key]; +} + +- (NSUInteger)indexForValue:(id)value +{ + NSArray* keys = [self allKeysForObject:value]; + if ([keys count] > 0) + { + return [self indexForKey:[keys objectAtIndex:0]]; + } + + return NSNotFound; +} + +- (NSString *)descriptionWithLocale:(id)locale indent:(NSUInteger)level +{ + NSMutableString *indentString = [NSMutableString string]; + NSUInteger i, count = level; + for (i = 0; i < count; i++) + { + [indentString appendFormat:@" "]; + } + + NSMutableString *description = [NSMutableString string]; + [description appendFormat:@"%@{\n", indentString]; + for (NSObject *key in self) + { + [description appendFormat:@"%@ %@ = %@;\n", + indentString, + DescriptionForObject(key, locale, level), + DescriptionForObject([self objectForKey:key], locale, level)]; + } + [description appendFormat:@"%@}\n", indentString]; + return description; +} + +@end diff --git a/client/iOS/Additions/TSXAdditions.h b/client/iOS/Additions/TSXAdditions.h new file mode 100644 index 000000000..7f003785e --- /dev/null +++ b/client/iOS/Additions/TSXAdditions.h @@ -0,0 +1,30 @@ +/* + Additions to Cocoa touch classes + + Copyright 2013 Thinstuff Technologies GmbH, Authors: Dorian Johnson, 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 NSObject (TSXAdditions) +- (void)setValuesForKeyPathsWithDictionary:(NSDictionary *)keyedValues; +@end + +#pragma mark - +@interface NSString (TSXAdditions) ++ (NSString*)stringWithUUID; +- (NSData*)dataFromHexString; ++ (NSString*)hexStringFromData:(const unsigned char *)data ofSize:(unsigned int)size withSeparator:(NSString *)sep afterNthChar:(int)sepnth; +@end + +@interface NSDictionary (TSXAdditions) +- (id)mutableDeepCopy; +@end + +@interface NSData (TSXAdditions) +- (NSString *)hexadecimalString; +- (NSString *)base64EncodedString; +@end diff --git a/client/iOS/Additions/TSXAdditions.m b/client/iOS/Additions/TSXAdditions.m new file mode 100644 index 000000000..99afc62a0 --- /dev/null +++ b/client/iOS/Additions/TSXAdditions.m @@ -0,0 +1,217 @@ +/* + Additions to Cocoa touch classes + + Copyright 2013 Thinstuff Technologies GmbH, Authors: Dorian Johnson, 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 "TSXAdditions.h" +#include +#include + +@implementation NSObject (TSXAdditions) + +- (void)setValuesForKeyPathsWithDictionary:(NSDictionary *)keyedValues +{ + for (id keyPath in keyedValues) + [self setValue:[keyedValues objectForKey:keyPath] forKeyPath:keyPath]; +} + +- mutableDeepCopy +{ + if([self respondsToSelector:@selector(mutableCopyWithZone:)]) + return [self mutableCopy]; + else if([self respondsToSelector:@selector(copyWithZone:)]) + return [self copy]; + else + return [self retain]; +} + +@end + +#pragma mark - + +@implementation NSString (TSXAdditions) + +#pragma mark Creation routines ++ (NSString*)stringWithUUID +{ + CFUUIDRef uuidObj = CFUUIDCreate(nil); + NSString* uuidString = (NSString*)CFUUIDCreateString(nil, uuidObj); + CFRelease(uuidObj); + return [uuidString autorelease]; +} + +/* Code from http://code.google.com/p/google-toolbox-for-mac/source/browse/trunk/Foundation/GTMNSData%2BHex.m?r=344 */ +- (NSData*)dataFromHexString +{ + NSData *hexData = [self dataUsingEncoding:NSASCIIStringEncoding]; + const char *hexBuf = [hexData bytes]; + NSUInteger hexLen = [hexData length]; + + // This indicates an error converting to ASCII. + if (!hexData) + return nil; + + if ((hexLen % 2) != 0) { + return nil; + } + + NSMutableData *binaryData = [NSMutableData dataWithLength:(hexLen / 2)]; + unsigned char *binaryPtr = [binaryData mutableBytes]; + unsigned char value = 0; + for (NSUInteger i = 0; i < hexLen; i++) { + char c = hexBuf[i]; + + if (!isxdigit(c)) { + return nil; + } + + if (isdigit(c)) { + value += c - '0'; + } else if (islower(c)) { + value += 10 + c - 'a'; + } else { + value += 10 + c - 'A'; + } + + if (i & 1) { + *binaryPtr++ = value; + value = 0; + } else { + value <<= 4; + } + } + + return [NSData dataWithData:binaryData]; +} + ++ (NSString*)hexStringFromData:(const unsigned char *)data ofSize:(unsigned int)size withSeparator:(NSString *)sep afterNthChar:(int)sepnth +{ + int i; + NSMutableString *result; + NSString *immutableResult; + + result = [[NSMutableString alloc] init]; + for (i = 0; i < size; i++) { + if(i && sep && sepnth && i%sepnth==0) + [result appendString:sep]; + [result appendFormat:@"%02X", data[i]]; + } + + immutableResult = [NSString stringWithString:result]; + [result release]; + return immutableResult; +} + +@end + +#pragma mark Mutable deep copy for dicionary, array and set + +@implementation NSDictionary (TSXAdditions) + +- mutableDeepCopy +{ + NSMutableDictionary *newDictionary = [[NSMutableDictionary alloc] init]; + NSEnumerator *enumerator = [self keyEnumerator]; + id key; + while((key = [enumerator nextObject])) + { + id obj = [[self objectForKey:key] mutableDeepCopy]; + [newDictionary setObject:obj forKey:key]; + [obj release]; + } + return newDictionary; +} + +@end + +@implementation NSArray (TSXAdditions) + +- mutableDeepCopy +{ + NSMutableArray *newArray = [[NSMutableArray alloc] init]; + NSEnumerator *enumerator = [self objectEnumerator]; + id obj; + while((obj = [enumerator nextObject])) + { + obj = [obj mutableDeepCopy]; + [newArray addObject:obj]; + [obj release]; + } + return newArray; +} + +@end + +@implementation NSSet (TSXAdditions) + +- mutableDeepCopy +{ + NSMutableSet *newSet = [[NSMutableSet alloc] init]; + NSEnumerator *enumerator = [self objectEnumerator]; + id obj; + while((obj = [enumerator nextObject])) + { + obj = [obj mutableDeepCopy]; + [newSet addObject:obj]; + [obj release]; + } + return newSet; +} + +@end + + +#pragma mark - + +/* Code from http://stackoverflow.com/questions/1305225/best-way-to-serialize-a-nsdata-into-an-hexadeximal-string */ +@implementation NSData (TSXAdditions) + +#pragma mark - String Conversion +- (NSString *)hexadecimalString { + /* Returns hexadecimal string of NSData. Empty string if data is empty. */ + + const unsigned char *dataBuffer = (const unsigned char *)[self bytes]; + + if (!dataBuffer) + return [NSString string]; + + NSUInteger dataLength = [self length]; + NSMutableString *hexString = [NSMutableString stringWithCapacity:(dataLength * 2)]; + + for (int i = 0; i < dataLength; ++i) + [hexString appendString:[NSString stringWithFormat:@"%02lx", (unsigned long)dataBuffer[i]]]; + + return [NSString stringWithString:hexString]; +} + +/* Code from http://cocoawithlove.com/2009/06/base64-encoding-options-on-mac-and.html */ +- (NSString *)base64EncodedString +{ + // Construct an OpenSSL context + BIO *context = BIO_new(BIO_s_mem()); + + // Tell the context to encode base64 + BIO *command = BIO_new(BIO_f_base64()); + context = BIO_push(command, context); + BIO_set_flags(context, BIO_FLAGS_BASE64_NO_NL); + + // Encode all the data + BIO_write(context, [self bytes], [self length]); + (void)BIO_flush(context); + + // Get the data out of the context + char *outputBuffer; + long outputLength = BIO_get_mem_data(context, &outputBuffer); + NSString *encodedString = [[NSString alloc] initWithBytes:outputBuffer length:outputLength encoding:NSASCIIStringEncoding]; + + BIO_free_all(context); + + return encodedString; +} + +@end + diff --git a/client/iOS/Additions/Toast+UIView.h b/client/iOS/Additions/Toast+UIView.h new file mode 100644 index 000000000..012d44191 --- /dev/null +++ b/client/iOS/Additions/Toast+UIView.h @@ -0,0 +1,50 @@ +/*************************************************************************** + + Toast+UIView.h + Toast + Version 0.1 + + Copyright (c) 2011 Charles Scalesse. + + Permission is hereby granted, free of charge, to any person obtaining a + copy of this software and associated documentation files (the + "Software"), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +***************************************************************************/ + + +#import + +@interface UIView (Toast) + +#define ToastDurationLong 5.0 +#define ToastDurationNormal 3.0 +#define ToastDurationShort 1.0 + +// each makeToast method creates a view and displays it as toast +-(void)makeToast:(NSString *)message; +-(void)makeToast:(NSString *)message duration:(float)interval position:(id)point; +-(void)makeToast:(NSString *)message duration:(float)interval position:(id)point title:(NSString *)title; +-(void)makeToast:(NSString *)message duration:(float)interval position:(id)point title:(NSString *)title image:(UIImage *)image; +-(void)makeToast:(NSString *)message duration:(float)interval position:(id)point image:(UIImage *)image; + +// the showToast method displays an existing view as toast +-(void)showToast:(UIView *)toast; +-(void)showToast:(UIView *)toast duration:(float)interval position:(id)point; + +@end diff --git a/client/iOS/Additions/Toast+UIView.m b/client/iOS/Additions/Toast+UIView.m new file mode 100644 index 000000000..649add3f1 --- /dev/null +++ b/client/iOS/Additions/Toast+UIView.m @@ -0,0 +1,307 @@ +/*************************************************************************** + + Toast+UIView.h + Toast + Version 0.1 + + Copyright (c) 2011 Charles Scalesse. + + Permission is hereby granted, free of charge, to any person obtaining a + copy of this software and associated documentation files (the + "Software"), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + ***************************************************************************/ + +#import "Toast+UIView.h" +#import +#import + +#define kMaxWidth 0.8 +#define kMaxHeight 0.8 + +#define kHorizontalPadding 10.0 +#define kVerticalPadding 10.0 +#define kCornerRadius 10.0 +#define kOpacity 0.8 +#define kFontSize 16.0 +#define kMaxTitleLines 999 +#define kMaxMessageLines 999 + +#define kFadeDuration 0.2 + +#define kDefaultLength 3 +#define kDefaultPosition @"bottom" + +#define kImageWidth 80.0 +#define kImageHeight 80.0 + +static NSString *kDurationKey = @"duration"; + + +@interface UIView (ToastPrivate) + +-(CGPoint)getPositionFor:(id)position toast:(UIView *)toast; +-(UIView *)makeViewForMessage:(NSString *)message title:(NSString *)title image:(UIImage *)image; + +@end + + +@implementation UIView (Toast) + +#pragma mark - +#pragma mark Toast Methods + +-(void)makeToast:(NSString *)message { + [self makeToast:message duration:kDefaultLength position:kDefaultPosition]; +} + +-(void)makeToast:(NSString *)message duration:(float)interval position:(id)point { + UIView *toast = [self makeViewForMessage:message title:nil image:nil]; + [self showToast:toast duration:interval position:point]; +} + +-(void)makeToast:(NSString *)message duration:(float)interval position:(id)point title:(NSString *)title { + UIView *toast = [self makeViewForMessage:message title:title image:nil]; + [self showToast:toast duration:interval position:point]; +} + +-(void)makeToast:(NSString *)message duration:(float)interval position:(id)point image:(UIImage *)image { + UIView *toast = [self makeViewForMessage:message title:nil image:image]; + [self showToast:toast duration:interval position:point]; +} + +-(void)makeToast:(NSString *)message duration:(float)interval position:(id)point title:(NSString *)title image:(UIImage *)image { + UIView *toast = [self makeViewForMessage:message title:title image:image]; + [self showToast:toast duration:interval position:point]; +} + +-(void)showToast:(UIView *)toast { + [self showToast:toast duration:kDefaultLength position:kDefaultPosition]; +} + +-(void)showToast:(UIView *)toast duration:(float)interval position:(id)point { + + /**************************************************** + * * + * Displays a view for a given duration & position. * + * * + ****************************************************/ + + CGPoint toastPoint = [self getPositionFor:point toast:toast]; + + //use an associative reference to associate the toast view with the display interval + objc_setAssociatedObject (toast, &kDurationKey, [NSNumber numberWithFloat:interval], OBJC_ASSOCIATION_RETAIN); + + [toast setCenter:toastPoint]; + [toast setAlpha:0.0]; + [self addSubview:toast]; + + [UIView beginAnimations:@"fade_in" context:toast]; + [UIView setAnimationDuration:kFadeDuration]; + [UIView setAnimationDelegate:self]; + [UIView setAnimationDidStopSelector:@selector(animationDidStop:finished:context:)]; + [UIView setAnimationCurve:UIViewAnimationCurveEaseOut]; + [toast setAlpha:1.0]; + [UIView commitAnimations]; + +} + +#pragma mark - +#pragma mark Animation Delegate Method + +- (void)animationDidStop:(NSString*)animationID finished:(BOOL)finished context:(void *)context { + + UIView *toast = (UIView *)context; + + // retrieve the display interval associated with the view + float interval = [(NSNumber *)objc_getAssociatedObject(toast, &kDurationKey) floatValue]; + + if([animationID isEqualToString:@"fade_in"]) { + + [UIView beginAnimations:@"fade_out" context:toast]; + [UIView setAnimationDelay:interval]; + [UIView setAnimationDuration:kFadeDuration]; + [UIView setAnimationDelegate:self]; + [UIView setAnimationDidStopSelector:@selector(animationDidStop:finished:context:)]; + [UIView setAnimationCurve:UIViewAnimationCurveEaseIn]; + [toast setAlpha:0.0]; + [UIView commitAnimations]; + + } else if ([animationID isEqualToString:@"fade_out"]) { + + [toast removeFromSuperview]; + + } + +} + +#pragma mark - +#pragma mark Private Methods + +-(CGPoint)getPositionFor:(id)point toast:(UIView *)toast { + + /************************************************************************************* + * * + * Converts string literals @"top", @"bottom", @"center", or any point wrapped in an * + * NSValue object into a CGPoint * + * * + *************************************************************************************/ + + if([point isKindOfClass:[NSString class]]) { + + if( [point caseInsensitiveCompare:@"top"] == NSOrderedSame ) { + return CGPointMake(self.bounds.size.width/2, (toast.frame.size.height / 2) + kVerticalPadding); + } else if( [point caseInsensitiveCompare:@"bottom"] == NSOrderedSame ) { + return CGPointMake(self.bounds.size.width/2, (self.bounds.size.height - (toast.frame.size.height / 2)) - kVerticalPadding); + } else if( [point caseInsensitiveCompare:@"center"] == NSOrderedSame ) { + return CGPointMake(self.bounds.size.width / 2, self.bounds.size.height / 2); + } + + } else if ([point isKindOfClass:[NSValue class]]) { + return [point CGPointValue]; + } + + NSLog(@"Error: Invalid position for toast."); + return [self getPositionFor:kDefaultPosition toast:toast]; +} + +-(UIView *)makeViewForMessage:(NSString *)message title:(NSString *)title image:(UIImage *)image { + + /*********************************************************************************** + * * + * Dynamically build a toast view with any combination of message, title, & image. * + * * + ***********************************************************************************/ + + if((message == nil) && (title == nil) && (image == nil)) return nil; + + UILabel *messageLabel = nil; + UILabel *titleLabel = nil; + UIImageView *imageView = nil; + + // create the parent view + UIView *wrapperView = [[[UIView alloc] init] autorelease]; + [wrapperView.layer setCornerRadius:kCornerRadius]; + [wrapperView setBackgroundColor:[[UIColor blackColor] colorWithAlphaComponent:kOpacity]]; + wrapperView.autoresizingMask = UIViewAutoresizingFlexibleTopMargin | UIViewAutoresizingFlexibleLeftMargin | UIViewAutoresizingFlexibleRightMargin | UIViewAutoresizingFlexibleBottomMargin; + + if(image != nil) { + imageView = [[[UIImageView alloc] initWithImage:image] autorelease]; + [imageView setContentMode:UIViewContentModeScaleAspectFit]; + [imageView setFrame:CGRectMake(kHorizontalPadding, kVerticalPadding, kImageWidth, kImageHeight)]; + } + + float imageWidth, imageHeight, imageLeft; + + // the imageView frame values will be used to size & position the other views + if(imageView != nil) { + imageWidth = imageView.bounds.size.width; + imageHeight = imageView.bounds.size.height; + imageLeft = kHorizontalPadding; + } else { + imageWidth = imageHeight = imageLeft = 0; + } + + if (title != nil) { + titleLabel = [[[UILabel alloc] init] autorelease]; + [titleLabel setNumberOfLines:kMaxTitleLines]; + [titleLabel setFont:[UIFont boldSystemFontOfSize:kFontSize]]; + [titleLabel setTextAlignment:UITextAlignmentLeft]; + [titleLabel setLineBreakMode:UILineBreakModeWordWrap]; + [titleLabel setTextColor:[UIColor whiteColor]]; + [titleLabel setBackgroundColor:[UIColor clearColor]]; + [titleLabel setAlpha:1.0]; + [titleLabel setText:title]; + + // size the title label according to the length of the text + CGSize maxSizeTitle = CGSizeMake((self.bounds.size.width * kMaxWidth) - imageWidth, self.bounds.size.height * kMaxHeight); + CGSize expectedSizeTitle = [title sizeWithFont:titleLabel.font constrainedToSize:maxSizeTitle lineBreakMode:titleLabel.lineBreakMode]; + [titleLabel setFrame:CGRectMake(0, 0, expectedSizeTitle.width, expectedSizeTitle.height)]; + } + + if (message != nil) { + messageLabel = [[[UILabel alloc] init] autorelease]; + [messageLabel setNumberOfLines:kMaxMessageLines]; + [messageLabel setFont:[UIFont systemFontOfSize:kFontSize]]; + [messageLabel setLineBreakMode:UILineBreakModeWordWrap]; + [messageLabel setTextColor:[UIColor whiteColor]]; + [messageLabel setTextAlignment:UITextAlignmentCenter]; + [messageLabel setBackgroundColor:[UIColor clearColor]]; + [messageLabel setAlpha:1.0]; + [messageLabel setText:message]; + + // size the message label according to the length of the text + CGSize maxSizeMessage = CGSizeMake((self.bounds.size.width * kMaxWidth) - imageWidth, self.bounds.size.height * kMaxHeight); + CGSize expectedSizeMessage = [message sizeWithFont:messageLabel.font constrainedToSize:maxSizeMessage lineBreakMode:messageLabel.lineBreakMode]; + [messageLabel setFrame:CGRectMake(0, 0, expectedSizeMessage.width, expectedSizeMessage.height)]; + } + + // titleLabel frame values + float titleWidth, titleHeight, titleTop, titleLeft; + + if(titleLabel != nil) { + titleWidth = titleLabel.bounds.size.width; + titleHeight = titleLabel.bounds.size.height; + titleTop = kVerticalPadding; + titleLeft = imageLeft + imageWidth + kHorizontalPadding; + } else { + titleWidth = titleHeight = titleTop = titleLeft = 0; + } + + // messageLabel frame values + float messageWidth, messageHeight, messageLeft, messageTop; + + if(messageLabel != nil) { + messageWidth = messageLabel.bounds.size.width; + messageHeight = messageLabel.bounds.size.height; + messageLeft = imageLeft + imageWidth + kHorizontalPadding; + messageTop = titleTop + titleHeight + kVerticalPadding; + } else { + messageWidth = messageHeight = messageLeft = messageTop = 0; + } + + // compare the title & message widths and use the longer value to calculate the size of the wrapper width + // the same logic applies to the x value (left) + float longerWidth = (messageWidth < titleWidth) ? titleWidth : messageWidth; + float longerLeft = (messageLeft < titleLeft) ? titleLeft : messageLeft; + + // if the image width is larger than longerWidth, use the image width to calculate the wrapper width. + // the same logic applies to the wrapper height + float wrapperWidth = ((longerLeft + longerWidth + kHorizontalPadding) < imageWidth + (kHorizontalPadding * 2)) ? imageWidth + (kHorizontalPadding * 2) : (longerLeft + longerWidth + kHorizontalPadding); + float wrapperHeight = ((messageTop + messageHeight + kVerticalPadding) < imageHeight + (kVerticalPadding * 2)) ? imageHeight + (kVerticalPadding * 2) : (messageTop + messageHeight + kVerticalPadding); + + [wrapperView setFrame:CGRectMake(0, 0, wrapperWidth, wrapperHeight)]; + + if(titleLabel != nil) { + [titleLabel setFrame:CGRectMake(titleLeft, titleTop, titleWidth, titleHeight)]; + [wrapperView addSubview:titleLabel]; + } + + if(messageLabel != nil) { + [messageLabel setFrame:CGRectMake(messageLeft, messageTop, messageWidth, messageHeight)]; + [wrapperView addSubview:messageLabel]; + } + + if(imageView != nil) { + [wrapperView addSubview:imageView]; + } + + return wrapperView; +} + +@end diff --git a/client/iOS/AppDelegate.h b/client/iOS/AppDelegate.h new file mode 100644 index 000000000..7c751ed52 --- /dev/null +++ b/client/iOS/AppDelegate.h @@ -0,0 +1,22 @@ +/* + App delegate + + 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 + +@class MainTabBarController; + +@interface AppDelegate : NSObject { + + MainTabBarController* _tabBarController; +} + +@property (nonatomic, retain) IBOutlet UIWindow *window; +@property (nonatomic, retain) IBOutlet MainTabBarController* tabBarController; + +@end diff --git a/client/iOS/AppDelegate.m b/client/iOS/AppDelegate.m new file mode 100644 index 000000000..a51410c5a --- /dev/null +++ b/client/iOS/AppDelegate.m @@ -0,0 +1,106 @@ +/* + App delegate + + 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 "AppDelegate.h" + +#import "AboutController.h" +#import "HelpController.h" +#import "BookmarkListController.h" +#import "AppSettingsController.h" +#import "MainTabBarController.h" +#import "Utils.h" + +@implementation AppDelegate + + +@synthesize window = _window, tabBarController = _tabBarController; + + +- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions +{ + // Set default values for most NSUserDefaults + [[NSUserDefaults standardUserDefaults] registerDefaults:[NSDictionary dictionaryWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"Defaults" ofType:@"plist"]]]; + + // init global settings + SetSwapMouseButtonsFlag([[NSUserDefaults standardUserDefaults] boolForKey:@"ui.swap_mouse_buttons"]); + SetInvertScrollingFlag([[NSUserDefaults standardUserDefaults] boolForKey:@"ui.invert_scrolling"]); + + // create bookmark view and navigation controller + BookmarkListController* bookmarkListController = [[[BookmarkListController alloc] initWithNibName:@"BookmarkListView" bundle:nil] autorelease]; + UINavigationController* bookmarkNavigationController = [[[UINavigationController alloc] initWithRootViewController:bookmarkListController] autorelease]; + + // create app settings view and navigation controller + AppSettingsController* appSettingsController = [[[AppSettingsController alloc] initWithStyle:UITableViewStyleGrouped] autorelease]; + UINavigationController* appSettingsNavigationController = [[[UINavigationController alloc] initWithRootViewController:appSettingsController] autorelease]; + + // create help view controller + HelpController* helpViewController = [[[HelpController alloc] initWithNibName:nil bundle:nil] autorelease]; + + // create about view controller + AboutController* aboutViewController = [[[AboutController alloc] initWithNibName:nil bundle:nil] autorelease]; + + // add tab-bar controller to the main window and display everything + NSArray* tabItems = [NSArray arrayWithObjects:bookmarkNavigationController, appSettingsNavigationController, helpViewController, aboutViewController, nil]; + [_tabBarController setViewControllers:tabItems]; + if ([_window respondsToSelector:@selector(setRootViewController:)]) + [_window setRootViewController:_tabBarController]; + else + [_window addSubview:[_tabBarController view]]; + [_window makeKeyAndVisible]; + + return YES; +} + +- (void)applicationWillResignActive:(UIApplication *)application +{ + /* + Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state. + Use this method to pause ongoing tasks, disable timers, and throttle down OpenGL ES frame rates. Games should use this method to pause the game. + */ +} + +- (void)applicationDidEnterBackground:(UIApplication *)application +{ + /* + Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later. + If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits. + */ +} + +- (void)applicationWillEnterForeground:(UIApplication *)application +{ + /* + Called as part of the transition from the background to the inactive state; here you can undo many of the changes made on entering the background. + */ + // cancel disconnect timer +} + +- (void)applicationDidBecomeActive:(UIApplication *)application +{ + /* + Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface. + */ +} + +- (void)applicationWillTerminate:(UIApplication *)application +{ + /* + Called when the application is about to terminate. + Save data if appropriate. + See also applicationDidEnterBackground:. + */ +} + +- (void)dealloc +{ + [_window release]; + [super dealloc]; +} + +@end diff --git a/client/iOS/CMakeLists.txt b/client/iOS/CMakeLists.txt new file mode 100644 index 000000000..0dd5b20d6 --- /dev/null +++ b/client/iOS/CMakeLists.txt @@ -0,0 +1,54 @@ +# FreeRDP: A Remote Desktop Protocol Implementation +# Android Client +# +# Copyright 2012 Marc-Andre Moreau +# 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. + +set(IOS_SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}) +set(IOS_PACKAGE_NAME "iFreeRDP") + +CONFIGURE_FILE(${CMAKE_CURRENT_SOURCE_DIR}/iFreeRDP.xcodeproj/project.pbxproj.cmake ${CMAKE_CURRENT_SOURCE_DIR}/iFreeRDP.xcodeproj/project.pbxproj @ONLY) + +if(IOS_BUILD_OBJC) + # And isn't shiped with the android ndk/sdk so + # we need to find it on the local machine + SET(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER, BOTH) + find_program(XCODEBUILD_COMMAND xcodebuild) + SET(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER, ONLY) + + if(XCODEBUILD_COMMAND STREQUAL "XCODEBUILD_COMMAND-NOTFOUND") + message(FATAL_ERROR "xcodebuild not found but required to build ios objective-c") + endif() + + if(IOS_BUILD_OBJC_DEBUG) + set(IOS_BUILD_TYPE "Debug") + else() + set(IOS_BUILD_TYPE "Release") + endif() + + set(IOS_APP_OUTPUT_DIR "${IOS_SOURCE_DIR}/bin/${IOS_BUILD_TYPE}") + set(IOS_APP "${IOS_APP_OUTPUT_DIR}/${IOS_PACKAGE_NAME}.app") + + # command to create the ios package + add_custom_command( + OUTPUT "${IOS_APP}" + COMMAND ${XCODEBUILD_COMMAND} -project "${IOS_SOURCE_DIR}/iFreeRDP.xcodeproj" -sdk ${CMAKE_IOS_SDK_ROOT} -configuration ${IOS_BUILD_TYPE} CONFIGURATION_BUILD_DIR="${IOS_APP_OUTPUT_DIR}" + WORKING_DIRECTORY "${IOS_SOURCE_DIR}" + MAIN_DEPENDENCY ${CMAKE_CURRENT_SOURCE_DIR}/iFreeRDP.xcodeproj/project.pbxproj + DEPENDS freerdp winpr + ) + add_custom_target(ios-package ALL SOURCES "${IOS_APP}") + SET_DIRECTORY_PROPERTIES(PROPERTIES ADDITIONAL_MAKE_CLEAN_FILES "bin;build") +endif() diff --git a/client/iOS/Controllers/AboutController.h b/client/iOS/Controllers/AboutController.h new file mode 100644 index 000000000..0ace59c13 --- /dev/null +++ b/client/iOS/Controllers/AboutController.h @@ -0,0 +1,19 @@ +/* + Application info controller + + 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 AboutController : UIViewController +{ + NSString* last_link_clicked; + UIWebView* webView; +} + +@end diff --git a/client/iOS/Controllers/AboutController.m b/client/iOS/Controllers/AboutController.m new file mode 100644 index 000000000..fe4ba3189 --- /dev/null +++ b/client/iOS/Controllers/AboutController.m @@ -0,0 +1,99 @@ +/* + Application info controller + + 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 "AboutController.h" +#import "Utils.h" + +@implementation AboutController + + // The designated initializer. Override if you create the controller programmatically and want to perform customization that is not appropriate for viewDidLoad. +- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil { + if ((self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil])) { + + // set title and tab-bar image + [self setTitle:NSLocalizedString(@"About", @"About Controller title")]; + UIImage* tabBarIcon = [UIImage imageWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"tabbar_icon_about" ofType:@"png"]]; + [self setTabBarItem:[[UITabBarItem alloc] initWithTitle:NSLocalizedString(@"About", @"Tabbar item about") image:tabBarIcon tag:0]]; + + last_link_clicked = nil; + } + return self; +} + +- (void)dealloc +{ + [super dealloc]; + [last_link_clicked release]; +} + +// Implement loadView to create a view hierarchy programmatically, without using a nib. +- (void)loadView +{ + webView = [[[UIWebView alloc] initWithFrame:CGRectZero] autorelease]; + [webView setAutoresizingMask:(UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight)]; + [webView setAutoresizesSubviews:YES]; + [webView setDelegate:self]; + [webView setDataDetectorTypes:UIDataDetectorTypeNone]; + [self setView:webView]; +} + + + +// Implement viewDidLoad to do additional setup after loading the view, typically from a nib. +- (void)viewDidLoad +{ + [super viewDidLoad]; + + NSString *filename = (IsPhone() ? @"about_phone" : @"about"); + NSString *htmlString = [[[NSString alloc] initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:filename ofType:@"html" inDirectory:@"about_page"] encoding:NSUTF8StringEncoding error:nil] autorelease]; + + [webView loadHTMLString:[NSString stringWithFormat:htmlString, + TSXAppFullVersion(), + [[UIDevice currentDevice] systemName], + [[UIDevice currentDevice] systemVersion], + [[UIDevice currentDevice] model]] baseURL:[NSURL fileURLWithPath:[[[NSBundle mainBundle] bundlePath] stringByAppendingPathComponent:@"about_page"]]]; +} + +// Override to allow orientations other than the default portrait orientation. +- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation { + return YES; +} + +#pragma mark - +#pragma mark UIWebView callbacks +- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType +{ + if([[request URL] isFileURL]) + return YES; + + if(navigationType == UIWebViewNavigationTypeLinkClicked) + { + [last_link_clicked release]; + last_link_clicked = [[[request URL] absoluteString] retain]; + UIAlertView *alert = [[UIAlertView alloc] initWithTitle:NSLocalizedString(@"External Link", @"External Link Alert Title") + message:[NSString stringWithFormat:NSLocalizedString(@"Open [%@] in Browser?", @"Open link in browser (with link as parameter)"), last_link_clicked] + delegate:self + cancelButtonTitle:NSLocalizedString(@"OK", @"OK Button") + otherButtonTitles:NSLocalizedString(@"No", @"No Button"), nil]; + [alert show]; + [alert release]; + + return NO; + } + return YES; +} + +#pragma mark UIAlertView delegate +- (void)alertView:(UIAlertView *)alertView didDismissWithButtonIndex:(NSInteger)buttonIndex +{ + if (buttonIndex == 0) + [[UIApplication sharedApplication] openURL:[NSURL URLWithString:last_link_clicked]]; +} + +@end diff --git a/client/iOS/Controllers/AdvancedBookmarkEditorController.h b/client/iOS/Controllers/AdvancedBookmarkEditorController.h new file mode 100644 index 000000000..109634920 --- /dev/null +++ b/client/iOS/Controllers/AdvancedBookmarkEditorController.h @@ -0,0 +1,25 @@ +/* + Controller to edit advanced bookmark settings + + 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 "EditorBaseController.h" + +@class ComputerBookmark; +@class ConnectionParams; + +@interface AdvancedBookmarkEditorController : EditorBaseController +{ +@private + ComputerBookmark* _bookmark; + ConnectionParams* _params; +} + +// init for the given bookmark +- (id)initWithBookmark:(ComputerBookmark*)bookmark; + +@end diff --git a/client/iOS/Controllers/AdvancedBookmarkEditorController.m b/client/iOS/Controllers/AdvancedBookmarkEditorController.m new file mode 100644 index 000000000..17b9750ba --- /dev/null +++ b/client/iOS/Controllers/AdvancedBookmarkEditorController.m @@ -0,0 +1,310 @@ +/* + Controller to edit advanced bookmark settings + + 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 "AdvancedBookmarkEditorController.h" +#import "Bookmark.h" +#import "Utils.h" +#import "EditorSelectionController.h" +#import "ScreenSelectionController.h" +#import "PerformanceEditorController.h" + +@interface AdvancedBookmarkEditorController () + +@end + +#define SECTION_ADVANCED_SETTINGS 0 +#define SECTION_COUNT 1 + +@implementation AdvancedBookmarkEditorController + +- (id)initWithBookmark:(ComputerBookmark*)bookmark +{ + if ((self = [super initWithStyle:UITableViewStyleGrouped])) + { + // set additional settings state according to bookmark data + _bookmark = [bookmark retain]; + _params = [bookmark params]; + } + return self; +} + +- (void)viewDidLoad +{ + [super viewDidLoad]; + [self setTitle:NSLocalizedString(@"Advanced Settings", @"Advanced Settings title")]; +} + +- (void)viewWillAppear:(BOOL)animated +{ + [super viewWillAppear:animated]; + + // we need to reload the table view data here to have up-to-date data for the + // advanced settings accessory items (like for resolution/color mode settings) + [[self tableView] reloadData]; +} + +- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation +{ + return YES; +} + +#pragma mark - +#pragma mark Table view data source + +- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { + // Return the number of sections. + return SECTION_COUNT; +} + + +- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { + // Return the number of rows in the section. + switch (section) + { + case SECTION_ADVANCED_SETTINGS: // advanced settings + return 7; + default: + break; + } + + return 0; +} + + +// set section headers +- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section +{ + switch(section) + { + case SECTION_ADVANCED_SETTINGS: + return NSLocalizedString(@"Advanced", @"'Advanced': advanced settings header"); + } + return @"unknown"; +} + + +// Customize the appearance of table view cells. +- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { + + // determine the required cell type + NSString* cellType = nil; + switch([indexPath section]) + { + case SECTION_ADVANCED_SETTINGS: // advanced settings + { + switch([indexPath row]) + { + case 0: // 3G Settings + cellType = TableCellIdentifierYesNo; + break; + case 1: // 3G screen/color depth + cellType = TableCellIdentifierSelection; + break; + case 2: // 3G performance settings + cellType = TableCellIdentifierSubEditor; + break; + case 3: // security mode + cellType = TableCellIdentifierSelection; + break; + case 4: // remote program + case 5: // work dir + cellType = TableCellIdentifierText; + break; + case 6: // console mode + cellType = TableCellIdentifierYesNo; + break; + default: + break; + } + break; + } + } + NSAssert(cellType != nil, @"Couldn't determine cell type"); + + // get the table view cell + UITableViewCell *cell = [self tableViewCellFromIdentifier:cellType]; + NSAssert(cell, @"Invalid cell"); + + // set cell values + switch([indexPath section]) + { + // advanced settings + case SECTION_ADVANCED_SETTINGS: + [self initAdvancedSettings:indexPath cell:cell]; + break; + + default: + break; + } + + return cell; +} + +// updates advanced settings in the UI +- (void)initAdvancedSettings:(NSIndexPath*)indexPath cell:(UITableViewCell*)cell +{ + BOOL enable_3G_settings = [_params boolForKey:@"enable_3g_settings"]; + switch(indexPath.row) + { + case 0: + { + EditFlagTableViewCell* flagCell = (EditFlagTableViewCell*)cell; + [[flagCell label] setText:NSLocalizedString(@"3G Settings", @"'3G Settings': Bookmark enable 3G settings")]; + [[flagCell toggle] setTag:GET_TAG_FROM_PATH(indexPath)]; + [[flagCell toggle] setOn:[_params boolForKey:@"enable_3g_settings"]]; + [[flagCell toggle] addTarget:self action:@selector(toggleSettingValue:) forControlEvents:UIControlEventValueChanged]; + break; + } + case 1: + { + EditSelectionTableViewCell* selCell = (EditSelectionTableViewCell*)cell; + [[selCell label] setText:NSLocalizedString(@"3G Screen", @"'3G Screen': Bookmark 3G Screen settings")]; + NSString* resolution = ScreenResolutionDescription([_params intForKeyPath:@"settings_3g.screen_resolution_type"], [_params intForKeyPath:@"settings_3g.width"], [_params intForKeyPath:@"settings_3g.height"]); + int colorBits = [_params intForKeyPath:@"settings_3g.colors"]; + [[selCell selection] setText:[NSString stringWithFormat:@"%@@%d", resolution, colorBits]]; + [[selCell label] setEnabled:enable_3G_settings]; + [[selCell selection] setEnabled:enable_3G_settings]; + [selCell setSelectionStyle:enable_3G_settings ? UITableViewCellSelectionStyleBlue : UITableViewCellSelectionStyleNone]; + break; + } + case 2: + { + EditSubEditTableViewCell* editCell = (EditSubEditTableViewCell*)cell; + [[editCell label] setText:NSLocalizedString(@"3G Performance", @"'3G Performance': Bookmark 3G Performance Settings")]; + [[editCell label] setEnabled:enable_3G_settings]; + [editCell setSelectionStyle:enable_3G_settings ? UITableViewCellSelectionStyleBlue : UITableViewCellSelectionStyleNone]; + break; + } + case 3: + { + EditSelectionTableViewCell* selCell = (EditSelectionTableViewCell*)cell; + [[selCell label] setText:NSLocalizedString(@"Security", @"'Security': Bookmark protocl security settings")]; + [[selCell selection] setText:ProtocolSecurityDescription([_params intForKey:@"security"])]; + break; + } + case 4: + { + EditTextTableViewCell* textCell = (EditTextTableViewCell*)cell; + [[textCell label] setText:NSLocalizedString(@"Remote Program", @"'Remote Program': Bookmark remote program settings")]; + [[textCell textfield] setText:[_params StringForKey:@"remote_program"]]; + [[textCell textfield] setTag:GET_TAG_FROM_PATH(indexPath)]; + [[textCell textfield] setPlaceholder:NSLocalizedString(@"not set", @"not set placeholder")]; + [self adjustEditTextTableViewCell:textCell]; + break; + } + case 5: + { + EditTextTableViewCell* textCell = (EditTextTableViewCell*)cell; + [[textCell label] setText:NSLocalizedString(@"Working Directory", @"'Working Directory': Bookmark working directory settings")]; + [[textCell textfield] setText:[_params StringForKey:@"working_dir"]]; + [[textCell textfield] setTag:GET_TAG_FROM_PATH(indexPath)]; + [[textCell textfield] setPlaceholder:NSLocalizedString(@"not set", @"not set placeholder")]; + [self adjustEditTextTableViewCell:textCell]; + break; + } + case 6: + { + EditFlagTableViewCell* flagCell = (EditFlagTableViewCell*)cell; + [[flagCell label] setText:NSLocalizedString(@"Console Mode", @"'Console Mode': Bookmark console mode settings")]; + [[flagCell toggle] setTag:GET_TAG_FROM_PATH(indexPath)]; + [[flagCell toggle] setOn:[_params boolForKey:@"console"]]; + [[flagCell toggle] addTarget:self action:@selector(toggleSettingValue:) forControlEvents:UIControlEventValueChanged]; + break; + } + default: + NSLog(@"Invalid row index in settings table!"); + break; + } +} + +#pragma mark - +#pragma mark Table view delegate + +- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { + UIViewController* viewCtrl = nil; + + // determine view + switch ([indexPath row]) + { + case 1: + if ([_params boolForKey:@"enable_3g_settings"]) + viewCtrl = [[[ScreenSelectionController alloc] initWithConnectionParams:_params keyPath:@"settings_3g"] autorelease]; + break; + case 2: + if ([_params boolForKey:@"enable_3g_settings"]) + viewCtrl = [[[PerformanceEditorController alloc] initWithConnectionParams:_params keyPath:@"settings_3g"] autorelease]; + break; + case 3: + viewCtrl = [[[EditorSelectionController alloc] initWithConnectionParams:_params entries:[NSArray arrayWithObject:@"security"] selections:[NSArray arrayWithObject:SelectionForSecuritySetting()]] autorelease]; + break; + default: + break; + } + + // display view + if(viewCtrl) + [[self navigationController] pushViewController:viewCtrl animated:YES]; +} + + +#pragma mark - +#pragma mark Text Field delegate + +- (BOOL)textFieldShouldReturn:(UITextField*)textField +{ + [textField resignFirstResponder]; + return NO; +} + +- (BOOL)textFieldShouldEndEditing:(UITextField *)textField +{ + switch(textField.tag) + { + // update remote program/work dir settings + case GET_TAG(SECTION_ADVANCED_SETTINGS, 4): + { + [_params setValue:[textField text] forKey:@"remote_program"]; + break; + } + + case GET_TAG(SECTION_ADVANCED_SETTINGS, 5): + { + [_params setValue:[textField text] forKey:@"working_dir"]; + break; + } + + default: + break; + } + return YES; +} + +#pragma mark - Action handlers + +- (void)toggleSettingValue:(id)sender +{ + UISwitch* valueSwitch = (UISwitch*)sender; + switch(valueSwitch.tag) + { + case GET_TAG(SECTION_ADVANCED_SETTINGS, 0): + [_params setBool:[valueSwitch isOn] forKey:@"enable_3g_settings"]; + NSArray* indexPaths = [NSArray arrayWithObjects:[NSIndexPath indexPathForRow:1 inSection:SECTION_ADVANCED_SETTINGS], [NSIndexPath indexPathForRow:2 inSection:SECTION_ADVANCED_SETTINGS], nil]; + [[self tableView] reloadRowsAtIndexPaths:indexPaths withRowAnimation:UITableViewRowAnimationNone]; + break; + + case GET_TAG(SECTION_ADVANCED_SETTINGS, 6): + [_params setBool:[valueSwitch isOn] forKey:@"console"]; + break; + + default: + break; + } +} + +@end diff --git a/client/iOS/Controllers/AppSettingsController.h b/client/iOS/Controllers/AppSettingsController.h new file mode 100644 index 000000000..d962f8ddb --- /dev/null +++ b/client/iOS/Controllers/AppSettingsController.h @@ -0,0 +1,14 @@ +/* + Controller to specify application wide settings + + 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 "EditorBaseController.h" + +@interface AppSettingsController : EditorBaseController + +@end diff --git a/client/iOS/Controllers/AppSettingsController.m b/client/iOS/Controllers/AppSettingsController.m new file mode 100644 index 000000000..5eaa75807 --- /dev/null +++ b/client/iOS/Controllers/AppSettingsController.m @@ -0,0 +1,309 @@ +/* + Controller to specify application wide settings + + 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 "AppSettingsController.h" +#import "Utils.h" +#import "Toast+UIView.h" + +@implementation AppSettingsController + +// keep this up-to-date for correct section display/hidding +#define SECTION_UI_SETTINGS 0 +#define SECTION_CERTIFICATE_HANDLING_SETTINGS 1 +#define SECTION_NUM_SECTIONS 2 + +#pragma mark - +#pragma mark Initialization + + +- (id)initWithStyle:(UITableViewStyle)style +{ + if ((self = [super initWithStyle:style])) + { + UIImage* tabBarIcon = [UIImage imageWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"tabbar_icon_settings" ofType:@"png"]]; + [self setTabBarItem:[[UITabBarItem alloc] initWithTitle:NSLocalizedString(@"Settings", @"Tabbar item settings") image:tabBarIcon tag:0]]; + } + return self; +} + +#pragma mark - +#pragma mark View lifecycle + +- (void)viewDidLoad { + [super viewDidLoad]; + + // set title + [self setTitle:NSLocalizedString(@"Settings", @"App Settings title")]; +} + + +- (void)viewWillDisappear:(BOOL)animated { + [super viewWillDisappear:animated]; +} + +// Override to allow orientations other than the default portrait orientation. +- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation { + return YES; +} + + +- (void)dealloc { + [[NSNotificationCenter defaultCenter] removeObserver:self]; + [super dealloc]; +} + +#pragma mark - +#pragma mark Table view data source + + +- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { + // Return the number of sections. + return SECTION_NUM_SECTIONS; +} + + +- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { + // Return the number of rows in the section. + switch (section) + { + case SECTION_UI_SETTINGS: // UI settings + return 5; + case SECTION_CERTIFICATE_HANDLING_SETTINGS: // certificate handling settings + return 2; + default: + break; + } + + return 0; +} + + +// set section headers +- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section +{ + switch(section) + { + case SECTION_UI_SETTINGS: + return NSLocalizedString(@"User Interface", @"UI settings section title"); + case SECTION_CERTIFICATE_HANDLING_SETTINGS: + return NSLocalizedString(@"Server Certificate Handling", @"Server Certificate Handling section title"); + default: + return nil; + } + return @"unknown"; +} + +// Customize the appearance of table view cells. +- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { + + // determine the required cell type + NSString* cellIdentifier = nil; + switch([indexPath section]) + { + case SECTION_UI_SETTINGS: + { + switch([indexPath row]) + { + case 0: + case 1: + case 2: + case 3: + case 4: + cellIdentifier = TableCellIdentifierYesNo; + break; + } + break; + } + case SECTION_CERTIFICATE_HANDLING_SETTINGS: + { + switch([indexPath row]) + { + case 0: + cellIdentifier = TableCellIdentifierYesNo; + break; + case 1: + cellIdentifier = TableCellIdentifierSubEditor; + break; + } + break; + } + } + NSAssert(cellIdentifier != nil, @"Couldn't determine cell type"); + + // get the table view cell + UITableViewCell *cell = [self tableViewCellFromIdentifier:cellIdentifier]; + NSAssert(cell, @"Invalid cell"); + + // set cell values + switch([indexPath section]) + { + case SECTION_UI_SETTINGS: + [self initUISettings:indexPath cell:cell]; + break; + + case SECTION_CERTIFICATE_HANDLING_SETTINGS: + [self initCertificateHandlingSettings:indexPath cell:cell]; + break; + + default: + break; + } + + return cell; +} + +#pragma mark - Initialization helpers + +// updates UI settings in the UI +- (void)initUISettings:(NSIndexPath*)indexPath cell:(UITableViewCell*)cell +{ + switch([indexPath row]) + { + case 0: + { + EditFlagTableViewCell* flagCell = (EditFlagTableViewCell*)cell; + [[flagCell label] setText:NSLocalizedString(@"Hide Status Bar", "Show/Hide Phone Status Bar setting")]; + [[flagCell toggle] setTag:GET_TAG_FROM_PATH(indexPath)]; + [[flagCell toggle] setOn:[[NSUserDefaults standardUserDefaults] boolForKey:@"ui.hide_status_bar"]]; + [[flagCell toggle] addTarget:self action:@selector(toggleSettingValue:) forControlEvents:UIControlEventValueChanged]; + break; + } + case 1: + { + EditFlagTableViewCell* flagCell = (EditFlagTableViewCell*)cell; + [[flagCell label] setText:NSLocalizedString(@"Hide Tool Bar", "Show/Hide Tool Bar setting")]; + [[flagCell toggle] setTag:GET_TAG_FROM_PATH(indexPath)]; + [[flagCell toggle] setOn:[[NSUserDefaults standardUserDefaults] boolForKey:@"ui.hide_tool_bar"]]; + [[flagCell toggle] addTarget:self action:@selector(toggleSettingValue:) forControlEvents:UIControlEventValueChanged]; + break; + } + case 2: + { + EditFlagTableViewCell* flagCell = (EditFlagTableViewCell*)cell; + [[flagCell label] setText:NSLocalizedString(@"Swap Mouse Buttons", "Swap Mouse Button UI setting")]; + [[flagCell toggle] setTag:GET_TAG_FROM_PATH(indexPath)]; + [[flagCell toggle] setOn:[[NSUserDefaults standardUserDefaults] boolForKey:@"ui.swap_mouse_buttons"]]; + [[flagCell toggle] addTarget:self action:@selector(toggleSettingValue:) forControlEvents:UIControlEventValueChanged]; + break; + } + case 3: + { + EditFlagTableViewCell* flagCell = (EditFlagTableViewCell*)cell; + [[flagCell label] setText:NSLocalizedString(@"Invert Scrolling", "Invert Scrolling UI setting")]; + [[flagCell toggle] setTag:GET_TAG_FROM_PATH(indexPath)]; + [[flagCell toggle] setOn:[[NSUserDefaults standardUserDefaults] boolForKey:@"ui.invert_scrolling"]]; + [[flagCell toggle] addTarget:self action:@selector(toggleSettingValue:) forControlEvents:UIControlEventValueChanged]; + break; + } + case 4: + { + EditFlagTableViewCell* flagCell = (EditFlagTableViewCell*)cell; + [[flagCell label] setText:NSLocalizedString(@"Touch Pointer Auto Scroll", "Touch Pointer Auto Scroll UI setting")]; + [[flagCell toggle] setTag:GET_TAG_FROM_PATH(indexPath)]; + [[flagCell toggle] setOn:[[NSUserDefaults standardUserDefaults] boolForKey:@"ui.auto_scroll_touchpointer"]]; + [[flagCell toggle] addTarget:self action:@selector(toggleSettingValue:) forControlEvents:UIControlEventValueChanged]; + break; + } + default: + NSLog(@"Invalid row index in settings table!"); + break; + } +} + +// updates certificate handling settings in the UI +- (void)initCertificateHandlingSettings:(NSIndexPath*)indexPath cell:(UITableViewCell*)cell +{ + switch([indexPath row]) + { + case 0: + { + EditFlagTableViewCell* flagCell = (EditFlagTableViewCell*)cell; + [[flagCell label] setText:NSLocalizedString(@"Accept all Certificates", "Accept All Certificates setting")]; + [[flagCell toggle] setTag:GET_TAG_FROM_PATH(indexPath)]; + [[flagCell toggle] setOn:[[NSUserDefaults standardUserDefaults] boolForKey:@"security.accept_certificates"]]; + [[flagCell toggle] addTarget:self action:@selector(toggleSettingValue:) forControlEvents:UIControlEventValueChanged]; + break; + } + case 1: + { + EditSubEditTableViewCell* subCell = (EditSubEditTableViewCell*)cell; + [[subCell label] setText:NSLocalizedString(@"Erase Certificate Cache", @"Erase certificate cache button")]; + break; + } + default: + NSLog(@"Invalid row index in settings table!"); + break; + } +} + +#pragma mark - +#pragma mark Table view delegate + +- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { + + // deselect any row to fake a button-pressed like effect + [tableView deselectRowAtIndexPath:indexPath animated:YES]; + + // ensure everything is stored in our settings before we proceed + [[self view] endEditing:NO]; + + // clear certificate cache + if([indexPath section] == SECTION_CERTIFICATE_HANDLING_SETTINGS && [indexPath row] == 1) + { + // delete certificates cache + NSError* err; + if ([[NSFileManager defaultManager] removeItemAtPath:[[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject] stringByAppendingPathComponent:@"/.freerdp"] error:&err]) + [[self view] makeToast:NSLocalizedString(@"Certificate Cache cleared!", @"Clear Certificate cache success message") duration:ToastDurationNormal position:@"center"]; + else + [[self view] makeToast:NSLocalizedString(@"Error clearing the Certificate Cache!", @"Clear Certificate cache failed message") duration:ToastDurationNormal position:@"center"]; + } +} + +#pragma mark - +#pragma mark Action Handlers + +- (void)toggleSettingValue:(id)sender +{ + UISwitch* valueSwitch = (UISwitch*)sender; + switch([valueSwitch tag]) + { + case GET_TAG(SECTION_UI_SETTINGS, 0): + [[NSUserDefaults standardUserDefaults] setBool:[valueSwitch isOn] forKey:@"ui.hide_status_bar"]; + break; + + case GET_TAG(SECTION_UI_SETTINGS, 1): + [[NSUserDefaults standardUserDefaults] setBool:[valueSwitch isOn] forKey:@"ui.hide_tool_bar"]; + break; + + case GET_TAG(SECTION_UI_SETTINGS, 2): + [[NSUserDefaults standardUserDefaults] setBool:[valueSwitch isOn] forKey:@"ui.swap_mouse_buttons"]; + SetSwapMouseButtonsFlag([valueSwitch isOn]); + break; + + case GET_TAG(SECTION_UI_SETTINGS, 3): + [[NSUserDefaults standardUserDefaults] setBool:[valueSwitch isOn] forKey:@"ui.invert_scrolling"]; + SetInvertScrollingFlag([valueSwitch isOn]); + break; + + case GET_TAG(SECTION_UI_SETTINGS, 4): + [[NSUserDefaults standardUserDefaults] setBool:[valueSwitch isOn] forKey:@"ui.auto_scroll_touchpointer"]; + SetInvertScrollingFlag([valueSwitch isOn]); + break; + + case GET_TAG(SECTION_CERTIFICATE_HANDLING_SETTINGS, 0): + [[NSUserDefaults standardUserDefaults] setBool:[valueSwitch isOn] forKey:@"security.accept_certificates"]; + break; + + default: + break; + } +} + +@end + diff --git a/client/iOS/Controllers/BookmarkEditorController.h b/client/iOS/Controllers/BookmarkEditorController.h new file mode 100644 index 000000000..1ca68d3e4 --- /dev/null +++ b/client/iOS/Controllers/BookmarkEditorController.h @@ -0,0 +1,40 @@ +/* + Bookmark editor controller + + 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 "EditorBaseController.h" + +@class ComputerBookmark; +@class ConnectionParams; + + +@protocol BookmarkEditorDelegate +// bookmark editing finsihed +- (void)commitBookmark:(ComputerBookmark*)bookmark; +@end + + +@interface BookmarkEditorController : EditorBaseController +{ +@private + ComputerBookmark* _bookmark; + ConnectionParams* _params; + + BOOL _display_server_settings; + + id delegate; +} + +@property (nonatomic, assign) id delegate; + +// init for the given bookmark +- (id)initWithBookmark:(ComputerBookmark*)bookmark; + +@end diff --git a/client/iOS/Controllers/BookmarkEditorController.m b/client/iOS/Controllers/BookmarkEditorController.m new file mode 100644 index 000000000..de80c50d3 --- /dev/null +++ b/client/iOS/Controllers/BookmarkEditorController.m @@ -0,0 +1,400 @@ +/* + Bookmark editor controller + + 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 "BookmarkEditorController.h" +#import "Bookmark.h" +#import "Utils.h" +#import "ScreenSelectionController.h" +#import "PerformanceEditorController.h" +#import "CredentialsEditorController.h" +#import "AdvancedBookmarkEditorController.h" + +@implementation BookmarkEditorController + +@synthesize delegate; + +#define SECTION_SERVER 0 +#define SECTION_CREDENTIALS 1 +#define SECTION_SETTINGS 2 +#define SECTION_COUNT 3 + +#pragma mark - +#pragma mark Initialization + +- (id)initWithBookmark:(ComputerBookmark*)bookmark +{ + if ((self = [super initWithStyle:UITableViewStyleGrouped])) + { + // set additional settings state according to bookmark data + _bookmark = [bookmark retain]; + _params = [bookmark params]; + + // if this is a TSX Connect bookmark - disable server settings + if([_bookmark isKindOfClass:NSClassFromString(@"TSXConnectComputerBookmark")]) + _display_server_settings = NO; + else + _display_server_settings = YES; + } + return self; +} + + +#pragma mark - +#pragma mark View lifecycle + + +- (void)viewDidLoad { + [super viewDidLoad]; + + // replace back button with a custom handler that checks if the required bookmark settings were specified + UIBarButtonItem* saveButton = [[[UIBarButtonItem alloc] initWithTitle:NSLocalizedString(@"Save", @"Save Button title") style:UIBarButtonItemStyleDone target:self action:@selector(handleSave:)] autorelease]; + UIBarButtonItem* cancelButton = [[[UIBarButtonItem alloc] initWithTitle:NSLocalizedString(@"Cancel", @"Cancel Button title") style:UIBarButtonItemStyleBordered target:self action:@selector(handleCancel:)] autorelease]; + [[self navigationItem] setLeftBarButtonItem:cancelButton]; + [[self navigationItem] setRightBarButtonItem:saveButton]; +} + +- (void)viewWillAppear:(BOOL)animated { + [super viewWillAppear:animated]; + + // we need to reload the table view data here to have up-to-date data for the + // advanced settings accessory items (like for resolution/color mode settings) + [[self tableView] reloadData]; +} + +// Override to allow orientations other than the default portrait orientation. +- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation { + return YES; +} + +#pragma mark - +#pragma mark Table view data source + +- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { + // Return the number of sections. + return SECTION_COUNT; +} + + +- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { + // Return the number of rows in the section. + switch (section) + { + case SECTION_SERVER: // server settings + return (_display_server_settings ? 3 : 0); + case SECTION_CREDENTIALS: // credentials + return 1; + case SECTION_SETTINGS: // session settings + return 3; + default: + break; + } + + return 0; +} + + +// set section headers +- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section +{ + switch(section) + { + case SECTION_SERVER: + return (_display_server_settings ? NSLocalizedString(@"Host", @"'Host': host settings header") : nil); + case SECTION_CREDENTIALS: + return NSLocalizedString(@"Credentials", @"'Credentials': credentials settings header"); + case SECTION_SETTINGS: + return NSLocalizedString(@"Settings", @"'Session Settings': session settings header"); + } + return @"unknown"; +} + + +// Customize the appearance of table view cells. +- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { + + // determine the required cell type + NSString* cellType = nil; + switch([indexPath section]) + { + case SECTION_SERVER: + cellType = TableCellIdentifierText; + break; + + case SECTION_CREDENTIALS: + cellType = TableCellIdentifierSelection; + break; + + case SECTION_SETTINGS: // settings + { + switch([indexPath row]) + { + case 0: // screen/color depth + cellType = TableCellIdentifierSelection; + break; + case 1: // performance settings + case 2: // advanced settings + cellType = TableCellIdentifierSubEditor; + break; + default: + break; + } + } + break; + + default: + break; + } + NSAssert(cellType != nil, @"Couldn't determine cell type"); + + // get the table view cell + UITableViewCell *cell = [self tableViewCellFromIdentifier:cellType]; + NSAssert(cell, @"Invalid cell"); + + // set cell values + switch([indexPath section]) + { + // server settings + case SECTION_SERVER: + [self initServerSettings:indexPath cell:cell]; + break; + + // credentials + case SECTION_CREDENTIALS: + [self initCredentialSettings:indexPath cell:cell]; + break; + + // session settings + case SECTION_SETTINGS: + [self initSettings:indexPath cell:cell]; + break; + + default: + break; + } + + return cell; +} + +// updates server settings in the UI +- (void)initServerSettings:(NSIndexPath*)indexPath cell:(UITableViewCell*)cell +{ + EditTextTableViewCell* textCell = (EditTextTableViewCell*)cell; + [[textCell textfield] setTag:GET_TAG_FROM_PATH(indexPath)]; + switch([indexPath row]) + { + case 0: + [[textCell label] setText:NSLocalizedString(@"Label", @"'Label': Bookmark label")]; + [[textCell textfield] setText:[_bookmark label]]; + [[textCell textfield] setPlaceholder:NSLocalizedString(@"not set", @"not set placeholder")]; + break; + case 1: + [[textCell label] setText:NSLocalizedString(@"Host", @"'Host': Bookmark hostname")]; + [[textCell textfield] setText:[_params StringForKey:@"hostname"]]; + [[textCell textfield] setPlaceholder:NSLocalizedString(@"not set", @"not set placeholder")]; + break; + case 2: + [[textCell label] setText:NSLocalizedString(@"Port", @"'Port': Bookmark port")]; + [[textCell textfield] setText:[NSString stringWithFormat:@"%d", [_params intForKey:@"port"]]]; + [[textCell textfield] setKeyboardType:UIKeyboardTypeNumberPad]; + break; + default: + NSLog(@"Invalid row index in settings table!"); + break; + } + + [self adjustEditTextTableViewCell:textCell]; +} + +// updates credentials in the UI +- (void)initCredentialSettings:(NSIndexPath*)indexPath cell:(UITableViewCell*)cell +{ + EditSelectionTableViewCell* selCell = (EditSelectionTableViewCell*)cell; + switch(indexPath.row) + { + case 0: + [[selCell label] setText:NSLocalizedString(@"Credentials", @"'Credentials': Bookmark credentials")]; + [[selCell selection] setText:[_params StringForKey:@"username"]]; + break; + default: + NSLog(@"Invalid row index in settings table!"); + break; + } +} + +// updates session settings in the UI +- (void)initSettings:(NSIndexPath*)indexPath cell:(UITableViewCell*)cell +{ + switch(indexPath.row) + { + case 0: + { + EditSelectionTableViewCell* selCell = (EditSelectionTableViewCell*)cell; + [[selCell label] setText:NSLocalizedString(@"Screen", @"'Screen': Bookmark Screen settings")]; + NSString* resolution = ScreenResolutionDescription([_params intForKey:@"screen_resolution_type"], [_params intForKey:@"width"], [_params intForKey:@"height"]); + int colorBits = [_params intForKey:@"colors"]; + [[selCell selection] setText:[NSString stringWithFormat:@"%@@%d", resolution, colorBits]]; + break; + } + case 1: + { + EditSubEditTableViewCell* editCell = (EditSubEditTableViewCell*)cell; + [[editCell label] setText:NSLocalizedString(@"Performance", @"'Performance': Bookmark Performance Settings")]; + break; + } + case 2: + { + EditSubEditTableViewCell* editCell = (EditSubEditTableViewCell*)cell; + [[editCell label] setText:NSLocalizedString(@"Advanced", @"'Advanced': Bookmark Advanced Settings")]; + break; + } + default: + NSLog(@"Invalid row index in settings table!"); + break; + } +} + + +#pragma mark - +#pragma mark Table view delegate + +- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { + UIViewController* viewCtrl = nil; + + // determine view + switch([indexPath section]) + { + case SECTION_CREDENTIALS: + { + if ([indexPath row] == 0) + viewCtrl = [[[CredentialsEditorController alloc] initWithBookmark:_bookmark] autorelease]; + break; + } + + case SECTION_SETTINGS: + { + switch ([indexPath row]) + { + case 0: + viewCtrl = [[[ScreenSelectionController alloc] initWithConnectionParams:_params] autorelease]; + break; + case 1: + viewCtrl = [[[PerformanceEditorController alloc] initWithConnectionParams:_params] autorelease]; + break; + case 2: + viewCtrl = [[[AdvancedBookmarkEditorController alloc] initWithBookmark:_bookmark] autorelease]; + break; + default: + break; + } + + break; + } + } + + // display view + if(viewCtrl) + [[self navigationController] pushViewController:viewCtrl animated:YES]; +} + + +#pragma mark - +#pragma mark Text Field delegate + +- (BOOL)textFieldShouldReturn:(UITextField*)textField +{ + [textField resignFirstResponder]; + return NO; +} + +- (BOOL)textFieldShouldEndEditing:(UITextField *)textField +{ + switch(textField.tag) + { + // update server settings + case GET_TAG(SECTION_SERVER, 0): + [_bookmark setLabel:[textField text]]; + break; + + case GET_TAG(SECTION_SERVER, 1): + [_params setValue:[textField text] forKey:@"hostname"]; + break; + + case GET_TAG(SECTION_SERVER, 2): + [_params setInt:[[textField text] intValue] forKey:@"port"]; + break; + + default: + break; + } + return YES; +} + +#pragma mark - UIAlertViewDelegate methods + +- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex +{ + // clicked yes? + if (buttonIndex == 0) + { + // cancel bookmark editing and return to previous view controller + [[self navigationController] popViewControllerAnimated:YES]; + } +} + +#pragma mark - +#pragma mark Action Handlers + +- (void)handleSave:(id)sender +{ + // resign any first responder (so that we finish editing any bookmark parameter that might be currently edited) + [[self view] endEditing:NO]; + + // verify that bookmark is complete (only for manual bookmarks) + if (![_bookmark isKindOfClass:NSClassFromString(@"TSXConnectComputerBookmark")]) + { + if ([[_bookmark label] length] == 0 || [[_params StringForKey:@"hostname"] length] == 0 || [_params intForKey:@"port"] == 0) + { + UIAlertView* alertView = [[[UIAlertView alloc] initWithTitle:NSLocalizedString(@"Cancel without saving?", @"Incomplete bookmark error title") message:NSLocalizedString(@"Press 'Cancel' to abort!\nPress 'Continue' to specify the required fields!", @"Incomplete bookmark error message") delegate:self cancelButtonTitle:NSLocalizedString(@"Cancel", @"Cancel Button") otherButtonTitles:NSLocalizedString(@"Continue", @"Continue Button"), nil] autorelease]; + [alertView show]; + return; + } + } + + // commit bookmark + if ([[self delegate] respondsToSelector:@selector(commitBookmark:)]) + [[self delegate] commitBookmark:_bookmark]; + + // return to previous view controller + [[self navigationController] popViewControllerAnimated:YES]; +} + +- (void)handleCancel:(id)sender +{ + // return to previous view controller + [[self navigationController] popViewControllerAnimated:YES]; +} + +#pragma mark - +#pragma mark Memory management + +- (void)didReceiveMemoryWarning { + // Releases the view if it doesn't have a superview. + [super didReceiveMemoryWarning]; + + // Relinquish ownership any cached data, images, etc that aren't in use. +} + +- (void)dealloc { + [super dealloc]; + [_bookmark autorelease]; +} + + +@end + diff --git a/client/iOS/Controllers/BookmarkListController.h b/client/iOS/Controllers/BookmarkListController.h new file mode 100644 index 000000000..a8a046e94 --- /dev/null +++ b/client/iOS/Controllers/BookmarkListController.h @@ -0,0 +1,59 @@ +/* + bookmarks and active session view controller + + 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 "Bookmark.h" +#import "BookmarkTableCell.h" +#import "SessionTableCell.h" +#import "BookmarkEditorController.h" +#import "Reachability.h" + +@interface BookmarkListController : UIViewController +{ + // custom bookmark and session table cells + BookmarkTableCell* _bmTableCell; + SessionTableCell* _sessTableCell; + + // child views + UISearchBar* _searchBar; + UITableView* _tableView; + + // array with search results (or nil if no search active) + NSMutableArray* _manual_search_result; + NSMutableArray* _tsxconnect_search_result; + NSMutableArray* _history_search_result; + + // bookmark arrays + NSMutableArray* _manual_bookmarks; + NSMutableArray* _tsxconnect_bookmarks; + + // bookmark star images + UIImage* _star_on_img; + UIImage* _star_off_img; + + // array with active sessions + NSMutableArray* _active_sessions; + + // array with connection history entries + NSMutableArray* _connection_history; + + // temporary bookmark when asking if the user wants to store a bookmark for a session initiated by a quick connect + ComputerBookmark* _temporary_bookmark; + + // reachability notification helper for tsx connect + Reachability* _tsxconnect_reachability; +} + +@property (nonatomic, retain) IBOutlet UISearchBar* searchBar; +@property (nonatomic, retain) IBOutlet UITableView* tableView; +@property (nonatomic, retain) IBOutlet BookmarkTableCell* bmTableCell; +@property (nonatomic, retain) IBOutlet SessionTableCell* sessTableCell; + + +@end diff --git a/client/iOS/Controllers/BookmarkListController.m b/client/iOS/Controllers/BookmarkListController.m new file mode 100644 index 000000000..27a508134 --- /dev/null +++ b/client/iOS/Controllers/BookmarkListController.m @@ -0,0 +1,839 @@ +/* + bookmarks and active session view controller + + 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 "BookmarkListController.h" +#import "Utils.h" +#import "BookmarkEditorController.h" +#import "RDPSessionViewController.h" +#import "Toast+UIView.h" +#import "Reachability.h" + +#define SECTION_SESSIONS 0 +#define SECTION_BOOKMARKS 1 +#define NUM_SECTIONS 2 + +@interface BookmarkListController (Private) +#pragma mark misc functions +- (UIButton*)disclosureButtonWithImage:(UIImage*)image; +- (void)performSearch:(NSString*)searchText; +#pragma mark Persisting bookmarks +- (void)scheduleWriteBookmarksToDataStore; +- (void)writeBookmarksToDataStore; +- (void)scheduleWriteManualBookmarksToDataStore; +- (void)writeManualBookmarksToDataStore; +- (void)readManualBookmarksFromDataStore; +- (void)writeArray:(NSArray*)bookmarks toDataStoreURL:(NSURL*)url; +- (NSMutableArray*)arrayFromDataStoreURL:(NSURL*)url; +- (NSURL*)manualBookmarksDataStoreURL; +- (NSURL*)connectionHistoryDataStoreURL; +@end + + +@implementation BookmarkListController + +@synthesize searchBar = _searchBar, tableView = _tableView, bmTableCell = _bmTableCell, sessTableCell = _sessTableCell; + + // The designated initializer. Override if you create the controller programmatically and want to perform customization that is not appropriate for viewDidLoad. +- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil { + if ((self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil])) + { + // load bookmarks + [self readManualBookmarksFromDataStore]; + + // load connection history + [self readConnectionHistoryFromDataStore]; + + // init search result array + _manual_search_result = nil; + + // register for session notifications + [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(sessionDisconnected:) name:TSXSessionDidDisconnectNotification object:nil]; + [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(sessionFailedToConnect:) name:TSXSessionDidFailToConnectNotification object:nil]; + + // set title and tabbar controller image + [self setTitle:NSLocalizedString(@"Connections", @"'Connections': bookmark controller title")]; + [self setTabBarItem:[[UITabBarItem alloc] initWithTabBarSystemItem:UITabBarSystemItemBookmarks tag:0]]; + + // load images + _star_on_img = [[UIImage imageWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"icon_accessory_star_on" ofType:@"png"]] retain]; + _star_off_img = [[UIImage imageWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"icon_accessory_star_off" ofType:@"png"]] retain]; + + // init reachability detection + [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(reachabilityChanged:) name:kReachabilityChangedNotification object:nil]; + + // init other properties + _active_sessions = [[NSMutableArray alloc] init]; + _temporary_bookmark = nil; + } + return self; +} + +- (void)loadView +{ + [super loadView]; +} + +// Implement viewDidLoad to do additional setup after loading the view, typically from a nib. +- (void)viewDidLoad { + [super viewDidLoad]; + + // set edit button to allow bookmark list editing + [[self navigationItem] setRightBarButtonItem:[self editButtonItem]]; + +/* + if (![[InAppPurchaseManager sharedInAppPurchaseManager] isProVersion]) + [[self navigationItem] setLeftBarButtonItem:[[UIBarButtonItem alloc] initWithTitle:@"Go Pro" style:UIBarButtonItemStyleDone target:self action:@selector(goProButtonPressed:)]]; +*/ +} + + +- (void)viewWillAppear:(BOOL)animated +{ + [super viewWillAppear:animated]; + + // in case we had a search - search again cause the bookmark searchable items could have changed + if ([[_searchBar text] length] > 0) + [self performSearch:[_searchBar text]]; + + // to reflect any bookmark changes - reload table + [_tableView reloadData]; +} + +- (void)viewWillDisappear:(BOOL)animated +{ + [super viewWillDisappear:animated]; + + // clear any search + [_searchBar setText:@""]; + [_searchBar resignFirstResponder]; + [self performSearch:@""]; +} + +// Override to allow orientations other than the default portrait orientation. +- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation { + // Return YES for supported orientations + return YES; +} + + +- (void)didReceiveMemoryWarning { + // Releases the view if it doesn't have a superview. + [super didReceiveMemoryWarning]; + + // Release any cached data, images, etc that aren't in use. +} + +- (void)viewDidUnload { + [super viewDidUnload]; + // Release any retained subviews of the main view. + // e.g. self.myOutlet = nil; +} + + +- (void)dealloc +{ + [_tsxconnect_reachability stopNotifier]; + [_tsxconnect_reachability release]; + + [[NSNotificationCenter defaultCenter] removeObserver:self]; + + [_temporary_bookmark release]; + [_connection_history release]; + [_active_sessions release]; + [_tsxconnect_search_result release]; + [_manual_search_result release]; + [_manual_bookmarks release]; + [_tsxconnect_bookmarks release]; + + [super dealloc]; +} + + +#pragma mark - +#pragma mark Table view data source + +- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { + // Return the number of sections. + return NUM_SECTIONS; +} + +- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { + + switch(section) + { + case SECTION_SESSIONS: + return 0; + break; + + case SECTION_BOOKMARKS: + { + // (+1 for Add Bookmark entry) + if(_manual_search_result != nil) + return ([_manual_search_result count] + [_history_search_result count] + 1); + return ([_manual_bookmarks count] + 1); + } + break; + + default: + break; + } + return 0; +} + +- (UITableViewCell*)cellForGenericListEntry +{ + static NSString *CellIdentifier = @"BookmarkListCell"; + UITableViewCell *cell = [[self tableView] dequeueReusableCellWithIdentifier:CellIdentifier]; + if(cell == nil) + { + cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier]; + [cell setSelectionStyle:UITableViewCellSelectionStyleNone]; + [cell setAccessoryView:[self disclosureButtonWithImage:_star_off_img]]; + } + + return cell; +} + +- (BookmarkTableCell*)cellForBookmark +{ + static NSString *BookmarkCellIdentifier = @"BookmarkCell"; + BookmarkTableCell *cell = (BookmarkTableCell*)[[self tableView] dequeueReusableCellWithIdentifier:BookmarkCellIdentifier]; + if(cell == nil) + { + [[NSBundle mainBundle] loadNibNamed:@"BookmarkTableViewCell" owner:self options:nil]; + [_bmTableCell setAccessoryView:[self disclosureButtonWithImage:_star_on_img]]; + cell = _bmTableCell; + _bmTableCell = nil; + } + + return cell; +} + +// Customize the appearance of table view cells. +- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { + + + switch ([indexPath section]) + { + case SECTION_SESSIONS: + { + // get custom session cell + static NSString *SessionCellIdentifier = @"SessionCell"; + SessionTableCell *cell = (SessionTableCell*)[tableView dequeueReusableCellWithIdentifier:SessionCellIdentifier]; + if(cell == nil) + { + [[NSBundle mainBundle] loadNibNamed:@"SessionTableViewCell" owner:self options:nil]; + cell = _sessTableCell; + _sessTableCell = nil; + } + + // set cell data + RDPSession* session = [_active_sessions objectAtIndex:[indexPath row]]; + [[cell title] setText:[session sessionName]]; + [[cell server] setText:[[session params] StringForKey:@"hostname"]]; + if([[[cell server] text] length] == 0) + [[cell server] setText:@"TSX Connect"]; + [[cell username] setText:[[session params] StringForKey:@"username"]]; + [[cell screenshot] setImage:[session getScreenshotWithSize:[[cell screenshot] bounds].size]]; + [[cell disconnectButton] setTag:[indexPath row]]; + return cell; + } + + case SECTION_BOOKMARKS: + { + // special handling for first cell - quick connect/quick create Bookmark cell + if([indexPath row] == 0) + { + // if a search text is entered the cell becomes a quick connect/quick create bookmark cell - otherwise it's just an add bookmark cell + UITableViewCell* cell = [self cellForGenericListEntry]; + if ([[_searchBar text] length] == 0) + { + [[cell textLabel] setText:[@" " stringByAppendingString:NSLocalizedString(@"Add Connection", @"'Add Connection': button label")]]; + [((UIButton*)[cell accessoryView]) setHidden:YES]; + } + else + { + [[cell textLabel] setText:[@" " stringByAppendingString:[_searchBar text]]]; + [((UIButton*)[cell accessoryView]) setHidden:NO]; + } + + return cell; + } + else + { + // do we have a history cell or bookmark cell? + if ([self isIndexPathToHistoryItem:indexPath]) + { + UITableViewCell* cell = [self cellForGenericListEntry]; + [[cell textLabel] setText:[@" " stringByAppendingString:[_history_search_result objectAtIndex:[self historyIndexFromIndexPath:indexPath]]]]; + [((UIButton*)[cell accessoryView]) setHidden:NO]; + return cell; + } + else + { + // set cell properties + ComputerBookmark* entry; + BookmarkTableCell* cell = [self cellForBookmark]; + if(_manual_search_result == nil) + entry = [_manual_bookmarks objectAtIndex:[self bookmarkIndexFromIndexPath:indexPath]]; + else + entry = [[_manual_search_result objectAtIndex:[self bookmarkIndexFromIndexPath:indexPath]] valueForKey:@"bookmark"]; + + [[cell title] setText:[entry label]]; + [[cell subTitle] setText:[[entry params] StringForKey:@"hostname"]]; + return cell; + } + } + } + + default: + break; + } + + NSAssert(0, @"Failed to create cell"); + return nil; +} + + + +// Override to support conditional editing of the table view. +- (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath { + // dont allow to edit Add Bookmark item + if([indexPath section] == SECTION_SESSIONS) + return NO; + if([indexPath section] == SECTION_BOOKMARKS && [indexPath row] == 0) + return NO; + return YES; +} + + + + // Override to support editing the table view. + - (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath +{ + if(editingStyle == UITableViewCellEditingStyleDelete) + { + // Delete the row from the data source + switch([indexPath section]) + { + case SECTION_BOOKMARKS: + { + if (_manual_search_result == nil) + [_manual_bookmarks removeObjectAtIndex:[self bookmarkIndexFromIndexPath:indexPath]]; + else + { + // history item or bookmark? + if ([self isIndexPathToHistoryItem:indexPath]) + { + [_connection_history removeObject:[_history_search_result objectAtIndex:[self historyIndexFromIndexPath:indexPath]]]; + [_history_search_result removeObjectAtIndex:[self historyIndexFromIndexPath:indexPath]]; + } + else + { + [_manual_bookmarks removeObject:[[_manual_search_result objectAtIndex:[self bookmarkIndexFromIndexPath:indexPath]] valueForKey:@"bookmark"]]; + [_manual_search_result removeObjectAtIndex:[self bookmarkIndexFromIndexPath:indexPath]]; + } + } + [self scheduleWriteManualBookmarksToDataStore]; + break; + } + } + + [tableView reloadSections:[NSIndexSet indexSetWithIndex:[indexPath section]] withRowAnimation:UITableViewRowAnimationNone]; + } +} + + +// Override to support rearranging the table view. +- (void)tableView:(UITableView *)tableView moveRowAtIndexPath:(NSIndexPath *)fromIndexPath toIndexPath:(NSIndexPath *)toIndexPath +{ + if([fromIndexPath compare:toIndexPath] != NSOrderedSame) + { + switch([fromIndexPath section]) + { + case SECTION_BOOKMARKS: + { + int fromIdx = [self bookmarkIndexFromIndexPath:fromIndexPath]; + int toIdx = [self bookmarkIndexFromIndexPath:toIndexPath]; + ComputerBookmark* temp_bookmark = [[_manual_bookmarks objectAtIndex:fromIdx] retain]; + [_manual_bookmarks removeObjectAtIndex:fromIdx]; + if (toIdx >= [_manual_bookmarks count]) + [_manual_bookmarks addObject:temp_bookmark]; + else + [_manual_bookmarks insertObject:temp_bookmark atIndex:toIdx]; + [temp_bookmark release]; + + [self scheduleWriteManualBookmarksToDataStore]; + break; + } + } + } +} + + +// prevent that an item is moved befoer the Add Bookmark item +-(NSIndexPath*)tableView:(UITableView *)tableView targetIndexPathForMoveFromRowAtIndexPath:(NSIndexPath *)sourceIndexPath toProposedIndexPath:(NSIndexPath *)proposedDestinationIndexPath +{ + // don't allow to move: + // - items between sections + // - the quick connect/quick create bookmark cell + // - any item while a search is applied + if([proposedDestinationIndexPath row] == 0 || ([sourceIndexPath section] != [proposedDestinationIndexPath section]) || + _manual_search_result != nil || _tsxconnect_search_result != nil) + { + return sourceIndexPath; + } + else + { + return proposedDestinationIndexPath; + } +} + + +// Override to support conditional rearranging of the table view. +- (BOOL)tableView:(UITableView *)tableView canMoveRowAtIndexPath:(NSIndexPath *)indexPath { + // dont allow to reorder Add Bookmark item + if([indexPath section] == SECTION_BOOKMARKS && [indexPath row] == 0) + return NO; + return YES; +} + +- (NSString*)tableView:(UITableView*)tableView titleForHeaderInSection:(NSInteger)section +{ + if(section == SECTION_SESSIONS && [_active_sessions count] > 0) + return NSLocalizedString(@"My Sessions", @"'My Session': section sessions header"); + if(section == SECTION_BOOKMARKS) + return NSLocalizedString(@"Manual Connections", @"'Manual Connections': section manual bookmarks header"); + return nil; +} + +- (NSString*)tableView:(UITableView*)tableView titleForFooterInSection:(NSInteger)section +{ + return nil; +} + +- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath +{ + if([indexPath section] == SECTION_SESSIONS) + return 72; + return [tableView rowHeight]; +} + +#pragma mark - +#pragma mark Table view delegate + +- (void)setEditing:(BOOL)editing animated:(BOOL)animated +{ + [super setEditing:editing animated:animated]; + [[self tableView] setEditing:editing animated:animated]; +} + +- (void)accessoryButtonTapped:(UIControl*)button withEvent:(UIEvent*)event +{ + // forward a tap on our custom accessory button to the real accessory button handler + NSIndexPath* indexPath = [[self tableView] indexPathForRowAtPoint:[[[event touchesForView:button] anyObject] locationInView:[self tableView]]]; + if (indexPath == nil) + return; + + [[[self tableView] delegate] tableView:[self tableView] accessoryButtonTappedForRowWithIndexPath:indexPath]; +} + +- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath +{ + if([indexPath section] == SECTION_SESSIONS) + { + // resume session + RDPSession* session = [_active_sessions objectAtIndex:[indexPath row]]; + UIViewController* ctrl = [[RDPSessionViewController alloc] initWithNibName:@"RDPSessionView" bundle:nil session:session]; + [ctrl setHidesBottomBarWhenPushed:YES]; + [[self navigationController] pushViewController:ctrl animated:YES]; + } + else + { + ComputerBookmark* bookmark = nil; + if([indexPath section] == SECTION_BOOKMARKS) + { + // first row has either quick connect or add bookmark item + if([indexPath row] == 0) + { + if ([[_searchBar text] length] == 0) + { + // show add bookmark controller + BookmarkEditorController* bookmarkEditorController = [[[BookmarkEditorController alloc] initWithBookmark:[[ComputerBookmark alloc] initWithBaseDefaultParameters]] autorelease]; + [bookmarkEditorController setTitle:NSLocalizedString(@"Add Connection", @"Add Connection title")]; + [bookmarkEditorController setDelegate:self]; + [bookmarkEditorController setHidesBottomBarWhenPushed:YES]; + [[self navigationController] pushViewController:bookmarkEditorController animated:YES]; + } + else + { + // create a quick connect bookmark and add an entry to the quick connect history (if not already in the history) + bookmark = [self bookmarkForQuickConnectTo:[_searchBar text]]; + if (![_connection_history containsObject:[_searchBar text]]) + { + [_connection_history addObject:[_searchBar text]]; + [self scheduleWriteConnectionHistoryToDataStore]; + } + } + } + else + { + if(_manual_search_result != nil) + { + if ([self isIndexPathToHistoryItem:indexPath]) + { + // create a quick connect bookmark for a history item + NSString* item = [_history_search_result objectAtIndex:[self historyIndexFromIndexPath:indexPath]]; + bookmark = [self bookmarkForQuickConnectTo:item]; + } + else + bookmark = [[_manual_search_result objectAtIndex:[self bookmarkIndexFromIndexPath:indexPath]] valueForKey:@"bookmark"]; + } + else + bookmark = [_manual_bookmarks objectAtIndex:[self bookmarkIndexFromIndexPath:indexPath]]; // -1 because of ADD BOOKMARK entry + } + + // set reachability status + WakeUpWWAN(); + [bookmark setConntectedViaWLAN:[[Reachability reachabilityWithHostName:[[bookmark params] StringForKey:@"hostname"]] currentReachabilityStatus] == ReachableViaWiFi]; + } + + if(bookmark != nil) + { + // create rdp session + RDPSession* session = [[[RDPSession alloc] initWithBookmark:bookmark] autorelease]; + UIViewController* ctrl = [[RDPSessionViewController alloc] initWithNibName:@"RDPSessionView" bundle:nil session:session]; + [ctrl setHidesBottomBarWhenPushed:YES]; + [[self navigationController] pushViewController:ctrl animated:YES]; + [_active_sessions addObject:session]; + } + } +} + + +- (void)tableView:(UITableView*)tableView accessoryButtonTappedForRowWithIndexPath:(NSIndexPath*)indexPath +{ + // get the bookmark + NSString* bookmark_editor_title = NSLocalizedString(@"Edit Connection", @"Edit Connection title"); + ComputerBookmark* bookmark = nil; + if ([indexPath section] == SECTION_BOOKMARKS) + { + if ([indexPath row] == 0) + { + // create a new bookmark and init hostname and label + bookmark = [self bookmarkForQuickConnectTo:[_searchBar text]]; + bookmark_editor_title = NSLocalizedString(@"Add Connection", @"Add Connection title"); + } + else + { + if (_manual_search_result != nil) + { + if ([self isIndexPathToHistoryItem:indexPath]) + { + // create a new bookmark and init hostname and label + NSString* item = [_history_search_result objectAtIndex:[self historyIndexFromIndexPath:indexPath]]; + bookmark = [self bookmarkForQuickConnectTo:item]; + bookmark_editor_title = NSLocalizedString(@"Add Connection", @"Add Connection title"); + } + else + bookmark = [[_manual_search_result objectAtIndex:[self bookmarkIndexFromIndexPath:indexPath]] valueForKey:@"bookmark"]; + } + else + bookmark = [_manual_bookmarks objectAtIndex:[self bookmarkIndexFromIndexPath:indexPath]]; // -1 because of ADD BOOKMARK entry + } + } + + // bookmark found? - start the editor + if (bookmark != nil) + { + BookmarkEditorController* editBookmarkController = [[[BookmarkEditorController alloc] initWithBookmark:bookmark] autorelease]; + [editBookmarkController setHidesBottomBarWhenPushed:YES]; + [editBookmarkController setTitle:bookmark_editor_title]; + [editBookmarkController setDelegate:self]; + [[self navigationController] pushViewController:editBookmarkController animated:YES]; + } +} + +#pragma mark - +#pragma mark Search Bar Delegates + +- (BOOL)searchBarShouldBeginEditing:(UISearchBar*)searchBar +{ + // show cancel button + [searchBar setShowsCancelButton:YES animated:YES]; + return YES; +} + +- (void)searchBarCancelButtonClicked:(UISearchBar *)searchBar +{ + // clear search result + [_tsxconnect_search_result release]; + _tsxconnect_search_result = nil; + [_manual_search_result release]; + _manual_search_result = nil; + + // clear text and remove cancel button + [searchBar setText:@""]; + [searchBar resignFirstResponder]; +} + +- (BOOL)searchBarShouldEndEditing:(UISearchBar*)searchBar +{ + [searchBar setShowsCancelButton:NO animated:YES]; + + // re-enable table selection + [_tableView setAllowsSelection:YES]; + + return YES; +} + +- (void)searchBarSearchButtonClicked:(UISearchBar *)searchBar +{ + [_searchBar resignFirstResponder]; +} + +- (void)searchBar:(UISearchBar*)searchBar textDidChange:(NSString*)searchText +{ + [self performSearch:searchText]; + [_tableView reloadData]; +} + +#pragma mark - Session handling + +// session was added +- (void)sessionDisconnected:(NSNotification*)notification +{ + // remove session from active sessions + RDPSession* session = (RDPSession*)[notification object]; + [_active_sessions removeObject:session]; + + // if this view is currently active refresh tsxconnect entries + if([[self navigationController] visibleViewController] == self) + [_tableView reloadSections:[NSIndexSet indexSetWithIndex:SECTION_SESSIONS] withRowAnimation:UITableViewRowAnimationNone]; + + // if session's bookmark is not in the bookmark list ask the user if he wants to add it + // (this happens if the session is created using the quick connect feature) + if (![[session bookmark] isKindOfClass:NSClassFromString(@"TSXConnectComputerBookmark")] && + ![_manual_bookmarks containsObject:[session bookmark]]) + { + // retain the bookmark in case we want to save it later + _temporary_bookmark = [[session bookmark] retain]; + + // ask the user if he wants to save the bookmark + NSString* title = NSLocalizedString(@"Save Connection Settings?", @"Save connection settings title"); + NSString* message = NSLocalizedString(@"Your Connection Settings have not been saved. Do you want to save them?", @"Save connection settings message"); + UIAlertView* alert = [[UIAlertView alloc] initWithTitle:title message:message delegate:self + cancelButtonTitle:NSLocalizedString(@"Yes", @"Yes Button") otherButtonTitles:NSLocalizedString(@"No", @"No Button"), nil]; + [alert show]; + } +} + +- (void)sessionFailedToConnect:(NSNotification*)notification +{ + // remove session from active sessions + RDPSession* session = (RDPSession*)[notification object]; + [_active_sessions removeObject:session]; + + // display error toast + [[self view] makeToast:NSLocalizedString(@"Failed to connect to session!", @"Failed to connect error message") duration:ToastDurationNormal position:@"center"]; +} + +#pragma mark - UIAlertView delegates + +- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex +{ + // yes clicked? + if (buttonIndex == 0 && _temporary_bookmark) + { + [_manual_bookmarks addObject:_temporary_bookmark]; + [_tableView reloadSections:[NSIndexSet indexSetWithIndex:SECTION_BOOKMARKS] withRowAnimation:UITableViewRowAnimationNone]; + } + + [_temporary_bookmark autorelease]; + _temporary_bookmark = nil; +} + +#pragma mark - Reachability notification +- (void)reachabilityChanged:(NSNotification*)notification +{ + // no matter how the network changed - we will disconnect + // disconnect session (if there is any) + if ([_active_sessions count] > 0) + { + RDPSession* session = [_active_sessions objectAtIndex:0]; + [session disconnect]; + } +} + +#pragma mark - BookmarkEditorController delegate + +- (void)commitBookmark:(ComputerBookmark *)bookmark +{ + // if we got a manual bookmark that is not in the list yet - add it + if (![_manual_bookmarks containsObject:bookmark]) + [_manual_bookmarks addObject:bookmark]; + + // remove any quick connect history entry with the same hostname + NSString* hostname = [[bookmark params] StringForKey:@"hostname"]; + if ([_connection_history containsObject:hostname]) + { + [_connection_history removeObject:hostname]; + [self scheduleWriteConnectionHistoryToDataStore]; + } + + [self scheduleWriteManualBookmarksToDataStore]; +} + +- (IBAction)disconnectButtonPressed:(id)sender +{ + // disconnect session and refresh table view + RDPSession* session = [_active_sessions objectAtIndex:[sender tag]]; + [session disconnect]; +} + +#pragma mark - Misc functions + +- (BOOL)hasNoBookmarks +{ + return ([_manual_bookmarks count] == 0 && [_tsxconnect_bookmarks count] == 0); +} + +- (UIButton*)disclosureButtonWithImage:(UIImage*)image +{ + // we make the button a little bit bigger (image widht * 2, height + 10) so that the user doesn't accidentally connect to the bookmark ... + UIButton* button = [UIButton buttonWithType:UIButtonTypeCustom]; + [button setFrame:CGRectMake(0, 0, [image size].width * 2, [image size].height + 10)]; + [button setImage:image forState:UIControlStateNormal]; + [button addTarget:self action:@selector(accessoryButtonTapped:withEvent:) forControlEvents:UIControlEventTouchUpInside]; + [button setUserInteractionEnabled:YES]; + return button; +} + +- (void)performSearch:(NSString*)searchText +{ + [_manual_search_result autorelease]; + [_tsxconnect_search_result autorelease]; + + if([searchText length] > 0) + { + _manual_search_result = [FilterBookmarks(_manual_bookmarks, [searchText componentsSeparatedByCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]]) retain]; + _tsxconnect_search_result = [FilterBookmarks(_tsxconnect_bookmarks, [searchText componentsSeparatedByCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]]) retain]; + _history_search_result = [FilterHistory(_connection_history, searchText) retain]; + } + else + { + _history_search_result = nil; + _tsxconnect_search_result = nil; + _manual_search_result = nil; + } +} + +- (int)bookmarkIndexFromIndexPath:(NSIndexPath*)indexPath +{ + return [indexPath row] - ((_history_search_result != nil) ? [_history_search_result count] : 0) - 1; +} + +- (int)historyIndexFromIndexPath:(NSIndexPath*)indexPath +{ + return [indexPath row] - 1; +} + +- (BOOL)isIndexPathToHistoryItem:(NSIndexPath*)indexPath +{ + return (([indexPath row] - 1) < [_history_search_result count]); +} + +- (ComputerBookmark*)bookmarkForQuickConnectTo:(NSString*)host +{ + ComputerBookmark* bookmark = [[[ComputerBookmark alloc] initWithBaseDefaultParameters] autorelease]; + [bookmark setLabel:host]; + [[bookmark params] setValue:host forKey:@"hostname"]; + return bookmark; +} + +#pragma mark - Persisting bookmarks + +- (void)scheduleWriteBookmarksToDataStore +{ + [[NSOperationQueue mainQueue] addOperationWithBlock:^{ + [self writeBookmarksToDataStore]; + }]; +} + +- (void)writeBookmarksToDataStore +{ + [self writeManualBookmarksToDataStore]; +} + +- (void)scheduleWriteManualBookmarksToDataStore +{ + [[NSOperationQueue mainQueue] addOperation:[[[NSInvocationOperation alloc] initWithTarget:self selector:@selector(writeManualBookmarksToDataStore) object:nil] autorelease]]; +} + +- (void)writeManualBookmarksToDataStore +{ + [self writeArray:_manual_bookmarks toDataStoreURL:[self manualBookmarksDataStoreURL]]; +} + +- (void)scheduleWriteConnectionHistoryToDataStore +{ + [[NSOperationQueue mainQueue] addOperation:[[[NSInvocationOperation alloc] initWithTarget:self selector:@selector(writeConnectionHistoryToDataStore) object:nil] autorelease]]; +} + +- (void)writeConnectionHistoryToDataStore +{ + [self writeArray:_connection_history toDataStoreURL:[self connectionHistoryDataStoreURL]]; +} + +- (void)writeArray:(NSArray*)bookmarks toDataStoreURL:(NSURL*)url +{ + NSData* archived_data = [NSKeyedArchiver archivedDataWithRootObject:bookmarks]; + [archived_data writeToURL:url atomically:YES]; +} + +- (void)readManualBookmarksFromDataStore +{ + [_manual_bookmarks autorelease]; + _manual_bookmarks = [self arrayFromDataStoreURL:[self manualBookmarksDataStoreURL]]; + + if(_manual_bookmarks == nil) + _manual_bookmarks = [[NSMutableArray alloc] init]; +} + +- (void)readConnectionHistoryFromDataStore +{ + [_connection_history autorelease]; + _connection_history = [self arrayFromDataStoreURL:[self connectionHistoryDataStoreURL]]; + + if(_connection_history == nil) + _connection_history = [[NSMutableArray alloc] init]; +} + +- (NSMutableArray*)arrayFromDataStoreURL:(NSURL*)url +{ + NSData* archived_data = [NSData dataWithContentsOfURL:url]; + + if (!archived_data) + return nil; + + return [[NSKeyedUnarchiver unarchiveObjectWithData:archived_data] retain]; +} + +- (NSURL*)manualBookmarksDataStoreURL +{ + return [NSURL fileURLWithPath:[NSString stringWithFormat:@"%@/%@", [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject], @"com.thinstuff.tsx-rdc-ios.bookmarks.plist"]]; +} + +- (NSURL*)connectionHistoryDataStoreURL +{ + return [NSURL fileURLWithPath:[NSString stringWithFormat:@"%@/%@", [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject], @"com.thinstuff.tsx-rdc-ios.connection_history.plist"]]; +} + +@end + diff --git a/client/iOS/Controllers/CredentialsEditorController.h b/client/iOS/Controllers/CredentialsEditorController.h new file mode 100644 index 000000000..c555eb31a --- /dev/null +++ b/client/iOS/Controllers/CredentialsEditorController.h @@ -0,0 +1,25 @@ +/* + Controller to edit bookmark credentials + + 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 "EditorBaseController.h" + +@class ComputerBookmark; +@class ConnectionParams; + +@interface CredentialsEditorController : EditorBaseController +{ +@private + ComputerBookmark* _bookmark; + ConnectionParams* _params; +} + +// init for the given bookmark +- (id)initWithBookmark:(ComputerBookmark*)bookmark; + +@end diff --git a/client/iOS/Controllers/CredentialsEditorController.m b/client/iOS/Controllers/CredentialsEditorController.m new file mode 100644 index 000000000..21e328ad5 --- /dev/null +++ b/client/iOS/Controllers/CredentialsEditorController.m @@ -0,0 +1,203 @@ +/* + Controller to edit bookmark credentials + + 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 "CredentialsEditorController.h" +#import "Bookmark.h" +#import "Utils.h" + +@interface CredentialsEditorController () + +@end + +#define SECTION_CREDENTIALS 0 +#define SECTION_COUNT 1 + +@implementation CredentialsEditorController + +- (id)initWithBookmark:(ComputerBookmark*)bookmark +{ + if ((self = [super initWithStyle:UITableViewStyleGrouped])) + { + // set additional settings state according to bookmark data + _bookmark = [bookmark retain]; + _params = [bookmark params]; + } + return self; +} + +- (void)viewDidLoad +{ + [super viewDidLoad]; + [self setTitle:NSLocalizedString(@"Credentials", @"Credentials title")]; +} + +- (void)viewDidUnload +{ + [super viewDidUnload]; + // Release any retained subviews of the main view. +} + +- (void)viewWillDisappear:(BOOL)animated +{ + [super viewWillDisappear:animated]; + + // foce any active editing to stop + [[self view] endEditing:NO]; +} + +- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation +{ + return YES; +} + +#pragma mark - +#pragma mark Table view data source + +- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { + // Return the number of sections. + return SECTION_COUNT; +} + + +- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { + // Return the number of rows in the section. + switch (section) + { + case SECTION_CREDENTIALS: // credentials + return 3; + default: + break; + } + + return 0; +} + + +// set section headers +- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section +{ + switch(section) + { + case SECTION_CREDENTIALS: + return NSLocalizedString(@"Credentials", @"'Credentials': credentials settings header"); + } + return @"unknown"; +} + + +// Customize the appearance of table view cells. +- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { + + // determine the required cell type + NSString* cellType = nil; + switch([indexPath section]) + { + case SECTION_CREDENTIALS: // credentials + if([indexPath row] == 1) + cellType = TableCellIdentifierSecretText; // password field + else + cellType = TableCellIdentifierText; + break; + + default: + break; + } + NSAssert(cellType != nil, @"Couldn't determine cell type"); + + // get the table view cell + UITableViewCell *cell = [self tableViewCellFromIdentifier:cellType]; + NSAssert(cell, @"Invalid cell"); + + // set cell values + switch([indexPath section]) + { + // credentials + case SECTION_CREDENTIALS: + [self initCredentialSettings:indexPath cell:cell]; + break; + + default: + break; + } + + return cell; +} + + +// updates credentials in the UI +- (void)initCredentialSettings:(NSIndexPath*)indexPath cell:(UITableViewCell*)cell +{ + switch(indexPath.row) + { + case 0: + { + EditTextTableViewCell* textCell = (EditTextTableViewCell*)cell; + [[textCell textfield] setTag:GET_TAG_FROM_PATH(indexPath)]; + [[textCell label] setText:NSLocalizedString(@"Username", @"'Username': Bookmark username")]; + [[textCell textfield] setText:[_params StringForKey:@"username"]]; + [[textCell textfield] setPlaceholder:NSLocalizedString(@"not set", @"not set placeholder")]; + break; + } + case 1: + { + EditSecretTextTableViewCell* textCell = (EditSecretTextTableViewCell*)cell; + [[textCell textfield] setTag:GET_TAG_FROM_PATH(indexPath)]; + [[textCell label] setText:NSLocalizedString(@"Password", @"'Password': Bookmark password")]; + [[textCell textfield] setText:[_params StringForKey:@"password"]]; + [[textCell textfield] setPlaceholder:NSLocalizedString(@"not set", @"not set placeholder")]; + break; + } + case 2: + { + EditTextTableViewCell* textCell = (EditTextTableViewCell*)cell; + [[textCell textfield] setTag:GET_TAG_FROM_PATH(indexPath)]; + [[textCell label] setText:NSLocalizedString(@"Domain", @"'Domain': Bookmark domain")]; + [[textCell textfield] setText:[_params StringForKey:@"domain"]]; + [[textCell textfield] setPlaceholder:NSLocalizedString(@"not set", @"not set placeholder")]; + break; + } + default: + NSLog(@"Invalid row index in settings table!"); + break; + } +} + +#pragma mark - +#pragma mark Text Field delegate + +- (BOOL)textFieldShouldReturn:(UITextField*)textField +{ + [textField resignFirstResponder]; + return NO; +} + +- (BOOL)textFieldShouldEndEditing:(UITextField *)textField +{ + switch(textField.tag) + { + // update credentials settings + case GET_TAG(SECTION_CREDENTIALS, 0): + [_params setValue:[textField text] forKey:@"username"]; + break; + + case GET_TAG(SECTION_CREDENTIALS, 1): + [_params setValue:[textField text] forKey:@"password"]; + break; + + case GET_TAG(SECTION_CREDENTIALS, 2): + [_params setValue:[textField text] forKey:@"domain"]; + break; + + default: + break; + } + return YES; +} + +@end diff --git a/client/iOS/Controllers/CredentialsInputController.h b/client/iOS/Controllers/CredentialsInputController.h new file mode 100644 index 000000000..221cfc1ee --- /dev/null +++ b/client/iOS/Controllers/CredentialsInputController.h @@ -0,0 +1,31 @@ +/* + Credentials input controller + + 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 + +@class RDPSession; + +@interface CredentialsInputController : UIViewController +{ +@private + IBOutlet UITextField* _textfield_username; + IBOutlet UITextField* _textfield_password; + IBOutlet UITextField* _textfield_domain; + IBOutlet UIButton* _btn_login; + IBOutlet UIButton* _btn_cancel; + IBOutlet UIScrollView* _scroll_view; + IBOutlet UILabel* _lbl_message; + + RDPSession* _session; + NSMutableDictionary* _params; +} + +- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil session:(RDPSession*)session params:(NSMutableDictionary*)params; + +@end diff --git a/client/iOS/Controllers/CredentialsInputController.m b/client/iOS/Controllers/CredentialsInputController.m new file mode 100644 index 000000000..1217d2ef8 --- /dev/null +++ b/client/iOS/Controllers/CredentialsInputController.m @@ -0,0 +1,133 @@ +/* + Credentials input controller + + 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 "CredentialsInputController.h" +#import "RDPSession.h" +#import "Utils.h" + +@implementation CredentialsInputController + +- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil session:(RDPSession *)session params:(NSMutableDictionary *)params +{ + self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; + if (self) { + _session = session; + _params = params; + [self setModalPresentationStyle:UIModalPresentationFormSheet]; + + // on iphone we have the problem that the buttons are hidden by the keyboard + // we solve this issue by registering keyboard notification handlers and adjusting the scrollview accordingly + if (IsPhone()) + { + [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillShow:) name: UIKeyboardWillShowNotification object:nil]; + [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillHide:) name: UIKeyboardWillHideNotification object:nil]; + } + } + return self; +} + +- (void)viewDidLoad +{ + [super viewDidLoad]; + + // set localized strings + [_lbl_message setText:NSLocalizedString(@"Please provide the missing user information in order to proceed and login.", @"Credentials input view message")]; + [_textfield_username setPlaceholder:NSLocalizedString(@"Username", @"Credentials Input Username hint")]; + [_textfield_password setPlaceholder:NSLocalizedString(@"Password", @"Credentials Input Password hint")]; + [_textfield_domain setPlaceholder:NSLocalizedString(@"Domain", @"Credentials Input Domain hint")]; + [_btn_login setTitle:NSLocalizedString(@"Login", @"Login Button") forState:UIControlStateNormal]; + [_btn_cancel setTitle:NSLocalizedString(@"Cancel", @"Cancel Button") forState:UIControlStateNormal]; + + // init scrollview content size + [_scroll_view setContentSize:[_scroll_view frame].size]; + + // set params in the view + [_textfield_username setText:[_params valueForKey:@"username"]]; + [_textfield_password setText:[_params valueForKey:@"password"]]; + [_textfield_domain setText:[_params valueForKey:@"domain"]]; +} + +- (void)viewDidUnload +{ + [super viewDidUnload]; +} + +- (void)viewDidDisappear:(BOOL)animated +{ + [super viewDidDisappear:animated]; + // set signal + [[_session uiRequestCompleted] signal]; +} + +- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation +{ + return YES; +} + +- (void)dealloc +{ + [super dealloc]; + [[NSNotificationCenter defaultCenter] removeObserver:self]; +} + +#pragma mark - +#pragma mark iOS Keyboard Notification Handlers + +- (void)keyboardWillShow:(NSNotification *)notification +{ + CGRect keyboardEndFrame = [[[notification userInfo] objectForKey:UIKeyboardFrameEndUserInfoKey] CGRectValue]; + CGRect keyboardFrame = [[self view] convertRect:keyboardEndFrame toView:nil]; + + [UIView beginAnimations:nil context:NULL]; + [UIView setAnimationCurve:[[[notification userInfo] objectForKey:UIKeyboardAnimationCurveUserInfoKey] intValue]]; + [UIView setAnimationDuration:[[[notification userInfo] objectForKey:UIKeyboardAnimationDurationUserInfoKey] doubleValue]]; + CGRect frame = [_scroll_view frame]; + frame.size.height -= keyboardFrame.size.height; + [_scroll_view setFrame:frame]; + [UIView commitAnimations]; +} + +- (void)keyboardWillHide:(NSNotification *)notification +{ + CGRect keyboardEndFrame = [[[notification userInfo] objectForKey:UIKeyboardFrameEndUserInfoKey] CGRectValue]; + CGRect keyboardFrame = [[self view] convertRect:keyboardEndFrame toView:nil]; + + [UIView beginAnimations:nil context:NULL]; + [UIView setAnimationCurve:[[[notification userInfo] objectForKey:UIKeyboardAnimationCurveUserInfoKey] intValue]]; + [UIView setAnimationDuration:[[[notification userInfo] objectForKey:UIKeyboardAnimationDurationUserInfoKey] doubleValue]]; + CGRect frame = [_scroll_view frame]; + frame.size.height += keyboardFrame.size.height; + [_scroll_view setFrame:frame]; + [UIView commitAnimations]; +} + + +#pragma mark - Action handlers + +- (IBAction)loginPressed:(id)sender +{ + // read input back in + [_params setValue:[_textfield_username text] forKey:@"username"]; + [_params setValue:[_textfield_password text] forKey:@"password"]; + [_params setValue:[_textfield_domain text] forKey:@"domain"]; + [_params setValue:[NSNumber numberWithBool:YES] forKey:@"result"]; + + // dismiss controller + [self dismissModalViewControllerAnimated:YES]; +} + +- (IBAction)cancelPressed:(id)sender +{ + [_params setValue:[NSNumber numberWithBool:NO] forKey:@"result"]; + + // dismiss controller + [self dismissModalViewControllerAnimated:YES]; +} + +@end diff --git a/client/iOS/Controllers/EditorBaseController.h b/client/iOS/Controllers/EditorBaseController.h new file mode 100644 index 000000000..0fd81bbd9 --- /dev/null +++ b/client/iOS/Controllers/EditorBaseController.h @@ -0,0 +1,44 @@ +/* + Basic interface for settings editors + + 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 "EditTextTableViewCell.h" +#import "EditFlagTableViewCell.h" +#import "EditSelectionTableViewCell.h" +#import "EditSubEditTableViewCell.h" +#import "EditSecretTextTableViewCell.h" +#import "EditButtonTableViewCell.h" + +extern NSString* TableCellIdentifierText; +extern NSString* TableCellIdentifierSecretText; +extern NSString* TableCellIdentifierYesNo; +extern NSString* TableCellIdentifierSelection; +extern NSString* TableCellIdentifierSubEditor; +extern NSString* TableCellIdentifierMultiChoice; +extern NSString* TableCellIdentifierButton; + +@interface EditorBaseController : UITableViewController +{ +@private + IBOutlet EditTextTableViewCell* _textTableViewCell; + IBOutlet EditSecretTextTableViewCell* _secretTextTableViewCell; + IBOutlet EditFlagTableViewCell* _flagTableViewCell; + IBOutlet EditSelectionTableViewCell* _selectionTableViewCell; + IBOutlet EditSubEditTableViewCell* _subEditTableViewCell; + IBOutlet EditButtonTableViewCell* _buttonTableViewCell; +} + +// returns one of the requested table view cells +- (UITableViewCell*)tableViewCellFromIdentifier:(NSString*)identifier; + +// Adjust text input cells label/textfield widht according to the label's text size +- (void)adjustEditTextTableViewCell:(EditTextTableViewCell*)cell; + +@end diff --git a/client/iOS/Controllers/EditorBaseController.m b/client/iOS/Controllers/EditorBaseController.m new file mode 100644 index 000000000..bf29e3dc1 --- /dev/null +++ b/client/iOS/Controllers/EditorBaseController.m @@ -0,0 +1,108 @@ +/* + Basic interface for settings editors + + 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 "EditorBaseController.h" + +@interface EditorBaseController () + +@end + +NSString* TableCellIdentifierText = @"cellIdText"; +NSString* TableCellIdentifierSecretText = @"cellIdSecretText"; +NSString* TableCellIdentifierYesNo = @"cellIdYesNo"; +NSString* TableCellIdentifierSelection = @"cellIdSelection"; +NSString* TableCellIdentifierSubEditor = @"cellIdSubEditor"; +NSString* TableCellIdentifierMultiChoice = @"cellIdMultiChoice"; +NSString* TableCellIdentifierButton = @"cellIdButton"; + +@implementation EditorBaseController + +- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation +{ + return YES; +} + +#pragma mark - Create table view cells +- (UITableViewCell*)tableViewCellFromIdentifier:(NSString*)identifier +{ + // try to reuse a cell + UITableViewCell* cell = [[self tableView] dequeueReusableCellWithIdentifier:identifier]; + if (cell != nil) + return cell; + + // we have to create a new cell + if ([identifier isEqualToString:TableCellIdentifierText]) + { + [[NSBundle mainBundle] loadNibNamed:@"EditTextTableViewCell" owner:self options:nil]; + cell = _textTableViewCell; + _textTableViewCell = nil; + } + else if ([identifier isEqualToString:TableCellIdentifierSecretText]) + { + [[NSBundle mainBundle] loadNibNamed:@"EditSecretTextTableViewCell" owner:self options:nil]; + cell = _secretTextTableViewCell; + _secretTextTableViewCell = nil; + } + else if ([identifier isEqualToString:TableCellIdentifierYesNo]) + { + [[NSBundle mainBundle] loadNibNamed:@"EditFlagTableViewCell" owner:self options:nil]; + cell = _flagTableViewCell; + _flagTableViewCell = nil; + } + else if ([identifier isEqualToString:TableCellIdentifierSelection]) + { + [[NSBundle mainBundle] loadNibNamed:@"EditSelectionTableViewCell" owner:self options:nil]; + cell = _selectionTableViewCell; + _selectionTableViewCell = nil; + } + else if ([identifier isEqualToString:TableCellIdentifierSubEditor]) + { + [[NSBundle mainBundle] loadNibNamed:@"EditSubEditTableViewCell" owner:self options:nil]; + cell = _subEditTableViewCell; + _subEditTableViewCell = nil; + } + else if ([identifier isEqualToString:TableCellIdentifierButton]) + { + [[NSBundle mainBundle] loadNibNamed:@"EditButtonTableViewCell" owner:self options:nil]; + cell = _buttonTableViewCell; + _buttonTableViewCell = nil; + } + else if ([identifier isEqualToString:TableCellIdentifierMultiChoice]) + { + cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:identifier] autorelease]; + } + else + { + NSAssert(false, @"Unknown table cell identifier"); + } + + return cell; +} + +#pragma mark - Utility functions +- (void)adjustEditTextTableViewCell:(EditTextTableViewCell*)cell +{ + UILabel* label = [cell label]; + UITextField* textField = [cell textfield]; + + // adjust label + CGFloat width = [[label text] sizeWithFont:[label font]].width; + CGRect frame = [label frame]; + CGFloat delta = width - frame.size.width; + frame.size.width = width; + [label setFrame:frame]; + + // adjust text field + frame = [textField frame]; + frame.origin.x += delta; + frame.size.width -= delta; + [textField setFrame:frame]; +} + +@end diff --git a/client/iOS/Controllers/EditorSelectionController.h b/client/iOS/Controllers/EditorSelectionController.h new file mode 100644 index 000000000..81225a92e --- /dev/null +++ b/client/iOS/Controllers/EditorSelectionController.h @@ -0,0 +1,30 @@ +/* + Generic controller to select a single item from a list of options + + 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 "EditorBaseController.h" + +@class ConnectionParams; + +@interface EditorSelectionController : EditorBaseController +{ + ConnectionParams* _params; + + // array with entries in connection parameters that are altered + NSArray* _entries; + + // array with dictionaries containing label/value pairs that represent the available values for each entry + NSArray* _selections; + + // current selections + NSMutableArray* _cur_selections; +} + +- (id)initWithConnectionParams:(ConnectionParams*)params entries:(NSArray*)entries selections:(NSArray*)selections; + +@end diff --git a/client/iOS/Controllers/EditorSelectionController.m b/client/iOS/Controllers/EditorSelectionController.m new file mode 100644 index 000000000..84d5e87b8 --- /dev/null +++ b/client/iOS/Controllers/EditorSelectionController.m @@ -0,0 +1,136 @@ +/* + Generic controller to select a single item from a list of options + + 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 "EditorSelectionController.h" +#import "ConnectionParams.h" +#import "OrderedDictionary.h" + +@interface EditorSelectionController (Private) +- (OrderedDictionary*)selectionForIndex:(int)index; +@end + +@implementation EditorSelectionController + +- (id)initWithConnectionParams:(ConnectionParams*)params entries:(NSArray *)entries selections:(NSArray *)selections +{ + self = [super initWithStyle:UITableViewStyleGrouped]; + if (self) + { + _params = [params retain]; + _entries = [entries retain]; + _selections = [selections retain]; + + // allocate and init current selections array + _cur_selections = [[NSMutableArray alloc] initWithCapacity:[_entries count]]; + for (int i = 0; i < [entries count]; ++i) + { + NSString* entry = [entries objectAtIndex:i]; + if([_params hasValueForKeyPath:entry]) + { + NSUInteger idx = [(OrderedDictionary*)[selections objectAtIndex:i] indexForValue:[NSNumber numberWithInt:[_params intForKeyPath:entry]]]; + [_cur_selections addObject:[NSNumber numberWithInt:(idx != NSNotFound ? idx : 0)]]; + } + else + [_cur_selections addObject:[NSNumber numberWithInt:0]]; + } + } + return self; +} + +- (void)didReceiveMemoryWarning +{ + // Releases the view if it doesn't have a superview. + [super didReceiveMemoryWarning]; + + // Release any cached data, images, etc that aren't in use. + [_params autorelease]; + [_entries autorelease]; + [_selections autorelease]; + [_cur_selections autorelease]; +} + +#pragma mark - View lifecycle + +- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation +{ + // Return YES for supported orientations + return YES; +} + +#pragma mark - Table view data source + +- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView +{ + // Return the number of sections. + return [_entries count]; +} + +- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section +{ + // Return the number of rows in the section. + return [[self selectionForIndex:section] count]; +} + +- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath +{ + UITableViewCell *cell = [self tableViewCellFromIdentifier:TableCellIdentifierMultiChoice]; + + // get selection + OrderedDictionary* selection = [self selectionForIndex:[indexPath section]]; + + // set cell properties + [[cell textLabel] setText:[selection keyAtIndex:[indexPath row]]]; + + // set default checkmark + if([indexPath row] == [[_cur_selections objectAtIndex:[indexPath section]] intValue]) + [cell setAccessoryType:UITableViewCellAccessoryCheckmark]; + else + [cell setAccessoryType:UITableViewCellAccessoryNone]; + + return cell; +} + +#pragma mark - Table view delegate + +- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath +{ + // has selection change? + int cur_selection = [[_cur_selections objectAtIndex:[indexPath section]] intValue]; + if([indexPath row] != cur_selection) + { + [tableView deselectRowAtIndexPath:indexPath animated:NO]; + + NSIndexPath* oldIndexPath = [NSIndexPath indexPathForRow:cur_selection inSection:[indexPath section]]; + + // clear old checkmark + UITableViewCell* old_sel_cell = [tableView cellForRowAtIndexPath:oldIndexPath]; + old_sel_cell.accessoryType = UITableViewCellAccessoryNone; + + // set new checkmark + UITableViewCell* new_sel_cell = [tableView cellForRowAtIndexPath:indexPath]; + new_sel_cell.accessoryType = UITableViewCellAccessoryCheckmark; + + // get value from selection dictionary + OrderedDictionary* dict = [self selectionForIndex:[indexPath section]]; + int sel_value = [[dict valueForKey:[dict keyAtIndex:[indexPath row]]] intValue]; + + // update selection index and params value + [_cur_selections replaceObjectAtIndex:[indexPath section] withObject:[NSNumber numberWithInt:[indexPath row]]]; + [_params setInt:sel_value forKeyPath:[_entries objectAtIndex:[indexPath section]]]; + } +} + +#pragma mark - Convenience functions + +- (OrderedDictionary*)selectionForIndex:(int)index +{ + return (OrderedDictionary*)[_selections objectAtIndex:index]; +} + +@end diff --git a/client/iOS/Controllers/EncryptionController.h b/client/iOS/Controllers/EncryptionController.h new file mode 100644 index 000000000..1ce197e96 --- /dev/null +++ b/client/iOS/Controllers/EncryptionController.h @@ -0,0 +1,24 @@ +/* + Password Encryption Controller + + Copyright 2013 Thinstuff Technologies GmbH, Author: Dorian Johnson + + 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 "Encryptor.h" + +@interface EncryptionController : NSObject +{ + Encryptor* _shared_encryptor; +} + ++ (EncryptionController*)sharedEncryptionController; + +// Return a Encryptor suitable for encrypting or decrypting with the master password +- (Encryptor*)decryptor; +- (Encryptor*)encryptor; + +@end diff --git a/client/iOS/Controllers/EncryptionController.m b/client/iOS/Controllers/EncryptionController.m new file mode 100644 index 000000000..089e87a44 --- /dev/null +++ b/client/iOS/Controllers/EncryptionController.m @@ -0,0 +1,133 @@ +/* + Password Encryption Controller + + Copyright 2013 Thinstuff Technologies GmbH, Author: Dorian Johnson + + 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 "EncryptionController.h" +#import "SFHFKeychainUtils.h" + +@interface EncryptionController (Private) + +- (BOOL)verifyPassword:(Encryptor*)decryptor; +- (NSData*)encryptedVerificationData; +- (void)setEncryptedVerificationData:(Encryptor*)encryptor; + +- (NSString*)keychainServerName; +- (NSString*)keychainUsername; +- (void)setKeychainPassword:(NSString*)password; +- (NSString*)keychainPassword; +- (NSString*)keychainDefaultPassword; + +@end + +static EncryptionController* _shared_encryption_controller = nil; + + +#pragma mark - + +@implementation EncryptionController + ++ (EncryptionController*)sharedEncryptionController +{ + @synchronized(self) + { + if (_shared_encryption_controller == nil) + _shared_encryption_controller = [[EncryptionController alloc] init]; + } + + return _shared_encryption_controller; +} + +#pragma mark Getting an encryptor or decryptor + +- (Encryptor*)encryptor +{ + if (_shared_encryptor) + return _shared_encryptor; + + NSString* saved_password = [self keychainPassword]; + if (saved_password == nil) + { + saved_password = [self keychainDefaultPassword]; + Encryptor* encryptor = [[[Encryptor alloc] initWithPassword:saved_password] autorelease]; + [self setEncryptedVerificationData:encryptor]; + _shared_encryptor = [encryptor retain]; + } + else + { + Encryptor* encryptor = [[[Encryptor alloc] initWithPassword:saved_password] autorelease]; + if ([self verifyPassword:encryptor]) + _shared_encryptor = [encryptor retain]; + } + + return _shared_encryptor; +} + +// For the current implementation, decryptors and encryptors are equivilant. +- (Encryptor*)decryptor { return [self encryptor]; } + +@end + +#pragma mark - + +@implementation EncryptionController (Private) + +#pragma mark - +#pragma mark Keychain password storage + +- (NSString*)keychainServerName +{ + return [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleName"]; +} + +- (NSString*)keychainUsername +{ + return @"master.password"; +} + +- (void)setKeychainPassword:(NSString*)password +{ + NSError* error; + if (password == nil) + { + [SFHFKeychainUtils deleteItemForUsername:[self keychainUsername] andServerName:[self keychainServerName] error:&error]; + return; + } + + [SFHFKeychainUtils storeUsername:[self keychainUsername] andPassword:password forServerName:[self keychainServerName] updateExisting:YES error:&error]; +} + +- (NSString*)keychainPassword +{ + NSError* error; + return [SFHFKeychainUtils getPasswordForUsername:[self keychainUsername] andServerName:[self keychainServerName] error:&error]; +} + +- (NSString*)keychainDefaultPassword +{ + return [[UIDevice currentDevice] uniqueIdentifier]; +} + +#pragma mark - +#pragma mark Verification of encryption key against verification data + +- (BOOL)verifyPassword:(Encryptor*)decryptor +{ + return [[decryptor plaintextPassword] isEqualToString:[decryptor decryptString:[self encryptedVerificationData]]]; +} + +- (NSData*)encryptedVerificationData +{ + return [[NSUserDefaults standardUserDefaults] dataForKey:@"TSXMasterPasswordVerification"]; +} + +- (void)setEncryptedVerificationData:(Encryptor*)encryptor +{ + [[NSUserDefaults standardUserDefaults] setObject:[encryptor encryptString:[encryptor plaintextPassword]] forKey:@"TSXMasterPasswordVerification"]; +} + +@end diff --git a/client/iOS/Controllers/HelpController.h b/client/iOS/Controllers/HelpController.h new file mode 100644 index 000000000..ad3cfe7b3 --- /dev/null +++ b/client/iOS/Controllers/HelpController.h @@ -0,0 +1,16 @@ +/* + Application help controller + + 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 HelpController : UIViewController +{ + UIWebView* webView; +} +@end diff --git a/client/iOS/Controllers/HelpController.m b/client/iOS/Controllers/HelpController.m new file mode 100644 index 000000000..61a05a46c --- /dev/null +++ b/client/iOS/Controllers/HelpController.m @@ -0,0 +1,81 @@ +/* + Application help controller + + 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 "HelpController.h" +#import "Utils.h" + +@implementation HelpController + +- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil +{ + self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; + if (self) { + // set title and tab-bar image + [self setTitle:NSLocalizedString(@"Help", @"Help Controller title")]; + UIImage* tabBarIcon = [UIImage imageWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"tabbar_icon_help" ofType:@"png"]]; + [self setTabBarItem:[[UITabBarItem alloc] initWithTitle:NSLocalizedString(@"Help", @"Tabbar item help") image:tabBarIcon tag:0]]; + } + return self; +} + +// Implement loadView to create a view hierarchy programmatically, without using a nib. +- (void)loadView +{ + webView = [[[UIWebView alloc] initWithFrame:CGRectZero] autorelease]; + [webView setAutoresizingMask:(UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight)]; + [webView setAutoresizesSubviews:YES]; + [webView setDelegate:self]; + [webView setDataDetectorTypes:UIDataDetectorTypeNone]; + [self setView:webView]; +} + +- (void)dealloc { + [super dealloc]; +} + +// Implement viewDidLoad to do additional setup after loading the view, typically from a nib. +- (void)viewDidLoad +{ + [super viewDidLoad]; + + NSString *filename = (IsPhone() ? @"gestures_phone" : @"gestures"); + NSString *htmlString = [[[NSString alloc] initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:filename ofType:@"html" inDirectory:@"help_page"] encoding:NSUTF8StringEncoding error:nil] autorelease]; + + [webView loadHTMLString:htmlString baseURL:[NSURL fileURLWithPath:[[[NSBundle mainBundle] bundlePath] stringByAppendingPathComponent:@"help_page"]]]; +} + +// Override to allow orientations other than the default portrait orientation. +- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation { + return YES; +} + +#pragma mark - +#pragma mark UIWebView callbacks +- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType +{ + if([[request URL] isFileURL]) + return YES; + + if(navigationType == UIWebViewNavigationTypeLinkClicked) + { + NSString* lastClickedLink = [[request URL] absoluteString]; + UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"External Link" + message:[NSString stringWithFormat:@"Open [%@] in Browser?", lastClickedLink] + delegate:self + cancelButtonTitle:@"OK" + otherButtonTitles:@"No", nil]; + [alert show]; + [alert release]; + + return NO; + } + return YES; +} + +@end diff --git a/client/iOS/Controllers/MainTabBarController.h b/client/iOS/Controllers/MainTabBarController.h new file mode 100644 index 000000000..796c1fa75 --- /dev/null +++ b/client/iOS/Controllers/MainTabBarController.h @@ -0,0 +1,17 @@ +/* + main tabbar controller + + 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 MainTabBarController : UITabBarController { + +} + +@end diff --git a/client/iOS/Controllers/MainTabBarController.m b/client/iOS/Controllers/MainTabBarController.m new file mode 100644 index 000000000..613f53b0a --- /dev/null +++ b/client/iOS/Controllers/MainTabBarController.m @@ -0,0 +1,20 @@ +/* + main tabbar controller + + 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 "MainTabBarController.h" + + +@implementation MainTabBarController + +-(BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation +{ + return YES; +} + +@end diff --git a/client/iOS/Controllers/PerformanceEditorController.h b/client/iOS/Controllers/PerformanceEditorController.h new file mode 100644 index 000000000..4d09ee680 --- /dev/null +++ b/client/iOS/Controllers/PerformanceEditorController.h @@ -0,0 +1,24 @@ +/* + controller for performance settings 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 "EditorBaseController.h" + +@class ConnectionParams; + +@interface PerformanceEditorController : EditorBaseController +{ +@private + ConnectionParams* _params; + NSString* _keyPath; +} + +- (id)initWithConnectionParams:(ConnectionParams*)params; +- (id)initWithConnectionParams:(ConnectionParams*)params keyPath:(NSString*)keyPath; + +@end diff --git a/client/iOS/Controllers/PerformanceEditorController.m b/client/iOS/Controllers/PerformanceEditorController.m new file mode 100644 index 000000000..104b13c13 --- /dev/null +++ b/client/iOS/Controllers/PerformanceEditorController.m @@ -0,0 +1,187 @@ +/* + controller for performance settings 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 "PerformanceEditorController.h" +#import "ConnectionParams.h" +#import "Utils.h" + +@interface PerformanceEditorController (Private) +-(NSString*)keyPathForKey:(NSString*)key; +@end + +@implementation PerformanceEditorController + +- (id)initWithConnectionParams:(ConnectionParams*)params +{ + return [self initWithConnectionParams:params keyPath:nil]; +} + +- (id)initWithConnectionParams:(ConnectionParams*)params keyPath:(NSString*)keyPath; +{ + self = [super initWithStyle:UITableViewStyleGrouped]; + if (self) { + _params = [params retain]; + _keyPath = (keyPath != nil ? [keyPath retain] : nil); + } + return self; +} + +- (void)viewDidLoad +{ + [super viewDidLoad]; + // Do any additional setup after loading the view. +} + +- (void)viewDidUnload +{ + [super viewDidUnload]; + // Release any retained subviews of the main view. +} + +- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation +{ + return YES; +} + +-(NSString*)keyPathForKey:(NSString*)key +{ + if (_keyPath) + return [_keyPath stringByAppendingFormat:@".%@", key]; + return key; +} + +#pragma mark - +#pragma mark Table view data source + +- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { + // Return the number of sections. + return 1; +} + + +- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { + return 7; +} + + +// set section headers +- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section +{ + return NSLocalizedString(@"Performance Settings", @"'Performance Settings': performance settings header"); +} + +// Customize the appearance of table view cells. +- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { + + // get the table view cell + EditFlagTableViewCell *cell = (EditFlagTableViewCell*)[self tableViewCellFromIdentifier:TableCellIdentifierYesNo]; + NSAssert(cell, @"Invalid cell"); + + switch ([indexPath row]) + { + case 0: + { + [[cell label] setText:NSLocalizedString(@"RemoteFX", @"RemoteFX performance setting")]; + [[cell toggle] setOn:[_params boolForKeyPath:[self keyPathForKey:@"perf_remotefx"]]]; + break; + } + + case 1: + { + [[cell label] setText:NSLocalizedString(@"Desktop Background", @"Desktop background performance setting")]; + [[cell toggle] setOn:[_params boolForKeyPath:[self keyPathForKey:@"perf_show_desktop"]]]; + break; + } + + case 2: + { + [[cell label] setText:NSLocalizedString(@"Font Smoothing", @"Font smoothing performance setting")]; + [[cell toggle] setOn:[_params boolForKeyPath:[self keyPathForKey:@"perf_font_smoothing"]]]; + break; + } + + case 3: + { + [[cell label] setText:NSLocalizedString(@"Desktop Composition", @"Desktop composition performance setting")]; + [[cell toggle] setOn:[_params boolForKeyPath:[self keyPathForKey:@"perf_desktop_composition"]]]; + break; + } + + case 4: + { + [[cell label] setText:NSLocalizedString(@"Window contents while dragging", @"Window Dragging performance setting")]; + [[cell toggle] setOn:[_params boolForKeyPath:[self keyPathForKey:@"perf_window_dragging"]]]; + break; + } + + case 5: + { + [[cell label] setText:NSLocalizedString(@"Menu Animation", @"Menu Animations performance setting")]; + [[cell toggle] setOn:[_params boolForKeyPath:[self keyPathForKey:@"perf_menu_animation"]]]; + break; + } + + case 6: + { + [[cell label] setText:NSLocalizedString(@"Visual Styles", @"Use Themes performance setting")]; + [[cell toggle] setOn:[_params boolForKeyPath:[self keyPathForKey:@"perf_windows_themes"]]]; + break; + } + + default: + break; + } + + [[cell toggle] setTag:GET_TAG_FROM_PATH(indexPath)]; + [[cell toggle] addTarget:self action:@selector(togglePerformanceSetting:) forControlEvents:UIControlEventValueChanged]; + return cell; +} + +#pragma mark - +#pragma mark Action Handlers + +- (void)togglePerformanceSetting:(id)sender +{ + UISwitch* valueSwitch = (UISwitch*)sender; + switch(valueSwitch.tag) + { + case GET_TAG(0, 0): + [_params setBool:[valueSwitch isOn] forKeyPath:[self keyPathForKey:@"perf_remotefx"]]; + break; + + case GET_TAG(0, 1): + [_params setBool:[valueSwitch isOn] forKeyPath:[self keyPathForKey:@"perf_show_desktop"]]; + break; + + case GET_TAG(0, 2): + [_params setBool:[valueSwitch isOn] forKeyPath:[self keyPathForKey:@"perf_font_smoothing"]]; + break; + + case GET_TAG(0, 3): + [_params setBool:[valueSwitch isOn] forKeyPath:[self keyPathForKey:@"perf_desktop_composition"]]; + break; + + case GET_TAG(0, 4): + [_params setBool:[valueSwitch isOn] forKeyPath:[self keyPathForKey:@"perf_window_dragging"]]; + break; + + case GET_TAG(0, 5): + [_params setBool:[valueSwitch isOn] forKeyPath:[self keyPathForKey:@"perf_menu_animation"]]; + break; + + case GET_TAG(0, 6): + [_params setBool:[valueSwitch isOn] forKeyPath:[self keyPathForKey:@"perf_windows_themes"]]; + break; + + default: + break; + } +} + +@end diff --git a/client/iOS/Controllers/RDPSessionViewController.h b/client/iOS/Controllers/RDPSessionViewController.h new file mode 100644 index 000000000..52502bf9a --- /dev/null +++ b/client/iOS/Controllers/RDPSessionViewController.h @@ -0,0 +1,69 @@ +/* + RDP Session View Controller + + 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" +#import "RDPKeyboard.h" +#import "RDPSessionView.h" +#import "TouchPointerView.h" +#import "AdvancedKeyboardView.h" + +@interface RDPSessionViewController : UIViewController +{ + // scrollview that hosts the rdp session view + IBOutlet UIScrollView* _session_scrollview; + + // rdp session view + IBOutlet RDPSessionView* _session_view; + + // touch pointer view + IBOutlet TouchPointerView* _touchpointer_view; + BOOL _autoscroll_with_touchpointer; + BOOL _is_autoscrolling; + + // rdp session toolbar + IBOutlet UIToolbar* _session_toolbar; + BOOL _session_toolbar_visible; + + // dummy text field used to display the keyboard + IBOutlet UITextField* _dummy_textfield; + + // connecting view and the controls within that view + IBOutlet UIView* _connecting_view; + IBOutlet UILabel* _lbl_connecting; + IBOutlet UIActivityIndicatorView* _connecting_indicator_view; + IBOutlet UIButton* _cancel_connect_button; + + // extended keyboard toolbar + UIToolbar* _keyboard_toolbar; + + // rdp session + RDPSession* _session; + BOOL _session_initilized; + + // flag that indicates whether the keyboard is visible or not + BOOL _keyboard_visible; + + // flag to switch between left/right mouse button mode + BOOL _toggle_mouse_button; + + // keyboard extension view + AdvancedKeyboardView* _advanced_keyboard_view; + BOOL _advanced_keyboard_visible; + BOOL _requesting_advanced_keyboard; + + // delayed mouse move event sending + NSTimer* _mouse_move_event_timer; + int _mouse_move_events_skipped; + CGPoint _prev_long_press_position; +} + +- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil session:(RDPSession*)session; + +@end diff --git a/client/iOS/Controllers/RDPSessionViewController.m b/client/iOS/Controllers/RDPSessionViewController.m new file mode 100644 index 000000000..08dbe7505 --- /dev/null +++ b/client/iOS/Controllers/RDPSessionViewController.m @@ -0,0 +1,980 @@ +/* + RDP Session View Controller + + 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 "RDPSessionViewController.h" +#import "RDPKeyboard.h" +#import "Utils.h" +#import "Toast+UIView.h" +#import "ConnectionParams.h" +#import "CredentialsInputController.h" +#import "VerifyCertificateController.h" + +#define TOOLBAR_HEIGHT 30 + +#define AUTOSCROLLDISTANCE 20 +#define AUTOSCROLLTIMEOUT 0.05 + +@interface RDPSessionViewController (Private) +-(void)showSessionToolbar:(BOOL)show; +-(UIToolbar*)keyboardToolbar; +-(void)initGestureRecognizers; +- (void)suspendSession; +- (NSDictionary*)eventDescriptorForMouseEvent:(int)event position:(CGPoint)position; +- (void)handleMouseMoveForPosition:(CGPoint)position; +@end + + +@implementation RDPSessionViewController + +#pragma mark class methods + +- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil session:(RDPSession *)session +{ + self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; + if (self) + { + _session = [session retain]; + [_session setDelegate:self]; + _session_initilized = NO; + + _mouse_move_events_skipped = 0; + _mouse_move_event_timer = nil; + + _advanced_keyboard_view = nil; + _advanced_keyboard_visible = NO; + _requesting_advanced_keyboard = NO; + + _session_toolbar_visible = NO; + + _toggle_mouse_button = NO; + + _autoscroll_with_touchpointer = [[NSUserDefaults standardUserDefaults] boolForKey:@"ui.auto_scroll_touchpointer"]; + _is_autoscrolling = NO; + + [UIView setAnimationDelegate:self]; + [UIView setAnimationDidStopSelector:@selector(animationStopped:finished:context:)]; + } + + return self; +} + +// Implement loadView to create a view hierarchy programmatically, without using a nib. +- (void)loadView +{ + // load default view and set background color and resizing mask + [super loadView]; + + // init keyboard handling vars and register required notification handlers + _keyboard_visible = NO; + [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillShow:) name: UIKeyboardWillShowNotification object:nil]; + [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardDidShow:) name: UIKeyboardDidShowNotification object:nil]; + [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillHide:) name: UIKeyboardWillHideNotification object:nil]; + [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardDidHide:) name: UIKeyboardDidHideNotification object:nil]; + + // init keyboard toolbar + _keyboard_toolbar = [[self keyboardToolbar] retain]; + [_dummy_textfield setInputAccessoryView:_keyboard_toolbar]; + + // init gesture recognizers + [self initGestureRecognizers]; + + // hide session toolbar + [_session_toolbar setFrame:CGRectMake(0.0, -TOOLBAR_HEIGHT, [[self view] bounds].size.width, TOOLBAR_HEIGHT)]; +} + + +// Implement viewDidLoad to do additional setup after loading the view, typically from a nib. +- (void)viewDidLoad +{ + [super viewDidLoad]; +} + + +- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation { + return YES; +} + +- (void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation +{ + if (![_touchpointer_view isHidden]) + [_touchpointer_view ensurePointerIsVisible]; +} + +- (void)didReceiveMemoryWarning { + // Releases the view if it doesn't have a superview. + [super didReceiveMemoryWarning]; + + // Release any cached data, images, etc. that aren't in use. +} + +- (void)viewDidUnload { + [super viewDidUnload]; + // Release any retained subviews of the main view. + // e.g. self.myOutlet = nil; +} + +- (void)viewWillAppear:(BOOL)animated +{ + [super viewWillAppear:animated]; + + // hide navigation bar and (if enabled) the status bar + if ([[NSUserDefaults standardUserDefaults] boolForKey:@"ui.hide_status_bar"]) + { + if(animated == YES) + [[UIApplication sharedApplication] setStatusBarHidden:YES withAnimation:UIStatusBarAnimationSlide]; + else + [[UIApplication sharedApplication] setStatusBarHidden:YES withAnimation:UIStatusBarAnimationNone]; + } + [[self navigationController] setNavigationBarHidden:YES animated:animated]; + + // if sesssion is suspended - notify that we got a new bitmap context + if ([_session isSuspended]) + [self sessionBitmapContextWillChange:_session]; + + // init keyboard + [[RDPKeyboard getSharedRDPKeyboard] initWithSession:_session delegate:self]; +} + +- (void)viewDidAppear:(BOOL)animated +{ + [super viewDidAppear:animated]; + + if (!_session_initilized) + { + if ([_session isSuspended]) + { + [_session resume]; + [self sessionBitmapContextDidChange:_session]; + [_session_view setNeedsDisplay]; + } + else + [_session connect]; + + _session_initilized = YES; + } +} + +- (void)viewWillDisappear:(BOOL)animated +{ + [super viewWillDisappear:animated]; + + // show navigation and status bar again + if(animated == YES) + [[UIApplication sharedApplication] setStatusBarHidden:NO withAnimation:UIStatusBarAnimationSlide]; + else + [[UIApplication sharedApplication] setStatusBarHidden:NO withAnimation:UIStatusBarAnimationNone]; + [[self navigationController] setNavigationBarHidden:NO animated:animated]; + + // reset all modifier keys on rdp keyboard + [[RDPKeyboard getSharedRDPKeyboard] reset]; + + // hide toolbar and keyboard + [self showSessionToolbar:NO]; + [_dummy_textfield resignFirstResponder]; +} + + +- (void)dealloc { + // remove any observers + [[NSNotificationCenter defaultCenter] removeObserver:self]; + + // the session lives on longer so set the delegate to nil + [_session setDelegate:nil]; + + [_advanced_keyboard_view release]; + [_keyboard_toolbar release]; + [_session release]; + [super dealloc]; +} + +#pragma mark - +#pragma mark ScrollView delegate methods + +- (UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView +{ + return _session_view; +} + +-(void)scrollViewDidEndZooming:(UIScrollView *)scrollView withView:(UIView *)view atScale:(float)scale +{ + NSLog(@"New zoom scale: %f", scale); + [_session_view setNeedsDisplay]; +} + +#pragma mark - +#pragma mark TextField delegate methods +-(BOOL)textFieldShouldBeginEditing:(UITextField *)textField +{ + _keyboard_visible = YES; + _advanced_keyboard_visible = NO; + return YES; +} + +-(BOOL)textFieldShouldEndEditing:(UITextField *)textField +{ + _keyboard_visible = NO; + _advanced_keyboard_visible = NO; + return YES; +} + +- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string +{ + if([string length] > 0) + { + for(int i = 0 ; i < [string length] ; i++) + { + NSString *characterTyped = [string substringWithRange:NSMakeRange(i, 1)]; + unichar curChar = [characterTyped characterAtIndex:0]; + + // special handling for return/enter key + if(curChar == '\n') + [[RDPKeyboard getSharedRDPKeyboard] sendEnterKeyStroke]; + else + [[RDPKeyboard getSharedRDPKeyboard] sendUnicode:curChar]; + } + } + else + { + [[RDPKeyboard getSharedRDPKeyboard] sendBackspaceKeyStroke]; + } + + return NO; +} + +#pragma mark - +#pragma mark AdvancedKeyboardDelegate functions +-(void)advancedKeyPressedVKey:(int)key +{ + [[RDPKeyboard getSharedRDPKeyboard] sendVirtualKeyCode:key]; +} + +-(void)advancedKeyPressedUnicode:(int)key +{ + [[RDPKeyboard getSharedRDPKeyboard] sendUnicode:key]; +} + +#pragma mark - RDP keyboard handler + +- (void)modifiersChangedForKeyboard:(RDPKeyboard *)keyboard +{ + UIBarButtonItem* curItem; + + // shift button (only on iPad) + int objectIdx = 0; + if (IsPad()) + { + objectIdx = 2; + curItem = (UIBarButtonItem*)[[_keyboard_toolbar items] objectAtIndex:objectIdx]; + [curItem setStyle:[keyboard shiftPressed] ? UIBarButtonItemStyleDone : UIBarButtonItemStyleBordered]; + } + + // ctrl button + objectIdx += 2; + curItem = (UIBarButtonItem*)[[_keyboard_toolbar items] objectAtIndex:objectIdx]; + [curItem setStyle:[keyboard ctrlPressed] ? UIBarButtonItemStyleDone : UIBarButtonItemStyleBordered]; + + // win button + objectIdx += 2; + curItem = (UIBarButtonItem*)[[_keyboard_toolbar items] objectAtIndex:objectIdx]; + [curItem setStyle:[keyboard winPressed] ? UIBarButtonItemStyleDone : UIBarButtonItemStyleBordered]; + + // alt button + objectIdx += 2; + curItem = (UIBarButtonItem*)[[_keyboard_toolbar items] objectAtIndex:objectIdx]; + [curItem setStyle:[keyboard altPressed] ? UIBarButtonItemStyleDone : UIBarButtonItemStyleBordered]; +} + +#pragma mark - +#pragma mark RDPSessionDelegate functions + +- (void)session:(RDPSession*)session didFailToConnect:(int)reason +{ + // remove and release connecting view + [_connecting_indicator_view stopAnimating]; + [_connecting_view removeFromSuperview]; + [_connecting_view autorelease]; + + // return to bookmark list + [[self navigationController] popViewControllerAnimated:YES]; +} + +- (void)sessionWillConnect:(RDPSession*)session +{ + // load connecting view + [[NSBundle mainBundle] loadNibNamed:@"RDPConnectingView" owner:self options:nil]; + + // set strings + [_lbl_connecting setText:NSLocalizedString(@"Connecting", @"Connecting progress view - label")]; + [_cancel_connect_button setTitle:NSLocalizedString(@"Cancel", @"Cancel Button") forState:UIControlStateNormal]; + + // center view and give it round corners + [_connecting_view setCenter:[[self view] center]]; + [[_connecting_view layer] setCornerRadius:10]; + + // display connecting view and start indicator + [[self view] addSubview:_connecting_view]; + [_connecting_indicator_view startAnimating]; +} + +- (void)sessionDidConnect:(RDPSession*)session +{ + // remove and release connecting view + [_connecting_indicator_view stopAnimating]; + [_connecting_view removeFromSuperview]; + [_connecting_view autorelease]; + + // check if session settings changed ... + // The 2nd width check is to ignore changes in resolution settings due to the RDVH display bug (refer to RDPSEssion.m for more details) + ConnectionParams* orig_params = [session params]; + rdpSettings* sess_params = [session getSessionParams]; + if (([orig_params intForKey:@"width"] != sess_params->DesktopWidth && [orig_params intForKey:@"width"] != (sess_params->DesktopWidth + 1)) || + [orig_params intForKey:@"height"] != sess_params->DesktopHeight || [orig_params intForKey:@"colors"] != sess_params->ColorDepth) + { + // display notification that the session params have been changed by the server + NSString* message = [NSString stringWithFormat:NSLocalizedString(@"The server changed the screen settings to %dx%dx%d", @"Screen settings not supported message with width, height and colors parameter"), sess_params->DesktopWidth, sess_params->DesktopHeight, sess_params->ColorDepth]; + [[self view] makeToast:message duration:ToastDurationNormal position:@"bottom"]; + } +} + +- (void)sessionWillDisconnect:(RDPSession*)session +{ + +} + +- (void)sessionDidDisconnect:(RDPSession*)session +{ + // return to bookmark list + [[self navigationController] popViewControllerAnimated:YES]; +} + +- (void)sessionBitmapContextWillChange:(RDPSession*)session +{ + // calc new view frame + rdpSettings* sess_params = [session getSessionParams]; + CGRect view_rect = CGRectMake(0, 0, sess_params->DesktopWidth, sess_params->DesktopHeight); + + // reset zoom level and update content size + [_session_scrollview setZoomScale:1.0]; + [_session_scrollview setContentSize:view_rect.size]; + + // set session view size + [_session_view setFrame:view_rect]; + + // show/hide toolbar + [_session setToolbarVisible:![[NSUserDefaults standardUserDefaults] boolForKey:@"ui.hide_tool_bar"]]; + [self showSessionToolbar:[_session toolbarVisible]]; +} + +- (void)sessionBitmapContextDidChange:(RDPSession*)session +{ + // associate view with session + [_session_view setSession:session]; +} + +- (void)session:(RDPSession*)session needsRedrawInRect:(CGRect)rect +{ + [_session_view setNeedsDisplayInRect:rect]; +} + +- (void)session:(RDPSession *)session requestsAuthenticationWithParams:(NSMutableDictionary *)params +{ + CredentialsInputController* view_controller = [[[CredentialsInputController alloc] initWithNibName:@"CredentialsInputView" bundle:nil session:_session params:params] autorelease]; + [self presentModalViewController:view_controller animated:YES]; +} + +- (void)session:(RDPSession *)session verifyCertificateWithParams:(NSMutableDictionary *)params +{ + VerifyCertificateController* view_controller = [[[VerifyCertificateController alloc] initWithNibName:@"VerifyCertificateView" bundle:nil session:_session params:params] autorelease]; + [self presentModalViewController:view_controller animated:YES]; +} + +- (CGSize)sizeForFitScreenForSession:(RDPSession*)session +{ + if (IsPad()) + return [self view].bounds.size; + else + { + // on phones make a resolution that has a 16:10 ratio with the phone's height + CGSize size = [self view].bounds.size; + CGFloat maxSize = (size.width > size.height) ? size.width : size.height; + return CGSizeMake(maxSize * 1.6f, maxSize); + } +} + +- (void)showGoProScreen:(RDPSession*)session +{ + UIAlertView* alertView = [[[UIAlertView alloc] initWithTitle:NSLocalizedString(@"Pro Version", @"Pro version dialog title") + message:NSLocalizedString(@"Do you want to buy Thinstuff RDC Pro and enable the full RDP Experience", @"Pro version dialog message") delegate:self cancelButtonTitle:NSLocalizedString(@"No", @"No Button title") otherButtonTitles:NSLocalizedString(@"Yes", @"Yes button title"), nil] autorelease]; + [alertView show]; +} + +#pragma mark - Keyboard Toolbar Handlers + +-(void)showAdvancedKeyboardAnimated +{ + // calc initial and final rect of the advanced keyboard view + CGRect rect = [[_keyboard_toolbar superview] bounds]; + rect.origin.y = [_keyboard_toolbar bounds].size.height; + rect.size.height -= rect.origin.y; + + // create new view (hidden) and add to host-view of keyboard toolbar + _advanced_keyboard_view = [[AdvancedKeyboardView alloc] initWithFrame:CGRectMake(rect.origin.x, + [[_keyboard_toolbar superview] bounds].size.height, + rect.size.width, rect.size.height) delegate:self]; + [[_keyboard_toolbar superview] addSubview:_advanced_keyboard_view]; + // we set autoresize to YES for the keyboard toolbar's superview so that our adv. keyboard view gets properly resized + [[_keyboard_toolbar superview] setAutoresizesSubviews:YES]; + + // show view with animation + [UIView beginAnimations:nil context:NULL]; + [_advanced_keyboard_view setFrame:rect]; + [UIView commitAnimations]; +} + +-(IBAction)toggleKeyboardWhenOtherVisible:(id)sender +{ + if(_advanced_keyboard_visible == NO) + { + [self showAdvancedKeyboardAnimated]; + } + else + { + // hide existing view + [UIView beginAnimations:@"hide_advanced_keyboard_view" context:NULL]; + CGRect rect = [_advanced_keyboard_view frame]; + rect.origin.y = [[_keyboard_toolbar superview] bounds].size.height; + [_advanced_keyboard_view setFrame:rect]; + [UIView commitAnimations]; + + // the view is released in the animationDidStop selector registered in init + } + + // toggle flag + _advanced_keyboard_visible = !_advanced_keyboard_visible; +} + +-(IBAction)toggleWinKey:(id)sender +{ + [[RDPKeyboard getSharedRDPKeyboard] toggleWinKey]; +} + +-(IBAction)toggleShiftKey:(id)sender +{ + [[RDPKeyboard getSharedRDPKeyboard] toggleShiftKey]; +} + +-(IBAction)toggleCtrlKey:(id)sender +{ + [[RDPKeyboard getSharedRDPKeyboard] toggleCtrlKey]; +} + +-(IBAction)toggleAltKey:(id)sender +{ + [[RDPKeyboard getSharedRDPKeyboard] toggleAltKey]; +} + +-(IBAction)pressEscKey:(id)sender +{ + [[RDPKeyboard getSharedRDPKeyboard] sendEscapeKeyStroke]; +} + +#pragma mark - +#pragma mark event handlers + +- (void)animationStopped:(NSString*)animationID finished:(NSNumber*)finished context:(void*)context +{ + if ([animationID isEqualToString:@"hide_advanced_keyboard_view"]) + { + // cleanup advanced keyboard view + [_advanced_keyboard_view removeFromSuperview]; + [_advanced_keyboard_view autorelease]; + _advanced_keyboard_view = nil; + } +} + +- (IBAction)switchSession:(id)sender +{ + [self suspendSession]; +} + +- (IBAction)toggleKeyboard:(id)sender +{ + if(!_keyboard_visible) + [_dummy_textfield becomeFirstResponder]; + else + [_dummy_textfield resignFirstResponder]; +} + +- (IBAction)toggleExtKeyboard:(id)sender +{ + // if the sys kb is shown but not the advanced kb then toggle the advanced kb + if(_keyboard_visible && !_advanced_keyboard_visible) + [self toggleKeyboardWhenOtherVisible:nil]; + else + { + // if not visible request the advanced keyboard view + if(_advanced_keyboard_visible == NO) + _requesting_advanced_keyboard = YES; + [self toggleKeyboard:nil]; + } +} + +- (IBAction)toggleTouchPointer:(id)sender +{ + BOOL toggle_visibilty = ![_touchpointer_view isHidden]; + [_touchpointer_view setHidden:toggle_visibilty]; + if(toggle_visibilty) + [_session_scrollview setContentInset:UIEdgeInsetsZero]; + else + [_session_scrollview setContentInset:[_touchpointer_view getEdgeInsets]]; +} + +- (IBAction)disconnectSession:(id)sender +{ + [_session disconnect]; +} + + +-(IBAction)cancelButtonPressed:(id)sender +{ + [_session disconnect]; +} + +#pragma mark In-App purchase transaction notification handlers + +- (void)onTransactionSuccess:(NSNotification*)notification +{ + UIAlertView* alertView = [[[UIAlertView alloc] initWithTitle:NSLocalizedString(@"Transaction Succeeded", @"Pro version bought dialog title") + message:NSLocalizedString(@"Thanks for buying Thinstuff RDC Pro. In order for the purchase to take effect please reconnect your current session.", @"Pro version bought dialog message") delegate:nil cancelButtonTitle:NSLocalizedString(@"OK", @"OK Button title") otherButtonTitles:nil] autorelease]; + [alertView show]; +} + +- (void)onTransactionFailed:(NSNotification*)notification +{ + UIAlertView* alertView = [[[UIAlertView alloc] initWithTitle:NSLocalizedString(@"Transaction Failed", @"Pro version buy failed dialog title") + message:NSLocalizedString(@"The transaction did not complete successfully!", @"Pro version buy failed dialog message") delegate:nil cancelButtonTitle:NSLocalizedString(@"OK", @"OK Button title") otherButtonTitles:nil] autorelease]; + [alertView show]; +} + +#pragma mark - +#pragma mark iOS Keyboard Notification Handlers + +- (void)keyboardWillShow:(NSNotification *)notification +{ + CGRect keyboardEndFrame = [[[notification userInfo] objectForKey:UIKeyboardFrameEndUserInfoKey] CGRectValue]; + + [UIView beginAnimations:nil context:NULL]; + [UIView setAnimationCurve:[[[notification userInfo] objectForKey:UIKeyboardAnimationCurveUserInfoKey] intValue]]; + [UIView setAnimationDuration:[[[notification userInfo] objectForKey:UIKeyboardAnimationDurationUserInfoKey] doubleValue]]; + CGRect frame = [_session_scrollview frame]; + frame.size.height -= [[self view] convertRect:keyboardEndFrame toView:nil].size.height; + [_session_scrollview setFrame:frame]; + [_touchpointer_view setFrame:frame]; + [UIView commitAnimations]; + + [_touchpointer_view ensurePointerIsVisible]; +} + +- (void)keyboardDidShow:(NSNotification *)notification +{ + if(_requesting_advanced_keyboard) + { + [self showAdvancedKeyboardAnimated]; + _advanced_keyboard_visible = YES; + _requesting_advanced_keyboard = NO; + } +} + +- (void)keyboardWillHide:(NSNotification *)notification +{ + CGRect keyboardEndFrame = [[[notification userInfo] objectForKey:UIKeyboardFrameEndUserInfoKey] CGRectValue]; + + [UIView beginAnimations:nil context:NULL]; + [UIView setAnimationCurve:[[[notification userInfo] objectForKey:UIKeyboardAnimationCurveUserInfoKey] intValue]]; + [UIView setAnimationDuration:[[[notification userInfo] objectForKey:UIKeyboardAnimationDurationUserInfoKey] doubleValue]]; + CGRect frame = [_session_scrollview frame]; + frame.size.height += [[self view] convertRect:keyboardEndFrame toView:nil].size.height; + [_session_scrollview setFrame:frame]; + [_touchpointer_view setFrame:frame]; + [UIView commitAnimations]; +} + +- (void)keyboardDidHide:(NSNotification*)notification +{ + // release adanced keyboard view + if(_advanced_keyboard_visible == YES) + { + _advanced_keyboard_visible = NO; + [_advanced_keyboard_view removeFromSuperview]; + [_advanced_keyboard_view autorelease]; + _advanced_keyboard_view = nil; + } +} + +#pragma mark - +#pragma mark Gesture handlers + +- (void)handleSingleTap:(UITapGestureRecognizer*)gesture +{ + CGPoint pos = [gesture locationInView:_session_view]; + if (_toggle_mouse_button) + { + [_session sendInputEvent:[self eventDescriptorForMouseEvent:GetRightMouseButtonClickEvent(YES) position:pos]]; + [_session sendInputEvent:[self eventDescriptorForMouseEvent:GetRightMouseButtonClickEvent(NO) position:pos]]; + } + else + { + [_session sendInputEvent:[self eventDescriptorForMouseEvent:GetLeftMouseButtonClickEvent(YES) position:pos]]; + [_session sendInputEvent:[self eventDescriptorForMouseEvent:GetLeftMouseButtonClickEvent(NO) position:pos]]; + } + + _toggle_mouse_button = NO; +} + +- (void)handleDoubleTap:(UITapGestureRecognizer*)gesture +{ + CGPoint pos = [gesture locationInView:_session_view]; + [_session sendInputEvent:[self eventDescriptorForMouseEvent:GetLeftMouseButtonClickEvent(YES) position:pos]]; + [_session sendInputEvent:[self eventDescriptorForMouseEvent:GetLeftMouseButtonClickEvent(NO) position:pos]]; + [_session sendInputEvent:[self eventDescriptorForMouseEvent:GetLeftMouseButtonClickEvent(YES) position:pos]]; + [_session sendInputEvent:[self eventDescriptorForMouseEvent:GetLeftMouseButtonClickEvent(NO) position:pos]]; + _toggle_mouse_button = NO; +} + +- (void)handleLongPress:(UILongPressGestureRecognizer*)gesture +{ + CGPoint pos = [gesture locationInView:_session_view]; + + if([gesture state] == UIGestureRecognizerStateBegan) + [_session sendInputEvent:[self eventDescriptorForMouseEvent:GetLeftMouseButtonClickEvent(YES) position:pos]]; + else if([gesture state] == UIGestureRecognizerStateChanged) + [self handleMouseMoveForPosition:pos]; + else if([gesture state] == UIGestureRecognizerStateEnded) + [_session sendInputEvent:[self eventDescriptorForMouseEvent:GetLeftMouseButtonClickEvent(NO) position:pos]]; +} + + +- (void)handleDoubleLongPress:(UILongPressGestureRecognizer*)gesture +{ + // this point is mapped against the scroll view because we want to have relative movement to the screen/scrollview + CGPoint pos = [gesture locationInView:_session_scrollview]; + + if([gesture state] == UIGestureRecognizerStateBegan) + _prev_long_press_position = pos; + else if([gesture state] == UIGestureRecognizerStateChanged) + { + int delta = _prev_long_press_position.y - pos.y; + + if(delta > GetScrollGestureDelta()) + { + [_session sendInputEvent:[self eventDescriptorForMouseEvent:GetMouseWheelEvent(YES) position:pos]]; + _prev_long_press_position = pos; + } + else if(delta < -GetScrollGestureDelta()) + { + [_session sendInputEvent:[self eventDescriptorForMouseEvent:GetMouseWheelEvent(NO) position:pos]]; + _prev_long_press_position = pos; + } + } +} + +-(void)handleSingle2FingersTap:(UITapGestureRecognizer*)gesture +{ + _toggle_mouse_button = !_toggle_mouse_button; +} + +-(void)handleSingle3FingersTap:(UITapGestureRecognizer*)gesture +{ + [_session setToolbarVisible:![_session toolbarVisible]]; + [self showSessionToolbar:[_session toolbarVisible]]; +} + +#pragma mark - +#pragma mark Touch Pointer delegates +// callback if touch pointer should be closed +-(void)touchPointerClose +{ + [self toggleTouchPointer:nil]; +} + +// callback for a left click action +-(void)touchPointerLeftClick:(CGPoint)pos down:(BOOL)down +{ + CGPoint session_view_pos = [_touchpointer_view convertPoint:pos toView:_session_view]; + [_session sendInputEvent:[self eventDescriptorForMouseEvent:GetLeftMouseButtonClickEvent(down) position:session_view_pos]]; +} + +// callback for a right click action +-(void)touchPointerRightClick:(CGPoint)pos down:(BOOL)down +{ + CGPoint session_view_pos = [_touchpointer_view convertPoint:pos toView:_session_view]; + [_session sendInputEvent:[self eventDescriptorForMouseEvent:GetRightMouseButtonClickEvent(down) position:session_view_pos]]; +} + +- (void)doAutoScrolling +{ + int scrollX = 0; + int scrollY = 0; + CGPoint curPointerPos = [_touchpointer_view getPointerPosition]; + CGRect viewBounds = [_touchpointer_view bounds]; + CGRect scrollBounds = [_session_view bounds]; + + // add content insets to scroll bounds + scrollBounds.size.width += [_session_scrollview contentInset].right; + scrollBounds.size.height += [_session_scrollview contentInset].bottom; + + // add zoom factor + scrollBounds.size.width *= [_session_scrollview zoomScale]; + scrollBounds.size.height *= [_session_scrollview zoomScale]; + + if (curPointerPos.x > (viewBounds.size.width - [_touchpointer_view getPointerWidth])) + scrollX = AUTOSCROLLDISTANCE; + else if (curPointerPos.x < 0) + scrollX = -AUTOSCROLLDISTANCE; + + if (curPointerPos.y > (viewBounds.size.height - [_touchpointer_view getPointerHeight])) + scrollY = AUTOSCROLLDISTANCE; + else if (curPointerPos.y < (_session_toolbar_visible ? TOOLBAR_HEIGHT : 0)) + scrollY = -AUTOSCROLLDISTANCE; + + CGPoint newOffset = [_session_scrollview contentOffset]; + newOffset.x += scrollX; + newOffset.y += scrollY; + + // if offset is going off screen - stop scrolling in that direction + if (newOffset.x < 0) + { + scrollX = 0; + newOffset.x = 0; + } + else if (newOffset.x > (scrollBounds.size.width - viewBounds.size.width)) + { + scrollX = 0; + newOffset.x = MAX(scrollBounds.size.width - viewBounds.size.width, 0); + } + if (newOffset.y < 0) + { + scrollY = 0; + newOffset.y = 0; + } + else if (newOffset.y > (scrollBounds.size.height - viewBounds.size.height)) + { + scrollY = 0; + newOffset.y = MAX(scrollBounds.size.height - viewBounds.size.height, 0); + } + + // perform scrolling + [_session_scrollview setContentOffset:newOffset]; + + // continue scrolling? + if (scrollX != 0 || scrollY != 0) + [self performSelector:@selector(doAutoScrolling) withObject:nil afterDelay:AUTOSCROLLTIMEOUT]; + else + _is_autoscrolling = NO; +} + +// callback for a right click action +-(void)touchPointerMove:(CGPoint)pos +{ + CGPoint session_view_pos = [_touchpointer_view convertPoint:pos toView:_session_view]; + [self handleMouseMoveForPosition:session_view_pos]; + + if (_autoscroll_with_touchpointer && !_is_autoscrolling) + { + _is_autoscrolling = YES; + [self performSelector:@selector(doAutoScrolling) withObject:nil afterDelay:AUTOSCROLLTIMEOUT]; + } +} + +// callback if scrolling is performed +-(void)touchPointerScrollDown:(BOOL)down +{ + [_session sendInputEvent:[self eventDescriptorForMouseEvent:GetMouseWheelEvent(down) position:CGPointZero]]; +} + +// callback for toggling the standard keyboard +-(void)touchPointerToggleKeyboard +{ + if(_advanced_keyboard_visible) + [self toggleKeyboardWhenOtherVisible:nil]; + else + [self toggleKeyboard:nil]; +} + +// callback for toggling the extended keyboard +-(void)touchPointerToggleExtendedKeyboard +{ + [self toggleExtKeyboard:nil]; +} + +// callback for reset view +-(void)touchPointerResetSessionView +{ + [_session_scrollview setZoomScale:1.0 animated:YES]; +} + +@end + + +@implementation RDPSessionViewController (Private) + +#pragma mark - +#pragma mark Helper functions + +-(void)showSessionToolbar:(BOOL)show +{ + // already shown or hidden? + if (_session_toolbar_visible == show) + return; + + if(show) + { + [UIView beginAnimations:@"showToolbar" context:nil]; + [UIView setAnimationDuration:.4]; + [UIView setAnimationCurve:UIViewAnimationCurveLinear]; + [_session_toolbar setFrame:CGRectMake(0.0, 0.0, [[self view] bounds].size.width, TOOLBAR_HEIGHT)]; + [UIView commitAnimations]; + _session_toolbar_visible = YES; + } + else + { + [UIView beginAnimations:@"hideToolbar" context:nil]; + [UIView setAnimationDuration:.4]; + [UIView setAnimationCurve:UIViewAnimationCurveLinear]; + [_session_toolbar setFrame:CGRectMake(0.0, -TOOLBAR_HEIGHT, [[self view] bounds].size.width, TOOLBAR_HEIGHT)]; + [UIView commitAnimations]; + _session_toolbar_visible = NO; + } +} + +-(UIToolbar*)keyboardToolbar +{ + UIToolbar* keyboard_toolbar = [[[UIToolbar alloc] initWithFrame:CGRectNull] autorelease]; + [keyboard_toolbar setBarStyle:UIBarStyleBlackOpaque]; + + UIBarButtonItem* esc_btn = [[[UIBarButtonItem alloc] initWithTitle:@"Esc" style:UIBarButtonItemStyleBordered target:self action:@selector(pressEscKey:)] autorelease]; + UIImage* win_icon = [UIImage imageWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"toolbar_icon_win" ofType:@"png"]]; + UIBarButtonItem* win_btn = [[[UIBarButtonItem alloc] initWithImage:win_icon style:UIBarButtonItemStyleBordered target:self action:@selector(toggleWinKey:)] autorelease]; + UIBarButtonItem* ctrl_btn = [[[UIBarButtonItem alloc] initWithTitle:@"Ctrl" style:UIBarButtonItemStyleBordered target:self action:@selector(toggleCtrlKey:)] autorelease]; + UIBarButtonItem* alt_btn = [[[UIBarButtonItem alloc] initWithTitle:@"Alt" style:UIBarButtonItemStyleBordered target:self action:@selector(toggleAltKey:)] autorelease]; + UIBarButtonItem* ext_btn = [[[UIBarButtonItem alloc] initWithTitle:@"Ext" style:UIBarButtonItemStyleBordered target:self action:@selector(toggleKeyboardWhenOtherVisible:)] autorelease]; + UIBarButtonItem* done_btn = [[[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemDone target:self action:@selector(toggleKeyboard:)] autorelease]; + UIBarButtonItem* flex_spacer = [[[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:nil action:nil] autorelease]; + + // iPad gets a shift button, iphone doesn't (there's just not enough space ...) + NSArray* items; + if(IsPad()) + { + UIBarButtonItem* shift_btn = [[[UIBarButtonItem alloc] initWithTitle:@"Shift" style:UIBarButtonItemStyleBordered target:self action:@selector(toggleShiftKey:)] autorelease]; + items = [NSArray arrayWithObjects:esc_btn, flex_spacer, + shift_btn, flex_spacer, + ctrl_btn, flex_spacer, + win_btn, flex_spacer, + alt_btn, flex_spacer, + ext_btn, flex_spacer, done_btn, nil]; + } + else + { + items = [NSArray arrayWithObjects:esc_btn, flex_spacer, ctrl_btn, flex_spacer, win_btn, flex_spacer, alt_btn, flex_spacer, ext_btn, flex_spacer, done_btn, nil]; + } + + [keyboard_toolbar setItems:items]; + [keyboard_toolbar sizeToFit]; + return keyboard_toolbar; +} + +- (void)initGestureRecognizers +{ + // single and double tap recognizer + UITapGestureRecognizer* doubleTapRecognizer = [[[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleDoubleTap:)] autorelease]; + [doubleTapRecognizer setNumberOfTouchesRequired:1]; + [doubleTapRecognizer setNumberOfTapsRequired:2]; + + UITapGestureRecognizer* singleTapRecognizer = [[[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleSingleTap:)] autorelease]; + [singleTapRecognizer requireGestureRecognizerToFail:doubleTapRecognizer]; + [singleTapRecognizer setNumberOfTouchesRequired:1]; + [singleTapRecognizer setNumberOfTapsRequired:1]; + + // 2 fingers - tap recognizer + UITapGestureRecognizer* single2FingersTapRecognizer = [[[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleSingle2FingersTap:)] autorelease]; + [single2FingersTapRecognizer setNumberOfTouchesRequired:2]; + [single2FingersTapRecognizer setNumberOfTapsRequired:1]; + + // long press gesture recognizer + UILongPressGestureRecognizer* longPressRecognizer = [[[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(handleLongPress:)] autorelease]; + [longPressRecognizer setMinimumPressDuration:0.5]; + + // double long press gesture recognizer + UILongPressGestureRecognizer* doubleLongPressRecognizer = [[[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(handleDoubleLongPress:)] autorelease]; + [doubleLongPressRecognizer setNumberOfTouchesRequired:2]; + [doubleLongPressRecognizer setMinimumPressDuration:0.5]; + + // 3 finger, single tap gesture for showing/hiding the toolbar + UITapGestureRecognizer* single3FingersTapRecognizer = [[[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleSingle3FingersTap:)] autorelease]; + [single3FingersTapRecognizer setNumberOfTapsRequired:1]; + [single3FingersTapRecognizer setNumberOfTouchesRequired:3]; + + // add gestures to scroll view + [_session_scrollview addGestureRecognizer:singleTapRecognizer]; + [_session_scrollview addGestureRecognizer:doubleTapRecognizer]; + [_session_scrollview addGestureRecognizer:single2FingersTapRecognizer]; + [_session_scrollview addGestureRecognizer:longPressRecognizer]; + [_session_scrollview addGestureRecognizer:doubleLongPressRecognizer]; + [_session_scrollview addGestureRecognizer:single3FingersTapRecognizer]; +} + +- (void)suspendSession +{ + // suspend session and pop navigation controller + [_session suspend]; + + // pop current view controller + [[self navigationController] popViewControllerAnimated:YES]; +} + +- (NSDictionary*)eventDescriptorForMouseEvent:(int)event position:(CGPoint)position +{ + return [NSDictionary dictionaryWithObjectsAndKeys: + @"mouse", @"type", + [NSNumber numberWithUnsignedShort:event], @"flags", + [NSNumber numberWithUnsignedShort:lrintf(position.x)], @"coord_x", + [NSNumber numberWithUnsignedShort:lrintf(position.y)], @"coord_y", + nil]; +} + +- (void)sendDelayedMouseEventWithTimer:(NSTimer*)timer +{ + _mouse_move_event_timer = nil; + NSDictionary* event = [timer userInfo]; + [_session sendInputEvent:event]; + [timer autorelease]; +} + +- (void)handleMouseMoveForPosition:(CGPoint)position +{ + NSDictionary* event = [self eventDescriptorForMouseEvent:PTR_FLAGS_MOVE position:position]; + + // cancel pending mouse move events + [_mouse_move_event_timer invalidate]; + _mouse_move_events_skipped++; + + if (_mouse_move_events_skipped >= 5) + { + [_session sendInputEvent:event]; + _mouse_move_events_skipped = 0; + } + else + { + [_mouse_move_event_timer autorelease]; + _mouse_move_event_timer = [[NSTimer scheduledTimerWithTimeInterval:0.05 target:self selector:@selector(sendDelayedMouseEventWithTimer:) userInfo:event repeats:NO] retain]; + } +} + +@end diff --git a/client/iOS/Controllers/ScreenSelectionController.h b/client/iOS/Controllers/ScreenSelectionController.h new file mode 100644 index 000000000..a972a6c4c --- /dev/null +++ b/client/iOS/Controllers/ScreenSelectionController.h @@ -0,0 +1,33 @@ +/* + controller for screen settings 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 "EditorBaseController.h" + +@class ConnectionParams; +@class OrderedDictionary; + +@interface ScreenSelectionController : EditorBaseController +{ +@private + NSString* _keyPath; + ConnectionParams* _params; + + // avaiable options + OrderedDictionary* _color_options; + NSArray* _resolution_modes; + + // current selections + int _selection_color; + int _selection_resolution; +} + +- (id)initWithConnectionParams:(ConnectionParams*)params; +- (id)initWithConnectionParams:(ConnectionParams*)params keyPath:(NSString*)keyPath; + +@end diff --git a/client/iOS/Controllers/ScreenSelectionController.m b/client/iOS/Controllers/ScreenSelectionController.m new file mode 100644 index 000000000..e0a553f16 --- /dev/null +++ b/client/iOS/Controllers/ScreenSelectionController.m @@ -0,0 +1,234 @@ +/* + controller for screen settings 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 "ScreenSelectionController.h" +#import "Utils.h" +#import "OrderedDictionary.h" +#import "ConnectionParams.h" + +@interface ScreenSelectionController (Private) +-(NSString*)keyPathForKey:(NSString*)key; +@end + +@implementation ScreenSelectionController + +- (id)initWithConnectionParams:(ConnectionParams*)params +{ + return [self initWithConnectionParams:params keyPath:nil]; +} + +- (id)initWithConnectionParams:(ConnectionParams*)params keyPath:(NSString*)keyPath +{ + self = [super initWithStyle:UITableViewStyleGrouped]; + if (self) + { + _params = [params retain]; + _keyPath = (keyPath != nil ? [keyPath retain] : nil); + + _color_options = (OrderedDictionary*)[SelectionForColorSetting() retain]; + _resolution_modes = [ResolutionModes() retain]; + + // init current selections + NSUInteger idx = [_color_options indexForValue:[NSNumber numberWithInt:[_params intForKeyPath:[self keyPathForKey:@"colors"]]]]; + _selection_color = (idx != NSNotFound) ? idx : 0; + + idx = [_resolution_modes indexOfObject:ScreenResolutionDescription([_params intForKeyPath:[self keyPathForKey:@"screen_resolution_type"]], + [_params intForKeyPath:[self keyPathForKey:@"width"]], + [_params intForKeyPath:[self keyPathForKey:@"height"]])]; + _selection_resolution = (idx != NSNotFound) ? idx : 0; + } + return self; +} + +- (void)dealloc +{ + [super dealloc]; + [_params autorelease]; + [_keyPath autorelease]; + [_color_options autorelease]; + [_resolution_modes autorelease]; +} + +-(NSString*)keyPathForKey:(NSString*)key +{ + if (_keyPath) + return [_keyPath stringByAppendingFormat:@".%@", key]; + return key; +} + +#pragma mark - View lifecycle + +- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation +{ + // Return YES for supported orientations + return YES; +} + +#pragma mark - Table view data source + +- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView +{ + return 2; +} + +- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section +{ + // Return the number of rows in the section. + if (section == 0) + return [_color_options count]; + return [_resolution_modes count] + 2; // +2 for custom width/height input fields +} + +- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath +{ + UITableViewCell *cell = nil; + switch ([indexPath section]) + { + case 0: + cell = [self tableViewCellFromIdentifier:TableCellIdentifierMultiChoice]; + [[cell textLabel] setText:[_color_options keyAtIndex:[indexPath row]]]; + break; + + case 1: + if ([indexPath row] < [_resolution_modes count]) + { + cell = [self tableViewCellFromIdentifier:TableCellIdentifierMultiChoice]; + [[cell textLabel] setText:[_resolution_modes objectAtIndex:[indexPath row]]]; + } + else + cell = [self tableViewCellFromIdentifier:TableCellIdentifierText]; + break; + + default: + break; + } + + if ([indexPath section] == 1) + { + BOOL enabled = ([_params intForKeyPath:[self keyPathForKey:@"screen_resolution_type"]] == TSXScreenOptionCustom); + if ([indexPath row] == [_resolution_modes count]) + { + int value = [_params intForKeyPath:[self keyPathForKey:@"width"]]; + EditTextTableViewCell* textCell = (EditTextTableViewCell*)cell; + [[textCell label] setText:NSLocalizedString(@"Width", @"Custom Screen Width")]; + [[textCell textfield] setText:[NSString stringWithFormat:@"%d", value ? value : 800]]; + [[textCell textfield] setKeyboardType:UIKeyboardTypeNumberPad]; + [[textCell label] setEnabled:enabled]; + [[textCell textfield] setEnabled:enabled]; + [[textCell textfield] setTag:1]; + } + else if ([indexPath row] == ([_resolution_modes count] + 1)) + { + int value = [_params intForKeyPath:[self keyPathForKey:@"height"]]; + EditTextTableViewCell* textCell = (EditTextTableViewCell*)cell; + [[textCell label] setText:NSLocalizedString(@"Height", @"Custom Screen Height")]; + [[textCell textfield] setText:[NSString stringWithFormat:@"%d", value ? value : 600]]; + [[textCell textfield] setKeyboardType:UIKeyboardTypeNumberPad]; + [[textCell label] setEnabled:enabled]; + [[textCell textfield] setEnabled:enabled]; + [[textCell textfield] setTag:2]; + } + } + + // set default checkmark + if([indexPath row] == ([indexPath section] == 0 ? _selection_color : _selection_resolution)) + [cell setAccessoryType:UITableViewCellAccessoryCheckmark]; + else + [cell setAccessoryType:UITableViewCellAccessoryNone]; + + return cell; +} + +#pragma mark - Table view delegate + +- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath +{ + // custom widht/height cells are not selectable + if ([indexPath section] == 1 && [indexPath row] >= [_resolution_modes count]) + return; + + // has selection change? + int cur_selection = ([indexPath section] == 0 ? _selection_color : _selection_resolution); + if([indexPath row] != cur_selection) + { + [tableView deselectRowAtIndexPath:indexPath animated:NO]; + + NSIndexPath* oldIndexPath = [NSIndexPath indexPathForRow:cur_selection inSection:[indexPath section]]; + + // clear old checkmark + UITableViewCell* old_sel_cell = [tableView cellForRowAtIndexPath:oldIndexPath]; + old_sel_cell.accessoryType = UITableViewCellAccessoryNone; + + // set new checkmark + UITableViewCell* new_sel_cell = [tableView cellForRowAtIndexPath:indexPath]; + new_sel_cell.accessoryType = UITableViewCellAccessoryCheckmark; + + if ([indexPath section] == 0) + { + // get value from color dictionary + int sel_value = [[_color_options valueForKey:[_color_options keyAtIndex:[indexPath row]]] intValue]; + + // update selection index and params value + [_params setInt:sel_value forKeyPath:[self keyPathForKey:@"colors"]]; + _selection_color = [indexPath row]; + } + else + { + // update selection index and params value + int width, height; + TSXScreenOptions mode; + ScanScreenResolution([_resolution_modes objectAtIndex:[indexPath row]], &width, &height, &mode); + [_params setInt:mode forKeyPath:[self keyPathForKey:@"screen_resolution_type"]]; + if (mode != TSXScreenOptionCustom) + { + [_params setInt:width forKeyPath:[self keyPathForKey:@"width"]]; + [_params setInt:height forKeyPath:[self keyPathForKey:@"height"]]; + } + _selection_resolution = [indexPath row]; + + // refresh width/height edit fields if custom selection changed + NSArray* indexPaths = [NSArray arrayWithObjects:[NSIndexPath indexPathForRow:[_resolution_modes count] inSection:1], + [NSIndexPath indexPathForRow:([_resolution_modes count] + 1) inSection:1], nil]; + [[self tableView] reloadRowsAtIndexPaths:indexPaths withRowAnimation:UITableViewRowAnimationNone]; + } + } +} + +#pragma mark - +#pragma mark Text Field delegate + +- (BOOL)textFieldShouldReturn:(UITextField*)textField +{ + [textField resignFirstResponder]; + return NO; +} + +- (BOOL)textFieldShouldEndEditing:(UITextField *)textField +{ + + switch([textField tag]) + { + // update resolution settings (and check for invalid input) + case 1: + if ([[textField text] intValue] < 640) [textField setText:@"640"]; + [_params setInt:[[textField text] intValue] forKeyPath:[self keyPathForKey:@"width"]]; + break; + + case 2: + if ([[textField text] intValue] < 480) [textField setText:@"480"]; + [_params setInt:[[textField text] intValue] forKeyPath:[self keyPathForKey:@"height"]]; + break; + + default: + break; + } + return YES; +} + +@end diff --git a/client/iOS/Controllers/VerifyCertificateController.h b/client/iOS/Controllers/VerifyCertificateController.h new file mode 100644 index 000000000..d842a4d8c --- /dev/null +++ b/client/iOS/Controllers/VerifyCertificateController.h @@ -0,0 +1,29 @@ +/* + Certificate verification controller + + 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 + +@class RDPSession; + +@interface VerifyCertificateController : UIViewController +{ +@private + IBOutlet UILabel* _label_issuer; + IBOutlet UIButton* _btn_accept; + IBOutlet UIButton* _btn_decline; + IBOutlet UILabel* _label_message; + IBOutlet UILabel* _label_for_issuer; + + RDPSession* _session; + NSMutableDictionary* _params; +} + +- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil session:(RDPSession*)session params:(NSMutableDictionary*)params; + +@end diff --git a/client/iOS/Controllers/VerifyCertificateController.m b/client/iOS/Controllers/VerifyCertificateController.m new file mode 100644 index 000000000..6390dd93e --- /dev/null +++ b/client/iOS/Controllers/VerifyCertificateController.m @@ -0,0 +1,79 @@ +/* + Certificate verification controller + + 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 "VerifyCertificateController.h" +#import "RDPSession.h" + +@implementation VerifyCertificateController + +- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil session:(RDPSession *)session params:(NSMutableDictionary *)params +{ + self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; + if (self) { + _session = session; + _params = params; + [self setModalPresentationStyle:UIModalPresentationFormSheet]; + } + return self; +} + +- (void)viewDidLoad +{ + [super viewDidLoad]; + + NSString* message = NSLocalizedString(@"The identity of the remote computer cannot be verified. Do you want to connect anyway?", @"Verify certificate view message"); + + // init strings + [_label_message setText:message]; + [_label_for_issuer setText:NSLocalizedString(@"Issuer:", @"Verify certificate view issuer label")]; + [_btn_accept setTitle:NSLocalizedString(@"Yes", @"Yes Button") forState:UIControlStateNormal]; + [_btn_decline setTitle:NSLocalizedString(@"No", @"No Button") forState:UIControlStateNormal]; + + [_label_issuer setText:[_params valueForKey:@"issuer"]]; +} + +- (void)viewDidUnload +{ + [super viewDidUnload]; + // Release any retained subviews of the main view. +} + +- (void)viewDidDisappear:(BOOL)animated +{ + [super viewDidDisappear:animated]; + + // set signal + [[_session uiRequestCompleted] signal]; +} + +- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation +{ + return YES; +} + + +#pragma mark - Action handlers + +- (IBAction)acceptPressed:(id)sender +{ + [_params setValue:[NSNumber numberWithBool:YES] forKey:@"result"]; + + // dismiss controller + [self dismissModalViewControllerAnimated:YES]; +} + +- (IBAction)declinePressed:(id)sender +{ + [_params setValue:[NSNumber numberWithBool:NO] forKey:@"result"]; + + // dismiss controller + [self dismissModalViewControllerAnimated:YES]; +} + +@end diff --git a/client/iOS/Defaults.plist b/client/iOS/Defaults.plist new file mode 100644 index 000000000..88e2113b1 --- /dev/null +++ b/client/iOS/Defaults.plist @@ -0,0 +1,72 @@ + + + + + TSXDefaultComputerBookmarkSettings + + hostname + + port + 3389 + screen_resolution_type + 0 + width + 1024 + height + 768 + colors + 16 + perf_font_smoothing + + perf_menu_animation + + perf_show_desktop + + perf_window_dragging + + perf_windows_themes + + perf_remotefx + + perf_desktop_composition + + enable_3g_settings + + settings_3g + + screen_resolution_type + 0 + width + 800 + height + 600 + colors + 16 + perf_remotefx + + perf_desktop_composition + + perf_windows_themes + + perf_window_dragging + + perf_show_desktop + + perf_menu_animation + + perf_font_smoothing + + + security + 0 + remote_program + + working_dir + + console + + + ui.auto_scroll_touchpointer + + + diff --git a/client/iOS/FreeRDP/ios_freerdp.h b/client/iOS/FreeRDP/ios_freerdp.h new file mode 100644 index 000000000..47820d7d2 --- /dev/null +++ b/client/iOS/FreeRDP/ios_freerdp.h @@ -0,0 +1,73 @@ +/* + RDP run-loop + + Copyright 2013 Thinstuff Technologies GmbH, Authors: Martin Fleisz, Dorian Johnson + + 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 +#import "TSXTypes.h" + +@class RDPSession, RDPSessionView; + +// FreeRDP extended structs +typedef struct mf_info mfInfo; + + +typedef struct mf_context +{ + rdpContext _p; + + mfInfo* mfi; + rdpSettings* settings; +} mfContext; + + +struct mf_info +{ + // RDP + freerdp* instance; + mfContext* context; + rdpContext* _context; + + // UI + RDPSession* session; + + // Graphics + CGContextRef bitmap_context; + + // Events + int event_pipe_producer, event_pipe_consumer; + + // Tracking connection state + volatile TSXConnectionState connection_state; + volatile BOOL unwanted; // set when controlling Session no longer wants the connection to continue +}; + + +#define MFI_FROM_INSTANCE(inst) (((mfContext*)((inst)->context))->mfi) + + +enum MF_EXIT_CODE +{ + MF_EXIT_SUCCESS = 0, + + MF_EXIT_CONN_FAILED = 128, + MF_EXIT_CONN_CANCELED = 129, + MF_EXIT_LOGON_TIMEOUT = 130, + + MF_EXIT_UNKNOWN = 255 +}; + +void ios_init_freerdp(); +void ios_uninit_freerdp(); +freerdp* ios_freerdp_new(); +int ios_run_freerdp(freerdp* instance); +void ios_freerdp_free(freerdp* instance); + + + + diff --git a/client/iOS/FreeRDP/ios_freerdp.m b/client/iOS/FreeRDP/ios_freerdp.m new file mode 100644 index 000000000..55738bee7 --- /dev/null +++ b/client/iOS/FreeRDP/ios_freerdp.m @@ -0,0 +1,289 @@ +/* + RDP run-loop + + Copyright 2013 Thinstuff Technologies GmbH, Authors: Martin Fleisz, Dorian Johnson + + 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 +#import + +#import "ios_freerdp.h" +#import "ios_freerdp_ui.h" +#import "ios_freerdp_events.h" + +#import "RDPSession.h" +#import "Utils.h" + + +#pragma mark Connection helpers + +static BOOL +ios_pre_connect(freerdp * instance) +{ + rdpSettings* settings = instance->settings; + + settings->AutoLogonEnabled = settings->Password && (strlen(settings->Password) > 0); + + // Verify screen width/height are sane + if ((settings->DesktopWidth < 64) || (settings->DesktopHeight < 64) || (settings->DesktopWidth > 4096) || (settings->DesktopHeight > 4096)) + { + NSLog(@"%s: invalid dimensions %d %d", __func__, settings->DesktopWidth, settings->DesktopHeight); + return FALSE; + } + + BOOL bitmap_cache = settings->BitmapCacheEnabled; + + settings->OrderSupport[NEG_DSTBLT_INDEX] = TRUE; + settings->OrderSupport[NEG_PATBLT_INDEX] = TRUE; + settings->OrderSupport[NEG_SCRBLT_INDEX] = TRUE; + settings->OrderSupport[NEG_OPAQUE_RECT_INDEX] = TRUE; + settings->OrderSupport[NEG_DRAWNINEGRID_INDEX] = FALSE; + settings->OrderSupport[NEG_MULTIDSTBLT_INDEX] = FALSE; + settings->OrderSupport[NEG_MULTIPATBLT_INDEX] = FALSE; + settings->OrderSupport[NEG_MULTISCRBLT_INDEX] = FALSE; + settings->OrderSupport[NEG_MULTIOPAQUERECT_INDEX] = TRUE; + settings->OrderSupport[NEG_MULTI_DRAWNINEGRID_INDEX] = FALSE; + settings->OrderSupport[NEG_LINETO_INDEX] = TRUE; + settings->OrderSupport[NEG_POLYLINE_INDEX] = TRUE; + settings->OrderSupport[NEG_MEMBLT_INDEX] = bitmap_cache; + settings->OrderSupport[NEG_MEM3BLT_INDEX] = TRUE; + settings->OrderSupport[NEG_MEMBLT_V2_INDEX] = bitmap_cache; + settings->OrderSupport[NEG_MEM3BLT_V2_INDEX] = FALSE; + settings->OrderSupport[NEG_SAVEBITMAP_INDEX] = FALSE; + settings->OrderSupport[NEG_GLYPH_INDEX_INDEX] = TRUE; + settings->OrderSupport[NEG_FAST_INDEX_INDEX] = TRUE; + settings->OrderSupport[NEG_FAST_GLYPH_INDEX] = TRUE; + settings->OrderSupport[NEG_POLYGON_SC_INDEX] = FALSE; + settings->OrderSupport[NEG_POLYGON_CB_INDEX] = FALSE; + settings->OrderSupport[NEG_ELLIPSE_SC_INDEX] = FALSE; + settings->OrderSupport[NEG_ELLIPSE_CB_INDEX] = FALSE; + + settings->FrameAcknowledge = 10; + +// freerdp_channels_pre_connect(instance->context->channels, instance); + + return TRUE; +} + +static BOOL ios_post_connect(freerdp* instance) +{ + mfInfo* mfi = MFI_FROM_INSTANCE(instance); + + instance->context->cache = cache_new(instance->settings); + + // Graphics callbacks + ios_allocate_display_buffer(mfi); + instance->update->BeginPaint = ios_ui_begin_paint; + instance->update->EndPaint = ios_ui_end_paint; + instance->update->DesktopResize = ios_ui_resize_window; + + // Channel allocation +// freerdp_channels_post_connect(instance->context->channels, instance); + + [mfi->session performSelectorOnMainThread:@selector(sessionDidConnect) withObject:nil waitUntilDone:YES]; + return TRUE; +} + +#pragma mark - +#pragma mark Running the connection + +int +ios_run_freerdp(freerdp * instance) +{ + mfContext* context = (mfContext*)instance->context; + mfInfo* mfi = context->mfi; +// rdpChannels* channels = instance->context->channels; + + mfi->connection_state = TSXConnectionConnecting; + + if (!freerdp_connect(instance)) + { + NSLog(@"%s: inst->rdp_connect failed", __func__); + return mfi->unwanted ? MF_EXIT_CONN_CANCELED : MF_EXIT_CONN_FAILED; + } + + if (mfi->unwanted) + return MF_EXIT_CONN_CANCELED; + + mfi->connection_state = TSXConnectionConnected; + + // Connection main loop + NSAutoreleasePool* pool; + int i; + int fds; + int max_fds; + int rcount; + int wcount; + void* rfds[32]; + void* wfds[32]; + fd_set rfds_set; + fd_set wfds_set; + + memset(rfds, 0, sizeof(rfds)); + memset(wfds, 0, sizeof(wfds)); + + while (1) + { + rcount = wcount = 0; + + pool = [[NSAutoreleasePool alloc] init]; + + if (freerdp_get_fds(instance, rfds, &rcount, wfds, &wcount) != TRUE) + { + NSLog(@"%s: inst->rdp_get_fds failed", __func__); + break; + } + +/* if (freerdp_channels_get_fds(channels, instance, rfds, &rcount, wfds, &wcount) != TRUE) + { + NSLog(@"%s: freerdp_chanman_get_fds failed", __func__); + break; + } +*/ + if (ios_events_get_fds(mfi, rfds, &rcount, wfds, &wcount) != TRUE) + { + NSLog(@"%s: ios_events_get_fds", __func__); + break; + } + + max_fds = 0; + FD_ZERO(&rfds_set); + FD_ZERO(&wfds_set); + + for (i = 0; i < rcount; i++) + { + fds = (int)(long)(rfds[i]); + + if (fds > max_fds) + max_fds = fds; + + FD_SET(fds, &rfds_set); + } + + if (max_fds == 0) + break; + + if (select(max_fds + 1, &rfds_set, &wfds_set, NULL, NULL) == -1) + { + /* these are not really errors */ + if (!((errno == EAGAIN) || + (errno == EWOULDBLOCK) || + (errno == EINPROGRESS) || + (errno == EINTR))) /* signal occurred */ + { + NSLog(@"%s: max_sck is zero.", __func__); + break; + } + } + + // Check the libfreerdp fds + if (freerdp_check_fds(instance) != true) + { + NSLog(@"%s: inst->rdp_check_fds failed.", __func__); + break; + } + + // Check input event fds + if (ios_events_check_fds(mfi, &rfds_set) != TRUE) + { + // This event will fail when the app asks for a disconnect. + //NSLog(@"%s: ios_events_check_fds failed: terminating connection.", __func__); + break; + } + + // Check channel fds +/* if (freerdp_channels_check_fds(channels, instance) != TRUE) + { + NSLog(@"%s: freerdp_chanman_check_fds failed", __func__); + break; + } +*/ + [pool release]; pool = nil; + } + + mfi->connection_state = TSXConnectionDisconnected; + + // Cleanup +// freerdp_channels_close(channels, instance); +// freerdp_channels_free(channels); + freerdp_disconnect(instance); + gdi_free(instance); + cache_free(instance->context->cache); + + [pool release]; pool = nil; + return MF_EXIT_SUCCESS; +} + +#pragma mark - +#pragma mark Context callbacks + +void ios_context_new(freerdp* instance, rdpContext* context) +{ + mfInfo* mfi = (mfInfo*)calloc(1, sizeof(mfInfo)); + ((mfContext*) context)->mfi = mfi; +// context->channels = freerdp_channels_new(); + ios_events_create_pipe(mfi); + + mfi->_context = context; + mfi->context = (mfContext*)context; + mfi->context->settings = instance->settings; + mfi->instance = instance; +} + +void ios_context_free(freerdp* instance, rdpContext* context) +{ + mfInfo* mfi = ((mfContext*) context)->mfi; + ios_events_free_pipe(mfi); + free(mfi); +} + +#pragma mark - +#pragma mark Initialization and cleanup + +freerdp* ios_freerdp_new() +{ + freerdp* inst = freerdp_new(); + + inst->PreConnect = ios_pre_connect; + inst->PostConnect = ios_post_connect; + inst->Authenticate = ios_ui_authenticate; + inst->VerifyCertificate = ios_ui_check_certificate; + inst->VerifyChangedCertificate = ios_ui_check_changed_certificate; + + inst->context_size = sizeof(mfContext); + inst->ContextNew = ios_context_new; + inst->ContextFree = ios_context_free; + freerdp_context_new(inst); + + // determine new home path + NSString* home_path = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject]; + free(inst->settings->HomePath); + free(inst->settings->ConfigPath); + inst->settings->HomePath = strdup([home_path UTF8String]); + inst->settings->ConfigPath = NULL; + freerdp_detect_paths(inst->settings); + + return inst; +} + +void ios_freerdp_free(freerdp* instance) +{ + freerdp_context_free(instance); + freerdp_free(instance); +} + +void ios_init_freerdp() +{ + signal(SIGPIPE, SIG_IGN); +// freerdp_channels_global_init(); +} + +void ios_uninit_freerdp() +{ +// freerdp_channels_global_uninit(); +} + diff --git a/client/iOS/FreeRDP/ios_freerdp_events.h b/client/iOS/FreeRDP/ios_freerdp_events.h new file mode 100755 index 000000000..d2f9e799d --- /dev/null +++ b/client/iOS/FreeRDP/ios_freerdp_events.h @@ -0,0 +1,24 @@ +/* + RDP event queuing + + Copyright 2013 Thinstuff Technologies GmbH, Author: Dorian Johnson + + 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/. + */ + +#ifndef IOS_RDP_EVENT_H +#define IOS_RDP_EVENT_H + +#import "ios_freerdp.h" + +// For UI: use to send events +BOOL ios_events_send(mfInfo* mfi, NSDictionary * event_description); + +// For connection runloop: use to poll for queued input events +BOOL ios_events_get_fds(mfInfo* mfi, void ** read_fds, int * read_count, void ** write_fds, int * write_count); +BOOL ios_events_check_fds(mfInfo* mfi, fd_set* rfds); +BOOL ios_events_create_pipe(mfInfo* mfi); +void ios_events_free_pipe(mfInfo* mfi); + +#endif /* IOS_RDP_EVENT_H */ diff --git a/client/iOS/FreeRDP/ios_freerdp_events.m b/client/iOS/FreeRDP/ios_freerdp_events.m new file mode 100755 index 000000000..be1648564 --- /dev/null +++ b/client/iOS/FreeRDP/ios_freerdp_events.m @@ -0,0 +1,145 @@ +/* + RDP event queuing + + Copyright 2013 Thinstuff Technologies GmbH, Author: Dorian Johnson + + 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/. + */ + +#include "ios_freerdp_events.h" + +#pragma mark - +#pragma mark Sending compacted input events (from main thread) + +// While this function may be called from any thread that has an autorelease pool allocated, it is not threadsafe: caller is responsible for synchronization +BOOL ios_events_send(mfInfo* mfi, NSDictionary * event_description) +{ + NSData * encoded_description = [NSKeyedArchiver archivedDataWithRootObject:event_description]; + + if ([encoded_description length] > 32000 || (mfi->event_pipe_producer == -1) ) + return FALSE; + + uint32_t archived_data_len = (uint32_t)[encoded_description length]; + + //NSLog(@"writing %d bytes to input event pipe", archived_data_len); + + if (write(mfi->event_pipe_producer, &archived_data_len, 4) == -1) + { + NSLog(@"%s: Failed to write length descriptor to pipe.", __func__); + return FALSE; + } + + if (write(mfi->event_pipe_producer, [encoded_description bytes], archived_data_len) == -1) + { + NSLog(@"%s: Failed to write %d bytes into the event queue (event type: %@).", __func__, (int)[encoded_description length], [event_description objectForKey:@"type"]); + return FALSE; + } + + return TRUE; +} + + +#pragma mark - +#pragma mark Processing compacted input events (from connection thread runloop) + +static BOOL ios_events_handle_event(mfInfo* mfi, NSDictionary * event_description) +{ + NSString * event_type = [event_description objectForKey:@"type"]; + BOOL should_continue = TRUE; + freerdp* instance = mfi->instance; + + if ([event_type isEqualToString:@"mouse"]) + { + instance->input->MouseEvent(instance->input, + [[event_description objectForKey:@"flags"] unsignedShortValue], + [[event_description objectForKey:@"coord_x"] unsignedShortValue], + [[event_description objectForKey:@"coord_y"] unsignedShortValue]); + } + else if ([event_type isEqualToString:@"keyboard"]) + { + if ([[event_description objectForKey:@"subtype"] isEqualToString:@"scancode"]) + instance->input->KeyboardEvent(instance->input, + [[event_description objectForKey:@"flags"] unsignedShortValue], + [[event_description objectForKey:@"scancode"] unsignedShortValue]); + else if ([[event_description objectForKey:@"subtype"] isEqualToString:@"unicode"]) + instance->input->UnicodeKeyboardEvent(instance->input, + [[event_description objectForKey:@"flags"] unsignedShortValue], + [[event_description objectForKey:@"unicode_char"] unsignedShortValue]); + else + NSLog(@"%s: doesn't know how to send keyboard input with subtype %@", __func__, [event_description objectForKey:@"subtype"]); + } + else if ([event_type isEqualToString:@"disconnect"]) + should_continue = FALSE; + else + NSLog(@"%s: unrecognized event type: %@", __func__, event_type); + + return should_continue; +} + +BOOL ios_events_check_fds(mfInfo* mfi, fd_set* rfds) +{ + if ( (mfi->event_pipe_consumer == -1) || !FD_ISSET(mfi->event_pipe_consumer, rfds)) + return TRUE; + + uint32_t archived_data_length = 0; + ssize_t bytes_read; + + // First, read the length of the blob + bytes_read = read(mfi->event_pipe_consumer, &archived_data_length, 4); + + if (bytes_read == -1 || archived_data_length < 1 || archived_data_length > 32000) + { + NSLog(@"%s: just read length descriptor. bytes_read=%ld, archived_data_length=%u", __func__, bytes_read, archived_data_length); + return FALSE; + } + + //NSLog(@"reading %d bytes from input event pipe", archived_data_length); + + NSMutableData * archived_object_data = [[NSMutableData alloc] initWithLength:archived_data_length]; + bytes_read = read(mfi->event_pipe_consumer, [archived_object_data mutableBytes], archived_data_length); + + if (bytes_read != archived_data_length) + { + NSLog(@"%s: attempted to read data; read %ld bytes but wanted %d bytes.", __func__, bytes_read, archived_data_length); + [archived_object_data release]; + return FALSE; + } + + id unarchived_object_data = [NSKeyedUnarchiver unarchiveObjectWithData:archived_object_data]; + [archived_object_data release]; + + return ios_events_handle_event(mfi, unarchived_object_data); +} + +BOOL ios_events_get_fds(mfInfo* mfi, void ** read_fds, int * read_count, void ** write_fds, int * write_count) +{ + read_fds[*read_count] = (void *)(long)(mfi->event_pipe_consumer); + (*read_count)++; + return TRUE; +} + +// Sets up the event pipe +BOOL ios_events_create_pipe(mfInfo* mfi) +{ + int pipe_fds[2]; + + if (pipe(pipe_fds) == -1) + { + NSLog(@"%s: pipe failed.", __func__); + return FALSE; + } + + mfi->event_pipe_consumer = pipe_fds[0]; + mfi->event_pipe_producer = pipe_fds[1]; + return TRUE; +} + +void ios_events_free_pipe(mfInfo* mfi) +{ + int consumer_fd = mfi->event_pipe_consumer, producer_fd = mfi->event_pipe_producer; + + mfi->event_pipe_consumer = mfi->event_pipe_producer = -1; + close(producer_fd); + close(consumer_fd); +} diff --git a/client/iOS/FreeRDP/ios_freerdp_ui.h b/client/iOS/FreeRDP/ios_freerdp_ui.h new file mode 100644 index 000000000..a87a56882 --- /dev/null +++ b/client/iOS/FreeRDP/ios_freerdp_ui.h @@ -0,0 +1,21 @@ +/* + RDP ui callbacks + + Copyright 2013 Thinstuff Technologies GmbH, Authors: Martin Fleisz, Dorian Johnson + + 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 "ios_freerdp.h" + +void ios_ui_begin_paint(rdpContext * context); +void ios_ui_end_paint(rdpContext * context); +void ios_ui_resize_window(rdpContext * context); + +BOOL ios_ui_authenticate(freerdp * instance, char** username, char** password, char** domain); +BOOL ios_ui_check_certificate(freerdp * instance, char * subject, char * issuer, char * fingerprint); +BOOL ios_ui_check_changed_certificate(freerdp * instance, char * subject, char * issuer, char * new_fingerprint, char * old_fingerprint); + +void ios_allocate_display_buffer(mfInfo* mfi); +void ios_resize_display_buffer(mfInfo* mfi); diff --git a/client/iOS/FreeRDP/ios_freerdp_ui.m b/client/iOS/FreeRDP/ios_freerdp_ui.m new file mode 100644 index 000000000..436fa5038 --- /dev/null +++ b/client/iOS/FreeRDP/ios_freerdp_ui.m @@ -0,0 +1,154 @@ +/* + RDP ui callbacks + + Copyright 2013 Thinstuff Technologies GmbH, Authors: Martin Fleisz, Dorian Johnson + + 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 +#import "ios_freerdp_ui.h" + +#import "RDPSession.h" + +#pragma mark - +#pragma mark Certificate authentication + +BOOL ios_ui_authenticate(freerdp * instance, char** username, char** password, char** domain) +{ + mfInfo* mfi = MFI_FROM_INSTANCE(instance); + + NSMutableDictionary* params = [NSMutableDictionary dictionaryWithObjectsAndKeys: + (*username) ? [NSString stringWithUTF8String:*username] : @"", @"username", + (*password) ? [NSString stringWithUTF8String:*password] : @"", @"password", + (*domain) ? [NSString stringWithUTF8String:*domain] : @"", @"domain", + [NSString stringWithUTF8String:instance->settings->ServerHostname], @"hostname", // used for the auth prompt message; not changed + nil]; + + // request auth UI + [mfi->session performSelectorOnMainThread:@selector(sessionRequestsAuthenticationWithParams:) withObject:params waitUntilDone:YES]; + + // wait for UI request to be completed + [[mfi->session uiRequestCompleted] lock]; + [[mfi->session uiRequestCompleted] wait]; + [[mfi->session uiRequestCompleted] unlock]; + + if (![[params valueForKey:@"result"] boolValue]) + { + mfi->unwanted = YES; + return FALSE; + } + + // Free old values + free(*username); + free(*password); + free(*domain); + + // set values back + *username = strdup([[params objectForKey:@"username"] UTF8String]); + *password = strdup([[params objectForKey:@"password"] UTF8String]); + *domain = strdup([[params objectForKey:@"domain"] UTF8String]); + + return TRUE; +} + +BOOL ios_ui_check_certificate(freerdp * instance, char * subject, char * issuer, char * fingerprint) +{ + // check whether we accept all certificates + if ([[NSUserDefaults standardUserDefaults] boolForKey:@"security.accept_certificates"] == YES) + return TRUE; + + mfInfo* mfi = MFI_FROM_INSTANCE(instance); + NSMutableDictionary* params = [NSMutableDictionary dictionaryWithObjectsAndKeys: + (subject) ? [NSString stringWithUTF8String:subject] : @"", @"subject", + (issuer) ? [NSString stringWithUTF8String:issuer] : @"", @"issuer", + (fingerprint) ? [NSString stringWithUTF8String:subject] : @"", @"fingerprint", + nil]; + + // request certificate verification UI + [mfi->session performSelectorOnMainThread:@selector(sessionVerifyCertificateWithParams:) withObject:params waitUntilDone:YES]; + + // wait for UI request to be completed + [[mfi->session uiRequestCompleted] lock]; + [[mfi->session uiRequestCompleted] wait]; + [[mfi->session uiRequestCompleted] unlock]; + + if (![[params valueForKey:@"result"] boolValue]) + { + mfi->unwanted = YES; + return FALSE; + } + + return TRUE; +} + +BOOL ios_ui_check_changed_certificate(freerdp * instance, char * subject, char * issuer, char * new_fingerprint, char * old_fingerprint) +{ + return ios_ui_check_certificate(instance, subject, issuer, new_fingerprint); +} + + +#pragma mark - +#pragma mark Graphics updates + +void ios_ui_begin_paint(rdpContext * context) +{ + rdpGdi *gdi = context->gdi; + gdi->primary->hdc->hwnd->invalid->null = 1; +} + +void ios_ui_end_paint(rdpContext * context) +{ + mfInfo* mfi = MFI_FROM_INSTANCE(context->instance); + rdpGdi *gdi = context->gdi; + CGRect dirty_rect = CGRectMake(gdi->primary->hdc->hwnd->invalid->x, gdi->primary->hdc->hwnd->invalid->y, gdi->primary->hdc->hwnd->invalid->w, gdi->primary->hdc->hwnd->invalid->h); + + [mfi->session performSelectorOnMainThread:@selector(setNeedsDisplayInRectAsValue:) withObject:[NSValue valueWithCGRect:dirty_rect] waitUntilDone:NO]; +} + + +void ios_ui_resize_window(rdpContext * context) +{ + ios_resize_display_buffer(MFI_FROM_INSTANCE(context->instance)); +} + + +#pragma mark - +#pragma mark Exported + +static void ios_create_bitmap_context(mfInfo* mfi) +{ + [mfi->session performSelectorOnMainThread:@selector(sessionBitmapContextWillChange) withObject:nil waitUntilDone:YES]; + + rdpGdi* gdi = mfi->instance->context->gdi; + CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB(); + if(gdi->dstBpp == 16) + mfi->bitmap_context = CGBitmapContextCreate(gdi->primary_buffer, gdi->width, gdi->height, 5, gdi->width * 2, colorSpace, kCGBitmapByteOrder16Little | kCGImageAlphaNoneSkipFirst); + else + mfi->bitmap_context = CGBitmapContextCreate(gdi->primary_buffer, gdi->width, gdi->height, 8, gdi->width * 4, colorSpace, kCGBitmapByteOrder32Little | kCGImageAlphaNoneSkipFirst); + CGColorSpaceRelease(colorSpace); + + [mfi->session performSelectorOnMainThread:@selector(sessionBitmapContextDidChange) withObject:nil waitUntilDone:YES]; +} + +void ios_allocate_display_buffer(mfInfo* mfi) +{ + gdi_init(mfi->instance, CLRCONV_RGB555 | ((mfi->instance->settings->ColorDepth > 16) ? CLRBUF_32BPP : CLRBUF_16BPP), NULL); + ios_create_bitmap_context(mfi); +} + +void ios_resize_display_buffer(mfInfo* mfi) +{ + // Release the old context in a thread-safe manner + CGContextRef old_context = mfi->bitmap_context; + mfi->bitmap_context = NULL; + CGContextRelease(old_context); + + // Create the new context + gdi_resize(mfi->instance->context->gdi, mfi->instance->settings->DesktopWidth, mfi->instance->settings->DesktopHeight); + ios_create_bitmap_context(mfi); +} + diff --git a/client/iOS/Misc/Reachability.h b/client/iOS/Misc/Reachability.h new file mode 100755 index 000000000..fa5f9b64a --- /dev/null +++ b/client/iOS/Misc/Reachability.h @@ -0,0 +1,89 @@ +/* + + File: Reachability.h + Abstract: Basic demonstration of how to use the SystemConfiguration Reachablity APIs. + + Version: 2.2 + + Disclaimer: IMPORTANT: This Apple software is supplied to you by Apple Inc. + ("Apple") in consideration of your agreement to the following terms, and your + use, installation, modification or redistribution of this Apple software + constitutes acceptance of these terms. If you do not agree with these terms, + please do not use, install, modify or redistribute this Apple software. + + In consideration of your agreement to abide by the following terms, and subject + to these terms, Apple grants you a personal, non-exclusive license, under + Apple's copyrights in this original Apple software (the "Apple Software"), to + use, reproduce, modify and redistribute the Apple Software, with or without + modifications, in source and/or binary forms; provided that if you redistribute + the Apple Software in its entirety and without modifications, you must retain + this notice and the following text and disclaimers in all such redistributions + of the Apple Software. + Neither the name, trademarks, service marks or logos of Apple Inc. may be used + to endorse or promote products derived from the Apple Software without specific + prior written permission from Apple. Except as expressly stated in this notice, + no other rights or licenses, express or implied, are granted by Apple herein, + including but not limited to any patent rights that may be infringed by your + derivative works or by other works in which the Apple Software may be + incorporated. + + The Apple Software is provided by Apple on an "AS IS" basis. APPLE MAKES NO + WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION THE IMPLIED + WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS FOR A PARTICULAR + PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND OPERATION ALONE OR IN + COMBINATION WITH YOUR PRODUCTS. + + IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL OR + CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + ARISING IN ANY WAY OUT OF THE USE, REPRODUCTION, MODIFICATION AND/OR + DISTRIBUTION OF THE APPLE SOFTWARE, HOWEVER CAUSED AND WHETHER UNDER THEORY OF + CONTRACT, TORT (INCLUDING NEGLIGENCE), STRICT LIABILITY OR OTHERWISE, EVEN IF + APPLE HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + Copyright (C) 2010 Apple Inc. All Rights Reserved. + +*/ + + +#import +#import +#import + +typedef enum { + NotReachable = 0, + ReachableViaWiFi = 1, + ReachableViaWWAN = 2 +} NetworkStatus; +#define kReachabilityChangedNotification @"kNetworkReachabilityChangedNotification" + +@interface Reachability: NSObject +{ + BOOL localWiFiRef; + SCNetworkReachabilityRef reachabilityRef; +} + +//reachabilityWithHostName- Use to check the reachability of a particular host name. ++ (Reachability*) reachabilityWithHostName: (NSString*) hostName; + +//reachabilityWithAddress- Use to check the reachability of a particular IP address. ++ (Reachability*) reachabilityWithAddress: (const struct sockaddr_in*) hostAddress; + +//reachabilityForInternetConnection- checks whether the default route is available. +// Should be used by applications that do not connect to a particular host ++ (Reachability*) reachabilityForInternetConnection; + +//reachabilityForLocalWiFi- checks whether a local wifi connection is available. ++ (Reachability*) reachabilityForLocalWiFi; + +//Start listening for reachability notifications on the current run loop +- (BOOL) startNotifier; +- (void) stopNotifier; + +- (NetworkStatus) currentReachabilityStatus; +//WWAN may be available, but not active until a connection has been established. +//WiFi may require a connection for VPN on Demand. +- (BOOL) connectionRequired; +@end + + diff --git a/client/iOS/Misc/Reachability.m b/client/iOS/Misc/Reachability.m new file mode 100755 index 000000000..5ecdcf4e3 --- /dev/null +++ b/client/iOS/Misc/Reachability.m @@ -0,0 +1,273 @@ +/* + + File: Reachability.m + Abstract: Basic demonstration of how to use the SystemConfiguration Reachablity APIs. + + Version: 2.2 + + Disclaimer: IMPORTANT: This Apple software is supplied to you by Apple Inc. + ("Apple") in consideration of your agreement to the following terms, and your + use, installation, modification or redistribution of this Apple software + constitutes acceptance of these terms. If you do not agree with these terms, + please do not use, install, modify or redistribute this Apple software. + + In consideration of your agreement to abide by the following terms, and subject + to these terms, Apple grants you a personal, non-exclusive license, under + Apple's copyrights in this original Apple software (the "Apple Software"), to + use, reproduce, modify and redistribute the Apple Software, with or without + modifications, in source and/or binary forms; provided that if you redistribute + the Apple Software in its entirety and without modifications, you must retain + this notice and the following text and disclaimers in all such redistributions + of the Apple Software. + Neither the name, trademarks, service marks or logos of Apple Inc. may be used + to endorse or promote products derived from the Apple Software without specific + prior written permission from Apple. Except as expressly stated in this notice, + no other rights or licenses, express or implied, are granted by Apple herein, + including but not limited to any patent rights that may be infringed by your + derivative works or by other works in which the Apple Software may be + incorporated. + + The Apple Software is provided by Apple on an "AS IS" basis. APPLE MAKES NO + WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION THE IMPLIED + WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS FOR A PARTICULAR + PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND OPERATION ALONE OR IN + COMBINATION WITH YOUR PRODUCTS. + + IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL OR + CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + ARISING IN ANY WAY OUT OF THE USE, REPRODUCTION, MODIFICATION AND/OR + DISTRIBUTION OF THE APPLE SOFTWARE, HOWEVER CAUSED AND WHETHER UNDER THEORY OF + CONTRACT, TORT (INCLUDING NEGLIGENCE), STRICT LIABILITY OR OTHERWISE, EVEN IF + APPLE HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + Copyright (C) 2010 Apple Inc. All Rights Reserved. + +*/ + +#import +#import +#import +#import +#import +#import + +#import + +#import "Reachability.h" + +#define kShouldPrintReachabilityFlags 1 + +static void PrintReachabilityFlags(SCNetworkReachabilityFlags flags, const char* comment) +{ +#if kShouldPrintReachabilityFlags + + NSLog(@"Reachability Flag Status: %c%c %c%c%c%c%c%c%c %s\n", + (flags & kSCNetworkReachabilityFlagsIsWWAN) ? 'W' : '-', + (flags & kSCNetworkReachabilityFlagsReachable) ? 'R' : '-', + + (flags & kSCNetworkReachabilityFlagsTransientConnection) ? 't' : '-', + (flags & kSCNetworkReachabilityFlagsConnectionRequired) ? 'c' : '-', + (flags & kSCNetworkReachabilityFlagsConnectionOnTraffic) ? 'C' : '-', + (flags & kSCNetworkReachabilityFlagsInterventionRequired) ? 'i' : '-', + (flags & kSCNetworkReachabilityFlagsConnectionOnDemand) ? 'D' : '-', + (flags & kSCNetworkReachabilityFlagsIsLocalAddress) ? 'l' : '-', + (flags & kSCNetworkReachabilityFlagsIsDirect) ? 'd' : '-', + comment + ); +#endif +} + + +@implementation Reachability +static void ReachabilityCallback(SCNetworkReachabilityRef target, SCNetworkReachabilityFlags flags, void* info) +{ + #pragma unused (target, flags) + NSCAssert(info != NULL, @"info was NULL in ReachabilityCallback"); + NSCAssert([(NSObject*) info isKindOfClass: [Reachability class]], @"info was wrong class in ReachabilityCallback"); + + //We're on the main RunLoop, so an NSAutoreleasePool is not necessary, but is added defensively + // in case someon uses the Reachablity object in a different thread. + NSAutoreleasePool* myPool = [[NSAutoreleasePool alloc] init]; + + Reachability* noteObject = (Reachability*) info; + // Post a notification to notify the client that the network reachability changed. + [[NSNotificationCenter defaultCenter] postNotificationName: kReachabilityChangedNotification object: noteObject]; + + [myPool release]; +} + +- (BOOL) startNotifier +{ + BOOL retVal = NO; + SCNetworkReachabilityContext context = {0, self, NULL, NULL, NULL}; + if(SCNetworkReachabilitySetCallback(reachabilityRef, ReachabilityCallback, &context)) + { + if(SCNetworkReachabilityScheduleWithRunLoop(reachabilityRef, CFRunLoopGetCurrent(), kCFRunLoopDefaultMode)) + { + retVal = YES; + } + } + return retVal; +} + +- (void) stopNotifier +{ + if(reachabilityRef!= NULL) + { + SCNetworkReachabilityUnscheduleFromRunLoop(reachabilityRef, CFRunLoopGetCurrent(), kCFRunLoopDefaultMode); + } +} + +- (void) dealloc +{ + [self stopNotifier]; + if(reachabilityRef!= NULL) + { + CFRelease(reachabilityRef); + } + [super dealloc]; +} + ++ (Reachability*) reachabilityWithHostName: (NSString*) hostName; +{ + Reachability* retVal = NULL; + SCNetworkReachabilityRef reachability = SCNetworkReachabilityCreateWithName(NULL, [hostName UTF8String]); + if(reachability!= NULL) + { + retVal= [[[self alloc] init] autorelease]; + if(retVal!= NULL) + { + retVal->reachabilityRef = reachability; + retVal->localWiFiRef = NO; + } + } + return retVal; +} + ++ (Reachability*) reachabilityWithAddress: (const struct sockaddr_in*) hostAddress; +{ + SCNetworkReachabilityRef reachability = SCNetworkReachabilityCreateWithAddress(kCFAllocatorDefault, (const struct sockaddr*)hostAddress); + Reachability* retVal = NULL; + if(reachability!= NULL) + { + retVal= [[[self alloc] init] autorelease]; + if(retVal!= NULL) + { + retVal->reachabilityRef = reachability; + retVal->localWiFiRef = NO; + } + } + return retVal; +} + ++ (Reachability*) reachabilityForInternetConnection; +{ + struct sockaddr_in zeroAddress; + bzero(&zeroAddress, sizeof(zeroAddress)); + zeroAddress.sin_len = sizeof(zeroAddress); + zeroAddress.sin_family = AF_INET; + return [self reachabilityWithAddress: &zeroAddress]; +} + ++ (Reachability*) reachabilityForLocalWiFi; +{ + struct sockaddr_in localWifiAddress; + bzero(&localWifiAddress, sizeof(localWifiAddress)); + localWifiAddress.sin_len = sizeof(localWifiAddress); + localWifiAddress.sin_family = AF_INET; + // IN_LINKLOCALNETNUM is defined in as 169.254.0.0 + localWifiAddress.sin_addr.s_addr = htonl(IN_LINKLOCALNETNUM); + Reachability* retVal = [self reachabilityWithAddress: &localWifiAddress]; + if(retVal!= NULL) + { + retVal->localWiFiRef = YES; + } + return retVal; +} + +#pragma mark Network Flag Handling + +- (NetworkStatus) localWiFiStatusForFlags: (SCNetworkReachabilityFlags) flags +{ + PrintReachabilityFlags(flags, "localWiFiStatusForFlags"); + + BOOL retVal = NotReachable; + if((flags & kSCNetworkReachabilityFlagsReachable) && (flags & kSCNetworkReachabilityFlagsIsDirect)) + { + retVal = ReachableViaWiFi; + } + return retVal; +} + +- (NetworkStatus) networkStatusForFlags: (SCNetworkReachabilityFlags) flags +{ + PrintReachabilityFlags(flags, "networkStatusForFlags"); + if ((flags & kSCNetworkReachabilityFlagsReachable) == 0) + { + // if target host is not reachable + return NotReachable; + } + + BOOL retVal = NotReachable; + + if ((flags & kSCNetworkReachabilityFlagsConnectionRequired) == 0) + { + // if target host is reachable and no connection is required + // then we'll assume (for now) that your on Wi-Fi + retVal = ReachableViaWiFi; + } + + + if ((((flags & kSCNetworkReachabilityFlagsConnectionOnDemand ) != 0) || + (flags & kSCNetworkReachabilityFlagsConnectionOnTraffic) != 0)) + { + // ... and the connection is on-demand (or on-traffic) if the + // calling application is using the CFSocketStream or higher APIs + + if ((flags & kSCNetworkReachabilityFlagsInterventionRequired) == 0) + { + // ... and no [user] intervention is needed + retVal = ReachableViaWiFi; + } + } + + if ((flags & kSCNetworkReachabilityFlagsIsWWAN) == kSCNetworkReachabilityFlagsIsWWAN) + { + // ... but WWAN connections are OK if the calling application + // is using the CFNetwork (CFSocketStream?) APIs. + retVal = ReachableViaWWAN; + } + return retVal; +} + +- (BOOL) connectionRequired; +{ + NSAssert(reachabilityRef != NULL, @"connectionRequired called with NULL reachabilityRef"); + SCNetworkReachabilityFlags flags; + if (SCNetworkReachabilityGetFlags(reachabilityRef, &flags)) + { + return (flags & kSCNetworkReachabilityFlagsConnectionRequired); + } + return NO; +} + +- (NetworkStatus) currentReachabilityStatus +{ + NSAssert(reachabilityRef != NULL, @"currentNetworkStatus called with NULL reachabilityRef"); + NetworkStatus retVal = NotReachable; + SCNetworkReachabilityFlags flags; + if (SCNetworkReachabilityGetFlags(reachabilityRef, &flags)) + { + if(localWiFiRef) + { + retVal = [self localWiFiStatusForFlags: flags]; + } + else + { + retVal = [self networkStatusForFlags: flags]; + } + } + return retVal; +} +@end diff --git a/client/iOS/Misc/SFHFKeychainUtils.h b/client/iOS/Misc/SFHFKeychainUtils.h new file mode 100755 index 000000000..45bd642b3 --- /dev/null +++ b/client/iOS/Misc/SFHFKeychainUtils.h @@ -0,0 +1,41 @@ +// +// SFHFKeychainUtils.h +// +// Created by Buzz Andersen on 10/20/08. +// Based partly on code by Jonathan Wight, Jon Crosby, and Mike Malone. +// Copyright 2008 Sci-Fi Hi-Fi. All rights reserved. +// +// Permission is hereby granted, free of charge, to any person +// obtaining a copy of this software and associated documentation +// files (the "Software"), to deal in the Software without +// restriction, including without limitation the rights to use, +// copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the +// Software is furnished to do so, subject to the following +// conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +// OTHER DEALINGS IN THE SOFTWARE. +// + +#import + + +@interface SFHFKeychainUtils : NSObject { + +} + ++ (NSString *) getPasswordForUsername: (NSString *) username andServerName: (NSString *) serverName error: (NSError **) error; ++ (BOOL) storeUsername: (NSString *) username andPassword: (NSString *) password forServerName: (NSString *) serverName updateExisting: (BOOL) updateExisting error: (NSError **) error; ++ (BOOL) deleteItemForUsername: (NSString *) username andServerName: (NSString *) serverName error: (NSError **) error; + +@end \ No newline at end of file diff --git a/client/iOS/Misc/SFHFKeychainUtils.m b/client/iOS/Misc/SFHFKeychainUtils.m new file mode 100755 index 000000000..dba1e4706 --- /dev/null +++ b/client/iOS/Misc/SFHFKeychainUtils.m @@ -0,0 +1,434 @@ +// +// SFHFKeychainUtils.m +// +// Created by Buzz Andersen on 10/20/08. +// Based partly on code by Jonathan Wight, Jon Crosby, and Mike Malone. +// Copyright 2008 Sci-Fi Hi-Fi. All rights reserved. +// +// Permission is hereby granted, free of charge, to any person +// obtaining a copy of this software and associated documentation +// files (the "Software"), to deal in the Software without +// restriction, including without limitation the rights to use, +// copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the +// Software is furnished to do so, subject to the following +// conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +// OTHER DEALINGS IN THE SOFTWARE. +// + +#import "SFHFKeychainUtils.h" +#import + +static NSString *SFHFKeychainUtilsErrorDomain = @"SFHFKeychainUtilsErrorDomain"; + +#if __IPHONE_OS_VERSION_MIN_REQUIRED < 30000 && TARGET_IPHONE_SIMULATOR +@interface SFHFKeychainUtils (PrivateMethods) ++ (SecKeychainItemRef) getKeychainItemReferenceForUsername: (NSString *) username andServerName: (NSString *) serverName error: (NSError **) error; +@end +#endif + +@implementation SFHFKeychainUtils + +#if __IPHONE_OS_VERSION_MIN_REQUIRED < 30000 && TARGET_IPHONE_SIMULATOR + ++ (NSString *) getPasswordForUsername: (NSString *) username andServerName: (NSString *) serverName error: (NSError **) error { + if (!username || !serviceName) { + *error = [NSError errorWithDomain: SFHFKeychainUtilsErrorDomain code: -2000 userInfo: nil]; + return nil; + } + + SecKeychainItemRef item = [SFHFKeychainUtils getKeychainItemReferenceForUsername: username andServerName: serverName error: error]; + + if (*error || !item) { + return nil; + } + + // from Advanced Mac OS X Programming, ch. 16 + UInt32 length; + char *password; + SecKeychainAttribute attributes[8]; + SecKeychainAttributeList list; + + attributes[0].tag = kSecAccountItemAttr; + attributes[1].tag = kSecDescriptionItemAttr; + attributes[2].tag = kSecLabelItemAttr; + attributes[3].tag = kSecModDateItemAttr; + + list.count = 4; + list.attr = attributes; + + OSStatus status = SecKeychainItemCopyContent(item, NULL, &list, &length, (void **)&password); + + if (status != noErr) { + *error = [NSError errorWithDomain: SFHFKeychainUtilsErrorDomain code: status userInfo: nil]; + return nil; + } + + NSString *passwordString = nil; + + if (password != NULL) { + char passwordBuffer[1024]; + + if (length > 1023) { + length = 1023; + } + strncpy(passwordBuffer, password, length); + + passwordBuffer[length] = '\0'; + passwordString = [NSString stringWithCString:passwordBuffer]; + } + + SecKeychainItemFreeContent(&list, password); + + CFRelease(item); + + return passwordString; +} + ++ (void) storeUsername: (NSString *) username andPassword: (NSString *) password forServerName: (NSString *) serverName updateExisting: (BOOL) updateExisting error: (NSError **) error { + if (!username || !password || !serverName) { + *error = [NSError errorWithDomain: SFHFKeychainUtilsErrorDomain code: -2000 userInfo: nil]; + return; + } + + OSStatus status = noErr; + + SecKeychainItemRef item = [SFHFKeychainUtils getKeychainItemReferenceForUsername: username andServerName: serverName error: error]; + + if (*error && [*error code] != noErr) { + return; + } + + *error = nil; + + if (item) { + status = SecKeychainItemModifyAttributesAndData(item, + NULL, + strlen([password UTF8String]), + [password UTF8String]); + + CFRelease(item); + } + else { + status = SecKeychainAddGenericPassword(NULL, + strlen([serverName UTF8String]), + [serverName UTF8String], + strlen([username UTF8String]), + [username UTF8String], + strlen([password UTF8String]), + [password UTF8String], + NULL); + } + + if (status != noErr) { + *error = [NSError errorWithDomain: SFHFKeychainUtilsErrorDomain code: status userInfo: nil]; + } +} + ++ (void) deleteItemForUsername: (NSString *) username andServerName: (NSString *) serverName error: (NSError **) error { + if (!username || !serverName) { + *error = [NSError errorWithDomain: SFHFKeychainUtilsErrorDomain code: 2000 userInfo: nil]; + return; + } + + *error = nil; + + SecKeychainItemRef item = [SFHFKeychainUtils getKeychainItemReferenceForUsername: username andServerName: serverName error: error]; + + if (*error && [*error code] != noErr) { + return; + } + + OSStatus status; + + if (item) { + status = SecKeychainItemDelete(item); + + CFRelease(item); + } + + if (status != noErr) { + *error = [NSError errorWithDomain: SFHFKeychainUtilsErrorDomain code: status userInfo: nil]; + } +} + ++ (SecKeychainItemRef) getKeychainItemReferenceForUsername: (NSString *) username andServerName: (NSString *) serverName error: (NSError **) error { + if (!username || !serverName) { + *error = [NSError errorWithDomain: SFHFKeychainUtilsErrorDomain code: -2000 userInfo: nil]; + return nil; + } + + *error = nil; + + SecKeychainItemRef item; + + OSStatus status = SecKeychainFindGenericPassword(NULL, + strlen([serverName UTF8String]), + [serverName UTF8String], + strlen([username UTF8String]), + [username UTF8String], + NULL, + NULL, + &item); + + if (status != noErr) { + if (status != errSecItemNotFound) { + *error = [NSError errorWithDomain: SFHFKeychainUtilsErrorDomain code: status userInfo: nil]; + } + + return nil; + } + + return item; +} + +#else + ++ (NSString *) getPasswordForUsername: (NSString *) username andServerName: (NSString *) serverName error: (NSError **) error { + if (!username || !serverName) { + if (error != nil) { + *error = [NSError errorWithDomain: SFHFKeychainUtilsErrorDomain code: -2000 userInfo: nil]; + } + return nil; + } + + if (error != nil) { + *error = nil; + } + + // Set up a query dictionary with the base query attributes: item type (generic), username, and service + + NSArray *keys = [[[NSArray alloc] initWithObjects: (NSString *) kSecClass, kSecAttrAccount, kSecAttrService, nil] autorelease]; + NSArray *objects = [[[NSArray alloc] initWithObjects: (NSString *) kSecClassGenericPassword, username, serverName, nil] autorelease]; + + NSMutableDictionary *query = [[[NSMutableDictionary alloc] initWithObjects: objects forKeys: keys] autorelease]; + + // First do a query for attributes, in case we already have a Keychain item with no password data set. + // One likely way such an incorrect item could have come about is due to the previous (incorrect) + // version of this code (which set the password as a generic attribute instead of password data). + + NSDictionary *attributeResult = NULL; + NSMutableDictionary *attributeQuery = [query mutableCopy]; + [attributeQuery setObject: (id) kCFBooleanTrue forKey:(id) kSecReturnAttributes]; + OSStatus status = SecItemCopyMatching((CFDictionaryRef) attributeQuery, (CFTypeRef *) &attributeResult); + + [attributeResult release]; + [attributeQuery release]; + + if (status != noErr) { + // No existing item found--simply return nil for the password + if (error != nil && status != errSecItemNotFound) { + //Only return an error if a real exception happened--not simply for "not found." + *error = [NSError errorWithDomain: SFHFKeychainUtilsErrorDomain code: status userInfo: nil]; + } + + return nil; + } + + // We have an existing item, now query for the password data associated with it. + + NSData *resultData = nil; + NSMutableDictionary *passwordQuery = [query mutableCopy]; + [passwordQuery setObject: (id) kCFBooleanTrue forKey: (id) kSecReturnData]; + + status = SecItemCopyMatching((CFDictionaryRef) passwordQuery, (CFTypeRef *) &resultData); + + [resultData autorelease]; + [passwordQuery release]; + + if (status != noErr) { + if (status == errSecItemNotFound) { + // We found attributes for the item previously, but no password now, so return a special error. + // Users of this API will probably want to detect this error and prompt the user to + // re-enter their credentials. When you attempt to store the re-entered credentials + // using storeUsername:andPassword:forServiceName:updateExisting:error + // the old, incorrect entry will be deleted and a new one with a properly encrypted + // password will be added. + if (error != nil) { + *error = [NSError errorWithDomain: SFHFKeychainUtilsErrorDomain code: -1999 userInfo: nil]; + } + } + else { + // Something else went wrong. Simply return the normal Keychain API error code. + if (error != nil) { + *error = [NSError errorWithDomain: SFHFKeychainUtilsErrorDomain code: status userInfo: nil]; + } + } + + return nil; + } + + NSString *password = nil; + + if (resultData) { + password = [[NSString alloc] initWithData: resultData encoding: NSUTF8StringEncoding]; + } + else { + // There is an existing item, but we weren't able to get password data for it for some reason, + // Possibly as a result of an item being incorrectly entered by the previous code. + // Set the -1999 error so the code above us can prompt the user again. + if (error != nil) { + *error = [NSError errorWithDomain: SFHFKeychainUtilsErrorDomain code: -1999 userInfo: nil]; + } + } + + return [password autorelease]; +} + ++ (BOOL) storeUsername: (NSString *) username andPassword: (NSString *) password forServerName: (NSString *) serverName updateExisting: (BOOL) updateExisting error: (NSError **) error +{ + if (!username || !password || !serverName) + { + if (error != nil) + { + *error = [NSError errorWithDomain: SFHFKeychainUtilsErrorDomain code: -2000 userInfo: nil]; + } + return NO; + } + + // See if we already have a password entered for these credentials. + NSError *getError = nil; + NSString *existingPassword = [SFHFKeychainUtils getPasswordForUsername: username andServerName: serverName error:&getError]; + + if ([getError code] == -1999) + { + // There is an existing entry without a password properly stored (possibly as a result of the previous incorrect version of this code. + // Delete the existing item before moving on entering a correct one. + + getError = nil; + + [self deleteItemForUsername: username andServerName: serverName error: &getError]; + + if ([getError code] != noErr) + { + if (error != nil) + { + *error = getError; + } + return NO; + } + } + else if ([getError code] != noErr) + { + if (error != nil) + { + *error = getError; + } + return NO; + } + + if (error != nil) + { + *error = nil; + } + + OSStatus status = noErr; + + if (existingPassword) + { + // We have an existing, properly entered item with a password. + // Update the existing item. + + if (![existingPassword isEqualToString:password] && updateExisting) + { + //Only update if we're allowed to update existing. If not, simply do nothing. + + NSArray *keys = [[[NSArray alloc] initWithObjects: (NSString *) kSecClass, + kSecAttrService, + kSecAttrLabel, + kSecAttrAccount, + nil] autorelease]; + + NSArray *objects = [[[NSArray alloc] initWithObjects: (NSString *) kSecClassGenericPassword, + serverName, + serverName, + username, + nil] autorelease]; + + NSDictionary *query = [[[NSDictionary alloc] initWithObjects: objects forKeys: keys] autorelease]; + + status = SecItemUpdate((CFDictionaryRef) query, (CFDictionaryRef) [NSDictionary dictionaryWithObject: [password dataUsingEncoding: NSUTF8StringEncoding] forKey: (NSString *) kSecValueData]); + } + } + else + { + // No existing entry (or an existing, improperly entered, and therefore now + // deleted, entry). Create a new entry. + + NSArray *keys = [[[NSArray alloc] initWithObjects: (NSString *) kSecClass, + kSecAttrService, + kSecAttrLabel, + kSecAttrAccount, + kSecValueData, + nil] autorelease]; + + NSArray *objects = [[[NSArray alloc] initWithObjects: (NSString *) kSecClassGenericPassword, + serverName, + serverName, + username, + [password dataUsingEncoding: NSUTF8StringEncoding], + nil] autorelease]; + + NSDictionary *query = [[[NSDictionary alloc] initWithObjects: objects forKeys: keys] autorelease]; + + status = SecItemAdd((CFDictionaryRef) query, NULL); + } + + if (error != nil && status != noErr) + { + // Something went wrong with adding the new item. Return the Keychain error code. + *error = [NSError errorWithDomain: SFHFKeychainUtilsErrorDomain code: status userInfo: nil]; + + return NO; + } + + return YES; +} + ++ (BOOL) deleteItemForUsername: (NSString *) username andServerName: (NSString *) serverName error: (NSError **) error +{ + if (!username || !serverName) + { + if (error != nil) + { + *error = [NSError errorWithDomain: SFHFKeychainUtilsErrorDomain code: -2000 userInfo: nil]; + } + return NO; + } + + if (error != nil) + { + *error = nil; + } + + NSArray *keys = [[[NSArray alloc] initWithObjects: (NSString *) kSecClass, kSecAttrAccount, kSecAttrService, kSecReturnAttributes, nil] autorelease]; + NSArray *objects = [[[NSArray alloc] initWithObjects: (NSString *) kSecClassGenericPassword, username, serverName, kCFBooleanTrue, nil] autorelease]; + + NSDictionary *query = [[[NSDictionary alloc] initWithObjects: objects forKeys: keys] autorelease]; + + OSStatus status = SecItemDelete((CFDictionaryRef) query); + + if (error != nil && status != noErr) + { + *error = [NSError errorWithDomain: SFHFKeychainUtilsErrorDomain code: status userInfo: nil]; + + return NO; + } + + return YES; +} + +#endif + +@end \ No newline at end of file diff --git a/client/iOS/Misc/TSXTypes.h b/client/iOS/Misc/TSXTypes.h new file mode 100644 index 000000000..c5d8ecdbb --- /dev/null +++ b/client/iOS/Misc/TSXTypes.h @@ -0,0 +1,49 @@ +/* + Basic type defines for TSX RDC + + Copyright 2013 Thinstuff Technologies GmbH, Authors: Martin Fleisz, Dorian Johnson + + 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/. + */ + +#ifndef TSXRemoteDesktop_TSXTypes_h +#define TSXRemoteDesktop_TSXTypes_h + +#pragma mark Internal state + +// Represents the underlying state of a TWSession RDP connection. +typedef enum _TSXConnectionState +{ + TSXConnectionClosed = 0, // Session either hasn't begun connecting, or its connection has finished disconnecting. + TSXConnectionConnecting = 1, // Session is in the process of establishing an RDP connection. A TCP or SSL connection might be established, but the RDP initialization sequence isn't finished. + TSXConnectionConnected = 2, // Session has a full RDP connection established; though if the windows computer doesn't support NLA, a login screen might be shown in the session. + TSXConnectionDisconnected = 3 // Session is disconnected at the RDP layer. TSX RDC might still be disposing of resources, however. +} TSXConnectionState; + +#pragma mark Session settings + +// Represents the type of screen resolution the user has selected. Most are dynamic sizes, meaning that the actual session dimensions are calculated when connecting. +typedef enum _TSXScreenOptions +{ + TSXScreenOptionFixed = 0, // A static resolution, like 1024x768 + TSXScreenOptionFitScreen = 1, // Upon connection, fit the session to the entire screen size + TSXScreenOptionCustom = 2, // Like fixed just specified by the user +} TSXScreenOptions; + +typedef enum _TSXAudioPlaybackOptions +{ + TSXAudioPlaybackLocal = 0, + TSXAudioPlaybackServer = 1, + TSXAudioPlaybackSilent = 2 +} TSXAudioPlaybackOptions; + +typedef enum _TSXProtocolSecurityOptions +{ + TSXProtocolSecurityAutomatic = 0, + TSXProtocolSecurityRDP = 1, + TSXProtocolSecurityTLS = 2, + TSXProtocolSecurityNLA = 3 +} TSXProtocolSecurityOptions; + +#endif diff --git a/client/iOS/Misc/Utils.h b/client/iOS/Misc/Utils.h new file mode 100644 index 000000000..a252f6d20 --- /dev/null +++ b/client/iOS/Misc/Utils.h @@ -0,0 +1,79 @@ +/* + Utility functions + + Copyright 2013 Thinstuff Technologies GmbH, Authors: Martin Fleisz, Dorian Johnson + + 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 "TSXTypes.h" + +// helper macro to encode a table path into a tag value (used to identify controls in their delegate handlers) +#define GET_TAG(section, row) ((((int)section) << 16) | ((int)(row))) +#define GET_TAG_FROM_PATH(path) ((((int)path.section) << 16) | ((int)(path.row))) + + +BOOL ScanHostNameAndPort(NSString* address, NSString** host, unsigned short* port); + +#pragma mark - +#pragma mark Screen Resolutions + +NSString* ScreenResolutionDescription(TSXScreenOptions type, int width, int height); +BOOL ScanScreenResolution(NSString* description, int* width, int* height, TSXScreenOptions* type); + +NSDictionary* SelectionForColorSetting(); +NSArray* ResolutionModes(); + +#pragma mark Security Protocol + +NSString* ProtocolSecurityDescription(TSXProtocolSecurityOptions type); +BOOL ScanProtocolSecurity(NSString* description, TSXProtocolSecurityOptions* type); +NSDictionary* SelectionForSecuritySetting(); + +#pragma mark Bookmarks +@class BookmarkBase; +NSMutableArray* FilterBookmarks(NSArray* bookmarks, NSArray* filter_words); +NSMutableArray* FilterHistory(NSArray* history, NSString* filterStr); + +#pragma mark iPad/iPhone detection + +BOOL IsPad(); +BOOL IsPhone(); + +#pragma mark Version Info +NSString* TSXAppFullVersion(); + +#pragma mark Touch/Mouse handling + +// set mouse buttons swapped flag +void SetSwapMouseButtonsFlag(BOOL swapped); + +// set invert scrolling flag +void SetInvertScrollingFlag(BOOL invert); + +// return event value for left mouse button +int GetLeftMouseButtonClickEvent(BOOL down); + +// return event value for right mouse button +int GetRightMouseButtonClickEvent(BOOL down); + +// return event value for mouse move event +int GetMouseMoveEvent(); + +// return mouse wheel event +int GetMouseWheelEvent(BOOL down); + +// scrolling gesture detection delta +CGFloat GetScrollGestureDelta(); + +#pragma mark Connectivity tools +// activates the iphone's WWAN interface in case it is offline +void WakeUpWWAN(); + +#pragma mark System Info functions +NSString* TSXGetPlatform(); +BOOL TSXDeviceHasJailBreak(); +NSString* TSXGetPrimaryMACAddress(NSString *sep); + diff --git a/client/iOS/Misc/Utils.m b/client/iOS/Misc/Utils.m new file mode 100644 index 000000000..e627ad389 --- /dev/null +++ b/client/iOS/Misc/Utils.m @@ -0,0 +1,371 @@ +/* + Utility functions + + Copyright 2013 Thinstuff Technologies GmbH, Authors: Martin Fleisz, Dorian Johnson + + 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 "Utils.h" +#import "OrderedDictionary.h" +#import "TSXAdditions.h" + +#import +#import "config.h" + +#include +#include +#include +#include +#include + +BOOL ScanHostNameAndPort(NSString* address, NSString** host, unsigned short* port) +{ + *host = @""; *port = 0; + + if (![address length]) + return NO; + + NSURL* url = [NSURL URLWithString:[NSString stringWithFormat:@"rdp://%@", address]]; + + if (!url || ![[url host] length]) + return NO; + + *host = [url host]; + *port = [[url port] unsignedShortValue]; + return YES; +} + +#pragma mark - +#pragma mark Working with Screen Resolutions + +NSString* LocalizedFitScreen() +{ + return NSLocalizedString(@"Automatic", @"Screen resolution selector: Automatic resolution (Full Screen on iPad, reasonable size on iPhone)"); +} + +NSString* LocalizedCustom() +{ + return NSLocalizedString(@"Custom", @"Screen resolution selector: Custom"); +} + +BOOL ScanScreenResolution(NSString* description, int* width, int* height, TSXScreenOptions* type) +{ + *height = 0; *width = 0; *type = TSXScreenOptionFixed; + + if ([description isEqualToString:LocalizedFitScreen()]) + { + *type = TSXScreenOptionFitScreen; + return YES; + } + else if ([description isEqualToString:LocalizedCustom()]) + { + *type = TSXScreenOptionCustom; + return YES; + } + + NSArray* resolution_components = [description componentsSeparatedByCharactersInSet:[NSCharacterSet characterSetWithCharactersInString:@"x*×"]]; + + if ([resolution_components count] != 2) + return NO; + + *width = [[resolution_components objectAtIndex:0] intValue]; + *height = [[resolution_components objectAtIndex:1] intValue]; + return YES; +} + +NSString* ScreenResolutionDescription(TSXScreenOptions type, int width, int height) +{ + if (type == TSXScreenOptionFitScreen) + return LocalizedFitScreen(); + else if (type == TSXScreenOptionCustom) + return LocalizedCustom(); + + return [NSString stringWithFormat:@"%dx%d", width, height]; +} + + +NSDictionary* SelectionForColorSetting() +{ + OrderedDictionary* dict = [OrderedDictionary dictionaryWithCapacity:3]; + [dict setValue:[NSNumber numberWithInt:16] forKey:NSLocalizedString(@"High Color (16 Bit)", @"16 bit color selection")]; + [dict setValue:[NSNumber numberWithInt:24] forKey:NSLocalizedString(@"True Color (24 Bit)", @"24 bit color selection")]; + [dict setValue:[NSNumber numberWithInt:32] forKey:NSLocalizedString(@"Highest Quality (32 Bit)", @"32 bit color selection")]; + return dict; +} + +NSArray* ResolutionModes() +{ + NSArray* array = [NSArray arrayWithObjects:ScreenResolutionDescription(TSXScreenOptionFitScreen, 0, 0), + ScreenResolutionDescription(TSXScreenOptionFixed, 640, 480), + ScreenResolutionDescription(TSXScreenOptionFixed, 800, 600), + ScreenResolutionDescription(TSXScreenOptionFixed, 1024, 768), + ScreenResolutionDescription(TSXScreenOptionFixed, 1280, 1024), + ScreenResolutionDescription(TSXScreenOptionFixed, 1440, 900), + ScreenResolutionDescription(TSXScreenOptionFixed, 1440, 1050), + ScreenResolutionDescription(TSXScreenOptionFixed, 1600, 1200), + ScreenResolutionDescription(TSXScreenOptionFixed, 1920, 1080), + ScreenResolutionDescription(TSXScreenOptionFixed, 1920, 1200), + ScreenResolutionDescription(TSXScreenOptionCustom, 0, 0), nil]; + return array; +} + +#pragma mark Working with Security Protocols + +NSString* LocalizedAutomaticSecurity() +{ + return NSLocalizedString(@"Automatic", @"Automatic protocl security selection"); +} + +NSString* ProtocolSecurityDescription(TSXProtocolSecurityOptions type) +{ + if (type == TSXProtocolSecurityNLA) + return @"NLA"; + else if (type == TSXProtocolSecurityTLS) + return @"TLS"; + else if (type == TSXProtocolSecurityRDP) + return @"RDP"; + + return LocalizedAutomaticSecurity(); +} + +BOOL ScanProtocolSecurity(NSString* description, TSXProtocolSecurityOptions* type) +{ + *type = TSXProtocolSecurityRDP; + + if ([description isEqualToString:@"NLA"]) + { + *type = TSXProtocolSecurityNLA; + return YES; + } + else if ([description isEqualToString:@"TLS"]) + { + *type = TSXProtocolSecurityTLS; + return YES; + } + else if ([description isEqualToString:@"RDP"]) + { + *type = TSXProtocolSecurityRDP; + return YES; + } + else if ([description isEqualToString:LocalizedAutomaticSecurity()]) + { + *type = TSXProtocolSecurityAutomatic; + return YES; + } + + return NO; +} + +NSDictionary* SelectionForSecuritySetting() +{ + OrderedDictionary* dict = [OrderedDictionary dictionaryWithCapacity:4]; + [dict setValue:[NSNumber numberWithInt:TSXProtocolSecurityAutomatic] forKey:ProtocolSecurityDescription(TSXProtocolSecurityAutomatic)]; + [dict setValue:[NSNumber numberWithInt:TSXProtocolSecurityRDP] forKey:ProtocolSecurityDescription(TSXProtocolSecurityRDP)]; + [dict setValue:[NSNumber numberWithInt:TSXProtocolSecurityTLS] forKey:ProtocolSecurityDescription(TSXProtocolSecurityTLS)]; + [dict setValue:[NSNumber numberWithInt:TSXProtocolSecurityNLA] forKey:ProtocolSecurityDescription(TSXProtocolSecurityNLA)]; + return dict; +} + + +#pragma mark - +#pragma mark Bookmarks + +#import "Bookmark.h" + +NSMutableArray* FilterBookmarks(NSArray* bookmarks, NSArray* filter_words) +{ + NSMutableArray* matching_items = [NSMutableArray array]; + NSArray* searched_keys = [NSArray arrayWithObjects:@"label", @"params.hostname", @"params.username", @"params.domain", nil]; + + for (ComputerBookmark* cur_bookmark in bookmarks) + { + double match_score = 0.0; + for (int i = 0; i < [searched_keys count]; i++) + { + NSString* val = [cur_bookmark valueForKeyPath:[searched_keys objectAtIndex:i]]; + + if (![val isKindOfClass:[NSString class]] || ![val length]) + continue; + + for (NSString* word in filter_words) + if ([val rangeOfString:word options:(NSCaseInsensitiveSearch | NSWidthInsensitiveSearch)].location != NSNotFound) + match_score += (1.0 / [filter_words count]) * pow(2, [searched_keys count] - i); + } + + if (match_score > 0.001) + [matching_items addObject:[NSDictionary dictionaryWithObjectsAndKeys: + cur_bookmark, @"bookmark", + [NSNumber numberWithFloat:match_score], @"score", + nil]]; + } + + [matching_items sortUsingComparator:^NSComparisonResult(NSDictionary* obj1, NSDictionary* obj2) { + return [[obj2 objectForKey:@"score"] compare:[obj1 objectForKey:@"score"]]; + }]; + + return matching_items; +} + +NSMutableArray* FilterHistory(NSArray* history, NSString* filterStr) +{ + NSMutableArray* result = [NSMutableArray array]; + for (NSString* item in history) + { + if ([item rangeOfString:filterStr].location != NSNotFound) + [result addObject:item]; + } + + return result; +} + +#pragma mark Version Info +NSString* TSXAppFullVersion() +{ + NSDictionary* info_dict = [[NSBundle mainBundle] infoDictionary]; + return [NSString stringWithFormat:@"%@.%@ (%@)", [info_dict objectForKey:@"CFBundleShortVersionString"], [info_dict objectForKey:@"CFBundleVersion"], [NSString stringWithUTF8String:GIT_REVISION]]; +} + +#pragma mark iPad/iPhone detection + +BOOL IsPad() +{ +#ifdef UI_USER_INTERFACE_IDIOM + return (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad); +#else + return NO; +#endif +} + +BOOL IsPhone() +{ +#ifdef UI_USER_INTERFACE_IDIOM + return (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone); +#else + return NO; +#endif +} + +// set mouse buttons swapped flag +static BOOL g_swap_mouse_buttons = NO; +void SetSwapMouseButtonsFlag(BOOL swapped) +{ + g_swap_mouse_buttons = swapped; +} + +// set invert scrolling flag +static BOOL g_invert_scrolling = NO; +void SetInvertScrollingFlag(BOOL invert) +{ + g_invert_scrolling = invert; +} + +// return event value for left mouse button +int GetLeftMouseButtonClickEvent(BOOL down) +{ + if (g_swap_mouse_buttons) + return (PTR_FLAGS_BUTTON2 | (down ? PTR_FLAGS_DOWN : 0)); + else + return (PTR_FLAGS_BUTTON1 | (down ? PTR_FLAGS_DOWN : 0)); +} + +// return event value for right mouse button +int GetRightMouseButtonClickEvent(BOOL down) +{ + if (g_swap_mouse_buttons) + return (PTR_FLAGS_BUTTON1 | (down ? PTR_FLAGS_DOWN : 0)); + else + return (PTR_FLAGS_BUTTON2 | (down ? PTR_FLAGS_DOWN : 0)); +} + +// get mouse move event +int GetMouseMoveEvent() +{ + return (PTR_FLAGS_MOVE); +} + +// return mouse wheel event +int GetMouseWheelEvent(BOOL down) +{ + if (g_invert_scrolling) + down = !down; + + if(down) + return (PTR_FLAGS_WHEEL | PTR_FLAGS_WHEEL_NEGATIVE | (0x0088)); + else + return (PTR_FLAGS_WHEEL | (0x0078)); +} + +// scrolling gesture detection delta +CGFloat GetScrollGestureDelta() +{ + return 10.0f; +} + +// this hack activates the iphone's WWAN interface in case it is offline +void WakeUpWWAN() +{ + NSURL * url = [[[NSURL alloc] initWithString:@"http://www.nonexistingdummyurl.com"] autorelease]; + //NSData * data = + [NSData dataWithContentsOfURL:url]; // we don't need data but assigning one causes a "data not used" compiler warning +} + + +#pragma mark System Info functions + +NSString* TSXGetPrimaryMACAddress(NSString *sep) +{ + NSString* macaddress = @""; + + struct ifaddrs *addrs; + + if (getifaddrs(&addrs) < 0) + { + NSLog(@"getPrimaryMACAddress: getifaddrs failed."); + return macaddress; + } + + for (struct ifaddrs *cursor = addrs; cursor!=NULL; cursor = cursor->ifa_next) + { + if(strcmp(cursor->ifa_name, "en0")) + continue; + if( (cursor->ifa_addr->sa_family == AF_LINK) + && (((struct sockaddr_dl *) cursor->ifa_addr)->sdl_type == 0x6 /*IFT_ETHER*/)) + { + struct sockaddr_dl *dlAddr = (struct sockaddr_dl *) cursor->ifa_addr; + if(dlAddr->sdl_alen != 6) + continue; + unsigned char* base = (unsigned char *) &dlAddr->sdl_data[dlAddr->sdl_nlen]; + macaddress = [NSString hexStringFromData:base ofSize:6 withSeparator:sep afterNthChar:1]; + break; + } + } + + freeifaddrs(addrs); + + return macaddress; +} + +BOOL TSXDeviceHasJailBreak() +{ + if ([[NSFileManager defaultManager] fileExistsAtPath:@"/Applications/Cydia.app/"]) + return YES; + + if ([[NSFileManager defaultManager] fileExistsAtPath:@"/etc/apt/"]) + return YES; + + return NO; +} + +NSString* TSXGetPlatform() +{ + size_t size; + sysctlbyname("hw.machine", NULL, &size, NULL, 0); + char *machine = malloc(size); + sysctlbyname("hw.machine", machine, &size, NULL, 0); + NSString *platform = [NSString stringWithCString:machine encoding:NSASCIIStringEncoding]; + free(machine); + return platform; +} + diff --git a/client/iOS/Models/Bookmark.h b/client/iOS/Models/Bookmark.h new file mode 100644 index 000000000..bcaaca0f3 --- /dev/null +++ b/client/iOS/Models/Bookmark.h @@ -0,0 +1,46 @@ +/* + Bookmark model abstraction + + Copyright 2013 Thinstuff Technologies GmbH, Authors: Dorian Johnson + + 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 "ConnectionParams.h" + +@interface ComputerBookmark : NSObject { +@protected + ComputerBookmark* _parent; + NSString* _uuid, * _label; + UIImage* _image; + ConnectionParams* _connection_params; + BOOL _connected_via_wlan; +} + +@property (nonatomic,assign) ComputerBookmark* parent; +@property (nonatomic,readonly) NSString* uuid; +@property (nonatomic,copy) NSString* label; +@property (nonatomic,retain) UIImage* image; +@property (readonly, nonatomic) ConnectionParams* params; +@property (nonatomic, assign) BOOL conntectedViaWLAN; + +// Creates a copy of this object, with a new UUID +- (id)copy; + +// Whether user can delete, move, or rename this entry +- (BOOL)isDeletable; +- (BOOL)isMovable; +- (BOOL)isRenamable; +- (BOOL)hasImmutableHost; + +- (id)initWithConnectionParameters:(ConnectionParams*)params; +- (id)initWithBaseDefaultParameters; + +// A copy of @params, with _bookmark_uuid set. +- (ConnectionParams*)copyMarkedParams; + +@end + diff --git a/client/iOS/Models/Bookmark.m b/client/iOS/Models/Bookmark.m new file mode 100644 index 000000000..2ce7903b7 --- /dev/null +++ b/client/iOS/Models/Bookmark.m @@ -0,0 +1,250 @@ +/* + Bookmark model abstraction + + Copyright 2013 Thinstuff Technologies GmbH, Author: Dorian Johnson + + 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 "Bookmark.h" +#import "TSXAdditions.h" +#import "Utils.h" + +#import "GlobalDefaults.h" + +@interface ComputerBookmark (Private) +- (void)willChangeValueForKeyPath:(NSString *)keyPath; +- (void)didChangeValueForKeyPath:(NSString *)keyPath; +@end + +@implementation ComputerBookmark + +@synthesize parent=_parent, uuid=_uuid, label=_label, image=_image; +@synthesize params=_connection_params, conntectedViaWLAN = _connected_via_wlan; + + +- (id)init +{ + if (!(self = [super init])) + return nil; + + _uuid = [[NSString stringWithUUID] retain]; + _label = @""; + _connected_via_wlan = NO; + return self; +} + +// Designated initializer. +- (id)initWithConnectionParameters:(ConnectionParams*)params +{ + if (!(self = [super init])) + return nil; + + _connection_params = [params copy]; + _connected_via_wlan = NO; + return self; +} + + +- (id)initWithCoder:(NSCoder *)decoder +{ + if (!(self = [self init])) + return nil; + + if (![decoder allowsKeyedCoding]) + [NSException raise:NSInvalidArgumentException format:@"coder must support keyed archiving"]; + + if ([decoder containsValueForKey:@"uuid"]) + { + [_uuid release]; + _uuid = [[decoder decodeObjectForKey:@"uuid"] retain]; + } + + if ([decoder containsValueForKey:@"label"]) + [self setLabel:[decoder decodeObjectForKey:@"label"]]; + + if ([decoder containsValueForKey:@"connectionParams"]) + { + [_connection_params release]; + _connection_params = [[decoder decodeObjectForKey:@"connectionParams"] retain]; + } + + return self; +} + +- (id)initWithBaseDefaultParameters +{ + return [self initWithConnectionParameters:[[[ConnectionParams alloc] initWithBaseDefaultParameters] autorelease]]; +} + +- (id)copy +{ + ComputerBookmark* copy = [[[self class] alloc] init]; + [copy setLabel:[self label]]; + copy->_connection_params = [_connection_params copy]; + return copy; +} + +- (void)encodeWithCoder:(NSCoder *)coder +{ + if (![coder allowsKeyedCoding]) + [NSException raise:NSInvalidArgumentException format:@"coder must support keyed archiving"]; + + [coder encodeObject:_uuid forKey:@"uuid"]; + [coder encodeObject:_label forKey:@"label"]; + [coder encodeObject:_connection_params forKey:@"connectionParams"]; +} + +- (void)dealloc +{ + _parent = nil; + [_label release]; _label = nil; + [_uuid release]; _uuid = nil; + [_connection_params release]; _connection_params = nil; + [super dealloc]; +} + +- (UIImage*)image +{ + return nil; +} + +- (BOOL)isEqual:(id)object +{ + return [object respondsToSelector:@selector(uuid)] && [[object uuid] isEqual:_uuid]; +} + +- (NSString*)description +{ + return ([self label] != nil) ? [self label] : _uuid; +} + +- (BOOL)validateValue:(id *)val forKey:(NSString *)key error:(NSError **)error +{ + NSString* string_value = *val; + + if ([key isEqualToString:@"label"]) + { + if (![[string_value stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]] length]) + { + if (error) + *error = [NSError errorWithDomain:@"" code:NSKeyValueValidationError userInfo: + [NSDictionary dictionaryWithObjectsAndKeys: + NSLocalizedString(@"Connection labels cannot be blank", @"Bookmark data validation: label blank title."), NSLocalizedDescriptionKey, + NSLocalizedString(@"Please enter the short description of this Connection that will appear in the Connection list.", @"Bookmark data validation: label blank message."), NSLocalizedRecoverySuggestionErrorKey, + nil]]; + return NO; + } + } + + return YES; +} + +- (BOOL)validateValue:(id *)val forKeyPath:(NSString *)keyPath error:(NSError **)error +{ + // Could be used to validate params.hostname, params.password, params.port, etc. + return [super validateValue:val forKeyPath:keyPath error:error]; +} + +- (BOOL)isDeletable { return YES; } +- (BOOL)isMovable { return YES; } +- (BOOL)isRenamable { return YES; } +- (BOOL)hasImmutableHost { return NO; } + + +#pragma mark Custom KVC + +- (void)setValue:(id)value forKeyPath:(NSString *)keyPath +{ + if ([keyPath isEqualToString:@"params.resolution"]) + { + int width, height; + TSXScreenOptions type; + if (ScanScreenResolution(value, &width, &height, &type)) + { + [_connection_params willChangeValueForKey:@"resolution"]; + [[self params] setInt:type forKey:@"screen_resolution_type"]; + + if (type == TSXScreenOptionFixed) + { + [[self params] setInt:width forKey:@"width"]; + [[self params] setInt:height forKey:@"height"]; + } + [_connection_params didChangeValueForKey:@"resolution"]; + } + else + [NSException raise:NSInvalidArgumentException format:@"%s got invalid screen resolution '%@'", __func__, value]; + } + else + { + [self willChangeValueForKeyPath:keyPath]; + [super setValue:value forKeyPath:keyPath]; + [self didChangeValueForKeyPath:keyPath]; + } +} + +- (id)valueForKeyPath:(NSString *)keyPath +{ + if ([keyPath isEqualToString:@"params.resolution"]) + return ScreenResolutionDescription([[self params] intForKey:@"screen_resolution_type"], [[self params] intForKey:@"width"], [[self params] intForKey:@"height"]); + + return [super valueForKeyPath:keyPath]; +} + +- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context +{ + if ([[change objectForKey:NSKeyValueChangeNotificationIsPriorKey] boolValue]) + [self willChangeValueForKeyPath:keyPath]; + else + [self didChangeValueForKeyPath:keyPath]; +} + +- (NSDictionary*)targetForChangeNotificationForKeyPath:(NSString*)keyPath +{ + NSString* changed_key = keyPath; + NSObject* changed_object = self; + + if ([keyPath rangeOfString:@"params."].location == 0) + { + changed_key = [keyPath substringFromIndex:[@"params." length]]; + changed_object = _connection_params; + } + + return [NSDictionary dictionaryWithObjectsAndKeys:changed_key, @"key", changed_object, @"object", nil]; +} + +- (void)willChangeValueForKeyPath:(NSString *)keyPath +{ + NSDictionary* target = [self targetForChangeNotificationForKeyPath:keyPath]; + [[target objectForKey:@"object"] willChangeValueForKey:[target objectForKey:@"key"]]; +} + +- (void)didChangeValueForKeyPath:(NSString *)keyPath +{ + NSDictionary* target = [self targetForChangeNotificationForKeyPath:keyPath]; + [[target objectForKey:@"object"] didChangeValueForKey:[target objectForKey:@"key"]]; +} + +- (ConnectionParams*)copyMarkedParams +{ + ConnectionParams* param_copy = [[self params] copy]; + [param_copy setValue:[self uuid] forKey:@"_bookmark_uuid"]; + return param_copy; +} + + +#pragma mark No children +- (NSUInteger)numberOfChildren { return 0; } +- (NSUInteger)numberOfDescendants { return 1; } +- (BookmarkBase *)childAtIndex:(NSUInteger)index { return nil; } +- (NSUInteger)indexOfChild:(BookmarkBase *)child { return 0; } +- (void)removeChild:(BookmarkBase *)child { } +- (void)addChild:(BookmarkBase *)child { } +- (void)addChild:(BookmarkBase *)child afterExistingChild:(BookmarkBase *)existingChild { } +- (void)addChild:(BookmarkBase *)child atIndex:(NSInteger)index { } +- (BOOL)hasDescendant:(BookmarkBase *)needle { return NO; } +- (BOOL)canContainChildren { return NO; } +@end + diff --git a/client/iOS/Models/ConnectionParams.h b/client/iOS/Models/ConnectionParams.h new file mode 100644 index 000000000..72136b994 --- /dev/null +++ b/client/iOS/Models/ConnectionParams.h @@ -0,0 +1,47 @@ +/* + Connection Parameters abstraction + + Copyright 2013 Thinstuff Technologies GmbH, Author: Dorian Johnson + + 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 ConnectionParams : NSObject +{ +@private + NSMutableDictionary* _connection_params; +} + +// Designated initializer. +- (id)initWithDictionary:(NSDictionary*)dict; +- (id)initWithBaseDefaultParameters; + +// Getting/setting values +- (NSArray*)allKeys; +- (void)setValue:(id)value forKey:(NSString *)key; +- (id)valueForKey:(NSString*)key; +- (BOOL)hasValueForKey:(NSString*)key; +- (void)setInt:(int)integer forKey:(NSString*)key; +- (int)intForKey:(NSString*)key; +- (void)setBool:(BOOL)v forKey:(NSString*)key; +- (BOOL)boolForKey:(NSString*)key; +- (const char*)UTF8StringForKey:(NSString*)key; +- (NSString*)StringForKey:(NSString*)key; + +- (BOOL)hasValueForKeyPath:(NSString*)key; +- (void)setInt:(int)integer forKeyPath:(NSString*)key; +- (int)intForKeyPath:(NSString*)key; +- (void)setBool:(BOOL)v forKeyPath:(NSString*)key; +- (BOOL)boolForKeyPath:(NSString*)key; +- (const char*)UTF8StringForKeyPath:(NSString*)key; +- (NSString*)StringForKeyPath:(NSString*)key; + + +- (int)intForKey:(NSString*)key with3GEnabled:(BOOL)enabled; +- (BOOL)boolForKey:(NSString*)key with3GEnabled:(BOOL)enabled; + +@end diff --git a/client/iOS/Models/ConnectionParams.m b/client/iOS/Models/ConnectionParams.m new file mode 100644 index 000000000..030216af7 --- /dev/null +++ b/client/iOS/Models/ConnectionParams.m @@ -0,0 +1,247 @@ +/* + Connection Parameters abstraction + + Copyright 2013 Thinstuff Technologies GmbH, Author: Dorian Johnson + + 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 "ConnectionParams.h" +#import "GlobalDefaults.h" +#import "EncryptionController.h" +#import "Utils.h" +#import "TSXAdditions.h" + +@interface ConnectionParams (Private) +- (id)initWithConnectionParams:(ConnectionParams*)params; +@end + +@implementation ConnectionParams + +// Designated initializer. +- (id)initWithDictionary:(NSDictionary*)dict +{ + if (!(self = [super init])) + return nil; + + _connection_params = [dict mutableDeepCopy]; + + if ([[_connection_params objectForKey:@"password"] isKindOfClass:[NSData class]]) + { + NSString* plaintext_password = [[[EncryptionController sharedEncryptionController] decryptor] decryptString:[_connection_params objectForKey:@"password"]]; + + [self setValue:plaintext_password forKey:@"password"]; + } + + return self; +} + +- (id)initWithBaseDefaultParameters +{ + return [self initWithDictionary:[[NSUserDefaults standardUserDefaults] dictionaryForKey:@"TSXDefaultComputerBookmarkSettings"]]; +} + +- (id)init +{ + return [self initWithDictionary:[NSDictionary dictionary]]; +} + +- (id)initWithConnectionParams:(ConnectionParams*)params +{ + return [self initWithDictionary:params->_connection_params]; +} +- (void)dealloc +{ + [_connection_params release]; _connection_params = nil; + [super dealloc]; +} + +- (id)copyWithZone:(NSZone *)zone +{ + return [[ConnectionParams alloc] initWithDictionary:_connection_params]; +} + +- (NSString*)description +{ + return [NSString stringWithFormat:@"ConnectionParams: %@", [_connection_params description]]; +} + +#pragma mark - +#pragma mark NSCoder + +- (id)initWithCoder:(NSCoder *)decoder +{ + if ([decoder containsValueForKey:@"connectionParams"]) + return [self initWithDictionary:[decoder decodeObjectForKey:@"connectionParams"]]; + + return [self init]; +} + +- (void)encodeWithCoder:(NSCoder *)coder +{ + NSSet* unserializable_keys = [NSSet setWithObjects:@"view", nil]; + NSMutableDictionary* serializable_params = [[NSMutableDictionary alloc] initWithCapacity:[_connection_params count]]; + + for (NSString* k in _connection_params) + if ( ([k characterAtIndex:0] != '_') && ![unserializable_keys containsObject:k]) + [serializable_params setObject:[_connection_params objectForKey:k] forKey:k]; + + if ([serializable_params objectForKey:@"password"] != nil) + { + NSData* encrypted_password = [[[EncryptionController sharedEncryptionController] encryptor] encryptString:[serializable_params objectForKey:@"password"]]; + + if (encrypted_password) + [serializable_params setObject:encrypted_password forKey:@"password"]; + else + [serializable_params removeObjectForKey:@"password"]; + } + + [coder encodeObject:serializable_params forKey:@"connectionParams"]; + [serializable_params release]; +} + + +#pragma mark - +#pragma mark NSKeyValueCoding + +- (void)setValue:(id)value forKey:(NSString *)key +{ + [self willChangeValueForKey:key]; + + if (value == nil) + [self setNilValueForKey:key]; + else + [_connection_params setValue:value forKey:key]; + + [self didChangeValueForKey:key]; +} + +- (void)setValue:(id)value forKeyPath:(NSString *)key +{ + [self willChangeValueForKey:key]; + + if (value == nil) + [self setNilValueForKey:key]; + else + [_connection_params setValue:value forKeyPath:key]; + + [self didChangeValueForKey:key]; +} + +- (void)setNilValueForKey:(NSString *)key +{ + [_connection_params removeObjectForKey:key]; +} + +- (id)valueForKey:(NSString*)key +{ + return [_connection_params valueForKey:key]; +} + +- (NSArray*)allKeys +{ + return [_connection_params allKeys]; +} + +#pragma mark - +#pragma mark KV convenience + +- (BOOL)hasValueForKey:(NSString*)key +{ + return [_connection_params objectForKey:key] != nil; +} + +- (void)setInt:(int)integer forKey:(NSString*)key +{ + [self setValue:[NSNumber numberWithInteger:integer] forKey:key]; +} +- (int)intForKey:(NSString*)key +{ + return [[self valueForKey:key] intValue]; +} + + +- (void)setBool:(BOOL)v forKey:(NSString*)key +{ + [self setValue:[NSNumber numberWithBool:v] forKey:key]; +} +- (BOOL)boolForKey:(NSString*)key +{ + return [[_connection_params objectForKey:key] boolValue]; +} + + +- (const char*)UTF8StringForKey:(NSString*)key +{ + id val = [self valueForKey:key]; + const char* str; + + if ([val respondsToSelector:@selector(UTF8String)] && (str = [val UTF8String])) + return str; + + return ""; +} + +- (NSString*)StringForKey:(NSString*)key +{ + return [self valueForKey:key]; +} + +- (BOOL)hasValueForKeyPath:(NSString*)key +{ + return [_connection_params valueForKeyPath:key] != nil; +} + +- (void)setInt:(int)integer forKeyPath:(NSString*)key +{ + [self setValue:[NSNumber numberWithInteger:integer] forKeyPath:key]; +} +- (int)intForKeyPath:(NSString*)key +{ + return [[self valueForKeyPath:key] intValue]; +} + +- (void)setBool:(BOOL)v forKeyPath:(NSString*)key +{ + [self setValue:[NSNumber numberWithBool:v] forKeyPath:key]; +} + +- (BOOL)boolForKeyPath:(NSString*)key +{ + return [[self valueForKeyPath:key] boolValue]; +} + +- (const char*)UTF8StringForKeyPath:(NSString*)key +{ + id val = [self valueForKeyPath:key]; + const char* str; + + if ([val respondsToSelector:@selector(UTF8String)] && (str = [val UTF8String])) + return str; + + return ""; +} + +- (NSString*)StringForKeyPath:(NSString*)key +{ + return [self valueForKeyPath:key]; +} + +- (int)intForKey:(NSString*)key with3GEnabled:(BOOL)enabled +{ + if (enabled && [self boolForKey:@"enable_3g_settings"]) + return [self intForKeyPath:[NSString stringWithFormat:@"settings_3g.%@", key]]; + return [self intForKeyPath:key]; +} + +- (BOOL)boolForKey:(NSString*)key with3GEnabled:(BOOL)enabled +{ + if (enabled && [self boolForKey:@"enable_3g_settings"]) + return [self boolForKeyPath:[NSString stringWithFormat:@"settings_3g.%@", key]]; + return [self boolForKeyPath:key]; +} + +@end + diff --git a/client/iOS/Models/Encryptor.h b/client/iOS/Models/Encryptor.h new file mode 100644 index 000000000..75d36dbfb --- /dev/null +++ b/client/iOS/Models/Encryptor.h @@ -0,0 +1,42 @@ +/* + Password Encryptor + + Copyright 2013 Thinstuff Technologies GmbH, Author: Dorian Johnson + + 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/. + */ + +/* Encrypts data using AES 128 with a 256 bit key derived using PBKDF2-HMAC-SHA1 */ + +#import + +// Encryption block cipher config +#define TSXEncryptorBlockCipherAlgo kCCAlgorithmAES128 +#define TSXEncryptorBlockCipherKeySize kCCKeySizeAES256 +#define TSXEncryptorBlockCipherOptions kCCOptionPKCS7Padding +#define TSXEncryptorBlockCipherBlockSize 16 + +// Key generation: If any of these are changed, existing password stores will no longer work +#define TSXEncryptorPBKDF2Rounds 100 +#define TSXEncryptorPBKDF2Salt "9D¶3L}S¿lA[e€3C«" +#define TSXEncryptorPBKDF2SaltLen TSXEncryptorBlockCipherOptions +#define TSXEncryptorPBKDF2KeySize TSXEncryptorBlockCipherKeySize + + +@interface Encryptor : NSObject { +@private + NSData* _encryption_key; + NSString* _plaintext_password; +} + +@property(readonly) NSString* plaintextPassword; + +- (id)initWithPassword:(NSString*)plaintext_password; + +- (NSData*)encryptData:(NSData*)plaintext_data; +- (NSData*)decryptData:(NSData*)encrypted_data; +- (NSData*)encryptString:(NSString*)plaintext_string; +- (NSString*)decryptString:(NSData*)encrypted_string; + +@end diff --git a/client/iOS/Models/Encryptor.m b/client/iOS/Models/Encryptor.m new file mode 100644 index 000000000..eae578e12 --- /dev/null +++ b/client/iOS/Models/Encryptor.m @@ -0,0 +1,173 @@ +/* + Password Encryptor + + Copyright 2013 Thinstuff Technologies GmbH, Author: Dorian Johnson + + 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/. + */ + +/* We try to use CommonCrypto as much as possible. PBKDF2 was added to CommonCrypto in iOS 5, so use OpenSSL only as a fallback to do PBKDF2 on pre iOS 5 systems. */ + +#import "Encryptor.h" +#import +#import +#import +#import // For PBKDF2 on < 5.0 +#include + +#pragma mark - + +@interface Encryptor (Private) +- (NSData*)randomInitializationVector; +@end + +@implementation Encryptor +@synthesize plaintextPassword=_plaintext_password; + +- (id)initWithPassword:(NSString*)plaintext_password +{ + if (plaintext_password == nil) + return nil; + + if ( !(self = [super init]) ) + return nil; + + _plaintext_password = [plaintext_password retain]; + const char* plaintext_password_data = [plaintext_password length] ? [plaintext_password UTF8String] : " "; + + if (!plaintext_password_data || !strlen(plaintext_password_data)) + [NSException raise:NSInternalInconsistencyException format:@"%s: plaintext password data is zero length!", __func__]; + + + uint8_t* derived_key = calloc(1, TSXEncryptorPBKDF2KeySize); + + if (CCKeyDerivationPBKDF != NULL) + { + int rounds = CCCalibratePBKDF(kCCPBKDF2, strlen(plaintext_password_data), TSXEncryptorPBKDF2SaltLen, kCCPRFHmacAlgSHA1, TSXEncryptorPBKDF2KeySize, 100); + int ret = CCKeyDerivationPBKDF(kCCPBKDF2, plaintext_password_data, strlen(plaintext_password_data)-1, (const uint8_t*)TSXEncryptorPBKDF2Salt, TSXEncryptorPBKDF2SaltLen, kCCPRFHmacAlgSHA1, rounds, derived_key, TSXEncryptorPBKDF2KeySize); + //NSLog(@"CCKeyDerivationPBKDF ret = %d; key: %@", ret, [NSData dataWithBytesNoCopy:derived_key length:TWEncryptorPBKDF2KeySize freeWhenDone:NO]); + + if (ret) + { + NSLog(@"%s: CCKeyDerivationPBKDF ret == %d, indicating some sort of failure.", __func__, ret); + [self autorelease]; + return nil; + } + } + else + { + // iOS 4.x or earlier -- use OpenSSL + unsigned long ret = PKCS5_PBKDF2_HMAC_SHA1(plaintext_password_data, (int)strlen(plaintext_password_data)-1, (const unsigned char*)TSXEncryptorPBKDF2Salt, TSXEncryptorPBKDF2SaltLen, TSXEncryptorPBKDF2Rounds, TSXEncryptorPBKDF2KeySize, derived_key); + //NSLog(@"PKCS5_PBKDF2_HMAC_SHA1 ret = %lu; key: %@", ret, [NSData dataWithBytesNoCopy:derived_key length:TWEncryptorPBKDF2KeySize freeWhenDone:NO]); + + if (ret != 1) + { + NSLog(@"%s: PKCS5_PBKDF2_HMAC_SHA1 ret == %lu, indicating some sort of failure.", __func__, ret); + [self release]; + return nil; + } + } + + + _encryption_key = [[NSData alloc] initWithBytesNoCopy:derived_key length:TSXEncryptorPBKDF2KeySize freeWhenDone:YES]; + return self; +} + + +#pragma mark - +#pragma mark Encrypting/Decrypting data + +- (NSData*)encryptData:(NSData*)plaintext_data +{ + if (![plaintext_data length]) + return nil; + + NSData* iv = [self randomInitializationVector]; + NSMutableData* encrypted_data = [NSMutableData dataWithLength:[iv length] + [plaintext_data length] + TSXEncryptorBlockCipherBlockSize]; + [encrypted_data replaceBytesInRange:NSMakeRange(0, [iv length]) withBytes:[iv bytes]]; + + size_t data_out_moved = 0; + int ret = CCCrypt(kCCEncrypt, TSXEncryptorBlockCipherAlgo, TSXEncryptorBlockCipherOptions, [_encryption_key bytes], TSXEncryptorBlockCipherKeySize, [iv bytes], [plaintext_data bytes], [plaintext_data length], [encrypted_data mutableBytes]+[iv length], [encrypted_data length]-[iv length], &data_out_moved); + + switch (ret) + { + case kCCSuccess: + [encrypted_data setLength:[iv length] + data_out_moved]; + return encrypted_data; + + default: + NSLog(@"%s: uncaught error, ret CCCryptorStatus = %d (plaintext len = %lu; buffer size = %lu)", __func__, ret, (unsigned long)[plaintext_data length], (unsigned long)([encrypted_data length]-[iv length])); + return nil; + } + + return nil; +} + +- (NSData*)decryptData:(NSData*)encrypted_data +{ + if ([encrypted_data length] <= TSXEncryptorBlockCipherBlockSize) + return nil; + + NSMutableData* plaintext_data = [NSMutableData dataWithLength:[encrypted_data length] + TSXEncryptorBlockCipherBlockSize]; + size_t data_out_moved = 0; + + int ret = CCCrypt(kCCDecrypt, TSXEncryptorBlockCipherAlgo, TSXEncryptorBlockCipherOptions, [_encryption_key bytes], TSXEncryptorBlockCipherKeySize, [encrypted_data bytes], [encrypted_data bytes] + TSXEncryptorBlockCipherBlockSize, [encrypted_data length] - TSXEncryptorBlockCipherBlockSize, [plaintext_data mutableBytes], [plaintext_data length], &data_out_moved); + + switch (ret) + { + case kCCSuccess: + [plaintext_data setLength:data_out_moved]; + return plaintext_data; + + case kCCBufferTooSmall: // Our output buffer is big enough to decrypt valid data. This return code indicates malformed data. + case kCCAlignmentError: // Shouldn't get this, since we're using padding. + case kCCDecodeError: // Wrong key. + return nil; + + default: + NSLog(@"%s: uncaught error, ret CCCryptorStatus = %d (encrypted data len = %lu; buffer size = %lu; dom = %lu)", __func__, ret, (unsigned long)[encrypted_data length], (unsigned long)[plaintext_data length], data_out_moved); + return nil; + } + + return nil; +} + + +- (NSData*)encryptString:(NSString*)plaintext_string +{ + return [self encryptData:[plaintext_string dataUsingEncoding:NSUTF8StringEncoding]]; +} + +- (NSString*)decryptString:(NSData*)encrypted_string +{ + return [[[NSString alloc] initWithData:[self decryptData:encrypted_string] encoding:NSUTF8StringEncoding] autorelease]; +} + +- (NSData*)randomInitializationVector +{ + NSMutableData* iv = [NSMutableData dataWithLength:TSXEncryptorBlockCipherBlockSize]; + int fd; + + if ( (fd = open("/dev/urandom", O_RDONLY)) < 0) + return nil; + + NSInteger bytes_needed = [iv length]; + char* p = [iv mutableBytes]; + + while (bytes_needed) + { + long bytes_read = read(fd, p, bytes_needed); + + if (bytes_read < 0) + continue; + + p += bytes_read; + bytes_needed -= bytes_read; + } + + close(fd); + return iv; +} + +@end diff --git a/client/iOS/Models/GlobalDefaults.h b/client/iOS/Models/GlobalDefaults.h new file mode 100644 index 000000000..ecbee2c38 --- /dev/null +++ b/client/iOS/Models/GlobalDefaults.h @@ -0,0 +1,28 @@ +/* + Global default bookmark settings + + Copyright 2013 Thinstuff Technologies GmbH, Author: Dorian Johnson + + 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 + +@class ConnectionParams, ComputerBookmark; + +@interface GlobalDefaults : NSObject{ +@private + ComputerBookmark* _default_bookmark; +} + ++ (GlobalDefaults*)sharedGlobalDefaults; + +// The same object is always returned from this method. +@property (readonly,nonatomic) ComputerBookmark* bookmark; + +- (ConnectionParams*)newParams; +- (ComputerBookmark*)newBookmark; + +@end diff --git a/client/iOS/Models/GlobalDefaults.m b/client/iOS/Models/GlobalDefaults.m new file mode 100644 index 000000000..1a0619a22 --- /dev/null +++ b/client/iOS/Models/GlobalDefaults.m @@ -0,0 +1,71 @@ +/* + Global default bookmark settings + + Copyright 2013 Thinstuff Technologies GmbH, Author: Dorian Johnson + + 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 "GlobalDefaults.h" +#import "Bookmark.h" +#import "ConnectionParams.h" + +@implementation GlobalDefaults + ++ (GlobalDefaults*)sharedGlobalDefaults +{ + static GlobalDefaults* _shared_global_defaults = nil; + + if (_shared_global_defaults == nil) + { + @synchronized(self) + { + if (_shared_global_defaults == nil) + _shared_global_defaults = [[GlobalDefaults alloc] init]; + } + } + + return _shared_global_defaults; +} + +- (id)init +{ + if (!(self = [super init])) + return nil; + + ComputerBookmark* bookmark = nil; + NSData* bookmark_data = [[NSUserDefaults standardUserDefaults] objectForKey:@"TSXSharedGlobalDefaultBookmark"]; + + if (bookmark_data && [bookmark_data length]) + bookmark = [NSKeyedUnarchiver unarchiveObjectWithData:bookmark_data]; + + if (!bookmark) + bookmark = [[[ComputerBookmark alloc] initWithBaseDefaultParameters] autorelease]; + + _default_bookmark = [bookmark retain]; + return self; +} + +- (void)dealloc +{ + [_default_bookmark release]; + [super dealloc]; +} + +#pragma mark - + +@synthesize bookmark=_default_bookmark; + +- (ComputerBookmark*)newBookmark +{ + return [[ComputerBookmark alloc] initWithConnectionParameters:[[self newParams] autorelease]]; +} + +- (ConnectionParams*)newParams +{ + ConnectionParams* param_copy = [[[self bookmark] params] copy]; + return param_copy; +} + +@end diff --git a/client/iOS/Models/RDPKeyboard.h b/client/iOS/Models/RDPKeyboard.h new file mode 100644 index 000000000..3ce2b8216 --- /dev/null +++ b/client/iOS/Models/RDPKeyboard.h @@ -0,0 +1,76 @@ +/* + RDP Keyboard helper + + 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" + +@class RDPKeyboard; + + +@protocol RDPKeyboardDelegate +@optional +- (void)modifiersChangedForKeyboard:(RDPKeyboard*)keyboard; +@end + + +@interface RDPKeyboard : NSObject { + + RDPSession* _session; + + int _virtual_key_map[256]; + int _unicode_map[256]; + NSDictionary* _special_keys; + + NSObject* _delegate; + + BOOL _ctrl_pressed; + BOOL _alt_pressed; + BOOL _shift_pressed; + BOOL _win_pressed; +} + +@property (assign) id delegate; +@property (readonly) BOOL ctrlPressed; +@property (readonly) BOOL altPressed; +@property (readonly) BOOL shiftPressed; +@property (readonly) BOOL winPressed; + +// returns a keyboard instance ++ (RDPKeyboard*)getSharedRDPKeyboard; + +// init the keyboard and assign the given rdp session and delegate +- (void)initWithSession:(RDPSession*)session delegate:(NSObject*)delegate; + +// called to reset any pending key states (i.e. pressed modifier keys) +- (void)reset; + +// sends the given unicode character to the server +- (void)sendUnicode:(int)character; + +// send a key stroke event using the given virtual key code +- (void)sendVirtualKeyCode:(int)keyCode; + +// toggle ctrl key, returns true if pressed, otherwise false +- (void)toggleCtrlKey; + +// toggle alt key, returns true if pressed, otherwise false +- (void)toggleAltKey; + +// toggle shift key, returns true if pressed, otherwise false +- (void)toggleShiftKey; + +// toggle windows key, returns true if pressed, otherwise false +- (void)toggleWinKey; + +// send key strokes +- (void)sendEnterKeyStroke; +- (void)sendEscapeKeyStroke; +- (void)sendBackspaceKeyStroke; + +@end diff --git a/client/iOS/Models/RDPKeyboard.m b/client/iOS/Models/RDPKeyboard.m new file mode 100644 index 000000000..89c62edc0 --- /dev/null +++ b/client/iOS/Models/RDPKeyboard.m @@ -0,0 +1,306 @@ +/* + RDP Keyboard helper + + 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 "RDPKeyboard.h" +#include + +@interface RDPKeyboard (Private) +- (void)sendVirtualKey:(int)vKey up:(BOOL)up; +- (void)handleSpecialKey:(int)character; +- (void)handleAlphaNumChar:(int)character; +- (void)notifyDelegateModifiersChanged; +@end + +@implementation RDPKeyboard + +@synthesize delegate = _delegate, ctrlPressed = _ctrl_pressed, altPressed = _alt_pressed, shiftPressed = _shift_pressed, winPressed = _win_pressed; + +- (id)init +{ + if((self = [super init]) != nil) + { + [self initWithSession:nil delegate:nil]; + + memset(_virtual_key_map, 0, sizeof(_virtual_key_map)); + memset(_unicode_map, 0, sizeof(_unicode_map)); + + // init vkey map - used for alpha-num characters + _virtual_key_map['0'] = VK_KEY_0; + _virtual_key_map['1'] = VK_KEY_1; + _virtual_key_map['2'] = VK_KEY_2; + _virtual_key_map['3'] = VK_KEY_3; + _virtual_key_map['4'] = VK_KEY_4; + _virtual_key_map['5'] = VK_KEY_5; + _virtual_key_map['6'] = VK_KEY_6; + _virtual_key_map['7'] = VK_KEY_7; + _virtual_key_map['8'] = VK_KEY_8; + _virtual_key_map['9'] = VK_KEY_9; + + _virtual_key_map['a'] = VK_KEY_A; + _virtual_key_map['b'] = VK_KEY_B; + _virtual_key_map['c'] = VK_KEY_C; + _virtual_key_map['d'] = VK_KEY_D; + _virtual_key_map['e'] = VK_KEY_E; + _virtual_key_map['f'] = VK_KEY_F; + _virtual_key_map['g'] = VK_KEY_G; + _virtual_key_map['h'] = VK_KEY_H; + _virtual_key_map['i'] = VK_KEY_I; + _virtual_key_map['j'] = VK_KEY_J; + _virtual_key_map['k'] = VK_KEY_K; + _virtual_key_map['l'] = VK_KEY_L; + _virtual_key_map['m'] = VK_KEY_M; + _virtual_key_map['n'] = VK_KEY_N; + _virtual_key_map['o'] = VK_KEY_O; + _virtual_key_map['p'] = VK_KEY_P; + _virtual_key_map['q'] = VK_KEY_Q; + _virtual_key_map['r'] = VK_KEY_R; + _virtual_key_map['s'] = VK_KEY_S; + _virtual_key_map['t'] = VK_KEY_T; + _virtual_key_map['u'] = VK_KEY_U; + _virtual_key_map['v'] = VK_KEY_V; + _virtual_key_map['w'] = VK_KEY_W; + _virtual_key_map['x'] = VK_KEY_X; + _virtual_key_map['y'] = VK_KEY_Y; + _virtual_key_map['z'] = VK_KEY_Z; + + // init scancode map - used for special characters + _unicode_map['-'] = 45; + _unicode_map['/'] = 47; + _unicode_map[':'] = 58; + _unicode_map[';'] = 59; + _unicode_map['('] = 40; + _unicode_map[')'] = 41; + _unicode_map['&'] = 38; + _unicode_map['@'] = 64; + _unicode_map['.'] = 46; + _unicode_map[','] = 44; + _unicode_map['?'] = 63; + _unicode_map['!'] = 33; + _unicode_map['\''] = 39; + _unicode_map['\"'] = 34; + + _unicode_map['['] = 91; + _unicode_map[']'] = 93; + _unicode_map['{'] = 123; + _unicode_map['}'] = 125; + _unicode_map['#'] = 35; + _unicode_map['%'] = 37; + _unicode_map['^'] = 94; + _unicode_map['*'] = 42; + _unicode_map['+'] = 43; + _unicode_map['='] = 61; + + _unicode_map['_'] = 95; + _unicode_map['\\'] = 92; + _unicode_map['|'] = 124; + _unicode_map['~'] = 126; + _unicode_map['<'] = 60; + _unicode_map['>'] = 62; + _unicode_map['$'] = 36; + } + return self; +} + +- (void)dealloc +{ + [super dealloc]; +} + +#pragma mark - +#pragma mark class methods + +// return a keyboard instance ++ (RDPKeyboard*)getSharedRDPKeyboard +{ + static RDPKeyboard* _shared_keyboard = nil; + + if (_shared_keyboard == nil) + { + @synchronized(self) + { + if (_shared_keyboard == nil) + _shared_keyboard = [[RDPKeyboard alloc] init]; + } + } + + return _shared_keyboard; +} + +// reset the keyboard instance and assign the given rdp instance +- (void)initWithSession:(RDPSession *)session delegate:(NSObject *)delegate +{ + _alt_pressed = NO; + _ctrl_pressed = NO; + _shift_pressed = NO; + _win_pressed = NO; + + _session = session; + _delegate = delegate; +} + +- (void)reset +{ + // reset pressed ctrl, alt, shift or win key + if(_shift_pressed) + [self toggleShiftKey]; + if(_alt_pressed) + [self toggleAltKey]; + if(_ctrl_pressed) + [self toggleCtrlKey]; + if(_win_pressed) + [self toggleWinKey]; +} + +// handles button pressed input event from the iOS keyboard +// performs all conversions etc. +- (void)sendUnicode:(int)character +{ + if(isalnum(character)) + [self handleAlphaNumChar:character]; + else + [self handleSpecialKey:character]; + + [self reset]; +} + +// send a backspace key press +- (void)sendVirtualKeyCode:(int)keyCode +{ + [self sendVirtualKey:keyCode up:NO]; + [self sendVirtualKey:keyCode up:YES]; +} + +#pragma mark modifier key handling +// toggle ctrl key, returns true if pressed, otherwise false +- (void)toggleCtrlKey +{ + [self sendVirtualKey:VK_LCONTROL up:_ctrl_pressed]; + _ctrl_pressed = !_ctrl_pressed; + [self notifyDelegateModifiersChanged]; +} + +// toggle alt key, returns true if pressed, otherwise false +- (void)toggleAltKey +{ + [self sendVirtualKey:VK_LMENU up:_alt_pressed]; + _alt_pressed = !_alt_pressed; + [self notifyDelegateModifiersChanged]; +} + +// toggle shift key, returns true if pressed, otherwise false +- (void)toggleShiftKey +{ + [self sendVirtualKey:VK_LSHIFT up:_shift_pressed]; + _shift_pressed = !_shift_pressed; + [self notifyDelegateModifiersChanged]; +} + +// toggle windows key, returns true if pressed, otherwise false +- (void)toggleWinKey +{ + [self sendVirtualKey:VK_LWIN up:_win_pressed]; + _win_pressed = !_win_pressed; + [self notifyDelegateModifiersChanged]; +} + +#pragma mark Sending special key strokes + +- (void)sendEnterKeyStroke +{ + [self sendVirtualKeyCode:VK_RETURN]; +} + +- (void)sendEscapeKeyStroke +{ + [self sendVirtualKeyCode:VK_ESCAPE]; +} + +- (void)sendBackspaceKeyStroke +{ + [self sendVirtualKeyCode:VK_BACK]; +} + +@end + +#pragma mark - +@implementation RDPKeyboard (Private) + +- (void)handleAlphaNumChar:(int)character +{ + // if we recive an uppercase letter - make it lower and send an shift down event to server + BOOL shift_was_sent = NO; + if(isupper(character) && _shift_pressed == NO) + { + character = tolower(character); + [self sendVirtualKey:VK_SHIFT up:NO]; + shift_was_sent = YES; + } + + // convert the character to a VK + int vk = _virtual_key_map[character]; + if(vk != 0) + { + // send key pressed + [self sendVirtualKey:vk up:NO]; + [self sendVirtualKey:vk up:YES]; + } + + // send the missing shift up if we had a shift down + if(shift_was_sent) + [self sendVirtualKey:VK_SHIFT up:YES]; +} + +- (void)handleSpecialKey:(int)character +{ + NSDictionary* eventDescriptor = nil; + if(character < 256) + { + // convert the character to a unicode character + int code = _unicode_map[character]; + if(code != 0) + eventDescriptor = [NSDictionary dictionaryWithObjectsAndKeys: + @"keyboard", @"type", + @"unicode", @"subtype", + [NSNumber numberWithUnsignedShort:0], @"flags", + [NSNumber numberWithUnsignedShort:code], @"unicode_char", + nil]; + } + + if (eventDescriptor == nil) + eventDescriptor = [NSDictionary dictionaryWithObjectsAndKeys: + @"keyboard", @"type", + @"unicode", @"subtype", + [NSNumber numberWithUnsignedShort:0], @"flags", + [NSNumber numberWithUnsignedShort:character], @"unicode_char", + nil]; + + [_session sendInputEvent:eventDescriptor]; +} + +// sends the vk code to the session +- (void)sendVirtualKey:(int)vKey up:(BOOL)up +{ + RDP_SCANCODE scancode = freerdp_keyboard_get_rdp_scancode_from_virtual_key_code(vKey); + int flags = (up ? KBD_FLAGS_RELEASE : KBD_FLAGS_DOWN); + flags |= (RDP_SCANCODE_EXTENDED(scancode) ? KBD_FLAGS_EXTENDED : 0); + [_session sendInputEvent:[NSDictionary dictionaryWithObjectsAndKeys: + @"keyboard", @"type", + @"scancode", @"subtype", + [NSNumber numberWithUnsignedShort:flags], @"flags", + [NSNumber numberWithUnsignedShort:RDP_SCANCODE_CODE(scancode)], @"scancode", + nil]]; +} + +- (void)notifyDelegateModifiersChanged +{ + if ([[self delegate] respondsToSelector:@selector(modifiersChangedForKeyboard:)]) + [[self delegate] modifiersChangedForKeyboard:self]; +} + +@end diff --git a/client/iOS/Models/RDPSession.h b/client/iOS/Models/RDPSession.h new file mode 100644 index 000000000..c266cc9a6 --- /dev/null +++ b/client/iOS/Models/RDPSession.h @@ -0,0 +1,108 @@ +/* + RDP Session object + + Copyright 2013 Thinstuff Technologies GmbH, Authors: Martin Fleisz, Dorian Johnson + + 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 + +#include + +// forward declaration +@class RDPSession; +@class ComputerBookmark; +@class ConnectionParams; + +// notification handler for session disconnect +extern NSString* TSXSessionDidDisconnectNotification; +extern NSString* TSXSessionDidFailToConnectNotification; + +// protocol for session notifications +@protocol RDPSessionDelegate +@optional +- (void)session:(RDPSession*)session didFailToConnect:(int)reason; +- (void)sessionWillConnect:(RDPSession*)session; +- (void)sessionDidConnect:(RDPSession*)session; +- (void)sessionWillDisconnect:(RDPSession*)session; +- (void)sessionDidDisconnect:(RDPSession*)session; +- (void)sessionBitmapContextWillChange:(RDPSession*)session; +- (void)sessionBitmapContextDidChange:(RDPSession*)session; +- (void)session:(RDPSession*)session needsRedrawInRect:(CGRect)rect; +- (CGSize)sizeForFitScreenForSession:(RDPSession*)session; +- (void)showGoProScreen:(RDPSession*)session; + +- (void)session:(RDPSession*)session requestsAuthenticationWithParams:(NSMutableDictionary*)params; +- (void)session:(RDPSession*)session verifyCertificateWithParams:(NSMutableDictionary*)params; + +@end + +// rdp session +@interface RDPSession : NSObject +{ +@private + freerdp* _freerdp; + + ComputerBookmark* _bookmark; + + ConnectionParams* _params; + + NSObject* _delegate; + + NSCondition* _ui_request_completed; + + NSString* _name; + + // flag if the session is suspended + BOOL _suspended; + + // flag that specifies whether the RDP toolbar is visible + BOOL _toolbar_visible; +} + +@property (readonly) ConnectionParams* params; +@property (readonly) ComputerBookmark* bookmark; +@property (assign) id delegate; +@property (assign) BOOL toolbarVisible; +@property (readonly) CGContextRef bitmapContext; +@property (readonly) NSCondition* uiRequestCompleted; + + +// initialize a new session with the given bookmark +- (id)initWithBookmark:(ComputerBookmark*)bookmark; + +#pragma mark - session control functions + +// connect the session +-(void)connect; + +// disconnect session +-(void)disconnect; + +// suspends the session +-(void)suspend; + +// resumes a previously suspended session +-(void)resume; + +// returns YES if the session is started +-(BOOL)isSuspended; + +// send input event to the server +-(void)sendInputEvent:(NSDictionary*)event; + +// session needs a refresh of its view +- (void)setNeedsDisplayInRectAsValue:(NSValue*)rect_value; + +// get a small session screenshot +- (UIImage*)getScreenshotWithSize:(CGSize)size; + +// returns the session's current paramters +- (rdpSettings*)getSessionParams; + +// returns the session's name (usually the label of the bookmark the session was created with) +- (NSString*)sessionName; + +@end diff --git a/client/iOS/Models/RDPSession.m b/client/iOS/Models/RDPSession.m new file mode 100644 index 000000000..75e9c5ecf --- /dev/null +++ b/client/iOS/Models/RDPSession.m @@ -0,0 +1,430 @@ +/* + RDP Session object + + Copyright 2013 Thinstuff Technologies GmbH, Authors: Martin Fleisz, Dorian Johnson + + 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 "ios_freerdp.h" +#import "ios_freerdp_ui.h" +#import "ios_freerdp_events.h" + +#import "RDPSession.h" +#import "TSXTypes.h" +#import "Bookmark.h" +#import "ConnectionParams.h" + +NSString* TSXSessionDidDisconnectNotification = @"TSXSessionDidDisconnect"; +NSString* TSXSessionDidFailToConnectNotification = @"TSXSessionDidFailToConnect"; + +@interface RDPSession (Private) +- (void)runSession; +- (void)runSessionFinished:(NSNumber*)result; +- (mfInfo*)mfi; + +// The connection thread calls these on the main thread. +- (void)sessionWillConnect; +- (void)sessionDidConnect; +- (void)sessionDidDisconnect; +- (void)sessionDidFailToConnect:(int)reason; +- (void)sessionBitmapContextWillChange; +- (void)sessionBitmapContextDidChange; +@end + +@implementation RDPSession + +@synthesize delegate=_delegate, params=_params, toolbarVisible = _toolbar_visible, uiRequestCompleted = _ui_request_completed, bookmark = _bookmark; + ++ (void)initialize +{ + ios_init_freerdp(); +} + +// Designated initializer. +- (id)initWithBookmark:(ComputerBookmark *)bookmark +{ + if (!(self = [super init])) + return nil; + + if (!bookmark) + [NSException raise:NSInvalidArgumentException format:@"%s: params may not be nil.", __func__]; + + _bookmark = [bookmark retain]; + _params = [[bookmark params] copy]; + _name = [[bookmark label] retain]; + _delegate = nil; + _toolbar_visible = YES; + _freerdp = ios_freerdp_new(); + rdpSettings* settings = _freerdp->settings; + _ui_request_completed = [[NSCondition alloc] init]; + + BOOL connected_via_3g = ![bookmark conntectedViaWLAN]; + + // Screen Size is set on connect (we need a valid delegate in case the user choose an automatic screen size) + + // Other simple numeric settings + if ([_params hasValueForKey:@"colors"]) + settings->ColorDepth = [_params intForKey:@"colors" with3GEnabled:connected_via_3g]; + + if ([_params hasValueForKey:@"port"]) + settings->ServerPort = [_params intForKey:@"port"]; + + if ([_params boolForKey:@"console"]) + settings->ConsoleSession = 1; + + // connection info + settings->ServerHostname = strdup([_params UTF8StringForKey:@"hostname"]); + + // String settings + if ([[_params StringForKey:@"username"] length]) + settings->Username = strdup([_params UTF8StringForKey:@"username"]); + + if ([[_params StringForKey:@"password"] length]) + settings->Password = strdup([_params UTF8StringForKey:@"password"]); + + if ([[_params StringForKey:@"domain"] length]) + settings->Domain = strdup([_params UTF8StringForKey:@"domain"]); + + settings->ShellWorkingDirectory = strdup([_params UTF8StringForKey:@"working_directory"]); + settings->AlternateShell = strdup([_params UTF8StringForKey:@"remote_program"]); + + + // RemoteFX + if ([_params boolForKey:@"perf_remotefx" with3GEnabled:connected_via_3g]) + { + settings->RemoteFxCodec = TRUE; + settings->FastPathOutput = TRUE; + settings->ColorDepth = 32; + settings->LargePointerFlag = TRUE; + settings->FrameMarkerCommandEnabled = TRUE; + } + + // Performance flags + settings->DisableWallpaper = ![_params boolForKey:@"perf_show_desktop" with3GEnabled:connected_via_3g]; + settings->DisableFullWindowDrag = ![_params boolForKey:@"perf_window_dragging" with3GEnabled:connected_via_3g]; + settings->DisableMenuAnims = ![_params boolForKey:@"perf_menu_animation" with3GEnabled:connected_via_3g]; + settings->DisableThemes = ![_params boolForKey:@"perf_windows_themes" with3GEnabled:connected_via_3g]; + settings->AllowFontSmoothing = [_params boolForKey:@"perf_font_smoothing" with3GEnabled:connected_via_3g]; + settings->AllowDesktopComposition = [_params boolForKey:@"perf_desktop_composition" with3GEnabled:connected_via_3g]; + + settings->PerformanceFlags = PERF_FLAG_NONE; + if (settings->DisableWallpaper) + settings->PerformanceFlags |= PERF_DISABLE_WALLPAPER; + if (settings->DisableFullWindowDrag) + settings->PerformanceFlags |= PERF_DISABLE_FULLWINDOWDRAG; + if (settings->DisableMenuAnims) + settings->PerformanceFlags |= PERF_DISABLE_MENUANIMATIONS; + if (settings->DisableThemes) + settings->PerformanceFlags |= PERF_DISABLE_THEMING; + if (settings->AllowFontSmoothing) + settings->PerformanceFlags |= PERF_ENABLE_FONT_SMOOTHING; + if (settings->AllowDesktopComposition) + settings->PerformanceFlags |= PERF_ENABLE_DESKTOP_COMPOSITION; + + if ([_params hasValueForKey:@"width"]) + settings->DesktopWidth = [_params intForKey:@"width"]; + if ([_params hasValueForKey:@"height"]) + settings->DesktopHeight = [_params intForKey:@"height"]; + + // security + switch ([_params intForKey:@"security"]) + { + case TSXProtocolSecurityNLA: + settings->RdpSecurity = FALSE; + settings->TlsSecurity = FALSE; + settings->NlaSecurity = TRUE; + settings->ExtSecurity = FALSE; + break; + + case TSXProtocolSecurityTLS: + settings->RdpSecurity = FALSE; + settings->TlsSecurity = TRUE; + settings->NlaSecurity = FALSE; + settings->ExtSecurity = FALSE; + break; + + case TSXProtocolSecurityRDP: + settings->RdpSecurity = TRUE; + settings->TlsSecurity = FALSE; + settings->NlaSecurity = FALSE; + settings->ExtSecurity = FALSE; + settings->DisableEncryption = TRUE; + settings->EncryptionMethods = ENCRYPTION_METHOD_40BIT | ENCRYPTION_METHOD_128BIT | ENCRYPTION_METHOD_FIPS; + settings->EncryptionLevel = ENCRYPTION_LEVEL_CLIENT_COMPATIBLE; + break; + + default: + break; + } + + // Remote keyboard layout + settings->KeyboardLayout = 0x409; + + // Audio settings + settings->AudioPlayback = FALSE; + settings->AudioCapture = FALSE; + + [self mfi]->session = self; + return self; +} + +- (void)dealloc +{ + [self setDelegate:nil]; + [_bookmark release]; + [_name release]; + [_params release]; + [_ui_request_completed release]; + + ios_freerdp_free(_freerdp); + + [super dealloc]; +} + +- (CGContextRef)bitmapContext +{ + return [self mfi]->bitmap_context; +} + +#pragma mark - +#pragma mark Connecting and disconnecting + +- (void)connect +{ + // Set Screen Size to automatic if widht or height are still 0 + rdpSettings* settings = _freerdp->settings; + if (settings->DesktopWidth == 0 || settings->DesktopHeight == 0) + { + CGSize size = CGSizeZero; + if ([[self delegate] respondsToSelector:@selector(sizeForFitScreenForSession:)]) + size = [[self delegate] sizeForFitScreenForSession:self]; + + if (!CGSizeEqualToSize(CGSizeZero, size)) + { + [_params setInt:size.width forKey:@"width"]; + [_params setInt:size.height forKey:@"height"]; + settings->DesktopWidth = size.width; + settings->DesktopHeight = size.height; + } + } + + // TODO: This is a hack to ensure connections to RDVH with 16bpp don't have an odd screen resolution width + // Otherwise this could result in screen corruption .. + if (settings->ColorDepth <= 16) + settings->DesktopWidth &= (~1); + + [self performSelectorInBackground:@selector(runSession) withObject:nil]; +} + +- (void)disconnect +{ + mfInfo* mfi = [self mfi]; + + ios_events_send(mfi, [NSDictionary dictionaryWithObject:@"disconnect" forKey:@"type"]); + + if (mfi->connection_state == TSXConnectionConnecting) + { + mfi->unwanted = YES; + [self sessionDidDisconnect]; + return; + } +} + +- (TSXConnectionState)connectionState +{ + return [self mfi]->connection_state; +} + +// suspends the session +-(void)suspend +{ + if(!_suspended) + { + _suspended = YES; +// instance->update->SuppressOutput(instance->context, 0, NULL); + } +} + +// resumes a previously suspended session +-(void)resume +{ + if(_suspended) + { +/* RECTANGLE_16 rec; + rec.left = 0; + rec.top = 0; + rec.right = instance->settings->width; + rec.bottom = instance->settings->height; +*/ + _suspended = NO; +// instance->update->SuppressOutput(instance->context, 1, &rec); +// [delegate sessionScreenSettingsChanged:self]; + } +} + +// returns YES if the session is started +-(BOOL)isSuspended +{ + return _suspended; +} + +#pragma mark - +#pragma mark Input events + +- (void)sendInputEvent:(NSDictionary*)eventDescriptor +{ + if ([self mfi]->connection_state == TSXConnectionConnected) + ios_events_send([self mfi], eventDescriptor); +} + +#pragma mark - +#pragma mark Server events (main thread) + +- (void)setNeedsDisplayInRectAsValue:(NSValue*)rect_value +{ + if ([[self delegate] respondsToSelector:@selector(session:needsRedrawInRect:)]) + [[self delegate] session:self needsRedrawInRect:[rect_value CGRectValue]]; +} + + +#pragma mark - +#pragma mark interface functions + +- (UIImage*)getScreenshotWithSize:(CGSize)size +{ + NSAssert([self mfi]->bitmap_context != nil, @"Screenshot requested while having no valid RDP drawing context"); + + CGImageRef cgImage = CGBitmapContextCreateImage([self mfi]->bitmap_context); + UIGraphicsBeginImageContext(size); + + CGContextTranslateCTM(UIGraphicsGetCurrentContext(), 0, size.height); + CGContextScaleCTM(UIGraphicsGetCurrentContext(), 1.0, -1.0); + CGContextDrawImage(UIGraphicsGetCurrentContext(), CGRectMake(0, 0, size.width, size.height), cgImage); + + UIImage *viewImage = UIGraphicsGetImageFromCurrentImageContext(); + + UIGraphicsEndImageContext(); + CGImageRelease(cgImage); + + return viewImage; +} + +- (rdpSettings*)getSessionParams +{ + return _freerdp->settings; +} + +- (NSString*)sessionName +{ + return _name; +} + +@end + +#pragma mark - +@implementation RDPSession (Private) + +- (mfInfo*)mfi +{ + return MFI_FROM_INSTANCE(_freerdp); +} + +// Blocks until rdp session finishes. +- (void)runSession +{ + NSAutoreleasePool* pool = [[NSAutoreleasePool alloc] init]; + + // Run the session + [self performSelectorOnMainThread:@selector(sessionWillConnect) withObject:nil waitUntilDone:YES]; + int result_code = ios_run_freerdp(_freerdp); + [self mfi]->connection_state = TSXConnectionDisconnected; + [self performSelectorOnMainThread:@selector(runSessionFinished:) withObject:[NSNumber numberWithInt:result_code] waitUntilDone:YES]; + + [pool release]; +} + +// Main thread. +- (void)runSessionFinished:(NSNumber*)result +{ + int result_code = [result intValue]; + + switch (result_code) + { + case MF_EXIT_CONN_CANCELED: + [self sessionDidDisconnect]; + break; + case MF_EXIT_LOGON_TIMEOUT: + case MF_EXIT_CONN_FAILED: + [self sessionDidFailToConnect:result_code]; + break; + case MF_EXIT_SUCCESS: + default: + [self sessionDidDisconnect]; + break; + } +} + +#pragma mark - +#pragma mark Session management (main thread) + +- (void)sessionWillConnect +{ + if ([[self delegate] respondsToSelector:@selector(sessionWillConnect:)]) + [[self delegate] sessionWillConnect:self]; +} + +- (void)sessionDidConnect +{ + if ([[self delegate] respondsToSelector:@selector(sessionDidConnect:)]) + [[self delegate] sessionDidConnect:self]; +} + +- (void)sessionDidFailToConnect:(int)reason +{ + [[NSNotificationCenter defaultCenter] postNotificationName:TSXSessionDidFailToConnectNotification object:self]; + + if ([[self delegate] respondsToSelector:@selector(session:didFailToConnect:)]) + [[self delegate] session:self didFailToConnect:reason]; +} + +- (void)sessionDidDisconnect +{ + [[NSNotificationCenter defaultCenter] postNotificationName:TSXSessionDidDisconnectNotification object:self]; + + if ([[self delegate] respondsToSelector:@selector(sessionDidDisconnect:)]) + [[self delegate] sessionDidDisconnect:self]; +} + +- (void)sessionBitmapContextWillChange +{ + if ([[self delegate] respondsToSelector:@selector(sessionBitmapContextWillChange:)]) + [[self delegate] sessionBitmapContextWillChange:self]; +} + +- (void)sessionBitmapContextDidChange +{ + if ([[self delegate] respondsToSelector:@selector(sessionBitmapContextDidChange:)]) + [[self delegate] sessionBitmapContextDidChange:self]; +} + +- (void)showGoProScreen +{ + if ([[self delegate] respondsToSelector:@selector(showGoProScreen:)]) + [[self delegate] showGoProScreen:self]; +} + +- (void)sessionRequestsAuthenticationWithParams:(NSMutableDictionary*)params +{ + if ([[self delegate] respondsToSelector:@selector(session:requestsAuthenticationWithParams:)]) + [[self delegate] session:self requestsAuthenticationWithParams:params]; +} + +- (void)sessionVerifyCertificateWithParams:(NSMutableDictionary*)params +{ + if ([[self delegate] respondsToSelector:@selector(session:verifyCertificateWithParams:)]) + [[self delegate] session:self verifyCertificateWithParams:params]; +} + +@end diff --git a/client/iOS/Resources/BookmarkListView.xib b/client/iOS/Resources/BookmarkListView.xib new file mode 100644 index 000000000..94fb683a1 --- /dev/null +++ b/client/iOS/Resources/BookmarkListView.xib @@ -0,0 +1,365 @@ + + + + 1296 + 11D50b + 2182 + 1138.32 + 568.00 + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + 1179 + + + IBUITableView + IBUIView + IBUISearchBar + IBProxyObject + + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + + PluginDependencyRecalculationVersion + + + + + IBFilesOwner + IBCocoaTouchFramework + + + IBFirstResponder + IBCocoaTouchFramework + + + + 274 + + + + 274 + {{0, 44}, {320, 416}} + + + + _NS:9 + + 10 + + 549453824 + {512, 1} + + + + + + TU0AKgAACAjFzNT/xczU/8XM1P/FzNT/xczS/8vS2P/L0tj/xczU/8XM1P/FzNT/xczU/8XM0v/L0tj/ +y9LY/8XM1P/FzNT/xczU/8XM1P/FzNL/y9LY/8vS2P/FzNT/xczU/8XM1P/FzNT/xczS/8vS2P/L0tj/ +xczU/8XM1P/FzNT/xczU/8XM0v/L0tj/y9LY/8XM1P/FzNT/xczU/8XM1P/FzNL/y9LY/8vS2P/FzNT/ +xczU/8XM1P/FzNT/xczS/8vS2P/L0tj/xczU/8XM1P/FzNT/xczU/8XM0v/L0tj/y9LY/8XM1P/FzNT/ +xczU/8XM1P/FzNL/y9LY/8vS2P/FzNT/xczU/8XM1P/FzNT/xczS/8vS2P/L0tj/xczU/8XM1P/FzNT/ +xczU/8XM0v/L0tj/y9LY/8XM1P/FzNT/xczU/8XM1P/FzNL/y9LY/8vS2P/FzNT/xczU/8XM1P/FzNT/ +xczS/8vS2P/L0tj/xczU/8XM1P/FzNT/xczU/8XM0v/L0tj/y9LY/8XM1P/FzNT/xczU/8XM1P/FzNL/ +y9LY/8vS2P/FzNT/xczU/8XM1P/FzNT/xczS/8vS2P/L0tj/xczU/8XM1P/FzNT/xczU/8XM0v/L0tj/ +y9LY/8XM1P/FzNT/xczU/8XM1P/FzNL/y9LY/8vS2P/FzNT/xczU/8XM1P/FzNT/xczS/8vS2P/L0tj/ +xczU/8XM1P/FzNT/xczU/8XM0v/L0tj/y9LY/8XM1P/FzNT/xczU/8XM1P/FzNL/y9LY/8vS2P/FzNT/ +xczU/8XM1P/FzNT/xczS/8vS2P/L0tj/xczU/8XM1P/FzNT/xczU/8XM0v/L0tj/y9LY/8XM1P/FzNT/ +xczU/8XM1P/FzNL/y9LY/8vS2P/FzNT/xczU/8XM1P/FzNT/xczS/8vS2P/L0tj/xczU/8XM1P/FzNT/ +xczU/8XM0v/L0tj/y9LY/8XM1P/FzNT/xczU/8XM1P/FzNL/y9LY/8vS2P/FzNT/xczU/8XM1P/FzNT/ +xczS/8vS2P/L0tj/xczU/8XM1P/FzNT/xczU/8XM0v/L0tj/y9LY/8XM1P/FzNT/xczU/8XM1P/FzNL/ +y9LY/8vS2P/FzNT/xczU/8XM1P/FzNT/xczS/8vS2P/L0tj/xczU/8XM1P/FzNT/xczU/8XM0v/L0tj/ +y9LY/8XM1P/FzNT/xczU/8XM1P/FzNL/y9LY/8vS2P/FzNT/xczU/8XM1P/FzNT/xczS/8vS2P/L0tj/ +xczU/8XM1P/FzNT/xczU/8XM0v/L0tj/y9LY/8XM1P/FzNT/xczU/8XM1P/FzNL/y9LY/8vS2P/FzNT/ +xczU/8XM1P/FzNT/xczS/8vS2P/L0tj/xczU/8XM1P/FzNT/xczU/8XM0v/L0tj/y9LY/8XM1P/FzNT/ +xczU/8XM1P/FzNL/y9LY/8vS2P/FzNT/xczU/8XM1P/FzNT/xczS/8vS2P/L0tj/xczU/8XM1P/FzNT/ +xczU/8XM0v/L0tj/y9LY/8XM1P/FzNT/xczU/8XM1P/FzNL/y9LY/8vS2P/FzNT/xczU/8XM1P/FzNT/ +xczS/8vS2P/L0tj/xczU/8XM1P/FzNT/xczU/8XM0v/L0tj/y9LY/8XM1P/FzNT/xczU/8XM1P/FzNL/ +y9LY/8vS2P/FzNT/xczU/8XM1P/FzNT/xczS/8vS2P/L0tj/xczU/8XM1P/FzNT/xczU/8XM0v/L0tj/ +y9LY/8XM1P/FzNT/xczU/8XM1P/FzNL/y9LY/8vS2P/FzNT/xczU/8XM1P/FzNT/xczS/8vS2P/L0tj/ +xczU/8XM1P/FzNT/xczU/8XM0v/L0tj/y9LY/8XM1P/FzNT/xczU/8XM1P/FzNL/y9LY/8vS2P/FzNT/ +xczU/8XM1P/FzNT/xczS/8vS2P/L0tj/xczU/8XM1P/FzNT/xczU/8XM0v/L0tj/y9LY/8XM1P/FzNT/ +xczU/8XM1P/FzNL/y9LY/8vS2P/FzNT/xczU/8XM1P/FzNT/xczS/8vS2P/L0tj/xczU/8XM1P/FzNT/ +xczU/8XM0v/L0tj/y9LY/8XM1P/FzNT/xczU/8XM1P/FzNL/y9LY/8vS2P/FzNT/xczU/8XM1P/FzNT/ +xczS/8vS2P/L0tj/xczU/8XM1P/FzNT/xczU/8XM0v/L0tj/y9LY/8XM1P/FzNT/xczU/8XM1P/FzNL/ +y9LY/8vS2P/FzNT/xczU/8XM1P/FzNT/xczS/8vS2P/L0tj/xczU/8XM1P/FzNT/xczU/8XM0v/L0tj/ +y9LY/8XM1P/FzNT/xczU/8XM1P/FzNL/y9LY/8vS2P/FzNT/xczU/8XM1P/FzNT/xczS/8vS2P/L0tj/ +xczU/8XM1P/FzNT/xczU/8XM0v/L0tj/y9LY/8XM1P/FzNT/xczU/8XM1P/FzNL/y9LY/8vS2P/FzNT/ +xczU/8XM1P/FzNT/xczS/8vS2P/L0tj/xczU/8XM1P/FzNT/xczU/8XM0v/L0tj/y9LY/8XM1P/FzNT/ +xczU/8XM1P/FzNL/y9LY/8vS2P/FzNT/xczU/8XM1P/FzNT/xczS/8vS2P/L0tj/xczU/8XM1P/FzNT/ +xczU/8XM0v/L0tj/y9LY/8XM1P/FzNT/xczU/8XM1P/FzNL/y9LY/8vS2P/FzNT/xczU/8XM1P/FzNT/ +xczS/8vS2P/L0tj/xczU/wANAQAAAwAAAAECAAAAAQEAAwAAAAEAAQAAAQIAAwAAAAQAAAiqAQMAAwAA +AAEAAQAAAQYAAwAAAAEAAgAAAREABAAAAAEAAAAIARIAAwAAAAEAAQAAARUAAwAAAAEABAAAARYAAwAA +AAEAAQAAARcABAAAAAEAAAgAARwAAwAAAAEAAQAAAVIAAwAAAAEAAQAAAVMAAwAAAAQAAAiyAAAAAAAI +AAgACAAIAAEAAQABAAE + + + + + + 3 + MCAwAA + + + groupTableViewBackgroundColor + + YES + IBCocoaTouchFramework + YES + 1 + 2 + 0 + YES + 44 + 10 + 10 + + + + 290 + {320, 44} + + + + _NS:9 + 3 + IBCocoaTouchFramework + + 1 + IBCocoaTouchFramework + + + + {{0, 20}, {320, 460}} + + + + + 3 + MQA + + 2 + + + + IBCocoaTouchFramework + + + + + + + tableView + + + + 6 + + + + view + + + + 7 + + + + searchBar + + + + 5 + + + + delegate + + + + 8 + + + + dataSource + + + + 9 + + + + delegate + + + + 10 + + + + + + 0 + + + + + + 1 + + + + + + + + + -1 + + + File's Owner + + + -2 + + + + + 3 + + + + + + 4 + + + + + + + BookmarkListController + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + UIResponder + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + + + + + 10 + + + + + BookmarkListController + UIViewController + + BookmarkTableCell + UISearchBar + SessionsTableCell + UITableView + + + + bmTableCell + BookmarkTableCell + + + searchBar + UISearchBar + + + sessTableCell + SessionsTableCell + + + tableView + UITableView + + + + IBProjectSource + ./Classes/BookmarkListController.h + + + + BookmarkTableCell + UITableViewCell + + UIImageView + UILabel + UILabel + + + + _connection_state_icon + UIImageView + + + _sub_title + UILabel + + + _title + UILabel + + + + IBProjectSource + ./Classes/BookmarkTableCell.h + + + + SessionsTableCell + UITableViewCell + + UIButton + UIImageView + UILabel + UILabel + UILabel + + + + _disconnect_button + UIButton + + + _screenshot + UIImageView + + + _server + UILabel + + + _title + UILabel + + + _username + UILabel + + + + IBProjectSource + ./Classes/SessionsTableCell.h + + + + + 0 + IBCocoaTouchFramework + + com.apple.InterfaceBuilder.CocoaTouchPlugin.iPhoneOS + + + YES + 3 + 1179 + + diff --git a/client/iOS/Resources/BookmarkTableViewCell.xib b/client/iOS/Resources/BookmarkTableViewCell.xib new file mode 100644 index 000000000..1d86f08f8 --- /dev/null +++ b/client/iOS/Resources/BookmarkTableViewCell.xib @@ -0,0 +1,428 @@ + + + + 1296 + 11D50b + 2182 + 1138.32 + 568.00 + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + 1179 + + + YES + IBProxyObject + IBUILabel + IBUITableViewCell + + + YES + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + + PluginDependencyRecalculationVersion + + + + YES + + IBFilesOwner + IBIPadFramework + + + IBFirstResponder + IBIPadFramework + + + + 292 + + YES + + + 256 + + YES + + + 290 + {{20, 2}, {267, 21}} + + + + _NS:9 + NO + YES + 7 + NO + IBIPadFramework + Label + + 1 + MCAwIDAAA + + + 3 + MQA + + 0 + 10 + + 2 + 18 + + + Helvetica-Bold + 18 + 16 + + + + + 290 + {{20, 20}, {267, 21}} + + + + _NS:9 + NO + YES + 7 + NO + IBIPadFramework + Label + + + 0 + 10 + + 1 + 14 + + + Helvetica + 14 + 16 + + + + {287, 43} + + + + _NS:11 + + 3 + MCAwAA + + NO + YES + 4 + YES + IBCocoaTouchFramework + + + {320, 44} + + + + _NS:9 + IBIPadFramework + 2 + + + + + + YES + + + bmTableCell + + + + 23 + + + + _sub_title + + + + 21 + + + + _title + + + + 22 + + + + + YES + + 0 + + YES + + + + + + -1 + + + File's Owner + + + -2 + + + + + 18 + + + YES + + + + + + + 19 + + + + + 20 + + + + + + + YES + + YES + -1.CustomClassName + -1.IBPluginDependency + -2.CustomClassName + -2.IBPluginDependency + 18.CustomClassName + 18.IBPluginDependency + 19.IBPluginDependency + 20.IBPluginDependency + + + YES + BookmarkListController + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + UIResponder + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + BookmarkTableCell + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + + + YES + + + + + + YES + + + + + 23 + + + + YES + + BookmarkListController + UIViewController + + YES + + YES + bmTableCell + searchBar + sessTableCell + tableView + + + YES + BookmarkTableCell + UISearchBar + SessionTableCell + UITableView + + + + YES + + YES + bmTableCell + searchBar + sessTableCell + tableView + + + YES + + bmTableCell + BookmarkTableCell + + + searchBar + UISearchBar + + + sessTableCell + SessionTableCell + + + tableView + UITableView + + + + + IBProjectSource + ./Classes/BookmarkListController.h + + + + BookmarkTableCell + UITableViewCell + + YES + + YES + _connection_state_icon + _sub_title + _title + + + YES + UIImageView + UILabel + UILabel + + + + YES + + YES + _connection_state_icon + _sub_title + _title + + + YES + + _connection_state_icon + UIImageView + + + _sub_title + UILabel + + + _title + UILabel + + + + + IBProjectSource + ./Classes/BookmarkTableCell.h + + + + SessionTableCell + UITableViewCell + + YES + + YES + _disconnect_button + _screenshot + _server + _title + _username + + + YES + UIButton + UIImageView + UILabel + UILabel + UILabel + + + + YES + + YES + _disconnect_button + _screenshot + _server + _title + _username + + + YES + + _disconnect_button + UIButton + + + _screenshot + UIImageView + + + _server + UILabel + + + _title + UILabel + + + _username + UILabel + + + + + IBProjectSource + ./Classes/SessionTableCell.h + + + + + 0 + IBIPadFramework + + com.apple.InterfaceBuilder.CocoaTouchPlugin.iPhoneOS + + + + com.apple.InterfaceBuilder.CocoaTouchPlugin.InterfaceBuilder3 + + + YES + 3 + 1179 + + diff --git a/client/iOS/Resources/CredentialsInputView.xib b/client/iOS/Resources/CredentialsInputView.xib new file mode 100644 index 000000000..fab4ab936 --- /dev/null +++ b/client/iOS/Resources/CredentialsInputView.xib @@ -0,0 +1,481 @@ + + + + 1296 + 11D50b + 2182 + 1138.32 + 568.00 + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + 1179 + + + YES + IBUITextField + IBUILabel + IBUIButton + IBUIView + IBUIScrollView + IBProxyObject + + + YES + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + + PluginDependencyRecalculationVersion + + + + YES + + IBFilesOwner + IBCocoaTouchFramework + + + IBFirstResponder + IBCocoaTouchFramework + + + + 274 + + YES + + + 279 + + YES + + + 290 + {{15, 112}, {210, 31}} + + + NO + YES + IBCocoaTouchFramework + 0 + + 3 + Username + + 3 + MAA + + 2 + + + YES + 17 + + IBCocoaTouchFramework + + 3 + + 1 + 12 + + + Helvetica + 12 + 16 + + + + + 290 + {{15, 161}, {210, 31}} + + + NO + YES + IBCocoaTouchFramework + 0 + + 3 + Password + + 3 + MAA + + + YES + 17 + + YES + IBCocoaTouchFramework + + 3 + + + + + + 290 + {{15, 210}, {210, 31}} + + + NO + YES + IBCocoaTouchFramework + 0 + + 3 + Domain + + 3 + MAA + + + YES + 17 + + IBCocoaTouchFramework + + 3 + + + + + + 291 + {{130, 263}, {95, 37}} + + NO + IBCocoaTouchFramework + 0 + 0 + 1 + Cancel + + 3 + MQA + + + 1 + MC4xOTYwNzg0MzQ2IDAuMzA5ODAzOTMyOSAwLjUyMTU2ODY1NgA + + + 3 + MC41AA + + + Helvetica-Bold + Helvetica + 2 + 15 + + + Helvetica-Bold + 15 + 16 + + + + + 294 + {{15, 263}, {95, 37}} + + + NO + IBCocoaTouchFramework + 0 + 0 + 1 + Login + + + 1 + MC4xOTYwNzg0MzQ2IDAuMzA5ODAzOTMyOSAwLjUyMTU2ODY1NgA + + + + + + + + 290 + {{15, 20}, {210, 71}} + + + NO + YES + 7 + NO + IBCocoaTouchFramework + Please provide the missing user information in order to proceed and login. + + 1 + MCAwIDAAA + + + 1 + 10 + 3 + 0 + + 1 + 17 + + + Helvetica + 17 + 16 + + + + {240, 320} + + + _NS:9 + YES + YES + IBCocoaTouchFramework + + + {240, 320} + + + _NS:9 + + 3 + MQA + + + IBCocoaTouchFramework + + + + + YES + + + view + + + + 41 + + + + _scroll_view + + + + 42 + + + + _textfield_username + + + + 34 + + + + _textfield_password + + + + 33 + + + + _textfield_domain + + + + 32 + + + + _btn_cancel + + + + 30 + + + + _btn_login + + + + 31 + + + + _lbl_message + + + + 43 + + + + cancelPressed: + + + 7 + + 36 + + + + loginPressed: + + + 7 + + 37 + + + + + YES + + 0 + + YES + + + + + + -1 + + + File's Owner + + + -2 + + + + + 40 + + + YES + + + + + + 38 + + + YES + + + + + + + + + + + 3 + + + + + 5 + + + + + 7 + + + + + 10 + + + + + 20 + + + + + 11 + + + + + + + YES + + YES + -1.CustomClassName + -1.IBPluginDependency + -2.CustomClassName + -2.IBAttributePlaceholdersKey + -2.IBPluginDependency + 10.IBPluginDependency + 11.IBPluginDependency + 20.IBPluginDependency + 3.IBPluginDependency + 38.IBPluginDependency + 40.IBPluginDependency + 5.IBPluginDependency + 7.IBPluginDependency + + + YES + CredentialsInputController + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + UIResponder + + YES + + + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + + + YES + + + + + + YES + + + + + 43 + + + 0 + IBCocoaTouchFramework + + com.apple.InterfaceBuilder.CocoaTouchPlugin.iPhoneOS + + + + com.apple.InterfaceBuilder.CocoaTouchPlugin.InterfaceBuilder3 + + + YES + 3 + 1179 + + diff --git a/client/iOS/Resources/Default-568h@2x.png b/client/iOS/Resources/Default-568h@2x.png new file mode 100755 index 0000000000000000000000000000000000000000..bc2676bd8be3e83863b7923f64021627a0749dca GIT binary patch literal 22681 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 J{Q8}^{{VZLeGLEr literal 0 HcmV?d00001 diff --git a/client/iOS/Resources/Default-Landscape@2x~ipad.png b/client/iOS/Resources/Default-Landscape@2x~ipad.png new file mode 100755 index 0000000000000000000000000000000000000000..fe643b1bbf0dd97337c3bede093b300d0e005daf GIT binary patch literal 43289 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 Zl|iWQ?!h7dr=gRM+vXrdu{XZwP%d7wZ literal 0 HcmV?d00001 diff --git a/client/iOS/Resources/Default-Landscape~ipad.png b/client/iOS/Resources/Default-Landscape~ipad.png new file mode 100755 index 0000000000000000000000000000000000000000..fe4be748b63ef147425b7ff9aa668a17379d3a80 GIT binary patch literal 17059 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 SJs z$4fya$q)Nc!$5-4vPSGNEIu3TEywrEXOn7B>#|ybQ`m#O#v3Jb&4mniH*HDFNu+l* zm-1;U37xy7{i&*-GL2n_q9Q?g0k_8qI@z>?%zK$Td?|rjKMn}{G$CsB= zx;qi@^j(5~A zo!hs&xZAhayacD4S=Zhh&3E+x9`_$?&}{I1wI>?<#lXrQfH8% zOekRc2sWSy*rh51S@dUFLixA%4+3q0_UN97LZ7L6em*^N?ClvP_hI7)3c(gO9XgHc z{X-Yb8R!kaURykoH^vI$^_$mJ=#md6+K4?I-&od_W|Q;9cr8+7p-0U!ht-=*Nf4o%`;^Npzwf`r+$m zMS-jNMKp642-_c}#WK^jqf*%hKGc`tDFwj^skLm8-x`*60l&E5@B*hUsBw z=C*?_mHm27N&a_r{X>B+JCEoOQs2+&T&5ZFV)#Rdvkmmb1R;q>em$5U3`oyCR)$-C zK!0G{#Lz8b(rJ)4n&jC-2PhU`mBjyW5|oU@QY3(wu@}x4mTeXk!d1D0LgB8BW+hmo zjb6o$0H@Iwrw|zUb#=`|9>*l#GLw+t9u0~$JBp_n2qY9 z=|?RTjz_fooX_}?^4{kTOQqZb*pWO01h3X9bTRGaWUpc|*5LDqvvlJ^TtB@Ll?^qM zWbP6y?&o4u;HKKhQ82V_e%HbItH^u)&z_SW=G? Td+&V{7D_PIca!h}Z0i!IS+c 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 literal 0 HcmV?d00001 diff --git a/client/iOS/Resources/Default@2x.png b/client/iOS/Resources/Default@2x.png new file mode 100755 index 0000000000000000000000000000000000000000..ba63bf054a4df6f9d0615397bd019c3376dfacd9 GIT binary patch literal 21096 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 literal 0 HcmV?d00001 diff --git a/client/iOS/Resources/EditButtonTableViewCell.xib b/client/iOS/Resources/EditButtonTableViewCell.xib new file mode 100644 index 000000000..0091ff0be --- /dev/null +++ b/client/iOS/Resources/EditButtonTableViewCell.xib @@ -0,0 +1,408 @@ + + + + 1296 + 11D50b + 2182 + 1138.32 + 568.00 + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + 1179 + + + IBUITableViewCell + IBUIButton + IBUILabel + IBProxyObject + + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + + PluginDependencyRecalculationVersion + + + + + IBFilesOwner + IBCocoaTouchFramework + + + IBFirstResponder + IBCocoaTouchFramework + + + + 292 + + + + 256 + + + + 298 + {{12, 10}, {218, 25}} + + + + _NS:9 + NO + YES + 7 + NO + IBCocoaTouchFramework + Label + + 1 + MCAwIDAAA + + + 3 + MQA + + 0 + 10 + + 2 + 17 + + + Helvetica-Bold + 17 + 16 + + NO + + + + 297 + {{252, 6}, {58, 31}} + + + _NS:9 + NO + IBCocoaTouchFramework + 0 + 0 + 1 + + + 1 + MC4xOTYwNzg0MzE0IDAuMzA5ODAzOTIxNiAwLjUyMTU2ODYyNzUAA + + + 3 + MC41AA + + + 1 + 15 + + + Helvetica + 15 + 16 + + + + {320, 43} + + + + _NS:11 + + 3 + MCAwAA + + NO + YES + 4 + YES + IBCocoaTouchFramework + + + {320, 44} + + + + _NS:9 + IBCocoaTouchFramework + + + + + + + + _buttonTableViewCell + + + + 7 + + + + _button + + + + 5 + + + + _label + + + + 6 + + + + + + 0 + + + + + + -1 + + + File's Owner + + + -2 + + + + + 2 + + + + + + + + + 3 + + + + + 4 + + + + + + + EditorBaseController + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + UIResponder + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + EditButtonTableViewCell + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + + + + + 7 + + + + + EditButtonTableViewCell + UITableViewCell + + UIButton + UILabel + + + + _button + UIButton + + + _label + UILabel + + + + IBProjectSource + ./Classes/EditButtonTableViewCell.h + + + + EditFlagTableViewCell + UITableViewCell + + UILabel + UISwitch + + + + _label + UILabel + + + _toggle + UISwitch + + + + IBProjectSource + ./Classes/EditFlagTableViewCell.h + + + + EditSecretTextTableViewCell + UITableViewCell + + UILabel + UITextField + UIButton + + + + _label + UILabel + + + _textfield + UITextField + + + _unhide_button + UIButton + + + + IBProjectSource + ./Classes/EditSecretTextTableViewCell.h + + + + EditSelectionTableViewCell + UITableViewCell + + UILabel + UILabel + + + + _label + UILabel + + + _selection + UILabel + + + + IBProjectSource + ./Classes/EditSelectionTableViewCell.h + + + + EditSubEditTableViewCell + UITableViewCell + + _label + UILabel + + + _label + + _label + UILabel + + + + IBProjectSource + ./Classes/EditSubEditTableViewCell.h + + + + EditTextTableViewCell + UITableViewCell + + UILabel + UITextField + + + + _label + UILabel + + + _textfield + UITextField + + + + IBProjectSource + ./Classes/EditTextTableViewCell.h + + + + EditorBaseController + UITableViewController + + EditButtonTableViewCell + EditFlagTableViewCell + EditSecretTextTableViewCell + EditSelectionTableViewCell + EditSubEditTableViewCell + EditTextTableViewCell + + + + _buttonTableViewCell + EditButtonTableViewCell + + + _flagTableViewCell + EditFlagTableViewCell + + + _secretTextTableViewCell + EditSecretTextTableViewCell + + + _selectionTableViewCell + EditSelectionTableViewCell + + + _subEditTableViewCell + EditSubEditTableViewCell + + + _textTableViewCell + EditTextTableViewCell + + + + IBProjectSource + ./Classes/EditorBaseController.h + + + + + 0 + IBCocoaTouchFramework + + com.apple.InterfaceBuilder.CocoaTouchPlugin.iPhoneOS + + + YES + 3 + 1179 + + diff --git a/client/iOS/Resources/EditFlagTableViewCell.xib b/client/iOS/Resources/EditFlagTableViewCell.xib new file mode 100644 index 000000000..a657eefa9 --- /dev/null +++ b/client/iOS/Resources/EditFlagTableViewCell.xib @@ -0,0 +1,208 @@ + + + + 1296 + 11D50b + 2182 + 1138.32 + 568.00 + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + 1179 + + + IBUITableViewCell + IBUISwitch + IBUILabel + IBProxyObject + + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + + PluginDependencyRecalculationVersion + + + + + IBFilesOwner + IBCocoaTouchFramework + + + IBFirstResponder + IBCocoaTouchFramework + + + + 292 + + + + 256 + + + + 298 + {{10, 10}, {214, 25}} + + + _NS:9 + NO + YES + 7 + NO + IBCocoaTouchFramework + Label + + 1 + MCAwIDAAA + + + 3 + MQA + + 0 + 10 + + 2 + 17 + + + Helvetica-Bold + 17 + 16 + + NO + + + + 297 + {{217, 8}, {94, 27}} + + _NS:9 + NO + IBCocoaTouchFramework + 0 + 0 + YES + + + {320, 43} + + + _NS:11 + + 3 + MCAwAA + + NO + YES + 4 + YES + IBCocoaTouchFramework + + + {320, 44} + + + _NS:9 + IBCocoaTouchFramework + 0 + + + + + + + + _flagTableViewCell + + + + 7 + + + + _label + + + + 5 + + + + _toggle + + + + 6 + + + + + + 0 + + + + + + -1 + + + File's Owner + + + -2 + + + + + 2 + + + + + + + + + 3 + + + + + 4 + + + + + + + EditorBaseController + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + UIResponder + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + EditFlagTableViewCell + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + + + + + 7 + + + 0 + IBCocoaTouchFramework + + com.apple.InterfaceBuilder.CocoaTouchPlugin.iPhoneOS + + + YES + 3 + 1179 + + diff --git a/client/iOS/Resources/EditSecretTextTableViewCell.xib b/client/iOS/Resources/EditSecretTextTableViewCell.xib new file mode 100644 index 000000000..4aac30f42 --- /dev/null +++ b/client/iOS/Resources/EditSecretTextTableViewCell.xib @@ -0,0 +1,288 @@ + + + + 1296 + 11D50b + 2182 + 1138.32 + 568.00 + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + 1179 + + + IBUITableViewCell + IBUIButton + IBUILabel + IBUITextField + IBProxyObject + + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + + PluginDependencyRecalculationVersion + + + + + IBFilesOwner + IBCocoaTouchFramework + + + IBFirstResponder + IBCocoaTouchFramework + + + + 292 + + + + 256 + + + + 300 + {{10, 10}, {100, 25}} + + + _NS:9 + NO + YES + 7 + NO + IBCocoaTouchFramework + Label + + 1 + MCAwIDAAA + + + 3 + MQA + + 0 + 10 + + 2 + 17 + + + Helvetica-Bold + 17 + 16 + + NO + + + + 298 + {{120, 10}, {150, 25}} + + + _NS:9 + NO + YES + IBCocoaTouchFramework + 0 + Test + + 3 + MAA + + 2 + + + YES + 17 + + 1 + YES + IBCocoaTouchFramework + + 3 + + 1 + 17 + + + Helvetica + 17 + 16 + + + + + 297 + {{270, 10}, {50, 25}} + + + _NS:9 + NO + IBCocoaTouchFramework + 0 + 0 + Unhide + + + 1 + MC4xOTYwNzg0MzE0IDAuMzA5ODAzOTIxNiAwLjUyMTU2ODYyNzUAA + + + 3 + MC41AA + + + 1 + 15 + + + Helvetica + 15 + 16 + + + + {320, 43} + + + _NS:11 + + 3 + MCAwAA + + NO + YES + 4 + YES + IBCocoaTouchFramework + + + {320, 44} + + + _NS:9 + IBCocoaTouchFramework + 0 + + + + + + + + _secretTextTableViewCell + + + + 9 + + + + _label + + + + 6 + + + + _textfield + + + + 7 + + + + _unhide_button + + + + 11 + + + + delegate + + + + 12 + + + + + + 0 + + + + + + -1 + + + File's Owner + + + -2 + + + + + 2 + + + + + + + + + + 3 + + + + + 4 + + + + + 10 + + + + + + + EditorBaseController + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + UIResponder + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + EditSecretTextTableViewCell + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + + + + + 12 + + + 0 + IBCocoaTouchFramework + + com.apple.InterfaceBuilder.CocoaTouchPlugin.iPhoneOS + + + YES + 3 + 1179 + + diff --git a/client/iOS/Resources/EditSelectionTableViewCell.xib b/client/iOS/Resources/EditSelectionTableViewCell.xib new file mode 100644 index 000000000..6861e5b91 --- /dev/null +++ b/client/iOS/Resources/EditSelectionTableViewCell.xib @@ -0,0 +1,347 @@ + + + + 1296 + 11D50b + 2182 + 1138.32 + 568.00 + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + 1179 + + + IBProxyObject + IBUILabel + IBUITableViewCell + + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + + PluginDependencyRecalculationVersion + + + + + IBFilesOwner + IBCocoaTouchFramework + + + IBFirstResponder + IBCocoaTouchFramework + + + + 292 + + + + 256 + + + + 302 + {{10, 10}, {140, 25}} + + + + _NS:9 + NO + YES + 7 + NO + IBCocoaTouchFramework + Label + + 1 + MCAwIDAAA + + + 3 + MQA + + 0 + 10 + + 2 + 17 + + + Helvetica-Bold + 17 + 16 + + NO + + + + 299 + {{160, 10}, {120, 25}} + + + _NS:9 + NO + YES + 7 + NO + IBCocoaTouchFramework + Selection + + + 0 + 10 + 2 + + 1 + 17 + + + Helvetica + 17 + 16 + + NO + + + {300, 43} + + + + _NS:11 + + 3 + MCAwAA + + NO + YES + 4 + YES + IBCocoaTouchFramework + + + {320, 44} + + + + _NS:9 + IBCocoaTouchFramework + 1 + + + + + + + + _selectionTableViewCell + + + + 9 + + + + _label + + + + 7 + + + + _selection + + + + 8 + + + + + + 0 + + + + + + -1 + + + File's Owner + + + -2 + + + + + 2 + + + + + + + + + 5 + + + + + 6 + + + + + + + EditorBaseController + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + UIResponder + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + EditSelectionTableViewCell + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + + + + + 9 + + + + + EditFlagTableViewCell + UITableViewCell + + UILabel + UISwitch + + + + _label + UILabel + + + _toggle + UISwitch + + + + IBProjectSource + ./Classes/EditFlagTableViewCell.h + + + + EditSelectionTableViewCell + UITableViewCell + + UILabel + UILabel + + + + _label + UILabel + + + _selection + UILabel + + + + IBProjectSource + ./Classes/EditSelectionTableViewCell.h + + + + EditSubEditTableViewCell + UITableViewCell + + _label + UILabel + + + _label + + _label + UILabel + + + + IBProjectSource + ./Classes/EditSubEditTableViewCell.h + + + + EditTextTableViewCell + UITableViewCell + + UILabel + UITextField + + + + _label + UILabel + + + _textfield + UITextField + + + + IBProjectSource + ./Classes/EditTextTableViewCell.h + + + + EditorBaseController + UITableViewController + + EditFlagTableViewCell + EditSelectionTableViewCell + EditSubEditTableViewCell + EditTextTableViewCell + + + + _flagTableViewCell + EditFlagTableViewCell + + + _selectionTableViewCell + EditSelectionTableViewCell + + + _subEditTableViewCell + EditSubEditTableViewCell + + + _textTableViewCell + EditTextTableViewCell + + + + IBProjectSource + ./Classes/EditorBaseController.h + + + + + 0 + IBCocoaTouchFramework + + com.apple.InterfaceBuilder.CocoaTouchPlugin.iPhoneOS + + + YES + 3 + 1179 + + diff --git a/client/iOS/Resources/EditSubEditTableViewCell.xib b/client/iOS/Resources/EditSubEditTableViewCell.xib new file mode 100644 index 000000000..967bc164d --- /dev/null +++ b/client/iOS/Resources/EditSubEditTableViewCell.xib @@ -0,0 +1,179 @@ + + + + 1296 + 11D50b + 2182 + 1138.32 + 568.00 + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + 1179 + + + IBProxyObject + IBUILabel + IBUITableViewCell + + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + + PluginDependencyRecalculationVersion + + + + + IBFilesOwner + IBCocoaTouchFramework + + + IBFirstResponder + IBCocoaTouchFramework + + + + 292 + + + + 256 + + + + 298 + {{10, 10}, {270, 25}} + + _NS:9 + NO + YES + 7 + NO + IBCocoaTouchFramework + Label + + 1 + MCAwIDAAA + + + 3 + MQA + + 0 + 10 + + 2 + 17 + + + Helvetica-Bold + 17 + 16 + + NO + + + {300, 43} + + + _NS:11 + + 3 + MCAwAA + + NO + YES + 4 + YES + IBCocoaTouchFramework + + + {320, 44} + + + _NS:9 + IBCocoaTouchFramework + 1 + + + + + + + + _subEditTableViewCell + + + + 5 + + + + _label + + + + 4 + + + + + + 0 + + + + + + -1 + + + File's Owner + + + -2 + + + + + 2 + + + + + + + + 3 + + + + + + + EditorBaseController + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + UIResponder + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + EditSubEditTableViewCell + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + + + + + 5 + + + 0 + IBCocoaTouchFramework + + com.apple.InterfaceBuilder.CocoaTouchPlugin.iPhoneOS + + + YES + 3 + 1179 + + diff --git a/client/iOS/Resources/EditTextTableViewCell.xib b/client/iOS/Resources/EditTextTableViewCell.xib new file mode 100644 index 000000000..c10c612bc --- /dev/null +++ b/client/iOS/Resources/EditTextTableViewCell.xib @@ -0,0 +1,364 @@ + + + + 1296 + 11D50b + 2182 + 1138.32 + 568.00 + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + 1179 + + + IBUITableViewCell + IBUILabel + IBUITextField + IBProxyObject + + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + + PluginDependencyRecalculationVersion + + + + + IBFilesOwner + IBCocoaTouchFramework + + + IBFirstResponder + IBCocoaTouchFramework + + + + 292 + + + + 256 + + + + 300 + {{10, 10}, {100, 25}} + + + + _NS:9 + NO + YES + 7 + NO + IBCocoaTouchFramework + Label + + 1 + MCAwIDAAA + + + 3 + MQA + + 0 + 10 + + 2 + 17 + + + Helvetica-Bold + 17 + 16 + + NO + + + + 298 + {{120, 10}, {200, 25}} + + + + _NS:9 + NO + YES + IBCocoaTouchFramework + 0 + Test + + 3 + MAA + + 2 + + + YES + 17 + + 1 + IBCocoaTouchFramework + + 3 + + 1 + 17 + + + Helvetica + 17 + 16 + + + + {320, 43} + + + + _NS:11 + + 3 + MCAwAA + + NO + YES + 4 + YES + IBCocoaTouchFramework + + + {320, 44} + + + + _NS:9 + IBCocoaTouchFramework + 0 + + + + + + + + _textTableViewCell + + + + 7 + + + + _label + + + + 5 + + + + _textfield + + + + 6 + + + + delegate + + + + 8 + + + + + + 0 + + + + + + -1 + + + File's Owner + + + -2 + + + + + 2 + + + + + + + + + 3 + + + + + 4 + + + + + + + EditorBaseController + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + UIResponder + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + EditTextTableViewCell + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + + + + + 8 + + + + + EditFlagTableViewCell + UITableViewCell + + UILabel + UISwitch + + + + _label + UILabel + + + _toggle + UISwitch + + + + IBProjectSource + ./Classes/EditFlagTableViewCell.h + + + + EditSelectionTableViewCell + UITableViewCell + + UILabel + UILabel + + + + _label + UILabel + + + _selection + UILabel + + + + IBProjectSource + ./Classes/EditSelectionTableViewCell.h + + + + EditSubEditTableViewCell + UITableViewCell + + _label + UILabel + + + _label + + _label + UILabel + + + + IBProjectSource + ./Classes/EditSubEditTableViewCell.h + + + + EditTextTableViewCell + UITableViewCell + + UILabel + UITextField + + + + _label + UILabel + + + _textfield + UITextField + + + + IBProjectSource + ./Classes/EditTextTableViewCell.h + + + + EditorBaseController + UITableViewController + + EditFlagTableViewCell + EditSelectionTableViewCell + EditSubEditTableViewCell + EditTextTableViewCell + + + + _flagTableViewCell + EditFlagTableViewCell + + + _selectionTableViewCell + EditSelectionTableViewCell + + + _subEditTableViewCell + EditSubEditTableViewCell + + + _textTableViewCell + EditTextTableViewCell + + + + IBProjectSource + ./Classes/EditorBaseController.h + + + + + 0 + IBCocoaTouchFramework + + com.apple.InterfaceBuilder.CocoaTouchPlugin.iPhoneOS + + + YES + 3 + 1179 + + diff --git a/client/iOS/Resources/Icon-72.png b/client/iOS/Resources/Icon-72.png new file mode 100755 index 0000000000000000000000000000000000000000..94951e16705b2b446f4d5be063aeb9def2c24956 GIT binary patch literal 3203 zcmbVP2~-p37LF8Bih^QgSBMdiMaWDbfkXmA5*8tVAqcntAsIp-8%cnGfGDV}VqMr; zp@33c%D##sRK+4xMP#$o1#zKTP_cj(^i2@ydp(}#J8#aJng5^j-Fv@#@AuzxCe7Q^ zMO8&t1%W`Qy17#5@Y_{>D=WayJK2US;Fpe+>M!*XhDu|YVhG{L7KT75H$IaC(IF-~ zHnJ14Lm-s=xeR})Kh1;467nsXa*U;nFM_QR2s;Ovh{=k8q^J;x!xfOw6D=3fC@!0X z_QTNtnurXAab4rYkWZW^gB2ISBCyd8_9#0U5q7|bq)e2I&l5<9G7@^;FA-kLKV#6S zd5AQEg#JLvpXQAs3&ju$X9-xa06d7oTU&zG0KuBD0fhxX00Uw%fQ zD~HXLGCvDuvxuQWF`o$+iz^p9MkL_ON2Ae*ZUTvvDPTcv6cQSyYRToYiDa^kvy+V# z7Vqec13@a5K*8BKSrcrWt*!Am8<6_ZmLgnB>HdT;Ujl==E#?e!w%joj!Q@Y&qy&m z40Fc6fafu?-HqbNklndm5aHp&(Z2f4#-q1XPBL;fXO(D2mV4Oz(jiLI9SMGUDK(%Z ztutrm;eT$*P5t;AjQ{W|H8immr(Ns`(%qlV}R(*dWh<74k; z`pM*o8;?jowKONyARh;(~ETyW<7Q4Wpr=c(3;|<9l0u+S_Uro-_NoR4(;<+Ob#A?{yw+y z2tQe3RmjGS%DWo z&NW7LA`MR@4C=6fFl2;7a;c*e%5Yqz1G}LlU3p1FZK@7Fs}EVT#S|#l3L` zeTE%MOS*T1N||h^22FL-)%&U27N39S@BtNVSH>8(gmSyGtbI!TNg&@W>)GWk)Fu-RZo9NtI3R`n;2V6ZDt9jL_Ey?h0{I&37%ilzep_N88_5v@i7?y|6 z)MdTdQ#|gx0(r*Uxh66w$mP|!P`|&v+}omDUK{DFt}njFj&Y5Vq|{?Zq#G)Re=JKq zZvJ&&x?xXSk|I|nr!;Py6b4#1MV!lN2x_%6+h!upUShhTzqF>gZ-`Z$o%#@L%Gfou z-zewhc*2d7iKm?}FeB9NDkbv=4<|!%BoRxMw(X8VI1++gh6+Gn~N%(Flo%Lst z$M(?t2g@~9o4gL(xU?!^TVL0hihA4isDc3Kl5E1hJg=Ynu7Sp84daIHvO>_OXMT3n z9Z>JudTnz*H;k+<(K6RKPZ3~D9@SLZ6X-`TuF)H3c|G>n+BH^lt?MEV(NZ(3Li)As z^;zW+X7u$ce4euJc--;ok)Mj^l$QBIza3wny)$1I8si*r_li%N)7~-p5VtuyGC!&* zsaoo~QP>z#*tz3me~@kcXnAUCmreLR`^0{pUgA^_A{1-7RxsvQQdj&mc-Q@VGj)@R zBNtYBnGIG~cD)RIHFl+B)?&?toVWN=dc~&kzDCm1^L;ACrAzb<^p4&pJa$k^Ye}`y zzH~9hR!d9wj|-aThX;Npym{F^XFE#JQOW+P@rK8GTR&IY)>tbtik6yv# zogW@6^mO+?Ct~-UjP2D=lr*NE$=j6lrmpCQ{xqAsB5uF=Bl;Gy?D^w<-|Ti{m^hrBjx5HoqC|?+j^O1E&uXk5kJu=J7Xl{=14!paa>*) zvkFYpnyfzEsxuK$Q|o`GR+C(MszuB7?WBu_TN-=!Y{fL#{1-1XV|ha?C(t)`qR~%) z8ub4%=v=GJJYlYX^}#-!Re!#o9{9@NcaAg;cB_>gSwB;x8aa2rt{3wAW{ZjaY^I`J ze1=ZjBa;!wDZ`RFhh%1AKw=JdNQ}4{wU8F z^wiP%r8%+h=6oLRl(|v4xl!yU7wWV>gw3&zKozFpDu5q--sgh$5BjQK*RYFKa^C z$`X-1BFa)>3h|A$_j|wdKi~g7?{m)c+}CxV-?d-&b)WOZA48e(^X%hcVPWC7Fh|%j z*NZzZ7l8T2%LOkn7YQ2DnPx}!p@pKUI2L0p*&7G6AfkP7wm394EU*oy&%(m)Ot5#R zIonvnFl3?{dIzIMCsLTwEG+s)bP5{dkD~#-alQnS0cfeF0R$vq4M0v>HV_*M9ET^E zhf{HO;V64dxIab@3oeFFN1wE~>R^bDDii|K(t$ysz+VrDX^o2Y zf!QKVf7xPk1|U3*MuCCBp`oE_p&DvrsxKI-r>6&osDstjRhbCYpfC~*O;;ra$^O=W zzy)Eb1PYBnCINReqP@w%Gy@RR)1M&_DSyX)HBjQN3ASM?22g}Tojm;nU->M}N|Dc0t$PlJSzhe7abdY@*1qZgp1(AcP z7#uQ$X;JpKV?i`q+`m%uABZ#IKZGeTI2DJck*W4%a=`C`9mA7p8G z1QM1U8nk2V7aoT|({KhLX7MysAy8FyU3;h&OkESE1yO-OVGzhqs0|rQ@Co~Os0PFy zstwc9g=s+l4a)2sESiS?M=%xx^C44-XlAkqJIxNJkbHkwv$26$kb-Dv5(a01FaR-K zRU;6vFr+3NiGXXUYa5$tL7_->U1PW&LPHm+V+_|pXqy=SmPL>;!8=9#EsOn^tj0gd z9;FhP2M8VTcREa=CK@`r5Dil;ZDXW56sn6r=)rZ>k?JOzT5vei{?3uwX%(0`A&6Or zuwPAYhYS2g1rUHgx&wyB>@=_e2(wc$92WFzoA5VL|D)AkvY~h!Q{n$p#-EmheoYx; zUuK5>sY}32zrj1F>}Lqz{~O&;9)Y70LU349Dw)Xih1rg<|2B>tS?u3b?;msU$I<^a z9)A1IoH;w>pJB&j{)|f;i8&*w%wZU43MpX@=mZOdu|56G#~YCWA`FRV7vOJolSM>? zg>63rE^{<*0IJHOKVBb9cek-$CnP_SJ=AuF#X>V-uZG-tvAbf_xPD!Xih}- zI3w&7`OEsohF1H7_&Kxf@Z|;$-<*B}#AyjJk?-rDudLlWAs~IeCO^!Qo#U4Bn*-@Y zfv=5WM|^CX?tRe~c@|I)BJ>}Q;PrQ9%gZl|!0*W-GfD#PtJ#$5KT|Fve7p1rs;k-# zv=vKbji5AJjD zYVHPDLEryaJ1nehqlMtS0S+ZRNe5ipK84e7H_Ej?+|>){=rWi8^yYzF?|S4rkIC6K zxAdC;kx?MH-ixp|ThdoS{-U^G8yiP`OT*_veFlh6yvofS-_nAZ^*Ll49k0ead1l&v z!c$K4ra9m&LbP{{8S?WkLv9uh;VEkeSrgZ|c7E@uy#rMONd}1E>ZR0=p1W8|@s+O+ zM;yPwf6`w*dKK;+W!$&=y2de1QO>DLgoTgThm?r#_w{u^4Ybib`*XGh*3tlm=sChrT zV*0FNU>ta$5y5}fi~Fo|4I|HYz5)={W)#65cXseg)nW=NWY~Rq(rhSkKyg1)TcK8W zNG`=F{iWTE|C(W`uRHtM+XJ~a#eF?FDmU1a%a=z>?{~?xAWgeG6{@f{Y@U0abvd3K zi;=kdrC>?MM?c*4YTy+rb z?LSx82xJJ~J9;%m>-B(f#LPWIu98S|9_v>qupx)5(4K;A#;$(DLN?PoGs+w6u`5xX zNvrbRkKgUHjjr?3?auG)OwSlyl#Cv{1$b&g`pVhLLKw>B32^MP>R#Gw>&lUzx_UFh zn`hIST^qCAsvy-X3RK@m&O!xK9&OjnL!Hzt0(9u}qEYVc~R=${bylh40s3O~=^S%pknpZOV zY6mSGK5{^~p?YlFD&Se<#=khOuSeOG$_Uv_1+;=n`LAcT=9k8#EV5j`Hhuoo;(4C< zO#J${O;OeP$%KT|cj!#DRPbmn<<=;=x|M|L~Ggc$J9rKE-hO}%U;Yq&B3R!v_~itL$`N- z9iNzZBTO(XeSiCKZ>2^i7wh$&=8C4{e(u(VEO05|CuF`>dTbBN68*PuO;HvFffWymSnrvmiuNih@J(u;I|4-s zF`Io(%&%1=EvF3yKte7?#eh-+B##J-3le;QFn;VPO!jK3|XYH zI(TENqjyb^Pa3u=b`lPfOA;#On__##nN=4nzg^ZMlt~UO60#|DrB2LQKTuuJ1tek_ zyE7!O4Rf&UlBr~X$+lER{`0;m!A9ITYSZ}zXU?oD*TqdAg6La3T z@sFxTPS^QoZ&$x?$M^?~MpBFfjMKEwF=UjzxDaN2!27J_6Sl7t)y|nEhNXdDoS1eO zcQo|6BpxqdpU7kKp3}9@y`$&ja0TwW%Fu8_B@8;oBCS96X-431t&`5kIVZcC(e0dL zHRA6AoMYJ_asASHJNJfCAfPzG%E_h5+Vm-SZ0yU{QAQ)@0E6WvC$(~B&fae0^b1cl z@K%YauMef5_wDYgGFR)Yy0^AUR^CxgLzdg_l&>s_qEE98Bh}Ye+P*%%Vh7%{x%r|6 zKrtK;%B_SusDUI(946z~;1eIW4kw6a)3?dRMqEklV!rOEu0EGp&xfFb&zHuhmxfxX z?k^!5J}5vd#BbXZhd+@W`<< zAmc`$8ZX!^Is$tAZpx`|B#LXUdiAt)=*o&-ILD^(jHCf~=Pl7>?H3Eupq{7t2QyHF zyLT|vZj_qX@A;vdiqcs{hNoRdUyVTbo13*NBsAPV##!D($X$?@V?TR~;j$Yt`C+mt z68p$$dFrKy5}Vvh(vv~NScTEnytPFzX5*2HPIYZidyj^l5Bu!K{dKhu_G{Isp&NV_ zVa7m6UVCw|{{S*~q0LqQnQrTchl{n#gUL2obyV4E5}TS{HzK7l@@!6y+xC{;sEU28XsUxn zs+f4%mWiH0(zoZ8G!G!gR8NYt7?Lu3C|u~u;VE_1EJf~Ycfz>I;sb1ixXG7$%7OcG zLIidh+-N&9o!agcPu2Bq&+0tV-Dlw(^0>F?<#X;swd@og0cozLB!_|gOWM}fborww zuTB&?JN$-ENby(M=fn7;G2NWoL#I~tOUqjHiM602(e~PF`ymCdstXh~yZDKolku2+ zT@@4O^um42%H$F?@KG9dvE#x7_xR36<`6#U)z8mJ%{hSYdC59r7+0XryxAk%W~0bo zI?Gykzl@JmpK3`%V6v9XI7{~jAdy!l#U9puigaY$UVb8}&ek#XR}u3@R}Ojd9a-9R zHMs1iiW8TS43@h5`prJKxsweO-D5Fuqmz@l7p`sUJiL|^=zDLZ{PH+rY+Usgzeqg| zs=vC@dawoOQ}sGzjVkdyY+=BC(sQ-tTVn9cJ|8h{-Hh#2S&T?O{{rade2o4fRg|Lp z+VtWZ(_o&b-&dvUg{t>nap?K98*s0Y&Q))M1Y}6+1w&6C-56WgpPly^Wv^2$cBMbO zRlz5XXAkLulliN!9Br?zt1b`5>@wQ=Drq2^cJJAIbfnK+? z)1rBYS4Oy#PrL82MYSSJ&yxgXgh|3Po|CI50jj7+P<45gas*AqYIbqN)I$bQSzDm! zBALFquuL|}d%(f16ouQTGcI-|A(TM6pQv^pRy_`#lpuPVJ2q@7rY% zCd;b!hm~T0ehr~HS5KWW;|(xdkCB|SpaM!M0>GShPKlI9Raq$SBkz|+>v7}BU5zP2 zyzmPp=RzGfccrr~WQeCyx<@$&KMtT!)S%ubKxV&&XYZWpDgRs7OoE6W=8qK5iyd1w z(L@hUHx|nPUVgj$TrlACuwwE48pLDp5r0z$ooWv0WY&j-x%RymSImtR%j(;0eeXsO zZcH)8Ca3zEqPdA|n1U)58;(-5%Ou6W*msXluur?MEgCaAE8oq}7iHsb7;2AQzIcEh rWWdeWd`Hk3@RIA0zR-FD3meOfCl|P`+4sWE|1Aq73USxOE9QRy(%n&L literal 0 HcmV?d00001 diff --git a/client/iOS/Resources/Icon.png b/client/iOS/Resources/Icon.png new file mode 100755 index 0000000000000000000000000000000000000000..0d09cdd14856d04baa991e05dd738afd3088c5d2 GIT binary patch literal 2864 zcmbVO2~ZPh76x5BKn@iFQ6UCUxspyGK(fRLIRs<4%#~_-(>AQV+#75y1}#sea%-e!xd{_fg%}{Lpol3I2OYAO29ZM z2m<-a#74+dM@KJQ6dbMy=d7miUR=$bHx!{0kSLE2}1-30G>d^1MbcQfI@Po z00hj$g+-&u`2tE1gEbKg-BGbZg+fNb~lJ5QM-< zavsE7k4CilObk&3L4TI!e=tYkW5zNHT@HZ?SRM?+;?E5W5W)%=5yCPIeGLgmz=VmU zd^j1=2AjY`3{U}4v1s#LoB@I}(Ic2Zq7YpvB)}0MPyk>Y%7OVJf%30V7a*A6rtPzf z%U__Va`>PE{3@8wqX=NR1VoD^(uy4~lg5oj<8UaxQbYktd5|xIibbj7L?S+gPIMuA zlUPJIFBXYFU=lrC8LnhEB9r9GU^2Yv<4jRo2Fy#+Hu1A9|4&<&ui5&`Md$$n#b5G4 zAiKH~SpbWLdSMa?1P=y-O!pu%iQcXxI^Ek#E738jP<%uP+6U!?=+{7r6DzR@Go}s- z$kPg#isflL2Jx{IpG9BD`m0eVY?Fl$>hQm`aXd0IF=f2s&}3QlRin=e_-4Y6p5P}=KN_f_oAo3}Qv+PU^V`>=quWXY|)kj2Ls zvz+;PRmQB{5yX!%MDrZGB}lzR(vnr)ZkNQuDIk$J$N5~Z*=q~Orzf_^YT~(tD~<-V zml8+26esE)-s$Mzwo_G$i}LFJrCHvs{M4;9;tB+U?1DM$3^lS~dP4_mm)~vru5}Ls zM?SH;)U-9W9$i~h*UK&^yBlWC4Y*&Dv1yL_tj@>NCA1axXEF-R0v1Qu7f#RJ@wZq# z?Dg+Ita>){+A7_fKJ2YVw)zQ@JS*KRzjxTwu;8^R~R8-JC;Y$b7$JA zxcz0eGq1j9R~D28eAw4#`*;_v=jLp|UCPSu%D7nzHicG|iDcN<7qcTpBN4Mtf`dx~ zF9_8&mT{p@)E3%n*Tm|f?#Gv>OEOa~xIJ9dJs=FcfIq`=Yr9lcS2Nnjzn^vT>4!#nUEH85N_gk6IKW0IG*XT2pV;hmKl;(sdoxBl? zTUp>gO;FFsJ_E;JeWhqPJg?ZAV{<~I9yV`qU4Vo>O%3iaj%3%G`_^}qM@HCWJD927 z8T4DM^Lo@oq0CEM>r)2#pUdoAy2ZX|Y2dA>dwYC?)@-3wM}0ccT@rctWBiew+k>+0 zv&_v+f5_F<%-OelbpGsBt*b@*ZRy$jaV-0)=!As3x&a-$(0mWO)5ZiQ@4d; zU}V{gYiQX&H-WV_e%FeOL?;RP{IT}!iTOsqH>sPje$_(KY9*UO&^c8LEivOJVb9|54zj3pc?-(7M%t3Bp))WOs4#dkLE zu*jTtG|g-A)2CrKtn@Cb-Z*qdtX(!bG^E}U7m`qEO{yHcTiID_;M(SV_pqmxeX07q zH#ko{n%%;hI&e+xK)+*mF7(YN=^j?du^S`rb1L7L9-d0s$o3;(i|2Yq7pSh^6Bjnq z`|d4V9{%Ba`X`Od$=dVn%XgU@cWEpSP%TL#C7RZ(jeBd<9V|=7x+h_EN4^QX?{dqmyi*f!xE$TGZ-`rdj>D?Z?k8My{a`s5w<)g_D-R|e5 zRwHNnl^2Q1wQ=P!M%Kx^y=hn1)(kEiGD_`S|FXHi z+)xH!-#vLb=w0z3@r9v5Yg1$NgKdYl?^uUVt%yEgX+g}nQ2y#0g=Qg+7OFD0-clZq*bmd9q_B8v>931!kzNAxoy(r-d@FD9 z>QAWfu;aH**-mdgTQFQ%e4QnzDz$xsdvogKL8G2eg^;m literal 0 HcmV?d00001 diff --git a/client/iOS/Resources/Icon@2x.png b/client/iOS/Resources/Icon@2x.png new file mode 100755 index 0000000000000000000000000000000000000000..9b7fae26ce292f48739c4416f0dbd8a22a05bef3 GIT binary patch literal 4240 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 ZfNVkJKkGv> + + + 1296 + 11D50b + 2182 + 1138.32 + 568.00 + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + 1179 + + + IBUIWindow + IBUITabBarController + IBUITabBar + IBUICustomObject + IBProxyObject + + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + + PluginDependencyRecalculationVersion + + + + + IBFilesOwner + IBCocoaTouchFramework + + + IBFirstResponder + IBCocoaTouchFramework + + + IBCocoaTouchFramework + + + + 1316 + + {320, 480} + + + 1 + MSAxIDEAA + + NO + NO + + IBCocoaTouchFramework + YES + + + + + + 1 + 1 + + YES + IBCocoaTouchFramework + NO + + + + 266 + {{0, 431}, {320, 49}} + + _NS:29 + + 3 + MCAwAA + + IBCocoaTouchFramework + + + + + + + + delegate + + + + 12 + + + + window + + + + 13 + + + + tabBarController + + + + 14 + + + + + + 0 + + + + + + 2 + + + + + + -1 + + + File's Owner + + + -2 + + + + + 4 + + + + + + + + 5 + + + + + 11 + + + AppDelegate + + + + + UIApplication + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + UIResponder + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + AppDelegate + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + MainTabBarController + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + + + + + 21 + + + 0 + IBCocoaTouchFramework + + com.apple.InterfaceBuilder.CocoaTouchPlugin.iPhoneOS + + + YES + 3 + 1179 + + diff --git a/client/iOS/Resources/RDPConnectingView.xib b/client/iOS/Resources/RDPConnectingView.xib new file mode 100644 index 000000000..cc0aec05d --- /dev/null +++ b/client/iOS/Resources/RDPConnectingView.xib @@ -0,0 +1,342 @@ + + + + 1296 + 11D50b + 2182 + 1138.32 + 568.00 + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + 1179 + + + IBUIButton + IBUIActivityIndicatorView + IBUIView + IBUILabel + IBProxyObject + + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + + PluginDependencyRecalculationVersion + + + + + IBFilesOwner + IBCocoaTouchFramework + + + IBFirstResponder + IBCocoaTouchFramework + + + + 301 + + + + 292 + {{45, 143}, {109, 37}} + + + _NS:9 + NO + IBCocoaTouchFramework + 0 + 0 + 1 + Cancel + + 3 + MQA + + + + 3 + MC41AA + + + NSImage + cancel_button_background.png + + + 2 + 15 + + + Helvetica-Bold + 15 + 16 + + + + + 301 + {{82, 81}, {37, 37}} + + + + _NS:9 + NO + IBCocoaTouchFramework + NO + 0 + + + + 292 + {{18, 20}, {165, 25}} + + + + _NS:9 + NO + YES + 7 + NO + IBCocoaTouchFramework + Connecting + + + 0 + 10 + 1 + + 2 + 17 + + + Helvetica-Bold + 17 + 16 + + + + {200, 200} + + + + + 3 + MC42NjY2NjY2NjY3AA + + + IBUISimulatedFreeformSizeMetricsSentinel + Freeform + + IBCocoaTouchFramework + + + + + + + _connecting_view + + + + 6 + + + + _cancel_connect_button + + + + 7 + + + + _connecting_indicator_view + + + + 8 + + + + _lbl_connecting + + + + 10 + + + + cancelButtonPressed: + + + 7 + + 9 + + + + + + 0 + + + + + + 1 + + + + + + + + + + -1 + + + File's Owner + + + -2 + + + + + 3 + + + + + 4 + + + + + 5 + + + + + + + RDPSessionViewController + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + UIResponder + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + + + + + 10 + + + + + RDPSessionView + UIView + + IBProjectSource + ./Classes/RDPSessionView.h + + + + RDPSessionViewController + UIViewController + + UIButton + UIActivityIndicatorView + UIView + UITextField + UILabel + UIScrollView + UIToolbar + RDPSessionView + TouchPointerView + + + + _cancel_connect_button + UIButton + + + _connecting_indicator_view + UIActivityIndicatorView + + + _connecting_view + UIView + + + _dummy_textfield + UITextField + + + _lbl_connecting + UILabel + + + _session_scrollview + UIScrollView + + + _session_toolbar + UIToolbar + + + _session_view + RDPSessionView + + + _touchpointer_view + TouchPointerView + + + + IBProjectSource + ./Classes/RDPSessionViewController.h + + + + TouchPointerView + UIView + + delegate + NSObject + + + delegate + + delegate + NSObject + + + + IBProjectSource + ./Classes/TouchPointerView.h + + + + + 0 + IBCocoaTouchFramework + + com.apple.InterfaceBuilder.CocoaTouchPlugin.iPhoneOS + + + YES + 3 + + cancel_button_background.png + {63, 33} + + 1179 + + diff --git a/client/iOS/Resources/RDPSessionView.xib b/client/iOS/Resources/RDPSessionView.xib new file mode 100644 index 000000000..5d2b59580 --- /dev/null +++ b/client/iOS/Resources/RDPSessionView.xib @@ -0,0 +1,553 @@ + + + + 1296 + 11D50b + 2182 + 1138.32 + 568.00 + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + 1179 + + + IBUITextField + IBUIBarButtonItem + IBUIToolbar + IBUIView + IBUIScrollView + IBProxyObject + + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + + PluginDependencyRecalculationVersion + + + + + IBFilesOwner + IBCocoaTouchFramework + + + IBFirstResponder + IBCocoaTouchFramework + + + + 274 + + + + 292 + {0, 31} + + + + _NS:9 + NO + YES + IBCocoaTouchFramework + 0 + UserInput + 3 + + 3 + MAA + + 2 + + + YES + 17 + + 1 + IBCocoaTouchFramework + + + 1 + 14 + + + Helvetica + 14 + 16 + + + + + 274 + + + + 292 + {320, 460} + + + + _NS:9 + + 3 + MQA + + + IBCocoaTouchFramework + + + {320, 460} + + + + _NS:9 + + 3 + MAA + + YES + YES + + IBCocoaTouchFramework + NO + 2 + + + + -2147483374 + {320, 460} + + + _NS:9 + + 3 + MSAwAA + + + IBCocoaTouchFramework + + + + 290 + {{0, -66}, {320, 44}} + + + + _NS:9 + NO + NO + IBCocoaTouchFramework + 2 + + + + NSImage + toolbar_icon_keyboard.png + + IBCocoaTouchFramework + + + + IBCocoaTouchFramework + 20 + + 6 + + + + NSImage + toolbar_icon_extkeyboad.png + + IBCocoaTouchFramework + + + + IBCocoaTouchFramework + 20 + + 6 + + + + NSImage + toolbar_icon_touchpointer.png + + IBCocoaTouchFramework + + + + IBCocoaTouchFramework + + 5 + + + + NSImage + toolbar_icon_disconnect.png + + IBCocoaTouchFramework + + + + + + {{0, 20}, {320, 460}} + + + + + + IBCocoaTouchFramework + + + + + + + view + + + + 21 + + + + _dummy_textfield + + + + 22 + + + + _session_scrollview + + + + 23 + + + + _touchpointer_view + + + + 25 + + + + _session_view + + + + 26 + + + + _session_toolbar + + + + 27 + + + + toggleKeyboard: + + + + 33 + + + + toggleTouchPointer: + + + + 34 + + + + disconnectSession: + + + + 31 + + + + delegate + + + + 28 + + + + delegate + + + + 29 + + + + delegate + + + + 30 + + + + toggleShiftKey: + + + + 38 + + + + toggleExtKeyboard: + + + + 39 + + + + + + 0 + + + + + + 1 + + + + + + + + + + + -1 + + + File's Owner + + + -2 + + + + + 3 + + + + + + + + + + + + + + 4 + + + + + 5 + + + + + 6 + + + + + 9 + + + + + 10 + + + + + 11 + + + + + + + + 12 + + + + + 13 + + + + + + 14 + + + + + 35 + + + + + 36 + + + + + + + RDPSessionViewController + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + UIResponder + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + RDPSessionView + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + TouchPointerView + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + + + + + 39 + + + + + RDPSessionView + UIView + + IBProjectSource + ./Classes/RDPSessionView.h + + + + RDPSessionViewController + UIViewController + + UIButton + UIActivityIndicatorView + UIView + UITextField + UILabel + UIScrollView + UIToolbar + RDPSessionView + TouchPointerView + + + + _cancel_connect_button + UIButton + + + _connecting_indicator_view + UIActivityIndicatorView + + + _connecting_view + UIView + + + _dummy_textfield + UITextField + + + _lbl_connecting + UILabel + + + _session_scrollview + UIScrollView + + + _session_toolbar + UIToolbar + + + _session_view + RDPSessionView + + + _touchpointer_view + TouchPointerView + + + + IBProjectSource + ./Classes/RDPSessionViewController.h + + + + TouchPointerView + UIView + + delegate + NSObject + + + delegate + + delegate + NSObject + + + + IBProjectSource + ./Classes/TouchPointerView.h + + + + + 0 + IBCocoaTouchFramework + + com.apple.InterfaceBuilder.CocoaTouchPlugin.iPhoneOS + + + YES + 3 + + {24, 24} + {24, 24} + {35, 24} + {24, 24} + + 1179 + + diff --git a/client/iOS/Resources/SessionTableViewCell.xib b/client/iOS/Resources/SessionTableViewCell.xib new file mode 100644 index 000000000..2e80c7ce8 --- /dev/null +++ b/client/iOS/Resources/SessionTableViewCell.xib @@ -0,0 +1,574 @@ + + + + 1296 + 11D50b + 2182 + 1138.32 + 568.00 + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + 1179 + + + YES + IBUITableViewCell + IBUIImageView + IBUILabel + IBUIButton + IBProxyObject + + + YES + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + + PluginDependencyRecalculationVersion + + + + YES + + IBFilesOwner + IBIPadFramework + + + IBFirstResponder + IBIPadFramework + + + + 292 + + YES + + + 256 + + YES + + + 300 + {{20, 12}, {63, 47}} + + + + _NS:9 + NO + IBIPadFramework + + + + 290 + {{91, 12}, {168, 21}} + + + + _NS:9 + NO + YES + 7 + NO + IBIPadFramework + Label + + 1 + MCAwIDAAA + + + 3 + MQA + + 0 + 10 + + 2 + 18 + + + Helvetica-Bold + 18 + 16 + + NO + + + + 290 + {{91, 25}, {168, 21}} + + + + _NS:9 + NO + YES + 7 + NO + IBIPadFramework + Label + + + 0 + 10 + + 1 + 14 + + + Helvetica + 14 + 16 + + NO + + + + 290 + {{91, 41}, {168, 21}} + + + + _NS:9 + NO + YES + 7 + NO + IBIPadFramework + Label + + + 0 + 10 + + + NO + + + + 297 + {{267, 19}, {33, 33}} + + + _NS:9 + NO + IBIPadFramework + 0 + 0 + 1 + + + 1 + MC4xOTYwNzg0MzQ2IDAuMzA5ODAzOTMyOSAwLjUyMTU2ODY1NgA + + + 3 + MC41AA + + + NSImage + toolbar_icon_disconnect.png + + + NSImage + cancel_button_background.png + + + 2 + 15 + + + Helvetica-Bold + 15 + 16 + + + + {320, 71} + + + + _NS:11 + + 3 + MCAwAA + + NO + YES + 4 + YES + IBCocoaTouchFramework + + + {320, 72} + + + + _NS:9 + IBIPadFramework + + + + + + + YES + + + sessTableCell + + + + 34 + + + + _disconnect_button + + + + 29 + + + + _screenshot + + + + 30 + + + + _server + + + + 31 + + + + _title + + + + 32 + + + + _username + + + + 33 + + + + disconnectButtonPressed: + + + 7 + + 35 + + + + + YES + + 0 + + YES + + + + + + -1 + + + File's Owner + + + -2 + + + + + 23 + + + YES + + + + + + + + + + 24 + + + + + 25 + + + + + 26 + + + + + 27 + + + + + 28 + + + + + + + YES + + YES + -1.CustomClassName + -1.IBPluginDependency + -2.CustomClassName + -2.IBPluginDependency + 23.CustomClassName + 23.IBPluginDependency + 24.IBPluginDependency + 25.IBPluginDependency + 26.IBPluginDependency + 27.IBPluginDependency + 28.IBPluginDependency + + + YES + BookmarkListController + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + UIResponder + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + SessionTableCell + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + + + YES + + + + + + YES + + + + + 35 + + + + YES + + BookmarkListController + UIViewController + + YES + + YES + bmTableCell + searchBar + sessTableCell + tableView + + + YES + BookmarkTableCell + UISearchBar + SessionTableCell + UITableView + + + + YES + + YES + bmTableCell + searchBar + sessTableCell + tableView + + + YES + + bmTableCell + BookmarkTableCell + + + searchBar + UISearchBar + + + sessTableCell + SessionTableCell + + + tableView + UITableView + + + + + IBProjectSource + ./Classes/BookmarkListController.h + + + + BookmarkTableCell + UITableViewCell + + YES + + YES + _connection_state_icon + _sub_title + _title + + + YES + UIImageView + UILabel + UILabel + + + + YES + + YES + _connection_state_icon + _sub_title + _title + + + YES + + _connection_state_icon + UIImageView + + + _sub_title + UILabel + + + _title + UILabel + + + + + IBProjectSource + ./Classes/BookmarkTableCell.h + + + + SessionTableCell + UITableViewCell + + YES + + YES + _disconnect_button + _screenshot + _server + _title + _username + + + YES + UIButton + UIImageView + UILabel + UILabel + UILabel + + + + YES + + YES + _disconnect_button + _screenshot + _server + _title + _username + + + YES + + _disconnect_button + UIButton + + + _screenshot + UIImageView + + + _server + UILabel + + + _title + UILabel + + + _username + UILabel + + + + + IBProjectSource + ./Classes/SessionTableCell.h + + + + + 0 + IBIPadFramework + + com.apple.InterfaceBuilder.CocoaTouchPlugin.iPhoneOS + + + + com.apple.InterfaceBuilder.CocoaTouchPlugin.InterfaceBuilder3 + + + YES + 3 + + YES + + YES + cancel_button_background.png + toolbar_icon_disconnect.png + + + YES + {63, 33} + {24, 24} + + + 1179 + + diff --git a/client/iOS/Resources/VerifyCertificateView.xib b/client/iOS/Resources/VerifyCertificateView.xib new file mode 100644 index 000000000..eb97205e7 --- /dev/null +++ b/client/iOS/Resources/VerifyCertificateView.xib @@ -0,0 +1,386 @@ + + + + 1296 + 11D50b + 2182 + 1138.32 + 568.00 + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + 1179 + + + IBUIButton + IBUIView + IBUILabel + IBProxyObject + + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + + PluginDependencyRecalculationVersion + + + + + IBFilesOwner + IBCocoaTouchFramework + + + IBFirstResponder + IBCocoaTouchFramework + + + + 319 + + + + 291 + {{152, 237}, {95, 37}} + + + NO + IBCocoaTouchFramework + 0 + 0 + 1 + No + + 3 + MQA + + + 1 + MC4xOTYwNzg0MzQ2IDAuMzA5ODAzOTMyOSAwLjUyMTU2ODY1NgA + + + 3 + MC41AA + + + Helvetica-Bold + Helvetica + 2 + 15 + + + Helvetica-Bold + 15 + 16 + + + + + 294 + {{20, 237}, {95, 37}} + + + + NO + IBCocoaTouchFramework + 0 + 0 + 1 + Yes + + + 1 + MC4xOTYwNzg0MzQ2IDAuMzA5ODAzOTMyOSAwLjUyMTU2ODY1NgA + + + + + + + + 290 + {{20, 20}, {227, 94}} + + + + NO + YES + 7 + NO + IBCocoaTouchFramework + The identity of the remote computer cannot be verified. Do you want to connect anyway? + + 1 + MCAwIDAAA + + + 1 + 10 + 4 + 0 + + 1 + 17 + + + Helvetica + 17 + 16 + + + + + 294 + {{20, 136}, {59, 21}} + + + + _NS:9 + NO + YES + 7 + NO + IBCocoaTouchFramework + Issuer: + + + 0 + 10 + + + + + + 291 + {{87, 136}, {160, 21}} + + + + _NS:9 + NO + YES + 7 + NO + IBCocoaTouchFramework + Label + + + 0 + 10 + + + + + {267, 294} + + + + + 3 + MQA + + 2 + + + + IBUISimulatedFreeformSizeMetricsSentinel + Freeform + + IBCocoaTouchFramework + + + + + + + view + + + + 8 + + + + _btn_accept + + + + 9 + + + + _btn_decline + + + + 10 + + + + _label_issuer + + + + 11 + + + + _label_message + + + + 14 + + + + _label_for_issuer + + + + 16 + + + + declinePressed: + + + 7 + + 13 + + + + acceptPressed: + + + 7 + + 12 + + + + + + 0 + + + + + + 1 + + + + + + + + + + + + -1 + + + File's Owner + + + -2 + + + + + 3 + + + + + 4 + + + + + 5 + + + + + 6 + + + + + 7 + + + + + + + VerifyCertificateController + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + UIResponder + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + + + + + 16 + + + + + VerifyCertificateController + UIViewController + + UIButton + UIButton + UILabel + UILabel + UILabel + + + + _btn_accept + UIButton + + + _btn_decline + UIButton + + + _label_for_issuer + UILabel + + + _label_issuer + UILabel + + + _label_message + UILabel + + + + IBProjectSource + ./Classes/VerifyCertificateController.h + + + + + 0 + IBCocoaTouchFramework + + com.apple.InterfaceBuilder.CocoaTouchPlugin.iPhoneOS + + + YES + 3 + 1179 + + diff --git a/client/iOS/Resources/about_page/FreeRDP_Logo.png b/client/iOS/Resources/about_page/FreeRDP_Logo.png new file mode 100755 index 0000000000000000000000000000000000000000..3b2d02f1dab56e40dfbff64df228504e45ee7d13 GIT binary patch literal 40572 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

X#(PKE(>#Nsc`%tH=i=k%Rv;DRd;xI@pP5$ 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 + + + + + + + + + + + + +

+ + +
+

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 @@ + + + + + + + + + + + + + +
+ + +
+

iFreeRDP
Remote 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 0000000000000000000000000000000000000000..3bf3455bfeed0955b243e98b361b0dbee472ec6c GIT binary patch literal 143173 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�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 literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..0eba5b5d2dc374f683ba01a38d0d3c71a97cb2cf GIT binary patch literal 1129 zcmaizJ!{)Q7=Q&KAp`;)+fIi9{h*cZPL}QHuo`U3X$(~`jv-zOIZJ0-#L}tKxt0Tk z(yc>&M2D{Z10C9-6gqY9UOIMYr%pXNwv$3k1*iMqdB5NHb?fl)_SWq!MNzh!2Toh= z>-pN;kpFXj=eyi)iAGl(@xGYQgeg^@_ZVn~bimq-`qO7$SVd9RegvJa=( zL2N)&)-WQ)GC>&3KUG>w{61+r`*U0JW~)OXVgli0GSMdmohJi`Ez5$)fQF$-LQAKS zpqUn>I|~gCOT8qBMZhDFYot9s7Pcxqy$B(UmujPQo+g{x;R%Xd{m-w}6!*EHbqRlR2yOvHn)0n|FOZhnQWRd$jxmz)*CyWZ7 zbT}U^GTs_;!P6m+LH($xV{jZqKA)slc;-;SY*l98(2%JaW(Su@0THwG02u_K3)JO) z(4SsKiyA6)3`CGgjN(72EWJ+!{V(i$q|cL(%KQg;x579Y%&fUCX-27_k;j^jt;*2! zAn-}4>NqvoELPF1V%)&H4QIbvz-6;;nY*<{Z6WJ$Z=6?QA?shtR#(dA{hZf{I4lXC zGk-tfA(+*I1gm{1uhch}^;i3{yHXZPXJFo)SGslaBu5}WE@w|(meb23IkJhI&986o z6FJv6n@+Wped|?T{P}%%!~FQ^<$CMh=8Y5Ocw_D9=QroS^5Jhb4xM+klUIKMbW2w7 literal 0 HcmV?d00001 diff --git a/client/iOS/Resources/cancel_button_background.png b/client/iOS/Resources/cancel_button_background.png new file mode 100644 index 0000000000000000000000000000000000000000..ae12d407df178c0b79660d514f87507eca7cd505 GIT binary patch literal 3150 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 literal 0 HcmV?d00001 diff --git a/client/iOS/Resources/en.lproj/Localizable.strings b/client/iOS/Resources/en.lproj/Localizable.strings new file mode 100644 index 0000000000000000000000000000000000000000..3c0f663658005073620c2042e765e51133d00c35 GIT binary patch literal 16548 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 i`fQyuuFbU*6o37!)d~SBKui;uYF;$ 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�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 literal 0 HcmV?d00001 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 + + + + + + + + + + + + diff --git a/client/iOS/Resources/help_page/gestures.png b/client/iOS/Resources/help_page/gestures.png new file mode 100755 index 0000000000000000000000000000000000000000..e49a45b8fd29f9fd5e24d88fb18b1c180ee87fd2 GIT binary patch literal 63377 zcmZ_#b9iM>&_9aCwr$(ColGXqjyQ%kFtLpQqC^Z#XWCQ{PFfcG=c{wR{Ffi~MFffQ0I2cgNNm{QQ=!Wkmt>gCH z(bCP+#Ki(k+}zRBf=u4t#L7b5!o=L$dCWox4D5+hUP@fUYYmtS>qoepTFd$qoQ+P3 z8a|nA+-`V5TLA_&wbNu)}#LB%li$-A&8;Y{A9R%niTKFu|Ib zgxXp6!QoPBxf~t7Mp>ZeSwV>>Lc@ERI`;KPX80N+EQfl!e}x*8!v&LR!(PI(0&f@( z!wfujCHf@Lpu}ms&K2NREHG=L5_gC(V~A#OgUR4Hc7udrCk_$F4RLm}Mp53u`(nlZ z(};h^{o~%noDzX0#ClVdT<^r{mRA`vlEF(W%0a*uj&O)L?=&x2o?Pb%H0mB!;e0VF1Q zF!9;13JNNd`bJ@5jZG+$3@+F_+Dn-c;Jg|F>JKIxO~t9TX$n^`v!c_(l~+;WQHF=Y zC|4?kg9-);kV_{SvmHFaLO68z4~8^_k{zeyR;LD+he{NTxvQ6lBBAKz=m=^@c(G5U zm##(f#7rr2ZCXIxE7Tr9?~4~_F~nzCCIfs(1eF7W!7 z=38qG&G^KGc{qi?_t1RF_!{?lB%pwz&&jJZ3D!em<*UwPz>E?H!u0Zrnl_&3HeWz< zS(weZ*^HS*r#tnB51lx|9E9fuE|g@bP0UhzQ)PNhg@Hlq{u<%4L}u_a1UZIj9IH%W zN-%ad+wjekaSnPv?Mt|Nz)&&*H7mv>2@w%Nyi|rL*&WOgK;5M+=gPy^mC20g+~Xb zy`^}41!(-7)Wy+d<+{xYRPo?C0T_ zo70ea<9Q9zJ(5Fz1Zb7HaqRNrZ(j=;_y~Q5ouQ;Sh9jb-*B3cH>0+$XKytKnNz0bA zXN`=u97F+}txt{)xO!bA--Q+iyceD=Vxkqt5PVoG75#6vvsdK$3v5(eX^+N-w&^sbo5E@!@7nmES2Z{~18WTdny+}N+g+ZxQ9QdT?#bilTj*539;HWZSt{e7*iG*GnrjlOSwOjh(Q!bEw zlQoUYoZuSjmQzhjn?UNxM^xm|Bf5i)5EeQ@`Ae(vTg`T(ZcCX9wR9-P5*hy$V?S=n zRLA2ekSBZB&efK8iK9LdEk^oZIP!VgCB$5CxM8dk!nfHgN~^Q@l+st9z^~q)Q|C8v z?0K3x)mmej(#-+;G6sj^i=nbnw8HGy3v}hdz}82Bk_CRP*pETP`Ev;6R~v-{#_4s5 z`JFXe&uX0x3tH?N#~ z4JGtxMVj>3dYcDNyK!n1W_nmAL)Wv3DK8FSwgkd8Vg1qA6F8eMFTPkpB9rml-g7DF z=V;!SGl6jaw>PvG#KfDq1SMozhD=&mhtf6}h_Hgbc1z!BRq^!+XReW@eWcU$6lo|T zfRzG*=~5vg7OJWV+<1dXo6sljUD#LdxwL>u(jIU^6Jcdl2Z!d%qxH*wQ6;zV`}i$n z-yLbaPuu=5U0iHV?K<)OI(tKdAtH7csFpnXslYN<;SRmOi)t+`VgSWCxJ$*1i(x#ymcMEiNno5yLDrBaFgzM_3OUAx+&2r`vIbyYsdqTBsp~{SX76>z5jlgN0)v3?d1#d0%%apDDDe`Si@m&E!Wg z%eKRxyU?;C`#N3y7I?#|FK)t1%09D=8HUY;3OG?N{(AehR;u}AQ_S`kQR}jl=;O!E zjJcE^!ksjqn=6hSxzG2K9$H{4s9u0XixPS^v?hh}Ap%((sm?#9by{hu+$>y}V|W)+ z%Eg!ePCbHts*-dHx2Ts_()8y*Qn4+m5c$ufyoU5p`!m;~QB2bIZwQXA{V1_Jeg*D< zFZ@3J;5Bj|-UFg?AU{waQn9K=@HBu4*LcNA?6$*UMKf7A1dzjr_fKM&;Ia*eFSz5> zF8gkQX{0X{aN_$e-O4u#@bY#r?c8Z($8|M<_o(9Z7)-2MrY!!OiT~QeQ7ENQkQ0|m z^p01f!@^Ean`2X9#Im#tN5>y#q?n3(_(UHmb9Jp&*9Pc`Td?P)RiE43F68$pJ^J4; z-!^QcB>MK;;JmyJ1WF1BzDDZ!BDXojRDnINZY??Bo7xS}teB8tQG6O_l)2oQ=yBsO zJqMes7p+wFM-|6P>#&}ZV?>=WrG~TrLK8GZOy(3S;^8pn$i>x%y&6CE&;&U$AH}oA z#>m)dEr!0DOIu6L#l33kBlfnW&MU+`i0}*JV@Q&4MRJE61hzz(S8^p7Q3^%G`SO+& z>foFsT--c$JPn0_Lagz$q@VjpFVm>oWEc;ox0_enGjMs4O_`GU0TLuHN1{pEM$h#0 z>?h@W!6qeR0;Vk}S@5c*d6OK))Vfjy8m3zJ{pRS_i?XEMf`i@wz7?-n^ZuE{;hW_Hv$ zY%J4rbX~OTFfM$v8pq>74n97q4H8trIXCBk=GfMbQCrp?P(?r`yS%&?s zCDkR16CTzgGTU;_j*^!DcMjngoy)385vk_4jD}A_M9tmQB;R9X_)T0uPn7bPBY%=y z2^Trap0h6mBoD2BO>O3CIv^;u>u=aOe~pcL$OAhkU9{>RCxWy(e<&L3>D+}voE8uN z1u{M=ZukKCWV{3p)OAMk4L--Pv<%%81xAzesxW%eufei^G*U4(rp?}RQlpf@ zACKR3(!c-Kt}nzUR{fD2wLcO;j)7jeU70=-an@11E$A3W)ran28P=ZDXqp?!}UN$pKU z4e9G$6O#>`B`)!!VvyS`LHrmD(c--c8AIDT-YmS;An)7E%4nNa|Ml=&rfIp#-Pr4p}2TyC~(y9sHd? z$7cdso0JrcPlvzG{;1yw``JAoaKJ>tspbn_sCYiwLczMR%YDTRpODyiNjb2M)V6VT z_r=}EzuPd&fbFw0Wu=vSz7r0=ZvAgv%U|8les^@8ssWYtM1G_hm^~63n7*hX#$~v^ zjMj_(g5ON6qJe84eX$TtguJ+3{hfD(L`m#|&T(zBe}|L8#H?gHzEd1Y1nrX#Ug=WeF(kP)T&mik1yG6l@i`X=w|Oahwl?po2lTgO=^+>UUX17 z{~X$-xaY`uz z(WKbf(f;Z&;hc+IwR!X7zoUz+x=k6n8yePJ9zNM`%1(Rz>D+R4aUbL| zE~(U7Wcr51LIa>+1t#ODo0nA%?LT@6>#QSY`JvSaRYhbjEL(9sdN!d&qi3vyE@PW8 zanzb(2Y%VNXfviF9J;~a#mJOrWmTLh`#K~)pmxw4I08EAsfFgfZd>tf33Tat7or8T zXPy^zlUsWs?o`s0FT0-0Q=9H(C0u?cIsbS)d(W)uh1Zr+RA%I8A4 zyLQGTciZIvEG=IreF@5YI!=IQ8iCH?PVhpO%0iLA?evO;)tRl1%ajKJ2s;H~TD>(U z{JN&x_zYO)5S@iliNfwnH{ZY!U5S`7`D}QZ{y|ptr1eYx*~Hvx?t?>IrM86miYASg z#j&-?gIpzgO5#5vcRJNPIlo>R&{+;BPA@On^WK4wJv@p+yUaH`-ul32mL4kFYX2PT zQ;QZ_Oy5Ms!B7H1vOlVMCn#YO;#C&rs}d;MpTwBo;qye%l3z?7~xr zmVURwkx>8s-B$4CRWb!xI9E?aMo?8YJA2y06xoRQx03-x;;P%;%FR*fKJ37&9W|p~ z4!ij9KQ}D==qQWdo!x?BkK-(+$Qb~+sOfF2`gOKkOMHue`M0Z*yNIWFQEkz{@J zJPv%uyf=m#94_txdjxf=1X<+T(i_5Y2hY19{v-*WNVd3Pi1LtfcOTbXPXs7EZwjqq z%#;$lUNAxl>03{$?8Xox^ivCoWlb@D*JpP)DK>EW@uR_|1qJ0VO;%sl1(XgD{)U|^ z&zq65UZ;4-NedL}X(`gLD*hP4w_~!90|S(hI+fa}SXzCD=(V2P-dCY!gNAK3$0Q}{ zDT+W9N4@Q-W%DHU)Wn?6=O$}k#h6tAyQ`QXQ$Br|`kf-|xHzkI1D15Fg{6z|`tj6X ztmCw&Cuw>#G^R6X{O@CP#-7@qwF{^H0nAt|2c|#aMH7hlx7gT>=QTC82^rFAb3C*> z!_>#%mh|V+icJ3u32a1={ymj%|%9a!09^wzsj;v$X)(askN`jlN3@0-e^2>O(CW8{+9TzK{ zD+2@N2j(TqHR?F0jg@~pk-I__4@3lu`{^+T7sH1xn|)U@i~}`;B4RiMP`p1{f)OV* zdoHmnaTH9H8xI8;K)nPNT#OpJ0vSO1=vn|05TwI2tRM!8-FN>>8mP4<;zP1~rRoWH zElV#X>dKkLk<0mrS(>n+_1XbIb8~@Ye|8IHsnFU8eXkXE zzK={}SMqIU>B(h9+j+MiT_gu2vE^#3^>)gr^FAUC9r%jA>n|DhI)qniW!2%g*L^m| z)Ba{!BQoG!o9u^qYvn+S+;&`Vi}Bm<*rpt!rd}ie9>|T-ES320khQ5tE(Kxkp>A(LH%KqNykmj6F7S=@rCFVa#?_$E1EqLSDgQ~ z+$i@55x zwYITgQKMUwDUq@5Cy+=y;MsqAkyG_d2VPsjT675uLo>uR3o4d38zUEtgi)b&1*_Uj zvCgKjZg`4%?=Yf%^TS|l$bx04qmCjQ3konrtAi!=$!NmIh|>5y1zLR0VvpO`iEaH3 z#1()hpDAo%EgNrs?*qYYi%=%g5nu8<0+3HkNWi8wu(QAVH?zK;qcPJv_BSZ152y-P zysycK3AFo{CS*OEv+CP=Xz5u;r2(Ca!)nvPb;TqUe zw!QKvk?|KEM5aZ?o&4CLOZWOk6#FrZm7N@>7ejxU|4J{{ZCZt9Mb4&gO_2#%ofw(i z56+FIKz1HXM_yyjMefSc$SIn$GwbEi1Kj~35z%NX^Ut5vaf;lX=-ELx^=_Jswxeqg zEe+)G88zYhmNDy>pG4mGyggbHIM|Qg-}Np4i9JAH#a<% zH_iX;ChAsch4Ap!63!rjG7hj%{ilD^?Ke6zft#L~-^w*&`=qTjtM-B>2mIe0$rC;w zd10_vsJ;{W#CmEbrBZ8e`Ask@NjgHJM@eIva`U3h2tRGA27IcD&T(3BB1%(;=22tS zKqH#@Szy%3eFc8)juea4=DS}pV59ZSOicXw-2>K8ny3UZOsWT~ytoYPPHW#i%8t@u znuhBL8jKsqW|UKOjUlJ4{Y^ac?;R|KlZ9duJtp+Q=ARzQz z&XW6)NfD1Vru`hzh)lhltHI9loX6wm|LPF4&Rx1*Z!gG>g==O0!jN7|<|m>GZ-OtR zFIUR-sKHQT_Z76xQSZmr85*OpvnsKxmnhY5((W;p70XN-D)Jlp^slb7j5igfaVNg! z#ThrgflQ=EEI$#9kUl8z#HrYOSo` zbQ&CTT}I6TVGZMyuFESaUa|iEgXd#FxiGyV6Z=w+DFWs-kmdThBx*fLBCA3-yzT<( z@3J<34e$Wstxz*lvSY>2N<%3U=2mze?T&hhJ=GJt6TV9nI59I(0?)H~ExIjd+@)wz z8S0>;CJjOoNbGHGGIP6AhW4$?5IaxU+(8Jxyum$hRq5ia ziOoqb$_h2iwhzxl|NNapB2`bh@EejZnQMp?gX?t5aGpX@cVPmpgj(w?96D8sBNryQ zM_(}*9914pYo5A&o|{R~1n4MpSgU2(dcPf8dI^>-a@ z(%7u!e>1E*jQl+{dL(Uz+8@fn&-3_S+i~bogK|~x-l_x#I9wfPDD3MSXLBqdpAE^k zk2AbKOoq=&hE8%i`q-3hK)(}wI@qNz^ zf{A37rQ$@7mdcxcoQ&3RitA!3Sqrv;1DU(%pY@wzz;4)eRFN!4p-@160+GNoeUcUZ zELc*kRE?T$JgFd#NWi`I@UPR5r>*}PQ}e)i4nx(UyLCfw3TKS%Eil#o=USGX$2d0UV&L_l^?+1cQ#nZ&nD(ttEO@ZjeE82f>r1Z3E!eKe-);m z*d+|(tvT_<6%zxlf7SbC3N#MF8?be?w4)O9HDro!2oqsh6S??z$nxEhZSB-+9U{U# z6%oRm7f#~K($4parcG9nCnhbJ;C^oHvL^oF=A|?z#~Gju=`A8cb6*un zgUb+t#5V|CI=n$SXaw9s4O?Y<<|%Wxf9#djvITN-u>P%`d2*p>@8W+La*Ae>ea0Bf+w% z1{y*kwkcs!))>u+4(svjCTe?uN=A+ehw?fhWaK^MYj68*x|%PL*zwHlW{)RQx(F+D z2W!=IlbWI}rq-y|3UUTn+WR6FSjo$KMOZ)> z5mXo==mPQ(K^M@&`7K%cMA>=mcIDSAC8~B>YHB@XASzL7lh;u6VTNJMB;!t2m~DDT z%`Rsr%dhRyg+s$6P=L^Lx+1ti+Ug4hGSr_9_orNo<%`YlM^1e2Bnh+-=gs!pKg!C= zGPFZ}wp^{$gh0=nERGokTnR3s2D}8F&DUc*!T{9ODMDth+tC6@-_xeDd5x0J2_F&P z@*O(#Q8(04ChVfA5pa{SQWd11o}L81-v9h*XU1X7hJQG@BC+LjJDKhD=^V}CZW7SB zjy251!p5dgAQd%vO*eYihx8*MAwltb9TTVQG`%nSxZ+e{_wfklTKM6>l3(6 z+#(NwTa8Y~84(I%mv`H*<1HmYv=3Ha1^hlii^ZrkOd$Mj!LNDfb4lMZdyml42_@t8 zqS8>e+MwMn%0og&$g%51%jo?9MXVK9=y+oTkh#E*V{LEK)bn=PLDRC1sj_&z->=PG zsdXe#hE{{_@S(`sy#YOvA|BRYqYA>#;MaSfcJ*R=Xy)lz0VCJKUV#J1 zz7z4p!VX7vjJlMJH!CxuPkv7&|Ae(+Ppf)9!_Q-o!zri%U;h67(^h!_&4QYnuE<^f zyqngur?&?RB@#%77H1<+kGzXr36+604y^)*XP5z)zsOfVciyhoR_9JP+U;XVn#0~` z|M^$=Oi@9VlpH?ISk1jY7pcao3Vlj3x~hlcYBQ9@V89v^2SS2_2cDqX=}?+l?^Yt-}&t|b~-Ih>sV?0CeBf$9s=ok z)hf@{A6Pe{zw4;q>_E>%H#%bqMd@^K{cS>Nyu)Te<}tiCvZTG{^4?fqzoV$OWhUkF z>Ur9;$3PM;;c2C)$I<7k+)BV?TQNC< zowu}=o_wJT_ve(UGagW`(}_)To zI(DQveBLthua&7~9eoAv6abInXUzbIqF^!Hlg+w;y($*9bB;>M>7k zB;LWo!WtMDY)+dmJJ*{XAD$M!Ijm{Re8UpmqOnqc0uVcm$N_rnRynZ$8BJAWiTr_YKX2$W)FE?K;9F=;?b?RVgDZU~u*p zoPDno|Jfix_*KWXemmd6yI^tbpE9JEM|o$yc@Lxz{dL|};MK?25*HDy-p1dVL6x`R zVHreE5o5vUYBiEl=rY-!Gl|~;l@%3ktX=mCf;og`o?c-ye?{0ekP0D=@oJFy5}a~- zUv~TJH$Dx$K8HN4xd%RX9#B<3>+owTH43a)sNk-|8%u4SRkcy9Z;p?SMt54Bgq?a2 zf!wQCsx6&6aqnm8U*BN2j4RIhR_k^JLSc4F{`t4}Ivza2jzqYKd8<$hD%pKs0Oj&P*N3b{7S3aO`&l9CcQp^A_!8g;PmMCy2VXGNIp zX}twdIyK`Rj8~~uj9dz>r@N_XDzDYx-OAE;X$OTw$Sa7w*RwCIhv+b`hDb4u$)o{I zHCM<+wX^OgVPM@MG^HF8Z3!e`a{F`16V-)c{K1udIO!i8Az>D9Y#h=A^H(`ykP~63 z3x;F=HU84T_WrVK0S8LQ)bOLQe2F@b29j>otePB>{eXAqLptMxd%Fvhos%4;R^d9hX;znT&QZ8%ZG9P@_slyoYW>rOJ$G3z^2$j?#>9l&x9Dq3^wVoU zmFdatFj0<5gF~F~iuE?as-qJyfu$D^qqHSfth50RXPeP!Q$*OawV6uk9kR<`+mk<3PFfflS-;OWW@IV6mkP*k2;+p=l7PX(yL$WO&)`lM z-%7NCCA0LdhoB*B{Ox6HHIH?Bf@Id|Y`26hvt%#0Y~I0%P%f}V>` z(|S{ipb(=38>}cQT0n94x?Y%30-XbSr0>^nwz%rKQ;NGk934r+z`M_vsuyX(@zYrJ zE5c@1lpcB6*mlCTTjenHm7I{qyx<1CO9Hj^_1Ee4H>vC`KwAp?vP4$(?b6ax{cf_+ z$E`N<_lHeopZ--)g4KD~PfQC_VLS{81*MI=k8X9FtN=#BjB|DSPy5qrhR^ozu*=Nf_haqtZf2>Y67 z#eoGLKpBZ+{xobQQyP4ChH;+TF=APNF*zZ^!s38rlXEi+#%q59rySd-D(mXnfTgy@d$}MABDD+3bXfg-GL!!QDBy?$etf_E77dkDZbhHbyQ6GMSg%DC?fWA z*N^RZBA&yY9NCHhh=!pEY>k-tOY$j_^5O2`Az09jiHW$={(RKZ{cYkQ&d}!U{M=qG z;P1%ugMN#{qQU8{%ZSQ`m8ogJ(s@APH;>B}wx>Mv5!Ls&jnCfzTpv9xQBP9E_w}x) zP5q?tY4xO(lz~T!)eDb6Q~YE^w`u4F)r*ZLNz|vb%uw37{VZ_MA=@)$~&ZU$#*=`b9QfO(rPz~%N(DrFBD zsrqWu&2BTJreTjLTDTN~T+`Ri2kNA|yZa-tU<+aQ=jec@+6V@`avwVxI1G!A+&#b8Z6Tg)JlHOYrdzLUKq;!~)Yb_#05li&|!7E%ZKwdsQBaBhr|a ziPK6nO)f=VN|4~yMrf=SU@e7>gHwOF6R@1h!b(KgZ~j+xwB6!yKl~i4W<93-?Z$3h z3~xBT&nkbJ(6GaSS#XeQ^`-#$BTf(LE#v@$Wr9^x9X>X~99WGZ;fJ;q;{G@A?~7Xp zgjj~2zFrPM*VCw@1Fw)pZK>i6TkrYeFUckPPU?`avr}zUEiKCe$AZ1pR{Vajvnrb* zBSyRw0s_JTo9YfNX`nza01gtKMHm%{!dXaa&j$|^VxLG#0v%N#>?0uXd8H0hGVpzX zRPYaDj2sn><=t=E0D%17=K?eAQ^#*2GQE(=03+|iMHU&gm1$FlciHwsWvyn76?>jq zi6m(Y3yUbc+G%iHzF%QCk8~$hBwVQ8TV5Y=d8ne#)^Ov<=L7@<7duIPd@M3<*~Y+V znW9pEk-+EYn-odbuIGB^0>s&p*!|!eiAhfirHOQ6Tg*5aGuZ?pPSH2uUDt6ZfM4@B zYa++7sY|C(#ls{wyHbn|NvL&ZnjgCBrIgj#j84A)(W(QUE3c+*T5XxeP(p&j##iik z-#d$RngrPLQK>TFgP%yk(?-Kg%YZwEXd1)jElrv|g9?!-JJLvvPQ4DYJHqn8f~xQW zibd?UtbqGWw25{L(#}ndw)hl&IVD|+f-6@vm}j^&@JY1CHb?;G+oMls(DbwlZY*txa{*g8B8>3> ze{h|-W9O&k)2?Jh1n1_Fm!Rjx3)XsfCU|2wSur?$c~sp+{>S?tLh{QzzI9oeUTRyX z277@0aa`N(oVT|?-)tgv|MA_27xD2tTC+kYj%Ft2vo%36sI~j z>k`9BGE=Bb``?Z~o|-y@XF-006%Pl&Pc^dpn11&hm2ie&CFpPjPBgf3u}bW{t;AOp z-Ox-sAmEH;($R~1>ld3w#(UOJqz(xGZX}p(i7cObG(HYqr_As>Zu6M_Ffuv-97pZ{ zL)aN=thH-#{J4&C!s7ryRgKW>x4VLbgv@K0VlGk@eu!PQ2Id35bm~mofJwE1)$gKT z=e!2W%2vWr`3u5Jmzy1KsQwp8Fjd|MF4r+e@4(=(6cdDkT@(GCiGmvw?I6t2?kK)kno$s*TT-|=k+w_tn* zV|_2>M}FelTQ@F0SX0Rn+8&CSiqC?siP#lfKX_ULlmGi0|YL4?O(jL=al zEhm_x_grJWPYLJmrro0A-VMvqGg~gUp$SNXAxTvKRWOR%)q;Vvucxoi&(5~)-fR#P zh#+kyaCZw+<?UqFXeZ_ zNl*CmUGCfmF_VJ4@WhQ{5zllIiOADmN$W-xE=tfuj>|Q~Yi`|$>on_@G;fitj_p0D z;tA*Vb+*eYTCs*cFR8z(XP>sddL2l(ctJKy7Qu6PxwWXze}BHJ{CfQQECcVX^-@LN zTEBSg4T5aJ+c8PGAs>qPW-rz*slHj6Zm=zbLsoNy5}g%p#9-| z`E=51znFF4=Ut#pUPVvr+huyU zn-R1fYW{AA6YvVOItYh{hgl*Mft$X$D9vq$Y3rzlKoPOV&zJl__3An6K{ahJ_kt1b zN)6@7F^~I`n_m*(yW(iY&rosY87G{TBAT9S0sGzh@qRa3uxFPYUwxR@ymEUPDvf!8 zyV5z!Xl+0)9-g{oFL(E*=#H0QYj$Lg8Qh-d63WCXuv(A{OM6#5Z*n;P;{r9{y2Tw; z^nI%R?dt0`YWwRm$^(r9Eka|9By#xeD$qLoqJStt=(ZX&Hd2~w)vUtIc{|Lk*VE)> zvG%i}?e}jnkK^2y^9A}VrKco1y#;tiP}XpDm!vVH>gvq2?P2Ld0FL={qUZh1T$V4A zgvy_a#{B2##{_GDR$IGA>SOlys{?T~j!TJC$L6uYKJS)S7m83d$OJ}Bu7=Q^{Z=}t zfjt@fMEoxQFakLP9~PIHce=!AjOs5O+imhmK1sH(pzsrCM88Z)slF*;NAGtdj_fS? zKktrs=)kV_o&NHqdHY%a)4K1i*6(l^lTMElRx%79I3%90TZs1wwCXttrw-T*d_Oa) zL<9kUiFnBl48p+x6b8n0`rV_P3>wsY6XEyV7ruQd6q#0*4Ds%onk|&w7V~vnoHGk! z)~FAKoLLsbPPse;O!=_n{L z!7?Og*m-zO-tq&f^^#&`X4go%iJ4zH5^Ga-E3~e)@A_?6OhdLdGfmnOcC{(oV8^ z_vb^zc&P%PcrpmxP6xmK-79w0`tg%ow_TvB0~D;U#P+5e`cPMY(t7zYc{xYDg+Rsf z8U}is^*58i(ThC2$H=rsiJb}MVS~VDlh%p~Y`xLT{m#&%BOF>PGBE zn={+}+|Iz4^zA%90uCTze^8=L22fB{=%yIHGy`G=r9aI}D{%tcyjPrO+q38GLIKY8 zV>$5S$^73=9Pd`W*x6f4&&L#qYma8Q%UKoCGa%65ok$D=A&<1-NiJ{lbZG!R77uSW zw1>%H48RIq6?xtnC`Rs46&1D)qC&#E!#27k{k*Pa?7PeUQNi%c5^3i*OySvyNjvYW zcQ*vw2T3>J{WrJV{kRw%Gu7Rx*EilCYlzDwM(Vc%I@?6w7ZEHo-wD0+MBiRmvldR* z_kJQt$l3OMeX^znML_Sjl7U0&<=kY3N4-Be1};PI_mNqU9J5KWz{vfSQwsh`2+ZU} z_CTwC7Qy#IJ>5ujx;{wh*@nx5g@fabk6FhFg%skxX6r=^;&PXRj_{{BPd__3ar?ag zBU*kq>>LCp#v%ExQ+r3?Q`_x8&&-_E=T$50>w){z3i5Dg*jag1F6Wu0xMADpJmArD z;Ktae@|me`q6@VQQ|{zvd-yN!oG42FYw=`lu%_L`NK3Oa=rj0s=%fx3(_hw{a&|zUh?V(q58wGH2YeIU9|pnve_2app?5KAH$r{BrrnO-%J*YC>i$Oe0%_$;DBW@ zGPM5HCUhwA8ahNvk*U~|ebYh4$Ym_h3&|*W4F8po{C|Oj{~N0C-vWD5up-HJW)v&#HG_< zu<&q}kK*VdGpYi?eAB6(#s_Uz&ioG7z z+{Y`j^duAysj#9zsTBo^IlA2&uTTs)^X1zY4%a|O6)Sz$=LS^~?rhiyr64i3SZ)wz z2&%ymUaHVThSwIF@OEQiQO9;)-?!8$uGAW|Qocnd1oAT(csNw@6r9 zc-_%a3-#5~DMCh2X#*^A(cmB^T#9^VbYCF5i$iiU-tJa^yD^;voT^;&#inYiHdDFZ zermc>bv5y(P9+GOwV+{CR5^cmfj;N8`J9lggxs}a07sbd$D_Qa0qsBs5nL*<~;+){W zAqYH14U>0phHg8IpE))1dsQv&DncBx1t+ItX6_-aG`ZC2Z0&qbTX(4J+)We2_6~Ou zL6?^&BccXTn7KtRQ{kkf3e{5jZ>jxCsms+E&D*W{sQ#|X=IF$@BDyvdAGq*uUpx+i z7@v=o06WGkll8~yiKi_WTH;uhP)J%Krso74#Ha}#sqoi!Iokmn)$g0|Mk`mP@_cew zx-R{gYM?p|=UW+yNfhhMWGviMZ2wII@X~^aIfVOGv?H3KUPbesOUUbRhL=VH`tVI7*m8rJ8eSN#)>*#1_ z);j+y{OJ=hYwF+-?=bOr(VlwVqTW5*iakU#$hfYi(tNe1`v_c^SsO?Uj|8y-tC=Oc zL~5-^rVYGf(wT}7ViZ@E{#;Axgv?k9+(a#3sCzc%F$=oyg*H@IcgW8JrN`=O#_feoT4fC9`_06? z-9j}2H{4Ok#fRes2vm}IjRLDXT9&O99t~PX&Yhp`-BES(c%KO07;4*YaCCnqJAJa< zz)BQbe&AG8AKI1ZrA%2;sBj6%%j#!yq9L_kJfhRCp@R4_Lu$p#j_chZ?)3;uwCY@y zaT{JlG-jsrP3Co?7Z!arK)OP!R-0!rw=CeenpY_|S9mx}lUvclpeNtuO)@2T&|Aw- zB>&o!e2xD`f` zVBQhL%R~+wQV%Isj`@dUe00=y6|Z})Z(@bQw0Zg26+ZBqUeZ>_x$hp8(q!9C3it2d z4M>nn7tZ0OW@lF$G+9=AIBPOv@442!-~2U=WTnvexJu1bwv^;uxEv@SHIny@7sPfZ!0dLvQ5(X3qTqUq?uI z0YzjB&v2bMD%B!{~MZGYdbmg|(`-;7O zubcd~Ym(*QSgDM!ZxreV9pR{jLy>dla#TbpNt_WPR99UuYrUDT!)ZxL-?C?ppS-)e zf39D^gZ`|fgAe-pdf`56Suckr)CfsR;)Tv1M!%$F27@ySdumblzQ~2l8enOx00a!F z5)E(R*{(zC_)&pa$ETF}&j}>_OF|1D()gVu>A!sr8K`&jZL{x+Vs)hk?5NCdH~Q%Q zMwyq1g(kl5aj0wPlp(zWDw5D6gfXIan20i0R{9t+^0HDjvGY5Q4NK%|%voKua%e(f z_3WsK$cnTuPwmTThaY83&x91;YtSjMV^*AC?Qp{a=jib7o^|K;veK?U7V`bYMBWbe zA3p(G)BEcHH$xf zwQm3}mU27X!iQ2rm9OF)kCpxKxIB{D_ea{Rwe;6^(N-Qy{(Q=9`&^|XQ?x~6OI!oR zP}7&ImLBi#=K=!3_V49}SCgeEk`%4=Xi9CyukMB@lAO2%X(Ns#83cJPV_uFMb;nLl zR(|zk$4SxUFBc)fyt|YOP0*B5=RM18{a!totS!@WIj4%1J+9Y}@*W%yNE<(t$~KZS zg!_9(1X9I5x~&Kdi8}wsRP6i0J38EvwM`re)9(-}(X0!Ze7WHj(-LVE<{` z+0Ff-IYOeqxX{X+2X)ot^z4$o8lc-{zTB;EK_S27%`9g9z@5jphtGzbWvN#qvM*-j z`w_J<&%JJg#v=Cyoe;ltfL@|r@c0%1djlkQ4G1xzV`XGvG-{OVC^LoERPWB9Th#N& z6SwY!fA-sZYL8;|aX@45ylKq=)pNkA%aFc{WV+94F9-*suJQ4pA z8r*ZGWA~dO{=KX7uJBA*uA8T4wmLpdBV7UZ7``cmJ8e8+YRLqnF%jMd9GQuvSfyMV zAkU%>!NWAj-jc z`?+JWRuy2(at|g%{Pw7lmGSKjcHHF_f#!mPK$tglkdsG&Zw`W}NClM%lC|5eqPCK; z`|y$#k80JY8GJO;SKOPLUjLsZ9uZN!@vy_uPk+Go-^;ish)6>zkmS2x;Q8r(&(qn{ zZc;IjuhnN~(_BPf_x_@IRK<<3k|y)p3({n#6yN?Tb#2<_Qa0&@*M@#7n^48c_+TuhkUJFgmlauPdFv zxE~ZyaVs5T&Mvd=O(j5YU~e^(m>H?n=|wE+^G~PQ)E%1odwq4g$$6q^H#RH`Eb~|w z?}nWHRt68w zd}F8vlYvaQJx_@SO$SPYmMzcTE~lOpzq5|l&`ZYSuFGidZ9u61K{`f* zKX$o^4tEfFh6O=ehB8IL!u!RC=Y9APOajJuVs*IqJD;-`z)bItSur0G!Z=;QC}oP3 z?k|GsD9+fW@b>!T)NDGqi!l7nsISYF6S=@YpdE6U_kEYLx;;Q^}AUNognu5%fEXK@MxE8*&ilT01pe zK%W$8evF%>rXY@XR{>U{fK!Z1JtpNOc~#4;OHV>5_}cNO5V z8f)$}y63S{Ww*qf&kAQnubDQ;=I5!JKesafI|Y~ZPw(9xLCBeqaP{I3^Jh00teRMv za*eVK#Ow<}Q_e>+aEcS!Qtm628HwK4%`cz z$s6Kjs@1g?YnE_X^i&`UW(Qk`op%eNzs;}ekcv11M}LoT@ge#591Bsi=Tbm(PQ+AddF z5Qc0TQ{m;KMcb(~{h1U7*+l~zp|1%I3O!E(<#uP~*8Wr5rQDL(#9 zU-K+M$smVEJWuWN$R*~We7TmvU!$Ix886>=M7>F%knuCA`G_kE;z-%a0H zaDSp7qMb=fTjt+LSsW;6IZz4*Cf(;y4+fx-c%K|tohvC#oR4fpqGUlK*&ZTTDn}U_OV*D$ z9N0z$)-+ud(n|54i>jc>HJ?+Dd=0e%L*`&u*XpSJ(e(=FcD26H=-AjoKR+NXM(Ssp ze5o?IzA*WZ3Iw&#*qFPQ>O64i+N?k}Vghb;ImsbgV&}aT3Cp!L-EPx#MB*3Nc%kob z(z5fH)OA9)Fbe+u61VE1z(^2FSFEs2jXCvO;LAi`Dh}~$qDyY-VG__$Shc}?v>1Ju zLjf2-rFIfEb4X4c7)6Vxa`}_T@Y?)nUoi%ITolsI&<(Brt$4dQ+2JmVGBa91lB_kizB3r9AbKU`NdQRep$HtZl#LD(2U8q{ zCQf0%rD!4GJ`$^d467^Qw7DV0ACz2io5en zrEuyQvV@e@@M*j)6Nm)`IV~V9t)9%+5IPDe<0@mLQa<=u*L?^TU*E`{X1}kq4hyyu zP{1&8vfKlJl~dAnA1p{dU+70>V60^8&hw^x7Zk2l@%$CA>#)MurO;8NA~W0h6%q9OB637;Fun;_Lel-mWJ3QM_V?s zuqidYYpty4S{TYfO-!B%Z^lt@XC|sUtTBv@E#Z+?XU*@iXTwrqzR>7~7XMS?#V>7A zav&$hN5XmU4gbQHl2tGZ#hW5#&;5;v$>;48!$XE|UfkzVQMXpem@kxU{JT!S(f!05 z_!ozXTsJ-k(VbIe89s4&qVEbsX#{`WP73<0Si+{vx?GnCC|!FnEH z4Xc6#bs&6H_LNdcKdSQ2h=KH#dZOWB;lK<@L7TWM-R6=QBSS+q;Z%RI80I@84aQ2^ zj3aFHP057wp}n)Hg+Y7@4Sn65_1D|iD7DHMY^;;m+OD0K1>cKqtwo_-io7o&UMEfI z=Jn@sTh?bIl{QH_peFoEe)5dwUa2k1znU}m@K)N0kYDizF4TZ{*DwRAENNcNNge|^VsAcvFn}ruk~nb~bLtBHY=!g2 z`|J}Lpzw9%Ps%T>8!H^`b@zTQX*ca~4P%3a4RqEC+KZPXKCyG69!2NSP8_qR=GkyL zn(ZQa^O18o*ZkGsloh|{#`LvRUmVgbwB%zb`g>jmbT$Gl?9coqq@hq}U&{Q;0k(rkBYH~4?9E=+hyNtX>^DbQdlS1pg?h$e z16f;PlRHdI(>_X^hTdf0=71RJ@KVHG6W{xNa5YVdj`Q&cT|-Z(E=n zy@46Fux8@T5R%TT09nIY$Bheudrd9t;;pQD6*=rk|B|kri5MEZa67{<*Vknc9EU-6 zVX$=l=D94W$QW`7!Rxo%OMhD(*VJkjDpu4V&FO$gg0+ICO^ESryIE3IY02z0S+phS zyQaG7+sUQ2XqJ^t(GK&2#F>h)*z3gZ^n7%vP=Nk6Bd#3`y=1Wi@R@d0R;bk0Pv&p~Muu^*%ZC^D1j}!I%1s=*%>nsiWfX=)&N}9ak$CSb@gg2|s#V*xY^NAlxgwGv8JPth09#wzI zVtsu8p_jWD$(@LAxh-jqfZoa@#l@HC%DXiAR6)h%xdkbZLfvbrK&WbQ-8pg-zi0*S zyIHr(<5%feSR(h7#bIcQh;0sp@k_-}6_MxaV6+4c--j(ZJ?S1wY`j8uoVd~c=Cfi+ z@%?axD8*7aoxH%+&PoS81~FUF=6=t02Ci*T z`36C)d_ZDhSq=A1i!-Po*gI@tjpd_j(2CL(r zWgLbqNrEw7=?deaMhU`K8QFPHO)v@@)zwnybI4L;b&BGZDAyQDIY%>x0Lh+)uH4*t z`K~$ikV3WId){2!Ts%UL^M$&GAA6UAV6R_h><%bpm}uCeqw;qx>D@a8XP2x9XDIrl)K-nIWlijqCDe}c*F_9|)O%7K%dKdg&JTDIfvo*GhH7Y{Yd#42XfSPaQ|($eVPl?ezURiqpX5}I3D zD|biY!v@LtY4l>#W5#{)@pJeyYOO0K>2&@oDj zPGvS|up>c|*Xrr3;)7sQ>$T-*vA>rdtoUPo z<)d#7u>byR-Znc3{p;t0%4d>$A?qF#rIz2@OYA?a!N2UlrE5doM(5PAb&_KwUwJHu zjz|T0l#o^33$KW3b|yIZBQ1~zGgDEybquV~&BOcK1x~?UcuVX!OsDTlXQB5ETWlN& zb+amOHYv)xtl=;M!F7b3WGzL^K&km?gu&nSKUK6!HdJ!y8UP;ysOORo_xCuC*X?Me zZ|_9-;mmC~QV1Zl1D=hkcUx}witiqmnM4zx{W54ItNUi0go*7E_N#>)Mwvaniup~X z_z)1K5kbIz1yi(r`ttUdr7p6Uy6Ufwno$DM!o+uN5UQabWCb-hHPi;XPB_Fa1<9qsMte2?qdhU~DUA7D)4uq5OF@e)wdyHVHSfumd*&vvnTfk~$~1=a$7 z7a=Sflm%hKy+pVLQ}b*6dZd8H44KFvJcJzI15#AuUX9%{V3)sjp-|w10Ju0AG$_S) zh;NP%aQKFSLHIn?L4qooxvqMMSmd`vxSz|jtDBoMD;qU4-9If<4}l0afPn)9$TMRj zGpD+_gZeSGjl`Rqo0WzH4k2zz@tJReqUeWUTxnXyk`Up*Q|J_0KjF)?HB5ZOlFEj! z%wuZHgF8vQ8d=Wk_2aD8ct{A@kH52MhhH0i&(6B;U|>q;PsRj)1Q@IoBM4FIiZ`jK z1i^-9Wq8dBQG3~Zo5%?sH>yvx%P=X7AS84W3NgXL!Z9l)T@EQQ?G+czL^0HgDkvI} zQaW%Uqt%zq**`p`7KkrO)u~iBDJ2DPingP^R9o&Jusx*PBH}zafrRNCU-;AUAk2L; z%Ky?zCRM>DXMOi@(Z@$h8ltcU>SV;bebHT0t+vrlZ0G^oJ&tGaO~tE6&mLc4)k=ZWRGG1Me* zp)(Izop=8iH1vsEa*TTr7$^|HXFv`|=+NKaKMWZu&7Is^ZMI!c)KyEhxig-QT|h_NBu3!HMJ<4d)_z!55}TaWH-h%h z&tTDZ@?=)QR`b99)mzPYFXPKpSgifEs+6u~@l$gV$eR6cU_-GV~q}z z@JX~ol!yd$51BM&7`UCc%qz96^8-hET|Sv8X=r33cEbleTJVh;q-$nBk>*VGb((A! z6A%*Z+piDb&F38@>JYLsH?i-QF8c0&=cVruY`rU}88o5)K>$5P9KxAy^UhnLM%1fk zXF4JQ=Q%BswCIg)?K>-?hZq5cG9B(ZRLOr2A7*>rYp0UQC6dQ2@v46}fk;pq+a6ub zNyUy?gGaXgKM5>f05Fi*c0W|SYz`XZXvc&eH&u+|C?hsN{(bO%hKa4;C)SmjAjk%@ zh0RgKlH7jd${}|BbT;4u>8BgiW4`i3W?zaf8x*M;FB65^?LZ{5_3Mfz#kN0RL7A*w zIZLP8ti)gq2^|hyC;x};IakjIy->pSp;g`2x588)WyJF8~8b>U~Oe{NXZRao%)p+Obfd+6N z0ySkzJ%cJKtQix??7~ambV?N3Ti;KZ!~y>wbHJQ_r+DN2J)2BlxDZ7JRJ{eTFl<)+ zC{mme^N@%ofg=k%d`^yoqI@q+kd8Tk%G4T6jCld*YAN21D)b*;BdIwEGX9~pm5*iQ z$BLwNv^(Y$s2B|scZV7fjUg%av3;l@_~Qe#`#1^$qZTCWCH^_+LJR9k$1T~Vgh#3m z5a;=94d-oqRxjV$R%85nm(l>0yt<&m?FY_nLn8D{qUG<)b~j&pJ$lz}EiTiO*1={H{KvU;r6 zi6&L?fe-U`{K8K_V96o|k&IA;yzc@kium|0x^?(lIe1ngdujz%Hxt*?H*8E3FfV=C z>EkSo#8`It=yq%^3Ho%f8f7Q{y}G)|V-KKmp7DT(!yP2-ZDG4txkZL}xM8BqT{|bg zQ209Na2)hhHU7uTjjpze>}#N%1FcEkEokd8ARbKi$J(V+|3S;p$7Q(oglK`PMmRVsHp=eW$DlJza;!;3 zgzJ1$Gf&*6)Lwi*T*9ZU;{mWUxS9ApfR|!P!0-46E;XeA`L6D~EO%K;zM~^D;@zXl z*mLsx-Nl+y^d?aYw@JT;yu1Y|7ex~`yRZR2_-O2;dMfdDhLLt<4G`Q$a z8u{)*hHA-RlbaNQN8?A)o;_PHH5y(r)^6PNg100ro%m^${@O>2gQp}Woi_) z0kVqnt@8`>ia@UKsclk2QdxNB7TMWbKrU4URP4?ru6^8_#f5q0H7@!LCbNJ-6_pw# z&_R~_IN0#S27)4IkGJ#qVd021hFjl^v^e5B)rb5HQSgE#^~177gGCJ;kCKvgL+X=? zR1_Nvs%!E!h0qa2iCQ?(a7>_88|?Yq_#zeO(Ln`Jl0t=$Esb`bkkySdav(rMVD^yi zl7Fe+O_F3Ypf&1@gNk_XRArTw!w-W(ir2Ig(BbiS!eyalGz}=s>}Dos25uf&(v>nXHY(P5l7UyYMwC<$snPZ37if4zrn{NPhlIyM zhYj-vBWD6f!wCj4n4;QYA;CdkcF9ryeTj+%ZG)B6|8Ehq%sZX#qWSOUGtoUr%I%|IhZEKxfA^MTLB6e zOT8aFRa!NM7PBYr@@KE>MfBi8d_H&H1HY6T6U*0gY&jsgy-b%i3x8Ye82m=!2d> zBEm+R-Ua#z-)i8m!5u(?i%U2xJTyh}Hj6_a5^Vh2^yJQ%WEaS@Wxa(niexOGu4r|82*l>I`-|g?h**Q_!Ivft78Ex8qsUr zQhSmsB38)Mpe!0M%{0jA=yvsPeCtI`X+M8hgBKyo1K!kRW+TAg-sfj1X9fkmZMx*u zPkl}}`I{Y_a#g84UaVNf-wUJOwC_X^G?u>Tcia4=yWxjr2{>#*N!v>Y7PenUtm`>; zbZmp9ACpW>OiIo7_Z_9&MzXMxgL#H^TD*z-!V4 zls}le_gKb6cG8N;r}Or=!rnIZO_U+Et?N~)jMpR}{i)j^($bMkS3*e@e!R5Hk%1@X zPvNSiYGow_g>MTB3oJh1Myy2xa}!M8L1Mh$5q;qaoX7V*;NW2S_l{^q6x-Q zoN}vLnud&| z^nG}a@Z9q6W8&dix~g#sbW88<+gdFLpshM`~O|Bu37w+YIZs@>!+c`P44MKznilJ!M>Lv#qtESV!gocK0 zg8D)wq;y7Jvnd^pT~ConMWVX$3v%{=zu@&#YRf%{hj1{KnY;f8<}HB-AlXN~f$a$M z+x1#Mk~|gA>>BbRA!V|uM)qOpOGt|%KcSyQ@sHg6N%#VG2Xl-=tKKde&lUBoql)e~FAFu}PXV($KJY zjl6t+?{rve%^rb&m#P}{dOBbU&|%U(DV`4Hbop4Q(jwUM+EYR}g`btuH{!>+5L3l0 z_e;|Kbr}o+!!+v^^yL*KHL}OuPN;S=H6{O?Rbb)qd+Lu|jBci4RHC&XYWSY`qnT8{ zGQQO9?(VKV;Js=q&)cC!out2OJh_d*#D`P}0r2_Z4^y3N!fj$yu3y_Yp3R@6)$I0u z9QpZOHRYT8F0@4P%aO?ICB-z(iI+(qiuA;qQ=fyF4#0r%fLixbR&rCuRX#;GfF!9+ z)&Rr(PeesX9xTl_BkzBW2hNv0vjp&f=<~mP{rq9n^}R)|HuJbjRC~7J>CUHHENQ7r zVDmifRE~HF9D-lL4?ZN1(p!_13D#G6azq?KtgcRkE~BQRf>qQQBzlI3ebYxx`Bska zU~ynETv?$fArY#?e3yc1%Zac2i$U1)a?>GR9Tv9t&Hx_}K{__Jv)&#dDN2GNUuP#c zi;n<~_WVOqEw`Y-FMha!7_)lO`aU>Px|#h|REF_Wcv|E*lu#;T?Rqjnvm;Nu;EIq! zKnXyXkcp0F%H&xTHJ=E04eFLU)#ZH7v-YQ0qtfiYej%ty6u!}RFqcg~TKEfSoW7Oa z&A8AyB?0W|1_c=x{mkHZ^3rs0IR9==+i#mZ+e4NWUyd&YrqgI1jT@564t{WadgcmZ zpeVt)i1iP@8o)D2H~l*M-lZblNlv%*TInlKK8A+~%_YeA+zS{=j&8P4P>4mypj*W# znz*~;-0&hRw0>mN{((uKN70F<&;ek@?ZyOP31(OykR=}5n}I6+=ptMPal-;In0nrK zE547%CXRzT)?y7va5*k1p(HjNMW6Y5&%f&V{QftR7&IXxMSX;plUrQc6nf>S0!th2 z*bXQ2V=cVIF#9^^9bn@azt0pBX6XH#PCfKidM!Gz`-Okr`X<8v#)hOJBiHHCgG{sn z>m3cz_D<>QZFOxmkMlk(3dl$(-kjR0< zVhqUVMEeXfND6V=uN%jJd_$sYdux>`!Nab|g(%HmrHDmzWQ*Y9JVqalnoa!YZ|n5> zCNXQ?r!VH;r;M6gTUV3Mv9k?gsV4X3BtWg?D7yJ$FL?#z*Ub0r9!nw<0%Ft6ga4h- zHM~Hk)-W^x?tQ?taISS*ka?&QO#&KBju=*44{#A&N|7FV zSL`ZPie|<>0|HuN`g&h<*V=jwOy9aLKhEhDBY$h7O|n@0mgmQ@>o|elN19VM9x5UR zgh1IyC1|Kv`5&Ao3d2J3O^a+xM6d=7dM2R>Rs&!W)SgAWJ_ote!jq!{5VLz?4a#uF zAeLyN={>C>~5ssWBWvr2d}|rNL~>Uqa%0z_nXoFcI9v1nhZL>?>{#DmAeNqmgPF0 zcH=E;lo?P@iX2;XseJyss(>qWs?r(A6no24VL!lw#a6*ldXobUfE$G_kETW&mr{LTD z(ykHEQ~OpNB$a!Siv}_tBM8u-oxtDQDay=nMHsZ3$)S-U5wv zb(APC3hQvJbFSYRd>}+^KI4yf{@^Cm zLDA2+5(CTW&44c%LW572pYIos`xE2e7%SLn!=Y`?;P<3g_!Q86eP7rADRsy6oO(C- zw19*(q=fJ=Kp^n^1}XrD{qPhQXJ@a0TcewvnMp_~Hr?jxJ({M#9<`fkOTUH(d*d84 zZs8i6(s29-8#DM0xR{wf4jqrhwYes*XCI5yRy`08b z-LJolo|iGyt=s0r+f7;dJ$7xOY2iJesC-ss>zci+@`|vi1opc2z1%zHD(6*XUyJ!3 zgH{>1)G>OxjlDI!$ME*gWYYWfdaBi{&a3A@v-9yP;;`vF`1(-4SdWG)f zZaw*o9tnSLqjhZvv!q5_4(!<-W+qK0*^XmJ09!A44slxO{l z%@HU4(}#JK{uKN@n?5BYt|+?#G#derynM>5d4Ry%_zrx?Bl+AfN7`$lyW5_TAvW~9 zZ><{d>G9vhF?v&2n=~NNadUNbH~P52Q6LUHL#Yx|OD?&;`<7V4z{0@M{rC~N82DBm zSQ+rJaAZ;EmIa306DoFcGTB?MH z!3(xyt!*o>3H9ERKK{pZ$dvyD2j5lB>gwv0d4Xfk?y12I`&EP}Cuk~P`|lhz>6uv5 zh>7QOg`MTw<)7D=SgswQl^_OU8wcmm_W>|`=-tY(`wqe%L#Z`epPO4+g4g?V8PCTa z6EBeF+VCKs93FE^%bQ4KB4Wa^_{0`Mad1$+Rn8Te4*~|67_%UnqTb!6qqeMUl4}!U z;Q6cL{VxqU4VeVQ0s81aA-au2)zUi89$PEdwMa`Tr+GhAwpBA>$>L6W_m`q9L?B5X zoqsjV=xAwO;sbLqdX^e$8=SVly1ET!ke}kZQJw?d@*U;16pl`h>z~juFw&D>_dQ15 zYmM5JDO;=^@Vr09m^V^ldFcZ6k z@9m366Ey{H%ADSap5w}HdWUEA04c&^Q}GL#fVH1pYo|hmWSRFWfv21LVNgGlGNNQi{MSvY@Z>bS_s!oU|~$Vh!X{(%!F5aMq>P( z^G8m9xO~76Ke>YuQ%)vE#<{(1M}BGw6wGcuMH48}G8p_U+DRiK9*pNPybS3|sQ)q< znUtuCgDn2KsCT(c?P@g3Mb6X&cvp@4d_S0CKwFa*V(xKQ=$y$K_&ntKTq4yf8{K3G znuIoiUq?xU94WrodVjstQW!BMB+Kz++Dh!BnmXMIxC@mJ6aV3r{7M;~BBJGovl=Ip z`*|z!`9mxqppql5dMmT{jYnp3DSMIzP{_3p_4vBc_lk`3Ty4e_iL70}&A`To(+Em$ zYgvhLUlHt^GbW-OMIIy`MeIo*%4)dF#lTnncSFg6x1r|Kb*Q`Rp8x< zF?2tA-j-D=jD%4$_E-KI+lo1*`%0+s^NaACvlYrke3V^?rU1V~N77#Z`N%H$z;ztX32%bU~bZAkVeV;!IB;-*jt2o&{{PUGWpPt9m zhUcMt2m#Rl4`G4-)h(Z@WF_$|FF2;^%@>wC!#UODqoAQN_UBAb2vhC3 z9lHUr=!BOY@`iTz4SRdiqR#%fF1WWT4?XXb$iQD34Dq-}{Q4e}ez}8Q$#h=|?yX_J z^5nuXr1n>r4i4&y?u`jxauP#hk|CxL5Zm#Y!w7_Z>iYDpkW=%LvzZQ-58UI?<~i1;@%hBS;|R*6Yil*m?ztY;%ZHXA=h1k4X)1hI zXOW>OTotea%}4?W>H@4)+`AEM1f?4PlF{5uLc2nG4{#L7@(J+qV~q`Td^q!cBLGwlS`kqtilJNqC))^ITJY z#}i#n&a^bQ@)iBQaj>?gC2b2Cmf%FFI}!x`_~T>L0A7a*#wPr^&H*$g+9jSY3Mwf{ zI1skjGn|`|qws6-eJpTWg?qiq)hGM8;8Y}*f*_~7A0#MNORc8tg62#-QAruhiCKy;CDTN4(YI8Ja(gjm;ph!=GcK;D%?5=&BBK>@wjb7CUsMJxK%-E91os*@ng|yx#sf}f*A3@}#uPTidFw6%30FqruC%mB_a*D>6AD6-~hk}1>UVXjj&iheCCZDiWr^=a^d=Jxk7 zD5!y8MFGLH6ZxMB_q~*{+J++L;-fUD#f<#fFc+WhwSLk)CF?21hQ~eRh!lmvDE*nI z3`DW>+W<)vMhT7;RAljdSOyoc6@d3^yQ!B#5Z0*+5W-Qp?^Ho9n8(%w9z*29f_-dDhB(<$Lf|}>ArXY!SK83 zwO7DnSLCXwEA07bD*cagYdv$CpS>WP2(PAn7x}$pT;eE7LBdF1$t~O!Zna{#!{mS6 zUG$1AC`x^vDVK$fOhGy)lgt}Fl_}DN*nC;eEoWFS9;`slbFYS$q@kP$ws(wEM7CH&8jgaLurMQ&UL0-Y)6j|rE&WE{B! z9*DqST9ZNdT84&YgSJ@rG%EaTUMz{932o?5!{MyQg4yXD`>!Lq&t$qQ+LsEtHR8YY znr}z7hH&j#Kg};SJ`i`VfAk_DAx&D3NOzT6vj^Rh#?ciLU^oAqg!%aAyhdm9)%?b*Y4RZ%`|LP9{G!R z^CI6F{5o)#RHMhjv)kUFnVGz=T1ztPFF!`9B-vWh0x1@hjIb$f_pO7th!}TGV5^(4 zQYmSZnTR7J0h|@z))okTWHvAy;tj#RZlZm7gLkC{3r0L~&$Hg0i3WQc)ouw+I&%3w z=&4Zu-Jk>w^78$froeW1TUh9z^5iG$uprK2K^pbZ7)|074P(}$OaE%9UOX;K8ZyC$ z^!lS;Y7$)7A9#0N*cLKKYH!phNm^vGvd2x|E$JFguAuS=)-!jd#X?xezIROy@y=Th zx@M?77r9NWDESv+zQkxz(nN;N`}hX>XL&?iitKYwEhb6H-bB0B0v>A0E&nNhm?L1= zJCv0E4NRzt8b3Ii)>%>_1k)XsEbJ`-g6jepIU~5q?iU@UJ1ic^0eev~rGNMmBnb8T zzrm;f0i^zcPXl?*&EhFmAwG%n3L#xa(0e_2Uo9={`35|Bs5Zl~?rFI&4{FU`5tro}WZV#N>%-CeqR=)M2xwl*dC!Fqmvy90HTp(*&z}DlmeE zg{iuUQL(aiVa<+RN5cJc^2XYo+CLL;L_+&f2X%+#e3)*Z-o`;b?6^pze6r6?&iHmE6IHZt;=IlcFi86X-s zbmd!_3-km0LQV`j5DIy0xhrOhsnIgfDMAK^z$~|}Bf86aPzq~426Q{&K)J!ew3KXy z2-c7y)TTT~<3z!`*NBf`u&O}b-|L1VZg2zvb+y7XSK|~Ydf7{Kek7I#?-Jwsssoi! zstV}X4Dj#>@rtD;hGH~n@K6HZw<#W8?CRk7IjwJ>Bc(Q65ON21?#^GFweBOqy|3k| zPc@Hz#2%zGA8>FeLEFlaGmFPL^AbMvIwH*3%~zkRGx^@_MB@ASyi`9;P|>ah%}u;S zu8*JNMMH;l8+u>JRgGAh{Q8l}wV=sS4)TNf8YUI{@e$zUM`#Aek0j9j3h@vjs(XHp z{WX%1x$cJqF*oZzT9X?a*z?c)u3wKAUQDQW$ZUpamNiN=67TO2oNV5~p_-Ff;+$M9 z&B71Um*BejnxNPH3e;?)TpyoMz#&5W5UMHQ^O_aV@N@91_7CRb@zw!gfj*7*B#cij=l+Nmyw6xFv!ze3)uwzw@N*D5P0lcK7F3_Ks6 z{Q~f4!Wr}VQc4Tqx8z; zthVUjCgNAGex~TD6#_1*WxP}^@E``rFlre!DJnIr`AJL^!3-Ju2Z%+%QRLM>T~SBn z010kF{-o`@3lcD;#znWo&LJfRdQs}j=1Gw%rgR8%zYLg2XNQ7La{@`NX1nk!c^`47 zP*-X1FXVuv2d!8YG0|p>89bDS!M~b>=V&!i_DDBld1H-;8|o@#ie|y8+j1#HAj6ed zpu#d@QbvNf9;`LL6+b4+R#gL};W=(h78lpee`=DUnntc2JiI{rO5Vt;LN6!z2T`B0 zSfb=`fqKe zQu=?)(Hy6C8`g>coQXbdZ!SP4TyCoaId^P`#{!v&r*Sibs1zFGRuslpuCL{5M)ur5 zs(5dnkF<;&Q+j$vKz!nndIH%IYV^Z+@NoMTGk>aBrTR_CX;?Uu7ugX#Gqb#5kL{mX zg}QcnkBQ+4cn4E>0_2fs7X5o<7~IVbnA;39#$VCISQvJmKfW!1P8 zpO~mcMG32-R<|cejH2XBy_?g;YGsk*2=Xs$ta5DEDa_PLns=~?y}TqjD^z(*%KD)K z;->fNyWA@k&ev+U@OQM0r5K-|NF9>butAo`f9EdF%QH5cI?L3iJ;ZZ(nL#^?($+^buI@j3_$yKX1Ud?ESDSe=NCMKlO5uWkB6kV zhKo&=-`{KdgL^AI`RkL`RMoC_UKG5N003iSV`tV*NXW@xyjBer65%H&m1QbISEA7! zKf<1&FqpgQ!%E9a?UcC+3TA<@nuLW}Nygi}REg24j)_Y)Ef0!1@_xl+Gf6qgf9#QQ z5Zv&;-wHjJhpkXhjU?n((4f&M($LfYmA`0zoTDzK{;IFyY{2@%(ZPYo-9v{)@F6YF zeA=PIUSZ`=ro*@PZs9U@`mCn9+@6n3f!fp4J+Rl6m8J_m zjsOf(sIjF6hLEBZBBvfaRDhfKOL|&bR_8%X6;=qrNaI+_iVzAVw&3kC$*usS0n=UD z=w1#703gfb|Dj;SEH}n%JQ$pGoY$QH%S@&U`SI=%MR7E!PPb-PULp3zvHg0uk-%}q zasB(dQba8CiajkIlahjp0vjkho;Y@JqkrrH9{gh}E5-cpB!lV`Bm$RmrD-^o1;4Ko zjz~JB9BHCL0#^E%yzuQGmTb&!LqD-!YIq}zOiE|63(2h@&jY6w*U_7rCBKkJoYI)1 z<$i-psE?Z?9Nk~P61dv+9Wznb#HlS^BK*KX^BoW=v1Oz6;=6;ibcAN*OjC89Aht6K zRaFMc~lw~C`($%_!0FVtXB2zq#|A1R54?Tv<1k&uwZf2iaN=h~b zJ)vw>Use43!Lx{t3Kutz3YLvQz;kJO+oney8$(|f)PVfq%}chHD!j64eRnatl*?B! z-L_I8URG8wF|z2LogGm(v!8=md07SN`8Y=ikl7*M8fIfkUwS7sd)q)HL{PUqD7g<3 z)!p%`Ikqv8E4yfwei$e$u*r(sfywVazfiIG)eNUt6lLbS>8n6mgHz?}BN7nHOO6ww zTtiP!&*|yzeixJ#1R6CiRRdWHQ#0#O=oZG!+39>39ex?EG#o)hIZrQ+9UUEFi+g~k(+3^n32=ql^;H9nAl*oISsBU@r8Pl(^jC34_ zzS{zG?Vp2#MKeqBk=nF^H>)mQ(m7$~mXnGqjyAT<2-u~U;g>F=Y08WKYHJgFdjq`I#2&DV+Sm5%iW2^eTW!%Mt;FgYke2{~_zu_v$igm6J* ze>XR`BgyXC-rfMcw$gYOddBJ7kP$4@JM}7_`kO{{v)f7^@;bgSDXw9vl#FegQp*GO zK;x1?mphLJEhE3hg*m$>e8gyI@8_W~Nacwt4Z}nlW!02vYZ@%qE+J$wtKmFr&0an+pWxQ5@;jtG^>4nd80zm(L&lC-2UFqBM1Orr!Cu4TPsI zh8khZDh!H)(>TjR0d4vI5TnUfm6toIm6R^ocvyg@-bqf3;_n{`ZRciqy2@=b`faSZ zRM%}~WxYjy78{-8yB6c^l!c|`<#=mrOc=i~;+8~2ZYkFSmV~H1T+6(OHnT=AKHoqv zm;dpnwx?%edPz`}-EdNdB_}9^^{0Zfv9$E`22HuKVFJAk$h$rkyF5aQwBVd%pPa%h zhx`Q7b|6QjyblEspmpX(@mm8QWsuD1q~sg>v(mMOA|S-RUP1KNi)tq}J{ksQJM^5| zYHI7pS^UtRxVC)=z4VLsKOxxSloUW=&u=w!Svf_@raz- z8XyG7a*P#DN-<=dJ|!h(SEl$&KxsW4xwxws2!FJ9ayS7|d8i@|FwiklQobo6&egxv zU@v<8av854VkHpJSUmskt3oVdsW8sWHVjP7)-9cdBd#YG5h<^)?iL?(AsmS37kk_t z*h!qC<+U)Wn}TtYCqpgA@6^!qk8|jtPV{(Klgf`#ku`htJG`Y*dA}wD#WJ6@ zR`gXTtKX5aVf_g^Au1sy=&vu6{Y|jpBPB~QKQLN@>X8bck&Bea4JL1DH0QDw_4NsH zjIZr~UtnU0L_|a^E2xMJ3*Uyr=-B%3rkkIt{GSb&gMx_z-M zRK+s)JrABub64oJ@yqMHWTDKdDfuO%VYn@%pRQC89f(Y^W2D&Zs z(L9uC+G`WUQyjI6i{Go%>XBQbN5>DYn+$_7?B5~GB3js#1qtzAOTPZC(pU(y^vRHbB$DX?1#7YresZRf)2&*=Y{q_4kABNPX zX{Oi-Tb>v&-j*uma%5uHFu7J_*5zBEAc;gHExl%|U>ELZVftNFVIi}At=cy#Rk`z$ z>E{P6I8w$j7`#^AR<noy-~98SPp3W3g#7Wsaei@uHPVSjpt_^7 zhqq|UF|XRf(f#0FlmJCDF23)~-`}rr`4lzbvV4=1I&(oa+e4$t{+u(Om*^)UW#X0x z3@kIXtB&72J9Qx3&&3&c$|Y#ueKb0Q`QkQ+L!>0)skmO*hZB!WW_Sb+v#)Bs0WfyH{utA_`pW1|S6G=rb4a5XT?gW%{uNO7mO?mTnWC zmU3X3+FY`u)*zE(L-7cv9{KV|$Zfj5u0!^#n}}{iT=@o$ShMziWcgUT56vW`01@mM+v4 z(E@M_nAh7``10qg$zM5RdsbiVCg8VLeClt%lkh7g={RzjJO=bvf6gX^HWA9S*v#^p z_vP1>WbAd1Ii6WS8>ZHrAZj_Nnw{Q;UGUDIvcvwAD-HGmUt-&35R3< z0_ireggrYwPbu4Zq3hhZd>5*DNey!}n^M*g)bY?;_wdoFJ?EAE&MhS)g~~%3J=CY| zdSDj6xyv|stx*KcxL{@WsOI5*Ue)<_Bd{Lj5|@XQ>W3dlk3o0|B*?N}4jYZTp;@$> zCTeeIl$ok)EY0-ogF;lAOAD!s7D+?|(%%MoRPcPpG5SG6g&FVUZ#m2~KK?vFsl1dv zYj%8=8Ri5V>&LZM9Xu8W7oV60aez5owr_|K$EudsV>^grlrOn$yOdg(-&Zw%3^jPS zBMkX%c^XWZDn8L{bk%*g;(78Zw$L8AR$9-xaktQ9l_qojoaAE8e;^K#?ii^G9`;4? zceiH`k#9GnL--DOCD{D&L6Wm?OhyXo{0?2p#x?|opRzV$Ds4^R(Y^=&H* zdn7g%h`KW!VAxrU7g_|$+1ytGguc<3-|=OAVwA00WSh2k5E82&igq|@XsnX(s=D;? zE-rPkDPX845=K@uH1d)HhxVP?A~EfGX69P27c8SGMIvT~;KJbLPT!NWEsBjSpcO0l z?x8jaW(Wj)Gdc-1oktp4!&$YJLibb1944cZjOltqJOyFLMkZJ!x~|O=I}7sSoHEPx zFT37F{R`{HaIhXurLj{FGm5L516s6bjq5a0rxr$DUZKdDUB0TfpR$!#jqCUX4qhOJ zlsuOZR;+jtn{hy*kiZZ|TR77U;k#=0)JxCU!!tDTYmcdvE8RP1WKBoBUjK^Gv$&;D zowizh;h{~eXi7#;PRiP~!;Xtv%F-gR*YFaI*5#00(r3d_bW{a-ywB$7!Q4Xm=M@`8 zIMg(Kyh;1#05}hao8}@RA4kv+n(yQ~e+a6o_c4;~PO9k&+sevZdTpK%p?1T=!V&r+ z3`QtM+B=%0KtBf$A3bnRErL!hELIDFD>{@n|7jO0iQm!vMeF3`% zH~a!HSEbcyedd(unxl(yDm?mAUTkcmOBajrbrGb%D=-XI52B|55=m^|K&Hs{F^Sm} zm+s#kQ=FcyTSp%{-X2%tTQrR^u%|TIPoz17z6r?D6>1)fQ2(CdCF{<diapZfRT-=ATP(4#Z78Lt*O9Q*QV-ejl5mL#{gj{pyr+XF ztdlS(COK0p1B`K~>at-;>T+iYXR95>X$KauLoDRm1o-$Dz&oIlONGU@{KVEpuByUh z1#MlA4LuRfK_l}5H#&TGXL+VCxVgVzZ!$CslkP%DUqaC<^4xKkLdwQw^HV6R8;Gfp z5BeMDYei{iRMNH=7vIrw-M!qXsUM~Z!O&Gq1Th9^d`l%7;F4HF6Zi8M7@cbq&? zmg=pf>KFve`%tk6z>Ki&MZRSD9r^m7SL4J!u1oEO&P}HV*HP$WUqTUf;DX@0ekj5DY(E zthRMIQ%(lXn{K$B%2bW9DAgRqRb;H2=ssJ}?Izo_&Yn4}Ok@zt5@PecuF|dXS>NU5 z_r)>)XlBH)Htlx-7r+NBZHZO^o+W78%`OK!{`k-gX2T<>H_B0Ud5Cdw}51#(*Ocv=I zGOOWHSpR^Xb_8}bX2;ds9SX2gvm`Dh!=Tk*wOYD*@vOA3tg6*Q%P~S&`RglukSBh2 z_VPNuF=hf%d^o@_8YHI;U|+MAoF=5EJaSqI0OF$dzzP_UUG~mou&6iJ_EW(8scnsR z&l6k}3MNJ+KApQSyjHuD?_diChAF%etR8E6qy?)E#gF9RM4g0zz~1fAj*tdp(+~wfKj!^@_BZ4 ztg7Xwf3@!W%x85EF`a`SNAleS&>`D`u9^zJV-`)JJlxAU4w=9`+}$IC(7w}X19r@i z{;Mln!hqziL571nq`KMrWCy#j=FwfT=!OA?w{LEC1>%CZho|Q?Q4*kTo=2Wv4%m!L zbt$4{Min&0&y7hKAExtq@m@KbSs7^y!cszCF;D>fGmEb)-feJ@`an=chVGg2#m4POXI6z3FV$|~E{A7@spYG!L0ug`~O?x0WoE;if5jKpP+b1=wu zG(7PWH>cV%5x;9cU?B#gT~j8?eRu#7btfn1`{1|AKY6u<8Q=Eyk!r`=^?M9vnc7yV zWV1jW=81W$7sgJ(kF@|Nb%><$y73Kg0uRTbiy;v(nmWDk7Ai>Kk$qikhtk$Vxk4;d zr7qh8b?Wszp$?B_R88CJRgA{a#;EgWAf*=QmuBprD${r&F4)~bNJ&oDpye}^R$jFS z;qf^u*)E|q>JsMQJUrLu%FACZ?gW<%0H$ANOP+N|?L~QY6_q3gHa7C*eOyMT`i2yt zo?i+T2U>m#0iq*R(`Lu@157^V&H@aF2oTteur-ikhdE2Qv=Zk_ zNvTGnrB!*yO8(l}rq#2GK-BIM8s_NY1Vr1Qf-(keT7vsByzl-|T(d}7vpoox~p%9xIlf%}68#Rt^k-U6)YmVN_6wWLNw&kYw{^0V(W~IfdQw5&Ad3U)SLUEOG z$f~Q?dY8F(?{mdNLXzIVsTkU8v^JliD!3s?#Osh4oGP!XC2lzpg$j+>Y4=3j>2;^Y zu>sC?-t5iynMo}czrh5$)q0ufY~)jdn`(aKMxw!xzVenb9gu_&YL)I6qhIq4(bY)4B()s{lp{BK4a|^2`Gjv}i2XC0*7`>E8>em9a1hP;Lbs;C^ z;e=RpsGYR(#Xw9&l}gZnp>ZRNIRaY@M?LPk7(JrvCd`Nuz#Pw_u#78okXQRmWtk7fC{mx=wZ%bvj_Hay z5)sh*`g*mF7uv33k>8I%T=^^q@+P1k;93jK-Lc-p^Z}1$Hy!yV82}-(bu_D`kCk}N<-Zvz%M(X&RH%Lht0=Eyh%Dyr4^)O57(?m?Pd zreyn5oKzk_SrQSEmgi2)akay#xX9Rp&NaAwe*a*?`^L=_z|N{&>$Vai)h_GFtx4pn z^G}yi7n$4RTRvN>(6_G&a*O&PDaI0ELnrSQ=ERwBS zbV(9JyLxp?SabH;jYlGQ~9Z(GD(#f*1vI4Sc6HyD zKE+KoCe2^<9!a3sO=J%$P=0<1=$~}i^!6BMR5xZSXR*$yDkdy)phWXcJ!NJ-Q+)IZ zLICXKrZYc#EkDgM_u9dp{{46}F-T&dQ}11<)Fh}wlsG&;Pwgy;AgrnKzFj?=9iv;k zcT}g;5<=AYlpbR7(H&!1k6TfypT$5ey7iK7jq*XjIw`Up1g_nFj54_}rzI#CPyda+ zC^hZdw{#F)*V9glk@Z?<=75ZRaDQM~#T*wBfnLAdhBwq*F?ee19dl^&LFD3qMSWww zSm|Kn2gH;pvh~8|qN06g6BZKEtCP7lPyVCrKw}xC9Ni>;m{ zWManELCZ)4-Wyd@G*;PcuW|tv&vN;3=d~7=NHy`64Y#<{&YN+hZun4epZr#0*E+pq*EO2}k|LMRHt){3ix`B^|Mhj&2dDXY0EmBYd zb3!$h{Rf_RTxPTa_LUotyHK1!x{f@uvd@(yO4Djz8jft13z6B8%1?<8n;}-&vlLH`f9X^HPEj5v=cWw{^D!A6Ku#o6N&TV#mMKT5_NMsa?i&$9QUTdZg0@3gsY6WtEg7U)NSg{?If@e zA=C_ngnp?k0O6#fPnY<)w|Q|Ww4_F7)ot2U27%xdEZOGtcN!HErY02Sk=Iqc7ODe9 zG@8wDFsQPFyWrJ~6G>xDwY6b|Yy3Jo`ce*xXa27;?;`v!coycVK1#PpyYE)J!Z(>pSy+0MvPs}s;;88 zlQauVesUD~IYrWO68e&^qN2g4m$Is(%9f9p+a#SXyYHHHA9*vFtzQP@EFB=T+jnK1 zTT3L!WnCCZ;=i&ZZier%y9aXU8FLX8GR9a+TfJ;`xTFr% z(Z^}j^ac&>=UwX)SGI(^CXR-WBveJz1t9qHV|`QmClguL@w{k(wBy^CN@fJ+ko~|S zbd#?wkRVtwXKq#?Qh-nz{5bVs#UJVcDvE%M_3{!jHD<|F;s;RPdQ3jmP;^tk1Ze2E zh|D!w);%p?c{VrU&s~s7mTQI^_l27e-^j>Fgu*UR*MW=k?yUo>YfH>Nkb=3;v+*S3 z7>+QZjr8Gl9dA3?hwmMZPR@+(*CfCQxf%;KK7Mt>>s7`a9$c?BOVZr^HuwE?ncwHH z-x2CjDDdcYBYeLHcptuV6Ec6WAbLrD8Il9B1Fypgw%-hZ%#{f;!l{F8QZo()qW9@P zkRHz?`5b_VqrI?sn%htcoDeqs!u+f~Cq4VL+^8s_^z5l0So3a0(}B@@TPtS`Nk(QC za4K(Re`etO9$ng*E)ybwiPkX;%0U>I>x-j9PT8CwP(3?o6op*wd*V5TEvY#E{3!)s zzvquDJe<$-1_6oZM8Yg7PTcB0bwbMGY2gHW^~?|M;U7~wa44)K8RUl*mp#+EXES3ck`wV6yVqN9?vxT4e4N~I|B2W`jp z1ut!J-?V;tg`!W*{)c0lnERqa`MCr;wSjBHo67cWX@)~nu6#7ITu`m~?hmxX%&Gfr zgX*D7Ce)XgpEepS{=nM>e5_L!p>a|B1MalOd1{1HKT}Y0lXP4eYfgHC{PgtmP${CK z0l=~`hE?;Y;b4&g@jKGSVXC~y-vS~kj+LK8_OV$%Ul&fRYA!0R&5?nbHgL`YX7?}% zQ@r;iWgOZ(#V0B*I}j7w#N%dLnOf$NmCw&6S!uVat>1SCuF;&ycQn}d3gx6r|Fs_Y ztFsR?`ALB5TaFj~uPEOvWIfu?sjVN|zwVER@KfjZ0+k)uqyDj!z`*qS?xY>=b3a3Y z1oou9Jb~OXs{OTjhgM57jUYVl#SjkU=NyuG6hR`T>H0*?W->Jx}Mo(`W zc&>-|s@eX&P~J|&LBfnFkJuUFp&TI4PZV@@ZQh^7%Z;aPLW~6PT zrDnQRm(i2nfWo3QQ+i(N{K&HM7t@Zi&efNvw;*=>imm&gU zA=Ui(I6=qr_bfs?dC^qO-X8Y0IYU@Gzzr(G%?uR?)Rf`uE6Xl>{CRuNiLqSu~z~iW? z%QzSbKSz{khj^Ui4>uqCTzrB6h_@=3o3^(-5Y1jrTC!y0z6Yw3P20<8@H8ehk@U~^ zEP{tuH+SMWsHimE3xPtFHuu)z=;oNp)n&7<2G^h8-*>oa8EC6!6n0S$c=|&}+lyL( zyq0kT4D0u78{E5lET%44rt5OVl_H{`_Bl>S{AA{Ah;L-VJE#GH@8XLhuZ%-`=GY(Y+6;^{qS^)C&`fxEnqX@)@l)Aes=Vxgrt7c7^ z8SwlYzFeP# z6MWcyy(FJO1&RWyxTCmjH6}gVXW`?blGd02*Kpy2_WIJgCp->Xl8~HEyYN%AOyRtn zgMtD@U1;_2z4&=Xq)5f*KJS}mpw0=lNRMpg{BniqW~Zwiyu9Mxc+yr&f=|rxw)cGZF()NkB@u@@sr~n0o!9QkLN@ir#bV z_<$)?=B7qp(ijNWAwvf&6VW!TEHBLVYCp}*f&W~d!ln{sjMpf8JSZsm$%y(NPr*2E zOwRUw^J@9R#-~UjK&=dj>)StR69`vS+wxlgK&<};U;SS}d=Wk*4tM=r_xI)UWF%|%!sCKct;;)8{l$B$ zTVU)Td`fyp67W304FhCNv-o3&?7x=#o?S?;>Vy?d8=h^?-*o;i(0cB?0(d8LVmnem z`45Xe$&rwd5K<-Nx*N$xb0cRU3ES~A5pYf{fy1B^*Q=ozQdIJO- z70)5pxqVGKro)4Su&P2EE31aCzZ+0V03wU_`T8jWen@0B`c}(hy`hCnu~oK0#Q|Wf zJOC+3^Oe1MM;uVvNgQNl8*__`hn!kl20nJe=`vktLo2#;K-!{LwGmK=xb@qpo8NG7 zz8ILnxf%l=QPz&T9i23JInd_eE#!vR<9lOYFyb?#Fs_iPQD@S&tzYzQ5<+Y0WUCTm=Q33=r!w9hHP>w0oW+yN1K#ta z8j&nE`z}Y`xA#R=9gB~xccfK*-6e9lJbtnF61h#ynYBNbK0DXs7XP43@)2siUWB0F zzU}wDidCt~jt3kj-e>|o>qw_F#4L4Z=SDCm94xG>ofj30=+h)kYs%+;ypK|VThQ^<=epWus&lfeYFXtMLcu+NV@kb(3w*fb znx<$F0q8oXn;-9D-}V>Cxqt5^kT^+5g#P6GvVlcC0wkyALxeRvOdORUfrz%+-0)I~ zXt7#q?jcc2GvWT}szL}#2yTK=2(XvR!ddyG{e1MGZk!pKQJ3{nAc*%!@LF<12)#?SBmyfNi>ctpqnd?d4Rzosce ze&^-&ej*lJ7Zs}0UnR~*wemj`^BiK&6xNTm3VeUcMDw~);cGuIz4?S4c&MqQMEJ3> zv}74vLzHYc;t<80lXpJ!tQ%vL%H#x%^xd!8Vv*LOU{ZV^5ctDuWolKb898!macw^9 zw=A0eDkqMGvkDQ1hObdO-M@bU52+S^4of5Jj?oTQ)%Gq#IPAM@ zCJ<&RjaFVIbDs*C-cn@D`QC9C6@^$_5KoVv8~poo9&ww?Wuxc`&(}rjPbx8cUqwF1 z&eKB*NiyYNg+{+}IPc%Ok+TGS-Uc`Gg|?HWctB+Ia2aaLeDZLFKWlf&8fQldLD7pD zepi6^0T>wW(7e4Ngx&#g*Q+PGJCTdz$>5r4K-tfVjG6UZI$tJz1O4UX zM(*!h^eH_CY@F})XO2WMTrxkkNzBs@Q9;=I@38(Jv!<@w+&*1GgU+v`XQ$uBPAx{28 z6pyV*sFSc^Tydy`{C=kcQvkPT^k zLT3u>-6?6KVz&uf?mDKKM1Nv4-wmR97e0j}=QfMmr`iDh!4(?sCWx zT+Onfp}{$|cXgT<2=Iv{8BR!a5j{k05+{Cw2$`0)wyuo&S_H4aWdI_%VKdtl<|HYx ztf%K{=XOi^IeL&unQ;lU*Wz^$BE;v1c10QF%HXW;%umsqe~UX54(JSV47#pXX6NSS z<2(3B+@%M2zC*yS$2(#f=syXYqGk`f4ytj9t925&GbZKA^|O5b6f2H|;E+mR^e_KU zpZVEPP*)97m&B0n#n*C#<}u_?@b<)+czCsMYvR7a^Fj6@-*$b!Pr`>=QGzTBPIuq1 zz5y^49S|I>e>DVzJ?GrW*Sziy!na?n{CKurYL-=99|!8U9sEkB1OW`B7P8iI?i+)y*P|SK-rfG^O&&^8vKFal*{FgtE$z4yIlz&u@-n7uA#v*SRg2Z*-elTV* znVV%XHKM6wz=ry2OY@613#9$RwVK8-inT}bO)lr)u*Em4WeUL*4!XIq6zly%NF3p{ zP?s#YT4UTfQt{XHCj=G|`=X^$j?9C0p`Nel&^3-W#|8_jjSTJKv>2Adk&Ujr-=BkC zo_y_T7DGeW01FWaku3E{UPu_i8tNc^pc#J=kJM%EfsFK!rdVi=B7ggv-QnPCQP=wS?+7F`1di!1 zTQf7?Bn;D%io%5jjaBngqgHjgc@8>dHkdlKGN` zM-K}#DJjhyG}9JTLViMDh`1{sUL@R?D`q0FUY1Q49kb#1!x4up;E(t4m1old|1GMG zn>6TfK&wtO)@9?U40~y}$tKUy6nzfKGBP_2izzw53*g z`L()4uy}sjFxnHwFl*6kXB%jclGAl-NA;x-+>;jL2H`NkRDhij&C{)MTbFQgJP>yK z<;E=)`uMPq`0YcWb=%CIEjXT<){pQFoNTZ6{beruog{tg+205a2SWuSncas35l2Z) zOrZ?M+Df`&i>i)4gizt8CAeKIY7psl+lG0=wj=sMBfe9+tZnzs-K*p-&3zD5RuKKw z9tyOHr4wXBAdR=a`fpi!HxdGu7jhl zhUw(w^pFd!;#0=?)OUjWyO4fqw;2*hibDfNAi1*N#e|WiC*CW93`Pvvh3P!$`&QKz z%a@gePCQ7D9#q~+1mYo}A z_X2dY_@Ye7SVHL9X7HF~ZSVVbbOJ&(I_|$~e)lfx4CgZhJV|_OW=oA;#n(}*Hd5*> z_JII7cY~KM;t80IppbI|G%HNeEMu2rG9U%}Hmp3v*qDZr;|jOW2c(zrFr9j>T9fX_ zn|QeHGcKnimYhYyC}cE2bQhhbx7l6n+S)-pIb3;lIXCQL<2l*SW)*6-;XpWR!Gb#P=QU=4#&dd%Cz8JG-!OL7yt^?1@zKx?km;iB!}2 zx6`H=P~n$Yw>~f6dXGo{J&aXXERvq#y?y1|^LgGkM#Zeq;d>vWw*0=GhNa8xc=Crr zV=a32ygAs;#`}68dEVEwCqHVdgAZ)y9@;6)Mzh{D7ytgts*cZYRbl%DG6^W3RtZbU zFU3}%_x0YwW@E~u*kS>c>vJ~5H~LH0^C}z31GB#$p~K{ocNfoP!y(`=##&U#QeT}k5mYZpqO)CKLHwV;|&R#e~;_tTb_8G-kc9f!>?!e3q9FPPZkT>bZ3Jwjwk zf+h6C6|P-der}xF&$<=cnUuTz;CZA-2fl$HNBMl>+X(C}+3R%}vYB`Z<`s^C+yO@A=6{TiWt{mqdTWy!_L=inO}#E4dWp0sUy|b7<>QUiIXT z*jZJ4_xhdYqMc;Z<0+Q=&oaTs)~ngOlizw__#&SU=gdZBICW)redT1Euk-na!P_C< zU*(AbzelC#6y)-_y}e^=s!uq+JrUSjDScx0GTg1mhX>ZZG@6aruT?P;D}KF#b?uDM zJOT`ObtV(A!O9_$Nh~&%h(5bGgwEA>x)s-hU@BOCB1e<9a;mC}0c~V!I!9aL74M7M zUKHUz!LR;p1KVcJk6CSsTdc_&w}Qnb!o1$2>!(lD&JdfPZAur|w!w6VTeRm*e?Md? zI6c-px~IP1`!!3A!O?YsnE!ajFQ{ku7hA0^&?Rr<7$DRTJw@rzoh-%6y-~|>I!DRw zRAqfweYIhlb`vGvNmTt%0v?!I1R>`NO?)tzJ)Ws>fnj%7kNA?iY+rHS>Wua=e2R@O zH@x&ow-A5{pr*k)UN9^LZgBFdo7ozrFsW2FkLD2MtD(2RZBGX7t^XNsqw95^_RQ%N z4fZeqflQuJBkzdUb~P5Ri)$X>YH+Rt<|@b7Bv3}LqrD|*amieyy!&dJ3xZ@ z4)kcvt|@-10?;D(A0JiGIW_xE!SwoPNazzAhxOa$->$=(0=DAmI>x74?q-R=Z_9)EaC9JgooLvzvB;AO zOsWb)Q{3skkE2}#WmBx_^geb>Oe5IQs~;e|UW;BWOgfu#mLKa;Q7e6$K6}tzhi(CQ zpzXJ;{-r2gVEAgsX#0Mz!?v|Fl>H=P!;f-t9&!aevvWd61I>N2kBj>U$(mH(r+J9T z6PXM5kd_9S#qnV6eS=@Xk!YjO$PH?y^>Ov_@W$eoS}&#NTWGQSP+tuBRam!uLUdxE z`Ci}GVIQLRXPXWnQEuhXdO~U_Y@{6miqfaGr>gg3Ixi4W=hHe=Uv6KpOmoj=>uHp5 z2Bu0%lff3i?7j)$@7eG3+FP@4d)#Onfb{^vXEoqG6Cn)j5l%g@`3mGuUZfp|GYoCVK-zbUIVVj zO4m`U0)j<`MHwFQ@Njmdag$!I!GI^3q3>ZqyPheA?Z)@$p=|5TD)9M_q^;4>Li}g0 zHt@ZpbHh|LlqlBTYFe&`=x~Vy9ZGKqzC{X1)UHDZzmC(1qPCz5ULyr)U2!7 z_l90hc7UqP3XqH{u79#9|3SnnFy1ydFz|k$WhosYilaaWxq98v)ZXhfT%nIb+nfIl z@&dXUJ&CT1xv`^TA`}*K5w~-QRa!hD?O6y69X8L;LD#Y;*}(SV4>pCy(`!}BODTjB zL^JsFuS!RqfPvkn!X)&jcESX-g>SA`;))Rl_e}(A>diyQ@}H7H%E}Gw6j@McSMSx# z%evpxbf&hcge1c0Y^6$aa%_eD$ewC#NI+n)7&H6+MH~FXR~a0s%4#s5d8nB0j=qw5 zan3_$dv2E~CgHP*g+e_J{VKI1q;~hnUOs_y<;0GpZLpQ{sjJ3HnWJaNKzK$Q}7Pnr_Jrw zT{e90&#TR=V3!vlmTo)vyu$RvT=MUF4CFae3+WpKVgex!^B z`{b^wF5mY;z@51eN%wrWB1Q1Mh*?6fVnQruh!a#4Imx5{d6d*-m+?wmoF(R zt0gy|ObCt?DcWZaSOrc`PR?f+xh_BI&VYBVe1?u~rxeamLQ+|{rLEmfj~>_6Na@w`>+a&5gza$=LA`SF99 z08pzeeBV0dKueK6wC8X@#KV9eNYa*?S%1g}^qM9vnT&G#DU6_)9E30*j zwd(ipdXLezkPv7Qb@f!`G@Ifu*{06x#iq&jx0^DPz^TlOD7(kDVbt+Lcvx5kLcEri zp)_r;^C?m;=L_?lS89y}ywogSO_$r&)y}Ym)A`{x;%(0#Wpr$i8;q7==v1ngd6d$~ z{kDDCd4x?7Ppz4=BAKC`SA=NC;48lH{~7!e6AnW~Ryl%TcFok@dlo71A;19g1YyWm zFazElRFpO8sqPfyedKMbJxUU2ePLec(GOCm?pcs8M zJ4!TIa+qWvVJUPJ6qJIQfN3icWC#Z7lnI)vY8mKl;(wDX2my>m{$I!DO{-jin2BEm zko&K;Gk#z)k_|RPT%Y84gaIdX1!<3t0*v`dK)?rt05DN)8Su9;43!@L83Wv`((B&9nM7&M*s~?oZyw3qr1j(``D8Cgadmf3Kb)Vz5%g z$w*1Uvdzz%pPYV^z7V$P@pDtx(Rrk?ieZgwN$9bB$Y|-QL@et(vvkXp`emO8T%LHd zcykbB2QQ`bI?buEPP1Xl=)yL?HdAq#6fzy2R2nB~drOVBqN?g9m9{OCu?gL9>qF6M zy_P`k`0~C!?ZN;jo|dJtyD{>qWj07fMO$u11gL!y5DCbeoXpsMr&ZHhBGYGv(TGb} z>gmva+lQ>vqSwjtB%$BdA==d`d?8R>wL+`dsYFPm2gNbU3FfsmfR7X6dNd^+eQm}# z3-t4+#D5q0fnJfmSdq?aGov6-&xx(_2Uej>y?BmPLo02IaAD@yFb!Iu9byb_CowLL z`yL<@VTi!J2AKJ!cGR`8lbNxMlf6aBJaHR18&{8-MPu}r%^W)_xWxju4h-i0@N~!@ znXu07!EeSO*K7O2i47W!gBSB66{s58K*_Zskm^8vykq&?wm!}|Nm5!IZdMixUvrsQ zeXqar_==^z)(P^=No^A|V}q_QN1{0yZm)uIAru83Ye;fvzr~xtEzq^Fn1qD`EGpYi zMpMI+D$rr5JE^=$-7rJ;|^+Tzr)Mym47eK;>1!&tsD{$DqMPfOT44l0LSKEaUU zLZv1$E@$uKb-lzhup3E@lMPmMd~ASINts_U{(HBJ;5O8?vTxf88lSZ`v1&y8S>Fhq z*WfTT$=x|&eyQ6lOHF=gyKxZx*UAXbYMj!t%A%o$;}+9=cNc+k)a~E1Aw*zi&9X6r z$0Mi&QmQnsImYX$$|cgX69Zz*vWB5Cw%5qq%mBfdO7X`${3_xB?#SxRbyqpwfqM~xO3jWUWaZ!>8P)#VlOGvj zv|e8ReQSv#DuUfL3{Hc_#7en}b7}Ro(xxtB9*P3uSJcSb8`wF_Z0jGK%`VB6CCiqy zRAon6M4wd@+GKik^*9)8Nk3h$ybWNw0U1AKlqk>sSKAO;VN2M5?cba`XHrf zeu(3(EFYUrjd0i(6t$AYQlOn+IE1I3puk{mlg}C#6@i>47E$KvXmw=+!+K==g3+B< zRvbN=Y$R7|oIJARYf6g6rP-@9;@e0w=~ec7+o>4_-`5_Jl2ppBIBn1o{$NJ~^+7E?U5F)3GWtZQ<2PUU|ChG}a>4=lCD0D-md;48$=<3eb!s?GW#<4~GIDqx^mV23n( zf6wEH*kUm?sHs~>QE?^JMYH_D9_Tr$cY{miB`R693fVA>Ny64Qa2#xPXWGYQxK=JZ zBE>l0)dKU261!2_P}@Kh5?&MNXTQy*__9MTgPD|%!=QP<&Lgr+e z?z>ufwq}{E3(LzA*rE^+fB}SpnP_KeUe}gWOG#b4IYh6v8F!(G^8r(!o>sFaZX%UU zuKc&FR_z<(!%Fy69X2Md9>bgoV_`+2`s&J$+8Ai)R*)>i60ur^{yFOO+y z`k_~kq(ch`?SWSS5P~s?%E(mM4Ve(s*!Ikhj*p()YK4gQ9Za_UO58uJO@T%zqot*v z!9^oRmZwM@pSRXi+mRr^=-0rJ(T=XEXXdKU?U4?KbkjoFX6s6}>rX*qIa40az5%(x@^-xfD?xg5iNN9-cVDbN~Fbx$*fqK8t1zdgHo_8$^ z3Nl+q2hY!&mOG!Xw3mD;`ywBO;`@oyap+cdPgz;Tj0U4@J^4AjrNyn#WGVq$Sy05n zl>X-@R2WPKHO50jvdZR{Q*)0g|Layvup@6wQt7Af4%%5o^G3i(f=^yUL7&&_<~J?b;51i0pJ1`UxfZ3}z6Eqj839ry5p5Pn zCL+Q<$-kFze~7$-edAe0SNq1+$qCA>_d+>#$>RDOO$F1Bgg}Urfk5H5R?{6AfxCO= z08>E-eFFnxE-o%S8JP);^a_UA_=18m{yy8VYLK(voRk?^&RP zL*0QH*=c?%?_jqy!aY0{aux**Am%wpk(8b4RZs6WHK0s4ijBJqG&+v zN?kUKi0_kt+p5$eVtzTCcD(s!#m2OOv%@uFYbum>6h7~3rL7E+V(GMJ5-d=rc!n4-%A5$FKiyPwDvnu|U|(%x}iB@-v%%Ext zK_|-((lRxvHh(A1>Z-cO*9*>pzZc$4j+|=3XG+c^rSm})q1T}arzD^NsM$G_!u6|) zHUt_(^gejn64OvTL4oT2eam*~DM7>B{P=+I6xZ>LR8Fg9qq2G}$wX7qk>aqB)z+?~ zhR!GN^`9-C#)gmH9V%&8Emu!9S(~RALeMEhZWx*|nVBTAr6hw0N^0MKXy|CV1m_N( z=+A7^HXiRjmcKq;T%yxd@8AASDniR%$R6g2u(}&YA-)Q*5H+{lxl@{v}gKf~j=50N6&IIDue7*WG>{0(z+ z{PTOq$Nc+y$J^U(cB;Z8us6?Hg2Oc|&Eb0Qy=sg|VrGrC|Ed@XKKH&?WxZ{gT|R7H zNOOH*Qc&ua=*CtSmpHD|(sx$S6q|Nw*sE2dh$Z4pW2vtLkdyRm&8j*Kik`(w!SvP0 zc@fs$KDNRjYI01>sEdn>L5r^+ts7nMgdSVgK@9C=k}7P~HZ>PcGQILX?zeDhrKJ;A z94p*@L+bR29w-VHw7TBce0P7}-;z!@>J#!=K%dWq&Ae)os)^O%K7#|G zs4=Bz6wSvCiT9(!JtJXU%qJAnfih=8TQ(JFbZMUAJlFezQwp701sMF6C?K4OFz7`6_jO!i3_43^sv%kjivh3DVQF zO-+A2tX#>wUgI*G7Aj%a6z#fPfP%LW9&vL7gYl% zpZbPifBFm_;XHn&+M0b+ztjB{%Jjdo1&B`7znQWg6zcvf*OHc(Zf+(z)r{h4df5G0 zxj5G7hw0qx)sZQnJz;0ik-2B{9O$~doT^& zRDLTv6n-U_TIt(RadFw*on*5t7gS{X?dl|jjg;UAu%y&GKg9R@^NPSqj^jWBRxg* zoEBECj7q}N@CeHU$g^)xI|_$s6b>H#ZY9O|{_`#hfZOmAe4kdBSiio zj@QUF(TtIgO=cAbgQ$0wp32&?Hlk*3dXdbF>H*B+4qdFyIJ!OA$JmjaRH#JH)c9IJXCgbSxjVNO5)0HcYU~i6ix{S ztEqi80W2ugHIa1;vS&ePXjFbq-+RBcn-}#;y*GEu>zOxbD559!wZ-k1mZl~l3$1WE zoBt(Ma~&Pq-yeV7_qOZ3Pxe){l5--Reg|83>*(OJX#aLRjcK%4=GQBmvoep(oGYo8 zt*2m&FK<4Rbd752tFnLB@}yS7G$Rm2QfXDEuP;BGrBgVL#y{}Q`W-*I{yebqcf;Rv zU0qv4cX^)r2@XFnyQH-A_O_mL1}T(>$(d3=k_5X>rz}a?mdEUlCphqn4;i@-v*TWx zHHRB)R{6%`We+F3;gJEhaml`P+P8T1s;-w0l2S#bn+$#t=T&ph?!|kTj zmr=UhxZsH|Xyk~4PNT$#_%CPgz>HUjI2oMQx$%sX`&QYFOM~@+qFylb@L|6(BKa0Y z6vLm?G=Z-xh7GK($7zhCi?hR4@=Rqq9&PvYgnyT^gog=A$7>X$QhE9KTs8L0YXD!i zKxG`gcM~3E3Z$6D*EdeObNo%miM_VIvB@{`BcJQ1uS8}P+TZ}h%)I5*ivHwPQ1u~*@=~n!>bJc8B*}6F^6jX zBu&|oz1`6DcKx8pT4tu;i$QM`@EwzeOto#^cYAHmPu3FrLVgP_)aGH2v+XQn5@GlA zi1mYM-Vap+CSPDKtt{1rg!@DWe4IfoIHB1nHg1?QiQg3zFK2SHeiadg}|u3GY9Vh+ny%Y{GkN5RE8CN9Da z243H=O{|>vKHPk(yXTz!VBAboF3Ruo3^qPCRixJ5QhZeD$OLoeD!W%GE?XuX0!l-D zWBsismsX|EZ8$zS?H&?{gt2;IK8t z2@YV>8b>B;p;0Yjlmq%|DB_QU4?KBmytN(kpj$_`)TB%c(0ImA1lV~8C*BPDFtaFBFG^Rj&`1LaA z|3bw*lkmX0XiQ0`tk)_3<|Qj@kCpI}4@60~f6@JwmvMv?w+jjIh|iQ9YkPeX>}XCa z;l19USTO8EZm*j))IV6ILufoow2M=cHw2)n*-*qAcicSnjQwD;y>$7@aWW1b_c8XPpPeL zIg4FT|7z3d{5+0Z!>&tCQxhG~z71n$)ih0rUr^8aF^wVYvknw?MR>SOS@Bd}86%69 zS|8OGfkIlk?kGwNC!fi9>z@V`niB^)(D7*9CME10t+}~rjolU>jn0~X7ACs@7~{lM z_9UQA|Dupix}!%x4l;JFv>U?B%~=Ah6wE|uc&$y4o@m$Ic24(0R1%{KAV|4m(5FvK z%O6eY!eMC>uj<4I3Xv^N_1_ZPTlK_6(yseN4_?#MqFAZ-O{X@Fuh7g^Z!Y4Hfk;A$ z`hZ;}P1Mj%q5)&6Hn;T`gOLTMl#%Hhf;o*`no!%q@G(xAb52OIdeLqU6)uaVpfW5> zb!x47ZROo*MxJ`f=*1sp%V<4|=#i|{VpU#_Y@>n+;U(5TJIeTlis}8vQf$Gvf=f3y zNUo(#soUWZD*0_|^KWx+K~iyNOQwh_ZgJKMX+)GZ_UGK6*VSmo6r_4iH;SO-lJ$m1 z6=FEn<+`y!K=guHxXPZ?`W_>X4M!&HOPDrOIS`2`GO@C$vt6&Fy5DSg*O^0TQfxwv zNJf}4q#henfY<8$zL#a_YP-?wx|&by=O<+zhJ&t&MIj%}g%a@U zeZNP%Q9EQ+QE8TKWHhQP-CF5^!3AXf+Fv_^Z07%JM<^io+rZ)dn|hHyF)5}mR`2bO zsdp=9Iuq1NvGStftP1kf{ed2*>rD*jvzOqNU&U(P5^{E)8MU2QUxmzl#3))E*UJBT z3;SSQ4`Un!lmU(&1-PJ~fEqT-n?18LEfj=td|atlYFAV~L^cwIXA8Y0T?b-3uBuY* zh<1EL$U#=Yz2I<6JCN?iMhgzM7#)ZsCT=_m19~YwaUjE3qvgVbT>~9HzurX9%&8Sn zXVB=J^+R^;L@YVZMY^D9Dx1y-J;9YSploH)z$Z3P#CA&gvb?I5|T(^Hd^lTvk0wKbtL zdUz}#FtJ+=kcax%cZ`7iB}S|CL|!I>tUc`;y@as~pC5tqS6^S!f4krTbX0X$*`FhCwQPR}21(&T#zJ)+kYF*P_GHy|Ky3%I-8w8%) z7T}=gHRhNK4&_WvPP|7i4`6)WRbqu-I&zq#X9pI3-)_ocj;$_NEwKLCG8EFcS9S@Vsy;OQQ#2ZaxHj`<3A;F>+km|jSYccEqtQz2n{h_io3f% zg!DdNPf-&w*2zUFCOE)+R(VRf8jh4bi7nUdw;}MRCIPZfCV_u84M%uOODipgm@3;> z1fv%J@MU75D0O33;a8~g-c*OGwYb^1W8q*$t3;I|;3S90M&V)NB3WXsF)U{?ca2l~L!b#*#BTUD0 zJq9wStfoROjIH~i;s!>eHUKpEn+7(Db}~eoziq8oO8QKJ-iyaAil0aXLO~}E@}7|Vb@i= z?2E{j7)VD)Y(^YNW(dJ#tMcZU>|D9qtwl-&$2~kwr3cqz^YS+TmJPy-I?SO?_I*1l zEGsY1Kz3Ow>|!iofEAU48!L(pKU+m##F%vjiBX)<7FeU!SmK4F&i<`mYx9a$^SbZ%n*Zenu1*sRI zXAwv9mna8o;zxK~au&3FCv}P>GX29TRd_Vu#zpEVqX9nWr2gior>DNqas(LX=Thmr zBz(};QR2Y)507CoK`-JGx-65qfc5ox&E3Zh_sQ7xw((V3G4>ESdzI#&ng9>W0Uu`{ zcM%0KkbRZ>(jixOWqEY>=l?_tcs@NLw5yPZmv_4d5Rv~e11OTb5}L*Aq=02;83^+O zqxn+aiELuiz|kRy_X=1u0s3dB7O8HLv9=l~8IDbo*228CwsCpY}Q_i87zp?4@2-Lwk$sJ`u820Ow>7u;G~HxVB3- zVX_>Jb;3x;ERZ^K^%N9BsxNd$l4Eeo7{xEC9IIhcY8C@C> zLnAH*T3YGI2sv6H2o6Q;GyD+5$kgcLA<;Qv*<#O$j@vJ_E$-uspX2I;-cqEN|L1f-%Jny zc^pg=G4@SOWM&rV%J#fm8-%rinaD0asDv=?F5HLNt)CQ14w#&kpG{?;wzLj zT>Eunb2klpO%c#{VzL_&2AAS5K<23BzLd$-^D*)!F zF4T-3@D3phCx_FLmzRg57hIQO2zXh|vU$ieJ&4Vad}(t(*WWqu_oTEJFuMT_%K2Bl z)a->WF5;acPIP$eE(yOFkgQ*NF4dTQDpABFbx~GTjj#WO*_(o0QSG%u7~|T2Nu%iX z`zUtf{@VvbQiF0*NV?COeN|Fe2O;!JCd-i|3DW1Wr=f&C0R|>Plf?G0&`^|zX5S$e zg9@m}eQSK=1{?T(lGiEJTEExyLY8*FQ*PBue3D>cpsQugr3><#Vr^wd*fY}eqf6-gns{e&yYy>XcJBgr! z-^rrJsV0doKz<#A)2pncIi5}E$)d~quL@J88^|Ll7+ z6`G?_s`*(VjYGx;tP2!r1VoRGKI;&tsIBADN_lvAc$I5kfRR*g+aI2ztJ;Q;QM48P zQ7cqDZJUY(c+r;y?|0^UP#MZmJ*6;n$M%&agzL!OqXos_TEegG)pp=~t^REsDHB$N zwv^seD3{&mblF<*gvh zlm4&Hk!d}APYgbLGyZvz{Ed2Ncit->j`28e;>X*)euaDkpXzFa75SJLuGNvxM{iKX zGLQ|WEM~53CiLY}aUVNt>k%L%PGaGK#mpfNY)L2_hY)S048A$AmXp6;v-MV7cUS5Hr_)X77j|!BYz!+_b;YLlvCm zSBaL_SbH#fF&zTZ)zkNzWBt3}@1^O5c}c;71lfRC0+qR3Y!J%r4s8&vv5L*+jI%nb~jo=Mv@JW3jm;G3(JcuX+lK z`+hBiIc0=TM(qwk7_(Pxy7OLb;|t6vSwXmJ=jxxHo6{F__aof8bSS z@Vncc;~`HYjvUzAzm|s=CTl5kM2qccF)OeTbiEPyC@rup`dmUQHQqdt`PG_FOtXL? zon*GAd7dFRSU8#NGS?--R#sL_heaZFWb;s#t?cYGw`f*=cHj*uQa|uVM7Vq8>1|*E z5#JM^zh1LqT?jxb?Tkn;LO!WOe#&J(C z59@jdpo~Q0(>33@rT6F&z$R#&Rh)XP!zUQBJ(>>X291m$127P5l^v|t1X+i&mY^PC zg)keNC?P2+F7t$zy(eFa&m|2M$qqduEr)2{!y+_eX`A=GMmF2#JTAR#oVAqA?_k7* z?0ZJ{9*6tszc(%&(O-y!Tn0bC+E_R8?rD+{SUfsHs-JLtz&v*eg~{(i2&&C`5W132 z3HtsAh<+1mw_V6#>556;O#D6fipB08Rx!64zNQ+m`s*`x;BF>MnH`>Ur=_RcqP2OS z>1Fl%-WMS`WL(K^jkp@VZ@lgM$4L`fyy)B5lr_A|3Rcw++t%rnMfmTgq4tqw?2mO1Z+2*d=9F}N>$I`4Ni=wO~p zz6!nn?-rp4)(7tcF^2(v7|$om-x)%>aW4qSb48A}KJ-6tmN(5h?~4*3QVv8N?oT5# zUArUU+TctcuNw;}W?D+huM3lthCyZ_nemeh?AHjP?hh7^YVDwCqi=1r#w)J5 z#Rbo9G4rK)m&NJ=9a^T)6I^t>2$5Yp9t5G!;qLYXZFZYnqICuboPK4^YB0dY6vz~v zprMK1dpT zzO(jk^}1`>eV(h5T!?#SZ!q)T^-Ow$FC6L`{_-o+o7HpgXnD5>C-Xbi&;XSW7e`3#!9?Xz%g%*Q|8G;G#z$(7HLx^uBv{%4hxt zoMMaza*-F#ymfA4Dg=;#)flAJ8Ov#9xlYVh@#JDt!(y z+d++#(f2-T4k4zB;6D1M?;LZ>t2_U>hyI2$X8kO=Yd^8jdS~Z#T^un+xc@up`y=Kv zIWrnRi1&iEb6c;1WagtfY@3e|;) zh6cHtj0oPF6Wo7jgSilo1{!(1oYC*5GNqi)K$qrm-(VNebZAAJJZvRam(5u#peQT;hRJ&cicfUx%uZ_X1v75BX5a|633UZ2h13@Z3X5LXPTvf0Tq(9l6KFFFsedn2w63nRcmR5@my@=i)ZA}F*U zg<{`M#G7Z>t?s*PNHGka{l4aB``?DP**2`qz>>|SZJchRVm#$R;--~yKXN!&PL4f^ z`3!8wN(=i;pkQ6=@ae>PT>S%wN=k)x$aE8KKw+{Hm1rK#G4z!NW{JvB+)hT*+c=x% z8F@W-0_n9WS~n53HvR|v$WyqLq`Q4qyYHc$Yo_Xu;Na0OmuRvNwZ8D#!Ae>}!m?*# z*So6Djl@8*j*238@`8fcK}BRVZy~HpfrL4VgoI!TC@w>3kf!f$Nob+}6wmTNc*a4p zjgX8cM0q7;l{PXHV>=C>3-!-*bk2MLkc@%`yEXmTSfp{}#*foMp|fh=p}^>P3ENv^ z;TD0Udi3n=U|2s`qjtC^Nr`SAl<5zRaQnHJoj8xKk2(!IA9g7TK7$T@C|D~{V`#2m zl5hiy^N8hKFv#qtV__P<=VwfA;ecHxcaH|slJk>W?(#ois-6(uCQkGa#&V!=RX)@Y zHBOAB?YQ0|!bO6yln*?rLLJIqBXNRZiPf7cFf zJhJC>!%Tvt36YNO-hQno;PX$0Gnux&^e1Kw%y{mtcosFZ(!|PC3vy>@*k#}1h8{E9 z1`Wv>T=lIr2{8H288rKjm3Dyv7iR0kZ~bax?H*?YKa4|Xbf&3)XII-ZH}piz1opnD zt`LPhR3qvb7bx-{x=#@J`9bWzt4$d3G_gNu zmtn6zgdlV1`mvW;Tk_|I*O3N<{U(nTu;CoPT5i|6+Tg4g^zFmUMM~#N*a~3m5gCag z6F@sDOQVlMV5nqDdo4rw%g3D6Kbw!kGvT(}>n^#Fv>%0k@~hoY74WhOSvsdhC-QSz zTir2Oz33op%IN*aPQuV1q7Y&>NVELM$@I1n+srvER7c`jM*7yurWIkqlPQG3nY`zF z-nw368y7B}<K;P{@=B{K?ZB{L z9;n*swnC)%#m9-vXGowK$v;=+M}@v98dTSwljZg{QV9U-suioF=*D4YFlNJ^-$+$9 z@c*IY>NRkF35`bq;jE^K1)bRGKr_NZ`lU>ka=Z5Dl&=;^%}(VW1W3~fMm;63Nf2na z;&EtE^CfN?&7&;auNG1KF2yo%cXK-J)^(V6se|SVh4W(3e2{~S1#FkbhIT&X+tm^~A@f&RWiCcM} z!Rv7`2i!tt+jBG!{tA8vr2ih$IS@l9fMolJza_jgK#|s%W{h z4pkC*t*mZs?WTU0&)?Hx45yFAd`nUC+!D5HH7efcV|w^ z0Na|i_Y*fq3g4+)%gEZf$BO+>d>>!PeQEdaiqEpt2M_fT^Gp)USH`1whko z^r>3`IS5iDa6Ka|g2LwjxS_(yS%3PErBalUM{3!Q)VLH|lN%l3U++EXlKzpJn(cd- z4LglOEMz05m*8K3am`@Rxm}X)b3uw01xwn>f*eQjxZV@DJLDbC(tZKPVPp$W)2~GJ z1kh&Hj;rCUNTG*`u>OFv`;$Wd)Wme}Sq|?zMm=5KdrFe|idV_$6@ULimrIGL8^F__ zN|UF4CI-C9z>TJzaqn1Vcy!EwbKw^~$HzP%uwx!O+bp)``N~o`=6^gi@CD$tHPZ$K z*or08jhOd>-odyNFK67_^w)8(y9b_5?jaX?k`@*zvQ^!&BH|T~%iMSVO_t8s!6@@H zBKJ_&2L^xqug4nYRAesc>G^C!m5m&g)UAk6$%Ei3w4FmTWg}AH{?s=750fVDIq-iy zd39>@tNEmv+G3&-rmWTGDzZk*Qt97Y^rLjW-B#^1GO^UiwNJ$lDaNh~9-E2s5rRW6 zrn4-c@zP?R`S|sy8ILs4oSE^xOPr>abc z7EO+gG5(Liy^^JRNAYvGA%m^SQZHJ~5Bn4x0l&6~6AT3u<)HPz$eTy+h0fqFF6z9E zl{WBTt1$4s_H#i}F(CE5f%Vn2={PRogg>e^KOxhRa&k_8td^0HSvL234}1AX-}mza zOle~8Ag_X(D3x07W!rC;g}w&L5* zq|gG8%821$dl6Y|zN8Y^!i0qE1DVp~S)X%u|Ef8GJtRU(I{>r5w{KB9vIH%O%xj`Xi^Q&;P9HYZywDT^Iwifvf&^=>7_TeN6rLV6-)7I=0Z~!#I)=DKtz* z%5bb+#GFuH)`2LgHCa*LM8tR^qNqWz`-TyJd!Z^GTl?WuiI6q6U7im<9$wX6Li8m* zy40CI8jm_F(x*yYcQuSk<^N1f!oNRFgpq1oMjnp%L8BJ|9U_)XS(=Cq0?{rlX_J{c zIMSS~#imMC+IFY{P`-Q+>3VadlJmRLNav+2B)p2qyBoCb@2HEGTZ_H z+494ysXn;*BxMHSxvl^5JEQ~$=J=9>^iGD3uVT7%gb%5nYW%VrUsp3o{k+{xY)y;N zF=19WE`$ul-dfIImwkXk5EwX!=uD7OW*}E~;pf2m`mQzHVLucxELg#-U;wSev$RTOjIUBMukN7KDg(zjR&=P6{9`RC z2iF4YHU1vSY4}TJ3aU*nVw!oN?@EMQPC zYv3*1`>ribB1^~T@C6dl*8MMODe^#q00~tJX6mVlg`XbwB3BqwzwcKgaD8wV-Psgg zmhxkBuA!?doaTb&yx=-#>Q(AL=rh4WaFkSgTWc#m0tnOgw*m$~Jo`H*oIfwx)W@LA z;|}A!<8yd>Zk2XS;8sEZVMfE&%O+S=nPZhz1_j=R$QZ*d!xgXtw<7cTZ+@;e(4y_j zA}QY0wpHL>h;+{eyUwp<;E#u-Y;a%E%E`-zcN;ZCy)$=U7L0fjk%12-udUf6@R=bM z-e1@&^Dbk7Thvfj1Re!_g3{^XT%i(ST`)hZ`{!OO^^lRE6w%ggDhiy1>wj~DCup_U1dH&s%<9QoabEiJ c9R}~ePqTKkj(5H){{cTT5{lv#VupeL5C7kB0RR91 literal 0 HcmV?d00001 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 + + + + + + + + + + + + + + + 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 0000000000000000000000000000000000000000..1b90a1f65ab124907828e2af525bf7b2105f88f4 GIT binary patch literal 40104 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 GgZ>AEqZg?F literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..ab1b36fbab3381961c70741ffc084df1d20dad7a GIT binary patch literal 3747 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 literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..703c0013a865d2850598e34bbe36613d816b5743 GIT binary patch literal 3096 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 LC8kQ>?aKcFh>A-A literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..10c23b62b78c4f39cff927a99b5fa5c7ddb12a84 GIT binary patch literal 10926 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 + + + + + + +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 0000000000000000000000000000000000000000..a01279ce05113edb590f57a10263f784d9335739 GIT binary patch literal 8780 zcmV-SBD39zP)%ragLtq*@*1soh4oa8t-I5;@Tad2>OaFXNT;NWOibm3Ldc@Y>G zC{wAFPLEerS!5+8C2e;7k$2rGd}i)H(5&-A6bhLlL}B}0Qeq_cSk>(7AwN)RHuJ{k zB*)Pi0D_x3d6LuP1qFq&ZC`!eX4emML9mW6bH?M1(vF`v)ohY{>Ebl8E2&bcWO1=tfjEC5Ww35A z^2Ekyh0naa{ARh6IA`~sy#f)%#>UtP4CIIJfcQEr$+7pTAbD_a#l=QhUVgr<96Wbm zpqwa9m5pH8`wbzk^SL~O-8GO0Wuk19;V!XqaFXL_N1!u9-J!#RR08FJLOR?-bYAN2 zW*55_Tm$)7!WlDqlt5Ij$ObCzvoE#?q&jiJIDwpS zf0VQ-=~5Mk`vbWl4N5h6&_LlC5gVk$j56@NoZzGZzJ!FsDL^_PGOx)tQlH+g>kXl+#3ILg%IGNul z7A7bu;$}7#JELx(*~NKcx3no@01581&Ze?)KT3>je(Zxp1LbnJpW9VB6eG6gK2tMs zoSQ5sIS%(bjn>mbdTH!c4UNk|!8A4dYPPBzg$rfoE*wpk2SlWM&=^l-#2a zPZK&gWLdj596)`cmZgiop#YzleVM-y!miA4$FylyPGATa$;>%WjSSTwHDF~G= z`GC93uKRNrzgQI`CNQcjBZL`Y%q-(OW`rrp3VahgzezKVpYXtB zvK!IdJbr%l9h=6`;O6~s`bSws#dTT5^$LNcKyU?x4esKF3m1j+>(|#^5`z6TH8r+! zDk>^$W#Ic&lS!8I^Eu%YK$$H0IZLDWSFa$APL-!{O>(a&9|WvFddy+jejsFv#qN2< zX}EVh>vik1(`%n4q*+s2V|#8~hdz(E4x5Q*NPAu8R@*l4<5l3hSiSbWS>$6quL(&b zgSe`rcr~;gcudZRK|0R{84qYn9m{zYaFXNj3{UbZkhF@+;MKrMj>9uGhfcJC*M#I? z;sX#TIgZxD0vTUyDmjJCmyK|e<7hoK2h}i&6P=_8jxQT&C-B+TPK4EK-wP!l`1N`+ zuZ<2RI37OeD3bf?>$DGemH0MlYis3|m6i99Pc5&Fc7^4pn{G<&(xr=$S4G=n@}!AR z(|x;NJlwcZ&1vz@FH?-B&)x+!R>J+?6+79uR!O3kG~;&Zy))Xfsoqeq2Wtu|}5S`*o~_-cJ{ zCCAZWC@wAv3JX(L@S12Hl$KtTpEz+`Q&whHj~zQUblSA3in!R=Zqd=vL5=Ia*pi>0 zUvd2Sar1Y(cA3oPGGk(5(xqO#diz|6g0GX~=r9dv?_6)2GcJe)!R)ojcPC zhYh>K5E2sNGs;fnu5u;Uk%nqC8iU&Nni`F!Lr3j*-hNA4US1xUm37dx{j2T90|zoq z;o;#XZA`3DrQ(Fw926E7D1Oe#iC?(zCGF^Dkef3M7%)Kb&O2`_2-!t0U%nzVsC)3a zTjJw=;@25&FCod;yEon!9$XQkxUSRPeo-p-L+V};;McytDJ9p;=*VY2f8nB`f4_vJ z2OpfI#s(KED=W*iZQFL^!K?!&wVDu~R%=u$m7MS#AU8Kx*)z09(pTHJ#RUZgwaULT z0NHKWus&(++O?s3Gxp`&amO8oPN(G7tXZY=1p~Qut+Z%o`gf8cxxs^zgQib=s9gt; zmzOTa5UQR%YjZlDwL@xY)>qgoOC+K|yxwAwifgz4Vgy zw%c@yH{N_xHe~29uO>RTm0V(CqE9Rky>g|f?8c5X$=pv(P5ZBk@94$fXU?285_i?y zy?ggYHU+|)JbAJjTTxLx;ceZv)tH@q$P}guGe!03W4!t1n>!`p{qoDj(1A&b4hatR znRW0#`aOHT&v8|TUVpR@8+MbE2WiIMfB*2FJwxr>-7#ZElkau9Rjb!ph{7xM4U+3r zF}XTPJ#TFX{IF39&!3l{Z%9f^OmcOOS{){zGG($FTTxMwKzLiWZZ+zU95yLcDpOSN zC}Yn~LU?6mW%3xUHhIyaMU4m!b@Si<{cN^2Cia{=Wga=AFC^R6hkrX=H)P1|I(woU zqbw{e)a}~+y*WHQ+$(2ZML*E5Zb7A&6D4de!#){Vm2v{?|N85%MvJBXUzZ~d$FPqy z9HaT!JeMzDzC_d6JnS`qh=_VMuP{C!2QY^?G6C)ai7Z z8BaX^0Ii?D{?Ff2>3NG6y_7=h;!yTs{pQV|>FKdm@4Pje?msvG`E_)kElzkh#L zPE#ajPk3rVcvIBa(5d(DCxo|Ui}C1gy@|N8rd}Yt&`_Txyo!qQxJ8Tp9_OrXo_>0E z@@p$!uSrfG?6!;f>88#4GiQIg^vJ{0@27ndm@#8U6_f97n?z`_k zC9w)!5Q&7?px^*z2%)*mO1zdkuSs({WjBdW{n|P@K2pV{#4m`K!^`jfge{ z-KXh9pa#%%`ki%S*kdf%bhbRHJpa!>=NbkNPEPWq3=rN!Q>Uu2f$-A5+f|X7x! zl#`R2(dm@j`Sa(MhYx29vx3)5rf!pTiZK&gk>(4iC+%TK{e&tG$<;s=IRoIV!f0c@4ma{Q3Zjg<&>0^7+0)#E!AW)`P6SQZ@MWkYTddI#iYz`M!7ZZ8J$KHGcz9xBqD?_2Cnsz5M~`{ce|_`#rJ1FrX7jac*UChr4t^IW zRCaN3v9YqU$|6p$s;aUS6&2fpm_2&*2o4FUAIZhX)ao#0U|^s?au+ZDa>-F1_B!^l znuffTo)ezGZ{IlO#EBDz(`Veg`E%P0*JF=8GMv^Y8C`Ss z61R^Yd+xcpw#k-NtJdtG`)qkqdP!<}`gb{=kX&J5p=sH&6{%ORUiHbhX$%=MB$EA3 z2<`{A{jhlY&wqY7b>+%eQ>aZ)j2kx&-*t-@|CzM^Ep8EAcJ>hiOLD`9-=TcxomKK~ z-MU%4ljK@3vL88eBxlWZA?my?rYq|bucP(n&VdSzv$ zB_kul_KZ`fPPQ;A#>^fgBxfs+O=ruKQp`%P*BeX8h#5jgt(N5f{PWMDIuzmI;Xe1@ zu&S%81GL&`g?+!%7mC{tM7MC^;?%$W?XM1r4vKE!!bP&UxW3IMy42KE!|#7T%g#&c z(C$DRcamHSMs{K8f+!!mu(g&^PHZ}q44bcxc@KW0V~px?mZ#QdS}#y? zm^d+(lql#vO}AL8186$^PWLOy%jN7b7Hm3Op447t5TcqZmfByNXYo=>8 z>FMeEurRex5nZ5Mt`IL9Idb^0!)GimDzg0P`4>{({Kp$9YPH&q=*Ev9uOwru?!^~h zlEuWtG@IxyT)1$lPoF+Ep+NS7E?&6kog~+iB?SeA1h(wLW>+s?zGAt2`BIf#Ck+k`=-aoi&@j2VxpuRxG#zO;M)O2OLPf=(QHU?&;Bl%#tNb3|qHu(-ZaM6GTT8nC7+DUbV$o^YZd8O`rbT)TZ*OluG$O|Mkz5 z-o1M_nsrS}`^Na}v(M_4N@bHow|Md5;nSu)l+@tD?$9q=woEVOIy-t)?|62V9B{iZ zkPIanN1&wENUad!Nls2yxO>c5y0hzuVKC&k=s8;(m6erJFa*gN=fD4*VVE*yibu1o zD_5@6n$2d}nl)?ifL>2@{rmT``+oK6)o#sfJIkqwR=p;=~Ec%E~u& z)22-mx`nGkx_7sKOG#edIg1o+#~J)RE#Su=f4sC|!v?*0L%NKkMflzCez(KV&u<+z z?6Y-E)3LF2j5=qJ*~xV#oh?s__~3&Na$2LD)vH%)=gyrAH{I+1hipkniJhkuA0H3W zY1aGW3JVJ@BSwr!J%9duBeH+!p@)=PwroKiXCo)(auon83k zlTS9H_4Vu5%Wl2()=1g`#pl%3)y<|Icff!FcGCOw>C-95>nfk4V~#+};?(IKz~WWR z6suIKMvA?nqQVjs6eM?t=|Tyb0H@Uxy)Tuvz!(eGiL8PSdej zztcPl_L!(hjid6UipJZyPVc3IiD96BaCC_3txF=H}z z@7^sNJ$iJr-=gdbiY_-d*T|}{v17-^efZ&rKVs~2m+0J4bhBsAj(0`2-T*(beKnPV zx{KZl(wGOgZQF*1s_ICCmx3EDj@?NK#l^*s!ewO%jy+C@?jCoD4wyG@p21s*j@-L; z)v8tZi&Rzyu_L!*m{4Yphz{7gb*qsOo!&}x>VkrT39OPM_i%9j{Q0N6pvs)G`o7WaTyr)XY(S%1w;_=5H*L?cvrw@qhj7=BcGg}AZi5Rw>SjEPcCuJo^ zJC`GZ^HkBzoH;XR`c*-dNmCj zHViL@vBk78s9WXY zg@xTJYvz)Y<|;Z;uc0i#0WZGzqTU;Asm)1_ohfY1jh$KaHFWmbRd?Yo(Pd|6pF4K! znAiPN7Ld~7#f$Bf6o_cwzI}tNL>JVOGMy0}3wR3NSZ6?&w!Q#6Q`nmD_O(0Bt+UQJ zyV_EsYtF2zm$_VxfY{umNt1He=j_+7Ul54ysi&R_Chq5XaF@G8M_ki`85tS(qAc-o z5MXoGq)HW?Zg!PI$}zciYkUdEF*RW%^;S2v#Yzr}!xsz% zzXufmT&5#|*Hja?azuMxQ%XvK#w`}R|F=FHJIXLg&D z90vzSyI}C(!HPHDcthvznn4zbQ@{TD>w0hdZ7L@@4vtPncJt=Viyt*=l-AKAUor5; z7yP;ezZaHL_=b}l2M0%!K+KMior<{Yjbe7kjvX@+ax;4Sqyi^74i1ja3ciGdgM*`U zfRh{t2Zv9i)qd6$8roCYwQHBaE?v6Hy9Wm=dDTiAh5&UL)-T zIYEyeJyh855!$m;zm~tMs?uC}{d!q-^^Gc%>1vxzdUWxmvBD!Fv^_(6YJ<9W*ZBMU z%ee`A5!7niZf$L?rJ}sN@T%#m;mYO91`7eNpw>fJSeQnw4v#1OB(iJQt_ofwj!|Yd z8`{DK-JW;=xy8oD=|X$eDAaA|g`9iOqc*G?$hd z2=pF!87-S#jfsg(BI-@Y$*pr38W~ab`T2RLcx|``gl^*c_Pr-CFp!6BT4BJ={W+&4 zZ$NQMaw(3^j?`#+j2l1k?_@;c|JtvU!BSOaNKfDS%B8}>YrHm^#zWJ8J6ow#J-}!xdR1PuGSvxdG1Hs*6?JFGZH`uQCnB=StH=oxhhoiyI8mHx` z$9i4`?T*RB1}A%}$l(IqJ{sIqEw2e_+n}F=h66)x=XJ=@1P}nu=;S1q?=H!y zR4UoscQt;?eO|snmY0_=D>XN)eVsUA9NzaPJCuEdTbpA%No;UKOO)J9DLqB6UK&}5 zLea=jkRBN5+5ZO~dDor7*3rQ8Or1PQ`1B&o?99E35ZtVmsJOsDxnR3ML1Ce=Raq>= z4oAoyd3d^=4fN7zyv-)uM*n^Zve=lIHnl;2QNv-@VzQJf0iC~p{{-82RLG+bPa~t@ zowBN`Dv!zzQz?b5qd^THpI(H?vd)bMJ;@AmgF?fW_RY7l&%W4Vvv)dpulwjC`|4{h);kuVn4s#!F6%w5Ss2{X%>4%h z`-ZwXe&VD+c*Vrlkq+X+vDldUK3z~yXzK&$7sH0$ZaY?0Wf6{{Oo)P!BS+Z0p)+TH zBIRWX0s&=C96we_!!u)!UY8zfbW5*lQ}SYdzHp1pP|4wW1m8zVG8aj{XB zm!EHQbOZ1!A5h(aJrHjS#qUq}O?k;LR07hB&zZ29!Q(0CysRwFv|lP#`-V=AH) zaV;22F}V*~HohZIX{p&R4#UcL9LN2OV>J@%=$($_th39lzJ8S2237Rbtp$b-sV9lu zg6&&u>Ib$9G6XUR4K*teDCq;(Z=sF<#$A$=?9u>K z8Y&F3o+T|B&#JOi36+Hgz-WL*MP&!d0|nV{D`&zu{1aYV8uB9+g8Voa`Oz2{NdYuE z($D~CNbIwtD6WA~2=|1ta2&^Q4hRnShJ7?<_TeJ};nm0AltP)frXvXtL#QvKJ|;u& zM`9Qx>zrtle&VW=(?OJy4;^TS68i)xQk!GR61EF+qN)n%IJcfKV{Byz%8PM}L5vvG z*?yL`^IKcFuy?A;gu$5fr)_&0uAhBaA&@E3>HV?&mYxS!UFc6%*S&>s+g+99uNzpI z%vL;Y5TwzDOdd2)sNmx#PRUM?4g0h~QRyHT9Ao2QAVd%&lotpHd7z#Y)={f|l&d!a zT0TBOJeipX?3CN=KRhWMW7Qza`FP_d;XDu+?m>J__JtMo?#d~fn<8bGwUd&Zwk-;E zHOT;51F;|;4ZF!EqyT$@O=I8`dmr`XDFxeQy&iZfLx;!&C1@kL!iK!8m*Ple((|dx zq~uH08VlGxy+3ikZO;M6E0i21I8-bp7b@pbiDyZptE>|UaQ^^|M8~Zp2Uir02bUH& z!KflM0F48{7*MvL&U!V>Y=OvFW23GE_F-t$orOZg$QdZNpFp4nN$**FP28J`nE*i< zRMNK~M#15wU_&B~NCpEXlo6eg{P>ei!ZEo7CafIA$k~ukM-H@J@jo6wR#0jn3J{EV zNeLQ!7)i&LJSa&p2#_5J1SA1Mf+DIX4x^o0AfBP6$1p%H@GJwa5|`8jQx^P&Q(1G^Wthk`zJdiLTjO zWS}S;qc+OMIzG%o@!4eG0>}q3GrA8ugN^Olfj0vn1`PoqOfZZeC)he{ z2W26y44Xta2Ym+na8aoUXf5{C1S_5A7-?~r%XjJO9){hnzVV_lZEQtuJj#MO_Awr{w;}$qZ^Pw!9hqwbBQ87JE zfyTrrigM^I7#+>%B4yV`k#BcR+;_iz2@Z*t8U=^%K(H8BN2dn0VMU zh>z{tzZR|qn+BP&_AI_XIw3)AJliS`@N8jiJg*}qouQ@|hhg`z@Wj2X|edk=rZk*|PudUxYoR24ZZ)7he7kdHI>*I6u$O>?w% zO`JyEXlHNYDsZ9DTDUgOw@3~ZZZ5Ttp<(1ugfyrfR3Kd^Co60mZ=i}RTVy1(Y?Reo zSSyrox6X|c9!5VJ6y8Tjl^w+p`~|_`8ixo0qdd7)Nzz5jYycK{Fk;g@AWNu1N_IGo z(U-1+!n3sD%oGQQ&qMMg=V$}~39&?keP`>)Xgm&ND4sx|Wh32HEC3|qjA-bLtR1Y^ zp=z)>dD!!s8htr9IDFV$bq8=`5eFy{ej1a-TbqM}lbmk>>IgHla5p{uF+T?f2PZkn zfxCSi931|<3OG18ILUEvaBy&v + + + + + + +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 0000000000000000000000000000000000000000..f06e3889f4cabfef3a35f72baa7e49eef14e21e1 GIT binary patch literal 128248 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 literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..168749fd065e39c990cbb2e4b8c1673424bb5bd6 GIT binary patch literal 102192 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 literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..10c7d8e27fca2914443cb419e03d28d3e7c57583 GIT binary patch literal 249 zcmeAS@N?(olHy`uVBq!ia0vp^5anMprB-lYeY$Kep*R+Vo@qXKw@TIiJqTph(ejM zo~fRNxphManMprB-lYeY$Kep*R+Vo@qXKw@TIiJqTph(ejM zo~fRNxphMhDirU8-pXOv%RR`mq!hn3=AcYGu$6` S-)sZg!QkoY=d#Wzp$Pza2}J1t literal 0 HcmV?d00001 diff --git a/client/iOS/Resources/icon_key_arrows.png b/client/iOS/Resources/icon_key_arrows.png new file mode 100755 index 0000000000000000000000000000000000000000..56c91536920dee4a529f410411d22642dcf82736 GIT binary patch literal 317 zcmeAS@N?(olHy`uVBq!ia0vp^l0YoR!3HEv_nU76QjEnx?oJHr&dIz4a#+$GeH|GX zHuiJ>Nn{1`ISV`@iy0XB4ude`@%$AjKtah8*NBqf{Irtt#G+J&fW*wa5h zJySgkbL)m!prW;&E{-7{-dnFRay1xmFdV2|eEn-r+|AipY;BglbNxD+%=(vltUa3i zK6={^v;TdI_4ocNUDqVQkivPSvB-n@lmhpI3A+^&6h*?ge7MRrV|W`IrX6uQ)3(5Y zEl`m!Wg_DwhF_6J=kt3Ld{TrWs}=tX-wWF+^y&MA@4_;(G84Oa8cG)NEMk(GD3>;u<2Px&oyJk7vz*j~sy{^_0^=UE2YK!-DUy85}S Ib4q9e08VLdSO5S3 literal 0 HcmV?d00001 diff --git a/client/iOS/Resources/icon_key_backspace.png b/client/iOS/Resources/icon_key_backspace.png new file mode 100755 index 0000000000000000000000000000000000000000..7e9d29541ccea870a51d2b0c36e65120612d0782 GIT binary patch literal 583 zcmV-N0=WH&P)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D02y>eSaefwW^{L9 za%BKeVQFr3E>1;MAa*k@H7+ZDwoSMCgVv&q1{HKF>+m3TFvSA z`-&{fxA=c!W$Z5ylZ(2pPZ{hqYSmESPLd?A)oNWX=h?PR>MXL^tXHqs_qjj@dtk7$ zIEe;>K>1-yvWH>}? z7$!Ap_&~!j?g@tED^Xam05n($=QSlL)zCEUm;<9JJ`k%+3}osMbSL6Cd?2*{Igccg z)@rqL=G#xy+2%lhyA)75kAG>aR_BHACg67i|;~P;2 V$v5`@zbya&002ovPDHLkV1iM6`fC6H literal 0 HcmV?d00001 diff --git a/client/iOS/Resources/icon_key_menu.png b/client/iOS/Resources/icon_key_menu.png new file mode 100755 index 0000000000000000000000000000000000000000..0b444526369335d666af5e2832a7b400ea8b3060 GIT binary patch literal 606 zcmV-k0-^nhP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D02y>eSaefwW^{L9 za%BKeVQFr3E>1;MAa*k@H7+8Jh?`aE(!W6WQs@%F$w5J|iy%1FW)(s~1i?uPPAytNOVL6GC19|5zE=`S zqwO_G4?ak8_rBk~cb7Yk<2aar-q2%cBY=$B^C$)5m;f^O+9bDt0}Oa&Xu~!e*MLn7 zK4fUw55R4y#>(IkU2i<PgtNzs5Fic)nYp688DrvsTxhCC>%+5bS)>GemuZZ?}>7zRj^1c5-{0lgNT5GP<2 z2kbBuF-^`CMFFeTYBdOjLLb<-WrsKcr?v$gb`Wlx2BmVj{0pFmcDoI!REpw`P}4Nd z37Erg3k(S+AYUjH1_1P;>pH~aaq^{u@DE_rhH&<+<#M?JK)qgvL?S`vv=it30>or8 z*#|Tl4QRDmP_0(U{2s+yvvHP)7WkN<6*G7$91i!2#UccQ!EQR8?!zc6?B5***vAgm zQL%2T)eAnWDEbGkWLXAPRRO^ozQ_EQh~iIB){Pd6Mx$Svra`4rp)77Kz$C9sDVxoL sD2h6omn?wai{E}H&!FigYKhE$0GN1ObjxDoHUIzs07*qoM6N<$f(w!N@c;k- literal 0 HcmV?d00001 diff --git a/client/iOS/Resources/icon_key_return.png b/client/iOS/Resources/icon_key_return.png new file mode 100755 index 0000000000000000000000000000000000000000..9311ad17146da5ce7e5d6336c9154406e3be51e6 GIT binary patch literal 265 zcmeAS@N?(olHy`uVBq!ia0vp^5anMprB-lYeY$Kep*R+Vo@qXKw@TIiJqTph(ejM zo~fRNxphMLUdv$+~G_Vh4EG zcM6Fs+-5(~7JQef~&e)9_h4&tw^LvM{*AXgWQV=^1BzdoCP|9!PC{xWt~$( F695o1RCNFV literal 0 HcmV?d00001 diff --git a/client/iOS/Resources/icon_key_win.png b/client/iOS/Resources/icon_key_win.png new file mode 100755 index 0000000000000000000000000000000000000000..1ab7b2b46596e477def36166b29e9a74f7dfe7c7 GIT binary patch literal 588 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 literal 0 HcmV?d00001 diff --git a/client/iOS/Resources/tabbar_icon_about.png b/client/iOS/Resources/tabbar_icon_about.png new file mode 100755 index 0000000000000000000000000000000000000000..8d03924a810bc5a6edc3a0c3c80721cbb5f411db GIT binary patch literal 390 zcmV;10eSw3P)EV48vzJ`expk2)uP4>?&>BmgIR(JSY@P#hYSgjY-8t zaa5dq0^D<7M-&dxE%aCglyF_`NzAdZhbIe(yMisS_BViK&r`7``%#02GlL$|^r2Iv zz%DSa+GaxMc{ZLek*A~9|951*J{YUXK#=1hj70@^z*YYGB_C$QDj%U zh$4ljH79Jdqk*wErrGH?(GU^w(S^ah-L}WHIjE}&&~nznJ(5Wb184*btpWd1>O;bs k2K!Z^{kt6T+42!!0AM6U(xnh0i2wiq07*qoM6N<$f=iC0SpWb4 literal 0 HcmV?d00001 diff --git a/client/iOS/Resources/tabbar_icon_help.png b/client/iOS/Resources/tabbar_icon_help.png new file mode 100755 index 0000000000000000000000000000000000000000..0732b7d15a29fa1d9252583178a7afabc8c6324d GIT binary patch literal 471 zcmV;|0Vw{7P)yK&l0liv!PFVf`s$Cv+o0vuImJYl2{Q7 zVro4bi9PW|RIbHJDIpo*3-Oz{b%+c6w}lgJo4bTu4vr8`MLbeC`U*KXBC4f$hlbO^ zf5i>7#@=>NGU7dwoLJ0olr9`hPK<-bW2gn*h&SR7SmN10T%(G7PDDawS~8L7&l8N{l2vNpq|WgUk{ujd*##D z2X&+fR|Jnh^E~%9T8%`GGlWMp-bZXFx0v}Ab~JiK&A3?kK3)C<7yxN^SHq0RwgLbE N002ovPDHLkV1lO-$D#lL literal 0 HcmV?d00001 diff --git a/client/iOS/Resources/tabbar_icon_settings.png b/client/iOS/Resources/tabbar_icon_settings.png new file mode 100755 index 0000000000000000000000000000000000000000..04578f02c43d1c3f7ad436e7d7bf34af4f6ba32c GIT binary patch literal 541 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 bjz0qcVe5})R(VRT00000NkvXXu0mjf8q$TT literal 0 HcmV?d00001 diff --git a/client/iOS/Resources/toolbar_icon_extkeyboad.png b/client/iOS/Resources/toolbar_icon_extkeyboad.png new file mode 100755 index 0000000000000000000000000000000000000000..9436c07c3b711055472d5ce0833628a901bc1367 GIT binary patch literal 3292 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 UvHK>IKmY&$07*qoM6N<$g7Zqs761SM literal 0 HcmV?d00001 diff --git a/client/iOS/Resources/toolbar_icon_keyboard.png b/client/iOS/Resources/toolbar_icon_keyboard.png new file mode 100755 index 0000000000000000000000000000000000000000..c2a068531840adc60eb97d307bce18718577dd0a GIT binary patch literal 3378 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 IM6N<$f*ll6H~;_u literal 0 HcmV?d00001 diff --git a/client/iOS/Resources/toolbar_icon_touchpointer.png b/client/iOS/Resources/toolbar_icon_touchpointer.png new file mode 100755 index 0000000000000000000000000000000000000000..fc44508c9cb428940027e52771185dccff361728 GIT binary patch literal 3244 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 Wm##J?!oPF?0000t_0HERh zcftYbnZy8qs%$MTuA*Y)=;r8Z<>&;F6&Hs%xj0%_+nED^*HV_crH1+;q2TS>wU~T3 zG)dl3jQ|W$6N`f4$J5YLpkT{|Q{*iYsP^DUN`gp-a>Ef~W1-Oms*LE7s0+wD6hC5v z^TQ)Y9yfjRZRgr=_r_it=7sjlud?bUkh{U?$ubOd|CFdjAiybY)@0mifed(!|k>n_a)4$w=YAb`t_2OxOn;Szuq zKTtlQ6)6emumboN^1t|i1tx%1R@*`bsBQwf$Fb3B0Wdnisu~{p0RZ^`#zRz8UO-41 zfG>5aE%2A25__K>=Bcz=ffi~$$v{0YlQXimHuGD$aake;d~OqXlXMa0-Y;n+?17wE z8&|&pAUB=>X6@Cp*EnY7_&9fLBc>74Q5VuH<>$}aFS`?EP9gxX>E=KA!pKth2Fi~F zwSW2X{tRSgh?eVq8)Z?8CDH)o9xiELIsNAw$-KCh#l_v7odvmHVtOVc+I}yVy++;I z&vy6z0#CR9HafSc1KAA%r9pQay}z#&3dklBP(nVh?0u7dYC?N`BA=%GCHuKWhaP`h z71uddB0c(wy?`=8Ea5}{`>9v6t#!sn1fg{D>1K)Iv7F82}6=sF^iJ>VyZu03eYYNM9{Vdfh|J*o{Qi zgSgUz_GHW*B1ZkIR}5PW)eK7JV*H^zNQ^FQteTwOm}N$UoU>ciDlE|nlet&38B@>+ z>%jz^-9y(NhyoHF0^^xbEQP~;j?|%w1rw!(-cj_(fN-OzA;aPLs+98aTrzBGks1(9 z8S+a(7kIv}`ckd&{6heH&{J5uG+R<&t*YP*dV_dNG0&S2sUK*6%-q=0zY*qU{Bfy& zBN)w{xBsWi3Tx?`koX{L_W?07$1gip=7B!38eT?}MAOk4%5wCwfj8A!&Qeq%*sb!%O9;MR(>`u(j^${+2i(L?Ej zlmmooPjrkhg5be$OFEJaVq{`V5>Mi)RE0v4=_ryx4OSkuF;w@fl+xr--!4I!NiNeY%~Cm5CsnsB;V=GL zYFX^4A^g){_c;Pdw@;x@S^TGJZjI4)`v3&Zl%&p!k-`?EEX+NS>laPU*rKloeOu}? zd0UiVX-OWRIENgEcAeT)l7%qxcB=DTrkfJVK3!4Dm4Dxk$)ohcdd89|ETqGEqy%mOxUmgI{A>rQfC5t zVu5435pVRvFY7GzjA?00BFh%n;H&Vc2>GB<<`g034AOzsp^hCnw|~wCo8D9ZvNGy2 zdQXd&tIoL3tk1r#xhuF-Fv?xvxpQRP0zY@^V1@c^nLxQGNdCw4q-^wZnvCox*kAOtPhLc}}i~yRJ(-NF+DG7$So?L(BxGGyTN zC2zdE9|{ z%Fru%C!EB$bA6%i=O|#@Z3&?*iECHDP*~0Qm`#}O0kLNn{Mf-3oDd)9ELKXPnAm7} zWVvVIF&}2QFlZAj#uVS4U~0Qbk`e99>TIng$N=dEAf|! zQV0ST=vKUTNxwRdbfv8%)t8k0YB8Izn6fzBTVu-B!%Qws*-OE6z*tMz`D++$i3X-zCu8ZeBDzKE^Ms@l)ek<3WS_Y-+W^Wd6=!@{H7{{f6^oc3H3e z_E~7Sb6FEkQ*qW}*8EZSvF=v5GNSbGF8R^kphC&s`E(Fr3gH=<3bS#(WoDLqN>D@X z+Z@BOH0I#D&X=rnPbLg*49%F#fh{U0i7z{cw^B}h*XR#4W zzf70PP)~o<`>fZh{99;p?r6>XNqYGmRwk!_?iaZ$jbZDh!=ULz%gc%AtnXQV{>=9) z#>+n%efCYq*KM#I&s(wGHm4+CqxSjR`N#Dyo82yJmv`~Bo3+!cJ{s8{xg80-Bu*<2 zwq>@ZSGMTeww!r)H27HD9+GDBjIUmIeECcGIyalmC%D>ilYSmKD^(!Py` zVT2uL^9u3tZ3(+PA3ha{Pnb>6WD~vocp0rEB4qKun?0T%pG=+1OSw!*?6UVQcs}Yr zCaGE;=pA_5Iqb#3W_Ydjc-rH+;z@pImqnwpx_qwMaT-YDIP zc`8;TU0s=yceKC>JTyByd((A)Jcc?^*47@fN@5TDyVSHawo3gL_5$lStDSy6=IZL| z-#K!X4_f_)u;4#rT#%T~l~r|m=hfA@S}ERnI>^%`YFS#sk{Z~}KsF0LgvSu7V>f`e zzAK8&qT}xXX~*{Vc1?rc-KN!l4W2cx{CVUc%V}VP*!LSkclw3!3dBiB=xk`k6zbUW zF+lO|odfpu^)>pVIWxcii}ygP``JoMJpb?Yvdk`Eb`xl8Xe41`U{u_-oUFDH@t{E;9v=P#V+l2X zDH$(mYxB9QXj*$SVnK|Fg{3?@JNq5pOD&9iQ~W>oPSe?2S%JyP$;;q@DC_x3gE~Y1 zd-GQO{rpm!@pG#9a5Sg|iIUgt!@uKq^s8N-=WCK^h57lWnt*Ldy7C;dc>u8K@v5q* zs90Q6<80vW?k=N>zeP+LF`B~i?dJMAx+2ZowdW}4d{X+IB&@IF_JgtHeSiL_%-QqU z`0I|!yQ?xWF&)oW85u3P{-xyee-WUerOhj)x3RTF@H}5o?fP=H=U&x*Idb11GCk6` zj0$z)Ee{i;uwQL;mozswFBmlPiBV8e@?Iwm3+(I^y8ibsub@Ekd52cG<@8`Oe^uVu zq_3|ps_^gT<|gUc)r`9G>h-z9dS^#%ZY~515X*~$hptQl;IDm0H>b-CqobqZn@+qF zujHoau=fX!`uT-RP`bw2+uHVtV+ohTJlyo311_}2sqj%L@KMLuuv3=Az4p>99Z*d? zSKYPyudnM%k3Yi9m|S1S0uD}3|A`bGe*`whc-BJ-t@)Z_zJ1$YY1{$+aK@Z1))jgG zH?VvGI?1YfdQnSDpCs~C>l+$O+{~z_7bq(#D$JWup<@|56Kr?cU-r^CS3e2}MCVI? z8=tIz+2yqpFFh4|b)G1B&;&|fTQe+2ns@&{Yx2auo{fJ62O|YrF9-ENFy9G9 z-!yW=eDq~mT3RYDCx^v0T`C~k9!?l)5PaSph~OG6^2$BGG1_Q94CGqB@w?mn+H}8{ ziW4K{+}K7MF9QmTccG4qikh663BiboS!;Y|VglkYgC3UVCZ#F0A8k&;2x@ot%^X?kj+6X|xFf|Pg%~Z7XJoNHiq5@6Fg#Y%XM-zW9cm=lL z8yp# zj|5l`n!O2c>I47Y?Z1mrGMHEW^eKIB(ad4mojlCMY}I2KPQ}nLJ0~Tj=t25*tZ{f) zR{!ky$}WhU-=o{?cRLBzh7`%~(N*64IO@aXfTGe;`Y|xsn>S*x=#!3<+G6kJMci6x zx$41TFKTH7`|Naft;~B))4A#?D}TEc5+?q|P}T18qD0U+4c;fqysE#_FW7JOLZV}4 zzR~X-E-8_GO%tX+@Fw6Xd(FyF48f*O!8tf`Oqp9%-Sk(YNpy{M{a5r#{OY&^|DGZQ zOtEs+>Pj8J0jS`I?%{5YHBL^dYG`OQw<_x$P$%)1J_X&P36TCXe`A-HQ%CNZZ_3^+ z1EvVV-pa~Ah|C;JN>27ZH!yX}TN@E;V){aTp_N`rr?V5ToUbE1){4_*H`)0++?d<6 zDnGw3>a?vZ{<4ts1sKfE;X@@nbu_zEOl^+(hG7=fdN3oh=UC96jcu-%Q#wkJ| zA=tNqy!&Qc3m|{Tjgq45%LS+_CNlV!CK@xgQr5@W{kk%-v9U2yxIg{GfmbA9O{?I{ z%*<mIJh;uC6K~0c{hta~dJ38J z1h%n&*4EZA2Z{U2T)zDfHY8ZDh!Yt{DKlMFf*F%J=XU~J!k2twtMib4NI8M-9{7wbNa7rL7(=C z=jUgT+HG@M7;xLI11claOU`%PnFJZY8dXP-l znj>Ne8D`m4iXS7F1<0j(IgT(2pXnWoN)f@z-GfE&mJIaUAs zN&PA%^hH{FP=%FP#E4LFsk>qFfIZc#?i83;LXwxV&P8M z)YP)Qvt`aa)tG`=g~|FgU{_5mp+ZtVt3WL>jKW-rZw;5 zk%a{vJE7o-hD&>3A;>&hHY`5Gnw>aIlyNj6(~r#E7-!sG90&UsLF@5{-{)+oM%BY- z+~5!dVt6sT`EifG)H1lVnesud%puq-wT!Z0T_pBQCeDRm6x{|8ylNvJ70Oo?|D{!sf@GF8e4w59uQEUpHHPHGsfb(Mbv3~!ZrXl zjiydSQkVvrD!7D>r|zC9+x57D*_sae-3#b*8Q$B7VGg&d{Q!HWCgOv_0eHLQUENj! zcADroK8HQskFK*3V;i851wz4nTwWqeAP&8yZ__O>G!OxEVT5Cw`629$jHe5V7Wo1QCDYiZ7ur_7KyT=V!yPM z)OBZPXNkUl-TMCRWGBa^daq@)?64Vbp>;Q>;;=aq5i9d<8xOyd_+_zHj&O35kR!Va z$p&s{E^Y|5=t4VY#=1K7h8p4~8E%siLgBdFmiTbw-FF?yEx8peqzr?QDre@9INS&j zuQqIY?ifey{~(tZET;qOQ(agCuPZY%8nf%`!tNXlA(j>v(Pw98lmDF=DCZVo9tK&C zy3wo_vXvLGRyq=TUkLvLx%Qv5m^w*5`~?kG>=nXvl%!Jq!fLwET>MNmr(rng4g$37 zn8FSl3`fZeCW5R4SzEhscImvWZv<&_^pst%S#_*c?CXA{`gL>rfdD&5987^i0UK&4 zHheVOFis~3YB`R@OW)0bs%=9l>p^2~IOG2O9{9E%@cNu#)EHlxYgy=px`vAeGjnRId{Gzb(_jZ6Fiy2cCh z#m)-c8vgHqoLY__$Qa86PRCAF5~w4-e+GoX*@zcju#{nTAcmB|!8EP8 zK24BzKsi&TYTf{Q;Vj!0`%^VznDwXf4sEYufj4vsX@x;0sEkA)rTxlWa}*V7kpd`v zp2T;RA2M`FD3^4(AES*?0z(jge}bP^40I0e2Cyp0&0yb7QR!Au!S6Sp=>|F6Vsk#Ka3`6@y6#RO>p!x zt74cLd!Phmgc&?9n+WYi0bUg{At=uSL6-@zABAD>%1#K0V?S&NxCt4Lh35blp7V)VP$>^D3v zy38k_E=IzJI1U4^)?`7@dV}hSSE$VazqVW?+1x4}Nm3ODY^9=!5hwz{j`TuG?4jTv zbSn6W3DkjVsB$H?q(3F!XoCPD2w5+seE&lLf8UZPtp{w9CJckN{_-Zsl7g6t^*bg~ zLt~u@*55G)mslIa&HDcXa+i`S)ga1JX*L^wkgM`9<%p;)7`-J3=D0rFTnRSoyYh@5 z5i(DF5}CP%ijW|1q0`Bd0xs+kAK8M9%1FclX+%{uic3)yr?J6Sf9j#P=_y3eLd0A; zcDnETfN_h6NHTlPkIv5IJ9M()!x>dUc3}4KUTNaWee7PTXN~r}j(hdB%tFK!*l4$* zXVh)97E+eNN$bgrC8D9HtxQ6K59D*0{|rR~ zZ(U&~+S&cyi{sC|?nBXgdrlhyO$(R3TV%5nye(X~=w^xMI4-@ImPI{4k|1L(fa2-Y zej}9$F(!ORzwG)vt2+7_^6LiPZV-wsOZltT?6WSRvsByh8(bcR11wDIbSW;ye0kMh z;)aEjIm5urAgB}zRC-<)9p=MxfpPo7?rN2TNCsHJIrYz7iT>D*fA?CI=92c++Hj3b zbl*E?^y+f|U%?)t9pqPGCEnAtr<2!&v}(f@MSCT-f&va?z!-^hqK+Dy_`_1FXW-#` zJ|)R#rAh?@Ap}sxqv4z=pw{2886H=0cHvdEzmaAdC2Xgj ztnVh;4_XK`i&Y>5AT~BOVrM6|up0fqgXPEfWUp(gs0&#n1Tzm*k>0>6LG#_O@@b{L z*Sb&o$$>!sK>YMDRh1u_WL^-IVWY($XxoLa&a0*ExuebTXhC0Uab^~)`b;_?P`VEt zqktY;1E61&DoOsh?`r;4F8`-UO;Je;M?`_K0!<@kBG&(q>(hJJ^y-CD5c93vBixqUjxDjaVl9|+XIltvp64Wk609J8I`v_FS z3A|a06VB7vEeNsagI5mh9wTuJ%q^w=$1>!;41*NPVDr)w7vb)86e~o5%Q(Q{rB__b zuy_XZw6vNGTZB@@3@^v)Ibb{)Kdiy7ccKu!7G?Eci@JeJqr9$2JSL6UPtIgGz|Sn4 zv*VG9j6U98GgpP5v!c{6ytQqoQ%!oK^UzUVfY-LYf;&AH>0dy}e@Y(}jwB zCI0`R7@JNy2B(H1g=Z6ms6ROy{#^eNOnx&|XJ#oj*zzUry~aU`DnI#$naD`ioXM1_ z)sp#t$D~dh-EiebUDd@m|BmOKAKduYz7&mKp|2boLLb!!ru3yRr&DTPIbPw;2l0tz z(K6MshE|fC8;pIL{kIa%@_lFnHJeeGf?Q+g=H@;HxF|MyoOj%EKiv%qpLM9Obgzgh zchD9uK9Xc}KbV7M;Wbd090mBvF~6eiKU^J38AZa`=^4*gT966(5+fiW@H%gSR)*8> zKYjVahxt|@1lGZeDS4J&C1ynGh+tQES@_J5!up{+e?Kx(<_1&GU7>nu^X{E$GemuE zlVSEk1oNY4{qpaqf+o|QS--am!%!$>{QUf?VMW}9)V|KAPj77O>=;MBJ2xyvciTn7 zkduL6(vWm*3ssWLCD#Yo3P{Rjo62Uyk;)SmNMGH(niiIHc1C&Ydm-xP;qjxY%2Biz z8Cp}rR^QZ=pO*(WHrBSk0JPX)0^!+T$oa+bE$pcg2z7<>fIX~ zu@@~0Z0SZhEI%AS*5_Ql+Pg!dc-DPghlE)~z&!|90@WzhIeQ6TvYS4AcI2~z>i-3P z!cpjSjuEt?fv_P~O8K1Js*L+7_foI=4-*6M$8(yLxVpX=BYAlgcFT=pX^QyRVlKeG z6xx1RN+@r7pdNYjHq5%N|*vUVV zvg@Psg)>mAyU^zGMKCJ&HG)>NCRuRo9yb1!w3D&vt*@5Qf_M3VL*wRH(#Nb!z2%>>>1QYx>6 zPc#S261r=RD^kWDTsW0$5Ndd499s9~@pa_);DMsPS^;f!oP=Ig8nDByzW133-te0+ zB;YF8p-jykPQ=&x5ZA3hLa__^LyAiani1m&l2dKSQw76S{LjJI=j!6}a$ir%_}pQ$ zpn=b9_tQB-E;Ods%S>HAMX`rzeSKy$^t+N88(Hz>4Lx}Flz`QncuHBBu?2Gu=P669 zu@Yys!UTMTyGj;jqM@>axP>1;H{UChY{J`Y7=)5wt~gLgEKPcYf@Ye3!2*N}<*HUEX^UjKb!@qG~~qLmn`QE|V-(siI1HU`M%?Ck~e4 z;DXTZt9<1ks_^eVwI6dt&=(*fq`CT)y#Zk4f!uWcAZ**PnVFm0nkiA&NZw^RYW3gw zofca~7kPQ{cYDxUQWDYQY{lBJ!~5T6*Ikrw&P|NJFdDe{9;4;Vx>abxLF(>&(Pg!} z#T``pbUquULeA<#bYf7{Mgw6|m0ZC=-+<;usXesJ&1uPNYPSEI)0?R+-{(?%OiZLz zR+Ch9y4Vo4_3*e6e#>{c;G-Kd@m#tQTUOmHlC;xnIuiQZUWXYu*Kt@MGgOQPmEuKO zUOtNJ`u=e9w+XOrM_TcT>@dNXisLr8s%5Q9*moo z=dmp6^m#2@_+;#o*+J{C*qh4SX}0@u<|cJ|v7qFnq$h6ElYCev({)QLe2)UOk@@=j zzjU9iwh5j7dYJyOPT0C@zpsUkeSbr#XcFAB$W`|%U09XFfVicrYwU*+1RIW!J~Xed zOh6Qp`F*IDpc-nx*cdCNop-F zKuSugli=H+@Z8!O46yact*OC*Va70^RcL0;<3axFz&{0%*Z5I2gnzUS5gEkVdUjT8 z$Kmzifj|aPHJK1}*u^w8POB~TgdXbf?D$aj%MNRHI4DW4+rF+*s$nT!&8XKpH^gf;4TZfG|`DRhE`N^UZ zo;yjSI9mnKYwWU#(4>Jy_kK-0XJNxDPFKT74n$=H7JR^UvD=)=NX;@A`i(Rw$eDC2 zQ+#WsOgIK~i~_nU=sx{;jD`@Ia#H!)i^gKxJBt%dBn zQ|%1Q0e+7+&ld|d@6KQxK>)`A>Ae63`oIZSFJE{+h4U!GIQDF$3C^$#O=2nkyA75t z5cc^%(Z}0DTX%!O`>TED)1`*;`D*)RZaZrmvGd3C{r2&#tf4(u`k< zAy&A=N6;zh#VfEAa45=(uh;Fe^D7apSx|9`w@$B;ro@?LMfW{1eTQIr@|A#qU>y!R zIXQ`p1?#4hv@~*7YN|?EnXTbtu<+g9%lgadEBvr?(6%{>rxs=1Uy&x!3P#A>U$x}Os~Q=7%Z?&)_3yHrc&mKpp-Pu+zURQK zIpMIPNQHvQ8n5LP)M1iV8IsQy{wqLyu7`MiOHNL``Uk4%ySM5kNz9{?kU%2kpzN| z>IWm7{HW${pPzAHHa|iq{hWBaWQZGD;K^7q1kYQLqsI_0o60 zf>-0oxQk}z=^r8JG-zsSZ}*+#p(RG|WqKNFkvU#OSGw)c=)e(F9W|61M=UlM{rnrD z+uK@#RsuJv@L-+mMJY#!{QeiMP>nUk{_QybIeIxN&jk&cWp*F7S?ZfR*&`Y@Qc!eH z5Lt=!&BA|)wS>rw?o`)udN8l9IxqQre@f(AVJ@-3~I?==Tt<0cZZH- zNn-p7qAvn_qi8%|7P?IG?w@w2OQH@h5o+AYuV23wIl4LE;o&`0(1b7(0df6zuF_p7 z-GK3r{jZJyVD2GG6S4Tus~fS^<4KId6g@(Ma%}77_(db$`V9PA%=6ZVRT0nV^j5d#V6d-#8X!#Uc*L#*cs6BHg>xi5wkN@<{sWa6w9 zyb>_58Zfmp?0Bimc|I8_4F|1>U|>(^D}O`K!MxKaFgD(ra{o2(Dw#n4*3B{9;CmEB zDPdmK3)O=`d~BS-o#@@c`s{SC?EIeLQX_Wv)r9a@Drun@NB^q~Ue`TzeHu8ZVg@$_ zG5Y7PRjFLS%*>ovvbpcM&wAg^j#=2>!MfHEAWnvw^=@Ihxx5blnPa+=x|f(Uc_U+I z^Mh`3D5LsWtiN1|lMM(go50G!VcP!s@|geP(*ELcI8`vYtjQo^D1`)xy^swG{-srcrW&cVSU$4jQfu(Q!>;&CQ4h06ou)L<<8yFW0F z55~V)rSFjwMfGDxpnK(FmrRCcXTSZm?fkASJX0!n`G>onWdKbiDz+jJEzYfY*P}lw zb?y6|Lr!zETnRVL+$8fD*K#78+}g^D?w@cKPPP0wbA9@8BmyKDQG(EYg9i!2?Zuwo z=Eg%+E~DfGDw0e=%C4X&{? zg_0)vR>-k>Sov9f(yRS(a)Ll%e1R(@yk8V!`mAu(bJTBJSFYD zU2dxC3CM=kNu;e=k^(6l*VHZ&2x;FC(a}AGsB{U6akZr6M!d?+pS^p?LbGbO!876}ND z*fEAHO;FPTizjSsf4u)tn?ZFa6N)$Dh}m06H1*fndtm?zn;+3Wt(Y=2*L7{Edc znLqH!|5XAWHE?Y%jF-ABP6pjf+XD!jL@&I2eMwf#FIS?a88XoAd- zKXO}X(!F%de{xGbCS{sfe=;r$)`1i&uk=c#l3gjpl6&J{(gP#UXDf(`H~+pqBjka& zTY5chL9L;bq9{iL>l`;-&z=(RReCpBpBN%s)>XC`;8Fz7DX-QJT4N7IHtim1yFOuW znk;W{kS{5}X}n039f|;7(sF>GPt+xR~?5-wnV4|lA^4{5*7`A6nfTWHqIKY zI3r2=BC+cIlN)CnO2gUOJgVQ51+!?r*YFT=5;-Di<#+T=P@^Y%*pL15e3qm5byS~% zOhyy+{b&dNAyO&SqB_ukv-a|gz25g;7iR0@=&uJ`#I^=d&>Uy_x}Qnw&CWy&;c~Ko~qXe^@5zo6_%_>38a^&VcLM*cR;aDQ$GG<*R=s%;8-Dp z7n5e}m`gT^aY|%LE+nEgo;iPWDx+>U5#c=`&~ZH9apqQ~*S*B4n5q#mrol-)e&*Y3 zR&13|KF7uA=wRd##P3g}*;o>AbC?_yq->9}{hx&7EPt0hoF#w@2jxCx1C*iV}1S1(fRo+i_z0o*Rv0RTI%uLc)jb9W+v#7Nm3TB`?ecgIJ8lV z0E+OMz$i{_4GB6(#pztDveioy$~;sE&PaIj4js#iNX)hESG@AVxF|<@R-58jgB8Nb2>0KOkDL>oQWK>op_6oa+l(DVU2pA%#xHvgA=3zN8tlZMj(vlj_E{5joMGp%yfl#9LI}|?0b#4frHjHGStvk7hmn4rAKYBnCNbAZ*OI9-{0zfj0BUO z)$ZFGJ;qo|-=(3vuk5kf{QmlsQoMTWcjC3RJ}t6oS@J>Kwa?!;X_xf*1s>z<$h4}n zP49hX5fC>3&)5%7&9;sDQp)0e7~0^6R5+w_U2_!D#RyZ@b)>nzBv&3+q(NY9x-^B( z{n#g%XzgwCy$7Y$MR0>D9ludt-n@gm!y|iHHA)I9$br>-ee4^v zyMKvtoZvQU0cW@k0X_xXm6QSdK-O)_&v>sPJ+T4(Edia8EqpO+ltiBX>ntas5BD(W zuLD+bmPJNJiZwfHm8GVqPfcVC^7}FjQ^;dN&Dif%1m0r7NHq_G`P(+g1=>2>orOXEZ9=nQ@I?t?(=uGacGvAKkS)C`D7oO(tcjZ3Am?JtV0QX;UBxZg zrl?%RQ#Ks~o*OhO@NGwd6p7!kXEEUDYXF6OB_i`U-EEN@i`$IjVr@ZtOG^t3D2UeY z^!*|_2y=ohmhh94wYK(rcYhSopw@es)KJ>n+ZzyBZE`eft2};$(;vq7cX$5>Ewtu` zX~BwW7xsS*BK<1DeQFFORjt1z=M{_$oR)@r`m@})O=P30qb&^qqu|eq4OcakSQTSH z;3aVHhTk=rE9m@1^nim}DqS+V?eOsM%>TQ&Nyy6!rG12{)qb?LrgOsXVPIe=vV@@| zlfhUimKb8k}1}w%q?&>-uD^qs<>ymllScH^PuId?KR6)i%%h9Dy&F!J3GG!8{g8nCNO| z8%!bxs4&peyPyhx%}5ToqWCqv!cB1-}P$?RZYq~YcS9_I)W=+!dtgbQUK?!=dcG>G2x-T53?a5`egQcDb?glJVoE5MNK;M1iO<2noXmLi2a2Cp#Zv^pl9{I9b z_9YdrMXJrmA?ky|vq=mBS$cYUEqdROtYQ>gj{vtAGljX5K!hZ`v7yLX2~5_89V3+k zlk{C3z1P%)(UEQj+I^c&bH5#fK!J(o`I@4*2bOdO}Gs=A3H6fc9Wo9s?W zjPC!gJ7Q#Hq@~enoEX#utEgWOTHueDx*=fdB@q zktCo)56)(f?WGKcwnpy~`+5IG{5iZ!jq-sd?YSWenW@dNFbCTWN-GxSbJ*`bo*pn3nDJNKvj4!LzGIPK9x`OA0+r17e zHMaYSjM_`&)>;U|QVV5COnYk?UlEcd7zw9+e0&^jOu`GTuVEO-GQ}u6VzmzjAde7a z4Q#@+D-0bS9e8DjD>pDEWEG~vK-{pQ!?)3?gG(-a{s5dTHI$7zI#swaFffdIhF}58 z2n-sKt^E+hR^TK(EiIx82IdGh)wLgg4uzHDw~ijguLUY}Zf0X>I!hj)ZUtVl@kbcV zuvVX-5J&Ok2`6yq-!uTokHU`uO7LKgf%5+pQCWgM9&Rl!M$??FFhEA`-DwxvMx3x= z4HC2fSrh?k2}cGxaXJ4_eFbA5)M4dr&2q(?-v2Lb-ih`GykNTKw4PEffU(Nw4g)w& zxv#2%_xgyB+L3xX3cD+e9m{(o8a#?B|3|4eJH_ipiZAUo06?rNP`~X#*nz3Z0a-~U KiApi!p#K5I-s?&L literal 0 HcmV?d00001 diff --git a/client/iOS/Resources/touch_pointer_default.png b/client/iOS/Resources/touch_pointer_default.png new file mode 100755 index 0000000000000000000000000000000000000000..ba16a47c884b84297aa6f039a8c9c359419a8493 GIT binary patch literal 14447 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 z zZL~%^=K4Peh)p_V+Z?q|IDfS&oweTuha9;Lh-nmYU*kquZ%SD@t@NuoUK%-A)yefNlfj8)a5|B}ET^ce*LZ*BUxMU+FB zg4Y`J!WpuE=>3k&%(+d1J46$J&n`U#6gRXB PiEcnqR#m1($}H?ZUMt$e literal 0 HcmV?d00001 diff --git a/client/iOS/Resources/touch_pointer_extkeyboard.png b/client/iOS/Resources/touch_pointer_extkeyboard.png new file mode 100755 index 0000000000000000000000000000000000000000..6f0c8cd105a9636236cba636c0cd90e45211144f GIT binary patch literal 14550 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≪)zokj|7 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 JS0`y4@;}$r2af;% literal 0 HcmV?d00001 diff --git a/client/iOS/Resources/touch_pointer_keyboard.png b/client/iOS/Resources/touch_pointer_keyboard.png new file mode 100755 index 0000000000000000000000000000000000000000..1a6d60dbdfd58800a53d7f2436d1bbee1e589bad GIT binary patch literal 14569 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 DnvrLL literal 0 HcmV?d00001 diff --git a/client/iOS/Resources/touch_pointer_rclick.png b/client/iOS/Resources/touch_pointer_rclick.png new file mode 100755 index 0000000000000000000000000000000000000000..ad3ca8543c417e3840ca9e6d032b6fba3f3b1d8d GIT binary patch literal 14506 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 CENH&~ literal 0 HcmV?d00001 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..b6d842f7c --- /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.rdc + 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 ab5125866..11b048b90 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) @@ -102,3 +102,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/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/wtypes.h b/winpr/include/winpr/wtypes.h index 085c0d355..7fb0220bc 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;
+
+ + +
+

Gestures

+

+aFreeRDP is designed for touch sensitive devices. +These gestures let you do the most usual operations with your fingers.

+

+ + +
+
+
+ + +
+

Gestures

+

+aFreeRDP is designed for touch sensitive devices. +These gestures let you do the most usual operations with your fingers.

+

+ +
+