/** GSWServerSessionStore.m - GSWeb: Class GSWServerSessionStore Copyright (C) 1999-2002 Free Software Foundation, Inc. Written by: Manuel Guesdon Date: Mar 1999 $Revision$ $Date$ This file is part of the GNUstep Web Library. This library is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this library; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. **/ static char rcsId[] = "$Id$"; #include //==================================================================== @implementation GSWServerSessionStore -(id)init { //OK LOGObjectFnStart(); if ((self=[super init])) { _timeOutManager=[GSWSessionTimeOutManager new]; _sessions=[NSMutableDictionary new]; [_timeOutManager setCallBack:@selector(removeSessionWithID:) target:self]; [_timeOutManager startHandleTimerRefusingSessions]; }; LOGObjectFnStop(); return self; }; //-------------------------------------------------------------------- -(void)dealloc { DESTROY(_sessions); DESTROY(_timeOutManager); [super dealloc]; }; //-------------------------------------------------------------------- -(id)description { return [NSString stringWithFormat:@"<%s: %p sessions=%@ manager=%@>", object_get_class_name(self), (void*)self, _sessions, _timeOutManager]; }; //-------------------------------------------------------------------- -(void)saveSessionForContext:(GSWContext*)aContext { //OK GSWSession* session=nil; NSString* sessionID=nil; NSTimeInterval sessionTimeOut=0; BOOL sessionIsTerminating=NO; LOGObjectFnStart(); session=[aContext existingSession]; NSAssert(session,@"No session!"); NSDebugMLLog(@"sessions",@"session=%@",session); sessionIsTerminating=[session isTerminating]; //TODO [session setDistributionEnabled:NO]; sessionID=[session sessionID]; NSAssert(sessionID,@"No _sessionID!"); NSDebugMLLog(@"sessions",@"_sessionID=%@",sessionID); sessionTimeOut=[session timeOut]; [_sessions setObject:session forKey:sessionID]; NSDebugMLLog(@"sessions",@"session=%@",session); NSDebugMLLog(@"sessions",@"sessionTimeOut=%ld",(long)sessionTimeOut); [_timeOutManager updateTimeOutForSessionWithID:sessionID timeOut:sessionTimeOut]; LOGObjectFnStop(); }; //-------------------------------------------------------------------- -(id)restoreSessionWithID:(NSString*)aSessionID request:(GSWRequest*)aRequest { GSWSession* session=nil; //OK LOGObjectFnStart(); NSDebugMLLog(@"sessions",@"aSessionID=%@",aSessionID); NSDebugMLLog(@"sessions",@"sessions=%@",_sessions); session=[_sessions objectForKey:aSessionID]; NSDebugMLLog(@"sessions",@"session=%@",session); LOGObjectFnStop(); return session; }; //-------------------------------------------------------------------- -(GSWSession*)removeSessionWithID:(NSString*)aSessionID { //OK GSWSession* session=nil; BOOL isSessionIDCheckedOut=NO; LOGObjectFnStart(); isSessionIDCheckedOut=[self _isSessionIDCheckedOut:aSessionID]; if (isSessionIDCheckedOut) { return nil;//Used Session } else { session=[_sessions objectForKey:aSessionID]; NSDebugMLLog(@"sessions",@"session=%@",session); [session retain]; //to avoid discarding it now [session autorelease]; //discard it 'later' [_sessions removeObjectForKey:aSessionID]; }; LOGObjectFnStop(); return session; }; @end //==================================================================== @implementation GSWServerSessionStore (GSWServerSessionStoreInfo) -(BOOL)containsSessionID:(NSString*)aSessionID { BOOL contain = NO; //OK LOGObjectFnStart(); if([_sessions objectForKey:aSessionID]) contain = YES; LOGObjectFnStop(); return contain; }; -(NSArray *)allSessionIDs { return [_sessions allKeys]; } @end