Changeset 41

Show
Ignore:
Timestamp:
07/26/06 14:10:21 (2 years ago)
Author:
cordney
Message:

[new] editPC Network - Firewall

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • trunk/qcontrol/cocoaControlEditPC.h

    r35 r41  
    3232        IBOutlet id viewHardware; 
    3333        IBOutlet id viewAdvanced; 
     34        IBOutlet id viewNetwork; 
     35        IBOutlet id firewallPortPanel; 
     36        IBOutlet id firewallPortTable; 
     37        IBOutlet id firewallPortEditView; 
    3438        IBOutlet NSTextField *textFieldName; 
    3539        IBOutlet NSTextField *textFieldRAM; 
    3640        IBOutlet NSTextField *textFieldAppend; 
    3741        IBOutlet NSTextField *textFieldArguments; 
     42        IBOutlet NSTextField *textFieldFirewallPortName; 
     43        IBOutlet NSTextField *textFieldFirewallPortHostPorts; 
     44        IBOutlet NSTextField *textFieldFirewallPortGuestPorts; 
     45        IBOutlet NSTextField *textFieldFirewallPortError; 
    3846        IBOutlet NSPopUpButton *popUpButtonSmbFilesharing; 
    3947        IBOutlet NSPopUpButton *popUpButtonVGA; 
     
    4856        IBOutlet NSPopUpButton *popUpButtonKernel; 
    4957        IBOutlet NSPopUpButton *popUpButtonInitrd; 
     58        IBOutlet NSPopUpButton *popUpButtonFirewallAdditionalPorts; 
     59        IBOutlet NSPopUpButton *popUpButtonFirewallServiceType; 
    5060        IBOutlet NSButton *buttonEnableAdlib; 
    5161        IBOutlet NSButton *buttonEnableSB16; 
     
    6171        IBOutlet NSButton *buttonWin2kHack; 
    6272        IBOutlet NSButton *buttonOk; 
     73        IBOutlet NSButton *buttonFirewallNewPort; 
     74        IBOutlet NSButton *buttonFirewallEditPort; 
     75        IBOutlet NSButton *buttonFirewallDeletePort; 
     76        IBOutlet NSButton *buttonFirewallOk; 
     77        IBOutlet NSButton *buttonFirewallSavePort; 
    6378        id customImagePopUpButtonTemp; 
    6479        int customImageSizeHda; 
     
    7489        NSMutableDictionary *thisPC; 
    7590} 
     91NSMutableArray *firewallPortList; 
     92BOOL firewallPortTableEnabled; 
    7693- (NSPanel *) editPCPanel; 
    7794- (void) prepareEditPCPanel:(NSMutableDictionary *)aPC newPC:(BOOL)newPC sender:(id)sender; 
     
    84101- (IBAction) showHelp:(id)sender; 
    85102- (NSString *) createDI:(NSString *)type withSize:(int)size; 
     103- (void) disableTableView:(BOOL)disable; 
     104- (void)initFirewallSettings; 
     105- (IBAction) showFirewallPortList:(id)sender; 
     106- (IBAction) startShowNewPort:(id)sender; 
     107- (IBAction) startShowEditPort:(id)sender; 
     108- (void) startEditPort:(BOOL)newPort; 
     109- (IBAction) deletePort:(id)sender; 
     110- (IBAction) setAdditionalPort:(id)sender; 
     111- (IBAction) saveNewPort:(id)sender; 
     112- (IBAction) saveEditPort:(id)sender; 
     113- (BOOL) checkPort:(BOOL)newPort; 
     114- (IBAction) endEditPort:(id)sender; 
     115- (IBAction) closeFirewallPortList:(id)sender; 
     116- (NSString *) constructFirewallArguments; 
    86117@end 
  • trunk/qcontrol/cocoaControlEditPC.m

    r37 r41  
    7373                [viewAdvanced removeFromSuperview]; 
    7474        } 
     75                if ([viewNetwork superview]) { 
     76        [viewNetwork retain]; 
     77        [viewNetwork removeFromSuperview]; 
     78    } 
    7579         
    7680        [editPCPanel setTitle:[NSString stringWithFormat: NSLocalizedStringFromTable(@"viewGeneral:title", @"Localizable", @"cocoaControlEditPC"), [[thisPC objectForKey:@"PC Data"] objectForKey:@"name"]]]; 
     
    98102                [viewAdvanced removeFromSuperview]; 
    99103        } 
     104                if ([viewNetwork superview]) { 
     105        [viewNetwork retain]; 
     106        [viewNetwork removeFromSuperview]; 
     107    } 
    100108                 
    101109        [editPCPanel setTitle:[NSString stringWithFormat: NSLocalizedStringFromTable(@"viewHardware:title", @"Localizable", @"cocoaControlEditPC"), [[thisPC objectForKey:@"PC Data"] objectForKey:@"name"]]]; 
     
    123131                [viewGeneral removeFromSuperview]; 
    124132        } 
     133        if ([viewNetwork superview]) { 
     134        [viewNetwork retain]; 
     135        [viewNetwork removeFromSuperview]; 
     136    } 
    125137                 
    126138        [editPCPanel setTitle:[NSString stringWithFormat: NSLocalizedStringFromTable(@"viewAdvanced:title", @"Localizable", @"cocoaControlEditPC"), [[thisPC objectForKey:@"PC Data"] objectForKey:@"name"]]]; 
     
    134146        [[editPCPanel contentView] addSubview:viewAdvanced]; 
    135147        [viewAdvanced setFrameOrigin:NSMakePoint(0,60)]; 
     148} 
     149 
     150- (void) viewNetwork:(id)sender 
     151{ 
     152    if ([viewHardware superview]) { 
     153        [viewHardware retain]; 
     154        [viewHardware removeFromSuperview]; 
     155    } 
     156    if ([viewGeneral superview]) { 
     157        [viewGeneral retain]; 
     158        [viewGeneral removeFromSuperview]; 
     159    } 
     160    if ([viewAdvanced superview]) { 
     161        [viewAdvanced retain]; 
     162        [viewAdvanced removeFromSuperview]; 
     163    } 
     164         
     165    [editPCPanel setTitle:[NSString stringWithFormat: NSLocalizedStringFromTable(@"viewNetwork:title", @"Localizable", @"cocoaControlEditPC"), [[thisPC objectForKey:@"PC Data"] objectForKey:@"name"]]]; 
     166    [editPCPanel setFrame:NSMakeRect( 
     167        [editPCPanel frame].origin.x, 
     168        [editPCPanel frame].origin.y + [editPCPanel frame].size.height - [viewNetwork bounds].size.height - 140, 
     169        [editPCPanel frame].size.width, 
     170        [viewNetwork bounds].size.height + 140 
     171    ) display:YES animate:YES]; 
     172     
     173    [[editPCPanel contentView] addSubview:viewNetwork]; 
     174    [viewNetwork setFrameOrigin:NSMakePoint(0,60)]; 
    136175} 
    137176 
     
    284323                [popUpButtonInitrd insertItemWithTitle:[NSString stringWithString:argument] atIndex:1]; 
    285324                [popUpButtonInitrd selectItemAtIndex:1]; 
    286                  
     325     
     326    /* -redir */ 
     327    } else if ([option isEqual:@"-redir"]) { 
     328        // we do not have to do anything about it here, because the information is already saved in the configuration.plist              
    287329        /* -M */ 
    288330        } else if ([option isEqual:@"-M"]) { 
     
    458500        [popUpButtonInitrd selectItemAtIndex:0]; 
    459501         
    460         /* ceanup free qemu Arguments */ 
     502        /* cleanup free qemu Arguments */ 
    461503        [textFieldArguments setStringValue:@""]; 
     504         
     505    /* init firewall configuration */ 
     506        [self initFirewallSettings]; 
    462507         
    463508        /* Arguments of thisPC */ 
     
    505550        [editPCPanelToolbar setDelegate: self]; // We are the delegate 
    506551        [editPCPanel setToolbar: editPCPanelToolbar]; // Attach the toolbar to the document window 
     552        [firewallPortTable setDelegate:self]; 
     553        [firewallPortTable setDataSource:self]; 
    507554} 
    508555 
     
    533580                [toolbarItem setTarget: self]; 
    534581                [toolbarItem setAction: @selector( viewAdvanced: )]; 
     582    } else if ([itemIdent isEqual: @"network"]) { 
     583                [toolbarItem setLabel: NSLocalizedStringFromTable(@"toolbar:label:network", @"Localizable", @"cocoaControlEditPC")]; 
     584                [toolbarItem setPaletteLabel: NSLocalizedStringFromTable(@"toolbar:paletteLabel:network", @"Localizable", @"cocoaControlEditPC")]; 
     585                [toolbarItem setToolTip: NSLocalizedStringFromTable(@"toolbar:toolTip:network", @"Localizable", @"cocoaControlEditPC")]; 
     586                [toolbarItem setImage: [NSImage imageNamed: @"cocoa_tb_network.tiff"]]; 
     587                [toolbarItem setTarget: self]; 
     588                [toolbarItem setAction: @selector( viewNetwork: )]; 
    535589        } else { 
    536590                toolbarItem = nil; 
     
    545599                @"general", 
    546600                @"hardware", 
     601                @"network", 
    547602                @"advanced", 
    548603                nil]; 
     
    554609                @"general", 
    555610                @"hardware", 
     611                @"network", 
    556612                @"advanced", 
    557613                nil]; 
     
    563619                @"general", 
    564620                @"hardware", 
     621                @"network", 
    565622                @"advanced", 
    566623                nil];    
     
    10411098        } 
    10421099         
     1100        /* -redir */ 
     1101        // todo: add to arguments 
     1102        [[thisPC objectForKey:@"Arguments"] appendFormat:@"%@",[self constructFirewallArguments]]; 
     1103         
    10431104        /* qemu arguments */ 
    10441105        [[thisPC objectForKey:@"Arguments"] appendFormat:@" %@",[textFieldArguments stringValue]]; 
     
    10891150        return name; 
    10901151} 
     1152 
     1153/* Network Methods */ 
     1154/* Firewall Port Tableview Delegates */ 
     1155 
     1156- (int)numberOfRowsInTableView:(NSTableView *)tableView 
     1157{ 
     1158        return [firewallPortList count]; 
     1159} 
     1160 
     1161- (id)tableView:(NSTableView *)tableView objectValueForTableColumn:(NSTableColumn *)tableColumn row:(int)row 
     1162{        
     1163        id thisPort; 
     1164        thisPort = [firewallPortList objectAtIndex:row]; 
     1165 
     1166        if ([[tableColumn identifier] isEqualToString:@"status"]) { 
     1167        return [thisPort objectForKey:@"Enabled"]; 
     1168    } else if ([[tableColumn identifier] isEqualToString:@"name"]) { 
     1169        return [thisPort objectForKey:@"Name"]; 
     1170        } else { 
     1171                return @""; 
     1172        } 
     1173        return nil; 
     1174} 
     1175 
     1176- (void) disableTableView:(BOOL)disable 
     1177{ 
     1178    NSEnumerator * ec = [[firewallPortTable tableColumns] objectEnumerator]; 
     1179    NSTableColumn * curColumn; 
     1180    NSColor * textColor = nil;  
     1181    NSColor * backgroundColor = nil; 
     1182     
     1183    if(disable) { 
     1184        textColor = [NSColor colorWithCalibratedWhite:0.50 alpha:1.0]; 
     1185        backgroundColor = [NSColor colorWithCalibratedWhite:0.94 alpha:1.0]; 
     1186        firewallPortTableEnabled = NO; 
     1187    } else { 
     1188        textColor = [NSColor blackColor]; 
     1189        backgroundColor = [NSColor colorWithCalibratedWhite:0.94 alpha:1.0]; 
     1190        firewallPortTableEnabled = YES; 
     1191    } 
     1192     
     1193    while ((curColumn = [ec nextObject])) { 
     1194        if([[curColumn dataCell] isKindOfClass:[NSTextFieldCell class]]) { 
     1195                [[curColumn dataCell] setTextColor:textColor]; 
     1196                [[curColumn dataCell] setBackgroundColor:backgroundColor]; 
     1197        } 
     1198    } 
     1199     
     1200    if([[firewallPortTable enclosingScrollView] hasVerticalScroller]) 
     1201        [[[firewallPortTable enclosingScrollView] verticalScroller] setEnabled:!disable]; 
     1202 
     1203    //if([[table enclosingScrollView] hasHorizontalScroller]) 
     1204        //[[[table enclosingScrollView] horizontalScroller] setEnabled:(bEnable && saveHorizontalScrollerEnabled)]; 
     1205} 
     1206 
     1207#pragma mark Table Delegate Methods needed for the disableTableView method 
     1208 
     1209- (BOOL)selectionShouldChangeInTableView:(NSTableView *)aTableView 
     1210{ 
     1211    return firewallPortTableEnabled; 
     1212} 
     1213 
     1214- (BOOL)tableView:(NSTableView *)aTableView shouldEditTableColumn:(NSTableColumn *)aTableColumn row:(int)rowIndex 
     1215{ 
     1216    return firewallPortTableEnabled; 
     1217} 
     1218 
     1219- (BOOL)tableView:(NSTableView *)aTableView shouldSelectRow:(int)rowIndex 
     1220{ 
     1221    return firewallPortTableEnabled; 
     1222} 
     1223 
     1224- (BOOL)tableView:(NSTableView *)aTableView shouldSelectTableColumn:(NSTableColumn *)aTableColumn 
     1225{ 
     1226    return firewallPortTableEnabled; 
     1227} 
     1228 
     1229// for setting the checkbox status to the configuration file 
     1230- (void)tableView:(NSTableView *)aTableView setObjectValue:(id)theValue forTableColumn:(NSTableColumn *)aTableColumn row:(int)rowIndex 
     1231{ 
     1232    if([[aTableColumn identifier] isEqualToString:@"status"]) { 
     1233        // set the new "enabled" status in firewallPortList 
     1234        [[firewallPortList objectAtIndex:rowIndex] setObject:theValue forKey:@"Enabled"]; 
     1235        // calls table reloadData automatically 
     1236    } 
     1237} 
     1238     
     1239- (void)initFirewallSettings 
     1240{ 
     1241    firewallPortTableEnabled = YES; 
     1242    if(firewallPortList == nil) { 
     1243        firewallPortList = [[[NSMutableArray alloc] init] retain]; 
     1244    } else { 
     1245        [firewallPortList removeAllObjects]; 
     1246    } 
     1247    // load defaults into array 
     1248    NSArray * firewallDefaults = [NSArray arrayWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"fw-defaults" ofType:@"plist"]]; 
     1249    NSMutableArray * tempArray = [NSMutableArray arrayWithCapacity:5]; 
     1250    [firewallPortList addObjectsFromArray:firewallDefaults]; 
     1251    // load customs from thisPC 
     1252    if([[thisPC objectForKey:@"Network"] objectForKey:@"Redirect"]) { 
     1253        // enumerate through entries and check for defaults 
     1254        int i; 
     1255        int ii; 
     1256        int found = 0; 
     1257        for(i=0; i<[[[thisPC objectForKey:@"Network"] objectForKey:@"Redirect"] count]; i++) { 
     1258            for(ii=0; ii<[firewallPortList count]; ii++) { 
     1259                if([[[[[thisPC objectForKey:@"Network"] objectForKey:@"Redirect"] objectAtIndex:i] objectForKey:@"Name"] isEqualTo:[[firewallDefaults objectAtIndex:ii] objectForKey:@"Name"]]) { 
     1260                    // found equal entry in customs, set enabled status in firewallPortList 
     1261                    [[firewallPortList objectAtIndex:ii] setObject:[NSNumber numberWithBool:YES] forKey:@"Enabled"]; 
     1262                    found = 1; 
     1263                } 
     1264            } 
     1265            // check if previously found 
     1266            if(found == 0) { 
     1267                // not found, add entry to firewallPortList 
     1268                [tempArray addObject:[[[thisPC objectForKey:@"Network"] objectForKey:@"Redirect"] objectAtIndex:i]]; 
     1269            } 
     1270            found = 0; 
     1271        } 
     1272        if([tempArray count] > 0) [firewallPortList addObjectsFromArray:tempArray]; 
     1273    } 
     1274         
     1275    // load additionals into additional selector 
     1276    NSArray * firewallAdditionalServices = [NSArray arrayWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"fw-additionals" ofType:@"plist"]]; 
     1277     
     1278    int i; 
     1279    [popUpButtonFirewallAdditionalPorts removeAllItems]; 
     1280    for(i=0; i<[firewallAdditionalServices count]; i++) { 
     1281        [popUpButtonFirewallAdditionalPorts addItemWithTitle:[[firewallAdditionalServices objectAtIndex:i] valueForKey:@"Name"]]; 
     1282    } 
     1283    [[popUpButtonFirewallAdditionalPorts menu] addItem:[NSMenuItem separatorItem]]; 
     1284    [popUpButtonFirewallAdditionalPorts addItemWithTitle:@"Custom.."]; 
     1285        [popUpButtonFirewallAdditionalPorts selectItemAtIndex:0]; 
     1286} 
     1287 
     1288- (IBAction) showFirewallPortList:(id)sender 
     1289{  
     1290    [firewallPortTable reloadData]; 
     1291    [firewallPortTable selectRow:0 byExtendingSelection:NO]; 
     1292     
     1293    [NSApp beginSheet:firewallPortPanel 
     1294        modalForWindow:editPCPanel  
     1295        modalDelegate:self 
     1296        didEndSelector:nil 
     1297        contextInfo:nil]; 
     1298} 
     1299 
     1300- (IBAction) startShowNewPort:(id)sender 
     1301{ 
     1302    [self startEditPort:YES]; 
     1303} 
     1304- (IBAction) startShowEditPort:(id)sender 
     1305{ 
     1306    int restrictedPort = 0; 
     1307    NSArray * additionalPorts = [NSArray arrayWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"fw-additionals" ofType:@"plist"]]; 
     1308    if([firewallPortTable selectedRow] >= 0) { 
     1309        int i; 
     1310        for(i=0; i<=[additionalPorts count]-1; i++) { 
     1311            if([[[firewallPortList objectAtIndex:[firewallPortTable selectedRow]] objectForKey:@"Name"] isEqualTo:[[additionalPorts objectAtIndex:i] objectForKey:@"Name"]]) { 
     1312                restrictedPort = 1; 
     1313            } 
     1314        } 
     1315        if([firewallPortTable selectedRow] >= 0 && [firewallPortTable selectedRow] < [[NSArray arrayWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"fw-defaults" ofType:@"plist"]] count]) { 
     1316            restrictedPort = 1; 
     1317        } 
     1318        if(restrictedPort == 1) { 
     1319            NSString * redirectedPorts; 
     1320            if(![[[firewallPortList objectAtIndex:[firewallPortTable selectedRow]] valueForKey:@"TCP-Ports-Host"] isEqualToString:@""] && ![[[firewallPortList objectAtIndex:[firewallPortTable selectedRow]] valueForKey:@"UDP-Ports-Host"] isEqualToString:@""]) { 
     1321                // tcp and udp 
     1322                redirectedPorts = [NSString stringWithFormat:@"%@,%@ on the Host to port(s) %@,%@ on the Guest (TCP and UDP).", [[firewallPortList objectAtIndex:[firewallPortTable selectedRow]] valueForKey:@"TCP-Ports-Host"], [[firewallPortList objectAtIndex:[firewallPortTable selectedRow]] valueForKey:@"UDP-Ports-Host"], [[firewallPortList objectAtIndex:[firewallPortTable selectedRow]] valueForKey:@"TCP-Ports-Guest"], [[firewallPortList objectAtIndex:[firewallPortTable selectedRow]] valueForKey:@"UDP-Ports-Guest"]]; 
     1323            } else if (![[[firewallPortList objectAtIndex:[firewallPortTable selectedRow]] valueForKey:@"TCP-Ports-Host"] isEqualToString:@""]) { 
     1324                // tcp only 
     1325                redirectedPorts = [NSString stringWithFormat:@"%@ on the Host to port(s) %@ on the Guest (TCP).", [[firewallPortList objectAtIndex:[firewallPortTable selectedRow]] valueForKey:@"TCP-Ports-Host"], [[firewallPortList objectAtIndex:[firewallPortTable selectedRow]] valueForKey:@"TCP-Ports-Guest"]]; 
     1326            } else { 
     1327                // udp only 
     1328                redirectedPorts = [NSString stringWithFormat:@"%@ on the Host to port(s) %@ on the Guest (UDP).", [[firewallPortList objectAtIndex:[firewallPortTable selectedRow]] valueForKey:@"UDP-Ports-Host"], [[firewallPortList objectAtIndex:[firewallPortTable selectedRow]] valueForKey:@"UDP-Ports-Guest"]]; 
     1329            } 
     1330             
     1331            NSAlert *alert = [NSAlert alertWithMessageText:@"This service cannot be edited!" 
     1332                                defaultButton:@"OK" 
     1333                                alternateButton:nil 
     1334                                otherButton:nil 
     1335                                informativeTextWithFormat:[NSString stringWithFormat:@"%@ redirects incoming connections from port(s) %@", [[firewallPortList objectAtIndex:[firewallPortTable selectedRow]] valueForKey:@"Name"], redirectedPorts]]; 
     1336                                 
     1337            [alert runModal]; 
     1338        } else { 
     1339        [self startEditPort:NO]; 
     1340        } 
     1341    } 
     1342} 
     1343 
     1344- (void) startEditPort:(BOOL)newPort 
     1345 
     1346    [firewallPortPanel setFrame:NSMakeRect( 
     1347        [firewallPortPanel frame].origin.x, 
     1348        [firewallPortPanel frame].origin.y - 263, 
     1349        [firewallPortPanel frame].size.width, 
     1350        [firewallPortPanel frame].size.height + 263 
     1351    ) display:YES animate:YES]; 
     1352         
     1353    // disable new,edit,delete,ok,tableview 
     1354    [buttonFirewallNewPort setEnabled:NO]; 
     1355    [buttonFirewallEditPort setEnabled:NO]; 
     1356    [buttonFirewallDeletePort setEnabled:NO]; 
     1357    [buttonFirewallOk setKeyEquivalent:@""]; 
     1358    [buttonFirewallOk setEnabled:NO]; 
     1359    [self disableTableView:YES]; 
     1360     
     1361    [buttonFirewallSavePort setKeyEquivalent:@"\r"]; 
     1362         
     1363    if(newPort) { 
     1364        // called to create a new port 
     1365        [textFieldFirewallPortName setStringValue:@""]; 
     1366        [popUpButtonFirewallServiceType selectItemAtIndex:0]; 
     1367        [textFieldFirewallPortHostPorts setStringValue:@""]; 
     1368        [textFieldFirewallPortGuestPorts setStringValue:@""]; 
     1369         
     1370        [popUpButtonFirewallAdditionalPorts selectItemAtIndex:0]; 
     1371        [self setAdditionalPort:self]; 
     1372        [buttonFirewallSavePort setTarget:self]; 
     1373        [buttonFirewallSavePort setAction:@selector(saveNewPort:)]; 
     1374    } else { 
     1375        // called to edit a port 
     1376        [buttonFirewallSavePort setTarget:self]; 
     1377        [buttonFirewallSavePort setAction:@selector(saveEditPort:)]; 
     1378        [popUpButtonFirewallAdditionalPorts selectItemWithTitle:@"Custom.."]; 
     1379        // load port info from list 
     1380        int selectedPort = [firewallPortTable selectedRow]; 
     1381         
     1382        [textFieldFirewallPortName setStringValue:[[firewallPortList objectAtIndex:selectedPort] valueForKey:@"Name"]]; 
     1383        if(![[[firewallPortList objectAtIndex:selectedPort] valueForKey:@"TCP-Ports-Host"] isEqualToString:@""] && ![[[firewallPortList objectAtIndex:selectedPort] valueForKey:@"UDP-Ports-Host"] isEqualToString:@""]) { 
     1384            [popUpButtonFirewallServiceType selectItemAtIndex:2]; 
     1385            [textFieldFirewallPortHostPorts setStringValue:[[firewallPortList objectAtIndex:selectedPort] valueForKey:@"TCP-Ports-Host"]]; 
     1386        [textFieldFirewallPortGuestPorts setStringValue:[[firewallPortList objectAtIndex:selectedPort] valueForKey:@"TCP-Ports-Guest"]]; 
     1387        } else if(![[[firewallPortList objectAtIndex:selectedPort] valueForKey:@"TCP-Ports-Host"] isEqualToString:@""]) { 
     1388            [popUpButtonFirewallServiceType selectItemAtIndex:0]; 
     1389            [textFieldFirewallPortHostPorts setStringValue:[[firewallPortList objectAtIndex:selectedPort] valueForKey:@"TCP-Ports-Host"]]; 
     1390        [textFieldFirewallPortGuestPorts setStringValue:[[firewallPortList objectAtIndex:selectedPort] valueForKey:@"TCP-Ports-Guest"]]; 
     1391        } else if(![[[firewallPortList objectAtIndex:selectedPort] valueForKey:@"UDP-Ports-Host"] isEqualToString:@""]) { 
     1392            [popUpButtonFirewallServiceType selectItemAtIndex:1]; 
     1393            [textFieldFirewallPortHostPorts setStringValue:[[firewallPortList objectAtIndex:selectedPort] valueForKey:@"UDP-Ports-Host"]]; 
     1394        [textFieldFirewallPortGuestPorts setStringValue:[[firewallPortList objectAtIndex:selectedPort] valueForKey:@"UDP-Ports-Guest"]]; 
     1395        } 
     1396    } 
     1397} 
     1398 
     1399- (IBAction) deletePort:(id)sender 
     1400{ 
     1401    // check if port is a default port 
     1402    if([firewallPortTable selectedRow] >= 0 && [firewallPortTable selectedRow] < [[NSArray arrayWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"fw-defaults" ofType:@"plist"]] count]) { 
     1403        NSAlert *alert = [NSAlert alertWithMessageText:@"This service cannot be deleted!" 
     1404                                defaultButton:@"OK" 
     1405                                alternateButton:nil 
     1406                                otherButton:nil 
     1407                                informativeTextWithFormat:@"To disable this service from being redirected use the corresponding checkbox."]; 
     1408                                 
     1409        [alert runModal]; 
     1410    } else { 
     1411        // delete 
     1412        [firewallPortList removeObjectAtIndex:[firewallPortTable selectedRow]]; 
     1413        [firewallPortTable reloadData]; 
     1414    } 
     1415} 
     1416 
     1417- (IBAction) setAdditionalPort:(id)sender 
     1418{ 
     1419    // load data from fw-additionals.plist 
     1420    if ([popUpButtonFirewallAdditionalPorts indexOfSelectedItem] <= ([popUpButtonFirewallAdditionalPorts numberOfItems] - 3)) { 
     1421        // only sets from fw-additionals are loaded here.. 
     1422        NSArray * additionalPorts = [NSArray arrayWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"fw-additionals" ofType:@"plist"]]; 
     1423         
     1424        [textFieldFirewallPortName setStringValue:[[additionalPorts objectAtIndex:[popUpButtonFirewallAdditionalPorts indexOfSelectedItem]] valueForKey:@"Name"]]; 
     1425        if(![[[additionalPorts objectAtIndex:[popUpButtonFirewallAdditionalPorts indexOfSelectedItem]] valueForKey:@"TCP-Ports-Host"] isEqualToString:@""] && ![[[additionalPorts objectAtIndex:[popUpButtonFirewallAdditionalPorts indexOfSelectedItem]] valueForKey:@"UDP-Ports-Host"] isEqualToString:@""]) { 
     1426            // tcp and udp 
     1427            // add both type's ports, if set is saved we load it directly from fw-additionals because of possible duplicates 
     1428            [popUpButtonFirewallServiceType selectItemAtIndex:2]; 
     1429            [textFieldFirewallPortHostPorts setStringValue:[NSString stringWithFormat:@"%@,%@", [[additionalPorts objectAtIndex:[popUpButtonFirewallAdditionalPorts indexOfSelectedItem]] valueForKey:@"TCP-Ports-Host"], [[additionalPorts objectAtIndex:[popUpButtonFirewallAdditionalPorts indexOfSelectedItem]] valueForKey:@"UDP-Ports-Host"]]]; 
     1430        [textFieldFirewallPortGuestPorts setStringValue:[NSString stringWithFormat:@"%@,%@", [[additionalPorts objectAtIndex:[popUpButtonFirewallAdditionalPorts indexOfSelectedItem]] valueForKey:@"TCP-Ports-Guest"], [[additionalPorts objectAtIndex:[popUpButtonFirewallAdditionalPorts indexOfSelectedItem]] valueForKey:@"UDP-Ports-Guest"]]]; 
     1431        } else if(![[[additionalPorts objectAtIndex:[popUpButtonFirewallAdditionalPorts indexOfSelectedItem]] valueForKey:@"TCP-Ports-Host"] isEqualToString:@""]) { 
     1432            // tcp only 
     1433            [popUpButtonFirewallServiceType selectItemAtIndex:0]; 
     1434            [textFieldFirewallPortHostPorts setStringValue:[[additionalPorts objectAtIndex:[popUpButtonFirewallAdditionalPorts indexOfSelectedItem]] valueForKey:@"TCP-Ports-Host"]]; 
     1435        [textFieldFirewallPortGuestPorts setStringValue:[[additionalPorts objectAtIndex:[popUpButtonFirewallAdditionalPorts indexOfSelectedItem]] valueForKey:@"TCP-Ports-Guest"]]; 
     1436        } else if(![[[additionalPorts objectAtIndex:[popUpButtonFirewallAdditionalPorts indexOfSelectedItem]] valueForKey:@"UDP-Ports-Host"] isEqualToString:@""]) { 
     1437            // udp only 
     1438            [popUpButtonFirewallServiceType selectItemAtIndex:1]; 
     1439            [textFieldFirewallPortHostPorts setStringValue:[[additionalPorts objectAtIndex:[popUpButtonFirewallAdditionalPorts indexOfSelectedItem]] valueForKey:@"UDP-Ports-Host"]]; 
     1440        [textFieldFirewallPortGuestPorts setStringValue:[[additionalPorts objectAtIndex:[popUpButtonFirewallAdditionalPorts indexOfSelectedItem]] valueForKey:@"UDP-Ports-Guest"]]; 
     1441        } 
     1442        // lock elements 
     1443        [textFieldFirewallPortName setEnabled:NO]; 
     1444        [textFieldFirewallPortHostPorts setEnabled:NO]; 
     1445        [textFieldFirewallPortGuestPorts setEnabled:NO]; 
     1446        [popUpButtonFirewallServiceType setEnabled:NO]; 
     1447    } else { 
     1448        // custom port chosen 
     1449        [textFieldFirewallPortName setStringValue:@""]; 
     1450        [textFieldFirewallPortHostPorts setStringValue:@""]; 
     1451        [textFieldFirewallPortGuestPorts setStringValue:@""]; 
     1452        [popUpButtonFirewallServiceType selectItemAtIndex:0]; 
     1453         
     1454        [textFieldFirewallPortName setEnabled:YES]; 
     1455        [textFieldFirewallPortHostPorts setEnabled:YES]; 
     1456        [textFieldFirewallPortGuestPorts setEnabled:YES]; 
     1457        [popUpButtonFirewallServiceType setEnabled:YES]; 
     1458    } 
     1459} 
     1460 
     1461- (IBAction) saveNewPort:(id)sender 
     1462{ 
     1463    if([self checkPort:YES] == YES) { 
     1464        NSMutableDictionary * portDict; 
     1465        if ([popUpButtonFirewallAdditionalPorts indexOfSelectedItem] <= ([popUpButtonFirewallAdditionalPorts numberOfItems] - 3)) { 
     1466        // this is a set from fw-additionals, load it directly from the file         
     1467        NSArray * additionalPorts = [NSArray arrayWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"fw-additionals" ofType:@"plist"]]; 
     1468        portDict = [additionalPorts objectAtIndex:[popUpButtonFirewallAdditionalPorts indexOfSelectedItem]]; 
     1469        } else { 
     1470        // this is a custom port, take entries from textFields 
     1471        portDict = [NSMutableDictionary dictionaryWithCapacity:5]; 
     1472        [portDict setObject:[textFieldFirewallPortName stringValue] forKey:@"Name"]; 
     1473        if([popUpButtonFirewallServiceType indexOfSelectedItem] == 0) { 
     1474            // tcp only 
     1475            [portDict setObject:[textFieldFirewallPortHostPorts stringValue] forKey:@"TCP-Ports-Host"]; 
     1476            [portDict setObject:[textFieldFirewallPortGuestPorts stringValue] forKey:@"TCP-Ports-Guest"]; 
     1477        } else if([popUpButtonFirewallServiceType indexOfSelectedItem] == 1) { 
     1478            // udp only 
     1479            [portDict setObject:[textFieldFirewallPortHostPorts stringValue] forKey:@"UDP-Ports-Host"]; 
     1480            [portDict setObject:[textFieldFirewallPortGuestPorts stringValue] forKey:@"UDP-Ports-Guest"]; 
     1481        } else if([popUpButtonFirewallServiceType indexOfSelectedItem] == 2) { 
     1482            // tcp and udp 
     1483            [portDict setObject:[textFieldFirewallPortHostPorts stringValue] forKey:@"TCP-Ports-Host"]; 
     1484            [portDict setObject:[textFieldFirewallPortGuestPorts stringValue] forKey:@"TCP-Ports-Guest"]; 
     1485            [portDict setObject:[textFieldFirewallPortHostPorts stringValue] forKey:@"UDP-Ports-Host"]; 
     1486            [portDict setObject:[textFieldFirewallPortGuestPorts stringValue] forKey:@"UDP-Ports-Guest"]; 
     1487        } 
     1488        } // end predefined/custom check 
     1489        // set enabled key 
     1490        [portDict setObject:[NSNumber numberWithBool:YES] forKey:@"Enabled"]; 
     1491        // add to list 
     1492        [firewallPortList addObject:portDict]; 
     1493        [self endEditPort:self]; 
     1494    } 
     1495} 
     1496 
     1497- (IBAction) saveEditPort:(id)sender 
     1498{ 
     1499    if([self checkPort:NO] == YES) { 
     1500        // save to edited port 
     1501        int selectedPort = [firewallPortTable selectedRow]; 
     1502         
     1503        NSMutableDictionary * portDict = [NSMutableDictionary dictionaryWithCapacity:5]; 
     1504        [portDict setObject:[textFieldFirewallPortName stringValue] forKey:@"Name"]; 
     1505        if([popUpButtonFirewallServiceType indexOfSelectedItem] == 0) { 
     1506            // tcp only 
     1507            [portDict setObject:[textFieldFirewallPortHostPorts stringValue] forKey:@"TCP-Ports-Host"]; 
     1508            [portDict setObject:[textFieldFirewallPortGuestPorts stringValue] forKey:@"TCP-Ports-Guest"]; 
     1509        } else if([popUpButtonFirewallServiceType indexOfSelectedItem] == 1) { 
     1510            // udp only 
     1511            [portDict setObject:[textFieldFirewallPortHostPorts stringValue] forKey:@"UDP-Ports-Host"]; 
     1512            [portDict setObject:[textFieldFirewallPortGuestPorts stringValue] forKey:@"UDP-Ports-Guest"]; 
     1513        } else if([popUpButtonFirewallServiceType indexOfSelectedItem] == 2) { 
     1514            // tcp and udp 
     1515            [portDict setObject:[textFieldFirewallPortHostPorts stringValue] forKey:@"TCP-Ports-Host"]; 
     1516            [portDict setObject:[textFieldFirewallPortGuestPorts stringValue] forKey:@"TCP-Ports-Guest"]; 
     1517            [portDict setObject:[textFieldFirewallPortHostPorts stringValue] forKey:@"UDP-Ports-Host"]; 
     1518            [portDict setObject:[textFieldFirewallPortGuestPorts stringValue] forKey:@"UDP-Ports-Guest"]; 
     1519        } 
     1520        // set enabled/disabled key 
     1521        [portDict setObject:[[firewallPortList objectAtIndex:selectedPort] objectForKey:@"Enabled"] forKey:@"Enabled"]; 
     1522        // replace in list 
     1523        [firewallPortList replaceObjectAtIndex:selectedPort withObject:portDict];           
     1524        [self endEditPort:self]; 
     1525    } 
     1526} 
     1527 
     1528- (BOOL) checkPort:(BOOL)newPort 
     1529{ 
     1530    if([[textFieldFirewallPortName stringValue] isEqualToString:@""]) { 
     1531        // name empty 
     1532        [textFieldFirewallPortError setStringValue:@"No empty name!"]; 
     1533        [textFieldFirewallPortError setHidden:NO]; 
     1534        return NO; 
     1535    } else if([[textFieldFirewallPortHostPorts stringValue] isEqualToString:@""]) { 
     1536        // host ports empty 
     1537        NSLog(@"No empty host-port entry!"); 
     1538        [textFieldFirewallPortError setStringValue:@"No empty host-port entry!"]; 
     1539        [textFieldFirewallPortError setHidden:NO]; 
     1540        return NO; 
     1541    } else if([[textFieldFirewallPortGuestPorts stringValue] isEqualToString:@""]) { 
     1542        // guest ports empty 
     1543        NSLog(@"No empty guest-port entry!"); 
     1544        [textFieldFirewallPortError setStringValue:@"No empty guest-port entry!"]; 
     1545        [textFieldFirewallPortError setHidden:NO]; 
     1546        return NO; 
     1547    } else { 
     1548        // check for valid port ranges 
     1549           int i,j,k; 
     1550           int dcc = 0; // delimiter comma count 
     1551           int dhc = 0; // delimiter haifin count 
     1552           unichar tChar; 
     1553           int invalid = 0; 
     1554           NSString *tForbidden = [NSString stringWithString:@"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz!\"$%&/()=?+*#'_;:.<>"]; 
     1555           NSString *tDelimiters = [NSString stringWithString:@",-"]; 
     1556           NSArray *tPortRanges = [NSArray arrayWithObjects:[textFieldFirewallPortHostPorts stringValue], [textFieldFirewallPortGuestPorts stringValue], nil]; 
     1557           for (i = 0; i < [tPortRanges count]; i++) { 
     1558            for (j = 0; j < [[tPortRanges objectAtIndex:i] length]; j++) { 
     1559                tChar = [[tPortRanges objectAtIndex:i] characterAtIndex:j]; 
     1560                for (k=0; k < [tForbidden length]; k++) { 
     1561                    //NSLog(@"%C, %C", tChar, [tForbidden characterAtIndex:k]); 
     1562                    if (tChar == [tForbidden characterAtIndex:k]) { 
     1563                        // invalid character 
     1564                        invalid = 1; 
     1565                    } else if(tChar == [tDelimiters characterAtIndex:0]) { 
     1566                        // raise comma count 
     1567                        dcc++; 
     1568                    } else if(tChar == [tDelimiters characterAtIndex:1]) { 
     1569                        // raise haifin count 
     1570                        dhc++; 
     1571                    } 
     1572                } 
     1573            } 
     1574           } 
     1575           if (invalid == 1) { 
     1576               NSLog(@"Illegal characters in ports!"); 
     1577               [textFieldFirewallPortError setStringValue:@"Illegal characters in ports!"]; 
     1578               [textFieldFirewallPortError setHidden:NO]; 
     1579               return NO; 
     1580           } else if(dcc > 0 && dhc > 0) { 
     1581               // both comma and haifin found, not supported/allowed atm 
     1582               NSLog(@"Combination of , and - not allowed."); 
     1583               [textFieldFirewallPortError setStringValue:@"Combination of , and - not allowed."]; 
     1584               [textFieldFirewallPortError setHidden:NO]; 
     1585               return NO; 
     1586           } 
     1587    } 
     1588    int i; 
     1589    int found = 0; 
     1590    if(newPort) { 
     1591        // check for same name in all entries of current list 
     1592         
     1593        for(i=0; i<=[firewallPortList count]-1; i++) { 
     1594            if([[textFieldFirewallPortName stringValue] isEqualTo:[[firewallPortList objectAtIndex:i] objectForKey:@"Name"]]) { 
     1595                found = 1; 
     1596            } 
     1597        } 
     1598    } else { 
     1599        // check for same name in fw-default entries of current list 
     1600        for(i=0; i<=[[NSArray arrayWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"fw-defaults" ofType:@"plist"]] count]-1; i++) { 
     1601            if([[textFieldFirewallPortName stringValue] isEqualTo:[[firewallPortList objectAtIndex:i] objectForKey:@"Name"]]) { 
     1602                found = 1; 
     1603            } 
     1604        } 
     1605    } 
     1606    if(found == 1) return NO; 
     1607    return YES; 
     1608} 
     1609 
     1610- (IBAction) endEditPort:(id)sender 
     1611{ 
     1612    // reset 
     1613    [textFieldFirewallPortName setStringValue:@""]; 
     1614    [textFieldFirewallPortHostPorts setStringValue:@""]; 
     1615    [textFieldFirewallPortGuestPorts setStringValue:@""]; 
     1616    [popUpButtonFirewallServiceType selectItemAtIndex:0]; 
     1617    [textFieldFirewallPortError setStringValue:@""]; 
     1618    [textFieldFirewallPortError setHidden:YES]; 
     1619         
     1620    [textFieldFirewallPortName setEnabled:YES]; 
     1621    [textFieldFirewallPortHostPorts setEnabled:YES]; 
     1622    [textFieldFirewallPortGuestPorts setEnabled:YES]; 
     1623    [popUpButtonFirewallServiceType setEnabled:YES];     
     1624     
     1625    [firewallPortPanel setFrame:NSMakeRect( 
     1626        [firewallPortPanel frame].origin.x, 
     1627        [firewallPortPanel frame].origin.y + 263, 
     1628        [firewallPortPanel frame].size.width, 
     1629        [firewallPortPanel frame].size.height - 263 
     1630    ) display:YES animate:YES]; 
     1631     
     1632    // enable new,edit,delete,ok,tableview 
     1633    [buttonFirewallNewPort setEnabled:YES]; 
     1634    [buttonFirewallEditPort setEnabled:YES]; 
     1635    [buttonFirewallDeletePort setEnabled:YES]; 
     1636    [buttonFirewallOk setKeyEquivalent:@"\r"]; 
     1637    [buttonFirewallOk setEnabled:YES]; 
     1638    [self disableTableView:NO]; 
     1639     
     1640    [buttonFirewallSavePort setKeyEquivalent:@""]; 
     1641    [firewallPortTable reloadData]; 
     1642} 
     1643 
     1644- (IBAction) closeFirewallPortList:(id)sender 
     1645{ 
     1646    // save the ports in configuration.plist 
     1647    // enumerate through entries and check for defaults, when enabled => save 
     1648    NSArray * firewallDefaults = [NSArray arrayWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"fw-defaults" ofType:@"plist"]]; 
     1649    NSMutableArray * customPorts = [NSMutableArray arrayWithCapacity:10]; 
     1650    int i; 
     1651    int ii; 
     1652    int found = 0; 
     1653    for(i=0; i<=[firewallPortList count]-1; i++) { 
     1654        for(ii=0; ii<=[firewallDefaults count]-1; ii++) { 
     1655            if([[[firewallPortList objectAtIndex:i] objectForKey:@"Name"] isEqualTo:[[firewallDefaults objectAtIndex:ii] objectForKey:@"Name"]]) { 
     1656                // found default port in customs, check for enabled status in firewallPortList 
     1657                found = 1; 
     1658                if([[[firewallPortList objectAtIndex:i] objectForKey:@"Enabled"] isEqualTo:[NSNumber numberWithBool:YES]]) { 
     1659                    // default port enabled => save to conf.plist 
     1660                    [customPorts addObject:[firewallPortList objectAtIndex:i]];  
     1661                } 
     1662            }    
     1663        } 
     1664        if(found == 0) { 
     1665            // port is not default port, save to conf.plist regardless of Enabled 
     1666            [customPorts addObject:[firewallPortList objectAtIndex:i]]; 
     1667        } 
     1668        found = 0; 
     1669    } 
     1670    [thisPC setObject:[NSDictionary dictionaryWithObject:customPorts forKey:@"Redirect"] forKey:@"Network"]; 
     1671    [NSApp endSheet:firewallPortPanel]; 
     1672    [firewallPortPanel orderOut:self]; 
     1673} 
     1674 
     1675- (NSString *) constructFirewallArguments 
     1676{ 
     1677    NSArray * portlist = [[thisPC objectForKey:@"Network"] objectForKey:@"Redirect"]; 
     1678    NSMutableString * arguments = [NSMutableString stringWithCapacity:10]; 
     1679     
     1680    int i, ii, j, k; 
     1681    for(i=0; i<[portlist count]; i++) { 
     1682        // enumerate through portlist in conf.plist 
     1683        if([[[portlist objectAtIndex:i] objectForKey:@"Enabled"] isEqualTo:[NSNumber numberWithBool:YES]]) { 
     1684            NSArray * tcpHostComma = [[[portlist objectAtIndex:i] valueForKey:@"TCP-Ports-Host"] componentsSeparatedByString:@","]; 
     1685            NSArray * tcpHostHaifin = [[[portlist objectAtIndex:i] valueForKey:@"TCP-Ports-Host"] componentsSeparatedByString:@"-"]; 
     1686            NSArray * tcpGuestComma = [[[portlist objectAtIndex:i] valueForKey:@"TCP-Ports-Guest"] componentsSeparatedByString:@","]; 
     1687            NSArray * tcpGuestHaifin = [[[portlist objectAtIndex:i] valueForKey:@"TCP-Ports-Guest"] componentsSeparatedByString:@"-"]; 
     1688             
     1689            NSArray * udpHostComma = [[[portlist objectAtIndex:i] valueForKey:@"UDP-Ports-Host"] componentsSeparatedByString:@","]; 
     1690            NSArray * udpHostHaifin = [[[portlist objectAtIndex:i] valueForKey:@"UDP-Ports-Host"] componentsSeparatedByString:@"-"]; 
     1691            NSArray * udpGuestComma = [[[portlist objectAtIndex:i] valueForKey:@"UDP-Ports-Guest"] componentsSeparatedByString:@","]; 
     1692            NSArray * udpGuestHaifin = [[[portlist objectAtIndex:i] valueForKey:@"UDP-Ports-Guest"] componentsSeparatedByString:@"-"]; 
     1693             
     1694            NSArray * typeA = [NSArray arrayWithObjects:@"tcp",@"udp",nil]; 
     1695            NSArray * seperatedA = [NSArray arrayWithObjects:[NSArray arrayWithObjects:tcpHostComma, tcpHostHaifin, tcpGuestComma, tcpGuestHaifin, nil], [NSArray arrayWithObjects:udpHostComma, udpHostHaifin, udpGuestComma, udpGuestHaifin, nil], nil]; 
     1696             
     1697            for(ii=0; ii<[seperatedA count]; ii++) { 
     1698            // tcp/udp 
     1699            id tp = [typeA objectAtIndex:ii]; 
     1700            id hc = [[seperatedA objectAtIndex:ii] objectAtIndex:0]; 
     1701            id hh = [[seperatedA objectAtIndex:ii] objectAtIndex:1]; 
     1702            id gc = [[seperatedA objectAtIndex:ii] objectAtIndex:2]; 
     1703            id gh = [[seperatedA objectAtIndex:ii] objectAtIndex:3]; 
     1704             
     1705             
     1706            /* comma code */ 
     1707            if([hc count] > 1 && [gc count] > 1) { 
     1708                // both seperated by comma 
     1709                if([hc count] == [gc count]) { 
     1710                    // both have the same amount of ports 
     1711                    // redirect same=>same 
     1712                    for(j=0; j < [hc count]; j++) { 
     1713                        [arguments appendString:[NSString stringWithFormat:@" -redir %@:%@::%@",tp, [hc objectAtIndex:j], [gc objectAtIndex:j]]]; 
     1714                    } 
     1715                } else { 
     1716                    // both have a different amount of ports 
     1717                    // redirect every=>every 
     1718                    for(j=0; j < [hc count]; j++) { 
     1719                        for(k=0; k < [gc count]; k++) { 
     1720                            [arguments appendString:[NSString stringWithFormat:@" -redir %@:%@::%@",tp, [hc objectAtIndex:j], [gc objectAtIndex:k]]]; 
     1721                        } 
     1722                    } 
     1723                } 
     1724            } else if([hc count] == 1 && [gc count] > 1) { 
     1725                // only guest seperated by comma 
     1726                // redirect one=>every 
     1727                 for(j=0; j < [gc count]; j++) { 
     1728                    [arguments appendString:[NSString stringWithFormat:@" -redir %@:%@::%@",tp, [hc objectAtIndex:0], [gc objectAtIndex:j]]]; 
     1729                    } 
     1730            } else if([hc count] > 1 && [gc count] == 1) { 
     1731                // only host seperated by comma 
     1732                // redirect one=>every 
     1733                 for(j=0; j < [hc count]; j++) { 
     1734                    [arguments appendString:[NSString stringWithFormat:@" -redir %@:%@::%@",tp, [hc objectAtIndex:j], [gc objectAtIndex:0]]]; 
     1735                    } 
     1736            } 
     1737             
     1738            /* haifin code */ 
     1739            if([hh count] > 1 && [gh count] > 1) { 
     1740                // both seperated by haifin 
     1741                // redirect same=>same 
     1742                j=[[hh objectAtIndex:0] intValue]; 
     1743                k=[[gh objectAtIndex:0] intValue];  
     1744                while(j <= [[hh objectAtIndex:1] intValue]) { 
     1745                    [arguments appendString:[NSString stringWithFormat:@" -redir %@:%d::%d",tp, j,k]]; 
     1746                    j++; 
     1747                    k++; 
     1748                } 
     1749            } else if([hh count] == 1 && [gh count] > 1) { 
     1750                // only guest seperated by haifin 
     1751                // redirect one=>every 
     1752                j=[[gh objectAtIndex:0] intValue]; 
     1753                while(j < [[gh objectAtIndex:1] intValue]) { 
     1754                    [arguments appendString:[NSString stringWithFormat:@" -redir %@:%@::%d",tp, [hh objectAtIndex:0],j]]; 
     1755                    j++; 
     1756                    } 
     1757            } else if([hh count] > 1 && [gh count] == 1) { 
     1758                // only host seperated by haifin 
     1759                // redirect one=>every 
     1760                j=[[hh objectAtIndex:0] intValue]; 
     1761                while(j < [[hh objectAtIndex:1] intValue]) { 
     1762                    [arguments appendString:[NSString stringWithFormat:@" -redir %@:%d::%@", j,[gh objectAtIndex:0]]]; 
     1763                    j++; 
     1764                    } 
     1765            } 
     1766             
     1767            /* only one=>one port code */ 
     1768            // check also for empty port ranges, because componentsSeperatedByString: returns count 1 even from an empty string 
     1769            if(([hh count] == 1 && [gh count] == 1) && ([hc count] == 1 && [gc count] == 1)) { 
     1770                if(!([[hh objectAtIndex:0] isEqualTo:@""] && [[gh objectAtIndex:0] isEqualTo:@""]) && !([[hc objectAtIndex:0] isEqualTo:@""] && [[gc objectAtIndex:0] isEqualTo:@""])) { 
     1771                    // only one port 
     1772                    // redirect one=>one 
     1773                    [arguments appendString:[NSString stringWithFormat:@" -redir %@:%@::%@",tp, [hc objectAtIndex:0] ,[gc objectAtIndex:0]]]; 
     1774                } 
     1775            } // end if ([hh count == 1] ... 
     1776            } // end tcp/udp 
     1777        } // end if enabled 
     1778    } // end for portlist 
     1779    return arguments; 
     1780} 
     1781 
    10911782@end