[Libreoffice-commits] core.git: 2 commits - filter/source
Caolán McNamara
caolanm at redhat.com
Thu Mar 16 09:13:55 UTC 2017
filter/source/msfilter/svdfppt.cxx | 262 +++++++++++++++++++------------------
1 file changed, 136 insertions(+), 126 deletions(-)
New commits:
commit b9892037c303e645ee1a987d80734361700d91ac
Author: Caolán McNamara <caolanm at redhat.com>
Date: Thu Mar 16 09:13:13 2017 +0000
ofz#876 avoid accessing empty rows
Change-Id: Iba539fb03611bbe5627cc7976c1146d08a2ab5fd
diff --git a/filter/source/msfilter/svdfppt.cxx b/filter/source/msfilter/svdfppt.cxx
index 4f8f763..ae5a5a3 100644
--- a/filter/source/msfilter/svdfppt.cxx
+++ b/filter/source/msfilter/svdfppt.cxx
@@ -7584,6 +7584,10 @@ SdrObject* SdrPowerPointImport::CreateTable( SdrObject* pGroup, sal_uInt32* pTab
sdr::table::SdrTableObj* pTable = new sdr::table::SdrTableObj( pSdrModel );
pTable->uno_lock();
Reference< XTable > xTable( pTable->getTable() );
+
+ if (aRows.empty())
+ return pRet;
+
try
{
CreateTableRows( xTable->getRows(), aRows, pGroup->GetSnapRect().Bottom() );
commit 61bb3acc7f08f873b7062b50c4a02f20d2a19959
Author: Caolán McNamara <caolanm at redhat.com>
Date: Thu Mar 16 09:10:36 2017 +0000
return early
no logic change intended
Change-Id: I936413d3bcd0853db88fd800394aca95d94108f3
diff --git a/filter/source/msfilter/svdfppt.cxx b/filter/source/msfilter/svdfppt.cxx
index 143ace6..4f8f763 100644
--- a/filter/source/msfilter/svdfppt.cxx
+++ b/filter/source/msfilter/svdfppt.cxx
@@ -7554,158 +7554,164 @@ void ApplyCellLineAttributes( const SdrObject* pLine, Reference< XTable >& xTabl
SdrObject* SdrPowerPointImport::CreateTable( SdrObject* pGroup, sal_uInt32* pTableArry, SvxMSDffSolverContainer* pSolverContainer )
{
SdrObject* pRet = pGroup;
+
sal_uInt32 nRows = pTableArry[ 1 ];
- if ( nRows && dynamic_cast< const SdrObjGroup* >(pGroup) != nullptr )
+ if (!nRows)
+ return pRet;
+
+ const SdrObjGroup* pObjGroup = dynamic_cast<const SdrObjGroup*>(pGroup);
+ if (!pObjGroup)
+ return pRet;
+
+ SdrObjList* pSubList(pObjGroup->GetSubList());
+ if (!pSubList)
+ return pRet;
+
+ std::set< sal_Int32 > aRows;
+ std::set< sal_Int32 > aColumns;
+
+ SdrObjListIter aGroupIter( *pSubList, SdrIterMode::DeepNoGroups, false );
+ while( aGroupIter.IsMore() )
{
- SdrObjList* pSubList(static_cast<SdrObjGroup*>(pGroup)->GetSubList());
- if ( pSubList )
+ const SdrObject* pObj( aGroupIter.Next() );
+ if ( !IsLine( pObj ) )
{
- std::set< sal_Int32 > aRows;
- std::set< sal_Int32 > aColumns;
+ Rectangle aSnapRect( pObj->GetSnapRect() );
+ aRows.insert( aSnapRect.Top() );
+ aColumns.insert( aSnapRect.Left() );
+ }
+ }
+ sdr::table::SdrTableObj* pTable = new sdr::table::SdrTableObj( pSdrModel );
+ pTable->uno_lock();
+ Reference< XTable > xTable( pTable->getTable() );
+ try
+ {
+ CreateTableRows( xTable->getRows(), aRows, pGroup->GetSnapRect().Bottom() );
+ CreateTableColumns( xTable->getColumns(), aColumns, pGroup->GetSnapRect().Right() );
- SdrObjListIter aGroupIter( *pSubList, SdrIterMode::DeepNoGroups, false );
- while( aGroupIter.IsMore() )
- {
- const SdrObject* pObj( aGroupIter.Next() );
- if ( !IsLine( pObj ) )
+ sal_Int32 nCellCount = aRows.size() * aColumns.size();
+ std::unique_ptr<sal_Int32[]> pMergedCellIndexTable(new sal_Int32[ nCellCount ]);
+ for ( sal_Int32 i = 0; i < nCellCount; i++ )
+ pMergedCellIndexTable[ i ] = i;
+
+ aGroupIter.Reset();
+ while( aGroupIter.IsMore() )
+ {
+ SdrObject* pObj( aGroupIter.Next() );
+ if ( !IsLine( pObj ) )
+ {
+ sal_Int32 nTableIndex = 0;
+ sal_Int32 nRow = 0;
+ sal_Int32 nRowCount = 0;
+ sal_Int32 nColumn = 0;
+ sal_Int32 nColumnCount = 0;
+ if ( GetCellPosition( pObj, aRows, aColumns, nTableIndex, nRow, nRowCount, nColumn, nColumnCount ) )
{
- Rectangle aSnapRect( pObj->GetSnapRect() );
- aRows.insert( aSnapRect.Top() );
- aColumns.insert( aSnapRect.Left() );
- }
- }
- sdr::table::SdrTableObj* pTable = new sdr::table::SdrTableObj( pSdrModel );
- pTable->uno_lock();
- Reference< XTable > xTable( pTable->getTable() );
- try
- {
- CreateTableRows( xTable->getRows(), aRows, pGroup->GetSnapRect().Bottom() );
- CreateTableColumns( xTable->getColumns(), aColumns, pGroup->GetSnapRect().Right() );
+ Reference< XCell > xCell( xTable->getCellByPosition( nColumn, nRow ) );
- sal_Int32 nCellCount = aRows.size() * aColumns.size();
- std::unique_ptr<sal_Int32[]> pMergedCellIndexTable(new sal_Int32[ nCellCount ]);
- for ( sal_Int32 i = 0; i < nCellCount; i++ )
- pMergedCellIndexTable[ i ] = i;
+ ApplyCellAttributes( pObj, xCell );
- aGroupIter.Reset();
- while( aGroupIter.IsMore() )
- {
- SdrObject* pObj( aGroupIter.Next() );
- if ( !IsLine( pObj ) )
+ if ( ( nRowCount > 1 ) || ( nColumnCount > 1 ) ) // cell merging
{
- sal_Int32 nTableIndex = 0;
- sal_Int32 nRow = 0;
- sal_Int32 nRowCount = 0;
- sal_Int32 nColumn = 0;
- sal_Int32 nColumnCount = 0;
- if ( GetCellPosition( pObj, aRows, aColumns, nTableIndex, nRow, nRowCount, nColumn, nColumnCount ) )
+ MergeCells( xTable, nColumn, nRow, nColumnCount, nRowCount );
+ for ( sal_Int32 nRowIter = 0; nRowIter < nRowCount; nRowIter++ )
{
- Reference< XCell > xCell( xTable->getCellByPosition( nColumn, nRow ) );
-
- ApplyCellAttributes( pObj, xCell );
-
- if ( ( nRowCount > 1 ) || ( nColumnCount > 1 ) ) // cell merging
- {
- MergeCells( xTable, nColumn, nRow, nColumnCount, nRowCount );
- for ( sal_Int32 nRowIter = 0; nRowIter < nRowCount; nRowIter++ )
- {
- for ( sal_Int32 nColumnIter = 0; nColumnIter < nColumnCount; nColumnIter++ )
- { // now set the correct index for the merged cell
- pMergedCellIndexTable[ ( ( nRow + nRowIter ) * aColumns.size() ) + nColumn + nColumnIter ] = nTableIndex;
- }
- }
- }
-
- // applying text
- OutlinerParaObject* pParaObject = pObj->GetOutlinerParaObject();
- if ( pParaObject )
- {
- SdrText* pSdrText = pTable->getText( nTableIndex );
- if ( pSdrText )
- pSdrText->SetOutlinerParaObject(new OutlinerParaObject(*pParaObject) );
+ for ( sal_Int32 nColumnIter = 0; nColumnIter < nColumnCount; nColumnIter++ )
+ { // now set the correct index for the merged cell
+ pMergedCellIndexTable[ ( ( nRow + nRowIter ) * aColumns.size() ) + nColumn + nColumnIter ] = nTableIndex;
}
}
}
- }
- aGroupIter.Reset();
- while( aGroupIter.IsMore() )
- {
- SdrObject* pObj( aGroupIter.Next() );
- if ( IsLine( pObj ) )
- {
- std::vector< sal_Int32 > vPositions; // containing cell indexes + cell position
- GetLinePositions( pObj, aRows, aColumns, vPositions, pGroup->GetSnapRect() );
- // correcting merged cell position
- std::vector< sal_Int32 >::iterator aIter( vPositions.begin() );
- while( aIter != vPositions.end() )
- {
- sal_Int32 nOldPosition = *aIter & 0xffff;
- sal_Int32 nOldFlags = *aIter & 0xffff0000;
- sal_Int32 nNewPosition = pMergedCellIndexTable[ nOldPosition ] | nOldFlags;
- *aIter++ = nNewPosition;
- }
- ApplyCellLineAttributes( pObj, xTable, vPositions, aColumns.size() );
+ // applying text
+ OutlinerParaObject* pParaObject = pObj->GetOutlinerParaObject();
+ if ( pParaObject )
+ {
+ SdrText* pSdrText = pTable->getText( nTableIndex );
+ if ( pSdrText )
+ pSdrText->SetOutlinerParaObject(new OutlinerParaObject(*pParaObject) );
}
}
- pMergedCellIndexTable.reset();
+ }
+ }
+ aGroupIter.Reset();
+ while( aGroupIter.IsMore() )
+ {
+ SdrObject* pObj( aGroupIter.Next() );
+ if ( IsLine( pObj ) )
+ {
+ std::vector< sal_Int32 > vPositions; // containing cell indexes + cell position
+ GetLinePositions( pObj, aRows, aColumns, vPositions, pGroup->GetSnapRect() );
- // we are replacing the whole group object by a single table object, so
- // possibly connections to the group object have to be removed.
- if ( pSolverContainer )
+ // correcting merged cell position
+ std::vector< sal_Int32 >::iterator aIter( vPositions.begin() );
+ while( aIter != vPositions.end() )
{
- for (SvxMSDffConnectorRule* pPtr : pSolverContainer->aCList)
- {
- // check connections to the group object
- if ( pPtr->pAObj == pGroup )
- pPtr->pAObj = nullptr;
- if ( pPtr->pBObj == pGroup )
- pPtr->pBObj = nullptr;
-
- // check connections to all its subobjects
- SdrObjListIter aIter( *pGroup, SdrIterMode::DeepWithGroups );
- while( aIter.IsMore() )
- {
- SdrObject* pPartObj = aIter.Next();
- if ( pPtr->pAObj == pPartObj )
- pPtr->pAObj = nullptr;
- if ( pPtr->pBObj == pPartObj )
- pPtr->pBObj = nullptr;
- }
- //In MS, the one_row_one_col table is made up of five
- //shape,the connector is connected to some part of a
- //table. But for us, the connector is connected to the
- //whole group table,so the connector obj is a group
- //table when export by us. We should process this
- //situation when importing.
- if ( pPtr->pAObj == pGroup )
- pPtr->pAObj = pTable;
- if ( pPtr->pBObj == pGroup )
- pPtr->pBObj = pTable;
- }
+ sal_Int32 nOldPosition = *aIter & 0xffff;
+ sal_Int32 nOldFlags = *aIter & 0xffff0000;
+ sal_Int32 nNewPosition = pMergedCellIndexTable[ nOldPosition ] | nOldFlags;
+ *aIter++ = nNewPosition;
}
- pTable->uno_unlock();
- pTable->SetSnapRect( pGroup->GetSnapRect() );
- pRet = pTable;
+ ApplyCellLineAttributes( pObj, xTable, vPositions, aColumns.size() );
+ }
+ }
+ pMergedCellIndexTable.reset();
+
+ // we are replacing the whole group object by a single table object, so
+ // possibly connections to the group object have to be removed.
+ if ( pSolverContainer )
+ {
+ for (SvxMSDffConnectorRule* pPtr : pSolverContainer->aCList)
+ {
+ // check connections to the group object
+ if ( pPtr->pAObj == pGroup )
+ pPtr->pAObj = nullptr;
+ if ( pPtr->pBObj == pGroup )
+ pPtr->pBObj = nullptr;
- //Remove Objects from shape map
+ // check connections to all its subobjects
SdrObjListIter aIter( *pGroup, SdrIterMode::DeepWithGroups );
while( aIter.IsMore() )
{
SdrObject* pPartObj = aIter.Next();
- removeShapeId( pPartObj );
+ if ( pPtr->pAObj == pPartObj )
+ pPtr->pAObj = nullptr;
+ if ( pPtr->pBObj == pPartObj )
+ pPtr->pBObj = nullptr;
}
-
- SdrObject::Free( pGroup );
- }
- catch( const Exception& )
- {
- pTable->uno_unlock();
- SdrObject* pObj = pTable;
- SdrObject::Free( pObj );
- }
+ //In MS, the one_row_one_col table is made up of five
+ //shape,the connector is connected to some part of a
+ //table. But for us, the connector is connected to the
+ //whole group table,so the connector obj is a group
+ //table when export by us. We should process this
+ //situation when importing.
+ if ( pPtr->pAObj == pGroup )
+ pPtr->pAObj = pTable;
+ if ( pPtr->pBObj == pGroup )
+ pPtr->pBObj = pTable;
+ }
+ }
+ pTable->uno_unlock();
+ pTable->SetSnapRect( pGroup->GetSnapRect() );
+ pRet = pTable;
+
+ //Remove Objects from shape map
+ SdrObjListIter aIter( *pGroup, SdrIterMode::DeepWithGroups );
+ while( aIter.IsMore() )
+ {
+ SdrObject* pPartObj = aIter.Next();
+ removeShapeId( pPartObj );
}
+
+ SdrObject::Free( pGroup );
}
+ catch( const Exception& )
+ {
+ pTable->uno_unlock();
+ SdrObject* pObj = pTable;
+ SdrObject::Free( pObj );
+ }
+
return pRet;
}
More information about the Libreoffice-commits
mailing list