private void AddEntry(ZipFile workFile, ZipUpdate 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 ZipException("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) {
var helper=new ZipHelperStream(workFile.baseStream_);
helper.WriteDataDescriptor(update.OutEntry);
}
}
} else {
workFile.WriteLocalEntryHeader(update);
update.OutEntry.CompressedSize=0;
}
}