diff options
Diffstat (limited to '')
-rw-r--r-- | OpenSim/Region/CoreModules/Framework/EntityTransfer/HGEntityTransferModule.cs | 2 | ||||
-rw-r--r-- | OpenSim/Region/Framework/Scenes/UuidGatherer.cs | 233 |
2 files changed, 120 insertions, 115 deletions
diff --git a/OpenSim/Region/CoreModules/Framework/EntityTransfer/HGEntityTransferModule.cs b/OpenSim/Region/CoreModules/Framework/EntityTransfer/HGEntityTransferModule.cs index fc932b0..2ddb599 100644 --- a/OpenSim/Region/CoreModules/Framework/EntityTransfer/HGEntityTransferModule.cs +++ b/OpenSim/Region/CoreModules/Framework/EntityTransfer/HGEntityTransferModule.cs | |||
@@ -607,7 +607,7 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer | |||
607 | IDictionary<UUID, sbyte> ids = new Dictionary<UUID, sbyte>(); | 607 | IDictionary<UUID, sbyte> ids = new Dictionary<UUID, sbyte>(); |
608 | IteratingHGUuidGatherer uuidGatherer | 608 | IteratingHGUuidGatherer uuidGatherer |
609 | = new IteratingHGUuidGatherer(Scene.AssetService, url, ids); | 609 | = new IteratingHGUuidGatherer(Scene.AssetService, url, ids); |
610 | uuidGatherer.RecordAssetUuids(so); | 610 | uuidGatherer.AddForInspection(so); |
611 | 611 | ||
612 | while (!uuidGatherer.Complete) | 612 | while (!uuidGatherer.Complete) |
613 | { | 613 | { |
diff --git a/OpenSim/Region/Framework/Scenes/UuidGatherer.cs b/OpenSim/Region/Framework/Scenes/UuidGatherer.cs index cacacf8..2c5353f 100644 --- a/OpenSim/Region/Framework/Scenes/UuidGatherer.cs +++ b/OpenSim/Region/Framework/Scenes/UuidGatherer.cs | |||
@@ -706,7 +706,12 @@ namespace OpenSim.Region.Framework.Scenes | |||
706 | m_assetUuidsToInspect = new Queue<UUID>(); | 706 | m_assetUuidsToInspect = new Queue<UUID>(); |
707 | } | 707 | } |
708 | 708 | ||
709 | public bool AddAssetUuidToInspect(UUID uuid) | 709 | /// <summary> |
710 | /// Adds the asset uuid for inspection during the gathering process. | ||
711 | /// </summary> | ||
712 | /// <returns><c>true</c>, if for inspection was added, <c>false</c> otherwise.</returns> | ||
713 | /// <param name="uuid">UUID.</param> | ||
714 | public bool AddForInspection(UUID uuid) | ||
710 | { | 715 | { |
711 | if (m_assetUuidsToInspect.Contains(uuid)) | 716 | if (m_assetUuidsToInspect.Contains(uuid)) |
712 | return false; | 717 | return false; |
@@ -715,6 +720,107 @@ namespace OpenSim.Region.Framework.Scenes | |||
715 | 720 | ||
716 | return true; | 721 | return true; |
717 | } | 722 | } |
723 | |||
724 | /// <summary> | ||
725 | /// Gather all the asset uuids associated with a given object. | ||
726 | /// </summary> | ||
727 | /// <remarks> | ||
728 | /// This includes both those directly associated with | ||
729 | /// it (e.g. face textures) and recursively, those of items within it's inventory (e.g. objects contained | ||
730 | /// within this object). | ||
731 | /// </remarks> | ||
732 | /// <param name="sceneObject">The scene object for which to gather assets</param> | ||
733 | public void AddForInspection(SceneObjectGroup sceneObject) | ||
734 | { | ||
735 | // m_log.DebugFormat( | ||
736 | // "[ASSET GATHERER]: Getting assets for object {0}, {1}", sceneObject.Name, sceneObject.UUID); | ||
737 | |||
738 | SceneObjectPart[] parts = sceneObject.Parts; | ||
739 | for (int i = 0; i < parts.Length; i++) | ||
740 | { | ||
741 | SceneObjectPart part = parts[i]; | ||
742 | |||
743 | // m_log.DebugFormat( | ||
744 | // "[ARCHIVER]: Getting part {0}, {1} for object {2}", part.Name, part.UUID, sceneObject.UUID); | ||
745 | |||
746 | try | ||
747 | { | ||
748 | Primitive.TextureEntry textureEntry = part.Shape.Textures; | ||
749 | if (textureEntry != null) | ||
750 | { | ||
751 | // Get the prim's default texture. This will be used for faces which don't have their own texture | ||
752 | if (textureEntry.DefaultTexture != null) | ||
753 | RecordTextureEntryAssetUuids(textureEntry.DefaultTexture); | ||
754 | |||
755 | if (textureEntry.FaceTextures != null) | ||
756 | { | ||
757 | // Loop through the rest of the texture faces (a non-null face means the face is different from DefaultTexture) | ||
758 | foreach (Primitive.TextureEntryFace texture in textureEntry.FaceTextures) | ||
759 | { | ||
760 | if (texture != null) | ||
761 | RecordTextureEntryAssetUuids(texture); | ||
762 | } | ||
763 | } | ||
764 | } | ||
765 | |||
766 | // If the prim is a sculpt then preserve this information too | ||
767 | if (part.Shape.SculptTexture != UUID.Zero) | ||
768 | m_gatheredAssetUuids[part.Shape.SculptTexture] = (sbyte)AssetType.Texture; | ||
769 | |||
770 | if (part.Shape.ProjectionTextureUUID != UUID.Zero) | ||
771 | m_gatheredAssetUuids[part.Shape.ProjectionTextureUUID] = (sbyte)AssetType.Texture; | ||
772 | |||
773 | if (part.CollisionSound != UUID.Zero) | ||
774 | m_gatheredAssetUuids[part.CollisionSound] = (sbyte)AssetType.Sound; | ||
775 | |||
776 | if (part.ParticleSystem.Length > 0) | ||
777 | { | ||
778 | try | ||
779 | { | ||
780 | Primitive.ParticleSystem ps = new Primitive.ParticleSystem(part.ParticleSystem, 0); | ||
781 | if (ps.Texture != UUID.Zero) | ||
782 | m_gatheredAssetUuids[ps.Texture] = (sbyte)AssetType.Texture; | ||
783 | } | ||
784 | catch (Exception) | ||
785 | { | ||
786 | m_log.WarnFormat( | ||
787 | "[UUID GATHERER]: Could not check particle system for part {0} {1} in object {2} {3} since it is corrupt. Continuing.", | ||
788 | part.Name, part.UUID, sceneObject.Name, sceneObject.UUID); | ||
789 | } | ||
790 | } | ||
791 | |||
792 | TaskInventoryDictionary taskDictionary = (TaskInventoryDictionary)part.TaskInventory.Clone(); | ||
793 | |||
794 | // Now analyze this prim's inventory items to preserve all the uuids that they reference | ||
795 | foreach (TaskInventoryItem tii in taskDictionary.Values) | ||
796 | { | ||
797 | // m_log.DebugFormat( | ||
798 | // "[ARCHIVER]: Analysing item {0} asset type {1} in {2} {3}", | ||
799 | // tii.Name, tii.Type, part.Name, part.UUID); | ||
800 | |||
801 | if (!m_gatheredAssetUuids.ContainsKey(tii.AssetID)) | ||
802 | AddForInspection(tii.AssetID, (sbyte)tii.Type); | ||
803 | } | ||
804 | |||
805 | // FIXME: We need to make gathering modular but we cannot yet, since gatherers are not guaranteed | ||
806 | // to be called with scene objects that are in a scene (e.g. in the case of hg asset mapping and | ||
807 | // inventory transfer. There needs to be a way for a module to register a method without assuming a | ||
808 | // Scene.EventManager is present. | ||
809 | // part.ParentGroup.Scene.EventManager.TriggerGatherUuids(part, assetUuids); | ||
810 | |||
811 | |||
812 | // still needed to retrieve textures used as materials for any parts containing legacy materials stored in DynAttrs | ||
813 | RecordMaterialsUuids(part); | ||
814 | } | ||
815 | catch (Exception e) | ||
816 | { | ||
817 | m_log.ErrorFormat("[UUID GATHERER]: Failed to get part - {0}", e); | ||
818 | m_log.DebugFormat( | ||
819 | "[UUID GATHERER]: Texture entry length for prim was {0} (min is 46)", | ||
820 | part.Shape.TextureEntry.Length); | ||
821 | } | ||
822 | } | ||
823 | } | ||
718 | 824 | ||
719 | /// <summary> | 825 | /// <summary> |
720 | /// Gathers the next set of assets returned by the next uuid to get from the asset service. | 826 | /// Gathers the next set of assets returned by the next uuid to get from the asset service. |
@@ -804,7 +910,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
804 | } | 910 | } |
805 | } | 911 | } |
806 | 912 | ||
807 | private void RecordAssetUuids(UUID assetUuid, sbyte assetType) | 913 | private void AddForInspection(UUID assetUuid, sbyte assetType) |
808 | { | 914 | { |
809 | // Here, we want to collect uuids which require further asset fetches but mark the others as gathered | 915 | // Here, we want to collect uuids which require further asset fetches but mark the others as gathered |
810 | try | 916 | try |
@@ -813,27 +919,27 @@ namespace OpenSim.Region.Framework.Scenes | |||
813 | 919 | ||
814 | if ((sbyte)AssetType.Bodypart == assetType || (sbyte)AssetType.Clothing == assetType) | 920 | if ((sbyte)AssetType.Bodypart == assetType || (sbyte)AssetType.Clothing == assetType) |
815 | { | 921 | { |
816 | AddAssetUuidToInspect(assetUuid); | 922 | AddForInspection(assetUuid); |
817 | } | 923 | } |
818 | else if ((sbyte)AssetType.Gesture == assetType) | 924 | else if ((sbyte)AssetType.Gesture == assetType) |
819 | { | 925 | { |
820 | AddAssetUuidToInspect(assetUuid); | 926 | AddForInspection(assetUuid); |
821 | } | 927 | } |
822 | else if ((sbyte)AssetType.Notecard == assetType) | 928 | else if ((sbyte)AssetType.Notecard == assetType) |
823 | { | 929 | { |
824 | AddAssetUuidToInspect(assetUuid); | 930 | AddForInspection(assetUuid); |
825 | } | 931 | } |
826 | else if ((sbyte)AssetType.LSLText == assetType) | 932 | else if ((sbyte)AssetType.LSLText == assetType) |
827 | { | 933 | { |
828 | AddAssetUuidToInspect(assetUuid); | 934 | AddForInspection(assetUuid); |
829 | } | 935 | } |
830 | else if ((sbyte)OpenSimAssetType.Material == assetType) | 936 | else if ((sbyte)OpenSimAssetType.Material == assetType) |
831 | { | 937 | { |
832 | AddAssetUuidToInspect(assetUuid); | 938 | AddForInspection(assetUuid); |
833 | } | 939 | } |
834 | else if ((sbyte)AssetType.Object == assetType) | 940 | else if ((sbyte)AssetType.Object == assetType) |
835 | { | 941 | { |
836 | AddAssetUuidToInspect(assetUuid); | 942 | AddForInspection(assetUuid); |
837 | } | 943 | } |
838 | } | 944 | } |
839 | catch (Exception) | 945 | catch (Exception) |
@@ -846,107 +952,6 @@ namespace OpenSim.Region.Framework.Scenes | |||
846 | } | 952 | } |
847 | 953 | ||
848 | /// <summary> | 954 | /// <summary> |
849 | /// Gather all the asset uuids associated with a given object. | ||
850 | /// </summary> | ||
851 | /// <remarks> | ||
852 | /// This includes both those directly associated with | ||
853 | /// it (e.g. face textures) and recursively, those of items within it's inventory (e.g. objects contained | ||
854 | /// within this object). | ||
855 | /// </remarks> | ||
856 | /// <param name="sceneObject">The scene object for which to gather assets</param> | ||
857 | public void RecordAssetUuids(SceneObjectGroup sceneObject) | ||
858 | { | ||
859 | // m_log.DebugFormat( | ||
860 | // "[ASSET GATHERER]: Getting assets for object {0}, {1}", sceneObject.Name, sceneObject.UUID); | ||
861 | |||
862 | SceneObjectPart[] parts = sceneObject.Parts; | ||
863 | for (int i = 0; i < parts.Length; i++) | ||
864 | { | ||
865 | SceneObjectPart part = parts[i]; | ||
866 | |||
867 | // m_log.DebugFormat( | ||
868 | // "[ARCHIVER]: Getting part {0}, {1} for object {2}", part.Name, part.UUID, sceneObject.UUID); | ||
869 | |||
870 | try | ||
871 | { | ||
872 | Primitive.TextureEntry textureEntry = part.Shape.Textures; | ||
873 | if (textureEntry != null) | ||
874 | { | ||
875 | // Get the prim's default texture. This will be used for faces which don't have their own texture | ||
876 | if (textureEntry.DefaultTexture != null) | ||
877 | RecordTextureEntryAssetUuids(textureEntry.DefaultTexture); | ||
878 | |||
879 | if (textureEntry.FaceTextures != null) | ||
880 | { | ||
881 | // Loop through the rest of the texture faces (a non-null face means the face is different from DefaultTexture) | ||
882 | foreach (Primitive.TextureEntryFace texture in textureEntry.FaceTextures) | ||
883 | { | ||
884 | if (texture != null) | ||
885 | RecordTextureEntryAssetUuids(texture); | ||
886 | } | ||
887 | } | ||
888 | } | ||
889 | |||
890 | // If the prim is a sculpt then preserve this information too | ||
891 | if (part.Shape.SculptTexture != UUID.Zero) | ||
892 | m_gatheredAssetUuids[part.Shape.SculptTexture] = (sbyte)AssetType.Texture; | ||
893 | |||
894 | if (part.Shape.ProjectionTextureUUID != UUID.Zero) | ||
895 | m_gatheredAssetUuids[part.Shape.ProjectionTextureUUID] = (sbyte)AssetType.Texture; | ||
896 | |||
897 | if (part.CollisionSound != UUID.Zero) | ||
898 | m_gatheredAssetUuids[part.CollisionSound] = (sbyte)AssetType.Sound; | ||
899 | |||
900 | if (part.ParticleSystem.Length > 0) | ||
901 | { | ||
902 | try | ||
903 | { | ||
904 | Primitive.ParticleSystem ps = new Primitive.ParticleSystem(part.ParticleSystem, 0); | ||
905 | if (ps.Texture != UUID.Zero) | ||
906 | m_gatheredAssetUuids[ps.Texture] = (sbyte)AssetType.Texture; | ||
907 | } | ||
908 | catch (Exception) | ||
909 | { | ||
910 | m_log.WarnFormat( | ||
911 | "[UUID GATHERER]: Could not check particle system for part {0} {1} in object {2} {3} since it is corrupt. Continuing.", | ||
912 | part.Name, part.UUID, sceneObject.Name, sceneObject.UUID); | ||
913 | } | ||
914 | } | ||
915 | |||
916 | TaskInventoryDictionary taskDictionary = (TaskInventoryDictionary)part.TaskInventory.Clone(); | ||
917 | |||
918 | // Now analyze this prim's inventory items to preserve all the uuids that they reference | ||
919 | foreach (TaskInventoryItem tii in taskDictionary.Values) | ||
920 | { | ||
921 | // m_log.DebugFormat( | ||
922 | // "[ARCHIVER]: Analysing item {0} asset type {1} in {2} {3}", | ||
923 | // tii.Name, tii.Type, part.Name, part.UUID); | ||
924 | |||
925 | if (!m_gatheredAssetUuids.ContainsKey(tii.AssetID)) | ||
926 | RecordAssetUuids(tii.AssetID, (sbyte)tii.Type); | ||
927 | } | ||
928 | |||
929 | // FIXME: We need to make gathering modular but we cannot yet, since gatherers are not guaranteed | ||
930 | // to be called with scene objects that are in a scene (e.g. in the case of hg asset mapping and | ||
931 | // inventory transfer. There needs to be a way for a module to register a method without assuming a | ||
932 | // Scene.EventManager is present. | ||
933 | // part.ParentGroup.Scene.EventManager.TriggerGatherUuids(part, assetUuids); | ||
934 | |||
935 | |||
936 | // still needed to retrieve textures used as materials for any parts containing legacy materials stored in DynAttrs | ||
937 | RecordMaterialsUuids(part); | ||
938 | } | ||
939 | catch (Exception e) | ||
940 | { | ||
941 | m_log.ErrorFormat("[UUID GATHERER]: Failed to get part - {0}", e); | ||
942 | m_log.DebugFormat( | ||
943 | "[UUID GATHERER]: Texture entry length for prim was {0} (min is 46)", | ||
944 | part.Shape.TextureEntry.Length); | ||
945 | } | ||
946 | } | ||
947 | } | ||
948 | |||
949 | /// <summary> | ||
950 | /// Collect all the asset uuids found in one face of a Texture Entry. | 955 | /// Collect all the asset uuids found in one face of a Texture Entry. |
951 | /// </summary> | 956 | /// </summary> |
952 | private void RecordTextureEntryAssetUuids(Primitive.TextureEntryFace texture) | 957 | private void RecordTextureEntryAssetUuids(Primitive.TextureEntryFace texture) |
@@ -954,7 +959,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
954 | m_gatheredAssetUuids[texture.TextureID] = (sbyte)AssetType.Texture; | 959 | m_gatheredAssetUuids[texture.TextureID] = (sbyte)AssetType.Texture; |
955 | 960 | ||
956 | if (texture.MaterialID != UUID.Zero) | 961 | if (texture.MaterialID != UUID.Zero) |
957 | AddAssetUuidToInspect(texture.MaterialID); | 962 | AddForInspection(texture.MaterialID); |
958 | } | 963 | } |
959 | 964 | ||
960 | /// <summary> | 965 | /// <summary> |
@@ -962,7 +967,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
962 | /// stored in legacy format in part.DynAttrs | 967 | /// stored in legacy format in part.DynAttrs |
963 | /// </summary> | 968 | /// </summary> |
964 | /// <param name="part"></param> | 969 | /// <param name="part"></param> |
965 | public void RecordMaterialsUuids(SceneObjectPart part) | 970 | private void RecordMaterialsUuids(SceneObjectPart part) |
966 | { | 971 | { |
967 | // scan thru the dynAttrs map of this part for any textures used as materials | 972 | // scan thru the dynAttrs map of this part for any textures used as materials |
968 | OSD osdMaterials = null; | 973 | OSD osdMaterials = null; |
@@ -1053,7 +1058,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
1053 | UUID uuid = new UUID(uuidMatch.Value); | 1058 | UUID uuid = new UUID(uuidMatch.Value); |
1054 | // m_log.DebugFormat("[ARCHIVER]: Recording {0} in text", uuid); | 1059 | // m_log.DebugFormat("[ARCHIVER]: Recording {0} in text", uuid); |
1055 | 1060 | ||
1056 | AddAssetUuidToInspect(uuid); | 1061 | AddForInspection(uuid); |
1057 | } | 1062 | } |
1058 | } | 1063 | } |
1059 | 1064 | ||
@@ -1088,14 +1093,14 @@ namespace OpenSim.Region.Framework.Scenes | |||
1088 | if (CoalescedSceneObjectsSerializer.TryFromXml(xml, out coa)) | 1093 | if (CoalescedSceneObjectsSerializer.TryFromXml(xml, out coa)) |
1089 | { | 1094 | { |
1090 | foreach (SceneObjectGroup sog in coa.Objects) | 1095 | foreach (SceneObjectGroup sog in coa.Objects) |
1091 | RecordAssetUuids(sog); | 1096 | AddForInspection(sog); |
1092 | } | 1097 | } |
1093 | else | 1098 | else |
1094 | { | 1099 | { |
1095 | SceneObjectGroup sog = SceneObjectSerializer.FromOriginalXmlFormat(xml); | 1100 | SceneObjectGroup sog = SceneObjectSerializer.FromOriginalXmlFormat(xml); |
1096 | 1101 | ||
1097 | if (null != sog) | 1102 | if (null != sog) |
1098 | RecordAssetUuids(sog); | 1103 | AddForInspection(sog); |
1099 | } | 1104 | } |
1100 | } | 1105 | } |
1101 | 1106 | ||