/* * MovieDecoder.java * Transform * * Copyright (c) 2009-2010 Flagstone Software Ltd. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * * Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of Flagstone Software Ltd. nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ package com.flagstone.transform; import java.io.IOException; import java.util.List; import com.flagstone.transform.button.ButtonColorTransform; import com.flagstone.transform.button.ButtonSound; import com.flagstone.transform.button.DefineButton; import com.flagstone.transform.button.DefineButton2; import com.flagstone.transform.coder.Coder; import com.flagstone.transform.coder.CoderException; import com.flagstone.transform.coder.Context; import com.flagstone.transform.coder.SWFDecoder; import com.flagstone.transform.coder.SWFFactory; import com.flagstone.transform.font.DefineFont; import com.flagstone.transform.font.DefineFont2; import com.flagstone.transform.font.DefineFont3; import com.flagstone.transform.font.DefineFont4; import com.flagstone.transform.font.FontAlignment; import com.flagstone.transform.font.FontInfo; import com.flagstone.transform.font.FontInfo2; import com.flagstone.transform.font.FontName; import com.flagstone.transform.image.DefineImage; import com.flagstone.transform.image.DefineImage2; import com.flagstone.transform.image.DefineJPEGImage; import com.flagstone.transform.image.DefineJPEGImage2; import com.flagstone.transform.image.DefineJPEGImage3; import com.flagstone.transform.image.DefineJPEGImage4; import com.flagstone.transform.image.JPEGEncodingTable; import com.flagstone.transform.movieclip.DefineMovieClip; import com.flagstone.transform.movieclip.InitializeMovieClip; import com.flagstone.transform.movieclip.QuicktimeMovie; import com.flagstone.transform.shape.DefineMorphShape; import com.flagstone.transform.shape.DefineMorphShape2; import com.flagstone.transform.shape.DefineShape; import com.flagstone.transform.shape.DefineShape2; import com.flagstone.transform.shape.DefineShape3; import com.flagstone.transform.shape.DefineShape4; import com.flagstone.transform.shape.PathsArePostscript; import com.flagstone.transform.sound.DefineSound; import com.flagstone.transform.sound.SoundStreamBlock; import com.flagstone.transform.sound.SoundStreamHead; import com.flagstone.transform.sound.SoundStreamHead2; import com.flagstone.transform.sound.StartSound; import com.flagstone.transform.sound.StartSound2; import com.flagstone.transform.text.DefineText; import com.flagstone.transform.text.DefineText2; import com.flagstone.transform.text.DefineTextField; import com.flagstone.transform.text.TextSettings; import com.flagstone.transform.video.DefineVideo; import com.flagstone.transform.video.VideoFrame; /** * MovieDecoder is used to decode the different types of data structure encoded * in a movie. */ @SuppressWarnings({"PMD.ExcessiveImports", "PMD.CyclomaticComplexity", "PMD.ExcessiveMethodLength", "PMD.NcssMethodCount" }) public final class MovieDecoder implements SWFFactory<MovieTag> { /** {@inheritDoc} */ @Override public void getObject(final List<MovieTag> list, final SWFDecoder coder, final Context context) throws IOException { MovieTag obj; switch (coder.scanUnsignedShort() >> Coder.LENGTH_FIELD_SIZE) { case MovieTypes.SHOW_FRAME: obj = ShowFrame.getInstance(coder, context); break; case MovieTypes.DEFINE_SHAPE: obj = new DefineShape(coder, context); break; case MovieTypes.PLACE: obj = new Place(coder, context); break; case MovieTypes.REMOVE: obj = new Remove(coder); break; case MovieTypes.DEFINE_JPEG_IMAGE: obj = new DefineJPEGImage(coder); break; case MovieTypes.DEFINE_BUTTON: obj = new DefineButton(coder, context); break; case MovieTypes.JPEG_TABLES: obj = new JPEGEncodingTable(coder); break; case MovieTypes.SET_BACKGROUND_COLOR: obj = new Background(coder, context); break; case MovieTypes.DEFINE_FONT: obj = new DefineFont(coder); break; case MovieTypes.DEFINE_TEXT: obj = new DefineText(coder, context); break; case MovieTypes.DO_ACTION: obj = new DoAction(coder, context); break; case MovieTypes.FONT_INFO: obj = new FontInfo(coder); break; case MovieTypes.DEFINE_SOUND: obj = new DefineSound(coder); break; case MovieTypes.START_SOUND: obj = new StartSound(coder); break; case MovieTypes.SOUND_STREAM_HEAD: obj = new SoundStreamHead(coder); break; case MovieTypes.SOUND_STREAM_BLOCK: obj = new SoundStreamBlock(coder); break; case MovieTypes.BUTTON_SOUND: obj = new ButtonSound(coder); break; case MovieTypes.DEFINE_IMAGE: obj = new DefineImage(coder); break; case MovieTypes.DEFINE_JPEG_IMAGE_2: obj = new DefineJPEGImage2(coder); break; case MovieTypes.DEFINE_SHAPE_2: obj = new DefineShape2(coder, context); break; case MovieTypes.BUTTON_COLOR_TRANSFORM: obj = new ButtonColorTransform(coder, context); break; case MovieTypes.PROTECT: obj = new Protect(coder); break; case MovieTypes.FREE: obj = new Free(coder); break; case MovieTypes.PLACE_2: obj = new Place2(coder, context); break; case MovieTypes.REMOVE_2: obj = new Remove2(coder); break; case MovieTypes.DEFINE_SHAPE_3: obj = new DefineShape3(coder, context); break; case MovieTypes.DEFINE_TEXT_2: obj = new DefineText2(coder, context); break; case MovieTypes.DEFINE_BUTTON_2: obj = new DefineButton2(coder, context); break; case MovieTypes.DEFINE_JPEG_IMAGE_3: obj = new DefineJPEGImage3(coder); break; case MovieTypes.DEFINE_IMAGE_2: obj = new DefineImage2(coder); break; case MovieTypes.DEFINE_MOVIE_CLIP: obj = new DefineMovieClip(coder, context); break; case MovieTypes.FRAME_LABEL: obj = new FrameLabel(coder); break; case MovieTypes.SOUND_STREAM_HEAD_2: obj = new SoundStreamHead2(coder); break; case MovieTypes.DEFINE_MORPH_SHAPE: obj = new DefineMorphShape(coder, context); break; case MovieTypes.DEFINE_FONT_2: obj = new DefineFont2(coder, context); break; case MovieTypes.PATHS_ARE_POSTSCRIPT: obj = PathsArePostscript.getInstance(coder, context); break; case MovieTypes.DEFINE_TEXT_FIELD: obj = new DefineTextField(coder, context); break; case MovieTypes.QUICKTIME_MOVIE: obj = new QuicktimeMovie(coder); break; case MovieTypes.SERIAL_NUMBER: obj = new SerialNumber(coder); break; case MovieTypes.ENABLE_DEBUGGER: obj = new EnableDebugger(coder); break; case MovieTypes.EXPORT: obj = new Export(coder); break; case MovieTypes.IMPORT: obj = new Import(coder); break; case MovieTypes.INITIALIZE: obj = new InitializeMovieClip(coder, context); break; case MovieTypes.DEFINE_VIDEO: obj = new DefineVideo(coder); break; case MovieTypes.VIDEO_FRAME: obj = new VideoFrame(coder); break; case MovieTypes.FONT_INFO_2: obj = new FontInfo2(coder); break; case MovieTypes.ENABLE_DEBUGGER_2: obj = new EnableDebugger2(coder); break; case MovieTypes.LIMIT_SCRIPT: obj = new LimitScript(coder); break; case MovieTypes.TAB_ORDER: obj = new TabOrder(coder); break; case MovieTypes.FILE_ATTRIBUTES: obj = new MovieAttributes(coder); break; case MovieTypes.PLACE_3: obj = new Place3(coder, context); break; case MovieTypes.IMPORT_2: obj = new Import2(coder); break; case MovieTypes.FONT_ALIGNMENT: obj = new FontAlignment(coder); break; case MovieTypes.TEXT_SETTINGS: obj = new TextSettings(coder); break; case MovieTypes.DEFINE_FONT_3: obj = new DefineFont3(coder, context); break; case MovieTypes.SYMBOL: obj = new SymbolClass(coder); break; case MovieTypes.METADATA: obj = new MovieMetaData(coder); break; case MovieTypes.DEFINE_SCALING_GRID: obj = new ScalingGrid(coder); break; case MovieTypes.SCENES_AND_LABELS: obj = new ScenesAndLabels(coder); break; case MovieTypes.DO_ABC: obj = new DoABC(coder); break; case MovieTypes.DEFINE_SHAPE_4: obj = new DefineShape4(coder, context); break; case MovieTypes.DEFINE_MORPH_SHAPE_2: obj = new DefineMorphShape2(coder, context); break; case MovieTypes.DEFINE_BINARY_DATA: obj = new DefineData(coder); break; case MovieTypes.FONT_NAME: obj = new FontName(coder); break; case MovieTypes.START_SOUND_2: obj = new StartSound2(coder); break; case MovieTypes.DEFINE_JPEG_IMAGE_4: obj = new DefineJPEGImage4(coder); break; case MovieTypes.DEFINE_FONT_4: obj = new DefineFont4(coder); break; default: obj = new MovieObject(coder); break; } list.add(obj); if (coder.getDelta() != 0) { throw new CoderException(coder.getLocation(), coder.getExpected(), coder.getDelta()); } } }