diff options
Diffstat (limited to 'OpenSim/Region/CoreModules/World/WorldMap/MapSearchModule.cs')
-rw-r--r-- | OpenSim/Region/CoreModules/World/WorldMap/MapSearchModule.cs | 148 |
1 files changed, 78 insertions, 70 deletions
diff --git a/OpenSim/Region/CoreModules/World/WorldMap/MapSearchModule.cs b/OpenSim/Region/CoreModules/World/WorldMap/MapSearchModule.cs index 708a9a2..14deeb6 100644 --- a/OpenSim/Region/CoreModules/World/WorldMap/MapSearchModule.cs +++ b/OpenSim/Region/CoreModules/World/WorldMap/MapSearchModule.cs | |||
@@ -128,85 +128,93 @@ namespace OpenSim.Region.CoreModules.World.WorldMap | |||
128 | 128 | ||
129 | private void OnMapNameRequest(IClientAPI remoteClient, string mapName, uint flags) | 129 | private void OnMapNameRequest(IClientAPI remoteClient, string mapName, uint flags) |
130 | { | 130 | { |
131 | List<MapBlockData> blocks = new List<MapBlockData>(); | 131 | Util.FireAndForget(x => |
132 | MapBlockData data; | ||
133 | if (mapName.Length < 3 || (mapName.EndsWith("#") && mapName.Length < 4)) | ||
134 | { | 132 | { |
133 | if (mapName.Length < 2) | ||
134 | { | ||
135 | remoteClient.SendAlertMessage("Use a search string with at least 2 characters"); | ||
136 | return; | ||
137 | } | ||
138 | |||
139 | //m_log.DebugFormat("MAP NAME=({0})", mapName); | ||
140 | |||
141 | // Hack to get around the fact that ll V3 now drops the port from the | ||
142 | // map name. See https://jira.secondlife.com/browse/VWR-28570 | ||
143 | // | ||
144 | // Caller, use this magic form instead: | ||
145 | // secondlife://http|!!mygrid.com|8002|Region+Name/128/128 | ||
146 | // or url encode if possible. | ||
147 | // the hacks we do with this viewer... | ||
148 | // | ||
149 | string mapNameOrig = mapName; | ||
150 | if (mapName.Contains("|")) | ||
151 | mapName = mapName.Replace('|', ':'); | ||
152 | if (mapName.Contains("+")) | ||
153 | mapName = mapName.Replace('+', ' '); | ||
154 | if (mapName.Contains("!")) | ||
155 | mapName = mapName.Replace('!', '/'); | ||
156 | |||
157 | // try to fetch from GridServer | ||
158 | List<GridRegion> regionInfos = m_scene.GridService.GetRegionsByName(m_scene.RegionInfo.ScopeID, mapName, 20); | ||
159 | // if (regionInfos.Count == 0) | ||
160 | // remoteClient.SendAlertMessage("Hyperlink could not be established."); | ||
161 | |||
162 | //m_log.DebugFormat("[MAPSEARCHMODULE]: search {0} returned {1} regions", mapName, regionInfos.Count); | ||
163 | List<MapBlockData> blocks = new List<MapBlockData>(); | ||
164 | |||
165 | MapBlockData data; | ||
166 | if (regionInfos.Count > 0) | ||
167 | { | ||
168 | foreach (GridRegion info in regionInfos) | ||
169 | { | ||
170 | data = new MapBlockData(); | ||
171 | data.Agents = 0; | ||
172 | data.Access = info.Access; | ||
173 | if (flags == 2) // V2 sends this | ||
174 | data.MapImageId = UUID.Zero; | ||
175 | else | ||
176 | data.MapImageId = info.TerrainImage; | ||
177 | // ugh! V2-3 is very sensitive about the result being | ||
178 | // exactly the same as the requested name | ||
179 | if (regionInfos.Count == 1 && mapNameOrig.Contains("|") || mapNameOrig.Contains("+")) | ||
180 | data.Name = mapNameOrig; | ||
181 | else | ||
182 | data.Name = info.RegionName; | ||
183 | data.RegionFlags = 0; // TODO not used? | ||
184 | data.WaterHeight = 0; // not used | ||
185 | data.X = (ushort)(info.RegionLocX / Constants.RegionSize); | ||
186 | data.Y = (ushort)(info.RegionLocY / Constants.RegionSize); | ||
187 | blocks.Add(data); | ||
188 | } | ||
189 | } | ||
190 | |||
135 | // final block, closing the search result | 191 | // final block, closing the search result |
136 | AddFinalBlock(blocks); | 192 | data = new MapBlockData(); |
193 | data.Agents = 0; | ||
194 | data.Access = 255; | ||
195 | data.MapImageId = UUID.Zero; | ||
196 | data.Name = mapName; | ||
197 | data.RegionFlags = 0; | ||
198 | data.WaterHeight = 0; // not used | ||
199 | data.X = 0; | ||
200 | data.Y = 0; | ||
201 | blocks.Add(data); | ||
137 | 202 | ||
138 | // flags are agent flags sent from the viewer. | 203 | // flags are agent flags sent from the viewer. |
139 | // they have different values depending on different viewers, apparently | 204 | // they have different values depending on different viewers, apparently |
140 | remoteClient.SendMapBlock(blocks, flags); | 205 | remoteClient.SendMapBlock(blocks, flags); |
141 | remoteClient.SendAlertMessage("Use a search string with at least 3 characters"); | ||
142 | return; | ||
143 | } | ||
144 | |||
145 | 206 | ||
146 | //m_log.DebugFormat("MAP NAME=({0})", mapName); | 207 | // send extra user messages for V3 |
147 | 208 | // because the UI is very confusing | |
148 | // Hack to get around the fact that ll V3 now drops the port from the | 209 | // while we don't fix the hard-coded urls |
149 | // map name. See https://jira.secondlife.com/browse/VWR-28570 | 210 | if (flags == 2) |
150 | // | ||
151 | // Caller, use this magic form instead: | ||
152 | // secondlife://http|!!mygrid.com|8002|Region+Name/128/128 | ||
153 | // or url encode if possible. | ||
154 | // the hacks we do with this viewer... | ||
155 | // | ||
156 | string mapNameOrig = mapName; | ||
157 | if (mapName.Contains("|")) | ||
158 | mapName = mapName.Replace('|', ':'); | ||
159 | if (mapName.Contains("+")) | ||
160 | mapName = mapName.Replace('+', ' '); | ||
161 | if (mapName.Contains("!")) | ||
162 | mapName = mapName.Replace('!', '/'); | ||
163 | |||
164 | // try to fetch from GridServer | ||
165 | List<GridRegion> regionInfos = m_scene.GridService.GetRegionsByName(m_scene.RegionInfo.ScopeID, mapName, 20); | ||
166 | |||
167 | m_log.DebugFormat("[MAPSEARCHMODULE]: search {0} returned {1} regions. Flags={2}", mapName, regionInfos.Count, flags); | ||
168 | if (regionInfos.Count > 0) | ||
169 | { | ||
170 | foreach (GridRegion info in regionInfos) | ||
171 | { | 211 | { |
172 | data = new MapBlockData(); | 212 | if (regionInfos.Count == 0) |
173 | data.Agents = 0; | 213 | remoteClient.SendAgentAlertMessage("No regions found with that name.", true); |
174 | data.Access = info.Access; | 214 | // else if (regionInfos.Count == 1) |
175 | if (flags == 2) // V2 sends this | 215 | // remoteClient.SendAgentAlertMessage("Region found!", false); |
176 | data.MapImageId = UUID.Zero; | ||
177 | else | ||
178 | data.MapImageId = info.TerrainImage; | ||
179 | // ugh! V2-3 is very sensitive about the result being | ||
180 | // exactly the same as the requested name | ||
181 | if (regionInfos.Count == 1 && mapNameOrig.Contains("|") || mapNameOrig.Contains("+")) | ||
182 | data.Name = mapNameOrig; | ||
183 | else | ||
184 | data.Name = info.RegionName; | ||
185 | data.RegionFlags = 0; // TODO not used? | ||
186 | data.WaterHeight = 0; // not used | ||
187 | data.X = (ushort)(info.RegionLocX / Constants.RegionSize); | ||
188 | data.Y = (ushort)(info.RegionLocY / Constants.RegionSize); | ||
189 | blocks.Add(data); | ||
190 | } | 216 | } |
191 | } | 217 | }); |
192 | |||
193 | // final block, closing the search result | ||
194 | AddFinalBlock(blocks); | ||
195 | |||
196 | // flags are agent flags sent from the viewer. | ||
197 | // they have different values depending on different viewers, apparently | ||
198 | remoteClient.SendMapBlock(blocks, flags); | ||
199 | |||
200 | // send extra user messages for V3 | ||
201 | // because the UI is very confusing | ||
202 | // while we don't fix the hard-coded urls | ||
203 | if (flags == 2) | ||
204 | { | ||
205 | if (regionInfos.Count == 0) | ||
206 | remoteClient.SendAlertMessage("No regions found with that name."); | ||
207 | else if (regionInfos.Count == 1) | ||
208 | remoteClient.SendAlertMessage("Region found!"); | ||
209 | } | ||
210 | } | 218 | } |
211 | 219 | ||
212 | private void AddFinalBlock(List<MapBlockData> blocks) | 220 | private void AddFinalBlock(List<MapBlockData> blocks) |