public bool CreateAgent(GridRegion destination, AgentCircuitData aCircuit, uint teleportFlags, AgentData data, out string reason)
{
reason = String.Empty;
// Try local first
if (m_localBackend.CreateAgent(destination, aCircuit, teleportFlags, data, out reason))
return true;
reason = String.Empty;
string uri = MakeUri(destination, true) + aCircuit.AgentID + "/";
try
{
OSDMap args = aCircuit.PackAgentCircuitData();
args["destination_x"] = OSD.FromString(destination.RegionLocX.ToString());
args["destination_y"] = OSD.FromString(destination.RegionLocY.ToString());
args["destination_name"] = OSD.FromString(destination.RegionName);
args["destination_uuid"] = OSD.FromString(destination.RegionID.ToString());
args["teleport_flags"] = OSD.FromString(teleportFlags.ToString());
if(data != null)
args["agent_data"] = data.Pack();
OSDMap result = WebUtils.PostToService (uri, args, true, false);
OSDMap results = WebUtils.GetOSDMap(result["_RawResult"].AsString());
//Pull out the result and set it as the reason
if (results == null)
return false;
reason = results["reason"] != null ? results["reason"].AsString() : "";
if (result["Success"].AsBoolean())
{
try
{
OSDMap responseMap = (OSDMap)OSDParser.DeserializeJson(reason);
if (responseMap.ContainsKey("Reason"))
reason = responseMap["Reason"].AsString();
return responseMap["Success"].AsBoolean();
}
catch
{
//Not right... don't return true except for opensim combatibility :/
return true;
}
}
reason = result["Message"] != null ? result["Message"].AsString() : "error";
return false;
}
catch (Exception e)
{
m_log.Warn("[REMOTE SIMULATION CONNECTOR]: CreateAgent failed with exception: " + e.ToString());
reason = e.Message;
}
return false;
}