[ooo-build-commit] patches/dev300
Jan Holesovsky
kendy at kemper.freedesktop.org
Fri Jul 31 14:57:16 PDT 2009
patches/dev300/apply | 6
patches/dev300/xlsx-filter-as-a-separate-lib-m17-update.diff | 413 +++++++++++
2 files changed, 418 insertions(+), 1 deletion(-)
New commits:
commit 1309f3c188890209c67d26497393c9e0734de31e
Author: Jan Holesovsky <kendy at suse.cz>
Date: Fri Jul 31 23:51:10 2009 +0200
XLSX: Update to build with m17.
* patches/dev300/apply: Add the patch.
* patches/dev300/xlsx-filter-as-a-separate-lib-m17-update.diff: Introduce
the changes between m11 and m17 also in the sc/filter/xlsx subdir.
diff --git a/patches/dev300/apply b/patches/dev300/apply
index 8cacfdb..e3a561a 100644
--- a/patches/dev300/apply
+++ b/patches/dev300/apply
@@ -3153,9 +3153,13 @@ pptx-fix-connector-crash.diff, n#499129, thorsten
# For the purpose of the 3.1 release, all the pptx and xlsx are done as
# separate libraries as well, so that we are safe wrt. the binary export
-# FIXME: Remove this patch (and update the other pptx patches) after 3.1 is
+# FIXME: Remove this patch (and update the other xlsx patches) after 3.1 is
# branched
xlsx-filter-as-a-separate-lib.diff
+[ OOXMLExport >= ooo310-m17 ]
+# update with the changes introduced up to m17
+xlsx-filter-as-a-separate-lib-m17-update.diff
+[ OOXMLExport ]
# tweak to above ( associated with vba-fallback-to-calling-doc-context.diff )
xlsx-separate-lib-vba-fallback-tweak.diff
# Snapshot of the xlsx export filter at the time of creation of ooxml03
diff --git a/patches/dev300/xlsx-filter-as-a-separate-lib-m17-update.diff b/patches/dev300/xlsx-filter-as-a-separate-lib-m17-update.diff
new file mode 100644
index 0000000..081f2bb
--- /dev/null
+++ b/patches/dev300/xlsx-filter-as-a-separate-lib-m17-update.diff
@@ -0,0 +1,413 @@
+diff --git sc/source/filter/xlsx/xlsx-xichart.cxx sc/source/filter/xlsx/xlsx-xichart.cxx
+index 8364ccf..e48179d 100644
+--- sc/source/filter/xlsx/xlsx-xichart.cxx
++++ sc/source/filter/xlsx/xlsx-xichart.cxx
+@@ -633,8 +633,11 @@ Reference< XLabeledDataSequence > lclCreateLabeledDataSequence(
+ // ----------------------------------------------------------------------------
+
+ XclImpChSourceLink::XclImpChSourceLink( const XclImpChRoot& rRoot ) :
+- XclImpChRoot( rRoot ),
+- mpTokenArray(static_cast<ScTokenArray*>(NULL))
++ XclImpChRoot( rRoot )
++{
++}
++
++XclImpChSourceLink::~XclImpChSourceLink()
+ {
+ }
+
+@@ -645,6 +648,7 @@ void XclImpChSourceLink::ReadChSourceLink( XclImpStream& rStrm )
+ >> maData.mnFlags
+ >> maData.mnNumFmtIdx;
+
++ mpTokenArray.reset();
+ if( GetLinkType() == EXC_CHSRCLINK_WORKSHEET )
+ {
+ // read token array
+@@ -686,31 +690,34 @@ sal_uInt16 XclImpChSourceLink::GetCellCount() const
+ using namespace ::formula;
+
+ sal_uInt32 nCellCount = 0;
+- mpTokenArray->Reset();
+- for (const FormulaToken* p = mpTokenArray->First(); p; p = mpTokenArray->Next())
++ if( mpTokenArray.is() )
+ {
+- switch (p->GetType())
++ mpTokenArray->Reset();
++ for (const FormulaToken* p = mpTokenArray->First(); p; p = mpTokenArray->Next())
+ {
+- case svSingleRef:
+- case svExternalSingleRef:
+- // single cell
+- ++nCellCount;
+- break;
+- case svDoubleRef:
+- case svExternalDoubleRef:
++ switch (p->GetType())
+ {
+- // cell range
+- const ScComplexRefData& rData = static_cast<const ScToken*>(p)->GetDoubleRef();
+- const ScSingleRefData& s = rData.Ref1;
+- const ScSingleRefData& e = rData.Ref2;
+- SCsTAB nTab = e.nTab - s.nTab;
+- SCsCOL nCol = e.nCol - s.nCol;
+- SCsROW nRow = e.nRow - s.nRow;
+- nCellCount += static_cast<sal_uInt32>(nCol+1) *
+- static_cast<sal_uInt32>(nRow+1) *
+- static_cast<sal_uInt32>(nTab+1);
++ case svSingleRef:
++ case svExternalSingleRef:
++ // single cell
++ ++nCellCount;
++ break;
++ case svDoubleRef:
++ case svExternalDoubleRef:
++ {
++ // cell range
++ const ScComplexRefData& rData = static_cast<const ScToken*>(p)->GetDoubleRef();
++ const ScSingleRefData& s = rData.Ref1;
++ const ScSingleRefData& e = rData.Ref2;
++ SCsTAB nTab = e.nTab - s.nTab;
++ SCsCOL nCol = e.nCol - s.nCol;
++ SCsROW nRow = e.nRow - s.nRow;
++ nCellCount += static_cast<sal_uInt32>(nCol+1) *
++ static_cast<sal_uInt32>(nRow+1) *
++ static_cast<sal_uInt32>(nTab+1);
++ }
++ break;
+ }
+- break;
+ }
+ }
+ return limit_cast<sal_uInt16>(nCellCount);
+@@ -736,25 +743,23 @@ Reference< XDataSequence > XclImpChSourceLink::CreateDataSequence( const OUStrin
+ {
+ Reference< XDataSequence > xDataSeq;
+ Reference< XDataProvider > xDataProv = GetDataProvider();
+- if( xDataProv.is() )
++ if( xDataProv.is() && mpTokenArray.is() )
+ {
+- if (mpTokenArray)
++ ScCompiler aComp( GetDocPtr(), ScAddress(), *mpTokenArray );
++ aComp.SetGrammar( ::formula::FormulaGrammar::GRAM_ENGLISH );
++ OUStringBuffer aRangeRep;
++ aComp.CreateStringFromTokenArray( aRangeRep );
++ try
+ {
+- ScCompiler aComp(GetDocPtr(), ScAddress(), *mpTokenArray);
+- aComp.SetGrammar(::formula::FormulaGrammar::GRAM_ENGLISH);
+- OUStringBuffer aBuf;
+- aComp.CreateStringFromTokenArray(aBuf);
+- xDataSeq = xDataProv->createDataSequenceByRangeRepresentation(
+- aBuf.makeStringAndClear());
++ xDataSeq = xDataProv->createDataSequenceByRangeRepresentation( aRangeRep.makeStringAndClear() );
++ // set sequence role
++ ScfPropertySet aSeqProp( xDataSeq );
++ aSeqProp.SetProperty( EXC_CHPROP_ROLE, rRole );
+ }
+- else
++ catch( Exception& )
+ {
+ DBG_ERRORFILE( "XclImpChSourceLink::CreateDataSequence - cannot create data sequence" );
+ }
+-
+- // set sequence role
+- ScfPropertySet aSeqProp( xDataSeq );
+- aSeqProp.SetProperty( EXC_CHPROP_ROLE, rRole );
+ }
+ return xDataSeq;
+ }
+diff --git sc/source/filter/xlsx/xlsx-xistyle.cxx sc/source/filter/xlsx/xlsx-xistyle.cxx
+index 7f1627e..a83e203 100644
+--- sc/source/filter/xlsx/xlsx-xistyle.cxx
++++ sc/source/filter/xlsx/xlsx-xistyle.cxx
+@@ -1088,26 +1088,25 @@ void XclImpXF::ReadXF( XclImpStream& rStrm )
+ }
+ }
+
+-void XclImpXF::SetStyleName( const String& rStyleName )
++void XclImpXF::SetStyleName( const String& rStyleName, bool bBuiltIn, bool bForceCreate )
+ {
+ DBG_ASSERT( IsStyleXF(), "XclImpXF::SetStyleName - not a style XF" );
+- DBG_ASSERT( rStyleName.Len(), "XclImpXF::SetStyleName - style name empty" );
+- if( IsStyleXF() && !maStyleName.Len() )
++ DBG_ASSERT( rStyleName.Len() > 0, "XclImpXF::SetStyleName - style name empty" );
++ if( IsStyleXF() && (rStyleName.Len() > 0) )
+ {
+ maStyleName = rStyleName;
+- mbForceCreate = true;
++ mbWasBuiltIn = bBuiltIn;
++ mbForceCreate = bForceCreate;
+ }
+ }
+
+-void XclImpXF::SetBuiltInStyleName( sal_uInt8 nStyleId, sal_uInt8 nLevel )
++void XclImpXF::ChangeStyleName( const String& rStyleName )
+ {
+- DBG_ASSERT( IsStyleXF(), "XclImpXF::SetStyleName - not a style XF" );
+- if( IsStyleXF() && !maStyleName.Len() )
+- {
+- mbWasBuiltIn = true;
+- maStyleName = XclTools::GetBuiltInStyleName( nStyleId, nLevel );
+- mbForceCreate = nStyleId == EXC_STYLE_NORMAL; // force creation of "Default" style
+- }
++ DBG_ASSERT( IsStyleXF(), "XclImpXF::ChangeStyleName - not a style XF" );
++ DBG_ASSERT( rStyleName.Len() > 0, "XclImpXF::ChangeStyleName - new style name empty" );
++ DBG_ASSERT( maStyleName.Len() > 0, "XclImpXF::ChangeStyleName - old style name empty" );
++ if( IsStyleXF() && (rStyleName.Len() > 0) )
++ maStyleName = rStyleName;
+ }
+
+ void XclImpXF::CreateUserStyle()
+@@ -1239,6 +1238,7 @@ ScStyleSheet* XclImpXF::CreateStyleSheet()
+ {
+ if( !mpStyleSheet && maStyleName.Len() ) // valid name implies style XF
+ {
++ bool bCreatePattern = false;
+ // there may be a user-defined "Default" - test on built-in too!
+ bool bDefStyle = mbWasBuiltIn && (maStyleName == ScGlobal::GetRscString( STR_STYLENAME_STANDARD ));
+ if( bDefStyle )
+@@ -1249,16 +1249,23 @@ ScStyleSheet* XclImpXF::CreateStyleSheet()
+ mpStyleSheet = static_cast< ScStyleSheet* >( GetStyleSheetPool().Find(
+ ScGlobal::GetRscString( STR_STYLENAME_STANDARD ), SFX_STYLE_FAMILY_PARA ) );
+ DBG_ASSERT( mpStyleSheet, "XclImpXF::CreateStyleSheet - Default style not found" );
++ bCreatePattern = true;
+ }
+ else
+ {
+- /* mbWasBuiltIn==true forces renaming of equal-named user defined styles
+- to be able to re-export built-in styles correctly. */
+- mpStyleSheet = &ScfTools::MakeCellStyleSheet( GetStyleSheetPool(), maStyleName, mbWasBuiltIn );
++ /* #i103281# do not create another style sheet of the same name,
++ if it exists already. This is needed to prevent that styles
++ pasted from clipboard get duplicated over and over. */
++ mpStyleSheet = static_cast< ScStyleSheet* >( GetStyleSheetPool().Find( maStyleName, SFX_STYLE_FAMILY_PARA ) );
++ if( !mpStyleSheet )
++ {
++ mpStyleSheet = &static_cast< ScStyleSheet& >( GetStyleSheetPool().Make( maStyleName, SFX_STYLE_FAMILY_PARA, SFXSTYLEBIT_USERDEF ) );
++ bCreatePattern = true;
++ }
+ }
+
+ // bDefStyle==true omits default pool items in CreatePattern()
+- if( mpStyleSheet )
++ if( bCreatePattern && mpStyleSheet )
+ mpStyleSheet->GetItemSet().Put( CreatePattern( bDefStyle ).GetItemSet() );
+ }
+ return mpStyleSheet;
+@@ -1274,6 +1281,16 @@ XclImpXFBuffer::XclImpXFBuffer( const XclImpRoot& rRoot ) :
+ void XclImpXFBuffer::Initialize()
+ {
+ maXFList.Clear();
++ maStyleXFs.clear();
++ /* Reserve style names that are built-in in Calc. For BIFF4 workbooks
++ which contain a separate list of styles per sheet, reserve all existing
++ names if current sheet is not the first sheet. This will create unique
++ names for styles in different sheets with the same name. */
++ bool bReserveAll = (GetBiff() == EXC_BIFF4) && (GetCurrScTab() > 0);
++ SfxStyleSheetIterator aStyleIter( GetDoc().GetStyleSheetPool(), SFX_STYLE_FAMILY_PARA );
++ for( SfxStyleSheetBase* pStyleSheet = aStyleIter.First(); pStyleSheet; pStyleSheet = aStyleIter.Next() )
++ if( bReserveAll || !pStyleSheet->IsUserDefined() )
++ maStyleXFs[ pStyleSheet->GetName() ] = 0;
+ }
+
+ void XclImpXFBuffer::ReadXF( XclImpStream& rStrm )
+@@ -1282,9 +1299,9 @@ void XclImpXFBuffer::ReadXF( XclImpStream& rStrm )
+ pXF->ReadXF( rStrm );
+ maXFList.Append( pXF );
+
++ // set the name of the "Default" cell style (always the first XF in an Excel file)
+ if( (GetBiff() >= EXC_BIFF3) && (maXFList.Count() == 1) )
+- // set the name of the "Default" cell style (always the first XF in an Excel file)
+- pXF->SetBuiltInStyleName( EXC_STYLE_NORMAL, 0 );
++ CalcStyleName( *pXF, EXC_STYLE_NORMAL, 0 );
+ }
+
+ void XclImpXFBuffer::ReadStyle( XclImpStream& rStrm )
+@@ -1301,7 +1318,7 @@ void XclImpXFBuffer::ReadStyle( XclImpStream& rStrm )
+ {
+ sal_uInt8 nStyleId, nLevel;
+ rStrm >> nStyleId >> nLevel;
+- pXF->SetBuiltInStyleName( nStyleId, nLevel );
++ CalcStyleName( *pXF, nStyleId, nLevel );
+ }
+ else // user-defined styles
+ {
+@@ -1310,8 +1327,20 @@ void XclImpXFBuffer::ReadStyle( XclImpStream& rStrm )
+ aStyleName = rStrm.ReadByteString( false ); // 8 bit length
+ else
+ aStyleName = rStrm.ReadUniString();
+- if( aStyleName.Len() ) // #i1624# #i1768# ignore unnamed styles
+- pXF->SetStyleName( aStyleName );
++
++ if( aStyleName.Len() > 0 ) // #i1624# #i1768# ignore unnamed styles
++ {
++ // #i103281# check if this is a new built-in style introduced in XL2007
++ bool bBuiltIn = false;
++ if( (GetBiff() == EXC_BIFF8) && (rStrm.GetNextRecId() == EXC_ID_STYLEEXT) && rStrm.StartNextRecord() )
++ {
++ sal_uInt8 nExtFlags;
++ rStrm.Ignore( 12 );
++ rStrm >> nExtFlags;
++ bBuiltIn = ::get_flag( nExtFlags, EXC_STYLEEXT_BUILTIN );
++ }
++ CalcStyleName( *pXF, aStyleName, bBuiltIn );
++ }
+ }
+ }
+ }
+@@ -1345,6 +1374,49 @@ void XclImpXFBuffer::ApplyPattern(
+ }
+ }
+
++void XclImpXFBuffer::CalcStyleName( XclImpXF& rXF, const String& rStyleName, bool bBuiltIn )
++{
++ DBG_ASSERT( rStyleName.Len() > 0, "XclImpXFBuffer::CalcStyleName - style name empty" );
++ if( rStyleName.Len() > 0 )
++ {
++ String aStyleName = bBuiltIn ? XclTools::GetBuiltInStyleName( rStyleName ) : rStyleName;
++ SetStyleName( rXF, aStyleName, bBuiltIn, !bBuiltIn );
++ }
++}
++
++void XclImpXFBuffer::CalcStyleName( XclImpXF& rXF, sal_uInt8 nStyleId, sal_uInt8 nLevel )
++{
++ // force creation of "Default" style
++ SetStyleName( rXF, XclTools::GetBuiltInStyleName( nStyleId, nLevel ), true, nStyleId == EXC_STYLE_NORMAL );
++}
++
++void XclImpXFBuffer::SetStyleName( XclImpXF& rXF, const String& rStyleName, bool bBuiltIn, bool bForceCreate )
++{
++ DBG_ASSERT( rXF.IsStyleXF(), "XclImpXFBuffer::SetStyleName - not a style XF" );
++ if( rXF.IsStyleXF() )
++ {
++ // find an unused name
++ String aUnusedName( rStyleName );
++ sal_Int32 nIndex = 0;
++ while( maStyleXFs.count( aUnusedName ) > 0 )
++ aUnusedName.Assign( rStyleName ).Append( ' ' ).Append( String::CreateFromInt32( ++nIndex ) );
++
++ // move old style to new name, if new style is built-in
++ if( bBuiltIn && (aUnusedName != rStyleName) )
++ {
++ XclImpXF*& rpXF = maStyleXFs[ aUnusedName ];
++ rpXF = maStyleXFs[ rStyleName ];
++ if( rpXF )
++ rpXF->ChangeStyleName( aUnusedName );
++ aUnusedName = rStyleName;
++ }
++
++ // insert new style
++ maStyleXFs[ aUnusedName ] = &rXF;
++ rXF.SetStyleName( aUnusedName, bBuiltIn, bForceCreate );
++ }
++}
++
+ // Buffer for XF indexes in cells =============================================
+
+ IMPL_FIXEDMEMPOOL_NEWDEL( XclImpXFRange, 100, 500 )
+diff --git sc/source/filter/xlsx/xlsx-xltools.cxx sc/source/filter/xlsx/xlsx-xltools.cxx
+index ef38a00..a84aaba 100644
+--- sc/source/filter/xlsx/xlsx-xltools.cxx
++++ sc/source/filter/xlsx/xlsx-xltools.cxx
+@@ -511,7 +511,8 @@ sal_Unicode XclTools::GetBuiltInDefNameIndex( const String& rDefName )
+
+ // built-in style names -------------------------------------------------------
+
+-const String XclTools::maStyleNamePrefix( RTL_CONSTASCII_USTRINGPARAM( "Excel_BuiltIn_" ) );
++const String XclTools::maStyleNamePrefix1( RTL_CONSTASCII_USTRINGPARAM( "Excel_BuiltIn_" ) );
++const String XclTools::maStyleNamePrefix2( RTL_CONSTASCII_USTRINGPARAM( "Excel Built-in " ) );
+
+ static const sal_Char* const ppcStyleNames[] =
+ {
+@@ -534,7 +535,7 @@ String XclTools::GetBuiltInStyleName( sal_uInt8 nStyleId, sal_uInt8 nLevel )
+ if( nStyleId == EXC_STYLE_NORMAL ) // "Normal" becomes "Default" style
+ aStyleName = ScGlobal::GetRscString( STR_STYLENAME_STANDARD );
+ else if( nStyleId < STATIC_TABLE_SIZE( ppcStyleNames ) )
+- aStyleName.Assign( maStyleNamePrefix ).AppendAscii( ppcStyleNames[ nStyleId ] );
++ aStyleName.Assign( maStyleNamePrefix1 ).AppendAscii( ppcStyleNames[ nStyleId ] );
+
+ if( (nStyleId == EXC_STYLE_ROWLEVEL) || (nStyleId == EXC_STYLE_COLLEVEL) )
+ aStyleName.Append( String::CreateFromInt32( nLevel + 1 ) );
+@@ -542,6 +543,11 @@ String XclTools::GetBuiltInStyleName( sal_uInt8 nStyleId, sal_uInt8 nLevel )
+ return aStyleName;
+ }
+
++String XclTools::GetBuiltInStyleName( const String& rStyleName )
++{
++ return String( maStyleNamePrefix1 ).Append( rStyleName );
++}
++
+ bool XclTools::IsBuiltInStyleName( const String& rStyleName, sal_uInt8* pnStyleId, xub_StrLen* pnNextChar )
+ {
+ // "Default" becomes "Normal"
+@@ -553,10 +559,15 @@ bool XclTools::IsBuiltInStyleName( const String& rStyleName, sal_uInt8* pnStyleI
+ }
+
+ // try the other built-in styles
+- xub_StrLen nPrefixLen = maStyleNamePrefix.Len();
+ sal_uInt8 nFoundId = 0;
+ xub_StrLen nNextChar = 0;
+- if( rStyleName.EqualsIgnoreCaseAscii( maStyleNamePrefix, 0, nPrefixLen ) )
++
++ xub_StrLen nPrefixLen = 0;
++ if( rStyleName.EqualsIgnoreCaseAscii( maStyleNamePrefix1, 0, maStyleNamePrefix1.Len() ) )
++ nPrefixLen = maStyleNamePrefix1.Len();
++ else if( rStyleName.EqualsIgnoreCaseAscii( maStyleNamePrefix2, 0, maStyleNamePrefix2.Len() ) )
++ nPrefixLen = maStyleNamePrefix2.Len();
++ if( nPrefixLen > 0 )
+ {
+ String aShortName;
+ for( sal_uInt8 nId = 0; nId < STATIC_TABLE_SIZE( ppcStyleNames ); ++nId )
+@@ -583,14 +594,14 @@ bool XclTools::IsBuiltInStyleName( const String& rStyleName, sal_uInt8* pnStyleI
+
+ if( pnStyleId ) *pnStyleId = EXC_STYLE_USERDEF;
+ if( pnNextChar ) *pnNextChar = 0;
+- return false;
++ return nPrefixLen > 0; // also return true for unknown built-in styles
+ }
+
+ bool XclTools::GetBuiltInStyleId( sal_uInt8& rnStyleId, sal_uInt8& rnLevel, const String& rStyleName )
+ {
+ sal_uInt8 nStyleId;
+ xub_StrLen nNextChar;
+- if( IsBuiltInStyleName( rStyleName, &nStyleId, &nNextChar ) )
++ if( IsBuiltInStyleName( rStyleName, &nStyleId, &nNextChar ) && (nStyleId != EXC_STYLE_USERDEF) )
+ {
+ if( (nStyleId == EXC_STYLE_ROWLEVEL) || (nStyleId == EXC_STYLE_COLLEVEL) )
+ {
+@@ -617,24 +628,25 @@ bool XclTools::GetBuiltInStyleId( sal_uInt8& rnStyleId, sal_uInt8& rnLevel, cons
+
+ // conditional formatting style names -----------------------------------------
+
+-const String XclTools::maCFStyleNamePrefix( RTL_CONSTASCII_USTRINGPARAM( "Excel_CondFormat_" ) );
++const String XclTools::maCFStyleNamePrefix1( RTL_CONSTASCII_USTRINGPARAM( "Excel_CondFormat_" ) );
++const String XclTools::maCFStyleNamePrefix2( RTL_CONSTASCII_USTRINGPARAM( "ConditionalStyle_" ) );
+
+ String XclTools::GetCondFormatStyleName( SCTAB nScTab, sal_Int32 nFormat, sal_uInt16 nCondition )
+ {
+- return String( maCFStyleNamePrefix ).Append( String::CreateFromInt32( nScTab + 1 ) ).
++ return String( maCFStyleNamePrefix1 ).Append( String::CreateFromInt32( nScTab + 1 ) ).
+ Append( '_' ).Append( String::CreateFromInt32( nFormat + 1 ) ).
+ Append( '_' ).Append( String::CreateFromInt32( nCondition + 1 ) );
+ }
+
+ bool XclTools::IsCondFormatStyleName( const String& rStyleName, xub_StrLen* pnNextChar )
+ {
+- xub_StrLen nPrefixLen = maCFStyleNamePrefix.Len();
+- if( rStyleName.EqualsIgnoreCaseAscii( maCFStyleNamePrefix, 0, nPrefixLen ) )
+- {
+- if( pnNextChar ) *pnNextChar = nPrefixLen;
+- return true;
+- }
+- return false;
++ xub_StrLen nPrefixLen = 0;
++ if( rStyleName.EqualsIgnoreCaseAscii( maCFStyleNamePrefix1, 0, maCFStyleNamePrefix1.Len() ) )
++ nPrefixLen = maCFStyleNamePrefix1.Len();
++ else if( rStyleName.EqualsIgnoreCaseAscii( maCFStyleNamePrefix2, 0, maCFStyleNamePrefix2.Len() ) )
++ nPrefixLen = maCFStyleNamePrefix2.Len();
++ if( pnNextChar ) *pnNextChar = nPrefixLen;
++ return nPrefixLen > 0;
+ }
+
+ // stream handling ------------------------------------------------------------
More information about the ooo-build-commit
mailing list