From b2f97d77237cde249b4c40acc8ad3f7f8755e768 Mon Sep 17 00:00:00 2001 From: Fridrich Štrba Date: Thu, 30 May 2013 11:46:35 +0200 Subject: Fix crash with fdo60063-1.docx Compared to the original version, this one tries hard not to produce empty keywords. Change-Id: I11d036c2d54cde2d3c311a77c115011246f38d0a Reviewed-on: https://gerrit.libreoffice.org/4091 Reviewed-by: Fridrich Strba Tested-by: Fridrich Strba --- oox/source/docprop/docprophandler.cxx | 40 +++++++++++------------------------ 1 file changed, 12 insertions(+), 28 deletions(-) (limited to 'oox/source/docprop') diff --git a/oox/source/docprop/docprophandler.cxx b/oox/source/docprop/docprophandler.cxx index d81199f924e3..90da8a42070e 100644 --- a/oox/source/docprop/docprophandler.cxx +++ b/oox/source/docprop/docprophandler.cxx @@ -25,6 +25,8 @@ #include +#include + #include "oox/helper/attributelist.hxx" using namespace ::com::sun::star; @@ -158,39 +160,21 @@ uno::Sequence< OUString > OOXMLDocPropHandler::GetKeywordsSet( const OUString& a { if ( !aChars.isEmpty() ) { - uno::Sequence< OUString > aResult( 20 ); - sal_Int32 nCounter = 0; + std::string aUtf8Chars = OUStringToOString( aChars, RTL_TEXTENCODING_UTF8 ).getStr(); + std::vector aUtf8Result; + boost::split( aUtf8Result, aUtf8Chars, boost::is_any_of(" ,;:\t"), boost::token_compress_on ); - const sal_Unicode* pStr = aChars.getStr(); - for( sal_Int32 nInd = 0; nInd < aChars.getLength() && pStr[nInd] != 0; nInd++ ) + if (!aUtf8Result.empty()) { - switch( pStr[nInd] ) - { - case (sal_Unicode)' ': - case (sal_Unicode)',': - case (sal_Unicode)';': - case (sal_Unicode)':': - case (sal_Unicode)'\t': - // this is a delimiter - // unfortunately I did not find any specification for the possible delimiters - if ( !aResult[nCounter].isEmpty() ) - { - if ( nCounter >= aResult.getLength() ) - aResult.realloc( nCounter + 10 ); - nCounter++; - } - break; + uno::Sequence< OUString > aResult( aUtf8Result.size() ); + OUString* pResultValues = aResult.getArray(); + for ( std::vector< std::string >::const_iterator i = aUtf8Result.begin(); + i != aUtf8Result.end(); ++i, ++pResultValues ) + *pResultValues = OUString( i->c_str(), static_cast< sal_Int32 >( i->size() ),RTL_TEXTENCODING_UTF8 ); - default: - // this should be a part of keyword - aResult[nCounter] += OUString( (sal_Unicode)pStr[nInd] ); - } + return aResult; } - - aResult.realloc( nCounter + 1 ); - return aResult; } - return uno::Sequence< OUString >(); } // ------------------------------------------------ -- cgit