public static List <BBeBTag> ParseAllTags(BBeBObject obj, byte[] tagBytes) { List <BBeBTag> parsedTags = obj.Tags; MemoryStream tagStream = new MemoryStream(tagBytes); BBeBinaryReader tagReader = new BBeBinaryReader(tagStream); while (tagReader.BaseStream.Position < tagBytes.Length) { TagId eTagId = tagReader.ReadTag(); // This method adds the tag it created to the parsed tags array // Changed because some tags read other tags (as they need the data from the other tags // e.g. StreamSize tag includes StreamStart and StreamEnd tags), and we lose these tags otherwise BBeBTag tag = ReadTag(eTagId, tagReader, ref parsedTags, obj.Type); } return(parsedTags); }
public BBeBObject CreateObject(BinaryReader reader, uint nObjId, uint nObjLen) { long nStartPos = reader.BaseStream.Position; ushort nObjStartMarker = reader.ReadUInt16(); if (nObjStartMarker != 0xf500) { throw new InvalidTagException("Object didn't start with 0xf500: " + nObjStartMarker.ToString(), nObjStartMarker); } ushort id = reader.ReadUInt16(); if (id != nObjId) { throw new InvalidDataException("Object ID mismatch."); } ushort zero = reader.ReadUInt16(); if (zero != 0x0) { throw new InvalidDataException("Object didn't have zero as second word."); } ushort nObjType = reader.ReadUInt16(); ObjectType objType = (ObjectType)nObjType; Debug.WriteLineIf(s_bDebugMode, "Obj: " + objType.ToString() + " id=" + id); BBeBObject obj = null; long nBytesSoFar = reader.BaseStream.Position - nStartPos; byte[] tagBytes = reader.ReadBytes((int)(nObjLen - nBytesSoFar)); switch (objType) { case ObjectType.Page: obj = ReadPageObject(reader, id, tagBytes); break; case ObjectType.TOC: obj = ReadTocObject(reader, id, tagBytes); break; case ObjectType.PageTree: obj = ReadPageTreeObject(reader, id, tagBytes); break; case ObjectType.PageAtr: obj = ReadPageAttrObject(reader, id, tagBytes); break; case ObjectType.BookAtr: obj = ReadBookAttrObject(reader, id, tagBytes); break; case ObjectType.Block: obj = ReadBlockObject(reader, id, tagBytes); break; case ObjectType.BlockAtr: obj = ReadBlockAttrObject(reader, id, tagBytes); break; case ObjectType.Text: obj = ReadTextObject(reader, id, tagBytes); break; case ObjectType.TextAtr: obj = ReadTextAttrObject(reader, id, tagBytes); break; case ObjectType.SimpleText: obj = ReadSimpleTextObject(reader, id, tagBytes); break; case ObjectType.Image: obj = ReadImageObject(reader, id, tagBytes); break; case ObjectType.ImageStream: obj = ReadImageStreamObject(reader, id, tagBytes); break; case ObjectType.ObjectInfo: obj = ReadObjectInfoObject(reader, id, tagBytes); break; case ObjectType.Header: obj = ReadHeaderObject(reader, id, tagBytes); break; case ObjectType.Button: obj = ReadButtonObject(reader, id, tagBytes); break; case ObjectType.PopUpWin: obj = ReadPopUpWinObject(reader, id, tagBytes); break; default: throw new InvalidDataException("Unsupported object type: " + objType.ToString()); } return(obj); }
private void ParseTagData(BBeBObject obj, byte[] tagBytes) { BBeBTagFactory.ParseAllTags(obj, tagBytes); }