34 #include <qt_windows.h> 43 bool ReadValue (HKEY hKey,
const QString& valueName, QString& result)
46 if (ERROR_SUCCESS == RegQueryValueExW (hKey,
47 valueName.toStdWString ().c_str (),
53 std::vector<wchar_t> buff (buffSize /
sizeof (
wchar_t));
54 if (ERROR_SUCCESS == RegQueryValueExW (hKey,
55 valueName.toStdWString ().c_str (),
58 reinterpret_cast<LPBYTE
> (&buff [0]),
61 result = QString::fromWCharArray (buff.data ());
68 bool ReadDefaultValue (
const QString& fullKey, QString& result)
72 if (ERROR_SUCCESS != RegOpenKeyW (HKEY_CLASSES_ROOT,
73 fullKey.toStdWString ().c_str (),
77 std::shared_ptr<void> regGuard (
nullptr,
78 [&] (
void*) { RegCloseKey (hKey); });
81 DWORD type { REG_SZ };
83 if (ERROR_SUCCESS == RegQueryValueExW (hKey,
90 std::vector<wchar_t> buff (buffSize /
sizeof (
wchar_t));
91 if (ERROR_SUCCESS == RegQueryValueExW (hKey,
95 reinterpret_cast<LPBYTE> (&buff [0]),
98 result = QString::fromWCharArray (buff.data ());
100 if (REG_EXPAND_SZ == type)
102 buffSize = ExpandEnvironmentStringsW (result.toStdWString ().c_str (),
nullptr, 0);
103 buff.resize (buffSize);
104 if (!ExpandEnvironmentStringsW (result.toStdWString ().c_str (), &buff [0], buffSize))
108 result = QString::fromWCharArray (buff.data ());
119 DWORD maxSubkeyLen {};
121 if (ERROR_SUCCESS != RegQueryInfoKeyW (hKey,
134 qDebug () << Q_FUNC_INFO
135 <<
"RegQueryInfoKeyW failed.";
140 std::vector<wchar_t> keyName (maxSubkeyLen + 1);
141 for (DWORD i = 0; i < subKeys; ++i)
143 if (ERROR_SUCCESS != RegEnumKeyW (hKey,
150 result.append (QString::fromWCharArray (keyName.data ()));
155 QHash<QString, QString> ParseMimeDatabase ()
159 static const QString kDatabaseKey {
"Mime\\Database\\Content Type" };
160 if (ERROR_SUCCESS != RegOpenKeyW (HKEY_CLASSES_ROOT,
161 kDatabaseKey.toStdWString ().c_str (),
166 if (!GetSubkeyNames (hKey, mimes))
174 QHash<QString, QString> result;
175 for (
const QString& mime : mimes)
177 static const QString kFormat {
"Mime\\Database\\Content Type\\%1" };
178 static const QString kExtension {
"Extension" };
179 static const QChar kDot {
'.'};
181 const QString fullKeyPath = kFormat.arg (mime);
183 if (ERROR_SUCCESS != RegOpenKeyW (HKEY_CLASSES_ROOT,
184 fullKeyPath.toStdWString ().c_str (),
189 if (ReadValue (hKey, kExtension, ext) && !ext.isEmpty ())
191 if (ext.at (0) == kDot)
193 result.insert (ext, mime);
199 if (ERROR_SUCCESS != RegOpenKeyW (HKEY_CLASSES_ROOT,
205 if (!GetSubkeyNames (hKey, extensions))
212 static const QString kValueContentType {
"Content Type" };
213 for (
int i = 0; i < extensions.count (); ++i)
215 static const auto prefix = QChar {
'.'};
216 if (!extensions.at (i).startsWith (prefix))
219 extensions [i].remove (0, 1);
221 if (result.contains (extensions.at (i)))
224 if (ERROR_SUCCESS != RegOpenKeyW (HKEY_CLASSES_ROOT,
225 QString {
".%1" }.arg (extensions.at (i)).toStdWString ().c_str (),
230 if (ReadValue (hKey, kValueContentType, mime) && !mime.isEmpty ())
231 result.insert (extensions.at (i), mime);
239 class ExtensionsDataImpl::Details
278 static const QString kKeyDefaultIcon {
"DefaultIcon" };
279 static const QChar kDot {
'.' };
280 static const QChar kComma {
',' };
282 const QString dottedExt = kDot + extension;
283 QString defIconKey = dottedExt +
"\\" + kKeyDefaultIcon;
286 if (!ReadDefaultValue (defIconKey, defIconPath))
289 if (ReadDefaultValue (dottedExt, defaultType))
291 defIconKey = defaultType +
"\\" + kKeyDefaultIcon;
292 ReadDefaultValue (defIconKey, defIconPath);
296 if (defIconPath.isEmpty ())
299 const QStringList parts = defIconPath.split (kComma);
300 if (2 != parts.count ())
303 QString path = parts.at (0);
304 path.replace (
"\"", {});
306 const UINT index = parts.count () > 1 ? parts.at (1).toUInt () : 0;
307 const HICON hIcon = ExtractIconW (GetModuleHandle (
nullptr), path.toStdWString ().c_str (), index);
312 QPixmap pixmap { QPixmap::fromWinHICON (hIcon) };
313 if (!pixmap.isNull ())
314 icon.addPixmap (pixmap);
333 return Details_->Extension2Mime_;
338 const auto& lowerExtension = extension.toLower ();
339 return Details_->GetExtensionIcon (lowerExtension);
344 const auto& ext = Details_->ExtensionByMime (mime);
348 return Details_->GetExtensionIcon (ext);
const QHash< QString, QString > & GetMimeDatabase() const
QHash< QString, QIcon > Extension2Icon_
QIcon GetExtIcon(const QString &extension) const
QIcon GetExtensionIcon(const QString &extension)
QMultiHash< QString, QString > Mime2Extension_
QIcon GetMimeIcon(const QString &mime) const
const QHash< QString, QString > Extension2Mime_
QString MimeByExtension(const QString &extension) const
QString ExtensionByMime(const QString &mime) const