Unity 8
desktopfilehandler.cpp
1 /*
2  * Copyright 2014 Canonical Ltd.
3  *
4  * This program is free software; you can redistribute it and/or modify
5  * it under the terms of the GNU Lesser General Public License as published by
6  * the Free Software Foundation; version 3.
7  *
8  * This program is distributed in the hope that it will be useful,
9  * but WITHOUT ANY WARRANTY; without even the implied warranty of
10  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11  * GNU Lesser General Public License for more details.
12  *
13  * You should have received a copy of the GNU Lesser General Public License
14  * along with this program. If not, see <http://www.gnu.org/licenses/>.
15  *
16  * Authors:
17  * Michael Zanetti <michael.zanetti@canonical.com>
18  */
19 
20 #include "desktopfilehandler.h"
21 
22 #include <QStringList>
23 #include <QStandardPaths>
24 #include <QDir>
25 #include <QSettings>
26 #include <QLocale>
27 
28 #include <libintl.h>
29 
30 DesktopFileHandler::DesktopFileHandler(const QString &appId, QObject *parent):
31  QObject(parent),
32  m_appId(appId)
33 {
34  load();
35 }
36 
37 QString DesktopFileHandler::appId() const
38 {
39  return m_appId;
40 }
41 
42 void DesktopFileHandler::setAppId(const QString &appId)
43 {
44  if (m_appId != appId) {
45  m_appId = appId;
46  load();
47  }
48 }
49 
50 QString DesktopFileHandler::filename() const
51 {
52  return m_filename;
53 }
54 
55 bool DesktopFileHandler::isValid() const
56 {
57  return !m_filename.isEmpty();
58 }
59 
60 void DesktopFileHandler::load()
61 {
62  m_filename.clear();
63 
64  if (m_appId.isEmpty()) {
65  return;
66  }
67 
68  int dashPos = -1;
69  QString helper = m_appId;
70 
71  QStringList searchDirs = QStandardPaths::standardLocations(QStandardPaths::ApplicationsLocation);
72 #ifdef LAUNCHER_TESTING
73  searchDirs << ".";
74 #endif
75 
76  QString path;
77  do {
78  if (dashPos != -1) {
79  helper.replace(dashPos, 1, '/');
80  }
81 
82  if (helper.contains("/")) {
83  path += helper.split('/').first() + '/';
84  helper.remove(QRegExp("^" + path));
85  }
86 
87  Q_FOREACH(const QString &searchDirName, searchDirs) {
88  QDir searchDir(searchDirName + "/" + path);
89  Q_FOREACH(const QString &desktopFile, searchDir.entryList(QStringList() << "*.desktop")) {
90  if (desktopFile.startsWith(helper)) {
91  QFileInfo fileInfo(searchDir, desktopFile);
92  m_filename = fileInfo.absoluteFilePath();
93  return;
94  }
95  }
96  }
97 
98  dashPos = helper.indexOf("-");
99  } while (dashPos != -1);
100 }
101 
102 QString DesktopFileHandler::displayName() const
103 {
104  if (!isValid()) {
105  return QString();
106  }
107 
108  QSettings settings(m_filename, QSettings::IniFormat);
109  settings.setIniCodec("UTF-8");
110  settings.beginGroup("Desktop Entry");
111 
112  // First try to find Name[xx_YY] and Name[xx] in .desktop file
113  QString locale = QLocale().name();
114  QString shortLocale = locale.split('_').first();
115 
116  if (locale != shortLocale && settings.contains(QString("Name[%1]").arg(locale))) {
117  return settings.value(QString("Name[%1]").arg(locale)).toString();
118  }
119 
120  if (settings.contains(QString("Name[%1]").arg(shortLocale))) {
121  return settings.value(QString("Name[%1]").arg(shortLocale)).toString();
122  }
123 
124  // No translation found in desktop file. Get the untranslated one and have a go with gettext.
125  QString displayName = settings.value("Name").toString();
126 
127  if (settings.contains("X-Ubuntu-Gettext-Domain")) {
128  const QString domain = settings.value("X-Ubuntu-Gettext-Domain").toString();
129  return dgettext(domain.toUtf8().constData(), displayName.toUtf8().constData());
130  }
131 
132  return displayName;
133 }
134 
135 QString DesktopFileHandler::icon() const
136 {
137  if (!isValid()) {
138  return QString();
139  }
140 
141  QSettings settings(m_filename, QSettings::IniFormat);
142  settings.setIniCodec("UTF-8");
143  settings.beginGroup("Desktop Entry");
144  QString iconString = settings.value("Icon").toString();
145  QString pathString = settings.value("Path").toString();
146 
147  if (QFileInfo(iconString).exists()) {
148  return QFileInfo(iconString).absoluteFilePath();
149  } else if (QFileInfo(pathString + '/' + iconString).exists()) {
150  return pathString + '/' + iconString;
151  }
152  return "image://theme/" + iconString;
153 }