aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Grid/UserServer
diff options
context:
space:
mode:
authorJustin Clarke Casey2008-09-12 20:12:03 +0000
committerJustin Clarke Casey2008-09-12 20:12:03 +0000
commit52a4c4d82f9c5b808e6c61fd51c1c70e42865565 (patch)
treef63a4ea443597b2d79ad6c2b7acff058c4437425 /OpenSim/Grid/UserServer
parentremove hidden faces inside prim meshes to improve memory use and startup time (diff)
downloadopensim-SC_OLD-52a4c4d82f9c5b808e6c61fd51c1c70e42865565.zip
opensim-SC_OLD-52a4c4d82f9c5b808e6c61fd51c1c70e42865565.tar.gz
opensim-SC_OLD-52a4c4d82f9c5b808e6c61fd51c1c70e42865565.tar.bz2
opensim-SC_OLD-52a4c4d82f9c5b808e6c61fd51c1c70e42865565.tar.xz
* Check in first part of http://opensimulator.org/mantis/view.php?id=2073
* This patch aims to introduce look at direction persistence between logins. It won't be active until the second part of the patch is committed in about two weeks time. At this point, region servers that haven't upgraded past this revision may run into problems * This checkin upgrades the user database. As always, we recommend you have backups in case something goes wrong. * Many thanks to tyre for this patch.
Diffstat (limited to 'OpenSim/Grid/UserServer')
-rw-r--r--OpenSim/Grid/UserServer/UserLoginService.cs239
1 files changed, 106 insertions, 133 deletions
diff --git a/OpenSim/Grid/UserServer/UserLoginService.cs b/OpenSim/Grid/UserServer/UserLoginService.cs
index 07b29bd..8ab9af1 100644
--- a/OpenSim/Grid/UserServer/UserLoginService.cs
+++ b/OpenSim/Grid/UserServer/UserLoginService.cs
@@ -29,6 +29,7 @@ using System;
29using System.Collections; 29using System.Collections;
30using System.Collections.Generic; 30using System.Collections.Generic;
31using System.Reflection; 31using System.Reflection;
32using System.Text.RegularExpressions;
32using OpenMetaverse; 33using OpenMetaverse;
33using log4net; 34using log4net;
34using Nwc.XmlRpc; 35using Nwc.XmlRpc;
@@ -127,94 +128,25 @@ namespace OpenSim.Grid.UserServer
127 /// </summary> 128 /// </summary>
128 /// <param name="response">The existing response</param> 129 /// <param name="response">The existing response</param>
129 /// <param name="theUser">The user profile</param> 130 /// <param name="theUser">The user profile</param>
130 /// <param name="startLocationRequest">Destination of the user</param> 131 /// <param name="startLocationRequest">The requested start location</param>
131 public override bool CustomiseResponse(LoginResponse response, UserProfileData theUser, 132 public override bool CustomiseResponse(LoginResponse response, UserProfileData theUser, string startLocationRequest)
132 string startLocationRequest)
133 { 133 {
134 RegionProfileData SimInfo; 134 // HomeLocation
135 RegionProfileData HomeInfo; 135 RegionProfileData homeInfo = null;
136 int start_x = -1;
137 int start_y = -1;
138 int start_z = -1;
139
140 // use the homeRegionID if it is stored already. If not, use the regionHandle as before 136 // use the homeRegionID if it is stored already. If not, use the regionHandle as before
141 if (theUser.HomeRegionID != UUID.Zero) 137 if (theUser.HomeRegionID != UUID.Zero)
142 { 138 homeInfo = RegionProfileData.RequestSimProfileData(theUser.HomeRegionID,
143 HomeInfo = 139 m_config.GridServerURL, m_config.GridSendKey, m_config.GridRecvKey);
144 RegionProfileData.RequestSimProfileData(
145 theUser.HomeRegionID, m_config.GridServerURL,
146 m_config.GridSendKey, m_config.GridRecvKey);
147 }
148 else 140 else
149 { 141 homeInfo = RegionProfileData.RequestSimProfileData(theUser.HomeRegion,
150 HomeInfo = 142 m_config.GridServerURL, m_config.GridSendKey, m_config.GridRecvKey);
151 RegionProfileData.RequestSimProfileData( 143 if (homeInfo != null)
152 theUser.HomeRegion, m_config.GridServerURL,
153 m_config.GridSendKey, m_config.GridRecvKey);
154 }
155
156 if (startLocationRequest == "last")
157 {
158 SimInfo =
159 RegionProfileData.RequestSimProfileData(
160 theUser.CurrentAgent.Handle, m_config.GridServerURL,
161 m_config.GridSendKey, m_config.GridRecvKey);
162 }
163 else if (startLocationRequest == "home")
164 {
165 SimInfo = HomeInfo;
166 }
167 else
168 {
169 string[] startLocationRequestParsed = Util.ParseStartLocationRequest(startLocationRequest);
170 m_log.Info("[DEBUGLOGINPARSE]: 1:" + startLocationRequestParsed[0] + ", 2:" +
171 startLocationRequestParsed[1] + ", 3:" + startLocationRequestParsed[2] + ", 4:" +
172 startLocationRequestParsed[3]);
173 if (startLocationRequestParsed[0] == "last")
174 {
175 SimInfo =
176 RegionProfileData.RequestSimProfileData(
177 theUser.CurrentAgent.Handle, m_config.GridServerURL,
178 m_config.GridSendKey, m_config.GridRecvKey);
179 }
180 else
181 {
182 m_log.Info("[LOGIN]: Looking up Sim: " + startLocationRequestParsed[0]);
183 SimInfo =
184 RegionProfileData.RequestSimProfileData(
185 startLocationRequestParsed[0], m_config.GridServerURL,
186 m_config.GridSendKey, m_config.GridRecvKey);
187
188 if (SimInfo == null)
189 {
190 m_log.Info("[LOGIN]: Didn't find region with a close name match sending to home location");
191 SimInfo = HomeInfo;
192 }
193 else
194 {
195 start_x = Convert.ToInt32(startLocationRequestParsed[1]);
196 start_y = Convert.ToInt32(startLocationRequestParsed[2]);
197 start_z = Convert.ToInt32(startLocationRequestParsed[3]);
198
199 if (start_x >= 0 && start_y >= 0 && start_z >= 0)
200 {
201 Vector3 tmp_v = new Vector3(start_x, start_y, start_z);
202 theUser.CurrentAgent.Position = tmp_v;
203 }
204 }
205 }
206 }
207
208 // Customise the response
209 //CFK: This is redundant and the next message should always appear.
210 //CFK: m_log.Info("[LOGIN]: Home Location");
211 if (HomeInfo != null)
212 { 144 {
213 response.Home = 145 response.Home =
214 string.Format( 146 string.Format(
215 "{{'region_handle':[r{0},r{1}], 'position':[r{2},r{3},r{4}], 'look_at':[r{5},r{6},r{7}]}}", 147 "{{'region_handle':[r{0},r{1}], 'position':[r{2},r{3},r{4}], 'look_at':[r{5},r{6},r{7}]}}",
216 (HomeInfo.regionLocX*Constants.RegionSize), 148 (homeInfo.regionLocX*Constants.RegionSize),
217 (HomeInfo.regionLocY*Constants.RegionSize), 149 (homeInfo.regionLocY*Constants.RegionSize),
218 theUser.HomeLocation.X, theUser.HomeLocation.Y, theUser.HomeLocation.Z, 150 theUser.HomeLocation.X, theUser.HomeLocation.Y, theUser.HomeLocation.Z,
219 theUser.HomeLookAt.X, theUser.HomeLookAt.Y, theUser.HomeLookAt.Z); 151 theUser.HomeLookAt.X, theUser.HomeLookAt.Y, theUser.HomeLookAt.Z);
220 } 152 }
@@ -236,42 +168,85 @@ namespace OpenSim.Grid.UserServer
236 regionX, regionY); 168 regionX, regionY);
237 } 169 }
238 170
239 if (!PrepareLoginToRegion(SimInfo, theUser, response)) 171 // StartLocation
172 RegionProfileData regionInfo = null;
173 if (startLocationRequest == "home")
240 { 174 {
241 // Send him to default region instead 175 regionInfo = homeInfo;
242 // Load information from the gridserver 176 theUser.CurrentAgent.Position = theUser.HomeLocation;
243 ulong defaultHandle = (((ulong) m_config.DefaultX * Constants.RegionSize) << 32) | 177 response.LookAt = "[r" + theUser.HomeLookAt.X.ToString() + ",r" + theUser.HomeLookAt.Y.ToString() + ",r" + theUser.HomeLookAt.Z.ToString() + "]";
244 ((ulong) m_config.DefaultY * Constants.RegionSize); 178 }
245 179 else if (startLocationRequest == "last")
246 if (defaultHandle == SimInfo.regionHandle) 180 {
181 regionInfo = RegionProfileData.RequestSimProfileData(theUser.CurrentAgent.Region,
182 m_config.GridServerURL, m_config.GridSendKey, m_config.GridRecvKey);
183 response.LookAt = "[r" + theUser.CurrentAgent.LookAt.X.ToString() + ",r" + theUser.CurrentAgent.LookAt.Y.ToString() + ",r" + theUser.CurrentAgent.LookAt.Z.ToString() + "]";
184 }
185 else
186 {
187 Regex reURI = new Regex(@"^uri:(?<region>[^&]+)&(?<x>\d+)&(?<y>\d+)&(?<z>\d+)$");
188 Match uriMatch = reURI.Match(startLocationRequest);
189 if (uriMatch == null)
247 { 190 {
248 m_log.ErrorFormat("[LOGIN]: Not trying the default region since this is the same as the selected region"); 191 m_log.InfoFormat("[LOGIN]: Got Custom Login URL {0}, but can't process it", startLocationRequest);
249 return false;
250 } 192 }
193 else
194 {
195 string region = uriMatch.Groups["region"].ToString();
196 regionInfo = RegionProfileData.RequestSimProfileData(region,
197 m_config.GridServerURL, m_config.GridSendKey, m_config.GridRecvKey);
198 if (regionInfo == null)
199 {
200 m_log.InfoFormat("[LOGIN]: Got Custom Login URL {0}, can't locate region {1}", startLocationRequest, region);
201 }
202 else
203 {
204 theUser.CurrentAgent.Position = new Vector3(float.Parse(uriMatch.Groups["x"].Value),
205 float.Parse(uriMatch.Groups["y"].Value), float.Parse(uriMatch.Groups["x"].Value));
206 }
207 }
208 response.LookAt = "[r0,r1,r0]";
209 // can be: last, home, safe, url
210 response.StartLocation = "url";
211 }
251 212
252 m_log.Error("[LOGIN]: Sending user to default region " + defaultHandle + " instead"); 213 if ((regionInfo != null) && (PrepareLoginToRegion(regionInfo, theUser, response)))
214 {
215 return true;
216 }
253 217
254 SimInfo = RegionProfileData.RequestSimProfileData(defaultHandle, m_config.GridServerURL, m_config.GridSendKey, m_config.GridRecvKey); 218 // StartLocation not available, send him to a nearby region instead
219 //regionInfo = RegionProfileData.RequestSimProfileData("", m_config.GridServerURL, m_config.GridSendKey, m_config.GridRecvKey);
220 //m_log.InfoFormat("[LOGIN]: StartLocation not available sending to region {0}", regionInfo.regionName);
255 221
256 // Customise the response 222 // Send him to default region instead
257 response.Home = 223 // Load information from the gridserver
258 string.Format( 224 ulong defaultHandle = (((ulong) m_config.DefaultX * Constants.RegionSize) << 32) |
259 "{{'region_handle':[r{0},r{1}], 'position':[r{2},r{3},r{4}], 'look_at':[r{5},r{6},r{7}]}}", 225 ((ulong) m_config.DefaultY * Constants.RegionSize);
260 (SimInfo.regionLocX * Constants.RegionSize),
261 (SimInfo.regionLocY*Constants.RegionSize),
262 theUser.HomeLocation.X, theUser.HomeLocation.Y, theUser.HomeLocation.Z,
263 theUser.HomeLookAt.X, theUser.HomeLookAt.Y, theUser.HomeLookAt.Z);
264 226
265 if (!PrepareLoginToRegion(SimInfo, theUser, response)) 227 if ((regionInfo != null) && (defaultHandle == regionInfo.regionHandle))
266 { 228 {
267 response.CreateDeadRegionResponse(); 229 m_log.ErrorFormat("[LOGIN]: Not trying the default region since this is the same as the selected region");
268 return false; 230 return false;
269 }
270 } 231 }
271 232
272 return true; 233 m_log.Error("[LOGIN]: Sending user to default region " + defaultHandle + " instead");
273 } 234 regionInfo = RegionProfileData.RequestSimProfileData(defaultHandle, m_config.GridServerURL, m_config.GridSendKey, m_config.GridRecvKey);
274 235
236 // Customise the response
237 //response.Home =
238 // string.Format(
239 // "{{'region_handle':[r{0},r{1}], 'position':[r{2},r{3},r{4}], 'look_at':[r{5},r{6},r{7}]}}",
240 // (SimInfo.regionLocX * Constants.RegionSize),
241 // (SimInfo.regionLocY*Constants.RegionSize),
242 // theUser.HomeLocation.X, theUser.HomeLocation.Y, theUser.HomeLocation.Z,
243 // theUser.HomeLookAt.X, theUser.HomeLookAt.Y, theUser.HomeLookAt.Z);
244 theUser.CurrentAgent.Position = new Vector3(128,128,0);
245 response.StartLocation = "safe";
246
247 return PrepareLoginToRegion(regionInfo, theUser, response);
248 }
249
275 /// <summary> 250 /// <summary>
276 /// Prepare a login to the given region. This involves both telling the region to expect a connection 251 /// Prepare a login to the given region. This involves both telling the region to expect a connection
277 /// and appropriately customising the response to the user. 252 /// and appropriately customising the response to the user.
@@ -280,47 +255,46 @@ namespace OpenSim.Grid.UserServer
280 /// <param name="user"></param> 255 /// <param name="user"></param>
281 /// <param name="response"></param> 256 /// <param name="response"></param>
282 /// <returns>true if the region was successfully contacted, false otherwise</returns> 257 /// <returns>true if the region was successfully contacted, false otherwise</returns>
283 private bool PrepareLoginToRegion(RegionProfileData sim, UserProfileData user, LoginResponse response) 258 private bool PrepareLoginToRegion(RegionProfileData regionInfo, UserProfileData user, LoginResponse response)
284 { 259 {
285 try 260 try
286 { 261 {
287 response.SimAddress = Util.GetHostFromURL(sim.serverURI).ToString(); 262 response.SimAddress = Util.GetHostFromURL(regionInfo.serverURI).ToString();
288 response.SimPort = uint.Parse(sim.serverURI.Split(new char[] {'/', ':'})[4]); 263 response.SimPort = uint.Parse(regionInfo.serverURI.Split(new char[] { '/', ':' })[4]);
289 response.RegionX = sim.regionLocX; 264 response.RegionX = regionInfo.regionLocX;
290 response.RegionY = sim.regionLocY; 265 response.RegionY = regionInfo.regionLocY;
291 266
292 //Not sure if the + "/CAPS/" should in fact be +"CAPS/" depending if there is already a / as part of httpServerURI 267 //Not sure if the + "/CAPS/" should in fact be +"CAPS/" depending if there is already a / as part of httpServerURI
293 string capsPath = Util.GetRandomCapsPath(); 268 string capsPath = Util.GetRandomCapsPath();
294 response.SeedCapability = sim.httpServerURI + "CAPS/" + capsPath + "0000/"; 269 response.SeedCapability = regionInfo.httpServerURI + "CAPS/" + capsPath + "0000/";
295 270
296 // Notify the target of an incoming user 271 // Notify the target of an incoming user
297 m_log.InfoFormat( 272 m_log.InfoFormat(
298 "[LOGIN]: Telling {0} @ {1},{2} ({3}) to prepare for client connection", 273 "[LOGIN]: Telling {0} @ {1},{2} ({3}) to prepare for client connection",
299 sim.regionName, sim.regionLocX, sim.regionLocY, sim.serverURI); 274 regionInfo.regionName, response.RegionX, response.RegionY, regionInfo.httpServerURI);
300
301 // Update agent with target sim 275 // Update agent with target sim
302 user.CurrentAgent.Region = sim.UUID; 276 user.CurrentAgent.Region = regionInfo.UUID;
303 user.CurrentAgent.Handle = sim.regionHandle; 277 user.CurrentAgent.Handle = regionInfo.regionHandle;
304
305 // Prepare notification 278 // Prepare notification
306 Hashtable SimParams = new Hashtable(); 279 Hashtable loginParams = new Hashtable();
307 SimParams["session_id"] = user.CurrentAgent.SessionID.ToString(); 280 loginParams["session_id"] = user.CurrentAgent.SessionID.ToString();
308 SimParams["secure_session_id"] = user.CurrentAgent.SecureSessionID.ToString(); 281 loginParams["secure_session_id"] = user.CurrentAgent.SecureSessionID.ToString();
309 SimParams["firstname"] = user.FirstName; 282 loginParams["firstname"] = user.FirstName;
310 SimParams["lastname"] = user.SurName; 283 loginParams["lastname"] = user.SurName;
311 SimParams["agent_id"] = user.ID.ToString(); 284 loginParams["agent_id"] = user.ID.ToString();
312 SimParams["circuit_code"] = (Int32) Convert.ToUInt32(response.CircuitCode); 285 loginParams["circuit_code"] = (Int32) Convert.ToUInt32(response.CircuitCode);
313 SimParams["startpos_x"] = user.CurrentAgent.Position.X.ToString(); 286 loginParams["startpos_x"] = user.CurrentAgent.Position.X.ToString();
314 SimParams["startpos_y"] = user.CurrentAgent.Position.Y.ToString(); 287 loginParams["startpos_y"] = user.CurrentAgent.Position.Y.ToString();
315 SimParams["startpos_z"] = user.CurrentAgent.Position.Z.ToString(); 288 loginParams["startpos_z"] = user.CurrentAgent.Position.Z.ToString();
316 SimParams["regionhandle"] = user.CurrentAgent.Handle.ToString(); 289 loginParams["regionhandle"] = user.CurrentAgent.Handle.ToString();
317 SimParams["caps_path"] = capsPath; 290 loginParams["caps_path"] = capsPath;
291
318 ArrayList SendParams = new ArrayList(); 292 ArrayList SendParams = new ArrayList();
319 SendParams.Add(SimParams); 293 SendParams.Add(loginParams);
320 294
321 // Send 295 // Send
322 XmlRpcRequest GridReq = new XmlRpcRequest("expect_user", SendParams); 296 XmlRpcRequest GridReq = new XmlRpcRequest("expect_user", SendParams);
323 XmlRpcResponse GridResp = GridReq.Send(sim.httpServerURI, 30000); 297 XmlRpcResponse GridResp = GridReq.Send(regionInfo.httpServerURI, 6000);
324 298
325 if (!GridResp.IsFault) 299 if (!GridResp.IsFault)
326 { 300 {
@@ -337,7 +311,6 @@ namespace OpenSim.Grid.UserServer
337 } 311 }
338 } 312 }
339 } 313 }
340
341 if (responseSuccess) 314 if (responseSuccess)
342 { 315 {
343 handlerUserLoggedInAtLocation = OnUserLoggedInAtLocation; 316 handlerUserLoggedInAtLocation = OnUserLoggedInAtLocation;