From 23cac314a13826437a944686ca400b7f5c644864 Mon Sep 17 00:00:00 2001 From: Bernhard Miklautz Date: Fri, 29 Mar 2013 13:17:12 +0100 Subject: [PATCH 01/26] channel/tsmf: fixed gstreamer plugin build Gstreamer wasn't build because it requires xrandr which wasn't detected. Fixes #1146 --- channels/tsmf/client/CMakeLists.txt | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/channels/tsmf/client/CMakeLists.txt b/channels/tsmf/client/CMakeLists.txt index e4560ab5c..a5c982415 100644 --- a/channels/tsmf/client/CMakeLists.txt +++ b/channels/tsmf/client/CMakeLists.txt @@ -57,10 +57,12 @@ if(WITH_FFMPEG) add_channel_client_subsystem(${MODULE_PREFIX} ${CHANNEL_NAME} "ffmpeg" "decoder") endif() -if(WITH_XRANDR) - if(GSTREAMER_FOUND) - add_channel_client_subsystem(${MODULE_PREFIX} ${CHANNEL_NAME} "gstreamer" "decoder") - endif() +if(GSTREAMER_FOUND) + set(XRANDR_FEATURE_TYPE "REQUIRED") + set(XRANDR_FEATURE_PURPOSE "X11 randr") + set(XRANDR_FEATURE_DESCRIPTION "X11 randr extension") + find_feature(XRandR ${XRANDR_FEATURE_TYPE} ${XRANDR_FEATURE_PURPOSE} ${XRANDR_FEATURE_DESCRIPTION}) + add_channel_client_subsystem(${MODULE_PREFIX} ${CHANNEL_NAME} "gstreamer" "decoder") endif() if(WITH_ALSA) From 38446b5f2b97b0fffa09d2650bdcfd27280c22dc Mon Sep 17 00:00:00 2001 From: Martin Fleisz Date: Fri, 29 Mar 2013 14:28:27 +0100 Subject: [PATCH 02/26] iOS: got rid of xcode project file --- .gitignore | 5 + CMakeLists.txt | 25 +- client/iOS/Additions/Toast+UIView.h | 1 + client/iOS/CMakeLists.txt | 145 ++- client/iOS/Controllers/MainTabBarController.h | 2 +- client/iOS/FreeRDP/ios_freerdp.h | 2 + client/iOS/FreeRDP/ios_freerdp.m | 52 +- client/iOS/FreeRDP/ios_freerdp_events.h | 1 + client/iOS/Misc/Utils.h | 1 + client/iOS/Models/Bookmark.h | 1 + client/iOS/Models/RDPSession.h | 1 + client/iOS/Resources/help_page/gestures.html | 2 +- .../Resources/help_page/gestures_phone.html | 2 +- .../iFreeRDP.xcodeproj/project.pbxproj.cmake | 865 ------------------ winpr/include/winpr/wtypes.h | 4 + 15 files changed, 189 insertions(+), 920 deletions(-) delete mode 100644 client/iOS/iFreeRDP.xcodeproj/project.pbxproj.cmake diff --git a/.gitignore b/.gitignore index b8e76d44e..cc287e6a4 100644 --- a/.gitignore +++ b/.gitignore @@ -43,6 +43,11 @@ client/X11/xfreerdp.1 *.xcodeproj/ DerivedData/ +# iOS +FreeRDP.build +Debug-* +Release-* + # Windows *.vcxproj *.vcxproj.* diff --git a/CMakeLists.txt b/CMakeLists.txt index e7edcec26..3178dee7c 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -175,13 +175,14 @@ if(MSVC) endif() if(IOS) - set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -isysroot ${CMAKE_IOS_SDK_ROOT}") + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -isysroot ${CMAKE_IOS_SDK_ROOT} -g") endif() set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DWINPR_EXPORTS") set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DFREERDP_EXPORTS") # Include files +if(NOT IOS) check_include_files(fcntl.h HAVE_FCNTL_H) check_include_files(unistd.h HAVE_UNISTD_H) check_include_files(stdint.h HAVE_STDINT_H) @@ -189,8 +190,19 @@ check_include_files(inttypes.h HAVE_INTTYPES_H) check_include_files(sys/modem.h HAVE_SYS_MODEM_H) check_include_files(sys/filio.h HAVE_SYS_FILIO_H) check_include_files(sys/strtio.h HAVE_SYS_STRTIO_H) +else() +set(HAVE_FCNTL_H 1) +set(HAVE_UNISTD_H 1) +set(HAVE_STDINT_H 1) +set(HAVE_INTTYPES_H 1) +set(HAVE_SYS_FILIO_H 1) +endif() +if(NOT IOS) check_struct_has_member("struct tm" tm_gmtoff time.h HAVE_TM_GMTOFF) +else() +set(HAVE_TM_GMTOFF 1) +endif() # Mac OS X if(APPLE) @@ -199,7 +211,8 @@ if(APPLE) message(STATUS "FREERDP_IOS_EXTERNAL_SSL_PATH not set! Required if openssl is not found in the iOS SDK (which usually isn't") endif() set(CMAKE_FIND_ROOT_PATH ${CMAKE_FIND_ROOT_PATH} ${FREERDP_IOS_EXTERNAL_SSL_PATH}) - else() + set_property(GLOBAL PROPERTY XCODE_ATTRIBUTE_SKIP_INSTALL YES) + else() if(IS_DIRECTORY /opt/local/include) include_directories(/opt/local/include) link_directories(/opt/local/lib) @@ -226,7 +239,7 @@ if(ANDROID) endif() set(CMAKE_THREAD_PREFER_PTHREAD TRUE) -if(NOT ANDROID) +if(NOT IOS AND NOT ANDROID) find_package(Threads REQUIRED) endif() @@ -415,6 +428,10 @@ if(WITH_CHANNELS) add_subdirectory(channels) endif() +if (IOS) +set(CMAKE_OSX_DEPLOYMENT_TARGET "") +set(CMAKE_OSX_SYSROOT "iphoneos") +endif() if(WITH_CLIENT) add_subdirectory(client) endif() @@ -533,4 +550,6 @@ if (ANDROID AND CMAKE_EXTRA_GENERATOR STREQUAL "Eclipse CDT4") message(STATUS "Disabled CXX system defines for eclipse (workaround).") endif() + + include(CPack) diff --git a/client/iOS/Additions/Toast+UIView.h b/client/iOS/Additions/Toast+UIView.h index 012d44191..623e70571 100644 --- a/client/iOS/Additions/Toast+UIView.h +++ b/client/iOS/Additions/Toast+UIView.h @@ -29,6 +29,7 @@ #import +#import @interface UIView (Toast) diff --git a/client/iOS/CMakeLists.txt b/client/iOS/CMakeLists.txt index 0dd5b20d6..f2f67f687 100644 --- a/client/iOS/CMakeLists.txt +++ b/client/iOS/CMakeLists.txt @@ -1,8 +1,7 @@ # FreeRDP: A Remote Desktop Protocol Implementation -# Android Client +# FreeRDP X11 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. @@ -15,40 +14,122 @@ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. +project(iFreeRDP) -set(IOS_SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}) -set(IOS_PACKAGE_NAME "iFreeRDP") +set(MODULE_NAME "iFreeRDP") +set(MODULE_PREFIX "IFREERDP_CLIENT") +set(APP_TYPE MACOSX_BUNDLE) -CONFIGURE_FILE(${CMAKE_CURRENT_SOURCE_DIR}/iFreeRDP.xcodeproj/project.pbxproj.cmake ${CMAKE_CURRENT_SOURCE_DIR}/iFreeRDP.xcodeproj/project.pbxproj @ONLY) +set(IOS_CLIENT_DIR ${CMAKE_CURRENT_SOURCE_DIR}) +set(IOS_CLIENT_ADDITIONS_DIR ${IOS_CLIENT_DIR}/Additions) +set(IOS_CLIENT_CONTROLLERS_DIR ${IOS_CLIENT_DIR}/Controllers) +set(IOS_CLIENT_FREERDP_DIR ${IOS_CLIENT_DIR}/FreeRDP) +set(IOS_CLIENT_MISC_DIR ${IOS_CLIENT_DIR}/Misc) +set(IOS_CLIENT_MODELS_DIR ${IOS_CLIENT_DIR}/Models) +set(IOS_CLIENT_VIEWS_DIR ${IOS_CLIENT_DIR}/Views) +set(IOS_CLIENT_RESOURCES_DIR ${IOS_CLIENT_DIR}/Resources) -if(IOS_BUILD_OBJC) - # And isn't shiped with the android ndk/sdk so - # we need to find it on the local machine - SET(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER, BOTH) - find_program(XCODEBUILD_COMMAND xcodebuild) - SET(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER, ONLY) +include_directories(${IOS_CLIENT_DIR}) +include_directories(${IOS_CLIENT_ADDITIONS_DIR}) +include_directories(${IOS_CLIENT_CONTROLLERS_DIR}) +include_directories(${IOS_CLIENT_FREERDP_DIR}) +include_directories(${IOS_CLIENT_MISC_DIR}) +include_directories(${IOS_CLIENT_MODELS_DIR}) +include_directories(${IOS_CLIENT_VIEWS_DIR}) +include_directories(${OPENSSL_INCLUDE_DIR}) - if(XCODEBUILD_COMMAND STREQUAL "XCODEBUILD_COMMAND-NOTFOUND") - message(FATAL_ERROR "xcodebuild not found but required to build ios objective-c") - endif() +# Add sources +set(${MODULE_PREFIX}_SRCS + AppDelegate.m + AppDelegate.h + main.m) - if(IOS_BUILD_OBJC_DEBUG) - set(IOS_BUILD_TYPE "Debug") - else() - set(IOS_BUILD_TYPE "Release") - endif() +file(GLOB IOS_CLIENT_ADDITIONS_SRCS ${IOS_CLIENT_ADDITIONS_DIR}/*.m) +file(GLOB IOS_CLIENT_ADDITIONS_HDRS ${IOS_CLIENT_ADDITIONS_DIR}/*.h) - set(IOS_APP_OUTPUT_DIR "${IOS_SOURCE_DIR}/bin/${IOS_BUILD_TYPE}") - set(IOS_APP "${IOS_APP_OUTPUT_DIR}/${IOS_PACKAGE_NAME}.app") - - # command to create the ios package - add_custom_command( - OUTPUT "${IOS_APP}" - COMMAND ${XCODEBUILD_COMMAND} -project "${IOS_SOURCE_DIR}/iFreeRDP.xcodeproj" -sdk ${CMAKE_IOS_SDK_ROOT} -configuration ${IOS_BUILD_TYPE} CONFIGURATION_BUILD_DIR="${IOS_APP_OUTPUT_DIR}" - WORKING_DIRECTORY "${IOS_SOURCE_DIR}" - MAIN_DEPENDENCY ${CMAKE_CURRENT_SOURCE_DIR}/iFreeRDP.xcodeproj/project.pbxproj - DEPENDS freerdp winpr +file(GLOB IOS_CLIENT_CONTROLLERS_SRCS ${IOS_CLIENT_CONTROLLERS_DIR}/*.m) +file(GLOB IOS_CLIENT_CONTROLLERS_HDRS ${IOS_CLIENT_CONTROLLERS_DIR}/*.h) + +file(GLOB IOS_CLIENT_FREERDP_SRCS ${IOS_CLIENT_FREERDP_DIR}/*.m) +file(GLOB IOS_CLIENT_FREERDP_HDRS ${IOS_CLIENT_FREERDP_DIR}/*.h) + +file(GLOB IOS_CLIENT_MISC_SRCS ${IOS_CLIENT_MISC_DIR}/*.m) +file(GLOB IOS_CLIENT_MISC_HDRS ${IOS_CLIENT_MISC_DIR}/*.h) + +file(GLOB IOS_CLIENT_MODELS_SRCS ${IOS_CLIENT_MODELS_DIR}/*.m) +file(GLOB IOS_CLIENT_MODELS_HDRS ${IOS_CLIENT_MODELS_DIR}/*.h) + +file(GLOB IOS_CLIENT_VIEWS_SRCS ${IOS_CLIENT_VIEWS_DIR}/*.m) +file(GLOB IOS_CLIENT_VIEWS_HDRS ${IOS_CLIENT_VIEWS_DIR}/*.h) + +# add resources +file(GLOB IOS_CLIENT_RESOURCES_XIBS ${IOS_CLIENT_RESOURCES_DIR}/*.xib) +file(GLOB IOS_CLIENT_RESOURCES_PNGS ${IOS_CLIENT_RESOURCES_DIR}/*.png) + +# Specify source grouping +source_group(Additions FILES ${IOS_CLIENT_ADDITIONS_SRCS} ${IOS_CLIENT_ADDITIONS_HDRS}) +source_group(Controllers FILES ${IOS_CLIENT_CONTROLLERS_SRCS} ${IOS_CLIENT_CONTROLLERS_HDRS}) +source_group(FreeRDP FILES ${IOS_CLIENT_FREERDP_SRCS} ${IOS_CLIENT_FREERDP_HDRS}) +source_group(Misc FILES ${IOS_CLIENT_MISC_SRCS} ${IOS_CLIENT_MISC_HDRS}) +source_group(Models FILES ${IOS_CLIENT_MODELS_SRCS} ${IOS_CLIENT_MODELS_HDRS}) +source_group(Views FILES ${IOS_CLIENT_RESOURCES_XIBS} ${IOS_CLIENT_VIEWS_SRCS} ${IOS_CLIENT_VIEWS_HDRS}) +source_group(Resources FILES ${IOS_CLIENT_RESOURCES_PNGS} ${IOS_CLIENT_RESOURCES_DIR}/about_page ${IOS_CLIENT_RESOURCES_DIR}/help_page ${IOS_CLIENT_RESOURCES_DIR}/en.lproj) + +# import libraries +find_library(FOUNDATION_FRAMEWORK Foundation) +find_library(COREGRAPHICS_FRAMEWORK CoreGraphics) +find_library(SECURITY_FRAMEWORK Security) +find_library(UIKIT_FRAMEWORK UIKit) +find_library(SYSTEMCONFIGURATION_FRAMEWORK SystemConfiguration) + +mark_as_advanced(FOUNDATION_FRAMEWORK COREGRAPHICS_FRAMEWORK SECURITY_FRAMEWORK UIKIT_FRAMEWORK SYSTEMCONFIGURATION_FRAMEWORK) +set(EXTRA_LIBS ${FOUNDATION_FRAMEWORK} ${COREGRAPHICS_FRAMEWORK} ${SECURITY_FRAMEWORK} ${UIKIT_FRAMEWORK} ${SYSTEMCONFIGURATION_FRAMEWORK}) + +set(${MODULE_NAME}_RESOURCES ${IOS_CLIENT_RESOURCES_XIBS}) +set(${MODULE_NAME}_RESOURCES ${${MODULE_NAME}_RESOURCES} ${IOS_CLIENT_RESOURCES_PNGS}) +set(${MODULE_NAME}_RESOURCES ${${MODULE_NAME}_RESOURCES} ${IOS_CLIENT_RESOURCES_DIR}/about_page ${IOS_CLIENT_RESOURCES_DIR}/help_page ${IOS_CLIENT_RESOURCES_DIR}/en.lproj) +set(${MODULE_NAME}_RESOURCES ${${MODULE_NAME}_RESOURCES} ${IOS_CLIENT_DIR}/Defaults.plist) + +add_executable(${MODULE_NAME} + ${APP_TYPE} + ${${MODULE_PREFIX}_SRCS} + ${IOS_CLIENT_ADDITIONS_SRCS} ${IOS_CLIENT_ADDITIONS_HDRS} + ${IOS_CLIENT_CONTROLLERS_SRCS} ${IOS_CLIENT_CONTROLLERS_HDRS} + ${IOS_CLIENT_FREERDP_SRCS} ${IOS_CLIENT_FREERDP_HDRS} + ${IOS_CLIENT_MISC_SRCS} ${IOS_CLIENT_MISC_HDRS} + ${IOS_CLIENT_MODELS_SRCS} ${IOS_CLIENT_MODELS_HDRS} + ${IOS_CLIENT_VIEWS_SRCS} ${IOS_CLIENT_VIEWS_HDRS} + ${${MODULE_NAME}_RESOURCES} ) - add_custom_target(ios-package ALL SOURCES "${IOS_APP}") - SET_DIRECTORY_PROPERTIES(PROPERTIES ADDITIONAL_MAKE_CLEAN_FILES "bin;build") -endif() + +set_target_properties(${MODULE_NAME} PROPERTIES RESOURCE "${${MODULE_NAME}_RESOURCES}") + +set(EXECUTABLE_NAME "\${EXECUTABLE_NAME}") + +set_target_properties(${MODULE_NAME} PROPERTIES MACOSX_BUNDLE_INFO_PLIST ${IOS_CLIENT_DIR}/iFreeRDP.plist) +set_target_properties(${MODULE_NAME} PROPERTIES XCODE_ATTRIBUTE_IPHONEOS_DEPLOYMENT_TARGET "4.3") +set_target_properties(${MODULE_NAME} PROPERTIES XCODE_ATTRIBUTE_CLANG_CXX_LANGUAGE_STANDARD "gnu++0x") +set_target_properties(${MODULE_NAME} PROPERTIES XCODE_ATTRIBUTE_CLANG_CXX_LIBRARY "libc++") +set_target_properties(${MODULE_NAME} PROPERTIES XCODE_ATTRIBUTE_CLANG_ENABLE_OBJC_ARC NO) +set_target_properties(${MODULE_NAME} PROPERTIES XCODE_ATTRIBUTE_GCC_C_LANGUAGE_STANDARD "gnu99") +set_target_properties(${MODULE_NAME} PROPERTIES XCODE_ATTRIBUTE_TARGETED_DEVICE_FAMILY "1,2") +set_target_properties(${MODULE_NAME} PROPERTIES XCODE_ATTRIBUTE_COMBINE_HIDPI_IMAGES "NO") +set_target_properties(${MODULE_NAME} PROPERTIES XCODE_ATTRIBUTE_SKIP_INSTALL NO) +set_target_properties(${MODULE_NAME} PROPERTIES XCODE_ATTRIBUTE_INSTALL_PATH "/Applications") +set_target_properties(${MODULE_NAME} PROPERTIES XCODE_ATTRIBUTE_GCC_GENERATE_DEBUGGING_SYMBOLS YES) + +set(${MODULE_PREFIX}_LIBS ${${MODULE_PREFIX}_LIBS} ${EXTRA_LIBS}) + +set(${MODULE_PREFIX}_LIBS ${${MODULE_PREFIX}_LIBS} freerdp-client) + +set_complex_link_libraries(VARIABLE ${MODULE_PREFIX}_LIBS MONOLITHIC ${MONOLITHIC_BUILD} + MODULE freerdp + MODULES freerdp-core freerdp-gdi freerdp-locale freerdp-primitives freerdp-cache freerdp-utils) + +set_complex_link_libraries(VARIABLE ${MODULE_PREFIX}_LIBS MONOLITHIC ${MONOLITHIC_BUILD} + MODULE winpr + MODULES winpr-input winpr-crt winpr-utils) + +target_link_libraries(${MODULE_NAME} ${${MODULE_PREFIX}_LIBS}) + +set_property(TARGET ${MODULE_NAME} PROPERTY FOLDER "Client/iOS") diff --git a/client/iOS/Controllers/MainTabBarController.h b/client/iOS/Controllers/MainTabBarController.h index 796c1fa75..499d3792e 100644 --- a/client/iOS/Controllers/MainTabBarController.h +++ b/client/iOS/Controllers/MainTabBarController.h @@ -8,7 +8,7 @@ */ #import - +#import @interface MainTabBarController : UITabBarController { diff --git a/client/iOS/FreeRDP/ios_freerdp.h b/client/iOS/FreeRDP/ios_freerdp.h index 7219c6b3c..e16d3bb16 100644 --- a/client/iOS/FreeRDP/ios_freerdp.h +++ b/client/iOS/FreeRDP/ios_freerdp.h @@ -7,6 +7,8 @@ If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/. */ +#import + #import #import #import "TSXTypes.h" diff --git a/client/iOS/FreeRDP/ios_freerdp.m b/client/iOS/FreeRDP/ios_freerdp.m index 55738bee7..ea9581fcb 100644 --- a/client/iOS/FreeRDP/ios_freerdp.m +++ b/client/iOS/FreeRDP/ios_freerdp.m @@ -9,7 +9,9 @@ #import #import -#import +#import +#import +#import #import "ios_freerdp.h" #import "ios_freerdp_ui.h" @@ -64,7 +66,9 @@ ios_pre_connect(freerdp * instance) settings->FrameAcknowledge = 10; -// freerdp_channels_pre_connect(instance->context->channels, instance); + freerdp_client_load_addins(instance->context->channels, instance->settings); + + freerdp_channels_pre_connect(instance->context->channels, instance); return TRUE; } @@ -82,12 +86,24 @@ static BOOL ios_post_connect(freerdp* instance) instance->update->DesktopResize = ios_ui_resize_window; // Channel allocation -// freerdp_channels_post_connect(instance->context->channels, instance); + freerdp_channels_post_connect(instance->context->channels, instance); [mfi->session performSelectorOnMainThread:@selector(sessionDidConnect) withObject:nil waitUntilDone:YES]; return TRUE; } +static int ios_receive_channel_data(freerdp* instance, int channelId, UINT8* data, int size, int flags, int total_size) +{ + return freerdp_channels_data(instance, channelId, data, size, flags, total_size); +} + +void ios_process_channel_event(rdpChannels* channels, freerdp* instance) +{ + RDP_EVENT* event = freerdp_channels_pop_event(channels); + if (event) + freerdp_event_free(event); +} + #pragma mark - #pragma mark Running the connection @@ -96,7 +112,7 @@ ios_run_freerdp(freerdp * instance) { mfContext* context = (mfContext*)instance->context; mfInfo* mfi = context->mfi; -// rdpChannels* channels = instance->context->channels; + rdpChannels* channels = instance->context->channels; mfi->connection_state = TSXConnectionConnecting; @@ -138,12 +154,12 @@ ios_run_freerdp(freerdp * instance) break; } -/* if (freerdp_channels_get_fds(channels, instance, rfds, &rcount, wfds, &wcount) != TRUE) + if (freerdp_channels_get_fds(channels, instance, rfds, &rcount, wfds, &wcount) != TRUE) { NSLog(@"%s: freerdp_chanman_get_fds failed", __func__); break; } -*/ + if (ios_events_get_fds(mfi, rfds, &rcount, wfds, &wcount) != TRUE) { NSLog(@"%s: ios_events_get_fds", __func__); @@ -196,20 +212,20 @@ ios_run_freerdp(freerdp * instance) } // Check channel fds -/* if (freerdp_channels_check_fds(channels, instance) != TRUE) + if (freerdp_channels_check_fds(channels, instance) != TRUE) { NSLog(@"%s: freerdp_chanman_check_fds failed", __func__); break; } -*/ + ios_process_channel_event(channels, instance); + [pool release]; pool = nil; } mfi->connection_state = TSXConnectionDisconnected; // Cleanup -// freerdp_channels_close(channels, instance); -// freerdp_channels_free(channels); + freerdp_channels_close(channels, instance); freerdp_disconnect(instance); gdi_free(instance); cache_free(instance->context->cache); @@ -225,7 +241,7 @@ void ios_context_new(freerdp* instance, rdpContext* context) { mfInfo* mfi = (mfInfo*)calloc(1, sizeof(mfInfo)); ((mfContext*) context)->mfi = mfi; -// context->channels = freerdp_channels_new(); + context->channels = freerdp_channels_new(); ios_events_create_pipe(mfi); mfi->_context = context; @@ -237,6 +253,7 @@ void ios_context_new(freerdp* instance, rdpContext* context) void ios_context_free(freerdp* instance, rdpContext* context) { mfInfo* mfi = ((mfContext*) context)->mfi; + freerdp_channels_free(context->channels); ios_events_free_pipe(mfi); free(mfi); } @@ -253,19 +270,19 @@ freerdp* ios_freerdp_new() inst->Authenticate = ios_ui_authenticate; inst->VerifyCertificate = ios_ui_check_certificate; inst->VerifyChangedCertificate = ios_ui_check_changed_certificate; - + inst->ReceiveChannelData = ios_receive_channel_data; + inst->context_size = sizeof(mfContext); inst->ContextNew = ios_context_new; inst->ContextFree = ios_context_free; freerdp_context_new(inst); - + // determine new home path NSString* home_path = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject]; free(inst->settings->HomePath); free(inst->settings->ConfigPath); inst->settings->HomePath = strdup([home_path UTF8String]); - inst->settings->ConfigPath = NULL; - freerdp_detect_paths(inst->settings); + inst->settings->ConfigPath = strdup([[home_path stringByAppendingPathComponent:@".freerdp"] UTF8String]); return inst; } @@ -279,11 +296,12 @@ void ios_freerdp_free(freerdp* instance) void ios_init_freerdp() { signal(SIGPIPE, SIG_IGN); -// freerdp_channels_global_init(); + freerdp_channels_global_init(); + freerdp_register_addin_provider(freerdp_channels_load_static_addin_entry, 0); } void ios_uninit_freerdp() { -// freerdp_channels_global_uninit(); + freerdp_channels_global_uninit(); } diff --git a/client/iOS/FreeRDP/ios_freerdp_events.h b/client/iOS/FreeRDP/ios_freerdp_events.h index d2f9e799d..eb790d8f8 100755 --- a/client/iOS/FreeRDP/ios_freerdp_events.h +++ b/client/iOS/FreeRDP/ios_freerdp_events.h @@ -10,6 +10,7 @@ #ifndef IOS_RDP_EVENT_H #define IOS_RDP_EVENT_H +#import #import "ios_freerdp.h" // For UI: use to send events diff --git a/client/iOS/Misc/Utils.h b/client/iOS/Misc/Utils.h index bca34e899..9a22da5f6 100644 --- a/client/iOS/Misc/Utils.h +++ b/client/iOS/Misc/Utils.h @@ -8,6 +8,7 @@ */ #import +#import #import "TSXTypes.h" // helper macro to encode a table path into a tag value (used to identify controls in their delegate handlers) diff --git a/client/iOS/Models/Bookmark.h b/client/iOS/Models/Bookmark.h index bcaaca0f3..4594aa5aa 100644 --- a/client/iOS/Models/Bookmark.h +++ b/client/iOS/Models/Bookmark.h @@ -9,6 +9,7 @@ #import +#import #import "ConnectionParams.h" @interface ComputerBookmark : NSObject { diff --git a/client/iOS/Models/RDPSession.h b/client/iOS/Models/RDPSession.h index c266cc9a6..3896ae8e0 100644 --- a/client/iOS/Models/RDPSession.h +++ b/client/iOS/Models/RDPSession.h @@ -8,6 +8,7 @@ */ #import +#import #include diff --git a/client/iOS/Resources/help_page/gestures.html b/client/iOS/Resources/help_page/gestures.html index 858387773..43425167f 100755 --- a/client/iOS/Resources/help_page/gestures.html +++ b/client/iOS/Resources/help_page/gestures.html @@ -148,7 +148,7 @@ a:hover, a:active, a:focus { /* this group of selectors will give a keyboard nav

Gestures

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

diff --git a/client/iOS/Resources/help_page/gestures_phone.html b/client/iOS/Resources/help_page/gestures_phone.html index 156d7c94d..5d95cfdd6 100755 --- a/client/iOS/Resources/help_page/gestures_phone.html +++ b/client/iOS/Resources/help_page/gestures_phone.html @@ -147,7 +147,7 @@ a:hover, a:active, a:focus { /* this group of selectors will give a keyboard nav

Gestures

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

diff --git a/client/iOS/iFreeRDP.xcodeproj/project.pbxproj.cmake b/client/iOS/iFreeRDP.xcodeproj/project.pbxproj.cmake deleted file mode 100644 index 72e566561..000000000 --- a/client/iOS/iFreeRDP.xcodeproj/project.pbxproj.cmake +++ /dev/null @@ -1,865 +0,0 @@ -// !$*UTF8*$! -{ - archiveVersion = 1; - classes = { - }; - objectVersion = 46; - objects = { - -/* Begin PBXBuildFile section */ - C495EE3416B8372D0041304E /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C495EE3316B8372D0041304E /* UIKit.framework */; }; - C495EE3616B8372D0041304E /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C495EE3516B8372D0041304E /* Foundation.framework */; }; - C495EE3816B8372D0041304E /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C495EE3716B8372D0041304E /* CoreGraphics.framework */; }; - C495EE7016B9107D0041304E /* Defaults.plist in Resources */ = {isa = PBXBuildFile; fileRef = C495EE6F16B9107D0041304E /* Defaults.plist */; }; - C495EE7716B910BC0041304E /* OrderedDictionary.m in Sources */ = {isa = PBXBuildFile; fileRef = C495EE7216B910BC0041304E /* OrderedDictionary.m */; }; - C495EE7816B910BC0041304E /* Toast+UIView.m in Sources */ = {isa = PBXBuildFile; fileRef = C495EE7416B910BC0041304E /* Toast+UIView.m */; }; - C495EE7916B910BC0041304E /* TSXAdditions.m in Sources */ = {isa = PBXBuildFile; fileRef = C495EE7616B910BC0041304E /* TSXAdditions.m */; }; - C495EE9B16B910DE0041304E /* AboutController.m in Sources */ = {isa = PBXBuildFile; fileRef = C495EE7C16B910DE0041304E /* AboutController.m */; }; - C495EE9C16B910DE0041304E /* AdvancedBookmarkEditorController.m in Sources */ = {isa = PBXBuildFile; fileRef = C495EE7E16B910DE0041304E /* AdvancedBookmarkEditorController.m */; }; - C495EE9D16B910DE0041304E /* AppSettingsController.m in Sources */ = {isa = PBXBuildFile; fileRef = C495EE8016B910DE0041304E /* AppSettingsController.m */; }; - C495EE9E16B910DE0041304E /* BookmarkEditorController.m in Sources */ = {isa = PBXBuildFile; fileRef = C495EE8216B910DE0041304E /* BookmarkEditorController.m */; }; - C495EE9F16B910DE0041304E /* BookmarkListController.m in Sources */ = {isa = PBXBuildFile; fileRef = C495EE8416B910DE0041304E /* BookmarkListController.m */; }; - C495EEA016B910DE0041304E /* CredentialsEditorController.m in Sources */ = {isa = PBXBuildFile; fileRef = C495EE8616B910DE0041304E /* CredentialsEditorController.m */; }; - C495EEA116B910DE0041304E /* CredentialsInputController.m in Sources */ = {isa = PBXBuildFile; fileRef = C495EE8816B910DE0041304E /* CredentialsInputController.m */; }; - C495EEA216B910DE0041304E /* EditorBaseController.m in Sources */ = {isa = PBXBuildFile; fileRef = C495EE8A16B910DE0041304E /* EditorBaseController.m */; }; - C495EEA316B910DE0041304E /* EditorSelectionController.m in Sources */ = {isa = PBXBuildFile; fileRef = C495EE8C16B910DE0041304E /* EditorSelectionController.m */; }; - C495EEA416B910DE0041304E /* EncryptionController.m in Sources */ = {isa = PBXBuildFile; fileRef = C495EE8E16B910DE0041304E /* EncryptionController.m */; }; - C495EEA516B910DE0041304E /* HelpController.m in Sources */ = {isa = PBXBuildFile; fileRef = C495EE9016B910DE0041304E /* HelpController.m */; }; - C495EEA616B910DE0041304E /* MainTabBarController.m in Sources */ = {isa = PBXBuildFile; fileRef = C495EE9216B910DE0041304E /* MainTabBarController.m */; }; - C495EEA716B910DE0041304E /* PerformanceEditorController.m in Sources */ = {isa = PBXBuildFile; fileRef = C495EE9416B910DE0041304E /* PerformanceEditorController.m */; }; - C495EEA816B910DE0041304E /* RDPSessionViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = C495EE9616B910DE0041304E /* RDPSessionViewController.m */; }; - C495EEA916B910DE0041304E /* ScreenSelectionController.m in Sources */ = {isa = PBXBuildFile; fileRef = C495EE9816B910DE0041304E /* ScreenSelectionController.m */; }; - C495EEAA16B910DE0041304E /* VerifyCertificateController.m in Sources */ = {isa = PBXBuildFile; fileRef = C495EE9A16B910DE0041304E /* VerifyCertificateController.m */; }; - C495EEB216B910F60041304E /* ios_freerdp_events.m in Sources */ = {isa = PBXBuildFile; fileRef = C495EEAD16B910F60041304E /* ios_freerdp_events.m */; }; - C495EEB316B910F60041304E /* ios_freerdp_ui.m in Sources */ = {isa = PBXBuildFile; fileRef = C495EEAF16B910F60041304E /* ios_freerdp_ui.m */; }; - C495EEB416B910F60041304E /* ios_freerdp.m in Sources */ = {isa = PBXBuildFile; fileRef = C495EEB116B910F60041304E /* ios_freerdp.m */; }; - C495EEBD16B9111A0041304E /* Reachability.m in Sources */ = {isa = PBXBuildFile; fileRef = C495EEB716B9111A0041304E /* Reachability.m */; }; - C495EEBE16B9111A0041304E /* SFHFKeychainUtils.m in Sources */ = {isa = PBXBuildFile; fileRef = C495EEB916B9111A0041304E /* SFHFKeychainUtils.m */; }; - C495EEBF16B9111A0041304E /* Utils.m in Sources */ = {isa = PBXBuildFile; fileRef = C495EEBC16B9111A0041304E /* Utils.m */; }; - C495EECD16B911290041304E /* Bookmark.m in Sources */ = {isa = PBXBuildFile; fileRef = C495EEC216B911290041304E /* Bookmark.m */; }; - C495EECE16B911290041304E /* ConnectionParams.m in Sources */ = {isa = PBXBuildFile; fileRef = C495EEC416B911290041304E /* ConnectionParams.m */; }; - C495EECF16B911290041304E /* Encryptor.m in Sources */ = {isa = PBXBuildFile; fileRef = C495EEC616B911290041304E /* Encryptor.m */; }; - C495EED016B911290041304E /* GlobalDefaults.m in Sources */ = {isa = PBXBuildFile; fileRef = C495EEC816B911290041304E /* GlobalDefaults.m */; }; - C495EED116B911290041304E /* RDPKeyboard.m in Sources */ = {isa = PBXBuildFile; fileRef = C495EECA16B911290041304E /* RDPKeyboard.m */; }; - C495EED216B911290041304E /* RDPSession.m in Sources */ = {isa = PBXBuildFile; fileRef = C495EECC16B911290041304E /* RDPSession.m */; }; - C495EF3216B911450041304E /* BookmarkListView.xib in Resources */ = {isa = PBXBuildFile; fileRef = C495EEDA16B911450041304E /* BookmarkListView.xib */; }; - C495EF3316B911450041304E /* BookmarkTableViewCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = C495EEDB16B911450041304E /* BookmarkTableViewCell.xib */; }; - C495EF3416B911450041304E /* cancel_button_background.png in Resources */ = {isa = PBXBuildFile; fileRef = C495EEDC16B911450041304E /* cancel_button_background.png */; }; - C495EF3516B911450041304E /* CredentialsInputView.xib in Resources */ = {isa = PBXBuildFile; fileRef = C495EEDD16B911450041304E /* CredentialsInputView.xib */; }; - C495EF3616B911450041304E /* Default-Landscape@2x~ipad.png in Resources */ = {isa = PBXBuildFile; fileRef = C495EEDE16B911450041304E /* Default-Landscape@2x~ipad.png */; }; - C495EF3716B911450041304E /* Default-Landscape~ipad.png in Resources */ = {isa = PBXBuildFile; fileRef = C495EEDF16B911450041304E /* Default-Landscape~ipad.png */; }; - C495EF3816B911450041304E /* Default-Portrait@2x~ipad.png in Resources */ = {isa = PBXBuildFile; fileRef = C495EEE016B911450041304E /* Default-Portrait@2x~ipad.png */; }; - C495EF3916B911450041304E /* Default-Portrait~ipad.png in Resources */ = {isa = PBXBuildFile; fileRef = C495EEE116B911450041304E /* Default-Portrait~ipad.png */; }; - C495EF3A16B911450041304E /* Default.png in Resources */ = {isa = PBXBuildFile; fileRef = C495EEE216B911450041304E /* Default.png */; }; - C495EF3B16B911450041304E /* Default@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = C495EEE316B911450041304E /* Default@2x.png */; }; - C495EF3C16B911450041304E /* EditButtonTableViewCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = C495EEE416B911450041304E /* EditButtonTableViewCell.xib */; }; - C495EF3D16B911450041304E /* EditFlagTableViewCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = C495EEE516B911450041304E /* EditFlagTableViewCell.xib */; }; - C495EF3E16B911450041304E /* EditSecretTextTableViewCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = C495EEE616B911450041304E /* EditSecretTextTableViewCell.xib */; }; - C495EF3F16B911450041304E /* EditSelectionTableViewCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = C495EEE716B911450041304E /* EditSelectionTableViewCell.xib */; }; - C495EF4016B911450041304E /* EditSubEditTableViewCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = C495EEE816B911450041304E /* EditSubEditTableViewCell.xib */; }; - C495EF4116B911450041304E /* EditTextTableViewCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = C495EEE916B911450041304E /* EditTextTableViewCell.xib */; }; - C495EF5316B911450041304E /* icon_accessory_star_off.png in Resources */ = {isa = PBXBuildFile; fileRef = C495EEFE16B911450041304E /* icon_accessory_star_off.png */; }; - C495EF5416B911450041304E /* icon_accessory_star_on.png in Resources */ = {isa = PBXBuildFile; fileRef = C495EEFF16B911450041304E /* icon_accessory_star_on.png */; }; - C495EF5516B911450041304E /* icon_key_arrow_down.png in Resources */ = {isa = PBXBuildFile; fileRef = C495EF0016B911450041304E /* icon_key_arrow_down.png */; }; - C495EF5616B911450041304E /* icon_key_arrow_left.png in Resources */ = {isa = PBXBuildFile; fileRef = C495EF0116B911450041304E /* icon_key_arrow_left.png */; }; - C495EF5716B911450041304E /* icon_key_arrow_right.png in Resources */ = {isa = PBXBuildFile; fileRef = C495EF0216B911450041304E /* icon_key_arrow_right.png */; }; - C495EF5816B911450041304E /* icon_key_arrow_up.png in Resources */ = {isa = PBXBuildFile; fileRef = C495EF0316B911450041304E /* icon_key_arrow_up.png */; }; - C495EF5916B911450041304E /* icon_key_arrows.png in Resources */ = {isa = PBXBuildFile; fileRef = C495EF0416B911450041304E /* icon_key_arrows.png */; }; - C495EF5A16B911450041304E /* icon_key_backspace.png in Resources */ = {isa = PBXBuildFile; fileRef = C495EF0516B911450041304E /* icon_key_backspace.png */; }; - C495EF5B16B911450041304E /* icon_key_menu.png in Resources */ = {isa = PBXBuildFile; fileRef = C495EF0616B911450041304E /* icon_key_menu.png */; }; - C495EF5C16B911450041304E /* icon_key_return.png in Resources */ = {isa = PBXBuildFile; fileRef = C495EF0716B911450041304E /* icon_key_return.png */; }; - C495EF5D16B911450041304E /* icon_key_win.png in Resources */ = {isa = PBXBuildFile; fileRef = C495EF0816B911450041304E /* icon_key_win.png */; }; - C495EF5E16B911450041304E /* Icon-72.png in Resources */ = {isa = PBXBuildFile; fileRef = C495EF0916B911450041304E /* Icon-72.png */; }; - C495EF5F16B911450041304E /* Icon-72@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = C495EF0A16B911450041304E /* Icon-72@2x.png */; }; - C495EF6016B911450041304E /* Icon.png in Resources */ = {isa = PBXBuildFile; fileRef = C495EF0B16B911450041304E /* Icon.png */; }; - C495EF6116B911450041304E /* Icon@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = C495EF0C16B911450041304E /* Icon@2x.png */; }; - C495EF6216B911450041304E /* keyboard_button_background.png in Resources */ = {isa = PBXBuildFile; fileRef = C495EF0D16B911450041304E /* keyboard_button_background.png */; }; - C495EF6316B911450041304E /* MainWindow.xib in Resources */ = {isa = PBXBuildFile; fileRef = C495EF0E16B911450041304E /* MainWindow.xib */; }; - C495EF6416B911450041304E /* RDPConnectingView.xib in Resources */ = {isa = PBXBuildFile; fileRef = C495EF0F16B911450041304E /* RDPConnectingView.xib */; }; - C495EF6516B911450041304E /* RDPSessionView.xib in Resources */ = {isa = PBXBuildFile; fileRef = C495EF1016B911450041304E /* RDPSessionView.xib */; }; - C495EF6616B911450041304E /* SessionTableViewCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = C495EF1116B911450041304E /* SessionTableViewCell.xib */; }; - C495EF6716B911450041304E /* tabbar_icon_about.png in Resources */ = {isa = PBXBuildFile; fileRef = C495EF1216B911450041304E /* tabbar_icon_about.png */; }; - C495EF6816B911450041304E /* tabbar_icon_help.png in Resources */ = {isa = PBXBuildFile; fileRef = C495EF1316B911450041304E /* tabbar_icon_help.png */; }; - C495EF6916B911450041304E /* tabbar_icon_settings.png in Resources */ = {isa = PBXBuildFile; fileRef = C495EF1416B911450041304E /* tabbar_icon_settings.png */; }; - C495EF6A16B911450041304E /* toolbar_icon_disconnect.png in Resources */ = {isa = PBXBuildFile; fileRef = C495EF1516B911450041304E /* toolbar_icon_disconnect.png */; }; - C495EF6B16B911450041304E /* toolbar_icon_extkeyboad.png in Resources */ = {isa = PBXBuildFile; fileRef = C495EF1616B911450041304E /* toolbar_icon_extkeyboad.png */; }; - C495EF6C16B911450041304E /* toolbar_icon_home.png in Resources */ = {isa = PBXBuildFile; fileRef = C495EF1716B911450041304E /* toolbar_icon_home.png */; }; - C495EF6D16B911450041304E /* toolbar_icon_keyboard.png in Resources */ = {isa = PBXBuildFile; fileRef = C495EF1816B911450041304E /* toolbar_icon_keyboard.png */; }; - C495EF6E16B911450041304E /* toolbar_icon_touchpointer.png in Resources */ = {isa = PBXBuildFile; fileRef = C495EF1916B911450041304E /* toolbar_icon_touchpointer.png */; }; - C495EF6F16B911450041304E /* toolbar_icon_win.png in Resources */ = {isa = PBXBuildFile; fileRef = C495EF1A16B911450041304E /* toolbar_icon_win.png */; }; - C495EF7016B911450041304E /* touch_pointer_active.png in Resources */ = {isa = PBXBuildFile; fileRef = C495EF1B16B911450041304E /* touch_pointer_active.png */; }; - C495EF7116B911450041304E /* touch_pointer_default.png in Resources */ = {isa = PBXBuildFile; fileRef = C495EF1C16B911450041304E /* touch_pointer_default.png */; }; - C495EF7216B911450041304E /* touch_pointer_extkeyboard.png in Resources */ = {isa = PBXBuildFile; fileRef = C495EF1D16B911450041304E /* touch_pointer_extkeyboard.png */; }; - C495EF7316B911450041304E /* touch_pointer_keyboard.png in Resources */ = {isa = PBXBuildFile; fileRef = C495EF1E16B911450041304E /* touch_pointer_keyboard.png */; }; - C495EF7416B911450041304E /* touch_pointer_lclick.png in Resources */ = {isa = PBXBuildFile; fileRef = C495EF1F16B911450041304E /* touch_pointer_lclick.png */; }; - C495EF7516B911450041304E /* touch_pointer_rclick.png in Resources */ = {isa = PBXBuildFile; fileRef = C495EF2016B911450041304E /* touch_pointer_rclick.png */; }; - C495EF7616B911450041304E /* touch_pointer_reset.png in Resources */ = {isa = PBXBuildFile; fileRef = C495EF2116B911450041304E /* touch_pointer_reset.png */; }; - C495EF7716B911450041304E /* touch_pointer_scroll.png in Resources */ = {isa = PBXBuildFile; fileRef = C495EF2216B911450041304E /* touch_pointer_scroll.png */; }; - C495EF7816B911450041304E /* VerifyCertificateView.xib in Resources */ = {isa = PBXBuildFile; fileRef = C495EF2316B911450041304E /* VerifyCertificateView.xib */; }; - C495EF9A16B911AC0041304E /* AdvancedKeyboardView.m in Sources */ = {isa = PBXBuildFile; fileRef = C495EF8316B911AB0041304E /* AdvancedKeyboardView.m */; }; - C495EF9B16B911AC0041304E /* BookmarkTableCell.m in Sources */ = {isa = PBXBuildFile; fileRef = C495EF8516B911AB0041304E /* BookmarkTableCell.m */; }; - C495EF9C16B911AC0041304E /* EditButtonTableViewCell.m in Sources */ = {isa = PBXBuildFile; fileRef = C495EF8716B911AB0041304E /* EditButtonTableViewCell.m */; }; - C495EF9D16B911AC0041304E /* EditFlagTableViewCell.m in Sources */ = {isa = PBXBuildFile; fileRef = C495EF8916B911AB0041304E /* EditFlagTableViewCell.m */; }; - C495EF9E16B911AC0041304E /* EditSecretTextTableViewCell.m in Sources */ = {isa = PBXBuildFile; fileRef = C495EF8B16B911AB0041304E /* EditSecretTextTableViewCell.m */; }; - C495EF9F16B911AC0041304E /* EditSelectionTableViewCell.m in Sources */ = {isa = PBXBuildFile; fileRef = C495EF8D16B911AB0041304E /* EditSelectionTableViewCell.m */; }; - C495EFA016B911AC0041304E /* EditSubEditTableViewCell.m in Sources */ = {isa = PBXBuildFile; fileRef = C495EF8F16B911AB0041304E /* EditSubEditTableViewCell.m */; }; - C495EFA116B911AC0041304E /* EditTextTableViewCell.m in Sources */ = {isa = PBXBuildFile; fileRef = C495EF9116B911AB0041304E /* EditTextTableViewCell.m */; }; - C495EFA216B911AC0041304E /* RDPSessionView.m in Sources */ = {isa = PBXBuildFile; fileRef = C495EF9316B911AB0041304E /* RDPSessionView.m */; }; - C495EFA316B911AC0041304E /* SessionTableCell.m in Sources */ = {isa = PBXBuildFile; fileRef = C495EF9516B911AB0041304E /* SessionTableCell.m */; }; - C495EFA416B911AC0041304E /* TouchPointerView.m in Sources */ = {isa = PBXBuildFile; fileRef = C495EF9716B911AB0041304E /* TouchPointerView.m */; }; - C495EFAB16B912C40041304E /* libfreerdp.a in Frameworks */ = {isa = PBXBuildFile; fileRef = C495EFAA16B912C40041304E /* libfreerdp.a */; }; - C495EFAE16B913980041304E /* libwinpr.a in Frameworks */ = {isa = PBXBuildFile; fileRef = C495EFAD16B913980041304E /* libwinpr.a */; }; - C495EFBB16B92E170041304E /* about_page in Resources */ = {isa = PBXBuildFile; fileRef = C495EFBA16B92E170041304E /* about_page */; }; - C495EFBD16B92E270041304E /* help_page in Resources */ = {isa = PBXBuildFile; fileRef = C495EFBC16B92E270041304E /* help_page */; }; - C495EFC216B92EA20041304E /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = C495EFC016B92EA20041304E /* Localizable.strings */; }; - C495EFCB16B933230041304E /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = C495EFC916B933230041304E /* AppDelegate.m */; }; - C495EFCC16B933230041304E /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = C495EFCA16B933230041304E /* main.m */; }; - C495F01716B937F90041304E /* libcrypto.a in Frameworks */ = {isa = PBXBuildFile; fileRef = C495F01516B937F80041304E /* libcrypto.a */; }; - C495F01816B937F90041304E /* libssl.a in Frameworks */ = {isa = PBXBuildFile; fileRef = C495F01616B937F90041304E /* libssl.a */; }; - C495F01A16B938210041304E /* Security.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C495F01916B938210041304E /* Security.framework */; }; - C495F01E16B938CB0041304E /* SystemConfiguration.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C495F01D16B938CA0041304E /* SystemConfiguration.framework */; }; - C4B6A8821701979900AA836E /* libfreerdp-client-combined.a in Frameworks */ = {isa = PBXBuildFile; fileRef = C4B6A8811701979900AA836E /* libfreerdp-client-combined.a */; }; - C4C31C6F16BAD1890087BB12 /* Default-568h@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = C4C31C6E16BAD1890087BB12 /* Default-568h@2x.png */; }; -/* End PBXBuildFile section */ - -/* Begin PBXFileReference section */ - C495EE2F16B8372D0041304E /* iFreeRDP.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = iFreeRDP.app; sourceTree = BUILT_PRODUCTS_DIR; }; - C495EE3316B8372D0041304E /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = System/Library/Frameworks/UIKit.framework; sourceTree = SDKROOT; }; - C495EE3516B8372D0041304E /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; }; - C495EE3716B8372D0041304E /* CoreGraphics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreGraphics.framework; path = System/Library/Frameworks/CoreGraphics.framework; sourceTree = SDKROOT; }; - C495EE4116B8372D0041304E /* iFreeRDP-Prefix.pch */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "iFreeRDP-Prefix.pch"; sourceTree = ""; }; - 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; }; - C4B6A8811701979900AA836E /* libfreerdp-client-combined.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = "libfreerdp-client-combined.a"; path = "../common/libfreerdp-client-combined.a"; sourceTree = ""; }; - C4C31C6E16BAD1890087BB12 /* Default-568h@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "Default-568h@2x.png"; path = "Resources/Default-568h@2x.png"; sourceTree = SOURCE_ROOT; }; -/* End PBXFileReference section */ - -/* Begin PBXFrameworksBuildPhase section */ - C495EE2C16B8372D0041304E /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - C495F01716B937F90041304E /* libcrypto.a in Frameworks */, - C495F01816B937F90041304E /* libssl.a in Frameworks */, - C495EFAE16B913980041304E /* libwinpr.a in Frameworks */, - C495EFAB16B912C40041304E /* libfreerdp.a in Frameworks */, - C495EE3416B8372D0041304E /* UIKit.framework in Frameworks */, - C495EE3616B8372D0041304E /* Foundation.framework in Frameworks */, - C495EE3816B8372D0041304E /* CoreGraphics.framework in Frameworks */, - C495F01A16B938210041304E /* Security.framework in Frameworks */, - C495F01E16B938CB0041304E /* SystemConfiguration.framework in Frameworks */, - C4B6A8821701979900AA836E /* libfreerdp-client-combined.a in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXFrameworksBuildPhase section */ - -/* Begin PBXGroup section */ - C495EE2416B8372D0041304E = { - isa = PBXGroup; - children = ( - C495EE3916B8372D0041304E /* iFreeRDP */, - C495EE3216B8372D0041304E /* Frameworks */, - C495EE3016B8372D0041304E /* Products */, - ); - sourceTree = ""; - }; - C495EE3016B8372D0041304E /* Products */ = { - isa = PBXGroup; - children = ( - C495EE2F16B8372D0041304E /* iFreeRDP.app */, - ); - name = Products; - sourceTree = ""; - }; - C495EE3216B8372D0041304E /* Frameworks */ = { - isa = PBXGroup; - children = ( - C4B6A8811701979900AA836E /* libfreerdp-client-combined.a */, - C495EFAA16B912C40041304E /* libfreerdp.a */, - C495EFAD16B913980041304E /* libwinpr.a */, - C495F01516B937F80041304E /* libcrypto.a */, - C495F01616B937F90041304E /* libssl.a */, - C495F01D16B938CA0041304E /* SystemConfiguration.framework */, - C495F01916B938210041304E /* Security.framework */, - C495EE3316B8372D0041304E /* UIKit.framework */, - C495EE3516B8372D0041304E /* Foundation.framework */, - C495EE3716B8372D0041304E /* CoreGraphics.framework */, - ); - name = Frameworks; - sourceTree = ""; - }; - 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 = 4.3; - ONLY_ACTIVE_ARCH = YES; - PROVISIONING_PROFILE = ""; - SDKROOT = iphoneos; - TARGETED_DEVICE_FAMILY = "1,2"; - }; - name = Debug; - }; - C495EE6116B8372D0041304E /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_OBJC_ARC = NO; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - CODE_SIGN_IDENTITY = "iPhone Developer"; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; - COPY_PHASE_STRIP = YES; - GCC_C_LANGUAGE_STANDARD = gnu99; - GCC_WARN_ABOUT_RETURN_TYPE = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 4.3; - OTHER_CFLAGS = "-DNS_BLOCK_ASSERTIONS=1"; - PROVISIONING_PROFILE = ""; - SDKROOT = iphoneos; - TARGETED_DEVICE_FAMILY = "1,2"; - VALIDATE_PRODUCT = YES; - }; - name = Release; - }; - C495EE6316B8372D0041304E /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - CLANG_ENABLE_OBJC_ARC = "$(INHERIT)"; - DEAD_CODE_STRIPPING = "$(INHERIT)"; - GCC_PRECOMPILE_PREFIX_HEADER = YES; - GCC_PREFIX_HEADER = "$(SRCROOT)/iFreeRDP-Prefix.pch"; - HEADER_SEARCH_PATHS = ( - "\"$(SRCROOT)/../../include\"", - "\"$(SRCROOT)/../../winpr/include\"", - "\"$(SRCROOT)/../../\"", - "\"@FREERDP_IOS_EXTERNAL_SSL_PATH@/include\"", - ); - INFOPLIST_FILE = "$(SRCROOT)/iFreeRDP.plist"; - IPHONEOS_DEPLOYMENT_TARGET = 4.3; - LIBRARY_SEARCH_PATHS = ( - "\"$(SRCROOT)/../../libfreerdp\"", - "\"$(SRCROOT)/../../winpr/libwinpr\"", - "\"@FREERDP_IOS_EXTERNAL_SSL_PATH@/lib\"", - "\"$(SRCROOT)/../common\"", - ); - PRODUCT_NAME = "$(TARGET_NAME)"; - WRAPPER_EXTENSION = app; - }; - name = Debug; - }; - C495EE6416B8372D0041304E /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - CLANG_ENABLE_OBJC_ARC = "$(INHERIT)"; - DEAD_CODE_STRIPPING = "$(INHERIT)"; - GCC_PRECOMPILE_PREFIX_HEADER = YES; - GCC_PREFIX_HEADER = "$(SRCROOT)/iFreeRDP-Prefix.pch"; - HEADER_SEARCH_PATHS = ( - "\"$(SRCROOT)/../../include\"", - "\"$(SRCROOT)/../../winpr/include\"", - "\"$(SRCROOT)/../../\"", - "\"@FREERDP_IOS_EXTERNAL_SSL_PATH@/include\"", - ); - INFOPLIST_FILE = "$(SRCROOT)/iFreeRDP.plist"; - IPHONEOS_DEPLOYMENT_TARGET = 4.3; - LIBRARY_SEARCH_PATHS = ( - "\"$(SRCROOT)/../../libfreerdp\"", - "\"$(SRCROOT)/../../winpr/libwinpr\"", - "\"@FREERDP_IOS_EXTERNAL_SSL_PATH@/lib\"", - "\"$(SRCROOT)/../common\"", - ); - PRODUCT_NAME = "$(TARGET_NAME)"; - WRAPPER_EXTENSION = app; - }; - name = Release; - }; -/* End XCBuildConfiguration section */ - -/* Begin XCConfigurationList section */ - C495EE2916B8372D0041304E /* Build configuration list for PBXProject "iFreeRDP" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - C495EE6016B8372D0041304E /* Debug */, - C495EE6116B8372D0041304E /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - C495EE6216B8372D0041304E /* Build configuration list for PBXNativeTarget "iFreeRDP" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - C495EE6316B8372D0041304E /* Debug */, - C495EE6416B8372D0041304E /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; -/* End XCConfigurationList section */ - }; - rootObject = C495EE2616B8372D0041304E /* Project object */; -} diff --git a/winpr/include/winpr/wtypes.h b/winpr/include/winpr/wtypes.h index d16bd2647..a840f16ad 100644 --- a/winpr/include/winpr/wtypes.h +++ b/winpr/include/winpr/wtypes.h @@ -26,6 +26,10 @@ #include #include +#if defined(__OBJC__) && defined(__APPLE__) +#include +#endif + #ifndef _WIN32 #define __int8 char From f5b4dd8ee97b07e2142476b9447b3484e5ecfa78 Mon Sep 17 00:00:00 2001 From: Martin Fleisz Date: Fri, 29 Mar 2013 14:49:41 +0100 Subject: [PATCH 03/26] iOS: iOS doesn't work with monolithic build any more --- cmake/ConfigOptions.cmake | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmake/ConfigOptions.cmake b/cmake/ConfigOptions.cmake index 2c14142e9..07dfdc823 100644 --- a/cmake/ConfigOptions.cmake +++ b/cmake/ConfigOptions.cmake @@ -52,7 +52,7 @@ option(BUILD_TESTING "Build unit tests" OFF) option(WITH_SAMPLE "Build sample code" OFF) if(${CMAKE_VERSION} VERSION_GREATER 2.8.8) - if(ANDROID OR IOS) + if(ANDROID) option(MONOLITHIC_BUILD "Use monolithic build" ON) else() option(MONOLITHIC_BUILD "Use monolithic build" OFF) From 81a97144f1901745a3e1843f82e723f31dfd469e Mon Sep 17 00:00:00 2001 From: Bernhard Miklautz Date: Fri, 29 Mar 2013 16:17:03 +0100 Subject: [PATCH 04/26] channel/tsmf: fix for gstreamer detection Print warning if gstreamer is there but xrandr is missing. --- channels/tsmf/client/CMakeLists.txt | 8 ++++++-- cmake/FindGstreamer.cmake | 4 ---- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/channels/tsmf/client/CMakeLists.txt b/channels/tsmf/client/CMakeLists.txt index a5c982415..6624ec24a 100644 --- a/channels/tsmf/client/CMakeLists.txt +++ b/channels/tsmf/client/CMakeLists.txt @@ -57,12 +57,16 @@ if(WITH_FFMPEG) add_channel_client_subsystem(${MODULE_PREFIX} ${CHANNEL_NAME} "ffmpeg" "decoder") endif() -if(GSTREAMER_FOUND) +if(WITH_GSTREAMER) set(XRANDR_FEATURE_TYPE "REQUIRED") set(XRANDR_FEATURE_PURPOSE "X11 randr") set(XRANDR_FEATURE_DESCRIPTION "X11 randr extension") find_feature(XRandR ${XRANDR_FEATURE_TYPE} ${XRANDR_FEATURE_PURPOSE} ${XRANDR_FEATURE_DESCRIPTION}) - add_channel_client_subsystem(${MODULE_PREFIX} ${CHANNEL_NAME} "gstreamer" "decoder") + if (WITH_XRANDR) + add_channel_client_subsystem(${MODULE_PREFIX} ${CHANNEL_NAME} "gstreamer" "decoder") + else() + message(WARNING "Disabling tsmf gstreamer because XRandR wasn't found") + endif() endif() if(WITH_ALSA) diff --git a/cmake/FindGstreamer.cmake b/cmake/FindGstreamer.cmake index 4a290227c..0d7065e1b 100644 --- a/cmake/FindGstreamer.cmake +++ b/cmake/FindGstreamer.cmake @@ -8,13 +8,9 @@ if(PC_GSTREAMER_0_10_FOUND AND PC_GSTREAMER_PLUGINS_BASE_0_10_FOUND) set(GSTREAMER_FOUND TRUE) endif() -include(FindPackageHandleStandardArgs) -FIND_PACKAGE_HANDLE_STANDARD_ARGS(GSTREAMER DEFAULT_MSG GSTREAMER_FOUND) - if(GSTREAMER_FOUND) set(GSTREAMER_INCLUDE_DIRS ${PC_GSTREAMER_0_10_INCLUDE_DIRS} ${PC_GSTREAMER_PLUGINS_BASE_0_10_INCLUDE_DIRS}) set(GSTREAMER_LIBRARIES ${PC_GSTREAMER_0_10_LIBRARIES} ${PC_GSTREAMER_PLUGINS_BASE_0_10_LIBRARIES}) endif() mark_as_advanced(GSTREAMER_FOUND GSTREAMER_INCLUDE_DIRS GSTREAMER_LIBRARIES) - From 4a92e370e04460ae4a87920c760e0f1776cf95ef Mon Sep 17 00:00:00 2001 From: Hardening Date: Fri, 29 Mar 2013 23:37:13 +0100 Subject: [PATCH 05/26] Fix includes + pkgconfig file This patch fixes some winpr includes when used with C++. It also fix the pkgconfig file as Stream_New has changed of library. --- freerdp.pc.in | 2 +- winpr/include/winpr/error.h | 2 +- winpr/include/winpr/thread.h | 14 +++++++------- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/freerdp.pc.in b/freerdp.pc.in index da43af7b9..59e2b446c 100644 --- a/freerdp.pc.in +++ b/freerdp.pc.in @@ -8,6 +8,6 @@ Description: A free remote desktop protocol client URL: http://www.freerdp.com/ Version: @FREERDP_VERSION_FULL@ Requires: -Libs: -L${libdir} -lfreerdp-cache -lfreerdp-codec -lfreerdp-core -lfreerdp-crypto -lfreerdp-gdi -lfreerdp-locale -lfreerdp-rail -lfreerdp-utils -lwinpr-sspi -lwinpr-rpc +Libs: -L${libdir} -lfreerdp-cache -lfreerdp-codec -lfreerdp-core -lfreerdp-crypto -lfreerdp-gdi -lfreerdp-locale -lfreerdp-rail -lfreerdp-utils -lwinpr-sspi -lwinpr-rpc -lwinpr-utils Cflags: -I${includedir} diff --git a/winpr/include/winpr/error.h b/winpr/include/winpr/error.h index 8999d3858..b1f2c26c7 100644 --- a/winpr/include/winpr/error.h +++ b/winpr/include/winpr/error.h @@ -2908,7 +2908,7 @@ WINPR_API UINT GetErrorMode(void); WINPR_API UINT SetErrorMode(UINT uMode); -WINPR_API DWORD GetLastError(VOID); +WINPR_API DWORD GetLastError(void); WINPR_API VOID SetLastError(DWORD dwErrCode); diff --git a/winpr/include/winpr/thread.h b/winpr/include/winpr/thread.h index 6f7610277..c5e5b892e 100644 --- a/winpr/include/winpr/thread.h +++ b/winpr/include/winpr/thread.h @@ -107,8 +107,8 @@ WINPR_API BOOL CreateProcessAsUserW(HANDLE hToken, LPCWSTR lpApplicationName, LP WINPR_API VOID ExitProcess(UINT uExitCode); -WINPR_API HANDLE _GetCurrentProcess(VOID); -WINPR_API DWORD GetCurrentProcessId(VOID); +WINPR_API HANDLE _GetCurrentProcess(void); +WINPR_API DWORD GetCurrentProcessId(void); WINPR_API BOOL TerminateProcess(HANDLE hProcess, UINT uExitCode); @@ -125,24 +125,24 @@ WINPR_API HANDLE CreateRemoteThread(HANDLE hProcess, LPSECURITY_ATTRIBUTES lpThr WINPR_API VOID ExitThread(DWORD dwExitCode); -WINPR_API HANDLE _GetCurrentThread(VOID); -WINPR_API DWORD GetCurrentThreadId(VOID); +WINPR_API HANDLE _GetCurrentThread(void); +WINPR_API DWORD GetCurrentThreadId(void); WINPR_API DWORD ResumeThread(HANDLE hThread); WINPR_API DWORD SuspendThread(HANDLE hThread); -WINPR_API BOOL SwitchToThread(VOID); +WINPR_API BOOL SwitchToThread(void); WINPR_API BOOL TerminateThread(HANDLE hThread, DWORD dwExitCode); /* Processor */ -WINPR_API DWORD GetCurrentProcessorNumber(VOID); +WINPR_API DWORD GetCurrentProcessorNumber(void); /* Thread-Local Storage */ #define TLS_OUT_OF_INDEXES ((DWORD) 0xFFFFFFFF) -WINPR_API DWORD TlsAlloc(VOID); +WINPR_API DWORD TlsAlloc(void); WINPR_API LPVOID TlsGetValue(DWORD dwTlsIndex); WINPR_API BOOL TlsSetValue(DWORD dwTlsIndex, LPVOID lpTlsValue); WINPR_API BOOL TlsFree(DWORD dwTlsIndex); From 5c0440e5fcbc3c5873ff27312299f3b9c2ac82c7 Mon Sep 17 00:00:00 2001 From: Martin Fleisz Date: Tue, 2 Apr 2013 11:01:59 +0200 Subject: [PATCH 06/26] iOS: removed deprecated cmake options, updated readme --- cmake/ConfigOptionsiOS.cmake | 2 -- docs/README.ios | 40 +++++++----------------------------- 2 files changed, 7 insertions(+), 35 deletions(-) diff --git a/cmake/ConfigOptionsiOS.cmake b/cmake/ConfigOptionsiOS.cmake index 289057692..c9bd4fd0c 100644 --- a/cmake/ConfigOptionsiOS.cmake +++ b/cmake/ConfigOptionsiOS.cmake @@ -15,8 +15,6 @@ # See the License for the specific language governing permissions and # limitations under the License. -option(IOS_BUILD_OBJC "Automatically build iOS objective-c code - build type depends on CMAKE_BUILD_TYPE" ON) -option(IOS_BUILD_OBJC_DEBUG "Create an iOS debug package" ON) if (NOT FREERDP_IOS_EXTERNAL_SSL_PATH) set(FREERDP_IOS_EXTERNAL_SSL_PATH "${CMAKE_CURRENT_SOURCE_DIR}/external/openssl") endif() diff --git a/docs/README.ios b/docs/README.ios index bc4a0c420..38f6a24a7 100644 --- a/docs/README.ios +++ b/docs/README.ios @@ -2,15 +2,7 @@ Overview ======== The FreeRDP iOS port allows users to enjoy FreeRDP features on Apple iOS devices. -The application was written to be compatible with devices running iOS 3.2 or higher. -Please note that Apple dropped armv6 support in their latest Xcode releases. -If you want to compile for armv6 devices you will have to use an older Xcode version and build the OpenSSL libraries for armv6 as well. - -For building the GUI part there are two possibilities: -* integrated build - have cmake to operate Xcode and build everything -* manual build - build FreeRDP libraries and invoke xcodebuild or Xcode manually for the frontend - -Manual builds should be used for development. +The application was written to be compatible with devices running iOS 4.3 or higher. Build requirements @@ -20,7 +12,6 @@ The following prerequisites are required in order to build the iOS port: - cmake version >= 2.8.9 - latest Xcode installed (>= 4.6) -- installed "Command Line Tools" component - installed Provisioning Profile and iOS Developer Certificate for code signing - pre-build static OpenSSL libraries (see below) @@ -43,35 +34,23 @@ If you build OpenSSL youself you need to set FREERDP_IOS_EXTERNAL_SSL_PATH when Building ======== -Integrated build ----------------- - Run the following commands in the top level FreeRDP directory: -cmake -DCMAKE_TOOLCHAIN_FILE=cmake/iOSToolchain.cmake -make +cmake -DCMAKE_TOOLCHAIN_FILE=cmake/iOSToolchain.cmake -GXcode -After that you should have a client/iOS/bin//iFreeRDP.app application package. +This command will create a XCode project in the FreeRDP root folder called FreeRDP.xcodeproj. +Open the project in XCode and modify, build or run the app. -Manual iOS builds ------------------ +Alternatively you can also build the project from the command line using xcodebuild: -First run cmake to prepare the build: - -cmake -DCMAKE_TOOLCHAIN_FILE=cmake/iOSToolchain.cmake -DIOS_BUILD_OBJC=OFF -make - -Now you can run your favourite xcodebuild command in client/iOS like this: - -cd client/iOS -xcodebuild -project iFreeRDP.xcodeproj -configuration Debug -sdk iphoneos6.1 install +xcodebuild -project FreeRDP.xcodeproj -configuration Debug -sdk iphoneos6.1 Notes: * XCode, by default will build the application into its derived data location (usually in ~/Library/Developer/...). If you want to specify an output directory add CONFIGURATION_BUILD_DIR= to the end of above command line. -* If using XCode choose "Open Other" from the welcome screen, browse to the client/iOS directory in your FreeRDP folder and select iFreeRDP.xcodeproj. +* If using XCode choose "Open Other" from the welcome screen, browse to the FreeRDP root directory and select FreeRDP.xcodeproj. cmake variables @@ -92,8 +71,3 @@ CMAKE_IOS_SDK_ROOT (used by toolchain file) FREERDP_IOS_EXTERNAL_SSL_PATH (used by FindOpenSSL) * absolut root path to the pre-built static OpenSSL libraries -IOS_BUILD_OBJC (used by client/iOS/CMakeLists.txt) -* can be ON/OFF (default ON) whether or not to build the objective-c UI with cmake - -IOS_BUILD_OBJC_DEBUG (used by client/iOS/CMakeLists.txt) -* can be ON/OFF (default ON) whether or not to build a debug version of the objective-c UI From 8d160869692a8372cff3f1c0893935a559e5b55a Mon Sep 17 00:00:00 2001 From: Martin Fleisz Date: Tue, 2 Apr 2013 06:33:59 -0700 Subject: [PATCH 07/26] Android: Fix crash after changes in FreeRDP directory handling --- client/Android/FreeRDPCore/jni/android_freerdp.c | 6 +++++- winpr/libwinpr/path/shell.c | 3 +++ 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/client/Android/FreeRDPCore/jni/android_freerdp.c b/client/Android/FreeRDPCore/jni/android_freerdp.c index 2bcb1f334..1e8b7772c 100644 --- a/client/Android/FreeRDPCore/jni/android_freerdp.c +++ b/client/Android/FreeRDPCore/jni/android_freerdp.c @@ -536,8 +536,12 @@ JNIEXPORT void JNICALL jni_freerdp_set_data_directory(JNIEnv *env, jclass cls, j free(settings->HomePath); free(settings->ConfigPath); + int config_dir_len = strlen(directory) + 10; /* +9 chars for /.freerdp and +1 for \0 */ + char* config_dir_buf = (char*)malloc(config_dir_len); + strcpy(config_dir_buf, directory); + strcat(config_dir_buf, "/.freerdp"); settings->HomePath = strdup(directory); - settings->ConfigPath = NULL; + settings->ConfigPath = config_dir_buf; /* will be freed by freerdp library */ (*env)->ReleaseStringUTFChars(env, jdirectory, directory); } diff --git a/winpr/libwinpr/path/shell.c b/winpr/libwinpr/path/shell.c index 9d111debd..c60baa7ac 100644 --- a/winpr/libwinpr/path/shell.c +++ b/winpr/libwinpr/path/shell.c @@ -66,6 +66,9 @@ char* GetPath_HOME() #ifdef _WIN32 path = GetEnvAlloc("UserProfile"); +#elif defined(ANDROID) + path = malloc(2); + strcpy(path, "/"); #else path = GetEnvAlloc("HOME"); #endif From a4fc5f5c15041ea15c8bed6448614c3f444c035f Mon Sep 17 00:00:00 2001 From: Bernhard Miklautz Date: Wed, 3 Apr 2013 00:13:44 +0200 Subject: [PATCH 08/26] Set gstreamer to OPTIONAL on OS X --- CMakeLists.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/CMakeLists.txt b/CMakeLists.txt index 3178dee7c..bd22f7aa8 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -308,6 +308,7 @@ endif() if(APPLE) set(DIRECTFB_FEATURE_TYPE "DISABLED") set(FFMPEG_FEATURE_TYPE "OPTIONAL") + set(GSTREAMER_FEATURE_TYPE "OPTIONAL") if(IOS) set(X11_FEATURE_TYPE "DISABLED") set(ALSA_FEATURE_TYPE "DISABLED") From 62712af114cdbccd4b91983ecd5226549bcbd651 Mon Sep 17 00:00:00 2001 From: Bernhard Miklautz Date: Wed, 3 Apr 2013 01:12:39 +0200 Subject: [PATCH 09/26] build: gstreamer detection fixed build problem on mac --- cmake/FindGstreamer.cmake | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/cmake/FindGstreamer.cmake b/cmake/FindGstreamer.cmake index 0d7065e1b..c4451c61a 100644 --- a/cmake/FindGstreamer.cmake +++ b/cmake/FindGstreamer.cmake @@ -1,16 +1,12 @@ - include(FindPkgConfig) pkg_check_modules(PC_GSTREAMER_0_10 gstreamer-0.10) pkg_check_modules(PC_GSTREAMER_PLUGINS_BASE_0_10 gstreamer-plugins-base-0.10) if(PC_GSTREAMER_0_10_FOUND AND PC_GSTREAMER_PLUGINS_BASE_0_10_FOUND) - set(GSTREAMER_FOUND TRUE) -endif() - -if(GSTREAMER_FOUND) set(GSTREAMER_INCLUDE_DIRS ${PC_GSTREAMER_0_10_INCLUDE_DIRS} ${PC_GSTREAMER_PLUGINS_BASE_0_10_INCLUDE_DIRS}) set(GSTREAMER_LIBRARIES ${PC_GSTREAMER_0_10_LIBRARIES} ${PC_GSTREAMER_PLUGINS_BASE_0_10_LIBRARIES}) endif() -mark_as_advanced(GSTREAMER_FOUND GSTREAMER_INCLUDE_DIRS GSTREAMER_LIBRARIES) +include(FindPackageHandleStandardArgs) +FIND_PACKAGE_HANDLE_STANDARD_ARGS(GSTREAMER DEFAULT_MSG GSTREAMER_LIBRARIES GSTREAMER_INCLUDE_DIRS) From 834ca7fc4a2a13762c6cb8a6ddb7ce59814f184c Mon Sep 17 00:00:00 2001 From: Thinstuff Developer Date: Wed, 3 Apr 2013 09:36:55 +0200 Subject: [PATCH 10/26] iOS: Fixed issue where boookmarks were saved even though cancel was pressed --- client/common/CMakeLists.txt | 13 ------------- .../iOS/Controllers/BookmarkEditorController.h | 2 +- .../iOS/Controllers/BookmarkEditorController.m | 7 +++++-- client/iOS/Controllers/BookmarkListController.m | 16 +++++++++++++--- client/iOS/FreeRDP/ios_freerdp.m | 2 +- client/iOS/Models/Bookmark.h | 1 + client/iOS/Models/Bookmark.m | 7 +++++++ 7 files changed, 28 insertions(+), 20 deletions(-) diff --git a/client/common/CMakeLists.txt b/client/common/CMakeLists.txt index 1bb4e27d1..e249cd0db 100644 --- a/client/common/CMakeLists.txt +++ b/client/common/CMakeLists.txt @@ -61,16 +61,3 @@ if(BUILD_TESTING) add_subdirectory(test) endif() -if(IOS AND MONOLITHIC_BUILD AND (NOT BUILD_SHARED_LIBS)) -# generate combined library - foreach(af ${${MODULE_PREFIX}_LIBS}) - get_target_property(LOC ${af} LOCATION) - if ((NOT (${LOC} MATCHES ".*libfreerdp.a$")) AND (NOT (${LOC} MATCHES ".*libwinpr.a$"))) - set(ALIST ${ALIST} ${LOC}) - endif() - endforeach() - get_target_property(LOC ${MODULE_NAME} LOCATION) - set(ALIST ${ALIST} ${LOC}) - message(${ALIST}) - add_custom_command(TARGET ${MODULE_NAME} POST_BUILD COMMAND libtool -static -o libfreerdp-client-combined.a ${ALIST}) -endif() diff --git a/client/iOS/Controllers/BookmarkEditorController.h b/client/iOS/Controllers/BookmarkEditorController.h index 1ca68d3e4..a2fdb152e 100644 --- a/client/iOS/Controllers/BookmarkEditorController.h +++ b/client/iOS/Controllers/BookmarkEditorController.h @@ -17,7 +17,7 @@ @protocol BookmarkEditorDelegate // bookmark editing finsihed -- (void)commitBookmark:(ComputerBookmark*)bookmark; +- (void)commitBookmark:(ComputerBookmark*)bookmark replacingBookmark:(ComputerBookmark*)replacingBookmark; @end diff --git a/client/iOS/Controllers/BookmarkEditorController.m b/client/iOS/Controllers/BookmarkEditorController.m index de80c50d3..dc5714da6 100644 --- a/client/iOS/Controllers/BookmarkEditorController.m +++ b/client/iOS/Controllers/BookmarkEditorController.m @@ -32,8 +32,11 @@ if ((self = [super initWithStyle:UITableViewStyleGrouped])) { // set additional settings state according to bookmark data - _bookmark = [bookmark retain]; - _params = [bookmark params]; + if ([[bookmark uuid] length] == 0) + _bookmark = [bookmark copy]; + else + _bookmark = [bookmark copyWithUUID]; + _params = [_bookmark params]; // if this is a TSX Connect bookmark - disable server settings if([_bookmark isKindOfClass:NSClassFromString(@"TSXConnectComputerBookmark")]) diff --git a/client/iOS/Controllers/BookmarkListController.m b/client/iOS/Controllers/BookmarkListController.m index b3f43c732..a6ff0685a 100644 --- a/client/iOS/Controllers/BookmarkListController.m +++ b/client/iOS/Controllers/BookmarkListController.m @@ -680,10 +680,20 @@ - (void)commitBookmark:(ComputerBookmark *)bookmark { - // if we got a manual bookmark that is not in the list yet - add it - if (![_manual_bookmarks containsObject:bookmark]) + // if we got a manual bookmark that is not in the list yet - add it otherwise replace it + BOOL found = NO; + for (int idx = 0; idx < [_manual_bookmarks count]; ++idx) + { + if ([[bookmark uuid] isEqualToString:[[_manual_bookmarks objectAtIndex:idx] uuid]]) + { + [_manual_bookmarks replaceObjectAtIndex:idx withObject:bookmark]; + found = YES; + break; + } + } + if (!found) [_manual_bookmarks addObject:bookmark]; - + // remove any quick connect history entry with the same hostname NSString* hostname = [[bookmark params] StringForKey:@"hostname"]; if ([_connection_history containsObject:hostname]) diff --git a/client/iOS/FreeRDP/ios_freerdp.m b/client/iOS/FreeRDP/ios_freerdp.m index ea9581fcb..ae3f1e084 100644 --- a/client/iOS/FreeRDP/ios_freerdp.m +++ b/client/iOS/FreeRDP/ios_freerdp.m @@ -99,7 +99,7 @@ static int ios_receive_channel_data(freerdp* instance, int channelId, UINT8* dat void ios_process_channel_event(rdpChannels* channels, freerdp* instance) { - RDP_EVENT* event = freerdp_channels_pop_event(channels); + wMessage* event = freerdp_channels_pop_event(channels); if (event) freerdp_event_free(event); } diff --git a/client/iOS/Models/Bookmark.h b/client/iOS/Models/Bookmark.h index 4594aa5aa..b66eac804 100644 --- a/client/iOS/Models/Bookmark.h +++ b/client/iOS/Models/Bookmark.h @@ -30,6 +30,7 @@ // Creates a copy of this object, with a new UUID - (id)copy; +- (id)copyWithUUID; // Whether user can delete, move, or rename this entry - (BOOL)isDeletable; diff --git a/client/iOS/Models/Bookmark.m b/client/iOS/Models/Bookmark.m index 2ce7903b7..2cdc6dfe2 100644 --- a/client/iOS/Models/Bookmark.m +++ b/client/iOS/Models/Bookmark.m @@ -87,6 +87,13 @@ return copy; } +- (id)copyWithUUID +{ + ComputerBookmark* copy = [self copy]; + copy->_uuid = [[self uuid] copy]; + return copy; +} + - (void)encodeWithCoder:(NSCoder *)coder { if (![coder allowsKeyedCoding]) From 522fe1baf3ee74e31b185d78a550b5e915e97794 Mon Sep 17 00:00:00 2001 From: Martin Fleisz Date: Wed, 3 Apr 2013 11:04:29 +0200 Subject: [PATCH 11/26] iOS: Corrected wrong function signature --- client/iOS/Controllers/BookmarkEditorController.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/iOS/Controllers/BookmarkEditorController.h b/client/iOS/Controllers/BookmarkEditorController.h index a2fdb152e..1ca68d3e4 100644 --- a/client/iOS/Controllers/BookmarkEditorController.h +++ b/client/iOS/Controllers/BookmarkEditorController.h @@ -17,7 +17,7 @@ @protocol BookmarkEditorDelegate // bookmark editing finsihed -- (void)commitBookmark:(ComputerBookmark*)bookmark replacingBookmark:(ComputerBookmark*)replacingBookmark; +- (void)commitBookmark:(ComputerBookmark*)bookmark; @end From c317fec555c0f1344c9d1e18bd8c6a153737c7fc Mon Sep 17 00:00:00 2001 From: Bernhard Miklautz Date: Wed, 3 Apr 2013 19:19:04 +0200 Subject: [PATCH 12/26] core/capabilities: Enable other codecs when RemoteFX is used CARDP_CAPS_CAPTURE_NON_CAC tells the server to send other codecs as well if RemoteFX is used. This should be on per default and only be disabled if RemoteFxOnly is set (eg when capturing a RemoteFX session). --- libfreerdp/core/capabilities.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libfreerdp/core/capabilities.c b/libfreerdp/core/capabilities.c index 2623598f2..297cfb433 100644 --- a/libfreerdp/core/capabilities.c +++ b/libfreerdp/core/capabilities.c @@ -2506,7 +2506,7 @@ void rdp_write_rfx_client_capability_container(wStream* s, rdpSettings* settings UINT32 captureFlags; BYTE codecMode; - captureFlags = settings->RemoteFxOnly ? CARDP_CAPS_CAPTURE_NON_CAC : 0; + captureFlags = settings->RemoteFxOnly ? 0 : CARDP_CAPS_CAPTURE_NON_CAC; codecMode = settings->RemoteFxCodecMode; stream_write_UINT16(s, 49); /* codecPropertiesLength */ From aea81fb5c84aea447f1d12d8f77a179f52d8a70e Mon Sep 17 00:00:00 2001 From: Bernhard Miklautz Date: Wed, 3 Apr 2013 19:35:45 +0200 Subject: [PATCH 13/26] winpr/mutex: Support for bInitialOwner in CreateMutex --- winpr/libwinpr/synch/mutex.c | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/winpr/libwinpr/synch/mutex.c b/winpr/libwinpr/synch/mutex.c index d4b001dd9..62c2e2611 100644 --- a/winpr/libwinpr/synch/mutex.c +++ b/winpr/libwinpr/synch/mutex.c @@ -39,15 +39,18 @@ HANDLE CreateMutexW(LPSECURITY_ATTRIBUTES lpMutexAttributes, BOOL bInitialOwner, LPCWSTR lpName) { - HANDLE handle; + HANDLE handle = NULL; pthread_mutex_t* pMutex; pMutex = (pthread_mutex_t*) malloc(sizeof(pthread_mutex_t)); if (pMutex) + { pthread_mutex_init(pMutex, 0); - - handle = winpr_Handle_Insert(HANDLE_TYPE_MUTEX, pMutex); + handle = winpr_Handle_Insert(HANDLE_TYPE_MUTEX, pMutex); + if (bInitialOwner) + pthread_mutex_lock(pMutex); + } return handle; } From 0d30f6bf9e2c3b57bd16b6da3e2c146ea155e44a Mon Sep 17 00:00:00 2001 From: Martin Fleisz Date: Thu, 4 Apr 2013 12:28:52 +0200 Subject: [PATCH 14/26] cmake: Allow project-wide includes for third-party components --- CMakeLists.txt | 11 +++++++---- third-party/CMakeLists.txt | 1 + 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 3178dee7c..3c9920ae4 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -420,6 +420,13 @@ endif() # Sub-directories +if(WITH_THIRD_PARTY) + add_subdirectory(third-party) + if (NOT "${THIRD_PARTY_INCLUDES}" STREQUAL "") + include_directories(${THIRD_PARTY_INCLUDES}) + endif() +endif() + add_subdirectory(include) add_subdirectory(libfreerdp) @@ -440,10 +447,6 @@ if(WITH_SERVER) add_subdirectory(server) endif() -if(WITH_THIRD_PARTY) - add_subdirectory(third-party) -endif() - # Packaging SET(CPACK_BINARY_ZIP "ON") diff --git a/third-party/CMakeLists.txt b/third-party/CMakeLists.txt index 07bc7f806..09b1fd46e 100644 --- a/third-party/CMakeLists.txt +++ b/third-party/CMakeLists.txt @@ -29,3 +29,4 @@ foreach(dir ${all_valid_subdirs}) endif() endforeach(dir) +set(THIRD_PARTY_INCLUDES ${THIRD_PARTY_INCLUDES} PARENT_SCOPE) \ No newline at end of file From db79cb34e26191be936d674a30fc58ef20731bd0 Mon Sep 17 00:00:00 2001 From: Martin Fleisz Date: Fri, 5 Apr 2013 10:46:28 +0200 Subject: [PATCH 15/26] iOS: Ensure each bookmark has a UUID --- client/iOS/Models/Bookmark.m | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/iOS/Models/Bookmark.m b/client/iOS/Models/Bookmark.m index 2cdc6dfe2..fbf85502f 100644 --- a/client/iOS/Models/Bookmark.m +++ b/client/iOS/Models/Bookmark.m @@ -39,7 +39,7 @@ // Designated initializer. - (id)initWithConnectionParameters:(ConnectionParams*)params { - if (!(self = [super init])) + if (!(self = [self init])) return nil; _connection_params = [params copy]; From d32598caf586e228daccc0a4de417f8077318b90 Mon Sep 17 00:00:00 2001 From: Martin Fleisz Date: Fri, 5 Apr 2013 12:14:23 +0200 Subject: [PATCH 16/26] libfreerdp-gdi: Add NSC support for Bitmap Cache V3 --- libfreerdp/gdi/graphics.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/libfreerdp/gdi/graphics.c b/libfreerdp/gdi/graphics.c index 6ea323e24..6e83a76f8 100644 --- a/libfreerdp/gdi/graphics.c +++ b/libfreerdp/gdi/graphics.c @@ -116,7 +116,9 @@ void gdi_Bitmap_Decompress(rdpContext* context, rdpBitmap* bitmap, switch (codec_id) { case RDP_CODEC_ID_NSCODEC: - fprintf(stderr, "gdi_Bitmap_Decompress: nsc not done\n"); + gdi = context->gdi; + nsc_process_message(gdi->nsc_context, bpp, width, height, data, length); + freerdp_image_flip(((NSC_CONTEXT*)gdi->nsc_context)->bmpdata, bitmap->data, width, height, bpp); break; case RDP_CODEC_ID_REMOTEFX: gdi = context->gdi; From 0375189c8e64741c9edd4d113177d7cc79e1d0fe Mon Sep 17 00:00:00 2001 From: Martin Fleisz Date: Fri, 5 Apr 2013 12:36:23 +0200 Subject: [PATCH 17/26] iOS/Android: Fix for Win8 --- client/Android/FreeRDPCore/jni/android_freerdp.c | 1 + client/iOS/Models/RDPSession.m | 1 + 2 files changed, 2 insertions(+) diff --git a/client/Android/FreeRDPCore/jni/android_freerdp.c b/client/Android/FreeRDPCore/jni/android_freerdp.c index 1e8b7772c..e93c6b217 100644 --- a/client/Android/FreeRDPCore/jni/android_freerdp.c +++ b/client/Android/FreeRDPCore/jni/android_freerdp.c @@ -601,6 +601,7 @@ JNIEXPORT void JNICALL jni_freerdp_set_connection_info(JNIEnv *env, jclass cls, /* enable NSCodec */ settings->NSCodec = TRUE; + settings->BitmapCacheV3Enabled = TRUE; switch ((int) security) { diff --git a/client/iOS/Models/RDPSession.m b/client/iOS/Models/RDPSession.m index adb45abf9..af400bb61 100644 --- a/client/iOS/Models/RDPSession.m +++ b/client/iOS/Models/RDPSession.m @@ -104,6 +104,7 @@ NSString* TSXSessionDidFailToConnectNotification = @"TSXSessionDidFailToConnect" // enable NSCodec settings->NSCodec = TRUE; + settings->BitmapCacheV3Enabled = TRUE; // Performance flags settings->DisableWallpaper = ![_params boolForKey:@"perf_show_desktop" with3GEnabled:connected_via_3g]; From 75adb75dee5f4f75a1c77d5096d371b36a67f32b Mon Sep 17 00:00:00 2001 From: Martin Fleisz Date: Fri, 5 Apr 2013 12:54:24 +0200 Subject: [PATCH 18/26] libfreerdp-gdi: Added missing include --- libfreerdp/gdi/graphics.c | 1 + 1 file changed, 1 insertion(+) diff --git a/libfreerdp/gdi/graphics.c b/libfreerdp/gdi/graphics.c index 6e83a76f8..dcc3c46e7 100644 --- a/libfreerdp/gdi/graphics.c +++ b/libfreerdp/gdi/graphics.c @@ -30,6 +30,7 @@ #include #include #include +#include #include #include #include From 551cb229759c1d0f64571187ea536596edcd83d5 Mon Sep 17 00:00:00 2001 From: Daryl Poe Date: Fri, 5 Apr 2013 12:53:22 -0600 Subject: [PATCH 19/26] fix for PDU_TYPE_DEMAND_ACTIVE 0001, got 0007 error --- libfreerdp/core/capabilities.c | 56 +++++++++++++++------------------- libfreerdp/core/capabilities.h | 1 + libfreerdp/core/connection.c | 7 ++++- 3 files changed, 31 insertions(+), 33 deletions(-) diff --git a/libfreerdp/core/capabilities.c b/libfreerdp/core/capabilities.c index 297cfb433..fdbf36186 100644 --- a/libfreerdp/core/capabilities.c +++ b/libfreerdp/core/capabilities.c @@ -3222,19 +3222,12 @@ BOOL rdp_read_capability_sets(wStream* s, rdpSettings* settings, UINT16 numberCa return TRUE; } -BOOL rdp_recv_demand_active(rdpRdp* rdp, wStream* s) +BOOL rdp_recv_get_active_header(rdpRdp* rdp, wStream* s, UINT16* pChannelId) { UINT16 length; - UINT16 channelId; - UINT16 pduType; - UINT16 pduLength; - UINT16 pduSource; - UINT16 numberCapabilities; - UINT16 lengthSourceDescriptor; - UINT16 lengthCombinedCapabilities; UINT16 securityFlags; - if (!rdp_read_header(rdp, s, &length, &channelId)) + if (!rdp_read_header(rdp, s, &length, pChannelId)) return FALSE; if (rdp->disconnect) @@ -3255,12 +3248,31 @@ BOOL rdp_recv_demand_active(rdpRdp* rdp, wStream* s) } } - if (channelId != MCS_GLOBAL_CHANNEL_ID) + if (*pChannelId != MCS_GLOBAL_CHANNEL_ID) { - fprintf(stderr, "expected MCS_GLOBAL_CHANNEL_ID %04x, got %04x\n", MCS_GLOBAL_CHANNEL_ID, channelId); + fprintf(stderr, "expected MCS_GLOBAL_CHANNEL_ID %04x, got %04x\n", MCS_GLOBAL_CHANNEL_ID, *pChannelId); return FALSE; } + return TRUE; +} + +BOOL rdp_recv_demand_active(rdpRdp* rdp, wStream* s) +{ + UINT16 channelId; + UINT16 pduType; + UINT16 pduLength; + UINT16 pduSource; + UINT16 numberCapabilities; + UINT16 lengthSourceDescriptor; + UINT16 lengthCombinedCapabilities; + + if (!rdp_recv_get_active_header(rdp, s, &channelId)) + return FALSE; + + if (rdp->disconnect) + return TRUE; + if (!rdp_read_share_control_header(s, &pduLength, &pduType, &pduSource)) { fprintf(stderr, "rdp_read_share_control_header failed\n"); @@ -3375,7 +3387,6 @@ BOOL rdp_send_demand_active(rdpRdp* rdp) BOOL rdp_recv_confirm_active(rdpRdp* rdp, wStream* s) { - UINT16 length; UINT16 channelId; UINT16 pduType; UINT16 pduLength; @@ -3383,27 +3394,8 @@ BOOL rdp_recv_confirm_active(rdpRdp* rdp, wStream* s) UINT16 lengthSourceDescriptor; UINT16 lengthCombinedCapabilities; UINT16 numberCapabilities; - UINT16 securityFlags; - if (!rdp_read_header(rdp, s, &length, &channelId)) - return FALSE; - - if (rdp->settings->DisableEncryption) - { - if (!rdp_read_security_header(s, &securityFlags)) - return FALSE; - - if (securityFlags & SEC_ENCRYPT) - { - if (!rdp_decrypt(rdp, s, length - 4, securityFlags)) - { - fprintf(stderr, "rdp_decrypt failed\n"); - return FALSE; - } - } - } - - if (channelId != MCS_GLOBAL_CHANNEL_ID) + if (!rdp_recv_get_active_header(rdp, s, &channelId)) return FALSE; if (!rdp_read_share_control_header(s, &pduLength, &pduType, &pduSource)) diff --git a/libfreerdp/core/capabilities.h b/libfreerdp/core/capabilities.h index 1ba4f91f1..4a6191d92 100644 --- a/libfreerdp/core/capabilities.h +++ b/libfreerdp/core/capabilities.h @@ -165,6 +165,7 @@ #define CLW_ENTROPY_RLGR1 0x01 #define CLW_ENTROPY_RLGR3 0x04 +BOOL rdp_recv_get_active_header(rdpRdp* rdp, wStream* s, UINT16* pChannelId); BOOL rdp_recv_demand_active(rdpRdp* rdp, wStream* s); void rdp_write_demand_active(wStream* s, rdpSettings* settings); BOOL rdp_send_demand_active(rdpRdp* rdp); diff --git a/libfreerdp/core/connection.c b/libfreerdp/core/connection.c index d3c84cb6d..dabba597f 100644 --- a/libfreerdp/core/connection.c +++ b/libfreerdp/core/connection.c @@ -529,8 +529,13 @@ BOOL rdp_client_connect_demand_active(rdpRdp* rdp, wStream* s) if (!rdp_recv_demand_active(rdp, s)) { + UINT16 channelId; stream_set_mark(s, mark); - stream_seek(s, RDP_PACKET_HEADER_MAX_LENGTH); + rdp_recv_get_active_header(rdp, s, &channelId); + /* Was stream_seek(s, RDP_PACKET_HEADER_MAX_LENGTH); + * but the headers aren't always that length, + * so that could result in a bad offset. + */ if (rdp_recv_out_of_sequence_pdu(rdp, s) != TRUE) return FALSE; From 1c170220722d91b5fbedfdb4d50fabfcadc79c71 Mon Sep 17 00:00:00 2001 From: Christian Hofstaedtler Date: Sat, 6 Apr 2013 18:06:20 +0200 Subject: [PATCH 20/26] Unbreak WITH_DEBUG_X11_LOCAL_MOVESIZE without WITH_DEBUG_X11 --- client/X11/xf_event.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/X11/xf_event.c b/client/X11/xf_event.c index 5c9ba42ba..1d6ee209e 100644 --- a/client/X11/xf_event.c +++ b/client/X11/xf_event.c @@ -32,7 +32,7 @@ #include "xf_event.h" -#ifdef WITH_DEBUG_X11 +#if defined(WITH_DEBUG_X11) || defined(WITH_DEBUG_X11_LOCAL_MOVESIZE) static const char* const X11_EVENT_STRINGS[] = { "", "", From 37e2f97180eb9716f6327fec0d6917ef9a4ca8e6 Mon Sep 17 00:00:00 2001 From: Hardening Date: Sat, 6 Apr 2013 22:22:55 +0200 Subject: [PATCH 21/26] Small correctly in GetVirtualKeyCodeFromVirtualScanCode this function was not doing his job, this patch fixes it. --- winpr/libwinpr/input/scancode.c | 17 +++++++---------- 1 file changed, 7 insertions(+), 10 deletions(-) diff --git a/winpr/libwinpr/input/scancode.c b/winpr/libwinpr/input/scancode.c index d4a92ca8e..e543fa81d 100644 --- a/winpr/libwinpr/input/scancode.c +++ b/winpr/libwinpr/input/scancode.c @@ -567,28 +567,25 @@ DWORD KBD7X[128] = DWORD GetVirtualKeyCodeFromVirtualScanCode(DWORD scancode, DWORD dwKeyboardType) { - DWORD vkcode; + DWORD code_index; - vkcode = VK_NONE; + code_index = scancode & 0xff; + if (code_index > 127) + return VK_NONE; if ((dwKeyboardType != 4) && (dwKeyboardType != 7)) dwKeyboardType = 4; if (dwKeyboardType == 4) { - if (vkcode < 128) - vkcode = (scancode & KBDEXT) ? KBD4X[scancode] : KBD4T[scancode]; + return (scancode & KBDEXT) ? KBD4X[code_index] : KBD4T[code_index]; } else if (dwKeyboardType == 7) { - if (vkcode < 128) - vkcode = (scancode & KBDEXT) ? KBD7X[scancode] : KBD7T[scancode]; + return (scancode & KBDEXT) ? KBD7X[code_index] : KBD7T[code_index]; } - if (!vkcode) - vkcode = VK_NONE; - - return vkcode; + return VK_NONE; } DWORD GetVirtualScanCodeFromVirtualKeyCode(DWORD vkcode, DWORD dwKeyboardType) From 6da16f4165e93912c5cd264fbb0265ee071dc4f1 Mon Sep 17 00:00:00 2001 From: Martin Fleisz Date: Mon, 8 Apr 2013 13:25:00 +0200 Subject: [PATCH 22/26] iOS: Replaced UIViewAlert with custom alert dialog --- client/iOS/Controllers/AboutController.h | 2 +- client/iOS/Controllers/AboutController.m | 24 +- .../Controllers/BookmarkEditorController.h | 2 +- .../Controllers/BookmarkEditorController.m | 22 +- .../iOS/Controllers/BookmarkListController.h | 2 +- .../iOS/Controllers/BookmarkListController.m | 29 +- client/iOS/Controllers/HelpController.m | 23 -- .../Controllers/RDPSessionViewController.h | 2 +- .../Controllers/RDPSessionViewController.m | 23 +- client/iOS/Resources/alert-black-button.png | Bin 0 -> 1591 bytes .../iOS/Resources/alert-black-button@2x.png | Bin 0 -> 2168 bytes client/iOS/Resources/alert-gray-button.png | Bin 0 -> 1622 bytes client/iOS/Resources/alert-gray-button@2x.png | Bin 0 -> 2363 bytes client/iOS/Resources/alert-red-button.png | Bin 0 -> 1512 bytes client/iOS/Resources/alert-red-button@2x.png | Bin 0 -> 2062 bytes client/iOS/Resources/alert-window.png | Bin 0 -> 4886 bytes client/iOS/Resources/alert-window@2x.png | Bin 0 -> 7537 bytes client/iOS/Views/BlockAlertView.h | 28 ++ client/iOS/Views/BlockAlertView.m | 340 ++++++++++++++++++ client/iOS/Views/BlockBackground.h | 24 ++ client/iOS/Views/BlockBackground.m | 160 +++++++++ 21 files changed, 602 insertions(+), 79 deletions(-) create mode 100644 client/iOS/Resources/alert-black-button.png create mode 100644 client/iOS/Resources/alert-black-button@2x.png create mode 100644 client/iOS/Resources/alert-gray-button.png create mode 100644 client/iOS/Resources/alert-gray-button@2x.png create mode 100644 client/iOS/Resources/alert-red-button.png create mode 100644 client/iOS/Resources/alert-red-button@2x.png create mode 100644 client/iOS/Resources/alert-window.png create mode 100644 client/iOS/Resources/alert-window@2x.png create mode 100755 client/iOS/Views/BlockAlertView.h create mode 100755 client/iOS/Views/BlockAlertView.m create mode 100644 client/iOS/Views/BlockBackground.h create mode 100644 client/iOS/Views/BlockBackground.m diff --git a/client/iOS/Controllers/AboutController.h b/client/iOS/Controllers/AboutController.h index 0ace59c13..6d6917a7e 100644 --- a/client/iOS/Controllers/AboutController.h +++ b/client/iOS/Controllers/AboutController.h @@ -10,7 +10,7 @@ #import -@interface AboutController : UIViewController +@interface AboutController : UIViewController { NSString* last_link_clicked; UIWebView* webView; diff --git a/client/iOS/Controllers/AboutController.m b/client/iOS/Controllers/AboutController.m index a30bb40ba..ba3cdb488 100644 --- a/client/iOS/Controllers/AboutController.m +++ b/client/iOS/Controllers/AboutController.m @@ -9,6 +9,7 @@ #import "AboutController.h" #import "Utils.h" +#import "BlockAlertView.h" @implementation AboutController @@ -76,24 +77,19 @@ { [last_link_clicked release]; last_link_clicked = [[[request URL] absoluteString] retain]; - UIAlertView *alert = [[UIAlertView alloc] initWithTitle:NSLocalizedString(@"External Link", @"External Link Alert Title") - message:[NSString stringWithFormat:NSLocalizedString(@"Open [%@] in Browser?", @"Open link in browser (with link as parameter)"), last_link_clicked] - delegate:self - cancelButtonTitle:NSLocalizedString(@"OK", @"OK Button") - otherButtonTitles:NSLocalizedString(@"No", @"No Button"), nil]; - [alert show]; - [alert release]; + BlockAlertView *alert = [BlockAlertView alertWithTitle:NSLocalizedString(@"External Link", @"External Link Alert Title") + message:[NSString stringWithFormat:NSLocalizedString(@"Open [%@] in Browser?", @"Open link in browser (with link as parameter)"), last_link_clicked]]; + + [alert setCancelButtonWithTitle:NSLocalizedString(@"No", @"No Button") block:nil]; + [alert addButtonWithTitle:NSLocalizedString(@"OK", @"OK Button") block:^{ + [[UIApplication sharedApplication] openURL:[NSURL URLWithString:last_link_clicked]]; + }]; + + [alert show]; return NO; } return YES; } -#pragma mark UIAlertView delegate -- (void)alertView:(UIAlertView *)alertView didDismissWithButtonIndex:(NSInteger)buttonIndex -{ - if (buttonIndex == 0) - [[UIApplication sharedApplication] openURL:[NSURL URLWithString:last_link_clicked]]; -} - @end diff --git a/client/iOS/Controllers/BookmarkEditorController.h b/client/iOS/Controllers/BookmarkEditorController.h index 1ca68d3e4..5cdf0c9e0 100644 --- a/client/iOS/Controllers/BookmarkEditorController.h +++ b/client/iOS/Controllers/BookmarkEditorController.h @@ -21,7 +21,7 @@ @end -@interface BookmarkEditorController : EditorBaseController +@interface BookmarkEditorController : EditorBaseController { @private ComputerBookmark* _bookmark; diff --git a/client/iOS/Controllers/BookmarkEditorController.m b/client/iOS/Controllers/BookmarkEditorController.m index dc5714da6..57fa93f39 100644 --- a/client/iOS/Controllers/BookmarkEditorController.m +++ b/client/iOS/Controllers/BookmarkEditorController.m @@ -14,6 +14,7 @@ #import "PerformanceEditorController.h" #import "CredentialsEditorController.h" #import "AdvancedBookmarkEditorController.h" +#import "BlockAlertView.h" @implementation BookmarkEditorController @@ -338,18 +339,6 @@ return YES; } -#pragma mark - UIAlertViewDelegate methods - -- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex -{ - // clicked yes? - if (buttonIndex == 0) - { - // cancel bookmark editing and return to previous view controller - [[self navigationController] popViewControllerAnimated:YES]; - } -} - #pragma mark - #pragma mark Action Handlers @@ -363,8 +352,13 @@ { if ([[_bookmark label] length] == 0 || [[_params StringForKey:@"hostname"] length] == 0 || [_params intForKey:@"port"] == 0) { - UIAlertView* alertView = [[[UIAlertView alloc] initWithTitle:NSLocalizedString(@"Cancel without saving?", @"Incomplete bookmark error title") message:NSLocalizedString(@"Press 'Cancel' to abort!\nPress 'Continue' to specify the required fields!", @"Incomplete bookmark error message") delegate:self cancelButtonTitle:NSLocalizedString(@"Cancel", @"Cancel Button") otherButtonTitles:NSLocalizedString(@"Continue", @"Continue Button"), nil] autorelease]; - [alertView show]; + BlockAlertView* alertView = [BlockAlertView alertWithTitle:NSLocalizedString(@"Cancel without saving?", @"Incomplete bookmark error title") message:NSLocalizedString(@"Press 'Cancel' to abort!\nPress 'Continue' to specify the required fields!", @"Incomplete bookmark error message")]; + [alertView setCancelButtonWithTitle:NSLocalizedString(@"Cancel", @"Cancel Button") block:^{ + // cancel bookmark editing and return to previous view controller + [[self navigationController] popViewControllerAnimated:YES]; + }]; + [alertView addButtonWithTitle:NSLocalizedString(@"Continue", @"Continue Button") block:nil]; + [alertView show]; return; } } diff --git a/client/iOS/Controllers/BookmarkListController.h b/client/iOS/Controllers/BookmarkListController.h index a8a046e94..e57ea9035 100644 --- a/client/iOS/Controllers/BookmarkListController.h +++ b/client/iOS/Controllers/BookmarkListController.h @@ -14,7 +14,7 @@ #import "BookmarkEditorController.h" #import "Reachability.h" -@interface BookmarkListController : UIViewController +@interface BookmarkListController : UIViewController { // custom bookmark and session table cells BookmarkTableCell* _bmTableCell; diff --git a/client/iOS/Controllers/BookmarkListController.m b/client/iOS/Controllers/BookmarkListController.m index a6ff0685a..386917edd 100644 --- a/client/iOS/Controllers/BookmarkListController.m +++ b/client/iOS/Controllers/BookmarkListController.m @@ -14,6 +14,7 @@ #import "Toast+UIView.h" #import "Reachability.h" #import "GlobalDefaults.h" +#import "BlockAlertView.h" #define SECTION_SESSIONS 0 #define SECTION_BOOKMARKS 1 @@ -633,8 +634,17 @@ // ask the user if he wants to save the bookmark NSString* title = NSLocalizedString(@"Save Connection Settings?", @"Save connection settings title"); NSString* message = NSLocalizedString(@"Your Connection Settings have not been saved. Do you want to save them?", @"Save connection settings message"); - UIAlertView* alert = [[UIAlertView alloc] initWithTitle:title message:message delegate:self - cancelButtonTitle:NSLocalizedString(@"Yes", @"Yes Button") otherButtonTitles:NSLocalizedString(@"No", @"No Button"), nil]; + BlockAlertView* alert = [BlockAlertView alertWithTitle:title message:message]; + [alert setCancelButtonWithTitle:NSLocalizedString(@"No", @"No Button") block:nil]; + [alert addButtonWithTitle:NSLocalizedString(@"Yes", @"Yes Button") block:^{ + if (_temporary_bookmark) + { + [_manual_bookmarks addObject:_temporary_bookmark]; + [_tableView reloadSections:[NSIndexSet indexSetWithIndex:SECTION_BOOKMARKS] withRowAnimation:UITableViewRowAnimationNone]; + [_temporary_bookmark autorelease]; + _temporary_bookmark = nil; + } + }]; [alert show]; } } @@ -649,21 +659,6 @@ [[self view] makeToast:NSLocalizedString(@"Failed to connect to session!", @"Failed to connect error message") duration:ToastDurationNormal position:@"center"]; } -#pragma mark - UIAlertView delegates - -- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex -{ - // yes clicked? - if (buttonIndex == 0 && _temporary_bookmark) - { - [_manual_bookmarks addObject:_temporary_bookmark]; - [_tableView reloadSections:[NSIndexSet indexSetWithIndex:SECTION_BOOKMARKS] withRowAnimation:UITableViewRowAnimationNone]; - } - - [_temporary_bookmark autorelease]; - _temporary_bookmark = nil; -} - #pragma mark - Reachability notification - (void)reachabilityChanged:(NSNotification*)notification { diff --git a/client/iOS/Controllers/HelpController.m b/client/iOS/Controllers/HelpController.m index 5ed3bc90b..594dfb2ee 100644 --- a/client/iOS/Controllers/HelpController.m +++ b/client/iOS/Controllers/HelpController.m @@ -55,27 +55,4 @@ return YES; } -#pragma mark - -#pragma mark UIWebView callbacks -- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType -{ - if([[request URL] isFileURL]) - return YES; - - if(navigationType == UIWebViewNavigationTypeLinkClicked) - { - NSString* lastClickedLink = [[request URL] absoluteString]; - UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"External Link" - message:[NSString stringWithFormat:@"Open [%@] in Browser?", lastClickedLink] - delegate:self - cancelButtonTitle:@"OK" - otherButtonTitles:@"No", nil]; - [alert show]; - [alert release]; - - return NO; - } - return YES; -} - @end diff --git a/client/iOS/Controllers/RDPSessionViewController.h b/client/iOS/Controllers/RDPSessionViewController.h index 52502bf9a..996c2915f 100644 --- a/client/iOS/Controllers/RDPSessionViewController.h +++ b/client/iOS/Controllers/RDPSessionViewController.h @@ -14,7 +14,7 @@ #import "TouchPointerView.h" #import "AdvancedKeyboardView.h" -@interface RDPSessionViewController : UIViewController +@interface RDPSessionViewController : UIViewController { // scrollview that hosts the rdp session view IBOutlet UIScrollView* _session_scrollview; diff --git a/client/iOS/Controllers/RDPSessionViewController.m b/client/iOS/Controllers/RDPSessionViewController.m index 87137548c..c431d8c51 100644 --- a/client/iOS/Controllers/RDPSessionViewController.m +++ b/client/iOS/Controllers/RDPSessionViewController.m @@ -15,6 +15,7 @@ #import "ConnectionParams.h" #import "CredentialsInputController.h" #import "VerifyCertificateController.h" +#import "BlockAlertView.h" #define TOOLBAR_HEIGHT 30 @@ -415,8 +416,12 @@ - (void)showGoProScreen:(RDPSession*)session { - UIAlertView* alertView = [[[UIAlertView alloc] initWithTitle:NSLocalizedString(@"Pro Version", @"Pro version dialog title") - message:NSLocalizedString(@"Do you want to buy Thinstuff RDC Pro and enable the full RDP Experience", @"Pro version dialog message") delegate:self cancelButtonTitle:NSLocalizedString(@"No", @"No Button title") otherButtonTitles:NSLocalizedString(@"Yes", @"Yes button title"), nil] autorelease]; + BlockAlertView* alertView = [BlockAlertView alertWithTitle:NSLocalizedString(@"Unlicensed Client", @"Pro version dialog title") message:NSLocalizedString(@"You are connected to Thinstuff Remote Desktop Host (RDH). Do you want to purchase an access license for this client which allows you to connect to any computer running Thinstuff RDH?", @"Pro version dialog message")]; + + [alertView setCancelButtonWithTitle:NSLocalizedString(@"No", @"No Button title") block:nil]; + [alertView addButtonWithTitle:NSLocalizedString(@"Yes", @"Yes button title") block:^ { + }]; + [alertView show]; } @@ -556,16 +561,20 @@ - (void)onTransactionSuccess:(NSNotification*)notification { - UIAlertView* alertView = [[[UIAlertView alloc] initWithTitle:NSLocalizedString(@"Transaction Succeeded", @"Pro version bought dialog title") - message:NSLocalizedString(@"Thanks for buying Thinstuff RDC Pro. In order for the purchase to take effect please reconnect your current session.", @"Pro version bought dialog message") delegate:nil cancelButtonTitle:NSLocalizedString(@"OK", @"OK Button title") otherButtonTitles:nil] autorelease]; + BlockAlertView* alertView = [BlockAlertView alertWithTitle:NSLocalizedString(@"Transaction Succeeded", @"Pro version bought dialog title") + message:NSLocalizedString(@"Thanks for buying Thinstuff RDC Pro. In order for the purchase to take effect please reconnect your current session.", @"Pro version bought dialog message")]; + [alertView setCancelButtonWithTitle:NSLocalizedString(@"OK", @"OK Button title") block:nil]; + [alertView show]; } - (void)onTransactionFailed:(NSNotification*)notification { - UIAlertView* alertView = [[[UIAlertView alloc] initWithTitle:NSLocalizedString(@"Transaction Failed", @"Pro version buy failed dialog title") - message:NSLocalizedString(@"The transaction did not complete successfully!", @"Pro version buy failed dialog message") delegate:nil cancelButtonTitle:NSLocalizedString(@"OK", @"OK Button title") otherButtonTitles:nil] autorelease]; - [alertView show]; + BlockAlertView* alertView = [BlockAlertView alertWithTitle:NSLocalizedString(@"Transaction Failed", @"Pro version buy failed dialog title") + message:NSLocalizedString(@"The transaction did not complete successfully!", @"Pro version buy failed dialog message")]; + [alertView setCancelButtonWithTitle:NSLocalizedString(@"OK", @"OK Button title") block:nil]; + + [alertView show]; } #pragma mark - diff --git a/client/iOS/Resources/alert-black-button.png b/client/iOS/Resources/alert-black-button.png new file mode 100644 index 0000000000000000000000000000000000000000..d06b66df18233a13c822fb93eb10e252d986dbf3 GIT binary patch literal 1591 zcmbVMdr%a09AD`nq68{xG?eR-dLrCD?!9v0aSuJ?=!6T8M$Kh+xx3+Z_u5;y105`U zW#t1w%Y0NbO1>bRabVH_r4&U?Cm|nWiH;(6Iw+y#=t+CPS<^WF(a!Ate&65k`}us| zyV{yHD>~}6C;$MW&9e>J;+iPF$&oLM-=1~DJ{6aE!Dtt9xB|gP@HC*KxO^HkGlYZA zrU|O#{S$O50K8D(ve^Z@B@-t(MoNTqq<+RDq5&W^-R~jDLRtXxX@`r|LOq9?A<#u> zp?L}mV)5u{r)zd8Pv?|o*~rpDQbR%MX<(`!7YP_zAV5FkX1%yy3k~q%;y!c?L*Rgl zP^g6low8f3pq}GtP$5N9NJNQ%N>qx<rD(Z7-%oayF7x6 zW5Ez3kke7FLg`Oc{D5f?}A+VMKK@RB4jyR2dn1gGqxZ!dNrw z6$qB3!**Sw-9fCv^js{i=V?OVcpJyL!yRCCasuadavo5hqW~=g>0(22s62zw8fe~C zOj9PFW59v@;;v`dH>v*gNYL0(3OZZ6az|i(- z>x;tE;h|Y^Vt8>h($2Qb1AqvJ*`TxeFWt7EDQuq^S7x5_pziCDwd_$Q7}H)89M)LU ztxHXggRd=Jzs#Q`>67@K@QVEYh?ls=$S1>B)K5RUa86Hd;9z~;wJ8@Vtm(5~^UjsG zQeBKwAJHDD<$nN4pv8^Mj#?_x*Z;LK2 zPHVY!tKpmRYa16VEb~vb}8y+=x-s=oBsU7cCJXUA7blBKzqgh|b@wiTzeP$IS~G4aU;^9Jg+dz|iJ zD@E6vi_mBqbg~^hcp{J z?o?Rby<_QbShkcIPN+XP0_K{I$!qp@yeUk(GpW5|m_@4(-mROOI~HpwYqQ4e*>Gy- z8}2^CoWKMJNSkOy|Os1Mm9^ZQhA%kyd&Wf zV!HQRMnUdJ+tpc<1IClKRkr=fWASb8wU;)@9gd#nm~v0x@#T|Q6XVHV`(Epqs#U#n ze?vw!SeM7RuU}W33FOU<`>wL`mCVff`eXYJU&&khVnp}-CEw2yB#oOY+{&Ic>3Hg6 rXkB2!=!U4cn=|rbY7@@)k6r{E{Hb?O+X3&9(68KV%rewwEGqvS5XD=- literal 0 HcmV?d00001 diff --git a/client/iOS/Resources/alert-black-button@2x.png b/client/iOS/Resources/alert-black-button@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..4caec8ea3433e36d506619f740521d5d65564cab GIT binary patch literal 2168 zcmbVOdsGuw8qZeRVyYG*+K9Fc0W6>-GYRAcK|>}3D1i{7q6KRb1_+Q$NCF8|UBL$l zu(-Td1ziM+^$D$jS|Kg2_(E7zD3P+eR6xp#h*0Ya741aD-LuEjKRV~k-22`8{eIv3 zoH2{TgXa^Si39>+erO0R!B+%-qwU|pzaf)Z7``mg3#0W>SiIgK)1m}^941GBP?anJ zm7ub?jMQsr0D&+kUMY>%M~lL^3QR?n*>tEzl?F!>2mz~%8kr&))dO-gL8<0Z#+$yS z0LnNXWrLpx6lnx#qB0~?i$-OJOBI>P3QinlRUi;xR4)UJsuZ=3YvfU0@N)6J z?U+UZUa07kd6bt(>E)mlJ zf+#;gBvUBWHrZC5m(jwgR+)~*AzDlYyvQ$C`3Cz4`~TwRGhrdf7BUe(h{I+IDX*|` zzb9uj+!>m!IsT_vW{>a=v~6FvJ}$f-9#oA_j20h_=?E}^K(IR+3iGAL@9)QSBrl9~ zsMxA1ZxD5L*Hv}bF@tX+Fj4406N;T^#30K^{|`c1_Q%h6WRjd<2Vterkxvx1E}n=M zHi(m!mivmzmY3hJW%O+;7nL>qb2{rpjt^MuIXE8&-mtT#+F+uZO<)&(T z7vCdF(_WLZl|A4^k&*X|x;P8TqJl`uk;MUi_MEJ9dF-(XQUG=7ubf0(mn_zS%lO{L7|)0qTJ#mY=4RXq~Q`Z|pFUKMI_~<26+-QK{7* zZMI~pNN8_{`;VxPJVi1vQ4O+%Eu$s?gRGI{-bAWEy16QspcztvyLwY$~%IV7pvO9sz2%}g*yrg(i1U^ zwe7DJ5#k5tfhz_FYY1d9jR#hIfFQNmRZm1UD}8GC@8rQ;(cK|!hVjt|lvo!2#ecdE z4iN`ZR`$F*GxKhx_^QCW(e5#=Qc*nUKM<|y3NEDU7aFpzd0Lf+b*aL}BVosYDRWNvhNrd3%}9uGCNRSg11COu=p zbyH&iQpau!4vW1+UKBiKg4iW7yGf-<2Nt%R^V_FMgKwWHyL`=1KXgJ_)?MlT z^wZ$5jLR!V+xJ~>?9-~G%g`9OXRe23SiWXj=pOOVcxtFNMppoxi)r$<))c8l`XP7Z zNoQ{FwB6of+QPv-jpB~KNZj0P}6a|=yp}flqGq6{?bdDN%Ydg_I)QvG|F?8r;pp;%GT3A zyLvVHv@&PMs{%{5V}po?_#9F2LGO)uMe{!Ix;{{pXMFJW62Eo*HR-plR(U6uPD)Wm zmPw#TCHFcjyxLEs!~Y1DsBe2TUp9ohs$IjoTvRH4{U*oA+*`NZBUg3EBQM@7z6d98 zIDFRB7t+>u>e&KTRDa9k)nCs%lflgw+!9F>9c4{C{?ntZgkL;b2q6>V?|)eOsL1v& N5Go9ZYlF6A{|aRxZfpPm literal 0 HcmV?d00001 diff --git a/client/iOS/Resources/alert-gray-button.png b/client/iOS/Resources/alert-gray-button.png new file mode 100644 index 0000000000000000000000000000000000000000..06548df511cbe012e7c59ff4b696baa05a107691 GIT binary patch literal 1622 zcmbVMdrT8|9IuaniVAZtzQ5o1`}usI zw<#@k-jqo*CviBODe7b_gIy!oH+Dh*`|aC4W-GhA!zeQuEoEdJI8AV51}c{T)Ff^q zG6>wTvhXsI$l;7Lnsu2>re=XePmx^Qr^9uUHrATMNlbFuaD4&60J((8Y?Xq2XX`=0 zY>kBm+~8aPzGVAifBDs4`YPin9bdP6ZsTbZzKz8Gg}ngf>HV+lCUyrObW6$T!YylQHg~r z1QEu=LLMv-A&3YTp%^Mxq5>F36!9`Y#+z*UN)?O=Q5fOzcnG3IWGEs~#mj_pxdKy( zVZPs1ZM8GFRZsYN%`7ipsZ{ZJnBqTeB?_9r8H(0Xl*QixX?YYw+4CqHpwRLG4X!s^ zeX_4SucE~W+Ps1=sA!4=M)E5$zky#R`d8dC0j7jSN`Z=xh(!V=IBIM7KRJU~XCPm5 z{G(a?M{EcBwy#^C6NVe)t~LOOfMZQ z3>i13`g~By9i?0r?VNVaJuCydLyMmUAH6X=_qU{wN%Bq0KapQuRqaYU)NaXLaX-r2 zZI62Nxav+Jnt%)3P341dpSRonZc|ukOXaqdXOF5<*0|4Y8?wx;TUduqzJIcFUn4v| z{fKu)Z?Evoo-50a-z2Z~p712A4k7`iV_y6jEJ_^uPN8U1qX zDQQRKF;7lR=zAx+2wl}jzx-O)*u8wMJ7;h4_@@T)N%8g^+v>yyi$Kvmy{Th^w=TGB z71MuWUU*-MEN#s|&)w33vY-V~Z%OkP{XG9r^y#Tt)m0+VbLQf~tL_2SI9yb6J)o)< z7pabQKDe1ZSqq*1pyi=Gx#IfF@Grz+0rT6;X|iU~9QVmDwL$U^f1LL1I<;1lTV8ti z`Pv*^bF+Z%aLo)d?%#DBs7(L9GQHO5I%;&)qMvW(l4T#av_#{r(b?!w#H^5w2s5`U z^!C@SdHRB=(AEX{L8o#mcP!I9zL#Hq%jA-3(&H~OFH$C7`aSXN-X&+2N=xfuSM==i zgX_TG{IdpP$ literal 0 HcmV?d00001 diff --git a/client/iOS/Resources/alert-gray-button@2x.png b/client/iOS/Resources/alert-gray-button@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..8333e6cfbeece177ff0d3b685a5d18c008b82793 GIT binary patch literal 2363 zcmbVOc~BEs8jpzJaEY!*&_Q~_h_DFh4o65JFgYbk9OV!cG=`*s2sum|!Zm0BMFC+E z6~TjJM#NFW3@V~58eI?+5Dg3wkY!(iry2z>*P0FD=#FA>@EW_0YMMN$-v!MJ%uOL_co7y*LeP@$ND8>_s51B3z! z&fkdxa-?)POz0UagMDH*`0``J`6L0(!yRyoCZhx*7~uiYq6o2^98JM}7vNNF>q>2Z3ORYS_tR#0W3iPAs>a zWnjQ^zDy`Zgc30@!^jJkL?RR%>glHtL{bjt3$a-KIZ;ge9po;^;fyQ)j20@7KNS)>Q8kWXjFI{CSIsU6zW{=PgoY{V9eN^}|Jg^v@7#TVm%1fD*7|gtIHiPOL-SI4l z8x{yJ_8?v*vYWT&RospgUms=^n-?(!+x*Js=_P9K8^>$(M=#=Ap=0<|>(orm8{A~S zg_S`Pbrbfad)Sg)WCpkT;SFK7Bd4>!r)wZ*A^;J3Qsa^NR zPD~8E#-19Q!`=yeBNCXtifMsb-fpsB9i%Bz)85!V;g&d*aEk`38)>^Pj_~N1iShmv z4sm;a1$dzToT)fBcC7nKt#IP*Wca8u_k}X|SjC@M`>}#k`x!WCf8AWrZQ9hxy-JOuJ)N> zXz%^Pq(bD#apH%hrW+O2$`=D$bcc?ctASeGf^R(%jLIHn@7S`mLS>lI_rqD=#DfPp zrcH|D*nM-Vs@TJ0V?$BQpErryUcS5{9qm})s(!2ntQCFli7hWjnzvwAtQf$wM=co~ zT2{FDq`8#wAiuJ9Ag=_*CuuSx$e%DeN*Coh-rRXv>^Rytoy>VBZOP; z&DHxmn3tCq|B+zauwBVh)s3VcDz&wI1f@xd8}y@OWF;RO($75; zX5I%0t!=i~f+tn3>)Y}Kg2;3WzSpJ<9wCF5nzAT6F1@3_{+Isx#jCkil#*cdsCnet z#phecw;y1~t!jig`IZHzFF3wjr_$D%sH`4k)cISudIsuTj`JK@ASNG1N?U}b)r*I) z#c`*rUaq^Q?!2JxY;V^-ZQab|0A4;vkF=PqYHIeVVDHIFUWBzfw==kI&jb6PFM6-t z!gftxb2zb$^y=w(J3FO&N5rE=lb4>^mGDAj7w{~a28YPWxIUc9R%_oRxdXfuy$d!tWeZ`K$!pNeO$^e?}~C)mS!(=T@BDF?OvXKQ+wS|DC1_OSt;juZJ+_;t%SUohH@6 zkZvtThrQ~oYqEZ_5-&#vmUZ}@^Gm2H^BPF>Y+nNcUh}cb9~(R!AT+MfvGn$6^d2b{ zJM>{E33PSPp!#s@O%?e>Qml6TwhuHG7@n8+9RaR=nZdj|yNU73H%&FSf4|)H zSa#s`2(tV+V@Y4ru-Tc-^wy}#x4!q%6X85g)C26Dcz66tQc^*DjZX!}>iADOA-nU8 zZ}WVf-0M1`WZ)Lw_3}OIyCX(u7SXvhr`YuHctN>Pcc1Rfm_<2hC98+!T&{(`Z3y+m z{$JDfY9M2xeQ8eNKTj%EMb{4$1RXii`$tYz*237{{$~;0al?kouYVsw*!w!;%7uLj zvl~D9kZLC1#ci?}l>rH?ceSP6?(}U&^DE%#_aAhOFbkp|(30H(<7R$m*vt(K6>Uf2 FzX8(H>$U&@ literal 0 HcmV?d00001 diff --git a/client/iOS/Resources/alert-red-button.png b/client/iOS/Resources/alert-red-button.png new file mode 100644 index 0000000000000000000000000000000000000000..896742f9c645c90daf785cff15ad467ba69e4701 GIT binary patch literal 1512 zcmeAS@N?(olHy`uVBq!ia0vp^@<6P^!3HGfIwV^GDajJoh?3y^w370~qErUQl>DSr z1<%~X^wgl##FWaylc_cg49sbnArU1JzCKpT`MG+DAT@dwxdlMo3=B5*6$OdO*{LN8 zNvY|XdA3ULckfqH$V{%1*XSQL?vFu&J;D8jzb> zlBiITo0C^;Rbi_HHrEQs1_|pcDS(xfWZNo192Makpx~Tel&WB=XP}#GU}m6TW~gUq zY+`P1uA^XNU}&IkV5Dzoq-$tyWo%?+V4wg6Nh+i#(Mch>H3D2mX;thjEr=FDs+o0^GXscbn}XpVJ5hw7AF^F7L;V>=P7_pOiaoz zEwNPsx)kDt+yY-;xWReF(0~F4nSMoLfxe-hfqrf-$X{U9#U(+h2xnkbT^v$bkg6Y) zTAW{6lnjiIG-a4(VA$ce2&53`8Y};zOkkuW=D6f1m*%GCm3X??DgkBmQZiGl+$_!A z3=Pdq49txT%q$EIEetG-U5uSvjm-=U44q9JVP;^{YwGG|;9_oUVQ6GzWN7GW=xA(c z=4Rq(?&Rd`;$~@J3e)SES6q^qmz)Z-HxpvEej%F^d1{SVn zZl;Eo7G|zWP`xSSgqc3jG5Vmyfs|NaLckOVV#1R?kOR*=sd>O0Qv}Q!#WqKi85o!( zJY5_^DsH`*ao+omgUIpyn`a*>EuEXN^~S9r8+?z3Eq3SCxB&a&q2jxIMh|GJ>#;iNA~VY{wAoxQyHe`)bCEpP8#4|83k~SMvJYJ;>b-!cl4hQ^)wE8VMhZt5leC9>&9W~#^?0*Qx3(f~-h4}6(L(JvdqwrL*4ibA`ggUy^3gx=RiSD1 zq|FKL95T_YHH$u7nmW57+eYu-#eZ|ueN|?BT)#xt@9XN;qid(``1{klfsx_JYX#3@ So#4};ve(nq&t;ucLK6TOojf}L literal 0 HcmV?d00001 diff --git a/client/iOS/Resources/alert-red-button@2x.png b/client/iOS/Resources/alert-red-button@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..852bd3f4b7d48bfa6bbc3b4b660fd3fca21d3790 GIT binary patch literal 2062 zcmbVNc~}!?8czkKAk+da6#AD{lQGtbQTe&4*m-+Mok z;qU8VVzkZ(hr^k8Zs!JIt1I>hKU{^qE8@6%*kXzDglHflL6bx(80Qv^M8SAZxhMt> zfJM>C@$E1RhtreDf`q70;KLLnazLch0W@+YhQ{Go+cZj%I2K0nQE-e*!6r;yY#`ue z(QHD9ivScTIj~f=Jw*ivruYVlQ)0!8Xu>vEJWIpG2;?v-!fWJl3N=&1CcNQgVzTa- zNWi~QL1Wp3w@wKK{&)_eg7Gc@=qv`QAf5^V5Sc=w(VXxk5CVxHi3pLLAsUlRVuB!k z=^|j(RM8S<0GGdH3)`^?QWRA(iNvI&Bp`_lAgUN5#9%OV93+x6rs1qkR-ht{vqHUb znSl$d#VVN+l_3hej!_haB%o{p=IPrIFSC8QMn9AAp{wDZ(F4!Re{pvx zD@|u@(d_r~I$+@i4z_;Y9hP*@ZtKNDfn?#eZ)Zf<5!b}I@hJmsQSRS%9`9NJ9(H`Q z;G~^9UsRFlVMejGo7nI?*L6cpF(l7HPg1<?-v|7 zC#SYH=VluiXia<@x5{d__adPdvx(?n<0Ji)E2c9ZeNAoaZn6f~-nb!RO%1k=QxvBq zcc7}mk`JEE|57!e|Ju%^VYp9YzKPwEZd#U}&sWUsP%%FGzY+8J}O5;3pKD&G9 z@rj6o*DjW}dv^HwG~O6F+9i2H)HrlxH=Jpz^0aNK@lU@nQa$fMe+_yDLV|`QJ7kT@@{EHWXUo8$pC%tkm zm@TM7ckRxoWdGWeZmu7`)~dPVw~NO&NV9$C1)J+*>XRgq7Lq8cWK+2R8vAmg2G0;Ie2yaxyG^q*tprLSCzM7U(=)l8uv<&L%$KE-qP55@U(#xL#}h&Y?}YQ=rR z0B9YS8OpAW(Zo+*9r|X-?2*}{s-kw4BqHm2Z26_X8`ge8b5I2IZ)#f^Hv6b50!CY_pjEZOU-n2GxaHFx+r{hrR<`6wrxjZ)U;GxIHb(d>XyNpVI zo;ZMmsg#8;5cD4bRzq}B&*J%a2l~W-5b~c zwSLY8M`(BYcU|A^OAdW}g(#(a_jcKiIXiEuC^5*9J~<2u{uy?4eW1|ZvtZm}%-T(R z=5qJEBu_gg$vb`j-VaqD)mz=2E!k7zXJtKu+%msRdyz-k;krY6VkQr#hkIi5^ZCEb S{&raRhxX+8a?iO(ru`d(-&KPE literal 0 HcmV?d00001 diff --git a/client/iOS/Resources/alert-window.png b/client/iOS/Resources/alert-window.png new file mode 100644 index 0000000000000000000000000000000000000000..e4907cf53b5f8edc6c2025e8c0a46eb29d5812a9 GIT binary patch literal 4886 zcmV+x6Y1=UP)KLZ*U+IBfRsybQWXdwQbLP>6pAqfylh#{fb6;Z(vMMVS~$e@S=j*ftg6;Uhf59&ghTmgWD0l;*T zI709Y^p6lP1rIRMx#05C~cW=H_Aw*bJ-5DT&Z2n+x)QHX^p z00esgV8|mQcmRZ%02D^@S3L16t`O%c004NIvOKvYIYoh62rY33S640`D9%Y2D-rV&neh&#Q1i z007~1e$oCcFS8neI|hJl{-P!B1ZZ9hpmq0)X0i`JwE&>$+E?>%_LC6RbVIkUx0b+_+BaR3cnT7Zv!AJxW zizFb)h!jyGOOZ85F;a?DAXP{m@;!0_IfqH8(HlgRxt7s3}k3K`kFu>>-2Q$QMFfPW!La{h336o>X zu_CMttHv6zR;&ZNiS=X8v3CR#fknUxHUxJ0uoBa_M6WNWeqIg~6QE69c9o#eyhGvpiOA@W-aonk<7r1(?fC{oI5N*U!4 zfg=2N-7=cNnjjOr{yriy6mMFgG#l znCF=fnQv8CDz++o6_Lscl}eQ+l^ZHARH>?_s@|##Rr6KLRFA1%Q+=*RRWnoLsR`7U zt5vFIcfW3@?wFpwUVxrVZ>QdQz32KIeJ}k~{cZZE^+ya? z2D1z#2HOnI7(B%_ac?{wFUQ;QQA1tBKtrWrm0_3Rgps+?Jfqb{jYbcQX~taRB;#$y zZN{S}1|}gUOHJxc?wV3fxuz+mJ4`!F$IZ;mqRrNsHJd##*D~ju=bP7?-?v~|cv>vB zsJ6IeNwVZxrdjT`yl#bBIa#GxRa#xMMy;K#CDyyGyQdMSxlWT#tDe?p!?5wT$+oGt z8L;Kp2HUQ-ZMJ=3XJQv;x5ci*?vuTfeY$;({XGW_huIFR9a(?@3)XSs8O^N5RyOM=TTmp(3=8^+zpz2r)C z^>JO{deZfso3oq3?Wo(Y?l$ge?uXo;%ru`Vo>?<<(8I_>;8Eq#KMS9gFl*neeosSB zfoHYnBQIkwkyowPu(zdms`p{<7e4kra-ZWq<2*OsGTvEV%s0Td$hXT+!*8Bnh2KMe zBmZRodjHV?r+_5^X9J0WL4jKW`}lf%A-|44I@@LTvf1rHjG(ze6+w@Jt%Bvjts!X0 z?2xS?_ve_-kiKB_KiJlZ$9G`c^=E@oNG)mWWaNo-3TIW8)$Hg0Ub-~8?KhvJ>$ z3*&nim@mj(aCxE5!t{lw7O5^0EIO7zOo&c6l<+|iDySBWCGrz@C5{St!X3hAA}`T4 z(TLbXTq+(;@<=L8dXnssyft|w#WSTW<++3>sgS%(4NTpeI-VAqb|7ssJvzNHgOZVu zaYCvgO_R1~>SyL=cFU|~g|hy|Zi}}s9+d~lYqOB71z9Z$wnC=pR9Yz4DhIM>Wmjgu z&56o6maCpC&F##y%G;1PobR9i?GnNg;gYtchD%p19a!eQtZF&3JaKv33gZ<8D~47E ztUS1iwkmDaPpj=$m#%)jCVEY4fnLGNg2A-`YwHVD3gv};>)hAvT~AmqS>Lr``i7kw zJ{5_It`yrBmlc25DBO7E8;5VoznR>Ww5hAaxn$2~(q`%A-YuS64wkBy=9dm`4cXeX z4c}I@?e+FW+b@^RDBHV(wnMq2zdX3SWv9u`%{xC-q*U}&`cyXV(%rRT*Z6MH?i+i& z_B8C(+grT%{XWUQ+f@NoP1R=AW&26{v-dx)iK^-Nmiuj8txj!m?Z*Ss1N{dh4z}01 z)YTo*JycSU)+_5r4#yw9{+;i4Ee$peRgIj+;v;ZGdF1K$3E%e~4LaI(jC-u%2h$&R z9cLXcYC@Xwnns&bn)_Q~Te?roKGD|d-g^8;+aC{{G(1^(O7m37Y1-+6)01cN&y1aw zoqc{T`P^XJqPBbIW6s}d4{z_f5Om?vMgNQEJG?v2T=KYd^0M3I6IZxbny)%vZR&LD zJpPl@Psh8QyPB@KTx+@RdcC!KX7}kEo;S|j^u2lU7XQ}Oo;f|;z4Ll+_r>@1-xl3| zawq-H%e&ckC+@AhPrP6BKT#_XdT7&;F71j}Joy zkC~6lh7E@6o;W@^IpRNZ{ptLtL(gQ-CY~4mqW;US7Zxvm_|@yz&e53Bp_lTPlfP|z zrTyx_>lv@x#=^!PzR7qqF<$gm`|ZJZ+;<)Cqu&ot2z=0000WV@Og>004R=004l4008;_004mL004C`008P>0026e000+nl3&F} z000O5 z7O;%6LfIrj0+b&BLabl|$~HULu*pOj6wpAV44DiFP21IWx$2(7qN?n&+uz-u>5unO zw=GqdE%$Z#@q2FFdrQm=gb=a~A^;F^0>A$=_EZ~Oh^ zjS%z!fEYkxro&P&Z2+x$y|!1YML)Q46k zQ9{Uw5Hf_20RS3}I)=l5mtOpw)$2RA@811~B}w`d02zRhV4CfA^GDaN?!NlmwW~H9 zW(Yx%rYT#K5Hgp3KS8ZlgIR{>u3feLN8MLHzW?A~aom3s0L0ATeYE$~Qy1R*>Q}z3 zA_6l*k__2;gpie}*LNTy2qEClfBCE1-#^$3A$vc{W6sVucXzLth=ZA7FrZurA*(YO z4AE%R;eCYN-77X6{`*@1a>01-zV^(ei$#a7frIY|A?u>55D`3c=_2mmfADnxKPv{! z$roF#rU5{jW^5@!$l8?dXt!JDoV)^zM)Kk_-uuy57bX}&$l3`e1eisLA`bvpMuGv* z@?JDAk2si)5VAg2xh>rijq9gkCx#b7$flB+^2bOpriFiK7(&RVf>E0-m~phBUO_he38vrg!vJJifD;ezJ-p}IQiPD@ zgrEo^AZR+VtV`uAQf{4)1q1|?^BkS?@IGJr!8y;CB!oaU_y#%AKH44N%i1F~Xr-Nmr)!Twxr{v~VW>uBK2` zWZ8KCJmHMRLkKy!lp@LR6|;t_*pw3{m*%$7+2^_AV6>Pbu+Bic@vb%%rxexIHQlJJ z%KLG+Za5)NDxHk`PgHe@9;QKdvW`bb`zyjf6I$tc}8=iwZUL&!Ez zwMse(P_rfFj+8$W;bB!RO#9f@v^k6QVmcI$TEylj!0EHj@M)&r1C*l)salhbhUJHsNC5uTTd{XmQ`v7An(hm zu038R9g(qk2sztjPA(ENUD|JA$5`&1iUhMX;Y{8vlup^$Wdo<_blMr0S`-gCjUpNU z+KQ=Uo=i>#Pdve_pLAxtF=hb5#F?vHJb;KW@sLv>lKFD5`93+ezLPVXVAfAM)Bn)i za0oL@T=KR|JOY7pGL}!#zeD+u-E`VP|#BGdD75=K^wYZhS3Xb~2OdH+A{trHZ0|!~odRvc}dF$!Ypb&Rx;&tSvY-_syF4 z7iXoOV$x@r{a9B#aaB4Zu5!;0-|3e}E{t-G>Z(l2l3Z5)s+-z6v!CQFEs!nk3R#q?qqsM-m3m5T1+~bW2ilo#W1P-D zn8#aS%_zAJ9aXmQK+dO3U||{(U?iGSLRI-p_X}|%X|;{@P=7~NB4c?J+pxwN7F*#c z5w0V!ULVZpq61vfZq4kw;NY~SPqnBdTU6pnWqQS|&S^J8Mym`~JdTd;W%FCA<;G+> z)P>Jw#i}+SYusOa0Y2H~RWve|dBh5bLzFxyuXRQW3Y^Q*5!~p0@Ddx9z;flPYOBX|ItiEs@lCT_ncalPD;gyNO5Y z2@EiE2HM4{*38F#@X{qL=m^>1_$dycBBb<3f-%E?gX;6*JPg8)UP8!5Ur`1i3kowl ztRxuwAWhTjk$2{uAj_0(MF?37?;T)J>Hu1`TJ%D_Uip=+OQ!vFvP07*qo IM6N<$g6rlaSpWb4 literal 0 HcmV?d00001 diff --git a/client/iOS/Resources/alert-window@2x.png b/client/iOS/Resources/alert-window@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..2ecd138557734dc3842f83a66dfc051c22e963d3 GIT binary patch literal 7537 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 literal 0 HcmV?d00001 diff --git a/client/iOS/Views/BlockAlertView.h b/client/iOS/Views/BlockAlertView.h new file mode 100755 index 000000000..9a6a4431d --- /dev/null +++ b/client/iOS/Views/BlockAlertView.h @@ -0,0 +1,28 @@ +// +// BlockAlertView.h +// +// + +#import + +@interface BlockAlertView : NSObject { +@private + UIView *_view; + NSMutableArray *_blocks; + CGFloat _height; +} + ++ (BlockAlertView *)alertWithTitle:(NSString *)title message:(NSString *)message; + +- (id)initWithTitle:(NSString *)title message:(NSString *)message; + +- (void)setDestructiveButtonWithTitle:(NSString *)title block:(void (^)())block; +- (void)setCancelButtonWithTitle:(NSString *)title block:(void (^)())block; +- (void)addButtonWithTitle:(NSString *)title block:(void (^)())block; + +- (void)show; +- (void)dismissWithClickedButtonIndex:(NSInteger)buttonIndex animated:(BOOL)animated; + +@property (nonatomic, readonly) UIView *view; + +@end diff --git a/client/iOS/Views/BlockAlertView.m b/client/iOS/Views/BlockAlertView.m new file mode 100755 index 000000000..f231d7dc5 --- /dev/null +++ b/client/iOS/Views/BlockAlertView.m @@ -0,0 +1,340 @@ +// +// BlockAlertView.m +// +// + +#import "BlockAlertView.h" +#import "BlockBackground.h" + +@implementation BlockAlertView + +@synthesize view = _view; + +static UIImage *background = nil; +static UIFont *titleFont = nil; +static UIFont *messageFont = nil; +static UIFont *buttonFont = nil; + +#define kBounce 20 +#define kBorder 10 +#define kButtonHeight 44 + +#define kAlertFontColor [UIColor colorWithWhite:244.0/255.0 alpha:1.0] + +#define kAlertViewBackground @"alert-window.png" +#define kAlertViewBackgroundCapHeight 38 + +#pragma mark - init + ++ (void)initialize +{ + if (self == [BlockAlertView class]) + { + background = [UIImage imageNamed:kAlertViewBackground]; + background = [[background stretchableImageWithLeftCapWidth:0 topCapHeight:kAlertViewBackgroundCapHeight] retain]; + titleFont = [[UIFont boldSystemFontOfSize:20] retain]; + messageFont = [[UIFont systemFontOfSize:18] retain]; + buttonFont = [[UIFont boldSystemFontOfSize:18] retain]; + } +} + ++ (BlockAlertView *)alertWithTitle:(NSString *)title message:(NSString *)message +{ + return [[[BlockAlertView alloc] initWithTitle:title message:message] autorelease]; +} + +/////////////////////////////////////////////////////////////////////////////////////////////////// +#pragma mark - NSObject + +- (id)initWithTitle:(NSString *)title message:(NSString *)message +{ + if ((self = [super init])) + { + BlockBackground* blockBackground = [BlockBackground sharedInstance]; + [blockBackground sizeToFill]; + [self setViewTransform:blockBackground forOrientation:blockBackground.orientation]; + + CGRect frame = blockBackground.bounds; + frame.origin.x = (frame.size.width - background.size.width) * 0.5; + frame.size.width = background.size.width; + + _view = [[UIView alloc] initWithFrame:frame]; + _blocks = [[NSMutableArray alloc] init]; + _height = kBorder + 15; + + if (title) + { + CGSize size = [title sizeWithFont:titleFont + constrainedToSize:CGSizeMake(frame.size.width-kBorder*2, 1000) + lineBreakMode:NSLineBreakByWordWrapping]; + + UILabel *labelView = [[UILabel alloc] initWithFrame:CGRectMake(kBorder, _height, frame.size.width-kBorder*2, size.height)]; + labelView.font = titleFont; + labelView.numberOfLines = 0; + labelView.lineBreakMode = NSLineBreakByWordWrapping; + labelView.textColor = kAlertFontColor; + labelView.backgroundColor = [UIColor clearColor]; + labelView.textAlignment = NSTextAlignmentCenter; + labelView.shadowColor = [UIColor blackColor]; + labelView.shadowOffset = CGSizeMake(0, -1); + labelView.text = title; + [_view addSubview:labelView]; + [labelView release]; + + _height += size.height + kBorder; + } + + if (message) + { + CGSize size = [message sizeWithFont:messageFont + constrainedToSize:CGSizeMake(frame.size.width-kBorder*2, 1000) + lineBreakMode:NSLineBreakByWordWrapping]; + + UILabel *labelView = [[UILabel alloc] initWithFrame:CGRectMake(kBorder, _height, frame.size.width-kBorder*2, size.height)]; + labelView.font = messageFont; + labelView.numberOfLines = 0; + labelView.lineBreakMode = NSLineBreakByWordWrapping; + labelView.textColor = kAlertFontColor; + labelView.backgroundColor = [UIColor clearColor]; + labelView.textAlignment = NSTextAlignmentCenter; + labelView.shadowColor = [UIColor blackColor]; + labelView.shadowOffset = CGSizeMake(0, -1); + labelView.text = message; + [_view addSubview:labelView]; + [labelView release]; + + _height += size.height + kBorder; + } + } + + return self; +} + +- (void)dealloc +{ + [_view release]; + [_blocks release]; + [super dealloc]; +} + +- (void)setViewTransform:(UIView*)view forOrientation:(UIInterfaceOrientation)orientation +{ + switch(orientation) + { + case UIInterfaceOrientationPortrait: + view.transform = CGAffineTransformMakeRotation(0); + break; + + case UIInterfaceOrientationPortraitUpsideDown: + view.transform = CGAffineTransformMakeRotation((-2) *M_PI/2); + break; + + case UIInterfaceOrientationLandscapeRight: + view.transform = CGAffineTransformMakeRotation(M_PI/2); + break; + + case UIInterfaceOrientationLandscapeLeft: + view.transform = CGAffineTransformMakeRotation((-1) * M_PI/2); + break; + } +} + +/////////////////////////////////////////////////////////////////////////////////////////////////// +#pragma mark - Public + +- (void)addButtonWithTitle:(NSString *)title color:(NSString*)color block:(void (^)())block +{ + [_blocks addObject:[NSArray arrayWithObjects: + block ? [[block copy] autorelease] : [NSNull null], + title, + color, + nil]]; +} + +- (void)addButtonWithTitle:(NSString *)title block:(void (^)())block +{ + [self addButtonWithTitle:title color:@"gray" block:block]; +} + +- (void)setCancelButtonWithTitle:(NSString *)title block:(void (^)())block +{ + [self addButtonWithTitle:title color:@"black" block:block]; +} + +- (void)setDestructiveButtonWithTitle:(NSString *)title block:(void (^)())block +{ + [self addButtonWithTitle:title color:@"red" block:block]; +} + +- (void)show +{ + BOOL isSecondButton = NO; + NSUInteger index = 0; + for (NSUInteger i = 0; i < _blocks.count; i++) + { + NSArray *block = [_blocks objectAtIndex:i]; + NSString *title = [block objectAtIndex:1]; + NSString *color = [block objectAtIndex:2]; + + UIImage *image = [UIImage imageNamed:[NSString stringWithFormat:@"alert-%@-button.png", color]]; + image = [image stretchableImageWithLeftCapWidth:(int)(image.size.width+1)>>1 topCapHeight:0]; + + CGFloat maxHalfWidth = floorf((_view.bounds.size.width-kBorder*3)*0.5); + CGFloat width = _view.bounds.size.width-kBorder*2; + CGFloat xOffset = kBorder; + if (isSecondButton) + { + width = maxHalfWidth; + xOffset = width + kBorder * 2; + isSecondButton = NO; + } + else if (i + 1 < _blocks.count) + { + // In this case there's another button. + // Let's check if they fit on the same line. + CGSize size = [title sizeWithFont:buttonFont + minFontSize:10 + actualFontSize:nil + forWidth:_view.bounds.size.width-kBorder*2 + lineBreakMode:NSLineBreakByClipping]; + + if (size.width < maxHalfWidth - kBorder) + { + // It might fit. Check the next Button + NSArray *block2 = [_blocks objectAtIndex:i+1]; + NSString *title2 = [block2 objectAtIndex:1]; + size = [title2 sizeWithFont:buttonFont + minFontSize:10 + actualFontSize:nil + forWidth:_view.bounds.size.width-kBorder*2 + lineBreakMode:NSLineBreakByClipping]; + + if (size.width < maxHalfWidth - kBorder) + { + // They'll fit! + isSecondButton = YES; // For the next iteration + width = maxHalfWidth; + } + } + } + + UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom]; + button.frame = CGRectMake(xOffset, _height, width, kButtonHeight); + button.titleLabel.font = buttonFont; + if ([button.titleLabel respondsToSelector:@selector(setMinimumScaleFactor:)]) + button.titleLabel.minimumScaleFactor = 10; + button.titleLabel.textAlignment = NSTextAlignmentCenter; + button.titleLabel.shadowOffset = CGSizeMake(0, -1); + button.backgroundColor = [UIColor clearColor]; + button.tag = i+1; + + [button setBackgroundImage:image forState:UIControlStateNormal]; + [button setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal]; + [button setTitleShadowColor:[UIColor blackColor] forState:UIControlStateNormal]; + [button setTitle:title forState:UIControlStateNormal]; + button.accessibilityLabel = title; + + [button addTarget:self action:@selector(buttonClicked:) forControlEvents:UIControlEventTouchUpInside]; + + [_view addSubview:button]; + + if (!isSecondButton) + _height += kButtonHeight + kBorder; + + index++; + } + + CGRect frame = _view.frame; + frame.origin.y = - _height; + frame.size.height = _height; + _view.frame = frame; + + UIImageView *modalBackground = [[UIImageView alloc] initWithFrame:_view.bounds]; + modalBackground.image = background; + modalBackground.contentMode = UIViewContentModeScaleToFill; + [_view insertSubview:modalBackground atIndex:0]; + [modalBackground release]; + + [[BlockBackground sharedInstance] addToMainWindow:_view]; + + __block CGPoint center = _view.center; + center.y = floorf([BlockBackground sharedInstance].bounds.size.height * 0.5) + kBounce; + + [UIView animateWithDuration:0.4 + delay:0.0 + options:UIViewAnimationOptionCurveEaseOut + animations:^{ + [BlockBackground sharedInstance].alpha = 1.0f; + _view.center = center; + } + completion:^(BOOL finished) { + [UIView animateWithDuration:0.1 + delay:0.0 + options:0 + animations:^{ + center.y -= kBounce; + _view.center = center; + } + completion:nil]; + }]; + + [self retain]; +} + +- (void)dismissWithClickedButtonIndex:(NSInteger)buttonIndex animated:(BOOL)animated +{ + if (buttonIndex >= 0 && buttonIndex < [_blocks count]) + { + id obj = [[_blocks objectAtIndex: buttonIndex] objectAtIndex:0]; + if (![obj isEqual:[NSNull null]]) + { + ((void (^)())obj)(); + } + } + + if (animated) + { + [UIView animateWithDuration:0.1 + delay:0.0 + options:0 + animations:^{ + CGPoint center = _view.center; + center.y += 20; + _view.center = center; + } + completion:^(BOOL finished) { + [UIView animateWithDuration:0.4 + delay:0.0 + options:UIViewAnimationOptionCurveEaseIn + animations:^{ + CGRect frame = _view.frame; + frame.origin.y = -frame.size.height; + _view.frame = frame; + [[BlockBackground sharedInstance] reduceAlphaIfEmpty]; + } + completion:^(BOOL finished) { + [[BlockBackground sharedInstance] removeView:_view]; + [_view release]; _view = nil; + [self autorelease]; + }]; + }]; + } + else + { + [[BlockBackground sharedInstance] removeView:_view]; + [_view release]; _view = nil; + [self autorelease]; + } +} + +/////////////////////////////////////////////////////////////////////////////////////////////////// +#pragma mark - Action + +- (void)buttonClicked:(id)sender +{ + /* Run the button's block */ + int buttonIndex = [sender tag] - 1; + [self dismissWithClickedButtonIndex:buttonIndex animated:YES]; +} + +@end diff --git a/client/iOS/Views/BlockBackground.h b/client/iOS/Views/BlockBackground.h new file mode 100644 index 000000000..c5cfb66c7 --- /dev/null +++ b/client/iOS/Views/BlockBackground.h @@ -0,0 +1,24 @@ +// +// BlockBackground.h +// arrived +// +// Created by Gustavo Ambrozio on 29/11/11. +// Copyright (c) 2011 N/A. All rights reserved. +// + +#import + +@interface BlockBackground : UIWindow + ++ (BlockBackground *) sharedInstance; + +- (void)addToMainWindow:(UIView *)view; +- (void)reduceAlphaIfEmpty; +- (void)removeView:(UIView *)view; + +- (UIInterfaceOrientation)orientation; +- (CGFloat)statusBarHeight; + +- (void)sizeToFill; + +@end diff --git a/client/iOS/Views/BlockBackground.m b/client/iOS/Views/BlockBackground.m new file mode 100644 index 000000000..a4633f9e9 --- /dev/null +++ b/client/iOS/Views/BlockBackground.m @@ -0,0 +1,160 @@ +// +// BlockBackground.m +// arrived +// +// Created by Gustavo Ambrozio on 29/11/11. +// Copyright (c) 2011 N/A. All rights reserved. +// +#import +#import "BlockBackground.h" + +@implementation BlockBackground + +static BlockBackground *_sharedInstance = nil; + ++ (BlockBackground*)sharedInstance +{ + if (_sharedInstance != nil) { + return _sharedInstance; + } + + @synchronized(self) { + if (_sharedInstance == nil) { + [[[self alloc] init] autorelease]; + } + } + + return _sharedInstance; +} + ++ (id)allocWithZone:(NSZone*)zone +{ + @synchronized(self) { + if (_sharedInstance == nil) { + _sharedInstance = [super allocWithZone:zone]; + return _sharedInstance; + } + } + NSAssert(NO, @ "[BlockBackground alloc] explicitly called on singleton class."); + return nil; +} + +- (id)copyWithZone:(NSZone*)zone +{ + return self; +} + +- (id)retain +{ + return self; +} + +- (unsigned)retainCount +{ + return UINT_MAX; +} + +- (oneway void)release +{ +} + +- (id)autorelease +{ + return self; +} + +- (void)sizeToFill +{ + UIInterfaceOrientation o = [self orientation]; + + if(UIInterfaceOrientationIsPortrait(o)) + { + CGRect r = [[UIScreen mainScreen] applicationFrame]; + + CGFloat portraitHeight = [[UIScreen mainScreen] bounds].size.height; + CGFloat portraitWidth = [[UIScreen mainScreen] bounds].size.width; + + CGFloat center_y = (r.size.height / 2) + [self statusBarHeight]; + CGFloat center_x = (r.size.width / 2); + + self.bounds = CGRectMake(0, 0, portraitWidth, portraitHeight); + self.center = CGPointMake(center_x, center_y); + } + else if(UIInterfaceOrientationIsLandscape(o)) + { + CGFloat landscapeHeight = [[UIScreen mainScreen] bounds].size.height; + CGFloat landscapeWidth = [[UIScreen mainScreen] bounds].size.width; + CGFloat center_y = (landscapeHeight/2); + CGFloat center_x = (landscapeWidth / 2); + + self.bounds = CGRectMake(0, 0, landscapeHeight, landscapeWidth); + self.center = CGPointMake(center_x, center_y); + } +} + +- (id)init +{ + self = [super initWithFrame:[[UIScreen mainScreen] applicationFrame]]; + if (self) { + self.windowLevel = UIWindowLevelStatusBar; + self.hidden = YES; + self.userInteractionEnabled = NO; + self.backgroundColor = [UIColor colorWithWhite:0.4 alpha:0.5f]; + } + return self; +} + +- (UIInterfaceOrientation)orientation +{ + return [UIApplication sharedApplication].statusBarOrientation; +} + +- (CGFloat)statusBarHeight +{ + CGSize statusBarSize =[[UIApplication sharedApplication] statusBarFrame].size; + return MIN(statusBarSize.height, statusBarSize.width); +} + +- (void)addToMainWindow:(UIView *)view +{ + if (self.hidden) + { + self.alpha = 0.0f; + self.hidden = NO; + self.userInteractionEnabled = YES; + [self makeKeyAndVisible]; + } + + if (self.subviews.count > 0) + { + ((UIView*)[self.subviews lastObject]).userInteractionEnabled = NO; + } + + [self addSubview:view]; +} + +- (void)reduceAlphaIfEmpty +{ + if (self.subviews.count == 1) + { + self.alpha = 0.0f; +// 20120907JY - disabling this user interaction can cause issues with fast taps when showing alerts - thanks for finding Anagd. +// self.userInteractionEnabled = NO; + } +} + +- (void)removeView:(UIView *)view +{ + [view removeFromSuperview]; + if (self.subviews.count == 0) + { + self.hidden = YES; + [self resignKeyWindow]; + } + else + { + ((UIView*)[self.subviews lastObject]).userInteractionEnabled = YES; + } +} + +@end From fea94078143a156ae9b235ac7efd1aa17fe7c3f0 Mon Sep 17 00:00:00 2001 From: Martin Fleisz Date: Mon, 8 Apr 2013 14:17:47 +0200 Subject: [PATCH 23/26] iOS: BlockAlertView now supports rotation --- .../iOS/Resources/alert-window-landscape.png | Bin 0 -> 3518 bytes .../Resources/alert-window-landscape@2x.png | Bin 0 -> 5904 bytes client/iOS/Views/BlockAlertView.h | 15 +- client/iOS/Views/BlockAlertView.m | 321 ++++++++++++------ client/iOS/Views/BlockBackground.h | 11 +- client/iOS/Views/BlockBackground.m | 149 +++++--- client/iOS/Views/BlockUI.h | 72 ++++ 7 files changed, 414 insertions(+), 154 deletions(-) create mode 100644 client/iOS/Resources/alert-window-landscape.png create mode 100644 client/iOS/Resources/alert-window-landscape@2x.png create mode 100644 client/iOS/Views/BlockUI.h diff --git a/client/iOS/Resources/alert-window-landscape.png b/client/iOS/Resources/alert-window-landscape.png new file mode 100644 index 0000000000000000000000000000000000000000..1149b28cd130099788d7ae3a4ae35c6e6d24ed4f GIT binary patch literal 3518 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 literal 0 HcmV?d00001 diff --git a/client/iOS/Views/BlockAlertView.h b/client/iOS/Views/BlockAlertView.h index 9a6a4431d..a7441b13c 100755 --- a/client/iOS/Views/BlockAlertView.h +++ b/client/iOS/Views/BlockAlertView.h @@ -6,23 +6,36 @@ #import @interface BlockAlertView : NSObject { -@private +@protected UIView *_view; NSMutableArray *_blocks; CGFloat _height; + NSString *_title; + NSString *_message; + BOOL _shown; + BOOL _cancelBounce; } + (BlockAlertView *)alertWithTitle:(NSString *)title message:(NSString *)message; ++ (void)showInfoAlertWithTitle:(NSString *)title message:(NSString *)message; ++ (void)showErrorAlert:(NSError *)error; + - (id)initWithTitle:(NSString *)title message:(NSString *)message; - (void)setDestructiveButtonWithTitle:(NSString *)title block:(void (^)())block; - (void)setCancelButtonWithTitle:(NSString *)title block:(void (^)())block; - (void)addButtonWithTitle:(NSString *)title block:(void (^)())block; +- (void)addComponents:(CGRect)frame; + - (void)show; - (void)dismissWithClickedButtonIndex:(NSInteger)buttonIndex animated:(BOOL)animated; +- (void)setupDisplay; + +@property (nonatomic, retain) UIImage *backgroundImage; @property (nonatomic, readonly) UIView *view; +@property (nonatomic, readwrite) BOOL vignetteBackground; @end diff --git a/client/iOS/Views/BlockAlertView.m b/client/iOS/Views/BlockAlertView.m index f231d7dc5..2a7270047 100755 --- a/client/iOS/Views/BlockAlertView.m +++ b/client/iOS/Views/BlockAlertView.m @@ -5,24 +5,20 @@ #import "BlockAlertView.h" #import "BlockBackground.h" +#import "BlockUI.h" @implementation BlockAlertView @synthesize view = _view; +@synthesize backgroundImage = _backgroundImage; +@synthesize vignetteBackground = _vignetteBackground; static UIImage *background = nil; +static UIImage *backgroundlandscape = nil; static UIFont *titleFont = nil; static UIFont *messageFont = nil; static UIFont *buttonFont = nil; -#define kBounce 20 -#define kBorder 10 -#define kButtonHeight 44 - -#define kAlertFontColor [UIColor colorWithWhite:244.0/255.0 alpha:1.0] - -#define kAlertViewBackground @"alert-window.png" -#define kAlertViewBackgroundCapHeight 38 #pragma mark - init @@ -32,9 +28,13 @@ static UIFont *buttonFont = nil; { background = [UIImage imageNamed:kAlertViewBackground]; background = [[background stretchableImageWithLeftCapWidth:0 topCapHeight:kAlertViewBackgroundCapHeight] retain]; - titleFont = [[UIFont boldSystemFontOfSize:20] retain]; - messageFont = [[UIFont systemFontOfSize:18] retain]; - buttonFont = [[UIFont boldSystemFontOfSize:18] retain]; + + backgroundlandscape = [UIImage imageNamed:kAlertViewBackgroundLandscape]; + backgroundlandscape = [[backgroundlandscape stretchableImageWithLeftCapWidth:0 topCapHeight:kAlertViewBackgroundCapHeight] retain]; + + titleFont = [kAlertViewTitleFont retain]; + messageFont = [kAlertViewMessageFont retain]; + buttonFont = [kAlertViewButtonFont retain]; } } @@ -43,68 +43,126 @@ static UIFont *buttonFont = nil; return [[[BlockAlertView alloc] initWithTitle:title message:message] autorelease]; } ++ (void)showInfoAlertWithTitle:(NSString *)title message:(NSString *)message +{ + BlockAlertView *alert = [[BlockAlertView alloc] initWithTitle:title message:message]; + [alert setCancelButtonWithTitle:NSLocalizedString(@"Dismiss", nil) block:nil]; + [alert show]; + [alert release]; +} + ++ (void)showErrorAlert:(NSError *)error +{ + BlockAlertView *alert = [[BlockAlertView alloc] initWithTitle:NSLocalizedString(@"Operation Failed", nil) message:[NSString stringWithFormat:NSLocalizedString(@"The operation did not complete successfully: %@", nil), error]]; + [alert setCancelButtonWithTitle:@"Dismiss" block:nil]; + [alert show]; + [alert release]; +} + /////////////////////////////////////////////////////////////////////////////////////////////////// #pragma mark - NSObject +- (void)addComponents:(CGRect)frame { + if (_title) + { + CGSize size = [_title sizeWithFont:titleFont + constrainedToSize:CGSizeMake(frame.size.width-kAlertViewBorder*2, 1000) + lineBreakMode:NSLineBreakByWordWrapping]; + + UILabel *labelView = [[UILabel alloc] initWithFrame:CGRectMake(kAlertViewBorder, _height, frame.size.width-kAlertViewBorder*2, size.height)]; + labelView.font = titleFont; + labelView.numberOfLines = 0; + labelView.lineBreakMode = NSLineBreakByWordWrapping; + labelView.textColor = kAlertViewTitleTextColor; + labelView.backgroundColor = [UIColor clearColor]; + labelView.textAlignment = NSTextAlignmentCenter; + labelView.shadowColor = kAlertViewTitleShadowColor; + labelView.shadowOffset = kAlertViewTitleShadowOffset; + labelView.text = _title; + [_view addSubview:labelView]; + [labelView release]; + + _height += size.height + kAlertViewBorder; + } + + if (_message) + { + CGSize size = [_message sizeWithFont:messageFont + constrainedToSize:CGSizeMake(frame.size.width-kAlertViewBorder*2, 1000) + lineBreakMode:NSLineBreakByWordWrapping]; + + UILabel *labelView = [[UILabel alloc] initWithFrame:CGRectMake(kAlertViewBorder, _height, frame.size.width-kAlertViewBorder*2, size.height)]; + labelView.font = messageFont; + labelView.numberOfLines = 0; + labelView.lineBreakMode = NSLineBreakByWordWrapping; + labelView.textColor = kAlertViewMessageTextColor; + labelView.backgroundColor = [UIColor clearColor]; + labelView.textAlignment = NSTextAlignmentCenter; + labelView.shadowColor = kAlertViewMessageShadowColor; + labelView.shadowOffset = kAlertViewMessageShadowOffset; + labelView.text = _message; + [_view addSubview:labelView]; + [labelView release]; + + _height += size.height + kAlertViewBorder; + } +} + +- (void)setupDisplay +{ + [[_view subviews] enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) { + [obj removeFromSuperview]; + }]; + + UIWindow *parentView = [BlockBackground sharedInstance]; + CGRect frame = parentView.bounds; + frame.origin.x = floorf((frame.size.width - background.size.width) * 0.5); + frame.size.width = background.size.width; + + UIInterfaceOrientation orientation = [[UIApplication sharedApplication] statusBarOrientation]; + if (UIInterfaceOrientationIsLandscape(orientation)) { + frame.size.width += 150; + frame.origin.x -= 75; + } + + _view.frame = frame; + + _height = kAlertViewBorder + 15; + + if (NeedsLandscapePhoneTweaks) { + _height -= 15; // landscape phones need to trimmed a bit + } + + [self addComponents:frame]; + + if (_shown) + [self show]; +} + - (id)initWithTitle:(NSString *)title message:(NSString *)message { - if ((self = [super init])) + self = [super init]; + + if (self) { - BlockBackground* blockBackground = [BlockBackground sharedInstance]; - [blockBackground sizeToFill]; - [self setViewTransform:blockBackground forOrientation:blockBackground.orientation]; - - CGRect frame = blockBackground.bounds; - frame.origin.x = (frame.size.width - background.size.width) * 0.5; - frame.size.width = background.size.width; + _title = [title copy]; + _message = [message copy]; + + _view = [[UIView alloc] init]; + + _view.autoresizingMask = UIViewAutoresizingFlexibleBottomMargin | UIViewAutoresizingFlexibleTopMargin | UIViewAutoresizingFlexibleLeftMargin | UIViewAutoresizingFlexibleRightMargin; - _view = [[UIView alloc] initWithFrame:frame]; _blocks = [[NSMutableArray alloc] init]; - _height = kBorder + 15; - - if (title) - { - CGSize size = [title sizeWithFont:titleFont - constrainedToSize:CGSizeMake(frame.size.width-kBorder*2, 1000) - lineBreakMode:NSLineBreakByWordWrapping]; - - UILabel *labelView = [[UILabel alloc] initWithFrame:CGRectMake(kBorder, _height, frame.size.width-kBorder*2, size.height)]; - labelView.font = titleFont; - labelView.numberOfLines = 0; - labelView.lineBreakMode = NSLineBreakByWordWrapping; - labelView.textColor = kAlertFontColor; - labelView.backgroundColor = [UIColor clearColor]; - labelView.textAlignment = NSTextAlignmentCenter; - labelView.shadowColor = [UIColor blackColor]; - labelView.shadowOffset = CGSizeMake(0, -1); - labelView.text = title; - [_view addSubview:labelView]; - [labelView release]; - - _height += size.height + kBorder; - } - if (message) - { - CGSize size = [message sizeWithFont:messageFont - constrainedToSize:CGSizeMake(frame.size.width-kBorder*2, 1000) - lineBreakMode:NSLineBreakByWordWrapping]; - - UILabel *labelView = [[UILabel alloc] initWithFrame:CGRectMake(kBorder, _height, frame.size.width-kBorder*2, size.height)]; - labelView.font = messageFont; - labelView.numberOfLines = 0; - labelView.lineBreakMode = NSLineBreakByWordWrapping; - labelView.textColor = kAlertFontColor; - labelView.backgroundColor = [UIColor clearColor]; - labelView.textAlignment = NSTextAlignmentCenter; - labelView.shadowColor = [UIColor blackColor]; - labelView.shadowOffset = CGSizeMake(0, -1); - labelView.text = message; - [_view addSubview:labelView]; - [labelView release]; - - _height += size.height + kBorder; - } + [[NSNotificationCenter defaultCenter] addObserver:self + selector:@selector(setupDisplay) + name:UIApplicationDidChangeStatusBarOrientationNotification + object:nil]; + + if ([self class] == [BlockAlertView class]) + [self setupDisplay]; + + _vignetteBackground = NO; } return self; @@ -112,33 +170,14 @@ static UIFont *buttonFont = nil; - (void)dealloc { + [_title release]; + [_message release]; + [_backgroundImage release]; [_view release]; [_blocks release]; [super dealloc]; } -- (void)setViewTransform:(UIView*)view forOrientation:(UIInterfaceOrientation)orientation -{ - switch(orientation) - { - case UIInterfaceOrientationPortrait: - view.transform = CGAffineTransformMakeRotation(0); - break; - - case UIInterfaceOrientationPortraitUpsideDown: - view.transform = CGAffineTransformMakeRotation((-2) *M_PI/2); - break; - - case UIInterfaceOrientationLandscapeRight: - view.transform = CGAffineTransformMakeRotation(M_PI/2); - break; - - case UIInterfaceOrientationLandscapeLeft: - view.transform = CGAffineTransformMakeRotation((-1) * M_PI/2); - break; - } -} - /////////////////////////////////////////////////////////////////////////////////////////////////// #pragma mark - Public @@ -168,6 +207,8 @@ static UIFont *buttonFont = nil; - (void)show { + _shown = YES; + BOOL isSecondButton = NO; NSUInteger index = 0; for (NSUInteger i = 0; i < _blocks.count; i++) @@ -179,13 +220,13 @@ static UIFont *buttonFont = nil; UIImage *image = [UIImage imageNamed:[NSString stringWithFormat:@"alert-%@-button.png", color]]; image = [image stretchableImageWithLeftCapWidth:(int)(image.size.width+1)>>1 topCapHeight:0]; - CGFloat maxHalfWidth = floorf((_view.bounds.size.width-kBorder*3)*0.5); - CGFloat width = _view.bounds.size.width-kBorder*2; - CGFloat xOffset = kBorder; + CGFloat maxHalfWidth = floorf((_view.bounds.size.width-kAlertViewBorder*3)*0.5); + CGFloat width = _view.bounds.size.width-kAlertViewBorder*2; + CGFloat xOffset = kAlertViewBorder; if (isSecondButton) { width = maxHalfWidth; - xOffset = width + kBorder * 2; + xOffset = width + kAlertViewBorder * 2; isSecondButton = NO; } else if (i + 1 < _blocks.count) @@ -195,10 +236,10 @@ static UIFont *buttonFont = nil; CGSize size = [title sizeWithFont:buttonFont minFontSize:10 actualFontSize:nil - forWidth:_view.bounds.size.width-kBorder*2 + forWidth:_view.bounds.size.width-kAlertViewBorder*2 lineBreakMode:NSLineBreakByClipping]; - if (size.width < maxHalfWidth - kBorder) + if (size.width < maxHalfWidth - kAlertViewBorder) { // It might fit. Check the next Button NSArray *block2 = [_blocks objectAtIndex:i+1]; @@ -206,10 +247,10 @@ static UIFont *buttonFont = nil; size = [title2 sizeWithFont:buttonFont minFontSize:10 actualFontSize:nil - forWidth:_view.bounds.size.width-kBorder*2 + forWidth:_view.bounds.size.width-kAlertViewBorder*2 lineBreakMode:NSLineBreakByClipping]; - if (size.width < maxHalfWidth - kBorder) + if (size.width < maxHalfWidth - kAlertViewBorder) { // They'll fit! isSecondButton = YES; // For the next iteration @@ -217,20 +258,45 @@ static UIFont *buttonFont = nil; } } } + else if (_blocks.count == 1) + { + // In this case this is the ony button. We'll size according to the text + CGSize size = [title sizeWithFont:buttonFont + minFontSize:10 + actualFontSize:nil + forWidth:_view.bounds.size.width-kAlertViewBorder*2 + lineBreakMode:UILineBreakModeClip]; + + size.width = MAX(size.width, 80); + if (size.width + 2 * kAlertViewBorder < width) + { + width = size.width + 2 * kAlertViewBorder; + xOffset = floorf((_view.bounds.size.width - width) * 0.5); + } + } UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom]; - button.frame = CGRectMake(xOffset, _height, width, kButtonHeight); + button.frame = CGRectMake(xOffset, _height, width, kAlertButtonHeight); button.titleLabel.font = buttonFont; - if ([button.titleLabel respondsToSelector:@selector(setMinimumScaleFactor:)]) - button.titleLabel.minimumScaleFactor = 10; + if (IOS_LESS_THAN_6) { +#pragma clan diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" + button.titleLabel.minimumFontSize = 10; +#pragma clan diagnostic pop + } + else { + button.titleLabel.adjustsFontSizeToFitWidth = YES; + button.titleLabel.adjustsLetterSpacingToFitWidth = YES; + button.titleLabel.minimumScaleFactor = 0.1; + } button.titleLabel.textAlignment = NSTextAlignmentCenter; - button.titleLabel.shadowOffset = CGSizeMake(0, -1); + button.titleLabel.shadowOffset = kAlertViewButtonShadowOffset; button.backgroundColor = [UIColor clearColor]; button.tag = i+1; [button setBackgroundImage:image forState:UIControlStateNormal]; - [button setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal]; - [button setTitleShadowColor:[UIColor blackColor] forState:UIControlStateNormal]; + [button setTitleColor:kAlertViewButtonTextColor forState:UIControlStateNormal]; + [button setTitleShadowColor:kAlertViewButtonShadowColor forState:UIControlStateNormal]; [button setTitle:title forState:UIControlStateNormal]; button.accessibilityLabel = title; @@ -239,43 +305,80 @@ static UIFont *buttonFont = nil; [_view addSubview:button]; if (!isSecondButton) - _height += kButtonHeight + kBorder; + _height += kAlertButtonHeight + kAlertViewBorder; index++; } + _height += 10; // Margin for the shadow + + if (_height < background.size.height) + { + CGFloat offset = background.size.height - _height; + _height = background.size.height; + CGRect frame; + for (NSUInteger i = 0; i < _blocks.count; i++) + { + UIButton *btn = (UIButton *)[_view viewWithTag:i+1]; + frame = btn.frame; + frame.origin.y += offset; + btn.frame = frame; + } + } + + CGRect frame = _view.frame; frame.origin.y = - _height; frame.size.height = _height; _view.frame = frame; UIImageView *modalBackground = [[UIImageView alloc] initWithFrame:_view.bounds]; - modalBackground.image = background; + + if (UIInterfaceOrientationIsLandscape([[UIApplication sharedApplication] statusBarOrientation])) + modalBackground.image = backgroundlandscape; + else + modalBackground.image = background; + modalBackground.contentMode = UIViewContentModeScaleToFill; + modalBackground.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight; [_view insertSubview:modalBackground atIndex:0]; [modalBackground release]; + if (_backgroundImage) + { + [BlockBackground sharedInstance].backgroundImage = _backgroundImage; + [_backgroundImage release]; + _backgroundImage = nil; + } + + [BlockBackground sharedInstance].vignetteBackground = _vignetteBackground; [[BlockBackground sharedInstance] addToMainWindow:_view]; __block CGPoint center = _view.center; - center.y = floorf([BlockBackground sharedInstance].bounds.size.height * 0.5) + kBounce; + center.y = floorf([BlockBackground sharedInstance].bounds.size.height * 0.5) + kAlertViewBounce; + + _cancelBounce = NO; [UIView animateWithDuration:0.4 delay:0.0 - options:UIViewAnimationOptionCurveEaseOut + options:UIViewAnimationCurveEaseOut animations:^{ [BlockBackground sharedInstance].alpha = 1.0f; _view.center = center; } completion:^(BOOL finished) { + if (_cancelBounce) return; + [UIView animateWithDuration:0.1 delay:0.0 options:0 animations:^{ - center.y -= kBounce; + center.y -= kAlertViewBounce; _view.center = center; } - completion:nil]; + completion:^(BOOL finished) { + [[NSNotificationCenter defaultCenter] postNotificationName:@"AlertViewFinishedAnimations" object:nil]; + }]; }]; [self retain]; @@ -283,6 +386,10 @@ static UIFont *buttonFont = nil; - (void)dismissWithClickedButtonIndex:(NSInteger)buttonIndex animated:(BOOL)animated { + _shown = NO; + + [[NSNotificationCenter defaultCenter] removeObserver:self]; + if (buttonIndex >= 0 && buttonIndex < [_blocks count]) { id obj = [[_blocks objectAtIndex: buttonIndex] objectAtIndex:0]; @@ -305,7 +412,7 @@ static UIFont *buttonFont = nil; completion:^(BOOL finished) { [UIView animateWithDuration:0.4 delay:0.0 - options:UIViewAnimationOptionCurveEaseIn + options:UIViewAnimationCurveEaseIn animations:^{ CGRect frame = _view.frame; frame.origin.y = -frame.size.height; diff --git a/client/iOS/Views/BlockBackground.h b/client/iOS/Views/BlockBackground.h index c5cfb66c7..8eabc209d 100644 --- a/client/iOS/Views/BlockBackground.h +++ b/client/iOS/Views/BlockBackground.h @@ -8,7 +8,10 @@ #import -@interface BlockBackground : UIWindow +@interface BlockBackground : UIWindow { +@private + UIWindow *_previousKeyWindow; +} + (BlockBackground *) sharedInstance; @@ -16,9 +19,7 @@ - (void)reduceAlphaIfEmpty; - (void)removeView:(UIView *)view; -- (UIInterfaceOrientation)orientation; -- (CGFloat)statusBarHeight; - -- (void)sizeToFill; +@property (nonatomic, retain) UIImage *backgroundImage; +@property (nonatomic, readwrite) BOOL vignetteBackground; @end diff --git a/client/iOS/Views/BlockBackground.m b/client/iOS/Views/BlockBackground.m index a4633f9e9..9d7709a47 100644 --- a/client/iOS/Views/BlockBackground.m +++ b/client/iOS/Views/BlockBackground.m @@ -5,11 +5,14 @@ // Created by Gustavo Ambrozio on 29/11/11. // Copyright (c) 2011 N/A. All rights reserved. // -#import + #import "BlockBackground.h" @implementation BlockBackground +@synthesize backgroundImage = _backgroundImage; +@synthesize vignetteBackground = _vignetteBackground; + static BlockBackground *_sharedInstance = nil; + (BlockBackground*)sharedInstance @@ -63,66 +66,89 @@ static BlockBackground *_sharedInstance = nil; return self; } -- (void)sizeToFill +- (void)setRotation:(NSNotification*)notification { - UIInterfaceOrientation o = [self orientation]; + UIInterfaceOrientation orientation = [[UIApplication sharedApplication] statusBarOrientation]; - if(UIInterfaceOrientationIsPortrait(o)) - { - CGRect r = [[UIScreen mainScreen] applicationFrame]; - - CGFloat portraitHeight = [[UIScreen mainScreen] bounds].size.height; - CGFloat portraitWidth = [[UIScreen mainScreen] bounds].size.width; - - CGFloat center_y = (r.size.height / 2) + [self statusBarHeight]; - CGFloat center_x = (r.size.width / 2); - - self.bounds = CGRectMake(0, 0, portraitWidth, portraitHeight); - self.center = CGPointMake(center_x, center_y); + CGRect orientationFrame = [UIScreen mainScreen].bounds; + + if( + (UIInterfaceOrientationIsLandscape(orientation) && orientationFrame.size.height > orientationFrame.size.width) || + (UIInterfaceOrientationIsPortrait(orientation) && orientationFrame.size.width > orientationFrame.size.height) + ) { + float temp = orientationFrame.size.width; + orientationFrame.size.width = orientationFrame.size.height; + orientationFrame.size.height = temp; } - else if(UIInterfaceOrientationIsLandscape(o)) - { - CGFloat landscapeHeight = [[UIScreen mainScreen] bounds].size.height; - CGFloat landscapeWidth = [[UIScreen mainScreen] bounds].size.width; - CGFloat center_y = (landscapeHeight/2); - CGFloat center_x = (landscapeWidth / 2); - - self.bounds = CGRectMake(0, 0, landscapeHeight, landscapeWidth); - self.center = CGPointMake(center_x, center_y); + + self.transform = CGAffineTransformIdentity; + self.frame = orientationFrame; + + CGFloat posY = orientationFrame.size.height/2; + CGFloat posX = orientationFrame.size.width/2; + + CGPoint newCenter; + CGFloat rotateAngle; + + switch (orientation) { + case UIInterfaceOrientationPortraitUpsideDown: + rotateAngle = M_PI; + newCenter = CGPointMake(posX, orientationFrame.size.height-posY); + break; + case UIInterfaceOrientationLandscapeLeft: + rotateAngle = -M_PI/2.0f; + newCenter = CGPointMake(posY, posX); + break; + case UIInterfaceOrientationLandscapeRight: + rotateAngle = M_PI/2.0f; + newCenter = CGPointMake(orientationFrame.size.height-posY, posX); + break; + default: // UIInterfaceOrientationPortrait + rotateAngle = 0.0; + newCenter = CGPointMake(posX, posY); + break; } + + self.transform = CGAffineTransformMakeRotation(rotateAngle); + self.center = newCenter; + + [self setNeedsLayout]; + [self layoutSubviews]; } - (id)init { - self = [super initWithFrame:[[UIScreen mainScreen] applicationFrame]]; + self = [super initWithFrame:[[UIScreen mainScreen] bounds]]; if (self) { self.windowLevel = UIWindowLevelStatusBar; self.hidden = YES; self.userInteractionEnabled = NO; self.backgroundColor = [UIColor colorWithWhite:0.4 alpha:0.5f]; + self.vignetteBackground = NO; + + [[NSNotificationCenter defaultCenter] addObserver:self + selector:@selector(setRotation:) + name:UIApplicationDidChangeStatusBarOrientationNotification + object:nil]; + [self setRotation:nil]; + } return self; } -- (UIInterfaceOrientation)orientation -{ - return [UIApplication sharedApplication].statusBarOrientation; -} - -- (CGFloat)statusBarHeight -{ - CGSize statusBarSize =[[UIApplication sharedApplication] statusBarFrame].size; - return MIN(statusBarSize.height, statusBarSize.width); -} - - (void)addToMainWindow:(UIView *)view { + [self setRotation:nil]; + + if ([self.subviews containsObject:view]) return; + if (self.hidden) { + _previousKeyWindow = [[[UIApplication sharedApplication] keyWindow] retain]; self.alpha = 0.0f; self.hidden = NO; self.userInteractionEnabled = YES; - [self makeKeyAndVisible]; + [self makeKeyWindow]; } if (self.subviews.count > 0) @@ -130,26 +156,46 @@ static BlockBackground *_sharedInstance = nil; ((UIView*)[self.subviews lastObject]).userInteractionEnabled = NO; } + if (_backgroundImage) + { + UIImageView *backgroundView = [[UIImageView alloc] initWithImage:_backgroundImage]; + backgroundView.frame = self.bounds; + backgroundView.contentMode = UIViewContentModeScaleToFill; + [self addSubview:backgroundView]; + [backgroundView release]; + [_backgroundImage release]; + _backgroundImage = nil; + } + [self addSubview:view]; } - (void)reduceAlphaIfEmpty { - if (self.subviews.count == 1) + if (self.subviews.count == 1 || (self.subviews.count == 2 && [[self.subviews objectAtIndex:0] isKindOfClass:[UIImageView class]])) { self.alpha = 0.0f; -// 20120907JY - disabling this user interaction can cause issues with fast taps when showing alerts - thanks for finding Anagd. -// self.userInteractionEnabled = NO; + self.userInteractionEnabled = NO; } } - (void)removeView:(UIView *)view { [view removeFromSuperview]; + + UIView *topView = [self.subviews lastObject]; + if ([topView isKindOfClass:[UIImageView class]]) + { + // It's a background. Remove it too + [topView removeFromSuperview]; + } + if (self.subviews.count == 0) { self.hidden = YES; - [self resignKeyWindow]; + [_previousKeyWindow makeKeyWindow]; + [_previousKeyWindow release]; + _previousKeyWindow = nil; } else { @@ -157,4 +203,25 @@ static BlockBackground *_sharedInstance = nil; } } +- (void)drawRect:(CGRect)rect +{ + if (_backgroundImage || !_vignetteBackground) return; + CGContextRef context = UIGraphicsGetCurrentContext(); + + size_t locationsCount = 2; + CGFloat locations[2] = {0.0f, 1.0f}; + CGFloat colors[8] = {0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,0.75f}; + CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB(); + CGGradientRef gradient = CGGradientCreateWithColorComponents(colorSpace, colors, locations, locationsCount); + CGColorSpaceRelease(colorSpace); + + CGPoint center = CGPointMake(self.bounds.size.width/2, self.bounds.size.height/2); + float radius = MIN(self.bounds.size.width , self.bounds.size.height) ; + CGContextDrawRadialGradient (context, gradient, center, 0, center, radius, kCGGradientDrawsAfterEndLocation); + CGGradientRelease(gradient); +} + + + + @end diff --git a/client/iOS/Views/BlockUI.h b/client/iOS/Views/BlockUI.h new file mode 100644 index 000000000..903b28646 --- /dev/null +++ b/client/iOS/Views/BlockUI.h @@ -0,0 +1,72 @@ +// +// BlockUI.h +// +// Created by Gustavo Ambrozio on 14/2/12. +// + +#ifndef BlockUI_h +#define BlockUI_h + +#if __IPHONE_OS_VERSION_MAX_ALLOWED < 60000 +#define NSTextAlignmentCenter UITextAlignmentCenter +#define NSLineBreakByWordWrapping UILineBreakModeWordWrap +#define NSLineBreakByClipping UILineBreakModeClip + +#endif + +#ifndef IOS_LESS_THAN_6 +#define IOS_LESS_THAN_6 !([[[UIDevice currentDevice] systemVersion] compare:@"6.0" options:NSNumericSearch] != NSOrderedAscending) + +#endif + +#define NeedsLandscapePhoneTweaks (UIInterfaceOrientationIsLandscape([[UIApplication sharedApplication] statusBarOrientation]) && UI_USER_INTERFACE_IDIOM() != UIUserInterfaceIdiomPad) + + +// Action Sheet constants + +#define kActionSheetBounce 10 +#define kActionSheetBorder 10 +#define kActionSheetButtonHeight 45 +#define kActionSheetTopMargin 15 + +#define kActionSheetTitleFont [UIFont systemFontOfSize:18] +#define kActionSheetTitleTextColor [UIColor whiteColor] +#define kActionSheetTitleShadowColor [UIColor blackColor] +#define kActionSheetTitleShadowOffset CGSizeMake(0, -1) + +#define kActionSheetButtonFont [UIFont boldSystemFontOfSize:20] +#define kActionSheetButtonTextColor [UIColor whiteColor] +#define kActionSheetButtonShadowColor [UIColor blackColor] +#define kActionSheetButtonShadowOffset CGSizeMake(0, -1) + +#define kActionSheetBackground @"action-sheet-panel.png" +#define kActionSheetBackgroundCapHeight 30 + + +// Alert View constants + +#define kAlertViewBounce 20 +#define kAlertViewBorder (NeedsLandscapePhoneTweaks ? 5 : 10) +#define kAlertButtonHeight (NeedsLandscapePhoneTweaks ? 35 : 44) + + +#define kAlertViewTitleFont [UIFont boldSystemFontOfSize:20] +#define kAlertViewTitleTextColor [UIColor colorWithWhite:244.0/255.0 alpha:1.0] +#define kAlertViewTitleShadowColor [UIColor blackColor] +#define kAlertViewTitleShadowOffset CGSizeMake(0, -1) + +#define kAlertViewMessageFont [UIFont systemFontOfSize:18] +#define kAlertViewMessageTextColor [UIColor colorWithWhite:244.0/255.0 alpha:1.0] +#define kAlertViewMessageShadowColor [UIColor blackColor] +#define kAlertViewMessageShadowOffset CGSizeMake(0, -1) + +#define kAlertViewButtonFont [UIFont boldSystemFontOfSize:18] +#define kAlertViewButtonTextColor [UIColor whiteColor] +#define kAlertViewButtonShadowColor [UIColor blackColor] +#define kAlertViewButtonShadowOffset CGSizeMake(0, -1) + +#define kAlertViewBackground @"alert-window.png" +#define kAlertViewBackgroundLandscape @"alert-window-landscape.png" +#define kAlertViewBackgroundCapHeight 38 + +#endif From 777dff2d0b497750a10eef7132416eb841885933 Mon Sep 17 00:00:00 2001 From: Nigel Reeves Date: Mon, 8 Apr 2013 14:42:49 +0100 Subject: [PATCH 24/26] Further changes to fix issue 574\685. There appear to be some additional problems with the impact of daylight savings time kicking in. Calculations of BIAS, Standard BIAS & Daylight BIAS are wrong. This is showing up with Outlook 2010 meeting appointments, for example select America\Vancouver, appointments, once accepted get assigned an hour early. I have also applied a fix to correctly send the Timezone information currently commented out of code referencing this issue number in libfreerdp_locale/timezone.c function freerdp_time_zone_detect() --- libfreerdp/core/timezone.c | 56 ++++++++++-------------------------- libfreerdp/locale/timezone.c | 32 +++++---------------- libfreerdp/utils/time.c | 2 +- 3 files changed, 23 insertions(+), 67 deletions(-) diff --git a/libfreerdp/core/timezone.c b/libfreerdp/core/timezone.c index 2cd857b65..30a291ffc 100644 --- a/libfreerdp/core/timezone.c +++ b/libfreerdp/core/timezone.c @@ -117,9 +117,6 @@ BOOL rdp_read_client_time_zone(wStream* s, rdpSettings* settings) void rdp_write_client_time_zone(wStream* s, rdpSettings* settings) { - UINT32 bias; - INT32 sbias; - UINT32 bias2c; WCHAR* standardName = NULL; WCHAR* daylightName = NULL; int standardNameLength; @@ -138,57 +135,34 @@ void rdp_write_client_time_zone(wStream* s, rdpSettings* settings) if (daylightNameLength > 62) daylightNameLength = 62; - /* UTC = LocalTime + Bias <-> Bias = UTC - LocalTime */ - - /* Translate from biases used throughout libfreerdp-locale/timezone.c - * to what RDP expects, which is minutes *west* of UTC. - * Though MS-RDPBCGR specifies bias as unsigned, two's complement - * (a negative integer) works fine for zones east of UTC. - */ - - if (clientTimeZone->bias <= 720) - bias = -1 * clientTimeZone->bias; - else - bias = 1440 - clientTimeZone->bias; - - stream_write_UINT32(s, bias); /* Bias */ + /* Bias */ + stream_write_UINT32(s, clientTimeZone->bias); /* standardName (64 bytes) */ stream_write(s, standardName, standardNameLength); stream_write_zero(s, 64 - standardNameLength); - rdp_write_system_time(s, &clientTimeZone->standardDate); /* StandardDate */ + /* StandardDate */ + rdp_write_system_time(s, &clientTimeZone->standardDate); - DEBUG_TIMEZONE("bias=%d stdName='%s' dlName='%s'", - bias, clientTimeZone->standardName, clientTimeZone->daylightName); - - sbias = clientTimeZone->standardBias - clientTimeZone->bias; - - if (sbias < 0) - bias2c = (UINT32) sbias; - else - bias2c = ~((UINT32) sbias) + 1; + DEBUG_TIMEZONE("bias=%d stdName='%s' dlName='%s'", clientTimeZone->bias, clientTimeZone->standardName, clientTimeZone->daylightName); /* Note that StandardBias is ignored if no valid standardDate is provided. */ - stream_write_UINT32(s, bias2c); /* StandardBias */ - DEBUG_TIMEZONE("StandardBias=%d", bias2c); + /* StandardBias */ + stream_write_UINT32(s, clientTimeZone->standardBias); + DEBUG_TIMEZONE("StandardBias=%d", clientTimeZone->standardBias); /* daylightName (64 bytes) */ - stream_write(s, daylightName, daylightNameLength); - stream_write_zero(s, 64 - daylightNameLength); + stream_write(s, daylightName, daylightNameLength); + stream_write_zero(s, 64 - daylightNameLength); - rdp_write_system_time(s, &clientTimeZone->daylightDate); /* DaylightDate */ - - sbias = clientTimeZone->daylightBias - clientTimeZone->bias; - - if (sbias < 0) - bias2c = (UINT32) sbias; - else - bias2c = ~((UINT32) sbias) + 1; + /* DaylightDate */ + rdp_write_system_time(s, &clientTimeZone->daylightDate); /* Note that DaylightBias is ignored if no valid daylightDate is provided. */ - stream_write_UINT32(s, bias2c); /* DaylightBias */ - DEBUG_TIMEZONE("DaylightBias=%d", bias2c); + /* DaylightBias */ + stream_write_UINT32(s, clientTimeZone->daylightBias); + DEBUG_TIMEZONE("DaylightBias=%d", clientTimeZone->daylightBias); free(standardName); free(daylightName); diff --git a/libfreerdp/locale/timezone.c b/libfreerdp/locale/timezone.c index e114472a5..3070f1fa6 100644 --- a/libfreerdp/locale/timezone.c +++ b/libfreerdp/locale/timezone.c @@ -1640,7 +1640,7 @@ TIME_ZONE_RULE_ENTRY* freerdp_get_current_time_zone_rule(TIME_ZONE_RULE_ENTRY* r for (i = 0; i < (int) count; i++) { - if ((rules[i].TicksStart <= windows_time) && (windows_time >= rules[i].TicksEnd)) + if ((rules[i].TicksStart >= windows_time) && (windows_time >= rules[i].TicksEnd)) { /*fprintf(stderr, "Got rule %d from table at %p with count %u\n", i, rules, count);*/ return &rules[i]; @@ -1657,14 +1657,14 @@ void freerdp_time_zone_detect(TIME_ZONE_INFO* clientTimeZone) TIME_ZONE_ENTRY* tz; struct tm* local_time; + clientTimeZone->standardBias = 0; + time(&t); local_time = localtime(&t); #ifdef HAVE_TM_GMTOFF - if (local_time->tm_gmtoff >= 0) - clientTimeZone->bias = (UINT32) (local_time->tm_gmtoff / 60); - else - clientTimeZone->bias = (UINT32) (1440 + (INT32) (local_time->tm_gmtoff / 60)); + clientTimeZone->bias = timezone / 60; + DEBUG_TIMEZONE("tzname[std]: %s, tzname[dst]: %s, timezone: %ld, Daylight: %d", tzname[0], tzname[1], timezone, daylight); #elif defined(sun) if (local_time->tm_isdst > 0) clientTimeZone->bias = (UINT32) (altzone / 3600); @@ -1673,19 +1673,6 @@ void freerdp_time_zone_detect(TIME_ZONE_INFO* clientTimeZone) #else clientTimeZone->bias = 0; #endif - if (local_time->tm_isdst > 0) - { - clientTimeZone->standardBias = clientTimeZone->bias - 60; - clientTimeZone->daylightBias = clientTimeZone->bias; - } - else - { - clientTimeZone->standardBias = clientTimeZone->bias; - clientTimeZone->daylightBias = clientTimeZone->bias + 60; - } - DEBUG_TIMEZONE("Bias: %d, StandardBias: %d, DaylightBias: %d", - clientTimeZone->bias, clientTimeZone->standardBias, - clientTimeZone->daylightBias); tz = freerdp_detect_windows_time_zone(clientTimeZone->bias); @@ -1694,8 +1681,7 @@ void freerdp_time_zone_detect(TIME_ZONE_INFO* clientTimeZone) DEBUG_TIMEZONE("tz: Id='%s' Bias=%d DST=%d dn='%s' sn='%s' dln='%s'", tz->Id, tz->Bias, tz->SupportsDST, tz->DisplayName, tz->StandardName, tz->DaylightName); - /* Not printed: RuleTable, RuleTableCount */ - clientTimeZone->bias = tz->Bias; + sprintf(clientTimeZone->standardName, "%s", tz->StandardName); sprintf(clientTimeZone->daylightName, "%s", tz->DaylightName); @@ -1704,11 +1690,9 @@ void freerdp_time_zone_detect(TIME_ZONE_INFO* clientTimeZone) TIME_ZONE_RULE_ENTRY* rule; rule = freerdp_get_current_time_zone_rule(tz->RuleTable, tz->RuleTableCount); - /* issue #574 -- temporarily disabled this block as it seems to be setting the wrong time if (rule != NULL) { - clientTimeZone->standardBias = 0; - clientTimeZone->daylightBias = rule->DaylightDelta; + clientTimeZone->daylightBias = -rule->DaylightDelta; clientTimeZone->standardDate.wYear = rule->StandardDate.wYear; clientTimeZone->standardDate.wMonth = rule->StandardDate.wMonth; @@ -1728,9 +1712,7 @@ void freerdp_time_zone_detect(TIME_ZONE_INFO* clientTimeZone) clientTimeZone->daylightDate.wSecond = rule->DaylightDate.wSecond; clientTimeZone->daylightDate.wMilliseconds = rule->DaylightDate.wMilliseconds; } - */ } - free(tz); } else diff --git a/libfreerdp/utils/time.c b/libfreerdp/utils/time.c index 62209ec9d..31b51564f 100644 --- a/libfreerdp/utils/time.c +++ b/libfreerdp/utils/time.c @@ -43,7 +43,7 @@ UINT64 freerdp_windows_gmtime() UINT64 freerdp_get_windows_time_from_unix_time(time_t unix_time) { UINT64 windows_time; - windows_time = (unix_time * 10000000) + 621355968000000000ULL; + windows_time = ((UINT64)unix_time * 10000000) + 621355968000000000ULL; return windows_time; } From 80229557b22be568d726c34e51c5a180f53d2836 Mon Sep 17 00:00:00 2001 From: Vic Lee Date: Tue, 9 Apr 2013 12:37:08 -0700 Subject: [PATCH 25/26] libfreerdp-core/server: put RemoteFX captureFlags into settings needed by some thin clients. --- include/freerdp/settings.h | 4 +++- libfreerdp/core/capabilities.c | 15 +++++++++++++++ 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/include/freerdp/settings.h b/include/freerdp/settings.h index b4c5e86d6..d23f1106b 100644 --- a/include/freerdp/settings.h +++ b/include/freerdp/settings.h @@ -689,6 +689,7 @@ typedef struct _RDPDR_PARALLEL RDPDR_PARALLEL; #define FreeRDP_RemoteFxCodecId 3650 #define FreeRDP_RemoteFxCodecMode 3651 #define FreeRDP_RemoteFxImageCodec 3652 +#define FreeRDP_RemoteFxCaptureFlags 3653 #define FreeRDP_NSCodec 3712 #define FreeRDP_NSCodecId 3713 #define FreeRDP_FrameAcknowledge 3714 @@ -1155,7 +1156,8 @@ struct rdp_settings ALIGN64 UINT32 RemoteFxCodecId; /* 3650 */ ALIGN64 UINT32 RemoteFxCodecMode; /* 3651 */ ALIGN64 BOOL RemoteFxImageCodec; /* 3652 */ - UINT64 padding3712[3712 - 3653]; /* 3653 */ + ALIGN64 UINT32 RemoteFxCaptureFlags; /* 3653 */ + UINT64 padding3712[3712 - 3654]; /* 3654 */ /* NSCodec */ ALIGN64 BOOL NSCodec; /* 3712 */ diff --git a/libfreerdp/core/capabilities.c b/libfreerdp/core/capabilities.c index 297cfb433..66e07ac59 100644 --- a/libfreerdp/core/capabilities.c +++ b/libfreerdp/core/capabilities.c @@ -2487,6 +2487,21 @@ BOOL rdp_read_bitmap_codecs_capability_set(wStream* s, UINT16 length, rdpSetting if (remainingLength < codecPropertiesLength) return FALSE; + if (settings->ServerMode) + { + if (UuidEqual(&codecGuid, &CODEC_GUID_REMOTEFX, &rpc_status)) + { + stream_seek_UINT32(s); /* length */ + stream_read_UINT32(s, settings->RemoteFxCaptureFlags); /* captureFlags */ + stream_rewind(s, 8); + + if (settings->RemoteFxCaptureFlags & CARDP_CAPS_CAPTURE_NON_CAC) + { + settings->RemoteFxOnly = TRUE; + } + } + } + stream_seek(s, codecPropertiesLength); /* codecProperties */ remainingLength -= codecPropertiesLength; From 3f9e70357c6b769209d227ad55a55caaf36a8751 Mon Sep 17 00:00:00 2001 From: Vic Lee Date: Tue, 9 Apr 2013 19:35:52 -0700 Subject: [PATCH 26/26] libfreerdp-core/settings: server read earlyCapabilityFlags. --- include/freerdp/settings.h | 4 ++-- libfreerdp/common/settings.c | 8 ++++---- libfreerdp/core/gcc.c | 5 ++--- 3 files changed, 8 insertions(+), 9 deletions(-) diff --git a/include/freerdp/settings.h b/include/freerdp/settings.h index d23f1106b..15cd05278 100644 --- a/include/freerdp/settings.h +++ b/include/freerdp/settings.h @@ -483,7 +483,7 @@ typedef struct _RDPDR_PARALLEL RDPDR_PARALLEL; #define FreeRDP_ClientBuild 133 #define FreeRDP_ClientHostname 134 #define FreeRDP_ClientProductId 135 -#define FreeRDP_EarlyCapabilitiesFlag 136 +#define FreeRDP_EarlyCapabilityFlags 136 #define FreeRDP_NetworkAutoDetect 137 #define FreeRDP_SupportAsymetricKeys 138 #define FreeRDP_SupportErrorInfoPdu 139 @@ -763,7 +763,7 @@ struct rdp_settings ALIGN64 UINT32 ClientBuild; /* 133 */ ALIGN64 char* ClientHostname; /* 134 */ ALIGN64 char* ClientProductId; /* 135 */ - ALIGN64 UINT32 EarlyCapabilitiesFlag; /* 136 */ + ALIGN64 UINT32 EarlyCapabilityFlags; /* 136 */ ALIGN64 BOOL NetworkAutoDetect; /* 137 */ ALIGN64 BOOL SupportAsymetricKeys; /* 138 */ ALIGN64 BOOL SupportErrorInfoPdu; /* 139 */ diff --git a/libfreerdp/common/settings.c b/libfreerdp/common/settings.c index 570e66146..93d883e1e 100644 --- a/libfreerdp/common/settings.c +++ b/libfreerdp/common/settings.c @@ -1209,8 +1209,8 @@ UINT32 freerdp_get_param_uint32(rdpSettings* settings, int id) return settings->ClientBuild; break; - case FreeRDP_EarlyCapabilitiesFlag: - return settings->EarlyCapabilitiesFlag; + case FreeRDP_EarlyCapabilityFlags: + return settings->EarlyCapabilityFlags; break; case FreeRDP_EncryptionMethods: @@ -1517,8 +1517,8 @@ int freerdp_set_param_uint32(rdpSettings* settings, int id, UINT32 param) settings->ClientBuild = param; break; - case FreeRDP_EarlyCapabilitiesFlag: - settings->EarlyCapabilitiesFlag = param; + case FreeRDP_EarlyCapabilityFlags: + settings->EarlyCapabilityFlags = param; break; case FreeRDP_EncryptionMethods: diff --git a/libfreerdp/core/gcc.c b/libfreerdp/core/gcc.c index 89ba4da0d..2904fe619 100644 --- a/libfreerdp/core/gcc.c +++ b/libfreerdp/core/gcc.c @@ -495,7 +495,6 @@ BOOL gcc_read_client_core_data(wStream* s, rdpSettings* settings, UINT16 blockLe UINT16 postBeta2ColorDepth = 0; UINT16 highColorDepth = 0; UINT16 supportedColorDepths = 0; - UINT16 earlyCapabilityFlags = 0; UINT32 serverSelectedProtocol = 0; /* Length of all required fields, until imeFileName */ @@ -564,7 +563,7 @@ BOOL gcc_read_client_core_data(wStream* s, rdpSettings* settings, UINT16 blockLe if (blockLength < 2) break; - stream_read_UINT16(s, earlyCapabilityFlags); /* earlyCapabilityFlags */ + stream_read_UINT16(s, settings->EarlyCapabilityFlags); /* earlyCapabilityFlags */ blockLength -= 2; if (blockLength < 64) @@ -597,7 +596,7 @@ BOOL gcc_read_client_core_data(wStream* s, rdpSettings* settings, UINT16 blockLe if (highColorDepth > 0) { - if (earlyCapabilityFlags & RNS_UD_CS_WANT_32BPP_SESSION) + if (settings->EarlyCapabilityFlags & RNS_UD_CS_WANT_32BPP_SESSION) color_depth = 32; else color_depth = highColorDepth;