diff options
Diffstat (limited to 'OpenSim/Region/Communications')
3 files changed, 256 insertions, 0 deletions
diff --git a/OpenSim/Region/Communications/Local/LocalBackEndServices.cs b/OpenSim/Region/Communications/Local/LocalBackEndServices.cs index 5d4e702..4efaa23 100644 --- a/OpenSim/Region/Communications/Local/LocalBackEndServices.cs +++ b/OpenSim/Region/Communications/Local/LocalBackEndServices.cs | |||
@@ -173,6 +173,15 @@ namespace OpenSim.Region.Communications.Local | |||
173 | return false; | 173 | return false; |
174 | } | 174 | } |
175 | 175 | ||
176 | public bool InformRegionOfPrimCrossing(ulong regionHandle, LLUUID primID, string objData) | ||
177 | { | ||
178 | if (m_regionListeners.ContainsKey(regionHandle)) | ||
179 | { | ||
180 | m_regionListeners[regionHandle].TriggerExpectPrim(regionHandle, primID, objData); | ||
181 | return true; | ||
182 | } | ||
183 | return false; | ||
184 | } | ||
176 | /// <summary> | 185 | /// <summary> |
177 | /// | 186 | /// |
178 | /// </summary> | 187 | /// </summary> |
@@ -190,6 +199,15 @@ namespace OpenSim.Region.Communications.Local | |||
190 | } | 199 | } |
191 | return false; | 200 | return false; |
192 | } | 201 | } |
202 | public bool ExpectPrimCrossing(ulong regionHandle, LLUUID primID, LLVector3 position, bool isPhysical) | ||
203 | { | ||
204 | if (m_regionListeners.ContainsKey(regionHandle)) | ||
205 | { | ||
206 | m_regionListeners[regionHandle].TriggerExpectPrimCrossing(regionHandle, primID, position, isPhysical); | ||
207 | return true; | ||
208 | } | ||
209 | return false; | ||
210 | } | ||
193 | 211 | ||
194 | public void TellRegionToCloseChildConnection(ulong regionHandle, LLUUID agentID) | 212 | public void TellRegionToCloseChildConnection(ulong regionHandle, LLUUID agentID) |
195 | { | 213 | { |
@@ -207,6 +225,14 @@ namespace OpenSim.Region.Communications.Local | |||
207 | } | 225 | } |
208 | return false; | 226 | return false; |
209 | } | 227 | } |
228 | public bool AcknowledgePrimCrossed(ulong regionHandle, LLUUID primID) | ||
229 | { | ||
230 | if (m_regionListeners.ContainsKey(regionHandle)) | ||
231 | { | ||
232 | return true; | ||
233 | } | ||
234 | return false; | ||
235 | } | ||
210 | 236 | ||
211 | /// <summary> | 237 | /// <summary> |
212 | /// Is a Sandbox mode method, used by the local Login server to inform a region of a connection user/session | 238 | /// Is a Sandbox mode method, used by the local Login server to inform a region of a connection user/session |
@@ -240,6 +266,15 @@ namespace OpenSim.Region.Communications.Local | |||
240 | } | 266 | } |
241 | } | 267 | } |
242 | 268 | ||
269 | public void TriggerExpectPrim(ulong regionHandle, LLUUID primID, string objData) | ||
270 | { | ||
271 | if (m_regionListeners.ContainsKey(regionHandle)) | ||
272 | { | ||
273 | m_regionListeners[regionHandle].TriggerExpectPrim(regionHandle, primID, objData); | ||
274 | } | ||
275 | |||
276 | } | ||
277 | |||
243 | public void PingCheckReply(Hashtable respData) | 278 | public void PingCheckReply(Hashtable respData) |
244 | { | 279 | { |
245 | foreach (ulong region in m_regions.Keys) | 280 | foreach (ulong region in m_regions.Keys) |
@@ -264,6 +299,15 @@ namespace OpenSim.Region.Communications.Local | |||
264 | return false; | 299 | return false; |
265 | } | 300 | } |
266 | 301 | ||
302 | public bool TriggerExpectPrimCrossing(ulong regionHandle, LLUUID primID, LLVector3 position, bool isPhysical) | ||
303 | { | ||
304 | if (m_regionListeners.ContainsKey(regionHandle)) | ||
305 | { | ||
306 | return m_regionListeners[regionHandle].TriggerExpectPrimCrossing(regionHandle, primID, position, isPhysical); | ||
307 | } | ||
308 | return false; | ||
309 | } | ||
310 | |||
267 | public bool IncomingChildAgent(ulong regionHandle, AgentCircuitData agentData) | 311 | public bool IncomingChildAgent(ulong regionHandle, AgentCircuitData agentData) |
268 | { | 312 | { |
269 | if (m_regionListeners.ContainsKey(regionHandle)) | 313 | if (m_regionListeners.ContainsKey(regionHandle)) |
diff --git a/OpenSim/Region/Communications/OGS1/OGS1GridServices.cs b/OpenSim/Region/Communications/OGS1/OGS1GridServices.cs index d355f92..fe46632 100644 --- a/OpenSim/Region/Communications/OGS1/OGS1GridServices.cs +++ b/OpenSim/Region/Communications/OGS1/OGS1GridServices.cs | |||
@@ -63,6 +63,7 @@ namespace OpenSim.Region.Communications.OGS1 | |||
63 | { | 63 | { |
64 | serversInfo = servers_info; | 64 | serversInfo = servers_info; |
65 | httpServer = httpServe; | 65 | httpServer = httpServe; |
66 | //Respond to Grid Services requests | ||
66 | httpServer.AddXmlRPCHandler("expect_user", ExpectUser); | 67 | httpServer.AddXmlRPCHandler("expect_user", ExpectUser); |
67 | httpServer.AddXmlRPCHandler("check", PingCheckReply); | 68 | httpServer.AddXmlRPCHandler("check", PingCheckReply); |
68 | 69 | ||
@@ -340,7 +341,12 @@ namespace OpenSim.Region.Communications.OGS1 | |||
340 | 341 | ||
341 | return new XmlRpcResponse(); | 342 | return new XmlRpcResponse(); |
342 | } | 343 | } |
344 | |||
343 | 345 | ||
346 | |||
347 | |||
348 | |||
349 | |||
344 | #region m_interRegion Comms | 350 | #region m_interRegion Comms |
345 | 351 | ||
346 | /// <summary> | 352 | /// <summary> |
@@ -357,16 +363,22 @@ namespace OpenSim.Region.Communications.OGS1 | |||
357 | RemotingConfiguration.RegisterWellKnownServiceType(wellType); | 363 | RemotingConfiguration.RegisterWellKnownServiceType(wellType); |
358 | InterRegionSingleton.Instance.OnArrival += TriggerExpectAvatarCrossing; | 364 | InterRegionSingleton.Instance.OnArrival += TriggerExpectAvatarCrossing; |
359 | InterRegionSingleton.Instance.OnChildAgent += IncomingChildAgent; | 365 | InterRegionSingleton.Instance.OnChildAgent += IncomingChildAgent; |
366 | InterRegionSingleton.Instance.OnPrimGroupArrival += IncomingPrim; | ||
367 | InterRegionSingleton.Instance.OnPrimGroupNear += TriggerExpectPrimCrossing; | ||
368 | |||
360 | } | 369 | } |
361 | 370 | ||
362 | #region Methods called by regions in this instance | 371 | #region Methods called by regions in this instance |
363 | 372 | ||
373 | |||
374 | |||
364 | /// <summary> | 375 | /// <summary> |
365 | /// | 376 | /// |
366 | /// </summary> | 377 | /// </summary> |
367 | /// <param name="regionHandle"></param> | 378 | /// <param name="regionHandle"></param> |
368 | /// <param name="agentData"></param> | 379 | /// <param name="agentData"></param> |
369 | /// <returns></returns> | 380 | /// <returns></returns> |
381 | |||
370 | public bool InformRegionOfChildAgent(ulong regionHandle, AgentCircuitData agentData) | 382 | public bool InformRegionOfChildAgent(ulong regionHandle, AgentCircuitData agentData) |
371 | { | 383 | { |
372 | try | 384 | try |
@@ -432,7 +444,78 @@ namespace OpenSim.Region.Communications.OGS1 | |||
432 | } | 444 | } |
433 | return true; | 445 | return true; |
434 | } | 446 | } |
447 | /// <summary> | ||
448 | /// | ||
449 | /// </summary> | ||
450 | /// <param name="regionHandle"></param> | ||
451 | /// <param name="agentData"></param> | ||
452 | /// <returns></returns> | ||
453 | |||
454 | public bool InformRegionOfPrimCrossing(ulong regionHandle, LLUUID primID, string objData) | ||
455 | { | ||
456 | try | ||
457 | { | ||
458 | if (m_localBackend.InformRegionOfPrimCrossing(regionHandle,primID, objData)) | ||
459 | { | ||
460 | return true; | ||
461 | } | ||
435 | 462 | ||
463 | RegionInfo regInfo = RequestNeighbourInfo(regionHandle); | ||
464 | if (regInfo != null) | ||
465 | { | ||
466 | //don't want to be creating a new link to the remote instance every time like we are here | ||
467 | bool retValue = false; | ||
468 | |||
469 | |||
470 | OGS1InterRegionRemoting remObject = (OGS1InterRegionRemoting) Activator.GetObject( | ||
471 | typeof (OGS1InterRegionRemoting), | ||
472 | "tcp://" + regInfo.RemotingAddress + | ||
473 | ":" + regInfo.RemotingPort + | ||
474 | "/InterRegions"); | ||
475 | |||
476 | if (remObject != null) | ||
477 | { | ||
478 | retValue = remObject.InformRegionOfPrimCrossing(regionHandle,primID, objData); | ||
479 | } | ||
480 | else | ||
481 | { | ||
482 | Console.WriteLine("remoting object not found"); | ||
483 | } | ||
484 | remObject = null; | ||
485 | |||
486 | |||
487 | return retValue; | ||
488 | } | ||
489 | |||
490 | return false; | ||
491 | } | ||
492 | catch (RemotingException e) | ||
493 | { | ||
494 | MainLog.Instance.Error("Remoting Error: Unable to connect to remote region.\n" + e.ToString()); | ||
495 | return false; | ||
496 | } | ||
497 | catch (SocketException e) | ||
498 | { | ||
499 | MainLog.Instance.Error("Socket Error: Unable to connect to remote region.\n" + e.ToString()); | ||
500 | return false; | ||
501 | } | ||
502 | catch (InvalidCredentialException e) | ||
503 | { | ||
504 | MainLog.Instance.Error("Invalid Credentials: Unable to connect to remote region.\n" + e.ToString()); | ||
505 | return false; | ||
506 | } | ||
507 | catch (AuthenticationException e) | ||
508 | { | ||
509 | MainLog.Instance.Error("Authentication exception: Unable to connect to remote region.\n" + e.ToString()); | ||
510 | return false; | ||
511 | } | ||
512 | catch (Exception e) | ||
513 | { | ||
514 | MainLog.Instance.Error("Unknown exception: Unable to connect to remote region.\n" + e.ToString()); | ||
515 | return false; | ||
516 | } | ||
517 | return true; | ||
518 | } | ||
436 | /// <summary> | 519 | /// <summary> |
437 | /// | 520 | /// |
438 | /// </summary> | 521 | /// </summary> |
@@ -484,6 +567,50 @@ namespace OpenSim.Region.Communications.OGS1 | |||
484 | return false; | 567 | return false; |
485 | } | 568 | } |
486 | } | 569 | } |
570 | public bool ExpectPrimCrossing(ulong regionHandle, LLUUID agentID, LLVector3 position, bool isPhysical) | ||
571 | { | ||
572 | try | ||
573 | { | ||
574 | if (m_localBackend.TriggerExpectPrimCrossing(regionHandle, agentID, position, isPhysical)) | ||
575 | { | ||
576 | return true; | ||
577 | } | ||
578 | |||
579 | RegionInfo regInfo = RequestNeighbourInfo(regionHandle); | ||
580 | if (regInfo != null) | ||
581 | { | ||
582 | bool retValue = false; | ||
583 | OGS1InterRegionRemoting remObject = (OGS1InterRegionRemoting)Activator.GetObject( | ||
584 | typeof(OGS1InterRegionRemoting), | ||
585 | "tcp://" + regInfo.RemotingAddress + | ||
586 | ":" + regInfo.RemotingPort + | ||
587 | "/InterRegions"); | ||
588 | if (remObject != null) | ||
589 | { | ||
590 | retValue = remObject.ExpectAvatarCrossing(regionHandle, agentID, position, isPhysical); | ||
591 | } | ||
592 | else | ||
593 | { | ||
594 | Console.WriteLine("remoting object not found"); | ||
595 | } | ||
596 | remObject = null; | ||
597 | |||
598 | return retValue; | ||
599 | } | ||
600 | //TODO need to see if we know about where this region is and use .net remoting | ||
601 | // to inform it. | ||
602 | return false; | ||
603 | } | ||
604 | catch (RemotingException e) | ||
605 | { | ||
606 | MainLog.Instance.Error("Remoting Error: Unable to connect to remote region.\n" + e.ToString()); | ||
607 | return false; | ||
608 | } | ||
609 | catch | ||
610 | { | ||
611 | return false; | ||
612 | } | ||
613 | } | ||
487 | 614 | ||
488 | public void TellRegionToCloseChildConnection(ulong regionHandle, LLUUID agentID) | 615 | public void TellRegionToCloseChildConnection(ulong regionHandle, LLUUID agentID) |
489 | { | 616 | { |
@@ -495,6 +622,10 @@ namespace OpenSim.Region.Communications.OGS1 | |||
495 | return m_localBackend.AcknowledgeAgentCrossed(regionHandle, agentId); | 622 | return m_localBackend.AcknowledgeAgentCrossed(regionHandle, agentId); |
496 | } | 623 | } |
497 | 624 | ||
625 | public bool AcknowledgePrimCrossed(ulong regionHandle, LLUUID primId) | ||
626 | { | ||
627 | return m_localBackend.AcknowledgePrimCrossed(regionHandle, primId); | ||
628 | } | ||
498 | #endregion | 629 | #endregion |
499 | 630 | ||
500 | #region Methods triggered by calls from external instances | 631 | #region Methods triggered by calls from external instances |
@@ -522,6 +653,27 @@ namespace OpenSim.Region.Communications.OGS1 | |||
522 | /// | 653 | /// |
523 | /// </summary> | 654 | /// </summary> |
524 | /// <param name="regionHandle"></param> | 655 | /// <param name="regionHandle"></param> |
656 | /// <param name="agentData"></param> | ||
657 | /// <returns></returns> | ||
658 | public bool IncomingPrim(ulong regionHandle, LLUUID primID, string objData) | ||
659 | { | ||
660 | // Is this necessary? | ||
661 | try | ||
662 | { | ||
663 | //return m_localBackend.TriggerExpectPrim(regionHandle,primID, objData); | ||
664 | //m_localBackend. | ||
665 | return false; | ||
666 | } | ||
667 | catch (RemotingException e) | ||
668 | { | ||
669 | MainLog.Instance.Error("Remoting Error: Unable to connect to remote region.\n" + e.ToString()); | ||
670 | return false; | ||
671 | } | ||
672 | } | ||
673 | /// <summary> | ||
674 | /// | ||
675 | /// </summary> | ||
676 | /// <param name="regionHandle"></param> | ||
525 | /// <param name="agentID"></param> | 677 | /// <param name="agentID"></param> |
526 | /// <param name="position"></param> | 678 | /// <param name="position"></param> |
527 | /// <returns></returns> | 679 | /// <returns></returns> |
@@ -537,6 +689,18 @@ namespace OpenSim.Region.Communications.OGS1 | |||
537 | return false; | 689 | return false; |
538 | } | 690 | } |
539 | } | 691 | } |
692 | public bool TriggerExpectPrimCrossing(ulong regionHandle, LLUUID agentID, LLVector3 position, bool isPhysical) | ||
693 | { | ||
694 | try | ||
695 | { | ||
696 | return m_localBackend.TriggerExpectPrimCrossing(regionHandle, agentID, position, isPhysical); | ||
697 | } | ||
698 | catch (RemotingException e) | ||
699 | { | ||
700 | MainLog.Instance.Error("Remoting Error: Unable to connect to remote region.\n" + e.ToString()); | ||
701 | return false; | ||
702 | } | ||
703 | } | ||
540 | 704 | ||
541 | #endregion | 705 | #endregion |
542 | 706 | ||
diff --git a/OpenSim/Region/Communications/OGS1/OGS1InterSimComms.cs b/OpenSim/Region/Communications/OGS1/OGS1InterSimComms.cs index a127010..70018fd 100644 --- a/OpenSim/Region/Communications/OGS1/OGS1InterSimComms.cs +++ b/OpenSim/Region/Communications/OGS1/OGS1InterSimComms.cs | |||
@@ -37,12 +37,18 @@ namespace OpenSim.Region.Communications.OGS1 | |||
37 | 37 | ||
38 | public delegate bool ExpectArrival(ulong regionHandle, LLUUID agentID, LLVector3 position, bool isFlying); | 38 | public delegate bool ExpectArrival(ulong regionHandle, LLUUID agentID, LLVector3 position, bool isFlying); |
39 | 39 | ||
40 | public delegate bool InformRegionPrimGroup(ulong regionHandle, LLUUID primID, LLVector3 Positon, bool isPhysical); | ||
41 | |||
42 | public delegate bool PrimGroupArrival(ulong regionHandle, LLUUID primID, string objData); | ||
43 | |||
40 | public sealed class InterRegionSingleton | 44 | public sealed class InterRegionSingleton |
41 | { | 45 | { |
42 | private static readonly InterRegionSingleton instance = new InterRegionSingleton(); | 46 | private static readonly InterRegionSingleton instance = new InterRegionSingleton(); |
43 | 47 | ||
44 | public event InformRegionChild OnChildAgent; | 48 | public event InformRegionChild OnChildAgent; |
45 | public event ExpectArrival OnArrival; | 49 | public event ExpectArrival OnArrival; |
50 | public event InformRegionPrimGroup OnPrimGroupNear; | ||
51 | public event PrimGroupArrival OnPrimGroupArrival; | ||
46 | 52 | ||
47 | static InterRegionSingleton() | 53 | static InterRegionSingleton() |
48 | { | 54 | { |
@@ -74,6 +80,22 @@ namespace OpenSim.Region.Communications.OGS1 | |||
74 | } | 80 | } |
75 | return false; | 81 | return false; |
76 | } | 82 | } |
83 | public bool InformRegionPrim(ulong regionHandle, LLUUID primID, LLVector3 position, bool isPhysical) | ||
84 | { | ||
85 | if (OnPrimGroupNear != null) | ||
86 | { | ||
87 | return OnPrimGroupNear(regionHandle, primID, position, isPhysical); | ||
88 | } | ||
89 | return false; | ||
90 | } | ||
91 | public bool ExpectPrimCrossing(ulong regionHandle, LLUUID primID, string objData) | ||
92 | { | ||
93 | if (OnPrimGroupArrival != null) | ||
94 | { | ||
95 | return OnPrimGroupArrival(regionHandle, primID, objData); | ||
96 | } | ||
97 | return false; | ||
98 | } | ||
77 | } | 99 | } |
78 | 100 | ||
79 | public class OGS1InterRegionRemoting : MarshalByRefObject | 101 | public class OGS1InterRegionRemoting : MarshalByRefObject |
@@ -107,5 +129,31 @@ namespace OpenSim.Region.Communications.OGS1 | |||
107 | return false; | 129 | return false; |
108 | } | 130 | } |
109 | } | 131 | } |
132 | public bool InformRegionPrim(ulong regionHandle, LLUUID SceneObjectGroupID, LLVector3 position, bool isPhysical) | ||
133 | { | ||
134 | try | ||
135 | { | ||
136 | return InterRegionSingleton.Instance.InformRegionPrim(regionHandle, SceneObjectGroupID, position, isPhysical); | ||
137 | } | ||
138 | catch (RemotingException e) | ||
139 | { | ||
140 | Console.WriteLine("Remoting Error: Unable to connect to remote region.\n" + e.ToString()); | ||
141 | return false; | ||
142 | } | ||
143 | |||
144 | } | ||
145 | public bool InformRegionOfPrimCrossing(ulong regionHandle,LLUUID primID, string objData) | ||
146 | { | ||
147 | try | ||
148 | { | ||
149 | return InterRegionSingleton.Instance.ExpectPrimCrossing(regionHandle, primID, objData); | ||
150 | } | ||
151 | catch (RemotingException e) | ||
152 | { | ||
153 | Console.WriteLine("Remoting Error: Unable to connect to remote region.\n" + e.ToString()); | ||
154 | return false; | ||
155 | } | ||
156 | } | ||
157 | |||
110 | } | 158 | } |
111 | } \ No newline at end of file | 159 | } \ No newline at end of file |