[Libreoffice-commits] core.git: 2 commits - sc/source
Eike Rathke
erack at redhat.com
Fri Nov 3 22:38:24 UTC 2017
sc/source/ui/docshell/docsh.cxx | 14 ++++++++++++++
sc/source/ui/docshell/impex.cxx | 27 ++++++++++++++++++++++++---
2 files changed, 38 insertions(+), 3 deletions(-)
New commits:
commit 12f09377b91b6d70efb3448d098f4dbd677a67d1
Author: Eike Rathke <erack at redhat.com>
Date: Fri Nov 3 23:10:01 2017 +0100
SYLK import: set and evaluate col/row overflow to display dialog
Change-Id: Id997aac2fd90f53652c81884c51833c92494e32f
diff --git a/sc/source/ui/docshell/docsh.cxx b/sc/source/ui/docshell/docsh.cxx
index a9faf61da2b6..f9d2cc684d91 100644
--- a/sc/source/ui/docshell/docsh.cxx
+++ b/sc/source/ui/docshell/docsh.cxx
@@ -1345,6 +1345,8 @@ bool ScDocShell::ConvertFrom( SfxMedium& rMedium )
else if (aFltName == pFilterSylk)
{
ErrCode eError = SCERR_IMPORT_UNKNOWN;
+ bool bOverflowRow, bOverflowCol, bOverflowCell;
+ bOverflowRow = bOverflowCol = bOverflowCell = false;
if( !rMedium.IsStorage() )
{
ScImportExport aImpEx( &aDocument );
@@ -1358,6 +1360,10 @@ bool ScDocShell::ConvertFrom( SfxMedium& rMedium )
aDocument.StartAllListeners();
sc::SetFormulaDirtyContext aCxt;
aDocument.SetAllFormulasDirty(aCxt);
+
+ bOverflowRow = aImpEx.IsOverflowRow();
+ bOverflowCol = aImpEx.IsOverflowCol();
+ bOverflowCell = aImpEx.IsOverflowCell();
}
else
{
@@ -1367,6 +1373,14 @@ bool ScDocShell::ConvertFrom( SfxMedium& rMedium )
if ( eError != ERRCODE_NONE && !GetError() )
SetError(eError);
+ else if (!GetError() && (bOverflowRow || bOverflowCol || bOverflowCell))
+ {
+ // precedence: row, column, cell
+ ErrCode nWarn = (bOverflowRow ? SCWARN_IMPORT_ROW_OVERFLOW :
+ (bOverflowCol ? SCWARN_IMPORT_COLUMN_OVERFLOW :
+ SCWARN_IMPORT_CELL_OVERFLOW));
+ SetError(nWarn);
+ }
bSetColWidths = true;
bSetSimpleTextColWidths = true;
bSetRowHeights = true;
diff --git a/sc/source/ui/docshell/impex.cxx b/sc/source/ui/docshell/impex.cxx
index 911c8ea584b0..953956213faa 100644
--- a/sc/source/ui/docshell/impex.cxx
+++ b/sc/source/ui/docshell/impex.cxx
@@ -1764,7 +1764,7 @@ bool ScImportExport::Sylk2Doc( SvStream& rStrm )
{
SAL_WARN("sc.ui","ScImportExport::Sylk2Doc - ;X invalid nCol=" << nCol);
nCol = std::max<SCCOL>(0, std::min<SCCOL>(nCol, MAXCOL));
- bInvalidCol = true;
+ bInvalidCol = bOverflowCol = true;
}
break;
}
@@ -1776,7 +1776,7 @@ bool ScImportExport::Sylk2Doc( SvStream& rStrm )
{
SAL_WARN("sc.ui","ScImportExport::Sylk2Doc - ;Y invalid nRow=" << nRow);
nRow = std::max<SCROW>(0, std::min<SCROW>(nRow, MAXROW));
- bInvalidRow = true;
+ bInvalidRow = bOverflowRow = true;
}
break;
}
@@ -1788,7 +1788,7 @@ bool ScImportExport::Sylk2Doc( SvStream& rStrm )
{
SAL_WARN("sc.ui","ScImportExport::Sylk2Doc - ;C invalid nRefCol=" << nRefCol);
nRefCol = std::max<SCCOL>(0, std::min<SCCOL>(nRefCol, MAXCOL));
- bInvalidRefCol = true;
+ bInvalidRefCol = bOverflowCol = true;
}
break;
}
@@ -1800,7 +1800,7 @@ bool ScImportExport::Sylk2Doc( SvStream& rStrm )
{
SAL_WARN("sc.ui","ScImportExport::Sylk2Doc - ;R invalid nRefRow=" << nRefRow);
nRefRow = std::max<SCROW>(0, std::min<SCROW>(nRefRow, MAXROW));
- bInvalidRefRow = true;
+ bInvalidRefRow = bOverflowRow = true;
}
break;
}
@@ -1925,7 +1925,7 @@ bool ScImportExport::Sylk2Doc( SvStream& rStrm )
{
SAL_WARN("sc.ui","ScImportExport::Sylk2Doc - ;X invalid nCol=" << nCol);
nCol = std::max<SCCOL>(0, std::min<SCCOL>(nCol, MAXCOL));
- bInvalidCol = true;
+ bInvalidCol = bOverflowCol = true;
}
break;
}
@@ -1937,7 +1937,7 @@ bool ScImportExport::Sylk2Doc( SvStream& rStrm )
{
SAL_WARN("sc.ui","ScImportExport::Sylk2Doc - ;Y invalid nRow=" << nRow);
nRow = std::max<SCROW>(0, std::min<SCROW>(nRow, MAXROW));
- bInvalidRow = true;
+ bInvalidRow = bOverflowRow = true;
}
break;
}
commit b00c6912a4f3ba417551d98f4d2a70c4e2328718
Author: Eike Rathke <erack at redhat.com>
Date: Fri Nov 3 21:13:12 2017 +0100
ofz#3032 skip invalid positioned formulas entirely
... instead of generating them at the outer edge, specifically do
not create maximally dimensioned but still truncated matrix
formulas. Carried over-edge cases even overwrote each other
anyway.
Change-Id: Icb307f17ad153c6a5c69f869026abc1cf1d5c9f5
diff --git a/sc/source/ui/docshell/impex.cxx b/sc/source/ui/docshell/impex.cxx
index 6aa1e4c1dfa2..911c8ea584b0 100644
--- a/sc/source/ui/docshell/impex.cxx
+++ b/sc/source/ui/docshell/impex.cxx
@@ -1740,6 +1740,10 @@ bool ScImportExport::Sylk2Doc( SvStream& rStrm )
aLine = OStringToOUString(aByteLine, rStrm.GetStreamCharSet());
if( rStrm.IsEof() )
break;
+ bool bInvalidCol = false;
+ bool bInvalidRow = false;
+ bool bInvalidRefCol = false;
+ bool bInvalidRefRow = false;
const sal_Unicode* p = aLine.getStr();
sal_Unicode cTag = *p++;
if( cTag == 'C' ) // Content
@@ -1754,41 +1758,49 @@ bool ScImportExport::Sylk2Doc( SvStream& rStrm )
{
case 'X':
{
+ bInvalidCol = false;
bool bFail = o3tl::checked_add<SCCOL>(OUString(p).toInt32(), nStartCol - 1, nCol);
if (bFail || nCol < 0 || MAXCOL < nCol)
{
SAL_WARN("sc.ui","ScImportExport::Sylk2Doc - ;X invalid nCol=" << nCol);
nCol = std::max<SCCOL>(0, std::min<SCCOL>(nCol, MAXCOL));
+ bInvalidCol = true;
}
break;
}
case 'Y':
{
+ bInvalidRow = false;
bool bFail = o3tl::checked_add(OUString(p).toInt32(), nStartRow - 1, nRow);
if (bFail || nRow < 0 || MAXROW < nRow)
{
SAL_WARN("sc.ui","ScImportExport::Sylk2Doc - ;Y invalid nRow=" << nRow);
nRow = std::max<SCROW>(0, std::min<SCROW>(nRow, MAXROW));
+ bInvalidRow = true;
}
break;
}
case 'C':
{
+ bInvalidRefCol = false;
bool bFail = o3tl::checked_add<SCCOL>(OUString(p).toInt32(), nStartCol - 1, nRefCol);
if (bFail || nRefCol < 0 || MAXCOL < nRefCol)
{
SAL_WARN("sc.ui","ScImportExport::Sylk2Doc - ;C invalid nRefCol=" << nRefCol);
nRefCol = std::max<SCCOL>(0, std::min<SCCOL>(nRefCol, MAXCOL));
+ bInvalidRefCol = true;
}
break;
}
case 'R':
{
+ bInvalidRefRow = false;
bool bFail = o3tl::checked_add(OUString(p).toInt32(), nStartRow - 1, nRefRow);
if (bFail || nRefRow < 0 || MAXROW < nRefRow)
{
SAL_WARN("sc.ui","ScImportExport::Sylk2Doc - ;R invalid nRefRow=" << nRefRow);
nRefRow = std::max<SCROW>(0, std::min<SCROW>(nRefRow, MAXROW));
+ bInvalidRefRow = true;
}
break;
}
@@ -1797,7 +1809,8 @@ bool ScImportExport::Sylk2Doc( SvStream& rStrm )
if( !bSingle &&
( nCol < nStartCol || nCol > nEndCol
|| nRow < nStartRow || nRow > nEndRow
- || nCol > MAXCOL || nRow > MAXROW ) )
+ || nCol > MAXCOL || nRow > MAXROW
+ || bInvalidCol || bInvalidRow ) )
break;
if( !bData )
{
@@ -1819,7 +1832,7 @@ bool ScImportExport::Sylk2Doc( SvStream& rStrm )
const sal_Unicode* q = p;
while( *q && *q != ';' )
q++;
- if ( !(*q == ';' && *(q+1) == 'I') )
+ if ( !(*q == ';' && *(q+1) == 'I') && !bInvalidCol && !bInvalidRow )
{ // don't ignore value
if( bText )
{
@@ -1858,6 +1871,10 @@ bool ScImportExport::Sylk2Doc( SvStream& rStrm )
break;
aText = "=";
p = lcl_ScanSylkFormula( p, aText, eVersion);
+
+ if (bInvalidCol || bInvalidRow || (ch == 'M' && (bInvalidRefCol || bInvalidRefRow)))
+ break;
+
ScAddress aPos( nCol, nRow, aRange.aStart.Tab() );
/* FIXME: do we want GRAM_ODFF_A1 instead? At the
* end it probably should be GRAM_ODFF_R1C1, since
@@ -1902,21 +1919,25 @@ bool ScImportExport::Sylk2Doc( SvStream& rStrm )
{
case 'X':
{
+ bInvalidCol = false;
bool bFail = o3tl::checked_add<SCCOL>(OUString(p).toInt32(), nStartCol - 1, nCol);
if (bFail || nCol < 0 || MAXCOL < nCol)
{
SAL_WARN("sc.ui","ScImportExport::Sylk2Doc - ;X invalid nCol=" << nCol);
nCol = std::max<SCCOL>(0, std::min<SCCOL>(nCol, MAXCOL));
+ bInvalidCol = true;
}
break;
}
case 'Y':
{
+ bInvalidRow = false;
bool bFail = o3tl::checked_add(OUString(p).toInt32(), nStartRow - 1, nRow);
if (bFail || nRow < 0 || MAXROW < nRow)
{
SAL_WARN("sc.ui","ScImportExport::Sylk2Doc - ;Y invalid nRow=" << nRow);
nRow = std::max<SCROW>(0, std::min<SCROW>(nRow, MAXROW));
+ bInvalidRow = true;
}
break;
}
@@ -1946,7 +1967,7 @@ bool ScImportExport::Sylk2Doc( SvStream& rStrm )
if( nCol > nEndCol )
nEndCol = nCol;
}
- if ( 0 <= nFormat && nFormat < (sal_Int32)aFormats.size() )
+ if ( 0 <= nFormat && nFormat < (sal_Int32)aFormats.size() && !bInvalidCol && !bInvalidRow )
{
sal_uInt32 nKey = aFormats[nFormat];
pDoc->ApplyAttr( nCol, nRow, aRange.aStart.Tab(),
More information about the Libreoffice-commits
mailing list