fix sevenZip parser exception with LZMA BCJ2 format archives,

see http://mantis.tokeek.de/view.php?id=641
+ sanitize some type cast's in modified sevenZip lib
pull/46/head
reger 9 years ago
parent c2a88d53ab
commit 5b07f3473e

Binary file not shown.

@ -6,8 +6,8 @@ import Common.IntVector;
public class BindInfo { public class BindInfo {
public Vector Coders = new Vector(); public Vector<CoderStreamsInfo> Coders = new Vector();
public Vector BindPairs = new Vector(); public Vector<BindPair> BindPairs = new Vector();
public IntVector InStreams = new IntVector(); public IntVector InStreams = new IntVector();
public IntVector OutStreams = new IntVector(); public IntVector OutStreams = new IntVector();

@ -9,13 +9,15 @@ import SevenZip.ICompressCoder2;
import SevenZip.ICompressCoder; import SevenZip.ICompressCoder;
import SevenZip.ICompressSetOutStreamSize; import SevenZip.ICompressSetOutStreamSize;
import Common.LongVector; import Common.LongVector;
import SevenZip.HRESULT;
import SevenZip.ICompressProgressInfo; import SevenZip.ICompressProgressInfo;
import SevenZip.ICompressSetInStream;
public class CoderMixer2ST implements ICompressCoder2, CoderMixer2 { public class CoderMixer2ST implements ICompressCoder2, CoderMixer2 {
final BindInfo bindInfo; final BindInfo bindInfo;
Vector coders = new Vector(); Vector<STCoderInfo> coders = new Vector();
int mainCoderIndex; int mainCoderIndex;
public CoderMixer2ST(BindInfo bindInfo) { public CoderMixer2ST(BindInfo bindInfo) {
@ -29,12 +31,12 @@ public class CoderMixer2ST implements ICompressCoder2, CoderMixer2 {
public void AddCoder2(ICompressCoder2 coder, boolean isMain) { public void AddCoder2(ICompressCoder2 coder, boolean isMain) {
AddCoderCommon(isMain); AddCoderCommon(isMain);
((STCoderInfo)coders.lastElement()).Coder2 = coder; coders.lastElement().Coder2 = coder;
} }
public void AddCoder(ICompressCoder coder, boolean isMain) { public void AddCoder(ICompressCoder coder, boolean isMain) {
AddCoderCommon(isMain); AddCoderCommon(isMain);
((STCoderInfo)coders.lastElement()).Coder = coder; coders.lastElement().Coder = coder;
} }
public void ReInit() { public void ReInit() {
@ -42,22 +44,70 @@ public class CoderMixer2ST implements ICompressCoder2, CoderMixer2 {
public void SetCoderInfo(int coderIndex, LongVector inSizes, LongVector outSizes) { public void SetCoderInfo(int coderIndex, LongVector inSizes, LongVector outSizes) {
// _coders[coderIndex].SetCoderInfo(inSizes, outSizes); // _coders[coderIndex].SetCoderInfo(inSizes, outSizes);
((STCoderInfo)coders.get(coderIndex)).SetCoderInfo(inSizes, outSizes); coders.get(coderIndex).SetCoderInfo(inSizes, outSizes);
} }
public OutputStream GetOutStream( public int GetInStream(
Vector outStreams, Vector<InputStream> inStreams,
// Object useless_outSizes, // const UInt64 **outSizes, //Object useless_inSizes, // const UInt64 **inSizes,
int streamIndex) { int streamIndex,
return null; InputStream [] inStreamRes) {
} java.io.InputStream seqInStream;
int i;
for(i = 0; i < bindInfo.InStreams.size(); i++)
if (bindInfo.InStreams.get(i) == streamIndex) {
seqInStream = inStreams.get(i);
inStreamRes[0] = seqInStream; // seqInStream.Detach();
return HRESULT.S_OK;
}
int binderIndex = bindInfo.FindBinderForInStream(streamIndex);
if (binderIndex < 0)
return HRESULT.E_INVALIDARG;
int tmp1[] = new int[2]; // TBD
//int tmp2 [] = new int[1]; // TBD
tmp1 = bindInfo.FindOutStream(bindInfo.BindPairs.get(binderIndex).OutIndex);
// , tmp1 /* coderIndex */ , tmp2 /* coderStreamIndex */ );
int coderIndex = tmp1[0], coderStreamIndex = tmp1[0];
CoderInfo coder = coders.get(coderIndex);
if (coder.Coder == null)
return HRESULT.E_NOTIMPL;
seqInStream = (java.io.InputStream)coder.Coder; // coder.Coder.QueryInterface(IID_ISequentialInStream, &seqInStream);
if (seqInStream == null)
return HRESULT.E_NOTIMPL;
int startIndex = bindInfo.GetCoderInStreamIndex(coderIndex);
if (coder.Coder == null)
return HRESULT.E_NOTIMPL;
ICompressSetInStream setInStream = (ICompressSetInStream)coder.Coder; // coder.Coder.QueryInterface(IID_ICompressSetInStream, &setInStream);
if (setInStream == null)
return HRESULT.E_NOTIMPL;
if (coder.NumInStreams > 1)
return HRESULT.E_NOTIMPL;
for (i = 0; i < (int)coder.NumInStreams; i++) {
InputStream [] tmp = new java.io.InputStream[1];
int res = GetInStream(inStreams, /*useless_inSizes,*/ startIndex + i, tmp /* &seqInStream2 */ );
if (res != HRESULT.S_OK) return res;
InputStream seqInStream2 = tmp[0];
setInStream.SetInStream(seqInStream2);
//if (res != HRESULT.S_OK) return res;
}
inStreamRes[0] = seqInStream; // seqInStream.Detach();
return HRESULT.S_OK;
}
public void Code( public void Code(
Vector inStreams, Vector<InputStream> inStreams,
Object useless_inSizes, // const UInt64 ** inSizes , //Object useless_inSizes, // const UInt64 ** inSizes ,
int numInStreams, int numInStreams,
Vector outStreams, Vector<OutputStream> outStreams,
Object useless_outSizes, // const UInt64 ** /* outSizes */, //Object useless_outSizes, // const UInt64 ** /* outSizes */,
int numOutStreams, int numOutStreams,
ICompressProgressInfo progress) throws IOException { ICompressProgressInfo progress) throws IOException {
if (numInStreams != bindInfo.InStreams.size() || numOutStreams != bindInfo.OutStreams.size()) if (numInStreams != bindInfo.InStreams.size() || numOutStreams != bindInfo.OutStreams.size())
@ -66,14 +116,14 @@ public class CoderMixer2ST implements ICompressCoder2, CoderMixer2 {
// Find main coder // Find main coder
int mainCoderIndex = -1; int mainCoderIndex = -1;
for (int i=0; i<coders.size(); i++) for (int i=0; i<coders.size(); i++)
if (((STCoderInfo)coders.get(i)).IsMain) { if ((coders.get(i)).IsMain) {
mainCoderIndex = i; mainCoderIndex = i;
break; break;
} }
if (mainCoderIndex < 0) if (mainCoderIndex < 0)
for (int i=0; i<coders.size(); i++) for (int i=0; i<coders.size(); i++)
if (((STCoderInfo)coders.get(i)).NumInStreams > 1) { if ((coders.get(i)).NumInStreams > 1) {
if (mainCoderIndex >= 0) // TODO: description, what exactly is not implemented if (mainCoderIndex >= 0) // TODO: description, what exactly is not implemented
throw new IOException("not implemented"); throw new IOException("not implemented");
mainCoderIndex = i; mainCoderIndex = i;
@ -84,16 +134,26 @@ public class CoderMixer2ST implements ICompressCoder2, CoderMixer2 {
// _mainCoderIndex = 0; // _mainCoderIndex = 0;
// _mainCoderIndex = _coders.Size() - 1; // _mainCoderIndex = _coders.Size() - 1;
CoderInfo mainCoder = (STCoderInfo)coders.get(mainCoderIndex); CoderInfo mainCoder = coders.get(mainCoderIndex);
Vector seqInStreams = new Vector(); // CObjectVector< CMyComPtr<ISequentialInStream> > Vector<InputStream> seqInStreams = new Vector(); // CObjectVector< CMyComPtr<ISequentialInStream> >
int startInIndex = bindInfo.GetCoderInStreamIndex(mainCoderIndex); int startInIndex = bindInfo.GetCoderInStreamIndex(mainCoderIndex);
// this original (from J7Zip 4.43a) replaces blows loop, as with LZMA BCJ2 format seqInStreams.size() is incorrect (array out of index) with modified code
for (int i = 0; i < (int)mainCoder.NumInStreams; i++) {
java.io.InputStream tmp [] = new java.io.InputStream[1];
int res = GetInStream(inStreams, /*useless_inSizes,*/ startInIndex + i, tmp /* &seqInStream */ );
if (res != HRESULT.S_OK) return;
java.io.InputStream seqInStream = tmp[0];
seqInStreams.add(seqInStream);
}
/* --- replaced by above ---
for (int i=0; i<mainCoder.NumInStreams; i++) for (int i=0; i<mainCoder.NumInStreams; i++)
for (int j=0; j<bindInfo.InStreams.size(); j++) for (int j=0; j<bindInfo.InStreams.size(); j++)
if (bindInfo.InStreams.get(j) == startInIndex + i) if (bindInfo.InStreams.get(j) == startInIndex + i)
seqInStreams.add(inStreams.get(j)); seqInStreams.add(inStreams.get(j));
*/
Vector seqOutStreams = new Vector(); // CObjectVector< CMyComPtr<ISequentialOutStream> > Vector<OutputStream> seqOutStreams = new Vector(); // CObjectVector< CMyComPtr<ISequentialOutStream> >
int startOutIndex = bindInfo.GetCoderOutStreamIndex(mainCoderIndex); int startOutIndex = bindInfo.GetCoderOutStreamIndex(mainCoderIndex);
for (int i=0; i<mainCoder.NumOutStreams; i++) for (int i=0; i<mainCoder.NumOutStreams; i++)
for (int j=0; j<bindInfo.OutStreams.size(); j++) for (int j=0; j<bindInfo.OutStreams.size(); j++)
@ -102,28 +162,28 @@ public class CoderMixer2ST implements ICompressCoder2, CoderMixer2 {
for (int i=0; i<coders.size(); i++) { for (int i=0; i<coders.size(); i++) {
if (i == mainCoderIndex) continue; if (i == mainCoderIndex) continue;
CoderInfo coder = (STCoderInfo)coders.get(i); CoderInfo coder = coders.get(i);
((ICompressSetOutStreamSize)coder.Coder).SetOutStreamSize(coder.OutSizePointers.Front()); ((ICompressSetOutStreamSize)coder.Coder).SetOutStreamSize(coder.OutSizePointers.Front());
} }
if (mainCoder.Coder != null) { if (mainCoder.Coder != null) {
mainCoder.Coder.Code( mainCoder.Coder.Code(
(InputStream)seqInStreams.firstElement(), seqInStreams.firstElement(),
(OutputStream)seqOutStreams.firstElement(), seqOutStreams.firstElement(),
mainCoder.OutSizePointers.Front(), mainCoder.OutSizePointers.Front(),
progress); progress);
} else { } else {
mainCoder.Coder2.Code( mainCoder.Coder2.Code(
seqInStreams, seqInStreams,
new Long(mainCoder.InSizePointers.Front()), //new Long(mainCoder.InSizePointers.Front()),
mainCoder.NumInStreams, mainCoder.NumInStreams,
seqOutStreams, seqOutStreams,
new Long(mainCoder.OutSizePointers.Front()), //new Long(mainCoder.OutSizePointers.Front()),
mainCoder.NumOutStreams, mainCoder.NumOutStreams,
progress); progress);
} }
OutputStream stream = (OutputStream)seqOutStreams.firstElement(); OutputStream stream = seqOutStreams.firstElement();
if (stream != null) stream.flush(); if (stream != null) stream.flush();
} }

@ -17,19 +17,19 @@ public class ArchiveDB {
public static final int kNumNoIndex = 0xFFFFFFFF; public static final int kNumNoIndex = 0xFFFFFFFF;
public final LongVector PackSizes = new LongVector(); public final LongVector PackSizes = new LongVector();
public final BoolVector PackCRCsDefined = new BoolVector(); public final BoolVector PackCRCsDefined = new BoolVector();
public final IntVector PackCRCs = new IntVector(); public final IntVector PackCRCs = new IntVector();
public final IntVector NumUnPackStreamsVector = new IntVector(); public final IntVector NumUnPackStreamsVector = new IntVector();
public final Vector Files = new Vector(); public final Vector<FileItem> Files = new Vector();
public Vector Folders = new Vector(); public Vector<Folder> Folders = new Vector();
public final IntVector FolderStartPackStreamIndex = new IntVector(); public final IntVector FolderStartPackStreamIndex = new IntVector();
public final IntVector FolderStartFileIndex = new IntVector(); public final IntVector FolderStartFileIndex = new IntVector();
public final IntVector FileIndexToFolderIndexMap = new IntVector(); public final IntVector FileIndexToFolderIndexMap = new IntVector();
private final InStream inStream; private final InStream inStream;
private final InArchiveInfo ArchiveInfo = new InArchiveInfo(); private final InArchiveInfo ArchiveInfo = new InArchiveInfo();
private final LongVector PackStreamStartPositions = new LongVector(); private final LongVector PackStreamStartPositions = new LongVector();
public ArchiveDB(InStream inStream) throws IOException { public ArchiveDB(InStream inStream) throws IOException {
@ -254,7 +254,7 @@ public class ArchiveDB {
} }
private void ReadSubStreamsInfo( private void ReadSubStreamsInfo(
Vector folders, Vector<Folder> folders,
IntVector numUnPackStreamsInFolders, IntVector numUnPackStreamsInFolders,
LongVector unPackSizes, LongVector unPackSizes,
BoolVector digestsDefined, BoolVector digestsDefined,
@ -360,7 +360,7 @@ public class ArchiveDB {
type = this.inStream.ReadID(); type = this.inStream.ReadID();
assert (type == Header.NID.kUnPackInfo); assert (type == Header.NID.kUnPackInfo);
Vector folders = ReadUnPackInfo(null); Vector<Folder> folders = ReadUnPackInfo(null);
type = this.inStream.ReadID(); type = this.inStream.ReadID();
assert (type == Header.NID.kEnd); assert (type == Header.NID.kEnd);
@ -517,14 +517,14 @@ public class ArchiveDB {
streamSwitch.close(); streamSwitch.close();
} }
private Vector ReadUnPackInfo(Vector dataVector) throws IOException { private Vector<Folder> ReadUnPackInfo(Vector dataVector) throws IOException {
this.inStream.skipToAttribute(Header.NID.kFolder); this.inStream.skipToAttribute(Header.NID.kFolder);
int numFolders = this.inStream.ReadNum(); int numFolders = this.inStream.ReadNum();
StreamSwitch streamSwitch = new StreamSwitch(); StreamSwitch streamSwitch = new StreamSwitch();
streamSwitch.Set(this.inStream, dataVector); streamSwitch.Set(this.inStream, dataVector);
Vector folders = new Vector(numFolders); Vector<Folder> folders = new Vector(numFolders);
for (int i=0; i<numFolders; i++) for (int i=0; i<numFolders; i++)
folders.add(GetNextFolderItem()); folders.add(GetNextFolderItem());
streamSwitch.close(); streamSwitch.close();
@ -532,7 +532,7 @@ public class ArchiveDB {
this.inStream.skipToAttribute(Header.NID.kCodersUnPackSize); this.inStream.skipToAttribute(Header.NID.kCodersUnPackSize);
for (int i=0; i<numFolders; i++) { for (int i=0; i<numFolders; i++) {
Folder folder = (Folder)folders.get(i); Folder folder = folders.get(i);
int numOutStreams = folder.GetNumOutStreams(); int numOutStreams = folder.GetNumOutStreams();
folder.UnPackSizes.Reserve(numOutStreams); folder.UnPackSizes.Reserve(numOutStreams);
for (int j=0; j<numOutStreams; j++) { for (int j=0; j<numOutStreams; j++) {
@ -548,7 +548,7 @@ public class ArchiveDB {
IntVector crcs = new IntVector(); IntVector crcs = new IntVector();
crcs = this.inStream.ReadHashDigests(numFolders, crcsDefined); crcs = this.inStream.ReadHashDigests(numFolders, crcsDefined);
for (int i=0; i<numFolders; i++) { for (int i=0; i<numFolders; i++) {
Folder folder = (Folder)folders.get(i); Folder folder = folders.get(i);
folder.UnPackCRCDefined = crcsDefined.get(i); folder.UnPackCRCDefined = crcsDefined.get(i);
folder.UnPackCRC = crcs.get(i); folder.UnPackCRC = crcs.get(i);
} }
@ -569,7 +569,7 @@ public class ArchiveDB {
int numOutStreams = 0; int numOutStreams = 0;
for (int i=0; i<numCoders; i++) { for (int i=0; i<numCoders; i++) {
folder.Coders.add(new CoderInfo()); folder.Coders.add(new CoderInfo());
CoderInfo coder = (CoderInfo)folder.Coders.lastElement(); CoderInfo coder = folder.Coders.lastElement();
int mainByte; int mainByte;
do { do {
AltCoderInfo altCoder = new AltCoderInfo(); AltCoderInfo altCoder = new AltCoderInfo();

@ -11,9 +11,9 @@ class ArchiveDatabase {
public LongVector PackSizes = new LongVector(); public LongVector PackSizes = new LongVector();
public BoolVector PackCRCsDefined = new BoolVector(); public BoolVector PackCRCsDefined = new BoolVector();
public IntVector PackCRCs = new IntVector(); public IntVector PackCRCs = new IntVector();
public Vector Folders = new Vector(); public Vector<Folder> Folders = new Vector();
public IntVector NumUnPackStreamsVector = new IntVector(); public IntVector NumUnPackStreamsVector = new IntVector();
public Vector Files = new Vector(); public Vector<FileItem> Files = new Vector();
void Clear() { void Clear() {
PackSizes.clear(); PackSizes.clear();

@ -1,6 +1,7 @@
package SevenZip.Archive.SevenZip; package SevenZip.Archive.SevenZip;
import java.io.IOException; import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream; import java.io.OutputStream;
import java.util.Vector; import java.util.Vector;
@ -10,7 +11,6 @@ import SevenZip.ICompressFilter;
import SevenZip.ICompressProgressInfo; import SevenZip.ICompressProgressInfo;
import SevenZip.IInStream; import SevenZip.IInStream;
import SevenZip.Archive.Common.BindPair;
import SevenZip.Archive.Common.CoderMixer2ST; import SevenZip.Archive.Common.CoderMixer2ST;
import SevenZip.Archive.Common.FilterCoder; import SevenZip.Archive.Common.FilterCoder;
@ -94,7 +94,7 @@ public class Decoder {
} }
for (i=0; i<folderInfo.Coders.size(); i++) { for (i=0; i<folderInfo.Coders.size(); i++) {
CoderInfo coderInfo = (CoderInfo)folderInfo.Coders.get(i); CoderInfo coderInfo = folderInfo.Coders.get(i);
AltCoderInfo altCoderInfo = (AltCoderInfo)coderInfo.AltCoders.firstElement(); AltCoderInfo altCoderInfo = (AltCoderInfo)coderInfo.AltCoders.firstElement();
if (coderInfo.IsSimpleCoder()) { if (coderInfo.IsSimpleCoder()) {
@ -128,7 +128,7 @@ public class Decoder {
private void setCoderMixerCommonInfos(Folder folderInfo, LongVector packSizes) { private void setCoderMixerCommonInfos(Folder folderInfo, LongVector packSizes) {
int packStreamIndex = 0, unPackStreamIndex = 0; int packStreamIndex = 0, unPackStreamIndex = 0;
for (int i=0; i<folderInfo.Coders.size(); i++) { for (int i=0; i<folderInfo.Coders.size(); i++) {
CoderInfo coderInfo = (CoderInfo)folderInfo.Coders.get(i); CoderInfo coderInfo = folderInfo.Coders.get(i);
int numInStreams = coderInfo.NumInStreams; int numInStreams = coderInfo.NumInStreams;
int numOutStreams = coderInfo.NumOutStreams; int numOutStreams = coderInfo.NumOutStreams;
LongVector packSizesPointers = new LongVector(); // CRecordVector<const UInt64 *> LongVector packSizesPointers = new LongVector(); // CRecordVector<const UInt64 *>
@ -145,7 +145,7 @@ public class Decoder {
final int bindPairIndex = folderInfo.FindBindPairForInStream(packStreamIndex); final int bindPairIndex = folderInfo.FindBindPairForInStream(packStreamIndex);
final int index; final int index;
if (bindPairIndex >= 0) { if (bindPairIndex >= 0) {
index = ((BindPair)folderInfo.BindPairs.get(bindPairIndex)).OutIndex; index = (folderInfo.BindPairs.get(bindPairIndex)).OutIndex;
packSizesPointer = folderInfo.UnPackSizes.get(index); packSizesPointer = folderInfo.UnPackSizes.get(index);
} else { } else {
index = folderInfo.FindPackStreamArrayIndex(packStreamIndex); index = folderInfo.FindPackStreamArrayIndex(packStreamIndex);
@ -172,7 +172,7 @@ public class Decoder {
ICompressProgressInfo compressProgress ICompressProgressInfo compressProgress
) throws IOException { ) throws IOException {
final Vector inStreams = folderInfo.getInStreams( final Vector<InputStream> inStreams = folderInfo.getInStreams(
inStream, inStream,
startPos, startPos,
packSizes, packSizes,
@ -203,10 +203,10 @@ public class Decoder {
this._mixerCoderSTSpec.Code( this._mixerCoderSTSpec.Code(
inStreams, inStreams,
null, //null,
inStreams.size(), inStreams.size(),
outStreams, outStreams,
null, //null,
1, 1,
compressProgress); compressProgress);
} }

@ -15,8 +15,8 @@ import SevenZip.Archive.Common.CoderStreamsInfo;
public class Folder { public class Folder {
public Vector Coders = new Vector(); public Vector<CoderInfo> Coders = new Vector();
public Vector BindPairs = new Vector(); public Vector<BindPair> BindPairs = new Vector();
public IntVector PackStreams = new IntVector(); public IntVector PackStreams = new IntVector();
public LongVector UnPackSizes = new LongVector(); public LongVector UnPackSizes = new LongVector();
int UnPackCRC; int UnPackCRC;
@ -37,14 +37,14 @@ public class Folder {
public int FindBindPairForInStream(int inStreamIndex) { public int FindBindPairForInStream(int inStreamIndex) {
for(int i = 0; i < BindPairs.size(); i++) for(int i = 0; i < BindPairs.size(); i++)
if (((BindPair)BindPairs.get(i)).InIndex == inStreamIndex) if ((BindPairs.get(i)).InIndex == inStreamIndex)
return i; return i;
return -1; return -1;
} }
public int FindBindPairForOutStream(int outStreamIndex) { public int FindBindPairForOutStream(int outStreamIndex) {
for(int i = 0; i < BindPairs.size(); i++) for(int i = 0; i < BindPairs.size(); i++)
if (((BindPair)BindPairs.get(i)).OutIndex == outStreamIndex) if ((BindPairs.get(i)).OutIndex == outStreamIndex)
return i; return i;
return -1; return -1;
} }
@ -59,7 +59,7 @@ public class Folder {
public int GetNumOutStreams() { public int GetNumOutStreams() {
int result = 0; int result = 0;
for (int i = 0; i < Coders.size(); i++) for (int i = 0; i < Coders.size(); i++)
result += ((CoderInfo)Coders.get(i)).NumOutStreams; result += (Coders.get(i)).NumOutStreams;
return result; return result;
} }
@ -82,14 +82,14 @@ public class Folder {
for (int i = 0; i < this.BindPairs.size(); i++) { for (int i = 0; i < this.BindPairs.size(); i++) {
BindPair bindPair = new BindPair(); BindPair bindPair = new BindPair();
bindPair.InIndex = ((BindPair)this.BindPairs.get(i)).InIndex; bindPair.InIndex = (this.BindPairs.get(i)).InIndex;
bindPair.OutIndex = ((BindPair)this.BindPairs.get(i)).OutIndex; bindPair.OutIndex = (this.BindPairs.get(i)).OutIndex;
bindInfo.BindPairs.add(bindPair); bindInfo.BindPairs.add(bindPair);
} }
int outStreamIndex = 0; int outStreamIndex = 0;
for (int i = 0; i < this.Coders.size(); i++) { for (int i = 0; i < this.Coders.size(); i++) {
CoderStreamsInfo coderStreamsInfo = new CoderStreamsInfo(); CoderStreamsInfo coderStreamsInfo = new CoderStreamsInfo();
CoderInfo coderInfo = (CoderInfo)this.Coders.get(i); CoderInfo coderInfo = this.Coders.get(i);
coderStreamsInfo.NumInStreams = coderInfo.NumInStreams; coderStreamsInfo.NumInStreams = coderInfo.NumInStreams;
coderStreamsInfo.NumOutStreams = coderInfo.NumOutStreams; coderStreamsInfo.NumOutStreams = coderInfo.NumOutStreams;
bindInfo.Coders.add(coderStreamsInfo); bindInfo.Coders.add(coderStreamsInfo);

@ -48,7 +48,7 @@ public class Handler implements IInArchive {
if (numItems == 0) if (numItems == 0)
return; return;
Vector extractFolderInfoVector = new Vector(); Vector<ExtractFolderInfo> extractFolderInfoVector = new Vector();
for (int ii = 0; ii < numItems; ii++) { for (int ii = 0; ii < numItems; ii++) {
int ref2Index = allFilesMode ? ii : indices[ii]; int ref2Index = allFilesMode ? ii : indices[ii];
@ -61,15 +61,15 @@ public class Handler implements IInArchive {
continue; continue;
} }
if (extractFolderInfoVector.isEmpty() || if (extractFolderInfoVector.isEmpty() ||
folderIndex != ((ExtractFolderInfo)extractFolderInfoVector.lastElement()).FolderIndex) { folderIndex != (extractFolderInfoVector.lastElement()).FolderIndex) {
extractFolderInfoVector.add(new ExtractFolderInfo(ArchiveDB.kNumNoIndex, folderIndex)); extractFolderInfoVector.add(new ExtractFolderInfo(ArchiveDB.kNumNoIndex, folderIndex));
Folder folderInfo = (Folder)database.Folders.get(folderIndex); Folder folderInfo = database.Folders.get(folderIndex);
long unPackSize = folderInfo.GetUnPackSize(); long unPackSize = folderInfo.GetUnPackSize();
importantTotalUnPacked += unPackSize; importantTotalUnPacked += unPackSize;
((ExtractFolderInfo)extractFolderInfoVector.lastElement()).UnPackSize = unPackSize; extractFolderInfoVector.lastElement().UnPackSize = unPackSize;
} }
ExtractFolderInfo efi = (ExtractFolderInfo)extractFolderInfoVector.lastElement(); ExtractFolderInfo efi = extractFolderInfoVector.lastElement();
int startIndex = database.FolderStartFileIndex.get(folderIndex); // CNum int startIndex = database.FolderStartFileIndex.get(folderIndex); // CNum
for (int index = efi.ExtractStatuses.size(); index <= fileIndex - startIndex; index++) for (int index = efi.ExtractStatuses.size(); index <= fileIndex - startIndex; index++)
@ -84,7 +84,7 @@ public class Handler implements IInArchive {
long totalFolderUnPacked; long totalFolderUnPacked;
for (int i = 0; i < extractFolderInfoVector.size(); i++, currentImportantTotalUnPacked += totalFolderUnPacked) { for (int i = 0; i < extractFolderInfoVector.size(); i++, currentImportantTotalUnPacked += totalFolderUnPacked) {
ExtractFolderInfo efi = (ExtractFolderInfo)extractFolderInfoVector.get(i); ExtractFolderInfo efi = extractFolderInfoVector.get(i);
totalFolderUnPacked = efi.UnPackSize; totalFolderUnPacked = efi.UnPackSize;
extractCallback.SetCompleted(currentImportantTotalUnPacked); extractCallback.SetCompleted(currentImportantTotalUnPacked);
@ -103,7 +103,7 @@ public class Handler implements IInArchive {
continue; continue;
int folderIndex = efi.FolderIndex; // CNum int folderIndex = efi.FolderIndex; // CNum
Folder folderInfo = (Folder)this._database.Folders.get(folderIndex); Folder folderInfo = this._database.Folders.get(folderIndex);
LocalProgress localProgressSpec = new LocalProgress(extractCallback, false); LocalProgress localProgressSpec = new LocalProgress(extractCallback, false);
@ -203,10 +203,10 @@ public class Handler implements IInArchive {
private String getMethods(int index2) { private String getMethods(int index2) {
int folderIndex = _database.FileIndexToFolderIndexMap.get(index2); int folderIndex = _database.FileIndexToFolderIndexMap.get(index2);
if (folderIndex != ArchiveDB.kNumNoIndex) { if (folderIndex != ArchiveDB.kNumNoIndex) {
Folder folderInfo = (Folder)_database.Folders.get(folderIndex); Folder folderInfo = _database.Folders.get(folderIndex);
StringBuffer methodsString = new StringBuffer(); StringBuffer methodsString = new StringBuffer();
for (int i = folderInfo.Coders.size() - 1; i >= 0; i--) { for (int i = folderInfo.Coders.size() - 1; i >= 0; i--) {
CoderInfo coderInfo = (CoderInfo)folderInfo.Coders.get(i); CoderInfo coderInfo = folderInfo.Coders.get(i);
if (methodsString.length() > 0) if (methodsString.length() > 0)
methodsString.append(' '); methodsString.append(' ');

@ -33,11 +33,11 @@ public class BCJ2_x86_Decoder implements ICompressCoder2 {
// } // }
void CodeReal( void CodeReal(
Vector inStreams, Vector<InputStream> inStreams,
Object useless1, // const UInt64 ** /* inSizes */, //Object useless1, // const UInt64 ** /* inSizes */,
int numInStreams, int numInStreams,
Vector outStreams, Vector<OutputStream> outStreams,
Object useless2, // const UInt64 ** /* outSizes */, //Object useless2, // const UInt64 ** /* outSizes */,
int numOutStreams, int numOutStreams,
ICompressProgressInfo progress) throws java.io.IOException { ICompressProgressInfo progress) throws java.io.IOException {
@ -50,11 +50,11 @@ public class BCJ2_x86_Decoder implements ICompressCoder2 {
_rangeDecoder.Create(1 << 20); _rangeDecoder.Create(1 << 20);
_outStream.Create(1 << 16); _outStream.Create(1 << 16);
_mainInStream.SetStream((InputStream)inStreams.get(0)); _mainInStream.SetStream(inStreams.get(0));
_callStream.SetStream((InputStream)inStreams.get(1)); _callStream.SetStream(inStreams.get(1));
_jumpStream.SetStream((InputStream)inStreams.get(2)); _jumpStream.SetStream(inStreams.get(2));
_rangeDecoder.SetStream((InputStream)inStreams.get(3)); _rangeDecoder.SetStream(inStreams.get(3));
_outStream.SetStream((OutputStream)outStreams.get(0)); _outStream.SetStream(outStreams.get(0));
_mainInStream.Init(); _mainInStream.Init();
_callStream.Init(); _callStream.Init();
@ -154,17 +154,17 @@ public class BCJ2_x86_Decoder implements ICompressCoder2 {
} }
public void Code( public void Code(
Vector inStreams, // ISequentialInStream **inStreams, Vector<InputStream> inStreams, // ISequentialInStream **inStreams,
Object useless_inSizes, // const UInt64 ** /* inSizes */, //Object useless_inSizes, // const UInt64 ** /* inSizes */,
int numInStreams, int numInStreams,
Vector outStreams, // ISequentialOutStream **outStreams Vector<OutputStream> outStreams, // ISequentialOutStream **outStreams
Object useless_outSizes, // const UInt64 ** /* outSizes */, //Object useless_outSizes, // const UInt64 ** /* outSizes */,
int numOutStreams, int numOutStreams,
ICompressProgressInfo progress) throws java.io.IOException { ICompressProgressInfo progress) throws java.io.IOException {
try { try {
CodeReal(inStreams, useless_inSizes, numInStreams, CodeReal(inStreams, /*useless_inSizes,*/ numInStreams,
outStreams, useless_outSizes,numOutStreams, progress); outStreams, /*useless_outSizes,*/ numOutStreams, progress);
} catch(java.io.IOException e) { } catch(java.io.IOException e) {
throw e; throw e;
} finally { } finally {

@ -1,16 +1,18 @@
package SevenZip; package SevenZip;
import java.io.IOException; import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.Vector; import java.util.Vector;
public interface ICompressCoder2 { public interface ICompressCoder2 {
public void Code( public void Code(
Vector inStreams, Vector<InputStream> inStreams,
Object useless1, // const UInt64 ** /* inSizes */, //Object useless1, // const UInt64 ** /* inSizes */,
int numInStreams, int numInStreams,
Vector outStreams, Vector<OutputStream> outStreams,
Object useless2, // const UInt64 ** /* outSizes */, //Object useless2, // const UInt64 ** /* outSizes */,
int numOutStreams, int numOutStreams,
ICompressProgressInfo progress) throws IOException; ICompressProgressInfo progress) throws IOException;

@ -1,7 +1,9 @@
package SevenZip; package SevenZip;
import java.io.InputStream;
public interface ICompressSetInStream { public interface ICompressSetInStream {
public void SetInStream(java.io.InputStream inStream); public void SetInStream(InputStream inStream);
public void ReleaseInStream() throws java.io.IOException ; public void ReleaseInStream() throws java.io.IOException ;
} }

Loading…
Cancel
Save