1 /**************************************************************************
2 ** This file is part of LiteIDE
3 **
4 ** Copyright (c) 2011-2019 LiteIDE. All rights reserved.
5 **
6 ** This library is free software; you can redistribute it and/or
7 ** modify it under the terms of the GNU Lesser General Public
8 ** License as published by the Free Software Foundation; either
9 ** version 2.1 of the License, or (at your option) any later version.
10 **
11 ** This library 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 GNU
14 ** Lesser General Public License for more details.
15 **
16 ** In addition, as a special exception, that plugins developed for LiteIDE,
17 ** are allowed to remain closed sourced and can be distributed under any license .
18 ** These rights are included in the file LGPL_EXCEPTION.txt in this package.
19 **
20 **************************************************************************/
21 // Module: mimetypemanager.cpp
22 // Creator: visualfc <visualfc@gmail.com>
23
24 #include "mimetypemanager.h"
25 #include "mimetype/mimetype.h"
26 #include <QDir>
27 #include <QFileInfo>
28 #include <QDebug>
29 //lite_memory_check_begin
30 #if defined(WIN32) && defined(_MSC_VER) && defined(_DEBUG)
31 #define _CRTDBG_MAP_ALLOC
32 #include <stdlib.h>
33 #include <crtdbg.h>
34 #define DEBUG_NEW new( _NORMAL_BLOCK, __FILE__, __LINE__ )
35 #define new DEBUG_NEW
36 #endif
37 //lite_memory_check_end
38
39
~MimeTypeManager()40 MimeTypeManager::~MimeTypeManager()
41 {
42 qDeleteAll(m_mimeTypeList);
43 }
44
addMimeType(IMimeType * mimeType)45 bool MimeTypeManager::addMimeType(IMimeType *mimeType)
46 {
47 foreach (IMimeType *m, m_mimeTypeList) {
48 if (m->type() == mimeType->type()) {
49 m->merge(mimeType);
50 return false;
51 }
52 }
53 m_mimeTypeList.append(mimeType);
54 return true;
55 }
56
removeMimeType(IMimeType * mimeType)57 void MimeTypeManager::removeMimeType(IMimeType *mimeType)
58 {
59 m_mimeTypeList.removeOne(mimeType);
60 }
61
mimeTypeList() const62 QList<IMimeType*> MimeTypeManager::mimeTypeList() const
63 {
64 return m_mimeTypeList;
65 }
66
findMimeType(const QString & type) const67 IMimeType *MimeTypeManager::findMimeType(const QString &type) const
68 {
69 foreach(IMimeType *mimeType, m_mimeTypeList) {
70 if (mimeType->type() == type) {
71 return mimeType;
72 }
73 }
74 return 0;
75 }
76
findPackageByMimeType(const QString & type) const77 QString MimeTypeManager::findPackageByMimeType(const QString &type) const
78 {
79 if (type.isEmpty()) {
80 return QString();
81 }
82 foreach(IMimeType *mimeType, m_mimeTypeList) {
83 if (mimeType->type() == type) {
84 return mimeType->package();
85 }
86 }
87 return QString();
88 }
89
findMimeTypeByFile(const QString & fileName) const90 QString MimeTypeManager::findMimeTypeByFile(const QString &fileName) const
91 {
92 QFileInfo info(fileName);
93 QString name = info.fileName();
94 //first check full name
95 foreach (IMimeType *mimeType, m_mimeTypeList) {
96 foreach (QString pattern, mimeType->allPatterns()) {
97 if (!pattern.startsWith("*")) {
98 if (name == pattern) {
99 return mimeType->type();
100 }
101 }
102 }
103 }
104 //check *.ext
105 QString find = info.suffix();
106 if (find.isEmpty()) {
107 return QString();
108 }
109 find = "*."+find;
110 foreach (IMimeType *mimeType, m_mimeTypeList) {
111 foreach (QString pattern, mimeType->allPatterns()) {
112 if (find.compare(pattern,Qt::CaseInsensitive) == 0) {
113 return mimeType->type();
114 }
115 }
116 }
117 return QString();
118 }
119
findMimeTypeBySuffix(const QString & suffix) const120 QString MimeTypeManager::findMimeTypeBySuffix(const QString &suffix) const
121 {
122 QString find = "*."+suffix;
123 foreach (IMimeType *mimeType, m_mimeTypeList) {
124 foreach (QString pattern, mimeType->allPatterns()) {
125 if (find.compare(pattern,Qt::CaseInsensitive) == 0) {
126 return mimeType->type();
127 }
128 }
129 }
130 return QString();
131 }
132
findMimeTypeByScheme(const QString & scheme) const133 QString MimeTypeManager::findMimeTypeByScheme(const QString &scheme) const
134 {
135 foreach (IMimeType *mimeType, m_mimeTypeList) {
136 QString type = mimeType->scheme();
137 if (type.isEmpty()) {
138 type = "file";
139 }
140 if (scheme == type) {
141 return mimeType->type();
142 }
143 }
144 return QString();
145 }
146
loadMimeTypes(const QString & path)147 void MimeTypeManager::loadMimeTypes(const QString &path)
148 {
149 QDir dir = path;
150 dir.setFilter(QDir::Files | QDir::NoSymLinks);
151 dir.setNameFilters(QStringList("*.xml"));
152 foreach (QString fileName, dir.entryList()) {
153 bool b = MimeType::loadMimeTypes(this,QFileInfo(dir,fileName).absoluteFilePath());
154 m_liteApp->appendLog("LiteApp",QString("%1 MIME %2").arg(b?"Loaded":"ERROR loading").arg(fileName),!b);
155 }
156 }
157
findAllFilesByMimeType(const QString & dirPath,const QString & type,int deep) const158 QStringList MimeTypeManager::findAllFilesByMimeType(const QString &dirPath, const QString &type, int deep) const
159 {
160 LiteApi::IMimeType *mimeType = findMimeType(type);
161 if (mimeType) {
162 QDir dir(dirPath);
163 for (int i = 0; i <= deep; i++) {
164 QStringList files = dir.entryList(QStringList() << mimeType->allPatterns(),QDir::Files);
165 if (!files.isEmpty()) {
166 return files;
167 }
168 dir.cdUp();
169 }
170 }
171 return QStringList();
172 }
173