// Detect a Cab archive.
// Author: Jason Hood <jadoxa@yahoo.com.au>

includeScript("archive-file");
sName = "Microsoft Cabinet File";

function detect_Cab(nOffset, nSize) {
    if (nSize > 48) {
        if (File.compare("'MSCF'00000000", nOffset)) {
            bDetected = true;
            sVersion = File.readByte(nOffset + 0x19) + ".0" + File.readByte(nOffset + 0x18);
            var nFilesOffset = nOffset + File.readDword(nOffset + 0x10);
            var nFiles = File.readWord(nOffset + 0x1C);
            var nPacked = File.readDword(nOffset + 8);
            if (File.readByte(nOffset + 0x1E) & 4) {
                nOffset += File.readDword(nOffset + 0x24) + 4;
            }
            switch (File.readByte(nOffset + 0x2A) & 15) {
                case 1:
                    sOptions = sOptions.append("MSZip");
                    break;
                case 2:
                    sOptions = sOptions.append("Quantum");
                    break;
                case 3:
                    sOptions = sOptions.append("LZX");
                    break;
            }
            // Packed size is not stored directly, so assume the first
            // folder's data is first and just skip the names.
            nPacked -= File.readDword(nOffset + 0x24);
            while (nFiles--) {
                Archive.add(File.readDword(nFilesOffset), nPacked,
                    File.readByte(nFilesOffset + 14) & 16);
                nFilesOffset = File.findByte(nFilesOffset + 16, 256, 0) + 1;
                nPacked = 0;
            }
            sOptions = sOptions.append(Archive.contents());

            return 1;
        }
    }

    return 0;
}