Ejemplo n.º 1
0
        public override void Read(BinaryReader br)
        {
            const uint IsParentBlock = 0x80000000;

            _blocks = new ArrayList();
            long position = br.BaseStream.Position;

            while ((br.BaseStream.Position - position) < _header.Length)
            {
                TpkBase   block  = null;
                TpkHeader header = new TpkHeader();
                header.Read(br);
                long positionLocal = br.BaseStream.Position;
                if (((uint)header.Id & IsParentBlock) != 0)
                {
                    block = new TpkBaseBlock();
                }
                else
                {
                    switch (header.Id)
                    {
                    case TpkChunk.TpkHeadFileInfo:
                        block = new TpkHeadFileInfo();
                        break;

                    case TpkChunk.TpkHeadHash:
                        block = new TpkHeadHash();
                        break;

                    case TpkChunk.TpkHeadDataOffset:
                        block = new TpkHeadDataOffset();
                        break;

                    case TpkChunk.TpkDataHeadLink:
                        block = new TpkDataHeadLink();
                        break;

                    case TpkChunk.TpkDataRaw:
                        block = new TpkDataRaw();
                        break;

                    case TpkChunk.TpkNull:
                        block = new TpkNull();
                        break;

                    default:
                        block = new TpkUnknown();
                        break;
                    }
                }
                block.Header = header;
                block.Read(br);
                _blocks.Add(block);
                br.BaseStream.Seek(positionLocal + header.Length, SeekOrigin.Begin);
            }
        }
Ejemplo n.º 2
0
 public TpkBase FindByChunk(TpkChunk id)
 {
     foreach (TpkBase block in _blocks)
     {
         if (block is TpkBaseBlock)
         {
             TpkBase ret = (block as TpkBaseBlock).FindByChunk(id);
             if (ret != null)
             {
                 return(ret);
             }
         }
         else
         {
             if (block.Header.Id == id)
             {
                 return(block);
             }
         }
     }
     return(null);
 }
Ejemplo n.º 3
0
 public void AddBlock(TpkBase block)
 {
     _blocks.Add(block);
 }