Ejemplo n.º 1
0
// we must be at the right position in the file!
bool CentralDirFileHeader::read(QIODevice* ioDevice)
{
    Q_ASSERT(ioDevice);

    IOBuffer buffer;
    buffer.read( ioDevice, CD_FILE_HEADER_SIZE );

    signature = buffer.readUInt32( );      // 0x02014b50
    if ( signature != CD_FILE_HEADER_SIGNATURE )
        return false;

    versionMadeBy = buffer.readUInt16( );
    versionNeeded = buffer.readUInt16( );
    generalFlag = buffer.readUInt16( );
    compressionMethod = buffer.readUInt16( );
    lastModFileTime = buffer.readUInt16( );
    lastModFileDate = buffer.readUInt16( );
    crc_32 = buffer.readUInt32( );
    compressedSize = buffer.readUInt32( );
    uncompressedSize = buffer.readUInt32( );
    filenameLength = buffer.readUInt16( );
    extraFieldLength = buffer.readUInt16( );
    fileCommentLength = buffer.readUInt16( );
    diskNumberStart = buffer.readUInt16( );
    internalFileAttr = buffer.readUInt16( );
    externalFileAttr = buffer.readUInt32( );
    relativeOffset = buffer.readUInt32( );

    if (filenameLength)
    {
        fileName = ioDevice->read( filenameLength );
        if ( isUTF8() )
            sFileName = QTextCodec::codecForUtfText(fileName)->toUnicode( fileName );    // Save in a QString for convienience (searching etc)
        else
            sFileName = QTextCodec::codecForLocale()->toUnicode( fileName );    // Save in a QString for convienience (searching etc)
    }

    readExtraData( ioDevice );

    if (fileCommentLength)
        comment = ioDevice->read( fileCommentLength );

    return isValid();
}