void ModifyEntry(HfsFile workFile, HfsUpdate update) { workFile.WriteLocalEntryHeader(update); long dataStart = workFile.baseStream_.Position; // TODO: This is slow if the changes don't effect the data!! if (update.Entry.IsFile && (update.Filename != null)) { using (Stream output = workFile.GetOutputStream(update.OutEntry)) { using (Stream source = this.GetInputStream(update.Entry)) { CopyBytes(update, output, source, source.Length, true); } } } long dataEnd = workFile.baseStream_.Position; update.Entry.CompressedSize = dataEnd - dataStart; }
void AddEntry(HfsFile workFile, HfsUpdate update) { Stream source = null; if (update.Entry.IsFile) { source = update.GetSource(); if (source == null) { source = updateDataSource_.GetSource(update.Entry, update.Filename); } } if (source != null) { using (source) { long sourceStreamLength = source.Length; if (update.OutEntry.Size < 0) { update.OutEntry.Size = sourceStreamLength; } else { // Check for errant entries. if (update.OutEntry.Size != sourceStreamLength) { throw new HfsException("Entry size/stream size mismatch"); } } workFile.WriteLocalEntryHeader(update); long dataStart = workFile.baseStream_.Position; update.OutEntry.DataOffset = dataStart; using (Stream output = workFile.GetOutputStream(update.OutEntry)) { CopyBytes(update, output, source, sourceStreamLength, true); } long dataEnd = workFile.baseStream_.Position; update.OutEntry.CompressedSize = update.OutEntry.Size = dataEnd - dataStart; } } else { workFile.WriteLocalEntryHeader(update); update.OutEntry.CompressedSize = 0; } }