From 3ea76e3131203f6a553d5a540d5d28aa5ca3f74a Mon Sep 17 00:00:00 2001 From: Melanie Thielker Date: Sat, 27 Sep 2014 02:30:01 +0200 Subject: [PATCH 1/3] 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()); From f60139cb918833711ac6d1b4df66c0507db0515d Mon Sep 17 00:00:00 2001 From: Melanie Thielker Date: Sat, 27 Sep 2014 21:17:56 +0200 Subject: [PATCH 2/3] Reinstate the part of the id theft protection that was lost in a long ago merge --- .../AgentAssetsTransactions.cs | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/OpenSim/Region/CoreModules/Agent/AssetTransaction/AgentAssetsTransactions.cs b/OpenSim/Region/CoreModules/Agent/AssetTransaction/AgentAssetsTransactions.cs index 1e14f45c2b..96c7e8c1f7 100644 --- a/OpenSim/Region/CoreModules/Agent/AssetTransaction/AgentAssetsTransactions.cs +++ b/OpenSim/Region/CoreModules/Agent/AssetTransaction/AgentAssetsTransactions.cs @@ -172,6 +172,16 @@ namespace OpenSim.Region.CoreModules.Agent.AssetTransaction { AssetXferUploader uploader = RequestXferUploader(transactionID); + // Here we need to get the old asset to extract the + // texture UUIDs if it's a wearable. + if (item.Type == (int)AssetType.Bodypart || + item.Type == (int)AssetType.Clothing) + { + AssetBase oldAsset = m_Scene.AssetService.Get(item.AssetID.ToString()); + if (oldAsset != null) + uploader.SetOldData(oldAsset.Data); + } + uploader.RequestUpdateTaskInventoryItem(remoteClient, item); } @@ -180,6 +190,16 @@ namespace OpenSim.Region.CoreModules.Agent.AssetTransaction { AssetXferUploader uploader = RequestXferUploader(transactionID); + // Here we need to get the old asset to extract the + // texture UUIDs if it's a wearable. + if (item.AssetType == (int)AssetType.Bodypart || + item.AssetType == (int)AssetType.Clothing) + { + AssetBase oldAsset = m_Scene.AssetService.Get(item.AssetID.ToString()); + if (oldAsset != null) + uploader.SetOldData(oldAsset.Data); + } + uploader.RequestUpdateInventoryItem(remoteClient, item); } } From dbc0dfa606b7a344e1b7daf3653c360656f9b319 Mon Sep 17 00:00:00 2001 From: Melanie Thielker Date: Sat, 27 Sep 2014 22:18:43 +0200 Subject: [PATCH 3/3] Also fetch and store old asset for animation sets --- .../Agent/AssetTransaction/AgentAssetsTransactions.cs | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/OpenSim/Region/CoreModules/Agent/AssetTransaction/AgentAssetsTransactions.cs b/OpenSim/Region/CoreModules/Agent/AssetTransaction/AgentAssetsTransactions.cs index 96c7e8c1f7..1a19585eeb 100644 --- a/OpenSim/Region/CoreModules/Agent/AssetTransaction/AgentAssetsTransactions.cs +++ b/OpenSim/Region/CoreModules/Agent/AssetTransaction/AgentAssetsTransactions.cs @@ -175,7 +175,8 @@ namespace OpenSim.Region.CoreModules.Agent.AssetTransaction // Here we need to get the old asset to extract the // texture UUIDs if it's a wearable. if (item.Type == (int)AssetType.Bodypart || - item.Type == (int)AssetType.Clothing) + item.Type == (int)AssetType.Clothing || + item.Type == (int)CustomAssetType.AnimationSet) { AssetBase oldAsset = m_Scene.AssetService.Get(item.AssetID.ToString()); if (oldAsset != null) @@ -193,7 +194,8 @@ namespace OpenSim.Region.CoreModules.Agent.AssetTransaction // Here we need to get the old asset to extract the // texture UUIDs if it's a wearable. if (item.AssetType == (int)AssetType.Bodypart || - item.AssetType == (int)AssetType.Clothing) + item.AssetType == (int)AssetType.Clothing || + item.AssetType == (int)CustomAssetType.AnimationSet) { AssetBase oldAsset = m_Scene.AssetService.Get(item.AssetID.ToString()); if (oldAsset != null)