Esempio n. 1
0
        public bool Run()
        {
            var manifests = new List <string>();

            foreach (string manifest in GetType().Assembly.GetManifestResourceNames())
            {
                if (manifest.StartsWith("SilverSim.Tests.Resources.Objects.") && manifest.EndsWith(".xml"))
                {
                    manifests.Add(manifest);
                }
            }

            foreach (string manifest in manifests)
            {
                m_Log.InfoFormat("Testing decoder with asset {0}", manifest);
                Stream resource = GetType().Assembly.GetManifestResourceStream(manifest);
                try
                {
                    ObjectXML.FromXml(resource, UGUI.Unknown, XmlDeserializationOptions.ReadKeyframeMotion);
                }
                catch (Exception e)
                {
                    m_Log.InfoFormat("Failed to parse asset {0}: {1}\n{2}", e.GetType().FullName, e.StackTrace, e.StackTrace.ToString());
                    return(false);
                }

                var reflist = new List <UUID>();
                resource = GetType().Assembly.GetManifestResourceStream(manifest);
                ObjectReferenceDecoder.GetReferences(resource, "", reflist);
                m_Log.InfoFormat("Found {0} references", reflist.Count);
            }

            return(true);
        }
Esempio n. 2
0
        public static UUID GenerateNextOwnerAsset(this AssetServiceInterface assetService, UUID firstLevelAssetID)
        {
            var assetIDs       = new List <UUID>();
            var replaceAssets  = new Dictionary <UUID, UUID>();
            var objectAssetIDs = new List <UUID>();

            assetIDs.Add(firstLevelAssetID);
            int pos = 0;

            while (pos < assetIDs.Count)
            {
                UUID          assetid = assetIDs[pos++];
                AssetMetadata objmeta;
                if (assetService.Metadata.TryGetValue(assetid, out objmeta))
                {
                    if (objmeta.Type == AssetType.Object)
                    {
                        if (!objectAssetIDs.Contains(assetid))
                        {
                            objectAssetIDs.Add(assetid);
                        }
                        assetIDs.AddRange(ObjectReferenceDecoder.GetReferences(assetService[assetid]));
                        if (!replaceAssets.ContainsKey(assetid))
                        {
                            replaceAssets.Add(assetid, UUID.Random);
                        }
                    }
                    else if (objmeta.Type == AssetType.Notecard)
                    {
                        if (!objectAssetIDs.Contains(assetid))
                        {
                            objectAssetIDs.Add(assetid);
                        }
                        var nc = new Notecard(assetService[assetid]);
                        foreach (NotecardInventoryItem item in nc.Inventory.Values)
                        {
                            if ((item.AssetType == AssetType.Object || item.AssetType == AssetType.Notecard) &&
                                !objectAssetIDs.Contains(item.AssetID))
                            {
                                objectAssetIDs.Add(item.AssetID);
                            }
                        }
                        assetIDs.InsertRange(0, nc.References);
                        if (!replaceAssets.ContainsKey(assetid))
                        {
                            replaceAssets.Add(assetid, UUID.Random);
                        }
                    }
                }
            }

            objectAssetIDs.Reverse();
            foreach (UUID objectid in objectAssetIDs)
            {
                AssetData data;
                AssetData newAsset;
                if (assetService.TryGetValue(objectid, out data))
                {
                    switch (data.Type)
                    {
                    case AssetType.Object:
                        List <ObjectGroup> grps = ObjectXML.FromAsset(data, UGUI.Unknown);
                        foreach (ObjectGroup grp in grps)
                        {
                            foreach (ObjectPart part in grp.Values)
                            {
                                foreach (ObjectPartInventoryItem item in part.Inventory.Values)
                                {
                                    if (item.NextOwnerAssetID == UUID.Zero)
                                    {
                                        UUID replaceAssetID;
                                        part.Inventory.SetNextOwnerAssetID(
                                            item.ID,
                                            replaceAssets.TryGetValue(item.AssetID, out replaceAssetID) ? replaceAssetID : item.AssetID);
                                    }
                                }
                            }
                        }

                        newAsset = (grps.Count == 1) ?
                                   grps[0].Asset(UGUI.Unknown, XmlSerializationOptions.AdjustForNextOwner | XmlSerializationOptions.WriteXml2) :
                                   grps.Asset(UGUI.Unknown, XmlSerializationOptions.AdjustForNextOwner | XmlSerializationOptions.WriteXml2);

                        newAsset.ID         = replaceAssets[objectid];
                        newAsset.CreateTime = data.CreateTime;
                        assetService.Store(newAsset);
                        break;

                    case AssetType.Notecard:
                        var nc = new Notecard(data);
                        foreach (NotecardInventoryItem item in nc.Inventory.Values)
                        {
                            UUID replace;
                            if (replaceAssets.TryGetValue(item.AssetID, out replace))
                            {
                                item.AssetID = replace;
                            }
                            break;
                        }
                        break;

                    default:
                        break;
                    }
                }
            }

            UUID finalAssetID;

            return(replaceAssets.TryGetValue(firstLevelAssetID, out finalAssetID) ? finalAssetID : firstLevelAssetID);
        }