@@ -0,0 +1,125 @@
1+/*
2+ * Copyright (C) 2016 Canonical, Ltd.
3+ *
4+ * This program is free software; you can redistribute it and/or modify
5+ * it under the terms of the GNU 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 General Public License for more details.
12+ *
13+ * You should have received a copy of the GNU General Public License
14+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
15+ */
16+
17+#include "applicationmenuregistry.h"
18+
19+#include <QQmlEngine>
20+#include <QDebug>
21+
22+
23+ApplicationMenuRegistry::ApplicationMenuRegistry(QObject *parent)
24+ : QObject(parent)
25+{
26+}
27+
28+ApplicationMenuRegistry::~ApplicationMenuRegistry()
29+{
30+ qDeleteAll(m_appMenus);
31+ m_appMenus.clear();
32+
33+ qDeleteAll(m_surfaceMenus);
34+ m_surfaceMenus.clear();
35+}
36+
37+void ApplicationMenuRegistry::RegisterAppMenu(pid_t processId,
38+ const QDBusObjectPath &menuObjectPath,
39+ const QDBusObjectPath &actionObjectPath,
40+ const QString &service)
41+{
42+ qInfo() << "RegisterApplicationMenu" << processId << " @ " << service << menuObjectPath.path() << actionObjectPath.path();
43+
44+ QMultiMap<pid_t, MenuServicePath*>::iterator i = m_appMenus.find(processId);
45+ while (i != m_appMenus.end() && i.key() == processId) {
46+ if (i.value()->m_menuPath == menuObjectPath.path().toUtf8()) {
47+ qWarning() << "Already have a menu for application:" << processId << service << menuObjectPath.path();
48+ return;
49+ }
50+ ++i;
51+ }
52+
53+ auto menu = new MenuServicePath(service.toUtf8(), menuObjectPath.path().toUtf8(), actionObjectPath.path().toUtf8());
54+ QQmlEngine::setObjectOwnership(menu, QQmlEngine::CppOwnership);
55+
56+ m_appMenus.insert(processId, menu);
57+ Q_EMIT appMenuRegistered(processId);
58+}
59+
60+void ApplicationMenuRegistry::UnregisterAppMenu(pid_t processId, const QDBusObjectPath &menuObjectPath)
61+{
62+ qInfo() << "RegisterApplicationMenu" << processId << " @ " << menuObjectPath.path();
63+
64+ QMultiMap<pid_t, MenuServicePath*>::iterator i = m_appMenus.find(processId);
65+ while (i != m_appMenus.end() && i.key() == processId) {
66+ if (i.value()->m_menuPath == menuObjectPath.path().toUtf8()) {
67+ i.value()->deleteLater();
68+ m_appMenus.erase(i);
69+ Q_EMIT appMenuUnregistered(processId);
70+ break;
71+ }
72+ ++i;
73+ }
74+}
75+
76+void ApplicationMenuRegistry::RegisterSurfaceMenu(const QString &surfaceId,
77+ const QDBusObjectPath &menuObjectPath,
78+ const QDBusObjectPath &actionObjectPath,
79+ const QString &service)
80+{
81+ qInfo() << "RegisterSurfaceMenu" << surfaceId << " @ " << service << menuObjectPath.path() << actionObjectPath.path();
82+
83+ QMultiMap<QString, MenuServicePath*>::iterator i = m_surfaceMenus.find(surfaceId);
84+ while (i != m_surfaceMenus.end() && i.key() == surfaceId) {
85+ if (i.value()->m_menuPath == menuObjectPath.path().toUtf8()) {
86+ qWarning() << "Already have a menu for surface:" << surfaceId << service << menuObjectPath.path();
87+ return;
88+ }
89+ ++i;
90+ }
91+
92+ auto menu = new MenuServicePath(service.toUtf8(), menuObjectPath.path().toUtf8(), actionObjectPath.path().toUtf8());
93+ QQmlEngine::setObjectOwnership(menu, QQmlEngine::CppOwnership);
94+
95+ m_surfaceMenus.insert(surfaceId, menu);
96+ Q_EMIT surfaceMenuRegistered(surfaceId);
97+}
98+
99+void ApplicationMenuRegistry::UnregisterSurfaceMenu(const QString &surfaceId, const QDBusObjectPath &menuObjectPath)
100+{
101+ qInfo() << "UnregisterSurfaceMenu" << surfaceId << " @ " << menuObjectPath.path();
102+
103+ QMultiMap<QString, MenuServicePath*>::iterator i = m_surfaceMenus.find(surfaceId);
104+ while (i != m_surfaceMenus.end() && i.key() == surfaceId) {
105+ if (i.value()->m_menuPath == menuObjectPath.path().toUtf8()) {
106+ i.value()->deleteLater();
107+ m_surfaceMenus.erase(i);
108+ Q_EMIT surfaceMenuUnregistered(surfaceId);
109+ break;
110+ }
111+ ++i;
112+ }
113+}
114+
115+QList<QObject*> ApplicationMenuRegistry::getMenusForSurface(const QString &surfaceId)
116+{
117+ QList<QObject*> list;
118+
119+ QMultiMap<QString, MenuServicePath*>::iterator i = m_surfaceMenus.find(surfaceId);
120+ while (i != m_surfaceMenus.end() && i.key() == surfaceId) {
121+ list << i.value();
122+ ++i;
123+ }
124+ return list;
125+}