OUString ctor for string literals without RTL_CONSTASCII stuff
http://lists.freedesktop.org/archives/libreoffice/2012-February/025662.html
This commit is contained in:
parent
768da51104
commit
f150ed241f
10 changed files with 172 additions and 31 deletions
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
|
@ -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.
|
||||
|
|
|
@ -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() );
|
||||
}
|
||||
|
|
|
@ -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,\
|
||||
|
|
|
@ -167,6 +167,65 @@ public:
|
|||
rtl_uString_newFromStr_WithLength( &pData, value, length );
|
||||
}
|
||||
|
||||
/**
|
||||
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.
|
||||
|
||||
|
@ -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.
|
||||
*/
|
||||
|
|
|
@ -25,6 +25,10 @@ certain functionality.
|
|||
|
||||
@li oox.xmlstream - XmlStream class
|
||||
|
||||
@section SAL/RTL
|
||||
|
||||
@li rtl.string - rtl::OString, rtl::OUString and related functionality
|
||||
|
||||
@section VCL
|
||||
|
||||
@li vcl.gdi - the GDI part of VCL: devices, bitmaps, etc.
|
||||
|
|
91
sal/qa/rtl/strings/test_oustring_stringliterals.cxx
Normal file
91
sal/qa/rtl/strings/test_oustring_stringliterals.cxx
Normal file
|
@ -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: */
|
|
@ -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;
|
||||
|
|
|
@ -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:
|
||||
|
|
Loading…
Reference in a new issue