2 Shows the structure of a swf file
4 Part of the swftools package.
6 Copyright (c) 2001 Matthias Kramm <kramm@quiss.org>
8 This file is distributed under the GPL, see file COPYING for details */
12 #ifdef HAVE_SYS_STAT_H
18 #ifdef HAVE_SYS_TYPES_H
19 #include <sys/types.h>
27 #include "../lib/rfxswf.h"
28 #include "../lib/args.h"
32 /* idtab stores the ids which are defined in the file. This allows us
33 to detect errors in the file. (i.e. ids which are defined more than
41 struct options_t options[] =
54 int args_callback_option(char*name,char*val)
56 if(!strcmp(name, "V")) {
57 printf("swfdump - part of %s %s\n", PACKAGE, VERSION);
60 else if(name[0]=='a') {
64 else if(name[0]=='e') {
68 else if(name[0]=='X') {
72 else if(name[0]=='Y') {
76 else if(name[0]=='r') {
81 printf("Unknown option: -%s\n", name);
86 int args_callback_longoption(char*name,char*val)
88 return args_long2shortoption(options, name, val);
90 void args_callback_usage(char*name)
92 printf("Usage: %s [-a] file.swf\n", name);
93 printf("-h , --help\t\t\t Print help and exit\n");
94 printf("-e , --html\t\t\t Create a html embedding the file (simple, but useful)\n");
95 printf("-X , --width\t\t\t Prints out a string of the form \"-X width\"\n");
96 printf("-Y , --height\t\t\t Prints out a string of the form \"-Y height\"\n");
97 printf("-r , --rate\t\t\t Prints out a string of the form \"-r rate\"\n");
98 printf("-a , --action\t\t\t Disassemble action tags\n");
99 printf("-V , --version\t\t\t Print program version and exit\n");
101 int args_callback_command(char*name,char*val)
104 fprintf(stderr, "Only one file allowed. You supplied at least two. (%s and %s)\n",
112 char* testfunc(char*str)
114 printf("%s: %s\n", what, str);
118 int main (int argc,char ** argv)
129 memset(idtab,0,65536);
131 processargs(argc, argv);
135 fprintf(stderr, "You must supply a filename.\n");
139 f = open(filename,O_RDONLY);
143 perror("Couldn't open file: ");
146 if FAILED(swf_ReadSWF(f,&swf))
148 fprintf(stderr, "%s is not a valid SWF file or contains errors.\n",filename);
155 if(statbuf.st_size != swf.FileSize)
156 fprintf(stderr, "Error: Real Filesize (%d) doesn't match header Filesize (%d)",
157 statbuf.st_size, swf.FileSize);
162 xsize = (swf.movieSize.xmax-swf.movieSize.xmin)/20;
163 ysize = (swf.movieSize.ymax-swf.movieSize.ymin)/20;
167 printf("-X %d", xsize);
173 printf("-Y %d", ysize);
179 printf("-r %d", swf.frameRate*100/256);
186 printf("<OBJECT CLASSID=\"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000\"\n"
189 " CODEBASE=\"http://active.macromedia.com/flash5/cabs/swflash.cab#version=%d,0,0,0\">\n"
190 " <PARAM NAME=\"MOVIE\" VALUE=\"%s\">\n"
191 " <PARAM NAME=\"PLAY\" VALUE=\"true\">\n"
192 " <PARAM NAME=\"LOOP\" VALUE=\"true\">\n"
193 " <PARAM NAME=\"QUALITY\" VALUE=\"high\">\n"
194 " <EMBED SRC=\"%s\" WIDTH=\"%d\" HEIGHT=\"%d\"\n"
195 " PLAY=\"true\" LOOP=\"true\" QUALITY=\"high\"\n"
196 " PLUGINSPAGE=\"http://www.macromedia.com/shockwave/download/index.cgi?P1_Prod_Version=ShockwaveFlash\">\n"
198 "</OBJECT>\n", xsize, ysize, swf.fileVersion, filename, filename, xsize, ysize);
201 printf("[HEADER] File version: %d\n", swf.fileVersion);
202 printf("[HEADER] File size: %ld\n", swf.fileSize);
203 printf("[HEADER] Frame rate: %f\n",swf.frameRate/256.0);
204 printf("[HEADER] Frame count: %d\n",swf.frameCount);
205 printf("[HEADER] Movie width: %.3f\n",(swf.movieSize.xmax-swf.movieSize.xmin)/20.0);
206 printf("[HEADER] Movie height: %.3f\n",(swf.movieSize.ymax-swf.movieSize.ymin)/20.0);
211 char*name = swf_TagGetName(tag);
213 fprintf(stderr, "Error: Unknown tag:0x%03x\n", tag->id);
217 printf("[%03x] %9ld %s%s", tag->id, tag->len, prefix, swf_TagGetName(tag));
219 if(swf_isDefiningTag(tag)) {
220 U16 id = swf_GetDefineID(tag);
221 printf(" defines id %04x", id);
223 fprintf(stderr, "Error: Id %04x is defined more than once.\n", id);
226 else if(tag->id == ST_PLACEOBJECT ||
227 tag->id == ST_PLACEOBJECT2) {
228 printf(" places id %04x at depth %04x", swf_GetPlaceID(tag), swf_GetDepth(tag));
230 printf(" name \"%s\"",swf_GetName(tag));
232 else if(tag->id == ST_REMOVEOBJECT) {
233 printf(" removes id %04x from depth %04x", swf_GetPlaceID(tag), swf_GetDepth(tag));
235 else if(tag->id == ST_REMOVEOBJECT2) {
236 printf(" removes object from depth %04x", swf_GetDepth(tag));
241 if(tag->id == ST_DEFINESPRITE) {
242 sprintf(prefix, " ");
244 else if(tag->id == ST_END) {
247 else if(tag->id == ST_DOACTION && action) {
250 sprintf(myprefix, " %s", prefix);
252 actions = swf_GetActions(tag);
254 swf_DumpActions(actions, myprefix);
257 ActionEnumerateURLs(actions, testfunc);
259 ActionEnumerateStrings(actions, testfunc);
261 ActionEnumerateTargets(actions, testfunc);*/