|
|
1.1 ! root 1: /* ! 2: DEOServer.m created by enoyau on Fri 13-Jan-1995 ! 3: ! 4: You may freely copy, distribute, and reuse the code in this example. ! 5: NeXT disclaims any warranty of any kind, expressed or implied, as to its ! 6: fitness for any particular use. ! 7: */ ! 8: ! 9: #import "DEOServer.h" ! 10: ! 11: #import <foundation/NSArray.h> ! 12: #import <foundation/NSUtilities.h> ! 13: #import <foundation/NSAutoreleasePool.h> ! 14: #import <foundation/NSException.h> ! 15: #import <remote/NXConnection.h> ! 16: #import <remote/NXProxy.h> ! 17: ! 18: @implementation DEOServer ! 19: ! 20: - init ! 21: { ! 22: [super init]; ! 23: if(wantLog) NSLog(@"DEOServer: init"); ! 24: clientDict = [NSMutableDictionary new]; ! 25: return self; ! 26: } ! 27: ! 28: - (void)dealloc ! 29: { ! 30: if(wantLog) NSLog(@"DEOServer: dealloc"); ! 31: [clientDict release]; ! 32: [super dealloc]; ! 33: } ! 34: ! 35: - (oneway)dispatchInformation:(NSDictionary *)info ! 36: forKey:(NSString *)key ! 37: userInfo:(NSDictionary *)userInfo ! 38: { ! 39: NSMutableArray *array = [clientDict objectForKey:key]; ! 40: NSMutableArray *deadClients = [NSMutableArray array]; ! 41: NSEnumerator *enumerator; ! 42: id <DEOClient> next; ! 43: ! 44: if(wantLog) ! 45: NSLog(@"DEOServer: Receive information '%@' forKey '%s' user info '%@'", ! 46: [info description], ! 47: [key cString], ! 48: [userInfo description]); ! 49: if(wantLog) NSLog(@" %d clients to notify", [array count]); ! 50: ! 51: enumerator = [array objectEnumerator]; ! 52: while(next = [enumerator nextObject]) { ! 53: NS_DURING ! 54: [next dispatchInformation:info forKey:key userInfo:userInfo]; ! 55: NS_HANDLER ! 56: [deadClients addObject:next]; ! 57: NS_ENDHANDLER ! 58: } ! 59: ! 60: if(wantLog) ! 61: NSLog(@" %d deads clients detected", [deadClients count]); ! 62: enumerator = [deadClients objectEnumerator]; ! 63: while(next = [enumerator nextObject]) { ! 64: [self unregisterClient:next]; ! 65: } ! 66: if(wantLog) NSLog(@"---------"); ! 67: return; ! 68: } ! 69: ! 70: - (oneway)registerClient:(id <DEOClient>)client forKey:(NSString *)key ! 71: { ! 72: NSMutableArray *array = [clientDict objectForKey:key]; ! 73: ! 74: if(wantLog) NSLog(@"DEOServer: register client %x for key '%s'\n", ! 75: (unsigned int)client, ! 76: [key cString]); ! 77: ! 78: // A retainCount of 1 means that the client has not been registered ! 79: // before. The client is an autoreleased proxy of a subclass of NSObject. ! 80: if([(NSObject *)client retainCount] == 1) { ! 81: if(wantLog) NSLog(@" DO registration"); ! 82: [(NXProxy *)client setProtocolForProxy:@protocol(DEOClient)]; ! 83: } ! 84: ! 85: if(!array) { ! 86: if(wantLog) NSLog(@" first client for that key"); ! 87: array = [NSMutableArray array]; ! 88: [clientDict setObject:array forKey:key]; ! 89: } ! 90: ! 91: // retainCount is incremented by 1 with this operation ! 92: [array addObject:client]; ! 93: ! 94: if(wantLog) NSLog(@"---------"); ! 95: return; ! 96: } ! 97: ! 98: - (oneway)unregisterClient:(id <DEOClient>)client forKey:(NSString *)key ! 99: { ! 100: NSMutableArray *array = [clientDict objectForKey:key]; ! 101: ! 102: if(wantLog) NSLog(@"DEOServer: unregister client %x for key '%s'\n", ! 103: (unsigned int)client, ! 104: [key cString]); ! 105: ! 106: if(array) { ! 107: [array removeObjectIdenticalTo:client]; // To avoid isEqual: on the wire. ! 108: if(![array count]) { ! 109: if(wantLog) NSLog(@" last client for that key"); ! 110: [clientDict removeObjectForKey:key]; ! 111: } ! 112: } ! 113: ! 114: if(wantLog) NSLog(@"---------"); ! 115: return; ! 116: } ! 117: ! 118: - (oneway)unregisterClient:(id <DEOClient>)client ! 119: { ! 120: NSArray *keys = [clientDict allKeys]; ! 121: NSEnumerator *enumerator = [keys objectEnumerator]; ! 122: NSString *nextKey; ! 123: ! 124: if(wantLog) ! 125: NSLog(@"DEOServer: unregister client %x\n", (unsigned int)client); ! 126: ! 127: while(nextKey = [enumerator nextObject]) { ! 128: [self unregisterClient:client forKey:nextKey]; ! 129: } ! 130: if(wantLog) NSLog(@"---------"); ! 131: ! 132: return; ! 133: } ! 134: ! 135: - (BOOL)hasClient ! 136: { ! 137: return [clientDict count] ? YES : NO; ! 138: } ! 139: ! 140: @end
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.