void TagEditOrCloneAction::run() { shared_ptr<ZLDialog> dialog = ZLDialogManager::Instance().createDialog(ZLResourceKey(resourceKeyName())); TagList tags; BooksUtil::collectTagsFromLibrary(tags); std::vector<std::string> names; for (TagList::const_iterator it = tags.begin(); it != tags.end(); ++it) { if (!it->isNull()) { names.push_back((*it)->fullName()); } } TagNameEntry *tagNameEntry = new TagNameEntry(names, myTag->fullName()); dialog->addOption(ZLResourceKey("name"), tagNameEntry); TagIncludeSubtagsEntry *includeSubtagsEntry = new TagIncludeSubtagsEntry(); const Library &library = Library::Instance(); if (library.hasSubtags(myTag)) { if (!library.hasBooks(myTag)) { includeSubtagsEntry->setActive(false); } dialog->addOption(ZLResourceKey("includeSubtags"), includeSubtagsEntry); } dialog->addButton(ZLDialogManager::OK_BUTTON, true); dialog->addButton(ZLDialogManager::CANCEL_BUTTON, false); if (dialog->run()) { dialog->acceptValues(); onAccept(tagNameEntry->initialValue(), includeSubtagsEntry->initialState()); } }
void FileTransfer::parseFileList( const TagList& files ) { TagList::const_iterator it = files.begin(); for( ; it != files.end(); ++it ) { File f; Tag *t = (*it)->findChild( "name" ); f.name = t ? t->cdata() : EmptyString; t = (*it)->findChild( "desc" ); f.desc = t ? t->cdata() : EmptyString; t = (*it)->findChild( "date" ); f.date = t ? t->cdata() : EmptyString; t = (*it)->findChild( "size" ); f.size = t ? atoi( t->cdata().c_str() ) : -1; t = (*it)->findChild( "range" ); if( t ) { f.range = true; f.offset = t->hasAttribute( "offset" ) ? atoi( t->findAttribute( "offset" ).c_str() ) : -1; } t = (*it)->findChild( "hash", XMLNS, XMLNS_HASHES ); if( t ) { f.hash_algo = t->findAttribute( "algo" ); f.hash = t->cdata(); } m_files.push_back( f ); } }
void CDataIO::WriteTagList(const TagList& tagList) { uint32 uCount = (uint32)tagList.size(); ASSERT( uCount <= 0xFF ); WriteByte((uint8)uCount); for (TagList::const_iterator itTagList = tagList.begin(); itTagList != tagList.end(); ++itTagList) WriteTag(*itTagList); }
void MovieClip::setupFrame(const TagList& tags, bool skipAction) { TagList::const_iterator it = tags.begin(); while( it != tags.end() ) { ITag* tag = *it; tag->setup(*this, skipAction); ++it; } }
void CDataIO::writeTagList(const TagList& tagList) { uint32 count = (uint32)tagList.size(); ASSERT( count <= 0xFF ); writeByte(count); TagList::const_iterator it; for (it = tagList.begin(); it != tagList.end(); it++) writeTag(*it); }
void BooksUtil::collectTagsFromLibrary(TagList &tags) { const TagList &lTags = Library::Instance().tags(); TagSet tagSet; for (TagList::const_iterator it = lTags.begin(); it != lTags.end(); ++it) { shared_ptr<Tag> tag = *it; if (tag.isNull()) { tagSet.insert(tag); tags.push_back(tag); } else { TagList tagStack; do { tagStack.push_back(tag); tag = tag->parent(); } while (!tag.isNull() && tagSet.find(tag) == tagSet.end()); tagSet.insert(tagStack.begin(), tagStack.end()); tags.insert(tags.end(), tagStack.rbegin(), tagStack.rend()); } } }
int main( int /*argc*/, char** /*argv*/ ) { int fail = 0; std::string name; Tag *t = new Tag( "toe" ); t->addAttribute( "foo", "bar" ); Tag *u = new Tag( t, "uni" ); u->addAttribute( "u3", "3u" ); Tag *v = new Tag( t, "vie" ); v->addAttribute( "v3", "3v" ); Tag *v2 = new Tag( t, "vie" ); v->addAttribute( "v32", "3v2" ); Tag *w = new Tag( u, "who" ); w->addAttribute( "w3", "3w" ); Tag *x = new Tag( v, "xep" ); x->addAttribute( "x3", "3x" ); Tag *y = new Tag( u, "yps" ); y->addAttribute( "y3", "3y" ); Tag *z = new Tag( w, "zoo" ); z->addAttribute( "z3", "3z" ); Tag *c = 0; Tag *d = 0; // ------- name = "simple ctor"; if( t->name() != "toe" ) { ++fail; fprintf( stderr, "test '%s' failed\n", name.c_str() ); } // ------- name = "cdata ctor"; c = new Tag( "cod", "foobar" ); if( c->name() != "cod" || c->cdata() != "foobar" ) { ++fail; fprintf( stderr, "test '%s' failed\n", name.c_str() ); } delete c; c = 0; //------- name = "clone test 1"; c = z->clone(); if( *z != *c ) { ++fail; fprintf( stderr, "test '%s' failed\n", name.c_str() ); } delete c; c = 0; //------- name = "clone test 2"; c = t->clone(); if( *t != *c ) { ++fail; fprintf( stderr, "test '%s' failed\n", name.c_str() ); } delete c; c = 0; //------- name = "operator== test 1"; c = new Tag( "name" ); if( *t == *c ) { ++fail; fprintf( stderr, "test '%s' failed\n", name.c_str() ); } delete c; c = 0; //------- name = "operator== test 2"; c = new Tag( "test" ); c->addAttribute( "me", "help" ); c->addChild( new Tag( "yes" ) ); if( *t == *c ) { ++fail; fprintf( stderr, "test '%s' failed\n", name.c_str() ); } delete c; c = 0; //------- name = "operator== test 3"; c = new Tag( "hello" ); c->addAttribute( "test", "bacd" ); c->addChild( new Tag( "hello" ) ); d = new Tag( "hello" ); d->addAttribute( "test", "bacd" ); d->addChild( new Tag( "helloo" ) ); if( *d == *c ) { ++fail; fprintf( stderr, "test '%s' failed\n", name.c_str() ); } delete c; delete d; c = 0; d = 0; //------- name = "operator!= test 1"; c = new Tag( "hello" ); c->addAttribute( "test", "bacd" ); c->addChild( new Tag( "hello" ) ); d = new Tag( "hello" ); d->addAttribute( "test", "bacd" ); d->addChild( new Tag( "hello" ) ); if( *d != *c ) { ++fail; fprintf( stderr, "test '%s' failed\n", name.c_str() ); } delete c; delete d; c = 0; d = 0; //------- name = "findChildren test"; TagList l = t->findChildren( "vie" ); TagList::const_iterator it = l.begin(); if( l.size() != 2 || (*it) != v || *(++it) != v2 ) { ++fail; fprintf( stderr, "test '%s' failed\n", name.c_str() ); } delete c; c = 0; //------- name = "util::escape"; if ( util::escape( "&<>'\"" ) != "&<>'"" ) { ++fail; fprintf( stderr, "test '%s' failed\n", name.c_str() ); } //------- name = "xml() 1"; if( t->xml() != "<toe foo='bar'><uni u3='3u'><who w3='3w'><zoo z3='3z'/></who><yps y3='3y'/>" "</uni><vie v3='3v' v32='3v2'><xep x3='3x'/></vie><vie/></toe>" ) { ++fail; fprintf( stderr, "test '%s' failed: %s\n", name.c_str(), t->xml().c_str() ); } //------- name = "xml() 2"; t->addAttribute( "test", "bacd" ); if( t->xml() != "<toe foo='bar' test='bacd'><uni u3='3u'><who w3='3w'><zoo z3='3z'/></who><yps y3='3y'/>" "</uni><vie v3='3v' v32='3v2'><xep x3='3x'/></vie><vie/></toe>" ) { ++fail; fprintf( stderr, "test '%s' failed: %s\n", name.c_str(), t->xml().c_str() ); } //------- name = "hasChild 1"; if( !t->hasChild( "uni" ) || !t->hasChild( "vie" ) || !u->hasChild( "who" ) || !w->hasChild( "zoo" ) || !u->hasChild( "yps" ) ) { ++fail; fprintf( stderr, "test '%s' failed: %s\n", name.c_str(), t->xml().c_str() ); } //------- name = "hasAttribute 1"; if( !t->hasAttribute( "test" ) || !t->hasAttribute( "test", "bacd" ) || !t->hasAttribute( "foo" ) || !t->hasAttribute( "foo", "bar" ) ) { ++fail; fprintf( stderr, "test '%s' failed: %s\n", name.c_str(), t->xml().c_str() ); } //------- name = "findAttribute 1"; if( t->findAttribute( "test" ) != "bacd" || t->findAttribute( "foo" ) != "bar" ) { ++fail; fprintf( stderr, "test '%s' failed: %s\n", name.c_str(), t->xml().c_str() ); } //------- name = "findChild 1"; c = t->findChild( "uni" ); if( c != u ) { ++fail; fprintf( stderr, "test '%s' failed: %s\n", name.c_str(), t->xml().c_str() ); } //------- name = "findChild 2"; c = t->findChild( "uni", "u3" ); if( c != u ) { ++fail; fprintf( stderr, "test '%s' failed: %s\n", name.c_str(), t->xml().c_str() ); } //------- name = "findChild 3"; c = t->findChild( "uni", "u3", "3u" ); if( c != u ) { ++fail; fprintf( stderr, "test '%s' failed: %s\n", name.c_str(), t->xml().c_str() ); } //------- name = "findChildWithAttrib 1"; c = t->findChildWithAttrib( "u3" ); if( c != u ) { ++fail; fprintf( stderr, "test '%s' failed: %s\n", name.c_str(), t->xml().c_str() ); } //------- name = "findChildWithAttrib 2"; c = t->findChildWithAttrib( "u3", "3u" ); if( c != u ) { ++fail; fprintf( stderr, "test '%s' failed: %s\n", name.c_str(), t->xml().c_str() ); } //------- name = "attribute order"; c = new Tag( "abc" ); c->addAttribute( "abc", "def" ); c->addAttribute( "xyz", "123" ); d = c->clone(); if( *c != *d ) { ++fail; fprintf( stderr, "test '%s' failed: %s\n", name.c_str(), d->xml().c_str() ); } delete c; c = 0; delete d; d = 0; //------- name = "mixed content 1"; c = new Tag( "abc" ); c->addCData( "cdata1" ); new Tag( c, "fgh" ); c->addCData( "cdata2" ); new Tag( c, "xyz" ); c->addCData( "cdata3" ); if( c->xml() != "<abc>cdata1<fgh/>cdata2<xyz/>cdata3</abc>" ) { ++fail; fprintf( stderr, "test '%s' failed: %s\n", name.c_str(), c->xml().c_str() ); } delete c; c = 0; //------- name = "operator bool()"; Tag tag1( "" ); if( tag1 ) { ++fail; fprintf( stderr, "test '%s' failed: %s\n", name.c_str(), tag1.xml().c_str() ); } //------- name = "bool operator!()"; Tag tag2( "abc" ); if( !tag2 ) { ++fail; fprintf( stderr, "test '%s' failed: %s\n", name.c_str(), d->xml().c_str() ); } //------- { name = "simple xmlns"; Tag t( "abc" ); t.setXmlns( "foo" ); if( t.xml() != "<abc xmlns='foo'/>" ) { ++fail; fprintf( stderr, "test '%s' failed: %s\n", name.c_str(), t.xml().c_str() ); } } //------- { name = "deep xmlns"; Tag t( "abc" ); Tag* f = new Tag( &t, "def" ); f = new Tag( f, "ghi" ); t.setXmlns( "foo" ); if( t.xml() != "<abc xmlns='foo'><def><ghi/></def></abc>" ) { ++fail; fprintf( stderr, "test '%s' failed: %s\n", name.c_str(), t.xml().c_str() ); } } //------- { name = "simple nested xmlns 2"; Tag t( "abc" ); t.setXmlns( "foo" ); Tag* d = new Tag( &t, "def" ); d->setXmlns( "foobar", "xyz" ); d->setPrefix( "xyz" ); if( t.xml() != "<abc xmlns='foo'><xyz:def xmlns:xyz='foobar'/></abc>" ) { ++fail; fprintf( stderr, "test '%s' failed: %s\n", name.c_str(), t.xml().c_str() ); } } //------- { name = "attribute with xmlns"; Tag t( "abc" ); t.setXmlns( "foo", "xyz" ); Tag::Attribute* a = new Tag::Attribute( "foo", "bar", "foo" ); a->setPrefix( "xyz" ); t.addAttribute( a ); if( t.xml() != "<abc xmlns:xyz='foo' xyz:foo='bar'/>" ) { ++fail; fprintf( stderr, "test '%s' failed: %s\n", name.c_str(), t.xml().c_str() ); } } //------- { name = "escape attribute value"; Tag t( "foo", "abc", "&" ); if( t.xml() != "<foo abc='&amp;'/>" ) { ++fail; fprintf( stderr, "test '%s' failed: %s\n", name.c_str(), t.xml().c_str() ); } } //------- { name = "remove child 1"; Tag t( "foo" ); t.addChild( new Tag( "test", "xmlns", "foo" ) ); t.addChild( new Tag( "abc", "xmlns", "foobar" ) ); t.addAttribute( "attr1", "value1" ); t.addAttribute( "attr2", "value2" ); t.removeChild( "test" ); if( t.hasChild( "test" ) ) { ++fail; fprintf( stderr, "test '%s' failed: %s\n", name.c_str(), t.xml().c_str() ); } name = "remove child 2"; t.removeChild( "abc", "foobar" ); if( t.hasChild( "abc", "xmlns", "foobar" ) ) { ++fail; fprintf( stderr, "test '%s' failed: %s\n", name.c_str(), t.xml().c_str() ); } name = "remove attrib 1"; t.removeAttribute( "attr1" ); if( t.hasAttribute( "attr1", "value1") ) { ++fail; fprintf( stderr, "test '%s' failed: %s\n", name.c_str(), t.xml().c_str() ); } name = "remove attrib 2"; t.removeAttribute( "attr2", "value2" ); if( t.hasAttribute( "attr2", "value2") ) { ++fail; fprintf( stderr, "test '%s' failed: %s\n", name.c_str(), t.xml().c_str() ); } } //------- { name = "invalid chars 1"; Tag t( "foo" ); bool check = t.addAttribute( "nul", std::string( 1, 0x00 ) ); if( check || t.hasAttribute( "nul" ) ) { ++fail; fprintf( stderr, "test '%s' failed:%s\n", name.c_str(), t.xml().c_str() ); } } //------- { name = "invalid chars 2"; for( int i = 0; i <= 0xff; ++i ) { Tag::Attribute a( "test", std::string( 1, i ) ); if( ( i < 0x09 || i == 0x0b || i == 0x0c || ( i > 0x0d && i < 0x20 ) || i == 0xc0 || i == 0xc1 || i >= 0xf5 ) && a ) { ++fail; fprintf( stderr, "test '%s' (branch 1) failed (i == %02X)\n", name.c_str(), i ); } else if( ( i == 0x09 || i == 0x0a || i == 0x0d || ( i >= 0x20 && i < 0xc0 ) || ( i > 0xc1 && i < 0xf5 ) ) && !a ) { ++fail; fprintf( stderr, "test '%s' (branch 2) failed (i == %02X)\n", name.c_str(), i ); } // printf( "i: 0x%02X, a: %d, value: %s\n", i, (bool)a, std::string( 1, i ).c_str() ); } } delete t; t = 0; if( fail == 0 ) { printf( "Tag: OK\n" ); return 0; } else { fprintf( stderr, "Tag: %d test(s) failed\n", fail ); return 1; } }
int main( int /*argc*/, char** /*argv*/ ) { int fail = 0; std::string name; DataFormField *f; // ------- name = "empty field"; f = new DataFormField(); if( f->type() != DataFormField::TypeTextSingle ) { ++fail; fprintf( stderr, "test '%s' failed\n", name.c_str() ); } delete f; f = 0; // ------- name = "TypeBoolean field"; f = new DataFormField( DataFormField::TypeBoolean ); if( f->type() != DataFormField::TypeBoolean ) { ++fail; fprintf( stderr, "test '%s' failed\n", name.c_str() ); } delete f; f = 0; // ------- name = "2nd ctor"; f = new DataFormField( "fieldName", "fieldValue", "fieldLabel", DataFormField::TypeBoolean ); if( f->type() != DataFormField::TypeBoolean || f->name() != "fieldName" || f->value() != "fieldValue" || f->label() != "fieldLabel" ) { ++fail; fprintf( stderr, "test '%s' failed\n", name.c_str() ); } delete f; f = 0; // ------- name = "parse 0"; f = new DataFormField( 0 ); if( f->type() != DataFormField::TypeInvalid ) { ++fail; fprintf( stderr, "test '%s' failed\n", name.c_str() ); } delete f; f = 0; Tag*t; // ------- name = "set name"; f = new DataFormField(); f->setName( name ); if( f->name() != name ) { ++fail; fprintf( stderr, "test '%s' failed\n", name.c_str() ); } delete f; f = 0; // ------- name = "set required"; f = new DataFormField(); bool req = true; f->setRequired( req ); if( f->required() != req ) { ++fail; fprintf( stderr, "test '%s' failed\n", name.c_str() ); } delete f; f = 0; // ------- name = "set label"; f = new DataFormField(); f->setLabel( name ); if( f->label() != name ) { ++fail; fprintf( stderr, "test '%s' failed\n", name.c_str() ); } delete f; f = 0; // ------- name = "set value"; f = new DataFormField(); f->setValue( name ); if( f->value() != name ) { ++fail; fprintf( stderr, "test '%s' failed\n", name.c_str() ); } delete f; f = 0; // ------- name = "set values"; f = new DataFormField(); StringList val; val.push_back( "val 1" ); val.push_back( "val 2" ); val.push_back( "val 3" ); f->setValues( val ); if( f->values() != val ) { ++fail; fprintf( stderr, "test '%s' failed\n", name.c_str() ); } delete f; f = 0; // ------- name = "set values"; f = new DataFormField(); StringMultiMap opt; opt.insert( std::make_pair( "lock", "1" ) ); opt.insert( std::make_pair( "stock", "1" ) ); opt.insert( std::make_pair( "smoking barrel", "2" ) ); f->setOptions( opt ); if( f->options() != opt ) { ++fail; fprintf( stderr, "test '%s' failed\n", name.c_str() ); } delete f; f = 0; // ------- name = "parse Tag 1"; t = new Tag( "field"); t->addAttribute( "type", "fixed" ); new Tag( t, "value", "abc" ); f = new DataFormField( t ); Tag *ft = f->tag(); if( *ft != *t ) { ++fail; fprintf( stderr, "test '%s' failed\n", name.c_str() ); printf( "f->tag(): %s\n", f->tag()->xml().c_str() ); printf( " t: %s\n", t->xml().c_str() ); } delete f; delete t; delete ft; f = 0; // ------- t = new Tag( "field"); t->addAttribute( "type", "list-multi" ); t->addAttribute( "label", "blabla label" ); t->addAttribute( "var", "features" ); Tag *o = new Tag( t, "option" ); o->addAttribute( "label", "lock" ); new Tag( o, "value", "lock" ); o = new Tag( t, "option" ); o->addAttribute( "label", "stock" ); new Tag( o, "value", "stock" ); o = new Tag( t, "option" ); o->addAttribute( "label", "smoking barrel" ); new Tag( o, "value", "smoking barrel" ); new Tag( t, "value", "lock" ); new Tag( t, "value", "stock" ); f = new DataFormField( t ); Tag *r = f->tag(); name = "parse Tag 2.1"; if( r->name() != "field" || !r->hasAttribute( "type", "list-multi" ) ) { ++fail; fprintf( stderr, "test '%s' failed\n", name.c_str() ); printf( "f->tag(): %s\n", f->tag()->xml().c_str() ); printf( " t: %s\n", t->xml().c_str() ); } name = "parse Tag 2.2"; if( !r->hasAttribute( "label", "blabla label" ) || !r->hasAttribute( "var", "features" ) ) { ++fail; fprintf( stderr, "test '%s' failed\n", name.c_str() ); printf( "f->tag(): %s\n", f->tag()->xml().c_str() ); printf( " t: %s\n", t->xml().c_str() ); } name = "parse Tag 2.3"; if( !r->hasChild( "option" ) || !r->findChild( "option" )->hasAttribute( "label", "lock" ) ) { ++fail; fprintf( stderr, "test '%s' failed\n", name.c_str() ); printf( "f->tag(): %s\n", f->tag()->xml().c_str() ); printf( " t: %s\n", t->xml().c_str() ); } name = "parse Tag 2.4"; if( !r->hasChild( "option", "label", "stock" ) ) { ++fail; fprintf( stderr, "test '%s' failed\n", name.c_str() ); printf( "f->tag(): %s\n", f->tag()->xml().c_str() ); printf( " t: %s\n", t->xml().c_str() ); } name = "parse Tag 2.5"; if( !r->hasChild( "option", "label", "smoking barrel" ) ) { ++fail; fprintf( stderr, "test '%s' failed\n", name.c_str() ); printf( "f->tag(): %s\n", f->tag()->xml().c_str() ); printf( " t: %s\n", t->xml().c_str() ); } name = "parse Tag 2.6"; if( !r->findChild( "option" )->findChild( "value" ) ) { ++fail; fprintf( stderr, "test '%s' failed\n", name.c_str() ); printf( "f->tag(): %s\n", f->tag()->xml().c_str() ); printf( " t: %s\n", t->xml().c_str() ); } name = "parse Tag 2.7"; if( r->findChild( "option" )->findChild( "value" )->cdata() != "lock" ) { ++fail; fprintf( stderr, "test '%s' failed\n", name.c_str() ); printf( "f->tag(): %s\n", f->tag()->xml().c_str() ); printf( " t: %s\n", t->xml().c_str() ); } name = "parse Tag 2.8"; TagList l = r->children(); TagList::const_iterator it = l.begin(); for( ; it != l.end(); ++it ) { if( (*it)->name() == "option" && ( !(*it)->hasChildWithCData( "value", "lock" ) && !(*it)->hasChildWithCData( "value", "stock" ) && !(*it)->hasChildWithCData( "value", "smoking barrel" ) ) ) { ++fail; fprintf( stderr, "test '%s' failed\n", name.c_str() ); printf( "f->tag(): %s\n", f->tag()->xml().c_str() ); printf( " t: %s\n", t->xml().c_str() ); } } name = "parse Tag 2.9"; if( !r->hasChildWithCData( "value", "lock" ) || !r->hasChildWithCData( "value", "stock" ) ) { ++fail; fprintf( stderr, "test '%s' failed\n", name.c_str() ); printf( "f->tag(): %s\n", f->tag()->xml().c_str() ); printf( " t: %s\n", t->xml().c_str() ); } delete f; delete t; delete r; f = 0; // ------- name = "boolean duplicate <value/>"; f = new DataFormField( DataFormField::TypeBoolean ); f->setName( "name" ); f->setValue( "1" ); f->setLabel( "label" ); t = f->tag(); if( t->children().size() != 1 || t->xml() != "<field type='boolean' var='name' " "label='label'><value>1</value></field>" ) { ++fail; fprintf( stderr, "test '%s' failed: %s\n", name.c_str(), t->xml().c_str() ); } delete f; delete t; f = 0; t = 0; if( fail == 0 ) { printf( "DataFormField: OK\n" ); return 0; } else { fprintf( stderr, "DataFormField: %d test(s) failed\n", fail ); return 1; } }
void Tag::collectAncestors(shared_ptr<Tag> tag, TagList &parents) { for (; !tag.isNull(); tag = tag->parent()) { parents.push_back(tag); } std::reverse(parents.begin(), parents.end()); }
bool MovieClip::createFrames( Reader& reader, SWF& swf, MovieFrames &data ) { RECT empty = {FLT_MAX,FLT_MAX,-FLT_MAX,-FLT_MAX}; data._rectangle = empty; sbCalculateRectangle = true; // get all tags and build frame lists TagHeader header; ITag* tag = NULL; TagList* frame_tags = new TagList; TagList actionTags; do { header.read( reader ); const uint32_t code = header.code(); SWF::TagFactoryFunc factory = SWF::getTagFactory( code ); if (! factory ) { // no registered factory so skip this tag SWF_TRACE("*** SKIP *** "); header.print(); reader.skip( header.length() ); continue; } tag = factory( header ); SWF_ASSERT(tag); int32_t end_pos = reader.getCurrentPos() + tag->length(); bool keepTag = tag->read( reader, swf, data ); tag->print(); reader.align(); int32_t dif = end_pos - reader.getCurrentPos(); if( dif != 0 ) { SWF_TRACE("WARNING: tag not read correctly. trying to skip.\n"); reader.skip( dif ); } if (keepTag) { // collect action tags if (tag->code() == TAG_DO_ACTION) { actionTags.push_back(tag); } else { frame_tags->push_back( tag ); } } else { delete tag; } // create a new frame if ( TAG_SHOW_FRAME == code ) { SWF_TRACE("[%d] has %d tags\n", data._frames.size(), frame_tags->size()); // put action tags at the end of list in order to avoid callback error TagList::iterator it = actionTags.begin(); while (it != actionTags.end()) { frame_tags->push_back( *it ); ++it; } actionTags.clear(); data._frames.push_back( frame_tags ); frame_tags = new TagList; sbCalculateRectangle = false; } } while( header.code() != TAG_END ); delete frame_tags; return true; }