/*
 *  Copyright (C) 2015 Cisco Systems, Inc. and/or its affiliates. All rights reserved.
 *  Copyright (C) 2011 Sourcefire, Inc.
 *  Authors: Tomasz Kojm <tkojm@clamav.net>
 *
 *  The code is based on Flasm, command line assembler & disassembler of Flash
 *  ActionScript bytecode Copyright (c) 2001 Opaque Industries, (c) 2002-2007
 *  Igor Kogan, (c) 2005 Wang Zhen. 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 the Opaque Industries 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.
 */

#ifndef __SWF_H
#define __SWF_H

#include "others.h"

int cli_scanswf(cli_ctx *ctx);

typedef enum
{
    TAG_END = 0,
    TAG_SHOWFRAME = 1,
    TAG_DEFINESHAPE = 2,
    TAG_FREECHARACTER = 3,
    TAG_PLACEOBJECT = 4,
    TAG_REMOVEOBJECT = 5,
    TAG_DEFINEBITS = 6,
    TAG_DEFINEBUTTON = 7,
    TAG_JPEGTABLES = 8,
    TAG_SETBACKGROUNDCOLOR = 9,
    TAG_DEFINEFONT = 10,
    TAG_DEFINETEXT = 11,
    TAG_DOACTION = 12,
    TAG_DEFINEFONTINFO = 13,
    TAG_DEFINESOUND = 14,
    TAG_STARTSOUND = 15,
    TAG_STOPSOUND = 16,
    TAG_DEFINEBUTTONSOUND = 17,
    TAG_SOUNDSTREAMHEAD = 18,
    TAG_SOUNDSTREAMBLOCK = 19,
    TAG_DEFINEBITSLOSSLESS = 20,
    TAG_DEFINEBITSJPEG2 = 21,
    TAG_DEFINESHAPE2 = 22,
    TAG_DEFINEBUTTONCXFORM = 23,
    TAG_PROTECT = 24,
    TAG_PATHSAREPOSTSCRIPT = 25,
    TAG_PLACEOBJECT2 = 26,
    TAG_REMOVEOBJECT2 = 28,
    TAG_SYNCFRAME = 29,
    TAG_FREEALL = 31,
    TAG_DEFINESHAPE3 = 32,
    TAG_DEFINETEXT2 = 33,
    TAG_DEFINEBUTTON2 = 34,
    TAG_DEFINEBITSJPEG3 = 35,
    TAG_DEFINEBITSLOSSLESS2 = 36,
    TAG_DEFINEEDITTEXT = 37,
    TAG_DEFINEVIDEO = 38,
    TAG_DEFINEMOVIECLIP = 39,
    TAG_NAMECHARACTER = 40,
    TAG_SERIALNUMBER = 41,
    TAG_DEFINETEXTFORMAT = 42,
    TAG_FRAMELABEL = 43,
    TAG_SOUNDSTREAMHEAD2 = 45,
    TAG_DEFINEMORPHSHAPE = 46,
    TAG_GENFRAME = 47,
    TAG_DEFINEFONT2 = 48,
    TAG_GENCOMMAND = 49,
    TAG_DEFINECOMMANDOBJ = 50,
    TAG_CHARACTERSET = 51,
    TAG_FONTREF = 52,
    TAG_EXPORTASSETS = 56,
    TAG_IMPORTASSETS = 57,
    TAG_ENABLEDEBUGGER = 58,
    TAG_INITMOVIECLIP = 59,
    TAG_DEFINEVIDEOSTREAM = 60,
    TAG_VIDEOFRAME = 61,
    TAG_DEFINEFONTINFO2 = 62,
    TAG_DEBUGID = 63,
    TAG_ENABLEDEBUGGER2 = 64,
    TAG_SCRIPTLIMITS = 65,
    TAG_SETTABINDEX = 66,
    TAG_DEFINESHAPE4 = 67,
    TAG_FILEATTRIBUTES = 69,
    TAG_PLACEOBJECT3 = 70,
    TAG_IMPORTASSETS2 = 71,
    TAG_DEFINEFONTINFO3 = 73,
    TAG_DEFINETEXTINFO = 74,
    TAG_DEFINEFONT3 = 75,
    TAG_AVM2DECL = 76,
    TAG_METADATA = 77,
    TAG_SLICE9 = 78,
    TAG_AVM2ACTION = 82,
    TAG_DEFINESHAPE5 = 83,
    TAG_DEFINEMORPHSHAPE2 = 84,
    TAG_DEFINESFLABELDATA = 86,
    TAG_DEFINEBINARYDATA = 87,
    TAG_DEFINEFONTNAME = 88,
    TAG_STARTSOUND2 = 89,
    TAG_DEFINEBITSJPEG4 = 90,
    TAG_DEFINEFONT4 = 91,
    TAG_ENABLETELEMETRY = 93,
    TAG_DEFINEBITSPTR = 1023,
    TAG_UNKNOWN = 9999
} tag_id;

// clang-format off
static const struct tag_names_s {
    const char *name;
    tag_id  id;
} tag_names[] = {
    { "TAG_END",                 TAG_END                },
    { "TAG_SHOWFRAME",           TAG_SHOWFRAME          },
    { "TAG_DEFINESHAPE",         TAG_DEFINESHAPE        },
    { "TAG_FREECHARACTER",       TAG_FREECHARACTER      },
    { "TAG_PLACEOBJECT",         TAG_PLACEOBJECT        },
    { "TAG_REMOVEOBJECT",        TAG_REMOVEOBJECT       },
    { "TAG_DEFINEBITS",          TAG_DEFINEBITS         },
    { "TAG_DEFINEBUTTON",        TAG_DEFINEBUTTON       },
    { "TAG_JPEGTABLES",          TAG_JPEGTABLES         },
    { "TAG_SETBACKGROUNDCOLOR",  TAG_SETBACKGROUNDCOLOR },
    { "TAG_DEFINEFONT",          TAG_DEFINEFONT         },
    { "TAG_DEFINETEXT",          TAG_DEFINETEXT         },
    { "TAG_DOACTION",            TAG_DOACTION           },
    { "TAG_DEFINEFONTINFO",      TAG_DEFINEFONTINFO     },
    { "TAG_DEFINESOUND",         TAG_DEFINESOUND        },
    { "TAG_STARTSOUND",          TAG_STARTSOUND         },
    { "TAG_STOPSOUND",           TAG_STOPSOUND          },
    { "TAG_DEFINEBUTTONSOUND",   TAG_DEFINEBUTTONSOUND  },
    { "TAG_SOUNDSTREAMHEAD",     TAG_SOUNDSTREAMHEAD    },
    { "TAG_SOUNDSTREAMBLOCK",    TAG_SOUNDSTREAMBLOCK   },
    { "TAG_DEFINEBITSLOSSLESS",  TAG_DEFINEBITSLOSSLESS },
    { "TAG_DEFINEBITSJPEG2",     TAG_DEFINEBITSJPEG2    },
    { "TAG_DEFINESHAPE2",        TAG_DEFINESHAPE2       },
    { "TAG_DEFINEBUTTONCXFORM",  TAG_DEFINEBUTTONCXFORM },
    { "TAG_PROTECT",             TAG_PROTECT            },
    { "TAG_PATHSAREPOSTSCRIPT",  TAG_PATHSAREPOSTSCRIPT },
    { "TAG_PLACEOBJECT2",        TAG_PLACEOBJECT2       },
    { "TAG_REMOVEOBJECT2",       TAG_REMOVEOBJECT2      },
    { "TAG_SYNCFRAME",           TAG_SYNCFRAME          },
    { "TAG_FREEALL",             TAG_FREEALL            },
    { "TAG_DEFINESHAPE3",        TAG_DEFINESHAPE3       },
    { "TAG_DEFINETEXT2",         TAG_DEFINETEXT2        },
    { "TAG_DEFINEBUTTON2",       TAG_DEFINEBUTTON2      },
    { "TAG_DEFINEBITSJPEG3",     TAG_DEFINEBITSJPEG3    },
    { "TAG_DEFINEBITSLOSSLESS2", TAG_DEFINEBITSLOSSLESS2},
    { "TAG_DEFINEEDITTEXT",      TAG_DEFINEEDITTEXT     },
    { "TAG_DEFINEVIDEO",         TAG_DEFINEVIDEO        },
    { "TAG_DEFINEMOVIECLIP",     TAG_DEFINEMOVIECLIP    },
    { "TAG_NAMECHARACTER",       TAG_NAMECHARACTER      },
    { "TAG_SERIALNUMBER",        TAG_SERIALNUMBER       },
    { "TAG_DEFINETEXTFORMAT",    TAG_DEFINETEXTFORMAT   },
    { "TAG_FRAMELABEL",          TAG_FRAMELABEL         },
    { "TAG_SOUNDSTREAMHEAD2",    TAG_SOUNDSTREAMHEAD2   },
    { "TAG_DEFINEMORPHSHAPE",    TAG_DEFINEMORPHSHAPE   },
    { "TAG_GENFRAME",            TAG_GENFRAME           },
    { "TAG_DEFINEFONT2",         TAG_DEFINEFONT2        },
    { "TAG_GENCOMMAND",          TAG_GENCOMMAND         },
    { "TAG_DEFINECOMMANDOBJ",    TAG_DEFINECOMMANDOBJ   },
    { "TAG_CHARACTERSET",        TAG_CHARACTERSET       },
    { "TAG_FONTREF",             TAG_FONTREF            },
    { "TAG_EXPORTASSETS",        TAG_EXPORTASSETS       },
    { "TAG_IMPORTASSETS",        TAG_IMPORTASSETS       },
    { "TAG_ENABLEDEBUGGER",      TAG_ENABLEDEBUGGER     },
    { "TAG_INITMOVIECLIP",       TAG_INITMOVIECLIP      },
    { "TAG_DEFINEVIDEOSTREAM",   TAG_DEFINEVIDEOSTREAM  },
    { "TAG_VIDEOFRAME",          TAG_VIDEOFRAME         },
    { "TAG_DEFINEFONTINFO2",     TAG_DEFINEFONTINFO2    },
    { "TAG_DEBUGID",             TAG_DEBUGID            },
    { "TAG_ENABLEDEBUGGER2",     TAG_ENABLEDEBUGGER2    },
    { "TAG_SCRIPTLIMITS",        TAG_SCRIPTLIMITS       },
    { "TAG_SETTABINDEX",         TAG_SETTABINDEX        },
    { "TAG_DEFINESHAPE4",        TAG_DEFINESHAPE4       },
    { "TAG_FILEATTRIBUTES",      TAG_FILEATTRIBUTES     },
    { "TAG_PLACEOBJECT3",        TAG_PLACEOBJECT3       },
    { "TAG_IMPORTASSETS2",       TAG_IMPORTASSETS2      },
    { "TAG_DEFINEFONTINFO3",     TAG_DEFINEFONTINFO3    },
    { "TAG_DEFINETEXTINFO",      TAG_DEFINETEXTINFO     },
    { "TAG_DEFINEFONT3",         TAG_DEFINEFONT3        },
    { "TAG_AVM2DECL",            TAG_AVM2DECL           },
    { "TAG_METADATA",            TAG_METADATA           },
    { "TAG_SLICE9",              TAG_SLICE9             },
    { "TAG_AVM2ACTION",          TAG_AVM2ACTION         },
    { "TAG_DEFINESHAPE5",        TAG_DEFINESHAPE5       },
    { "TAG_DEFINEMORPHSHAPE2",   TAG_DEFINEMORPHSHAPE2  },
    { "TAG_DEFINESFLABELDATA",   TAG_DEFINESFLABELDATA  },
    { "TAG_DEFINEBINARYDATA",    TAG_DEFINEBINARYDATA   },
    { "TAG_DEFINEFONTNAME",      TAG_DEFINEFONTNAME     },
    { "TAG_STARTSOUND2",         TAG_STARTSOUND2        },
    { "TAG_DEFINEBITSJPEG4",     TAG_DEFINEBITSJPEG4    },
    { "TAG_DEFINEFONT4",         TAG_DEFINEFONT4        },
    { "TAG_ENABLETELEMETRY",     TAG_ENABLETELEMETRY    },
    { "TAG_DEFINEBITSPTR",       TAG_DEFINEBITSPTR      },
    { NULL,                      TAG_UNKNOWN            },
};
// clang-format on

// clang-format off
#define SWF_ATTR_USENETWORK                 0x01
#define SWF_ATTR_RELATIVEURLS               0x02
#define SWF_ATTR_SUPPRESSCROSSDOMAINCACHE   0x04
#define SWF_ATTR_ACTIONSCRIPT3              0x08
#define SWF_ATTR_HASMETADATA                0x10
#define SWF_ATTR_USEDIRECTBLIT              0x20
#define SWF_ATTR_USEGPU                     0x40
// clang-format on

#endif