aboutsummaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
authorUbitUmarov2016-11-28 04:29:57 +0000
committerUbitUmarov2016-11-28 04:29:57 +0000
commit1aa4dbdb3fd5c3c8382dad53d6b7c105fb7cec85 (patch)
tree46738fbb9799ffeb47a7b6f3eb574c4c5c463302
parentHG on links request build the URI in http format with a / at end, this should... (diff)
downloadopensim-SC-1aa4dbdb3fd5c3c8382dad53d6b7c105fb7cec85.zip
opensim-SC-1aa4dbdb3fd5c3c8382dad53d6b7c105fb7cec85.tar.gz
opensim-SC-1aa4dbdb3fd5c3c8382dad53d6b7c105fb7cec85.tar.bz2
opensim-SC-1aa4dbdb3fd5c3c8382dad53d6b7c105fb7cec85.tar.xz
increase HG mapsearch spargetti; add more flexibility on input uri formats. To find regions in memory for a grid the http format needs to be used, because aditional compares made by viewers
-rw-r--r--OpenSim/Region/CoreModules/World/WorldMap/MapSearchModule.cs156
-rw-r--r--OpenSim/Services/GridService/GridService.cs87
-rw-r--r--OpenSim/Services/GridService/HypergridLinker.cs148
3 files changed, 255 insertions, 136 deletions
diff --git a/OpenSim/Region/CoreModules/World/WorldMap/MapSearchModule.cs b/OpenSim/Region/CoreModules/World/WorldMap/MapSearchModule.cs
index 7370156..b1234fe 100644
--- a/OpenSim/Region/CoreModules/World/WorldMap/MapSearchModule.cs
+++ b/OpenSim/Region/CoreModules/World/WorldMap/MapSearchModule.cs
@@ -128,104 +128,104 @@ namespace OpenSim.Region.CoreModules.World.WorldMap
128 m_Clients.Add(remoteClient.AgentId); 128 m_Clients.Add(remoteClient.AgentId);
129 } 129 }
130 130
131 try 131 OnMapNameRequest(remoteClient, mapName, flags);
132 {
133 OnMapNameRequest(remoteClient, mapName, flags);
134 }
135 finally
136 {
137 lock (m_Clients)
138 m_Clients.Remove(remoteClient.AgentId);
139 }
140 } 132 }
141 133
142 private void OnMapNameRequest(IClientAPI remoteClient, string mapName, uint flags) 134 private void OnMapNameRequest(IClientAPI remoteClient, string mapName, uint flags)
143 { 135 {
144 Util.FireAndForget(x => 136 Util.FireAndForget(x =>
145 { 137 {
146 List<MapBlockData> blocks = new List<MapBlockData>(); 138 try
147 if (mapName.Length < 3 || (mapName.EndsWith("#") && mapName.Length < 4))
148 { 139 {
149 // final block, closing the search result 140 List<MapBlockData> blocks = new List<MapBlockData>();
150 AddFinalBlock(blocks,mapName); 141 if (mapName.Length < 3 || (mapName.EndsWith("#") && mapName.Length < 4))
142 {
143 // final block, closing the search result
144 AddFinalBlock(blocks,mapName);
151 145
152 // flags are agent flags sent from the viewer. 146 // flags are agent flags sent from the viewer.
153 // they have different values depending on different viewers, apparently 147 // they have different values depending on different viewers, apparently
154 remoteClient.SendMapBlock(blocks, flags); 148 remoteClient.SendMapBlock(blocks, flags);
155 remoteClient.SendAlertMessage("Use a search string with at least 3 characters"); 149 remoteClient.SendAlertMessage("Use a search string with at least 3 characters");
156 return; 150 return;
157 } 151 }
158 152
159 //m_log.DebugFormat("MAP NAME=({0})", mapName); 153 //m_log.DebugFormat("MAP NAME=({0})", mapName);
160 154
161 // Hack to get around the fact that ll V3 now drops the port from the 155 // Hack to get around the fact that ll V3 now drops the port from the
162 // map name. See https://jira.secondlife.com/browse/VWR-28570 156 // map name. See https://jira.secondlife.com/browse/VWR-28570
163 // 157 //
164 // Caller, use this magic form instead: 158 // Caller, use this magic form instead:
165 // secondlife://http|!!mygrid.com|8002|Region+Name/128/128 159 // secondlife://http|!!mygrid.com|8002|Region+Name/128/128
166 // or url encode if possible. 160 // or url encode if possible.
167 // the hacks we do with this viewer... 161 // the hacks we do with this viewer...
168 // 162 //
169 bool needOriginalName = false; 163 bool needOriginalName = false;
170 string mapNameOrig = mapName; 164 string mapNameOrig = mapName;
171 if (mapName.Contains("|")) 165 if (mapName.Contains("|"))
172 { 166 {
173 mapName = mapName.Replace('|', ':'); 167 mapName = mapName.Replace('|', ':');
174 needOriginalName = true; 168 needOriginalName = true;
175 } 169 }
176 if (mapName.Contains("+")) 170 if (mapName.Contains("+"))
177 { 171 {
178 mapName = mapName.Replace('+', ' '); 172 mapName = mapName.Replace('+', ' ');
179 needOriginalName = true; 173 needOriginalName = true;
180 } 174 }
181 if (mapName.Contains("!")) 175 if (mapName.Contains("!"))
182 { 176 {
183 mapName = mapName.Replace('!', '/'); 177 mapName = mapName.Replace('!', '/');
184 needOriginalName = true; 178 needOriginalName = true;
185 } 179 }
186 if (mapName.Contains(".")) 180 if (mapName.Contains("."))
187 needOriginalName = true; 181 needOriginalName = true;
188 182
189 // try to fetch from GridServer 183 // try to fetch from GridServer
190 List<GridRegion> regionInfos = m_scene.GridService.GetRegionsByName(m_scene.RegionInfo.ScopeID, mapName, 20); 184 List<GridRegion> regionInfos = m_scene.GridService.GetRegionsByName(m_scene.RegionInfo.ScopeID, mapName, 20);
191 // if (regionInfos.Count == 0) 185 // if (regionInfos.Count == 0)
192 // remoteClient.SendAlertMessage("Hyperlink could not be established."); 186 // remoteClient.SendAlertMessage("Hyperlink could not be established.");
193 187
194 //m_log.DebugFormat("[MAPSEARCHMODULE]: search {0} returned {1} regions", mapName, regionInfos.Count); 188 //m_log.DebugFormat("[MAPSEARCHMODULE]: search {0} returned {1} regions", mapName, regionInfos.Count);
195 189
196 MapBlockData data; 190 MapBlockData data;
197 if (regionInfos.Count > 0) 191 if (regionInfos.Count > 0)
198 {
199 foreach (GridRegion info in regionInfos)
200 { 192 {
201 data = new MapBlockData(); 193 foreach (GridRegion info in regionInfos)
202 data.Agents = 0; 194 {
203 data.Access = info.Access; 195 data = new MapBlockData();
204 MapBlockData block = new MapBlockData(); 196 data.Agents = 0;
205 WorldMap.MapBlockFromGridRegion(block, info, flags); 197 data.Access = info.Access;
198 MapBlockData block = new MapBlockData();
199 WorldMap.MapBlockFromGridRegion(block, info, flags);
206 200
207 if (flags == 2 && regionInfos.Count == 1 && needOriginalName) 201 if (flags == 2 && regionInfos.Count == 1 && needOriginalName)
208 block.Name = mapNameOrig; 202 block.Name = mapNameOrig;
209 blocks.Add(block); 203 blocks.Add(block);
204 }
210 } 205 }
211 }
212 206
213 // final block, closing the search result 207 // final block, closing the search result
214 AddFinalBlock(blocks,mapNameOrig); 208 AddFinalBlock(blocks,mapNameOrig);
215 209
216 // flags are agent flags sent from the viewer. 210 // flags are agent flags sent from the viewer.
217 // they have different values depending on different viewers, apparently 211 // they have different values depending on different viewers, apparently
218 remoteClient.SendMapBlock(blocks, flags); 212 remoteClient.SendMapBlock(blocks, flags);
219 213
220 // send extra user messages for V3 214 // send extra user messages for V3
221 // because the UI is very confusing 215 // because the UI is very confusing
222 // while we don't fix the hard-coded urls 216 // while we don't fix the hard-coded urls
223 if (flags == 2) 217 if (flags == 2)
218 {
219 if (regionInfos.Count == 0)
220 remoteClient.SendAgentAlertMessage("No regions found with that name.", true);
221 // else if (regionInfos.Count == 1)
222 // remoteClient.SendAgentAlertMessage("Region found!", false);
223 }
224 }
225 finally
224 { 226 {
225 if (regionInfos.Count == 0) 227 lock (m_Clients)
226 remoteClient.SendAgentAlertMessage("No regions found with that name.", true); 228 m_Clients.Remove(remoteClient.AgentId);
227// else if (regionInfos.Count == 1)
228// remoteClient.SendAgentAlertMessage("Region found!", false);
229 } 229 }
230 }); 230 });
231 } 231 }
diff --git a/OpenSim/Services/GridService/GridService.cs b/OpenSim/Services/GridService/GridService.cs
index a11cae1..66c918f 100644
--- a/OpenSim/Services/GridService/GridService.cs
+++ b/OpenSim/Services/GridService/GridService.cs
@@ -579,7 +579,70 @@ namespace OpenSim.Services.GridService
579 int count = 0; 579 int count = 0;
580 List<GridRegion> rinfos = new List<GridRegion>(); 580 List<GridRegion> rinfos = new List<GridRegion>();
581 581
582 if (rdatas != null) 582 if (count < maxNumber && m_AllowHypergridMapSearch && name.Contains("."))
583 {
584 string regionURI = "";
585 string regionName = "";
586 if(!m_HypergridLinker.buildHGRegionURI(name, out regionURI, out regionName))
587 return null;
588
589 string mapname = regionURI + regionName;
590 bool haveMatch = false;
591
592 if (rdatas != null && (rdatas.Count > 0))
593 {
594// m_log.DebugFormat("[GRID SERVICE]: Found {0} regions", rdatas.Count);
595 foreach (RegionData rdata in rdatas)
596 {
597 if (count++ < maxNumber)
598 rinfos.Add(RegionData2RegionInfo(rdata));
599 if(rdata.RegionName == mapname)
600 {
601 haveMatch = true;
602 if(count == maxNumber)
603 {
604 rinfos.RemoveAt(count - 1);
605 rinfos.Add(RegionData2RegionInfo(rdata));
606 }
607 }
608 }
609 if(haveMatch)
610 return rinfos;
611 }
612
613 rdatas = m_Database.Get(Util.EscapeForLike(mapname)+ "%", scopeID);
614 if (rdatas != null && (rdatas.Count > 0))
615 {
616// m_log.DebugFormat("[GRID SERVICE]: Found {0} regions", rdatas.Count);
617 foreach (RegionData rdata in rdatas)
618 {
619 if (count++ < maxNumber)
620 rinfos.Add(RegionData2RegionInfo(rdata));
621 if(rdata.RegionName == mapname)
622 {
623 haveMatch = true;
624 if(count == maxNumber)
625 {
626 rinfos.RemoveAt(count - 1);
627 rinfos.Add(RegionData2RegionInfo(rdata));
628 break;
629 }
630 }
631 }
632 if(haveMatch)
633 return rinfos;
634 }
635
636 string HGname = regionURI +" "+ regionName;
637 GridRegion r = m_HypergridLinker.LinkRegion(scopeID, HGname);
638 if (r != null)
639 {
640 if( count == maxNumber)
641 rinfos.RemoveAt(count - 1);
642 rinfos.Add(r);
643 }
644 }
645 else if (rdatas != null && (rdatas.Count > 0))
583 { 646 {
584// m_log.DebugFormat("[GRID SERVICE]: Found {0} regions", rdatas.Count); 647// m_log.DebugFormat("[GRID SERVICE]: Found {0} regions", rdatas.Count);
585 foreach (RegionData rdata in rdatas) 648 foreach (RegionData rdata in rdatas)
@@ -589,13 +652,6 @@ namespace OpenSim.Services.GridService
589 } 652 }
590 } 653 }
591 654
592 if (m_AllowHypergridMapSearch && (rdatas == null || (rdatas != null && rdatas.Count == 0)))
593 {
594 GridRegion r = GetHypergridRegionByName(scopeID, name);
595 if (r != null)
596 rinfos.Add(r);
597 }
598
599 return rinfos; 655 return rinfos;
600 } 656 }
601 657
@@ -608,7 +664,20 @@ namespace OpenSim.Services.GridService
608 protected GridRegion GetHypergridRegionByName(UUID scopeID, string name) 664 protected GridRegion GetHypergridRegionByName(UUID scopeID, string name)
609 { 665 {
610 if (name.Contains(".")) 666 if (name.Contains("."))
611 return m_HypergridLinker.LinkRegion(scopeID, name); 667 {
668 string regionURI = "";
669 string regionName = "";
670 if(!m_HypergridLinker.buildHGRegionURI(name, out regionURI, out regionName))
671 return null;
672
673 string mapname = regionURI + regionName;
674 List<RegionData> rdatas = m_Database.Get(Util.EscapeForLike(mapname), scopeID);
675 if ((rdatas != null) && (rdatas.Count > 0))
676 return RegionData2RegionInfo(rdatas[0]); // get the first
677
678 string HGname = regionURI +" "+ regionName;
679 return m_HypergridLinker.LinkRegion(scopeID, HGname);
680 }
612 else 681 else
613 return null; 682 return null;
614 } 683 }
diff --git a/OpenSim/Services/GridService/HypergridLinker.cs b/OpenSim/Services/GridService/HypergridLinker.cs
index 2869349..e00025b 100644
--- a/OpenSim/Services/GridService/HypergridLinker.cs
+++ b/OpenSim/Services/GridService/HypergridLinker.cs
@@ -191,14 +191,14 @@ namespace OpenSim.Services.GridService
191 return TryLinkRegionToCoords(scopeID, mapName, xloc, yloc, UUID.Zero, out reason); 191 return TryLinkRegionToCoords(scopeID, mapName, xloc, yloc, UUID.Zero, out reason);
192 } 192 }
193 193
194 public GridRegion TryLinkRegionToCoords(UUID scopeID, string mapName, int xloc, int yloc, UUID ownerID, out string reason) 194 public bool buildHGRegionURI(string inputName, out string serverURI, out string regionName)
195 { 195 {
196 reason = string.Empty; 196 serverURI = string.Empty;
197 GridRegion regInfo = null; 197 regionName = string.Empty;
198 198
199 mapName = mapName.Trim(); 199 inputName = inputName.Trim();
200 200
201 if (!mapName.StartsWith("http") && !mapName.StartsWith("https")) 201 if (!inputName.StartsWith("http") && !inputName.StartsWith("https"))
202 { 202 {
203 // Formats: grid.example.com:8002:region name 203 // Formats: grid.example.com:8002:region name
204 // grid.example.com:region name 204 // grid.example.com:region name
@@ -207,38 +207,59 @@ namespace OpenSim.Services.GridService
207 207
208 string host; 208 string host;
209 uint port = 80; 209 uint port = 80;
210 string regionName = "";
211
212 string[] parts = mapName.Split(new char[] { ':' });
213
214 if (parts.Length == 0)
215 {
216 reason = "Wrong format for link-region";
217 return null;
218 }
219 210
220 host = parts[0]; 211 string[] parts = inputName.Split(new char[] { ':' });
221 212 int indx;
222 if (parts.Length >= 2) 213 if(parts.Length == 0)
214 return false;
215 if (parts.Length == 1)
223 { 216 {
224 // If it's a number then assume it's a port. Otherwise, it's a region name. 217 indx = inputName.IndexOf('/');
225 if (!UInt32.TryParse(parts[1], out port)) 218 if (indx < 0)
226 regionName = parts[1]; 219 serverURI = "http://"+ inputName + "/";
220 else
221 {
222 serverURI = "http://"+ inputName.Substring(0,indx + 1);
223 if(indx + 2 < inputName.Length)
224 regionName = inputName.Substring(indx + 1);
225 }
227 } 226 }
228 227 else
229 // always take the last one
230 if (parts.Length >= 3)
231 { 228 {
232 regionName = parts[2]; 229 host = parts[0];
233 } 230
231 if (parts.Length >= 2)
232 {
233 indx = parts[1].IndexOf('/');
234 if(indx < 0)
235 {
236 // If it's a number then assume it's a port. Otherwise, it's a region name.
237 if (!UInt32.TryParse(parts[1], out port))
238 {
239 port = 80;
240 regionName = parts[1];
241 }
242 }
243 else
244 {
245 string portstr = parts[1].Substring(0, indx);
246 if(indx + 2 < parts[1].Length)
247 regionName = parts[1].Substring(indx + 1);
248 if (!UInt32.TryParse(portstr, out port))
249 port = 80;
250 }
251 }
252 // always take the last one
253 if (parts.Length >= 3)
254 {
255 regionName = parts[2];
256 }
234 257
235 string serverURI = "http://"+ host +":"+ port.ToString() + "/"; 258 if(port == 80)
236// bool success = TryCreateLink(scopeID, xloc, yloc, regionName, port, host, ownerID, out regInfo, out reason); 259 serverURI = "http://"+ host + "/";
237 if(TryCreateLink(scopeID, xloc, yloc, regionName, 0, null, serverURI, ownerID, out regInfo, out reason)) 260 else
238 { 261 serverURI = "http://"+ host +":"+ port.ToString() + "/";
239 regInfo.RegionName = mapName; 262 }
240 return regInfo;
241 }
242 } 263 }
243 else 264 else
244 { 265 {
@@ -246,34 +267,63 @@ namespace OpenSim.Services.GridService
246 // http://grid.example.com "region name" 267 // http://grid.example.com "region name"
247 // http://grid.example.com 268 // http://grid.example.com
248 269
249 string serverURI; 270 string[] parts = inputName.Split(new char[] { ' ' });
250 string regionName = "";
251
252 string[] parts = mapName.Split(new char[] { ' ' });
253 271
254 if (parts.Length == 0) 272 if (parts.Length == 0)
255 { 273 return false;
256 reason = "Wrong format for link-region";
257 return null;
258 }
259 274
260 serverURI = parts[0]; 275 serverURI = parts[0];
261 if (!serverURI.EndsWith("/"))
262 serverURI = serverURI + "/";
263 276
264 if (parts.Length >= 2) 277 int indx = serverURI.LastIndexOf('/');
278 if(indx > 10)
265 { 279 {
266 regionName = mapName.Substring(serverURI.Length); 280 if(indx + 2 < inputName.Length)
267 regionName = regionName.Trim(new char[] { '"', ' ' }); 281 regionName = inputName.Substring(indx + 1);
282 serverURI = inputName.Substring(0, indx + 1);
268 } 283 }
269 284 else if (parts.Length >= 2)
270 if (TryCreateLink(scopeID, xloc, yloc, regionName, 0, null, serverURI, ownerID, out regInfo, out reason))
271 { 285 {
272 regInfo.RegionName = mapName; 286 regionName = inputName.Substring(serverURI.Length);
273 return regInfo;
274 } 287 }
275 } 288 }
276 289
290 // use better code for sanity check
291 Uri uri;
292 try
293 {
294 uri = new Uri(serverURI);
295 }
296 catch
297 {
298 return false;
299 }
300
301 if(!string.IsNullOrEmpty(regionName))
302 regionName = regionName.Trim(new char[] { '"', ' ' });
303 serverURI = uri.AbsoluteUri;
304 return true;
305 }
306
307 public GridRegion TryLinkRegionToCoords(UUID scopeID, string mapName, int xloc, int yloc, UUID ownerID, out string reason)
308 {
309 reason = string.Empty;
310 GridRegion regInfo = null;
311
312 string serverURI = string.Empty;
313 string regionName = string.Empty;
314
315 if(!buildHGRegionURI(mapName, out serverURI, out regionName))
316 {
317 reason = "Wrong URI format for link-region";
318 return null;
319 }
320
321 if (TryCreateLink(scopeID, xloc, yloc, regionName, 0, null, serverURI, ownerID, out regInfo, out reason))
322 {
323 regInfo.RegionName = serverURI + regionName;
324 return regInfo;
325 }
326
277 return null; 327 return null;
278 } 328 }
279 329