Issue #66 Decompress LZMA from commandline

This commit is contained in:
Jindra Petk
2013-04-20 10:46:00 +02:00
parent 9e79afd784
commit 877ba24c81
3 changed files with 31 additions and 54 deletions

View File

@@ -562,7 +562,7 @@ public class Main {
badArguments();
}
if (SWF.cws2fws(new FileInputStream(args[pos + 1]), new FileOutputStream(args[pos + 2]))) {
if (SWF.decompress(new FileInputStream(args[pos + 1]), new FileOutputStream(args[pos + 2]))) {
System.out.println("OK");
System.exit(0);
} else {

View File

@@ -320,57 +320,32 @@ public class SWF {
return true;
}
/**
* Decompress SWF file
*
* @param fis Input stream
* @param fos Output stream
*/
public static boolean cws2fws(InputStream fis, OutputStream fos) {
try {
byte swfHead[] = new byte[8];
fis.read(swfHead);
InflaterInputStream iis = new InflaterInputStream(fis);
if (swfHead[0] != 'C') {
fis.close();
return false;
}
swfHead[0] = 'F';
fos.write(swfHead);
int i;
while ((i = iis.read()) != -1) {
fos.write(i);
}
fis.close();
fos.close();
} catch (FileNotFoundException ex) {
return false;
} catch (IOException ex) {
return false;
}
return true;
}
/**
* Decompress LZMA compressed SWF file
*
* @param fis Input stream
* @param fos Output stream
*/
public static boolean zws2fws(InputStream fis, OutputStream fos) {
public static boolean decompress(InputStream fis, OutputStream fos) {
try {
byte hdr[] = new byte[3];
fis.read(hdr);
String shdr = new String(hdr);
if (!shdr.equals("ZWS")) {
return false;
}
int version = fis.read();
SWFInputStream sis = new SWFInputStream(fis, version, 4);
long fileSize = sis.readUI32();
if (shdr.equals("CWS")) {
int version = fis.read();
SWFInputStream sis = new SWFInputStream(fis, version, 4);
long fileSize = sis.readUI32();
SWFOutputStream sos = new SWFOutputStream(fos, version);
sos.write("FWS".getBytes());
sos.writeUI8(version);
sos.writeUI32(fileSize);
InflaterInputStream iis = new InflaterInputStream(fis);
int i;
while ((i = iis.read()) != -1) {
fos.write(i);
}
fis.close();
fos.close();
} else if (shdr.equals("ZWS")) {
int version = fis.read();
SWFInputStream sis = new SWFInputStream(fis, version, 4);
long fileSize = sis.readUI32();
if (hdr[0] == 'Z') {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
long outSize = sis.readUI32();
int propertiesSize = 5;
@@ -392,6 +367,8 @@ public class SWF {
sos.writeUI32(fileSize);
sos.write(baos.toByteArray());
sos.close();
fis.close();
fos.close();
} else {
return false;
}

View File

@@ -1075,8 +1075,8 @@ public class Graph {
}
if ((!onTrue.isEmpty()) && (!onFalse.isEmpty())) {
GraphTargetItem last=onTrue.get(onTrue.size() - 1);
if ((last instanceof ExitItem)||(last instanceof ContinueItem)||(last instanceof BreakItem)) {
GraphTargetItem last = onTrue.get(onTrue.size() - 1);
if ((last instanceof ExitItem) || (last instanceof ContinueItem) || (last instanceof BreakItem)) {
retw.addAll(onFalse);
onFalse.clear();
}
@@ -1146,7 +1146,7 @@ public class Graph {
addIf = ift.onTrue;
nextcmds = ift.onFalse;
loopBody.remove(loopBody.size() - 1);
}else if ((!ift.onTrue.isEmpty() && (ift.onTrue.get(ift.onTrue.size() - 1) instanceof ExitItem)) || ((ift.onTrue.size() == 1) && (ift.onTrue.get(0) instanceof ContinueItem) && (((ContinueItem) ift.onTrue.get(0)).loopId == currentLoop.id))) {
} else if ((!ift.onTrue.isEmpty() && (ift.onTrue.get(ift.onTrue.size() - 1) instanceof ExitItem)) || ((ift.onTrue.size() == 1) && (ift.onTrue.get(0) instanceof ContinueItem) && (((ContinueItem) ift.onTrue.get(0)).loopId == currentLoop.id))) {
if (ift.expression != null) {
expr = ift.expression;
if (expr instanceof LogicalOpItem) {
@@ -1155,18 +1155,18 @@ public class Graph {
expr = new NotItem(null, expr);
}
}
addIf = ift.onFalse;
addIf = ift.onFalse;
nextcmds = ift.onTrue;
loopBody.remove(loopBody.size() - 1);
if(addIf.isEmpty()){
if (addIf.isEmpty()) {
//addIf.addAll(loopBody);
}
}
}
if ((!addIf.isEmpty())&&(!(addIf.get(0) instanceof ScriptEndItem))) { // && (addIf.get(addIf.size() - 1) instanceof ContinueItem) && (((ContinueItem) addIf.get(addIf.size() - 1)).loopId == currentLoop.id)) {
if ((!addIf.isEmpty()) && (!(addIf.get(0) instanceof ScriptEndItem))) { // && (addIf.get(addIf.size() - 1) instanceof ContinueItem) && (((ContinueItem) addIf.get(addIf.size() - 1)).loopId == currentLoop.id)) {
loopBody.add(expr);
checkContinueAtTheEnd(addIf, currentLoop);
ret.add(new WhileItem(null, currentLoop, addIf,loopBody));
ret.add(new WhileItem(null, currentLoop, addIf, loopBody));
ret.addAll(nextcmds);
} else {
List<GraphTargetItem> ex = new ArrayList<GraphTargetItem>();