22#include <starwriterimport.h>
24#include <tqdatastream.h>
25#include <tqiodevice.h>
28#include <KoFilterChain.h>
29#include <kgenericfactory.h>
33typedef KGenericFactory<StarWriterImport, KoFilter> StarWriterImportFactory;
34K_EXPORT_COMPONENT_FACTORY(libstarwriterimport, StarWriterImportFactory(
"kofficefilters"))
37static inline TQ_UINT32 readU24(TQByteArray array, TQ_UINT32 p)
39 TQ_UINT8* ptr = (TQ_UINT8*) array.data();
40 return (TQ_UINT32) (ptr[p] + (ptr[p+1] << 8) + (ptr[p+2] << 16));
44static inline TQ_UINT16 readU16(TQByteArray array, TQ_UINT32 p)
46 TQ_UINT8* ptr = (TQ_UINT8*) array.data();
47 return (TQ_UINT16) (ptr[p] + (ptr[p+1] << 8));
50StarWriterImport::StarWriterImport(KoFilter *,
const char *,
const TQStringList&) : KoFilter()
57StarWriterImport::~StarWriterImport()
61KoFilter::ConversionStatus StarWriterImport::convert(
const TQCString& from,
const TQCString& to)
65 if ((to !=
"application/x-kword") || (from !=
"application/vnd.stardivision.writer"))
66 return KoFilter::NotImplemented;
69 POLE::Storage storage;
70 storage.open(m_chain->inputFile().latin1());
74 stream = storage.stream(
"StarWriterDocument");
75 if (!stream)
return KoFilter::WrongFormat;
76 StarWriterDocument.resize(stream->size());
77 stream->read((
unsigned char*)StarWriterDocument.data(), StarWriterDocument.size());
80 stream = storage.stream(
"SwPageStyleSheets");
81 if (!stream)
return KoFilter::WrongFormat;
82 SwPageStyleSheets.resize(stream->size());
83 stream->read((
unsigned char*)SwPageStyleSheets.data(), SwPageStyleSheets.size());
87 if (!checkDocumentVersion())
return KoFilter::WrongFormat;
90 if (!addBody())
return KoFilter::ParsingError;
91 if (!addHeaders())
return KoFilter::ParsingError;
92 if (!addFooters())
return KoFilter::ParsingError;
93 if (!addStyles())
return KoFilter::ParsingError;
94 if (!addPageProperties())
return KoFilter::ParsingError;
95 maindoc = bodyStuff + tablesStuff + picturesStuff;
97 if (!addKWordHeader())
return KoFilter::ParsingError;
100 KoStoreDevice *out = m_chain->storageFile(
"maindoc.xml", KoStore::Write);
102 TQCString cstring = maindoc.utf8();
103 cstring.prepend(
"<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n");
104 out->writeBlock((
const char*) cstring, cstring.length());
110bool StarWriterImport::checkDocumentVersion()
112 if (SwPageStyleSheets.size() < 0x0B)
return false;
113 if (StarWriterDocument.size() < 0x0B)
return false;
115 if (SwPageStyleSheets[0x00] !=
'S')
return false;
116 if (SwPageStyleSheets[0x01] !=
'W')
return false;
118 if (SwPageStyleSheets[0x02] !=
'5')
return false;
119 if (SwPageStyleSheets[0x03] !=
'H')
return false;
120 if (SwPageStyleSheets[0x04] !=
'D')
return false;
121 if (SwPageStyleSheets[0x05] !=
'R')
return false;
123 if (StarWriterDocument[0x00] !=
'S')
return false;
124 if (StarWriterDocument[0x01] !=
'W')
return false;
126 if (StarWriterDocument[0x02] !=
'5')
return false;
127 if (StarWriterDocument[0x03] !=
'H')
return false;
128 if (StarWriterDocument[0x04] !=
'D')
return false;
129 if (StarWriterDocument[0x05] !=
'R')
return false;
132 TQ_UINT16 flags = readU16(StarWriterDocument, 0x0A);
133 if (flags & 0x0008)
return false;
138bool StarWriterImport::addKWordHeader()
142 prolog =
"<!DOCTYPE DOC>\n";
143 prolog.append(
"<DOC mime=\"application/x-kword\" syntaxVersion=\"2\" editor=\"KWord\">\n");
144 prolog.append(
"<PAPER width=\"595\" height=\"841\" format=\"1\" fType=\"0\" orientation=\"0\" hType=\"0\" columns=\"1\">\n");
145 prolog.append(
" <PAPERBORDERS left=\"36\" right=\"36\" top=\"36\" bottom=\"36\" />\n");
146 prolog.append(
"</PAPER>\n");
147 prolog.append(
"<ATTRIBUTES standardpage=\"1\" hasFooter=\"0\" hasHeader=\"0\" processing=\"0\" />\n");
148 prolog.append(
"<FRAMESETS>\n");
150 maindoc.prepend(prolog);
152 maindoc.append(
"</FRAMESETS>\n");
153 maindoc.append(
"</DOC>");
158bool StarWriterImport::addPageProperties()
163bool StarWriterImport::addStyles()
172bool StarWriterImport::addHeaders()
177bool StarWriterImport::addFooters()
182bool StarWriterImport::addBody()
186 TQ_UINT32 len = StarWriterDocument[0x07];
193 char c = StarWriterDocument[p];
195 len = readU24(StarWriterDocument, p+1);
197 c = StarWriterDocument[p];
201 len = readU24(StarWriterDocument, p+1);
202 TQByteArray data(len);
203 for (TQ_UINT32 k=0; k<len; k++)
204 data[k] = StarWriterDocument[p+k];
205 bool retval = parseNodes(data);
208 bodyStuff.prepend(
" <FRAME right=\"567\" left=\"28\" top=\"42\" bottom=\"799\" />\n");
209 bodyStuff.prepend(
" <FRAMESET removable=\"0\" frameType=\"1\" frameInfo=\"0\" name=\"Text Frameset 1\" autoCreateNewFrame=\"1\">\n");
210 bodyStuff.append(
" </FRAMESET>\n");
215TQString StarWriterImport::convertToKWordString(TQByteArray s)
219 for (TQ_UINT32 i = 0x00; i < s.size(); i++)
220 if (s[i] ==
'&') result +=
"&";
221 else if (s[i] ==
'<') result +=
"<";
222 else if (s[i] ==
'>') result +=
">";
223 else if (s[i] ==
'"') result +=
""";
224 else if (s[i] == 0x27) result +=
"'";
225 else if (s[i] == 0x09) result +=
"\t";
228 else result += TQChar(s[i]);
233bool StarWriterImport::parseNodes(TQByteArray n)
241 while (p < n.size()) {
243 len = readU24(n, p+1);
246 for (TQ_UINT32 k = 0x00; k < len; k++)
255 if (!parseText(s))
return false;
259 if (!parseTable(s))
return false;
270bool StarWriterImport::parseText(TQByteArray n)
281 len = readU16(n, 0x09);
283 for (TQ_UINT16 k = 0x00; k < len; k++)
327 text = convertToKWordString(s);
328 bodyStuff.append(
" <PARAGRAPH>\n");
329 bodyStuff.append(
" <TEXT xml:space=\"preserve\">" + text +
"</TEXT>\n");
331 bodyStuff.append(
" </PARAGRAPH>\n");
336bool StarWriterImport::parseTable(TQByteArray n)
420bool StarWriterImport::parseGraphics(TQByteArray n)
425#include <starwriterimport.moc>