29#include <tdetempfile.h>
30#include <kgenericfactory.h>
32#include <KoFilterChain.h>
33#include <KoDocumentInfo.h>
36#include <powerpointfilter.h>
42const int OLEFilter::s_area = 30510;
44class OLEFilterFactory : KGenericFactory<OLEFilter, KoFilter>
47 OLEFilterFactory(
void) : KGenericFactory<OLEFilter, KoFilter> (
"olefilter")
50 virtual void setupTranslations(
void )
52 TDEGlobal::locale()->insertCatalogue(
"kofficefilters" );
56K_EXPORT_COMPONENT_FACTORY( libolefilter, OLEFilterFactory() )
58OLEFilter::OLEFilter(KoFilter *, const
char *, const TQStringList&) :
59 KoEmbeddingFilter(), numPic( 0 ),
60 docfile( 0 ), m_embeddeeData( 0 ),
61 m_embeddeeLength( 0 ), success( true )
66OLEFilter::~OLEFilter()
68 delete [] olefile.data;
72KoFilter::ConversionStatus OLEFilter::convert(
const TQCString& from,
const TQCString& to )
74 if(to!=
"application/x-kword" &&
75 to!=
"application/x-kspread" &&
76 to!=
"application/x-kpresenter")
77 return KoFilter::NotImplemented;
78 if(from!=
"application/vnd.ms-word" &&
79 from!=
"application/vnd.ms-excel" &&
80 from!=
"application/msword" &&
81 from!=
"application/msexcel" &&
82 from!=
"application/mspowerpoint" &&
83 from!=
"application/x-hancomword")
84 return KoFilter::NotImplemented;
86 TQFile in(m_chain->inputFile());
87 if(!in.open(IO_ReadOnly)) {
88 kdError(s_area) <<
"OLEFilter::filter(): Unable to open input" << endl;
90 return KoFilter::FileNotFound;
95 olefile.length=in.size();
96 olefile.data=
new unsigned char[olefile.length];
97 in.readBlock((
char*)olefile.data, olefile.length);
100 docfile=
new KLaola(olefile);
101 if(!docfile->isOk()) {
102 kdError(s_area) <<
"OLEFilter::filter(): Unable to read input file correctly!" << endl;
103 delete [] olefile.data;
105 return KoFilter::StupidError;
113 return KoFilter::StupidError;
116void OLEFilter::commSlotDelayStream(
const char* delay )
118 emit internalCommDelayStream( delay );
121void OLEFilter::commSlotShapeID(
unsigned int& shapeID )
123 emit internalCommShapeID( shapeID );
126void OLEFilter::slotSavePart(
127 const TQString &nameIN,
130 const TQString &extension,
137 int id = internalPartReference( nameIN );
143 storageId = TQString::number(
id );
144 mimeType = internalPartMimeType( nameIN );
149 m_embeddeeData = data;
150 m_embeddeeLength = length;
152 TQString srcMime( KoEmbeddingFilter::mimeTypeByExtension( extension ) );
153 if ( srcMime == KMimeType::defaultMimeType() )
154 kdWarning( s_area ) <<
"Couldn't determine the mimetype from the extension" << endl;
156 KoFilter::ConversionStatus status;
157 TQCString destMime( mimeType.latin1() );
158 storageId = TQString::number( embedPart( srcMime.latin1(), destMime, status, nameIN ) );
165 m_embeddeeLength = 0;
167 if ( status != KoFilter::OK )
168 kdDebug(s_area) <<
"Huh??? Couldn't convert that file" << endl;
172void OLEFilter::slotSaveDocumentInformation(
173 const TQString &fullName,
174 const TQString &title,
175 const TQString &company,
176 const TQString &email,
177 const TQString &telephone,
179 const TQString &postalCode,
180 const TQString &country,
181 const TQString &city,
182 const TQString &street,
183 const TQString &docTitle,
184 const TQString &docAbstract)
186 KoDocumentInfo *info =
new KoDocumentInfo();
187 KoDocumentInfoAuthor *author =
static_cast<KoDocumentInfoAuthor *
>(info->page(
"author"));
188 KoDocumentInfoAbout *about =
static_cast<KoDocumentInfoAbout *
>(info->page(
"about"));
189 author->setFullName(fullName);
190 author->setTitle(title);
191 author->setCompany(company);
192 author->setEmail(email);
193 author->setTelephoneHome(telephone);
195 author->setCountry(postalCode);
196 author->setPostalCode(country);
197 author->setCity(city);
198 author->setStreet(street);
199 about->setTitle(docTitle);
200 about->setTitle(docAbstract);
202 KoStoreDevice* docInfo = m_chain->storageFile(
"documentinfo.xml", KoStore::Write );
206 kdError(s_area) <<
"OLEFilter::slotSaveDocumentInformation(): Could not open documentinfo.xml!" << endl;
210 TQCString data = info->save().toCString();
213 TQ_LONG length = data.size()-1;
215 if(docInfo->writeBlock(data, length) != length)
216 kdError(s_area) <<
"OLEFilter::slotSaveDocumentInformation(): Could not write to KoStore!" << endl;
219void OLEFilter::slotSavePic(
220 const TQString &nameIN,
222 const TQString &extension,
229 TQMap<TQString, TQString>::ConstIterator it = imageMap.find(nameIN);
231 if (it != imageMap.end())
233 storageId = it.data();
237 storageId = TQString(
"pictures/picture%1.%2" ).arg( numPic++ ).arg( extension );
238 imageMap.insert(nameIN, storageId);
239 KoStoreDevice* pic = m_chain->storageFile( storageId, KoStore::Write );
243 kdError(s_area) <<
"OLEFilter::slotSavePic(): Could not open KoStore!" << endl;
248 bool ret = pic->writeBlock(data, length) ==
static_cast<int>( length );
250 kdError(s_area) <<
"OLEFilter::slotSavePic(): Could not write to KoStore!" << endl;
255void OLEFilter::slotPart(
256 const TQString& nameIN,
260 if (nameIN.isEmpty())
263 int id = internalPartReference( nameIN );
268 storageId = TQString::number(
id );
269 mimeType = internalPartMimeType( nameIN );
272 kdWarning( s_area ) <<
"slotPart() can be used for lookup operations only" << endl;
276void OLEFilter::slotGetStream(
const int &handle, myFile &stream) {
277 stream=docfile->stream(handle);
283void OLEFilter::slotGetStream(
const TQString &name, myFile &stream) {
285 KLaola::NodeList handle;
287 handle=docfile->find(name,
true);
289 if (handle.count()==1)
290 stream=docfile->stream(handle.at(0));
297void OLEFilter::savePartContents( TQIODevice* file )
299 if ( m_embeddeeData != 0 && m_embeddeeLength != 0 )
300 file->writeBlock( m_embeddeeData, m_embeddeeLength );
304void OLEFilter::convert(
const TQCString& mimeTypeHint )
306 KLaola::NodeList list=docfile->parseCurrentDir();
307 KLaola::OLENode *node;
311 for(node=list.first(); node!=0; node=list.next()) {
312 if(node->isDirectory()) {
313 if(docfile->enterDir(node)) {
316 if (node->name() ==
"ObjectPool")
321 TQCString mimeHint( mimeTypeHelper() );
322 if ( mimeHint.isEmpty() )
323 mimeHint =
"application/x-kword";
324 startInternalEmbedding( node->name(), mimeHint );
326 endInternalEmbedding();
336 TQStringList nodeNames;
338 if ( !mimeTypeHint.isEmpty() )
339 mimeType = mimeTypeHint;
341 mimeType = mimeTypeHelper();
343 FilterBase *myFilter=0L;
346 if ( mimeType ==
"application/x-kword" ) {
350 KLaola::NodeList tmp;
351 tmp=docfile->find(
"WordDocument",
true);
355 main=docfile->stream(tmp.at(0));
357 myFile table0, table1, data;
358 tmp=docfile->find(
"0Table",
true);
360 table0=docfile->stream(tmp.at(0));
362 tmp=docfile->find(
"1Table",
true);
364 table1=docfile->stream(tmp.at(0));
366 tmp=docfile->find(
"Data",
true);
368 data=docfile->stream(tmp.at(0));
370 myFilter=
new WordFilter(main, table0, table1, data);
373 connect(
this, TQ_SIGNAL( internalCommShapeID(
unsigned int& ) ), myFilter, TQ_SIGNAL( internalCommShapeID(
unsigned int& ) ) );
374 connect(
this, TQ_SIGNAL( internalCommDelayStream(
const char* ) ), myFilter, TQ_SIGNAL( internalCommDelayStream(
const char* ) ) );
377 else if ( mimeType ==
"application/x-kspread" ) {
381 KLaola::NodeList tmp;
383 tmp = docfile->find(
"Workbook",
true );
384 if ( tmp.count() == 1 )
385 workbook = docfile->stream( tmp.at( 0 ) );
387 tmp = docfile->find(
"Book",
true );
388 if ( tmp.count() == 1 )
389 workbook = docfile->stream( tmp.at( 0 ) );
391 myFilter=
new ExcelFilter(workbook);
395 if ( mimeType ==
"application/x-kpresenter" ) {
398 myFile main, currentUser, pictures, summary, documentSummary;
399 KLaola::NodeList tmp;
401 tmp=docfile->find(
"PowerPoint Document",
true);
403 main=docfile->stream(tmp.at(0));
405 tmp=docfile->find(
"Current User",
true);
407 currentUser=docfile->stream(tmp.at(0));
409 tmp=docfile->find(
"Pictures",
true);
411 pictures=docfile->stream(tmp.at(0));
413 tmp=docfile->find(
"SummaryInformation",
true);
415 summary=docfile->stream(tmp.at(0));
417 tmp=docfile->find(
"DocumentSummaryInformation",
true);
419 documentSummary=docfile->stream(tmp.at(0));
421 myFilter=
new PowerPointFilter(main, currentUser, pictures);
424 else if ( mimeType ==
"application/x-hancomword" ) {
427 KLaola::NodeList tmp;
429 tmp = docfile->find(
"PrvText",
true );
430 if( tmp.count() == 1 ) prvText = docfile->stream( tmp.at( 0 ) );
432 myFilter =
new HancomWordFilter( prvText );
440 nodeNames.prepend(node->name());
444 kdWarning(s_area) <<
"cannot convert \"" << nodeNames.join(
",") <<
"\"" << endl;
445 myFilter=
new FilterBase(nodeNames);
449 connectCommon(&myFilter);
452 success=myFilter->filter();
455 if(!myFilter->plainString()) {
456 const TQDomDocument *
const part=myFilter->part();
457 file=part->toCString();
460 file=myFilter->CString();
462 KoStoreDevice* dev = m_chain->storageFile(
"root", KoStore::Write );
465 kdError(s_area) <<
"OLEFilter::convert(): Could not open KoStore!" << endl;
470 bool ret = dev->writeBlock(file.data(), file.size()-1) ==
static_cast<TQ_LONG
>( file.size() - 1 );
472 kdError(s_area) <<
"OLEFilter::slotSavePic(): Could not write to KoStore!" << endl;
477void OLEFilter::connectCommon(FilterBase **myFilter) {
480 TQ_SIGNAL(signalSaveDocumentInformation(
const TQString &,
const TQString &,
const TQString &,
const TQString &,
const TQString &,
const TQString &,
const TQString &,
const TQString &,
const TQString &,
const TQString &,
const TQString &,
const TQString &)),
482 TQ_SLOT(slotSaveDocumentInformation(
const TQString &,
const TQString &,
const TQString &,
const TQString &,
const TQString &,
const TQString &,
const TQString &,
const TQString &,
const TQString &,
const TQString &,
const TQString &,
const TQString &)));
486 TQ_SIGNAL(signalSavePic(
const TQString &, TQString &,
const TQString &,
unsigned int,
const char *)),
488 TQ_SLOT(slotSavePic(
const TQString &, TQString &,
const TQString &,
unsigned int,
const char *)));
491 TQ_SIGNAL(signalSavePart(
const TQString &, TQString &, TQString &,
const TQString &,
unsigned int,
const char *)),
493 TQ_SLOT(slotSavePart(
const TQString &, TQString &, TQString &,
const TQString &,
unsigned int,
const char *)));
494 TQObject::connect(*myFilter, TQ_SIGNAL(signalPart(
const TQString&, TQString &, TQString &)),
495 this, TQ_SLOT(slotPart(
const TQString&, TQString &, TQString &)));
496 TQObject::connect(*myFilter, TQ_SIGNAL(signalGetStream(
const int &, myFile &)),
this,
497 TQ_SLOT(slotGetStream(
const int &, myFile &)));
498 TQObject::connect(*myFilter, TQ_SIGNAL(signalGetStream(
const TQString &, myFile &)),
this,
499 TQ_SLOT(slotGetStream(
const TQString &, myFile &)));
500 TQObject::connect(*myFilter, TQ_SIGNAL(sigProgress(
int)),
this, TQ_SIGNAL(sigProgress(
int)));
503TQCString OLEFilter::mimeTypeHelper()
505 KLaola::NodeList list = docfile->parseCurrentDir();
506 KLaola::OLENode* node = list.first();
510 if ( node->name() ==
"WordDocument" )
511 return "application/x-kword";
512 else if ( node->name() ==
"Workbook" || node->name() ==
"Book" )
513 return "application/x-kspread";
514 else if ( node->name() ==
"PowerPoint Document" )
515 return "application/x-kpresenter";
516 else if ( node->name() ==
"PrvText" || node->name() ==
"BodyText" )
517 return "application/x-hancomword";
521 kdWarning( s_area ) <<
"No known mimetype detected" << endl;
525#include <olefilter.moc>