aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim
diff options
context:
space:
mode:
authorlbsa712009-03-11 19:19:48 +0000
committerlbsa712009-03-11 19:19:48 +0000
commit2133d358317f28fe54020207ed8fa59562e1d6eb (patch)
treedf648eee35bf347a7ba66a15bdec6a1b4082840b /OpenSim
parentThanks rtomita for a patch to fix inventory listings for clients using libomv... (diff)
downloadopensim-SC-2133d358317f28fe54020207ed8fa59562e1d6eb.zip
opensim-SC-2133d358317f28fe54020207ed8fa59562e1d6eb.tar.gz
opensim-SC-2133d358317f28fe54020207ed8fa59562e1d6eb.tar.bz2
opensim-SC-2133d358317f28fe54020207ed8fa59562e1d6eb.tar.xz
* Reverted r8750 to do another round of debugging on mantis #3287
Diffstat (limited to 'OpenSim')
-rw-r--r--OpenSim/Client/Linden/LLStandaloneLoginService.cs143
-rw-r--r--OpenSim/Data/RegionProfileData.cs8
-rw-r--r--OpenSim/Framework/Communications/LoginService.cs150
-rw-r--r--OpenSim/Grid/UserServer.Modules/UserLoginService.cs183
4 files changed, 302 insertions, 182 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();
diff --git a/OpenSim/Data/RegionProfileData.cs b/OpenSim/Data/RegionProfileData.cs
index 26b65de..5476233 100644
--- a/OpenSim/Data/RegionProfileData.cs
+++ b/OpenSim/Data/RegionProfileData.cs
@@ -285,14 +285,6 @@ namespace OpenSim.Data
285 return RegionInfo.Create(UUID, regionName, regionLocX, regionLocY, serverIP, httpPort, serverPort, remotingPort); 285 return RegionInfo.Create(UUID, regionName, regionLocX, regionLocY, serverIP, httpPort, serverPort, remotingPort);
286 } 286 }
287 287
288 public static RegionProfileData FromRegionInfo( RegionInfo regionInfo )
289 {
290 return Create(regionInfo.RegionID, regionInfo.RegionName, regionInfo.RegionLocX,
291 regionInfo.RegionLocY, regionInfo.ExternalHostName,
292 (uint) regionInfo.ExternalEndPoint.Port, regionInfo.HttpPort, regionInfo.RemotingPort,
293 regionInfo.ServerURI);
294 }
295
296 public static RegionProfileData Create(UUID regionID, string regionName, uint locX, uint locY, string externalHostName, uint regionPort, uint httpPort, uint remotingPort, string serverUri) 288 public static RegionProfileData Create(UUID regionID, string regionName, uint locX, uint locY, string externalHostName, uint regionPort, uint httpPort, uint remotingPort, string serverUri)
297 { 289 {
298 RegionProfileData regionProfile; 290 RegionProfileData regionProfile;
diff --git a/OpenSim/Framework/Communications/LoginService.cs b/OpenSim/Framework/Communications/LoginService.cs
index 1e7faa5..36d7280 100644
--- a/OpenSim/Framework/Communications/LoginService.cs
+++ b/OpenSim/Framework/Communications/LoginService.cs
@@ -78,6 +78,15 @@ namespace OpenSim.Framework.Communications
78 } 78 }
79 79
80 /// <summary> 80 /// <summary>
81 /// Customises the login response and fills in missing values. This method also tells the login region to
82 /// expect a client connection.
83 /// </summary>
84 /// <param name="response">The existing response</param>
85 /// <param name="theUser">The user profile</param>
86 /// <returns>true on success, false if the region was not successfully told to expect a user connection</returns>
87 public abstract bool CustomiseResponse(LoginResponse response, UserProfileData theUser, string startLocationRequest);
88
89 /// <summary>
81 /// If the user is already logged in, try to notify the region that the user they've got is dead. 90 /// If the user is already logged in, try to notify the region that the user they've got is dead.
82 /// </summary> 91 /// </summary>
83 /// <param name="theUser"></param> 92 /// <param name="theUser"></param>
@@ -863,146 +872,5 @@ namespace OpenSim.Framework.Communications
863 m_log.InfoFormat("[LOGIN]: Login with web_login_key {0}", web_login_key); 872 m_log.InfoFormat("[LOGIN]: Login with web_login_key {0}", web_login_key);
864 } 873 }
865 } 874 }
866
867 /// <summary>
868 /// Customises the login response and fills in missing values. This method also tells the login region to
869 /// expect a client connection.
870 /// </summary>
871 /// <param name="response">The existing response</param>
872 /// <param name="theUser">The user profile</param>
873 /// <param name="startLocationRequest">The requested start location</param>
874 /// <returns>true on success, false if the region was not successfully told to expect a user connection</returns>
875 public bool CustomiseResponse(LoginResponse response, UserProfileData theUser, string startLocationRequest)
876 {
877 // add active gestures to login-response
878 AddActiveGestures(response, theUser);
879
880 // HomeLocation
881 RegionInfo homeInfo = null;
882
883 // use the homeRegionID if it is stored already. If not, use the regionHandle as before
884 UUID homeRegionId = theUser.HomeRegionID;
885 ulong homeRegionHandle = theUser.HomeRegion;
886 if (homeRegionId != UUID.Zero)
887 {
888 homeInfo = GetRegionInfo(homeRegionId);
889 }
890 else
891 {
892 homeInfo = GetRegionInfo(homeRegionHandle);
893 }
894
895 if (homeInfo != null)
896 {
897 response.Home =
898 string.Format(
899 "{{'region_handle':[r{0},r{1}], 'position':[r{2},r{3},r{4}], 'look_at':[r{5},r{6},r{7}]}}",
900 (homeInfo.RegionLocX * Constants.RegionSize),
901 (homeInfo.RegionLocY * Constants.RegionSize),
902 theUser.HomeLocation.X, theUser.HomeLocation.Y, theUser.HomeLocation.Z,
903 theUser.HomeLookAt.X, theUser.HomeLookAt.Y, theUser.HomeLookAt.Z);
904 }
905 else
906 {
907 m_log.InfoFormat("not found the region at {0} {1}", theUser.HomeRegionX, theUser.HomeRegionY);
908 // Emergency mode: Home-region isn't available, so we can't request the region info.
909 // Use the stored home regionHandle instead.
910 // NOTE: If the home-region moves, this will be wrong until the users update their user-profile again
911 ulong regionX = homeRegionHandle >> 32;
912 ulong regionY = homeRegionHandle & 0xffffffff;
913 response.Home =
914 string.Format(
915 "{{'region_handle':[r{0},r{1}], 'position':[r{2},r{3},r{4}], 'look_at':[r{5},r{6},r{7}]}}",
916 regionX, regionY,
917 theUser.HomeLocation.X, theUser.HomeLocation.Y, theUser.HomeLocation.Z,
918 theUser.HomeLookAt.X, theUser.HomeLookAt.Y, theUser.HomeLookAt.Z);
919
920 m_log.InfoFormat("[LOGIN] Home region of user {0} {1} is not available; using computed region position {2} {3}",
921 theUser.FirstName, theUser.SurName,
922 regionX, regionY);
923 }
924
925 // StartLocation
926 RegionInfo regionInfo = null;
927 if (startLocationRequest == "home")
928 {
929 regionInfo = homeInfo;
930 theUser.CurrentAgent.Position = theUser.HomeLocation;
931 response.LookAt = "[r" + theUser.HomeLookAt.X.ToString() + ",r" + theUser.HomeLookAt.Y.ToString() + ",r" + theUser.HomeLookAt.Z.ToString() + "]";
932 }
933 else if (startLocationRequest == "last")
934 {
935 UUID lastRegion = theUser.CurrentAgent.Region;
936 regionInfo = GetRegionInfo(lastRegion);
937 response.LookAt = "[r" + theUser.CurrentAgent.LookAt.X.ToString() + ",r" + theUser.CurrentAgent.LookAt.Y.ToString() + ",r" + theUser.CurrentAgent.LookAt.Z.ToString() + "]";
938 }
939 else
940 {
941 Regex reURI = new Regex(@"^uri:(?<region>[^&]+)&(?<x>\d+)&(?<y>\d+)&(?<z>\d+)$");
942 Match uriMatch = reURI.Match(startLocationRequest);
943 if (uriMatch == null)
944 {
945 m_log.InfoFormat("[LOGIN]: Got Custom Login URL {0}, but can't process it", startLocationRequest);
946 }
947 else
948 {
949 string region = uriMatch.Groups["region"].ToString();
950 regionInfo = RequestClosestRegion(region);
951 if (regionInfo == null)
952 {
953 m_log.InfoFormat("[LOGIN]: Got Custom Login URL {0}, can't locate region {1}", startLocationRequest, region);
954 }
955 else
956 {
957 theUser.CurrentAgent.Position = new Vector3(float.Parse(uriMatch.Groups["x"].Value),
958 float.Parse(uriMatch.Groups["y"].Value), float.Parse(uriMatch.Groups["z"].Value));
959 }
960 }
961 response.LookAt = "[r0,r1,r0]";
962 // can be: last, home, safe, url
963 response.StartLocation = "url";
964 }
965
966 if ((regionInfo != null) && (PrepareLoginToRegion(regionInfo, theUser, response)))
967 {
968 return true;
969 }
970
971 // StartLocation not available, send him to a nearby region instead
972 // regionInfo = m_gridService.RequestClosestRegion("");
973 //m_log.InfoFormat("[LOGIN]: StartLocation not available sending to region {0}", regionInfo.regionName);
974
975 // Send him to default region instead
976 ulong defaultHandle = (((ulong)m_defaultHomeX * Constants.RegionSize) << 32) |
977 ((ulong)m_defaultHomeY * Constants.RegionSize);
978
979 if ((regionInfo != null) && (defaultHandle == regionInfo.RegionHandle))
980 {
981 m_log.ErrorFormat("[LOGIN]: Not trying the default region since this is the same as the selected region");
982 return false;
983 }
984
985 m_log.Error("[LOGIN]: Sending user to default region " + defaultHandle + " instead");
986 regionInfo = GetRegionInfo(defaultHandle);
987
988 // Customise the response
989 //response.Home =
990 // string.Format(
991 // "{{'region_handle':[r{0},r{1}], 'position':[r{2},r{3},r{4}], 'look_at':[r{5},r{6},r{7}]}}",
992 // (SimInfo.regionLocX * Constants.RegionSize),
993 // (SimInfo.regionLocY*Constants.RegionSize),
994 // theUser.HomeLocation.X, theUser.HomeLocation.Y, theUser.HomeLocation.Z,
995 // theUser.HomeLookAt.X, theUser.HomeLookAt.Y, theUser.HomeLookAt.Z);
996 theUser.CurrentAgent.Position = new Vector3(128, 128, 0);
997 response.StartLocation = "safe";
998
999 return PrepareLoginToRegion(regionInfo, theUser, response);
1000 }
1001
1002 protected abstract RegionInfo RequestClosestRegion(string region);
1003 protected abstract RegionInfo GetRegionInfo(ulong homeRegionHandle);
1004 protected abstract RegionInfo GetRegionInfo(UUID homeRegionId);
1005 protected abstract void AddActiveGestures(LoginResponse response, UserProfileData theUser);
1006 protected abstract bool PrepareLoginToRegion(RegionInfo regionInfo, UserProfileData user, LoginResponse response);
1007 } 875 }
1008} 876}
diff --git a/OpenSim/Grid/UserServer.Modules/UserLoginService.cs b/OpenSim/Grid/UserServer.Modules/UserLoginService.cs
index b695ff5..4e672f6 100644
--- a/OpenSim/Grid/UserServer.Modules/UserLoginService.cs
+++ b/OpenSim/Grid/UserServer.Modules/UserLoginService.cs
@@ -99,11 +99,11 @@ namespace OpenSim.Grid.UserServer.Modules
99 m_httpServer.AddStreamHandler(new OpenIdStreamHandler("GET", "/openid/server/", this)); 99 m_httpServer.AddStreamHandler(new OpenIdStreamHandler("GET", "/openid/server/", this));
100 } 100 }
101 } 101 }
102 102
103 public void setloginlevel(int level) 103 public void setloginlevel(int level)
104 { 104 {
105 m_minLoginLevel = level; 105 m_minLoginLevel = level;
106 m_log.InfoFormat("[GRID]: Login Level set to {0} ", level); 106 m_log.InfoFormat("[GRID]: Login Level set to {0} ", level);
107 } 107 }
108 public void setwelcometext(string text) 108 public void setwelcometext(string text)
109 { 109 {
@@ -199,24 +199,155 @@ namespace OpenSim.Grid.UserServer.Modules
199 //base.LogOffUser(theUser); 199 //base.LogOffUser(theUser);
200 } 200 }
201 201
202 protected override RegionInfo RequestClosestRegion(string region) 202 /// <summary>
203 /// Customises the login response and fills in missing values.
204 /// </summary>
205 /// <param name="response">The existing response</param>
206 /// <param name="theUser">The user profile</param>
207 /// <param name="startLocationRequest">The requested start location</param>
208 public override bool CustomiseResponse(LoginResponse response, UserProfileData theUser, string startLocationRequest)
209 {
210 // add active gestures to login-response
211 AddActiveGestures(response, theUser);
212
213 // HomeLocation
214 RegionProfileData homeInfo = null;
215 // use the homeRegionID if it is stored already. If not, use the regionHandle as before
216 UUID homeRegionId = theUser.HomeRegionID;
217 ulong homeRegionHandle = theUser.HomeRegion;
218 if (homeRegionId != UUID.Zero)
219 {
220 homeInfo = GetRegionInfo(homeRegionId);
221 }
222 else
223 {
224 homeInfo = GetRegionInfo(homeRegionHandle);
225 }
226
227 if (homeInfo != null)
228 {
229 response.Home =
230 string.Format(
231 "{{'region_handle':[r{0},r{1}], 'position':[r{2},r{3},r{4}], 'look_at':[r{5},r{6},r{7}]}}",
232 (homeInfo.regionLocX*Constants.RegionSize),
233 (homeInfo.regionLocY*Constants.RegionSize),
234 theUser.HomeLocation.X, theUser.HomeLocation.Y, theUser.HomeLocation.Z,
235 theUser.HomeLookAt.X, theUser.HomeLookAt.Y, theUser.HomeLookAt.Z);
236 }
237 else
238 {
239 // Emergency mode: Home-region isn't available, so we can't request the region info.
240 // Use the stored home regionHandle instead.
241 // NOTE: If the home-region moves, this will be wrong until the users update their user-profile again
242 ulong regionX = homeRegionHandle >> 32;
243 ulong regionY = homeRegionHandle & 0xffffffff;
244 response.Home =
245 string.Format(
246 "{{'region_handle':[r{0},r{1}], 'position':[r{2},r{3},r{4}], 'look_at':[r{5},r{6},r{7}]}}",
247 regionX, regionY,
248 theUser.HomeLocation.X, theUser.HomeLocation.Y, theUser.HomeLocation.Z,
249 theUser.HomeLookAt.X, theUser.HomeLookAt.Y, theUser.HomeLookAt.Z);
250 m_log.InfoFormat("[LOGIN] Home region of user {0} {1} is not available; using computed region position {2} {3}",
251 theUser.FirstName, theUser.SurName,
252 regionX, regionY);
253 }
254
255 // StartLocation
256 RegionProfileData regionInfo = null;
257 if (startLocationRequest == "home")
258 {
259 regionInfo = homeInfo;
260 theUser.CurrentAgent.Position = theUser.HomeLocation;
261 response.LookAt = "[r" + theUser.HomeLookAt.X.ToString() + ",r" + theUser.HomeLookAt.Y.ToString() + ",r" + theUser.HomeLookAt.Z.ToString() + "]";
262 }
263 else if (startLocationRequest == "last")
264 {
265 UUID lastRegion = theUser.CurrentAgent.Region;
266 regionInfo = GetRegionInfo(lastRegion);
267 response.LookAt = "[r" + theUser.CurrentAgent.LookAt.X.ToString() + ",r" + theUser.CurrentAgent.LookAt.Y.ToString() + ",r" + theUser.CurrentAgent.LookAt.Z.ToString() + "]";
268 }
269 else
270 {
271 Regex reURI = new Regex(@"^uri:(?<region>[^&]+)&(?<x>\d+)&(?<y>\d+)&(?<z>\d+)$");
272 Match uriMatch = reURI.Match(startLocationRequest);
273 if (uriMatch == null)
274 {
275 m_log.InfoFormat("[LOGIN]: Got Custom Login URL {0}, but can't process it", startLocationRequest);
276 }
277 else
278 {
279 string region = uriMatch.Groups["region"].ToString();
280 regionInfo = RequestClosestRegion(region);
281 if (regionInfo == null)
282 {
283 m_log.InfoFormat("[LOGIN]: Got Custom Login URL {0}, can't locate region {1}", startLocationRequest, region);
284 }
285 else
286 {
287 theUser.CurrentAgent.Position = new Vector3(float.Parse(uriMatch.Groups["x"].Value),
288 float.Parse(uriMatch.Groups["y"].Value), float.Parse(uriMatch.Groups["z"].Value));
289 }
290 }
291 response.LookAt = "[r0,r1,r0]";
292 // can be: last, home, safe, url
293 response.StartLocation = "url";
294 }
295
296 if ((regionInfo != null) && (PrepareLoginToRegion(regionInfo, theUser, response)))
297 {
298 return true;
299 }
300
301 // StartLocation not available, send him to a nearby region instead
302 //regionInfo = RegionProfileData.RequestSimProfileData("", m_config.GridServerURL, m_config.GridSendKey, m_config.GridRecvKey);
303 //m_log.InfoFormat("[LOGIN]: StartLocation not available sending to region {0}", regionInfo.regionName);
304
305 // Send him to default region instead
306 // Load information from the gridserver
307 ulong defaultHandle = (((ulong) m_defaultHomeX * Constants.RegionSize) << 32) |
308 ((ulong) m_defaultHomeY * Constants.RegionSize);
309
310 if ((regionInfo != null) && (defaultHandle == regionInfo.regionHandle))
311 {
312 m_log.ErrorFormat("[LOGIN]: Not trying the default region since this is the same as the selected region");
313 return false;
314 }
315
316 m_log.Error("[LOGIN]: Sending user to default region " + defaultHandle + " instead");
317 regionInfo = GetRegionInfo(defaultHandle);
318
319 // Customise the response
320 //response.Home =
321 // string.Format(
322 // "{{'region_handle':[r{0},r{1}], 'position':[r{2},r{3},r{4}], 'look_at':[r{5},r{6},r{7}]}}",
323 // (SimInfo.regionLocX * Constants.RegionSize),
324 // (SimInfo.regionLocY*Constants.RegionSize),
325 // theUser.HomeLocation.X, theUser.HomeLocation.Y, theUser.HomeLocation.Z,
326 // theUser.HomeLookAt.X, theUser.HomeLookAt.Y, theUser.HomeLookAt.Z);
327 theUser.CurrentAgent.Position = new Vector3(128,128,0);
328 response.StartLocation = "safe";
329
330 return PrepareLoginToRegion(regionInfo, theUser, response);
331 }
332
333 protected RegionProfileData RequestClosestRegion(string region)
203 { 334 {
204 return m_regionProfileService.RequestSimProfileData(region, 335 return m_regionProfileService.RequestSimProfileData(region,
205 m_config.GridServerURL, m_config.GridSendKey, m_config.GridRecvKey).ToRegionInfo(); 336 m_config.GridServerURL, m_config.GridSendKey, m_config.GridRecvKey);
206 } 337 }
207 338
208 protected override RegionInfo GetRegionInfo(ulong homeRegionHandle) 339 protected RegionProfileData GetRegionInfo(ulong homeRegionHandle)
209 { 340 {
210 return m_regionProfileService.RequestSimProfileData(homeRegionHandle, 341 return m_regionProfileService.RequestSimProfileData(homeRegionHandle,
211 m_config.GridServerURL, m_config.GridSendKey, 342 m_config.GridServerURL, m_config.GridSendKey,
212 m_config.GridRecvKey).ToRegionInfo(); 343 m_config.GridRecvKey);
213 } 344 }
214 345
215 protected override RegionInfo GetRegionInfo(UUID homeRegionId) 346 protected RegionProfileData GetRegionInfo(UUID homeRegionId)
216 { 347 {
217 return m_regionProfileService.RequestSimProfileData(homeRegionId, 348 return m_regionProfileService.RequestSimProfileData(homeRegionId,
218 m_config.GridServerURL, m_config.GridSendKey, 349 m_config.GridServerURL, m_config.GridSendKey,
219 m_config.GridRecvKey).ToRegionInfo(); 350 m_config.GridRecvKey);
220 } 351 }
221 352
222 /// <summary> 353 /// <summary>
@@ -228,7 +359,7 @@ namespace OpenSim.Grid.UserServer.Modules
228 /// <param name="theUser"> 359 /// <param name="theUser">
229 /// A <see cref="UserProfileData"/> 360 /// A <see cref="UserProfileData"/>
230 /// </param> 361 /// </param>
231 protected override void AddActiveGestures(LoginResponse response, UserProfileData theUser) 362 private void AddActiveGestures(LoginResponse response, UserProfileData theUser)
232 { 363 {
233 List<InventoryItemBase> gestures = m_inventoryService.GetActiveGestures(theUser.ID); 364 List<InventoryItemBase> gestures = m_inventoryService.GetActiveGestures(theUser.ID);
234 //m_log.DebugFormat("[LOGIN]: AddActiveGestures, found {0}", gestures == null ? 0 : gestures.Count); 365 //m_log.DebugFormat("[LOGIN]: AddActiveGestures, found {0}", gestures == null ? 0 : gestures.Count);
@@ -246,23 +377,18 @@ namespace OpenSim.Grid.UserServer.Modules
246 response.ActiveGestures = list; 377 response.ActiveGestures = list;
247 } 378 }
248 379
249 protected override bool PrepareLoginToRegion(RegionInfo regionInfo, UserProfileData user, LoginResponse response)
250 {
251 return PrepareLoginToRegion(RegionProfileData.FromRegionInfo(regionInfo), user, response);
252 }
253
254 /// <summary> 380 /// <summary>
255 /// Prepare a login to the given region. This involves both telling the region to expect a connection 381 /// Prepare a login to the given region. This involves both telling the region to expect a connection
256 /// and appropriately customising the response to the user. 382 /// and appropriately customising the response to the user.
257 /// </summary> 383 /// </summary>
258 /// <param name="regionInfo"></param> 384 /// <param name="sim"></param>
259 /// <param name="user"></param> 385 /// <param name="user"></param>
260 /// <param name="response"></param> 386 /// <param name="response"></param>
261 /// <returns>true if the region was successfully contacted, false otherwise</returns> 387 /// <returns>true if the region was successfully contacted, false otherwise</returns>
262 private bool PrepareLoginToRegion(RegionProfileData regionInfo, UserProfileData user, LoginResponse response) 388 private bool PrepareLoginToRegion(RegionProfileData regionInfo, UserProfileData user, LoginResponse response)
263 { 389 {
264 try 390 try
265 { 391 {
266 response.SimAddress = Util.GetHostFromURL(regionInfo.serverURI).ToString(); 392 response.SimAddress = Util.GetHostFromURL(regionInfo.serverURI).ToString();
267 response.SimPort = uint.Parse(regionInfo.serverURI.Split(new char[] { '/', ':' })[4]); 393 response.SimPort = uint.Parse(regionInfo.serverURI.Split(new char[] { '/', ':' })[4]);
268 response.RegionX = regionInfo.regionLocX; 394 response.RegionX = regionInfo.regionLocX;
@@ -279,11 +405,11 @@ namespace OpenSim.Grid.UserServer.Modules
279 m_log.InfoFormat( 405 m_log.InfoFormat(
280 "[LOGIN]: Telling {0} @ {1},{2} ({3}) to prepare for client connection", 406 "[LOGIN]: Telling {0} @ {1},{2} ({3}) to prepare for client connection",
281 regionInfo.regionName, response.RegionX, response.RegionY, regionInfo.httpServerURI); 407 regionInfo.regionName, response.RegionX, response.RegionY, regionInfo.httpServerURI);
282 408
283 // Update agent with target sim 409 // Update agent with target sim
284 user.CurrentAgent.Region = regionInfo.UUID; 410 user.CurrentAgent.Region = regionInfo.UUID;
285 user.CurrentAgent.Handle = regionInfo.regionHandle; 411 user.CurrentAgent.Handle = regionInfo.regionHandle;
286 412
287 // Prepare notification 413 // Prepare notification
288 Hashtable loginParams = new Hashtable(); 414 Hashtable loginParams = new Hashtable();
289 loginParams["session_id"] = user.CurrentAgent.SessionID.ToString(); 415 loginParams["session_id"] = user.CurrentAgent.SessionID.ToString();
@@ -291,7 +417,7 @@ namespace OpenSim.Grid.UserServer.Modules
291 loginParams["firstname"] = user.FirstName; 417 loginParams["firstname"] = user.FirstName;
292 loginParams["lastname"] = user.SurName; 418 loginParams["lastname"] = user.SurName;
293 loginParams["agent_id"] = user.ID.ToString(); 419 loginParams["agent_id"] = user.ID.ToString();
294 loginParams["circuit_code"] = (Int32)Convert.ToUInt32(response.CircuitCode); 420 loginParams["circuit_code"] = (Int32) Convert.ToUInt32(response.CircuitCode);
295 loginParams["startpos_x"] = user.CurrentAgent.Position.X.ToString(); 421 loginParams["startpos_x"] = user.CurrentAgent.Position.X.ToString();
296 loginParams["startpos_y"] = user.CurrentAgent.Position.Y.ToString(); 422 loginParams["startpos_y"] = user.CurrentAgent.Position.Y.ToString();
297 loginParams["startpos_z"] = user.CurrentAgent.Position.Z.ToString(); 423 loginParams["startpos_z"] = user.CurrentAgent.Position.Z.ToString();
@@ -324,10 +450,10 @@ namespace OpenSim.Grid.UserServer.Modules
324 450
325 if (GridResp.Value != null) 451 if (GridResp.Value != null)
326 { 452 {
327 Hashtable resp = (Hashtable)GridResp.Value; 453 Hashtable resp = (Hashtable) GridResp.Value;
328 if (resp.ContainsKey("success")) 454 if (resp.ContainsKey("success"))
329 { 455 {
330 if ((string)resp["success"] == "FALSE") 456 if ((string) resp["success"] == "FALSE")
331 { 457 {
332 responseSuccess = false; 458 responseSuccess = false;
333 } 459 }
@@ -407,7 +533,7 @@ namespace OpenSim.Grid.UserServer.Modules
407 533
408 foreach (InventoryFolderBase InvFolder in folders) 534 foreach (InventoryFolderBase InvFolder in folders)
409 { 535 {
410 // m_log.DebugFormat("[LOGIN]: Received agent inventory folder {0}", InvFolder.name); 536// m_log.DebugFormat("[LOGIN]: Received agent inventory folder {0}", InvFolder.name);
411 537
412 if (InvFolder.ParentID == UUID.Zero) 538 if (InvFolder.ParentID == UUID.Zero)
413 { 539 {
@@ -416,8 +542,8 @@ namespace OpenSim.Grid.UserServer.Modules
416 TempHash = new Hashtable(); 542 TempHash = new Hashtable();
417 TempHash["name"] = InvFolder.Name; 543 TempHash["name"] = InvFolder.Name;
418 TempHash["parent_id"] = InvFolder.ParentID.ToString(); 544 TempHash["parent_id"] = InvFolder.ParentID.ToString();
419 TempHash["version"] = (Int32)InvFolder.Version; 545 TempHash["version"] = (Int32) InvFolder.Version;
420 TempHash["type_default"] = (Int32)InvFolder.Type; 546 TempHash["type_default"] = (Int32) InvFolder.Type;
421 TempHash["folder_id"] = InvFolder.ID.ToString(); 547 TempHash["folder_id"] = InvFolder.ID.ToString();
422 AgentInventoryArray.Add(TempHash); 548 AgentInventoryArray.Add(TempHash);
423 } 549 }
@@ -433,14 +559,14 @@ namespace OpenSim.Grid.UserServer.Modules
433 public XmlRpcResponse XmlRPCSetLoginParams(XmlRpcRequest request) 559 public XmlRpcResponse XmlRPCSetLoginParams(XmlRpcRequest request)
434 { 560 {
435 XmlRpcResponse response = new XmlRpcResponse(); 561 XmlRpcResponse response = new XmlRpcResponse();
436 Hashtable requestData = (Hashtable)request.Params[0]; 562 Hashtable requestData = (Hashtable) request.Params[0];
437 UserProfileData userProfile; 563 UserProfileData userProfile;
438 Hashtable responseData = new Hashtable(); 564 Hashtable responseData = new Hashtable();
439 565
440 UUID uid; 566 UUID uid;
441 string pass = requestData["password"].ToString(); 567 string pass = requestData["password"].ToString();
442 568
443 if (!UUID.TryParse((string)requestData["avatar_uuid"], out uid)) 569 if (!UUID.TryParse((string) requestData["avatar_uuid"], out uid))
444 { 570 {
445 responseData["error"] = "No authorization"; 571 responseData["error"] = "No authorization";
446 response.Value = responseData; 572 response.Value = responseData;
@@ -471,5 +597,6 @@ namespace OpenSim.Grid.UserServer.Modules
471 response.Value = responseData; 597 response.Value = responseData;
472 return response; 598 return response;
473 } 599 }
600
474 } 601 }
475} 602}