aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Region/Communications
diff options
context:
space:
mode:
authorMW2007-07-10 20:52:43 +0000
committerMW2007-07-10 20:52:43 +0000
commitf0ecc1de4ccb40ed23b5bc925130bda3ff07c1a6 (patch)
treed7f269f36b7f29e980b9f70ebe273569afb964c6 /OpenSim/Region/Communications
parentFixed the crashing when trying to look at the map in grid mode. Although the ... (diff)
downloadopensim-SC-f0ecc1de4ccb40ed23b5bc925130bda3ff07c1a6.zip
opensim-SC-f0ecc1de4ccb40ed23b5bc925130bda3ff07c1a6.tar.gz
opensim-SC-f0ecc1de4ccb40ed23b5bc925130bda3ff07c1a6.tar.bz2
opensim-SC-f0ecc1de4ccb40ed23b5bc925130bda3ff07c1a6.tar.xz
preliminary inter region communications (between regions in different instances) now works, so child agents and border crossings (and teleporting) now work.
The .net remoting is still very basic: we need security sinks added. And we really need the OGS 2 protocol as soon as possible.
Diffstat (limited to 'OpenSim/Region/Communications')
-rw-r--r--OpenSim/Region/Communications/OGS1/OGS1GridServices.cs97
1 files changed, 88 insertions, 9 deletions
diff --git a/OpenSim/Region/Communications/OGS1/OGS1GridServices.cs b/OpenSim/Region/Communications/OGS1/OGS1GridServices.cs
index 1cadf9b..66c1739 100644
--- a/OpenSim/Region/Communications/OGS1/OGS1GridServices.cs
+++ b/OpenSim/Region/Communications/OGS1/OGS1GridServices.cs
@@ -29,6 +29,7 @@ namespace OpenSim.Region.Communications.OGS1
29 serversInfo = servers_info; 29 serversInfo = servers_info;
30 httpServer = httpServe; 30 httpServer = httpServe;
31 httpServer.AddXmlRPCHandler("expect_user", this.ExpectUser); 31 httpServer.AddXmlRPCHandler("expect_user", this.ExpectUser);
32 this.StartRemoting();
32 } 33 }
33 34
34 public RegionCommsListener RegisterRegion(RegionInfo regionInfo) 35 public RegionCommsListener RegisterRegion(RegionInfo regionInfo)
@@ -52,6 +53,7 @@ namespace OpenSim.Region.Communications.OGS1
52 GridParams["sim_name"] = regionInfo.RegionName; 53 GridParams["sim_name"] = regionInfo.RegionName;
53 GridParams["http_port"] = serversInfo.HttpListenerPort.ToString(); 54 GridParams["http_port"] = serversInfo.HttpListenerPort.ToString();
54 GridParams["remoting_port"] = serversInfo.RemotingListenerPort.ToString(); 55 GridParams["remoting_port"] = serversInfo.RemotingListenerPort.ToString();
56 GridParams["map-image-id"] = regionInfo.estateSettings.terrainImageID.ToStringHyphenated();
55 57
56 // Package into an XMLRPC Request 58 // Package into an XMLRPC Request
57 ArrayList SendParams = new ArrayList(); 59 ArrayList SendParams = new ArrayList();
@@ -97,7 +99,7 @@ namespace OpenSim.Region.Communications.OGS1
97 99
98 public List<RegionInfo> RequestNeighbours(RegionInfo regionInfo) 100 public List<RegionInfo> RequestNeighbours(RegionInfo regionInfo)
99 { 101 {
100 102
101 Hashtable respData = MapBlockQuery((int)regionInfo.RegionLocX - 1, (int)regionInfo.RegionLocY - 1, (int)regionInfo.RegionLocX + 1, (int)regionInfo.RegionLocY + 1); 103 Hashtable respData = MapBlockQuery((int)regionInfo.RegionLocX - 1, (int)regionInfo.RegionLocY - 1, (int)regionInfo.RegionLocX + 1, (int)regionInfo.RegionLocY + 1);
102 104
103 List<RegionInfo> neighbours = new List<RegionInfo>(); 105 List<RegionInfo> neighbours = new List<RegionInfo>();
@@ -141,8 +143,40 @@ namespace OpenSim.Region.Communications.OGS1
141 return this.regions[regionHandle]; 143 return this.regions[regionHandle];
142 } 144 }
143 //TODO not a region in this instance so ask remote grid server 145 //TODO not a region in this instance so ask remote grid server
144 MainLog.Instance.Warn("Unimplemented - RequestNeighbourInfo()"); 146
145 return null; 147 Hashtable requestData = new Hashtable();
148 requestData["region_handle"] = regionHandle.ToString();
149 requestData["authkey"] = this.serversInfo.GridSendKey;
150 ArrayList SendParams = new ArrayList();
151 SendParams.Add(requestData);
152 XmlRpcRequest GridReq = new XmlRpcRequest("simulator_data_request", SendParams);
153 XmlRpcResponse GridResp = GridReq.Send(this.serversInfo.GridURL, 3000);
154
155 Hashtable responseData = (Hashtable)GridResp.Value;
156
157 if (responseData.ContainsKey("error"))
158 {
159 Console.WriteLine("error received from grid server" + responseData["error"]);
160 return null;
161 }
162
163 uint regX = Convert.ToUInt32((string)responseData["region_locx"]);
164 uint regY = Convert.ToUInt32((string)responseData["region_locy"]);
165 string internalIpStr = (string)responseData["sim_ip"];
166 uint port = Convert.ToUInt32(responseData["sim_port"]);
167 string externalUri = (string)responseData["sim_uri"];
168
169 IPEndPoint neighbourInternalEndPoint = new IPEndPoint(IPAddress.Parse(internalIpStr), (int)port);
170 string neighbourExternalUri = externalUri;
171 RegionInfo regionInfo = new RegionInfo(regX, regY, neighbourInternalEndPoint, internalIpStr);
172
173 regionInfo.RemotingPort = Convert.ToUInt32((string)responseData["remoting_port"]);
174 regionInfo.RemotingAddress = internalIpStr;
175
176 regionInfo.SimUUID = new LLUUID((string)responseData["region_UUID"]);
177 regionInfo.RegionName = (string)responseData["region_name"];
178
179 return regionInfo;
146 } 180 }
147 181
148 public List<MapBlockData> RequestNeighbourMapBlocks(int minX, int minY, int maxX, int maxY) 182 public List<MapBlockData> RequestNeighbourMapBlocks(int minX, int minY, int maxX, int maxY)
@@ -164,7 +198,7 @@ namespace OpenSim.Region.Communications.OGS1
164 neighbour.Access = Convert.ToByte(n["access"]); 198 neighbour.Access = Convert.ToByte(n["access"]);
165 neighbour.RegionFlags = Convert.ToUInt32(n["region-flags"]); 199 neighbour.RegionFlags = Convert.ToUInt32(n["region-flags"]);
166 neighbour.WaterHeight = Convert.ToByte(n["water-height"]); 200 neighbour.WaterHeight = Convert.ToByte(n["water-height"]);
167 neighbour.MapImageId = (string)n["map-image-id"]; 201 neighbour.MapImageId = new LLUUID((string)n["map-image-id"]);
168 202
169 neighbours.Add(neighbour); 203 neighbours.Add(neighbour);
170 } 204 }
@@ -237,10 +271,10 @@ namespace OpenSim.Region.Communications.OGS1
237 #region InterRegion Comms 271 #region InterRegion Comms
238 private void StartRemoting() 272 private void StartRemoting()
239 { 273 {
240 TcpChannel ch = new TcpChannel(8895); 274 TcpChannel ch = new TcpChannel(this.serversInfo.RemotingListenerPort);
241 ChannelServices.RegisterChannel(ch, true); 275 ChannelServices.RegisterChannel(ch, true);
242 276
243 WellKnownServiceTypeEntry wellType = new WellKnownServiceTypeEntry(Type.GetType("OGS1InterRegionRemoting"), "InterRegions", WellKnownObjectMode.Singleton); 277 WellKnownServiceTypeEntry wellType = new WellKnownServiceTypeEntry(typeof(OGS1InterRegionRemoting), "InterRegions", WellKnownObjectMode.Singleton);
244 RemotingConfiguration.RegisterWellKnownServiceType(wellType); 278 RemotingConfiguration.RegisterWellKnownServiceType(wellType);
245 InterRegionSingleton.Instance.OnArrival += this.IncomingArrival; 279 InterRegionSingleton.Instance.OnArrival += this.IncomingArrival;
246 InterRegionSingleton.Instance.OnChildAgent += this.IncomingChildAgent; 280 InterRegionSingleton.Instance.OnChildAgent += this.IncomingChildAgent;
@@ -254,9 +288,31 @@ namespace OpenSim.Region.Communications.OGS1
254 this.listeners[regionHandle].TriggerExpectUser(regionHandle, agentData); 288 this.listeners[regionHandle].TriggerExpectUser(regionHandle, agentData);
255 return true; 289 return true;
256 } 290 }
257 //TODO need to see if we know about where this region is and use .net remoting 291 RegionInfo regInfo = this.RequestNeighbourInfo(regionHandle);
258 // to inform it. 292 if (regInfo != null)
259 Console.WriteLine("Inform remote region of child agent not implemented yet"); 293 {
294 //don't want to be creating a new link to the remote instance every time like we are here
295 bool retValue = false;
296
297
298 OGS1InterRegionRemoting remObject = (OGS1InterRegionRemoting)Activator.GetObject(
299 typeof(OGS1InterRegionRemoting),
300 "tcp://"+ regInfo.RemotingAddress+":"+regInfo.RemotingPort+"/InterRegions");
301 if (remObject != null)
302 {
303
304 retValue = remObject.InformRegionOfChildAgent(regionHandle, agentData);
305 }
306 else
307 {
308 Console.WriteLine("remoting object not found");
309 }
310 remObject = null;
311
312
313 return retValue;
314 }
315
260 return false; 316 return false;
261 } 317 }
262 318
@@ -267,6 +323,29 @@ namespace OpenSim.Region.Communications.OGS1
267 this.listeners[regionHandle].TriggerExpectAvatarCrossing(regionHandle, agentID, position); 323 this.listeners[regionHandle].TriggerExpectAvatarCrossing(regionHandle, agentID, position);
268 return true; 324 return true;
269 } 325 }
326 RegionInfo regInfo = this.RequestNeighbourInfo(regionHandle);
327 if (regInfo != null)
328 {
329 bool retValue = false;
330
331
332 OGS1InterRegionRemoting remObject = (OGS1InterRegionRemoting)Activator.GetObject(
333 typeof(OGS1InterRegionRemoting),
334 "tcp://" + regInfo.RemotingAddress + ":" + regInfo.RemotingPort + "/InterRegions");
335 if (remObject != null)
336 {
337
338 retValue = remObject.ExpectAvatarCrossing(regionHandle, agentID, position);
339 }
340 else
341 {
342 Console.WriteLine("remoting object not found");
343 }
344 remObject = null;
345
346
347 return retValue;
348 }
270 //TODO need to see if we know about where this region is and use .net remoting 349 //TODO need to see if we know about where this region is and use .net remoting
271 // to inform it. 350 // to inform it.
272 return false; 351 return false;