aboutsummaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
authorJohan Berntsson2008-03-18 01:38:07 +0000
committerJohan Berntsson2008-03-18 01:38:07 +0000
commit040a887b9c5f22a79de3fdff3947b69d87221379 (patch)
tree401793a60499cd010ed360b6fbf991d42eb87798
parent* Move missing texture request forward so that we don't actually ask the Asse... (diff)
downloadopensim-SC-040a887b9c5f22a79de3fdff3947b69d87221379.zip
opensim-SC-040a887b9c5f22a79de3fdff3947b69d87221379.tar.gz
opensim-SC-040a887b9c5f22a79de3fdff3947b69d87221379.tar.bz2
opensim-SC-040a887b9c5f22a79de3fdff3947b69d87221379.tar.xz
Last position will be stored in the DB on logout, and the avatar can continue from the same position in the next login (only with MySQL at the moment)
-rw-r--r--OpenSim/Framework/Communications/LoginService.cs4
-rw-r--r--OpenSim/Framework/Communications/UserManagerBase.cs57
-rw-r--r--OpenSim/Framework/Data.MySQL/MySQLManager.cs52
-rw-r--r--OpenSim/Framework/Data.MySQL/MySQLUserData.cs13
4 files changed, 115 insertions, 11 deletions
diff --git a/OpenSim/Framework/Communications/LoginService.cs b/OpenSim/Framework/Communications/LoginService.cs
index 3bf6096..fc02ff6 100644
--- a/OpenSim/Framework/Communications/LoginService.cs
+++ b/OpenSim/Framework/Communications/LoginService.cs
@@ -154,6 +154,10 @@ namespace OpenSim.Framework.UserManagement
154 154
155 if (userProfile.currentAgent != null && userProfile.currentAgent.agentOnline) 155 if (userProfile.currentAgent != null && userProfile.currentAgent.agentOnline)
156 { 156 {
157 //TODO: The following statements can cause trouble:
158 // If agentOnline could not turn from true back to false normally
159 // because of some problem, for instance, the crashment of server or client,
160 // the user cannot log in any longer.
157 userProfile.currentAgent = null; 161 userProfile.currentAgent = null;
158 m_userManager.CommitAgent(ref userProfile); 162 m_userManager.CommitAgent(ref userProfile);
159 163
diff --git a/OpenSim/Framework/Communications/UserManagerBase.cs b/OpenSim/Framework/Communications/UserManagerBase.cs
index 3380e90..b8e3114 100644
--- a/OpenSim/Framework/Communications/UserManagerBase.cs
+++ b/OpenSim/Framework/Communications/UserManagerBase.cs
@@ -27,6 +27,7 @@
27*/ 27*/
28 28
29using System; 29using System;
30using System.Collections;
30using System.Collections.Generic; 31using System.Collections.Generic;
31using System.Reflection; 32using System.Reflection;
32using System.Security.Cryptography; 33using System.Security.Cryptography;
@@ -337,7 +338,7 @@ namespace OpenSim.Framework.UserManagement
337 /// <param name="request">The users loginrequest</param> 338 /// <param name="request">The users loginrequest</param>
338 public void CreateAgent(UserProfileData profile, XmlRpcRequest request) 339 public void CreateAgent(UserProfileData profile, XmlRpcRequest request)
339 { 340 {
340 //Hashtable requestData = (Hashtable) request.Params[0]; 341 Hashtable requestData = (Hashtable) request.Params[0];
341 342
342 UserAgentData agent = new UserAgentData(); 343 UserAgentData agent = new UserAgentData();
343 344
@@ -362,9 +363,24 @@ namespace OpenSim.Framework.UserManagement
362 agent.currentPos = profile.homeLocation; 363 agent.currentPos = profile.homeLocation;
363 364
364 // If user specified additional start, use that 365 // If user specified additional start, use that
365// if (requestData.ContainsKey("start")) 366 if (requestData.ContainsKey("start"))
366// { 367 {
367// string startLoc = ((string) requestData["start"]).Trim(); 368 string startLoc = ((string)requestData["start"]).Trim();
369 if (("last" == startLoc) && (profile.currentAgent != null))
370 {
371 if ((profile.currentAgent.currentPos.X > 0)
372 && (profile.currentAgent.currentPos.Y > 0)
373 && (profile.currentAgent.currentPos.Z > 0)
374 )
375 {
376 // TODO: Right now, currentRegion has not been used in GridServer for requesting region.
377 // TODO: It is only using currentHandle.
378 agent.currentRegion = profile.currentAgent.currentRegion;
379 agent.currentHandle = profile.currentAgent.currentHandle;
380 agent.currentPos = profile.currentAgent.currentPos;
381 }
382 }
383
368// if (!(startLoc == "last" || startLoc == "home")) 384// if (!(startLoc == "last" || startLoc == "home"))
369// { 385// {
370// // Format: uri:Ahern&162&213&34 386// // Format: uri:Ahern&162&213&34
@@ -381,7 +397,7 @@ namespace OpenSim.Framework.UserManagement
381// { 397// {
382// } 398// }
383// } 399// }
384// } 400 }
385 401
386 // What time did the user login? 402 // What time did the user login?
387 agent.loginTime = Util.UnixTimeSinceEpoch(); 403 agent.loginTime = Util.UnixTimeSinceEpoch();
@@ -424,7 +440,7 @@ namespace OpenSim.Framework.UserManagement
424 { 440 {
425 userAgent.agentOnline = false; 441 userAgent.agentOnline = false;
426 userAgent.logoutTime = Util.UnixTimeSinceEpoch(); 442 userAgent.logoutTime = Util.UnixTimeSinceEpoch();
427 userAgent.sessionID = LLUUID.Zero; 443 //userAgent.sessionID = LLUUID.Zero;
428 if (regionid != null) 444 if (regionid != null)
429 { 445 {
430 userAgent.currentRegion = regionid; 446 userAgent.currentRegion = regionid;
@@ -493,8 +509,12 @@ namespace OpenSim.Framework.UserManagement
493 /// <returns>Successful?</returns> 509 /// <returns>Successful?</returns>
494 public bool CommitAgent(ref UserProfileData profile) 510 public bool CommitAgent(ref UserProfileData profile)
495 { 511 {
496 // TODO: how is this function different from setUserProfile? 512 // TODO: how is this function different from setUserProfile? -> Add AddUserAgent() here and commit both tables "users" and "agents"
497 return setUserProfile(profile); 513 // TODO: what is the logic should be?
514 bool ret = false;
515 ret = AddUserAgent(profile.currentAgent);
516 ret = ret & setUserProfile(profile);
517 return ret;
498 } 518 }
499 519
500 #endregion 520 #endregion
@@ -558,5 +578,26 @@ namespace OpenSim.Framework.UserManagement
558 public abstract UserProfileData SetupMasterUser(string firstName, string lastName); 578 public abstract UserProfileData SetupMasterUser(string firstName, string lastName);
559 public abstract UserProfileData SetupMasterUser(string firstName, string lastName, string password); 579 public abstract UserProfileData SetupMasterUser(string firstName, string lastName, string password);
560 public abstract UserProfileData SetupMasterUser(LLUUID uuid); 580 public abstract UserProfileData SetupMasterUser(LLUUID uuid);
581
582 /// <summary>
583 /// Add agent to DB
584 /// </summary>
585 /// <param name="agentdata">The agent data to be added</param>
586 public bool AddUserAgent(UserAgentData agentdata)
587 {
588 foreach (KeyValuePair<string, IUserData> plugin in _plugins)
589 {
590 try
591 {
592 plugin.Value.AddNewUserAgent(agentdata);
593 return true;
594 }
595 catch (Exception e)
596 {
597 m_log.Info("[USERSTORAGE]: Unable to add agent via " + plugin.Key + "(" + e.ToString() + ")");
598 }
599 }
600 return false;
601 }
561 } 602 }
562} 603}
diff --git a/OpenSim/Framework/Data.MySQL/MySQLManager.cs b/OpenSim/Framework/Data.MySQL/MySQLManager.cs
index 0410643..46fd1bc 100644
--- a/OpenSim/Framework/Data.MySQL/MySQLManager.cs
+++ b/OpenSim/Framework/Data.MySQL/MySQLManager.cs
@@ -397,14 +397,14 @@ namespace OpenSim.Framework.Data.MySQL
397 // Agent Who? 397 // Agent Who?
398 retval.agentIP = (string) reader["agentIP"]; 398 retval.agentIP = (string) reader["agentIP"];
399 retval.agentPort = Convert.ToUInt32(reader["agentPort"].ToString()); 399 retval.agentPort = Convert.ToUInt32(reader["agentPort"].ToString());
400 retval.agentOnline = Convert.ToBoolean(reader["agentOnline"].ToString()); 400 retval.agentOnline = Convert.ToBoolean(Convert.ToInt16(reader["agentOnline"].ToString()));
401 401
402 // Login/Logout times (UNIX Epoch) 402 // Login/Logout times (UNIX Epoch)
403 retval.loginTime = Convert.ToInt32(reader["loginTime"].ToString()); 403 retval.loginTime = Convert.ToInt32(reader["loginTime"].ToString());
404 retval.logoutTime = Convert.ToInt32(reader["logoutTime"].ToString()); 404 retval.logoutTime = Convert.ToInt32(reader["logoutTime"].ToString());
405 405
406 // Current position 406 // Current position
407 retval.currentRegion = (string) reader["currentRegion"]; 407 retval.currentRegion = new LLUUID((string)reader["currentRegion"]);
408 retval.currentHandle = Convert.ToUInt64(reader["currentHandle"].ToString()); 408 retval.currentHandle = Convert.ToUInt64(reader["currentHandle"].ToString());
409 LLVector3.TryParse((string) reader["currentPos"], out retval.currentPos); 409 LLVector3.TryParse((string) reader["currentPos"], out retval.currentPos);
410 } 410 }
@@ -859,5 +859,53 @@ namespace OpenSim.Framework.Data.MySQL
859 859
860 return returnval; 860 return returnval;
861 } 861 }
862
863 /// <summary>
864 /// Creates a new agent and inserts it into the database
865 /// </summary>
866 /// <param name="agentdata">The agent data to be inserted</param>
867 /// <returns>Success?</returns>
868 public bool insertAgentRow(UserAgentData agentdata)
869 {
870 string sql = String.Empty;
871 sql += "REPLACE INTO ";
872 sql += "agents (UUID, sessionID, secureSessionID, agentIP, agentPort, agentOnline, loginTime, logoutTime, currentRegion, currentHandle, currentPos) VALUES ";
873 sql += "(?UUID, ?sessionID, ?secureSessionID, ?agentIP, ?agentPort, ?agentOnline, ?loginTime, ?logoutTime, ?currentRegion, ?currentHandle, ?currentPos);";
874 Dictionary<string, string> parameters = new Dictionary<string, string>();
875
876 parameters["?UUID"] = agentdata.UUID.ToString();
877 parameters["?sessionID"] = agentdata.sessionID.ToString();
878 parameters["?secureSessionID"] = agentdata.secureSessionID.ToString();
879 parameters["?agentIP"] = agentdata.agentIP.ToString();
880 parameters["?agentPort"] = agentdata.agentPort.ToString();
881 parameters["?agentOnline"] = (agentdata.agentOnline == true) ? "1" : "0";
882 parameters["?loginTime"] = agentdata.loginTime.ToString();
883 parameters["?logoutTime"] = agentdata.logoutTime.ToString();
884 parameters["?currentRegion"] = agentdata.currentRegion.ToString();
885 parameters["?currentHandle"] = agentdata.currentHandle.ToString();
886 parameters["?currentPos"] = "<" + ((int)agentdata.currentPos.X).ToString() + "," + ((int)agentdata.currentPos.Y).ToString() + "," + ((int)agentdata.currentPos.Z).ToString() + ">";
887
888 bool returnval = false;
889
890 try
891 {
892 IDbCommand result = Query(sql, parameters);
893
894 //Console.WriteLine(result.CommandText);
895 int x;
896 if ((x = result.ExecuteNonQuery()) > 0)
897 {
898 returnval = true;
899 }
900 result.Dispose();
901 }
902 catch (Exception e)
903 {
904 m_log.Error(e.ToString());
905 return false;
906 }
907
908 return returnval;
909 }
862 } 910 }
863} 911}
diff --git a/OpenSim/Framework/Data.MySQL/MySQLUserData.cs b/OpenSim/Framework/Data.MySQL/MySQLUserData.cs
index 2bba6ce..4c76461 100644
--- a/OpenSim/Framework/Data.MySQL/MySQLUserData.cs
+++ b/OpenSim/Framework/Data.MySQL/MySQLUserData.cs
@@ -585,7 +585,18 @@ namespace OpenSim.Framework.Data.MySQL
585 /// <param name="agent">The agent to create</param> 585 /// <param name="agent">The agent to create</param>
586 public void AddNewUserAgent(UserAgentData agent) 586 public void AddNewUserAgent(UserAgentData agent)
587 { 587 {
588 // Do nothing. 588 try
589 {
590 lock (database)
591 {
592 database.insertAgentRow(agent);
593 }
594 }
595 catch (Exception e)
596 {
597 database.Reconnect();
598 m_log.Error(e.ToString());
599 }
589 } 600 }
590 601
591 /// <summary> 602 /// <summary>