83{
84 int status;
85 char **argv = nullptr;
86 int argc = 0;
87
88 if (!(self = [super init]))
89 return nil;
90
91 if (!bookmark)
92 [NSException raise:NSInvalidArgumentException
93 format:@"%s: params may not be nil.", __func__];
94
95 _bookmark = [bookmark retain];
96 _params = [[bookmark params] copy];
97 _name = [[bookmark label] retain];
98 _delegate = nil;
99 _toolbar_visible = YES;
100 _freerdp = ios_freerdp_new();
101 _ui_request_completed = [[NSCondition alloc] init];
102 BOOL connected_via_3g = ![bookmark conntectedViaWLAN];
103
104 if (!addArgument(&argc, &argv, "iFreeRDP"))
105 goto out_free;
106
107 if (!addArgument(&argc, &argv, "/gdi:sw"))
108 goto out_free;
109
110 if (!addArgument(&argc, &argv, "/relax-order-checks"))
111 goto out_free;
112
113
114
115
116 if ([_params hasValueForKey:@"colors"])
117 if (!addArgument(&argc, &argv, "/bpp:%d",
118 [_params intForKey:@"colors" with3GEnabled:connected_via_3g]))
119 goto out_free;
120
121 if ([_params hasValueForKey:@"port"])
122 if (!addArgument(&argc, &argv, "/port:%d", [_params intForKey:@"port"]))
123 goto out_free;
124
125 if ([_params boolForKey:@"console"])
126 if (!addArgument(&argc, &argv, "/admin"))
127 goto out_free;
128
129 if (!addArgument(&argc, &argv, "/v:%s", [_params UTF8StringForKey:@"hostname"]))
130 goto out_free;
131
132
133 if ([[_params StringForKey:@"username"] length])
134 {
135 if (!addArgument(&argc, &argv, "/u:%s", [_params UTF8StringForKey:@"username"]))
136 goto out_free;
137 }
138
139 if ([[_params StringForKey:@"password"] length])
140 {
141 if (!addArgument(&argc, &argv, "/p:%s", [_params UTF8StringForKey:@"password"]))
142 goto out_free;
143 }
144
145 if ([[_params StringForKey:@"domain"] length])
146 {
147 if (!addArgument(&argc, &argv, "/d:%s", [_params UTF8StringForKey:@"domain"]))
148 goto out_free;
149 }
150
151 if ([[_params StringForKey:@"working_directory"] length])
152 {
153 if (!addArgument(&argc, &argv, "/shell-dir:%s",
154 [_params UTF8StringForKey:@"working_directory"]))
155 goto out_free;
156 }
157
158 if ([[_params StringForKey:@"remote_program"] length])
159 {
160 if (!addArgument(&argc, &argv, "/shell:%s", [_params UTF8StringForKey:@"remote_program"]))
161 goto out_free;
162 }
163
164
165 if ([_params boolForKey:@"perf_remotefx" with3GEnabled:connected_via_3g])
166 if (!addArgument(&argc, &argv, "/rfx"))
167 goto out_free;
168
169 if ([_params boolForKey:@"perf_gfx" with3GEnabled:connected_via_3g])
170 if (!addArgument(&argc, &argv, "/gfx"))
171 goto out_free;
172
173 if ([_params boolForKey:@"perf_h264" with3GEnabled:connected_via_3g])
174 if (!addArgument(&argc, &argv, "/gfx:AVC444"))
175 goto out_free;
176
177 if (![_params boolForKey:@"perf_remotefx" with3GEnabled:connected_via_3g] &&
178 ![_params boolForKey:@"perf_gfx" with3GEnabled:connected_via_3g] &&
179 ![_params boolForKey:@"perf_h264" with3GEnabled:connected_via_3g])
180 if (!addArgument(&argc, &argv, "/nsc"))
181 goto out_free;
182
183 if (!addArgument(&argc, &argv, "/cache:bitmap:on,glyph:on"))
184 goto out_free;
185
186 if (!addFlag(&argc, &argv, "wallpaper",
187 [_params boolForKey:@"perf_show_desktop" with3GEnabled:connected_via_3g]))
188 goto out_free;
189
190 if (!addFlag(&argc, &argv, "window-drag",
191 [_params boolForKey:@"perf_window_dragging" with3GEnabled:connected_via_3g]))
192 goto out_free;
193
194 if (!addFlag(&argc, &argv, "menu-anims",
195 [_params boolForKey:@"perf_menu_animation" with3GEnabled:connected_via_3g]))
196 goto out_free;
197
198 if (!addFlag(&argc, &argv, "themes",
199 [_params boolForKey:@"perf_windows_themes" with3GEnabled:connected_via_3g]))
200 goto out_free;
201
202 if (!addFlag(&argc, &argv, "fonts",
203 [_params boolForKey:@"perf_font_smoothing" with3GEnabled:connected_via_3g]))
204 goto out_free;
205
206 if (!addFlag(&argc, &argv, "aero",
207 [_params boolForKey:@"perf_desktop_composition" with3GEnabled:connected_via_3g]))
208 goto out_free;
209
210 if ([_params hasValueForKey:@"width"])
211 if (!addArgument(&argc, &argv, "/w:%d", [_params intForKey:@"width"]))
212 goto out_free;
213
214 if ([_params hasValueForKey:@"height"])
215 if (!addArgument(&argc, &argv, "/h:%d", [_params intForKey:@"height"]))
216 goto out_free;
217
218
219 switch ([_params intForKey:@"security"])
220 {
221 case TSXProtocolSecurityNLA:
222 if (!addArgument(&argc, &argv, "/sec:NLA"))
223 goto out_free;
224
225 break;
226
227 case TSXProtocolSecurityTLS:
228 if (!addArgument(&argc, &argv, "/sec:TLS"))
229 goto out_free;
230
231 break;
232
233 case TSXProtocolSecurityRDP:
234 if (!addArgument(&argc, &argv, "/sec:RDP"))
235 goto out_free;
236
237 break;
238
239 default:
240 break;
241 }
242
243
244 if ([_params boolForKey:@"enable_tsg_settings"])
245 {
246 if (!addArgument(&argc, &argv, "/gateway:g:%s:%d,u:%s,d:%s,p:%s",
247 [_params UTF8StringForKey:@"tsg_hostname"],
248 [_params intForKey:@"tsg_port"],
249 [_params UTF8StringForKey:@"tsg_username"],
250 [_params UTF8StringForKey:@"tsg_domain"],
251 [_params UTF8StringForKey:@"tsg_password"]))
252 goto out_free;
253 }
254
255
256 if (!addArgument(&argc, &argv, "/kbd:layout:%d", 0x409))
257 goto out_free;
258
259
260 if (!addArgument(&argc, &argv, "/kbd:unicode:on"))
261 goto out_free;
262
263 if (!addArgument(&argc, &argv, "/auto-reconnect"))
264 goto out_free;
265
266 status =
267 freerdp_client_settings_parse_command_line(_freerdp->context->settings, argc, argv, FALSE);
268
269 if (0 != status)
270 goto out_free;
271
272 freeArguments(argc, argv);
273 [self mfi]->session = self;
274 return self;
275out_free:
276 freeArguments(argc, argv);
277 [self release];
278 return nil;
279}