00001
00002
00003
00004
00005
00006
00007
00008
00009 #import "MetaServerTableDataSource.h"
00010
00011
00012 @implementation MetaServerTableDataSource
00013
00014 - (id) init {
00015 self = [super init];
00016 if (self != nil) {
00017 selectedServer = nil;
00018 meta = [[MetaServerParser alloc] init];
00019
00020 [NSThread detachNewThreadSelector:@selector(refreshServersInSeperateThread:) toTarget:self withObject:nil];
00021 }
00022 return self;
00023 }
00024
00025 - (void) refreshServersInSeperateThread:(id)sender {
00026
00027
00028
00029
00030 NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
00031
00032 NSLog(@"MetaServerTableDataSource.refreshServersInSeperateThread: start running");
00033 [self refreshServers:self];
00034 NSLog(@"MetaServerTableDataSource.refreshServersInSeperateThread: complete");
00035
00036
00037
00038
00039 [pool release];
00040 }
00041
00042 - (IBAction)refreshServers:(id)sender {
00043 entries = [meta readFromMetaServer:@"metaserver.netrek.org" atPort:3521];
00044 [serverTableView reloadData];
00045 }
00046
00047 - (int)numberOfRowsInTableView:(NSTableView *)aTableView {
00048 if (serverTableView == aTableView) {
00049 return [entries count];
00050 }
00051 return 0;
00052 }
00053
00054 - (id)tableView:(NSTableView *)aTableView
00055 objectValueForTableColumn:(NSTableColumn *)aTableColumn
00056 row:(int)rowIndex {
00057
00058 if (serverTableView == aTableView) {
00059 MetaServerEntry *entry = [entries objectAtIndex:rowIndex];
00060
00061 if ([[aTableColumn identifier] isEqualTo: @"address"]) {
00062 return [entry address];
00063 } else if ([[aTableColumn identifier] isEqualTo: @"status"]) {
00064 return [entry statusString];
00065 } else if ([[aTableColumn identifier] isEqualTo: @"players"]) {
00066 return [NSString stringWithFormat:@"%d", [entry players]];
00067 } else if ([[aTableColumn identifier] isEqualTo: @"game"]) {
00068 return [entry gameTypeString];
00069 } else {
00070 return @"ERROR";
00071 }
00072 }
00073 return @"ERROR";
00074 }
00075
00076 - (MetaServerEntry *) selectedServer {
00077 return selectedServer;
00078 }
00079
00080 - (void) setServerSelected:(MetaServerEntry *) server {
00081
00082 NSLog(@"MetaServerTableDataSource.setServerSelected called");
00083 [selectedServer release];
00084 selectedServer = server;
00085 [selectedServer retain];
00086
00087 [notificationCenter postNotificationName:@"MS_SERVER_SELECTED" object:self userInfo:selectedServer];
00088 }
00089
00090
00091
00092 - (BOOL)tableView:(NSTableView *)aTableView shouldSelectRow:(int)rowIndex {
00093
00094
00095
00096
00097
00098 if (aTableView == serverTableView) {
00099 MetaServerEntry *entry = [entries objectAtIndex:rowIndex];
00100 [self setServerSelected:entry];
00101 }
00102
00103 return YES;
00104 }
00105
00106 - (void) deselectServer {
00107 selectedServer = nil;
00108 [serverTableView deselectAll:self];
00109 }
00110
00111 - (MetaServerEntry *) findServer:(NSString *)name {
00112
00113 for (int i = 0; i < [entries count]; i++) {
00114 MetaServerEntry *entry = [entries objectAtIndex:i];
00115 if ([[entry address] isEqualToString:name]) {
00116 return entry;
00117 }
00118 }
00119 return nil;
00120 }
00121
00122 - (void) addServer:(MetaServerEntry *) entry {
00123 [entries insertObject:entry atIndex:0];
00124 [serverTableView reloadData];
00125
00126 [self setServerSelected:entry];
00127 }
00128
00129 - (void) removeServer:(NSString *)name {
00130
00131 MetaServerEntry *entry = [self findServer:name];
00132 if (entry != nil) {
00133 [entries removeObject:entry];
00134 [serverTableView reloadData];
00135 if (entry == selectedServer) {
00136 [self deselectServer];
00137 }
00138 }
00139 }
00140
00141 @end