/* * * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ package org.apache.flex.swf; import java.util.ArrayList; import java.util.List; import org.apache.flex.swf.io.SWFWriter; import org.apache.flex.swf.tags.*; import org.apache.flex.swf.types.RGB; import org.apache.flex.swf.types.Rect; /** * The implementation of a {@code ISWF} object. Most of the ISWF properties are * encapsulated in the a {@link Header} member, but we don't expose the * {@code Header} at the interface level. */ public class SWF implements ISWF { /** * Get a {@code FileAttributes} tag from an {@code ISWF} object. * * @param swf {@code ISWF} object * @return {@code FileAttributesTag} */ public static FileAttributesTag getFileAttributes(ISWF swf) { if (swf instanceof SWF) { final SWF swfObject = (SWF)swf; return swfObject.fileAttributes; } else { final FileAttributesTag tag = new FileAttributesTag(); tag.setAS3(swf.getUseAS3()); tag.setHasMetadata(swf.hasMetadata()); tag.setUseDirectBlit(swf.getUseDirectBlit()); tag.setUseGPU(swf.getUseGPU()); tag.setUseNetwork(swf.getUseNetwork()); return tag; } } /** * Constructor. */ public SWF() { frames = new ArrayList<SWFFrame>(); header = new Header(); fileAttributes = new FileAttributesTag(); } private final List<SWFFrame> frames; private String topLevelClass; private FileAttributesTag fileAttributes; private MetadataTag metadata; private RGB backgroundColor; private Header header; private EnableDebugger2Tag enableDebugger2; private ScriptLimitsTag scriptLimits; private ProductInfoTag productInfoTag; private EnableTelemetryTag enableTelemetry; @Override public void addFrame(SWFFrame frame) { if (frame == null) throw new NullPointerException(); frames.add(frame); // Keep frame count in header sync'ed. header.setFrameCount(frames.size()); } // The following are ISWF implementation methods. @Override public RGB getBackgroundColor() { return backgroundColor; } /** * Expose the FileAttributes tag for {@link SWFWriter}. * * @return FileAttributes tag */ public FileAttributesTag getFileAttributes() { return fileAttributes; } @Override public SWFFrame getFrameAt(int index) { // If the frameCount is greater than the number of frames // then assume the header was set correctly but the frames // in the SWF were not found. Correct the model at this point // by creating the correct number of frames. for (int i = frames.size(); i <= index; i++) addFrame(new SWFFrame()); return frames.get(index); } @Override public int getFrameCount() { // disable for now, as frames.size is zero if SWFReader.buildFramesFromTags() // hasn't been called // assert header.getFrameCount() == frames.size(); return header.getFrameCount(); } @Override public float getFrameRate() { return header.getFrameRate(); } /** * Return all the frames in the SWF. * * @return frames */ public List<SWFFrame> getFrames() { return frames; } @Override public Rect getFrameSize() { return header.getFrameSize(); } public Header getHeader() { return header; } @Override public String getMetadata() { return metadata == null ? null : metadata.getMetadata(); } @Override public String getTopLevelClass() { return topLevelClass; } @Override public int getVersion() { return header.getVersion(); } @Override public boolean hasMetadata() { assert fileAttributes.isHasMetadata() == (metadata != null); return fileAttributes.isHasMetadata(); } @Override public boolean getUseAS3() { return fileAttributes.isAS3(); } @Override public void setUseAS3(boolean value) { fileAttributes.setAS3(value); } @Override public void setBackgroundColor(RGB color) { assert color != null; backgroundColor = color; } @Override public void setFrameRate(float frameRate) { header.setFrameRate(frameRate); } @Override public void setFrameSize(Rect rect) { header.setFrameSize(rect); } @Override public void setMetadata(String value) { if (value == null) { metadata = null; fileAttributes.setHasMetadata(false); } else { metadata = new MetadataTag(value); fileAttributes.setHasMetadata(true); } } @Override public void setTopLevelClass(String value) { topLevelClass = value; } @Override public void setUseDirectBlit(boolean value) { fileAttributes.setUseDirectBlit(value); } @Override public void setUseGPU(boolean value) { fileAttributes.setUseGPU(value); } @Override public void setUseNetwork(boolean value) { fileAttributes.setUseNetwork(value); } @Override public void setVersion(int version) { header.setVersion(version); } @Override public boolean getUseDirectBlit() { return fileAttributes.isUseDirectBlit(); } @Override public boolean getUseGPU() { return fileAttributes.isUseGPU(); } @Override public boolean getUseNetwork() { return fileAttributes.isUseNetwork(); } @Override public void deleteFrame(int index) { frames.remove(index); } public void setEnableDebugger2(EnableDebugger2Tag tag) { this.enableDebugger2 = tag; } @Override public EnableDebugger2Tag getEnableDebugger2() { return enableDebugger2; } @Override public void setScriptLimits(int maxRecursionDepth, int scriptTimeoutSeconds) { // TODO: check for value range and report problem or clamp value // They should both be UI16. scriptLimits = new ScriptLimitsTag(maxRecursionDepth, scriptTimeoutSeconds); } @Override public ScriptLimitsTag getScriptLimits() { return scriptLimits; } @Override public ProductInfoTag getProductInfo() { return productInfoTag; } @Override public void setProductInfo(ProductInfoTag tag) { this.productInfoTag = tag; } @Override public EnableTelemetryTag getEnableTelemetry() { return enableTelemetry; } @Override public void setEnableTelemetry(EnableTelemetryTag tag) { this.enableTelemetry = tag; } }