• Skip to content
  • Skip to link menu
KDE API Reference
  • KDE API Reference
  • kdeutils API Reference
  • KDE Home
  • Contact Us
 

ark

  • sources
  • kde-4.14
  • kdeutils
  • ark
  • plugins
  • libsinglefileplugin
singlefileplugin.cpp
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2009 Raphael Kubo da Costa <rakuco@FreeBSD.org>
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions
6  * are met:
7  *
8  * 1. Redistributions of source code must retain the above copyright
9  * notice, this list of conditions and the following disclaimer.
10  * 2. Redistributions in binary form must reproduce the above copyright
11  * notice, this list of conditions and the following disclaimer in the
12  * documentation and/or other materials provided with the distribution.
13  *
14  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
15  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
16  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
17  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
18  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES ( INCLUDING, BUT
19  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
20  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION ) HOWEVER CAUSED AND ON ANY
21  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
22  * ( INCLUDING NEGLIGENCE OR OTHERWISE ) ARISING IN ANY WAY OUT OF THE USE OF
23  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
24  */
25 
26 #include "singlefileplugin.h"
27 #include "kerfuffle/kerfuffle_export.h"
28 #include "kerfuffle/queries.h"
29 
30 #include <QByteArray>
31 #include <QFile>
32 #include <QFileInfo>
33 #include <QString>
34 
35 #include <KDebug>
36 #include <KFilterDev>
37 #include <KLocale>
38 
39 LibSingleFileInterface::LibSingleFileInterface(QObject *parent, const QVariantList & args)
40  : Kerfuffle::ReadOnlyArchiveInterface(parent, args)
41 {
42 }
43 
44 LibSingleFileInterface::~LibSingleFileInterface()
45 {
46 }
47 
48 bool LibSingleFileInterface::copyFiles(const QList<QVariant> & files, const QString & destinationDirectory, Kerfuffle::ExtractionOptions options)
49 {
50  Q_UNUSED(files)
51  Q_UNUSED(options)
52 
53  QString outputFileName = destinationDirectory;
54  if (!destinationDirectory.endsWith(QLatin1Char('/'))) {
55  outputFileName += QLatin1Char('/');
56  }
57  outputFileName += uncompressedFileName();
58 
59  outputFileName = overwriteFileName(outputFileName);
60  if (outputFileName.isEmpty()) {
61  return true;
62  }
63 
64  kDebug() << "Extracting to" << outputFileName;
65 
66  QFile outputFile(outputFileName);
67  if (!outputFile.open(QIODevice::WriteOnly)) {
68  kDebug() << "Failed to open output file" << outputFile.errorString();
69  emit error(i18nc("@info", "Ark could not extract <filename>%1</filename>.", outputFile.fileName()));
70 
71  return false;
72  }
73 
74  QIODevice *device = KFilterDev::deviceForFile(filename(), m_mimeType, false);
75  if (!device) {
76  kDebug() << "Could not create KFilterDev";
77  emit error(i18nc("@info", "Ark could not open <filename>%1</filename> for extraction.", filename()));
78 
79  return false;
80  }
81 
82  device->open(QIODevice::ReadOnly);
83 
84  qint64 bytesRead;
85  QByteArray dataChunk(1024*16, '\0'); // 16Kb
86 
87  while (true) {
88  bytesRead = device->read(dataChunk.data(), dataChunk.size());
89 
90  if (bytesRead == -1) {
91  emit error(i18nc("@info", "There was an error while reading <filename>%1</filename> during extraction.", filename()));
92  break;
93  } else if (bytesRead == 0) {
94  break;
95  }
96 
97  outputFile.write(dataChunk.data(), bytesRead);
98  }
99 
100  delete device;
101 
102  return true;
103 }
104 
105 bool LibSingleFileInterface::list()
106 {
107  kDebug();
108 
109  const QString filename = uncompressedFileName();
110 
111  Kerfuffle::ArchiveEntry e;
112 
113  e[Kerfuffle::FileName] = filename;
114  e[Kerfuffle::InternalID] = filename;
115 
116  emit entry(e);
117 
118  return true;
119 }
120 
121 QString LibSingleFileInterface::overwriteFileName(QString& filename)
122 {
123  QString newFileName(filename);
124 
125  while (QFile::exists(newFileName)) {
126  Kerfuffle::OverwriteQuery query(newFileName);
127 
128  query.setMultiMode(false);
129  emit userQuery(&query);
130  query.waitForResponse();
131 
132  if ((query.responseCancelled()) || (query.responseSkip())) {
133  return QString();
134  } else if (query.responseOverwrite()) {
135  break;
136  } else if (query.responseRename()) {
137  newFileName = query.newFilename();
138  }
139  }
140 
141  return newFileName;
142 }
143 
144 const QString LibSingleFileInterface::uncompressedFileName() const
145 {
146  QString uncompressedName(QFileInfo(filename()).fileName());
147 
148  foreach(const QString & extension, m_possibleExtensions) {
149  kDebug() << extension;
150 
151  if (uncompressedName.endsWith(extension, Qt::CaseInsensitive)) {
152  uncompressedName.chop(extension.size());
153  return uncompressedName;
154  }
155  }
156 
157  return uncompressedName + QLatin1String( ".uncompressed" );
158 }
159 
160 #include "singlefileplugin.moc"
QIODevice
LibSingleFileInterface::~LibSingleFileInterface
virtual ~LibSingleFileInterface()
Definition: singlefileplugin.cpp:44
QByteArray
LibSingleFileInterface::uncompressedFileName
const QString uncompressedFileName() const
Definition: singlefileplugin.cpp:144
kerfuffle_export.h
QIODevice::errorString
QString errorString() const
QFile::fileName
QString fileName() const
QString::size
int size() const
Kerfuffle::ReadOnlyArchiveInterface::userQuery
void userQuery(Query *query)
Kerfuffle::ReadOnlyArchiveInterface::filename
QString filename() const
Returns the filename of the archive currently being handled.
Definition: archiveinterface.cpp:48
queries.h
QFile::exists
bool exists() const
QIODevice::open
virtual bool open(QFlags< QIODevice::OpenModeFlag > mode)
QString::chop
void chop(int n)
QFile
Kerfuffle::Query::waitForResponse
void waitForResponse()
Will block until the response have been set.
Definition: queries.cpp:50
Kerfuffle::ReadOnlyArchiveInterface::entry
void entry(const ArchiveEntry &archiveEntry)
LibSingleFileInterface::overwriteFileName
QString overwriteFileName(QString &filename)
Definition: singlefileplugin.cpp:121
QHash
QObject
Kerfuffle::OverwriteQuery::responseCancelled
bool responseCancelled()
Definition: queries.cpp:112
LibSingleFileInterface::m_mimeType
QString m_mimeType
Definition: singlefileplugin.h:46
QString::isEmpty
bool isEmpty() const
LibSingleFileInterface::copyFiles
virtual bool copyFiles(const QList< QVariant > &files, const QString &destinationDirectory, Kerfuffle::ExtractionOptions options)
Extract files from archive.
Definition: singlefileplugin.cpp:48
QString::endsWith
bool endsWith(const QString &s, Qt::CaseSensitivity cs) const
QIODevice::read
qint64 read(char *data, qint64 maxSize)
LibSingleFileInterface::LibSingleFileInterface
LibSingleFileInterface(QObject *parent, const QVariantList &args)
Definition: singlefileplugin.cpp:39
Kerfuffle::OverwriteQuery::responseSkip
bool responseSkip()
Definition: queries.cpp:130
QString
QList
Kerfuffle::OverwriteQuery::responseOverwrite
bool responseOverwrite()
Definition: queries.cpp:120
QFile::open
virtual bool open(QFlags< QIODevice::OpenModeFlag > mode)
Kerfuffle::FileName
The entry's file name.
Definition: archive.h:59
Kerfuffle::OverwriteQuery::newFilename
QString newFilename()
Definition: queries.cpp:140
QFileInfo
QLatin1Char
QLatin1String
Kerfuffle::ReadOnlyArchiveInterface::error
void error(const QString &message, const QString &details=QString())
LibSingleFileInterface::m_possibleExtensions
QStringList m_possibleExtensions
Definition: singlefileplugin.h:47
singlefileplugin.h
Kerfuffle::OverwriteQuery::setMultiMode
void setMultiMode(bool enableMultiMode)
Definition: queries.cpp:155
Kerfuffle::OverwriteQuery
Definition: queries.h:77
QByteArray::data
char * data()
QIODevice::write
qint64 write(const char *data, qint64 maxSize)
LibSingleFileInterface::list
virtual bool list()
List archive contents.
Definition: singlefileplugin.cpp:105
Kerfuffle::OverwriteQuery::responseRename
bool responseRename()
Definition: queries.cpp:125
Kerfuffle::InternalID
The entry's ID for Ark's internal manipulation.
Definition: archive.h:60
QByteArray::size
int size() const
This file is part of the KDE documentation.
Documentation copyright © 1996-2020 The KDE developers.
Generated on Mon Jun 22 2020 13:42:37 by doxygen 1.8.7 written by Dimitri van Heesch, © 1997-2006

KDE's Doxygen guidelines are available online.

ark

Skip menu "ark"
  • Main Page
  • Namespace List
  • Namespace Members
  • Alphabetical List
  • Class List
  • Class Hierarchy
  • Class Members
  • File List
  • File Members

kdeutils API Reference

Skip menu "kdeutils API Reference"
  • ark
  • filelight
  • kcalc
  • kcharselect
  • kdf
  • kfloppy
  • kgpg
  • ktimer
  • kwallet
  • sweeper

Search



Report problems with this website to our bug tracking system.
Contact the specific authors with questions and comments about the page contents.

KDE® and the K Desktop Environment® logo are registered trademarks of KDE e.V. | Legal