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::setParsedPatternMap(const ParsedPatternMap& parsedPatternMap)
00035 {
00036 m_parsedPatternMap = parsedPatternMap;
00037 }
00038
00039 void KMimeFileParser::parseGlobs()
00040 {
00041 const QStringList globFiles = KGlobal::dirs()->findAllResources("xdgdata-mime", "globs");
00042
00043 parseGlobs(globFiles);
00044 }
00045
00046 void KMimeFileParser::parseGlobs(const QStringList& globFiles)
00047 {
00048 QStringList parsedFiles;
00049 m_mimeTypeGlobs = parseGlobFiles(globFiles, parsedFiles);
00050 m_allMimeTypes = m_mimeTypeGlobs.uniqueKeys();
00051
00052
00053
00054
00055
00056 Q_FOREACH(const QString& mimeTypeName, m_allMimeTypes) {
00057 if (m_parsedPatternMap.contains(mimeTypeName)) {
00058 KMimeType::Ptr mimeType = m_mimeTypeFactory->findMimeTypeByName(mimeTypeName, KMimeType::DontResolveAlias);
00059 if (!mimeType) {
00060 kWarning(7012) << "one of glob files in" << parsedFiles << "refers to unknown mimetype" << mimeTypeName;
00061 m_mimeTypeGlobs.remove(mimeTypeName);
00062 } else {
00063 const GlobList globs = m_mimeTypeGlobs.value(mimeTypeName);
00064 const QString mainPattern = m_parsedPatternMap.value(mimeTypeName);
00065 QStringList patterns;
00066 Q_FOREACH(const Glob& glob, globs) {
00067 if (glob.pattern == mainPattern)
00068 patterns.prepend(glob.pattern);
00069 else
00070 patterns.append(glob.pattern);
00071 }
00072 mimeType->setPatterns(patterns);
00073 }
00074 }
00075 }
00076 }
00077
00078 KMimeFileParser::AllGlobs KMimeFileParser::parseGlobFiles(const QStringList& globFiles, QStringList& parsedFiles)
00079 {
00080 KMimeFileParser::AllGlobs allGlobs;
00081 QListIterator<QString> globIter(globFiles);
00082 globIter.toBack();
00083
00084
00085
00086 while (globIter.hasPrevious()) {
00087 Format format = OldGlobs;
00088 QString fileName = globIter.previous();
00089 QString fileNamev2 = fileName + '2';
00090 if (QFile::exists(fileNamev2)) {
00091 fileName = fileNamev2;
00092 format = Globs2WithWeight;
00093 }
00094 parsedFiles << fileName;
00095 QFile globFile(fileName);
00096
00097 parseGlobFile(&globFile, format, allGlobs);
00098 }
00099 return allGlobs;
00100 }
00101
00102
00103 bool KMimeFileParser::parseGlobFile(QIODevice* file, Format format, AllGlobs& globs)
00104 {
00105 if (!file->open(QIODevice::ReadOnly))
00106 return false;
00107 QTextStream stream(file);
00108
00109 QString line;
00110 while (!stream.atEnd()) {
00111 line = stream.readLine();
00112 if (line.isEmpty() || line.startsWith('#'))
00113 continue;
00114 int pos = line.indexOf(':');
00115 if (pos == -1)
00116 continue;
00117 int weight = 50;
00118 if (format == Globs2WithWeight) {
00119 weight = line.left(pos).toInt();
00120 line = line.mid(pos+1);
00121 pos = line.indexOf(':', pos + 1);
00122 if (pos == -1)
00123 continue;
00124 }
00125 const QString mimeTypeName = line.left(pos);
00126 const QString pattern = line.mid(pos+1);
00127 Q_ASSERT(!pattern.isEmpty());
00128 GlobList& globList = globs[mimeTypeName];
00129 if (pattern == "__NOGLOBS__") {
00130 globList.clear();
00131 } else {
00132
00133
00134 if (!globList.containsPattern(pattern)) {
00135
00136
00137 globList.append(Glob(weight, pattern));
00138 }
00139 }
00140 }
00141 return true;
00142 }