3
Copyright 2012-2013 Adam Reichold
5
This file is part of qpdfview.
7
qpdfview is free software: you can redistribute it and/or modify
8
it under the terms of the GNU General Public License as published by
9
the Free Software Foundation, either version 2 of the License, or
10
(at your option) any later version.
12
qpdfview is distributed in the hope that it will be useful,
13
but WITHOUT ANY WARRANTY; without even the implied warranty of
14
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15
GNU General Public License for more details.
17
You should have received a copy of the GNU General Public License
18
along with qpdfview. If not, see <http://www.gnu.org/licenses/>.
22
#include "pluginhandler.h"
24
#include <QApplication>
28
#include <QMessageBox>
29
#include <QPluginLoader>
31
#if QT_VERSION >= QT_VERSION_CHECK(5,0,0)
33
#include <QMimeDatabase>
47
Plugin* PluginHandler::s_pdfPlugin = 0;
53
Plugin* PluginHandler::s_psPlugin = 0;
59
Plugin* PluginHandler::s_djvuPlugin = 0;
63
Model::Document* PluginHandler::loadDocument(const QString& filePath)
65
enum { UnknownType = 0, PDF = 1, PS = 2, DjVu = 3 } fileType = UnknownType;
67
#if QT_VERSION >= QT_VERSION_CHECK(5,0,0)
69
QMimeDatabase mimeDatabase;
70
QMimeType mimeType = mimeDatabase.mimeTypeForFile(filePath, QMimeDatabase::MatchContent);
72
if(mimeType.name() == "application/pdf")
76
else if(mimeType.name() == "application/postscript")
80
else if(mimeType.name() == "image/vnd.djvu")
86
qDebug() << "Unknown file type:" << mimeType.name();
93
magic_t cookie = magic_open(MAGIC_MIME_TYPE | MAGIC_SYMLINK);
95
if(magic_load(cookie, 0) == 0)
97
const char* mime_type = magic_file(cookie, QFile::encodeName(filePath));
99
if(qstrncmp(mime_type, "application/pdf", 15) == 0)
103
else if(qstrncmp(mime_type, "application/postscript", 22) == 0)
107
else if(qstrncmp(mime_type, "image/vnd.djvu", 14) == 0)
113
qDebug() << "Unknown file type:" << mime_type;
121
QFileInfo fileInfo(filePath);
123
if(fileInfo.suffix().toLower() == "pdf")
127
else if(fileInfo.suffix().toLower() == "ps")
131
else if(fileInfo.suffix().toLower() == "djvu" || fileInfo.suffix().toLower() == "djv")
137
qDebug() << "Unkown file type:" << fileInfo.suffix().toLower();
150
return s_pdfPlugin != 0 ? s_pdfPlugin->loadDocument(filePath) : 0;
161
return s_psPlugin != 0 ? s_psPlugin->loadDocument(filePath) : 0;
172
return s_djvuPlugin != 0 ? s_djvuPlugin->loadDocument(filePath) : 0;
182
SettingsWidget* PluginHandler::createPdfSettingsWidget(QWidget* parent)
186
return s_pdfPlugin != 0 ? s_pdfPlugin->createSettingsWidget(parent) : 0;
193
SettingsWidget* PluginHandler::createPsSettingsWidget(QWidget* parent)
197
return s_psPlugin != 0 ? s_psPlugin->createSettingsWidget(parent) : 0;
203
Plugin* PluginHandler::loadPlugin(const QString& fileName)
205
QPluginLoader pluginLoader(QDir(QApplication::applicationDirPath()).absoluteFilePath(fileName));
207
if(!pluginLoader.load())
209
pluginLoader.setFileName(QDir(PLUGIN_INSTALL_PATH).absoluteFilePath(fileName));
211
if(!pluginLoader.load())
213
qCritical() << "Could not load plug-in:" << fileName;
214
qCritical() << pluginLoader.errorString();
220
Plugin* plugin = qobject_cast< Plugin* >(pluginLoader.instance());
224
qCritical() << "Could not instantiate plug-in:" << fileName;
225
qCritical() << pluginLoader.errorString();
231
Plugin* PluginHandler::loadStaticPlugin(const QString& objectName)
233
foreach(QObject* object, QPluginLoader::staticInstances())
235
if(object->objectName() == objectName)
237
Plugin* plugin = qobject_cast< Plugin* >(object);
246
qCritical() << "Could not load static plug-in:" << objectName;
254
#ifdef STATIC_PDF_PLUGIN
256
Q_IMPORT_PLUGIN(qpdfview_pdf)
258
#endif // STATIC_PDF_PLUGIN
260
void PluginHandler::loadPdfPlugin()
264
#ifndef STATIC_PDF_PLUGIN
265
Plugin* pdfPlugin = loadPlugin(PDF_PLUGIN_NAME);
267
Plugin* pdfPlugin = loadStaticPlugin("PdfPlugin");
268
#endif // STATIC_PDF_PLUGIN
272
s_pdfPlugin = pdfPlugin;
276
QMessageBox::critical(0, tr("Critical"), tr("Could not load PDF plug-in!"));
286
#ifdef STATIC_PS_PLUGIN
288
Q_IMPORT_PLUGIN(qpdfview_ps)
290
#endif // STATIC_PS_PLUGIN
292
void PluginHandler::loadPsPlugin()
296
#ifndef STATIC_PS_PLUGIN
297
Plugin* psPlugin = loadPlugin(PS_PLUGIN_NAME);
299
Plugin* psPlugin = loadStaticPlugin("PsPlugin");
300
#endif // STATIC_PS_PLUGIN
304
s_psPlugin = psPlugin;
308
QMessageBox::critical(0, tr("Critical"), tr("Could not load PS plug-in!"));
319
#ifdef STATIC_DJVU_PLUGIN
321
Q_IMPORT_PLUGIN(qpdfview_djvu)
323
#endif // STATIC_DJVU_PLUGIN
325
void PluginHandler::loadDjVuPlugin()
327
if(s_djvuPlugin == 0)
329
#ifndef STATIC_DJVU_PLUGIN
330
Plugin* djvuPlugin = loadPlugin(DJVU_PLUGIN_NAME);
332
Plugin* djvuPlugin = loadStaticPlugin("DjVuPlugin");
333
#endif // STATIC_DJVU_PLUGIN
337
s_djvuPlugin = djvuPlugin;
341
QMessageBox::critical(0, tr("Critical"), tr("Could not load DjVu plug-in!"));