00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #ifndef TAGS_H
00021 #define TAGS_H
00022
00023 #include "compat.h"
00024 #include <list>
00025 #include <vector>
00026 #include <iostream>
00027 #include "swftypes.h"
00028 #include "backends/input.h"
00029 #include "backends/geometry.h"
00030 #include "scripting/flashdisplay.h"
00031 #include "scripting/flashtext.h"
00032 #include "scripting/flashutils.h"
00033 #include "scripting/flashmedia.h"
00034 #include "scripting/class.h"
00035
00036 namespace lightspark
00037 {
00038
00039 enum TAGTYPE {TAG=0,DISPLAY_LIST_TAG,SHOW_TAG,CONTROL_TAG,DICT_TAG,FRAMELABEL_TAG,END_TAG};
00040
00041 void ignore(std::istream& i, int count);
00042 void FromShaperecordListToShapeVector(const std::vector<SHAPERECORD>& shapeRecords, std::vector<GeomShape>& shapes);
00043
00044 class Tag
00045 {
00046 protected:
00047 RECORDHEADER Header;
00048 void skip(std::istream& in) const
00049 {
00050 ignore(in,Header.getLength());
00051 }
00052 public:
00053 Tag(RECORDHEADER h):Header(h)
00054 {
00055 }
00056 virtual TAGTYPE getType() const{ return TAG; }
00057 virtual ~Tag(){}
00058 };
00059
00060 class EndTag:public Tag
00061 {
00062 public:
00063 EndTag(RECORDHEADER h, std::istream& s):Tag(h){}
00064 virtual TAGTYPE getType() const{ return END_TAG; }
00065 };
00066
00067 class DisplayListTag: public Tag
00068 {
00069 public:
00070 DisplayListTag(RECORDHEADER h):Tag(h){}
00071 virtual TAGTYPE getType() const{ return DISPLAY_LIST_TAG; }
00072 virtual void execute(MovieClip* parent, std::list < std::pair<PlaceInfo, DisplayObject*> >& list)=0;
00073 };
00074
00075 class DictionaryTag: public Tag
00076 {
00077 protected:
00078 std::vector<GeomShape> cached;
00079 public:
00080 Class_base* bindedTo;
00081 RootMovieClip* loadedFrom;
00082 DictionaryTag(RECORDHEADER h):Tag(h),bindedTo(NULL),loadedFrom(NULL){ }
00083 virtual TAGTYPE getType()const{ return DICT_TAG; }
00084 virtual int getId()=0;
00085 virtual ASObject* instance() const { return NULL; };
00086 void setLoadedFrom(RootMovieClip* r){loadedFrom=r;}
00087 };
00088
00089 class ControlTag: public Tag
00090 {
00091 public:
00092 ControlTag(RECORDHEADER h):Tag(h){}
00093 virtual TAGTYPE getType()const{ return CONTROL_TAG; }
00094 virtual void execute(RootMovieClip* root)=0;
00095 };
00096
00097 class DefineShapeTag: public DictionaryTag, public DisplayObject
00098 {
00099 protected:
00100 UI16 ShapeId;
00101 RECT ShapeBounds;
00102 SHAPEWITHSTYLE Shapes;
00103 DefineShapeTag(RECORDHEADER h):DictionaryTag(h){};
00104 public:
00105 DefineShapeTag(RECORDHEADER h, std::istream& in);
00106 virtual int getId(){ return ShapeId; }
00107 virtual void Render();
00108 virtual void inputRender();
00109 virtual Vector2 debugRender(FTFont* font, bool deep);
00110 bool getBounds(number_t& xmin, number_t& xmax, number_t& ymin, number_t& ymax) const
00111 {
00112
00113 getMatrix().multiply2D(ShapeBounds.Xmin/20,ShapeBounds.Ymin/20,xmin,ymin);
00114 getMatrix().multiply2D(ShapeBounds.Xmax/20,ShapeBounds.Ymax/20,xmax,ymax);
00115
00116 return true;
00117 }
00118
00119 ASObject* instance() const
00120 {
00121 DefineShapeTag* ret=new DefineShapeTag(*this);
00122 ret->setPrototype(Class<Shape>::getClass());
00123 return ret;
00124 }
00125 };
00126
00127 class DefineShape2Tag: public DefineShapeTag
00128 {
00129 protected:
00130 DefineShape2Tag(RECORDHEADER h):DefineShapeTag(h){};
00131 public:
00132 DefineShape2Tag(RECORDHEADER h, std::istream& in);
00133 virtual Vector2 debugRender(FTFont* font, bool deep);
00134 ASObject* instance() const
00135 {
00136 DefineShape2Tag* ret=new DefineShape2Tag(*this);
00137 ret->setPrototype(Class<Shape>::getClass());
00138 return ret;
00139 }
00140 };
00141
00142 class DefineShape3Tag: public DefineShape2Tag
00143 {
00144 protected:
00145 DefineShape3Tag(RECORDHEADER h):DefineShape2Tag(h){};
00146 public:
00147 DefineShape3Tag(RECORDHEADER h, std::istream& in);
00148 virtual int getId(){ return ShapeId; }
00149 virtual Vector2 debugRender(FTFont* font, bool deep);
00150 ASObject* instance() const
00151 {
00152 DefineShape3Tag* ret=new DefineShape3Tag(*this);
00153 ret->setPrototype(Class<Shape>::getClass());
00154 return ret;
00155 }
00156 };
00157
00158 class DefineShape4Tag: public DefineShape3Tag
00159 {
00160 private:
00161 RECT EdgeBounds;
00162 UB UsesFillWindingRule;
00163 UB UsesNonScalingStrokes;
00164 UB UsesScalingStrokes;
00165 public:
00166 DefineShape4Tag(RECORDHEADER h, std::istream& in);
00167 virtual int getId(){ return ShapeId; }
00168 ASObject* instance() const
00169 {
00170 DefineShape4Tag* ret=new DefineShape4Tag(*this);
00171 ret->setPrototype(Class<Shape>::getClass());
00172 return ret;
00173 }
00174 };
00175
00176 class DefineMorphShapeTag: public DictionaryTag, public MorphShape
00177 {
00178 private:
00179 UI16 CharacterId;
00180 RECT StartBounds;
00181 RECT EndBounds;
00182 UI32 Offset;
00183 MORPHFILLSTYLEARRAY MorphFillStyles;
00184 MORPHLINESTYLEARRAY MorphLineStyles;
00185 SHAPE StartEdges;
00186 SHAPE EndEdges;
00187 public:
00188 DefineMorphShapeTag(RECORDHEADER h, std::istream& in);
00189 virtual int getId(){ return CharacterId; }
00190 virtual void Render();
00191 virtual ASObject* instance() const;
00192 };
00193
00194
00195 class DefineEditTextTag: public DictionaryTag, public TextField
00196 {
00197 private:
00198 UI16 CharacterID;
00199 RECT Bounds;
00200 UB HasText;
00201 UB WordWrap;
00202 UB Multiline;
00203 UB Password;
00204 UB ReadOnly;
00205 UB HasTextColor;
00206 UB HasMaxLength;
00207 UB HasFont;
00208 UB HasFontClass;
00209 UB AutoSize;
00210 UB HasLayout;
00211 UB NoSelect;
00212 UB Border;
00213 UB WasStatic;
00214 UB HTML;
00215 UB UseOutlines;
00216 UI16 FontID;
00217 STRING FontClass;
00218 UI16 FontHeight;
00219 RGBA TextColor;
00220 UI16 MaxLength;
00221 UI8 Align;
00222 UI16 LeftMargin;
00223 UI16 RightMargin;
00224 UI16 Indent;
00225 SI16 Leading;
00226 STRING VariableName;
00227 STRING InitialText;
00228
00229 public:
00230 DefineEditTextTag(RECORDHEADER h, std::istream& s);
00231 virtual int getId(){ return CharacterID; }
00232 virtual void Render();
00233 virtual Vector2 debugRender(FTFont* font, bool deep);
00234 ASObject* instance() const;
00235 };
00236
00237 class DefineSoundTag: public DictionaryTag, public Sound
00238 {
00239 private:
00240 UI16 SoundId;
00241 char SoundFormat;
00242 char SoundRate;
00243 char SoundSize;
00244 char SoundType;
00245 UI32 SoundSampleCount;
00246 public:
00247 DefineSoundTag(RECORDHEADER h, std::istream& s);
00248 virtual int getId() { return SoundId; }
00249 ASObject* instance() const;
00250 };
00251
00252 class StartSoundTag: public Tag
00253 {
00254 public:
00255 StartSoundTag(RECORDHEADER h, std::istream& s);
00256 };
00257
00258 class SoundStreamHeadTag: public Tag
00259 {
00260 public:
00261 SoundStreamHeadTag(RECORDHEADER h, std::istream& s);
00262 };
00263
00264 class ShowFrameTag: public Tag
00265 {
00266 public:
00267 ShowFrameTag(RECORDHEADER h, std::istream& in);
00268 virtual TAGTYPE getType()const{ return SHOW_TAG; }
00269 };
00270
00271
00272
00273
00274
00275
00276
00277
00278
00279
00280
00281
00282 class RemoveObject2Tag: public DisplayListTag
00283 {
00284 private:
00285 UI16 Depth;
00286
00287 public:
00288 RemoveObject2Tag(RECORDHEADER h, std::istream& in);
00289 void execute(MovieClip* parent, std::list < std::pair<PlaceInfo, DisplayObject*> >& list);
00290 };
00291
00292 class PlaceObject2Tag: public DisplayListTag
00293 {
00294 protected:
00295 class list_orderer
00296 {
00297 public:
00298 bool operator()(const std::pair<PlaceInfo, DisplayObject*>& a, int d);
00299 bool operator()(int d, const std::pair<PlaceInfo, DisplayObject*>& a);
00300 bool operator()(const std::pair<PlaceInfo, DisplayObject*>& a, const std::pair<PlaceInfo, DisplayObject*>& b);
00301 };
00302
00303 bool PlaceFlagHasClipAction;
00304 bool PlaceFlagHasClipDepth;
00305 bool PlaceFlagHasName;
00306 bool PlaceFlagHasRatio;
00307 bool PlaceFlagHasColorTransform;
00308 bool PlaceFlagHasMatrix;
00309 bool PlaceFlagHasCharacter;
00310 bool PlaceFlagMove;
00311 UI16 Depth;
00312 UI16 CharacterId;
00313 MATRIX Matrix;
00314 CXFORMWITHALPHA ColorTransform;
00315 UI16 Ratio;
00316 UI16 ClipDepth;
00317 CLIPACTIONS ClipActions;
00318 PlaceObject2Tag(RECORDHEADER h):DisplayListTag(h){}
00319
00320 public:
00321 STRING Name;
00322 PlaceObject2Tag(RECORDHEADER h, std::istream& in);
00323 void execute(MovieClip* parent, std::list < std::pair<PlaceInfo, DisplayObject*> >& list);
00324 };
00325
00326 class PlaceObject3Tag: public PlaceObject2Tag
00327 {
00328 private:
00329 bool PlaceFlagHasImage;
00330 bool PlaceFlagHasClassName;
00331 bool PlaceFlagHasCacheAsBitmap;
00332 bool PlaceFlagHasBlendMode;
00333 bool PlaceFlagHasFilterList;
00334 STRING ClassName;
00335 FILTERLIST SurfaceFilterList;
00336 UI8 BlendMode;
00337 UI8 BitmapCache;
00338
00339 public:
00340 PlaceObject3Tag(RECORDHEADER h, std::istream& in);
00341 void execute(MovieClip* parent, std::list < std::pair<PlaceInfo, DisplayObject*> >& list);
00342 };
00343
00344 class FrameLabelTag: public Tag
00345 {
00346 public:
00347 STRING Name;
00348 FrameLabelTag(RECORDHEADER h, std::istream& in);
00349 virtual TAGTYPE getType()const{ return FRAMELABEL_TAG; }
00350 };
00351
00352 class SetBackgroundColorTag: public ControlTag
00353 {
00354 private:
00355 RGB BackgroundColor;
00356 public:
00357 SetBackgroundColorTag(RECORDHEADER h, std::istream& in);
00358 void execute(RootMovieClip* root);
00359 };
00360
00361 class SoundStreamHead2Tag: public Tag
00362 {
00363 public:
00364 SoundStreamHead2Tag(RECORDHEADER h, std::istream& in);
00365 };
00366
00367 class BUTTONCONDACTION;
00368
00369 class DefineButton2Tag: public DictionaryTag, public DisplayObject
00370 {
00371 private:
00372 UI16 ButtonId;
00373 UB ReservedFlags;
00374 UB TrackAsMenu;
00375 UI16 ActionOffset;
00376 std::vector<BUTTONRECORD> Characters;
00377 std::vector<BUTTONCONDACTION> Actions;
00378 enum BUTTON_STATE { BUTTON_UP=0, BUTTON_OVER};
00379 BUTTON_STATE state;
00380
00381
00382 bool IdleToOverUp;
00383 public:
00384 DefineButton2Tag(RECORDHEADER h, std::istream& in);
00385 virtual int getId(){ return ButtonId; }
00386 virtual void Render();
00387 virtual Vector2 debugRender(FTFont* font, bool deep);
00388 bool getBounds(number_t& xmin, number_t& xmax, number_t& ymin, number_t& ymax) const
00389 {
00390 throw UnsupportedException("DefineButton2Tag::getBounds");
00391 }
00392 virtual void handleEvent(Event*);
00393
00394 ASObject* instance() const;
00395 };
00396
00397 class KERNINGRECORD
00398 {
00399 };
00400
00401 class DefineBinaryDataTag: public DictionaryTag, public ByteArray
00402 {
00403 private:
00404 UI16 Tag;
00405 UI32 Reserved;
00406 public:
00407 DefineBinaryDataTag(RECORDHEADER h,std::istream& s);
00408 virtual int getId(){return Tag;}
00409
00410 ASObject* instance() const
00411 {
00412 DefineBinaryDataTag* ret=new DefineBinaryDataTag(*this);
00413 ret->setPrototype(Class<ByteArray>::getClass());
00414 return ret;
00415 }
00416 };
00417
00418 class FontTag: public DictionaryTag
00419 {
00420 protected:
00421 UI16 FontID;
00422 public:
00423 FontTag(RECORDHEADER h):DictionaryTag(h){}
00424 virtual void genGlyphShape(std::vector<GeomShape>& s, int glyph)=0;
00425 };
00426
00427 class DefineFontTag: public FontTag
00428 {
00429 friend class DefineTextTag;
00430 protected:
00431 std::vector<UI16> OffsetTable;
00432 std::vector < SHAPE > GlyphShapeTable;
00433
00434 public:
00435 DefineFontTag(RECORDHEADER h, std::istream& in);
00436 virtual int getId(){ return FontID; }
00437 virtual void genGlyphShape(std::vector<GeomShape>& s, int glyph);
00438 };
00439
00440 class DefineFontInfoTag: public Tag
00441 {
00442 public:
00443 DefineFontInfoTag(RECORDHEADER h, std::istream& in);
00444 };
00445
00446 class DefineFont2Tag: public FontTag
00447 {
00448 friend class DefineTextTag;
00449 private:
00450 std::vector<UI32> OffsetTable;
00451 std::vector < SHAPE > GlyphShapeTable;
00452 bool FontFlagsHasLayout;
00453 bool FontFlagsShiftJIS;
00454 bool FontFlagsSmallText;
00455 bool FontFlagsANSI;
00456 bool FontFlagsWideOffsets;
00457 bool FontFlagsWideCodes;
00458 bool FontFlagsItalic;
00459 bool FontFlagsBold;
00460 LANGCODE LanguageCode;
00461 UI8 FontNameLen;
00462 std::vector <UI8> FontName;
00463 UI16 NumGlyphs;
00464 UI32 CodeTableOffset;
00465 std::vector <UI16> CodeTable;
00466 SI16 FontAscent;
00467 SI16 FontDescent;
00468 SI16 FontLeading;
00469 std::vector < SI16 > FontAdvanceTable;
00470 std::vector < RECT > FontBoundsTable;
00471 UI16 KerningCount;
00472 std::vector <KERNINGRECORD> FontKerningTable;
00473
00474 public:
00475 DefineFont2Tag(RECORDHEADER h, std::istream& in);
00476 virtual int getId(){ return FontID; }
00477 virtual void genGlyphShape(std::vector<GeomShape>& s, int glyph);
00478 };
00479
00480 class DefineFont3Tag: public FontTag
00481 {
00482 private:
00483 std::vector<UI32> OffsetTable;
00484 std::vector < SHAPE > GlyphShapeTable;
00485 UB FontFlagsHasLayout;
00486 UB FontFlagsShiftJIS;
00487 UB FontFlagsSmallText;
00488 UB FontFlagsANSI;
00489 UB FontFlagsWideOffsets;
00490 UB FontFlagsWideCodes;
00491 UB FontFlagsItalic;
00492 UB FontFlagsBold;
00493 LANGCODE LanguageCode;
00494 UI8 FontNameLen;
00495 std::vector <UI8> FontName;
00496 UI16 NumGlyphs;
00497 UI32 CodeTableOffset;
00498 std::vector <UI16> CodeTable;
00499 SI16 FontAscent;
00500 SI16 FontDescent;
00501 SI16 FontLeading;
00502 std::vector < SI16 > FontAdvanceTable;
00503 std::vector < RECT > FontBoundsTable;
00504 UI16 KerningCount;
00505 std::vector <KERNINGRECORD> FontKerningTable;
00506
00507 public:
00508 DefineFont3Tag(RECORDHEADER h, std::istream& in);
00509 virtual int getId(){ return FontID; }
00510 virtual void genGlyphShape(std::vector<GeomShape>& s, int glyph);
00511 };
00512
00513 class DefineTextTag: public DictionaryTag, public DisplayObject
00514 {
00515 friend class GLYPHENTRY;
00516 private:
00517 UI16 CharacterId;
00518 RECT TextBounds;
00519 MATRIX TextMatrix;
00520 UI8 GlyphBits;
00521 UI8 AdvanceBits;
00522 std::vector < TEXTRECORD > TextRecords;
00523
00524 std::vector<GlyphShape> cached;
00525 public:
00526 DefineTextTag(RECORDHEADER h, std::istream& in);
00527 virtual int getId(){ return CharacterId; }
00528 virtual void Render();
00529 virtual void inputRender();
00530 virtual Vector2 debugRender(FTFont* font, bool deep);
00531 bool getBounds(number_t& xmin, number_t& xmax, number_t& ymin, number_t& ymax) const
00532 {
00533 getMatrix().multiply2D(TextBounds.Xmin/20,TextBounds.Ymin/20,xmin,ymin);
00534 getMatrix().multiply2D(TextBounds.Xmax/20,TextBounds.Ymax/20,xmax,ymax);
00535
00536 TextMatrix.multiply2D(xmin,ymin,xmin,ymin);
00537 TextMatrix.multiply2D(xmax,ymax,xmax,ymax);
00538
00539 return true;
00540 }
00541 ASObject* instance() const
00542 {
00543 return new DefineTextTag(*this);
00544 }
00545 };
00546
00547 class DefineSpriteTag: public DictionaryTag, public MovieClip
00548 {
00549 private:
00550 UI16 SpriteID;
00551 UI16 FrameCount;
00552 public:
00553 DefineSpriteTag(RECORDHEADER h, std::istream& in);
00554 virtual int getId(){ return SpriteID; }
00555 virtual Vector2 debugRender(FTFont* font, bool deep);
00556 virtual ASObject* instance() const;
00557 };
00558
00559 class ProtectTag: public ControlTag
00560 {
00561 public:
00562 ProtectTag(RECORDHEADER h, std::istream& in);
00563 void execute(RootMovieClip* root){};
00564 };
00565
00566 class DefineBitsLosslessTag: public DictionaryTag
00567 {
00568 private:
00569 UI16 CharacterId;
00570 UI8 BitmapFormat;
00571 UI16 BitmapWidth;
00572 UI16 BitmapHeight;
00573 UI8 BitmapColorTableSize;
00574
00575 public:
00576 DefineBitsLosslessTag(RECORDHEADER h, std::istream& in);
00577 virtual int getId(){ return CharacterId; }
00578 };
00579
00580 class DefineBitsJPEG2Tag: public Tag
00581 {
00582 public:
00583 DefineBitsJPEG2Tag(RECORDHEADER h, std::istream& in);
00584 };
00585
00586 class DefineBitsLossless2Tag: public DictionaryTag, public Bitmap
00587 {
00588 private:
00589 UI16 CharacterId;
00590 UI8 BitmapFormat;
00591 UI16 BitmapWidth;
00592 UI16 BitmapHeight;
00593 UI8 BitmapColorTableSize;
00594
00595 public:
00596 DefineBitsLossless2Tag(RECORDHEADER h, std::istream& in);
00597 virtual int getId(){ return CharacterId; }
00598 virtual ASObject* instance() const;
00599 bool getBounds(number_t& xmin, number_t& xmax, number_t& ymin, number_t& ymax) const
00600 {
00601 return false;
00602 }
00603 virtual void Render();
00604 };
00605
00606 class DefineScalingGridTag: public Tag
00607 {
00608 public:
00609 UI16 CharacterId;
00610 RECT Splitter;
00611 DefineScalingGridTag(RECORDHEADER h, std::istream& in);
00612 };
00613
00614 class UnimplementedTag: public Tag
00615 {
00616 public:
00617 UnimplementedTag(RECORDHEADER h, std::istream& in);
00618 };
00619
00620 class DefineSceneAndFrameLabelDataTag: public Tag
00621 {
00622 public:
00623 DefineSceneAndFrameLabelDataTag(RECORDHEADER h, std::istream& in);
00624 };
00625
00626 class DefineFontNameTag: public Tag
00627 {
00628 public:
00629 DefineFontNameTag(RECORDHEADER h, std::istream& in);
00630 };
00631
00632 class DefineFontAlignZonesTag: public Tag
00633 {
00634 public:
00635 DefineFontAlignZonesTag(RECORDHEADER h, std::istream& in);
00636 };
00637
00638 class DefineVideoStreamTag: public DictionaryTag
00639 {
00640 private:
00641 UI16 CharacterID;
00642 UI16 NumFrames;
00643 UI16 Width;
00644 UI16 Height;
00645 UB VideoFlagsReserved;
00646 UB VideoFlagsDeblocking;
00647 UB VideoFlagsSmoothing;
00648 UI8 CodecID;
00649 public:
00650 DefineVideoStreamTag(RECORDHEADER h, std::istream& in);
00651 int getId(){ return CharacterID; }
00652 void Render();
00653 };
00654
00655 class SoundStreamBlockTag: public Tag
00656 {
00657 public:
00658 SoundStreamBlockTag(RECORDHEADER h, std::istream& in);
00659 };
00660
00661 class MetadataTag: public Tag
00662 {
00663 private:
00664 STRING XmlString;
00665 public:
00666 MetadataTag(RECORDHEADER h, std::istream& in);
00667 };
00668
00669 class CSMTextSettingsTag: public Tag
00670 {
00671 public:
00672 CSMTextSettingsTag(RECORDHEADER h, std::istream& in);
00673 };
00674
00675 class ScriptLimitsTag: public Tag
00676 {
00677 private:
00678 UI16 MaxRecursionDepth;
00679 UI16 ScriptTimeoutSeconds;
00680 public:
00681 ScriptLimitsTag(RECORDHEADER h, std::istream& in);
00682 };
00683
00684 class ProductInfoTag: public Tag
00685 {
00686 private:
00687 UI32 ProductId;
00688 UI32 Edition;
00689 UI8 MajorVersion;
00690 UI8 MinorVersion;
00691 UI32 MinorBuild;
00692 UI32 MajorBuild;
00693 UI32 CompileTimeHi, CompileTimeLo;
00694 public:
00695 ProductInfoTag(RECORDHEADER h, std::istream& in);
00696 };
00697
00698 class FileAttributesTag: public Tag
00699 {
00700 private:
00701 UB UseDirectBlit;
00702 UB UseGPU;
00703 UB HasMetadata;
00704 UB ActionScript3;
00705 UB UseNetwork;
00706 public:
00707 FileAttributesTag(RECORDHEADER h, std::istream& in);
00708 };
00709
00710 class EnableDebuggerTag: public Tag
00711 {
00712 private:
00713 STRING DebugPassword;
00714 public:
00715 EnableDebuggerTag(RECORDHEADER h, std::istream& in);
00716 };
00717
00718 class EnableDebugger2Tag: public Tag
00719 {
00720 private:
00721 UI16 ReservedWord;
00722 STRING DebugPassword;
00723 public:
00724 EnableDebugger2Tag(RECORDHEADER h, std::istream& in);
00725 };
00726
00727 class DebugIDTag: public Tag
00728 {
00729 private:
00730 UI8 DebugId[16];
00731 public:
00732 DebugIDTag(RECORDHEADER h, std::istream& in);
00733 };
00734
00735 class TagFactory
00736 {
00737 private:
00738 std::istream& f;
00739 bool firstTag;
00740 bool topLevel;
00741 public:
00742 TagFactory(std::istream& in, bool t):f(in),firstTag(true),topLevel(t){}
00743 Tag* readTag();
00744 };
00745
00746 };
00747
00748 #endif