diff options
author | Julien Nabet <serval2412@yahoo.fr> | 2017-06-14 19:13:22 +0200 |
---|---|---|
committer | Julien Nabet <serval2412@yahoo.fr> | 2017-06-14 21:22:08 +0200 |
commit | 5435e2b2aa6cbd2b72df09c28d8d16bb71f5018f (patch) | |
tree | 3fd9d9bbe1419a44f27f0df1972e9874b50ee583 /connectivity | |
parent | df2f8116733fdf98ff6216afbfda62af4723f7e2 (diff) |
dBASE: put back an array for trailer
since except language code, the other information aren't used
but keep the details in comment
Change-Id: Ibb5bf22e88bd3a5f9c7603ad018cada8add8b2ce
Reviewed-on: https://gerrit.libreoffice.org/38799
Reviewed-by: Julien Nabet <serval2412@yahoo.fr>
Tested-by: Julien Nabet <serval2412@yahoo.fr>
Diffstat (limited to 'connectivity')
-rw-r--r-- | connectivity/source/drivers/dbase/DTable.cxx | 35 | ||||
-rw-r--r-- | connectivity/source/inc/dbase/DTable.hxx | 39 |
2 files changed, 26 insertions, 48 deletions
diff --git a/connectivity/source/drivers/dbase/DTable.cxx b/connectivity/source/drivers/dbase/DTable.cxx index 14c75d283b34..a684616771c6 100644 --- a/connectivity/source/drivers/dbase/DTable.cxx +++ b/connectivity/source/drivers/dbase/DTable.cxx @@ -222,35 +222,7 @@ void ODbaseTable::readHeader() if (m_aHeader.recordLength == 0) throwInvalidDbaseFormat(); - m_pFileStream->ReadBytes(m_aHeader.reserved1, 2); - if(ERRCODE_NONE != m_pFileStream->GetErrorCode()) - throwInvalidDbaseFormat(); - - m_pFileStream->ReadUChar(m_aHeader.incompTransact); - if(ERRCODE_NONE != m_pFileStream->GetErrorCode()) - throwInvalidDbaseFormat(); - - m_pFileStream->ReadUChar(m_aHeader.encryptionFlag); - if(ERRCODE_NONE != m_pFileStream->GetErrorCode()) - throwInvalidDbaseFormat(); - - m_pFileStream->ReadBytes(m_aHeader.freeRecordThread, 4); - if(ERRCODE_NONE != m_pFileStream->GetErrorCode()) - throwInvalidDbaseFormat(); - - m_pFileStream->ReadBytes(m_aHeader.multiUserdBASE, 8); - if(ERRCODE_NONE != m_pFileStream->GetErrorCode()) - throwInvalidDbaseFormat(); - - m_pFileStream->ReadUChar(m_aHeader.MDXFlag); - if(ERRCODE_NONE != m_pFileStream->GetErrorCode()) - throwInvalidDbaseFormat(); - - m_pFileStream->ReadUChar(m_aHeader.languageDriver); - if(ERRCODE_NONE != m_pFileStream->GetErrorCode()) - throwInvalidDbaseFormat(); - - m_pFileStream->ReadBytes(m_aHeader.reserved2, 2); + m_pFileStream->ReadBytes(m_aHeader.trailer, 20); if(ERRCODE_NONE != m_pFileStream->GetErrorCode()) throwInvalidDbaseFormat(); @@ -277,9 +249,10 @@ void ODbaseTable::readHeader() case dBaseIIIMemo: case FoxProMemo: m_pFileStream->SetEndian(SvStreamEndian::LITTLE); - if ( m_aHeader.languageDriver != 0x00 && getConnection()->isTextEncodingDefaulted() ) + // trailer[17] corresponds to language code, see DBFHeader def in connectivity/source/inc/dbase/DTable.hxx + if ( m_aHeader.trailer[17] != 0x00 && getConnection()->isTextEncodingDefaulted() ) { - switch(m_aHeader.languageDriver) + switch(m_aHeader.trailer[17]) { case 0x01: m_eEncoding = RTL_TEXTENCODING_IBM_437; break; // DOS USA code page 437 case 0x02: m_eEncoding = RTL_TEXTENCODING_IBM_850; break; // DOS Multilingual code page 850 diff --git a/connectivity/source/inc/dbase/DTable.hxx b/connectivity/source/inc/dbase/DTable.hxx index 867cde2e8e00..3402c563b6b0 100644 --- a/connectivity/source/inc/dbase/DTable.hxx +++ b/connectivity/source/inc/dbase/DTable.hxx @@ -57,23 +57,28 @@ namespace connectivity private: // sources: https://www.clicketyclick.dk/databases/xbase/format/dbf.html (dBASE III and 5) // http://www.dbase.com/KnowledgeBase/int/db7_file_fmt.htm (dBASE 7) which is similar at least for this part - struct DBFHeader { - DBFType type; // dBASE/xBASE type, see DBFType - sal_uInt8 dateElems[3]; // Date of last change (YYMMDD) - sal_uInt32 nbRecords; // Number of records - sal_uInt16 headerLength; - sal_uInt16 recordLength; // length of 1 record - sal_uInt8 reserved1[2]; // should be filled with 0 - sal_uInt8 incompTransact; // Incomplete transaction (dBASE IV): - // 00h Transaction ended (or rolled back) - // 01h Transaction started - sal_uInt8 encryptionFlag; // dBASE IV: 00h not encrypted, 01h data encrypted - sal_uInt8 freeRecordThread[4]; // reserved for LAN only - sal_uInt8 multiUserdBASE[8]; // reserved for multi-user dBASE (dBASE III+) - sal_uInt8 MDXFlag; // dBASE IV 0x01 if a production .MDX file exists for this table - // 0x00 if no .MDX file exists - sal_uInt8 languageDriver; // codepage (from Foxpro) - sal_uInt8 reserved2[2]; // should be filled with 0 + struct DBFHeader { // address/pos in trailer + DBFType type; // dBASE/xBASE type, see DBFType 00h + sal_uInt8 dateElems[3]; // Date of last change (YYMMDD) 01h + sal_uInt32 nbRecords; // Number of records 04h + sal_uInt16 headerLength; // 08h + sal_uInt16 recordLength; // Length of 1 record 10h + sal_uInt8 trailer[20]; + // this last field contains these data: + // - reserved:2 bytes:should be filled with 0 12h/0 + // - incomplete transaction:1 byte:dBASE IV 14h/2 + // 00h Transaction ended (or rolled back) + // 01h Transaction started + // - encryptionFlag:1 byte: dBASE IV 15h/3 + // 00h not encrypted + // 01h for encrypted + // - freeRecordThread:4 bytes:reserved for LAN only 16h/4 + // - multiUserdBASE:8 bytes:reserved for multi-user dBASE (dBASE III+) 20h/8 + // - MDXFlag:1 byte:dBASE IV 28h/16 + // 0x01 if a production .MDX file exists for this table + // 0x00 if no .MDX file exists + // - languageDriver:1 byte:codepage (from Foxpro) 29h/17 + // - reserved:2 bytes: should be filled with 0 30h/18 }; struct DBFColumn { /* Column descriptors */ sal_uInt8 db_fnm[11]; /* Field name */ |