Esempio n. 1
0
    private void CopyEntry(ZipFile workFile, ZipUpdate update)
    {
      workFile.WriteLocalEntryHeader(update);

      if (update.Entry.CompressedSize > 0)
      {
        const int NameLengthOffset = 26;

        var entryDataOffset = update.Entry.Offset + NameLengthOffset;

        // TODO: This wont work for SFX files!
        baseStream_.Seek(entryDataOffset, SeekOrigin.Begin);

        uint nameLength = ReadLEUshort();
        uint extraLength = ReadLEUshort();

        baseStream_.Seek(nameLength + extraLength, SeekOrigin.Current);

        CopyBytes(update, workFile.baseStream_, baseStream_, update.Entry.CompressedSize, false);
      }
      CopyDescriptorBytes(update, workFile.baseStream_, baseStream_);
    }
Esempio n. 2
0
    private static void ModifyEntry(ZipFile workFile, ZipUpdate update)
    {
      workFile.WriteLocalEntryHeader(update);
      var dataStart = workFile.baseStream_.Position;

      var dataEnd = workFile.baseStream_.Position;
      update.Entry.CompressedSize = dataEnd - dataStart;
    }
Esempio n. 3
0
    private void CopyEntryDirect(ZipFile workFile, ZipUpdate update, ref long destinationPosition)
    {
      var skipOver = false;
      if (update.Entry.Offset == destinationPosition)
      {
        skipOver = true;
      }

      if (!skipOver)
      {
        baseStream_.Position = destinationPosition;
        workFile.WriteLocalEntryHeader(update);
        destinationPosition = baseStream_.Position;
      }

      const int NameLengthOffset = 26;

      // TODO: Add base for SFX friendly handling
      var entryDataOffset = update.Entry.Offset + NameLengthOffset;

      baseStream_.Seek(entryDataOffset, SeekOrigin.Begin);

      // Clumsy way of handling retrieving the original name and extra data length for now.
      // TODO: Stop re-reading name and data length in CopyEntryDirect.
      uint nameLength = ReadLEUshort();
      uint extraLength = ReadLEUshort();

      var sourcePosition = baseStream_.Position + nameLength + extraLength;

      if (skipOver)
      {
        destinationPosition +=
          (sourcePosition - entryDataOffset) + NameLengthOffset + // Header size
          update.Entry.CompressedSize + GetDescriptorSize(update);
      }
      else
      {
        if (update.Entry.CompressedSize > 0)
        {
          CopyEntryDataDirect(update, baseStream_, false, ref destinationPosition, ref sourcePosition);
        }
        CopyDescriptorBytesDirect(update, baseStream_, ref destinationPosition, sourcePosition);
      }
    }
Esempio n. 4
0
    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, null);
        }
      }

      if (source != null)
      {
        using (source)
        {
          var 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);

          var dataStart = workFile.baseStream_.Position;

          using (var output = workFile.GetOutputStream(update.OutEntry))
          {
            CopyBytes(update, output, source, sourceStreamLength, true);
          }

          var 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;
      }
    }