now i can login on win .net4.8, but just a little drop on a large (broken) OSD ocean. some of this changes are actually good even on good JIT. Failure seems to be on same code pattern, but same points seem to vary with each JIT compilation, sometimes work, others don't, others always fail, etc

0.9.1.0-post-fixes
UbitUmarov 2019-07-30 23:26:29 +01:00
parent 185ed42123
commit 944a785a32
9 changed files with 366 additions and 310 deletions

View File

@ -267,16 +267,17 @@ namespace OpenSim.Framework
/// <param name="args"></param>
public void UnpackAgentCircuitData(OSDMap args)
{
if (args["agent_id"] != null)
AgentID = args["agent_id"].AsUUID();
if (args["base_folder"] != null)
BaseFolder = args["base_folder"].AsUUID();
if (args["caps_path"] != null)
CapsPath = args["caps_path"].AsString();
OSD tmpOSD;
if (args.TryGetValue("agent_id", out tmpOSD))
AgentID = tmpOSD.AsUUID();
if (args.TryGetValue("base_folder", out tmpOSD))
BaseFolder =tmpOSD.AsUUID();
if (args.TryGetValue("caps_path", out tmpOSD))
CapsPath = tmpOSD.AsString();
if ((args["children_seeds"] != null) && (args["children_seeds"].Type == OSDType.Array))
if ((args.TryGetValue("children_seeds", out tmpOSD) && tmpOSD is OSDArray))
{
OSDArray childrenSeeds = (OSDArray)(args["children_seeds"]);
OSDArray childrenSeeds = (OSDArray)tmpOSD;
ChildrenCapSeeds = new Dictionary<ulong, string>();
foreach (OSD o in childrenSeeds)
{
@ -285,53 +286,59 @@ namespace OpenSim.Framework
ulong handle = 0;
string seed = "";
OSDMap pair = (OSDMap)o;
if (pair["handle"] != null)
if (!UInt64.TryParse(pair["handle"].AsString(), out handle))
if (pair.TryGetValue("handle", out tmpOSD))
{
if (!UInt64.TryParse(tmpOSD.AsString(), out handle))
continue;
if (pair["seed"] != null)
seed = pair["seed"].AsString();
}
if (!ChildrenCapSeeds.ContainsKey(handle))
ChildrenCapSeeds.Add(handle, seed);
{
if (pair.TryGetValue("seed", out tmpOSD))
{
seed = tmpOSD.AsString();
ChildrenCapSeeds.Add(handle, seed);
}
}
}
}
}
else
ChildrenCapSeeds = new Dictionary<ulong, string>();
if (args["child"] != null)
child = args["child"].AsBoolean();
if (args["circuit_code"] != null)
UInt32.TryParse(args["circuit_code"].AsString(), out circuitcode);
if (args["first_name"] != null)
firstname = args["first_name"].AsString();
if (args["last_name"] != null)
lastname = args["last_name"].AsString();
if (args["inventory_folder"] != null)
InventoryFolder = args["inventory_folder"].AsUUID();
if (args["secure_session_id"] != null)
SecureSessionID = args["secure_session_id"].AsUUID();
if (args["session_id"] != null)
SessionID = args["session_id"].AsUUID();
if (args["service_session_id"] != null)
ServiceSessionID = args["service_session_id"].AsString();
if (args["client_ip"] != null)
IPAddress = args["client_ip"].AsString();
if (args["viewer"] != null)
Viewer = args["viewer"].AsString();
if (args["channel"] != null)
Channel = args["channel"].AsString();
if (args["mac"] != null)
Mac = args["mac"].AsString();
if (args["id0"] != null)
Id0 = args["id0"].AsString();
if (args["teleport_flags"] != null)
teleportFlags = args["teleport_flags"].AsUInteger();
if (args.TryGetValue("child", out tmpOSD))
child = tmpOSD.AsBoolean();
if (args.TryGetValue("circuit_code", out tmpOSD))
UInt32.TryParse(tmpOSD.AsString(), out circuitcode);
if (args.TryGetValue("first_name", out tmpOSD))
firstname = tmpOSD.AsString();
if (args.TryGetValue("last_name", out tmpOSD))
lastname = tmpOSD.AsString();
if (args.TryGetValue("inventory_folder", out tmpOSD))
InventoryFolder = tmpOSD.AsUUID();
if (args.TryGetValue("secure_session_id", out tmpOSD))
SecureSessionID = tmpOSD.AsUUID();
if (args.TryGetValue("session_id", out tmpOSD))
SessionID = tmpOSD.AsUUID();
if (args.TryGetValue("service_session_id", out tmpOSD))
ServiceSessionID = tmpOSD.AsString();
if (args.TryGetValue("client_ip", out tmpOSD))
IPAddress = tmpOSD.AsString();
if (args.TryGetValue("viewer", out tmpOSD))
Viewer = tmpOSD.AsString();
if (args.TryGetValue("channel", out tmpOSD))
Channel = tmpOSD.AsString();
if (args.TryGetValue("mac", out tmpOSD))
Mac = tmpOSD.AsString();
if (args.TryGetValue("id0", out tmpOSD))
Id0 = tmpOSD.AsString();
if (args.TryGetValue("teleport_flags", out tmpOSD))
teleportFlags = tmpOSD.AsUInteger();
if (args["start_pos"] != null)
Vector3.TryParse(args["start_pos"].AsString(), out startpos);
if (args.TryGetValue("start_pos", out tmpOSD))
Vector3.TryParse(tmpOSD.AsString(), out startpos);
if(args["far"] != null)
startfar = (float)args["far"].AsReal();
if(args.TryGetValue("far", out tmpOSD))
startfar = (float)tmpOSD.AsReal();
//m_log.InfoFormat("[AGENTCIRCUITDATA]: agentid={0}, child={1}, startpos={2}", AgentID, child, startpos);
@ -342,12 +349,12 @@ namespace OpenSim.Framework
// Eventually this code should be deprecated, use full appearance
// packing in packed_appearance
if (args["appearance_serial"] != null)
Appearance.Serial = args["appearance_serial"].AsInteger();
if (args.TryGetValue("appearance_serial", out tmpOSD))
Appearance.Serial = tmpOSD.AsInteger();
if (args.ContainsKey("packed_appearance") && (args["packed_appearance"].Type == OSDType.Map))
if (args.TryGetValue("packed_appearance", out tmpOSD) && (tmpOSD is OSDMap))
{
Appearance.Unpack((OSDMap)args["packed_appearance"]);
Appearance.Unpack((OSDMap)tmpOSD);
// m_log.InfoFormat("[AGENTCIRCUITDATA] unpacked appearance");
}
else
@ -362,31 +369,31 @@ namespace OpenSim.Framework
ServiceURLs = new Dictionary<string, object>();
// Try parse the new way, OSDMap
if (args.ContainsKey("serviceurls") && args["serviceurls"] != null && (args["serviceurls"]).Type == OSDType.Map)
if (args.TryGetValue("serviceurls", out tmpOSD) && (tmpOSD is OSDMap))
{
OSDMap urls = (OSDMap)(args["serviceurls"]);
OSDMap urls = (OSDMap)tmpOSD;
foreach (KeyValuePair<String, OSD> kvp in urls)
{
ServiceURLs[kvp.Key] = kvp.Value.AsString();
tmpOSD = kvp.Value;
ServiceURLs[kvp.Key] = tmpOSD.AsString();
//System.Console.WriteLine("XXX " + kvp.Key + "=" + ServiceURLs[kvp.Key]);
}
}
// else try the old way, OSDArray
// OBSOLETE -- soon to be deleted
else if (args.ContainsKey("service_urls") && args["service_urls"] != null && (args["service_urls"]).Type == OSDType.Array)
else if (args.TryGetValue("service_urls", out tmpOSD) && (tmpOSD is OSDArray))
{
OSDArray urls = (OSDArray)(args["service_urls"]);
for (int i = 0; i < urls.Count / 2; i++)
OSDArray urls = (OSDArray)tmpOSD;
OSD tmpOSDb;
for (int i = 0; i < urls.Count - 1; i += 2)
{
ServiceURLs[urls[i * 2].AsString()] = urls[(i * 2) + 1].AsString();
tmpOSD = urls[i];
tmpOSDb = urls[i + 1];
ServiceURLs[tmpOSD.AsString()] = tmpOSDb.AsString();
//System.Console.WriteLine("XXX " + urls[i * 2].AsString() + "=" + urls[(i * 2) + 1].AsString());
}
}
}
}
}

View File

@ -796,25 +796,33 @@ namespace OpenSim.Framework
/// </summary>
public void Unpack(OSDMap data)
{
if ((data != null) && (data["serial"] != null))
m_serial = data["serial"].AsInteger();
if ((data != null) && (data["height"] != null))
SetDefaultWearables();
SetDefaultTexture();
SetDefaultParams();
m_attachments = new Dictionary<int, List<AvatarAttachment>>();
if(data == null)
{
m_log.Warn("[AVATAR APPEARANCE]: data to unpack is null");
return;
}
OSD tmpOSD;
if (data.TryGetValue("serial", out tmpOSD))
m_serial = tmpOSD.AsInteger();
if (data.TryGetValue("height", out tmpOSD))
// m_avatarHeight = (float)data["height"].AsReal();
SetSize(new Vector3(0.45f,0.6f, (float)data["height"].AsReal()));
SetSize(new Vector3(0.45f,0.6f, (float)tmpOSD.AsReal()));
try
{
// Wearables
SetDefaultWearables();
if ((data != null) && (data["wearables"] != null) && (data["wearables"]).Type == OSDType.Array)
if (data.TryGetValue("wearables", out tmpOSD) && (tmpOSD is OSDArray))
{
OSDArray wears = (OSDArray)(data["wearables"]);
OSDArray wears = (OSDArray)tmpOSD;
m_wearables = new AvatarWearable[wears.Count];
int count = wears.Count;
m_wearables = new AvatarWearable[count];
for (int i = 0; i < count; i++)
for (int i = 0; i < wears.Count; i++)
m_wearables[i] = new AvatarWearable((OSDArray)wears[i]);
}
else
@ -823,15 +831,15 @@ namespace OpenSim.Framework
}
// Avatar Textures
SetDefaultTexture();
if ((data != null) && (data["textures"] != null) && (data["textures"]).Type == OSDType.Array)
if (data.TryGetValue("textures", out tmpOSD) && (tmpOSD is OSDArray))
{
OSDArray textures = (OSDArray)(data["textures"]);
OSDArray textures = (OSDArray)tmpOSD;
for (int i = 0; i < AvatarAppearance.TEXTURE_COUNT && i < textures.Count; i++)
{
UUID textureID = AppearanceManager.DEFAULT_AVATAR_TEXTURE;
if (textures[i] != null)
textureID = textures[i].AsUUID();
tmpOSD = textures[i];
if (tmpOSD != null)
textureID = tmpOSD.AsUUID();
m_texture.CreateFace((uint)i).TextureID = new UUID(textureID);
}
}
@ -840,18 +848,17 @@ namespace OpenSim.Framework
m_log.Warn("[AVATAR APPEARANCE]: failed to unpack textures");
}
if ((data != null) && (data["bakedcache"] != null) && (data["bakedcache"]).Type == OSDType.Array)
if (data.TryGetValue("bakedcache", out tmpOSD) && (tmpOSD is OSDArray))
{
OSDArray bakedOSDArray = (OSDArray)(data["bakedcache"]);
OSDArray bakedOSDArray = (OSDArray)tmpOSD;
m_cacheitems = WearableCacheItem.BakedFromOSD(bakedOSDArray);
}
// Visual Parameters
SetDefaultParams();
if ((data != null) && (data["visualparams"] != null))
if (data.TryGetValue("visualparams", out tmpOSD))
{
if ((data["visualparams"].Type == OSDType.Binary) || (data["visualparams"].Type == OSDType.Array))
m_visualparams = data["visualparams"].AsBinary();
if (tmpOSD is OSDBinary || tmpOSD is OSDArray)
m_visualparams = tmpOSD.AsBinary();
}
else
{
@ -859,10 +866,9 @@ namespace OpenSim.Framework
}
// Attachments
m_attachments = new Dictionary<int, List<AvatarAttachment>>();
if ((data != null) && (data["attachments"] != null) && (data["attachments"]).Type == OSDType.Array)
if (data.TryGetValue("attachments", out tmpOSD) && tmpOSD is OSDArray)
{
OSDArray attachs = (OSDArray)(data["attachments"]);
OSDArray attachs = (OSDArray)tmpOSD;
for (int i = 0; i < attachs.Count; i++)
{
AvatarAttachment att = new AvatarAttachment((OSDMap)attachs[i]);

View File

@ -68,11 +68,18 @@ namespace OpenSim.Framework
public void Unpack(OSDMap args)
{
if (args["point"] != null)
AttachPoint = args["point"].AsInteger();
OSD tmpOSD;
if (args.TryGetValue("point", out tmpOSD))
AttachPoint = tmpOSD.AsInteger();
if (args.TryGetValue("item", out tmpOSD))
ItemID = tmpOSD.AsUUID();
else
ItemID = UUID.Zero;
ItemID = (args["item"] != null) ? args["item"].AsUUID() : UUID.Zero;
AssetID = (args["asset"] != null) ? args["asset"].AsUUID() : UUID.Zero;
if (args.TryGetValue("asset", out tmpOSD))
AssetID = tmpOSD.AsUUID();
else
AssetID = UUID.Zero;
}
}
}

View File

@ -132,10 +132,12 @@ namespace OpenSim.Framework
public void Unpack(OSDArray args)
{
Clear();
OSD tmpOSDA, tmpOSDB;
foreach (OSDMap weardata in args)
{
Add(weardata["item"].AsUUID(), weardata["asset"].AsUUID());
tmpOSDA = weardata["item"];
tmpOSDB = weardata["asset"];
Add(tmpOSDA.AsUUID(), tmpOSDB.AsUUID());
}
}

View File

@ -58,13 +58,13 @@ namespace OpenSim.Framework
public void Unpack(OSD data)
{
OSDMap map = (OSDMap)data;
if (map.ContainsKey("InboundVersion"))
InboundVersion = (float)map["InboundVersion"].AsReal();
if (map.ContainsKey("OutboundVersion"))
OutboundVersion = (float)map["OutboundVersion"].AsReal();
if (map.ContainsKey("WearablesCount"))
WearablesCount = map["WearablesCount"].AsInteger();
OSD tmpOSD;
if (map.TryGetValue("InboundVersion", out tmpOSD))
InboundVersion = (float)tmpOSD.AsReal();
if (map.TryGetValue("OutboundVersion", out tmpOSD))
OutboundVersion = (float)tmpOSD.AsReal();
if (map.TryGetValue("WearablesCount", out tmpOSD))
WearablesCount = tmpOSD.AsInteger();
}
}
}

View File

@ -161,17 +161,20 @@ namespace OpenSim.Framework
public static WearableCacheItem[] BakedFromOSD(OSD pInput)
{
WearableCacheItem[] pcache = WearableCacheItem.GetDefaultCacheItem();
OSD tmpOSD;
if (pInput.Type == OSDType.Array)
{
OSDArray itemarray = (OSDArray)pInput;
foreach (OSDMap item in itemarray)
{
int idx = (int)item["textureindex"].AsUInteger();
tmpOSD = item["textureindex"];
int idx = tmpOSD.AsInteger();
if (idx < 0 || idx > pcache.Length)
continue;
pcache[idx].CacheId = item["cacheid"].AsUUID();
pcache[idx].TextureID = item["textureid"].AsUUID();
tmpOSD = item["cacheid"];
pcache[idx].CacheId = tmpOSD.AsUUID();
tmpOSD = item["textureid"];
pcache[idx].TextureID = tmpOSD.AsUUID();
/*
if (item.ContainsKey("assetdata"))
{

View File

@ -267,6 +267,7 @@ namespace OpenSim.Region.OptionalModules.Materials
if (matsArr == null)
return partchanged;
OSD tmpOSD;
foreach (OSD elemOsd in matsArr)
{
if (elemOsd != null && elemOsd is OSDMap)
@ -278,7 +279,8 @@ namespace OpenSim.Region.OptionalModules.Materials
{
lock (materialslock)
{
UUID id = matMap["ID"].AsUUID();
tmpOSD = matMap["ID"];
UUID id = tmpOSD.AsUUID();
if(m_Materials.ContainsKey(id))
continue;
@ -459,12 +461,13 @@ namespace OpenSim.Region.OptionalModules.Materials
OSDMap resp = new OSDMap();
OSDArray respArr = new OSDArray();
OSD tmpOSD;
if (req.ContainsKey("Zipped"))
if (req.TryGetValue("Zipped", out tmpOSD))
{
OSD osd = null;
byte[] inBytes = req["Zipped"].AsBinary();
byte[] inBytes = tmpOSD.AsBinary();
try
{
@ -531,12 +534,13 @@ namespace OpenSim.Region.OptionalModules.Materials
OSDArray respArr = new OSDArray();
OSD tmpOSD;
HashSet<SceneObjectPart> parts = new HashSet<SceneObjectPart>();
if (req.ContainsKey("Zipped"))
if (req.TryGetValue("Zipped", out tmpOSD))
{
OSD osd = null;
byte[] inBytes = req["Zipped"].AsBinary();
byte[] inBytes = tmpOSD.AsBinary();
try
{
@ -546,145 +550,141 @@ namespace OpenSim.Region.OptionalModules.Materials
{
materialsFromViewer = osd as OSDMap;
if (materialsFromViewer.ContainsKey("FullMaterialsPerFace"))
if (materialsFromViewer.TryGetValue("FullMaterialsPerFace", out tmpOSD) && (tmpOSD is OSDArray))
{
OSD matsOsd = materialsFromViewer["FullMaterialsPerFace"];
if (matsOsd is OSDArray)
OSDArray matsArr = tmpOSD as OSDArray;
try
{
OSDArray matsArr = matsOsd as OSDArray;
try
foreach (OSDMap matsMap in matsArr)
{
foreach (OSDMap matsMap in matsArr)
uint primLocalID = 0;
try
{
uint primLocalID = 0;
try
{
primLocalID = matsMap["ID"].AsUInteger();
}
catch (Exception e)
{
m_log.Warn("[Materials]: cannot decode \"ID\" from matsMap: " + e.Message);
continue;
}
tmpOSD = matsMap["ID"];
primLocalID = tmpOSD.AsUInteger();
}
catch (Exception e)
{
m_log.Warn("[Materials]: cannot decode \"ID\" from matsMap: " + e.Message);
continue;
}
SceneObjectPart sop = m_scene.GetSceneObjectPart(primLocalID);
if (sop == null)
{
m_log.WarnFormat("[Materials]: SOP not found for localId: {0}", primLocalID.ToString());
continue;
}
SceneObjectPart sop = m_scene.GetSceneObjectPart(primLocalID);
if (sop == null)
{
m_log.WarnFormat("[Materials]: SOP not found for localId: {0}", primLocalID.ToString());
continue;
}
if (!m_scene.Permissions.CanEditObject(sop.UUID, agentID))
{
m_log.WarnFormat("User {0} can't edit object {1} {2}", agentID, sop.Name, sop.UUID);
continue;
}
if (!m_scene.Permissions.CanEditObject(sop.UUID, agentID))
{
m_log.WarnFormat("User {0} can't edit object {1} {2}", agentID, sop.Name, sop.UUID);
continue;
}
OSDMap mat = null;
try
{
mat = matsMap["Material"] as OSDMap;
}
catch (Exception e)
{
m_log.Warn("[Materials]: cannot decode \"Material\" from matsMap: " + e.Message);
continue;
}
OSDMap mat = null;
try
{
mat = matsMap["Material"] as OSDMap;
}
catch (Exception e)
{
m_log.Warn("[Materials]: cannot decode \"Material\" from matsMap: " + e.Message);
continue;
}
Primitive.TextureEntry te = new Primitive.TextureEntry(sop.Shape.TextureEntry, 0, sop.Shape.TextureEntry.Length);
if (te == null)
{
m_log.WarnFormat("[Materials]: Error in TextureEntry for SOP {0} {1}", sop.Name, sop.UUID);
continue;
}
Primitive.TextureEntry te = new Primitive.TextureEntry(sop.Shape.TextureEntry, 0, sop.Shape.TextureEntry.Length);
if (te == null)
{
m_log.WarnFormat("[Materials]: Error in TextureEntry for SOP {0} {1}", sop.Name, sop.UUID);
continue;
}
int face = -1;
UUID oldid = UUID.Zero;
Primitive.TextureEntryFace faceEntry = null;
if (matsMap.ContainsKey("Face"))
{
face = matsMap["Face"].AsInteger();
faceEntry = te.CreateFace((uint)face);
}
else
faceEntry = te.DefaultTexture;
int face = -1;
UUID oldid = UUID.Zero;
Primitive.TextureEntryFace faceEntry = null;
if (matsMap.TryGetValue("Face", out tmpOSD))
{
face = tmpOSD.AsInteger();
faceEntry = te.CreateFace((uint)face);
}
else
faceEntry = te.DefaultTexture;
if (faceEntry == null)
continue;
if (faceEntry == null)
continue;
UUID id;
FaceMaterial newFaceMat = null;
if (mat == null)
{
// This happens then the user removes a material from a prim
UUID id;
FaceMaterial newFaceMat = null;
if (mat == null)
{
// This happens then the user removes a material from a prim
id = UUID.Zero;
}
else
{
newFaceMat = new FaceMaterial(mat);
if(newFaceMat.DiffuseAlphaMode == 1
&& newFaceMat.NormalMapID == UUID.Zero
&& newFaceMat.SpecularMapID == UUID.Zero
)
id = UUID.Zero;
}
else
{
newFaceMat = new FaceMaterial(mat);
if(newFaceMat.DiffuseAlphaMode == 1
&& newFaceMat.NormalMapID == UUID.Zero
&& newFaceMat.SpecularMapID == UUID.Zero
)
id = UUID.Zero;
newFaceMat.genID();
id = newFaceMat.ID;
}
}
oldid = faceEntry.MaterialID;
if(oldid == id)
continue;
if (faceEntry != null)
{
faceEntry.MaterialID = id;
//m_log.DebugFormat("[Materials]: in \"{0}\" {1}, setting material ID for face {2} to {3}", sop.Name, sop.UUID, face, id);
// We can't use sop.UpdateTextureEntry(te) because it filters, so do it manually
sop.Shape.TextureEntry = te.GetBytes(9);
}
if(oldid != UUID.Zero)
RemoveMaterial(oldid);
lock(materialslock)
{
if(id != UUID.Zero)
{
if (m_Materials.ContainsKey(id))
m_MaterialsRefCount[id]++;
else
{
newFaceMat.genID();
id = newFaceMat.ID;
m_Materials[id] = newFaceMat;
m_MaterialsRefCount[id] = 1;
m_changed[newFaceMat] = Util.GetTimeStamp();
}
}
oldid = faceEntry.MaterialID;
if(oldid == id)
continue;
if (faceEntry != null)
{
faceEntry.MaterialID = id;
//m_log.DebugFormat("[Materials]: in \"{0}\" {1}, setting material ID for face {2} to {3}", sop.Name, sop.UUID, face, id);
// We can't use sop.UpdateTextureEntry(te) because it filters, so do it manually
sop.Shape.TextureEntry = te.GetBytes(9);
}
if(oldid != UUID.Zero)
RemoveMaterial(oldid);
lock(materialslock)
{
if(id != UUID.Zero)
{
if (m_Materials.ContainsKey(id))
m_MaterialsRefCount[id]++;
else
{
m_Materials[id] = newFaceMat;
m_MaterialsRefCount[id] = 1;
m_changed[newFaceMat] = Util.GetTimeStamp();
}
}
}
if(!parts.Contains(sop))
parts.Add(sop);
}
foreach(SceneObjectPart sop in parts)
{
if (sop.ParentGroup != null && !sop.ParentGroup.IsDeleted)
{
sop.TriggerScriptChangedEvent(Changed.TEXTURE);
sop.ScheduleFullUpdate();
sop.ParentGroup.HasGroupChanged = true;
}
}
if(!parts.Contains(sop))
parts.Add(sop);
}
catch (Exception e)
foreach(SceneObjectPart sop in parts)
{
m_log.Warn("[Materials]: exception processing received material ", e);
if (sop.ParentGroup != null && !sop.ParentGroup.IsDeleted)
{
sop.TriggerScriptChangedEvent(Changed.TEXTURE);
sop.ScheduleFullUpdate();
sop.ParentGroup.HasGroupChanged = true;
}
}
}
catch (Exception e)
{
m_log.Warn("[Materials]: exception processing received material ", e);
}
}
}
}

View File

@ -115,15 +115,10 @@ namespace OpenSim.Server.Handlers.Simulation
return responsedata;
}
}
protected virtual void DoQueryAccess(Hashtable request, Hashtable responsedata, UUID agentID, UUID regionID)
{
Culture.SetCurrentCulture();
EntityTransferContext ctx = new EntityTransferContext();
if (m_SimulationService == null)
{
m_log.Debug("[AGENT HANDLER]: Agent QUERY called. Harmless but useless.");
@ -134,33 +129,37 @@ namespace OpenSim.Server.Handlers.Simulation
return;
}
Culture.SetCurrentCulture();
// m_log.DebugFormat("[AGENT HANDLER]: Received QUERYACCESS with {0}", (string)request["body"]);
OSDMap args = Utils.GetOSDMap((string)request["body"]);
bool viaTeleport = true;
if (args.ContainsKey("viaTeleport"))
viaTeleport = args["viaTeleport"].AsBoolean();
OSD tmpOSD;
if (args.TryGetValue("viaTeleport",out tmpOSD))
viaTeleport = tmpOSD.AsBoolean();
Vector3 position = Vector3.Zero;
if (args.ContainsKey("position"))
position = Vector3.Parse(args["position"].AsString());
if (args.TryGetValue("position", out tmpOSD))
position = Vector3.Parse(tmpOSD.AsString());
string agentHomeURI = null;
if (args.ContainsKey("agent_home_uri"))
agentHomeURI = args["agent_home_uri"].AsString();
if (args.TryGetValue("agent_home_uri", out tmpOSD))
agentHomeURI = tmpOSD.AsString();
// Decode the legacy (string) version and extract the number
float theirVersion = 0f;
if (args.ContainsKey("my_version"))
if (args.TryGetValue("my_version", out tmpOSD))
{
string theirVersionStr = args["my_version"].AsString();
string theirVersionStr = tmpOSD.AsString();
string[] parts = theirVersionStr.Split(new char[] {'/'});
if (parts.Length > 1)
theirVersion = float.Parse(parts[1], Culture.FormatProvider);
}
if (args.ContainsKey("context"))
ctx.Unpack((OSDMap)args["context"]);
EntityTransferContext ctx = new EntityTransferContext();
if (args.TryGetValue("context", out tmpOSD) && tmpOSD is OSDMap)
ctx.Unpack((OSDMap)tmpOSD);
// Decode the new versioning data
float minVersionRequired = 0f;
@ -168,15 +167,15 @@ namespace OpenSim.Server.Handlers.Simulation
float minVersionProvided = 0f;
float maxVersionProvided = 0f;
if (args.ContainsKey("simulation_service_supported_min"))
minVersionProvided = (float)args["simulation_service_supported_min"].AsReal();
if (args.ContainsKey("simulation_service_supported_max"))
maxVersionProvided = (float)args["simulation_service_supported_max"].AsReal();
if (args.TryGetValue("simulation_service_supported_min", out tmpOSD))
minVersionProvided = (float)tmpOSD.AsReal();
if (args.TryGetValue("simulation_service_supported_max", out tmpOSD))
maxVersionProvided = (float)tmpOSD.AsReal();
if (args.ContainsKey("simulation_service_accepted_min"))
minVersionRequired = (float)args["simulation_service_accepted_min"].AsReal();
if (args.ContainsKey("simulation_service_accepted_max"))
maxVersionRequired = (float)args["simulation_service_accepted_max"].AsReal();
if (args.TryGetValue("simulation_service_accepted_min", out tmpOSD))
minVersionRequired = (float)tmpOSD.AsReal();
if (args.TryGetValue("simulation_service_accepted_max", out tmpOSD))
maxVersionRequired = (float)tmpOSD.AsReal();
responsedata["int_response_code"] = HttpStatusCode.OK;
OSDMap resp = new OSDMap(3);
@ -239,9 +238,9 @@ namespace OpenSim.Server.Handlers.Simulation
List<UUID> features = new List<UUID>();
if (args.ContainsKey("features"))
if (args.TryGetValue("features", out tmpOSD) && tmpOSD is OSDArray)
{
OSDArray array = (OSDArray)args["features"];
OSDArray array = (OSDArray)tmpOSD;
foreach (OSD o in array)
features.Add(new UUID(o.AsString()));
@ -414,8 +413,6 @@ namespace OpenSim.Server.Handlers.Simulation
protected void DoAgentPost(Hashtable request, Hashtable responsedata, UUID id)
{
EntityTransferContext ctx = new EntityTransferContext();
OSDMap args = Utils.GetOSDMap((string)request["body"]);
if (args == null)
{
@ -424,8 +421,10 @@ namespace OpenSim.Server.Handlers.Simulation
return;
}
if (args.ContainsKey("context"))
ctx.Unpack((OSDMap)args["context"]);
OSD tmpOSD;
EntityTransferContext ctx = new EntityTransferContext();
if (args.TryGetValue("context", out tmpOSD) && tmpOSD is OSDMap)
ctx.Unpack((OSDMap)tmpOSD);
AgentDestinationData data = CreateAgentDestinationData();
UnpackData(args, data, request);
@ -453,16 +452,19 @@ namespace OpenSim.Server.Handlers.Simulation
GridRegion source = null;
if (args.ContainsKey("source_uuid"))
if (args.TryGetValue("source_uuid", out tmpOSD))
{
source = new GridRegion();
source.RegionLocX = Int32.Parse(args["source_x"].AsString());
source.RegionLocY = Int32.Parse(args["source_y"].AsString());
source.RegionName = args["source_name"].AsString();
source.RegionID = UUID.Parse(args["source_uuid"].AsString());
source.RegionID = UUID.Parse(tmpOSD.AsString());
tmpOSD = args["source_x"];
source.RegionLocX = Int32.Parse(tmpOSD.AsString());
tmpOSD = args["source_y"];
source.RegionLocY = Int32.Parse(tmpOSD.AsString());
tmpOSD = args["source_name"];
source.RegionName = tmpOSD.AsString();
if (args.ContainsKey("source_server_uri"))
source.RawServerURI = args["source_server_uri"].AsString();
if (args.TryGetValue("source_server_uri", out tmpOSD))
source.RawServerURI = tmpOSD.AsString();
else
source.RawServerURI = null;
}
@ -493,21 +495,26 @@ namespace OpenSim.Server.Handlers.Simulation
protected virtual void UnpackData(OSDMap args, AgentDestinationData data, Hashtable request)
{
OSD tmpOSD;
// retrieve the input arguments
if (args.ContainsKey("destination_x") && args["destination_x"] != null)
Int32.TryParse(args["destination_x"].AsString(), out data.x);
if (args.TryGetValue("destination_x", out tmpOSD) && tmpOSD != null)
Int32.TryParse(tmpOSD.AsString(), out data.x);
else
m_log.WarnFormat(" -- request didn't have destination_x");
if (args.ContainsKey("destination_y") && args["destination_y"] != null)
Int32.TryParse(args["destination_y"].AsString(), out data.y);
if (args.TryGetValue("destination_y", out tmpOSD) && tmpOSD != null)
Int32.TryParse(tmpOSD.AsString(), out data.y);
else
m_log.WarnFormat(" -- request didn't have destination_y");
if (args.ContainsKey("destination_uuid") && args["destination_uuid"] != null)
UUID.TryParse(args["destination_uuid"].AsString(), out data.uuid);
if (args.ContainsKey("destination_name") && args["destination_name"] != null)
data.name = args["destination_name"].ToString();
if (args.ContainsKey("teleport_flags") && args["teleport_flags"] != null)
data.flags = args["teleport_flags"].AsUInteger();
if (args.TryGetValue("destination_uuid", out tmpOSD) && tmpOSD != null)
UUID.TryParse(tmpOSD.AsString(), out data.uuid);
if (args.TryGetValue("destination_name", out tmpOSD) && tmpOSD != null)
data.name = tmpOSD.ToString();
if (args.TryGetValue("teleport_flags", out tmpOSD) && tmpOSD != null)
data.flags = tmpOSD.AsUInteger();
}
protected virtual GridRegion ExtractGatekeeper(AgentDestinationData data)
@ -674,7 +681,6 @@ namespace OpenSim.Server.Handlers.Simulation
protected void DoAgentPut(Hashtable request, Hashtable responsedata)
{
// TODO: Encode the ENtityTransferContext
EntityTransferContext ctx = new EntityTransferContext();
OSDMap args = Utils.GetOSDMap((string)request["body"]);
if (args == null)
@ -685,19 +691,21 @@ namespace OpenSim.Server.Handlers.Simulation
}
// retrieve the input arguments
OSD tmpOSD;
EntityTransferContext ctx = new EntityTransferContext();
int x = 0, y = 0;
UUID uuid = UUID.Zero;
string regionname = string.Empty;
if (args.ContainsKey("destination_x") && args["destination_x"] != null)
Int32.TryParse(args["destination_x"].AsString(), out x);
if (args.ContainsKey("destination_y") && args["destination_y"] != null)
Int32.TryParse(args["destination_y"].AsString(), out y);
if (args.ContainsKey("destination_uuid") && args["destination_uuid"] != null)
UUID.TryParse(args["destination_uuid"].AsString(), out uuid);
if (args.ContainsKey("destination_name") && args["destination_name"] != null)
regionname = args["destination_name"].ToString();
if (args.ContainsKey("context"))
ctx.Unpack((OSDMap)args["context"]);
if (args.TryGetValue("destination_x", out tmpOSD) && tmpOSD != null)
Int32.TryParse(tmpOSD.AsString(), out x);
if (args.TryGetValue("destination_y", out tmpOSD) && tmpOSD != null)
Int32.TryParse(tmpOSD.AsString(), out y);
if (args.TryGetValue("destination_uuid", out tmpOSD) && tmpOSD != null)
UUID.TryParse(tmpOSD.AsString(), out uuid);
if (args.TryGetValue("destination_name", out tmpOSD) && tmpOSD != null)
regionname = tmpOSD.ToString();
if (args.TryGetValue("context", out tmpOSD) && tmpOSD is OSDMap)
ctx.Unpack((OSDMap)tmpOSD);
GridRegion destination = new GridRegion();
destination.RegionID = uuid;

View File

@ -112,7 +112,7 @@ namespace OpenSim.Services.Connectors.Simulation
m_log.DebugFormat("[REMOTE SIMULATION CONNECTOR]: Creating agent at {0}", destination.ServerURI);
string uri = destination.ServerURI + AgentPath() + aCircuit.AgentID + "/";
OSD tmpOSD;
try
{
OSDMap args = aCircuit.PackAgentCircuitData(ctx);
@ -120,27 +120,37 @@ namespace OpenSim.Services.Connectors.Simulation
PackData(args, source, aCircuit, destination, flags);
OSDMap result = WebUtil.PostToServiceCompressed(uri, args, 30000);
bool success = result["success"].AsBoolean();
if (success && result.ContainsKey("_Result"))
tmpOSD = result["success"];
bool success = tmpOSD.AsBoolean();
if (success && result.TryGetValue("_Result", out tmpOSD) && tmpOSD is OSDMap)
{
OSDMap data = (OSDMap)result["_Result"];
OSDMap data = (OSDMap)tmpOSD;
reason = data["reason"].AsString();
success = data["success"].AsBoolean();
tmpOSD = data["reason"];
reason = tmpOSD.AsString();
tmpOSD = data["success"];
success = tmpOSD.AsBoolean();
return success;
}
// Try the old version, uncompressed
result = WebUtil.PostToService(uri, args, 30000, false);
if (result["Success"].AsBoolean())
tmpOSD = result["success"];
success = tmpOSD.AsBoolean();
if (success)
{
if (result.ContainsKey("_Result"))
if (result.TryGetValue("_Result", out tmpOSD) && tmpOSD is OSDMap)
{
OSDMap data = (OSDMap)result["_Result"];
OSDMap data = (OSDMap)tmpOSD;
tmpOSD = data["reason"];
reason = tmpOSD.AsString();
tmpOSD = data["success"];
success = tmpOSD.AsBoolean();
reason = data["reason"].AsString();
success = data["success"].AsBoolean();
m_log.WarnFormat(
"[REMOTE SIMULATION CONNECTOR]: Remote simulator {0} did not accept compressed transfer, suggest updating it.", destination.RegionName);
return success;
@ -312,34 +322,47 @@ namespace OpenSim.Services.Connectors.Simulation
if (agentHomeURI != null)
request.Add("agent_home_uri", OSD.FromString(agentHomeURI));
OSD tmpOSD;
try
{
OSDMap result = WebUtil.ServiceOSDRequest(uri, request, "QUERYACCESS", 30000, false, false, true);
bool success = result["success"].AsBoolean();
if (result.ContainsKey("_Result"))
tmpOSD = result["success"];
bool success = tmpOSD.AsBoolean();
bool has_Result = false;
if (result.TryGetValue("_Result", out tmpOSD))
{
OSDMap data = (OSDMap)result["_Result"];
has_Result = true;
OSDMap data = (OSDMap)tmpOSD;
// FIXME: If there is a _Result map then it's the success key here that indicates the true success
// or failure, not the sibling result node.
success = data["success"].AsBoolean();
//nte4.8 crap
tmpOSD = data["success"];
success = tmpOSD.AsBoolean();
reason = data["reason"].AsString();
tmpOSD = data["reason"];
reason = tmpOSD.AsString();
// We will need to plumb this and start sing the outbound version as well
// TODO: lay the pipe for version plumbing
if (data.ContainsKey("negotiated_inbound_version") && data["negotiated_inbound_version"] != null)
if (data.TryGetValue("negotiated_inbound_version", out tmpOSD) && tmpOSD != null)
{
ctx.InboundVersion = (float)data["negotiated_inbound_version"].AsReal();
ctx.OutboundVersion = (float)data["negotiated_outbound_version"].AsReal();
ctx.InboundVersion = (float)tmpOSD.AsReal();
tmpOSD = data["negotiated_outbound_version"];
ctx.OutboundVersion = (float)tmpOSD.AsReal();
}
else if (data["version"] != null && data["version"].AsString() != string.Empty)
else if (data.TryGetValue("version", out tmpOSD) && tmpOSD != null)
{
string versionString = data["version"].AsString();
String[] parts = versionString.Split(new char[] {'/'});
if (parts.Length > 1)
string versionString = tmpOSD.AsString();
if(versionString != string.Empty)
{
ctx.InboundVersion = float.Parse(parts[1], Culture.FormatProvider);
ctx.OutboundVersion = float.Parse(parts[1], Culture.FormatProvider);
String[] parts = versionString.Split(new char[] {'/'});
if (parts.Length > 1)
{
ctx.InboundVersion = float.Parse(parts[1], Culture.FormatProvider);
ctx.OutboundVersion = float.Parse(parts[1], Culture.FormatProvider);
}
}
}
@ -352,11 +375,11 @@ namespace OpenSim.Services.Connectors.Simulation
{
// If we don't check this then OpenSimulator 0.7.3.1 and some period before will never see the
// actual failure message
if (!result.ContainsKey("_Result"))
if (!has_Result)
{
if (result.ContainsKey("Message"))
if (result.TryGetValue("Message", out tmpOSD))
{
string message = result["Message"].AsString();
string message = tmpOSD.AsString();
if (message == "Service request failed: [MethodNotAllowed] MethodNotAllowed") // Old style region
{
m_log.Info("[REMOTE SIMULATION CONNECTOR]: The above web util error was caused by a TP to a sim that doesn't support QUERYACCESS and can be ignored");
@ -376,9 +399,9 @@ namespace OpenSim.Services.Connectors.Simulation
featuresAvailable.Clear();
if (result.ContainsKey("features"))
if (result.TryGetValue("features", out tmpOSD) && tmpOSD is OSDArray)
{
OSDArray array = (OSDArray)result["features"];
OSDArray array = (OSDArray)tmpOSD;
foreach (OSD o in array)
featuresAvailable.Add(new UUID(o.AsString()));