diff options
-rw-r--r-- | OpenSim/Framework/AgentCircuitData.cs | 133 | ||||
-rw-r--r-- | OpenSim/Framework/AvatarAppearance.cs | 58 | ||||
-rw-r--r-- | OpenSim/Framework/AvatarAttachment.cs | 15 | ||||
-rw-r--r-- | OpenSim/Framework/AvatarWearable.cs | 6 | ||||
-rw-r--r-- | OpenSim/Framework/EntityTransferContext.cs | 14 | ||||
-rw-r--r-- | OpenSim/Framework/WearableCacheItem.cs | 11 | ||||
-rw-r--r-- | OpenSim/Region/OptionalModules/Materials/MaterialsModule.cs | 228 | ||||
-rw-r--r-- | OpenSim/Server/Handlers/Simulation/AgentHandlers.cs | 124 | ||||
-rw-r--r-- | OpenSim/Services/Connectors/Simulation/SimulationServiceConnector.cs | 83 |
9 files changed, 364 insertions, 308 deletions
diff --git a/OpenSim/Framework/AgentCircuitData.cs b/OpenSim/Framework/AgentCircuitData.cs index 330a41e..dcd5cc7 100644 --- a/OpenSim/Framework/AgentCircuitData.cs +++ b/OpenSim/Framework/AgentCircuitData.cs | |||
@@ -267,16 +267,17 @@ namespace OpenSim.Framework | |||
267 | /// <param name="args"></param> | 267 | /// <param name="args"></param> |
268 | public void UnpackAgentCircuitData(OSDMap args) | 268 | public void UnpackAgentCircuitData(OSDMap args) |
269 | { | 269 | { |
270 | if (args["agent_id"] != null) | 270 | OSD tmpOSD; |
271 | AgentID = args["agent_id"].AsUUID(); | 271 | if (args.TryGetValue("agent_id", out tmpOSD)) |
272 | if (args["base_folder"] != null) | 272 | AgentID = tmpOSD.AsUUID(); |
273 | BaseFolder = args["base_folder"].AsUUID(); | 273 | if (args.TryGetValue("base_folder", out tmpOSD)) |
274 | if (args["caps_path"] != null) | 274 | BaseFolder =tmpOSD.AsUUID(); |
275 | CapsPath = args["caps_path"].AsString(); | 275 | if (args.TryGetValue("caps_path", out tmpOSD)) |
276 | 276 | CapsPath = tmpOSD.AsString(); | |
277 | if ((args["children_seeds"] != null) && (args["children_seeds"].Type == OSDType.Array)) | 277 | |
278 | if ((args.TryGetValue("children_seeds", out tmpOSD) && tmpOSD is OSDArray)) | ||
278 | { | 279 | { |
279 | OSDArray childrenSeeds = (OSDArray)(args["children_seeds"]); | 280 | OSDArray childrenSeeds = (OSDArray)tmpOSD; |
280 | ChildrenCapSeeds = new Dictionary<ulong, string>(); | 281 | ChildrenCapSeeds = new Dictionary<ulong, string>(); |
281 | foreach (OSD o in childrenSeeds) | 282 | foreach (OSD o in childrenSeeds) |
282 | { | 283 | { |
@@ -285,53 +286,59 @@ namespace OpenSim.Framework | |||
285 | ulong handle = 0; | 286 | ulong handle = 0; |
286 | string seed = ""; | 287 | string seed = ""; |
287 | OSDMap pair = (OSDMap)o; | 288 | OSDMap pair = (OSDMap)o; |
288 | if (pair["handle"] != null) | 289 | if (pair.TryGetValue("handle", out tmpOSD)) |
289 | if (!UInt64.TryParse(pair["handle"].AsString(), out handle)) | 290 | { |
291 | if (!UInt64.TryParse(tmpOSD.AsString(), out handle)) | ||
290 | continue; | 292 | continue; |
291 | if (pair["seed"] != null) | 293 | } |
292 | seed = pair["seed"].AsString(); | ||
293 | if (!ChildrenCapSeeds.ContainsKey(handle)) | 294 | if (!ChildrenCapSeeds.ContainsKey(handle)) |
294 | ChildrenCapSeeds.Add(handle, seed); | 295 | { |
296 | if (pair.TryGetValue("seed", out tmpOSD)) | ||
297 | { | ||
298 | seed = tmpOSD.AsString(); | ||
299 | ChildrenCapSeeds.Add(handle, seed); | ||
300 | } | ||
301 | } | ||
295 | } | 302 | } |
296 | } | 303 | } |
297 | } | 304 | } |
298 | else | 305 | else |
299 | ChildrenCapSeeds = new Dictionary<ulong, string>(); | 306 | ChildrenCapSeeds = new Dictionary<ulong, string>(); |
300 | 307 | ||
301 | if (args["child"] != null) | 308 | if (args.TryGetValue("child", out tmpOSD)) |
302 | child = args["child"].AsBoolean(); | 309 | child = tmpOSD.AsBoolean(); |
303 | if (args["circuit_code"] != null) | 310 | if (args.TryGetValue("circuit_code", out tmpOSD)) |
304 | UInt32.TryParse(args["circuit_code"].AsString(), out circuitcode); | 311 | UInt32.TryParse(tmpOSD.AsString(), out circuitcode); |
305 | if (args["first_name"] != null) | 312 | if (args.TryGetValue("first_name", out tmpOSD)) |
306 | firstname = args["first_name"].AsString(); | 313 | firstname = tmpOSD.AsString(); |
307 | if (args["last_name"] != null) | 314 | if (args.TryGetValue("last_name", out tmpOSD)) |
308 | lastname = args["last_name"].AsString(); | 315 | lastname = tmpOSD.AsString(); |
309 | if (args["inventory_folder"] != null) | 316 | if (args.TryGetValue("inventory_folder", out tmpOSD)) |
310 | InventoryFolder = args["inventory_folder"].AsUUID(); | 317 | InventoryFolder = tmpOSD.AsUUID(); |
311 | if (args["secure_session_id"] != null) | 318 | if (args.TryGetValue("secure_session_id", out tmpOSD)) |
312 | SecureSessionID = args["secure_session_id"].AsUUID(); | 319 | SecureSessionID = tmpOSD.AsUUID(); |
313 | if (args["session_id"] != null) | 320 | if (args.TryGetValue("session_id", out tmpOSD)) |
314 | SessionID = args["session_id"].AsUUID(); | 321 | SessionID = tmpOSD.AsUUID(); |
315 | if (args["service_session_id"] != null) | 322 | if (args.TryGetValue("service_session_id", out tmpOSD)) |
316 | ServiceSessionID = args["service_session_id"].AsString(); | 323 | ServiceSessionID = tmpOSD.AsString(); |
317 | if (args["client_ip"] != null) | 324 | if (args.TryGetValue("client_ip", out tmpOSD)) |
318 | IPAddress = args["client_ip"].AsString(); | 325 | IPAddress = tmpOSD.AsString(); |
319 | if (args["viewer"] != null) | 326 | if (args.TryGetValue("viewer", out tmpOSD)) |
320 | Viewer = args["viewer"].AsString(); | 327 | Viewer = tmpOSD.AsString(); |
321 | if (args["channel"] != null) | 328 | if (args.TryGetValue("channel", out tmpOSD)) |
322 | Channel = args["channel"].AsString(); | 329 | Channel = tmpOSD.AsString(); |
323 | if (args["mac"] != null) | 330 | if (args.TryGetValue("mac", out tmpOSD)) |
324 | Mac = args["mac"].AsString(); | 331 | Mac = tmpOSD.AsString(); |
325 | if (args["id0"] != null) | 332 | if (args.TryGetValue("id0", out tmpOSD)) |
326 | Id0 = args["id0"].AsString(); | 333 | Id0 = tmpOSD.AsString(); |
327 | if (args["teleport_flags"] != null) | 334 | if (args.TryGetValue("teleport_flags", out tmpOSD)) |
328 | teleportFlags = args["teleport_flags"].AsUInteger(); | 335 | teleportFlags = tmpOSD.AsUInteger(); |
329 | 336 | ||
330 | if (args["start_pos"] != null) | 337 | if (args.TryGetValue("start_pos", out tmpOSD)) |
331 | Vector3.TryParse(args["start_pos"].AsString(), out startpos); | 338 | Vector3.TryParse(tmpOSD.AsString(), out startpos); |
332 | 339 | ||
333 | if(args["far"] != null) | 340 | if(args.TryGetValue("far", out tmpOSD)) |
334 | startfar = (float)args["far"].AsReal(); | 341 | startfar = (float)tmpOSD.AsReal(); |
335 | 342 | ||
336 | //m_log.InfoFormat("[AGENTCIRCUITDATA]: agentid={0}, child={1}, startpos={2}", AgentID, child, startpos); | 343 | //m_log.InfoFormat("[AGENTCIRCUITDATA]: agentid={0}, child={1}, startpos={2}", AgentID, child, startpos); |
337 | 344 | ||
@@ -342,12 +349,12 @@ namespace OpenSim.Framework | |||
342 | 349 | ||
343 | // Eventually this code should be deprecated, use full appearance | 350 | // Eventually this code should be deprecated, use full appearance |
344 | // packing in packed_appearance | 351 | // packing in packed_appearance |
345 | if (args["appearance_serial"] != null) | 352 | if (args.TryGetValue("appearance_serial", out tmpOSD)) |
346 | Appearance.Serial = args["appearance_serial"].AsInteger(); | 353 | Appearance.Serial = tmpOSD.AsInteger(); |
347 | 354 | ||
348 | if (args.ContainsKey("packed_appearance") && (args["packed_appearance"].Type == OSDType.Map)) | 355 | if (args.TryGetValue("packed_appearance", out tmpOSD) && (tmpOSD is OSDMap)) |
349 | { | 356 | { |
350 | Appearance.Unpack((OSDMap)args["packed_appearance"]); | 357 | Appearance.Unpack((OSDMap)tmpOSD); |
351 | // m_log.InfoFormat("[AGENTCIRCUITDATA] unpacked appearance"); | 358 | // m_log.InfoFormat("[AGENTCIRCUITDATA] unpacked appearance"); |
352 | } | 359 | } |
353 | else | 360 | else |
@@ -362,31 +369,31 @@ namespace OpenSim.Framework | |||
362 | 369 | ||
363 | ServiceURLs = new Dictionary<string, object>(); | 370 | ServiceURLs = new Dictionary<string, object>(); |
364 | // Try parse the new way, OSDMap | 371 | // Try parse the new way, OSDMap |
365 | if (args.ContainsKey("serviceurls") && args["serviceurls"] != null && (args["serviceurls"]).Type == OSDType.Map) | 372 | if (args.TryGetValue("serviceurls", out tmpOSD) && (tmpOSD is OSDMap)) |
366 | { | 373 | { |
367 | OSDMap urls = (OSDMap)(args["serviceurls"]); | 374 | OSDMap urls = (OSDMap)tmpOSD; |
368 | foreach (KeyValuePair<String, OSD> kvp in urls) | 375 | foreach (KeyValuePair<String, OSD> kvp in urls) |
369 | { | 376 | { |
370 | ServiceURLs[kvp.Key] = kvp.Value.AsString(); | 377 | tmpOSD = kvp.Value; |
378 | ServiceURLs[kvp.Key] = tmpOSD.AsString(); | ||
371 | //System.Console.WriteLine("XXX " + kvp.Key + "=" + ServiceURLs[kvp.Key]); | 379 | //System.Console.WriteLine("XXX " + kvp.Key + "=" + ServiceURLs[kvp.Key]); |
372 | |||
373 | } | 380 | } |
374 | } | 381 | } |
375 | // else try the old way, OSDArray | 382 | // else try the old way, OSDArray |
376 | // OBSOLETE -- soon to be deleted | 383 | // OBSOLETE -- soon to be deleted |
377 | else if (args.ContainsKey("service_urls") && args["service_urls"] != null && (args["service_urls"]).Type == OSDType.Array) | 384 | else if (args.TryGetValue("service_urls", out tmpOSD) && (tmpOSD is OSDArray)) |
378 | { | 385 | { |
379 | OSDArray urls = (OSDArray)(args["service_urls"]); | 386 | OSDArray urls = (OSDArray)tmpOSD; |
380 | for (int i = 0; i < urls.Count / 2; i++) | 387 | OSD tmpOSDb; |
388 | for (int i = 0; i < urls.Count - 1; i += 2) | ||
381 | { | 389 | { |
382 | ServiceURLs[urls[i * 2].AsString()] = urls[(i * 2) + 1].AsString(); | 390 | tmpOSD = urls[i]; |
391 | tmpOSDb = urls[i + 1]; | ||
392 | ServiceURLs[tmpOSD.AsString()] = tmpOSDb.AsString(); | ||
383 | //System.Console.WriteLine("XXX " + urls[i * 2].AsString() + "=" + urls[(i * 2) + 1].AsString()); | 393 | //System.Console.WriteLine("XXX " + urls[i * 2].AsString() + "=" + urls[(i * 2) + 1].AsString()); |
384 | |||
385 | } | 394 | } |
386 | } | 395 | } |
387 | } | 396 | } |
388 | 397 | ||
389 | } | 398 | } |
390 | |||
391 | |||
392 | } | 399 | } |
diff --git a/OpenSim/Framework/AvatarAppearance.cs b/OpenSim/Framework/AvatarAppearance.cs index 77a7621..f1713a6 100644 --- a/OpenSim/Framework/AvatarAppearance.cs +++ b/OpenSim/Framework/AvatarAppearance.cs | |||
@@ -796,25 +796,33 @@ namespace OpenSim.Framework | |||
796 | /// </summary> | 796 | /// </summary> |
797 | public void Unpack(OSDMap data) | 797 | public void Unpack(OSDMap data) |
798 | { | 798 | { |
799 | if ((data != null) && (data["serial"] != null)) | 799 | SetDefaultWearables(); |
800 | m_serial = data["serial"].AsInteger(); | 800 | SetDefaultTexture(); |
801 | if ((data != null) && (data["height"] != null)) | 801 | SetDefaultParams(); |
802 | m_attachments = new Dictionary<int, List<AvatarAttachment>>(); | ||
803 | |||
804 | if(data == null) | ||
805 | { | ||
806 | m_log.Warn("[AVATAR APPEARANCE]: data to unpack is null"); | ||
807 | return; | ||
808 | } | ||
809 | |||
810 | OSD tmpOSD; | ||
811 | if (data.TryGetValue("serial", out tmpOSD)) | ||
812 | m_serial = tmpOSD.AsInteger(); | ||
813 | if (data.TryGetValue("height", out tmpOSD)) | ||
802 | // m_avatarHeight = (float)data["height"].AsReal(); | 814 | // m_avatarHeight = (float)data["height"].AsReal(); |
803 | SetSize(new Vector3(0.45f,0.6f, (float)data["height"].AsReal())); | 815 | SetSize(new Vector3(0.45f,0.6f, (float)tmpOSD.AsReal())); |
804 | 816 | ||
805 | try | 817 | try |
806 | { | 818 | { |
807 | // Wearables | 819 | // Wearables |
808 | SetDefaultWearables(); | 820 | if (data.TryGetValue("wearables", out tmpOSD) && (tmpOSD is OSDArray)) |
809 | if ((data != null) && (data["wearables"] != null) && (data["wearables"]).Type == OSDType.Array) | ||
810 | { | 821 | { |
811 | OSDArray wears = (OSDArray)(data["wearables"]); | 822 | OSDArray wears = (OSDArray)tmpOSD; |
812 | 823 | m_wearables = new AvatarWearable[wears.Count]; | |
813 | int count = wears.Count; | ||
814 | |||
815 | m_wearables = new AvatarWearable[count]; | ||
816 | 824 | ||
817 | for (int i = 0; i < count; i++) | 825 | for (int i = 0; i < wears.Count; i++) |
818 | m_wearables[i] = new AvatarWearable((OSDArray)wears[i]); | 826 | m_wearables[i] = new AvatarWearable((OSDArray)wears[i]); |
819 | } | 827 | } |
820 | else | 828 | else |
@@ -823,15 +831,15 @@ namespace OpenSim.Framework | |||
823 | } | 831 | } |
824 | 832 | ||
825 | // Avatar Textures | 833 | // Avatar Textures |
826 | SetDefaultTexture(); | 834 | if (data.TryGetValue("textures", out tmpOSD) && (tmpOSD is OSDArray)) |
827 | if ((data != null) && (data["textures"] != null) && (data["textures"]).Type == OSDType.Array) | ||
828 | { | 835 | { |
829 | OSDArray textures = (OSDArray)(data["textures"]); | 836 | OSDArray textures = (OSDArray)tmpOSD; |
830 | for (int i = 0; i < AvatarAppearance.TEXTURE_COUNT && i < textures.Count; i++) | 837 | for (int i = 0; i < AvatarAppearance.TEXTURE_COUNT && i < textures.Count; i++) |
831 | { | 838 | { |
832 | UUID textureID = AppearanceManager.DEFAULT_AVATAR_TEXTURE; | 839 | UUID textureID = AppearanceManager.DEFAULT_AVATAR_TEXTURE; |
833 | if (textures[i] != null) | 840 | tmpOSD = textures[i]; |
834 | textureID = textures[i].AsUUID(); | 841 | if (tmpOSD != null) |
842 | textureID = tmpOSD.AsUUID(); | ||
835 | m_texture.CreateFace((uint)i).TextureID = new UUID(textureID); | 843 | m_texture.CreateFace((uint)i).TextureID = new UUID(textureID); |
836 | } | 844 | } |
837 | } | 845 | } |
@@ -840,18 +848,17 @@ namespace OpenSim.Framework | |||
840 | m_log.Warn("[AVATAR APPEARANCE]: failed to unpack textures"); | 848 | m_log.Warn("[AVATAR APPEARANCE]: failed to unpack textures"); |
841 | } | 849 | } |
842 | 850 | ||
843 | if ((data != null) && (data["bakedcache"] != null) && (data["bakedcache"]).Type == OSDType.Array) | 851 | if (data.TryGetValue("bakedcache", out tmpOSD) && (tmpOSD is OSDArray)) |
844 | { | 852 | { |
845 | OSDArray bakedOSDArray = (OSDArray)(data["bakedcache"]); | 853 | OSDArray bakedOSDArray = (OSDArray)tmpOSD; |
846 | m_cacheitems = WearableCacheItem.BakedFromOSD(bakedOSDArray); | 854 | m_cacheitems = WearableCacheItem.BakedFromOSD(bakedOSDArray); |
847 | } | 855 | } |
848 | 856 | ||
849 | // Visual Parameters | 857 | // Visual Parameters |
850 | SetDefaultParams(); | 858 | if (data.TryGetValue("visualparams", out tmpOSD)) |
851 | if ((data != null) && (data["visualparams"] != null)) | ||
852 | { | 859 | { |
853 | if ((data["visualparams"].Type == OSDType.Binary) || (data["visualparams"].Type == OSDType.Array)) | 860 | if (tmpOSD is OSDBinary || tmpOSD is OSDArray) |
854 | m_visualparams = data["visualparams"].AsBinary(); | 861 | m_visualparams = tmpOSD.AsBinary(); |
855 | } | 862 | } |
856 | else | 863 | else |
857 | { | 864 | { |
@@ -859,10 +866,9 @@ namespace OpenSim.Framework | |||
859 | } | 866 | } |
860 | 867 | ||
861 | // Attachments | 868 | // Attachments |
862 | m_attachments = new Dictionary<int, List<AvatarAttachment>>(); | 869 | if (data.TryGetValue("attachments", out tmpOSD) && tmpOSD is OSDArray) |
863 | if ((data != null) && (data["attachments"] != null) && (data["attachments"]).Type == OSDType.Array) | ||
864 | { | 870 | { |
865 | OSDArray attachs = (OSDArray)(data["attachments"]); | 871 | OSDArray attachs = (OSDArray)tmpOSD; |
866 | for (int i = 0; i < attachs.Count; i++) | 872 | for (int i = 0; i < attachs.Count; i++) |
867 | { | 873 | { |
868 | AvatarAttachment att = new AvatarAttachment((OSDMap)attachs[i]); | 874 | AvatarAttachment att = new AvatarAttachment((OSDMap)attachs[i]); |
diff --git a/OpenSim/Framework/AvatarAttachment.cs b/OpenSim/Framework/AvatarAttachment.cs index 07dd385..d8a0ffc 100644 --- a/OpenSim/Framework/AvatarAttachment.cs +++ b/OpenSim/Framework/AvatarAttachment.cs | |||
@@ -68,11 +68,18 @@ namespace OpenSim.Framework | |||
68 | 68 | ||
69 | public void Unpack(OSDMap args) | 69 | public void Unpack(OSDMap args) |
70 | { | 70 | { |
71 | if (args["point"] != null) | 71 | OSD tmpOSD; |
72 | AttachPoint = args["point"].AsInteger(); | 72 | if (args.TryGetValue("point", out tmpOSD)) |
73 | AttachPoint = tmpOSD.AsInteger(); | ||
74 | if (args.TryGetValue("item", out tmpOSD)) | ||
75 | ItemID = tmpOSD.AsUUID(); | ||
76 | else | ||
77 | ItemID = UUID.Zero; | ||
73 | 78 | ||
74 | ItemID = (args["item"] != null) ? args["item"].AsUUID() : UUID.Zero; | 79 | if (args.TryGetValue("asset", out tmpOSD)) |
75 | AssetID = (args["asset"] != null) ? args["asset"].AsUUID() : UUID.Zero; | 80 | AssetID = tmpOSD.AsUUID(); |
81 | else | ||
82 | AssetID = UUID.Zero; | ||
76 | } | 83 | } |
77 | } | 84 | } |
78 | } | 85 | } |
diff --git a/OpenSim/Framework/AvatarWearable.cs b/OpenSim/Framework/AvatarWearable.cs index fddd0f0..abf5759 100644 --- a/OpenSim/Framework/AvatarWearable.cs +++ b/OpenSim/Framework/AvatarWearable.cs | |||
@@ -132,10 +132,12 @@ namespace OpenSim.Framework | |||
132 | public void Unpack(OSDArray args) | 132 | public void Unpack(OSDArray args) |
133 | { | 133 | { |
134 | Clear(); | 134 | Clear(); |
135 | 135 | OSD tmpOSDA, tmpOSDB; | |
136 | foreach (OSDMap weardata in args) | 136 | foreach (OSDMap weardata in args) |
137 | { | 137 | { |
138 | Add(weardata["item"].AsUUID(), weardata["asset"].AsUUID()); | 138 | tmpOSDA = weardata["item"]; |
139 | tmpOSDB = weardata["asset"]; | ||
140 | Add(tmpOSDA.AsUUID(), tmpOSDB.AsUUID()); | ||
139 | } | 141 | } |
140 | } | 142 | } |
141 | 143 | ||
diff --git a/OpenSim/Framework/EntityTransferContext.cs b/OpenSim/Framework/EntityTransferContext.cs index 860414e..257c6d1 100644 --- a/OpenSim/Framework/EntityTransferContext.cs +++ b/OpenSim/Framework/EntityTransferContext.cs | |||
@@ -58,13 +58,13 @@ namespace OpenSim.Framework | |||
58 | public void Unpack(OSD data) | 58 | public void Unpack(OSD data) |
59 | { | 59 | { |
60 | OSDMap map = (OSDMap)data; | 60 | OSDMap map = (OSDMap)data; |
61 | 61 | OSD tmpOSD; | |
62 | if (map.ContainsKey("InboundVersion")) | 62 | if (map.TryGetValue("InboundVersion", out tmpOSD)) |
63 | InboundVersion = (float)map["InboundVersion"].AsReal(); | 63 | InboundVersion = (float)tmpOSD.AsReal(); |
64 | if (map.ContainsKey("OutboundVersion")) | 64 | if (map.TryGetValue("OutboundVersion", out tmpOSD)) |
65 | OutboundVersion = (float)map["OutboundVersion"].AsReal(); | 65 | OutboundVersion = (float)tmpOSD.AsReal(); |
66 | if (map.ContainsKey("WearablesCount")) | 66 | if (map.TryGetValue("WearablesCount", out tmpOSD)) |
67 | WearablesCount = map["WearablesCount"].AsInteger(); | 67 | WearablesCount = tmpOSD.AsInteger(); |
68 | } | 68 | } |
69 | } | 69 | } |
70 | } | 70 | } |
diff --git a/OpenSim/Framework/WearableCacheItem.cs b/OpenSim/Framework/WearableCacheItem.cs index 427e149..84b9ee9 100644 --- a/OpenSim/Framework/WearableCacheItem.cs +++ b/OpenSim/Framework/WearableCacheItem.cs | |||
@@ -161,17 +161,20 @@ namespace OpenSim.Framework | |||
161 | public static WearableCacheItem[] BakedFromOSD(OSD pInput) | 161 | public static WearableCacheItem[] BakedFromOSD(OSD pInput) |
162 | { | 162 | { |
163 | WearableCacheItem[] pcache = WearableCacheItem.GetDefaultCacheItem(); | 163 | WearableCacheItem[] pcache = WearableCacheItem.GetDefaultCacheItem(); |
164 | 164 | OSD tmpOSD; | |
165 | if (pInput.Type == OSDType.Array) | 165 | if (pInput.Type == OSDType.Array) |
166 | { | 166 | { |
167 | OSDArray itemarray = (OSDArray)pInput; | 167 | OSDArray itemarray = (OSDArray)pInput; |
168 | foreach (OSDMap item in itemarray) | 168 | foreach (OSDMap item in itemarray) |
169 | { | 169 | { |
170 | int idx = (int)item["textureindex"].AsUInteger(); | 170 | tmpOSD = item["textureindex"]; |
171 | int idx = tmpOSD.AsInteger(); | ||
171 | if (idx < 0 || idx > pcache.Length) | 172 | if (idx < 0 || idx > pcache.Length) |
172 | continue; | 173 | continue; |
173 | pcache[idx].CacheId = item["cacheid"].AsUUID(); | 174 | tmpOSD = item["cacheid"]; |
174 | pcache[idx].TextureID = item["textureid"].AsUUID(); | 175 | pcache[idx].CacheId = tmpOSD.AsUUID(); |
176 | tmpOSD = item["textureid"]; | ||
177 | pcache[idx].TextureID = tmpOSD.AsUUID(); | ||
175 | /* | 178 | /* |
176 | if (item.ContainsKey("assetdata")) | 179 | if (item.ContainsKey("assetdata")) |
177 | { | 180 | { |
diff --git a/OpenSim/Region/OptionalModules/Materials/MaterialsModule.cs b/OpenSim/Region/OptionalModules/Materials/MaterialsModule.cs index 2aea7f9..4a92120 100644 --- a/OpenSim/Region/OptionalModules/Materials/MaterialsModule.cs +++ b/OpenSim/Region/OptionalModules/Materials/MaterialsModule.cs | |||
@@ -267,6 +267,7 @@ namespace OpenSim.Region.OptionalModules.Materials | |||
267 | if (matsArr == null) | 267 | if (matsArr == null) |
268 | return partchanged; | 268 | return partchanged; |
269 | 269 | ||
270 | OSD tmpOSD; | ||
270 | foreach (OSD elemOsd in matsArr) | 271 | foreach (OSD elemOsd in matsArr) |
271 | { | 272 | { |
272 | if (elemOsd != null && elemOsd is OSDMap) | 273 | if (elemOsd != null && elemOsd is OSDMap) |
@@ -278,7 +279,8 @@ namespace OpenSim.Region.OptionalModules.Materials | |||
278 | { | 279 | { |
279 | lock (materialslock) | 280 | lock (materialslock) |
280 | { | 281 | { |
281 | UUID id = matMap["ID"].AsUUID(); | 282 | tmpOSD = matMap["ID"]; |
283 | UUID id = tmpOSD.AsUUID(); | ||
282 | if(m_Materials.ContainsKey(id)) | 284 | if(m_Materials.ContainsKey(id)) |
283 | continue; | 285 | continue; |
284 | 286 | ||
@@ -459,12 +461,13 @@ namespace OpenSim.Region.OptionalModules.Materials | |||
459 | OSDMap resp = new OSDMap(); | 461 | OSDMap resp = new OSDMap(); |
460 | 462 | ||
461 | OSDArray respArr = new OSDArray(); | 463 | OSDArray respArr = new OSDArray(); |
464 | OSD tmpOSD; | ||
462 | 465 | ||
463 | if (req.ContainsKey("Zipped")) | 466 | if (req.TryGetValue("Zipped", out tmpOSD)) |
464 | { | 467 | { |
465 | OSD osd = null; | 468 | OSD osd = null; |
466 | 469 | ||
467 | byte[] inBytes = req["Zipped"].AsBinary(); | 470 | byte[] inBytes = tmpOSD.AsBinary(); |
468 | 471 | ||
469 | try | 472 | try |
470 | { | 473 | { |
@@ -531,12 +534,13 @@ namespace OpenSim.Region.OptionalModules.Materials | |||
531 | 534 | ||
532 | OSDArray respArr = new OSDArray(); | 535 | OSDArray respArr = new OSDArray(); |
533 | 536 | ||
537 | OSD tmpOSD; | ||
534 | HashSet<SceneObjectPart> parts = new HashSet<SceneObjectPart>(); | 538 | HashSet<SceneObjectPart> parts = new HashSet<SceneObjectPart>(); |
535 | if (req.ContainsKey("Zipped")) | 539 | if (req.TryGetValue("Zipped", out tmpOSD)) |
536 | { | 540 | { |
537 | OSD osd = null; | 541 | OSD osd = null; |
538 | 542 | ||
539 | byte[] inBytes = req["Zipped"].AsBinary(); | 543 | byte[] inBytes = tmpOSD.AsBinary(); |
540 | 544 | ||
541 | try | 545 | try |
542 | { | 546 | { |
@@ -546,145 +550,141 @@ namespace OpenSim.Region.OptionalModules.Materials | |||
546 | { | 550 | { |
547 | materialsFromViewer = osd as OSDMap; | 551 | materialsFromViewer = osd as OSDMap; |
548 | 552 | ||
549 | if (materialsFromViewer.ContainsKey("FullMaterialsPerFace")) | 553 | if (materialsFromViewer.TryGetValue("FullMaterialsPerFace", out tmpOSD) && (tmpOSD is OSDArray)) |
550 | { | 554 | { |
551 | OSD matsOsd = materialsFromViewer["FullMaterialsPerFace"]; | 555 | OSDArray matsArr = tmpOSD as OSDArray; |
552 | if (matsOsd is OSDArray) | 556 | try |
553 | { | 557 | { |
554 | OSDArray matsArr = matsOsd as OSDArray; | 558 | foreach (OSDMap matsMap in matsArr) |
555 | |||
556 | try | ||
557 | { | 559 | { |
558 | foreach (OSDMap matsMap in matsArr) | 560 | uint primLocalID = 0; |
561 | try | ||
559 | { | 562 | { |
560 | uint primLocalID = 0; | 563 | tmpOSD = matsMap["ID"]; |
561 | try | 564 | primLocalID = tmpOSD.AsUInteger(); |
562 | { | 565 | } |
563 | primLocalID = matsMap["ID"].AsUInteger(); | 566 | catch (Exception e) |
564 | } | 567 | { |
565 | catch (Exception e) | 568 | m_log.Warn("[Materials]: cannot decode \"ID\" from matsMap: " + e.Message); |
566 | { | 569 | continue; |
567 | m_log.Warn("[Materials]: cannot decode \"ID\" from matsMap: " + e.Message); | 570 | } |
568 | continue; | ||
569 | } | ||
570 | 571 | ||
571 | SceneObjectPart sop = m_scene.GetSceneObjectPart(primLocalID); | 572 | SceneObjectPart sop = m_scene.GetSceneObjectPart(primLocalID); |
572 | if (sop == null) | 573 | if (sop == null) |
573 | { | 574 | { |
574 | m_log.WarnFormat("[Materials]: SOP not found for localId: {0}", primLocalID.ToString()); | 575 | m_log.WarnFormat("[Materials]: SOP not found for localId: {0}", primLocalID.ToString()); |
575 | continue; | 576 | continue; |
576 | } | 577 | } |
577 | 578 | ||
578 | if (!m_scene.Permissions.CanEditObject(sop.UUID, agentID)) | 579 | if (!m_scene.Permissions.CanEditObject(sop.UUID, agentID)) |
579 | { | 580 | { |
580 | m_log.WarnFormat("User {0} can't edit object {1} {2}", agentID, sop.Name, sop.UUID); | 581 | m_log.WarnFormat("User {0} can't edit object {1} {2}", agentID, sop.Name, sop.UUID); |
581 | continue; | 582 | continue; |
582 | } | 583 | } |
583 | 584 | ||
584 | OSDMap mat = null; | 585 | OSDMap mat = null; |
585 | try | 586 | try |
586 | { | 587 | { |
587 | mat = matsMap["Material"] as OSDMap; | 588 | mat = matsMap["Material"] as OSDMap; |
588 | } | 589 | } |
589 | catch (Exception e) | 590 | catch (Exception e) |
590 | { | 591 | { |
591 | m_log.Warn("[Materials]: cannot decode \"Material\" from matsMap: " + e.Message); | 592 | m_log.Warn("[Materials]: cannot decode \"Material\" from matsMap: " + e.Message); |
592 | continue; | 593 | continue; |
593 | } | 594 | } |
594 | 595 | ||
595 | Primitive.TextureEntry te = new Primitive.TextureEntry(sop.Shape.TextureEntry, 0, sop.Shape.TextureEntry.Length); | 596 | Primitive.TextureEntry te = new Primitive.TextureEntry(sop.Shape.TextureEntry, 0, sop.Shape.TextureEntry.Length); |
596 | if (te == null) | 597 | if (te == null) |
597 | { | 598 | { |
598 | m_log.WarnFormat("[Materials]: Error in TextureEntry for SOP {0} {1}", sop.Name, sop.UUID); | 599 | m_log.WarnFormat("[Materials]: Error in TextureEntry for SOP {0} {1}", sop.Name, sop.UUID); |
599 | continue; | 600 | continue; |
600 | } | 601 | } |
601 | 602 | ||
602 | int face = -1; | 603 | int face = -1; |
603 | UUID oldid = UUID.Zero; | 604 | UUID oldid = UUID.Zero; |
604 | Primitive.TextureEntryFace faceEntry = null; | 605 | Primitive.TextureEntryFace faceEntry = null; |
605 | if (matsMap.ContainsKey("Face")) | 606 | if (matsMap.TryGetValue("Face", out tmpOSD)) |
606 | { | 607 | { |
607 | face = matsMap["Face"].AsInteger(); | 608 | face = tmpOSD.AsInteger(); |
608 | faceEntry = te.CreateFace((uint)face); | 609 | faceEntry = te.CreateFace((uint)face); |
609 | } | 610 | } |
610 | else | 611 | else |
611 | faceEntry = te.DefaultTexture; | 612 | faceEntry = te.DefaultTexture; |
612 | 613 | ||
613 | if (faceEntry == null) | 614 | if (faceEntry == null) |
614 | continue; | 615 | continue; |
615 | 616 | ||
616 | UUID id; | 617 | UUID id; |
617 | FaceMaterial newFaceMat = null; | 618 | FaceMaterial newFaceMat = null; |
618 | if (mat == null) | 619 | if (mat == null) |
619 | { | 620 | { |
620 | // This happens then the user removes a material from a prim | 621 | // This happens then the user removes a material from a prim |
622 | id = UUID.Zero; | ||
623 | } | ||
624 | else | ||
625 | { | ||
626 | newFaceMat = new FaceMaterial(mat); | ||
627 | if(newFaceMat.DiffuseAlphaMode == 1 | ||
628 | && newFaceMat.NormalMapID == UUID.Zero | ||
629 | && newFaceMat.SpecularMapID == UUID.Zero | ||
630 | ) | ||
621 | id = UUID.Zero; | 631 | id = UUID.Zero; |
622 | } | ||
623 | else | 632 | else |
624 | { | 633 | { |
625 | newFaceMat = new FaceMaterial(mat); | 634 | newFaceMat.genID(); |
626 | if(newFaceMat.DiffuseAlphaMode == 1 | 635 | id = newFaceMat.ID; |
627 | && newFaceMat.NormalMapID == UUID.Zero | ||
628 | && newFaceMat.SpecularMapID == UUID.Zero | ||
629 | ) | ||
630 | id = UUID.Zero; | ||
631 | else | ||
632 | { | ||
633 | newFaceMat.genID(); | ||
634 | id = newFaceMat.ID; | ||
635 | } | ||
636 | } | 636 | } |
637 | } | ||
637 | 638 | ||
638 | oldid = faceEntry.MaterialID; | 639 | oldid = faceEntry.MaterialID; |
639 | 640 | ||
640 | if(oldid == id) | 641 | if(oldid == id) |
641 | continue; | 642 | continue; |
642 | 643 | ||
643 | if (faceEntry != null) | 644 | if (faceEntry != null) |
644 | { | 645 | { |
645 | faceEntry.MaterialID = id; | 646 | faceEntry.MaterialID = id; |
646 | //m_log.DebugFormat("[Materials]: in \"{0}\" {1}, setting material ID for face {2} to {3}", sop.Name, sop.UUID, face, id); | 647 | //m_log.DebugFormat("[Materials]: in \"{0}\" {1}, setting material ID for face {2} to {3}", sop.Name, sop.UUID, face, id); |
647 | // We can't use sop.UpdateTextureEntry(te) because it filters, so do it manually | 648 | // We can't use sop.UpdateTextureEntry(te) because it filters, so do it manually |
648 | sop.Shape.TextureEntry = te.GetBytes(9); | 649 | sop.Shape.TextureEntry = te.GetBytes(9); |
649 | } | 650 | } |
650 | 651 | ||
651 | if(oldid != UUID.Zero) | 652 | if(oldid != UUID.Zero) |
652 | RemoveMaterial(oldid); | 653 | RemoveMaterial(oldid); |
653 | 654 | ||
654 | lock(materialslock) | 655 | lock(materialslock) |
656 | { | ||
657 | if(id != UUID.Zero) | ||
655 | { | 658 | { |
656 | if(id != UUID.Zero) | 659 | if (m_Materials.ContainsKey(id)) |
660 | m_MaterialsRefCount[id]++; | ||
661 | else | ||
657 | { | 662 | { |
658 | if (m_Materials.ContainsKey(id)) | 663 | m_Materials[id] = newFaceMat; |
659 | m_MaterialsRefCount[id]++; | 664 | m_MaterialsRefCount[id] = 1; |
660 | else | 665 | m_changed[newFaceMat] = Util.GetTimeStamp(); |
661 | { | ||
662 | m_Materials[id] = newFaceMat; | ||
663 | m_MaterialsRefCount[id] = 1; | ||
664 | m_changed[newFaceMat] = Util.GetTimeStamp(); | ||
665 | } | ||
666 | } | 666 | } |
667 | } | 667 | } |
668 | |||
669 | if(!parts.Contains(sop)) | ||
670 | parts.Add(sop); | ||
671 | } | 668 | } |
672 | 669 | ||
673 | foreach(SceneObjectPart sop in parts) | 670 | if(!parts.Contains(sop)) |
674 | { | 671 | parts.Add(sop); |
675 | if (sop.ParentGroup != null && !sop.ParentGroup.IsDeleted) | ||
676 | { | ||
677 | sop.TriggerScriptChangedEvent(Changed.TEXTURE); | ||
678 | sop.ScheduleFullUpdate(); | ||
679 | sop.ParentGroup.HasGroupChanged = true; | ||
680 | } | ||
681 | } | ||
682 | } | 672 | } |
683 | catch (Exception e) | 673 | |
674 | foreach(SceneObjectPart sop in parts) | ||
684 | { | 675 | { |
685 | m_log.Warn("[Materials]: exception processing received material ", e); | 676 | if (sop.ParentGroup != null && !sop.ParentGroup.IsDeleted) |
677 | { | ||
678 | sop.TriggerScriptChangedEvent(Changed.TEXTURE); | ||
679 | sop.ScheduleFullUpdate(); | ||
680 | sop.ParentGroup.HasGroupChanged = true; | ||
681 | } | ||
686 | } | 682 | } |
687 | } | 683 | } |
684 | catch (Exception e) | ||
685 | { | ||
686 | m_log.Warn("[Materials]: exception processing received material ", e); | ||
687 | } | ||
688 | } | 688 | } |
689 | } | 689 | } |
690 | } | 690 | } |
diff --git a/OpenSim/Server/Handlers/Simulation/AgentHandlers.cs b/OpenSim/Server/Handlers/Simulation/AgentHandlers.cs index 1c1930a..788bd3d 100644 --- a/OpenSim/Server/Handlers/Simulation/AgentHandlers.cs +++ b/OpenSim/Server/Handlers/Simulation/AgentHandlers.cs | |||
@@ -115,15 +115,10 @@ namespace OpenSim.Server.Handlers.Simulation | |||
115 | 115 | ||
116 | return responsedata; | 116 | return responsedata; |
117 | } | 117 | } |
118 | |||
119 | } | 118 | } |
120 | 119 | ||
121 | protected virtual void DoQueryAccess(Hashtable request, Hashtable responsedata, UUID agentID, UUID regionID) | 120 | protected virtual void DoQueryAccess(Hashtable request, Hashtable responsedata, UUID agentID, UUID regionID) |
122 | { | 121 | { |
123 | Culture.SetCurrentCulture(); | ||
124 | |||
125 | EntityTransferContext ctx = new EntityTransferContext(); | ||
126 | |||
127 | if (m_SimulationService == null) | 122 | if (m_SimulationService == null) |
128 | { | 123 | { |
129 | m_log.Debug("[AGENT HANDLER]: Agent QUERY called. Harmless but useless."); | 124 | m_log.Debug("[AGENT HANDLER]: Agent QUERY called. Harmless but useless."); |
@@ -134,33 +129,37 @@ namespace OpenSim.Server.Handlers.Simulation | |||
134 | return; | 129 | return; |
135 | } | 130 | } |
136 | 131 | ||
132 | Culture.SetCurrentCulture(); | ||
133 | |||
137 | // m_log.DebugFormat("[AGENT HANDLER]: Received QUERYACCESS with {0}", (string)request["body"]); | 134 | // m_log.DebugFormat("[AGENT HANDLER]: Received QUERYACCESS with {0}", (string)request["body"]); |
138 | OSDMap args = Utils.GetOSDMap((string)request["body"]); | 135 | OSDMap args = Utils.GetOSDMap((string)request["body"]); |
139 | 136 | ||
140 | bool viaTeleport = true; | 137 | bool viaTeleport = true; |
141 | if (args.ContainsKey("viaTeleport")) | 138 | OSD tmpOSD; |
142 | viaTeleport = args["viaTeleport"].AsBoolean(); | 139 | if (args.TryGetValue("viaTeleport",out tmpOSD)) |
140 | viaTeleport = tmpOSD.AsBoolean(); | ||
143 | 141 | ||
144 | Vector3 position = Vector3.Zero; | 142 | Vector3 position = Vector3.Zero; |
145 | if (args.ContainsKey("position")) | 143 | if (args.TryGetValue("position", out tmpOSD)) |
146 | position = Vector3.Parse(args["position"].AsString()); | 144 | position = Vector3.Parse(tmpOSD.AsString()); |
147 | 145 | ||
148 | string agentHomeURI = null; | 146 | string agentHomeURI = null; |
149 | if (args.ContainsKey("agent_home_uri")) | 147 | if (args.TryGetValue("agent_home_uri", out tmpOSD)) |
150 | agentHomeURI = args["agent_home_uri"].AsString(); | 148 | agentHomeURI = tmpOSD.AsString(); |
151 | 149 | ||
152 | // Decode the legacy (string) version and extract the number | 150 | // Decode the legacy (string) version and extract the number |
153 | float theirVersion = 0f; | 151 | float theirVersion = 0f; |
154 | if (args.ContainsKey("my_version")) | 152 | if (args.TryGetValue("my_version", out tmpOSD)) |
155 | { | 153 | { |
156 | string theirVersionStr = args["my_version"].AsString(); | 154 | string theirVersionStr = tmpOSD.AsString(); |
157 | string[] parts = theirVersionStr.Split(new char[] {'/'}); | 155 | string[] parts = theirVersionStr.Split(new char[] {'/'}); |
158 | if (parts.Length > 1) | 156 | if (parts.Length > 1) |
159 | theirVersion = float.Parse(parts[1], Culture.FormatProvider); | 157 | theirVersion = float.Parse(parts[1], Culture.FormatProvider); |
160 | } | 158 | } |
161 | 159 | ||
162 | if (args.ContainsKey("context")) | 160 | EntityTransferContext ctx = new EntityTransferContext(); |
163 | ctx.Unpack((OSDMap)args["context"]); | 161 | if (args.TryGetValue("context", out tmpOSD) && tmpOSD is OSDMap) |
162 | ctx.Unpack((OSDMap)tmpOSD); | ||
164 | 163 | ||
165 | // Decode the new versioning data | 164 | // Decode the new versioning data |
166 | float minVersionRequired = 0f; | 165 | float minVersionRequired = 0f; |
@@ -168,15 +167,15 @@ namespace OpenSim.Server.Handlers.Simulation | |||
168 | float minVersionProvided = 0f; | 167 | float minVersionProvided = 0f; |
169 | float maxVersionProvided = 0f; | 168 | float maxVersionProvided = 0f; |
170 | 169 | ||
171 | if (args.ContainsKey("simulation_service_supported_min")) | 170 | if (args.TryGetValue("simulation_service_supported_min", out tmpOSD)) |
172 | minVersionProvided = (float)args["simulation_service_supported_min"].AsReal(); | 171 | minVersionProvided = (float)tmpOSD.AsReal(); |
173 | if (args.ContainsKey("simulation_service_supported_max")) | 172 | if (args.TryGetValue("simulation_service_supported_max", out tmpOSD)) |
174 | maxVersionProvided = (float)args["simulation_service_supported_max"].AsReal(); | 173 | maxVersionProvided = (float)tmpOSD.AsReal(); |
175 | 174 | ||
176 | if (args.ContainsKey("simulation_service_accepted_min")) | 175 | if (args.TryGetValue("simulation_service_accepted_min", out tmpOSD)) |
177 | minVersionRequired = (float)args["simulation_service_accepted_min"].AsReal(); | 176 | minVersionRequired = (float)tmpOSD.AsReal(); |
178 | if (args.ContainsKey("simulation_service_accepted_max")) | 177 | if (args.TryGetValue("simulation_service_accepted_max", out tmpOSD)) |
179 | maxVersionRequired = (float)args["simulation_service_accepted_max"].AsReal(); | 178 | maxVersionRequired = (float)tmpOSD.AsReal(); |
180 | 179 | ||
181 | responsedata["int_response_code"] = HttpStatusCode.OK; | 180 | responsedata["int_response_code"] = HttpStatusCode.OK; |
182 | OSDMap resp = new OSDMap(3); | 181 | OSDMap resp = new OSDMap(3); |
@@ -239,9 +238,9 @@ namespace OpenSim.Server.Handlers.Simulation | |||
239 | 238 | ||
240 | List<UUID> features = new List<UUID>(); | 239 | List<UUID> features = new List<UUID>(); |
241 | 240 | ||
242 | if (args.ContainsKey("features")) | 241 | if (args.TryGetValue("features", out tmpOSD) && tmpOSD is OSDArray) |
243 | { | 242 | { |
244 | OSDArray array = (OSDArray)args["features"]; | 243 | OSDArray array = (OSDArray)tmpOSD; |
245 | 244 | ||
246 | foreach (OSD o in array) | 245 | foreach (OSD o in array) |
247 | features.Add(new UUID(o.AsString())); | 246 | features.Add(new UUID(o.AsString())); |
@@ -414,8 +413,6 @@ namespace OpenSim.Server.Handlers.Simulation | |||
414 | 413 | ||
415 | protected void DoAgentPost(Hashtable request, Hashtable responsedata, UUID id) | 414 | protected void DoAgentPost(Hashtable request, Hashtable responsedata, UUID id) |
416 | { | 415 | { |
417 | EntityTransferContext ctx = new EntityTransferContext(); | ||
418 | |||
419 | OSDMap args = Utils.GetOSDMap((string)request["body"]); | 416 | OSDMap args = Utils.GetOSDMap((string)request["body"]); |
420 | if (args == null) | 417 | if (args == null) |
421 | { | 418 | { |
@@ -424,8 +421,10 @@ namespace OpenSim.Server.Handlers.Simulation | |||
424 | return; | 421 | return; |
425 | } | 422 | } |
426 | 423 | ||
427 | if (args.ContainsKey("context")) | 424 | OSD tmpOSD; |
428 | ctx.Unpack((OSDMap)args["context"]); | 425 | EntityTransferContext ctx = new EntityTransferContext(); |
426 | if (args.TryGetValue("context", out tmpOSD) && tmpOSD is OSDMap) | ||
427 | ctx.Unpack((OSDMap)tmpOSD); | ||
429 | 428 | ||
430 | AgentDestinationData data = CreateAgentDestinationData(); | 429 | AgentDestinationData data = CreateAgentDestinationData(); |
431 | UnpackData(args, data, request); | 430 | UnpackData(args, data, request); |
@@ -453,16 +452,19 @@ namespace OpenSim.Server.Handlers.Simulation | |||
453 | 452 | ||
454 | GridRegion source = null; | 453 | GridRegion source = null; |
455 | 454 | ||
456 | if (args.ContainsKey("source_uuid")) | 455 | if (args.TryGetValue("source_uuid", out tmpOSD)) |
457 | { | 456 | { |
458 | source = new GridRegion(); | 457 | source = new GridRegion(); |
459 | source.RegionLocX = Int32.Parse(args["source_x"].AsString()); | 458 | source.RegionID = UUID.Parse(tmpOSD.AsString()); |
460 | source.RegionLocY = Int32.Parse(args["source_y"].AsString()); | 459 | tmpOSD = args["source_x"]; |
461 | source.RegionName = args["source_name"].AsString(); | 460 | source.RegionLocX = Int32.Parse(tmpOSD.AsString()); |
462 | source.RegionID = UUID.Parse(args["source_uuid"].AsString()); | 461 | tmpOSD = args["source_y"]; |
463 | 462 | source.RegionLocY = Int32.Parse(tmpOSD.AsString()); | |
464 | if (args.ContainsKey("source_server_uri")) | 463 | tmpOSD = args["source_name"]; |
465 | source.RawServerURI = args["source_server_uri"].AsString(); | 464 | source.RegionName = tmpOSD.AsString(); |
465 | |||
466 | if (args.TryGetValue("source_server_uri", out tmpOSD)) | ||
467 | source.RawServerURI = tmpOSD.AsString(); | ||
466 | else | 468 | else |
467 | source.RawServerURI = null; | 469 | source.RawServerURI = null; |
468 | } | 470 | } |
@@ -493,21 +495,26 @@ namespace OpenSim.Server.Handlers.Simulation | |||
493 | 495 | ||
494 | protected virtual void UnpackData(OSDMap args, AgentDestinationData data, Hashtable request) | 496 | protected virtual void UnpackData(OSDMap args, AgentDestinationData data, Hashtable request) |
495 | { | 497 | { |
498 | OSD tmpOSD; | ||
496 | // retrieve the input arguments | 499 | // retrieve the input arguments |
497 | if (args.ContainsKey("destination_x") && args["destination_x"] != null) | 500 | if (args.TryGetValue("destination_x", out tmpOSD) && tmpOSD != null) |
498 | Int32.TryParse(args["destination_x"].AsString(), out data.x); | 501 | Int32.TryParse(tmpOSD.AsString(), out data.x); |
499 | else | 502 | else |
500 | m_log.WarnFormat(" -- request didn't have destination_x"); | 503 | m_log.WarnFormat(" -- request didn't have destination_x"); |
501 | if (args.ContainsKey("destination_y") && args["destination_y"] != null) | 504 | |
502 | Int32.TryParse(args["destination_y"].AsString(), out data.y); | 505 | if (args.TryGetValue("destination_y", out tmpOSD) && tmpOSD != null) |
506 | Int32.TryParse(tmpOSD.AsString(), out data.y); | ||
503 | else | 507 | else |
504 | m_log.WarnFormat(" -- request didn't have destination_y"); | 508 | m_log.WarnFormat(" -- request didn't have destination_y"); |
505 | if (args.ContainsKey("destination_uuid") && args["destination_uuid"] != null) | 509 | |
506 | UUID.TryParse(args["destination_uuid"].AsString(), out data.uuid); | 510 | if (args.TryGetValue("destination_uuid", out tmpOSD) && tmpOSD != null) |
507 | if (args.ContainsKey("destination_name") && args["destination_name"] != null) | 511 | UUID.TryParse(tmpOSD.AsString(), out data.uuid); |
508 | data.name = args["destination_name"].ToString(); | 512 | |
509 | if (args.ContainsKey("teleport_flags") && args["teleport_flags"] != null) | 513 | if (args.TryGetValue("destination_name", out tmpOSD) && tmpOSD != null) |
510 | data.flags = args["teleport_flags"].AsUInteger(); | 514 | data.name = tmpOSD.ToString(); |
515 | |||
516 | if (args.TryGetValue("teleport_flags", out tmpOSD) && tmpOSD != null) | ||
517 | data.flags = tmpOSD.AsUInteger(); | ||
511 | } | 518 | } |
512 | 519 | ||
513 | protected virtual GridRegion ExtractGatekeeper(AgentDestinationData data) | 520 | protected virtual GridRegion ExtractGatekeeper(AgentDestinationData data) |
@@ -674,7 +681,6 @@ namespace OpenSim.Server.Handlers.Simulation | |||
674 | protected void DoAgentPut(Hashtable request, Hashtable responsedata) | 681 | protected void DoAgentPut(Hashtable request, Hashtable responsedata) |
675 | { | 682 | { |
676 | // TODO: Encode the ENtityTransferContext | 683 | // TODO: Encode the ENtityTransferContext |
677 | EntityTransferContext ctx = new EntityTransferContext(); | ||
678 | 684 | ||
679 | OSDMap args = Utils.GetOSDMap((string)request["body"]); | 685 | OSDMap args = Utils.GetOSDMap((string)request["body"]); |
680 | if (args == null) | 686 | if (args == null) |
@@ -685,19 +691,21 @@ namespace OpenSim.Server.Handlers.Simulation | |||
685 | } | 691 | } |
686 | 692 | ||
687 | // retrieve the input arguments | 693 | // retrieve the input arguments |
694 | OSD tmpOSD; | ||
695 | EntityTransferContext ctx = new EntityTransferContext(); | ||
688 | int x = 0, y = 0; | 696 | int x = 0, y = 0; |
689 | UUID uuid = UUID.Zero; | 697 | UUID uuid = UUID.Zero; |
690 | string regionname = string.Empty; | 698 | string regionname = string.Empty; |
691 | if (args.ContainsKey("destination_x") && args["destination_x"] != null) | 699 | if (args.TryGetValue("destination_x", out tmpOSD) && tmpOSD != null) |
692 | Int32.TryParse(args["destination_x"].AsString(), out x); | 700 | Int32.TryParse(tmpOSD.AsString(), out x); |
693 | if (args.ContainsKey("destination_y") && args["destination_y"] != null) | 701 | if (args.TryGetValue("destination_y", out tmpOSD) && tmpOSD != null) |
694 | Int32.TryParse(args["destination_y"].AsString(), out y); | 702 | Int32.TryParse(tmpOSD.AsString(), out y); |
695 | if (args.ContainsKey("destination_uuid") && args["destination_uuid"] != null) | 703 | if (args.TryGetValue("destination_uuid", out tmpOSD) && tmpOSD != null) |
696 | UUID.TryParse(args["destination_uuid"].AsString(), out uuid); | 704 | UUID.TryParse(tmpOSD.AsString(), out uuid); |
697 | if (args.ContainsKey("destination_name") && args["destination_name"] != null) | 705 | if (args.TryGetValue("destination_name", out tmpOSD) && tmpOSD != null) |
698 | regionname = args["destination_name"].ToString(); | 706 | regionname = tmpOSD.ToString(); |
699 | if (args.ContainsKey("context")) | 707 | if (args.TryGetValue("context", out tmpOSD) && tmpOSD is OSDMap) |
700 | ctx.Unpack((OSDMap)args["context"]); | 708 | ctx.Unpack((OSDMap)tmpOSD); |
701 | 709 | ||
702 | GridRegion destination = new GridRegion(); | 710 | GridRegion destination = new GridRegion(); |
703 | destination.RegionID = uuid; | 711 | destination.RegionID = uuid; |
diff --git a/OpenSim/Services/Connectors/Simulation/SimulationServiceConnector.cs b/OpenSim/Services/Connectors/Simulation/SimulationServiceConnector.cs index e15ac8c..b7dbb79 100644 --- a/OpenSim/Services/Connectors/Simulation/SimulationServiceConnector.cs +++ b/OpenSim/Services/Connectors/Simulation/SimulationServiceConnector.cs | |||
@@ -112,7 +112,7 @@ namespace OpenSim.Services.Connectors.Simulation | |||
112 | m_log.DebugFormat("[REMOTE SIMULATION CONNECTOR]: Creating agent at {0}", destination.ServerURI); | 112 | m_log.DebugFormat("[REMOTE SIMULATION CONNECTOR]: Creating agent at {0}", destination.ServerURI); |
113 | 113 | ||
114 | string uri = destination.ServerURI + AgentPath() + aCircuit.AgentID + "/"; | 114 | string uri = destination.ServerURI + AgentPath() + aCircuit.AgentID + "/"; |
115 | 115 | OSD tmpOSD; | |
116 | try | 116 | try |
117 | { | 117 | { |
118 | OSDMap args = aCircuit.PackAgentCircuitData(ctx); | 118 | OSDMap args = aCircuit.PackAgentCircuitData(ctx); |
@@ -120,27 +120,37 @@ namespace OpenSim.Services.Connectors.Simulation | |||
120 | PackData(args, source, aCircuit, destination, flags); | 120 | PackData(args, source, aCircuit, destination, flags); |
121 | 121 | ||
122 | OSDMap result = WebUtil.PostToServiceCompressed(uri, args, 30000); | 122 | OSDMap result = WebUtil.PostToServiceCompressed(uri, args, 30000); |
123 | bool success = result["success"].AsBoolean(); | 123 | tmpOSD = result["success"]; |
124 | if (success && result.ContainsKey("_Result")) | 124 | bool success = tmpOSD.AsBoolean(); |
125 | if (success && result.TryGetValue("_Result", out tmpOSD) && tmpOSD is OSDMap) | ||
125 | { | 126 | { |
126 | OSDMap data = (OSDMap)result["_Result"]; | 127 | OSDMap data = (OSDMap)tmpOSD; |
128 | |||
129 | tmpOSD = data["reason"]; | ||
130 | reason = tmpOSD.AsString(); | ||
127 | 131 | ||
128 | reason = data["reason"].AsString(); | 132 | tmpOSD = data["success"]; |
129 | success = data["success"].AsBoolean(); | 133 | success = tmpOSD.AsBoolean(); |
130 | return success; | 134 | return success; |
131 | } | 135 | } |
132 | 136 | ||
133 | // Try the old version, uncompressed | 137 | // Try the old version, uncompressed |
134 | result = WebUtil.PostToService(uri, args, 30000, false); | 138 | result = WebUtil.PostToService(uri, args, 30000, false); |
135 | 139 | ||
136 | if (result["Success"].AsBoolean()) | 140 | tmpOSD = result["success"]; |
141 | success = tmpOSD.AsBoolean(); | ||
142 | if (success) | ||
137 | { | 143 | { |
138 | if (result.ContainsKey("_Result")) | 144 | if (result.TryGetValue("_Result", out tmpOSD) && tmpOSD is OSDMap) |
139 | { | 145 | { |
140 | OSDMap data = (OSDMap)result["_Result"]; | 146 | OSDMap data = (OSDMap)tmpOSD; |
147 | |||
148 | tmpOSD = data["reason"]; | ||
149 | reason = tmpOSD.AsString(); | ||
150 | |||
151 | tmpOSD = data["success"]; | ||
152 | success = tmpOSD.AsBoolean(); | ||
141 | 153 | ||
142 | reason = data["reason"].AsString(); | ||
143 | success = data["success"].AsBoolean(); | ||
144 | m_log.WarnFormat( | 154 | m_log.WarnFormat( |
145 | "[REMOTE SIMULATION CONNECTOR]: Remote simulator {0} did not accept compressed transfer, suggest updating it.", destination.RegionName); | 155 | "[REMOTE SIMULATION CONNECTOR]: Remote simulator {0} did not accept compressed transfer, suggest updating it.", destination.RegionName); |
146 | return success; | 156 | return success; |
@@ -312,34 +322,47 @@ namespace OpenSim.Services.Connectors.Simulation | |||
312 | if (agentHomeURI != null) | 322 | if (agentHomeURI != null) |
313 | request.Add("agent_home_uri", OSD.FromString(agentHomeURI)); | 323 | request.Add("agent_home_uri", OSD.FromString(agentHomeURI)); |
314 | 324 | ||
325 | OSD tmpOSD; | ||
315 | try | 326 | try |
316 | { | 327 | { |
317 | OSDMap result = WebUtil.ServiceOSDRequest(uri, request, "QUERYACCESS", 30000, false, false, true); | 328 | OSDMap result = WebUtil.ServiceOSDRequest(uri, request, "QUERYACCESS", 30000, false, false, true); |
318 | bool success = result["success"].AsBoolean(); | 329 | |
319 | if (result.ContainsKey("_Result")) | 330 | tmpOSD = result["success"]; |
331 | bool success = tmpOSD.AsBoolean(); | ||
332 | |||
333 | bool has_Result = false; | ||
334 | if (result.TryGetValue("_Result", out tmpOSD)) | ||
320 | { | 335 | { |
321 | OSDMap data = (OSDMap)result["_Result"]; | 336 | has_Result = true; |
337 | OSDMap data = (OSDMap)tmpOSD; | ||
322 | 338 | ||
323 | // FIXME: If there is a _Result map then it's the success key here that indicates the true success | 339 | // FIXME: If there is a _Result map then it's the success key here that indicates the true success |
324 | // or failure, not the sibling result node. | 340 | // or failure, not the sibling result node. |
325 | success = data["success"].AsBoolean(); | 341 | //nte4.8 crap |
342 | tmpOSD = data["success"]; | ||
343 | success = tmpOSD.AsBoolean(); | ||
326 | 344 | ||
327 | reason = data["reason"].AsString(); | 345 | tmpOSD = data["reason"]; |
346 | reason = tmpOSD.AsString(); | ||
328 | // We will need to plumb this and start sing the outbound version as well | 347 | // We will need to plumb this and start sing the outbound version as well |
329 | // TODO: lay the pipe for version plumbing | 348 | // TODO: lay the pipe for version plumbing |
330 | if (data.ContainsKey("negotiated_inbound_version") && data["negotiated_inbound_version"] != null) | 349 | if (data.TryGetValue("negotiated_inbound_version", out tmpOSD) && tmpOSD != null) |
331 | { | 350 | { |
332 | ctx.InboundVersion = (float)data["negotiated_inbound_version"].AsReal(); | 351 | ctx.InboundVersion = (float)tmpOSD.AsReal(); |
333 | ctx.OutboundVersion = (float)data["negotiated_outbound_version"].AsReal(); | 352 | tmpOSD = data["negotiated_outbound_version"]; |
353 | ctx.OutboundVersion = (float)tmpOSD.AsReal(); | ||
334 | } | 354 | } |
335 | else if (data["version"] != null && data["version"].AsString() != string.Empty) | 355 | else if (data.TryGetValue("version", out tmpOSD) && tmpOSD != null) |
336 | { | 356 | { |
337 | string versionString = data["version"].AsString(); | 357 | string versionString = tmpOSD.AsString(); |
338 | String[] parts = versionString.Split(new char[] {'/'}); | 358 | if(versionString != string.Empty) |
339 | if (parts.Length > 1) | ||
340 | { | 359 | { |
341 | ctx.InboundVersion = float.Parse(parts[1], Culture.FormatProvider); | 360 | String[] parts = versionString.Split(new char[] {'/'}); |
342 | ctx.OutboundVersion = float.Parse(parts[1], Culture.FormatProvider); | 361 | if (parts.Length > 1) |
362 | { | ||
363 | ctx.InboundVersion = float.Parse(parts[1], Culture.FormatProvider); | ||
364 | ctx.OutboundVersion = float.Parse(parts[1], Culture.FormatProvider); | ||
365 | } | ||
343 | } | 366 | } |
344 | } | 367 | } |
345 | 368 | ||
@@ -352,11 +375,11 @@ namespace OpenSim.Services.Connectors.Simulation | |||
352 | { | 375 | { |
353 | // If we don't check this then OpenSimulator 0.7.3.1 and some period before will never see the | 376 | // If we don't check this then OpenSimulator 0.7.3.1 and some period before will never see the |
354 | // actual failure message | 377 | // actual failure message |
355 | if (!result.ContainsKey("_Result")) | 378 | if (!has_Result) |
356 | { | 379 | { |
357 | if (result.ContainsKey("Message")) | 380 | if (result.TryGetValue("Message", out tmpOSD)) |
358 | { | 381 | { |
359 | string message = result["Message"].AsString(); | 382 | string message = tmpOSD.AsString(); |
360 | if (message == "Service request failed: [MethodNotAllowed] MethodNotAllowed") // Old style region | 383 | if (message == "Service request failed: [MethodNotAllowed] MethodNotAllowed") // Old style region |
361 | { | 384 | { |
362 | 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"); | 385 | 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 | |||
376 | 399 | ||
377 | featuresAvailable.Clear(); | 400 | featuresAvailable.Clear(); |
378 | 401 | ||
379 | if (result.ContainsKey("features")) | 402 | if (result.TryGetValue("features", out tmpOSD) && tmpOSD is OSDArray) |
380 | { | 403 | { |
381 | OSDArray array = (OSDArray)result["features"]; | 404 | OSDArray array = (OSDArray)tmpOSD; |
382 | 405 | ||
383 | foreach (OSD o in array) | 406 | foreach (OSD o in array) |
384 | featuresAvailable.Add(new UUID(o.AsString())); | 407 | featuresAvailable.Add(new UUID(o.AsString())); |