From 3ea76e3131203f6a553d5a540d5d28aa5ca3f74a Mon Sep 17 00:00:00 2001
From: Melanie Thielker
Date: Sat, 27 Sep 2014 02:30:01 +0200
Subject: 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(-)

(limited to 'OpenSim')

diff --git a/OpenSim/Framework/AnimationSet.cs b/OpenSim/Framework/AnimationSet.cs
index c5ab634..e81d978 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<int, UUID> m_animations = new Dictionary<int, UUID>();
-
-        public UUID AnimationAt(int index)
-        {
-            if (m_animations.ContainsKey(index))
-                return m_animations[index];
-            return UUID.Zero;
-        }
-
-        public void SetAnimation(int index, UUID animation)
+        private Dictionary<string, UUID> m_animations = new Dictionary<string, UUID>();
+        public AnimationSet(Byte[] data)
         {
-            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<string, UUID> 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<int> badAnims = new List<int>();
+            if (m_parseError)
+                return false;
+
+            List<string> badAnims = new List<string>();
 
             bool allOk = true;
-            foreach (KeyValuePair<int, UUID> kvp in m_animations)
+            foreach (KeyValuePair<string, UUID> 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 e8ad0f2..94782f9 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());
-- 
cgit v1.1


From f60139cb918833711ac6d1b4df66c0507db0515d Mon Sep 17 00:00:00 2001
From: Melanie Thielker
Date: Sat, 27 Sep 2014 21:17:56 +0200
Subject: Reinstate the part of the id theft protection that was lost in a long
 ago merge

---
 .../AssetTransaction/AgentAssetsTransactions.cs      | 20 ++++++++++++++++++++
 1 file changed, 20 insertions(+)

(limited to 'OpenSim')

diff --git a/OpenSim/Region/CoreModules/Agent/AssetTransaction/AgentAssetsTransactions.cs b/OpenSim/Region/CoreModules/Agent/AssetTransaction/AgentAssetsTransactions.cs
index 1e14f45..96c7e8c 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);
         }
     }
-- 
cgit v1.1


From dbc0dfa606b7a344e1b7daf3653c360656f9b319 Mon Sep 17 00:00:00 2001
From: Melanie Thielker
Date: Sat, 27 Sep 2014 22:18:43 +0200
Subject: Also fetch and store old asset for animation sets

---
 .../CoreModules/Agent/AssetTransaction/AgentAssetsTransactions.cs   | 6 ++++--
 1 file changed, 4 insertions(+), 2 deletions(-)

(limited to 'OpenSim')

diff --git a/OpenSim/Region/CoreModules/Agent/AssetTransaction/AgentAssetsTransactions.cs b/OpenSim/Region/CoreModules/Agent/AssetTransaction/AgentAssetsTransactions.cs
index 96c7e8c..1a19585 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)
-- 
cgit v1.1