11#import <Foundation/Foundation.h>
13#import <freerdp/gdi/gdi.h>
14#import <freerdp/client.h>
15#import "ios_freerdp_ui.h"
20#pragma mark Certificate authentication
22static void ios_resize_display_buffer(mfInfo *mfi);
24BOOL ios_ui_authenticate_ex(freerdp *instance,
char **username,
char **password,
char **domain,
25 rdp_auth_reason reason)
36 case AUTH_SMARTCARD_PIN:
38 if ((*username) && (*password))
51 mfInfo *mfi = MFI_FROM_INSTANCE(instance);
52 NSMutableDictionary *params = [NSMutableDictionary
53 dictionaryWithObjectsAndKeys:(*username) ? [NSString stringWithUTF8String:*username] : @"",
55 (*password) ? [NSString stringWithUTF8String:*password] : @"",
57 (*domain) ? [NSString stringWithUTF8String:*domain] : @"",
58 @"domain", [NSString stringWithUTF8String:target],
62 [mfi->session performSelectorOnMainThread:@selector(sessionRequestsAuthenticationWithParams:)
66 [[mfi->session uiRequestCompleted] lock];
67 [[mfi->session uiRequestCompleted] wait];
68 [[mfi->session uiRequestCompleted] unlock];
70 if (![[params valueForKey:
@"result"] boolValue])
81 *username = _strdup([[params objectForKey:
@"username"] UTF8String]);
82 *password = _strdup([[params objectForKey:
@"password"] UTF8String]);
83 *domain = _strdup([[params objectForKey:
@"domain"] UTF8String]);
85 if (!(*username) || !(*password) || !(*domain))
96DWORD ios_ui_verify_certificate_ex(freerdp *instance,
const char *host, UINT16 port,
97 const char *common_name,
const char *subject,
const char *issuer,
98 const char *fingerprint, DWORD flags)
101 if ([[NSUserDefaults standardUserDefaults] boolForKey:
@"security.accept_certificates"] == YES)
104 mfInfo *mfi = MFI_FROM_INSTANCE(instance);
105 NSMutableDictionary *params = [NSMutableDictionary
106 dictionaryWithObjectsAndKeys:(subject) ? [NSString stringWithUTF8String:subject] : @"",
108 (issuer) ? [NSString stringWithUTF8String:issuer] : @"",
110 (fingerprint) ? [NSString stringWithUTF8String:subject] : @"",
111 @"fingerprint", nil];
113 [mfi->session performSelectorOnMainThread:@selector(sessionVerifyCertificateWithParams:)
117 [[mfi->session uiRequestCompleted] lock];
118 [[mfi->session uiRequestCompleted] wait];
119 [[mfi->session uiRequestCompleted] unlock];
121 if (![[params valueForKey:
@"result"] boolValue])
130DWORD ios_ui_verify_changed_certificate_ex(freerdp *instance,
const char *host, UINT16 port,
131 const char *common_name,
const char *subject,
132 const char *issuer,
const char *fingerprint,
133 const char *old_subject,
const char *old_issuer,
134 const char *old_fingerprint, DWORD flags)
136 return ios_ui_verify_certificate_ex(instance, host, port, common_name, subject, issuer,
140SSIZE_T ios_ui_retry_dialog(freerdp *instance,
const char *what,
size_t current,
void *userarg)
142 WINPR_ASSERT(instance);
146 if (strcmp(what,
"connection") != 0)
147 return client_common_retry_dialog(instance, what, current, userarg);
149 mfInfo *mfi = MFI_FROM_INSTANCE(instance);
157 [mfi->session performSelectorOnMainThread:@selector(sessionWillReconnect)
166#pragma mark Graphics updates
168BOOL ios_ui_begin_paint(rdpContext *context)
170 WINPR_ASSERT(context);
172 rdpGdi *gdi = context->gdi;
174 WINPR_ASSERT(gdi->primary);
176 HGDI_DC hdc = gdi->primary->hdc;
184 hwnd->invalid->null = TRUE;
188BOOL ios_ui_end_paint(rdpContext *context)
190 WINPR_ASSERT(context);
192 mfInfo *mfi = MFI_FROM_INSTANCE(context->instance);
195 rdpGdi *gdi = context->gdi;
197 WINPR_ASSERT(gdi->primary);
199 HGDI_DC hdc = gdi->primary->hdc;
205 WINPR_ASSERT(hwnd->invalid || (hwnd->ninvalid == 0));
207 if (hwnd->invalid->null)
211 CGRectMake(hwnd->invalid->x, hwnd->invalid->y, hwnd->invalid->w, hwnd->invalid->h);
213 if (!hwnd->invalid->null)
214 [mfi->session performSelectorOnMainThread:@selector(setNeedsDisplayInRectAsValue:)
215 withObject:[NSValue valueWithCGRect:dirty_rect]
221BOOL ios_ui_resize_window(rdpContext *context)
223 rdpSettings *settings;
226 if (!context || !context->settings)
229 settings = context->settings;
236 ios_resize_display_buffer(MFI_FROM_INSTANCE(context->instance));
241#pragma mark Clipboard
243void ios_ui_set_clipboard_text(rdpContext *context,
const char *text, UINT32 size)
245 WINPR_ASSERT(context);
247 mfInfo *mfi = MFI_FROM_INSTANCE(context->instance);
250 NSString *
string = [[NSString alloc] initWithBytes:text
252 encoding:NSUTF8StringEncoding];
254 [mfi->session performSelectorOnMainThread:@selector(setRemoteClipboardText:)
260char *ios_ui_get_clipboard_text(rdpContext *context)
262 WINPR_ASSERT(context);
264 mfInfo *mfi = MFI_FROM_INSTANCE(context->instance);
268 NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
269 NSMutableDictionary *params = [NSMutableDictionary dictionary];
270 [mfi->session performSelectorOnMainThread:@selector(sessionRequestsClipboardTextWithParams:)
274 NSString *text = [params objectForKey:@"text"];
275 char *result = text ? _strdup([text UTF8String]) : nullptr;
283static void ios_create_bitmap_context(mfInfo *mfi)
285 [mfi->session performSelectorOnMainThread:@selector(sessionBitmapContextWillChange)
288 rdpGdi *gdi = mfi->instance->context->gdi;
289 CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
291 if (FreeRDPGetBytesPerPixel(gdi->dstFormat) == 2)
292 mfi->bitmap_context = CGBitmapContextCreate(
293 gdi->primary_buffer, gdi->width, gdi->height, 5, gdi->stride, colorSpace,
294 kCGBitmapByteOrder16Little | kCGImageAlphaNoneSkipFirst);
296 mfi->bitmap_context = CGBitmapContextCreate(
297 gdi->primary_buffer, gdi->width, gdi->height, 8, gdi->stride, colorSpace,
298 kCGBitmapByteOrder32Little | kCGImageAlphaNoneSkipFirst);
300 CGColorSpaceRelease(colorSpace);
301 [mfi->session performSelectorOnMainThread:@selector(sessionBitmapContextDidChange)
306void ios_allocate_display_buffer(mfInfo *mfi)
308 ios_create_bitmap_context(mfi);
311void ios_resize_display_buffer(mfInfo *mfi)
314 CGContextRef old_context = mfi->bitmap_context;
315 mfi->bitmap_context =
nullptr;
316 CGContextRelease(old_context);
318 ios_create_bitmap_context(mfi);
WINPR_ATTR_NODISCARD FREERDP_API const char * freerdp_settings_get_server_name(const rdpSettings *settings)
A helper function to return the correct server name.
WINPR_ATTR_NODISCARD FREERDP_API const char * freerdp_settings_get_string(const rdpSettings *settings, FreeRDP_Settings_Keys_String id)
Returns a immutable string settings value.
WINPR_ATTR_NODISCARD FREERDP_API UINT32 freerdp_settings_get_uint32(const rdpSettings *settings, FreeRDP_Settings_Keys_UInt32 id)
Returns a UINT32 settings value.