/* * FilteredSWFReader.java * @Author Oleg Gorobets * Created: 03.09.2007 * CVS-ID: $Id: *************************************************************************/ package com.jswiff; import java.io.InputStream; import java.util.HashSet; import java.util.Set; import org.apache.log4j.Logger; import com.jswiff.swfrecords.SWFHeader; import com.jswiff.swfrecords.tags.MalformedTag; import com.jswiff.swfrecords.tags.Tag; import com.jswiff.swfrecords.tags.TagConstants; import com.jswiff.swfrecords.tags.TagHeader; import com.jswiff.swfrecords.tags.TagReaderImpl; import com.jswiff.swfrecords.tags.UnknownTag; public abstract class FilteredSWFReader extends SWFReader { private static Logger logger = Logger.getLogger(FilteredSWFReader.class); protected static final int DO_SKIP = 1; protected static final int DO_PARSE = 2; protected static final int DO_WRITE_AS_IS = 3; public FilteredSWFReader(InputStream stream) { super(stream); } protected abstract int getTagAction(TagHeader tagHeader); @Override public void read() { preProcess(); SWFHeader header; try { header = new SWFHeader(bitStream); } catch (Exception e) { // invoke error processing processHeaderReadError(e); return; // without header we cannot do anything... } processHeader(header); do { // we check this because of an OpenOffice export bug // (END tag written as a UI8 (00)instead of an UI16 (00 00)) if ((header.getFileLength() - bitStream.getOffset()) < 2) { break; } TagHeader tagHeader = null; try { tagHeader = TagReaderImpl.getInstance().readTagHeader(bitStream); } catch (Exception e) { processTagHeaderReadError(e); break; // cannot continue without tag header } processTagHeader(tagHeader); Tag tag = null; byte[] tagData = null; // added int tagAction = getTagAction(tagHeader); // added end. try { tagData = TagReaderImpl.getInstance().readTagData(bitStream, tagHeader); switch (tagAction) { case DO_SKIP: logger.debug("Skipping tag "+tagHeader.getCode()); break; case DO_PARSE: logger.debug("Parsing tag "+tagHeader.getCode()); tag = new TagReaderImpl().readTag(tagHeader, tagData, header.getVersion(), japanese); break; case DO_WRITE_AS_IS: logger.debug("Writing AS-IS tag "+tagHeader.getCode()); tag = new UnknownTag(tagHeader.getCode(),tagData); tag.setForceLongHeader(tagHeader.isLong()); break; } if (tag!=null && tag.getCode() == TagConstants.END) { break; } } catch (Exception e) { // invoke error processing if (processTagReadError(tagHeader, tagData, e)) { break; } tag = new MalformedTag(tagHeader, tagData, e); } if (tag!=null) { processTag(tag, bitStream.getOffset()); } } while (true); postProcess(); try { bitStream.close(); } catch (Exception e) { // empty on purpose - don't need to propagate errors which occur // while closing } } protected Set<Integer> convertStringToSet(String tags) { Set<Integer> set = new HashSet<Integer>(); String[] tokens = tags.split(","); for(int j=0;j<tokens.length;j++) { logger.debug("tokens[j]="+tokens[j]); tokens[j] = tokens[j].trim(); if (tokens[j].indexOf("-")>0) { String[] tagBoundaries = tokens[j].split("-"); String left = tagBoundaries[0]; String right = tagBoundaries[1]; int leftTagNum = Integer.valueOf(left); int rightTagNum = Integer.valueOf(right); logger.debug("leftTagNum="+leftTagNum+",rightTagNum="+rightTagNum); for (int k=leftTagNum;k<=rightTagNum;k++) { logger.debug("Tag added:"+k); set.add(k); } } else if (tokens[j].length()>0) { logger.debug("Tag added:"+Integer.valueOf(tokens[j])); set.add(Integer.valueOf(tokens[j])); } } return set; } }