Sessions
Here's an example on how to implement sessions into your application.
Sessions are usefull to keep a record of variables per user/session. Sessions are often used in web pages to keep track of temporary user settings when they visit your site.
Sessions class
This class manages all sessions
class Sessions extends Object; var array<Session> sessions; // create a new session function Session createSession() { sessions.length = sessions.length+1; sessions[sessions.length-1] = new(None) class'Session'; sessions[sessions.length-1].Hash = createSessionHash(); return sessions[sessions.length-1]; } // get a session by it's hash function Session getSession(string hash, optional bool bCreateNew) { local int i; for (i = 0; i < sessions.length; i++) { if (sessions[i].Hash == hash) return sessions[i]; } if (bCreateNew) return createSession(); return none; } // destroy an existing session function bool destroySession(Session session) { local int i; for (i = 0; i < sessions.length; i++) { if (sessions[i].Hash == session.Hash) { sessions.Remove(i, 1); return true; } } return false; } // create a unique session hash function private string createSessionHash() { local int i; local string temphash; do { temphash = Right("00000"$string(Rand(65536)), 5)$Right("00000"$string(Rand(65536)), 5); for (i = 0; i < sessions.length; i++) { if (sessions[i].hash == temphash) break; } } until (i == sessions.length); return temphash; }
Session class
This class will contain the data for a single session.
class Session extends Object; struct export KeyValuePair { var string Key; var string Value; }; // contains the unique identifier var string hash; // contains the data for this session var array<KeyValuePair> Data; // get the value of a var name, return sdefault if not found // bFound is 1 when the value exists, 0 otherwise function string getValue(string name, optional string sdefault, optional out int bFound) { local int i; bFound = true; for (i = 0; i<data.length; i++) { if (data[i].key == name) return data[i].value; } bFound = false; return sdefault; } // Set the value of a var name, if bAddIfNotExists it will be added when it doesn't exist // oldValue will have the previous value function bool setValue(string name, string value, bool bAddIfNotExists, optional out string oldValue) { local int i; for (i = 0; i<data.length; i++) { if (data[i].key == name) { oldValue = data[i].value; data[i].value = value; return true; } } if (bAddIfNotExists) { data.length = data.length+1; data[data.length-1].Key = name; data[data.length-1].Value = value; return true; } return false; } // Remove a value from the session function bool removeValue(string name, optional out string oldValue) { local int i; for (i = 0; i<data.length; i++) { if (data[i].key == name) { oldValue = data[i].value; data.remove(i, 1); return true; } } return false; }
Example usage
Let's say you have made a custom QueryHandler and you need to keep track of some changes before submitting them.
class MyQueryHandler extends xWebQueryHandler; var Sessions sessions; function bool Init() { Super.Init(); sessions = new(None) class'Sessions'; return true; } function bool Query(WebRequest Request, WebResponse Response) { local session CurSession; local int tempvalue; CurSession = sessions.getSession(Request.GetVariable("sessionID"), true); Response.Subst("sessionID", CurSession.hash); // replace %sessionID% with the session hash tempvalue = int(CurSession.getValue("pageVisits", 0)); tempValue++; tempvalue = CurSession.setValue("pageVisits", string(tempvalue), true); Response.Subst("pageVisits", string(tempvalue)); // process the query }
Now you will only have to pass the sessionID to remember the variables
Example HTML file:
<html> <body> You have visited this page %pageVisits% time(s) <p> <a href="?sessionID=%sessionID%">include the session ID in a link like this</a> <p> or this to include it in a form <form> <input type="hidden" name="sessionID" value="%sessionID%"> <input type="submit"> </form> </body> </html>