OSDN Git Service

kioslave: reimplement DjVu thumbnail creator [ci reset]
authorIvailo Monev <xakepa10@gmail.com>
Wed, 9 Mar 2022 16:53:27 +0000 (18:53 +0200)
committerIvailo Monev <xakepa10@gmail.com>
Wed, 9 Mar 2022 16:54:34 +0000 (18:54 +0200)
Signed-off-by: Ivailo Monev <xakepa10@gmail.com>
kioslave/thumbnail/djvucreator.cpp
kioslave/thumbnail/djvucreator.h

index 185804c..d774a18 100644 (file)
@@ -1,11 +1,9 @@
-/*  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;
 }
-
-
index f6724c1..3974cb6 100644 (file)
@@ -1,11 +1,9 @@
-/*  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
@@ -28,8 +26,7 @@ class DjVuCreator : public ThumbCreator
 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_