aboutsummaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
authordiva2009-02-20 00:18:18 +0000
committerdiva2009-02-20 00:18:18 +0000
commite725e485fa72bcdba03df9ed7d0b007b6e548eb3 (patch)
tree170e838680340bd28e831f2735fe25cf3ec63157
parent* Fixed erroneously reverted xmlns (diff)
downloadopensim-SC-e725e485fa72bcdba03df9ed7d0b007b6e548eb3.zip
opensim-SC-e725e485fa72bcdba03df9ed7d0b007b6e548eb3.tar.gz
opensim-SC-e725e485fa72bcdba03df9ed7d0b007b6e548eb3.tar.bz2
opensim-SC-e725e485fa72bcdba03df9ed7d0b007b6e548eb3.tar.xz
This moves the 2 friends-related interregion messages out of OGS1 and into the FriendsModule. No functional changes. Those messages were sent over XMLRPC, and that's how it continues to be for now. Just moving this couple of interregion messages out of OGS1, in preparation for the big shlep ahead.
-rw-r--r--OpenSim/Framework/Communications/CommunicationsManager.cs10
-rw-r--r--OpenSim/Framework/Communications/IInterRegionCommunications.cs36
-rw-r--r--OpenSim/Region/Communications/OGS1/OGS1GridServices.cs78
-rw-r--r--OpenSim/Region/CoreModules/Avatar/Friends/FriendsModule.cs96
-rw-r--r--OpenSim/Region/Framework/Scenes/Scene.cs10
5 files changed, 94 insertions, 136 deletions
diff --git a/OpenSim/Framework/Communications/CommunicationsManager.cs b/OpenSim/Framework/Communications/CommunicationsManager.cs
index 936e583..e0e07b2 100644
--- a/OpenSim/Framework/Communications/CommunicationsManager.cs
+++ b/OpenSim/Framework/Communications/CommunicationsManager.cs
@@ -324,16 +324,6 @@ namespace OpenSim.Framework.Communications
324 return m_messageService.GetFriendRegionInfos(uuids); 324 return m_messageService.GetFriendRegionInfos(uuids);
325 } 325 }
326 326
327 public List<UUID> InformFriendsInOtherRegion(UUID agentId, ulong destRegionHandle, List<UUID> friends, bool online)
328 {
329 return m_interRegion.InformFriendsInOtherRegion(agentId, destRegionHandle, friends, online);
330 }
331
332 public bool TriggerTerminateFriend(ulong regionHandle, UUID agentID, UUID exFriendID)
333 {
334 return m_interRegion.TriggerTerminateFriend(regionHandle, agentID, exFriendID);
335 }
336
337 #endregion 327 #endregion
338 328
339 #region Packet Handlers 329 #region Packet Handlers
diff --git a/OpenSim/Framework/Communications/IInterRegionCommunications.cs b/OpenSim/Framework/Communications/IInterRegionCommunications.cs
index 6b589b9..2d4eb53 100644
--- a/OpenSim/Framework/Communications/IInterRegionCommunications.cs
+++ b/OpenSim/Framework/Communications/IInterRegionCommunications.cs
@@ -48,41 +48,5 @@ namespace OpenSim.Framework.Communications
48 48
49 bool TellRegionToCloseChildConnection(ulong regionHandle, UUID agentID); 49 bool TellRegionToCloseChildConnection(ulong regionHandle, UUID agentID);
50 50
51 /// <summary>
52 /// Try to inform friends in the given region about online status of agent.
53 /// </summary>
54 /// <param name="agentId">
55 /// The <see cref="UUID"/> of the agent.
56 /// </param>
57 /// <param name="destRegionHandle">
58 /// The regionHandle of the region.
59 /// </param>
60 /// <param name="friends">
61 /// A List of <see cref="UUID"/>s of friends to inform in the given region.
62 /// </param>
63 /// <param name="online">
64 /// Is the agent online or offline
65 /// </param>
66 /// <returns>
67 /// A list of friends that couldn't be reached on this region.
68 /// </returns>
69 List<UUID> InformFriendsInOtherRegion(UUID agentId, ulong destRegionHandle, List<UUID> friends, bool online);
70
71 /// <summary>
72 /// Send TerminateFriend of exFriendID to agent agentID in region regionHandle.
73 /// </summary>
74 /// <param name="regionHandle">
75 /// The handle of the region agentID is in (hopefully).
76 /// </param>
77 /// <param name="agentID">
78 /// The agent to send the packet to.
79 /// </param>
80 /// <param name="exFriendID">
81 /// The ex-friends ID.
82 /// </param>
83 /// <returns>
84 /// Whether the packet could be sent. False if the agent couldn't be found in the region.
85 /// </returns>
86 bool TriggerTerminateFriend(ulong regionHandle, UUID agentID, UUID exFriendID);
87 } 51 }
88} 52}
diff --git a/OpenSim/Region/Communications/OGS1/OGS1GridServices.cs b/OpenSim/Region/Communications/OGS1/OGS1GridServices.cs
index 1da7621..660e684 100644
--- a/OpenSim/Region/Communications/OGS1/OGS1GridServices.cs
+++ b/OpenSim/Region/Communications/OGS1/OGS1GridServices.cs
@@ -1810,83 +1810,5 @@ namespace OpenSim.Region.Communications.OGS1
1810 return null; 1810 return null;
1811 } 1811 }
1812 } 1812 }
1813
1814 public List<UUID> InformFriendsInOtherRegion(UUID agentId, ulong destRegionHandle, List<UUID> friends, bool online)
1815 {
1816 List<UUID> tpdAway = new List<UUID>();
1817
1818 // destRegionHandle is a region on another server
1819 RegionInfo info = RequestNeighbourInfo(destRegionHandle);
1820 if (info != null)
1821 {
1822 string httpServer = "http://" + info.ExternalEndPoint.Address + ":" + info.HttpPort + "/presence_update_bulk";
1823
1824 Hashtable reqParams = new Hashtable();
1825 reqParams["agentID"] = agentId.ToString();
1826 reqParams["agentOnline"] = online;
1827 int count = 0;
1828 foreach (UUID uuid in friends)
1829 {
1830 reqParams["friendID_" + count++] = uuid.ToString();
1831 }
1832 reqParams["friendCount"] = count;
1833
1834 IList parameters = new ArrayList();
1835 parameters.Add(reqParams);
1836 try
1837 {
1838 XmlRpcRequest request = new XmlRpcRequest("presence_update_bulk", parameters);
1839 XmlRpcResponse response = request.Send(httpServer, 5000);
1840 Hashtable respData = (Hashtable)response.Value;
1841
1842 count = (int)respData["friendCount"];
1843 for (int i = 0; i < count; ++i)
1844 {
1845 UUID uuid;
1846 if (UUID.TryParse((string)respData["friendID_" + i], out uuid)) tpdAway.Add(uuid);
1847 }
1848 }
1849 catch (Exception e)
1850 {
1851 m_log.Error("[OGS1 GRID SERVICES]: InformFriendsInOtherRegion XMLRPC failure: ", e);
1852 }
1853 }
1854 else m_log.WarnFormat("[OGS1 GRID SERVICES]: Couldn't find region {0}???", destRegionHandle);
1855
1856 return tpdAway;
1857 }
1858
1859 public bool TriggerTerminateFriend(ulong destRegionHandle, UUID agentID, UUID exFriendID)
1860 {
1861 // destRegionHandle is a region on another server
1862 RegionInfo info = RequestNeighbourInfo(destRegionHandle);
1863 if (info == null)
1864 {
1865 m_log.WarnFormat("[OGS1 GRID SERVICES]: Couldn't find region {0}", destRegionHandle);
1866 return false; // region not found???
1867 }
1868
1869 string httpServer = "http://" + info.ExternalEndPoint.Address + ":" + info.HttpPort + "/presence_update_bulk";
1870
1871 Hashtable reqParams = new Hashtable();
1872 reqParams["agentID"] = agentID.ToString();
1873 reqParams["friendID"] = exFriendID.ToString();
1874
1875 IList parameters = new ArrayList();
1876 parameters.Add(reqParams);
1877 try
1878 {
1879 XmlRpcRequest request = new XmlRpcRequest("terminate_friend", parameters);
1880 XmlRpcResponse response = request.Send(httpServer, 5000);
1881 Hashtable respData = (Hashtable)response.Value;
1882
1883 return (bool)respData["success"];
1884 }
1885 catch (Exception e)
1886 {
1887 m_log.Error("[OGS1 GRID SERVICES]: InformFriendsInOtherRegion XMLRPC failure: ", e);
1888 return false;
1889 }
1890 }
1891 } 1813 }
1892} 1814}
diff --git a/OpenSim/Region/CoreModules/Avatar/Friends/FriendsModule.cs b/OpenSim/Region/CoreModules/Avatar/Friends/FriendsModule.cs
index f23f4e0..d91e10d 100644
--- a/OpenSim/Region/CoreModules/Avatar/Friends/FriendsModule.cs
+++ b/OpenSim/Region/CoreModules/Avatar/Friends/FriendsModule.cs
@@ -34,6 +34,7 @@ using Nini.Config;
34using Nwc.XmlRpc; 34using Nwc.XmlRpc;
35using OpenMetaverse; 35using OpenMetaverse;
36using OpenSim.Framework; 36using OpenSim.Framework;
37using OpenSim.Framework.Communications;
37using OpenSim.Framework.Communications.Cache; 38using OpenSim.Framework.Communications.Cache;
38using OpenSim.Region.Framework.Interfaces; 39using OpenSim.Region.Framework.Interfaces;
39using OpenSim.Region.Framework.Scenes; 40using OpenSim.Region.Framework.Scenes;
@@ -105,6 +106,8 @@ namespace OpenSim.Region.CoreModules.Avatar.Friends
105 private Dictionary<ulong, Scene> m_scenes = new Dictionary<ulong,Scene>(); 106 private Dictionary<ulong, Scene> m_scenes = new Dictionary<ulong,Scene>();
106 private IMessageTransferModule m_TransferModule = null; 107 private IMessageTransferModule m_TransferModule = null;
107 108
109 private IGridServices m_gridServices = null;
110
108 #region IRegionModule Members 111 #region IRegionModule Members
109 112
110 public void Initialise(Scene scene, IConfigSource config) 113 public void Initialise(Scene scene, IConfigSource config)
@@ -137,6 +140,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Friends
137 if (m_scenes.Count > 0) 140 if (m_scenes.Count > 0)
138 { 141 {
139 m_TransferModule = m_initialScene.RequestModuleInterface<IMessageTransferModule>(); 142 m_TransferModule = m_initialScene.RequestModuleInterface<IMessageTransferModule>();
143 m_gridServices = m_initialScene.CommsManager.GridService;
140 } 144 }
141 if (m_TransferModule == null) 145 if (m_TransferModule == null)
142 m_log.Error("[FRIENDS]: Unable to find a message transfer module, friendship offers will not work"); 146 m_log.Error("[FRIENDS]: Unable to find a message transfer module, friendship offers will not work");
@@ -158,6 +162,89 @@ namespace OpenSim.Region.CoreModules.Avatar.Friends
158 162
159 #endregion 163 #endregion
160 164
165 #region IInterregionFriendsComms
166
167 public List<UUID> InformFriendsInOtherRegion(UUID agentId, ulong destRegionHandle, List<UUID> friends, bool online)
168 {
169 List<UUID> tpdAway = new List<UUID>();
170
171 // destRegionHandle is a region on another server
172 RegionInfo info = m_gridServices.RequestNeighbourInfo(destRegionHandle);
173 if (info != null)
174 {
175 string httpServer = "http://" + info.ExternalEndPoint.Address + ":" + info.HttpPort + "/presence_update_bulk";
176
177 Hashtable reqParams = new Hashtable();
178 reqParams["agentID"] = agentId.ToString();
179 reqParams["agentOnline"] = online;
180 int count = 0;
181 foreach (UUID uuid in friends)
182 {
183 reqParams["friendID_" + count++] = uuid.ToString();
184 }
185 reqParams["friendCount"] = count;
186
187 IList parameters = new ArrayList();
188 parameters.Add(reqParams);
189 try
190 {
191 XmlRpcRequest request = new XmlRpcRequest("presence_update_bulk", parameters);
192 XmlRpcResponse response = request.Send(httpServer, 5000);
193 Hashtable respData = (Hashtable)response.Value;
194
195 count = (int)respData["friendCount"];
196 for (int i = 0; i < count; ++i)
197 {
198 UUID uuid;
199 if (UUID.TryParse((string)respData["friendID_" + i], out uuid)) tpdAway.Add(uuid);
200 }
201 }
202 catch (Exception e)
203 {
204 m_log.Error("[OGS1 GRID SERVICES]: InformFriendsInOtherRegion XMLRPC failure: ", e);
205 }
206 }
207 else m_log.WarnFormat("[OGS1 GRID SERVICES]: Couldn't find region {0}???", destRegionHandle);
208
209 return tpdAway;
210 }
211
212 public bool TriggerTerminateFriend(ulong destRegionHandle, UUID agentID, UUID exFriendID)
213 {
214 // destRegionHandle is a region on another server
215 RegionInfo info = m_gridServices.RequestNeighbourInfo(destRegionHandle);
216 if (info == null)
217 {
218 m_log.WarnFormat("[OGS1 GRID SERVICES]: Couldn't find region {0}", destRegionHandle);
219 return false; // region not found???
220 }
221
222 string httpServer = "http://" + info.ExternalEndPoint.Address + ":" + info.HttpPort + "/presence_update_bulk";
223
224 Hashtable reqParams = new Hashtable();
225 reqParams["agentID"] = agentID.ToString();
226 reqParams["friendID"] = exFriendID.ToString();
227
228 IList parameters = new ArrayList();
229 parameters.Add(reqParams);
230 try
231 {
232 XmlRpcRequest request = new XmlRpcRequest("terminate_friend", parameters);
233 XmlRpcResponse response = request.Send(httpServer, 5000);
234 Hashtable respData = (Hashtable)response.Value;
235
236 return (bool)respData["success"];
237 }
238 catch (Exception e)
239 {
240 m_log.Error("[OGS1 GRID SERVICES]: InformFriendsInOtherRegion XMLRPC failure: ", e);
241 return false;
242 }
243 }
244
245 #endregion
246
247 #region Incoming XMLRPC messages
161 /// <summary> 248 /// <summary>
162 /// Receive presence information changes about clients in other regions. 249 /// Receive presence information changes about clients in other regions.
163 /// </summary> 250 /// </summary>
@@ -264,6 +351,10 @@ namespace OpenSim.Region.CoreModules.Avatar.Friends
264 return response; 351 return response;
265 } 352 }
266 353
354 #endregion
355
356 #region Scene events
357
267 private void OnNewClient(IClientAPI client) 358 private void OnNewClient(IClientAPI client)
268 { 359 {
269 // All friends establishment protocol goes over instant message 360 // All friends establishment protocol goes over instant message
@@ -331,6 +422,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Friends
331 } 422 }
332 } 423 }
333 } 424 }
425 #endregion
334 426
335 private ScenePresence GetRootPresenceFromAgentID(UUID AgentID) 427 private ScenePresence GetRootPresenceFromAgentID(UUID AgentID)
336 { 428 {
@@ -681,7 +773,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Friends
681 agentID, exfriendID, data.Handle); 773 agentID, exfriendID, data.Handle);
682 774
683 // try to send to foreign region, retry if it fails (friend TPed away, for example) 775 // try to send to foreign region, retry if it fails (friend TPed away, for example)
684 if (m_initialScene.TriggerTerminateFriend(data.Handle, exfriendID, agentID)) break; 776 if (TriggerTerminateFriend(data.Handle, exfriendID, agentID)) break;
685 } 777 }
686 } 778 }
687 779
@@ -942,7 +1034,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Friends
942 //m_log.DebugFormat("[FRIEND]: Inform {0} friends in region {1} that user {2} is {3}line", 1034 //m_log.DebugFormat("[FRIEND]: Inform {0} friends in region {1} that user {2} is {3}line",
943 // pair.Value.Count, pair.Key, client.Name, iAmOnline ? "on" : "off"); 1035 // pair.Value.Count, pair.Key, client.Name, iAmOnline ? "on" : "off");
944 1036
945 friendIDsToSendTo.AddRange(m_initialScene.InformFriendsInOtherRegion(client.AgentId, pair.Key, pair.Value, iAmOnline)); 1037 friendIDsToSendTo.AddRange(InformFriendsInOtherRegion(client.AgentId, pair.Key, pair.Value, iAmOnline));
946 } 1038 }
947 } 1039 }
948 // now we have in friendIDsToSendTo only the agents left that TPed away while we tried to contact them. 1040 // now we have in friendIDsToSendTo only the agents left that TPed away while we tried to contact them.
diff --git a/OpenSim/Region/Framework/Scenes/Scene.cs b/OpenSim/Region/Framework/Scenes/Scene.cs
index 23c4478..1f6d647 100644
--- a/OpenSim/Region/Framework/Scenes/Scene.cs
+++ b/OpenSim/Region/Framework/Scenes/Scene.cs
@@ -2743,16 +2743,6 @@ namespace OpenSim.Region.Framework.Scenes
2743 return CommsManager.GetFriendRegionInfos(uuids); 2743 return CommsManager.GetFriendRegionInfos(uuids);
2744 } 2744 }
2745 2745
2746 public List<UUID> InformFriendsInOtherRegion(UUID agentId, ulong destRegionHandle, List<UUID> friends, bool online)
2747 {
2748 return CommsManager.InformFriendsInOtherRegion(agentId, destRegionHandle, friends, online);
2749 }
2750
2751 public bool TriggerTerminateFriend(ulong regionHandle, UUID agentID, UUID exFriendID)
2752 {
2753 return CommsManager.TriggerTerminateFriend(regionHandle, agentID, exFriendID);
2754 }
2755
2756 public virtual void StoreAddFriendship(UUID ownerID, UUID friendID, uint perms) 2746 public virtual void StoreAddFriendship(UUID ownerID, UUID friendID, uint perms)
2757 { 2747 {
2758 m_sceneGridService.AddNewUserFriend(ownerID, friendID, perms); 2748 m_sceneGridService.AddNewUserFriend(ownerID, friendID, perms);