diff options
Another interregion comms change that will not work well with previous versions. This commit moves InformRegionOfChildAgent from OGS1 to RESTComms, effectively having the complete child agent life cycle over REST: create=POST, update=PUT, close=DELETE.
Additional changes include more functions in the IHyperlink interface, and some refactorings in the HG code for better reuse in RESTComms.
Diffstat (limited to 'OpenSim/Region/Environment/Modules/Communications')
-rw-r--r-- | OpenSim/Region/Environment/Modules/Communications/Local/LocalInterregionComms.cs | 15 | ||||
-rw-r--r-- | OpenSim/Region/Environment/Modules/Communications/REST/RESTInterregionComms.cs | 171 |
2 files changed, 180 insertions, 6 deletions
diff --git a/OpenSim/Region/Environment/Modules/Communications/Local/LocalInterregionComms.cs b/OpenSim/Region/Environment/Modules/Communications/Local/LocalInterregionComms.cs index 135a05e..efc5c39 100644 --- a/OpenSim/Region/Environment/Modules/Communications/Local/LocalInterregionComms.cs +++ b/OpenSim/Region/Environment/Modules/Communications/Local/LocalInterregionComms.cs | |||
@@ -118,6 +118,21 @@ namespace OpenSim.Region.Environment.Modules.Communications.Local | |||
118 | 118 | ||
119 | #region IInterregionComms | 119 | #region IInterregionComms |
120 | 120 | ||
121 | public bool SendCreateChildAgent(ulong regionHandle, AgentCircuitData aCircuit) | ||
122 | { | ||
123 | foreach (Scene s in m_sceneList) | ||
124 | { | ||
125 | if (s.RegionInfo.RegionHandle == regionHandle) | ||
126 | { | ||
127 | //m_log.Debug("[LOCAL COMMS]: Found region to send SendCreateChildAgent"); | ||
128 | s.NewUserConnection(aCircuit); | ||
129 | return true; | ||
130 | } | ||
131 | } | ||
132 | //m_log.Debug("[LOCAL COMMS]: region not found for SendCreateChildAgent"); | ||
133 | return false; | ||
134 | } | ||
135 | |||
121 | public bool SendChildAgentUpdate(ulong regionHandle, AgentData cAgentData) | 136 | public bool SendChildAgentUpdate(ulong regionHandle, AgentData cAgentData) |
122 | { | 137 | { |
123 | foreach (Scene s in m_sceneList) | 138 | foreach (Scene s in m_sceneList) |
diff --git a/OpenSim/Region/Environment/Modules/Communications/REST/RESTInterregionComms.cs b/OpenSim/Region/Environment/Modules/Communications/REST/RESTInterregionComms.cs index bff8316..7eb5d30 100644 --- a/OpenSim/Region/Environment/Modules/Communications/REST/RESTInterregionComms.cs +++ b/OpenSim/Region/Environment/Modules/Communications/REST/RESTInterregionComms.cs | |||
@@ -128,6 +128,25 @@ namespace OpenSim.Region.Environment.Modules.Communications.REST | |||
128 | 128 | ||
129 | #region IInterregionComms | 129 | #region IInterregionComms |
130 | 130 | ||
131 | public bool SendCreateChildAgent(ulong regionHandle, AgentCircuitData aCircuit) | ||
132 | { | ||
133 | // Try local first | ||
134 | if (m_localBackend.SendCreateChildAgent(regionHandle, aCircuit)) | ||
135 | return true; | ||
136 | |||
137 | // else do the remote thing | ||
138 | RegionInfo regInfo = m_commsManager.GridService.RequestNeighbourInfo(regionHandle); | ||
139 | if (regInfo != null) | ||
140 | { | ||
141 | SendUserInformation(regInfo, aCircuit); | ||
142 | |||
143 | return DoCreateChildAgentCall(regInfo, aCircuit); | ||
144 | } | ||
145 | //else | ||
146 | // m_log.Warn("[REST COMMS]: Region not found " + regionHandle); | ||
147 | return false; | ||
148 | } | ||
149 | |||
131 | public bool SendChildAgentUpdate(ulong regionHandle, AgentData cAgentData) | 150 | public bool SendChildAgentUpdate(ulong regionHandle, AgentData cAgentData) |
132 | { | 151 | { |
133 | // Try local first | 152 | // Try local first |
@@ -197,6 +216,91 @@ namespace OpenSim.Region.Environment.Modules.Communications.REST | |||
197 | // Internal functions for the above public interface | 216 | // Internal functions for the above public interface |
198 | //------------------------------------------------------------------- | 217 | //------------------------------------------------------------------- |
199 | 218 | ||
219 | protected bool DoCreateChildAgentCall(RegionInfo region, AgentCircuitData aCircuit) | ||
220 | { | ||
221 | // Eventually, we want to use a caps url instead of the agentID | ||
222 | string uri = "http://" + region.ExternalEndPoint.Address + ":" + region.HttpPort + "/agent/" + aCircuit.AgentID + "/"; | ||
223 | //Console.WriteLine(" >>> DoCreateChildAgentCall <<< " + uri); | ||
224 | |||
225 | WebRequest AgentCreateRequest = WebRequest.Create(uri); | ||
226 | AgentCreateRequest.Method = "POST"; | ||
227 | AgentCreateRequest.ContentType = "application/json"; | ||
228 | AgentCreateRequest.Timeout = 10000; | ||
229 | |||
230 | // Fill it in | ||
231 | OSDMap args = null; | ||
232 | try | ||
233 | { | ||
234 | args = aCircuit.PackAgentCircuitData(); | ||
235 | } | ||
236 | catch (Exception e) | ||
237 | { | ||
238 | m_log.Debug("[REST COMMS]: PackAgentCircuitData failed with exception: " + e.Message); | ||
239 | } | ||
240 | // Add the regionhandle of the destination region | ||
241 | ulong regionHandle = GetRegionHandle(region.RegionHandle); | ||
242 | args["destination_handle"] = OSD.FromString(regionHandle.ToString()); | ||
243 | |||
244 | string strBuffer = ""; | ||
245 | byte[] buffer = new byte[1]; | ||
246 | try | ||
247 | { | ||
248 | strBuffer = OSDParser.SerializeJsonString(args); | ||
249 | System.Text.UTF8Encoding str = new System.Text.UTF8Encoding(); | ||
250 | buffer = str.GetBytes(strBuffer); | ||
251 | |||
252 | } | ||
253 | catch (Exception e) | ||
254 | { | ||
255 | m_log.WarnFormat("[OSG2]: Exception thrown on serialization of ChildCreate: {0}", e.Message); | ||
256 | // ignore. buffer will be empty, caller should check. | ||
257 | } | ||
258 | |||
259 | Stream os = null; | ||
260 | try | ||
261 | { // send the Post | ||
262 | AgentCreateRequest.ContentLength = buffer.Length; //Count bytes to send | ||
263 | os = AgentCreateRequest.GetRequestStream(); | ||
264 | os.Write(buffer, 0, strBuffer.Length); //Send it | ||
265 | os.Close(); | ||
266 | //m_log.InfoFormat("[REST COMMS]: Posted ChildAgentUpdate request to remote sim {0}", uri); | ||
267 | } | ||
268 | //catch (WebException ex) | ||
269 | catch | ||
270 | { | ||
271 | //m_log.InfoFormat("[REST COMMS]: Bad send on ChildAgentUpdate {0}", ex.Message); | ||
272 | |||
273 | return false; | ||
274 | } | ||
275 | |||
276 | // Let's wait for the response | ||
277 | //m_log.Info("[REST COMMS]: Waiting for a reply after DoCreateChildAgentCall"); | ||
278 | |||
279 | try | ||
280 | { | ||
281 | WebResponse webResponse = AgentCreateRequest.GetResponse(); | ||
282 | if (webResponse == null) | ||
283 | { | ||
284 | m_log.Info("[REST COMMS]: Null reply on DoCreateChildAgentCall post"); | ||
285 | } | ||
286 | |||
287 | StreamReader sr = new StreamReader(webResponse.GetResponseStream()); | ||
288 | //reply = sr.ReadToEnd().Trim(); | ||
289 | sr.ReadToEnd().Trim(); | ||
290 | sr.Close(); | ||
291 | //m_log.InfoFormat("[REST COMMS]: DoCreateChildAgentCall reply was {0} ", reply); | ||
292 | |||
293 | } | ||
294 | catch (WebException ex) | ||
295 | { | ||
296 | m_log.InfoFormat("[REST COMMS]: exception on reply of DoCreateChildAgentCall {0}", ex.Message); | ||
297 | // ignore, really | ||
298 | } | ||
299 | |||
300 | return true; | ||
301 | |||
302 | } | ||
303 | |||
200 | protected bool DoChildAgentUpdateCall(RegionInfo region, IAgentData cAgentData) | 304 | protected bool DoChildAgentUpdateCall(RegionInfo region, IAgentData cAgentData) |
201 | { | 305 | { |
202 | // Eventually, we want to use a caps url instead of the agentID | 306 | // Eventually, we want to use a caps url instead of the agentID |
@@ -233,7 +337,7 @@ namespace OpenSim.Region.Environment.Modules.Communications.REST | |||
233 | } | 337 | } |
234 | catch (Exception e) | 338 | catch (Exception e) |
235 | { | 339 | { |
236 | m_log.WarnFormat("[OSG2]: Exception thrown on serialization of ChildUpdate: {0}", e.Message); | 340 | m_log.WarnFormat("[REST COMMS]: Exception thrown on serialization of ChildUpdate: {0}", e.Message); |
237 | // ignore. buffer will be empty, caller should check. | 341 | // ignore. buffer will be empty, caller should check. |
238 | } | 342 | } |
239 | 343 | ||
@@ -388,10 +492,7 @@ namespace OpenSim.Region.Environment.Modules.Communications.REST | |||
388 | } | 492 | } |
389 | else if (method.Equals("POST")) | 493 | else if (method.Equals("POST")) |
390 | { | 494 | { |
391 | m_log.InfoFormat("[REST COMMS]: method {0} not implemented yet in agent message", method); | 495 | DoPost(request, responsedata, agentID); |
392 | responsedata["int_response_code"] = 404; | ||
393 | responsedata["str_response_string"] = "false"; | ||
394 | |||
395 | return responsedata; | 496 | return responsedata; |
396 | } | 497 | } |
397 | else if (method.Equals("DELETE")) | 498 | else if (method.Equals("DELETE")) |
@@ -438,6 +539,40 @@ namespace OpenSim.Region.Environment.Modules.Communications.REST | |||
438 | } | 539 | } |
439 | } | 540 | } |
440 | 541 | ||
542 | protected virtual void DoPost(Hashtable request, Hashtable responsedata, UUID id) | ||
543 | { | ||
544 | OSDMap args = GetOSDMap(request); | ||
545 | if (args == null) | ||
546 | { | ||
547 | responsedata["int_response_code"] = 400; | ||
548 | responsedata["str_response_string"] = "false"; | ||
549 | return; | ||
550 | } | ||
551 | |||
552 | // retrieve the regionhandle | ||
553 | ulong regionhandle = 0; | ||
554 | if (args["destination_handle"] != null) | ||
555 | UInt64.TryParse(args["destination_handle"].AsString(), out regionhandle); | ||
556 | |||
557 | AgentCircuitData aCircuit = new AgentCircuitData(); | ||
558 | try | ||
559 | { | ||
560 | aCircuit.UnpackAgentCircuitData(args); | ||
561 | } | ||
562 | catch (Exception ex) | ||
563 | { | ||
564 | m_log.InfoFormat("[REST COMMS]: exception on unpacking ChildCreate message {0}", ex.Message); | ||
565 | return; | ||
566 | } | ||
567 | |||
568 | // This is the meaning of POST agent | ||
569 | AdjustUserInformation(aCircuit); | ||
570 | bool result = m_localBackend.SendCreateChildAgent(regionhandle, aCircuit); | ||
571 | |||
572 | responsedata["int_response_code"] = 200; | ||
573 | responsedata["str_response_string"] = result.ToString(); | ||
574 | } | ||
575 | |||
441 | protected virtual void DoPut(Hashtable request, Hashtable responsedata) | 576 | protected virtual void DoPut(Hashtable request, Hashtable responsedata) |
442 | { | 577 | { |
443 | OSDMap args = GetOSDMap(request); | 578 | OSDMap args = GetOSDMap(request); |
@@ -553,6 +688,10 @@ namespace OpenSim.Region.Environment.Modules.Communications.REST | |||
553 | } | 688 | } |
554 | } | 689 | } |
555 | 690 | ||
691 | #endregion Misc | ||
692 | |||
693 | #region Hyperlinks | ||
694 | |||
556 | protected virtual ulong GetRegionHandle(ulong handle) | 695 | protected virtual ulong GetRegionHandle(ulong handle) |
557 | { | 696 | { |
558 | if (m_aScene.SceneGridService is HGSceneCommunicationService) | 697 | if (m_aScene.SceneGridService is HGSceneCommunicationService) |
@@ -568,7 +707,27 @@ namespace OpenSim.Region.Environment.Modules.Communications.REST | |||
568 | 707 | ||
569 | return false; | 708 | return false; |
570 | } | 709 | } |
571 | #endregion /* Misc */ | 710 | |
711 | protected virtual void SendUserInformation(RegionInfo regInfo, AgentCircuitData aCircuit) | ||
712 | { | ||
713 | try | ||
714 | { | ||
715 | if (IsHyperlink(regInfo.RegionHandle)) | ||
716 | { | ||
717 | ((HGSceneCommunicationService)(m_aScene.SceneGridService)).m_hg.SendUserInformation(regInfo, aCircuit); | ||
718 | } | ||
719 | } | ||
720 | catch // Bad cast | ||
721 | { } | ||
722 | |||
723 | } | ||
724 | |||
725 | protected virtual void AdjustUserInformation(AgentCircuitData aCircuit) | ||
726 | { | ||
727 | if (m_aScene.SceneGridService is HGSceneCommunicationService) | ||
728 | ((HGSceneCommunicationService)(m_aScene.SceneGridService)).m_hg.AdjustUserInformation(aCircuit); | ||
729 | } | ||
730 | #endregion /* Hyperlinks */ | ||
572 | 731 | ||
573 | } | 732 | } |
574 | } | 733 | } |