/// <summary> /// Returns all matching FileIndexItems /// </summary> /// <param name="pfd">The File you are looking for</param> /// <returns>all FileIndexItems</returns> public PackedFileDescriptors FindFile(Interfaces.Files.IPackedFileDescriptor pfd) { ArrayList list = new ArrayList(); if (!flat) { if (index.ContainsKey(pfd.Type)) { Hashtable groups = (Hashtable)index[pfd.Type]; if (groups.ContainsKey(pfd.Group)) { Hashtable instances = (Hashtable)groups[pfd.Group]; if (instances.ContainsKey(pfd.LongInstance)) { return((PackedFileDescriptors)instances[pfd.LongInstance]); } } } return(new PackedFileDescriptors()); } else { PackedFileDescriptors ret = new PackedFileDescriptors(); foreach (Interfaces.Files.IPackedFileDescriptor i in pfds) { if (i.Equals(pfd)) { ret.Add(i); } } return(ret); } }
internal void RemoveChanged(SimPe.Interfaces.Files.IPackedFileDescriptor pfd) { if (!flat) { foreach (uint type in index.Keys) { Hashtable groups = (Hashtable)index[type]; foreach (uint group in groups.Keys) { Hashtable instances = (Hashtable)groups[group]; foreach (ulong instance in instances.Keys) { PackedFileDescriptors list = (PackedFileDescriptors)instances[instance]; for (int i = list.Count - 1; i >= 0; i--) { if (list[i] == pfd) { RemoveFromList(pfds, list[i]); list.RemoveAt(i); } } } } } } else { RemoveFromList(pfds, pfd); } }
/// <summary> /// Return a flat list of all stored pfds /// </summary> /// <returns></returns> public PackedFileDescriptors Flatten() { if (pfds == null) { pfds = new PackedFileDescriptors(); } return(pfds); }
/// <summary> /// Create a new Instance /// </summary> /// <remarks>Same as a call to FileIndex(null)</remarks> public ResourceIndex(SimPe.Interfaces.Files.IPackageFile pkg, bool flat, int capacity) { this.pkg = pkg; pfds = new PackedFileDescriptors(capacity); this.flat = true; higestoffset = 0; LoadIndex(); }
/// <summary> /// Create a clone of this Object /// </summary> /// <returns>The clone</returns> public override object Clone() { PackedFileDescriptors list = new PackedFileDescriptors(); foreach (IPackedFileDescriptor item in this) { list.Add(item); } return(list); }
/// <summary> /// Add a Filedescriptor to the Index /// </summary> /// <param name="pfd">The Descriptor</param> internal void AddIndexFromPfd(SimPe.Interfaces.Files.IPackedFileDescriptor pfd) { //pfd.Closed += new SimPe.Events.PackedFileChanged(ClosedDescriptor); if (!flat) { pfd.DescriptionChanged += new EventHandler(DescriptorChanged); } Hashtable groups = null; Hashtable instances = null; PackedFileDescriptors files = null; if (pfd.Offset + pfd.Size > higestoffset) { higestoffset = (uint)(pfd.Offset + pfd.Size); } if (!flat) { if (index.ContainsKey(pfd.Type)) { groups = (Hashtable)index[pfd.Type]; } else { groups = new Hashtable(); index[pfd.Type] = groups; } if (groups.ContainsKey(pfd.Group)) { instances = (Hashtable)groups[pfd.Group]; } else { instances = new Hashtable(); groups[pfd.Group] = instances; } if (instances.ContainsKey(pfd.LongInstance)) { files = (PackedFileDescriptors)instances[pfd.LongInstance]; } else { files = new PackedFileDescriptors(); instances[pfd.LongInstance] = files; } files.Add(pfd); } pfds.Add(pfd); }
void RemoveFromList(PackedFileDescriptors list, SimPe.Interfaces.Files.IPackedFileDescriptor pfd) { bool rem = false; for (int i = 0; i < list.Count; i++) { SimPe.Interfaces.Files.IPackedFileDescriptor p = list[i]; if (p.Equals(pfd)) { list.RemoveAt(i); rem = true; } } if (!rem) { throw new Exception("Bugger"); } }
/// <summary> /// Removes an Item from the Table /// </summary> /// <param name="pfd">The item you want to remove</param> internal PackedFileDescriptors RemoveDeleteMarkedItem() { PackedFileDescriptors list; PackedFileDescriptors removed = new PackedFileDescriptors(); if (!flat) { foreach (uint type in index.Keys) { Hashtable groups = (Hashtable)index[type]; foreach (uint group in groups.Keys) { Hashtable instances = (Hashtable)groups[group]; foreach (ulong instance in instances.Keys) { list = (PackedFileDescriptors)instances[instance]; for (int i = list.Count - 1; i >= 0; i--) { if (list[i].MarkForDelete) { pfds.Remove(list[i]); removed.Add(list[i]); list.RemoveAt(i); } } } } } } else { for (int i = this.pfds.Count - 1; i >= 0; i--) { if (pfds[i].MarkForDelete) { pfds.RemoveAt(i); } } } return(removed); }
/// <summary> /// Returns all matching FileIndexItems for the passed type /// </summary> /// <param name="type">the Type of the Files</param> /// <returns>all FileIndexItems</returns> public PackedFileDescriptors FindFile(uint type) { PackedFileDescriptors list = new PackedFileDescriptors(); if (!flat) { if (index.ContainsKey(type)) { Hashtable groups = (Hashtable)index[type]; foreach (uint group in groups.Keys) { if (groups.ContainsKey(group)) { Hashtable instances = (Hashtable)groups[group]; foreach (ulong instance in instances.Keys) { list.AddRange((PackedFileDescriptors)instances[instance]); } } } } } else { PackedFileDescriptors ret = new PackedFileDescriptors(); foreach (Interfaces.Files.IPackedFileDescriptor i in pfds) { if (i.Type == type) { ret.Add(i); } } return(ret); } return(list); }
/// <summary> /// Return all matching FileIndexItems (by Instance) /// </summary> /// <param name="group">The Group you are looking for</param> /// <param name="instance">The instance you are looking for</param> /// <returns>all FileIndexItems</returns> public PackedFileDescriptors FindFileByGroupAndInstance(uint group, ulong instance) { if (!flat) { PackedFileDescriptors list = new PackedFileDescriptors(); foreach (uint type in index.Keys) { Hashtable groups = (Hashtable)index[type]; if (groups.ContainsKey(group)) { Hashtable instances = (Hashtable)groups[group]; if (instances.ContainsKey(instance)) { list.AddRange((PackedFileDescriptors)instances[instance]); } } } //return the Result return(list); } else { PackedFileDescriptors ret = new PackedFileDescriptors(); foreach (Interfaces.Files.IPackedFileDescriptor i in pfds) { if (i.LongInstance == instance && i.Group == group) { ret.Add(i); } } return(ret); } }