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); }
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); }