public override void ReadIndex()
        {
            ReadEntries();
            int numIndices = mEntries.GetUpperBound(0) + 1;

            Indices = new BF.Index[numIndices];
            for (int i = 0; i <= mEntries.GetUpperBound(0); i++)
            {
                BF.FileIndex tIndex = (BF.FileIndex)BF.Index.CreateIndex(mParentBigFile, mSubIndexType);
                tIndex.Name         = "Sub-Index-" + string.Format("{0:D3}", i);
                tIndex.RawIndexData = mEntries[i];
                tIndex.Offset       = mEntries[i][mOffsetPosition];
                //read subindex
                if (i > 0)
                {
                    mLoadedPercent = (((float)i / (float)mEntries.GetUpperBound(0)) * READ_CONTENT_PERCENT) + READ_INDEX_PERCENT;
                }
                //launch another sub-thread so that the loaded percent stays updated
                Thread siThread = new Thread(new ThreadStart(tIndex.ReadIndex));
                siThread.Start();
                do
                {
                    Thread.Sleep(1);
                }while (siThread.IsAlive);
                //tIndex.ReadIndex();
                Indices[i]  = tIndex;
                mFileCount += tIndex.FileCount;
            }
        }
        public static BF.Index CreateIndex(BF.BigFile bigfile, IndexType indexType)
        {
            switch (indexType)
            {
            case IndexType.Pandemonium:
                BF.PandemoniumFileIndex pfi = new PandemoniumFileIndex("Index", bigfile, null, 0);
                pfi.EntryLength      = 2;
                pfi.OffsetPosition   = 0;
                pfi.NameHashPosition = 1;
                return(pfi);

                break;

            case IndexType.SR1PS1MainIndex:
                BF.IndexIndex ixiSoulReaverPlayStationMainIndex;
                ixiSoulReaverPlayStationMainIndex                = new BF.IndexIndex("Index", bigfile, null, 0);
                ixiSoulReaverPlayStationMainIndex.EntryLength    = 2;
                ixiSoulReaverPlayStationMainIndex.OffsetPosition = 1;
                //??Position = 0;
                ixiSoulReaverPlayStationMainIndex.SubIndexType = IndexType.SR1PS1SubIndex;
                return(ixiSoulReaverPlayStationMainIndex);

                break;

            case IndexType.SR1PS1SubIndex:
                BF.FileIndex ixfSoulReaverPlayStationSubIndex;
                ixfSoulReaverPlayStationSubIndex                  = new BF.FileIndex("Index", bigfile, null, 0);
                ixfSoulReaverPlayStationSubIndex.EntryLength      = 4;
                ixfSoulReaverPlayStationSubIndex.NameHashPosition = 0;
                ixfSoulReaverPlayStationSubIndex.LengthPosition   = 1;
                ixfSoulReaverPlayStationSubIndex.OffsetPosition   = 2;
                //??Position = 3;
                return(ixfSoulReaverPlayStationSubIndex);

                break;

            case IndexType.SR1PS1PALRetailMainIndex:
                BF.IndexIndex ixiSoulReaverPlayStationPALRetailMainIndex;
                ixiSoulReaverPlayStationPALRetailMainIndex                = new BF.IndexIndex("Index", bigfile, null, 0);
                ixiSoulReaverPlayStationPALRetailMainIndex.EntryLength    = 2;
                ixiSoulReaverPlayStationPALRetailMainIndex.OffsetPosition = 1;
                //??Position = 0;
                ixiSoulReaverPlayStationPALRetailMainIndex.SubIndexType = IndexType.SR1PS1PALRetailSubIndex;
                return(ixiSoulReaverPlayStationPALRetailMainIndex);

                break;

            case IndexType.SR1PS1PALRetailSubIndex:
                BF.SoulReaverPlaystationPALFileIndex ixfSoulReaverPlaystationPALRetailSubIndex;
                ixfSoulReaverPlaystationPALRetailSubIndex                  = new BF.SoulReaverPlaystationPALFileIndex("Index", bigfile, null, 0);
                ixfSoulReaverPlaystationPALRetailSubIndex.EntryLength      = 4;
                ixfSoulReaverPlaystationPALRetailSubIndex.NameHashPosition = 0;
                ixfSoulReaverPlaystationPALRetailSubIndex.LengthPosition   = 1;
                ixfSoulReaverPlaystationPALRetailSubIndex.OffsetPosition   = 2;
                //??Position = 3;
                return(ixfSoulReaverPlaystationPALRetailSubIndex);

                break;

            case IndexType.SR1PS1PALJuly1999MainIndex:
                BF.IndexIndex ixiSoulReaverPlayStationPALPrereleaseJuly1999MainIndex;
                ixiSoulReaverPlayStationPALPrereleaseJuly1999MainIndex                = new BF.IndexIndex("Index", bigfile, null, 0);
                ixiSoulReaverPlayStationPALPrereleaseJuly1999MainIndex.EntryLength    = 2;
                ixiSoulReaverPlayStationPALPrereleaseJuly1999MainIndex.OffsetPosition = 1;
                //??Position = 0;
                ixiSoulReaverPlayStationPALPrereleaseJuly1999MainIndex.SubIndexType = IndexType.SR1PS1PALJuly1999SubIndex;
                return(ixiSoulReaverPlayStationPALPrereleaseJuly1999MainIndex);

                break;

            case IndexType.SR1PS1PALJuly1999SubIndex:
                BF.SoulReaverPlaystationPALFileIndex ixfSoulReaverPlaystationPALPrereleaseJuly1999SubIndex;
                ixfSoulReaverPlaystationPALPrereleaseJuly1999SubIndex                  = new BF.SoulReaverPlaystationPAL0x1b71FileIndex("Index", bigfile, null, 0);
                ixfSoulReaverPlaystationPALPrereleaseJuly1999SubIndex.EntryLength      = 4;
                ixfSoulReaverPlaystationPALPrereleaseJuly1999SubIndex.NameHashPosition = 0;
                ixfSoulReaverPlaystationPALPrereleaseJuly1999SubIndex.LengthPosition   = 1;
                ixfSoulReaverPlaystationPALPrereleaseJuly1999SubIndex.OffsetPosition   = 2;
                //??Position = 3;
                return(ixfSoulReaverPlaystationPALPrereleaseJuly1999SubIndex);

                break;

            case IndexType.Gex1PlayStation:
                BF.FileIndex ixfSI100;
                ixfSI100 = new BF.FileIndex("Index", bigfile, null, 0);
                ixfSI100.FirstEntryOffset = 20;
                ixfSI100.EntryLength      = 4;
                ixfSI100.NameHashPosition = 0;
                ixfSI100.LengthPosition   = 1;
                ixfSI100.OffsetPosition   = 2;
                //??Position = 3;
                return(ixfSI100);

                break;

            case IndexType.Gex1Saturn:
                BF.FileIndex ixfSI110;
                ixfSI110                  = new BF.FileIndex("Index", bigfile, null, 0);
                ixfSI110.Endianness       = BenLincoln.Data.Endianness.Big;
                ixfSI110.FirstEntryOffset = 20;
                ixfSI110.EntryLength      = 4;
                ixfSI110.NameHashPosition = 0;
                ixfSI110.LengthPosition   = 1;
                ixfSI110.OffsetPosition   = 2;
                //??Position = 3;
                return(ixfSI110);

                break;

            case IndexType.BloodOmen:
                BF.FileIndex ixfSI200;
                ixfSI200                  = new BF.FileIndex("Index", bigfile, null, 0);
                ixfSI200.EntryLength      = 3;
                ixfSI200.NameHashPosition = 0;
                ixfSI200.LengthPosition   = 1;
                ixfSI200.OffsetPosition   = 2;
                return(ixfSI200);

                break;

            case IndexType.Gex2:
                BF.SR1Proto1FileIndex ixfSI300;
                ixfSI300                          = new BF.SR1Proto1FileIndex("Index", bigfile, null, 0);
                ixfSI300.EntryLength              = 6;
                ixfSI300.NameHashPosition         = 0;
                ixfSI300.LengthPosition           = 1;
                ixfSI300.OffsetPosition           = 3;
                ixfSI300.CompressedLengthPosition = 2;
                //ixfSI300.
                //??Position = 2;
                //??Position = 4;
                //??Position = 5;
                return(ixfSI300);

                break;

            case IndexType.SR1PC:
                BF.FileIndex ixfSI400;
                ixfSI400                  = new BF.FileIndex("Index", bigfile, null, 0);
                ixfSI400.EntryLength      = 4;
                ixfSI400.NameHashPosition = 0;
                ixfSI400.LengthPosition   = 1;
                ixfSI400.OffsetPosition   = 2;
                //??Position = 3;
                return(ixfSI400);

                break;

            case IndexType.SR2AirForgeDemo:
                BF.SoulReaver2AirForgeDemoFileIndex ixfSoulReaver2AirForgeDemo;
                ixfSoulReaver2AirForgeDemo                          = new BF.SoulReaver2AirForgeDemoFileIndex("Index", bigfile, null, 0);
                ixfSoulReaver2AirForgeDemo.EntryLength              = 4;
                ixfSoulReaver2AirForgeDemo.NameHashPosition         = 0;
                ixfSoulReaver2AirForgeDemo.LengthPosition           = 1;
                ixfSoulReaver2AirForgeDemo.OffsetPosition           = 2;
                ixfSoulReaver2AirForgeDemo.CompressedLengthPosition = 3;
                return(ixfSoulReaver2AirForgeDemo);

                break;

            case IndexType.SR2PS2:
                BF.SoulReaver2PS2FileIndex ixfSoulReaver2PS2FileIndex;
                ixfSoulReaver2PS2FileIndex                          = new BF.SoulReaver2PS2FileIndex("Index", bigfile, null, 0);
                ixfSoulReaver2PS2FileIndex.EntryLength              = 3;
                ixfSoulReaver2PS2FileIndex.LengthPosition           = 0;
                ixfSoulReaver2PS2FileIndex.OffsetPosition           = 1;
                ixfSoulReaver2PS2FileIndex.CompressedLengthPosition = 2;
                return(ixfSoulReaver2PS2FileIndex);

                break;

            case IndexType.SR2PC:
                BF.FileIndexWithSeparateHashes ixfSI550;
                ixfSI550                = new BF.FileIndexWithSeparateHashes("Index", bigfile, null, 0);
                ixfSI550.EntryLength    = 3;
                ixfSI550.LengthPosition = 0;
                ixfSI550.OffsetPosition = 1;
                //??Position = 2;
                return(ixfSI550);

                break;

            case IndexType.TRLPS2Demo:
                BF.FileIndexWithSeparateHashes ixfSI600;
                ixfSI600                = new BF.FileIndexWithSeparateHashes("Index", bigfile, null, 0);
                ixfSI600.EntryLength    = 4;
                ixfSI600.LengthPosition = 0;
                ixfSI600.OffsetPosition = 1;
                //??Position = 2;
                //??Position = 3;
                return(ixfSI600);

                break;

            case IndexType.TRLPS2:
                BF.FileIndexWithSeparateHashes ixfSI650;
                ixfSI650                = new BF.FileIndexWithSeparateHashes("Index", bigfile, null, 0);
                ixfSI650.EntryLength    = 4;
                ixfSI650.LengthPosition = 0;
                ixfSI650.OffsetPosition = 1;
                //??Position = 2;
                //??Position = 3;
                //this index type uses offset values divided by 2048
                ixfSI650.OffsetMultiplier = 2048;
                return(ixfSI650);

                break;

            case IndexType.MadDashRacingBigFile:
                BF.MadDashRacingBigFileIndex ixfBloodOmen2FileIndex;
                ixfBloodOmen2FileIndex = new BF.MadDashRacingBigFileIndex("Index", bigfile, null, 0);
                ixfBloodOmen2FileIndex.FirstEntryOffset = 0;
                ixfBloodOmen2FileIndex.EntryLength      = 10;
                ixfBloodOmen2FileIndex.OffsetPosition   = 0;
                return(ixfBloodOmen2FileIndex);

                break;

            case IndexType.WhiplashBigFile:
                BF.WhiplashBigFileFileIndex ixfWhiplashBigFileFileIndex;
                ixfWhiplashBigFileFileIndex = new BF.WhiplashBigFileFileIndex("Index", bigfile, null, 0);
                ixfWhiplashBigFileFileIndex.FirstEntryOffset = 0;
                ixfWhiplashBigFileFileIndex.EntryLength      = 10;
                ixfWhiplashBigFileFileIndex.OffsetPosition   = 0;
                return(ixfWhiplashBigFileFileIndex);

                break;
            }

            return(null);
        }