Files

109 lines
3.3 KiB
C#
Raw Permalink Normal View History

2013-04-28 11:25:37 +01:00
using System;
using System.IO;
2013-04-07 10:58:58 +01:00
using System.Linq;
using SharpCompress.IO;
namespace SharpCompress.Common.SevenZip
{
internal class SevenZipFilePart : FilePart
{
private CompressionType? type;
2013-04-28 11:25:37 +01:00
private Stream stream;
private ArchiveDatabase database;
2013-04-07 10:58:58 +01:00
2013-04-28 11:25:37 +01:00
internal SevenZipFilePart(Stream stream, ArchiveDatabase database, int index, CFileItem fileEntry)
2013-04-07 10:58:58 +01:00
{
2013-04-28 11:25:37 +01:00
this.stream = stream;
this.database = database;
Index = index;
2013-04-07 10:58:58 +01:00
Header = fileEntry;
2013-04-28 11:25:37 +01:00
if (Header.HasStream)
{
Folder = database.Folders[database.FileIndexToFolderIndexMap[index]];
}
2013-04-07 10:58:58 +01:00
}
internal Stream BaseStream { get; private set; }
2013-04-28 11:25:37 +01:00
internal CFileItem Header { get; private set; }
internal CFolder Folder { get; private set; }
internal int Index { get; private set; }
2013-04-07 10:58:58 +01:00
internal override string FilePartName
{
get { return Header.Name; }
}
2013-04-28 11:25:37 +01:00
internal override Stream GetRawStream()
{
return null;
}
internal override Stream GetCompressedStream()
2013-04-07 10:58:58 +01:00
{
if (!Header.HasStream)
{
return null;
}
2013-04-28 11:25:37 +01:00
var folderStream = database.GetFolderStream(stream, Folder, null);
int firstFileIndex = database.FolderStartFileIndex[database.Folders.IndexOf(Folder)];
int skipCount = Index - firstFileIndex;
long skipSize = 0;
for (int i = 0; i < skipCount; i++)
2013-04-07 10:58:58 +01:00
{
2013-04-28 11:25:37 +01:00
skipSize += database.Files[firstFileIndex + i].Size;
2013-04-07 10:58:58 +01:00
}
2013-04-28 11:25:37 +01:00
if (skipSize > 0)
{
folderStream.Skip(skipSize);
}
return new ReadOnlySubStream(folderStream, Header.Size);
}
2013-04-07 10:58:58 +01:00
public CompressionType CompressionType
{
get
{
if (type == null)
{
2013-04-28 11:25:37 +01:00
type = GetCompression();
2013-04-07 10:58:58 +01:00
}
return type.Value;
}
}
2013-04-28 11:25:37 +01:00
//copied from DecoderRegistry
2013-04-28 12:32:55 +01:00
private const uint k_Copy = 0x0;
private const uint k_Delta = 3;
private const uint k_LZMA2 = 0x21;
private const uint k_LZMA = 0x030101;
private const uint k_PPMD = 0x030401;
private const uint k_BCJ = 0x03030103;
private const uint k_BCJ2 = 0x0303011B;
private const uint k_Deflate = 0x040108;
private const uint k_BZip2 = 0x040202;
2013-04-28 11:25:37 +01:00
internal CompressionType GetCompression()
{
var coder = Folder.Coders.First();
switch (coder.MethodId.Id)
{
case k_LZMA:
case k_LZMA2:
{
return CompressionType.LZMA;
}
case k_PPMD:
{
return CompressionType.PPMd;
}
case k_BZip2:
{
return CompressionType.BZip2;
}
default:
throw new NotImplementedException();
}
}
2013-04-07 10:58:58 +01:00
}
2013-04-28 12:32:55 +01:00
}