| 1467 | // Support for BET table |
| 1468 | |
| 1469 | static void CreateBetHeader( |
| 1470 | TMPQArchive * ha, |
| 1471 | TMPQBetHeader * pBetHeader) |
| 1472 | { |
| 1473 | TFileEntry * pFileTableEnd = ha->pFileTable + ha->dwFileTableSize; |
| 1474 | TFileEntry * pFileEntry; |
| 1475 | ULONGLONG MaxByteOffset = 0; |
| 1476 | DWORD FlagArray[MAX_FLAG_INDEX]; |
| 1477 | DWORD dwMaxFlagIndex = 0; |
| 1478 | DWORD dwMaxFileSize = 0; |
| 1479 | DWORD dwMaxCmpSize = 0; |
| 1480 | DWORD dwFlagIndex; |
| 1481 | |
| 1482 | // Initialize array of flag combinations |
| 1483 | InitFileFlagArray(FlagArray); |
| 1484 | |
| 1485 | // Fill the common header |
| 1486 | pBetHeader->ExtHdr.dwSignature = BET_TABLE_SIGNATURE; |
| 1487 | pBetHeader->ExtHdr.dwVersion = 1; |
| 1488 | pBetHeader->ExtHdr.dwDataSize = 0; |
| 1489 | |
| 1490 | // Get the maximum values for the BET table |
| 1491 | pFileTableEnd = ha->pFileTable + ha->pHeader->dwBlockTableSize; |
| 1492 | for(pFileEntry = ha->pFileTable; pFileEntry < pFileTableEnd; pFileEntry++) |
| 1493 | { |
| 1494 | // |
| 1495 | // Note: Deleted files must be counted as well |
| 1496 | // |
| 1497 | |
| 1498 | // Highest file position in the MPQ |
| 1499 | if(pFileEntry->ByteOffset > MaxByteOffset) |
| 1500 | MaxByteOffset = pFileEntry->ByteOffset; |
| 1501 | |
| 1502 | // Biggest file size |
| 1503 | if(pFileEntry->dwFileSize > dwMaxFileSize) |
| 1504 | dwMaxFileSize = pFileEntry->dwFileSize; |
| 1505 | |
| 1506 | // Biggest compressed size |
| 1507 | if(pFileEntry->dwCmpSize > dwMaxCmpSize) |
| 1508 | dwMaxCmpSize = pFileEntry->dwCmpSize; |
| 1509 | |
| 1510 | // Check if this flag was there before |
| 1511 | dwFlagIndex = GetFileFlagIndex(FlagArray, pFileEntry->dwFlags); |
| 1512 | if(dwFlagIndex > dwMaxFlagIndex) |
| 1513 | dwMaxFlagIndex = dwFlagIndex; |
| 1514 | } |
| 1515 | |
| 1516 | // Now save bit count for every piece of file information |
| 1517 | pBetHeader->dwBitIndex_FilePos = 0; |
| 1518 | pBetHeader->dwBitCount_FilePos = GetNecessaryBitCount(MaxByteOffset); |
| 1519 | |
| 1520 | pBetHeader->dwBitIndex_FileSize = pBetHeader->dwBitIndex_FilePos + pBetHeader->dwBitCount_FilePos; |
| 1521 | pBetHeader->dwBitCount_FileSize = GetNecessaryBitCount(dwMaxFileSize); |
| 1522 | |
| 1523 | pBetHeader->dwBitIndex_CmpSize = pBetHeader->dwBitIndex_FileSize + pBetHeader->dwBitCount_FileSize; |
| 1524 | pBetHeader->dwBitCount_CmpSize = GetNecessaryBitCount(dwMaxCmpSize); |
| 1525 | |
| 1526 | pBetHeader->dwBitIndex_FlagIndex = pBetHeader->dwBitIndex_CmpSize + pBetHeader->dwBitCount_CmpSize; |
no test coverage detected