From 3c64c3232a79eb2d2e5267c3315e0d321677a0d3 Mon Sep 17 00:00:00 2001 From: Pino Toscano Date: Sat, 29 Dec 2007 00:04:31 +0000 Subject: [PATCH] Start adding a minimal way to handle the different flavours of unrar. For now, deny the usage of the "unrar-free", as it does not seem to be much usable... svn path=/trunk/KDE/kdegraphics/okular/; revision=754056 --- generators/comicbook/CMakeLists.txt | 1 + generators/comicbook/document.cpp | 5 ++ generators/comicbook/unrar.cpp | 52 +++++++++++++++++- generators/comicbook/unrar.h | 2 + generators/comicbook/unrarflavours.cpp | 73 ++++++++++++++++++++++++++ generators/comicbook/unrarflavours.h | 55 +++++++++++++++++++ 6 files changed, 187 insertions(+), 1 deletion(-) create mode 100644 generators/comicbook/unrarflavours.cpp create mode 100644 generators/comicbook/unrarflavours.h diff --git a/generators/comicbook/CMakeLists.txt b/generators/comicbook/CMakeLists.txt index d25f38590..27c384907 100644 --- a/generators/comicbook/CMakeLists.txt +++ b/generators/comicbook/CMakeLists.txt @@ -9,6 +9,7 @@ set( okularGenerator_comicbook_PART_SRCS document.cpp generator_comicbook.cpp unrar.cpp qnatsort.cpp + unrarflavours.cpp ) diff --git a/generators/comicbook/document.cpp b/generators/comicbook/document.cpp index 864fbef40..874ee81be 100644 --- a/generators/comicbook/document.cpp +++ b/generators/comicbook/document.cpp @@ -70,6 +70,11 @@ bool Document::open( const QString &fileName ) extractImageFiles( entries ); } else { + if ( !Unrar::isAvailable() ) { + // TODO emit a visible error + return false; + } + /** * We have a rar archive */ diff --git a/generators/comicbook/unrar.cpp b/generators/comicbook/unrar.cpp index 97125cb86..643d46258 100644 --- a/generators/comicbook/unrar.cpp +++ b/generators/comicbook/unrar.cpp @@ -11,9 +11,54 @@ #include #include +#include +#include +#include #include +#include "unrarflavours.h" + +struct UnrarHelper +{ + UnrarHelper(); + ~UnrarHelper(); + + UnrarFlavour *kind; +}; + +K_GLOBAL_STATIC( UnrarHelper, helper ) + +UnrarHelper::UnrarHelper() + : kind( 0 ) +{ + QProcess proc; + proc.start( "unrar", QStringList() << "--version" ); + bool ok = proc.waitForFinished( -1 ); + Q_UNUSED( ok ) + const QStringList lines = QString::fromLocal8Bit( proc.readAllStandardOutput() ).split( "\n", QString::SkipEmptyParts ); + if ( !lines.isEmpty() ) + { + if ( lines.first().startsWith( "UNRAR " ) ) + kind = new NonFreeUnrarFlavour(); + else if ( lines.first().startsWith( "unrar " ) ) + kind = new FreeUnrarFlavour(); + } + + if ( !kind ) + { + // no luck so far, assume unrar-nonfree + kind = new NonFreeUnrarFlavour(); + } + kDebug() << "detected:" << kind->name(); +} + +UnrarHelper::~UnrarHelper() +{ + delete kind; +} + + Unrar::Unrar() : QObject( 0 ), mTempDir( 0 ) { @@ -67,7 +112,7 @@ QStringList Unrar::list() delete mProcess; mProcess = 0; - return QString::fromLocal8Bit( mStdOutData ).split( "\n", QString::SkipEmptyParts ); + return helper->kind->processListing( QString::fromLocal8Bit( mStdOutData ).split( "\n", QString::SkipEmptyParts ) ); } QByteArray Unrar::contentOf( const QString &fileName ) const @@ -79,6 +124,11 @@ QByteArray Unrar::contentOf( const QString &fileName ) const return file.readAll(); } +bool Unrar::isAvailable() +{ + return dynamic_cast< NonFreeUnrarFlavour * >( helper->kind ); +} + void Unrar::readFromStdout() { mStdOutData += mProcess->readAllStandardOutput(); diff --git a/generators/comicbook/unrar.h b/generators/comicbook/unrar.h index eb2f589ea..39ab83bf8 100644 --- a/generators/comicbook/unrar.h +++ b/generators/comicbook/unrar.h @@ -46,6 +46,8 @@ class Unrar : public QObject */ QByteArray contentOf( const QString &fileName ) const; + static bool isAvailable(); + private Q_SLOTS: void readFromStdout(); void readFromStderr(); diff --git a/generators/comicbook/unrarflavours.cpp b/generators/comicbook/unrarflavours.cpp new file mode 100644 index 000000000..7451321af --- /dev/null +++ b/generators/comicbook/unrarflavours.cpp @@ -0,0 +1,73 @@ +/*************************************************************************** + * Copyright (C) 2007 by Pino Toscano * + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + ***************************************************************************/ + +#include "unrarflavours.h" + +#include +#include + +UnrarFlavour::UnrarFlavour() +{ +} + +UnrarFlavour::~UnrarFlavour() +{ +} + +void UnrarFlavour::setFileName( const QString &fileName ) +{ + mFileName = fileName; +} + +QString UnrarFlavour::fileName() const +{ + return mFileName; +} + + +NonFreeUnrarFlavour::NonFreeUnrarFlavour() + : UnrarFlavour() +{ +} + +QStringList NonFreeUnrarFlavour::processListing( const QStringList &data ) +{ + // unrar-nonfree just lists the files + return data; +} + +QString NonFreeUnrarFlavour::name() const +{ + return "unrar-nonfree"; +} + + +FreeUnrarFlavour::FreeUnrarFlavour() + : UnrarFlavour() +{ +} + +QStringList FreeUnrarFlavour::processListing( const QStringList &data ) +{ + QRegExp re( "^ ([^/]+/([^\\s]+))$" ); + + QStringList newdata; + foreach ( const QString &line, data ) + { + if ( re.exactMatch( line ) ) + newdata.append( re.cap( 1 ) ); + } + return newdata; +} + +QString FreeUnrarFlavour::name() const +{ + return "unrar-free"; +} + diff --git a/generators/comicbook/unrarflavours.h b/generators/comicbook/unrarflavours.h new file mode 100644 index 000000000..974cd04e6 --- /dev/null +++ b/generators/comicbook/unrarflavours.h @@ -0,0 +1,55 @@ +/*************************************************************************** + * Copyright (C) 2007 by Pino Toscano * + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + ***************************************************************************/ + +#ifndef UNRARFLAVOURS_H +#define UNRARFLAVOURS_H + +#include + +class QStringList; + +class UnrarFlavour +{ + public: + virtual ~UnrarFlavour(); + + virtual QStringList processListing( const QStringList &data ) = 0; + virtual QString name() const = 0; + + void setFileName( const QString &fileName ); + + protected: + UnrarFlavour(); + + QString fileName() const; + + private: + QString mFileName; +}; + +class NonFreeUnrarFlavour : public UnrarFlavour +{ + public: + NonFreeUnrarFlavour(); + + virtual QStringList processListing( const QStringList &data ); + virtual QString name() const; +}; + +class FreeUnrarFlavour : public UnrarFlavour +{ + public: + FreeUnrarFlavour(); + + virtual QStringList processListing( const QStringList &data ); + virtual QString name() const; +}; + +#endif +