From 040a887b9c5f22a79de3fdff3947b69d87221379 Mon Sep 17 00:00:00 2001
From: Johan Berntsson
Date: Tue, 18 Mar 2008 01:38:07 +0000
Subject: 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)
---
OpenSim/Framework/Communications/LoginService.cs | 4 ++
.../Framework/Communications/UserManagerBase.cs | 57 +++++++++++++++++++---
OpenSim/Framework/Data.MySQL/MySQLManager.cs | 52 +++++++++++++++++++-
OpenSim/Framework/Data.MySQL/MySQLUserData.cs | 13 ++++-
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
if (userProfile.currentAgent != null && userProfile.currentAgent.agentOnline)
{
+ //TODO: The following statements can cause trouble:
+ // If agentOnline could not turn from true back to false normally
+ // because of some problem, for instance, the crashment of server or client,
+ // the user cannot log in any longer.
userProfile.currentAgent = null;
m_userManager.CommitAgent(ref userProfile);
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 @@
*/
using System;
+using System.Collections;
using System.Collections.Generic;
using System.Reflection;
using System.Security.Cryptography;
@@ -337,7 +338,7 @@ namespace OpenSim.Framework.UserManagement
/// The users loginrequest
public void CreateAgent(UserProfileData profile, XmlRpcRequest request)
{
- //Hashtable requestData = (Hashtable) request.Params[0];
+ Hashtable requestData = (Hashtable) request.Params[0];
UserAgentData agent = new UserAgentData();
@@ -362,9 +363,24 @@ namespace OpenSim.Framework.UserManagement
agent.currentPos = profile.homeLocation;
// If user specified additional start, use that
-// if (requestData.ContainsKey("start"))
-// {
-// string startLoc = ((string) requestData["start"]).Trim();
+ if (requestData.ContainsKey("start"))
+ {
+ string startLoc = ((string)requestData["start"]).Trim();
+ if (("last" == startLoc) && (profile.currentAgent != null))
+ {
+ if ((profile.currentAgent.currentPos.X > 0)
+ && (profile.currentAgent.currentPos.Y > 0)
+ && (profile.currentAgent.currentPos.Z > 0)
+ )
+ {
+ // TODO: Right now, currentRegion has not been used in GridServer for requesting region.
+ // TODO: It is only using currentHandle.
+ agent.currentRegion = profile.currentAgent.currentRegion;
+ agent.currentHandle = profile.currentAgent.currentHandle;
+ agent.currentPos = profile.currentAgent.currentPos;
+ }
+ }
+
// if (!(startLoc == "last" || startLoc == "home"))
// {
// // Format: uri:Ahern&162&213&34
@@ -381,7 +397,7 @@ namespace OpenSim.Framework.UserManagement
// {
// }
// }
-// }
+ }
// What time did the user login?
agent.loginTime = Util.UnixTimeSinceEpoch();
@@ -424,7 +440,7 @@ namespace OpenSim.Framework.UserManagement
{
userAgent.agentOnline = false;
userAgent.logoutTime = Util.UnixTimeSinceEpoch();
- userAgent.sessionID = LLUUID.Zero;
+ //userAgent.sessionID = LLUUID.Zero;
if (regionid != null)
{
userAgent.currentRegion = regionid;
@@ -493,8 +509,12 @@ namespace OpenSim.Framework.UserManagement
/// Successful?
public bool CommitAgent(ref UserProfileData profile)
{
- // TODO: how is this function different from setUserProfile?
- return setUserProfile(profile);
+ // TODO: how is this function different from setUserProfile? -> Add AddUserAgent() here and commit both tables "users" and "agents"
+ // TODO: what is the logic should be?
+ bool ret = false;
+ ret = AddUserAgent(profile.currentAgent);
+ ret = ret & setUserProfile(profile);
+ return ret;
}
#endregion
@@ -558,5 +578,26 @@ namespace OpenSim.Framework.UserManagement
public abstract UserProfileData SetupMasterUser(string firstName, string lastName);
public abstract UserProfileData SetupMasterUser(string firstName, string lastName, string password);
public abstract UserProfileData SetupMasterUser(LLUUID uuid);
+
+ ///
+ /// Add agent to DB
+ ///
+ /// The agent data to be added
+ public bool AddUserAgent(UserAgentData agentdata)
+ {
+ foreach (KeyValuePair plugin in _plugins)
+ {
+ try
+ {
+ plugin.Value.AddNewUserAgent(agentdata);
+ return true;
+ }
+ catch (Exception e)
+ {
+ m_log.Info("[USERSTORAGE]: Unable to add agent via " + plugin.Key + "(" + e.ToString() + ")");
+ }
+ }
+ return false;
+ }
}
}
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
// Agent Who?
retval.agentIP = (string) reader["agentIP"];
retval.agentPort = Convert.ToUInt32(reader["agentPort"].ToString());
- retval.agentOnline = Convert.ToBoolean(reader["agentOnline"].ToString());
+ retval.agentOnline = Convert.ToBoolean(Convert.ToInt16(reader["agentOnline"].ToString()));
// Login/Logout times (UNIX Epoch)
retval.loginTime = Convert.ToInt32(reader["loginTime"].ToString());
retval.logoutTime = Convert.ToInt32(reader["logoutTime"].ToString());
// Current position
- retval.currentRegion = (string) reader["currentRegion"];
+ retval.currentRegion = new LLUUID((string)reader["currentRegion"]);
retval.currentHandle = Convert.ToUInt64(reader["currentHandle"].ToString());
LLVector3.TryParse((string) reader["currentPos"], out retval.currentPos);
}
@@ -859,5 +859,53 @@ namespace OpenSim.Framework.Data.MySQL
return returnval;
}
+
+ ///
+ /// Creates a new agent and inserts it into the database
+ ///
+ /// The agent data to be inserted
+ /// Success?
+ public bool insertAgentRow(UserAgentData agentdata)
+ {
+ string sql = String.Empty;
+ sql += "REPLACE INTO ";
+ sql += "agents (UUID, sessionID, secureSessionID, agentIP, agentPort, agentOnline, loginTime, logoutTime, currentRegion, currentHandle, currentPos) VALUES ";
+ sql += "(?UUID, ?sessionID, ?secureSessionID, ?agentIP, ?agentPort, ?agentOnline, ?loginTime, ?logoutTime, ?currentRegion, ?currentHandle, ?currentPos);";
+ Dictionary parameters = new Dictionary();
+
+ parameters["?UUID"] = agentdata.UUID.ToString();
+ parameters["?sessionID"] = agentdata.sessionID.ToString();
+ parameters["?secureSessionID"] = agentdata.secureSessionID.ToString();
+ parameters["?agentIP"] = agentdata.agentIP.ToString();
+ parameters["?agentPort"] = agentdata.agentPort.ToString();
+ parameters["?agentOnline"] = (agentdata.agentOnline == true) ? "1" : "0";
+ parameters["?loginTime"] = agentdata.loginTime.ToString();
+ parameters["?logoutTime"] = agentdata.logoutTime.ToString();
+ parameters["?currentRegion"] = agentdata.currentRegion.ToString();
+ parameters["?currentHandle"] = agentdata.currentHandle.ToString();
+ parameters["?currentPos"] = "<" + ((int)agentdata.currentPos.X).ToString() + "," + ((int)agentdata.currentPos.Y).ToString() + "," + ((int)agentdata.currentPos.Z).ToString() + ">";
+
+ bool returnval = false;
+
+ try
+ {
+ IDbCommand result = Query(sql, parameters);
+
+ //Console.WriteLine(result.CommandText);
+ int x;
+ if ((x = result.ExecuteNonQuery()) > 0)
+ {
+ returnval = true;
+ }
+ result.Dispose();
+ }
+ catch (Exception e)
+ {
+ m_log.Error(e.ToString());
+ return false;
+ }
+
+ return returnval;
+ }
}
}
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
/// The agent to create
public void AddNewUserAgent(UserAgentData agent)
{
- // Do nothing.
+ try
+ {
+ lock (database)
+ {
+ database.insertAgentRow(agent);
+ }
+ }
+ catch (Exception e)
+ {
+ database.Reconnect();
+ m_log.Error(e.ToString());
+ }
}
///
--
cgit v1.1