Subversion Repositories Scribus

Compare Revisions

Ignore whitespace Rev 5190 → Rev 5191

/trunk/Scribus/scribus/plugins/gettext/docim/docim.cpp
0,0 → 1,192
/*
For general Scribus (>=1.3.2) copyright and licensing information please refer
to the COPYING file provided with the program. Following this notice may exist
a copyright and/or license notice that predates the release of Scribus 1.3.2
for which a new license (GPL+exception) is in place.
*/
 
#include "docim.h"
#include "docim.moc"
#include "gtwriter.h"
#include <qobject.h>
#include <qcstring.h>
#include <qmessagebox.h>
#include <qprocess.h>
#include <qstring.h>
#include <qstringlist.h>
#include <qtextcodec.h>
 
#if defined(_WIN32)
#include <windows.h>
#endif
 
bool hasAntiword()
{
static bool searched = false, found = false;
if (searched) // searched already in this run
return found;
 
QProcess *test = new QProcess();
#if defined(_WIN32)
test->addArgument( ScPaths::instance().libDir() + "tools/antiword/antiword.exe" );
#else
test->addArgument("antiword");
#endif
if (test->start())
{
found = true;
test->tryTerminate();
#ifndef _WIN32
usleep(5000);
#else
Sleep(5);
#endif
test->kill();
}
delete test;
searched = true;
return found;
}
 
QString FileFormatName()
{
if (hasAntiword())
return QObject::tr("Word Documents");
else
return QString();
}
 
QStringList FileExtensions()
{
if (hasAntiword())
return QStringList("doc");
else
return QStringList();
}
 
void GetText(QString filename, QString encoding, bool textOnly, gtWriter *writer)
{
if (!hasAntiword())
return;
 
DocIm *dim = new DocIm(filename, encoding, textOnly, writer);
while (dim->isRunning())
{
#ifndef _WIN32
usleep(5000);
#else
Sleep(5);
#endif
}
delete dim;
}
 
DocIm::DocIm(const QString& fname, const QString& enc, bool textO, gtWriter *w) : QObject()
{
filename = fname;
encoding = enc;
writer = w;
textOnly = textO;
failed = false;
QTextCodec *codec;
if (encoding.isEmpty())
codec = QTextCodec::codecForLocale();
else
codec = QTextCodec::codecForName(encoding);
QTextCodec::setCodecForCStrings(codec);
text = "";
error = "";
proc = new QProcess();
#if defined(_WIN32)
proc->addArgument( ScPaths::instance().libDir() + "tools/antiword/antiword.exe" );
proc->setWorkingDirectory( ScPaths::instance().libDir() + "tools/antiword/" );
#else
proc->addArgument("antiword");
#endif
proc->addArgument("-t");
proc->addArgument("-w 0");
proc->addArgument(filename);
//connect(proc, SIGNAL(readyReadStdout()), this, SLOT(slotReadOutput()));
//connect(proc, SIGNAL(readyReadStderr()), this, SLOT(slotReadErr()));
#if defined(_WIN32)
QStringList envVar;
QString homeDir = QDir::convertSeparators(ScPaths::instance().libDir() + "tools");
envVar.append( QString("HOME=%1").arg(homeDir) );
if (!proc->start(&envVar))
{
failed = true;
return;
}
#else
if (!proc->start())
{
failed = true;
return;
}
#endif
 
while(proc->isRunning() || proc->canReadLineStdout() || proc->canReadLineStderr())
{
if ( proc->canReadLineStdout() )
{
QByteArray bo = proc->readStdout();
if (bo.size() > 0)
text += QString(bo);
}
else if (proc->canReadLineStderr())
{
QByteArray be = proc->readStderr();
if (be.size() > 0)
error += QString(be);
}
else
{
#ifndef _WIN32
usleep(5000);
#else
Sleep(5);
#endif
}
}
 
if (proc->normalExit())
{
toUnicode();
write();
}
else
failed = true;
}
 
bool DocIm::isRunning()
{
return proc->isRunning();
}
 
void DocIm::write()
{
if (!failed)
writer->append(text);
else
QMessageBox::information(0, tr("Importing failed"),
tr("Importing Word document failed \n%1").arg(error),
QMessageBox::Ok);
}
 
void DocIm::toUnicode()
{
QTextCodec *codec;
if (encoding.isEmpty())
codec = QTextCodec::codecForLocale();
else
codec = QTextCodec::codecForName(encoding);
QString dec = codec->toUnicode( text );
text = dec;
}
 
DocIm::~DocIm()
{
delete proc;
}
 
 
Property changes:
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:keywords
## -0,0 +1 ##
+Author Date Id Revision
\ No newline at end of property