aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Services/Connectors/Simulation/SimulationServiceConnector.cs
diff options
context:
space:
mode:
Diffstat (limited to 'OpenSim/Services/Connectors/Simulation/SimulationServiceConnector.cs')
-rw-r--r--OpenSim/Services/Connectors/Simulation/SimulationServiceConnector.cs553
1 files changed, 113 insertions, 440 deletions
diff --git a/OpenSim/Services/Connectors/Simulation/SimulationServiceConnector.cs b/OpenSim/Services/Connectors/Simulation/SimulationServiceConnector.cs
index 4e3cfa5..f34c2bd 100644
--- a/OpenSim/Services/Connectors/Simulation/SimulationServiceConnector.cs
+++ b/OpenSim/Services/Connectors/Simulation/SimulationServiceConnector.cs
@@ -75,469 +75,193 @@ namespace OpenSim.Services.Connectors.Simulation
75 return "agent/"; 75 return "agent/";
76 } 76 }
77 77
78 /// <summary>
79 ///
80 /// </summary>
78 public bool CreateAgent(GridRegion destination, AgentCircuitData aCircuit, uint flags, out string reason) 81 public bool CreateAgent(GridRegion destination, AgentCircuitData aCircuit, uint flags, out string reason)
79 { 82 {
80 HttpWebRequest AgentCreateRequest = null; 83 // m_log.DebugFormat("[REMOTE SIMULATION CONNECTOR]: CreateAgent start");
81 reason = String.Empty; 84
82
83 if (SendRequest(destination, aCircuit, flags, out reason, out AgentCreateRequest))
84 {
85 string response = GetResponse(AgentCreateRequest, out reason);
86 bool success = true;
87 UnpackResponse(response, out success, out reason);
88 return success;
89 }
90
91 return false;
92 }
93
94
95 protected bool SendRequest(GridRegion destination, AgentCircuitData aCircuit, uint flags, out string reason, out HttpWebRequest AgentCreateRequest)
96 {
97 reason = String.Empty; 85 reason = String.Empty;
98 AgentCreateRequest = null;
99
100 if (destination == null) 86 if (destination == null)
101 { 87 {
102 reason = "Destination is null";
103 m_log.Debug("[REMOTE SIMULATION CONNECTOR]: Given destination is null"); 88 m_log.Debug("[REMOTE SIMULATION CONNECTOR]: Given destination is null");
104 return false; 89 return false;
105 } 90 }
106 91
107 string uri = destination.ServerURI + AgentPath() + aCircuit.AgentID + "/"; 92 string uri = destination.ServerURI + AgentPath() + aCircuit.AgentID + "/";
108 93
109 AgentCreateRequest = (HttpWebRequest)WebRequest.Create(uri);
110 AgentCreateRequest.Method = "POST";
111 AgentCreateRequest.ContentType = "application/json";
112 AgentCreateRequest.Timeout = 10000;
113 //AgentCreateRequest.KeepAlive = false;
114 //AgentCreateRequest.Headers.Add("Authorization", authKey);
115
116 // Fill it in
117 OSDMap args = PackCreateAgentArguments(aCircuit, destination, flags);
118 if (args == null)
119 return false;
120
121 string strBuffer = "";
122 byte[] buffer = new byte[1];
123 try 94 try
124 { 95 {
125 strBuffer = OSDParser.SerializeJsonString(args); 96 OSDMap args = aCircuit.PackAgentCircuitData();
126 Encoding str = Util.UTF8;
127 buffer = str.GetBytes(strBuffer);
128 97
129 } 98 args["destination_x"] = OSD.FromString(destination.RegionLocX.ToString());
130 catch (Exception e) 99 args["destination_y"] = OSD.FromString(destination.RegionLocY.ToString());
131 { 100 args["destination_name"] = OSD.FromString(destination.RegionName);
132 m_log.WarnFormat("[REMOTE SIMULATION CONNECTOR]: Exception thrown on serialization of ChildCreate: {0}", e.Message); 101 args["destination_uuid"] = OSD.FromString(destination.RegionID.ToString());
133 // ignore. buffer will be empty, caller should check. 102 args["teleport_flags"] = OSD.FromString(flags.ToString());
134 }
135 103
136 Stream os = null; 104 OSDMap result = WebUtil.PostToService(uri,args);
137 try 105 if (result["Success"].AsBoolean())
138 { // send the Post 106 return true;
139 AgentCreateRequest.ContentLength = buffer.Length; //Count bytes to send 107
140 os = AgentCreateRequest.GetRequestStream(); 108 reason = result["Message"] != null ? result["Message"].AsString() : "error";
141 os.Write(buffer, 0, strBuffer.Length); //Send it
142 m_log.DebugFormat("[REMOTE SIMULATION CONNECTOR]: Posted CreateAgent request to remote sim {0}, region {1}, x={2} y={3}",
143 uri, destination.RegionName, destination.RegionLocX, destination.RegionLocY);
144 }
145 //catch (WebException ex)
146 catch
147 {
148 //m_log.ErrorFormat("[REMOTE SIMULATION CONNECTOR]: Bad send on ChildAgentUpdate {0}", ex.Message);
149 reason = "cannot contact remote region";
150 return false; 109 return false;
151 } 110 }
152 finally
153 {
154 if (os != null)
155 os.Close();
156 }
157
158 return true;
159 }
160
161 protected string GetResponse(HttpWebRequest AgentCreateRequest, out string reason)
162 {
163 // Let's wait for the response
164 //m_log.Info("[REMOTE SIMULATION CONNECTOR]: Waiting for a reply after DoCreateChildAgentCall");
165 reason = string.Empty;
166
167 WebResponse webResponse = null;
168 StreamReader sr = null;
169 string response = string.Empty;
170 try
171 {
172 webResponse = AgentCreateRequest.GetResponse();
173 if (webResponse == null)
174 {
175 m_log.Debug("[REMOTE SIMULATION CONNECTOR]: Null reply on DoCreateChildAgentCall post");
176 }
177 else
178 {
179
180 sr = new StreamReader(webResponse.GetResponseStream());
181 response = sr.ReadToEnd().Trim();
182 m_log.DebugFormat("[REMOTE SIMULATION CONNECTOR]: DoCreateChildAgentCall reply was {0} ", response);
183 }
184 }
185 catch (WebException ex)
186 {
187 m_log.WarnFormat("[REMOTE SIMULATION CONNECTOR]: exception on reply of DoCreateChildAgentCall {0}", ex.Message);
188 reason = "Destination did not reply";
189 return string.Empty;
190 }
191 finally
192 {
193 if (sr != null)
194 sr.Close();
195 }
196
197 return response;
198 }
199
200 protected void UnpackResponse(string response, out bool result, out string reason)
201 {
202 result = true;
203 reason = string.Empty;
204 if (!String.IsNullOrEmpty(response))
205 {
206 try
207 {
208 // we assume we got an OSDMap back
209 OSDMap r = Util.GetOSDMap(response);
210 result = r["success"].AsBoolean();
211 reason = r["reason"].AsString();
212 }
213 catch (NullReferenceException e)
214 {
215 m_log.WarnFormat("[REMOTE SIMULATION CONNECTOR]: exception on reply of DoCreateChildAgentCall {0}", e.Message);
216
217 // check for old style response
218 if (response.ToLower().StartsWith("true"))
219 result = true;
220
221 result = false;
222 }
223 }
224 }
225
226 protected virtual OSDMap PackCreateAgentArguments(AgentCircuitData aCircuit, GridRegion destination, uint flags)
227 {
228 OSDMap args = null;
229 try
230 {
231 args = aCircuit.PackAgentCircuitData();
232 }
233 catch (Exception e) 111 catch (Exception e)
234 { 112 {
235 m_log.Warn("[REMOTE SIMULATION CONNECTOR]: PackAgentCircuitData failed with exception: " + e.Message); 113 m_log.Warn("[REMOTE SIMULATION CONNECTOR]: CreateAgent failed with exception: " + e.ToString());
236 return null; 114 reason = e.Message;
237 } 115 }
238 116
239 // Add the input arguments 117 return false;
240 args["destination_x"] = OSD.FromString(destination.RegionLocX.ToString());
241 args["destination_y"] = OSD.FromString(destination.RegionLocY.ToString());
242 args["destination_name"] = OSD.FromString(destination.RegionName);
243 args["destination_uuid"] = OSD.FromString(destination.RegionID.ToString());
244 args["teleport_flags"] = OSD.FromString(flags.ToString());
245
246 return args;
247 } 118 }
248 119
120 /// <summary>
121 /// Send complete data about an agent in this region to a neighbor
122 /// </summary>
249 public bool UpdateAgent(GridRegion destination, AgentData data) 123 public bool UpdateAgent(GridRegion destination, AgentData data)
250 { 124 {
251 return UpdateAgent(destination, (IAgentData)data); 125 return UpdateAgent(destination, (IAgentData)data);
252 } 126 }
253 127
128 /// <summary>
129 /// Send updated position information about an agent in this region to a neighbor
130 /// This operation may be called very frequently if an avatar is moving about in
131 /// the region.
132 /// </summary>
254 public bool UpdateAgent(GridRegion destination, AgentPosition data) 133 public bool UpdateAgent(GridRegion destination, AgentPosition data)
255 { 134 {
135 // we need a better throttle for these
136 // return false;
137
256 return UpdateAgent(destination, (IAgentData)data); 138 return UpdateAgent(destination, (IAgentData)data);
257 } 139 }
258 140
141 /// <summary>
142 /// This is the worker function to send AgentData to a neighbor region
143 /// </summary>
259 private bool UpdateAgent(GridRegion destination, IAgentData cAgentData) 144 private bool UpdateAgent(GridRegion destination, IAgentData cAgentData)
260 { 145 {
261 // Eventually, we want to use a caps url instead of the agentID 146 // m_log.DebugFormat("[REMOTE SIMULATION CONNECTOR]: UpdateAgent start");
262 147
148 // Eventually, we want to use a caps url instead of the agentID
263 string uri = destination.ServerURI + AgentPath() + cAgentData.AgentID + "/"; 149 string uri = destination.ServerURI + AgentPath() + cAgentData.AgentID + "/";
264 150
265 HttpWebRequest ChildUpdateRequest = (HttpWebRequest)WebRequest.Create(uri);
266 ChildUpdateRequest.Method = "PUT";
267 ChildUpdateRequest.ContentType = "application/json";
268 ChildUpdateRequest.Timeout = 30000;
269 //ChildUpdateRequest.KeepAlive = false;
270
271 // Fill it in
272 OSDMap args = null;
273 try
274 {
275 args = cAgentData.Pack();
276 }
277 catch (Exception e)
278 {
279 m_log.Warn("[REMOTE SIMULATION CONNECTOR]: PackUpdateMessage failed with exception: " + e.Message);
280 }
281 // Add the input arguments
282 args["destination_x"] = OSD.FromString(destination.RegionLocX.ToString());
283 args["destination_y"] = OSD.FromString(destination.RegionLocY.ToString());
284 args["destination_name"] = OSD.FromString(destination.RegionName);
285 args["destination_uuid"] = OSD.FromString(destination.RegionID.ToString());
286
287 string strBuffer = "";
288 byte[] buffer = new byte[1];
289 try
290 {
291 strBuffer = OSDParser.SerializeJsonString(args);
292 Encoding str = Util.UTF8;
293 buffer = str.GetBytes(strBuffer);
294
295 }
296 catch (Exception e)
297 {
298 m_log.WarnFormat("[REMOTE SIMULATION CONNECTOR]: Exception thrown on serialization of ChildUpdate: {0}", e.Message);
299 // ignore. buffer will be empty, caller should check.
300 }
301
302 Stream os = null;
303 try
304 { // send the Post
305 ChildUpdateRequest.ContentLength = buffer.Length; //Count bytes to send
306 os = ChildUpdateRequest.GetRequestStream();
307 os.Write(buffer, 0, strBuffer.Length); //Send it
308 //m_log.DebugFormat("[REMOTE SIMULATION CONNECTOR]: Posted AgentUpdate request to remote sim {0}", uri);
309 }
310 catch (WebException ex)
311 //catch
312 {
313 m_log.WarnFormat("[REMOTE SIMULATION CONNECTOR]: Bad send on AgentUpdate {0}", ex.Message);
314
315 return false;
316 }
317 finally
318 {
319 if (os != null)
320 os.Close();
321 }
322
323 // Let's wait for the response
324 //m_log.Debug("[REMOTE SIMULATION CONNECTOR]: Waiting for a reply after ChildAgentUpdate");
325
326 WebResponse webResponse = null;
327 StreamReader sr = null;
328 try 151 try
329 { 152 {
330 webResponse = ChildUpdateRequest.GetResponse(); 153 OSDMap args = cAgentData.Pack();
331 if (webResponse == null)
332 {
333 m_log.Debug("[REMOTE SIMULATION CONNECTOR]: Null reply on ChilAgentUpdate post");
334 }
335 154
336 sr = new StreamReader(webResponse.GetResponseStream()); 155 args["destination_x"] = OSD.FromString(destination.RegionLocX.ToString());
337 //reply = sr.ReadToEnd().Trim(); 156 args["destination_y"] = OSD.FromString(destination.RegionLocY.ToString());
338 sr.ReadToEnd().Trim(); 157 args["destination_name"] = OSD.FromString(destination.RegionName);
339 sr.Close(); 158 args["destination_uuid"] = OSD.FromString(destination.RegionID.ToString());
340 //m_log.DebugFormat("[REMOTE SIMULATION CONNECTOR]: ChilAgentUpdate reply was {0} ", reply);
341 159
160 OSDMap result = WebUtil.PutToService(uri,args);
161 return result["Success"].AsBoolean();
342 } 162 }
343 catch (WebException ex) 163 catch (Exception e)
344 {
345 m_log.WarnFormat("[REMOTE SIMULATION CONNECTOR]: exception on reply of ChilAgentUpdate from {0}: {1}", uri, ex.Message);
346 // ignore, really
347 }
348 finally
349 { 164 {
350 if (sr != null) 165 m_log.Warn("[REMOTE SIMULATION CONNECTOR]: UpdateAgent failed with exception: " + e.ToString());
351 sr.Close();
352 } 166 }
353 167
354 return true; 168 return false;
355 } 169 }
356 170
171 /// <summary>
172 /// Not sure what sequence causes this function to be invoked. The only calling
173 /// path is through the GET method
174 /// </summary>
357 public bool RetrieveAgent(GridRegion destination, UUID id, out IAgentData agent) 175 public bool RetrieveAgent(GridRegion destination, UUID id, out IAgentData agent)
358 { 176 {
177 // m_log.DebugFormat("[REMOTE SIMULATION CONNECTOR]: RetrieveAgent start");
178
359 agent = null; 179 agent = null;
180
360 // Eventually, we want to use a caps url instead of the agentID 181 // Eventually, we want to use a caps url instead of the agentID
361 string uri = destination.ServerURI + AgentPath() + id + "/" + destination.RegionID.ToString() + "/"; 182 string uri = destination.ServerURI + AgentPath() + id + "/" + destination.RegionID.ToString() + "/";
362 183
363 HttpWebRequest request = (HttpWebRequest)WebRequest.Create(uri);
364 request.Method = "GET";
365 request.Timeout = 10000;
366 //request.Headers.Add("authorization", ""); // coming soon
367
368 HttpWebResponse webResponse = null;
369 string reply = string.Empty;
370 StreamReader sr = null;
371 try 184 try
372 { 185 {
373 webResponse = (HttpWebResponse)request.GetResponse(); 186 OSDMap result = WebUtil.GetFromService(uri);
374 if (webResponse == null) 187 if (result["Success"].AsBoolean())
375 { 188 {
376 m_log.Debug("[REMOTE SIMULATION CONNECTOR]: Null reply on agent get "); 189 // OSDMap args = Util.GetOSDMap(result["_RawResult"].AsString());
190 OSDMap args = (OSDMap)result["_Result"];
191 if (args != null)
192 {
193 agent = new CompleteAgentData();
194 agent.Unpack(args);
195 return true;
196 }
377 } 197 }
378
379 sr = new StreamReader(webResponse.GetResponseStream());
380 reply = sr.ReadToEnd().Trim();
381
382
383 } 198 }
384 catch (WebException ex) 199 catch (Exception e)
385 {
386 m_log.WarnFormat("[REMOTE SIMULATION CONNECTOR]: exception on reply of agent get {0}", ex.Message);
387 // ignore, really
388 return false;
389 }
390 finally
391 {
392 if (sr != null)
393 sr.Close();
394 }
395
396 if (webResponse.StatusCode == HttpStatusCode.OK)
397 { 200 {
398 // we know it's jason 201 m_log.Warn("[REMOTE SIMULATION CONNECTOR]: UpdateAgent failed with exception: " + e.ToString());
399 OSDMap args = Util.GetOSDMap(reply);
400 if (args == null)
401 {
402 return false;
403 }
404
405 agent = new CompleteAgentData();
406 agent.Unpack(args);
407 return true;
408 } 202 }
409 203
410 return false; 204 return false;
411 } 205 }
412 206
207 /// <summary>
208 /// </summary>
413 public bool QueryAccess(GridRegion destination, UUID id) 209 public bool QueryAccess(GridRegion destination, UUID id)
414 { 210 {
211 // m_log.DebugFormat("[REMOTE SIMULATION CONNECTOR]: QueryAccess start");
212
415 IPEndPoint ext = destination.ExternalEndPoint; 213 IPEndPoint ext = destination.ExternalEndPoint;
416 if (ext == null) return false; 214 if (ext == null) return false;
215
417 // Eventually, we want to use a caps url instead of the agentID 216 // Eventually, we want to use a caps url instead of the agentID
418 string uri = destination.ServerURI + AgentPath() + id + "/" + destination.RegionID.ToString() + "/"; 217 string uri = destination.ServerURI + AgentPath() + id + "/" + destination.RegionID.ToString() + "/";
419 218
420 HttpWebRequest request = (HttpWebRequest)WebRequest.Create(uri);
421 request.Method = "QUERYACCESS";
422 request.Timeout = 10000;
423 //request.Headers.Add("authorization", ""); // coming soon
424
425 HttpWebResponse webResponse = null;
426 string reply = string.Empty;
427 StreamReader sr = null;
428 try 219 try
429 { 220 {
430 webResponse = (HttpWebResponse)request.GetResponse(); 221 OSDMap result = WebUtil.ServiceOSDRequest(uri,null,"QUERYACCESS",10000);
431 if (webResponse == null) 222 return result["Success"].AsBoolean();
432 {
433 m_log.Debug("[REMOTE SIMULATION CONNECTOR]: Null reply on agent query ");
434 }
435
436 sr = new StreamReader(webResponse.GetResponseStream());
437 reply = sr.ReadToEnd().Trim();
438
439
440 }
441 catch (WebException ex)
442 {
443 m_log.WarnFormat("[REMOTE SIMULATION CONNECTOR]: exception on reply of agent query {0}", ex.Message);
444 // ignore, really
445 return false;
446 } 223 }
447 finally 224 catch (Exception e)
448 { 225 {
449 if (sr != null) 226 m_log.WarnFormat("[REMOTE SIMULATION CONNECTOR] QueryAcess failed with exception; {0}",e.ToString());
450 sr.Close();
451 } 227 }
452 228
453 if (webResponse.StatusCode == HttpStatusCode.OK)
454 {
455 try
456 {
457 bool result;
458
459 result = bool.Parse(reply);
460
461 return result;
462 }
463 catch
464 {
465 return false;
466 }
467 }
468
469 return false; 229 return false;
470 } 230 }
471 231
232 /// <summary>
233 /// </summary>
472 public bool ReleaseAgent(UUID origin, UUID id, string uri) 234 public bool ReleaseAgent(UUID origin, UUID id, string uri)
473 { 235 {
474 WebRequest request = WebRequest.Create(uri); 236 // m_log.DebugFormat("[REMOTE SIMULATION CONNECTOR]: ReleaseAgent start");
475 request.Method = "DELETE";
476 request.Timeout = 10000;
477 237
478 StreamReader sr = null;
479 try 238 try
480 { 239 {
481 WebResponse webResponse = request.GetResponse(); 240 OSDMap result = WebUtil.ServiceOSDRequest(uri,null,"DELETE",10000);
482 if (webResponse == null)
483 {
484 m_log.Debug("[REMOTE SIMULATION CONNECTOR]: Null reply on ReleaseAgent");
485 }
486
487 sr = new StreamReader(webResponse.GetResponseStream());
488 //reply = sr.ReadToEnd().Trim();
489 sr.ReadToEnd().Trim();
490 sr.Close();
491 //m_log.InfoFormat("[REMOTE SIMULATION CONNECTOR]: ChilAgentUpdate reply was {0} ", reply);
492
493 }
494 catch (WebException ex)
495 {
496 m_log.WarnFormat("[REMOTE SIMULATION CONNECTOR]: exception on reply of ReleaseAgent {0}", ex.Message);
497 return false;
498 } 241 }
499 finally 242 catch (Exception e)
500 { 243 {
501 if (sr != null) 244 m_log.WarnFormat("[REMOTE SIMULATION CONNECTOR] ReleaseAgent failed with exception; {0}",e.ToString());
502 sr.Close();
503 } 245 }
504 246
505 return true; 247 return true;
506 } 248 }
507 249
250 /// <summary>
251 /// </summary>
508 public bool CloseAgent(GridRegion destination, UUID id) 252 public bool CloseAgent(GridRegion destination, UUID id)
509 { 253 {
510 string uri = destination.ServerURI + AgentPath() + id + "/" + destination.RegionID.ToString() + "/"; 254 // m_log.DebugFormat("[REMOTE SIMULATION CONNECTOR]: CloseAgent start");
511 255
512 WebRequest request = WebRequest.Create(uri); 256 string uri = destination.ServerURI + AgentPath() + id + "/" + destination.RegionID.ToString() + "/";
513 request.Method = "DELETE";
514 request.Timeout = 10000;
515 257
516 StreamReader sr = null;
517 try 258 try
518 { 259 {
519 WebResponse webResponse = request.GetResponse(); 260 OSDMap result = WebUtil.ServiceOSDRequest(uri,null,"DELETE",10000);
520 if (webResponse == null)
521 {
522 m_log.Debug("[REMOTE SIMULATION CONNECTOR]: Null reply on agent delete ");
523 }
524
525 sr = new StreamReader(webResponse.GetResponseStream());
526 //reply = sr.ReadToEnd().Trim();
527 sr.ReadToEnd().Trim();
528 sr.Close();
529 //m_log.InfoFormat("[REMOTE SIMULATION CONNECTOR]: ChilAgentUpdate reply was {0} ", reply);
530
531 }
532 catch (WebException ex)
533 {
534 m_log.WarnFormat("[REMOTE SIMULATION CONNECTOR]: exception on reply of agent delete from {0}: {1}", destination.RegionName, ex.Message);
535 return false;
536 } 261 }
537 finally 262 catch (Exception e)
538 { 263 {
539 if (sr != null) 264 m_log.WarnFormat("[REMOTE SIMULATION CONNECTOR] CloseAgent failed with exception; {0}",e.ToString());
540 sr.Close();
541 } 265 }
542 266
543 return true; 267 return true;
@@ -552,97 +276,46 @@ namespace OpenSim.Services.Connectors.Simulation
552 return "object/"; 276 return "object/";
553 } 277 }
554 278
279 /// <summary>
280 ///
281 /// </summary>
555 public bool CreateObject(GridRegion destination, ISceneObject sog, bool isLocalCall) 282 public bool CreateObject(GridRegion destination, ISceneObject sog, bool isLocalCall)
556 { 283 {
557 string uri 284 // m_log.DebugFormat("[REMOTE SIMULATION CONNECTOR]: CreateObject start");
558 = destination.ServerURI + ObjectPath() + sog.UUID + "/";
559 //m_log.Debug(" >>> DoCreateObjectCall <<< " + uri);
560
561 WebRequest ObjectCreateRequest = WebRequest.Create(uri);
562 ObjectCreateRequest.Method = "POST";
563 ObjectCreateRequest.ContentType = "application/json";
564 ObjectCreateRequest.Timeout = 10000;
565
566 OSDMap args = new OSDMap(2);
567 args["sog"] = OSD.FromString(sog.ToXml2());
568 args["extra"] = OSD.FromString(sog.ExtraToXmlString());
569 args["modified"] = OSD.FromBoolean(sog.HasGroupChanged);
570 string state = sog.GetStateSnapshot();
571 if (state.Length > 0)
572 args["state"] = OSD.FromString(state);
573 // Add the input general arguments
574 args["destination_x"] = OSD.FromString(destination.RegionLocX.ToString());
575 args["destination_y"] = OSD.FromString(destination.RegionLocY.ToString());
576 args["destination_name"] = OSD.FromString(destination.RegionName);
577 args["destination_uuid"] = OSD.FromString(destination.RegionID.ToString());
578
579 string strBuffer = "";
580 byte[] buffer = new byte[1];
581 try
582 {
583 strBuffer = OSDParser.SerializeJsonString(args);
584 Encoding str = Util.UTF8;
585 buffer = str.GetBytes(strBuffer);
586 285
587 } 286 string uri = destination.ServerURI + ObjectPath() + sog.UUID + "/";
588 catch (Exception e)
589 {
590 m_log.WarnFormat("[REMOTE SIMULATION CONNECTOR]: Exception thrown on serialization of CreateObject: {0}", e.Message);
591 // ignore. buffer will be empty, caller should check.
592 }
593 287
594 Stream os = null;
595 try 288 try
596 { // send the Post
597 ObjectCreateRequest.ContentLength = buffer.Length; //Count bytes to send
598 os = ObjectCreateRequest.GetRequestStream();
599 os.Write(buffer, 0, strBuffer.Length); //Send it
600 m_log.DebugFormat("[REMOTE SIMULATION CONNECTOR]: Posted CreateObject request to remote sim {0}", uri);
601 }
602 catch (WebException ex)
603 {
604 m_log.WarnFormat("[REMOTE SIMULATION CONNECTOR]: Bad send on CreateObject {0}", ex.Message);
605 return false;
606 }
607 finally
608 { 289 {
609 if (os != null) 290 OSDMap args = new OSDMap(2);
610 os.Close();
611 }
612 291
613 // Let's wait for the response 292 args["sog"] = OSD.FromString(sog.ToXml2());
614 //m_log.Info("[REMOTE SIMULATION CONNECTOR]: Waiting for a reply after DoCreateChildAgentCall"); 293 args["extra"] = OSD.FromString(sog.ExtraToXmlString());
294 args["modified"] = OSD.FromBoolean(sog.HasGroupChanged);
615 295
616 StreamReader sr = null; 296 string state = sog.GetStateSnapshot();
617 try 297 if (state.Length > 0)
618 { 298 args["state"] = OSD.FromString(state);
619 WebResponse webResponse = ObjectCreateRequest.GetResponse();
620 if (webResponse == null)
621 {
622 m_log.Warn("[REMOTE SIMULATION CONNECTOR]: Null reply on CreateObject post");
623 return false;
624 }
625 299
626 sr = new StreamReader(webResponse.GetResponseStream()); 300 // Add the input general arguments
627 //reply = sr.ReadToEnd().Trim(); 301 args["destination_x"] = OSD.FromString(destination.RegionLocX.ToString());
628 sr.ReadToEnd().Trim(); 302 args["destination_y"] = OSD.FromString(destination.RegionLocY.ToString());
629 //m_log.InfoFormat("[REMOTE SIMULATION CONNECTOR]: DoCreateChildAgentCall reply was {0} ", reply); 303 args["destination_name"] = OSD.FromString(destination.RegionName);
304 args["destination_uuid"] = OSD.FromString(destination.RegionID.ToString());
630 305
306 OSDMap result = WebUtil.PostToService(uri,args);
631 } 307 }
632 catch (WebException ex) 308 catch (Exception e)
633 {
634 m_log.WarnFormat("[REMOTE SIMULATION CONNECTOR]: exception on reply of CreateObject {0}", ex.Message);
635 return false;
636 }
637 finally
638 { 309 {
639 if (sr != null) 310 m_log.WarnFormat("[REMOTE SIMULATION CONNECTOR] CreateObject failed with exception; {0}",e.ToString());
640 sr.Close();
641 } 311 }
642 312
643 return true; 313 return true;
644 } 314 }
645 315
316 /// <summary>
317 ///
318 /// </summary>
646 public bool CreateObject(GridRegion destination, UUID userID, UUID itemID) 319 public bool CreateObject(GridRegion destination, UUID userID, UUID itemID)
647 { 320 {
648 // TODO, not that urgent 321 // TODO, not that urgent