Lot's of small bugfixes concerning paragraph handling, some code cleanup
and added WP9 as a supported filetype...

Marc

Index: abi/src/wp/impexp/xp/ie_imp_WordPerfect.cpp
===================================================================
RCS file: /cvsroot/abi/src/wp/impexp/xp/ie_imp_WordPerfect.cpp,v
retrieving revision 1.24
diff -u -r1.24 ie_imp_WordPerfect.cpp
--- abi/src/wp/impexp/xp/ie_imp_WordPerfect.cpp	13 Mar 2002 09:39:23 -0000	1.24
+++ abi/src/wp/impexp/xp/ie_imp_WordPerfect.cpp	19 Mar 2002 17:24:34 -0000
@@ -159,8 +159,8 @@
 
 	UT_ASSERT (m_sniffer);
 
-	mi->name    = "WordPerfect 6/7/8 (tm) Importer";
-	mi->desc    = "WordPerfect 6/7/8 (tm) Documents";
+	mi->name    = "WordPerfect 6/7/8/9 (tm) Importer";
+	mi->desc    = "WordPerfect 6/7/8/9 (tm) Documents";
 	mi->version = ABI_VERSION_STRING;
 	mi->author  = "Abi the Ant";
 	mi->usage   = "No Usage";
@@ -220,8 +220,8 @@
 	     int majorVersion = (int) *(szBuf + WP_HEADER_MAJOR_VERSION_OFFSET);
 	     int minorVersion = (int) *(szBuf + WP_HEADER_MINOR_VERSION_OFFSET);
 	     UT_DEBUGMSG(("product type: %i, file type: %i, major version: %i, minor version: %i\n", productType, fileType, majorVersion, minorVersion ));
-	     // we only want to try parsing wordperfect 6/7/8 documents for now
-	     if ((majorVersion != WP_WORDPERFECT678_EXPECTED_MAJOR_VERSION) || (fileType != WP_WORDPERFECT_DOCUMENT_FILE_TYPE))
+	     // we only want to try parsing wordperfect 6/7/8/9 documents for now
+	     if ((majorVersion != WP_WORDPERFECT6789_EXPECTED_MAJOR_VERSION) || (fileType != WP_WORDPERFECT_DOCUMENT_FILE_TYPE))
 	       return UT_CONFIDENCE_POOR;
 	     
 	     return UT_CONFIDENCE_PERFECT;
@@ -253,7 +253,7 @@
 												const char ** pszSuffixList,
 												IEFileType * ft)
 {
-	*pszDesc = "WordPerfect 6/7/8 (.wpd)";
+	*pszDesc = "WordPerfect 6/7/8/9 (.wpd)";
 	*pszSuffixList = "*.wpd";
 	*ft = getFileType();
 	return true;
@@ -267,10 +267,12 @@
 #define DOC_PROPBUFFER_SIZE 1024
 
 IE_Imp_WordPerfect::IE_Imp_WordPerfect(PD_Document * pDocument)
-  : IE_Imp (pDocument), m_bInSection(false)
+  : IE_Imp (pDocument)
 {
    m_undoOn = false;
-   m_bParagraphChanged = true;
+   m_bParagraphChanged = false;
+   m_bParagraphExists = false;
+   m_bInSection = false;
 
    m_wordPerfectDispatchBytes.addItem(new WordPerfectByteTag(WP_TOP_SOFT_EOL, &IE_Imp_WordPerfect::_insertSpace));
    m_wordPerfectDispatchBytes.addItem(new WordPerfectByteTag(WP_TOP_SOFT_SPACE, &IE_Imp_WordPerfect::_insertSpace));
@@ -718,7 +720,6 @@
 	   case 28: // deletable hard EOP
 	     { 
 	       X_CheckWordPerfectError(_flushText());
-	       _appendCurrentParagraphProperties();
 	       UT_UCSChar ucs = UCS_FF;
 	       X_CheckDocumentError(getDoc()->appendSpan(&ucs,1));
 	     }
@@ -750,7 +751,7 @@
 }
 
 // handles a column group
-// (TODO: partially implemented, only basic column import is done, see bug 2756, 1270 and bug 515)
+// (TODO: partially implemented
 UT_Error IE_Imp_WordPerfect::_handleColumnGroup()
 {
    UT_DEBUGMSG(("WordPerfect: Handling a column group\n"));
@@ -775,26 +776,19 @@
                   break;
           case 2: // TODO: Define Text Columns, Partially implemented
                   unsigned char colType;
-                  unsigned char rowSpacing[5]; // a WPSP type var., which seems to be 5 bytes, but I don't what it is.
+                  unsigned char rowSpacing[4]; // a WP SPacing type variable, which is 4 bytes
+                  unsigned char unknown; 
                   unsigned char numCols;
           
                   X_CheckFileReadElementError(fread(&colType, sizeof(unsigned char), 1, m_importFile));
-                  
-                  // WTF doesn't this line work? 5 bytes isn't asked too much, isn't it?
-                  // X_CheckFileReadElementError(fread(&rowSpacing[0], sizeof(unsigned char), 5, m_importFile));
-                  
-                  // instead, read 5 charachters 1 by 1
-                  X_CheckFileReadElementError(fread(&rowSpacing[0], sizeof(unsigned char), 1, m_importFile));
-                  X_CheckFileReadElementError(fread(&rowSpacing[1], sizeof(unsigned char), 1, m_importFile));
-                  X_CheckFileReadElementError(fread(&rowSpacing[2], sizeof(unsigned char), 1, m_importFile));
-                  X_CheckFileReadElementError(fread(&rowSpacing[3], sizeof(unsigned char), 1, m_importFile));
-                  X_CheckFileReadElementError(fread(&rowSpacing[4], sizeof(unsigned char), 1, m_importFile));
-                  
+                  if (fread(&rowSpacing[0], sizeof(unsigned char), 4, m_importFile) != 4*sizeof(unsigned char))
+                     return UT_IE_IMPORTERROR;
+                  // I don't have a clue what this lonely byte does...
+                  X_CheckFileReadElementError(fread(&unknown, sizeof(unsigned char), 1, m_importFile));
                   X_CheckFileReadElementError(fread(&numCols, sizeof(unsigned char), 1, m_importFile));
           
                   UT_DEBUGMSG(("WordPerfect: Column type: %d\n", colType & 0x03));
-                  UT_DEBUGMSG(("WordPerfect: # columns: %d\n", numCols));
-                  
+                                    
                   // number of columns = {0,1} means columns off
                   if ((numCols==0) || (numCols==1))
                   {
@@ -823,7 +817,16 @@
                                    propsArray[0] = "props";
                                    propsArray[1] = propBuffer.c_str();
                                    propsArray[2] = NULL;
-                                   X_CheckWordPerfectError(_flushText());
+                                   
+                                   // this is a realy obscure statement, which has to be cleaned up sometime
+                                   if (
+                                         ((!m_bParagraphExists) && (m_textBuf.getLength() > 0)) ||
+                                         (m_bParagraphExists && m_bParagraphChanged) || 
+                                         (m_textBuf.getLength() > 0)
+                                      )
+                                   {
+                                      X_CheckWordPerfectError(_flushText());
+                                   }
                                    X_CheckDocumentError(_appendSection(propsArray));
                                    // set m_bParagraphChanged to true so the paragraph properties will 
                                    // unconditionally be added in this new section
@@ -864,13 +867,15 @@
    // dispatch to subgroup to handle the rest of the relevant properties within the
    // group (and thus, read more of the file-- so we keep this even if undo is 'on')
    switch (subGroup)
-     {
+   {
       case WP_PARAGRAPH_GROUP_JUSTIFICATION:
-	X_CheckWordPerfectError(_handleParagraphGroupJustification());
-	break;
-     }
-   m_bParagraphChanged = true;
-	 
+      {   
+         X_CheckWordPerfectError(_handleParagraphGroupJustification());
+         m_bParagraphChanged = true;
+	      break;
+      }   
+   }
+     
    X_CheckWordPerfectError(_skipGroup(startPosition, size));
    
    return UT_OK;
@@ -1458,9 +1463,9 @@
 {
    UT_DEBUGMSG(("WordPerfect: Flushing Text\n"));
    	
-   // append the current paragraph properties if they are changed; m_bParagraphChanged is initialized with true, so the first time
-   // we will have a structure to insert into
-   if(m_bParagraphChanged)
+   // append the current paragraph properties, but only when the paragraph properties 
+   // have changed or there is no paragraph at all
+   if(m_bParagraphChanged || (!m_bParagraphExists))
      {	
 	_appendCurrentParagraphProperties();
      }
@@ -1562,6 +1567,8 @@
    propsArray[1] = propBuffer.c_str();
    propsArray[2] = NULL;
    m_bParagraphChanged = false;
+   // _never_ set m_bParagraphExists to false again!
+   m_bParagraphExists = true;
    
    if ( !m_bInSection )
      {
Index: abi/src/wp/impexp/xp/ie_imp_WordPerfect.h
===================================================================
RCS file: /cvsroot/abi/src/wp/impexp/xp/ie_imp_WordPerfect.h,v
retrieving revision 1.13
diff -u -r1.13 ie_imp_WordPerfect.h
--- abi/src/wp/impexp/xp/ie_imp_WordPerfect.h	13 Mar 2002 09:39:23 -0000	1.13
+++ abi/src/wp/impexp/xp/ie_imp_WordPerfect.h	19 Mar 2002 17:24:34 -0000
@@ -34,7 +34,7 @@
 
 // The importer/reader for WordPerfect 6 documents.
 
-#define WP_WORDPERFECT678_EXPECTED_MAJOR_VERSION 2
+#define WP_WORDPERFECT6789_EXPECTED_MAJOR_VERSION 2
 #define WP_WORDPERFECT_DOCUMENT_FILE_TYPE 10
 #define WP_FONT_TABLE_SIZE_GUESS 10
 
@@ -279,6 +279,7 @@
    UT_uint16 m_indexPointer;
    bool m_undoOn;
    bool m_bParagraphChanged;
+   bool m_bParagraphExists;
    bool m_bInSection;
    UT_Mbtowc m_Mbtowc;
    UT_GrowBuf m_textBuf;

Reply via email to