aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Client/Linden/LLStandaloneLoginService.cs
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--OpenSim/Client/Linden/LLStandaloneLoginService.cs143
1 files changed, 138 insertions, 5 deletions
diff --git a/OpenSim/Client/Linden/LLStandaloneLoginService.cs b/OpenSim/Client/Linden/LLStandaloneLoginService.cs
index b596e14..8fe7172 100644
--- a/OpenSim/Client/Linden/LLStandaloneLoginService.cs
+++ b/OpenSim/Client/Linden/LLStandaloneLoginService.cs
@@ -126,17 +126,150 @@ namespace OpenSim.Client.Linden
126 } 126 }
127 } 127 }
128 128
129 protected override RegionInfo RequestClosestRegion(string region) 129 /// <summary>
130 /// Customises the login response and fills in missing values.
131 /// </summary>
132 /// <param name="response">The existing response</param>
133 /// <param name="theUser">The user profile</param>
134 /// <param name="startLocationRequest">The requested start location</param>
135 public override bool CustomiseResponse(LoginResponse response, UserProfileData theUser, string startLocationRequest)
136 {
137 // add active gestures to login-response
138 AddActiveGestures(response, theUser);
139
140 // HomeLocation
141 RegionInfo homeInfo = null;
142
143 // use the homeRegionID if it is stored already. If not, use the regionHandle as before
144 UUID homeRegionId = theUser.HomeRegionID;
145 ulong homeRegionHandle = theUser.HomeRegion;
146 if (homeRegionId != UUID.Zero)
147 {
148 homeInfo = GetRegionInfo(homeRegionId);
149 }
150 else
151 {
152 homeInfo = GetRegionInfo(homeRegionHandle);
153 }
154
155 if (homeInfo != null)
156 {
157 response.Home =
158 string.Format(
159 "{{'region_handle':[r{0},r{1}], 'position':[r{2},r{3},r{4}], 'look_at':[r{5},r{6},r{7}]}}",
160 (homeInfo.RegionLocX * Constants.RegionSize),
161 (homeInfo.RegionLocY * Constants.RegionSize),
162 theUser.HomeLocation.X, theUser.HomeLocation.Y, theUser.HomeLocation.Z,
163 theUser.HomeLookAt.X, theUser.HomeLookAt.Y, theUser.HomeLookAt.Z);
164 }
165 else
166 {
167 m_log.InfoFormat("not found the region at {0} {1}", theUser.HomeRegionX, theUser.HomeRegionY);
168 // Emergency mode: Home-region isn't available, so we can't request the region info.
169 // Use the stored home regionHandle instead.
170 // NOTE: If the home-region moves, this will be wrong until the users update their user-profile again
171 ulong regionX = homeRegionHandle >> 32;
172 ulong regionY = homeRegionHandle & 0xffffffff;
173 response.Home =
174 string.Format(
175 "{{'region_handle':[r{0},r{1}], 'position':[r{2},r{3},r{4}], 'look_at':[r{5},r{6},r{7}]}}",
176 regionX, regionY,
177 theUser.HomeLocation.X, theUser.HomeLocation.Y, theUser.HomeLocation.Z,
178 theUser.HomeLookAt.X, theUser.HomeLookAt.Y, theUser.HomeLookAt.Z);
179
180 m_log.InfoFormat("[LOGIN] Home region of user {0} {1} is not available; using computed region position {2} {3}",
181 theUser.FirstName, theUser.SurName,
182 regionX, regionY);
183 }
184
185 // StartLocation
186 RegionInfo regionInfo = null;
187 if (startLocationRequest == "home")
188 {
189 regionInfo = homeInfo;
190 theUser.CurrentAgent.Position = theUser.HomeLocation;
191 response.LookAt = "[r" + theUser.HomeLookAt.X.ToString() + ",r" + theUser.HomeLookAt.Y.ToString() + ",r" + theUser.HomeLookAt.Z.ToString() + "]";
192 }
193 else if (startLocationRequest == "last")
194 {
195 UUID lastRegion = theUser.CurrentAgent.Region;
196 regionInfo = GetRegionInfo(lastRegion);
197 response.LookAt = "[r" + theUser.CurrentAgent.LookAt.X.ToString() + ",r" + theUser.CurrentAgent.LookAt.Y.ToString() + ",r" + theUser.CurrentAgent.LookAt.Z.ToString() + "]";
198 }
199 else
200 {
201 Regex reURI = new Regex(@"^uri:(?<region>[^&]+)&(?<x>\d+)&(?<y>\d+)&(?<z>\d+)$");
202 Match uriMatch = reURI.Match(startLocationRequest);
203 if (uriMatch == null)
204 {
205 m_log.InfoFormat("[LOGIN]: Got Custom Login URL {0}, but can't process it", startLocationRequest);
206 }
207 else
208 {
209 string region = uriMatch.Groups["region"].ToString();
210 regionInfo = RequestClosestRegion(region);
211 if (regionInfo == null)
212 {
213 m_log.InfoFormat("[LOGIN]: Got Custom Login URL {0}, can't locate region {1}", startLocationRequest, region);
214 }
215 else
216 {
217 theUser.CurrentAgent.Position = new Vector3(float.Parse(uriMatch.Groups["x"].Value),
218 float.Parse(uriMatch.Groups["y"].Value), float.Parse(uriMatch.Groups["z"].Value));
219 }
220 }
221 response.LookAt = "[r0,r1,r0]";
222 // can be: last, home, safe, url
223 response.StartLocation = "url";
224 }
225
226 if ((regionInfo != null) && (PrepareLoginToRegion(regionInfo, theUser, response)))
227 {
228 return true;
229 }
230
231 // StartLocation not available, send him to a nearby region instead
232 // regionInfo = m_gridService.RequestClosestRegion("");
233 //m_log.InfoFormat("[LOGIN]: StartLocation not available sending to region {0}", regionInfo.regionName);
234
235 // Send him to default region instead
236 ulong defaultHandle = (((ulong)m_defaultHomeX * Constants.RegionSize) << 32) |
237 ((ulong)m_defaultHomeY * Constants.RegionSize);
238
239 if ((regionInfo != null) && (defaultHandle == regionInfo.RegionHandle))
240 {
241 m_log.ErrorFormat("[LOGIN]: Not trying the default region since this is the same as the selected region");
242 return false;
243 }
244
245 m_log.Error("[LOGIN]: Sending user to default region " + defaultHandle + " instead");
246 regionInfo = GetRegionInfo(defaultHandle);
247
248 // Customise the response
249 //response.Home =
250 // string.Format(
251 // "{{'region_handle':[r{0},r{1}], 'position':[r{2},r{3},r{4}], 'look_at':[r{5},r{6},r{7}]}}",
252 // (SimInfo.regionLocX * Constants.RegionSize),
253 // (SimInfo.regionLocY*Constants.RegionSize),
254 // theUser.HomeLocation.X, theUser.HomeLocation.Y, theUser.HomeLocation.Z,
255 // theUser.HomeLookAt.X, theUser.HomeLookAt.Y, theUser.HomeLookAt.Z);
256 theUser.CurrentAgent.Position = new Vector3(128, 128, 0);
257 response.StartLocation = "safe";
258
259 return PrepareLoginToRegion(regionInfo, theUser, response);
260 }
261
262 protected RegionInfo RequestClosestRegion(string region)
130 { 263 {
131 return m_regionsConnector.RequestClosestRegion(region); 264 return m_regionsConnector.RequestClosestRegion(region);
132 } 265 }
133 266
134 protected override RegionInfo GetRegionInfo(ulong homeRegionHandle) 267 protected RegionInfo GetRegionInfo(ulong homeRegionHandle)
135 { 268 {
136 return m_regionsConnector.RequestNeighbourInfo(homeRegionHandle); 269 return m_regionsConnector.RequestNeighbourInfo(homeRegionHandle);
137 } 270 }
138 271
139 protected override RegionInfo GetRegionInfo(UUID homeRegionId) 272 protected RegionInfo GetRegionInfo(UUID homeRegionId)
140 { 273 {
141 return m_regionsConnector.RequestNeighbourInfo(homeRegionId); 274 return m_regionsConnector.RequestNeighbourInfo(homeRegionId);
142 } 275 }
@@ -150,7 +283,7 @@ namespace OpenSim.Client.Linden
150 /// <param name="theUser"> 283 /// <param name="theUser">
151 /// A <see cref="UserProfileData"/> 284 /// A <see cref="UserProfileData"/>
152 /// </param> 285 /// </param>
153 protected override void AddActiveGestures(LoginResponse response, UserProfileData theUser) 286 private void AddActiveGestures(LoginResponse response, UserProfileData theUser)
154 { 287 {
155 List<InventoryItemBase> gestures = m_interServiceInventoryService.GetActiveGestures(theUser.ID); 288 List<InventoryItemBase> gestures = m_interServiceInventoryService.GetActiveGestures(theUser.ID);
156 //m_log.DebugFormat("[LOGIN]: AddActiveGestures, found {0}", gestures == null ? 0 : gestures.Count); 289 //m_log.DebugFormat("[LOGIN]: AddActiveGestures, found {0}", gestures == null ? 0 : gestures.Count);
@@ -176,7 +309,7 @@ namespace OpenSim.Client.Linden
176 /// <param name="user"></param> 309 /// <param name="user"></param>
177 /// <param name="response"></param> 310 /// <param name="response"></param>
178 /// <returns>true if the region was successfully contacted, false otherwise</returns> 311 /// <returns>true if the region was successfully contacted, false otherwise</returns>
179 protected override bool PrepareLoginToRegion(RegionInfo regionInfo, UserProfileData user, LoginResponse response) 312 protected bool PrepareLoginToRegion(RegionInfo regionInfo, UserProfileData user, LoginResponse response)
180 { 313 {
181 IPEndPoint endPoint = regionInfo.ExternalEndPoint; 314 IPEndPoint endPoint = regionInfo.ExternalEndPoint;
182 response.SimAddress = endPoint.Address.ToString(); 315 response.SimAddress = endPoint.Address.ToString();