diff options
Diffstat (limited to 'OpenSim/Region/Environment/Modules/Communications/REST/RESTInterregionComms.cs')
-rw-r--r-- | OpenSim/Region/Environment/Modules/Communications/REST/RESTInterregionComms.cs | 171 |
1 files changed, 165 insertions, 6 deletions
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 | } |