/Volumes/Plantain/MyDocuments/Projects/MacTrek/MacTrek/App/MetaServerTableDataSource.m

00001 //
00002 //  MetaServerTableDataSource.m
00003 //  MacTrek
00004 //
00005 //  Created by Aqua on 26/05/2006.
00006 //  Copyright 2006 __MyCompanyName__. All rights reserved.
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         // initial query is in seperate thread
00020         [NSThread detachNewThreadSelector:@selector(refreshServersInSeperateThread:) toTarget:self withObject:nil];
00021     }
00022     return self;
00023 }
00024 
00025 - (void) refreshServersInSeperateThread:(id)sender {
00026     // technically this should be done with locks since
00027     // it can be invoked from init and by user if he is very very fast...
00028     
00029     // create a private pool for this thread
00030     NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
00031     
00032     NSLog(@"MetaServerTableDataSource.refreshServersInSeperateThread: start running");
00033     [self refreshServers:self];
00034     NSLog(@"MetaServerTableDataSource.refreshServersInSeperateThread: complete");
00035     
00036     [notificationCenter postNotificationName:@"MS_SERVERS_READ"];
00037     
00038     // release the pool
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"; // unknown column
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 // delegate functions
00092 - (BOOL)tableView:(NSTableView *)aTableView shouldSelectRow:(int)rowIndex {
00093     
00094     // we abuse shouldSelectRow since it is a delegate function and not
00095     // a notification. (simpler)
00096     
00097     // update the selected server
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     // and select it
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

Generated on Fri Jul 28 19:15:14 2006 for MacTrek by  doxygen 1.4.7