connectivity/source/drivers/file/FConnection.cxx      |   24 ++++++++++------
 offapi/com/sun/star/sdbc/FILEConnectionProperties.idl |    4 ++
 sc/source/ui/docshell/docsh8.cxx                      |   27 +++---------------
 3 files changed, 25 insertions(+), 30 deletions(-)

New commits:
commit db7dae40a2082d5d2b1ac22008d32ef9ebf86f4e
Author: Stephan Bergmann <sberg...@redhat.com>
Date:   Mon Mar 5 13:56:59 2018 +0100

    tdf#116171: Tunnel arbitrary rtl_TextEncoding from sc to sdbc:dbase 
connection
    
    ...including those that have no corresponding textual IANA character set 
name
    representation, like RTL_TEXTENCODING_MS_950 which is apparently used in 
some
    DBase files.
    
    In the past, if eCharSet was RTL_TEXTENCODING_DONTKNOW in 
lcl_getDBaseConnection
    it was sent as an empty string CharSet property, which the receiving
    OConnection::construct translated back to
    
      else
          m_nTextEncoding = RTL_TEXTENCODING_DONTKNOW;
    
    so the net effect remains the same for that special case.
    
    Change-Id: I84eec8a93d000752b3c429976c58721ea9ea32a4
    Reviewed-on: https://gerrit.libreoffice.org/50772
    Reviewed-by: Lionel Elie Mamane <lio...@mamane.lu>
    Tested-by: Jenkins <c...@libreoffice.org>
    (cherry picked from commit 5ad62544bce42396faaae2bc79c7517af6ff085b)
    Reviewed-on: https://gerrit.libreoffice.org/50780
    Reviewed-by: Eike Rathke <er...@redhat.com>

diff --git a/connectivity/source/drivers/file/FConnection.cxx 
b/connectivity/source/drivers/file/FConnection.cxx
index 378bd2d9cd0a..d9d2378c0f7f 100644
--- a/connectivity/source/drivers/file/FConnection.cxx
+++ b/connectivity/source/drivers/file/FConnection.cxx
@@ -38,6 +38,7 @@
 #include <ucbhelper/content.hxx>
 #include <connectivity/dbcharset.hxx>
 #include <connectivity/dbexception.hxx>
+#include <o3tl/any.hxx>
 #include <osl/thread.h>
 #include <osl/nlsupport.h>
 #include <strings.hrc>
@@ -105,15 +106,22 @@ void OConnection::construct(const OUString& url,const 
Sequence< PropertyValue >&
             OSL_VERIFY( pIter->Value >>= aExt );
         else if( pIter->Name == "CharSet" )
         {
-            OUString sIanaName;
-            OSL_VERIFY( pIter->Value >>= sIanaName );
-
-            ::dbtools::OCharsetMap aLookupIanaName;
-            ::dbtools::OCharsetMap::const_iterator aLookup = 
aLookupIanaName.find(sIanaName, ::dbtools::OCharsetMap::IANA());
-            if (aLookup != aLookupIanaName.end())
-                m_nTextEncoding = (*aLookup).getEncoding();
+            if (auto const numeric = o3tl::tryAccess<sal_uInt16>(pIter->Value))
+            {
+                m_nTextEncoding = *numeric;
+            }
             else
-                m_nTextEncoding = RTL_TEXTENCODING_DONTKNOW;
+            {
+                OUString sIanaName;
+                OSL_VERIFY( pIter->Value >>= sIanaName );
+
+                ::dbtools::OCharsetMap aLookupIanaName;
+                ::dbtools::OCharsetMap::const_iterator aLookup = 
aLookupIanaName.find(sIanaName, ::dbtools::OCharsetMap::IANA());
+                if (aLookup != aLookupIanaName.end())
+                    m_nTextEncoding = (*aLookup).getEncoding();
+                else
+                    m_nTextEncoding = RTL_TEXTENCODING_DONTKNOW;
+            }
         }
         else if( pIter->Name == "ShowDeleted" )
         {
diff --git a/offapi/com/sun/star/sdbc/FILEConnectionProperties.idl 
b/offapi/com/sun/star/sdbc/FILEConnectionProperties.idl
index 1e1f36efc8e1..43c6d4c74740 100644
--- a/offapi/com/sun/star/sdbc/FILEConnectionProperties.idl
+++ b/offapi/com/sun/star/sdbc/FILEConnectionProperties.idl
@@ -45,6 +45,10 @@ service FILEConnectionProperties
 
         <p>See the <a 
href="http://www.iana.org/assignments/character-sets";>IANA character set 
list</a>
         for a list of valid values.</p>
+
+        <p>For internal purposes (e.g., when using an encoding for which no 
IANA character set name
+        exists), this may also be an UNSIGNED SHORT value representing one of 
the rtl_TextEncoding
+        values in rtl/textenc.h.</p>
     */
     [optional, property] string CharSet;
 };
diff --git a/sc/source/ui/docshell/docsh8.cxx b/sc/source/ui/docshell/docsh8.cxx
index 198cc709debe..6fcce1eafc4d 100644
--- a/sc/source/ui/docshell/docsh8.cxx
+++ b/sc/source/ui/docshell/docsh8.cxx
@@ -30,10 +30,6 @@
 #include <svx/txenctab.hxx>
 #include <unotools/sharedunocomponent.hxx>
 
-#if HAVE_FEATURE_DBCONNECTIVITY
-#include <svx/dbcharsethelper.hxx>
-#endif
-
 #include <com/sun/star/sdb/CommandType.hpp>
 #include <com/sun/star/sdbc/DataType.hpp>
 #include <com/sun/star/sdbc/SQLException.hpp>
@@ -124,26 +120,13 @@ namespace
         OUString aConnUrl("sdbc:dbase:");
         aConnUrl += aPath;
 
-        ::std::vector< rtl_TextEncoding > aEncodings;
-        svxform::charset_helper::getSupportedTextEncodings( aEncodings );
-        ::std::vector< rtl_TextEncoding >::iterator aIter = 
::std::find(aEncodings.begin(),aEncodings.end(), eCharSet);
-        if ( aIter == aEncodings.end() )
-        {
-            OSL_FAIL( "DBaseImport: dbtools::OCharsetMap doesn't know text 
encoding" );
-            return SCERR_IMPORT_CONNECT;
-        } // if ( aIter == aMap.end() )
-        OUString aCharSetStr;
-        if ( RTL_TEXTENCODING_DONTKNOW != *aIter )
-        {   // it's not the virtual "system charset"
-            const char* pIanaName = rtl_getMimeCharsetFromTextEncoding( *aIter 
);
-            OSL_ENSURE( pIanaName, "invalid mime name!" );
-            if ( pIanaName )
-                aCharSetStr = OUString::createFromAscii( pIanaName );
-        }
-
+        // sdbc:dbase is based on the css.sdbc.FILEConnectionProperties UNOIDL 
service, so we can
+        // transport the raw rtl_TextEncoding value instead of having to 
translate it into a IANA
+        // character set name string (which might not exist for certain 
eCharSet values, like
+        // RTL_TEXTENCODING_MS_950):
         uno::Sequence<beans::PropertyValue> aProps( 
comphelper::InitPropertySequence({
                 { SC_DBPROP_EXTENSION, uno::Any(aExtension) },
-                { SC_DBPROP_CHARSET, uno::Any(aCharSetStr) }
+                { SC_DBPROP_CHARSET, uno::Any(eCharSet) }
             }));
 
         _rConnection = _rDrvMgr->getConnectionWithInfo( aConnUrl, aProps );
_______________________________________________
Libreoffice-commits mailing list
libreoffice-comm...@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits

Reply via email to