// http://www.nongnu.org/chmspec/latest/Internal.html#WINDOWS void ChmDoc::ParseWindowsData() { size_t windowsLen, stringsLen; ScopedMem<unsigned char> windowsData(GetData("/#WINDOWS", &windowsLen)); ScopedMem<unsigned char> stringsData(GetData("/#STRINGS", &stringsLen)); if (!windowsData || !stringsData) return; if (windowsLen <= 8) return; ByteReader rw(windowsData, windowsLen); DWORD entries = rw.DWordLE(0); DWORD entrySize = rw.DWordLE(4); if (entrySize < 188) return; for (DWORD i = 0; i < entries && (i + 1) * entrySize <= windowsLen; i++) { DWORD off = 8 + i * entrySize; if (!title) { DWORD strOff = rw.DWordLE(off + 0x14); title.Set(GetCharZ(stringsData, stringsLen, strOff)); } if (!tocPath) { DWORD strOff = rw.DWordLE(off + 0x60); tocPath.Set(GetCharZ(stringsData, stringsLen, strOff)); } if (!indexPath) { DWORD strOff = rw.DWordLE(off + 0x64); indexPath.Set(GetCharZ(stringsData, stringsLen, strOff)); } if (!homePath) { DWORD strOff = rw.DWordLE(off + 0x68); homePath.Set(GetCharZ(stringsData, stringsLen, strOff)); } } }
static quint16 toWindowsIdKey(const QByteArray &winId) { for (quint16 i = 0; i < windowsDataTableSize; ++i) { const QWindowsData *data = windowsData(i); if (windowsId(data) == winId) return data->windowsIdKey; } return 0; }
static QByteArray toWindowsIdLiteral(quint16 windowsIdKey) { for (quint16 i = 0; i < windowsDataTableSize; ++i) { const QWindowsData *data = windowsData(i); if (data->windowsIdKey == windowsIdKey) return windowsId(data); } return QByteArray(); }