diff --git a/OpenSim/Framework/AgentCircuitData.cs b/OpenSim/Framework/AgentCircuitData.cs index 330a41e93d..dcd5cc7c01 100644 --- a/OpenSim/Framework/AgentCircuitData.cs +++ b/OpenSim/Framework/AgentCircuitData.cs @@ -267,16 +267,17 @@ namespace OpenSim.Framework /// 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(); 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(); - 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(); // 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 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()); - } } } } - - } diff --git a/OpenSim/Framework/AvatarAppearance.cs b/OpenSim/Framework/AvatarAppearance.cs index 77a7621a29..f1713a6a39 100644 --- a/OpenSim/Framework/AvatarAppearance.cs +++ b/OpenSim/Framework/AvatarAppearance.cs @@ -796,25 +796,33 @@ namespace OpenSim.Framework /// 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>(); + + 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>(); - 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]); diff --git a/OpenSim/Framework/AvatarAttachment.cs b/OpenSim/Framework/AvatarAttachment.cs index 07dd385f28..d8a0ffc874 100644 --- a/OpenSim/Framework/AvatarAttachment.cs +++ b/OpenSim/Framework/AvatarAttachment.cs @@ -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; } } } diff --git a/OpenSim/Framework/AvatarWearable.cs b/OpenSim/Framework/AvatarWearable.cs index fddd0f06ea..abf575948b 100644 --- a/OpenSim/Framework/AvatarWearable.cs +++ b/OpenSim/Framework/AvatarWearable.cs @@ -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()); } } diff --git a/OpenSim/Framework/EntityTransferContext.cs b/OpenSim/Framework/EntityTransferContext.cs index 860414edca..257c6d177b 100644 --- a/OpenSim/Framework/EntityTransferContext.cs +++ b/OpenSim/Framework/EntityTransferContext.cs @@ -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(); } } } diff --git a/OpenSim/Framework/WearableCacheItem.cs b/OpenSim/Framework/WearableCacheItem.cs index 427e149f69..84b9ee98e6 100644 --- a/OpenSim/Framework/WearableCacheItem.cs +++ b/OpenSim/Framework/WearableCacheItem.cs @@ -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")) { diff --git a/OpenSim/Region/OptionalModules/Materials/MaterialsModule.cs b/OpenSim/Region/OptionalModules/Materials/MaterialsModule.cs index 2aea7f9cb2..4a92120203 100644 --- a/OpenSim/Region/OptionalModules/Materials/MaterialsModule.cs +++ b/OpenSim/Region/OptionalModules/Materials/MaterialsModule.cs @@ -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 parts = new HashSet(); - 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); + } } } } diff --git a/OpenSim/Server/Handlers/Simulation/AgentHandlers.cs b/OpenSim/Server/Handlers/Simulation/AgentHandlers.cs index 1c1930aaf7..788bd3d057 100644 --- a/OpenSim/Server/Handlers/Simulation/AgentHandlers.cs +++ b/OpenSim/Server/Handlers/Simulation/AgentHandlers.cs @@ -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 features = new List(); - 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; diff --git a/OpenSim/Services/Connectors/Simulation/SimulationServiceConnector.cs b/OpenSim/Services/Connectors/Simulation/SimulationServiceConnector.cs index e15ac8c47b..b7dbb79abd 100644 --- a/OpenSim/Services/Connectors/Simulation/SimulationServiceConnector.cs +++ b/OpenSim/Services/Connectors/Simulation/SimulationServiceConnector.cs @@ -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()));