KDED
kmimefileparser.cpp
Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #include "kmimefileparser.h"
00021 #include <kglobal.h>
00022 #include <kmimetype.h>
00023 #include <kstandarddirs.h>
00024 #include <kmimetypefactory.h>
00025 #include <kdebug.h>
00026 #include <QtCore/QTextStream>
00027 #include <QtCore/QFile>
00028
00029 KMimeFileParser::KMimeFileParser(KMimeTypeFactory* mimeTypeFactory)
00030 : m_mimeTypeFactory(mimeTypeFactory)
00031 {
00032 }
00033
00034 void KMimeFileParser::parseGlobs()
00035 {
00036 const QStringList globFiles = KGlobal::dirs()->findAllResources("xdgdata-mime", "globs");
00037
00038 parseGlobs(globFiles);
00039 }
00040
00041 void KMimeFileParser::parseGlobs(const QStringList& globFiles)
00042 {
00043 QStringList parsedFiles;
00044 m_mimeTypeGlobs = parseGlobFiles(globFiles, parsedFiles);
00045 m_allMimeTypes = m_mimeTypeGlobs.uniqueKeys();
00046
00047
00048
00049 Q_FOREACH(const QString& mimeTypeName, m_allMimeTypes) {
00050 KMimeType::Ptr mimeType = m_mimeTypeFactory->findMimeTypeByName(mimeTypeName, KMimeType::DontResolveAlias);
00051 if (!mimeType) {
00052 kWarning(7012) << "one of glob files in" << parsedFiles << "refers to unknown mimetype" << mimeTypeName;
00053 m_mimeTypeGlobs.remove(mimeTypeName);
00054 } else {
00055 const GlobList globs = m_mimeTypeGlobs.value(mimeTypeName);
00056 QStringList patterns;
00057 Q_FOREACH(const Glob& glob, globs)
00058 patterns.append(glob.pattern);
00059 mimeType->setPatterns(patterns);
00060 }
00061 }
00062 }
00063
00064 KMimeFileParser::AllGlobs KMimeFileParser::parseGlobFiles(const QStringList& globFiles, QStringList& parsedFiles)
00065 {
00066 KMimeFileParser::AllGlobs allGlobs;
00067 QListIterator<QString> globIter(globFiles);
00068 globIter.toBack();
00069
00070
00071 while (globIter.hasPrevious()) {
00072 Format format = OldGlobs;
00073 QString fileName = globIter.previous();
00074 QString fileNamev2 = fileName + '2';
00075 if (QFile::exists(fileNamev2)) {
00076 fileName = fileNamev2;
00077 format = Globs2WithWeight;
00078 }
00079 parsedFiles << fileName;
00080 QFile globFile(fileName);
00081 kDebug(7021) << "Now parsing" << fileName;
00082 const QHash<QString, GlobList> thisLevelGlobs = parseGlobFile(&globFile, format);
00083 if (allGlobs.isEmpty())
00084 allGlobs = thisLevelGlobs;
00085 else {
00086
00087 allGlobs.unite(thisLevelGlobs);
00088 }
00089 }
00090 return allGlobs;
00091 }
00092
00093
00094 QHash<QString, KMimeFileParser::GlobList> KMimeFileParser::parseGlobFile(QIODevice* file, Format format)
00095 {
00096 QHash<QString, GlobList> globs;
00097 if (!file->open(QIODevice::ReadOnly))
00098 return globs;
00099 QTextStream stream(file);
00100
00101 QString line;
00102 while (!stream.atEnd()) {
00103 line = stream.readLine();
00104 if (line.isEmpty() || line.startsWith('#'))
00105 continue;
00106 int pos = line.indexOf(':');
00107 if (pos == -1)
00108 continue;
00109 int weight = 50;
00110 if (format == Globs2WithWeight) {
00111 weight = line.left(pos).toInt();
00112 line = line.mid(pos+1);
00113 pos = line.indexOf(':', pos + 1);
00114 if (pos == -1)
00115 continue;
00116 }
00117 const QString mimeTypeName = line.left(pos);
00118 const QString pattern = line.mid(pos+1);
00119 Q_ASSERT(!pattern.isEmpty());
00120 GlobList& globList = globs[mimeTypeName];
00121
00122
00123 if (!globList.containsPattern(pattern)) {
00124
00125
00126 globList.append(Glob(weight, pattern));
00127 }
00128 }
00129 return globs;
00130 }