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 Vector Coders = new Vector();
public Vector BindPairs = new Vector();
public Vector<CoderStreamsInfo> Coders = new Vector();
public Vector<BindPair> BindPairs = new Vector();
public IntVector InStreams = new IntVector();
public IntVector OutStreams = new IntVector();

@ -9,13 +9,15 @@ import SevenZip.ICompressCoder2;
import SevenZip.ICompressCoder;
import SevenZip.ICompressSetOutStreamSize;
import Common.LongVector;
import SevenZip.HRESULT;
import SevenZip.ICompressProgressInfo;
import SevenZip.ICompressSetInStream;
public class CoderMixer2ST implements ICompressCoder2, CoderMixer2 {
final BindInfo bindInfo;
Vector coders = new Vector();
Vector<STCoderInfo> coders = new Vector();
int mainCoderIndex;
public CoderMixer2ST(BindInfo bindInfo) {
@ -29,12 +31,12 @@ public class CoderMixer2ST implements ICompressCoder2, CoderMixer2 {
public void AddCoder2(ICompressCoder2 coder, boolean isMain) {
AddCoderCommon(isMain);
((STCoderInfo)coders.lastElement()).Coder2 = coder;
coders.lastElement().Coder2 = coder;
}
public void AddCoder(ICompressCoder coder, boolean isMain) {
AddCoderCommon(isMain);
((STCoderInfo)coders.lastElement()).Coder = coder;
coders.lastElement().Coder = coder;
}
public void ReInit() {
@ -42,22 +44,70 @@ public class CoderMixer2ST implements ICompressCoder2, CoderMixer2 {
public void SetCoderInfo(int coderIndex, LongVector inSizes, LongVector outSizes) {
// _coders[coderIndex].SetCoderInfo(inSizes, outSizes);
((STCoderInfo)coders.get(coderIndex)).SetCoderInfo(inSizes, outSizes);
coders.get(coderIndex).SetCoderInfo(inSizes, outSizes);
}
public OutputStream GetOutStream(
Vector outStreams,
// Object useless_outSizes, // const UInt64 **outSizes,
int streamIndex) {
return null;
}
public int GetInStream(
Vector<InputStream> inStreams,
//Object useless_inSizes, // const UInt64 **inSizes,
int streamIndex,
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(
Vector inStreams,
Object useless_inSizes, // const UInt64 ** inSizes ,
Vector<InputStream> inStreams,
//Object useless_inSizes, // const UInt64 ** inSizes ,
int numInStreams,
Vector outStreams,
Object useless_outSizes, // const UInt64 ** /* outSizes */,
Vector<OutputStream> outStreams,
//Object useless_outSizes, // const UInt64 ** /* outSizes */,
int numOutStreams,
ICompressProgressInfo progress) throws IOException {
if (numInStreams != bindInfo.InStreams.size() || numOutStreams != bindInfo.OutStreams.size())
@ -66,14 +116,14 @@ public class CoderMixer2ST implements ICompressCoder2, CoderMixer2 {
// Find main coder
int mainCoderIndex = -1;
for (int i=0; i<coders.size(); i++)
if (((STCoderInfo)coders.get(i)).IsMain) {
if ((coders.get(i)).IsMain) {
mainCoderIndex = i;
break;
}
if (mainCoderIndex < 0)
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
throw new IOException("not implemented");
mainCoderIndex = i;
@ -84,16 +134,26 @@ public class CoderMixer2ST implements ICompressCoder2, CoderMixer2 {
// _mainCoderIndex = 0;
// _mainCoderIndex = _coders.Size() - 1;
CoderInfo mainCoder = (STCoderInfo)coders.get(mainCoderIndex);
Vector seqInStreams = new Vector(); // CObjectVector< CMyComPtr<ISequentialInStream> >
CoderInfo mainCoder = coders.get(mainCoderIndex);
Vector<InputStream> seqInStreams = new Vector(); // CObjectVector< CMyComPtr<ISequentialInStream> >
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 j=0; j<bindInfo.InStreams.size(); j++)
if (bindInfo.InStreams.get(j) == startInIndex + i)
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);
for (int i=0; i<mainCoder.NumOutStreams; i++)
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++) {
if (i == mainCoderIndex) continue;
CoderInfo coder = (STCoderInfo)coders.get(i);
CoderInfo coder = coders.get(i);
((ICompressSetOutStreamSize)coder.Coder).SetOutStreamSize(coder.OutSizePointers.Front());
}
if (mainCoder.Coder != null) {
mainCoder.Coder.Code(
(InputStream)seqInStreams.firstElement(),
(OutputStream)seqOutStreams.firstElement(),
seqInStreams.firstElement(),
seqOutStreams.firstElement(),
mainCoder.OutSizePointers.Front(),
progress);
} else {
mainCoder.Coder2.Code(
seqInStreams,
new Long(mainCoder.InSizePointers.Front()),
//new Long(mainCoder.InSizePointers.Front()),
mainCoder.NumInStreams,
seqOutStreams,
new Long(mainCoder.OutSizePointers.Front()),
//new Long(mainCoder.OutSizePointers.Front()),
mainCoder.NumOutStreams,
progress);
}
OutputStream stream = (OutputStream)seqOutStreams.firstElement();
OutputStream stream = seqOutStreams.firstElement();
if (stream != null) stream.flush();
}

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

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

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

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

@ -48,7 +48,7 @@ public class Handler implements IInArchive {
if (numItems == 0)
return;
Vector extractFolderInfoVector = new Vector();
Vector<ExtractFolderInfo> extractFolderInfoVector = new Vector();
for (int ii = 0; ii < numItems; ii++) {
int ref2Index = allFilesMode ? ii : indices[ii];
@ -61,15 +61,15 @@ public class Handler implements IInArchive {
continue;
}
if (extractFolderInfoVector.isEmpty() ||
folderIndex != ((ExtractFolderInfo)extractFolderInfoVector.lastElement()).FolderIndex) {
folderIndex != (extractFolderInfoVector.lastElement()).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();
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
for (int index = efi.ExtractStatuses.size(); index <= fileIndex - startIndex; index++)
@ -84,7 +84,7 @@ public class Handler implements IInArchive {
long 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;
extractCallback.SetCompleted(currentImportantTotalUnPacked);
@ -103,7 +103,7 @@ public class Handler implements IInArchive {
continue;
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);
@ -203,10 +203,10 @@ public class Handler implements IInArchive {
private String getMethods(int index2) {
int folderIndex = _database.FileIndexToFolderIndexMap.get(index2);
if (folderIndex != ArchiveDB.kNumNoIndex) {
Folder folderInfo = (Folder)_database.Folders.get(folderIndex);
Folder folderInfo = _database.Folders.get(folderIndex);
StringBuffer methodsString = new StringBuffer();
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)
methodsString.append(' ');

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

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

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

Loading…
Cancel
Save