File indexing completed on 2024-04-21 05:48:08
0001 /*************************************************************************** 0002 * Copyright (C) 2006 by Sébastien Laoût * 0003 * slaout@linux62.org * 0004 * * 0005 * This program is free software; you can redistribute it and/or modify * 0006 * it under the terms of the GNU General Public License as published by * 0007 * the Free Software Foundation; either version 2 of the License, or * 0008 * (at your option) any later version. * 0009 * * 0010 * This program is distributed in the hope that it will be useful, * 0011 * but WITHOUT ANY WARRANTY; without even the implied warranty of * 0012 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * 0013 * GNU General Public License for more details. * 0014 * * 0015 * You should have received a copy of the GNU General Public License * 0016 * along with this program; if not, write to the * 0017 * Free Software Foundation, Inc., * 0018 * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * 0019 ***************************************************************************/ 0020 0021 #include <KCModule> 0022 #include <QTemporaryDir> 0023 #include <QTextCodec> 0024 #include <QTextStream> 0025 #include <qdir.h> 0026 #include <qfile.h> 0027 #include <qfileinfo.h> 0028 #include <qstringlist.h> 0029 0030 #include "basketthumbcreator.h" 0031 0032 bool BasketThumbCreator::create(const QString &path, int /*width*/, int /*height*/, QImage &image) 0033 { 0034 // Create the temporary folder: 0035 QTemporaryDir tempDir; 0036 tempDir.setAutoRemove(true); 0037 QString tempFolder = tempDir.path(); 0038 QDir dir; 0039 dir.mkdir(tempFolder); 0040 const unsigned long int BUFFER_SIZE = 1024; 0041 0042 QFile file(path); 0043 if (file.open(QIODevice::ReadOnly)) { 0044 QTextStream stream(&file); 0045 stream.setCodec(QTextCodec::codecForName("UTF-8")); 0046 QString line = stream.readLine(); 0047 if (line != "BasKetNP:archive" && line != "BasKetNP:template") { 0048 file.close(); 0049 return false; 0050 } 0051 while (!stream.atEnd()) { 0052 // Get Key/Value Pair From the Line to Read: 0053 line = stream.readLine(); 0054 int index = line.indexOf(':'); 0055 QString key; 0056 QString value; 0057 if (index >= 0) { 0058 key = line.left(index); 0059 value = line.right(line.length() - index - 1); 0060 } else { 0061 key = line; 0062 value = ""; 0063 } 0064 if (key == "preview*") { 0065 bool ok; 0066 ulong size = value.toULong(&ok); 0067 if (!ok) { 0068 file.close(); 0069 return false; 0070 } 0071 // Get the preview file: 0072 QFile previewFile(tempFolder + "preview.png"); 0073 if (previewFile.open(QIODevice::WriteOnly)) { 0074 char *buffer = new char[BUFFER_SIZE]; 0075 long int sizeRead; 0076 while ((sizeRead = file.read(buffer, qMin(BUFFER_SIZE, size))) > 0) { 0077 previewFile.write(buffer, sizeRead); 0078 size -= sizeRead; 0079 } 0080 previewFile.close(); 0081 delete[] buffer; 0082 image = QImage(tempFolder + "preview.png"); 0083 file.close(); 0084 return true; 0085 } 0086 } else if (key.endsWith('*')) { 0087 // We do not know what it is, but we should read the embedded-file in order to discard it: 0088 bool ok; 0089 ulong size = value.toULong(&ok); 0090 if (!ok) { 0091 file.close(); 0092 return false; 0093 } 0094 // Get the archive file: 0095 char *buffer = new char[BUFFER_SIZE]; 0096 long int sizeRead; 0097 while ((sizeRead = file.read(buffer, qMin(BUFFER_SIZE, size))) > 0) { 0098 size -= sizeRead; 0099 } 0100 delete[] buffer; 0101 } 0102 } 0103 file.close(); 0104 } 0105 return false; 0106 } 0107 0108 ThumbCreator::Flags BasketThumbCreator::flags() const 0109 { 0110 return (Flags)(DrawFrame | BlendIcon); 0111 } 0112 0113 extern "C" { 0114 Q_DECL_EXPORT ThumbCreator *new_creator() 0115 { 0116 return new BasketThumbCreator(); 0117 } 0118 };