polish
[kdegraphics.git] / gwenview / lib / mimetypeutils.cpp
blobaf38009e4e2d6e198ce7dc5e1b543dce99ced6b2
1 // vim: set tabstop=4 shiftwidth=4 noexpandtab
2 /*
3 Gwenview - A simple image viewer for KDE
4 Copyright 2006 Aurelien Gateau <aurelien.gateau@free.fr>
6 This program is free software; you can redistribute it and/or
7 modify it under the terms of the GNU General Public License
8 as published by the Free Software Foundation; either version 2
9 of the License, or (at your option) any later version.
11 This program is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
16 You should have received a copy of the GNU General Public License
17 along with this program; if not, write to the Free Software
18 Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
21 #include "mimetypeutils.h"
22 #include "mimetypeutils_p.moc"
24 // Qt
25 #include <QApplication>
26 #include <QStringList>
28 // KDE
29 #include <kapplication.h>
30 #include <kdebug.h>
31 #include <kfileitem.h>
32 #include <kio/job.h>
33 #include <kio/jobclasses.h>
34 #include <kio/netaccess.h>
35 #include <kmimetype.h>
36 #include <kurl.h>
38 #include <kimageio.h>
40 // Local
41 #include "archiveutils.h"
44 namespace Gwenview {
46 namespace MimeTypeUtils {
49 const QStringList& dirMimeTypes() {
50 static QStringList list;
51 if (list.isEmpty()) {
52 list << "inode/directory";
53 list += ArchiveUtils::mimeTypes();
55 return list;
59 const QStringList& rasterImageMimeTypes() {
60 static QStringList list;
61 if (list.isEmpty()) {
62 list=KImageIO::mimeTypes(KImageIO::Reading);
64 return list;
68 const QStringList& svgImageMimeTypes() {
69 static QStringList list;
70 if (list.isEmpty()) {
71 list.append("image/svg+xml");
72 // FIXME svgz
74 return list;
78 const QStringList& imageMimeTypes() {
79 static QStringList list;
80 if (list.isEmpty()) {
81 list = rasterImageMimeTypes();
82 list += svgImageMimeTypes();
85 return list;
89 const QStringList& videoMimeTypes() {
90 static QStringList list;
91 if (list.isEmpty()) {
92 #ifdef __GNUC__
93 #warning implement MimeTypeUtils::videoMimeTypes()
94 #endif
97 return list;
101 QString urlMimeType(const KUrl& url) {
102 // Try a simple guess, using extension for remote urls
103 QString mimeType = KMimeType::findByUrl(url)->name();
104 if (mimeType == "application/octet-stream") {
105 // No luck, look deeper. This can happens with http urls if the filename
106 // does not provide any extension.
107 mimeType = KIO::NetAccess::mimetype(url, KApplication::kApplication()->activeWindow());
109 return mimeType;
113 QString urlMimeTypeByContent(const KUrl& url) {
114 const int HEADER_SIZE = 30;
115 if (url.isLocalFile()) {
116 return KMimeType::findByFileContent(url.path())->name();
119 KIO::TransferJob* job = KIO::get(url);
120 DataAccumulator accumulator(job);
121 while (!accumulator.finished() && accumulator.data().size() < HEADER_SIZE) {
122 qApp->processEvents(QEventLoop::ExcludeUserInputEvents);
124 return KMimeType::findByContent(accumulator.data())->name();
127 Kind mimeTypeKind(const QString& mimeType) {
128 if (mimeType.startsWith("inode/directory")) {
129 return KIND_DIR;
131 if (ArchiveUtils::mimeTypes().contains(mimeType)) {
132 return KIND_ARCHIVE;
134 if (rasterImageMimeTypes().contains(mimeType)) {
135 return KIND_RASTER_IMAGE;
137 if (svgImageMimeTypes().contains(mimeType)) {
138 return KIND_SVG_IMAGE;
141 return KIND_FILE;
145 Kind fileItemKind(const KFileItem& item) {
146 return mimeTypeKind(item.mimetype());
150 Kind urlKind(const KUrl& url) {
151 return mimeTypeKind(urlMimeType(url));
155 DataAccumulator::DataAccumulator(KIO::TransferJob* job)
156 : QObject()
157 , mFinished(false)
159 connect(job, SIGNAL(data(KIO::Job*, const QByteArray&)),
160 SLOT(slotDataReceived(KIO::Job*, const QByteArray&)) );
161 connect(job, SIGNAL(result(KJob*)),
162 SLOT(slotFinished()) );
166 void DataAccumulator::slotDataReceived(KIO::Job*, const QByteArray& data) {
167 mData += data;
171 void DataAccumulator::slotFinished() {
172 mFinished = true;
176 } // namespace MimeTypeUtils
177 } // namespace Gwenview