/*
* SWFDumpActionScript.java
* @Author Oleg Gorobets
* Created: 30.08.2007
* CVS-ID: $Id:
*************************************************************************/
package com.uxebu.swfparser.dump;
import com.jswiff.SWFDocument;
import com.jswiff.swfrecords.tags.DefineButton2;
import com.jswiff.swfrecords.tags.DefineSprite;
import com.jswiff.swfrecords.tags.DoAction;
import com.jswiff.swfrecords.tags.DoInitAction;
import com.jswiff.swfrecords.tags.PlaceObject2;
import com.jswiff.swfrecords.tags.ShowFrame;
import com.jswiff.swfrecords.tags.Tag;
import com.uxebu.swfparser.dump.assets.AssetManager;
import com.uxebu.swfparser.dump.generators.CodeGenerator;
import com.uxebu.swfparser.dump.generators.DefineButton2Generator;
import com.uxebu.swfparser.dump.generators.DoActionGenerator;
import com.uxebu.swfparser.dump.generators.DoRootMovieActionGenerator;
import com.uxebu.swfparser.dump.generators.DoInitActionGenerator;
import com.uxebu.swfparser.dump.generators.PlaceObject2Generator;
import com.uxebu.swfparser.dump.output.ConsoleWriter;
import com.uxebu.swfparser.dump.output.FileWriter;
import com.uxebu.swfparser.dump.output.Writer;
import org.apache.log4j.Logger;
import org.swfparser.ActionBlockContext;
import java.util.List;
import java.io.File;
public class ActionScriptDump
{
private static Logger logger = Logger.getLogger(ActionScriptDump.class);
protected SWFDocument doc;
protected Writer writer;
public ActionScriptDump(Writer writer, AssetManager assetManager, String fileName)
{
this(writer, assetManager.getSWFFile(fileName));
}
public ActionScriptDump(Writer writer, SWFDocument swfDocument)
{
this.writer = writer;
this.doc = swfDocument;
}
public static void main(String[] args) {
String outputDir = System.getProperty("output", "");
Writer writer;
boolean isOutputDirectoryGiven = !outputDir.equals("");
if (isOutputDirectoryGiven) {
writer = new FileWriter(outputDir);
} else {
writer = new ConsoleWriter();
}
File inputFile = new File(args[0]);
AssetManager assetManager = new AssetManager(inputFile.getParent());
new ActionScriptDump(writer, assetManager.getSWFFile(inputFile.getName())).process();
}
public void process()
{
List<Tag> tags = doc.getTags();
ActionBlockContext context = new ActionBlockContext(writer);
context.setDocument(doc);
processTags(context, tags);
}
public void processTags(ActionBlockContext context, List<Tag> tags)
{
context.setTagNum(0);
for (Tag tag : tags)
{
context.setTag(tag);
generateShowFrame(context);
generateDefineButton2(context);
generateDoInitAction(context);
generateDoAction(context);
generateDoPlaceObject2(context);
if (context.getTag() instanceof DefineSprite)
{
DefineSprite defineSprite = (DefineSprite) context.getTag();
List<Tag> controlTags = defineSprite.getControlTags();
ActionBlockContext newContext = new ActionBlockContext(writer);
newContext.setParentContext(context);
//newContext.setFrameNum(context.getFrameNum());
newContext.setDocument(context.getDocument());
processTags(newContext, controlTags);
}
context.setTagNum(context.getTagNum() + 1);
}
}
private void generateDoPlaceObject2(ActionBlockContext context)
{
if (context.getTag() instanceof PlaceObject2)
{
CodeGenerator generator = new PlaceObject2Generator(writer);
generator.generate(context);
}
}
private void generateDoInitAction(ActionBlockContext context)
{
if (context.getTag() instanceof DoInitAction)
{
CodeGenerator generator = new DoInitActionGenerator(writer);
generator.generate(context);
}
}
private void generateShowFrame(ActionBlockContext context)
{
if (context.getTag() instanceof ShowFrame)
{
context.setFrameNum(context.getFrameNum()+1);
}
}
private void generateDoAction(ActionBlockContext context)
{
if (context.getTag() instanceof DoAction)
{
CodeGenerator generator;
if (context.getParentContext() != null)
{
generator = new DoActionGenerator(writer);
}
else
{
generator = new DoRootMovieActionGenerator(writer);
}
generator.generate(context);
}
}
private void generateDefineButton2(ActionBlockContext context)
{
if (context.getTag() instanceof DefineButton2)
{
CodeGenerator generator = new DefineButton2Generator(writer);
generator.generate(context);
}
}
/*
protected void processActions(ActionBlockContext context, ActionBlockReader actionBlock)
{
StatementBlock statementBlock = CodeUtil.getStatementBlockReader();
ExecutionContext executionContext = CodeUtil.getExecutionContext();
executionContext.setTag(context.getTag());
executionContext.setFrameNumber(context.getFrameNum());
statementBlock.setExecutionContext(executionContext);
List<Operation> operations;
try
{
statementBlock.read(actionBlock.getActions());
operations = statementBlock.getOperations();
}
catch (StatementBlockException e)
{
logger.error("Error reading action block.", e);
operations = new ArrayList<Operation>();
operations.add(new ByteCodeOperation(actionBlock.getData()));
}
processOperations(context, operations);
}
protected void processOperations(ActionBlockContext context, List<Operation> operations)
{
StringBuffer block = new StringBuffer();
block.append("(function() {\n");
block.append(context.getDumpString());
block.append("\n");
block.append(" return function() {\n");
for (Operation op : operations)
{
String endOfStatement = CodeUtil.endOfStatement(op);
String writeOp = op.getStringValue(0) + endOfStatement + "\n";
block.append(" " + writeOp);
}
block.append(" };\n");
block.append("})();\n");
if (context.getParentContext() != null && operations.size() > 0)
{
if (context.getParentContext().getTag() instanceof DefineSprite)
{
int characterId = ((DefineSprite) context.getParentContext().getTag()).getCharacterId();
writer.addSprite(characterId, context.getFrameNum(), block.toString());
}
}
}
@Override
protected void processNonActionTag(TagContext context)
{
} */
}