Gui/LoginController.m

00001 //
00002 //  LoginController.m
00003 //  MacTrek
00004 //
00005 //  Created by Aqua on 27/05/2006.
00006 //  Copyright 2006 Luky Soft. All rights reserved.
00007 //
00008 
00009 #import "LoginController.h"
00010 
00011 
00012 @implementation LoginController
00013 
00014 bool makeNewPassword = NO;
00015 bool clockRunning = NO;
00016 bool multiThreaded = NO;
00017 
00018 // get initial stuff
00019 - (id) init {
00020     self = [super init];
00021     if (self != nil) {        
00022         loginManager = [[LoginManager alloc] init];        
00023     }
00024     return self;
00025 }
00026 
00027 - (void) awakeFromNib {
00028     
00029         // set the user name
00030     [playerName setStringValue:NSUserName()];
00031     
00032         // subscribe to interesting events
00033         
00034         // first internal events
00035         // login window finished typing
00036         [[NSNotificationCenter defaultCenter] addObserver:self
00037                                                                                          selector:@selector(loginDidEndEditing:)
00038                                                                                                  name:@"NSControlTextDidEndEditingNotification"
00039                                                                                            object:playerName];
00040     // password window finished typing
00041         [[NSNotificationCenter defaultCenter] addObserver:self
00042                                                                                          selector:@selector(passwordDidEndEditing:)
00043                                                                                                  name:@"NSControlTextDidEndEditingNotification"
00044                                                                                            object:playerPassword];
00045     // verify did end typinh
00046     [[NSNotificationCenter defaultCenter] addObserver:self
00047                                                                                          selector:@selector(passwordVerifyDidEndEditing:)
00048                                                                                                  name:@"NSControlTextDidEndEditingNotification"
00049                                                                                            object:playerPasswordVerify];
00050     
00051         // then external
00052     // login manager events
00053     [notificationCenter addObserver:self selector:@selector(invalidServer:)     
00054                                                            name:@"LM_LOGIN_INVALID_SERVER" object:nil useLocks:NO useMainRunLoop:YES];
00055     [notificationCenter addObserver:self selector:@selector(getPassword:)       
00056                                                            name:@"LM_LOGIN_GET_PASSWORD" object:nil useLocks:NO useMainRunLoop:YES];
00057     [notificationCenter addObserver:self selector:@selector(loginComplete:)     
00058                                name:@"LM_LOGIN_COMPLETE" object:nil useLocks:NO useMainRunLoop:YES];
00059     [notificationCenter addObserver:self selector:@selector(makePassword:)      
00060                                name:@"LM_LOGIN_MAKE_PASSWORD" object:nil useLocks:NO useMainRunLoop:YES];
00061     [notificationCenter addObserver:self selector:@selector(badLogin:)  
00062                                name:@"LM_LOGIN_BAD_PASSWORD" object:nil useLocks:NO useMainRunLoop:YES];
00063     
00064 }
00065 
00066 - (void) setMultiThreaded:(bool)multi {
00067     multiThreaded = multi;
00068 }
00069 
00070 // events generated by menu
00071 - (void) reset {
00072     [loginManager reset];
00073     [playerPassword setStringValue:@""];
00074     [playerPasswordVerify setStringValue:@""];
00075 }
00076 
00077 - (void) enablePlayerName {
00078     [outfitButton setEnabled:NO];
00079     
00080     [loginInstruction setStringValue:@"Enter your name.  Use the name 'guest' to remain anonymous."];
00081     [playerName setEnabled:YES];
00082 }
00083 
00084 - (void) disablePlayerName {
00085     
00086     [loginInstruction setStringValue:@"Please select a server before playing."];
00087     [playerName setEnabled:NO];
00088     [outfitButton setEnabled:NO];
00089 }
00090 
00091 // handling of the events generated by the login manager
00092 - (void) invalidServer:(id)sender {
00093     [loginInstruction setStringValue:@"Sorry, this client is incompatible with Paradise servers."];
00094     // select a new server
00095     [notificationCenter postNotificationName:@"LC_INVALID_SERVER"];
00096     [playerName setEnabled:NO];
00097     [outfitButton setEnabled:NO];
00098 }
00099 
00100 - (void) getPassword:(id)sender {
00101     // name is known get the password
00102     [loginInstruction setStringValue:@"Name known, enter your password:"];
00103     [playerPassword setEnabled:YES];
00104     [playerPassword selectText:self];
00105     makeNewPassword = NO;
00106     [outfitButton setEnabled:NO];
00107 }
00108 
00109 - (void) loginComplete:(id)sender {
00110     NSLog(@"LoginController.loginComplete reached");
00111     [loginInstruction setStringValue:@"Welcome!"];
00112     [notificationCenter postNotificationName:@"LC_LOGIN_COMPLETE"];
00113     [outfitButton setEnabled:YES];
00114 }
00115 
00116 - (void) makePassword:(id)sender {
00117     // name is unknown get the password
00118     [loginInstruction setStringValue:@"Name unknown, you need to make a password:"];
00119     [playerPassword setEnabled:YES];
00120     [playerPassword selectText:self];
00121     makeNewPassword = YES;
00122     [outfitButton setEnabled:NO];
00123 }
00124 
00125 - (void) badLogin:(id)sender {
00126     [loginInstruction setStringValue:@"Bad password!"];
00127     [playerPassword setEnabled:NO];
00128     [playerName setEnabled:YES];
00129     [playerName selectText:self];
00130     [outfitButton setEnabled:NO];
00131 }
00132 
00133 // handling of input events
00134 - (void)passwordDidEndEditing:(NSNotification *)aNotification {
00135         NSLog(@"LoginController.passwordDidEndEditing %@", [aNotification name]);
00136     
00137     if (makeNewPassword) {
00138         [loginInstruction setStringValue:@"Enter it again to make sure you typed it right."];
00139         [playerPasswordVerify setEnabled:YES];
00140         [playerPasswordVerify setHidden:NO];
00141         [playerPasswordVerify selectText:self];        
00142         // wait until the verify is complete
00143     } else { // go for login
00144         [loginManager setPassword: [playerPassword stringValue]];
00145     }
00146     [playerPassword setEnabled:NO];
00147     
00148     // the login manager will send a packet for the pass, we must read the reply
00149     // unless it is done in a seperate thread
00150     if (!multiThreaded) {
00151         [notificationCenter postNotificationName:@"COMM_READ_FROM_SERVER"];
00152     }
00153 }
00154 
00155 - (void)loginDidEndEditing:(NSNotification *)aNotification {
00156         NSLog(@"LoginController.loginDidEndEditing %@", [aNotification name]);
00157     
00158     // and login
00159     [loginManager setName: [playerName stringValue]];
00160     [playerName setEnabled:NO];
00161     
00162     // the login manager will send a packet for the name, we must read the reply
00163     // unless it is done in a seperate thread
00164     if (!multiThreaded) {
00165         // read until a SP_LOGIN_OK or NOK comes
00166         while ([loginManager state] == LOGIN_GETNAME) {
00167             [notificationCenter postNotificationName:@"COMM_READ_FROM_SERVER"]; // $$ pray this does not block
00168         }
00169         // done, we moved to the next stage (new name, or known name)
00170         if ([[[playerName stringValue] uppercaseString] isEqualToString:@"GUEST"]) {
00171             // guest login, we will have moved to password request
00172             // but this is not needed accepted, needs no password
00173             if ([loginManager state] == LOGIN_GETPASS) {
00174                 [self passwordDidEndEditing:nil];
00175             }            
00176         }
00177     }
00178     
00179 
00180     
00181 }
00182 
00183 - (void)passwordVerifyDidEndEditing:(NSNotification *)aNotification {
00184         NSLog(@"LoginController.passwordVerifyDidEndEditing %@", [aNotification name]);
00185     
00186     // verify complete
00187     if ([[playerPassword stringValue] isEqualToString:[playerPasswordVerify stringValue]]) {
00188         // hide it again
00189         [playerPasswordVerify setHidden:YES];
00190         // we know the password is the same, so try to login
00191         [loginManager setPassword: [playerPassword stringValue]];
00192         
00193         // the login manager will send a packet for the pass, we must read the reply
00194         // unless it is done in a seperate thread
00195         if (!multiThreaded) {
00196             [notificationCenter postNotificationName:@"COMM_READ_FROM_SERVER"];
00197         }
00198     } else {
00199         [loginInstruction setStringValue:@"Passwords do not match! try again"];
00200         [playerPassword setEnabled:YES];
00201         [playerPassword selectText:self];
00202     }
00203 }
00204 
00205 - (void) stopClock {
00206     clockRunning = NO;    
00207 }
00208 
00209 - (void) tickTak {
00210     
00211     if (clockRunning == NO) {
00212         // clock stopped
00213         return;
00214     }
00215     
00216     // decrease 1 sec
00217     [loginClock setIntValue:[loginClock intValue] - 1];
00218     if ([loginClock intValue] <= 0) {
00219         [self stopClock];
00220         [notificationCenter postNotificationName:@"LC_LOGIN_CLOCK_EXPIRED"];        
00221     } else {
00222         // wait 1 sec for another tick
00223         [self performSelector: @selector(tickTak) withObject: self afterDelay: 1];
00224     }
00225 }
00226 
00227 - (void) startClock {
00228     if (clockRunning) {
00229         NSLog(@"LoginController.startClock clock already running");
00230         return;        
00231     }
00232     
00233     // when the clock starts we have 99 seconds
00234     clockRunning = YES;
00235     [loginClock setIntValue:100];
00236     [self tickTak];   
00237 }
00238 @end

Generated on Sat Aug 26 21:14:15 2006 for MacTrek by  doxygen 1.4.7