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

melanie
UbitUmarov 2016-11-28 04:29:57 +00:00
parent d3cd323f0c
commit 1aa4dbdb3f
3 changed files with 259 additions and 140 deletions

View File

@ -128,104 +128,104 @@ namespace OpenSim.Region.CoreModules.World.WorldMap
m_Clients.Add(remoteClient.AgentId); m_Clients.Add(remoteClient.AgentId);
} }
try OnMapNameRequest(remoteClient, mapName, flags);
{
OnMapNameRequest(remoteClient, mapName, flags);
}
finally
{
lock (m_Clients)
m_Clients.Remove(remoteClient.AgentId);
}
} }
private void OnMapNameRequest(IClientAPI remoteClient, string mapName, uint flags) private void OnMapNameRequest(IClientAPI remoteClient, string mapName, uint flags)
{ {
Util.FireAndForget(x => Util.FireAndForget(x =>
{ {
List<MapBlockData> blocks = new List<MapBlockData>(); try
if (mapName.Length < 3 || (mapName.EndsWith("#") && mapName.Length < 4))
{ {
List<MapBlockData> blocks = new List<MapBlockData>();
if (mapName.Length < 3 || (mapName.EndsWith("#") && mapName.Length < 4))
{
// final block, closing the search result
AddFinalBlock(blocks,mapName);
// flags are agent flags sent from the viewer.
// they have different values depending on different viewers, apparently
remoteClient.SendMapBlock(blocks, flags);
remoteClient.SendAlertMessage("Use a search string with at least 3 characters");
return;
}
//m_log.DebugFormat("MAP NAME=({0})", mapName);
// Hack to get around the fact that ll V3 now drops the port from the
// map name. See https://jira.secondlife.com/browse/VWR-28570
//
// Caller, use this magic form instead:
// secondlife://http|!!mygrid.com|8002|Region+Name/128/128
// or url encode if possible.
// the hacks we do with this viewer...
//
bool needOriginalName = false;
string mapNameOrig = mapName;
if (mapName.Contains("|"))
{
mapName = mapName.Replace('|', ':');
needOriginalName = true;
}
if (mapName.Contains("+"))
{
mapName = mapName.Replace('+', ' ');
needOriginalName = true;
}
if (mapName.Contains("!"))
{
mapName = mapName.Replace('!', '/');
needOriginalName = true;
}
if (mapName.Contains("."))
needOriginalName = true;
// try to fetch from GridServer
List<GridRegion> regionInfos = m_scene.GridService.GetRegionsByName(m_scene.RegionInfo.ScopeID, mapName, 20);
// if (regionInfos.Count == 0)
// remoteClient.SendAlertMessage("Hyperlink could not be established.");
//m_log.DebugFormat("[MAPSEARCHMODULE]: search {0} returned {1} regions", mapName, regionInfos.Count);
MapBlockData data;
if (regionInfos.Count > 0)
{
foreach (GridRegion info in regionInfos)
{
data = new MapBlockData();
data.Agents = 0;
data.Access = info.Access;
MapBlockData block = new MapBlockData();
WorldMap.MapBlockFromGridRegion(block, info, flags);
if (flags == 2 && regionInfos.Count == 1 && needOriginalName)
block.Name = mapNameOrig;
blocks.Add(block);
}
}
// final block, closing the search result // final block, closing the search result
AddFinalBlock(blocks,mapName); AddFinalBlock(blocks,mapNameOrig);
// flags are agent flags sent from the viewer. // flags are agent flags sent from the viewer.
// they have different values depending on different viewers, apparently // they have different values depending on different viewers, apparently
remoteClient.SendMapBlock(blocks, flags); remoteClient.SendMapBlock(blocks, flags);
remoteClient.SendAlertMessage("Use a search string with at least 3 characters");
return;
}
//m_log.DebugFormat("MAP NAME=({0})", mapName); // send extra user messages for V3
// because the UI is very confusing
// Hack to get around the fact that ll V3 now drops the port from the // while we don't fix the hard-coded urls
// map name. See https://jira.secondlife.com/browse/VWR-28570 if (flags == 2)
//
// Caller, use this magic form instead:
// secondlife://http|!!mygrid.com|8002|Region+Name/128/128
// or url encode if possible.
// the hacks we do with this viewer...
//
bool needOriginalName = false;
string mapNameOrig = mapName;
if (mapName.Contains("|"))
{
mapName = mapName.Replace('|', ':');
needOriginalName = true;
}
if (mapName.Contains("+"))
{
mapName = mapName.Replace('+', ' ');
needOriginalName = true;
}
if (mapName.Contains("!"))
{
mapName = mapName.Replace('!', '/');
needOriginalName = true;
}
if (mapName.Contains("."))
needOriginalName = true;
// try to fetch from GridServer
List<GridRegion> regionInfos = m_scene.GridService.GetRegionsByName(m_scene.RegionInfo.ScopeID, mapName, 20);
// if (regionInfos.Count == 0)
// remoteClient.SendAlertMessage("Hyperlink could not be established.");
//m_log.DebugFormat("[MAPSEARCHMODULE]: search {0} returned {1} regions", mapName, regionInfos.Count);
MapBlockData data;
if (regionInfos.Count > 0)
{
foreach (GridRegion info in regionInfos)
{ {
data = new MapBlockData(); if (regionInfos.Count == 0)
data.Agents = 0; remoteClient.SendAgentAlertMessage("No regions found with that name.", true);
data.Access = info.Access; // else if (regionInfos.Count == 1)
MapBlockData block = new MapBlockData(); // remoteClient.SendAgentAlertMessage("Region found!", false);
WorldMap.MapBlockFromGridRegion(block, info, flags);
if (flags == 2 && regionInfos.Count == 1 && needOriginalName)
block.Name = mapNameOrig;
blocks.Add(block);
} }
} }
finally
// final block, closing the search result
AddFinalBlock(blocks,mapNameOrig);
// flags are agent flags sent from the viewer.
// they have different values depending on different viewers, apparently
remoteClient.SendMapBlock(blocks, flags);
// send extra user messages for V3
// because the UI is very confusing
// while we don't fix the hard-coded urls
if (flags == 2)
{ {
if (regionInfos.Count == 0) lock (m_Clients)
remoteClient.SendAgentAlertMessage("No regions found with that name.", true); m_Clients.Remove(remoteClient.AgentId);
// else if (regionInfos.Count == 1)
// remoteClient.SendAgentAlertMessage("Region found!", false);
} }
}); });
} }

View File

@ -579,7 +579,70 @@ namespace OpenSim.Services.GridService
int count = 0; int count = 0;
List<GridRegion> rinfos = new List<GridRegion>(); List<GridRegion> rinfos = new List<GridRegion>();
if (rdatas != null) if (count < maxNumber && m_AllowHypergridMapSearch && name.Contains("."))
{
string regionURI = "";
string regionName = "";
if(!m_HypergridLinker.buildHGRegionURI(name, out regionURI, out regionName))
return null;
string mapname = regionURI + regionName;
bool haveMatch = false;
if (rdatas != null && (rdatas.Count > 0))
{
// m_log.DebugFormat("[GRID SERVICE]: Found {0} regions", rdatas.Count);
foreach (RegionData rdata in rdatas)
{
if (count++ < maxNumber)
rinfos.Add(RegionData2RegionInfo(rdata));
if(rdata.RegionName == mapname)
{
haveMatch = true;
if(count == maxNumber)
{
rinfos.RemoveAt(count - 1);
rinfos.Add(RegionData2RegionInfo(rdata));
}
}
}
if(haveMatch)
return rinfos;
}
rdatas = m_Database.Get(Util.EscapeForLike(mapname)+ "%", scopeID);
if (rdatas != null && (rdatas.Count > 0))
{
// m_log.DebugFormat("[GRID SERVICE]: Found {0} regions", rdatas.Count);
foreach (RegionData rdata in rdatas)
{
if (count++ < maxNumber)
rinfos.Add(RegionData2RegionInfo(rdata));
if(rdata.RegionName == mapname)
{
haveMatch = true;
if(count == maxNumber)
{
rinfos.RemoveAt(count - 1);
rinfos.Add(RegionData2RegionInfo(rdata));
break;
}
}
}
if(haveMatch)
return rinfos;
}
string HGname = regionURI +" "+ regionName;
GridRegion r = m_HypergridLinker.LinkRegion(scopeID, HGname);
if (r != null)
{
if( count == maxNumber)
rinfos.RemoveAt(count - 1);
rinfos.Add(r);
}
}
else if (rdatas != null && (rdatas.Count > 0))
{ {
// m_log.DebugFormat("[GRID SERVICE]: Found {0} regions", rdatas.Count); // m_log.DebugFormat("[GRID SERVICE]: Found {0} regions", rdatas.Count);
foreach (RegionData rdata in rdatas) foreach (RegionData rdata in rdatas)
@ -589,13 +652,6 @@ namespace OpenSim.Services.GridService
} }
} }
if (m_AllowHypergridMapSearch && (rdatas == null || (rdatas != null && rdatas.Count == 0)))
{
GridRegion r = GetHypergridRegionByName(scopeID, name);
if (r != null)
rinfos.Add(r);
}
return rinfos; return rinfos;
} }
@ -608,7 +664,20 @@ namespace OpenSim.Services.GridService
protected GridRegion GetHypergridRegionByName(UUID scopeID, string name) protected GridRegion GetHypergridRegionByName(UUID scopeID, string name)
{ {
if (name.Contains(".")) if (name.Contains("."))
return m_HypergridLinker.LinkRegion(scopeID, name); {
string regionURI = "";
string regionName = "";
if(!m_HypergridLinker.buildHGRegionURI(name, out regionURI, out regionName))
return null;
string mapname = regionURI + regionName;
List<RegionData> rdatas = m_Database.Get(Util.EscapeForLike(mapname), scopeID);
if ((rdatas != null) && (rdatas.Count > 0))
return RegionData2RegionInfo(rdatas[0]); // get the first
string HGname = regionURI +" "+ regionName;
return m_HypergridLinker.LinkRegion(scopeID, HGname);
}
else else
return null; return null;
} }

View File

@ -191,14 +191,14 @@ namespace OpenSim.Services.GridService
return TryLinkRegionToCoords(scopeID, mapName, xloc, yloc, UUID.Zero, out reason); return TryLinkRegionToCoords(scopeID, mapName, xloc, yloc, UUID.Zero, out reason);
} }
public GridRegion TryLinkRegionToCoords(UUID scopeID, string mapName, int xloc, int yloc, UUID ownerID, out string reason) public bool buildHGRegionURI(string inputName, out string serverURI, out string regionName)
{ {
reason = string.Empty; serverURI = string.Empty;
GridRegion regInfo = null; regionName = string.Empty;
mapName = mapName.Trim(); inputName = inputName.Trim();
if (!mapName.StartsWith("http") && !mapName.StartsWith("https")) if (!inputName.StartsWith("http") && !inputName.StartsWith("https"))
{ {
// Formats: grid.example.com:8002:region name // Formats: grid.example.com:8002:region name
// grid.example.com:region name // grid.example.com:region name
@ -207,38 +207,59 @@ namespace OpenSim.Services.GridService
string host; string host;
uint port = 80; uint port = 80;
string regionName = "";
string[] parts = mapName.Split(new char[] { ':' }); string[] parts = inputName.Split(new char[] { ':' });
int indx;
if (parts.Length == 0) if(parts.Length == 0)
return false;
if (parts.Length == 1)
{ {
reason = "Wrong format for link-region"; indx = inputName.IndexOf('/');
return null; if (indx < 0)
serverURI = "http://"+ inputName + "/";
else
{
serverURI = "http://"+ inputName.Substring(0,indx + 1);
if(indx + 2 < inputName.Length)
regionName = inputName.Substring(indx + 1);
}
} }
else
host = parts[0];
if (parts.Length >= 2)
{ {
// If it's a number then assume it's a port. Otherwise, it's a region name. host = parts[0];
if (!UInt32.TryParse(parts[1], out port))
regionName = parts[1]; if (parts.Length >= 2)
} {
indx = parts[1].IndexOf('/');
if(indx < 0)
{
// If it's a number then assume it's a port. Otherwise, it's a region name.
if (!UInt32.TryParse(parts[1], out port))
{
port = 80;
regionName = parts[1];
}
}
else
{
string portstr = parts[1].Substring(0, indx);
if(indx + 2 < parts[1].Length)
regionName = parts[1].Substring(indx + 1);
if (!UInt32.TryParse(portstr, out port))
port = 80;
}
}
// always take the last one
if (parts.Length >= 3)
{
regionName = parts[2];
}
// always take the last one if(port == 80)
if (parts.Length >= 3) serverURI = "http://"+ host + "/";
{ else
regionName = parts[2]; serverURI = "http://"+ host +":"+ port.ToString() + "/";
} }
string serverURI = "http://"+ host +":"+ port.ToString() + "/";
// bool success = TryCreateLink(scopeID, xloc, yloc, regionName, port, host, ownerID, out regInfo, out reason);
if(TryCreateLink(scopeID, xloc, yloc, regionName, 0, null, serverURI, ownerID, out regInfo, out reason))
{
regInfo.RegionName = mapName;
return regInfo;
}
} }
else else
{ {
@ -246,32 +267,61 @@ namespace OpenSim.Services.GridService
// http://grid.example.com "region name" // http://grid.example.com "region name"
// http://grid.example.com // http://grid.example.com
string serverURI; string[] parts = inputName.Split(new char[] { ' ' });
string regionName = "";
string[] parts = mapName.Split(new char[] { ' ' });
if (parts.Length == 0) if (parts.Length == 0)
{ return false;
reason = "Wrong format for link-region";
return null;
}
serverURI = parts[0]; serverURI = parts[0];
if (!serverURI.EndsWith("/"))
serverURI = serverURI + "/";
if (parts.Length >= 2) int indx = serverURI.LastIndexOf('/');
if(indx > 10)
{ {
regionName = mapName.Substring(serverURI.Length); if(indx + 2 < inputName.Length)
regionName = regionName.Trim(new char[] { '"', ' ' }); regionName = inputName.Substring(indx + 1);
serverURI = inputName.Substring(0, indx + 1);
} }
else if (parts.Length >= 2)
{
regionName = inputName.Substring(serverURI.Length);
}
}
if (TryCreateLink(scopeID, xloc, yloc, regionName, 0, null, serverURI, ownerID, out regInfo, out reason)) // use better code for sanity check
{ Uri uri;
regInfo.RegionName = mapName; try
return regInfo; {
} uri = new Uri(serverURI);
}
catch
{
return false;
}
if(!string.IsNullOrEmpty(regionName))
regionName = regionName.Trim(new char[] { '"', ' ' });
serverURI = uri.AbsoluteUri;
return true;
}
public GridRegion TryLinkRegionToCoords(UUID scopeID, string mapName, int xloc, int yloc, UUID ownerID, out string reason)
{
reason = string.Empty;
GridRegion regInfo = null;
string serverURI = string.Empty;
string regionName = string.Empty;
if(!buildHGRegionURI(mapName, out serverURI, out regionName))
{
reason = "Wrong URI format for link-region";
return null;
}
if (TryCreateLink(scopeID, xloc, yloc, regionName, 0, null, serverURI, ownerID, out regInfo, out reason))
{
regInfo.RegionName = serverURI + regionName;
return regInfo;
} }
return null; return null;