From 3ea76e3131203f6a553d5a540d5d28aa5ca3f74a Mon Sep 17 00:00:00 2001 From: Melanie Thielker Date: Sat, 27 Sep 2014 02:30:01 +0200 Subject: [PATCH] Make changes to AnimationSet to allow indexing by names rather than indices. Add some debugging output and prepare for parsing an ascii-based format. --- OpenSim/Framework/AnimationSet.cs | 61 ++++++++----------- .../InventoryAccess/InventoryAccessModule.cs | 14 +++++ 2 files changed, 40 insertions(+), 35 deletions(-) diff --git a/OpenSim/Framework/AnimationSet.cs b/OpenSim/Framework/AnimationSet.cs index c5ab634f52..e81d978401 100644 --- a/OpenSim/Framework/AnimationSet.cs +++ b/OpenSim/Framework/AnimationSet.cs @@ -35,53 +35,44 @@ namespace OpenSim.Framework public class AnimationSet { - private readonly int m_maxAnimations = 255; + private bool m_parseError = false; public int AnimationCount { get; private set; } - private Dictionary m_animations = new Dictionary(); - - public UUID AnimationAt(int index) + private Dictionary m_animations = new Dictionary(); + public AnimationSet(Byte[] data) { - if (m_animations.ContainsKey(index)) - return m_animations[index]; - return UUID.Zero; - } - - public void SetAnimation(int index, UUID animation) - { - if (index < 0 || index > m_maxAnimations) - return; - - m_animations[index] = animation; - } - - public AnimationSet(Byte[] assetData) - { - if (assetData.Length < 2) - throw new System.ArgumentException(); - - if (assetData[0] != 1) // Only version 1 is supported - throw new System.ArgumentException(); - - AnimationCount = assetData[1]; - if (assetData.Length - 2 != 16 * AnimationCount) - throw new System.ArgumentException(); - - // TODO: Read anims from blob + string assetData = System.Text.Encoding.ASCII.GetString(data); + Console.WriteLine("--------------------"); + Console.WriteLine("AnimationSet length {0} bytes", assetData.Length); + Console.WriteLine("Data: {0}", assetData); + Console.WriteLine("--------------------"); } public Byte[] ToBytes() { - // TODO: Make blob from anims - return new Byte[0]; + // If there was an error parsing the input, we give back an + // empty set rather than the original data. + if (m_parseError) + { + string dummy = "version 1\ncount 0\n"; + return System.Text.Encoding.ASCII.GetBytes(dummy); + } + + string assetData = String.Format("version 1\ncount {0}\n", m_animations.Count); + foreach (KeyValuePair kvp in m_animations) + assetData += String.Format("{0} {1}\n", kvp.Key, kvp.Value.ToString()); + return System.Text.Encoding.ASCII.GetBytes(assetData); } public bool Validate(AnimationSetValidator val) { - List badAnims = new List(); + if (m_parseError) + return false; + + List badAnims = new List(); bool allOk = true; - foreach (KeyValuePair kvp in m_animations) + foreach (KeyValuePair kvp in m_animations) { if (!val(kvp.Value)) { @@ -90,7 +81,7 @@ namespace OpenSim.Framework } } - foreach (int idx in badAnims) + foreach (string idx in badAnims) m_animations.Remove(idx); return allOk; diff --git a/OpenSim/Region/CoreModules/Framework/InventoryAccess/InventoryAccessModule.cs b/OpenSim/Region/CoreModules/Framework/InventoryAccess/InventoryAccessModule.cs index e8ad0f25b3..94782f912e 100644 --- a/OpenSim/Region/CoreModules/Framework/InventoryAccess/InventoryAccessModule.cs +++ b/OpenSim/Region/CoreModules/Framework/InventoryAccess/InventoryAccessModule.cs @@ -277,6 +277,20 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess remoteClient.SendAlertMessage("Script saved"); } + else if ((CustomInventoryType)item.InvType == CustomInventoryType.AnimationSet) + { + AnimationSet animSet = new AnimationSet(data); + if (!animSet.Validate(x => { + int perms = m_Scene.InventoryService.GetAssetPermissions(remoteClient.AgentId, x); + int required = (int)(PermissionMask.Transfer | PermissionMask.Copy); + if ((perms & required) != required) + return false; + return true; + })) + { + data = animSet.ToBytes(); + } + } AssetBase asset = CreateAsset(item.Name, item.Description, (sbyte)item.AssetType, data, remoteClient.AgentId.ToString());