Now it crashes!
[ITFoundation.git] / ITInetServerSocket.m
index f4b9720..c37ec4f 100755 (executable)
@@ -9,6 +9,7 @@
 #import "ITInetServerSocket.h"
 #import "ITInetSocket.h"
 #import <sys/types.h>
+#import <sys/time.h>
 #import <arpa/inet.h>
 #import <netinet/in.h>
 #import <sys/socket.h>
@@ -17,8 +18,7 @@
 #import <unistd.h>
 
 /* Too bad Objective-C doesn't have class variables... */
-static NSMutableDictionary *servsockets;
-static NSTimer *timer;
+static NSMutableSet *servsockets;
 
 @interface ITInetServerSocket(Private)
 +(void)registerSocket:(ITInetServerSocket*)sock;
@@ -28,17 +28,17 @@ static NSTimer *timer;
 -(void)stopConnection;
 -(void)setupRendezvousAdvertising;
 -(void)stopRendezvousAdvertising;
-+(void)setupTimer;
-+(void)stopTimer;
+-(void)setupTimer;
+-(void)stopTimer;
 +(void)globalTimerFunc:(NSTimer*)timer;
--(BOOL)timerFunc;
+-(void)timerFunc:(NSTimer*)timer;
 @end
 
 @implementation ITInetServerSocket
 + (void)initialize
 {
-    servsockets = [[NSMutableDictionary alloc] init];
-    [self setupTimer];
+    servsockets = [[NSMutableSet alloc] init];
+    //[self setupTimer];
 }
 
 - (id)init
@@ -51,6 +51,7 @@ static NSTimer *timer;
           service = nil;
           port = 0;
           rndType = rndName = nil;
+          timer = nil;
           }
     return self;
 }
@@ -65,6 +66,7 @@ static NSTimer *timer;
           service = nil;
           port = 0;
           rndType = rndName = nil;
+          timer = nil;
           }
     return self;
 }
@@ -78,7 +80,7 @@ static NSTimer *timer;
     [rndType release];
 }
 
-- (BOOL)registerSocket
+- (BOOL)start
 {
     if (!rndName || !rndType || !port) return NO;
     [ITInetServerSocket registerSocket:self];
@@ -133,13 +135,13 @@ static NSTimer *timer;
 +(void)registerSocket:(ITInetServerSocket*)sock
 {
     [sock setupConnection];
-    [servsockets setObject:sock forKey:[NSString stringWithFormat:@"%lu",[sock port]]];
+    [servsockets addObject:sock];
 }
 
 +(void)unregisterSocket:(ITInetServerSocket*)sock
 {
     [sock stopConnection];
-    [servsockets removeObjectForKey:[NSString stringWithFormat:@"%lu",[sock port]]];
+    [servsockets removeObject:sock];
 }
 
 -(short)lookupPortForServiceType:(NSString*)name
@@ -175,6 +177,7 @@ static NSTimer *timer;
     listen(sockfd, SOMAXCONN);
     fcntl(sockfd,F_SETFL,O_NONBLOCK);
     [self setupRendezvousAdvertising];
+    [self setupTimer];
 }
 
 - (void)stopConnection
@@ -199,13 +202,13 @@ static NSTimer *timer;
     service = nil;
 }
 
-+ (void)setupTimer
+- (void)setupTimer
 {
-    if (!timer) timer = [NSTimer timerWithTimeInterval:0 target:self selector:@selector(globalTimerFunc:) userInfo:nil repeats:YES];
+    if (!timer) timer = [NSTimer timerWithTimeInterval:0 target:self selector:@selector(timerFunc:) userInfo:nil repeats:YES];
     [[NSRunLoop currentRunLoop] addTimer:timer forMode:NSDefaultRunLoopMode];
 }
 
-+ (void)stopTimer
+- (void)stopTimer
 {
     [timer invalidate];
     [timer release];
@@ -214,16 +217,10 @@ static NSTimer *timer;
 
 + (void)globalTimerFunc:(NSTimer*)timer
 {
-    NSEnumerator *enume = [servsockets objectEnumerator];
-    id obj;
-
-    while (obj = [enume nextObject])
-          {
-          [obj timerFunc];
-          }
+    [servsockets makeObjectsPerformSelector:@selector(timerFunc)];
 }
 
-- (BOOL)timerFunc
+- (void)timerFunc:(NSTimer*)timer
 {
     if (sockfd != -1)
           {
@@ -232,16 +229,14 @@ static NSTimer *timer;
           signed int cfd;
           cfd = accept(sockfd,(struct sockaddr*)&csa,&csalen);
           if (cfd == -1) {
-                 if (errno == EWOULDBLOCK) return NO;
+                 if (errno == EWOULDBLOCK) ;
                  else {perror("Too bad I haven't implemented error checking yet");}
           }
           else {
-                 ITInetSocket *csocket = [[[ITInetSocket alloc] initWithFD:cfd delegate:self] autorelease];
+                 ITInetSocket *csocket = [[ITInetSocket alloc] initWithFD:cfd delegate:self];
                  [clients addObject:csocket];
                  [delegate newClientJoined:csocket];
-                 return YES;
           }
           }
-    return NO;
 }
 @end
\ No newline at end of file