aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Region
diff options
context:
space:
mode:
Diffstat (limited to 'OpenSim/Region')
-rw-r--r--OpenSim/Region/CoreModules/Communications/Local/LocalInterregionComms.cs17
-rw-r--r--OpenSim/Region/CoreModules/Communications/REST/RESTInterregionComms.cs268
-rw-r--r--OpenSim/Region/Framework/Interfaces/IInterregionComms.cs23
-rw-r--r--OpenSim/Region/Framework/Scenes/Scene.cs11
-rw-r--r--OpenSim/Region/Framework/Scenes/SceneCommunicationService.cs10
5 files changed, 292 insertions, 37 deletions
diff --git a/OpenSim/Region/CoreModules/Communications/Local/LocalInterregionComms.cs b/OpenSim/Region/CoreModules/Communications/Local/LocalInterregionComms.cs
index 6e813f4..29bc4f7 100644
--- a/OpenSim/Region/CoreModules/Communications/Local/LocalInterregionComms.cs
+++ b/OpenSim/Region/CoreModules/Communications/Local/LocalInterregionComms.cs
@@ -227,6 +227,23 @@ namespace OpenSim.Region.CoreModules.Communications.Local
227 return false; 227 return false;
228 } 228 }
229 229
230 /**
231 * Region-related communications
232 */
233
234 public bool SendHelloNeighbour(ulong regionHandle, RegionInfo thisRegion)
235 {
236 foreach (Scene s in m_sceneList)
237 {
238 if (s.RegionInfo.RegionHandle == regionHandle)
239 {
240 //m_log.Debug("[LOCAL COMMS]: Found region to SendHelloNeighbour");
241 return s.IncomingHelloNeighbour(thisRegion);
242 }
243 }
244 return false;
245 }
246
230 #endregion /* IInterregionComms */ 247 #endregion /* IInterregionComms */
231 248
232 #region Misc 249 #region Misc
diff --git a/OpenSim/Region/CoreModules/Communications/REST/RESTInterregionComms.cs b/OpenSim/Region/CoreModules/Communications/REST/RESTInterregionComms.cs
index fcb3f5b..bc98337 100644
--- a/OpenSim/Region/CoreModules/Communications/REST/RESTInterregionComms.cs
+++ b/OpenSim/Region/CoreModules/Communications/REST/RESTInterregionComms.cs
@@ -45,7 +45,7 @@ namespace OpenSim.Region.CoreModules.Communications.REST
45{ 45{
46 public class RESTInterregionComms : IRegionModule, IInterregionCommsOut 46 public class RESTInterregionComms : IRegionModule, IInterregionCommsOut
47 { 47 {
48 private bool initialized = false; 48 private static bool initialized = false;
49 private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); 49 private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
50 50
51 protected bool m_enabled = false; 51 protected bool m_enabled = false;
@@ -78,6 +78,7 @@ namespace OpenSim.Region.CoreModules.Communications.REST
78 return; 78 return;
79 79
80 InitEach(scene); 80 InitEach(scene);
81
81 } 82 }
82 83
83 public virtual void PostInitialise() 84 public virtual void PostInitialise()
@@ -115,8 +116,9 @@ namespace OpenSim.Region.CoreModules.Communications.REST
115 116
116 protected virtual void AddHTTPHandlers() 117 protected virtual void AddHTTPHandlers()
117 { 118 {
118 m_aScene.CommsManager.HttpServer.AddHTTPHandler("/agent/", AgentHandler); 119 m_aScene.CommsManager.HttpServer.AddHTTPHandler("/agent/", AgentHandler);
119 m_aScene.CommsManager.HttpServer.AddHTTPHandler("/object/", ObjectHandler); 120 m_aScene.CommsManager.HttpServer.AddHTTPHandler("/object/", ObjectHandler);
121 m_aScene.CommsManager.HttpServer.AddHTTPHandler("/region/", RegionHandler);
120 } 122 }
121 123
122 #endregion /* IRegionModule */ 124 #endregion /* IRegionModule */
@@ -161,6 +163,7 @@ namespace OpenSim.Region.CoreModules.Communications.REST
161 //else 163 //else
162 // m_log.Warn("[REST COMMS]: Region not found " + regionHandle); 164 // m_log.Warn("[REST COMMS]: Region not found " + regionHandle);
163 return false; 165 return false;
166
164 } 167 }
165 168
166 public bool SendChildAgentUpdate(ulong regionHandle, AgentPosition cAgentData) 169 public bool SendChildAgentUpdate(ulong regionHandle, AgentPosition cAgentData)
@@ -178,6 +181,7 @@ namespace OpenSim.Region.CoreModules.Communications.REST
178 //else 181 //else
179 // m_log.Warn("[REST COMMS]: Region not found " + regionHandle); 182 // m_log.Warn("[REST COMMS]: Region not found " + regionHandle);
180 return false; 183 return false;
184
181 } 185 }
182 186
183 public bool SendReleaseAgent(ulong regionHandle, UUID id, string uri) 187 public bool SendReleaseAgent(ulong regionHandle, UUID id, string uri)
@@ -231,6 +235,32 @@ namespace OpenSim.Region.CoreModules.Communications.REST
231 return false; 235 return false;
232 } 236 }
233 237
238 /**
239 * Region-related communications
240 */
241
242 public bool SendHelloNeighbour(ulong regionHandle, RegionInfo thisRegion)
243 {
244 // Try local first
245 if (m_localBackend.SendHelloNeighbour(regionHandle, thisRegion))
246 {
247 //m_log.Debug("[REST COMMS]: LocalBackEnd SendHelloNeighbour succeeded");
248 return true;
249 }
250
251 // else do the remote thing
252 RegionInfo regInfo = m_commsManager.GridService.RequestNeighbourInfo(regionHandle);
253 if ((regInfo != null) &&
254 // Don't remote-call this instance; that's a startup hickup
255 !((regInfo.ExternalHostName == thisRegion.ExternalHostName) && (regInfo.HttpPort == thisRegion.HttpPort)))
256 {
257 return DoHelloNeighbourCall(regInfo, thisRegion);
258 }
259 //else
260 // m_log.Warn("[REST COMMS]: Region not found " + regionHandle);
261 return false;
262 }
263
234 #endregion /* IInterregionComms */ 264 #endregion /* IInterregionComms */
235 265
236 #region DoWork functions for the above public interface 266 #region DoWork functions for the above public interface
@@ -482,7 +512,7 @@ namespace OpenSim.Region.CoreModules.Communications.REST
482 512
483 WebRequest ObjectCreateRequest = WebRequest.Create(uri); 513 WebRequest ObjectCreateRequest = WebRequest.Create(uri);
484 ObjectCreateRequest.Method = "POST"; 514 ObjectCreateRequest.Method = "POST";
485 ObjectCreateRequest.ContentType = "text/xml"; 515 ObjectCreateRequest.ContentType = "application/json";
486 ObjectCreateRequest.Timeout = 10000; 516 ObjectCreateRequest.Timeout = 10000;
487 517
488 OSDMap args = new OSDMap(2); 518 OSDMap args = new OSDMap(2);
@@ -555,6 +585,90 @@ namespace OpenSim.Region.CoreModules.Communications.REST
555 585
556 } 586 }
557 587
588 protected bool DoHelloNeighbourCall(RegionInfo region, RegionInfo thisRegion)
589 {
590 string uri = "http://" + region.ExternalEndPoint.Address + ":" + region.HttpPort + "/region/" + thisRegion.RegionID + "/";
591 //Console.WriteLine(" >>> DoHelloNeighbourCall <<< " + uri);
592
593 WebRequest HelloNeighbourRequest = WebRequest.Create(uri);
594 HelloNeighbourRequest.Method = "POST";
595 HelloNeighbourRequest.ContentType = "application/json";
596 HelloNeighbourRequest.Timeout = 10000;
597
598 // Fill it in
599 OSDMap args = null;
600 try
601 {
602 args = thisRegion.PackRegionInfoData();
603 }
604 catch (Exception e)
605 {
606 m_log.Debug("[REST COMMS]: PackRegionInfoData failed with exception: " + e.Message);
607 }
608 // Add the regionhandle of the destination region
609 ulong regionHandle = GetRegionHandle(region.RegionHandle);
610 args["destination_handle"] = OSD.FromString(regionHandle.ToString());
611
612 string strBuffer = "";
613 byte[] buffer = new byte[1];
614 try
615 {
616 strBuffer = OSDParser.SerializeJsonString(args);
617 UTF8Encoding str = new UTF8Encoding();
618 buffer = str.GetBytes(strBuffer);
619
620 }
621 catch (Exception e)
622 {
623 m_log.WarnFormat("[REST COMMS]: Exception thrown on serialization of HelloNeighbour: {0}", e.Message);
624 // ignore. buffer will be empty, caller should check.
625 }
626
627 Stream os = null;
628 try
629 { // send the Post
630 HelloNeighbourRequest.ContentLength = buffer.Length; //Count bytes to send
631 os = HelloNeighbourRequest.GetRequestStream();
632 os.Write(buffer, 0, strBuffer.Length); //Send it
633 os.Close();
634 //m_log.InfoFormat("[REST COMMS]: Posted HelloNeighbour request to remote sim {0}", uri);
635 }
636 //catch (WebException ex)
637 catch
638 {
639 //m_log.InfoFormat("[REST COMMS]: Bad send on HelloNeighbour {0}", ex.Message);
640
641 return false;
642 }
643
644 // Let's wait for the response
645 //m_log.Info("[REST COMMS]: Waiting for a reply after DoHelloNeighbourCall");
646
647 try
648 {
649 WebResponse webResponse = HelloNeighbourRequest.GetResponse();
650 if (webResponse == null)
651 {
652 m_log.Info("[REST COMMS]: Null reply on DoHelloNeighbourCall post");
653 }
654
655 StreamReader sr = new StreamReader(webResponse.GetResponseStream());
656 //reply = sr.ReadToEnd().Trim();
657 sr.ReadToEnd().Trim();
658 sr.Close();
659 //m_log.InfoFormat("[REST COMMS]: DoHelloNeighbourCall reply was {0} ", reply);
660
661 }
662 catch (WebException ex)
663 {
664 m_log.InfoFormat("[REST COMMS]: exception on reply of DoHelloNeighbourCall {0}", ex.Message);
665 // ignore, really
666 }
667
668 return true;
669
670 }
671
558 #endregion /* Do Work */ 672 #endregion /* Do Work */
559 673
560 #region Incoming calls from remote instances 674 #region Incoming calls from remote instances
@@ -617,33 +731,6 @@ namespace OpenSim.Region.CoreModules.Communications.REST
617 731
618 } 732 }
619 733
620 protected OSDMap GetOSDMap(Hashtable request)
621 {
622 OSDMap args = null;
623 try
624 {
625 OSD buffer;
626 // We should pay attention to the content-type, but let's assume we know it's Json
627 buffer = OSDParser.DeserializeJson((string)request["body"]);
628 if (buffer.Type == OSDType.Map)
629 {
630 args = (OSDMap)buffer;
631 return args;
632 }
633 else
634 {
635 // uh?
636 m_log.Debug("[REST COMMS]: Got OSD of type " + buffer.Type.ToString());
637 return null;
638 }
639 }
640 catch (Exception ex)
641 {
642 m_log.InfoFormat("[REST COMMS]: exception on parse of REST message {0}", ex.Message);
643 return null;
644 }
645 }
646
647 protected virtual void DoAgentPost(Hashtable request, Hashtable responsedata, UUID id) 734 protected virtual void DoAgentPost(Hashtable request, Hashtable responsedata, UUID id)
648 { 735 {
649 OSDMap args = GetOSDMap(request); 736 OSDMap args = GetOSDMap(request);
@@ -868,10 +955,129 @@ namespace OpenSim.Region.CoreModules.Communications.REST
868 responsedata["str_response_string"] = result.ToString(); 955 responsedata["str_response_string"] = result.ToString();
869 } 956 }
870 957
958 /*
959 * Region-related incoming calls
960 *
961 */
962
963 public Hashtable RegionHandler(Hashtable request)
964 {
965 //m_log.Debug("[CONNECTION DEBUGGING]: RegionHandler Called");
966
967 //Console.WriteLine("---------------------------");
968 //Console.WriteLine(" >> uri=" + request["uri"]);
969 //Console.WriteLine(" >> content-type=" + request["content-type"]);
970 //Console.WriteLine(" >> http-method=" + request["http-method"]);
971 //Console.WriteLine("---------------------------\n");
972
973 Hashtable responsedata = new Hashtable();
974 responsedata["content_type"] = "text/html";
975
976 UUID regionID;
977 string action;
978 ulong regionHandle;
979 if (!GetParams((string)request["uri"], out regionID, out regionHandle, out action))
980 {
981 m_log.InfoFormat("[REST COMMS]: Invalid parameters for object message {0}", request["uri"]);
982 responsedata["int_response_code"] = 404;
983 responsedata["str_response_string"] = "false";
984
985 return responsedata;
986 }
987
988 // Next, let's parse the verb
989 string method = (string)request["http-method"];
990 if (method.Equals("POST"))
991 {
992 DoRegionPost(request, responsedata, regionID);
993 return responsedata;
994 }
995 //else if (method.Equals("PUT"))
996 //{
997 // DoRegionPut(request, responsedata, regionID);
998 // return responsedata;
999 //}
1000 //else if (method.Equals("DELETE"))
1001 //{
1002 // DoRegionDelete(request, responsedata, regiontID);
1003 // return responsedata;
1004 //}
1005 else
1006 {
1007 m_log.InfoFormat("[REST COMMS]: method {0} not supported in region message", method);
1008 responsedata["int_response_code"] = 404;
1009 responsedata["str_response_string"] = "false";
1010
1011 return responsedata;
1012 }
1013
1014 }
1015
1016 protected virtual void DoRegionPost(Hashtable request, Hashtable responsedata, UUID id)
1017 {
1018 OSDMap args = GetOSDMap(request);
1019 if (args == null)
1020 {
1021 responsedata["int_response_code"] = 400;
1022 responsedata["str_response_string"] = "false";
1023 return;
1024 }
1025
1026 // retrieve the regionhandle
1027 ulong regionhandle = 0;
1028 if (args["destination_handle"] != null)
1029 UInt64.TryParse(args["destination_handle"].AsString(), out regionhandle);
1030
1031 RegionInfo aRegion = new RegionInfo();
1032 try
1033 {
1034 aRegion.UnpackRegionInfoData(args);
1035 }
1036 catch (Exception ex)
1037 {
1038 m_log.InfoFormat("[REST COMMS]: exception on unpacking HelloNeighbour message {0}", ex.Message);
1039 return;
1040 }
1041
1042 // This is the meaning of POST region
1043 bool result = m_localBackend.SendHelloNeighbour(regionhandle, aRegion);
1044
1045 responsedata["int_response_code"] = 200;
1046 responsedata["str_response_string"] = result.ToString();
1047 }
1048
1049
871 #endregion 1050 #endregion
872 1051
873 #region Misc 1052 #region Misc
874 1053
1054 protected OSDMap GetOSDMap(Hashtable request)
1055 {
1056 OSDMap args = null;
1057 try
1058 {
1059 OSD buffer;
1060 // We should pay attention to the content-type, but let's assume we know it's Json
1061 buffer = OSDParser.DeserializeJson((string)request["body"]);
1062 if (buffer.Type == OSDType.Map)
1063 {
1064 args = (OSDMap)buffer;
1065 return args;
1066 }
1067 else
1068 {
1069 // uh?
1070 m_log.Debug("[REST COMMS]: Got OSD of type " + buffer.Type.ToString());
1071 return null;
1072 }
1073 }
1074 catch (Exception ex)
1075 {
1076 m_log.InfoFormat("[REST COMMS]: exception on parse of REST message {0}", ex.Message);
1077 return null;
1078 }
1079 }
1080
875 /// <summary> 1081 /// <summary>
876 /// Extract the param from an uri. 1082 /// Extract the param from an uri.
877 /// </summary> 1083 /// </summary>
diff --git a/OpenSim/Region/Framework/Interfaces/IInterregionComms.cs b/OpenSim/Region/Framework/Interfaces/IInterregionComms.cs
index d3f44bb..0b62df2 100644
--- a/OpenSim/Region/Framework/Interfaces/IInterregionComms.cs
+++ b/OpenSim/Region/Framework/Interfaces/IInterregionComms.cs
@@ -32,8 +32,11 @@ namespace OpenSim.Region.Framework.Interfaces
32{ 32{
33 public delegate bool ChildAgentUpdateReceived(AgentData data); 33 public delegate bool ChildAgentUpdateReceived(AgentData data);
34 34
35 public interface IInterregionCommsOut 35 public interface IInterregionCommsOut
36 { 36 {
37
38 #region Agents
39
37 bool SendCreateChildAgent(ulong regionHandle, AgentCircuitData aCircuit); 40 bool SendCreateChildAgent(ulong regionHandle, AgentCircuitData aCircuit);
38 41
39 /// <summary> 42 /// <summary>
@@ -70,8 +73,26 @@ namespace OpenSim.Region.Framework.Interfaces
70 /// <returns></returns> 73 /// <returns></returns>
71 bool SendCloseAgent(ulong regionHandle, UUID id); 74 bool SendCloseAgent(ulong regionHandle, UUID id);
72 75
76 #endregion Agents
77
78 #region Objects
79
80 /// <summary>
81 /// Create an object in the destination region. This message is used primarily for prim crossing.
82 /// </summary>
83 /// <param name="regionHandle"></param>
84 /// <param name="sog"></param>
85 /// <param name="isLocalCall"></param>
86 /// <returns></returns>
73 bool SendCreateObject(ulong regionHandle, ISceneObject sog, bool isLocalCall); 87 bool SendCreateObject(ulong regionHandle, ISceneObject sog, bool isLocalCall);
74 88
89 #endregion Objects
90
91 #region Regions
92
93 bool SendHelloNeighbour(ulong regionHandle, RegionInfo thisRegion);
94
95 #endregion Regions
75 } 96 }
76 97
77 // This may not be needed, but having it here for now. 98 // This may not be needed, but having it here for now.
diff --git a/OpenSim/Region/Framework/Scenes/Scene.cs b/OpenSim/Region/Framework/Scenes/Scene.cs
index c31e6f7..b42c46e 100644
--- a/OpenSim/Region/Framework/Scenes/Scene.cs
+++ b/OpenSim/Region/Framework/Scenes/Scene.cs
@@ -422,6 +422,8 @@ namespace OpenSim.Region.Framework.Scenes
422 /// <returns>True after all operations complete, throws exceptions otherwise.</returns> 422 /// <returns>True after all operations complete, throws exceptions otherwise.</returns>
423 public override bool OtherRegionUp(RegionInfo otherRegion) 423 public override bool OtherRegionUp(RegionInfo otherRegion)
424 { 424 {
425 m_log.InfoFormat("[SCENE]: Region {0} up in coords {1}-{2}", otherRegion.RegionName, otherRegion.RegionLocX, otherRegion.RegionLocY);
426
425 if (RegionInfo.RegionHandle != otherRegion.RegionHandle) 427 if (RegionInfo.RegionHandle != otherRegion.RegionHandle)
426 { 428 {
427 for (int i = 0; i < m_neighbours.Count; i++) 429 for (int i = 0; i < m_neighbours.Count; i++)
@@ -517,6 +519,13 @@ namespace OpenSim.Region.Framework.Scenes
517 return found; 519 return found;
518 } 520 }
519 521
522
523 // Alias IncomingHelloNeighbour OtherRegionUp, for now
524 public bool IncomingHelloNeighbour(RegionInfo neighbour)
525 {
526 return OtherRegionUp(neighbour);
527 }
528
520 /// <summary> 529 /// <summary>
521 /// Given float seconds, this will restart the region. 530 /// Given float seconds, this will restart the region.
522 /// </summary> 531 /// </summary>
@@ -2569,7 +2578,7 @@ namespace OpenSim.Region.Framework.Scenes
2569 /// <param name="region"></param> 2578 /// <param name="region"></param>
2570 public void InformClientOfNeighbor(ScenePresence presence, RegionInfo region) 2579 public void InformClientOfNeighbor(ScenePresence presence, RegionInfo region)
2571 { 2580 {
2572 m_sceneGridService.InformNeighborChildAgent(presence, region, m_neighbours); 2581 m_sceneGridService.InformNeighborChildAgent(presence, region);
2573 } 2582 }
2574 2583
2575 /// <summary> 2584 /// <summary>
diff --git a/OpenSim/Region/Framework/Scenes/SceneCommunicationService.cs b/OpenSim/Region/Framework/Scenes/SceneCommunicationService.cs
index 2f0bbb2..4c10e2c 100644
--- a/OpenSim/Region/Framework/Scenes/SceneCommunicationService.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneCommunicationService.cs
@@ -459,7 +459,7 @@ namespace OpenSim.Region.Framework.Scenes
459 /// This informs a single neighboring region about agent "avatar". 459 /// This informs a single neighboring region about agent "avatar".
460 /// Calls an asynchronous method to do so.. so it doesn't lag the sim. 460 /// Calls an asynchronous method to do so.. so it doesn't lag the sim.
461 /// </summary> 461 /// </summary>
462 public void InformNeighborChildAgent(ScenePresence avatar, SimpleRegionInfo region, List<RegionInfo> neighbours) 462 public void InformNeighborChildAgent(ScenePresence avatar, SimpleRegionInfo region)
463 { 463 {
464 AgentCircuitData agent = avatar.ControllingClient.RequestClientInfo(); 464 AgentCircuitData agent = avatar.ControllingClient.RequestClientInfo();
465 agent.BaseFolder = UUID.Zero; 465 agent.BaseFolder = UUID.Zero;
@@ -493,8 +493,10 @@ namespace OpenSim.Region.Framework.Scenes
493 m_log.Info("[INTERGRID]: Starting to inform neighbors that I'm here"); 493 m_log.Info("[INTERGRID]: Starting to inform neighbors that I'm here");
494 //RegionUpData regiondata = new RegionUpData(region.RegionLocX, region.RegionLocY, region.ExternalHostName, region.InternalEndPoint.Port); 494 //RegionUpData regiondata = new RegionUpData(region.RegionLocX, region.RegionLocY, region.ExternalHostName, region.InternalEndPoint.Port);
495 495
496 bool regionAccepted = 496 //bool regionAccepted =
497 m_commsProvider.InterRegion.RegionUp(new SerializableRegionInfo(region), regionhandle); 497 // m_commsProvider.InterRegion.RegionUp(new SerializableRegionInfo(region), regionhandle);
498
499 bool regionAccepted = m_interregionCommsOut.SendHelloNeighbour(regionhandle, region);
498 500
499 if (regionAccepted) 501 if (regionAccepted)
500 { 502 {
@@ -519,7 +521,7 @@ namespace OpenSim.Region.Framework.Scenes
519 { 521 {
520 //m_log.Info("[INTER]: " + debugRegionName + ": SceneCommunicationService: Sending InterRegion Notification that region is up " + region.RegionName); 522 //m_log.Info("[INTER]: " + debugRegionName + ": SceneCommunicationService: Sending InterRegion Notification that region is up " + region.RegionName);
521 523
522 524
523 List<SimpleRegionInfo> neighbours = new List<SimpleRegionInfo>(); 525 List<SimpleRegionInfo> neighbours = new List<SimpleRegionInfo>();
524 // This stays uncached because we don't already know about our neighbors at this point. 526 // This stays uncached because we don't already know about our neighbors at this point.
525 neighbours = m_commsProvider.GridService.RequestNeighbours(m_regionInfo.RegionLocX, m_regionInfo.RegionLocY); 527 neighbours = m_commsProvider.GridService.RequestNeighbours(m_regionInfo.RegionLocX, m_regionInfo.RegionLocY);