summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/sax/fastattribs.hxx52
-rw-r--r--sc/source/filter/xml/xmlbodyi.cxx17
-rw-r--r--sc/source/filter/xml/xmlcelli.cxx54
-rw-r--r--sc/source/filter/xml/xmlrowi.cxx17
-rw-r--r--sc/source/filter/xml/xmltabi.cxx23
5 files changed, 102 insertions, 61 deletions
diff --git a/include/sax/fastattribs.hxx b/include/sax/fastattribs.hxx
index eeb4064e82fa..112e67801262 100644
--- a/include/sax/fastattribs.hxx
+++ b/include/sax/fastattribs.hxx
@@ -102,6 +102,58 @@ public:
virtual css::uno::Sequence< css::xml::Attribute > SAL_CALL getUnknownAttributes( ) override;
virtual css::uno::Sequence< css::xml::FastAttribute > SAL_CALL getFastAttributes() override;
+ /// Use for fast iteration and conversion of attributes
+ class FastAttributeIter {
+ const FastAttributeList &mrList;
+ size_t mnIdx;
+
+ public:
+ FastAttributeIter(const FastAttributeList &rList, size_t nIdx)
+ : mrList(rList), mnIdx(nIdx)
+ {
+ }
+
+ FastAttributeIter& operator++ ()
+ {
+ mnIdx++;
+ return *this;
+ }
+ bool operator!=( const FastAttributeIter& rhs ) const
+ {
+ return mnIdx != rhs.mnIdx;
+ }
+
+ sal_Int32 getToken()
+ {
+ assert(mnIdx < mrList.maAttributeTokens.size());
+ return mrList.maAttributeTokens[mnIdx];
+ }
+ bool isEmpty()
+ {
+ assert(mnIdx < mrList.maAttributeTokens.size());
+ return mrList.AttributeValueLength(mnIdx) < 1;
+ }
+ sal_Int32 toInt32()
+ {
+ assert(mnIdx < mrList.maAttributeTokens.size());
+ return rtl_str_toInt32(mrList.getFastAttributeValue(mnIdx), 10);
+ }
+ OUString toString()
+ {
+ assert(mnIdx < mrList.maAttributeTokens.size());
+ return OUString(mrList.getFastAttributeValue(mnIdx),
+ mrList.AttributeValueLength(mnIdx),
+ RTL_TEXTENCODING_UTF8);
+ }
+ bool isString(const char *str)
+ {
+ assert(mnIdx < mrList.maAttributeTokens.size());
+ return !strcmp(str, mrList.getFastAttributeValue(mnIdx));
+ }
+ };
+ const FastAttributeIter begin() const { return FastAttributeIter(*this, 0); }
+ const FastAttributeIter end() const { return FastAttributeIter(*this, maAttributeTokens.size()); }
+
private:
sal_Char *mpChunk; ///< buffer to store all attribute values - null terminated strings
sal_Int32 mnChunkLength; ///< size of allocated memory for mpChunk
diff --git a/sc/source/filter/xml/xmlbodyi.cxx b/sc/source/filter/xml/xmlbodyi.cxx
index 486cea560fed..bb6ba3fa0fc8 100644
--- a/sc/source/filter/xml/xmlbodyi.cxx
+++ b/sc/source/filter/xml/xmlbodyi.cxx
@@ -97,28 +97,25 @@ ScXMLBodyContext::ScXMLBodyContext( ScXMLImport& rImport,
assert( dynamic_cast< sax_fastparser::FastAttributeList *>( xAttrList.get() ) != nullptr );
pAttribList = static_cast< sax_fastparser::FastAttributeList *>( xAttrList.get() );
- const std::vector< sal_Int32 >& rAttrList = pAttribList->getFastAttributeTokens();
- for ( size_t i = 0; i < rAttrList.size(); i++ )
+ for ( auto it = pAttribList->begin(); it != pAttribList->end(); ++it)
{
- sal_Int32 nToken = rAttrList[ i ];
- const OUString sValue = OUString(pAttribList->getFastAttributeValue(i),
- pAttribList->AttributeValueLength(i), RTL_TEXTENCODING_UTF8);
+ sal_Int32 nToken = it.getToken();
if( NAMESPACE_TOKEN( XML_NAMESPACE_TABLE ) == ( nToken & NMSP_MASK ) )
{
const sal_Int32 nLocalToken = nToken & TOKEN_MASK;
if( nLocalToken == XML_STRUCTURE_PROTECTED )
- bProtected = IsXMLToken(sValue, XML_TRUE);
+ bProtected = IsXMLToken( it.toString(), XML_TRUE );
else if ( nLocalToken == XML_PROTECTION_KEY )
- sPassword = sValue;
+ sPassword = it.toString();
else if ( nLocalToken == XML_PROTECTION_KEY_DIGEST_ALGORITHM )
- meHash1 = ScPassHashHelper::getHashTypeFromURI( sValue );
+ meHash1 = ScPassHashHelper::getHashTypeFromURI( it.toString() );
else if ( nLocalToken == XML_PROTECTION_KEY_DIGEST_ALGORITHM_2 )
- meHash2 = ScPassHashHelper::getHashTypeFromURI( sValue );
+ meHash2 = ScPassHashHelper::getHashTypeFromURI( it.toString() );
}
else if ( nToken == ( NAMESPACE_TOKEN( XML_NAMESPACE_LO_EXT ) |
XML_PROTECTION_KEY_DIGEST_ALGORITHM_2 ) )
{
- meHash2 = ScPassHashHelper::getHashTypeFromURI( sValue );
+ meHash2 = ScPassHashHelper::getHashTypeFromURI( it.toString() );
}
}
}
diff --git a/sc/source/filter/xml/xmlcelli.cxx b/sc/source/filter/xml/xmlcelli.cxx
index 0f6292c3fff7..70b5b745f277 100644
--- a/sc/source/filter/xml/xmlcelli.cxx
+++ b/sc/source/filter/xml/xmlcelli.cxx
@@ -165,60 +165,57 @@ ScXMLTableRowCellContext::ScXMLTableRowCellContext( ScXMLImport& rImport,
assert( dynamic_cast< sax_fastparser::FastAttributeList *>( xAttrList.get() ) != nullptr );
pAttribList = static_cast< sax_fastparser::FastAttributeList *>( xAttrList.get() );
- const std::vector< sal_Int32 >& rAttrList = pAttribList->getFastAttributeTokens();
- for ( size_t i = 0; i < rAttrList.size(); i++ )
+ for ( auto it = pAttribList->begin(); it != pAttribList->end(); ++it)
{
- sal_uInt16 nToken = rTokenMap.Get( rAttrList[ i ] );
- const OUString sValue = OUString(pAttribList->getFastAttributeValue(i),
- pAttribList->AttributeValueLength(i), RTL_TEXTENCODING_UTF8);
+ sal_uInt16 nToken = rTokenMap.Get( it.getToken() );
switch ( nToken )
{
case XML_TOK_TABLE_ROW_CELL_ATTR_STYLE_NAME:
- xStyleName.reset(new OUString(sValue));
+ xStyleName.reset( new OUString( it.toString() ) );
mbHasStyle = true;
break;
case XML_TOK_TABLE_ROW_CELL_ATTR_CONTENT_VALIDATION_NAME:
OSL_ENSURE(!maContentValidationName, "here should be only one Validation Name");
- if (!sValue.isEmpty())
- maContentValidationName.reset(sValue);
+ if (!it.isEmpty())
+ maContentValidationName.reset(it.toString());
break;
case XML_TOK_TABLE_ROW_CELL_ATTR_SPANNED_ROWS:
bIsMerged = true;
- nMergedRows = static_cast<SCROW>(sValue.toInt32());
+ nMergedRows = static_cast<SCROW>(it.toInt32());
break;
case XML_TOK_TABLE_ROW_CELL_ATTR_SPANNED_COLS:
bIsMerged = true;
- nMergedCols = static_cast<SCCOL>(sValue.toInt32());
+ nMergedCols = static_cast<SCCOL>(it.toInt32());
break;
case XML_TOK_TABLE_ROW_CELL_ATTR_SPANNED_MATRIX_COLS:
bIsMatrix = true;
- nMatrixCols = static_cast<SCCOL>(sValue.toInt32());
+ nMatrixCols = static_cast<SCCOL>(it.toInt32());
break;
case XML_TOK_TABLE_ROW_CELL_ATTR_SPANNED_MATRIX_ROWS:
bIsMatrix = true;
- nMatrixRows = static_cast<SCROW>(sValue.toInt32());
+ nMatrixRows = static_cast<SCROW>(it.toInt32());
break;
case XML_TOK_TABLE_ROW_CELL_ATTR_REPEATED:
nColsRepeated = static_cast<SCCOL>(std::min<sal_Int32>( MAXCOLCOUNT,
- std::max( sValue.toInt32(), static_cast<sal_Int32>(1) ) ));
+ std::max( it.toInt32(), static_cast<sal_Int32>(1) ) ));
break;
case XML_TOK_TABLE_ROW_CELL_ATTR_VALUE_TYPE:
- nCellType = GetScImport().GetCellType(sValue);
+ nCellType = GetScImport().GetCellType(it.toString());
bIsEmpty = false;
break;
case XML_TOK_TABLE_ROW_CELL_ATTR_NEW_VALUE_TYPE:
- if(sValue == "error")
+ if(it.isString( "error" ) )
mbErrorValue = true;
else
- nCellType = GetScImport().GetCellType(sValue);
+ nCellType = GetScImport().GetCellType(it.toString());
bIsEmpty = false;
mbNewValueType = true;
break;
case XML_TOK_TABLE_ROW_CELL_ATTR_VALUE:
{
- if (!sValue.isEmpty())
+ if (!it.isEmpty())
{
- ::sax::Converter::convertDouble(fValue, sValue);
+ ::sax::Converter::convertDouble(fValue, it.toString());
bIsEmpty = false;
//if office:value="0", let's get the text:p in case this is
@@ -231,36 +228,37 @@ ScXMLTableRowCellContext::ScXMLTableRowCellContext( ScXMLImport& rImport,
break;
case XML_TOK_TABLE_ROW_CELL_ATTR_DATE_VALUE:
{
- if (!sValue.isEmpty() && rXMLImport.SetNullDateOnUnitConverter())
+ if (!it.isEmpty() && rXMLImport.SetNullDateOnUnitConverter())
{
- rXMLImport.GetMM100UnitConverter().convertDateTime(fValue, sValue);
+ rXMLImport.GetMM100UnitConverter().convertDateTime(fValue, it.toString());
bIsEmpty = false;
}
}
break;
case XML_TOK_TABLE_ROW_CELL_ATTR_TIME_VALUE:
{
- if (!sValue.isEmpty())
+ if (!it.isEmpty())
{
- ::sax::Converter::convertDuration(fValue, sValue);
+ ::sax::Converter::convertDuration(fValue, it.toString());
bIsEmpty = false;
}
}
break;
case XML_TOK_TABLE_ROW_CELL_ATTR_STRING_VALUE:
{
- if (!sValue.isEmpty())
+ if (!it.isEmpty())
{
OSL_ENSURE(!maStringValue, "here should be only one string value");
- maStringValue.reset(sValue);
+ maStringValue.reset(it.toString());
bIsEmpty = false;
}
}
break;
case XML_TOK_TABLE_ROW_CELL_ATTR_BOOLEAN_VALUE:
{
- if (!sValue.isEmpty())
+ if (!it.isEmpty())
{
+ const OUString sValue = it.toString();
if ( IsXMLToken(sValue, XML_TRUE) )
fValue = 1.0;
else if ( IsXMLToken(sValue, XML_FALSE) )
@@ -273,17 +271,17 @@ ScXMLTableRowCellContext::ScXMLTableRowCellContext( ScXMLImport& rImport,
break;
case XML_TOK_TABLE_ROW_CELL_ATTR_FORMULA:
{
- if (!sValue.isEmpty())
+ if (!it.isEmpty())
{
OSL_ENSURE(!maFormula, "here should be only one formula");
OUString aFormula, aFormulaNmsp;
- rXMLImport.ExtractFormulaNamespaceGrammar( aFormula, aFormulaNmsp, eGrammar, sValue );
+ rXMLImport.ExtractFormulaNamespaceGrammar( aFormula, aFormulaNmsp, eGrammar, it.toString() );
maFormula.reset( FormulaWithNamespace(aFormula, aFormulaNmsp) );
}
}
break;
case XML_TOK_TABLE_ROW_CELL_ATTR_CURRENCY:
- xCurrencySymbol.reset(new OUString(sValue));
+ xCurrencySymbol.reset( new OUString( it.toString() ) );
break;
default:
;
diff --git a/sc/source/filter/xml/xmlrowi.cxx b/sc/source/filter/xml/xmlrowi.cxx
index a8409582444d..0be493426951 100644
--- a/sc/source/filter/xml/xmlrowi.cxx
+++ b/sc/source/filter/xml/xmlrowi.cxx
@@ -59,37 +59,34 @@ ScXMLTableRowContext::ScXMLTableRowContext( ScXMLImport& rImport,
assert( dynamic_cast< sax_fastparser::FastAttributeList *>( xAttrList.get() ) != nullptr );
pAttribList = static_cast< sax_fastparser::FastAttributeList *>( xAttrList.get() );
- const std::vector< sal_Int32 >& rAttrList = pAttribList->getFastAttributeTokens();
- for ( size_t i = 0; i < rAttrList.size(); i++ )
+ for ( auto it = pAttribList->begin(); it != pAttribList->end(); ++it)
{
- const OUString sValue = OUString(pAttribList->getFastAttributeValue(i),
- pAttribList->AttributeValueLength(i), RTL_TEXTENCODING_UTF8);
- switch( rAttrTokenMap.Get( rAttrList[ i ] ) )
+ switch( rAttrTokenMap.Get( it.getToken() ) )
{
case XML_TOK_TABLE_ROW_ATTR_STYLE_NAME:
{
- sStyleName = sValue;
+ sStyleName = it.toString();
}
break;
case XML_TOK_TABLE_ROW_ATTR_VISIBILITY:
{
- sVisibility = sValue;
+ sVisibility = it.toString();
}
break;
case XML_TOK_TABLE_ROW_ATTR_REPEATED:
{
- nRepeatedRows = std::max( sValue.toInt32(), (sal_Int32) 1 );
+ nRepeatedRows = std::max( it.toInt32(), (sal_Int32) 1 );
nRepeatedRows = std::min( nRepeatedRows, MAXROWCOUNT );
}
break;
case XML_TOK_TABLE_ROW_ATTR_DEFAULT_CELL_STYLE_NAME:
{
- sCellStyleName = sValue;
+ sCellStyleName = it.toString();
}
break;
/*case XML_TOK_TABLE_ROW_ATTR_USE_OPTIMAL_HEIGHT:
{
- sOptimalHeight = sValue;
+ sOptimalHeight = it.toString();
}
break;*/
}
diff --git a/sc/source/filter/xml/xmltabi.cxx b/sc/source/filter/xml/xmltabi.cxx
index f482b13fee24..065ee000bd10 100644
--- a/sc/source/filter/xml/xmltabi.cxx
+++ b/sc/source/filter/xml/xmltabi.cxx
@@ -151,37 +151,34 @@ ScXMLTableContext::ScXMLTableContext( ScXMLImport& rImport,
pAttribList = static_cast< sax_fastparser::FastAttributeList *>( xAttrList.get() );
const SvXMLTokenMap& rAttrTokenMap = GetScImport().GetTableAttrTokenMap();
- const std::vector< sal_Int32 >& rAttrList = pAttribList->getFastAttributeTokens();
- for ( size_t i = 0; i < rAttrList.size(); i++ )
+ for ( auto it = pAttribList->begin(); it != pAttribList->end(); ++it)
{
- const OUString sValue = OUString(pAttribList->getFastAttributeValue(i),
- pAttribList->AttributeValueLength(i), RTL_TEXTENCODING_UTF8);
- switch( rAttrTokenMap.Get( rAttrList[ i ] ) )
+ switch( rAttrTokenMap.Get( it.getToken() ) )
{
case XML_TOK_TABLE_NAME:
- sName = sValue;
+ sName = it.toString();
break;
case XML_TOK_TABLE_STYLE_NAME:
- sStyleName = sValue;
+ sStyleName = it.toString();
break;
case XML_TOK_TABLE_PROTECTED:
- aProtectData.mbProtected = IsXMLToken(sValue, XML_TRUE);
+ aProtectData.mbProtected = IsXMLToken( it.toString(), XML_TRUE );
break;
case XML_TOK_TABLE_PRINT_RANGES:
- sPrintRanges = sValue;
+ sPrintRanges = it.toString();
break;
case XML_TOK_TABLE_PASSWORD:
- aProtectData.maPassword = sValue;
+ aProtectData.maPassword = it.toString();
break;
case XML_TOK_TABLE_PASSHASH:
- aProtectData.meHash1 = ScPassHashHelper::getHashTypeFromURI( sValue );
+ aProtectData.meHash1 = ScPassHashHelper::getHashTypeFromURI( it.toString() );
break;
case XML_TOK_TABLE_PASSHASH_2:
- aProtectData.meHash2 = ScPassHashHelper::getHashTypeFromURI( sValue );
+ aProtectData.meHash2 = ScPassHashHelper::getHashTypeFromURI( it.toString() );
break;
case XML_TOK_TABLE_PRINT:
{
- if (IsXMLToken(sValue, XML_FALSE))
+ if (IsXMLToken( it.toString(), XML_FALSE) )
bPrintEntireSheet = false;
}
break;