diff options
-rw-r--r-- | OpenSim/Data/MySQL/MySQLPresenceData.cs | 4 | ||||
-rw-r--r-- | OpenSim/Data/Null/NullPresenceData.cs | 51 | ||||
-rw-r--r-- | OpenSim/Services/LLLoginService/LLLoginService.cs | 31 |
3 files changed, 72 insertions, 14 deletions
diff --git a/OpenSim/Data/MySQL/MySQLPresenceData.cs b/OpenSim/Data/MySQL/MySQLPresenceData.cs index fcbe3d6..68a68af 100644 --- a/OpenSim/Data/MySQL/MySQLPresenceData.cs +++ b/OpenSim/Data/MySQL/MySQLPresenceData.cs | |||
@@ -122,7 +122,7 @@ namespace OpenSim.Data.MySQL | |||
122 | cmd.CommandText = String.Format("select * from {0} where UserID=?UserID", m_Realm); | 122 | cmd.CommandText = String.Format("select * from {0} where UserID=?UserID", m_Realm); |
123 | 123 | ||
124 | cmd.Parameters.AddWithValue("?UserID", userID); | 124 | cmd.Parameters.AddWithValue("?UserID", userID); |
125 | ; | 125 | |
126 | using (MySqlConnection dbcon = new MySqlConnection(m_connectionString)) | 126 | using (MySqlConnection dbcon = new MySqlConnection(m_connectionString)) |
127 | { | 127 | { |
128 | dbcon.Open(); | 128 | dbcon.Open(); |
@@ -131,7 +131,6 @@ namespace OpenSim.Data.MySQL | |||
131 | 131 | ||
132 | using (IDataReader reader = cmd.ExecuteReader()) | 132 | using (IDataReader reader = cmd.ExecuteReader()) |
133 | { | 133 | { |
134 | |||
135 | List<UUID> deleteSessions = new List<UUID>(); | 134 | List<UUID> deleteSessions = new List<UUID>(); |
136 | int online = 0; | 135 | int online = 0; |
137 | 136 | ||
@@ -143,6 +142,7 @@ namespace OpenSim.Data.MySQL | |||
143 | deleteSessions.Add(new UUID(reader["SessionID"].ToString())); | 142 | deleteSessions.Add(new UUID(reader["SessionID"].ToString())); |
144 | } | 143 | } |
145 | 144 | ||
145 | // Leave one session behind so that we can pick up details such as home location | ||
146 | if (online == 0 && deleteSessions.Count > 0) | 146 | if (online == 0 && deleteSessions.Count > 0) |
147 | deleteSessions.RemoveAt(0); | 147 | deleteSessions.RemoveAt(0); |
148 | 148 | ||
diff --git a/OpenSim/Data/Null/NullPresenceData.cs b/OpenSim/Data/Null/NullPresenceData.cs index 5f78691..555c92f 100644 --- a/OpenSim/Data/Null/NullPresenceData.cs +++ b/OpenSim/Data/Null/NullPresenceData.cs | |||
@@ -28,6 +28,8 @@ | |||
28 | using System; | 28 | using System; |
29 | using System.Collections; | 29 | using System.Collections; |
30 | using System.Collections.Generic; | 30 | using System.Collections.Generic; |
31 | using System.Reflection; | ||
32 | using log4net; | ||
31 | using OpenMetaverse; | 33 | using OpenMetaverse; |
32 | using OpenSim.Framework; | 34 | using OpenSim.Framework; |
33 | using OpenSim.Data; | 35 | using OpenSim.Data; |
@@ -36,6 +38,8 @@ namespace OpenSim.Data.Null | |||
36 | { | 38 | { |
37 | public class NullPresenceData : IPresenceData | 39 | public class NullPresenceData : IPresenceData |
38 | { | 40 | { |
41 | // private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); | ||
42 | |||
39 | private static NullPresenceData Instance; | 43 | private static NullPresenceData Instance; |
40 | 44 | ||
41 | Dictionary<UUID, PresenceData> m_presenceData = new Dictionary<UUID, PresenceData>(); | 45 | Dictionary<UUID, PresenceData> m_presenceData = new Dictionary<UUID, PresenceData>(); |
@@ -48,20 +52,25 @@ namespace OpenSim.Data.Null | |||
48 | 52 | ||
49 | //Console.WriteLine("[XXX] NullRegionData constructor"); | 53 | //Console.WriteLine("[XXX] NullRegionData constructor"); |
50 | // Let's stick in a test presence | 54 | // Let's stick in a test presence |
55 | /* | ||
51 | PresenceData p = new PresenceData(); | 56 | PresenceData p = new PresenceData(); |
52 | p.SessionID = UUID.Zero; | 57 | p.SessionID = UUID.Zero; |
53 | p.UserID = UUID.Zero.ToString(); | 58 | p.UserID = UUID.Zero.ToString(); |
54 | p.Data = new Dictionary<string, string>(); | 59 | p.Data = new Dictionary<string, string>(); |
55 | p.Data["Online"] = true.ToString(); | 60 | p.Data["Online"] = true.ToString(); |
56 | m_presenceData.Add(UUID.Zero, p); | 61 | m_presenceData.Add(UUID.Zero, p); |
62 | */ | ||
57 | } | 63 | } |
58 | } | 64 | } |
59 | 65 | ||
60 | public bool Store(PresenceData data) | 66 | public bool Store(PresenceData data) |
61 | { | 67 | { |
62 | if (Instance != this) | 68 | if (Instance != this) |
63 | return Instance.Store(data); | 69 | return Instance.Store(data); |
64 | 70 | ||
71 | // m_log.DebugFormat("[NULL PRESENCE DATA]: Storing presence {0}", data.UserID); | ||
72 | // Console.WriteLine("HOME for " + data.UserID + " is " + (data.Data.ContainsKey("HomeRegionID") ? data.Data["HomeRegionID"] : "Not found")); | ||
73 | |||
65 | m_presenceData[data.SessionID] = data; | 74 | m_presenceData[data.SessionID] = data; |
66 | return true; | 75 | return true; |
67 | } | 76 | } |
@@ -100,6 +109,7 @@ namespace OpenSim.Data.Null | |||
100 | { | 109 | { |
101 | if (Instance != this) | 110 | if (Instance != this) |
102 | return Instance.ReportAgent(sessionID, regionID, position, lookAt); | 111 | return Instance.ReportAgent(sessionID, regionID, position, lookAt); |
112 | |||
103 | if (m_presenceData.ContainsKey(sessionID)) | 113 | if (m_presenceData.ContainsKey(sessionID)) |
104 | { | 114 | { |
105 | m_presenceData[sessionID].RegionID = regionID; | 115 | m_presenceData[sessionID].RegionID = regionID; |
@@ -112,7 +122,7 @@ namespace OpenSim.Data.Null | |||
112 | } | 122 | } |
113 | 123 | ||
114 | public bool SetHomeLocation(string userID, UUID regionID, Vector3 position, Vector3 lookAt) | 124 | public bool SetHomeLocation(string userID, UUID regionID, Vector3 position, Vector3 lookAt) |
115 | { | 125 | { |
116 | if (Instance != this) | 126 | if (Instance != this) |
117 | return Instance.SetHomeLocation(userID, regionID, position, lookAt); | 127 | return Instance.SetHomeLocation(userID, regionID, position, lookAt); |
118 | 128 | ||
@@ -121,27 +131,40 @@ namespace OpenSim.Data.Null | |||
121 | { | 131 | { |
122 | if (p.UserID == userID) | 132 | if (p.UserID == userID) |
123 | { | 133 | { |
134 | // m_log.DebugFormat( | ||
135 | // "[NULL PRESENCE DATA]: Setting home location {0} {1} {2} for {3}", | ||
136 | // regionID, position, lookAt, p.UserID); | ||
137 | |||
124 | p.Data["HomeRegionID"] = regionID.ToString(); | 138 | p.Data["HomeRegionID"] = regionID.ToString(); |
125 | p.Data["HomePosition"] = position.ToString(); | 139 | p.Data["HomePosition"] = position.ToString(); |
126 | p.Data["HomeLookAt"] = lookAt.ToString(); | 140 | p.Data["HomeLookAt"] = lookAt.ToString(); |
127 | foundone = true; | 141 | foundone = true; |
128 | } | 142 | } |
129 | } | 143 | } |
130 | 144 | ||
131 | return foundone; | 145 | return foundone; |
132 | } | 146 | } |
133 | 147 | ||
134 | public PresenceData[] Get(string field, string data) | 148 | public PresenceData[] Get(string field, string data) |
135 | { | 149 | { |
136 | if (Instance != this) | 150 | if (Instance != this) |
137 | return Instance.Get(field, data); | 151 | return Instance.Get(field, data); |
138 | 152 | ||
153 | // m_log.DebugFormat( | ||
154 | // "[NULL PRESENCE DATA]: Getting presence data for field {0} with parameter {1}", field, data); | ||
155 | |||
139 | List<PresenceData> presences = new List<PresenceData>(); | 156 | List<PresenceData> presences = new List<PresenceData>(); |
140 | if (field == "UserID") | 157 | if (field == "UserID") |
141 | { | 158 | { |
142 | foreach (PresenceData p in m_presenceData.Values) | 159 | foreach (PresenceData p in m_presenceData.Values) |
143 | if (p.UserID == data) | 160 | { |
144 | presences.Add(p); | 161 | if (p.UserID == data) |
162 | { | ||
163 | presences.Add(p); | ||
164 | // Console.WriteLine("HOME for " + p.UserID + " is " + (p.Data.ContainsKey("HomeRegionID") ? p.Data["HomeRegionID"] : "Not found")); | ||
165 | } | ||
166 | } | ||
167 | |||
145 | return presences.ToArray(); | 168 | return presences.ToArray(); |
146 | } | 169 | } |
147 | else if (field == "SessionID") | 170 | else if (field == "SessionID") |
@@ -180,36 +203,46 @@ namespace OpenSim.Data.Null | |||
180 | } | 203 | } |
181 | 204 | ||
182 | public void Prune(string userID) | 205 | public void Prune(string userID) |
183 | { | 206 | { |
184 | if (Instance != this) | 207 | if (Instance != this) |
185 | { | 208 | { |
186 | Instance.Prune(userID); | 209 | Instance.Prune(userID); |
187 | return; | 210 | return; |
188 | } | 211 | } |
189 | 212 | ||
213 | // m_log.DebugFormat("[NULL PRESENCE DATA]: Prune called for {0}", userID); | ||
214 | |||
190 | List<UUID> deleteSessions = new List<UUID>(); | 215 | List<UUID> deleteSessions = new List<UUID>(); |
191 | int online = 0; | 216 | int online = 0; |
192 | 217 | ||
193 | foreach (KeyValuePair<UUID, PresenceData> kvp in m_presenceData) | 218 | foreach (KeyValuePair<UUID, PresenceData> kvp in m_presenceData) |
194 | { | 219 | { |
220 | m_log.DebugFormat("Online: {0}", kvp.Value.Data["Online"]); | ||
221 | |||
195 | bool on = false; | 222 | bool on = false; |
196 | if (bool.TryParse(kvp.Value.Data["Online"], out on) && on) | 223 | if (bool.TryParse(kvp.Value.Data["Online"], out on) && on) |
197 | online++; | 224 | online++; |
198 | else | 225 | else |
199 | deleteSessions.Add(kvp.Key); | 226 | deleteSessions.Add(kvp.Key); |
200 | } | 227 | } |
228 | |||
229 | // m_log.DebugFormat("[NULL PRESENCE DATA]: online [{0}], deleteSession.Count [{1}]", online, deleteSessions.Count); | ||
230 | |||
231 | // Leave one session behind so that we can pick up details such as home location | ||
201 | if (online == 0 && deleteSessions.Count > 0) | 232 | if (online == 0 && deleteSessions.Count > 0) |
202 | deleteSessions.RemoveAt(0); | 233 | deleteSessions.RemoveAt(0); |
203 | 234 | ||
204 | foreach (UUID s in deleteSessions) | 235 | foreach (UUID s in deleteSessions) |
205 | m_presenceData.Remove(s); | 236 | m_presenceData.Remove(s); |
206 | |||
207 | } | 237 | } |
208 | 238 | ||
209 | public bool Delete(string field, string data) | 239 | public bool Delete(string field, string data) |
210 | { | 240 | { |
241 | // m_log.DebugFormat( | ||
242 | // "[NULL PRESENCE DATA]: Deleting presence data for field {0} with parameter {1}", field, data); | ||
243 | |||
211 | if (Instance != this) | 244 | if (Instance != this) |
212 | return Delete(field, data); | 245 | return Instance.Delete(field, data); |
213 | 246 | ||
214 | List<UUID> presences = new List<UUID>(); | 247 | List<UUID> presences = new List<UUID>(); |
215 | if (field == "UserID") | 248 | if (field == "UserID") |
diff --git a/OpenSim/Services/LLLoginService/LLLoginService.cs b/OpenSim/Services/LLLoginService/LLLoginService.cs index ee93f73..ae729f8 100644 --- a/OpenSim/Services/LLLoginService/LLLoginService.cs +++ b/OpenSim/Services/LLLoginService/LLLoginService.cs | |||
@@ -279,7 +279,31 @@ namespace OpenSim.Services.LLLoginService | |||
279 | 279 | ||
280 | GridRegion region = null; | 280 | GridRegion region = null; |
281 | 281 | ||
282 | if (pinfo.HomeRegionID.Equals(UUID.Zero) || (region = m_GridService.GetRegionByUUID(account.ScopeID, pinfo.HomeRegionID)) == null) | 282 | bool tryDefaults = false; |
283 | |||
284 | if (pinfo.HomeRegionID.Equals(UUID.Zero)) | ||
285 | { | ||
286 | m_log.WarnFormat( | ||
287 | "[LLOGIN SERVICE]: User {0} {1} tried to login to a 'home' start location but they have none set", | ||
288 | account.FirstName, account.LastName); | ||
289 | |||
290 | tryDefaults = true; | ||
291 | } | ||
292 | else | ||
293 | { | ||
294 | region = m_GridService.GetRegionByUUID(account.ScopeID, pinfo.HomeRegionID); | ||
295 | |||
296 | if (null == region) | ||
297 | { | ||
298 | m_log.WarnFormat( | ||
299 | "[LLOGIN SERVICE]: User {0} {1} has a recorded home region of {2} but this cannot be found by the grid service", | ||
300 | account.FirstName, account.LastName, pinfo.HomeRegionID); | ||
301 | |||
302 | tryDefaults = true; | ||
303 | } | ||
304 | } | ||
305 | |||
306 | if (tryDefaults) | ||
283 | { | 307 | { |
284 | List<GridRegion> defaults = m_GridService.GetDefaultRegions(account.ScopeID); | 308 | List<GridRegion> defaults = m_GridService.GetDefaultRegions(account.ScopeID); |
285 | if (defaults != null && defaults.Count > 0) | 309 | if (defaults != null && defaults.Count > 0) |
@@ -288,7 +312,8 @@ namespace OpenSim.Services.LLLoginService | |||
288 | where = "safe"; | 312 | where = "safe"; |
289 | } | 313 | } |
290 | else | 314 | else |
291 | m_log.WarnFormat("[LLOGIN SERVICE]: User {0} {1} does not have a home set and this grid does not have default locations.", | 315 | m_log.WarnFormat( |
316 | "[LLOGIN SERVICE]: User {0} {1} does not have a valid home and this grid does not have default locations.", | ||
292 | account.FirstName, account.LastName); | 317 | account.FirstName, account.LastName); |
293 | } | 318 | } |
294 | 319 | ||
@@ -318,8 +343,8 @@ namespace OpenSim.Services.LLLoginService | |||
318 | position = pinfo.Position; | 343 | position = pinfo.Position; |
319 | lookAt = pinfo.LookAt; | 344 | lookAt = pinfo.LookAt; |
320 | } | 345 | } |
346 | |||
321 | return region; | 347 | return region; |
322 | |||
323 | } | 348 | } |
324 | else | 349 | else |
325 | { | 350 | { |