Author: jsc
Date: Fri Mar 28 10:45:27 2014
New Revision: 1582685

URL: http://svn.apache.org/r1582685
Log:
#124468# merge from aoo410 branch, add checks for the read numbers of column 
for a section

Modified:
    openoffice/trunk/main/sw/source/filter/ww8/ww8par6.cxx
    openoffice/trunk/main/sw/source/filter/ww8/ww8struc.hxx

Modified: openoffice/trunk/main/sw/source/filter/ww8/ww8par6.cxx
URL: 
http://svn.apache.org/viewvc/openoffice/trunk/main/sw/source/filter/ww8/ww8par6.cxx?rev=1582685&r1=1582684&r2=1582685&view=diff
==============================================================================
--- openoffice/trunk/main/sw/source/filter/ww8/ww8par6.cxx (original)
+++ openoffice/trunk/main/sw/source/filter/ww8/ww8par6.cxx Fri Mar 28 10:45:27 
2014
@@ -921,7 +921,14 @@ void wwSectionManager::CreateSep(const l
     // sprmSFBiDi
     aNewSection.maSep.fBiDi = eVer >= ww::eWW8 ? ReadBSprm(pSep, 0x3228, 0) : 
0;
 
+    // Reading section property sprmSCcolumns - one less than the number of 
columns in the section.
+    // It must be less than MAX_NO_OF_SEP_COLUMNS according the WW8 
specification.
     aNewSection.maSep.ccolM1 = ReadSprm(pSep, pIds[3], 0 );
+    if ( aNewSection.maSep.ccolM1 >= MAX_NO_OF_SEP_COLUMNS )
+    {
+        // fallback to one column
+        aNewSection.maSep.ccolM1 = 0;
+    }
 
     //sprmSDxaColumns   - Default-Abstand 1.25 cm
     aNewSection.maSep.dxaColumns = ReadUSprm( pSep, pIds[4], 708 );
@@ -931,39 +938,41 @@ void wwSectionManager::CreateSep(const l
 
     if (eVer >= ww::eWW6)
     {
-               // sprmSFEvenlySpaced
-               aNewSection.maSep.fEvenlySpaced =
-                       ReadBSprm(pSep, (eVer <= ww::eWW7 ? 138 : 0x3005), 1) ? 
true : false;
+        // sprmSFEvenlySpaced
+        aNewSection.maSep.fEvenlySpaced = ReadBSprm( pSep, ( eVer <= ww::eWW7 
? 138 : 0x3005 ), 1 ) ? true : false;
 
-               if (aNewSection.maSep.ccolM1 > 0 && 
!aNewSection.maSep.fEvenlySpaced)
-               {
-                       aNewSection.maSep.rgdxaColumnWidthSpacing[0] = 0;
-                       int nCols = aNewSection.maSep.ccolM1 + 1;
-                       int nIdx = 0;
-                       for (int i = 0; i < nCols; ++i)
-                       {
-                               //sprmSDxaColWidth
-                               const sal_uInt8* pSW = pSep->HasSprm( (eVer <= 
ww::eWW7 ? 136 : 0xF203), sal_uInt8( i ) );
+        if ( aNewSection.maSep.ccolM1 > 0 && !aNewSection.maSep.fEvenlySpaced )
+        {
+            int nColumnDataIdx = 0;
+            aNewSection.maSep.rgdxaColumnWidthSpacing[nColumnDataIdx] = 0;
 
-                               ASSERT( pSW, "+Sprm 136 (bzw. 0xF203) 
(ColWidth) fehlt" );
-                               sal_uInt16 nWidth = pSW ? SVBT16ToShort(pSW + 
1) : 1440;
+            const sal_uInt16 nColumnWidthSprmId = ( eVer <= ww::eWW7 ? 136 : 
0xF203 );
+            const sal_uInt16 nColumnSpacingSprmId = ( eVer <= ww::eWW7 ? 137 : 
0xF204 );
+            const sal_uInt8 nColumnCount = static_cast< sal_uInt8 
>(aNewSection.maSep.ccolM1 + 1);
+            for ( sal_uInt8 nColumn = 0; nColumn < nColumnCount; ++nColumn )
+            {
+                //sprmSDxaColWidth
+                const sal_uInt8* pSW = pSep->HasSprm( nColumnWidthSprmId, 
nColumn );
 
-                               
aNewSection.maSep.rgdxaColumnWidthSpacing[++nIdx] = nWidth;
+                ASSERT( pSW != NULL, "+Sprm 136 (bzw. 0xF203) (ColWidth) 
fehlt" );
+                sal_uInt16 nWidth = pSW != NULL ? SVBT16ToShort( pSW + 1 ) : 
1440;
 
-                               if (i < nCols-1)
-                               {
-                                       //sprmSDxaColSpacing
-                                       const sal_uInt8* pSD = pSep->HasSprm( 
(eVer <= ww::eWW7 ? 137 : 0xF204), sal_uInt8( i ) );
+                aNewSection.maSep.rgdxaColumnWidthSpacing[++nColumnDataIdx] = 
nWidth;
 
-                                       ASSERT( pSD, "+Sprm 137 (bzw. 0xF204) 
(Colspacing) fehlt" );
-                                       if( pSD )
-                                       {
-                                               nWidth = SVBT16ToShort(pSD + 1);
-                                               
aNewSection.maSep.rgdxaColumnWidthSpacing[++nIdx] = nWidth;
-                                       }
-                               }
-                       }
-               }
+                if ( nColumn < nColumnCount - 1 )
+                {
+                    //sprmSDxaColSpacing
+                    const sal_uInt8* pSD = pSep->HasSprm( 
nColumnSpacingSprmId, nColumn );
+
+                    ASSERT( pSD, "+Sprm 137 (bzw. 0xF204) (Colspacing) fehlt" 
);
+                    if ( pSD )
+                    {
+                        nWidth = SVBT16ToShort( pSD + 1 );
+                        
aNewSection.maSep.rgdxaColumnWidthSpacing[++nColumnDataIdx] = nWidth;
+                    }
+                }
+            }
+        }
     }
 
     static const sal_uInt16 aVer2Ids1[] =

Modified: openoffice/trunk/main/sw/source/filter/ww8/ww8struc.hxx
URL: 
http://svn.apache.org/viewvc/openoffice/trunk/main/sw/source/filter/ww8/ww8struc.hxx?rev=1582685&r1=1582684&r2=1582685&view=diff
==============================================================================
--- openoffice/trunk/main/sw/source/filter/ww8/ww8struc.hxx (original)
+++ openoffice/trunk/main/sw/source/filter/ww8/ww8struc.hxx Fri Mar 28 10:45:27 
2014
@@ -967,6 +967,9 @@ struct WW8_WKB
 #   pragma pack()
 #endif
 
+// Maximum number of columns according the WW8 specification
+static const sal_uInt8 MAX_NO_OF_SEP_COLUMNS = 44;
+
 struct SEPr
 {
     SEPr();
@@ -1026,7 +1029,7 @@ struct SEPr
     sal_uInt32 dzaGutter;
     sal_uInt32 dyaHdrTop;
     sal_uInt32 dyaHdrBottom;
-    sal_Int16 ccolM1;
+    sal_Int16 ccolM1;   // have to be less than MAX_NO_OF_SEP_COLUMNS 
according the WW8 specification
     sal_Int8 fEvenlySpaced;
     sal_Int8 reserved3;
     sal_uInt8 fBiDi;
@@ -1034,7 +1037,13 @@ struct SEPr
     sal_uInt8 fRTLGutter;
     sal_uInt8 fRTLAlignment;
     sal_Int32 dxaColumns;
-    sal_Int32 rgdxaColumnWidthSpacing[89];
+
+    // Fixed array - two entries for each SEP column to store width of column 
and spacing to next column.
+    // At odd index values [1,3,5,...] the column widths are stored.
+    // At even index values [2,4,6,...] the spacings to the next columns are 
stored.
+    // Value at index 0 is initialized with 0 and used for easier interation 
on the array
+    sal_Int32 rgdxaColumnWidthSpacing[MAX_NO_OF_SEP_COLUMNS*2 + 1];
+
     sal_Int32 dxaColumnWidth;
     sal_uInt8 dmOrientFirst;
     sal_uInt8 fLayout;


Reply via email to