aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Region/Environment/Modules/Communications/Interregion
diff options
context:
space:
mode:
Diffstat (limited to 'OpenSim/Region/Environment/Modules/Communications/Interregion')
-rw-r--r--OpenSim/Region/Environment/Modules/Communications/Interregion/IInterregionModule.cs15
-rw-r--r--OpenSim/Region/Environment/Modules/Communications/Interregion/InterregionModule.cs174
-rw-r--r--OpenSim/Region/Environment/Modules/Communications/Interregion/RemotingObject.cs50
3 files changed, 0 insertions, 239 deletions
diff --git a/OpenSim/Region/Environment/Modules/Communications/Interregion/IInterregionModule.cs b/OpenSim/Region/Environment/Modules/Communications/Interregion/IInterregionModule.cs
deleted file mode 100644
index 713b46a..0000000
--- a/OpenSim/Region/Environment/Modules/Communications/Interregion/IInterregionModule.cs
+++ /dev/null
@@ -1,15 +0,0 @@
1using OpenSim.Framework;
2using OpenSim.Region.Environment.Scenes;
3
4namespace OpenSim.Region.Environment.Modules.Communications.Interregion
5{
6 public interface IInterregionModule
7 {
8 void RegisterMethod<T>(T e);
9 bool HasInterface<T>(Location loc);
10 T RequestInterface<T>(Location loc);
11 T[] RequestInterface<T>();
12 Location GetLocationByDirection(Scene scene, InterregionModule.Direction dir);
13 void internal_CreateRemotingObjects();
14 }
15} \ No newline at end of file
diff --git a/OpenSim/Region/Environment/Modules/Communications/Interregion/InterregionModule.cs b/OpenSim/Region/Environment/Modules/Communications/Interregion/InterregionModule.cs
deleted file mode 100644
index 8d040c4..0000000
--- a/OpenSim/Region/Environment/Modules/Communications/Interregion/InterregionModule.cs
+++ /dev/null
@@ -1,174 +0,0 @@
1using System;
2using System.Collections.Generic;
3using System.Runtime.Remoting;
4using System.Runtime.Remoting.Channels;
5using System.Runtime.Remoting.Channels.Tcp;
6using Nini.Config;
7using OpenSim.Framework;
8using OpenSim.Region.Environment.Interfaces;
9using OpenSim.Region.Environment.Scenes;
10
11namespace OpenSim.Region.Environment.Modules.Communications.Interregion
12{
13 public class InterregionModule : IInterregionModule, IRegionModule
14 {
15 #region Direction enum
16
17 public enum Direction
18 {
19 North,
20 NorthEast,
21 East,
22 SouthEast,
23 South,
24 SouthWest,
25 West,
26 NorthWest
27 }
28
29 #endregion
30
31 private readonly Dictionary<Type, Object> m_interfaces = new Dictionary<Type, object>();
32 private readonly List<Location> m_myLocations = new List<Location>();
33
34 private readonly Dictionary<Location, string[]> m_neighbourInterfaces = new Dictionary<Location, string[]>();
35 private readonly Dictionary<Location, RemotingObject> m_neighbourRemote = new Dictionary<Location, RemotingObject>();
36 private IConfigSource m_config;
37 private RemotingObject m_myRemote;
38
39 private Object m_lockObject = new object();
40 private TcpChannel m_tcpChannel;
41 private int m_tcpPort = 10101;
42 private bool m_enabled = false;
43
44 #region IRegionModule Members
45
46 //TODO: This prevents us from registering new scenes after PostInitialise if we want comms updated.
47 public void Initialise(Scene scene, IConfigSource source)
48 {
49 if (m_enabled)
50 {
51 m_myLocations.Add(new Location((int) scene.RegionInfo.RegionLocX,
52 (int) scene.RegionInfo.RegionLocY));
53 m_config = source;
54
55 scene.RegisterModuleInterface<IInterregionModule>(this);
56 }
57 }
58
59 //TODO: This prevents us from registering new scenes after PostInitialise if we want comms updated.
60 public void PostInitialise()
61 {
62 if (m_enabled)
63 {
64 try
65 {
66 m_tcpPort = m_config.Configs["Comms"].GetInt("remoting_port", m_tcpPort);
67 }
68 catch
69 {
70 }
71
72 internal_CreateRemotingObjects();
73 }
74 }
75
76 public void Close()
77 {
78 ChannelServices.UnregisterChannel(m_tcpChannel);
79 }
80
81 public string Name
82 {
83 get { return "InterregionModule"; }
84 }
85
86 public bool IsSharedModule
87 {
88 get { return true; }
89 }
90
91 #endregion
92
93 public void internal_CreateRemotingObjects()
94 {
95 lock (m_lockObject)
96 {
97 if (m_tcpChannel == null)
98 {
99 m_myRemote = new RemotingObject(m_interfaces, m_myLocations.ToArray());
100 m_tcpChannel = new TcpChannel(m_tcpPort);
101
102 ChannelServices.RegisterChannel(m_tcpChannel, false);
103 RemotingServices.Marshal(m_myRemote, "OpenSimRemote2", typeof (RemotingObject));
104 }
105 }
106 }
107
108 public void RegisterRemoteRegion(string uri)
109 {
110 RegisterRemotingInterface((RemotingObject) Activator.GetObject(typeof (RemotingObject), uri));
111 }
112
113 private void RegisterRemotingInterface(RemotingObject remote)
114 {
115 Location[] locs = remote.GetLocations();
116 string[] interfaces = remote.GetInterfaces();
117 foreach (Location loc in locs)
118 {
119 m_neighbourInterfaces[loc] = interfaces;
120 m_neighbourRemote[loc] = remote;
121 }
122 }
123
124 public void RegisterMethod<T>(T e)
125 {
126 m_interfaces[typeof (T)] = e;
127 }
128
129 public bool HasInterface<T>(Location loc)
130 {
131 foreach (string val in m_neighbourInterfaces[loc])
132 {
133 if (val == typeof (T).FullName)
134 {
135 return true;
136 }
137 }
138 return false;
139 }
140
141 public T RequestInterface<T>(Location loc)
142 {
143 if (m_neighbourRemote.ContainsKey(loc))
144 {
145 return m_neighbourRemote[loc].RequestInterface<T>();
146 }
147 else
148 {
149 throw new IndexOutOfRangeException("No neighbour availible at that location");
150 }
151 }
152
153 public T[] RequestInterface<T>()
154 {
155 List<T> m_t = new List<T>();
156 foreach (RemotingObject remote in m_neighbourRemote.Values)
157 {
158 try
159 {
160 m_t.Add(remote.RequestInterface<T>());
161 }
162 catch (NotSupportedException)
163 {
164 }
165 }
166 return m_t.ToArray();
167 }
168
169 public Location GetLocationByDirection(Scene scene, Direction dir)
170 {
171 return new Location(0, 0);
172 }
173 }
174} \ No newline at end of file
diff --git a/OpenSim/Region/Environment/Modules/Communications/Interregion/RemotingObject.cs b/OpenSim/Region/Environment/Modules/Communications/Interregion/RemotingObject.cs
deleted file mode 100644
index a735677..0000000
--- a/OpenSim/Region/Environment/Modules/Communications/Interregion/RemotingObject.cs
+++ /dev/null
@@ -1,50 +0,0 @@
1using System;
2using System.Collections.Generic;
3using OpenSim.Framework;
4
5namespace OpenSim.Region.Environment.Modules.Communications.Interregion
6{
7 public class RemotingObject : MarshalByRefObject
8 {
9 private readonly Location[] m_coords;
10 private readonly Dictionary<Type, Object> m_interfaces = new Dictionary<Type, object>();
11
12 public RemotingObject(Dictionary<Type, Object> myInterfaces, Location[] coords)
13 {
14 m_interfaces = myInterfaces;
15 m_coords = coords;
16 }
17
18 public Location[] GetLocations()
19 {
20 return (Location[]) m_coords.Clone();
21 }
22
23 public string[] GetInterfaces()
24 {
25 string[] interfaces = new string[m_interfaces.Count];
26 int i = 0;
27
28 foreach (KeyValuePair<Type, object> pair in m_interfaces)
29 {
30 interfaces[i++] = pair.Key.FullName;
31 }
32
33 return interfaces;
34 }
35
36 /// <summary>
37 /// Returns a registered interface availible to neighbouring regions.
38 /// </summary>
39 /// <typeparam name="T">The type of interface you wish to request</typeparam>
40 /// <returns>A MarshalByRefObject inherited from this region inheriting the interface requested.</returns>
41 /// <remarks>All registered interfaces <b>MUST</b> inherit from MarshalByRefObject and use only serialisable types.</remarks>
42 public T RequestInterface<T>()
43 {
44 if (m_interfaces.ContainsKey(typeof (T)))
45 return (T) m_interfaces[typeof (T)];
46
47 throw new NotSupportedException("No such interface registered.");
48 }
49 }
50} \ No newline at end of file