1 // vim: set tabstop=4 shiftwidth=4 noexpandtab
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"
25 #include <QApplication>
26 #include <QStringList>
29 #include <kapplication.h>
31 #include <kfileitem.h>
33 #include <kio/jobclasses.h>
34 #include <kio/netaccess.h>
35 #include <kmimetype.h>
41 #include "archiveutils.h"
46 namespace MimeTypeUtils
{
49 const QStringList
& dirMimeTypes() {
50 static QStringList list
;
52 list
<< "inode/directory";
53 list
+= ArchiveUtils::mimeTypes();
59 const QStringList
& rasterImageMimeTypes() {
60 static QStringList list
;
62 list
=KImageIO::mimeTypes(KImageIO::Reading
);
68 const QStringList
& svgImageMimeTypes() {
69 static QStringList list
;
71 list
.append("image/svg+xml");
78 const QStringList
& imageMimeTypes() {
79 static QStringList list
;
81 list
= rasterImageMimeTypes();
82 list
+= svgImageMimeTypes();
89 const QStringList
& videoMimeTypes() {
90 static QStringList list
;
93 #warning implement MimeTypeUtils::videoMimeTypes()
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());
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")) {
131 if (ArchiveUtils::mimeTypes().contains(mimeType
)) {
134 if (rasterImageMimeTypes().contains(mimeType
)) {
135 return KIND_RASTER_IMAGE
;
137 if (svgImageMimeTypes().contains(mimeType
)) {
138 return KIND_SVG_IMAGE
;
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
)
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
) {
171 void DataAccumulator::slotFinished() {
176 } // namespace MimeTypeUtils
177 } // namespace Gwenview