aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Region/Environment/Modules/Communications/Interregion
diff options
context:
space:
mode:
authorAdam Frisby2008-04-30 21:16:36 +0000
committerAdam Frisby2008-04-30 21:16:36 +0000
commitf5c312bc3c2567449c7268a54a08a54119f58d53 (patch)
tree424668a4bbec6873ebc5b8256f3671db102f5e9c /OpenSim/Region/Environment/Modules/Communications/Interregion
parent* Adds the AuthbuyerID field to sqlite and makes use of it. (diff)
downloadopensim-SC-f5c312bc3c2567449c7268a54a08a54119f58d53.zip
opensim-SC-f5c312bc3c2567449c7268a54a08a54119f58d53.tar.gz
opensim-SC-f5c312bc3c2567449c7268a54a08a54119f58d53.tar.bz2
opensim-SC-f5c312bc3c2567449c7268a54a08a54119f58d53.tar.xz
* Refactored Environment/Modules directory - modules now reside in their own directory with any associated module-specific classes.
* Each module directory is currently inside one of the following category folders: Agent (Anything relating to do with Client<->Server communications.), Avatar (Anything to do with the avatar or presence inworld), Framework (Classes modules can use), Grid (Grid traffic, new OGS2 grid comms), Scripting (Scripting functions, etc), World (The enrivonment/scene, IE Sun/Tree modules.) * This should be moved into a seperate project file.
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