[Libreoffice-commits] .: basic/source dbaccess/source desktop/source sal/CppunitTest_sal_rtl_strings.mk sal/inc sal/qa sal/rtl svl/source

Lubos Lunak llunak at kemper.freedesktop.org
Wed Feb 22 07:23:17 PST 2012


 basic/source/uno/namecont.cxx                                         |   14 -
 dbaccess/source/ui/browser/unodatbr.cxx                               |    2 
 desktop/source/deployment/inc/dp_misc.h                               |   18 -
 desktop/source/deployment/registry/configuration/dp_configuration.cxx |    4 
 sal/CppunitTest_sal_rtl_strings.mk                                    |    1 
 sal/inc/rtl/ustring.hxx                                               |   62 ++++++
 sal/inc/sal/log-areas.dox                                             |    4 
 sal/qa/rtl/strings/test_oustring_stringliterals.cxx                   |   91 ++++++++++
 sal/rtl/source/ustring.cxx                                            |    3 
 svl/source/misc/inethist.cxx                                          |    4 
 10 files changed, 172 insertions(+), 31 deletions(-)

New commits:
commit f150ed241ff796a25bd1a797155104198b415f18
Author: Luboš Luňák <l.lunak at suse.cz>
Date:   Wed Feb 22 15:35:41 2012 +0100

    OUString ctor for string literals without RTL_CONSTASCII stuff
    
    http://lists.freedesktop.org/archives/libreoffice/2012-February/025662.html

diff --git a/basic/source/uno/namecont.cxx b/basic/source/uno/namecont.cxx
index db0bf66..db72a4f 100644
--- a/basic/source/uno/namecont.cxx
+++ b/basic/source/uno/namecont.cxx
@@ -1001,13 +1001,13 @@ sal_Bool SfxLibraryContainer::init_Impl(
         INetURLObject aUserBasicInetObj( String(maLibraryPath).GetToken(1) );
         OUString aStandardStr( RTL_CONSTASCII_USTRINGPARAM("Standard") );
 
-        static char strPrevFolderName_1[] = "__basic_80";
-        static char strPrevFolderName_2[] = "__basic_80_2";
+        static char const strPrevFolderName_1[] = "__basic_80";
+        static char const strPrevFolderName_2[] = "__basic_80_2";
         INetURLObject aPrevUserBasicInetObj_1( aUserBasicInetObj );
         aPrevUserBasicInetObj_1.removeSegment();
         INetURLObject aPrevUserBasicInetObj_2 = aPrevUserBasicInetObj_1;
-        aPrevUserBasicInetObj_1.Append( strPrevFolderName_1 );
-        aPrevUserBasicInetObj_2.Append( strPrevFolderName_2 );
+        aPrevUserBasicInetObj_1.Append( rtl::OString( strPrevFolderName_1 ));
+        aPrevUserBasicInetObj_2.Append( rtl::OString( strPrevFolderName_2 ));
 
         // #i93163
         bool bCleanUp = false;
@@ -1072,7 +1072,7 @@ sal_Bool SfxLibraryContainer::init_Impl(
                 String aFolderUserBasic = aUserBasicInetObj.GetMainURL( INetURLObject::NO_DECODE );
                 INetURLObject aUserBasicTmpInetObj( aUserBasicInetObj );
                 aUserBasicTmpInetObj.removeSegment();
-                aUserBasicTmpInetObj.Append( "__basic_tmp" );
+                aUserBasicTmpInetObj.Append( rtl::OString( "__basic_tmp" ));
                 String aFolderTmp = aUserBasicTmpInetObj.GetMainURL( INetURLObject::NO_DECODE );
 
                 mxSFI->move( aFolderUserBasic, aFolderTmp );
@@ -1195,10 +1195,10 @@ sal_Bool SfxLibraryContainer::init_Impl(
         {
             SAL_WARN("basic", "Upgrade of Basic installation failed somehow");
 
-            static char strErrorSavFolderName[] = "__basic_80_err";
+            static const char strErrorSavFolderName[] = "__basic_80_err";
             INetURLObject aPrevUserBasicInetObj_Err( aUserBasicInetObj );
             aPrevUserBasicInetObj_Err.removeSegment();
-            aPrevUserBasicInetObj_Err.Append( strErrorSavFolderName );
+            aPrevUserBasicInetObj_Err.Append( rtl::OString( strErrorSavFolderName ));
             String aPrevFolder_Err = aPrevUserBasicInetObj_Err.GetMainURL( INetURLObject::NO_DECODE );
 
             bool bSaved = false;
diff --git a/dbaccess/source/ui/browser/unodatbr.cxx b/dbaccess/source/ui/browser/unodatbr.cxx
index 6e31141..705cb24 100644
--- a/dbaccess/source/ui/browser/unodatbr.cxx
+++ b/dbaccess/source/ui/browser/unodatbr.cxx
@@ -1916,7 +1916,7 @@ void SbaTableQueryBrowser::Execute(sal_uInt16 nId, const Sequence< PropertyValue
             break;
 
         case ID_TREE_CLOSE_CONN:
-            openHelpAgent( HID_DSBROWSER_DISCONNECTING );
+            openHelpAgent( rtl::OString( HID_DSBROWSER_DISCONNECTING ));
             closeConnection( m_pTreeView->getListBox().GetRootLevelParent( m_pTreeView->getListBox().GetCurEntry() ) );
             break;
 
diff --git a/desktop/source/deployment/inc/dp_misc.h b/desktop/source/deployment/inc/dp_misc.h
index 9e91253..29fd140 100644
--- a/desktop/source/deployment/inc/dp_misc.h
+++ b/desktop/source/deployment/inc/dp_misc.h
@@ -128,15 +128,6 @@ oslProcess raiseProcess( ::rtl::OUString const & appURL,
 DESKTOP_DEPLOYMENTMISC_DLLPUBLIC
 void writeConsole(::rtl::OUString const & sText);
 
-/** writes the argument string to the console.
-    On Linux/Unix/etc. the string is passed into fprintf without any conversion.
-    On Windows the string is converted to UTF16 assuming the argument is UTF8
-    encoded. The UTF16 string is written to stdout with WriteFile. unopkg.com
-    reads the data and prints them out using WriteConsoleW.
-*/
-DESKTOP_DEPLOYMENTMISC_DLLPUBLIC
-void writeConsole(::rtl::OString const & sText);
-
 /** writes the argument to the console using the error stream.
     Otherwise the same as writeConsole.
 */
@@ -144,13 +135,6 @@ DESKTOP_DEPLOYMENTMISC_DLLPUBLIC
 void writeConsoleError(::rtl::OUString const & sText);
 
 
-/** writes the argument to the console using the error stream.
-    Otherwise the same as writeConsole.
-*/
-DESKTOP_DEPLOYMENTMISC_DLLPUBLIC
-void writeConsoleError(::rtl::OString const & sText);
-
-
 /** reads from the console.
     On Linux/Unix/etc. it uses fgets to read char values and converts them to OUString
     using osl_getThreadTextEncoding as target encoding. The returned string has a maximum
@@ -165,8 +149,6 @@ DESKTOP_DEPLOYMENTMISC_DLLPUBLIC
 */
 DESKTOP_DEPLOYMENTMISC_DLLPUBLIC
 void TRACE(::rtl::OUString const & sText);
-DESKTOP_DEPLOYMENTMISC_DLLPUBLIC
-void TRACE(::rtl::OString const & sText);
 
 /** registers or revokes shared or bundled extensions which have been
     recently added or removed.
diff --git a/desktop/source/deployment/registry/configuration/dp_configuration.cxx b/desktop/source/deployment/registry/configuration/dp_configuration.cxx
index 12e5f50..dd1b00b 100644
--- a/desktop/source/deployment/registry/configuration/dp_configuration.cxx
+++ b/desktop/source/deployment/registry/configuration/dp_configuration.cxx
@@ -244,8 +244,8 @@ BackendImpl::BackendImpl(
             }
             catch (const Exception &e)
             {
-                rtl::OStringBuffer aStr( "Exception loading legacy package database: '" );
-                aStr.append( rtl::OUStringToOString( e.Message, osl_getThreadTextEncoding() ) );
+                rtl::OUStringBuffer aStr( "Exception loading legacy package database: '" );
+                aStr.append( e.Message );
                 aStr.append( "' - ignoring file, please remove it.\n" );
                 dp_misc::writeConsole( aStr.getStr() );
             }
diff --git a/sal/CppunitTest_sal_rtl_strings.mk b/sal/CppunitTest_sal_rtl_strings.mk
index f43e7fd..8bc5370 100644
--- a/sal/CppunitTest_sal_rtl_strings.mk
+++ b/sal/CppunitTest_sal_rtl_strings.mk
@@ -33,6 +33,7 @@ $(eval $(call gb_CppunitTest_add_exception_objects,sal_rtl_strings,\
     sal/qa/rtl/strings/test_oustring_convert \
     sal/qa/rtl/strings/test_oustring_endswith \
     sal/qa/rtl/strings/test_oustring_noadditional \
+    sal/qa/rtl/strings/test_oustring_stringliterals \
 ))
 
 $(eval $(call gb_CppunitTest_add_linked_libs,sal_rtl_strings,\
diff --git a/sal/inc/rtl/ustring.hxx b/sal/inc/rtl/ustring.hxx
index faff676..f55fb7d 100644
--- a/sal/inc/rtl/ustring.hxx
+++ b/sal/inc/rtl/ustring.hxx
@@ -168,6 +168,65 @@ public:
     }
 
     /**
+      New string from an 8-Bit string literal that is expected to be in UTF-8
+      (or its subset, ASCII). All string literals in the codebase are
+      assumed to be only UTF-8/ASCII, so this constructor allows an efficient
+      and convenient way to create OUString instances from literals.
+
+      @param    value           the 8-bit string literal
+
+      @exception std::bad_alloc is thrown if an out-of-memory condition occurs
+    */
+    template< int N >
+    OUString( const char (&literal)[ N ] )
+    {
+        pData = 0;
+        rtl_string2UString( &pData, literal, N - 1, RTL_TEXTENCODING_UTF8, OSTRING_TO_OUSTRING_CVTFLAGS );
+        if (pData == 0) {
+#if defined EXCEPTIONS_OFF
+            SAL_WARN("sal", "std::bad_alloc but EXCEPTIONS_OFF");
+#else
+            throw std::bad_alloc();
+#endif
+        }
+    }
+
+    /**
+     * This overload exists only to avoid creating instances directly from (non-const) char[],
+     * which would otherwise be picked up by the optimized const char[] constructor.
+     * Since the non-const array cannot be guaranteed to contain characters in the expected
+     * UTF-8/ASCII encoding, this needs to be prevented.
+     *
+     * It is an error to try to call this overload.
+     *
+     * @internal
+     */
+    template< int N >
+    OUString( char (&value)[ N ] )
+#ifndef RTL_STRING_UNITTEST
+        ; // intentionally not implemented
+#else
+    {
+        (void) value; // unused
+        pData = 0; // for the unittest create an empty string
+        rtl_uString_new( &pData );
+    }
+#endif
+
+#ifdef RTL_STRING_UNITTEST
+    /**
+     * Only used by unittests to detect incorrect conversions.
+     * @internal
+     */
+    template< typename T >
+    OUString( T )
+    {
+        pData = 0;
+        rtl_uString_new( &pData );
+    }
+#endif
+
+    /**
       New string from a 8-Bit character buffer array.
 
       @param    value           a 8-Bit character array.
@@ -1722,6 +1781,9 @@ public:
       all ASCII characters are in the allowed range between 0 and
       127. The ASCII string must be NULL-terminated.
 
+      Note that for string literals it is simpler and more efficient
+      to directly use the OUString constructor.
+
       @param    value       the 8-Bit ASCII character string
       @return   a string with the string representation of the argument.
      */
diff --git a/sal/inc/sal/log-areas.dox b/sal/inc/sal/log-areas.dox
index d89bbdc..7c2d8ce 100644
--- a/sal/inc/sal/log-areas.dox
+++ b/sal/inc/sal/log-areas.dox
@@ -25,6 +25,10 @@ certain functionality.
 
 @li oox.xmlstream - XmlStream class
 
+ at section SAL/RTL
+
+ at li rtl.string - rtl::OString, rtl::OUString and related functionality
+
 @section VCL
 
 @li vcl.gdi - the GDI part of VCL: devices, bitmaps, etc.
diff --git a/sal/qa/rtl/strings/test_oustring_stringliterals.cxx b/sal/qa/rtl/strings/test_oustring_stringliterals.cxx
new file mode 100644
index 0000000..142f53d
--- /dev/null
+++ b/sal/qa/rtl/strings/test_oustring_stringliterals.cxx
@@ -0,0 +1,91 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org.  If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+// activate the extra needed ctor
+#define RTL_STRING_UNITTEST
+
+#include "sal/config.h"
+#include "sal/precppunit.hxx"
+
+#include <cppunit/TestFixture.h>
+#include <cppunit/extensions/HelperMacros.h>
+#include "rtl/string.h"
+#include "rtl/ustring.hxx"
+
+namespace test { namespace oustring {
+
+class StringLiterals: public CppUnit::TestFixture
+{
+private:
+    void checkCtors();
+
+    void testcall( const char str[] );
+    // invalid conversions will trigger templated OUString ctor that creates an empty string
+    // (see RTL_STRING_UNITTEST)
+    bool validConversion( const rtl::OUString& str ) { return !str.isEmpty(); }
+
+CPPUNIT_TEST_SUITE(StringLiterals);
+CPPUNIT_TEST(checkCtors);
+CPPUNIT_TEST_SUITE_END();
+};
+
+void test::oustring::StringLiterals::checkCtors()
+{
+    CPPUNIT_ASSERT( validConversion( rtl::OUString( "test" )));
+    const char good1[] = "test";
+    CPPUNIT_ASSERT( validConversion( rtl::OUString( good1 )));
+
+    CPPUNIT_ASSERT( !validConversion( rtl::OUString( (const char*) "test" )));
+    const char* bad1 = good1;
+    CPPUNIT_ASSERT( !validConversion( rtl::OUString( bad1 )));
+    char bad2[] = "test";
+    CPPUNIT_ASSERT( !validConversion( rtl::OUString( bad2 )));
+    char* bad3 = bad2;
+    CPPUNIT_ASSERT( !validConversion( rtl::OUString( bad3 )));
+    const char* bad4[] = { "test1" };
+    CPPUNIT_ASSERT( !validConversion( rtl::OUString( bad4[ 0 ] )));
+    testcall( good1 );
+
+// This one is technically broken, since the first element is 6 characters test\0\0,
+// but there does not appear a way to detect this by compile time (runtime will complain).
+// RTL_CONSTASCII_USTRINGPARAM() has the same flaw.
+    const char bad5[][ 6 ] = { "test", "test2" };
+//    CPPUNIT_ASSERT( validConversion( rtl::OUString( bad5[ 0 ] )));
+    CPPUNIT_ASSERT( validConversion( rtl::OUString( bad5[ 1 ] )));
+}
+
+void test::oustring::StringLiterals::testcall( const char str[] )
+{
+    CPPUNIT_ASSERT( !validConversion( rtl::OUString( str )));
+}
+
+}} // namespace
+
+CPPUNIT_TEST_SUITE_REGISTRATION(test::oustring::StringLiterals);
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sal/rtl/source/ustring.cxx b/sal/rtl/source/ustring.cxx
index 0156cea..d7f8a96 100644
--- a/sal/rtl/source/ustring.cxx
+++ b/sal/rtl/source/ustring.cxx
@@ -45,6 +45,7 @@
 
 #include <string.h>
 #include <sal/alloca.h>
+#include <sal/log.hxx>
 
 #include "hash.hxx"
 #include "strimp.hxx"
@@ -600,7 +601,7 @@ static void rtl_string2UString_status( rtl_uString** ppThis,
             do
             {
                 /* Check ASCII range */
-                OSL_ENSURE( ((unsigned char)*pStr) <= 127,
+                SAL_WARN_IF( ((unsigned char)*pStr) > 127, "rtl.string",
                             "rtl_string2UString_status() - Found char > 127 and RTL_TEXTENCODING_ASCII_US is specified" );
 
                 *pBuffer = *pStr;
diff --git a/svl/source/misc/inethist.cxx b/svl/source/misc/inethist.cxx
index 16745c0..e9a2bb0 100644
--- a/svl/source/misc/inethist.cxx
+++ b/svl/source/misc/inethist.cxx
@@ -443,14 +443,14 @@ void INetURLHistory::NormalizeUrl_Impl (INetURLObject &rUrl)
             if (!rUrl.HasPort())
                 rUrl.SetPort (INETHIST_DEF_HTTP_PORT);
             if (!rUrl.HasURLPath())
-                rUrl.SetURLPath ("/");
+                rUrl.SetURLPath (rtl::OString("/"));
             break;
 
         case INET_PROT_HTTPS:
             if (!rUrl.HasPort())
                 rUrl.SetPort (INETHIST_DEF_HTTPS_PORT);
             if (!rUrl.HasURLPath())
-                rUrl.SetURLPath ("/");
+                rUrl.SetURLPath (rtl::OString("/"));
             break;
 
         default:


More information about the Libreoffice-commits mailing list