void ModifyEntry( BlubbZipFile workFile, BlubbUpdate 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( BlubbZipFile workFile, BlubbUpdate 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 BlubbZipException( "Entry size/stream size mismatch" ); } } workFile.WriteLocalEntryHeader( update ); long dataStart = workFile.baseStream_.Position; using( Stream output = workFile.GetOutputStream( update.OutEntry ) ) { CopyBytes( update, output, source, sourceStreamLength, true ); } long dataEnd = workFile.baseStream_.Position; update.OutEntry.CompressedSize = dataEnd - dataStart; if( ( update.OutEntry.Flags & (int)GeneralBitFlags.Descriptor ) == (int)GeneralBitFlags.Descriptor ) { BlubbZipHelperStream helper = new BlubbZipHelperStream( workFile.baseStream_ ); helper.WriteDataDescriptor( update.OutEntry ); } } } else { workFile.WriteLocalEntryHeader( update ); update.OutEntry.CompressedSize = 0; } }