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]

Reply via email to