// // AsyncAskPassServer.m // Bienvenue // // Created by Hamish Allan on 04/06/2008. // Copyright 2008 Hamish Allan. All rights reserved. // #import "AsyncAskPassServer.h" #import "AsyncAskPassClient.h" #import @implementation AsyncAskPassServer + (NSString *)randomToken { uuid_t randomUUID; uuid_generate_random(randomUUID); char randomUUIDChars[37]; uuid_unparse(randomUUID, randomUUIDChars); return [NSString stringWithCString:randomUUIDChars]; } - (id)init { self = [super init]; if (self) { NSConnection *connection = [NSConnection defaultConnection]; [connection setRootObject:self]; if ([connection registerName:AsyncAskPassServerName] == NO) [NSException raise:NSPortReceiveException format:@"Cannot vend %@", AsyncAskPassServerName]; myTokens = [[NSMutableDictionary alloc] init]; } return self; } - (void)dealloc { [myTokens release]; [super dealloc]; } - (NSString *)tokenForProxy:(id)proxy { NSString *token = [[self class] randomToken]; [myTokens setObject:proxy forKey:token]; return token; } #define DISTRIBUTED_OBJECTS_TEST_CODEPATH 0 #ifdef DISTRIBUTED_OBJECTS_TEST_CODEPATH - (void)indirectCallbackWithClientAndStringArray:(NSArray *)clientAndStringArray { [[clientAndStringArray objectAtIndex:0] setAnswerText:[clientAndStringArray objectAtIndex:1]]; [clientAndStringArray release]; } #endif - (BOOL)askQuestion:(NSString *)question fromClient:(AsyncAskPassClient *)client { NSString *clientToken = [client token]; id proxy = [myTokens objectForKey:clientToken]; if (proxy) { [proxy setQuestionText:question withAnswerTarget:client]; #ifdef DISTRIBUTED_OBJECTS_TEST_CODEPATH switch (DISTRIBUTED_OBJECTS_TEST_CODEPATH) { case 1: [client setAnswerText:@"immediate callback"]; break; case 2: [client performSelector:@selector(setAnswerText:) withObject:@"zero delay callback" afterDelay:0.0]; break; case 3: [client performSelector:@selector(setAnswerText:) withObject:@"1s delay callback" afterDelay:1.0]; break; case 4: [self indirectCallbackWithClientAndStringArray: [[NSArray arrayWithObjects:client, @"immediate indirect callback", nil] retain]]; break; case 5: [self performSelector:@selector(indirectCallbackWithClientAndStringArray:) withObject: [[NSArray arrayWithObjects:client, @"zero delay indirect callback", nil] retain] afterDelay:0.0]; break; case 6: [self performSelector:@selector(indirectCallbackWithClientAndStringArray:) withObject: [[NSArray arrayWithObjects:client, @"1s delay indirect callback", nil] retain] afterDelay:1.0]; break; default: break; } #endif return YES; } else { [client setAnswerText:nil]; return NO; } } @end