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}