aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Region
diff options
context:
space:
mode:
Diffstat (limited to 'OpenSim/Region')
-rw-r--r--OpenSim/Region/Application/OpenSim.cs72
-rw-r--r--OpenSim/Region/ClientStack/LindenUDP/LLUDPClient.cs16
-rw-r--r--OpenSim/Region/ClientStack/LindenUDP/LLUDPServer.cs5
-rw-r--r--OpenSim/Region/ClientStack/LindenUDP/UnackedPacketCollection.cs45
-rw-r--r--OpenSim/Region/CoreModules/Agent/Capabilities/CapabilitiesModule.cs27
-rw-r--r--OpenSim/Region/CoreModules/Avatar/Assets/GetTextureModule.cs4
-rw-r--r--OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/InventoryArchiverModule.cs4
-rw-r--r--OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs2
-rw-r--r--OpenSim/Region/CoreModules/Framework/InventoryAccess/HGInventoryAccessModule.cs8
-rw-r--r--OpenSim/Region/CoreModules/Resources/CoreModulePlugin.addin.xml1
-rw-r--r--OpenSim/Region/CoreModules/Scripting/LSLHttp/UrlModule.cs2
-rw-r--r--OpenSim/Region/CoreModules/ServiceConnectorsOut/Grid/LocalGridServiceConnector.cs8
-rw-r--r--OpenSim/Region/CoreModules/ServiceConnectorsOut/Inventory/HGInventoryBroker.cs5
-rw-r--r--OpenSim/Region/CoreModules/ServiceConnectorsOut/Inventory/RemoteInventoryServiceConnector.cs362
-rw-r--r--OpenSim/Region/CoreModules/ServiceConnectorsOut/Simulation/LocalSimulationConnector.cs14
-rw-r--r--OpenSim/Region/Framework/Interfaces/ISceneViewer.cs1
-rw-r--r--OpenSim/Region/Framework/Scenes/SceneCommunicationService.cs43
-rw-r--r--OpenSim/Region/Framework/Scenes/SceneObjectPart.cs3
-rw-r--r--OpenSim/Region/Framework/Scenes/SceneViewer.cs8
-rw-r--r--OpenSim/Region/OptionalModules/Agent/UDP/Linden/LindenUDPInfoModule.cs24
-rw-r--r--OpenSim/Region/OptionalModules/Avatar/XmlRpcGroups/IGroupsServicesConnector.cs19
-rw-r--r--OpenSim/Region/OptionalModules/Avatar/XmlRpcGroups/SimianGroupsServicesConnectorModule.cs66
-rw-r--r--OpenSim/Region/OptionalModules/World/WorldView/WorldViewModule.cs3
-rw-r--r--OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs24
-rw-r--r--OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs4
25 files changed, 292 insertions, 478 deletions
diff --git a/OpenSim/Region/Application/OpenSim.cs b/OpenSim/Region/Application/OpenSim.cs
index 1c84e3f..34b2975 100644
--- a/OpenSim/Region/Application/OpenSim.cs
+++ b/OpenSim/Region/Application/OpenSim.cs
@@ -294,6 +294,18 @@ namespace OpenSim
294 "show connections", 294 "show connections",
295 "Show connection data", HandleShow); 295 "Show connection data", HandleShow);
296 296
297 m_console.Commands.AddCommand("region", false, "show circuits",
298 "show circuits",
299 "Show agent circuit data", HandleShow);
300
301 m_console.Commands.AddCommand("region", false, "show http-handlers",
302 "show http-handlers",
303 "Show all registered http handlers", HandleShow);
304
305 m_console.Commands.AddCommand("region", false, "show pending-objects",
306 "show pending-objects",
307 "Show # of objects on the pending queues of all scene viewers", HandleShow);
308
297 m_console.Commands.AddCommand("region", false, "show modules", 309 m_console.Commands.AddCommand("region", false, "show modules",
298 "show modules", 310 "show modules",
299 "Show module data", HandleShow); 311 "Show module data", HandleShow);
@@ -943,6 +955,66 @@ namespace OpenSim
943 MainConsole.Instance.Output(connections.ToString()); 955 MainConsole.Instance.Output(connections.ToString());
944 break; 956 break;
945 957
958 case "circuits":
959 System.Text.StringBuilder acd = new System.Text.StringBuilder("Agent Circuits:\n");
960 m_sceneManager.ForEachScene(
961 delegate(Scene scene)
962 {
963 //this.HttpServer.
964 acd.AppendFormat("{0}:\n", scene.RegionInfo.RegionName);
965 foreach (AgentCircuitData aCircuit in scene.AuthenticateHandler.AgentCircuits.Values)
966 acd.AppendFormat("\t{0} {1} ({2})\n", aCircuit.firstname, aCircuit.lastname, (aCircuit.child ? "Child" : "Root"));
967 }
968 );
969
970 MainConsole.Instance.Output(acd.ToString());
971 break;
972
973 case "http-handlers":
974 System.Text.StringBuilder handlers = new System.Text.StringBuilder("Registered HTTP Handlers:\n");
975
976 handlers.AppendFormat("* XMLRPC:\n");
977 foreach (String s in HttpServer.GetXmlRpcHandlerKeys())
978 handlers.AppendFormat("\t{0}\n", s);
979
980 handlers.AppendFormat("* HTTP:\n");
981 List<String> poll = HttpServer.GetPollServiceHandlerKeys();
982 foreach (String s in HttpServer.GetHTTPHandlerKeys())
983 handlers.AppendFormat("\t{0} {1}\n", s, (poll.Contains(s) ? "(poll service)" : string.Empty));
984
985 handlers.AppendFormat("* Agent:\n");
986 foreach (String s in HttpServer.GetAgentHandlerKeys())
987 handlers.AppendFormat("\t{0}\n", s);
988
989 handlers.AppendFormat("* LLSD:\n");
990 foreach (String s in HttpServer.GetLLSDHandlerKeys())
991 handlers.AppendFormat("\t{0}\n", s);
992
993 handlers.AppendFormat("* StreamHandlers ({0}):\n", HttpServer.GetStreamHandlerKeys().Count);
994 foreach (String s in HttpServer.GetStreamHandlerKeys())
995 handlers.AppendFormat("\t{0}\n", s);
996
997 MainConsole.Instance.Output(handlers.ToString());
998 break;
999
1000 case "pending-objects":
1001 System.Text.StringBuilder pending = new System.Text.StringBuilder("Pending objects:\n");
1002 m_sceneManager.ForEachScene(
1003 delegate(Scene scene)
1004 {
1005 scene.ForEachScenePresence(
1006 delegate(ScenePresence sp)
1007 {
1008 pending.AppendFormat("{0}: {1} {2} pending\n",
1009 scene.RegionInfo.RegionName, sp.Name, sp.SceneViewer.GetPendingObjectsCount());
1010 }
1011 );
1012 }
1013 );
1014
1015 MainConsole.Instance.Output(pending.ToString());
1016 break;
1017
946 case "modules": 1018 case "modules":
947 MainConsole.Instance.Output("The currently loaded shared modules are:"); 1019 MainConsole.Instance.Output("The currently loaded shared modules are:");
948 foreach (IRegionModule module in m_moduleLoader.GetLoadedSharedModules) 1020 foreach (IRegionModule module in m_moduleLoader.GetLoadedSharedModules)
diff --git a/OpenSim/Region/ClientStack/LindenUDP/LLUDPClient.cs b/OpenSim/Region/ClientStack/LindenUDP/LLUDPClient.cs
index f1fdbc5..d6159cd 100644
--- a/OpenSim/Region/ClientStack/LindenUDP/LLUDPClient.cs
+++ b/OpenSim/Region/ClientStack/LindenUDP/LLUDPClient.cs
@@ -122,6 +122,8 @@ namespace OpenSim.Region.ClientStack.LindenUDP
122 public int PacketsReceived; 122 public int PacketsReceived;
123 /// <summary>Number of packets sent to this client</summary> 123 /// <summary>Number of packets sent to this client</summary>
124 public int PacketsSent; 124 public int PacketsSent;
125 /// <summary>Number of packets resent to this client</summary>
126 public int PacketsResent;
125 /// <summary>Total byte count of unacked packets sent to this client</summary> 127 /// <summary>Total byte count of unacked packets sent to this client</summary>
126 public int UnackedBytes; 128 public int UnackedBytes;
127 129
@@ -257,9 +259,10 @@ namespace OpenSim.Region.ClientStack.LindenUDP
257 public string GetStats() 259 public string GetStats()
258 { 260 {
259 return string.Format( 261 return string.Format(
260 "{0,7} {1,7} {2,9} {3,8} {4,7} {5,7} {6,7} {7,7} {8,9} {9,7} {10,7}", 262 "{0,7} {1,7} {2,7} {3,9} {4,7} {5,7} {6,7} {7,7} {8,7} {9,8} {10,7} {11,7}",
263 PacketsReceived,
261 PacketsSent, 264 PacketsSent,
262 PacketsReceived, 265 PacketsResent,
263 UnackedBytes, 266 UnackedBytes,
264 m_packetOutboxes[(int)ThrottleOutPacketType.Resend].Count, 267 m_packetOutboxes[(int)ThrottleOutPacketType.Resend].Count,
265 m_packetOutboxes[(int)ThrottleOutPacketType.Land].Count, 268 m_packetOutboxes[(int)ThrottleOutPacketType.Land].Count,
@@ -449,13 +452,16 @@ namespace OpenSim.Region.ClientStack.LindenUDP
449 /// an outgoing packet from each, obeying the throttling bucket limits 452 /// an outgoing packet from each, obeying the throttling bucket limits
450 /// </summary> 453 /// </summary>
451 /// 454 ///
455 /// <remarks>
452 /// Packet queues are inspected in ascending numerical order starting from 0. Therefore, queues with a lower 456 /// Packet queues are inspected in ascending numerical order starting from 0. Therefore, queues with a lower
453 /// ThrottleOutPacketType number will see their packet get sent first (e.g. if both Land and Wind queues have 457 /// ThrottleOutPacketType number will see their packet get sent first (e.g. if both Land and Wind queues have
454 /// packets, then the packet at the front of the Land queue will be sent before the packet at the front of the 458 /// packets, then the packet at the front of the Land queue will be sent before the packet at the front of the
455 /// wind queue). 459 /// wind queue).
456 /// 460 ///
457 /// <remarks>This function is only called from a synchronous loop in the 461 /// This function is only called from a synchronous loop in the
458 /// UDPServer so we don't need to bother making this thread safe</remarks> 462 /// UDPServer so we don't need to bother making this thread safe
463 /// </remarks>
464 ///
459 /// <returns>True if any packets were sent, otherwise false</returns> 465 /// <returns>True if any packets were sent, otherwise false</returns>
460 public bool DequeueOutgoing() 466 public bool DequeueOutgoing()
461 { 467 {
@@ -486,7 +492,6 @@ namespace OpenSim.Region.ClientStack.LindenUDP
486 m_udpServer.SendPacketFinal(nextPacket); 492 m_udpServer.SendPacketFinal(nextPacket);
487 m_nextPackets[i] = null; 493 m_nextPackets[i] = null;
488 packetSent = true; 494 packetSent = true;
489 this.PacketsSent++;
490 } 495 }
491 } 496 }
492 else 497 else
@@ -503,7 +508,6 @@ namespace OpenSim.Region.ClientStack.LindenUDP
503 // Send the packet 508 // Send the packet
504 m_udpServer.SendPacketFinal(packet); 509 m_udpServer.SendPacketFinal(packet);
505 packetSent = true; 510 packetSent = true;
506 this.PacketsSent++;
507 } 511 }
508 else 512 else
509 { 513 {
diff --git a/OpenSim/Region/ClientStack/LindenUDP/LLUDPServer.cs b/OpenSim/Region/ClientStack/LindenUDP/LLUDPServer.cs
index 703176c..cfcc057 100644
--- a/OpenSim/Region/ClientStack/LindenUDP/LLUDPServer.cs
+++ b/OpenSim/Region/ClientStack/LindenUDP/LLUDPServer.cs
@@ -506,7 +506,6 @@ namespace OpenSim.Region.ClientStack.LindenUDP
506 506
507 // Bump up the resend count on this packet 507 // Bump up the resend count on this packet
508 Interlocked.Increment(ref outgoingPacket.ResendCount); 508 Interlocked.Increment(ref outgoingPacket.ResendCount);
509 //Interlocked.Increment(ref Stats.ResentPackets);
510 509
511 // Requeue or resend the packet 510 // Requeue or resend the packet
512 if (!outgoingPacket.Client.EnqueueOutgoing(outgoingPacket, false)) 511 if (!outgoingPacket.Client.EnqueueOutgoing(outgoingPacket, false))
@@ -582,6 +581,10 @@ namespace OpenSim.Region.ClientStack.LindenUDP
582 udpClient.NeedAcks.Add(outgoingPacket); 581 udpClient.NeedAcks.Add(outgoingPacket);
583 } 582 }
584 } 583 }
584 else
585 {
586 Interlocked.Increment(ref udpClient.PacketsResent);
587 }
585 588
586 #endregion Sequence Number Assignment 589 #endregion Sequence Number Assignment
587 590
diff --git a/OpenSim/Region/ClientStack/LindenUDP/UnackedPacketCollection.cs b/OpenSim/Region/ClientStack/LindenUDP/UnackedPacketCollection.cs
index 9d40688..d762bef 100644
--- a/OpenSim/Region/ClientStack/LindenUDP/UnackedPacketCollection.cs
+++ b/OpenSim/Region/ClientStack/LindenUDP/UnackedPacketCollection.cs
@@ -141,31 +141,46 @@ namespace OpenSim.Region.ClientStack.LindenUDP
141 private void ProcessQueues() 141 private void ProcessQueues()
142 { 142 {
143 // Process all the pending adds 143 // Process all the pending adds
144
144 OutgoingPacket pendingAdd; 145 OutgoingPacket pendingAdd;
145 while (m_pendingAdds.TryDequeue(out pendingAdd)) 146 if (m_pendingAdds != null)
146 m_packets[pendingAdd.SequenceNumber] = pendingAdd; 147 {
148 while (m_pendingAdds.TryDequeue(out pendingAdd))
149 {
150 if (pendingAdd != null && m_packets != null)
151 {
152 m_packets[pendingAdd.SequenceNumber] = pendingAdd;
153 }
154 }
155 }
147 156
148 // Process all the pending removes, including updating statistics and round-trip times 157 // Process all the pending removes, including updating statistics and round-trip times
149 PendingAck pendingRemove; 158 PendingAck pendingRemove;
150 OutgoingPacket ackedPacket; 159 OutgoingPacket ackedPacket;
151 while (m_pendingRemoves.TryDequeue(out pendingRemove)) 160 if (m_pendingRemoves != null)
152 { 161 {
153 if (m_packets.TryGetValue(pendingRemove.SequenceNumber, out ackedPacket)) 162 while (m_pendingRemoves.TryDequeue(out pendingRemove))
154 { 163 {
155 m_packets.Remove(pendingRemove.SequenceNumber); 164 if (m_pendingRemoves != null && m_packets != null)
156
157 // Update stats
158 Interlocked.Add(ref ackedPacket.Client.UnackedBytes, -ackedPacket.Buffer.DataLength);
159
160 if (!pendingRemove.FromResend)
161 { 165 {
162 // Calculate the round-trip time for this packet and its ACK 166 if (m_packets.TryGetValue(pendingRemove.SequenceNumber, out ackedPacket))
163 int rtt = pendingRemove.RemoveTime - ackedPacket.TickCount; 167 {
164 if (rtt > 0) 168 m_packets.Remove(pendingRemove.SequenceNumber);
165 ackedPacket.Client.UpdateRoundTrip(rtt); 169
170 // Update stats
171 Interlocked.Add(ref ackedPacket.Client.UnackedBytes, -ackedPacket.Buffer.DataLength);
172
173 if (!pendingRemove.FromResend)
174 {
175 // Calculate the round-trip time for this packet and its ACK
176 int rtt = pendingRemove.RemoveTime - ackedPacket.TickCount;
177 if (rtt > 0)
178 ackedPacket.Client.UpdateRoundTrip(rtt);
179 }
180 }
166 } 181 }
167 } 182 }
168 } 183 }
169 } 184 }
170 } 185 }
171} \ No newline at end of file 186}
diff --git a/OpenSim/Region/CoreModules/Agent/Capabilities/CapabilitiesModule.cs b/OpenSim/Region/CoreModules/Agent/Capabilities/CapabilitiesModule.cs
index 5c5cb70..7526bd2 100644
--- a/OpenSim/Region/CoreModules/Agent/Capabilities/CapabilitiesModule.cs
+++ b/OpenSim/Region/CoreModules/Agent/Capabilities/CapabilitiesModule.cs
@@ -26,12 +26,14 @@
26 */ 26 */
27 27
28using System; 28using System;
29using System.Collections;
29using System.Collections.Generic; 30using System.Collections.Generic;
30using System.Reflection; 31using System.Reflection;
31using log4net; 32using log4net;
32using Nini.Config; 33using Nini.Config;
33using OpenMetaverse; 34using OpenMetaverse;
34using OpenSim.Framework; 35using OpenSim.Framework;
36using OpenSim.Framework.Console;
35using OpenSim.Region.Framework.Interfaces; 37using OpenSim.Region.Framework.Interfaces;
36using OpenSim.Region.Framework.Scenes; 38using OpenSim.Region.Framework.Scenes;
37using Caps=OpenSim.Framework.Capabilities.Caps; 39using Caps=OpenSim.Framework.Capabilities.Caps;
@@ -61,6 +63,9 @@ namespace OpenSim.Region.CoreModules.Agent.Capabilities
61 { 63 {
62 m_scene = scene; 64 m_scene = scene;
63 m_scene.RegisterModuleInterface<ICapabilitiesModule>(this); 65 m_scene.RegisterModuleInterface<ICapabilitiesModule>(this);
66 MainConsole.Instance.Commands.AddCommand("Capabilities", false, "show caps",
67 "show capabilities",
68 "Shows all registered capabilities", CapabilitiesCommand);
64 } 69 }
65 70
66 public void RegionLoaded(Scene scene) 71 public void RegionLoaded(Scene scene)
@@ -72,7 +77,9 @@ namespace OpenSim.Region.CoreModules.Agent.Capabilities
72 m_scene.UnregisterModuleInterface<ICapabilitiesModule>(this); 77 m_scene.UnregisterModuleInterface<ICapabilitiesModule>(this);
73 } 78 }
74 79
75 public void PostInitialise() {} 80 public void PostInitialise()
81 {
82 }
76 83
77 public void Close() {} 84 public void Close() {}
78 85
@@ -227,5 +234,23 @@ namespace OpenSim.Region.CoreModules.Agent.Capabilities
227 m_log.Info(" >> "+x+", "+y+": "+kvp.Value); 234 m_log.Info(" >> "+x+", "+y+": "+kvp.Value);
228 } 235 }
229 } 236 }
237
238 private void CapabilitiesCommand(string module, string[] cmdparams)
239 {
240 System.Text.StringBuilder caps = new System.Text.StringBuilder();
241 caps.AppendFormat("Region {0}:\n", m_scene.RegionInfo.RegionName);
242
243 foreach (KeyValuePair<UUID, Caps> kvp in m_capsHandlers)
244 {
245 caps.AppendFormat("** User {0}:\n", kvp.Key);
246 for (IDictionaryEnumerator kvp2 = kvp.Value.CapsHandlers.CapsDetails.GetEnumerator(); kvp2.MoveNext(); )
247 {
248 Uri uri = new Uri(kvp2.Value.ToString());
249 caps.AppendFormat(" {0} = {1}\n", kvp2.Key, uri.PathAndQuery);
250 }
251 }
252
253 MainConsole.Instance.Output(caps.ToString());
254 }
230 } 255 }
231} 256}
diff --git a/OpenSim/Region/CoreModules/Avatar/Assets/GetTextureModule.cs b/OpenSim/Region/CoreModules/Avatar/Assets/GetTextureModule.cs
index 6fb8b46..df4d561 100644
--- a/OpenSim/Region/CoreModules/Avatar/Assets/GetTextureModule.cs
+++ b/OpenSim/Region/CoreModules/Avatar/Assets/GetTextureModule.cs
@@ -245,14 +245,12 @@ namespace OpenSim.Region.CoreModules.Avatar.ObjectCaps
245 WriteTextureData(httpRequest, httpResponse, texture, format); 245 WriteTextureData(httpRequest, httpResponse, texture, format);
246 return true; 246 return true;
247 } 247 }
248
249 } 248 }
250 249
251 // not found 250 // not found
252 m_log.Warn("[GETTEXTURE]: Texture " + textureID + " not found"); 251// m_log.Warn("[GETTEXTURE]: Texture " + textureID + " not found");
253 httpResponse.StatusCode = (int)System.Net.HttpStatusCode.NotFound; 252 httpResponse.StatusCode = (int)System.Net.HttpStatusCode.NotFound;
254 return true; 253 return true;
255
256 } 254 }
257 255
258 private void WriteTextureData(OSHttpRequest request, OSHttpResponse response, AssetBase texture, string format) 256 private void WriteTextureData(OSHttpRequest request, OSHttpResponse response, AssetBase texture, string format)
diff --git a/OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/InventoryArchiverModule.cs b/OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/InventoryArchiverModule.cs
index b1c2a3c..a71def7 100644
--- a/OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/InventoryArchiverModule.cs
+++ b/OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/InventoryArchiverModule.cs
@@ -128,6 +128,8 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver
128 + "<last> is the user's last name." + Environment.NewLine 128 + "<last> is the user's last name." + Environment.NewLine
129 + "<inventory path> is the path inside the user's inventory for the folder/item to be saved." + Environment.NewLine 129 + "<inventory path> is the path inside the user's inventory for the folder/item to be saved." + Environment.NewLine
130 + "-p|--profile=<url> adds the url of the profile service to the saved user information." + Environment.NewLine 130 + "-p|--profile=<url> adds the url of the profile service to the saved user information." + Environment.NewLine
131 + "-c|--creators preserves information about foreign creators." + Environment.NewLine
132 + "-v|--verbose extra debug messages." + Environment.NewLine
131 + "<IAR path> is the filesystem path at which to save the IAR." 133 + "<IAR path> is the filesystem path at which to save the IAR."
132 + string.Format(" If this is not given then the filename {0} in the current directory is used", DEFAULT_INV_BACKUP_FILENAME), 134 + string.Format(" If this is not given then the filename {0} in the current directory is used", DEFAULT_INV_BACKUP_FILENAME),
133 HandleSaveInvConsoleCommand); 135 HandleSaveInvConsoleCommand);
@@ -394,6 +396,8 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver
394 OptionSet ops = new OptionSet(); 396 OptionSet ops = new OptionSet();
395 //ops.Add("v|version=", delegate(string v) { options["version"] = v; }); 397 //ops.Add("v|version=", delegate(string v) { options["version"] = v; });
396 ops.Add("p|profile=", delegate(string v) { options["profile"] = v; }); 398 ops.Add("p|profile=", delegate(string v) { options["profile"] = v; });
399 ops.Add("v|verbose", delegate(string v) { options["verbose"] = v; });
400 ops.Add("c|creators", delegate(string v) { options["creators"] = v; });
397 401
398 List<string> mainParams = ops.Parse(cmdparams); 402 List<string> mainParams = ops.Parse(cmdparams);
399 403
diff --git a/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs b/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs
index 9e1d414..ca29a7c 100644
--- a/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs
+++ b/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs
@@ -1006,7 +1006,7 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
1006 /// </summary> 1006 /// </summary>
1007 public void EnableChildAgent(ScenePresence sp, GridRegion region) 1007 public void EnableChildAgent(ScenePresence sp, GridRegion region)
1008 { 1008 {
1009 m_log.DebugFormat("[ENTITY TRANSFER]: Enabling child agent in new neighour {0}", region.RegionName); 1009 m_log.DebugFormat("[ENTITY TRANSFER]: Enabling child agent in new neighbour {0}", region.RegionName);
1010 1010
1011 AgentCircuitData currentAgentCircuit = sp.Scene.AuthenticateHandler.GetAgentCircuitData(sp.ControllingClient.CircuitCode); 1011 AgentCircuitData currentAgentCircuit = sp.Scene.AuthenticateHandler.GetAgentCircuitData(sp.ControllingClient.CircuitCode);
1012 AgentCircuitData agent = sp.ControllingClient.RequestClientInfo(); 1012 AgentCircuitData agent = sp.ControllingClient.RequestClientInfo();
diff --git a/OpenSim/Region/CoreModules/Framework/InventoryAccess/HGInventoryAccessModule.cs b/OpenSim/Region/CoreModules/Framework/InventoryAccess/HGInventoryAccessModule.cs
index 34b8114..4565d10 100644
--- a/OpenSim/Region/CoreModules/Framework/InventoryAccess/HGInventoryAccessModule.cs
+++ b/OpenSim/Region/CoreModules/Framework/InventoryAccess/HGInventoryAccessModule.cs
@@ -55,6 +55,7 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess
55 } 55 }
56 56
57 private string m_ProfileServerURI; 57 private string m_ProfileServerURI;
58 private bool m_OutboundPermission;
58 59
59// private bool m_Initialized = false; 60// private bool m_Initialized = false;
60 61
@@ -78,7 +79,10 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess
78 79
79 IConfig thisModuleConfig = source.Configs["HGInventoryAccessModule"]; 80 IConfig thisModuleConfig = source.Configs["HGInventoryAccessModule"];
80 if (thisModuleConfig != null) 81 if (thisModuleConfig != null)
82 {
81 m_ProfileServerURI = thisModuleConfig.GetString("ProfileServerURI", string.Empty); 83 m_ProfileServerURI = thisModuleConfig.GetString("ProfileServerURI", string.Empty);
84 m_OutboundPermission = thisModuleConfig.GetBoolean("OutboundPermission", true);
85 }
82 else 86 else
83 m_log.Warn("[HG INVENTORY ACCESS MODULE]: HGInventoryAccessModule configs not found. ProfileServerURI not set!"); 87 m_log.Warn("[HG INVENTORY ACCESS MODULE]: HGInventoryAccessModule configs not found. ProfileServerURI not set!");
84 } 88 }
@@ -103,7 +107,7 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess
103 public void UploadInventoryItem(UUID avatarID, UUID assetID, string name, int userlevel) 107 public void UploadInventoryItem(UUID avatarID, UUID assetID, string name, int userlevel)
104 { 108 {
105 string userAssetServer = string.Empty; 109 string userAssetServer = string.Empty;
106 if (IsForeignUser(avatarID, out userAssetServer)) 110 if (IsForeignUser(avatarID, out userAssetServer) && m_OutboundPermission)
107 { 111 {
108 Util.FireAndForget(delegate { m_assMapper.Post(assetID, avatarID, userAssetServer); }); 112 Util.FireAndForget(delegate { m_assMapper.Post(assetID, avatarID, userAssetServer); });
109 } 113 }
@@ -197,7 +201,7 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess
197 if (IsForeignUser(sender, out userAssetServer)) 201 if (IsForeignUser(sender, out userAssetServer))
198 m_assMapper.Get(item.AssetID, sender, userAssetServer); 202 m_assMapper.Get(item.AssetID, sender, userAssetServer);
199 203
200 if (IsForeignUser(receiver, out userAssetServer)) 204 if (IsForeignUser(receiver, out userAssetServer) && m_OutboundPermission)
201 m_assMapper.Post(item.AssetID, receiver, userAssetServer); 205 m_assMapper.Post(item.AssetID, receiver, userAssetServer);
202 } 206 }
203 207
diff --git a/OpenSim/Region/CoreModules/Resources/CoreModulePlugin.addin.xml b/OpenSim/Region/CoreModules/Resources/CoreModulePlugin.addin.xml
index 43de2ab..a9d247a 100644
--- a/OpenSim/Region/CoreModules/Resources/CoreModulePlugin.addin.xml
+++ b/OpenSim/Region/CoreModules/Resources/CoreModulePlugin.addin.xml
@@ -47,7 +47,6 @@
47 <RegionModule id="RemoteAuthorizationServicesConnector" type="OpenSim.Region.CoreModules.ServiceConnectorsOut.Authorization.RemoteAuthorizationServicesConnector" /> 47 <RegionModule id="RemoteAuthorizationServicesConnector" type="OpenSim.Region.CoreModules.ServiceConnectorsOut.Authorization.RemoteAuthorizationServicesConnector" />
48 <RegionModule id="HGAssetBroker" type="OpenSim.Region.CoreModules.ServiceConnectorsOut.Asset.HGAssetBroker" /> 48 <RegionModule id="HGAssetBroker" type="OpenSim.Region.CoreModules.ServiceConnectorsOut.Asset.HGAssetBroker" />
49 <RegionModule id="LocalInventoryServicesConnector" type="OpenSim.Region.CoreModules.ServiceConnectorsOut.Inventory.LocalInventoryServicesConnector" /> 49 <RegionModule id="LocalInventoryServicesConnector" type="OpenSim.Region.CoreModules.ServiceConnectorsOut.Inventory.LocalInventoryServicesConnector" />
50 <RegionModule id="RemoteInventoryServicesConnector" type="OpenSim.Region.CoreModules.ServiceConnectorsOut.Inventory.RemoteInventoryServicesConnector" />
51 <RegionModule id="RemoteXInventoryServicesConnector" type="OpenSim.Region.CoreModules.ServiceConnectorsOut.Inventory.RemoteXInventoryServicesConnector" /> 50 <RegionModule id="RemoteXInventoryServicesConnector" type="OpenSim.Region.CoreModules.ServiceConnectorsOut.Inventory.RemoteXInventoryServicesConnector" />
52 <RegionModule id="HGInventoryBroker" type="OpenSim.Region.CoreModules.ServiceConnectorsOut.Inventory.HGInventoryBroker" /> 51 <RegionModule id="HGInventoryBroker" type="OpenSim.Region.CoreModules.ServiceConnectorsOut.Inventory.HGInventoryBroker" />
53 <RegionModule id="LocalNeighbourServicesConnector" type="OpenSim.Region.CoreModules.ServiceConnectorsOut.Neighbour.LocalNeighbourServicesConnector" /> 52 <RegionModule id="LocalNeighbourServicesConnector" type="OpenSim.Region.CoreModules.ServiceConnectorsOut.Neighbour.LocalNeighbourServicesConnector" />
diff --git a/OpenSim/Region/CoreModules/Scripting/LSLHttp/UrlModule.cs b/OpenSim/Region/CoreModules/Scripting/LSLHttp/UrlModule.cs
index 89f5da3..66eb747 100644
--- a/OpenSim/Region/CoreModules/Scripting/LSLHttp/UrlModule.cs
+++ b/OpenSim/Region/CoreModules/Scripting/LSLHttp/UrlModule.cs
@@ -444,7 +444,7 @@ namespace OpenSim.Region.CoreModules.Scripting.LSLHttp
444 if (request.ContainsKey(key)) 444 if (request.ContainsKey(key))
445 { 445 {
446 string val = (String)request[key]; 446 string val = (String)request[key];
447 if (key == "") 447 if (key != "")
448 { 448 {
449 queryString = queryString + key + "=" + val + "&"; 449 queryString = queryString + key + "=" + val + "&";
450 } 450 }
diff --git a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Grid/LocalGridServiceConnector.cs b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Grid/LocalGridServiceConnector.cs
index 023a44c..3c36799 100644
--- a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Grid/LocalGridServiceConnector.cs
+++ b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Grid/LocalGridServiceConnector.cs
@@ -247,13 +247,17 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Grid
247 247
248 public void NeighboursCommand(string module, string[] cmdparams) 248 public void NeighboursCommand(string module, string[] cmdparams)
249 { 249 {
250 System.Text.StringBuilder caps = new System.Text.StringBuilder();
251
250 foreach (KeyValuePair<UUID, RegionCache> kvp in m_LocalCache) 252 foreach (KeyValuePair<UUID, RegionCache> kvp in m_LocalCache)
251 { 253 {
252 m_log.InfoFormat("*** Neighbours of {0} {1} ***", kvp.Key, kvp.Value.RegionName); 254 caps.AppendFormat("*** Neighbours of {0} ({1}) ***\n", kvp.Value.RegionName, kvp.Key);
253 List<GridRegion> regions = kvp.Value.GetNeighbours(); 255 List<GridRegion> regions = kvp.Value.GetNeighbours();
254 foreach (GridRegion r in regions) 256 foreach (GridRegion r in regions)
255 m_log.InfoFormat(" {0} @ {1}={2}", r.RegionName, r.RegionLocX / Constants.RegionSize, r.RegionLocY / Constants.RegionSize); 257 caps.AppendFormat(" {0} @ {1}-{2}\n", r.RegionName, r.RegionLocX / Constants.RegionSize, r.RegionLocY / Constants.RegionSize);
256 } 258 }
259
260 MainConsole.Instance.Output(caps.ToString());
257 } 261 }
258 262
259 } 263 }
diff --git a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Inventory/HGInventoryBroker.cs b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Inventory/HGInventoryBroker.cs
index 39410b5..3f63db3 100644
--- a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Inventory/HGInventoryBroker.cs
+++ b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Inventory/HGInventoryBroker.cs
@@ -200,6 +200,11 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Inventory
200 return; 200 return;
201 } 201 }
202 } 202 }
203 else
204 {
205 m_log.DebugFormat("[HG INVENTORY CONNECTOR]: User {0} does not have InventoryServerURI. OH NOES!", userID);
206 return;
207 }
203 } 208 }
204 } 209 }
205 } 210 }
diff --git a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Inventory/RemoteInventoryServiceConnector.cs b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Inventory/RemoteInventoryServiceConnector.cs
deleted file mode 100644
index 9213132..0000000
--- a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Inventory/RemoteInventoryServiceConnector.cs
+++ /dev/null
@@ -1,362 +0,0 @@
1/*
2 * Copyright (c) Contributors, http://opensimulator.org/
3 * See CONTRIBUTORS.TXT for a full list of copyright holders.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions are met:
7 * * Redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer.
9 * * Redistributions in binary form must reproduce the above copyright
10 * notice, this list of conditions and the following disclaimer in the
11 * documentation and/or other materials provided with the distribution.
12 * * Neither the name of the OpenSimulator Project nor the
13 * names of its contributors may be used to endorse or promote products
14 * derived from this software without specific prior written permission.
15 *
16 * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY
17 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19 * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
20 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
23 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26 */
27
28using log4net;
29using System;
30using System.Collections.Generic;
31using System.Reflection;
32using Nini.Config;
33using OpenSim.Framework;
34using OpenSim.Framework.Statistics;
35using OpenSim.Services.Connectors;
36using OpenSim.Region.Framework.Interfaces;
37using OpenSim.Region.Framework.Scenes;
38using OpenSim.Services.Interfaces;
39using OpenMetaverse;
40
41namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Inventory
42{
43 public class RemoteInventoryServicesConnector : BaseInventoryConnector, ISharedRegionModule, IInventoryService
44 {
45 private static readonly ILog m_log =
46 LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
47
48 private bool m_Enabled = false;
49 private bool m_Initialized = false;
50 private Scene m_Scene;
51 private InventoryServicesConnector m_RemoteConnector;
52
53 private IUserManagement m_UserManager;
54 private IUserManagement UserManager
55 {
56 get
57 {
58 if (m_UserManager == null)
59 {
60 m_UserManager = m_Scene.RequestModuleInterface<IUserManagement>();
61 }
62 return m_UserManager;
63 }
64 }
65
66
67 public Type ReplaceableInterface
68 {
69 get { return null; }
70 }
71
72 public string Name
73 {
74 get { return "RemoteInventoryServicesConnector"; }
75 }
76
77 public RemoteInventoryServicesConnector()
78 {
79 }
80
81 public RemoteInventoryServicesConnector(IConfigSource source)
82 {
83 Init(source);
84 }
85
86 protected override void Init(IConfigSource source)
87 {
88 m_RemoteConnector = new InventoryServicesConnector(source);
89 base.Init(source);
90 }
91
92 #region ISharedRegionModule
93
94 public void Initialise(IConfigSource source)
95 {
96 IConfig moduleConfig = source.Configs["Modules"];
97 if (moduleConfig != null)
98 {
99 string name = moduleConfig.GetString("InventoryServices", "");
100 if (name == Name)
101 {
102 Init(source);
103 m_Enabled = true;
104
105 m_log.Info("[INVENTORY CONNECTOR]: Remote inventory enabled");
106 }
107 }
108 }
109
110 public void PostInitialise()
111 {
112 }
113
114 public void Close()
115 {
116 }
117
118 public void AddRegion(Scene scene)
119 {
120// m_Scene = scene;
121 //m_log.Debug("[XXXX] Adding scene " + m_Scene.RegionInfo.RegionName);
122
123 if (!m_Enabled)
124 return;
125
126 if (!m_Initialized)
127 {
128 m_Initialized = true;
129 }
130
131 scene.RegisterModuleInterface<IInventoryService>(this);
132 m_cache.AddRegion(scene);
133
134 if (m_Scene == null)
135 m_Scene = scene;
136 }
137
138 public void RemoveRegion(Scene scene)
139 {
140 if (!m_Enabled)
141 return;
142
143 m_cache.RemoveRegion(scene);
144 }
145
146 public void RegionLoaded(Scene scene)
147 {
148 if (!m_Enabled)
149 return;
150
151 m_log.InfoFormat("[INVENTORY CONNECTOR]: Enabled remote inventory for region {0}", scene.RegionInfo.RegionName);
152
153 }
154
155 #endregion ISharedRegionModule
156
157 #region IInventoryService
158
159 public override bool CreateUserInventory(UUID user)
160 {
161 return false;
162 }
163
164 public override List<InventoryFolderBase> GetInventorySkeleton(UUID userId)
165 {
166 return new List<InventoryFolderBase>();
167 }
168
169 public override InventoryCollection GetUserInventory(UUID userID)
170 {
171 return null;
172 }
173
174 public override void GetUserInventory(UUID userID, InventoryReceiptCallback callback)
175 {
176 UUID sessionID = GetSessionID(userID);
177 try
178 {
179 m_RemoteConnector.GetUserInventory(userID.ToString(), sessionID, callback);
180 }
181 catch (Exception e)
182 {
183 if (StatsManager.SimExtraStats != null)
184 StatsManager.SimExtraStats.AddInventoryServiceRetrievalFailure();
185
186 m_log.ErrorFormat("[INVENTORY CONNECTOR]: Request inventory operation failed, {0} {1}",
187 e.Source, e.Message);
188 }
189
190 }
191
192 // inherited. See base class
193 // public InventoryFolderBase GetFolderForType(UUID userID, AssetType type)
194
195 public override Dictionary<AssetType, InventoryFolderBase> GetSystemFolders(UUID userID)
196 {
197 UUID sessionID = GetSessionID(userID);
198 return m_RemoteConnector.GetSystemFolders(userID.ToString(), sessionID);
199 }
200
201 public override InventoryCollection GetFolderContent(UUID userID, UUID folderID)
202 {
203 UUID sessionID = GetSessionID(userID);
204 try
205 {
206 InventoryCollection invCol = m_RemoteConnector.GetFolderContent(userID.ToString(), folderID, sessionID);
207 foreach (InventoryItemBase item in invCol.Items)
208 UserManager.AddUser(item.CreatorIdAsUuid, item.CreatorData);
209 return invCol;
210 }
211 catch (Exception e)
212 {
213 m_log.ErrorFormat("[INVENTORY CONNECTOR]: GetFolderContent operation failed, {0} {1}",
214 e.Source, e.Message);
215 }
216 InventoryCollection nullCollection = new InventoryCollection();
217 nullCollection.Folders = new List<InventoryFolderBase>();
218 nullCollection.Items = new List<InventoryItemBase>();
219 nullCollection.UserID = userID;
220 return nullCollection;
221 }
222
223 public override List<InventoryItemBase> GetFolderItems(UUID userID, UUID folderID)
224 {
225 UUID sessionID = GetSessionID(userID);
226 return m_RemoteConnector.GetFolderItems(userID.ToString(), folderID, sessionID);
227 }
228
229 public override bool AddFolder(InventoryFolderBase folder)
230 {
231 if (folder == null)
232 return false;
233
234 UUID sessionID = GetSessionID(folder.Owner);
235 return m_RemoteConnector.AddFolder(folder.Owner.ToString(), folder, sessionID);
236 }
237
238 public override bool UpdateFolder(InventoryFolderBase folder)
239 {
240 if (folder == null)
241 return false;
242
243 UUID sessionID = GetSessionID(folder.Owner);
244 return m_RemoteConnector.UpdateFolder(folder.Owner.ToString(), folder, sessionID);
245 }
246
247 public override bool MoveFolder(InventoryFolderBase folder)
248 {
249 if (folder == null)
250 return false;
251
252 UUID sessionID = GetSessionID(folder.Owner);
253 return m_RemoteConnector.MoveFolder(folder.Owner.ToString(), folder, sessionID);
254 }
255
256 public override bool DeleteFolders(UUID ownerID, List<UUID> folderIDs)
257 {
258 if (folderIDs == null)
259 return false;
260 if (folderIDs.Count == 0)
261 return false;
262
263 UUID sessionID = GetSessionID(ownerID);
264 return m_RemoteConnector.DeleteFolders(ownerID.ToString(), folderIDs, sessionID);
265 }
266
267
268 public override bool PurgeFolder(InventoryFolderBase folder)
269 {
270 if (folder == null)
271 return false;
272
273 UUID sessionID = GetSessionID(folder.Owner);
274 return m_RemoteConnector.PurgeFolder(folder.Owner.ToString(), folder, sessionID);
275 }
276
277 // public bool AddItem(InventoryItemBase item) inherited
278 // Uses AddItemPlain
279
280 protected override bool AddItemPlain(InventoryItemBase item)
281 {
282 if (item == null)
283 return false;
284
285 UUID sessionID = GetSessionID(item.Owner);
286 return m_RemoteConnector.AddItem(item.Owner.ToString(), item, sessionID);
287 }
288
289 public override bool UpdateItem(InventoryItemBase item)
290 {
291 if (item == null)
292 return false;
293
294 UUID sessionID = GetSessionID(item.Owner);
295 return m_RemoteConnector.UpdateItem(item.Owner.ToString(), item, sessionID);
296 }
297
298 public override bool MoveItems(UUID ownerID, List<InventoryItemBase> items)
299 {
300 if (items == null)
301 return false;
302
303 UUID sessionID = GetSessionID(ownerID);
304 return m_RemoteConnector.MoveItems(ownerID.ToString(), items, sessionID);
305 }
306
307
308 public override bool DeleteItems(UUID ownerID, List<UUID> itemIDs)
309 {
310 if (itemIDs == null)
311 return false;
312 if (itemIDs.Count == 0)
313 return true;
314
315 UUID sessionID = GetSessionID(ownerID);
316 return m_RemoteConnector.DeleteItems(ownerID.ToString(), itemIDs, sessionID);
317 }
318
319 public override InventoryItemBase GetItem(InventoryItemBase item)
320 {
321 if (item == null)
322 return null;
323
324 UUID sessionID = GetSessionID(item.Owner);
325 return m_RemoteConnector.QueryItem(item.Owner.ToString(), item, sessionID);
326 }
327
328 public override InventoryFolderBase GetFolder(InventoryFolderBase folder)
329 {
330 if (folder == null)
331 return null;
332
333 UUID sessionID = GetSessionID(folder.Owner);
334 return m_RemoteConnector.QueryFolder(folder.Owner.ToString(), folder, sessionID);
335 }
336
337 public override bool HasInventoryForUser(UUID userID)
338 {
339 return false;
340 }
341
342 public override List<InventoryItemBase> GetActiveGestures(UUID userId)
343 {
344 return new List<InventoryItemBase>();
345 }
346
347 public override int GetAssetPermissions(UUID userID, UUID assetID)
348 {
349 UUID sessionID = GetSessionID(userID);
350 return m_RemoteConnector.GetAssetPermissions(userID.ToString(), assetID, sessionID);
351 }
352
353
354 #endregion
355
356 private UUID GetSessionID(UUID userID)
357 {
358 return UUID.Zero;
359 }
360
361 }
362}
diff --git a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Simulation/LocalSimulationConnector.cs b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Simulation/LocalSimulationConnector.cs
index 971a56f..9363714 100644
--- a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Simulation/LocalSimulationConnector.cs
+++ b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Simulation/LocalSimulationConnector.cs
@@ -225,17 +225,17 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Simulation
225 if (destination == null) 225 if (destination == null)
226 return false; 226 return false;
227 227
228 // We limit the number of messages sent for a position change to just one per
229 // simulator so when we receive the update we need to hand it to each of the
230 // scenes; scenes each check to see if the is a scene presence for the avatar
231 // note that we really don't need the GridRegion for this call
228 foreach (Scene s in m_sceneList) 232 foreach (Scene s in m_sceneList)
229 { 233 {
230 if (s.RegionInfo.RegionHandle == destination.RegionHandle) 234 //m_log.Debug("[LOCAL COMMS]: Found region to send ChildAgentUpdate");
231 { 235 s.IncomingChildAgentDataUpdate(cAgentData);
232 //m_log.Debug("[LOCAL COMMS]: Found region to send ChildAgentUpdate");
233 s.IncomingChildAgentDataUpdate(cAgentData);
234 return true;
235 }
236 } 236 }
237 //m_log.Debug("[LOCAL COMMS]: region not found for ChildAgentUpdate"); 237 //m_log.Debug("[LOCAL COMMS]: region not found for ChildAgentUpdate");
238 return false; 238 return true;
239 } 239 }
240 240
241 public bool RetrieveAgent(GridRegion destination, UUID id, out IAgentData agent) 241 public bool RetrieveAgent(GridRegion destination, UUID id, out IAgentData agent)
diff --git a/OpenSim/Region/Framework/Interfaces/ISceneViewer.cs b/OpenSim/Region/Framework/Interfaces/ISceneViewer.cs
index 7251d57..2397f22 100644
--- a/OpenSim/Region/Framework/Interfaces/ISceneViewer.cs
+++ b/OpenSim/Region/Framework/Interfaces/ISceneViewer.cs
@@ -36,5 +36,6 @@ namespace OpenSim.Region.Framework.Interfaces
36 void Close(); 36 void Close();
37 void QueuePartForUpdate(SceneObjectPart part); 37 void QueuePartForUpdate(SceneObjectPart part);
38 void SendPrimUpdates(); 38 void SendPrimUpdates();
39 int GetPendingObjectsCount();
39 } 40 }
40} 41}
diff --git a/OpenSim/Region/Framework/Scenes/SceneCommunicationService.cs b/OpenSim/Region/Framework/Scenes/SceneCommunicationService.cs
index c8af4c3..19cb0c1 100644
--- a/OpenSim/Region/Framework/Scenes/SceneCommunicationService.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneCommunicationService.cs
@@ -189,7 +189,8 @@ namespace OpenSim.Region.Framework.Scenes
189 } 189 }
190 } 190 }
191 191
192 public delegate void SendChildAgentDataUpdateDelegate(AgentPosition cAgentData, UUID scopeID, ulong regionHandle); 192 public delegate void SendChildAgentDataUpdateDelegate(AgentPosition cAgentData, UUID scopeID, GridRegion dest);
193
193 194
194 /// <summary> 195 /// <summary>
195 /// This informs all neighboring regions about the settings of it's child agent. 196 /// This informs all neighboring regions about the settings of it's child agent.
@@ -198,31 +199,17 @@ namespace OpenSim.Region.Framework.Scenes
198 /// This contains information, such as, Draw Distance, Camera location, Current Position, Current throttle settings, etc. 199 /// This contains information, such as, Draw Distance, Camera location, Current Position, Current throttle settings, etc.
199 /// 200 ///
200 /// </summary> 201 /// </summary>
201 private void SendChildAgentDataUpdateAsync(AgentPosition cAgentData, UUID scopeID, ulong regionHandle) 202 private void SendChildAgentDataUpdateAsync(AgentPosition cAgentData, UUID scopeID, GridRegion dest)
202 { 203 {
203 //m_log.Info("[INTERGRID]: Informing neighbors about my agent in " + m_regionInfo.RegionName); 204 //m_log.Info("[INTERGRID]: Informing neighbors about my agent in " + m_regionInfo.RegionName);
204 try 205 try
205 { 206 {
206 //m_commsProvider.InterRegion.ChildAgentUpdate(regionHandle, cAgentData); 207 m_scene.SimulationService.UpdateAgent(dest, cAgentData);
207 uint x = 0, y = 0;
208 Utils.LongToUInts(regionHandle, out x, out y);
209 GridRegion destination = m_scene.GridService.GetRegionByPosition(UUID.Zero, (int)x, (int)y);
210 m_scene.SimulationService.UpdateAgent(destination, cAgentData);
211 } 208 }
212 catch 209 catch
213 { 210 {
214 // Ignore; we did our best 211 // Ignore; we did our best
215 } 212 }
216
217 //if (regionAccepted)
218 //{
219 // //m_log.Info("[INTERGRID]: Completed sending a neighbor an update about my agent");
220 //}
221 //else
222 //{
223 // //m_log.Info("[INTERGRID]: Failed sending a neighbor an update about my agent");
224 //}
225
226 } 213 }
227 214
228 private void SendChildAgentDataUpdateCompleted(IAsyncResult iar) 215 private void SendChildAgentDataUpdateCompleted(IAsyncResult iar)
@@ -236,14 +223,28 @@ namespace OpenSim.Region.Framework.Scenes
236 // This assumes that we know what our neighbors are. 223 // This assumes that we know what our neighbors are.
237 try 224 try
238 { 225 {
226 uint x = 0, y = 0;
227 List<string> simulatorList = new List<string>();
239 foreach (ulong regionHandle in presence.KnownChildRegionHandles) 228 foreach (ulong regionHandle in presence.KnownChildRegionHandles)
240 { 229 {
241 if (regionHandle != m_regionInfo.RegionHandle) 230 if (regionHandle != m_regionInfo.RegionHandle)
242 { 231 {
243 SendChildAgentDataUpdateDelegate d = SendChildAgentDataUpdateAsync; 232 // we only want to send one update to each simulator; the simulator will
244 d.BeginInvoke(cAgentData, m_regionInfo.ScopeID, regionHandle, 233 // hand it off to the regions where a child agent exists, this does assume
245 SendChildAgentDataUpdateCompleted, 234 // that the region position is cached or performance will degrade
246 d); 235 Utils.LongToUInts(regionHandle, out x, out y);
236 GridRegion dest = m_scene.GridService.GetRegionByPosition(UUID.Zero, (int)x, (int)y);
237 if (! simulatorList.Contains(dest.ServerURI))
238 {
239 // we havent seen this simulator before, add it to the list
240 // and send it an update
241 simulatorList.Add(dest.ServerURI);
242
243 SendChildAgentDataUpdateDelegate d = SendChildAgentDataUpdateAsync;
244 d.BeginInvoke(cAgentData, m_regionInfo.ScopeID, dest,
245 SendChildAgentDataUpdateCompleted,
246 d);
247 }
247 } 248 }
248 } 249 }
249 } 250 }
diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs
index 6496a25..d4f3dfe 100644
--- a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs
@@ -2093,8 +2093,9 @@ namespace OpenSim.Region.Framework.Scenes
2093 2093
2094 public void GetProperties(IClientAPI client) 2094 public void GetProperties(IClientAPI client)
2095 { 2095 {
2096 //Viewer wants date in microseconds so multiply it by 1,000,000.
2096 client.SendObjectPropertiesReply( 2097 client.SendObjectPropertiesReply(
2097 m_fromUserInventoryItemID, (ulong)_creationDate, _creatorID, UUID.Zero, UUID.Zero, 2098 m_fromUserInventoryItemID, (ulong)_creationDate*(ulong)1e6, _creatorID, UUID.Zero, UUID.Zero,
2098 _groupID, (short)InventorySerial, _lastOwnerID, UUID, _ownerID, 2099 _groupID, (short)InventorySerial, _lastOwnerID, UUID, _ownerID,
2099 ParentGroup.RootPart.TouchName, new byte[0], ParentGroup.RootPart.SitName, Name, Description, 2100 ParentGroup.RootPart.TouchName, new byte[0], ParentGroup.RootPart.SitName, Name, Description,
2100 ParentGroup.RootPart._ownerMask, ParentGroup.RootPart._nextOwnerMask, ParentGroup.RootPart._groupMask, ParentGroup.RootPart._everyoneMask, 2101 ParentGroup.RootPart._ownerMask, ParentGroup.RootPart._nextOwnerMask, ParentGroup.RootPart._groupMask, ParentGroup.RootPart._everyoneMask,
diff --git a/OpenSim/Region/Framework/Scenes/SceneViewer.cs b/OpenSim/Region/Framework/Scenes/SceneViewer.cs
index 40a73a9..1f4ec96 100644
--- a/OpenSim/Region/Framework/Scenes/SceneViewer.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneViewer.cs
@@ -205,6 +205,14 @@ namespace OpenSim.Region.Framework.Scenes
205 Reset(); 205 Reset();
206 } 206 }
207 207
208 public int GetPendingObjectsCount()
209 {
210 if (m_pendingObjects != null)
211 return m_pendingObjects.Count;
212
213 return 0;
214 }
215
208 public class ScenePartUpdate 216 public class ScenePartUpdate
209 { 217 {
210 public UUID FullID; 218 public UUID FullID;
diff --git a/OpenSim/Region/OptionalModules/Agent/UDP/Linden/LindenUDPInfoModule.cs b/OpenSim/Region/OptionalModules/Agent/UDP/Linden/LindenUDPInfoModule.cs
index 87d067c..6630edb 100644
--- a/OpenSim/Region/OptionalModules/Agent/UDP/Linden/LindenUDPInfoModule.cs
+++ b/OpenSim/Region/OptionalModules/Agent/UDP/Linden/LindenUDPInfoModule.cs
@@ -154,24 +154,26 @@ namespace OpenSim.Region.CoreModules.UDP.Linden
154 report.Append(GetColumnEntry("Type", maxTypeLength, columnPadding)); 154 report.Append(GetColumnEntry("Type", maxTypeLength, columnPadding));
155 155
156 report.AppendFormat( 156 report.AppendFormat(
157 "{0,7} {1,7} {2,9} {3,8} {4,7} {5,7} {6,7} {7,7} {8,9} {9,7} {10,7}\n", 157 "{0,7} {1,7} {2,7} {3,9} {4,7} {5,7} {6,7} {7,7} {8,7} {9,8} {10,7} {11,7}\n",
158 "Pkts", 158 "Pkts",
159 "Pkts", 159 "Pkts",
160 "Pkts",
160 "Bytes", 161 "Bytes",
161 "Pkts", 162 "Q Pkts",
162 "Pkts", 163 "Q Pkts",
163 "Pkts", 164 "Q Pkts",
164 "Pkts", 165 "Q Pkts",
165 "Pkts", 166 "Q Pkts",
166 "Pkts", 167 "Q Pkts",
167 "Pkts", 168 "Q Pkts",
168 "Pkts"); 169 "Q Pkts");
169 170
170 report.AppendFormat("{0,-" + totalInfoFieldsLength + "}", ""); 171 report.AppendFormat("{0,-" + totalInfoFieldsLength + "}", "");
171 report.AppendFormat( 172 report.AppendFormat(
172 "{0,7} {1,7} {2,9} {3,8} {4,7} {5,7} {6,7} {7,7} {8,9} {9,7} {10,7}\n", 173 "{0,7} {1,7} {2,7} {3,9} {4,7} {5,7} {6,7} {7,7} {8,7} {9,8} {10,7} {11,7}\n",
173 "Out",
174 "In", 174 "In",
175 "Out",
176 "Resent",
175 "Unacked", 177 "Unacked",
176 "Resend", 178 "Resend",
177 "Land", 179 "Land",
diff --git a/OpenSim/Region/OptionalModules/Avatar/XmlRpcGroups/IGroupsServicesConnector.cs b/OpenSim/Region/OptionalModules/Avatar/XmlRpcGroups/IGroupsServicesConnector.cs
index 5c779de..6d26075 100644
--- a/OpenSim/Region/OptionalModules/Avatar/XmlRpcGroups/IGroupsServicesConnector.cs
+++ b/OpenSim/Region/OptionalModules/Avatar/XmlRpcGroups/IGroupsServicesConnector.cs
@@ -63,7 +63,26 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
63 void SetAgentActiveGroupRole(UUID RequestingAgentID, UUID AgentID, UUID GroupID, UUID RoleID); 63 void SetAgentActiveGroupRole(UUID RequestingAgentID, UUID AgentID, UUID GroupID, UUID RoleID);
64 void SetAgentGroupInfo(UUID RequestingAgentID, UUID AgentID, UUID GroupID, bool AcceptNotices, bool ListInProfile); 64 void SetAgentGroupInfo(UUID RequestingAgentID, UUID AgentID, UUID GroupID, bool AcceptNotices, bool ListInProfile);
65 65
66 /// <summary>
67 /// Get information about a specific group to which the user belongs.
68 /// </summary>
69 /// <param name="RequestingAgentID">The agent requesting the information.</param>
70 /// <param name="AgentID">The agent requested.</param>
71 /// <param name="GroupID">The group requested.</param>
72 /// <returns>
73 /// If the user is a member of the group then the data structure is returned. If not, then null is returned.
74 /// </returns>
66 GroupMembershipData GetAgentGroupMembership(UUID RequestingAgentID, UUID AgentID, UUID GroupID); 75 GroupMembershipData GetAgentGroupMembership(UUID RequestingAgentID, UUID AgentID, UUID GroupID);
76
77 /// <summary>
78 /// Get information about the groups to which a user belongs.
79 /// </summary>
80 /// <param name="RequestingAgentID">The agent requesting the information.</param>
81 /// <param name="AgentID">The agent requested.</param>
82 /// <returns>
83 /// Information about the groups to which the user belongs. If the user belongs to no groups then an empty
84 /// list is returned.
85 /// </returns>
67 List<GroupMembershipData> GetAgentGroupMemberships(UUID RequestingAgentID, UUID AgentID); 86 List<GroupMembershipData> GetAgentGroupMemberships(UUID RequestingAgentID, UUID AgentID);
68 87
69 void AddGroupNotice(UUID RequestingAgentID, UUID groupID, UUID noticeID, string fromName, string subject, string message, byte[] binaryBucket); 88 void AddGroupNotice(UUID RequestingAgentID, UUID groupID, UUID noticeID, string fromName, string subject, string message, byte[] binaryBucket);
diff --git a/OpenSim/Region/OptionalModules/Avatar/XmlRpcGroups/SimianGroupsServicesConnectorModule.cs b/OpenSim/Region/OptionalModules/Avatar/XmlRpcGroups/SimianGroupsServicesConnectorModule.cs
index 0d265f2..81725c5 100644
--- a/OpenSim/Region/OptionalModules/Avatar/XmlRpcGroups/SimianGroupsServicesConnectorModule.cs
+++ b/OpenSim/Region/OptionalModules/Avatar/XmlRpcGroups/SimianGroupsServicesConnectorModule.cs
@@ -704,7 +704,6 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
704 } 704 }
705 } 705 }
706 706
707
708 return findings; 707 return findings;
709 } 708 }
710 709
@@ -712,54 +711,55 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
712 { 711 {
713 if (m_debugEnabled) m_log.InfoFormat("[SIMIAN-GROUPS-CONNECTOR] {0} called", System.Reflection.MethodBase.GetCurrentMethod().Name); 712 if (m_debugEnabled) m_log.InfoFormat("[SIMIAN-GROUPS-CONNECTOR] {0} called", System.Reflection.MethodBase.GetCurrentMethod().Name);
714 713
715 GroupMembershipData data = new GroupMembershipData(); 714 GroupMembershipData data = null;
716 715 bool foundData = false;
717 ///////////////////////////////
718 // Agent Specific Information:
719 //
720 OSDMap UserActiveGroup;
721 if (SimianGetGenericEntry(agentID, "Group", "ActiveGroup", out UserActiveGroup))
722 {
723 data.Active = UserActiveGroup["GroupID"].AsUUID().Equals(groupID);
724 }
725 716
726 OSDMap UserGroupMemberInfo; 717 OSDMap UserGroupMemberInfo;
727 if (SimianGetGenericEntry(agentID, "GroupMember", groupID.ToString(), out UserGroupMemberInfo)) 718 if (SimianGetGenericEntry(agentID, "GroupMember", groupID.ToString(), out UserGroupMemberInfo))
728 { 719 {
720 data = new GroupMembershipData();
729 data.AcceptNotices = UserGroupMemberInfo["AcceptNotices"].AsBoolean(); 721 data.AcceptNotices = UserGroupMemberInfo["AcceptNotices"].AsBoolean();
730 data.Contribution = UserGroupMemberInfo["Contribution"].AsInteger(); 722 data.Contribution = UserGroupMemberInfo["Contribution"].AsInteger();
731 data.ListInProfile = UserGroupMemberInfo["ListInProfile"].AsBoolean(); 723 data.ListInProfile = UserGroupMemberInfo["ListInProfile"].AsBoolean();
732 data.ActiveRole = UserGroupMemberInfo["SelectedRoleID"].AsUUID(); 724 data.ActiveRole = UserGroupMemberInfo["SelectedRoleID"].AsUUID();
725
726 ///////////////////////////////
727 // Agent Specific Information:
728 //
729 OSDMap UserActiveGroup;
730 if (SimianGetGenericEntry(agentID, "Group", "ActiveGroup", out UserActiveGroup))
731 {
732 data.Active = UserActiveGroup["GroupID"].AsUUID().Equals(groupID);
733 }
733 734
734 /////////////////////////////// 735 ///////////////////////////////
735 // Role Specific Information: 736 // Role Specific Information:
736 // 737 //
737
738 OSDMap GroupRoleInfo; 738 OSDMap GroupRoleInfo;
739 if (SimianGetGenericEntry(groupID, "GroupRole", data.ActiveRole.ToString(), out GroupRoleInfo)) 739 if (SimianGetGenericEntry(groupID, "GroupRole", data.ActiveRole.ToString(), out GroupRoleInfo))
740 { 740 {
741 data.GroupTitle = GroupRoleInfo["Title"].AsString(); 741 data.GroupTitle = GroupRoleInfo["Title"].AsString();
742 data.GroupPowers = GroupRoleInfo["Powers"].AsULong(); 742 data.GroupPowers = GroupRoleInfo["Powers"].AsULong();
743 } 743 }
744 } 744
745 745 ///////////////////////////////
746 /////////////////////////////// 746 // Group Specific Information:
747 // Group Specific Information: 747 //
748 // 748 OSDMap GroupInfo;
749 OSDMap GroupInfo; 749 string GroupName;
750 string GroupName; 750 if (SimianGetFirstGenericEntry(groupID, "Group", out GroupName, out GroupInfo))
751 if (SimianGetFirstGenericEntry(groupID, "Group", out GroupName, out GroupInfo)) 751 {
752 { 752 data.GroupID = groupID;
753 data.GroupID = groupID; 753 data.AllowPublish = GroupInfo["AllowPublish"].AsBoolean();
754 data.AllowPublish = GroupInfo["AllowPublish"].AsBoolean(); 754 data.Charter = GroupInfo["Charter"].AsString();
755 data.Charter = GroupInfo["Charter"].AsString(); 755 data.FounderID = GroupInfo["FounderID"].AsUUID();
756 data.FounderID = GroupInfo["FounderID"].AsUUID(); 756 data.GroupName = GroupName;
757 data.GroupName = GroupName; 757 data.GroupPicture = GroupInfo["InsigniaID"].AsUUID();
758 data.GroupPicture = GroupInfo["InsigniaID"].AsUUID(); 758 data.MaturePublish = GroupInfo["MaturePublish"].AsBoolean();
759 data.MaturePublish = GroupInfo["MaturePublish"].AsBoolean(); 759 data.MembershipFee = GroupInfo["MembershipFee"].AsInteger();
760 data.MembershipFee = GroupInfo["MembershipFee"].AsInteger(); 760 data.OpenEnrollment = GroupInfo["OpenEnrollment"].AsBoolean();
761 data.OpenEnrollment = GroupInfo["OpenEnrollment"].AsBoolean(); 761 data.ShowInList = GroupInfo["ShowInList"].AsBoolean();
762 data.ShowInList = GroupInfo["ShowInList"].AsBoolean(); 762 }
763 } 763 }
764 764
765 return data; 765 return data;
diff --git a/OpenSim/Region/OptionalModules/World/WorldView/WorldViewModule.cs b/OpenSim/Region/OptionalModules/World/WorldView/WorldViewModule.cs
index d4b7020..cee8851 100644
--- a/OpenSim/Region/OptionalModules/World/WorldView/WorldViewModule.cs
+++ b/OpenSim/Region/OptionalModules/World/WorldView/WorldViewModule.cs
@@ -71,6 +71,9 @@ namespace OpenSim.Region.OptionalModules.World.WorldView
71 71
72 public void RegionLoaded(Scene scene) 72 public void RegionLoaded(Scene scene)
73 { 73 {
74 if (!m_Enabled)
75 return;
76
74 m_Generator = scene.RequestModuleInterface<IMapImageGenerator>(); 77 m_Generator = scene.RequestModuleInterface<IMapImageGenerator>();
75 if (m_Generator == null) 78 if (m_Generator == null)
76 { 79 {
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs
index cdaaab3..aa6e505 100644
--- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs
+++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs
@@ -1920,15 +1920,14 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
1920 if (part == null || part.ParentGroup == null || part.ParentGroup.IsDeleted) 1920 if (part == null || part.ParentGroup == null || part.ParentGroup.IsDeleted)
1921 return; 1921 return;
1922 1922
1923 UUID textureID=new UUID(); 1923 UUID textureID = new UUID();
1924 1924
1925 if (!UUID.TryParse(texture, out textureID)) 1925 textureID = InventoryKey(texture, (int)AssetType.Texture);
1926 { 1926 if (textureID == UUID.Zero)
1927 textureID=InventoryKey(texture, (int)AssetType.Texture); 1927 {
1928 } 1928 if (!UUID.TryParse(texture, out textureID))
1929 1929 return;
1930 if (textureID == UUID.Zero) 1930 }
1931 return;
1932 1931
1933 Primitive.TextureEntry tex = part.Shape.Textures; 1932 Primitive.TextureEntry tex = part.Shape.Textures;
1934 1933
@@ -3346,12 +3345,19 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
3346 msg.ParentEstateID = World.RegionInfo.EstateSettings.EstateID; 3345 msg.ParentEstateID = World.RegionInfo.EstateSettings.EstateID;
3347 msg.Position = new Vector3(m_host.AbsolutePosition); 3346 msg.Position = new Vector3(m_host.AbsolutePosition);
3348 msg.RegionID = World.RegionInfo.RegionID.Guid; 3347 msg.RegionID = World.RegionInfo.RegionID.Guid;
3349 msg.binaryBucket = Util.StringToBytes256(m_host.OwnerID.ToString()); 3348 msg.binaryBucket
3349 = Util.StringToBytes256(
3350 "{0}/{1}/{2}/{3}",
3351 World.RegionInfo.RegionName,
3352 (int)Math.Floor(m_host.AbsolutePosition.X),
3353 (int)Math.Floor(m_host.AbsolutePosition.Y),
3354 (int)Math.Floor(m_host.AbsolutePosition.Z));
3350 3355
3351 if (m_TransferModule != null) 3356 if (m_TransferModule != null)
3352 { 3357 {
3353 m_TransferModule.SendInstantMessage(msg, delegate(bool success) {}); 3358 m_TransferModule.SendInstantMessage(msg, delegate(bool success) {});
3354 } 3359 }
3360
3355 ScriptSleep(2000); 3361 ScriptSleep(2000);
3356 } 3362 }
3357 3363
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs
index cf059b3..4d299d6 100644
--- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs
+++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs
@@ -711,7 +711,9 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
711 // and convert the regionName to the target region 711 // and convert the regionName to the target region
712 if (regionName.Contains(".") && regionName.Contains(":")) 712 if (regionName.Contains(".") && regionName.Contains(":"))
713 { 713 {
714// List<GridRegion> regions = World.GridService.GetRegionsByName(World.RegionInfo.ScopeID, regionName, 1); 714 World.GridService.GetRegionsByName(World.RegionInfo.ScopeID, regionName, 1);
715// List<GridRegion> regions = World.GridService.GetRegionsByName(World.RegionInfo.ScopeID, regionName, 1);
716
715 string[] parts = regionName.Split(new char[] { ':' }); 717 string[] parts = regionName.Split(new char[] { ':' });
716 if (parts.Length > 2) 718 if (parts.Length > 2)
717 regionName = parts[0] + ':' + parts[1] + "/ " + parts[2]; 719 regionName = parts[0] + ':' + parts[1] + "/ " + parts[2];