/// <summary> /// Deep clones this item and all children. Positions and lengths are not cloned. When inserted in to another item they should be calculated. /// </summary> /// <returns></returns> public override QbItemBase Clone() { QbItemUnknown u = new QbItemUnknown((int)this.Length, this.Root); u.Create(this.QbItemType); if (this.ItemQbKey != null) { u.ItemQbKey = this.ItemQbKey.Clone(); } byte[] bi = new byte[this.UnknownData.Length]; for (int i = 0; i < bi.Length; i++) { bi[i] = this.UnknownData[i]; } u.ItemCount = this.ItemCount; return(u); }
private void parse(Stream stream) { _streamStartPosition = stream.Position; _items = new List <QbItemBase>(); //if (stream.Position != 0) // throw new ApplicationException("The stream must start at position 0 as this parser uses the position to validate pointers."); using (BinaryEndianReader br = new BinaryEndianReader(stream)) { _magic = br.ReadUInt32(this.PakFormat.EndianType); _fileSize = br.ReadUInt32(this.PakFormat.EndianType); uint sectionValue; QbItemBase qib = new QbItemUnknown(20, this); qib.Construct(br, QbItemType.Unknown); AddItem(qib); while (this.StreamPos(br.BaseStream) < _fileSize) { sectionValue = br.ReadUInt32(this.PakFormat.EndianType); QbItemType sectionType = this.PakFormat.GetQbItemType(sectionValue); switch (sectionType) { case QbItemType.SectionString: case QbItemType.SectionStringW: qib = new QbItemString(this); break; case QbItemType.SectionArray: qib = new QbItemArray(this); break; case QbItemType.SectionStruct: qib = new QbItemStruct(this); break; case QbItemType.SectionScript: qib = new QbItemScript(this); break; case QbItemType.SectionFloat: qib = new QbItemFloat(this); break; case QbItemType.SectionFloatsX2: case QbItemType.SectionFloatsX3: qib = new QbItemFloatsArray(this); break; case QbItemType.SectionInteger: case QbItemType.SectionStringPointer: qib = new QbItemInteger(this); break; case QbItemType.SectionQbKey: case QbItemType.SectionQbKeyString: case QbItemType.SectionQbKeyStringQs: //GH:GH qib = new QbItemQbKey(this); break; default: throw new ApplicationException(string.Format("Location 0x{0}: Unknown section type 0x{1}", (this.StreamPos(br.BaseStream) - 4).ToString("X").PadLeft(8, '0'), sectionValue.ToString("X").PadLeft(8, '0'))); } qib.Construct(br, sectionType); AddItem(qib); } } uint f = this.FileId; //gettin this sets the file id }