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