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