* Change AssetGatherer method access so that only methods which are worth calling from the outside are public
							parent
							
								
									2a13e046db
								
							
						
					
					
						commit
						89f2589f6c
					
				| 
						 | 
				
			
			@ -37,6 +37,7 @@ using OpenSim.Framework;
 | 
			
		|||
using OpenSim.Framework.Communications;
 | 
			
		||||
using OpenSim.Framework.Communications.Cache;
 | 
			
		||||
using OpenSim.Region.CoreModules.World.Archiver;
 | 
			
		||||
using OpenSim.Region.Framework.Scenes;
 | 
			
		||||
 | 
			
		||||
namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver
 | 
			
		||||
{        
 | 
			
		||||
| 
						 | 
				
			
			@ -45,6 +46,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver
 | 
			
		|||
        private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);      
 | 
			
		||||
        
 | 
			
		||||
        protected TarArchiveWriter archive = new TarArchiveWriter();
 | 
			
		||||
        protected AssetGatherer m_assetGatherer;
 | 
			
		||||
        protected Dictionary<UUID, int> assetUuids = new Dictionary<UUID, int>();
 | 
			
		||||
        
 | 
			
		||||
        private InventoryArchiverModule m_module;
 | 
			
		||||
| 
						 | 
				
			
			@ -78,7 +80,8 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver
 | 
			
		|||
            m_module = module;
 | 
			
		||||
            m_userInfo = userInfo;
 | 
			
		||||
            m_invPath = invPath;
 | 
			
		||||
            m_saveStream = saveStream;             
 | 
			
		||||
            m_saveStream = saveStream;          
 | 
			
		||||
            m_assetGatherer = new AssetGatherer(m_module.CommsManager.AssetCache);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        protected void ReceivedAllAssets(IDictionary<UUID, AssetBase> assetsFound, ICollection<UUID> assetsNotFoundUuids)
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -100,7 +100,7 @@ namespace OpenSim.Region.CoreModules.World.Archiver
 | 
			
		|||
 | 
			
		||||
            foreach (SceneObjectGroup sceneObject in sceneObjects)
 | 
			
		||||
            {
 | 
			
		||||
                assetGatherer.GetSceneObjectAssetUuids(sceneObject, assetUuids);
 | 
			
		||||
                assetGatherer.GatherAssetUuids(sceneObject, assetUuids);
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            m_log.DebugFormat(
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -67,12 +67,101 @@ namespace OpenSim.Region.Framework.Scenes
 | 
			
		|||
        public AssetGatherer(IAssetCache assetCache)
 | 
			
		||||
        {
 | 
			
		||||
            m_assetCache = assetCache;
 | 
			
		||||
        }        
 | 
			
		||||
        }
 | 
			
		||||
                
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// Gather all the asset uuids associated with the asset referenced by a given uuid
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        /// 
 | 
			
		||||
        /// This includes both those directly associated with
 | 
			
		||||
        /// it (e.g. face textures) and recursively, those of items within it's inventory (e.g. objects contained
 | 
			
		||||
        /// within this object).
 | 
			
		||||
        /// 
 | 
			
		||||
        /// <param name="assetUuid">The uuid of the asset for which to gather referenced assets</param>
 | 
			
		||||
        /// <param name="assetType">The type of the asset for the uuid given</param>
 | 
			
		||||
        /// <param name="assetUuids">The assets gathered</param>        
 | 
			
		||||
        public void GatherAssetUuids(UUID assetUuid, AssetType assetType, IDictionary<UUID, int> assetUuids)
 | 
			
		||||
        {
 | 
			
		||||
            assetUuids[assetUuid] = 1;
 | 
			
		||||
 | 
			
		||||
            if (AssetType.Bodypart == assetType || AssetType.Clothing == assetType)
 | 
			
		||||
            {
 | 
			
		||||
                GetWearableAssetUuids(assetUuid, assetUuids);
 | 
			
		||||
            }
 | 
			
		||||
            else if (AssetType.LSLText == assetType)
 | 
			
		||||
            {
 | 
			
		||||
                GetScriptAssetUuids(assetUuid, assetUuids);
 | 
			
		||||
            }
 | 
			
		||||
            else if (AssetType.Object == assetType)
 | 
			
		||||
            {
 | 
			
		||||
                GetSceneObjectAssetUuids(assetUuid, assetUuids);
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// Gather all the asset uuids associated with a given object.
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        /// 
 | 
			
		||||
        /// This includes both those directly associated with
 | 
			
		||||
        /// it (e.g. face textures) and recursively, those of items within it's inventory (e.g. objects contained
 | 
			
		||||
        /// within this object).
 | 
			
		||||
        /// 
 | 
			
		||||
        /// <param name="sceneObject">The scene object for which to gather assets</param>
 | 
			
		||||
        /// <param name="assetUuids">The assets gathered</param>
 | 
			
		||||
        public void GatherAssetUuids(SceneObjectGroup sceneObject, IDictionary<UUID, int> assetUuids)
 | 
			
		||||
        {
 | 
			
		||||
            m_log.DebugFormat(
 | 
			
		||||
                "[ASSET GATHERER]: Getting assets for object {0}, {1}", sceneObject.Name, sceneObject.UUID);
 | 
			
		||||
 | 
			
		||||
            foreach (SceneObjectPart part in sceneObject.GetParts())
 | 
			
		||||
            {
 | 
			
		||||
                //m_log.DebugFormat(
 | 
			
		||||
                //    "[ARCHIVER]: Getting part {0}, {1} for object {2}", part.Name, part.UUID, sceneObject.UUID);
 | 
			
		||||
 | 
			
		||||
                try
 | 
			
		||||
                {
 | 
			
		||||
                    Primitive.TextureEntry textureEntry = part.Shape.Textures;
 | 
			
		||||
 | 
			
		||||
                    // Get the prim's default texture.  This will be used for faces which don't have their own texture
 | 
			
		||||
                    assetUuids[textureEntry.DefaultTexture.TextureID] = 1;
 | 
			
		||||
                    
 | 
			
		||||
                    // XXX: Not a great way to iterate through face textures, but there's no
 | 
			
		||||
                    // other method available to tell how many faces there actually are
 | 
			
		||||
                    //int i = 0;
 | 
			
		||||
                    foreach (Primitive.TextureEntryFace texture in textureEntry.FaceTextures)
 | 
			
		||||
                    {
 | 
			
		||||
                        if (texture != null)
 | 
			
		||||
                        {
 | 
			
		||||
                            //m_log.DebugFormat("[ARCHIVER]: Got face {0}", i++);
 | 
			
		||||
                            assetUuids[texture.TextureID] = 1;
 | 
			
		||||
                        }
 | 
			
		||||
                    }
 | 
			
		||||
                    
 | 
			
		||||
                    // If the prim is a sculpt then preserve this information too
 | 
			
		||||
                    if (part.Shape.SculptTexture != UUID.Zero)
 | 
			
		||||
                        assetUuids[part.Shape.SculptTexture] = 1;                    
 | 
			
		||||
 | 
			
		||||
                    // Now analyze this prim's inventory items to preserve all the uuids that they reference
 | 
			
		||||
                    foreach (TaskInventoryItem tii in part.TaskInventory.Values)
 | 
			
		||||
                    {
 | 
			
		||||
                        //m_log.DebugFormat("[ARCHIVER]: Analysing item asset type {0}", tii.Type);
 | 
			
		||||
 | 
			
		||||
                        if (!assetUuids.ContainsKey(tii.AssetID))
 | 
			
		||||
                            GatherAssetUuids(tii.AssetID, (AssetType)tii.Type, assetUuids);
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
                catch (Exception e)
 | 
			
		||||
                {
 | 
			
		||||
                    m_log.ErrorFormat("[ASSET GATHERER]: Failed to get part - {0}", e);
 | 
			
		||||
                    m_log.DebugFormat("[ASSET GATHERER]: Texture entry length for prim was {0} (min is 46)", part.Shape.TextureEntry.Length);
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        }         
 | 
			
		||||
        
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// The callback made when we request the asset for an object from the asset service.
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        public void AssetRequestCallback(UUID assetID, AssetBase asset)
 | 
			
		||||
        protected void AssetRequestCallback(UUID assetID, AssetBase asset)
 | 
			
		||||
        {
 | 
			
		||||
            lock (this)
 | 
			
		||||
            {
 | 
			
		||||
| 
						 | 
				
			
			@ -116,7 +205,7 @@ namespace OpenSim.Region.Framework.Scenes
 | 
			
		|||
        /// </summary>
 | 
			
		||||
        /// <param name="scriptUuid"></param>
 | 
			
		||||
        /// <param name="assetUuids">Dictionary in which to record the references</param>
 | 
			
		||||
        public void GetScriptAssetUuids(UUID scriptUuid, IDictionary<UUID, int> assetUuids)
 | 
			
		||||
        protected void GetScriptAssetUuids(UUID scriptUuid, IDictionary<UUID, int> assetUuids)
 | 
			
		||||
        {
 | 
			
		||||
            AssetBase scriptAsset = GetAsset(scriptUuid);
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -141,7 +230,7 @@ namespace OpenSim.Region.Framework.Scenes
 | 
			
		|||
        /// </summary>
 | 
			
		||||
        /// <param name="wearableAssetUuid"></param>
 | 
			
		||||
        /// <param name="assetUuids">Dictionary in which to record the references</param>
 | 
			
		||||
        public void GetWearableAssetUuids(UUID wearableAssetUuid, IDictionary<UUID, int> assetUuids)
 | 
			
		||||
        protected void GetWearableAssetUuids(UUID wearableAssetUuid, IDictionary<UUID, int> assetUuids)
 | 
			
		||||
        {
 | 
			
		||||
            AssetBase assetBase = GetAsset(wearableAssetUuid);
 | 
			
		||||
            //m_log.Debug(new System.Text.ASCIIEncoding().GetString(bodypartAsset.Data));
 | 
			
		||||
| 
						 | 
				
			
			@ -165,7 +254,7 @@ namespace OpenSim.Region.Framework.Scenes
 | 
			
		|||
        /// </summary>
 | 
			
		||||
        /// <param name="sceneObject"></param>
 | 
			
		||||
        /// <param name="assetUuids"></param>
 | 
			
		||||
        public void GetSceneObjectAssetUuids(UUID sceneObjectUuid, IDictionary<UUID, int> assetUuids)
 | 
			
		||||
        protected void GetSceneObjectAssetUuids(UUID sceneObjectUuid, IDictionary<UUID, int> assetUuids)
 | 
			
		||||
        {
 | 
			
		||||
            AssetBase objectAsset = GetAsset(sceneObjectUuid);
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -173,87 +262,8 @@ namespace OpenSim.Region.Framework.Scenes
 | 
			
		|||
            {
 | 
			
		||||
                string xml = Utils.BytesToString(objectAsset.Data);
 | 
			
		||||
                SceneObjectGroup sog = new SceneObjectGroup(xml, true);
 | 
			
		||||
                GetSceneObjectAssetUuids(sog, assetUuids);
 | 
			
		||||
                GatherAssetUuids(sog, assetUuids);
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// Get all the asset uuids associated with a given object.
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        /// 
 | 
			
		||||
        /// This includes both those directly associated with
 | 
			
		||||
        /// it (e.g. face textures) and recursively, those of items within it's inventory (e.g. objects contained
 | 
			
		||||
        /// within this object).
 | 
			
		||||
        /// 
 | 
			
		||||
        /// <param name="sceneObject">The scene object for which to gather assets</param>
 | 
			
		||||
        /// <param name="assetUuids">The assets gathered</param>
 | 
			
		||||
        public void GetSceneObjectAssetUuids(SceneObjectGroup sceneObject, IDictionary<UUID, int> assetUuids)
 | 
			
		||||
        {
 | 
			
		||||
            m_log.DebugFormat(
 | 
			
		||||
                "[ASSET GATHERER]: Getting assets for object {0}, {1}", sceneObject.Name, sceneObject.UUID);
 | 
			
		||||
 | 
			
		||||
            foreach (SceneObjectPart part in sceneObject.GetParts())
 | 
			
		||||
            {
 | 
			
		||||
                //m_log.DebugFormat(
 | 
			
		||||
                //    "[ARCHIVER]: Getting part {0}, {1} for object {2}", part.Name, part.UUID, sceneObject.UUID);
 | 
			
		||||
 | 
			
		||||
                try
 | 
			
		||||
                {
 | 
			
		||||
                    Primitive.TextureEntry textureEntry = part.Shape.Textures;
 | 
			
		||||
 | 
			
		||||
                    // Get the prim's default texture.  This will be used for faces which don't have their own texture
 | 
			
		||||
                    assetUuids[textureEntry.DefaultTexture.TextureID] = 1;
 | 
			
		||||
                    
 | 
			
		||||
                    // XXX: Not a great way to iterate through face textures, but there's no
 | 
			
		||||
                    // other method available to tell how many faces there actually are
 | 
			
		||||
                    //int i = 0;
 | 
			
		||||
                    foreach (Primitive.TextureEntryFace texture in textureEntry.FaceTextures)
 | 
			
		||||
                    {
 | 
			
		||||
                        if (texture != null)
 | 
			
		||||
                        {
 | 
			
		||||
                            //m_log.DebugFormat("[ARCHIVER]: Got face {0}", i++);
 | 
			
		||||
                            assetUuids[texture.TextureID] = 1;
 | 
			
		||||
                        }
 | 
			
		||||
                    }
 | 
			
		||||
                    
 | 
			
		||||
                    // If the prim is a sculpt then preserve this information too
 | 
			
		||||
                    if (part.Shape.SculptTexture != UUID.Zero)
 | 
			
		||||
                        assetUuids[part.Shape.SculptTexture] = 1;                    
 | 
			
		||||
 | 
			
		||||
                    // Now analyze this prim's inventory items to preserve all the uuids that they reference
 | 
			
		||||
                    foreach (TaskInventoryItem tii in part.TaskInventory.Values)
 | 
			
		||||
                    {
 | 
			
		||||
                        //m_log.DebugFormat("[ARCHIVER]: Analysing item asset type {0}", tii.Type);
 | 
			
		||||
 | 
			
		||||
                        if (!assetUuids.ContainsKey(tii.AssetID))
 | 
			
		||||
                        {
 | 
			
		||||
                            assetUuids[tii.AssetID] = 1;
 | 
			
		||||
 | 
			
		||||
                            if ((int)AssetType.Bodypart == tii.Type || ((int)AssetType.Clothing == tii.Type))
 | 
			
		||||
                            {
 | 
			
		||||
                                GetWearableAssetUuids(tii.AssetID, assetUuids);
 | 
			
		||||
                            }
 | 
			
		||||
                            else if ((int)AssetType.LSLText == tii.Type)
 | 
			
		||||
                            {
 | 
			
		||||
                                GetScriptAssetUuids(tii.AssetID, assetUuids);
 | 
			
		||||
                            }
 | 
			
		||||
                            else if ((int)AssetType.Object == tii.Type)
 | 
			
		||||
                            {
 | 
			
		||||
                                GetSceneObjectAssetUuids(tii.AssetID, assetUuids);
 | 
			
		||||
                            }
 | 
			
		||||
                            //else
 | 
			
		||||
                            //{
 | 
			
		||||
                                //m_log.DebugFormat("[ARCHIVER]: Recording asset {0} in object {1}", tii.AssetID, part.UUID);
 | 
			
		||||
                            //}
 | 
			
		||||
                        }
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
                catch (Exception e)
 | 
			
		||||
                {
 | 
			
		||||
                    m_log.ErrorFormat("[ASSET GATHERER]: Failed to get part - {0}", e);
 | 
			
		||||
                    m_log.DebugFormat("[ASSET GATHERER]: Texture entry length for prim was {0} (min is 46)", part.Shape.TextureEntry.Length);
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        }        
 | 
			
		||||
        }       
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue