You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
basket/file-integration/basketthumbcreator.cpp

118 lines
3.7 KiB

/***************************************************************************
* Copyright (C) 2006 by Sébastien Laoût *
* slaout@linux62.org *
* *
* 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. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; if not, write to the *
* Free Software Foundation, Inc., *
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. *
***************************************************************************/
#include <qstringlist.h>
#include <qdir.h>
#include <qfile.h>
#include <qfileinfo.h>
#include <qtextstream.h>
#include <ktempdir.h>
#include "basketthumbcreator.h"
bool BasketThumbCreator::create(const QString &path, int /*width*/, int /*height*/, QImage &image)
{
// Create the temporar folder:
KTempDir tempDir;
tempDir.setAutoDelete(true);
QString tempFolder = tempDir.name();
QDir dir;
dir.mkdir(tempFolder);
const Q_ULONG BUFFER_SIZE = 1024;
QFile file(path);
if (file.open(IO_ReadOnly)) {
QTextStream stream(&file);
stream.setEncoding(QTextStream::Latin1);
QString line = stream.readLine();
if (line != "BasKetNP:archive" && line != "BasKetNP:template") {
file.close();
return false;
}
while (!stream.atEnd()) {
// Get Key/Value Pair From the Line to Read:
line = stream.readLine();
int index = line.find(':');
QString key;
QString value;
if (index >= 0) {
key = line.left(index);
value = line.right(line.length() - index - 1);
} else {
key = line;
value = "";
}
if (key == "preview*") {
bool ok;
ulong size = value.toULong(&ok);
if (!ok) {
file.close();
return false;
}
// Get the preview file:
QFile previewFile(tempFolder + "preview.png");
if (previewFile.open(IO_WriteOnly)) {
char *buffer = new char[BUFFER_SIZE];
Q_LONG sizeRead;
while ((sizeRead = file.readBlock(buffer, QMIN(BUFFER_SIZE, size))) > 0) {
previewFile.writeBlock(buffer, sizeRead);
size -= sizeRead;
}
previewFile.close();
delete buffer;
image = QImage(tempFolder + "preview.png");
file.close();
return true;
}
} else if (key.endsWith("*")) {
// We do not know what it is, but we should read the embedded-file in order to discard it:
bool ok;
ulong size = value.toULong(&ok);
if (!ok) {
file.close();
return false;
}
// Get the archive file:
char *buffer = new char[BUFFER_SIZE];
Q_LONG sizeRead;
while ((sizeRead = file.readBlock(buffer, QMIN(BUFFER_SIZE, size))) > 0) {
size -= sizeRead;
}
delete buffer;
}
}
file.close();
}
return false;
}
ThumbCreator::Flags BasketThumbCreator::flags() const
{
return (Flags) (DrawFrame | BlendIcon);
}
extern "C"
{
ThumbCreator *new_creator()
{
return new BasketThumbCreator();
}
};