diff options
Diffstat (limited to 'OpenSim/Region/Communications/OGS1')
-rw-r--r-- | OpenSim/Region/Communications/OGS1/OGS1GridServices.cs | 164 | ||||
-rw-r--r-- | OpenSim/Region/Communications/OGS1/OGS1InterSimComms.cs | 48 |
2 files changed, 212 insertions, 0 deletions
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 |