/// <summary> /// Extracts the raw data for a resource. /// </summary> /// <param name="resource">The resource.</param> /// <param name="outStream">The stream to write the extracted data to.</param> /// <exception cref="System.ArgumentException">Thrown if the output stream is not open for writing.</exception> /// <exception cref="System.InvalidOperationException">Thrown if the file containing the resource has not been loaded.</exception> public void Extract(ResourceReference resource, Stream outStream) { if (resource == null) throw new ArgumentNullException("resource"); if (!outStream.CanWrite) throw new ArgumentException("The output stream is not open for writing", "outStream"); var cache = GetCache(resource); using (var stream = cache.File.OpenRead()) cache.Cache.Decompress(stream, resource.Index, resource.CompressedSize, outStream); }
public ResourceSerializationContext(ResourceReference resource) { _resource = resource; }
/// <summary> /// Replaces the raw data for a resource. /// </summary> /// <param name="resource">The resource whose data should be replaced. On success, the reference will be adjusted to account for the new data.</param> /// <param name="dataStream">The stream to read the new data from.</param> /// <exception cref="System.ArgumentException">Thrown if the input stream is not open for reading.</exception> public void Replace(ResourceReference resource, Stream dataStream) { if (resource == null) throw new ArgumentNullException("resource"); if (!dataStream.CanRead) throw new ArgumentException("The input stream is not open for reading", "dataStream"); var cache = GetCache(resource); using (var stream = cache.File.Open(FileMode.Open, FileAccess.ReadWrite)) { var dataSize = (int)(dataStream.Length - dataStream.Position); var data = new byte[dataSize]; dataStream.Read(data, 0, dataSize); var compressedSize = cache.Cache.Compress(stream, resource.Index, data); resource.CompressedSize = compressedSize; resource.DecompressedSize = (uint)dataSize; resource.LocationFlags &= ~(ResourceLocationFlags.UseChecksum | ResourceLocationFlags.UseChecksum2); } }
private LoadedCache GetCache(ResourceReference resource) { LoadedCache cache; if (!_loadedCaches.TryGetValue(resource.GetLocation(), out cache)) throw new InvalidOperationException("The requested resource is located in " + resource.GetLocation() + ", but the corresponding cache file has not been loaded."); return cache; }