Tag: cws_dev300_dba30c User: oj Date: 2008-05-06 08:14:09+0000 Modified: dba/connectivity/source/drivers/dbase/DTable.cxx dba/connectivity/source/drivers/file/FConnection.cxx dba/connectivity/source/inc/dbase/DTable.hxx dba/connectivity/source/inc/file/FConnection.hxx
Log: #i88577# check for visual foxpro and accept text encoding when set File Changes: Directory: /dba/connectivity/source/drivers/dbase/ ================================================== File [changed]: DTable.cxx Url: http://dba.openoffice.org/source/browse/dba/connectivity/source/drivers/dbase/DTable.cxx?r1=1.105&r2=1.105.10.1 Delta lines: +57 -22 --------------------- --- DTable.cxx 2008-04-10 08:37:29+0000 1.105 +++ DTable.cxx 2008-05-06 08:14:05+0000 1.105.10.1 @@ -7,7 +7,7 @@ * OpenOffice.org - a multi-platform office productivity suite * * $RCSfile: DTable.cxx,v $ - * $Revision: 1.105 $ + * $Revision: 1.105.10.1 $ * * This file is part of OpenOffice.org. * @@ -34,9 +34,7 @@ #include <com/sun/star/sdbc/ColumnValue.hpp> #include <com/sun/star/sdbc/DataType.hpp> #include <com/sun/star/ucb/XContentAccess.hpp> -#ifndef _COM_SUN_STAR_SQLC_XROW_HPP_ #include <com/sun/star/sdbc/XRow.hpp> -#endif #include <svtools/converter.hxx> #include "dbase/DConnection.hxx" #include "dbase/DColumns.hxx" @@ -54,15 +52,11 @@ #include <connectivity/dbconversion.hxx> #include <com/sun/star/lang/DisposedException.hpp> #include <comphelper/property.hxx> -#ifndef _UNOTOOLS_TEMPIFILE_HXX #include <unotools/tempfile.hxx> -#endif #include <unotools/ucbhelper.hxx> #include <comphelper/types.hxx> #include <cppuhelper/exc_hlp.hxx> -#ifndef _CONNECTIVITY_SDBCX_COLUMN_HXX_ #include "connectivity/PColumn.hxx" -#endif #include "connectivity/dbtools.hxx" #include "connectivity/FValue.hxx" #include "connectivity/dbconversion.hxx" @@ -86,6 +80,9 @@ using namespace ::com::sun::star::container; using namespace ::com::sun::star::lang; +// stored as the Field Descriptor terminator +#define FIELD_DESCRIPTOR_TERMINATOR 0x0D + // ------------------------------------------------------------------------- void ODbaseTable::readHeader() { @@ -130,6 +127,7 @@ case dBaseIII: case dBaseIV: case dBaseV: + case VisualFoxPro: case dBaseFS: case dBaseFSMemo: case dBaseIVMemoSQL: @@ -137,6 +135,36 @@ case dBaseIVMemo: case FoxProMemo: m_pFileStream->SetNumberFormatInt(NUMBERFORMAT_INT_LITTLEENDIAN); + if ( m_aHeader.db_frei[17] != 0x00 && getConnection()->isTextEncodingDefaulted() ) + { + switch(m_aHeader.db_frei[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 + case 0x03: m_eEncoding = RTL_TEXTENCODING_MS_1252; break; // Windows ANSI code page 1252 + case 0x04: m_eEncoding = RTL_TEXTENCODING_APPLE_ROMAN; break; // Standard Macintosh + case 0x64: m_eEncoding = RTL_TEXTENCODING_IBM_852; break; // EE MS-DOS code page 852 + case 0x65: m_eEncoding = RTL_TEXTENCODING_IBM_865; break; // Nordic MS-DOS code page 865 + case 0x66: m_eEncoding = RTL_TEXTENCODING_IBM_866; break; // Russian MS-DOS code page 866 + case 0x67: m_eEncoding = RTL_TEXTENCODING_IBM_861; break; // Icelandic MS-DOS + //case 0x68: m_eEncoding = ; break; // Kamenicky (Czech) MS-DOS + //case 0x69: m_eEncoding = ; break; // Mazovia (Polish) MS-DOS + case 0x6A: m_eEncoding = RTL_TEXTENCODING_IBM_737; break; // Greek MS-DOS (437G) + case 0x6B: m_eEncoding = RTL_TEXTENCODING_IBM_857; break; // Turkish MS-DOS + case 0x96: m_eEncoding = RTL_TEXTENCODING_APPLE_CYRILLIC; break; // Russian Macintosh + case 0x97: m_eEncoding = RTL_TEXTENCODING_APPLE_CENTEURO; break; // Eastern European Macintosh + case 0x98: m_eEncoding = RTL_TEXTENCODING_APPLE_GREEK; break; // Greek Macintosh + case 0xC8: m_eEncoding = RTL_TEXTENCODING_MS_1250; break; // Windows EE code page 1250 + case 0xC9: m_eEncoding = RTL_TEXTENCODING_MS_1251; break; // Russian Windows + case 0xCA: m_eEncoding = RTL_TEXTENCODING_MS_1254; break; // Turkish Windows + case 0xCB: m_eEncoding = RTL_TEXTENCODING_MS_1253; break; // Greek Windows + default: + m_eEncoding = getConnection()->getTextEncoding(); + break; + } + } + else + m_eEncoding = getConnection()->getTextEncoding(); break; default: { @@ -175,12 +203,15 @@ static const ::rtl::OUString sVARCHAR(RTL_CONSTASCII_USTRINGPARAM("VARCHAR")); const sal_Bool bCase = getConnection()->getMetaData()->storesMixedCaseQuotedIdentifiers(); - for (sal_Int32 i = 0; i < nFieldCount; i++) + sal_Int32 i = 0; + for (; i < nFieldCount; i++) { DBFColumn aDBFColumn; m_pFileStream->Read((char*)&aDBFColumn, sizeof(aDBFColumn)); + if ( FIELD_DESCRIPTOR_TERMINATOR == aDBFColumn.db_fnm[0] ) // 0x0D stored as the Field Descriptor terminator. + break; - const String aColumnName((const char *)aDBFColumn.db_fnm,getConnection()->getTextEncoding()); + const String aColumnName((const char *)aDBFColumn.db_fnm,m_eEncoding); sal_Int32 nPrecision = aDBFColumn.db_flng; sal_Int32 eType; @@ -251,7 +282,8 @@ sal_False, bCase); m_aColumns->push_back(xCol); - } + } // for (; i < nFieldCount; i++) + OSL_ENSURE(i,"No columns in table!"); } // ------------------------------------------------------------------------- ODbaseTable::ODbaseTable(sdbcx::OCollection* _pTables,ODbaseConnection* _pConnection) @@ -318,7 +350,7 @@ // Memo-Dateinamen bilden (.DBT): // nyi: Unschoen fuer Unix und Mac! - if (m_aHeader.db_typ == FoxProMemo) // foxpro uses another extension + if ( m_aHeader.db_typ == FoxProMemo || VisualFoxPro == m_aHeader.db_typ ) // foxpro uses another extension aURL.SetExtension(String::CreateFromAscii("fpt")); else aURL.SetExtension(String::CreateFromAscii("dbt")); @@ -402,11 +434,13 @@ m_aMemoHeader.db_size = 512; } break; + case VisualFoxPro: case FoxProMemo: m_aMemoHeader.db_typ = MemoFoxPro; m_pMemoStream->Seek(6L); m_pMemoStream->SetNumberFormatInt(NUMBERFORMAT_INT_BIGENDIAN); (*m_pMemoStream) >> m_aMemoHeader.db_size; + break; default: OSL_ENSURE( false, "ODbaseTable::ReadMemoHeader: unsupported memo type!" ); break; @@ -496,7 +530,7 @@ if (aKeyName.Copy(0,3) == ByteString("NDX") ) { aIndexName = aInfFile.ReadKey(aKeyName); - aURL.setName(String(aIndexName,getConnection()->getTextEncoding())); + aURL.setName(String(aIndexName,m_eEncoding)); try { Content aCnt(aURL.GetMainURL(INetURLObject::NO_DECODE),Reference<XCommandEnvironment>()); @@ -649,7 +683,7 @@ { char cLast = pData[nLen]; pData[nLen] = 0; - String aStr(pData,(xub_StrLen)nLen,getConnection()->getTextEncoding()); + String aStr(pData,(xub_StrLen)nLen,m_eEncoding); aStr.EraseTrailingChars(); if (!aStr.Len()) // keine StringLaenge, dann NULL @@ -667,7 +701,7 @@ pData[k] = ' '; } - String aStr(pData, (xub_StrLen)nLen,getConnection()->getTextEncoding()); // Spaces am Anfang und am Ende entfernen: + String aStr(pData, (xub_StrLen)nLen,m_eEncoding); // Spaces am Anfang und am Ende entfernen: aStr.EraseLeadingChars(); aStr.EraseTrailingChars(); @@ -936,7 +970,7 @@ xCol->getPropertyValue(OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_NAME)) >>= aName; ::rtl::OString aCol; - if ( DBTypeConversion::convertUnicodeString( aName, aCol, getConnection()->getTextEncoding() ) > nMaxFieldLength) + if ( DBTypeConversion::convertUnicodeString( aName, aCol, m_eEncoding ) > nMaxFieldLength) { ::rtl::OUString sMsg = ::rtl::OUString::createFromAscii("Invalid column name length for column: "); sMsg += aName; @@ -1402,7 +1436,7 @@ if (pIndex->Find(0,*rRow[nPos])) { // es existiert kein eindeutiger Wert - ::rtl::OUString sMessage = ::rtl::OUString::createFromAscii("Duplicate value found in column \""); + ::rtl::OUString sMessage(RTL_CONSTASCII_USTRINGPARAM("Duplicate value found in column \"")); if ( !aColName.getLength() ) { m_pColumns->getByIndex(i) >>= xCol; @@ -1609,7 +1643,8 @@ // convert the string, using the connection's encoding ::rtl::OString sEncoded; - DBTypeConversion::convertUnicodeStringToLength( sStringToWrite, sEncoded, nLen, getConnection()->getTextEncoding() ); + + DBTypeConversion::convertUnicodeStringToLength( sStringToWrite, sEncoded, nLen, m_eEncoding ); memcpy( pData, sEncoded.getStr(), sEncoded.getLength() ); } @@ -1654,7 +1689,7 @@ ::rtl::OUString sStringToWrite( aVariable.getString() ); ::rtl::OString aStr; - ULONG nSize = DBTypeConversion::convertUnicodeString( sStringToWrite, aStr, getConnection()->getTextEncoding() ); + ULONG nSize = DBTypeConversion::convertUnicodeString( sStringToWrite, aStr, m_eEncoding ); // Anhaengen oder ueberschreiben BOOL bAppend = rBlockNr == 0; @@ -2332,7 +2367,7 @@ } while (!bReady && !m_pMemoStream->IsEof() && aBStr.Len() < STRING_MAXLEN); - ::rtl::OUString aStr(aBStr.GetBuffer(), aBStr.Len(),getConnection()->getTextEncoding()); + ::rtl::OUString aStr(aBStr.GetBuffer(), aBStr.Len(),m_eEncoding); aVariable = aStr; } break; @@ -2383,7 +2418,7 @@ ByteString aBStr; aBStr.Expand(STRING_MAXLEN); m_pMemoStream->Read(aBStr.AllocBuffer(STRING_MAXLEN),STRING_MAXLEN); - aStr += ::rtl::OUString(aBStr.GetBuffer(),aBStr.Len(), getConnection()->getTextEncoding()); + aStr += ::rtl::OUString(aBStr.GetBuffer(),aBStr.Len(), m_eEncoding); nLength -= STRING_MAXLEN; } if ( nLength > 0 ) @@ -2393,7 +2428,7 @@ m_pMemoStream->Read(aBStr.AllocBuffer(static_cast<xub_StrLen>(nLength)),nLength); // aBStr.ReleaseBufferAccess(); - aStr += ::rtl::OUString(aBStr.GetBuffer(),aBStr.Len(), getConnection()->getTextEncoding()); + aStr += ::rtl::OUString(aBStr.GetBuffer(),aBStr.Len(), m_eEncoding); } if ( aStr.getLength() ) Directory: /dba/connectivity/source/drivers/file/ ================================================= File [changed]: FConnection.cxx Url: http://dba.openoffice.org/source/browse/dba/connectivity/source/drivers/file/FConnection.cxx?r1=1.50&r2=1.50.10.1 Delta lines: +4 -2 ------------------- --- FConnection.cxx 2008-04-10 08:57:19+0000 1.50 +++ FConnection.cxx 2008-05-06 08:14:06+0000 1.50.10.1 @@ -7,7 +7,7 @@ * OpenOffice.org - a multi-platform office productivity suite * * $RCSfile: FConnection.cxx,v $ - * $Revision: 1.50 $ + * $Revision: 1.50.10.1 $ * * This file is part of OpenOffice.org. * @@ -72,6 +72,7 @@ ,m_bShowDeleted(sal_False) ,m_bCaseSensitiveExtension( sal_True ) ,m_bCheckSQL92(sal_False) + ,m_bDefaultTextEncoding(false) { m_nTextEncoding = RTL_TEXTENCODING_DONTKNOW; } @@ -156,6 +157,7 @@ { //m_nTextEncoding = osl_getTextEncodingFromLocale(NULL); m_nTextEncoding = osl_getThreadTextEncoding(); + m_bDefaultTextEncoding = true; } if ( aExt.getLength() ) Directory: /dba/connectivity/source/inc/dbase/ ============================================== File [changed]: DTable.hxx Url: http://dba.openoffice.org/source/browse/dba/connectivity/source/inc/dbase/DTable.hxx?r1=1.40&r2=1.40.10.1 Delta lines: +13 -11 --------------------- --- DTable.hxx 2008-04-10 11:10:25+0000 1.40 +++ DTable.hxx 2008-05-06 08:14:06+0000 1.40.10.1 @@ -7,7 +7,7 @@ * OpenOffice.org - a multi-platform office productivity suite * * $RCSfile: DTable.hxx,v $ - * $Revision: 1.40 $ + * $Revision: 1.40.10.1 $ * * This file is part of OpenOffice.org. * @@ -54,6 +54,7 @@ enum DBFType { dBaseIII = 0x03, dBaseIV = 0x04, dBaseV = 0x05, + VisualFoxPro = 0x30, dBaseFS = 0x43, dBaseFSMemo = 0xB3, dBaseIIIMemo = 0x83, @@ -97,6 +98,7 @@ DBFHeader m_aHeader; DBFMemoHeader m_aMemoHeader; SvStream* m_pMemoStream; + rtl_TextEncoding m_eEncoding; sal_Bool m_bWriteableMemo; void alterColumn(sal_Int32 index, Directory: /dba/connectivity/source/inc/file/ ============================================= File [changed]: FConnection.hxx Url: http://dba.openoffice.org/source/browse/dba/connectivity/source/inc/file/FConnection.hxx?r1=1.23&r2=1.23.10.1 Delta lines: +4 -2 ------------------- --- FConnection.hxx 2008-04-10 11:11:59+0000 1.23 +++ FConnection.hxx 2008-05-06 08:14:06+0000 1.23.10.1 @@ -7,7 +7,7 @@ * OpenOffice.org - a multi-platform office productivity suite * * $RCSfile: FConnection.hxx,v $ - * $Revision: 1.23 $ + * $Revision: 1.23.10.1 $ * * This file is part of OpenOffice.org. * @@ -81,6 +81,7 @@ sal_Bool m_bShowDeleted; sal_Bool m_bCaseSensitiveExtension; sal_Bool m_bCheckSQL92; + bool m_bDefaultTextEncoding; void throwUrlNotValid(const ::rtl::OUString & _rsUrl,const ::rtl::OUString & _rsMessage); @@ -143,6 +144,7 @@ inline OFileDriver* getDriver() const { return m_pDriver; } inline sal_Bool showDeleted() const { return m_bShowDeleted; } inline sal_Bool isCheckEnabled() const { return m_bCheckSQL92; } + inline bool isTextEncodingDefaulted() const { return m_bDefaultTextEncoding; } public: struct GrantAccess --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]
