-/* This file is part of the KDE libraries
- Copyright (C) 2001 Malte Starostik <malte@kde.org>
- Copyright (C) 2001 Leon Bottou <leon@bottou.org>
+/* This file is part of the KDE project
+ Copyright (C) 2022 Ivailo Monev <xakepa10@gmail.com>
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Library General Public
- License as published by the Free Software Foundation; either
- version 2 of the License, or (at your option) any later version.
+ License version 2, as published by the Free Software Foundation.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
Boston, MA 02110-1301, USA.
*/
-
#include "djvucreator.h"
-#include <config-workspace.h>
-
-#include <assert.h>
-#include <stdlib.h>
-#include <unistd.h>
-#include <signal.h>
-#ifdef HAVE_SYS_SELECT_H
-#include <sys/select.h>
-#endif
-#include <sys/time.h>
-#include <sys/wait.h>
-#include <fcntl.h>
-#include <errno.h>
-
-#include <QFile>
#include <QImage>
-
+#include <QProcess>
+#include <kstandarddirs.h>
+#include <kdebug.h>
#include <kdemacros.h>
-
-
extern "C"
{
KDE_EXPORT ThumbCreator *new_creator()
{
- return new DjVuCreator;
+ return new DjVuCreator();
}
}
bool DjVuCreator::create(const QString &path, int width, int height, QImage &img)
{
- int output[2];
- QByteArray data(1024, 'k');
- bool ok = false;
-
- if (pipe(output) == -1)
- return false;
-
- const char* argv[8];
- QByteArray sizearg, fnamearg;
- sizearg = QByteArray::number(width) + 'x' + QByteArray::number(height);
- fnamearg = QFile::encodeName( path );
- argv[0] = "ddjvu";
- argv[1] = "-page";
- argv[2] = "1"; // krazy:exclude=doublequote_chars
- argv[3] = "-size";
- argv[4] = sizearg.data();
- argv[5] = fnamearg.data();
- argv[6] = 0;
-
- pid_t pid = fork();
- if (pid == 0)
- {
- close(output[0]);
- dup2(output[1], STDOUT_FILENO);
- execvp(argv[0], const_cast<char *const *>(argv));
- exit(1);
+ const QString ddjvuexe = KStandardDirs::findExe("ddjvu");
+ if (ddjvuexe.isEmpty()) {
+ kWarning() << "DjVu is not available";
+ return false;
}
- else if (pid >= 0)
- {
- close(output[1]);
- int offset = 0;
- while (!ok) {
- fd_set fds;
- FD_ZERO(&fds);
- FD_SET(output[0], &fds);
- struct timeval tv;
- tv.tv_sec = 20;
- tv.tv_usec = 0;
- if (select(output[0] + 1, &fds, 0, 0, &tv) <= 0) {
- if (errno == EINTR || errno == EAGAIN)
- continue;
- break; // error or timeout
- }
- if (FD_ISSET(output[0], &fds)) {
- int count = read(output[0], data.data() + offset, 1024);
- if (count == -1)
- break;
- if (count) // prepare for next block
- {
- offset += count;
- data.resize(offset + 1024);
- }
- else // got all data
- {
- data.resize(offset);
- ok = true;
- }
- }
- }
- if (!ok)
- kill(pid, SIGTERM);
- int status = 0;
- if (waitpid(pid, &status, 0) != pid || (status != 0 && status != 256) )
- ok = false;
+
+ const QStringList ddjvuargs = QStringList()
+ << QLatin1String("-page=1")
+ << QLatin1String("-format=ppm")
+ << (QLatin1String("-size=") + QString::number(width) + QLatin1Char('x') + QString::number(height))
+ << path;
+ QProcess ddjvuprocess;
+ ddjvuprocess.start(ddjvuexe, ddjvuargs);
+ if (ddjvuprocess.waitForFinished() == false || ddjvuprocess.exitCode() != 0) {
+ kWarning() << ddjvuprocess.readAllStandardError();
+ return false;
}
- else
- {
- close(output[1]);
+ const QByteArray ddjvuimage = ddjvuprocess.readAllStandardOutput();
+
+ if (img.loadFromData(ddjvuimage, "PPM") == false) {
+ kWarning() << "Could not load ddjvu image";
+ return false;
}
-
- close(output[0]);
- int l = img.loadFromData( data );
- return ok && l;
-}
+ return true;
+}
ThumbCreator::Flags DjVuCreator::flags() const
{
- return static_cast<Flags>(DrawFrame);
+ return ThumbCreator::DrawFrame;
}
-
-
-/* This file is part of the KDE libraries
- Copyright (C) 2000 Malte Starostik <malte@kde.org>
- Copyright (C) 2003 Leon Bottou <leon@bottou.org>
+/* This file is part of the KDE project
+ Copyright (C) 2022 Ivailo Monev <xakepa10@gmail.com>
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Library General Public
- License as published by the Free Software Foundation; either
- version 2 of the License, or (at your option) any later version.
+ License version 2, as published by the Free Software Foundation.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
public:
DjVuCreator() {}
virtual bool create(const QString &path, int, int, QImage &img);
- virtual Flags flags() const;
-
+ virtual ThumbCreator::Flags flags() const;
};
-#endif
+#endif // _DJVUCREATOR_H_