summaryrefslogtreecommitdiffstats
path: root/filters/kword/wordperfect/export/wp5.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'filters/kword/wordperfect/export/wp5.cpp')
-rw-r--r--filters/kword/wordperfect/export/wp5.cpp214
1 files changed, 214 insertions, 0 deletions
diff --git a/filters/kword/wordperfect/export/wp5.cpp b/filters/kword/wordperfect/export/wp5.cpp
new file mode 100644
index 000000000..965753537
--- /dev/null
+++ b/filters/kword/wordperfect/export/wp5.cpp
@@ -0,0 +1,214 @@
+/* This file is part of the KDE project
+ Copyright (C) 2002 Ariya Hidayat <ariya@kde.org>
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public
+ License as published by the Free Software Foundation; either
+ version 2 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; see the file COPYING.LIB. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+*/
+
+#include <config.h>
+
+#ifdef HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+
+#include <tqtextcodec.h>
+#include <tqfile.h>
+#include <tqfileinfo.h>
+#include <tqtextstream.h>
+
+#include <KWEFBaseWorker.h>
+#include <KWEFKWordLeader.h>
+#include <KWEFUtil.h>
+
+#include <wp5.h>
+
+bool WPFiveWorker::doOpenFile(const TQString& filenameOut, const TQString& /*to*/)
+{
+ filename = filenameOut;
+ outfile.setName( filename );
+ if( !outfile.open( IO_WriteOnly ) )
+ return false;
+
+ output.setDevice( &outfile );
+ output.setByteOrder (TQDataStream::LittleEndian);
+ return true;
+}
+
+bool WPFiveWorker::doCloseFile(void)
+{
+ // asssume we're at the end of the file
+ TQ_UINT32 total_filesize = outfile.at();
+
+ // close the file first
+ outfile.close();
+
+ // reopen for read and write
+ if( !outfile.open( IO_ReadWrite ) )
+ return false;
+ output.setDevice( &outfile );
+ output.setByteOrder (TQDataStream::LittleEndian);
+
+ // now it's time to fix-up some header fields
+
+ // fix for offset 12, int32, filesize
+ outfile.at( 20 );
+ output << total_filesize;
+
+ // offset 4, int32, pointer to document area
+ outfile.at( 4 );
+ output << document_area_ptr;
+
+ outfile.close();
+ return true;
+}
+
+bool WPFiveWorker::doOpenDocument(void)
+{
+ // write WP document header
+ // note that some fields are still "dummy"
+
+ // magic id: -1, "WPC"
+ TQ_UINT8 magic[] = { 0xff, 0x57, 0x50, 0x43 };
+ for( int i=0; i<4; i++ ) output << magic[i];
+
+ // pointer to document area (dummy, will be fixed later)
+ TQ_UINT8 docptr[] = { 0x0E, 0x02, 0x00, 0x00 } ;
+ for( int i=0; i<4; i++ ) output << docptr[i];
+
+ // write product type ( 1 = WordPerfect )
+ TQ_UINT8 product_type = 1;
+ output << product_type;
+
+ // write file type ( 10 = WordPerfect document )
+ TQ_UINT8 file_type = 10;
+ output << file_type;
+
+ // write version ( 1 = WordPerfect 5.x )
+ TQ_UINT16 version = 0x0100;
+ output << version;
+
+ // write encryption flag ( 0 = not encrypted )
+ TQ_UINT16 encrypt = 0;
+ output << encrypt;
+
+ // offset to index header (always 0x200?)
+ TQ_UINT16 index_header_ptr = 0x200;
+ output << index_header_ptr;
+
+ // beginning of extended file header (always 5)
+ TQ_UINT32 extheader = 5;
+ output << extheader;
+
+ // filesize (dummy, will be fixed later)
+ TQ_UINT32 filesize = 0;
+ output << filesize;
+
+ // filler 488 bytes
+ TQ_UINT8 dummy = 0;
+ for( int i=0; i<488; i++ ) output << dummy;
+
+ // index header (specified 0 index!)
+ TQ_UINT8 index_header[] = { 2, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0 };
+ for( int i=0; i<14; i++ ) output << index_header[i];
+
+ // document area starts, mark it for the header fields
+ document_area_ptr = output.device()->at();
+
+ return true;
+}
+
+bool WPFiveWorker::doCloseDocument(void)
+{
+ return true;
+}
+
+// quick-and-dirty escape function for WP 5.x chars
+// TODO fix it !
+static TQCString WPFiveEscape( const TQString& text )
+{
+ TQCString result;
+
+ for( unsigned int i=0; i < text.length(); i++ )
+ {
+ int c = text[i].unicode();
+ if( c < 32 ) result += '.';
+ else if ( c == 32 ) result += 0x20 ; // hard space
+ else if ( c < 128 ) result += text[i].latin1();
+ else result += '.';
+ }
+
+ return result;
+}
+
+
+bool WPFiveWorker::doFullParagraph(const TQString& paraText,
+ const LayoutData& /*layout*/, const ValueListFormatData& paraFormatDataList)
+{
+ ValueListFormatData::ConstIterator it;
+ for( it = paraFormatDataList.begin(); it!=paraFormatDataList.end(); ++it )
+ {
+ const FormatData& formatData = *it;
+
+ // only if the format is for text (id==1)
+ if( formatData.id == 1 )
+ {
+
+ TQ_UINT8 attr = 0; //invalid
+ if( formatData.text.weight >= 75 ) attr = 12; // bold
+ if( formatData.text.italic ) attr = 8;
+ if( formatData.text.underline )
+ {
+ if( formatData.text.underlineValue == "double" )
+ attr = 11; // double underline
+ else
+ attr = 14; // single underline
+ }
+ if( formatData.text.verticalAlignment == 1 ) attr = 6; //subscript
+ if( formatData.text.verticalAlignment == 2 ) attr = 5; //superscript
+ if( formatData.text.strikeout ) attr = 13;
+
+ // due to the file format, before writing the text we must
+ // write some prefix-code (such as Bold On) and possibly appropriate suffix-code (Bold Off)
+
+ // attribute on
+ if( attr > 0 ) output << (TQ_UINT8)0xc3 << attr << (TQ_UINT8)0xc3;
+
+ // set font color
+ TQColor fgColor = formatData.text.fgColor;
+ if( fgColor.isValid() )
+ {
+ TQ_UINT8 wp_color[] = { 0xd1, 0, 10, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0xd1 };
+ wp_color[7] = (TQ_UINT8) fgColor.red();
+ wp_color[8] = (TQ_UINT8) fgColor.green();
+ wp_color[9] = (TQ_UINT8) fgColor.blue();
+ output.writeRawBytes( (const char*)wp_color, 14 );
+ }
+
+ // the text itself, "escape" it first
+ TQCString out = WPFiveEscape( paraText.mid( formatData.pos, formatData.len ) );
+ output.writeRawBytes( (const char*)out, out.length() );
+
+ // attribute off
+ if( attr > 0 ) output << (TQ_UINT8)0xc4 << attr << (TQ_UINT8)0xc4;
+ }
+ }
+
+ // write hard-return
+ output << (TQ_UINT8) 0x0a;
+
+ return true;
+}
+