Subversion Repositories Scribus

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
5191 tsoots 1
/*
2
For general Scribus (>=1.3.2) copyright and licensing information please refer
3
to the COPYING file provided with the program. Following this notice may exist
4
a copyright and/or license notice that predates the release of Scribus 1.3.2
5
for which a new license (GPL+exception) is in place.
6
*/
7
 
8
#include "docim.h"
9
#include "docim.moc"
10
#include "gtwriter.h"
11
#include <qobject.h>
12
#include <qcstring.h>
13
#include <qmessagebox.h>
14
#include <qprocess.h>
15
#include <qstring.h>
16
#include <qstringlist.h>
17
#include <qtextcodec.h>
18
 
19
#if defined(_WIN32)
20
#include <windows.h>
21
#endif
22
 
23
bool hasAntiword()
24
{
25
        static bool searched = false, found = false;
26
        if (searched) // searched already in this run
27
                return found;
28
 
29
        QProcess *test = new QProcess();
30
#if defined(_WIN32)
31
        test->addArgument( ScPaths::instance().libDir() + "tools/antiword/antiword.exe" );
32
#else
33
        test->addArgument("antiword");
34
#endif
35
        if (test->start())
36
        {
37
                found = true;
38
                test->tryTerminate();
39
#ifndef _WIN32
40
                usleep(5000);
41
#else
42
                Sleep(5);
43
#endif
44
                test->kill();  
45
        }
46
        delete test;
47
        searched = true;
48
        return found;
49
}
50
 
51
QString FileFormatName()
52
{
53
        if (hasAntiword())
54
        return QObject::tr("Word Documents");
55
        else
56
                return QString();
57
}
58
 
59
QStringList FileExtensions()
60
{
61
        if (hasAntiword())
62
        return QStringList("doc");
63
        else
64
                return QStringList();
65
}
66
 
67
void GetText(QString filename, QString encoding, bool textOnly, gtWriter *writer)
68
{
69
        if (!hasAntiword())
70
                return;
71
 
72
        DocIm *dim = new DocIm(filename, encoding, textOnly, writer);
73
        while (dim->isRunning())
74
        {
75
#ifndef _WIN32
76
                usleep(5000);
77
#else
78
                Sleep(5);
79
#endif
80
        }
81
        delete dim;
82
}
83
 
84
DocIm::DocIm(const QString& fname, const QString& enc, bool textO, gtWriter *w) : QObject()
85
{
86
        filename = fname;
87
        encoding = enc;
88
        writer = w;
89
        textOnly = textO;
90
        failed = false;
91
        QTextCodec *codec;
92
        if (encoding.isEmpty())
93
                codec = QTextCodec::codecForLocale();
94
        else
95
                codec = QTextCodec::codecForName(encoding);
96
        QTextCodec::setCodecForCStrings(codec);
97
        text = "";
98
        error = "";
99
        proc = new QProcess();
100
#if defined(_WIN32)
101
        proc->addArgument( ScPaths::instance().libDir() + "tools/antiword/antiword.exe" );
102
        proc->setWorkingDirectory( ScPaths::instance().libDir() + "tools/antiword/" );
103
#else
104
        proc->addArgument("antiword");
105
#endif
106
        proc->addArgument("-t");
107
        proc->addArgument("-w 0");
108
        proc->addArgument(filename);
109
        //connect(proc, SIGNAL(readyReadStdout()), this, SLOT(slotReadOutput()));
110
        //connect(proc, SIGNAL(readyReadStderr()), this, SLOT(slotReadErr()));
111
#if defined(_WIN32)
112
        QStringList envVar;
113
        QString homeDir =  QDir::convertSeparators(ScPaths::instance().libDir() + "tools");
114
        envVar.append( QString("HOME=%1").arg(homeDir) );
115
        if (!proc->start(&envVar))
116
        {
117
                failed = true;
118
                return;
119
        }      
120
#else
121
        if (!proc->start())
122
        {
123
                failed = true;
124
                return;
125
        }
126
#endif
127
 
128
        while(proc->isRunning() || proc->canReadLineStdout() || proc->canReadLineStderr())
129
        {
130
                if ( proc->canReadLineStdout() )
131
                {
132
                        QByteArray bo = proc->readStdout();
133
                        if (bo.size() > 0)
134
                                text += QString(bo);
135
                }
136
                else if (proc->canReadLineStderr())
137
                {
138
                        QByteArray be = proc->readStderr();
139
                        if (be.size() > 0)
140
                                error += QString(be);
141
                }
142
                else
143
                {
144
                #ifndef _WIN32
145
                        usleep(5000);
146
                #else
147
                        Sleep(5);
148
                #endif
149
                }
150
        }
151
 
152
        if (proc->normalExit())
153
        {
154
                toUnicode();
155
                write();
156
        }
157
        else
158
                failed = true;
159
}
160
 
161
bool DocIm::isRunning()
162
{
163
        return proc->isRunning();
164
}
165
 
166
void DocIm::write()
167
{
168
        if (!failed)
169
                writer->append(text);
170
        else
171
                QMessageBox::information(0, tr("Importing failed"),
172
                                         tr("Importing Word document failed \n%1").arg(error),
173
                                         QMessageBox::Ok);
174
}
175
 
176
void DocIm::toUnicode()
177
{
178
        QTextCodec *codec;
179
        if (encoding.isEmpty())
180
                codec = QTextCodec::codecForLocale();
181
        else
182
                codec = QTextCodec::codecForName(encoding);
183
        QString dec = codec->toUnicode( text );
184
        text = dec;
185
}
186
 
187
DocIm::~DocIm()
188
{
189
        delete proc;
190
}
191
 
192