1 #include "ldmgreeter.h"
3 #include "powermanagementinterface.h"
4 #include "displayinterface.h"
5 #include "usermanagerinterface.h"
6 #include "consolekitinterface.h"
8 #include "ldmsession.h"
10 #include <QtNetwork/QHostInfo> //needed for localHostName
12 #include <QtDBus/QDBusReply>
13 #include <QtDBus/QDBusPendingReply>
14 #include <QtGui/QApplication>
15 #include <QtGui/QDesktopWidget>
17 class LdmGreeterPrivate
24 QString themeName; //TODO turn into a KConfig
27 QString currentlyAuthenticatingUser;
29 PowerManagementInterface* powerManagement;
30 DisplayInterface* display;
31 UserManagerInterface* userManager;
32 ConsoleKitInterface* consoleKit;
37 LdmGreeter::LdmGreeter() :
39 d(new LdmGreeterPrivate)
41 QRect screen = QApplication::desktop()->rect();
42 this->setGeometry(screen);
44 qDBusRegisterMetaType<LdmUser>();
45 qDBusRegisterMetaType<QList<LdmUser> >();
47 qDBusRegisterMetaType<LdmAuthRequest>();
48 qDBusRegisterMetaType<QList<LdmAuthRequest> >();
50 d->powerManagement = new PowerManagementInterface("org.freedesktop.PowerManagement","/org/freedesktop/PowerManagement", QDBusConnection::sessionBus(), this);
51 d->display = new DisplayInterface("org.lightdm.LightDisplayManager", "/org/lightdm/LightDisplayManager/Display0", QDBusConnection::sessionBus(), this);
52 d->userManager = new UserManagerInterface("org.lightdm.LightDisplayManager", "/org/lightdm/LightDisplayManager/Users", QDBusConnection::sessionBus(), this);
53 d->consoleKit = new ConsoleKitInterface("org.freedesktop.ConsoleKit","/org/freedesktop/ConsoleKit/Manager", QDBusConnection::systemBus(), this );
55 //FIXME use the pendingReply, it's a much nicer API.
56 QDBusReply<QString> connectResult = d->display->Connect(d->language, d->layout, d->session, d->username, d->delay);
57 connect(d->display, SIGNAL(quitGreeter()), SIGNAL(quit()));
60 if(!connectResult.isValid())
62 qDebug() << connectResult.error().name();
66 d->themeName = connectResult;
67 //TODO create a kconfig from this path name - or not. Keep this lib Qt only?
71 LdmGreeter::~LdmGreeter()
78 QString LdmGreeter::hostname()
80 return QHostInfo::localHostName();
83 QString LdmGreeter::defaultLanguage()
88 QString LdmGreeter::defaultLayout()
93 QString LdmGreeter::defaultSession()
98 QString LdmGreeter::defaultUsername()
104 QList<LdmUser> LdmGreeter::users()
106 QDBusPendingReply<QList<LdmUser> > users = d->userManager->GetUsers();
107 users.waitForFinished();
110 return users.value();
114 qDebug() << users.error().name();
115 qDebug() << users.error().message();
116 return QList<LdmUser>();
120 QList<LdmSession> LdmGreeter::sessions()
122 QList<LdmSession> sessions;
123 //FIXME don't hardcode this!
124 //FIXME I'm not happy with this bodgy finding .desktop files, and strcat situtation.
125 QDir sessionDir("/usr/share/xsessions");
126 sessionDir.setNameFilters(QStringList() << "*.desktop");
127 foreach(QString sessionFileName, sessionDir.entryList())
129 QSettings sessionData(QString("/usr/share/xsessions/").append(sessionFileName), QSettings::IniFormat);
130 sessionData.beginGroup("Desktop Entry");
131 sessionFileName.chop(8);// chop(8) removes '.desktop'
132 QString name = sessionData.value("Name").toString();
133 QString comment = sessionData.value("Comment").toString();
134 LdmSession session(sessionFileName, name, comment);
136 sessions.append(session);
142 void LdmGreeter::startAuthentication(QString username)
144 d->currentlyAuthenticatingUser = username;
145 QDBusPendingReply<int, QList<LdmAuthRequest> > reply = d->display->StartAuthentication(username);
146 QDBusPendingCallWatcher *watcher = new QDBusPendingCallWatcher(reply, this);
147 connect(watcher, SIGNAL(finished(QDBusPendingCallWatcher*)), SLOT(onAuthFinished(QDBusPendingCallWatcher*)));
150 void LdmGreeter::provideSecret(QString secret)
152 QDBusPendingReply<int, QList<LdmAuthRequest> > reply = d->display->ContinueAuthentication(QStringList() << secret);
153 QDBusPendingCallWatcher *watcher = new QDBusPendingCallWatcher(reply, this);
154 connect(watcher, SIGNAL(finished(QDBusPendingCallWatcher*)), SLOT(onAuthFinished(QDBusPendingCallWatcher*)));
157 void LdmGreeter::login(QString username, QString session, QString language)
159 d->display->Login(username, session, language);
163 bool LdmGreeter::canSuspend()
165 QDBusPendingReply<bool> reply = d->powerManagement->canSuspend();
166 reply.waitForFinished();
167 return reply.value();
170 void LdmGreeter::suspend()
172 d->powerManagement->suspend();
175 bool LdmGreeter::canHibernate()
177 QDBusPendingReply<bool> reply = d->powerManagement->canHibernate();
178 reply.waitForFinished();
179 return reply.value();
182 void LdmGreeter::hibernate()
184 d->powerManagement->hibernate();
187 bool LdmGreeter::canShutdown()
189 QDBusPendingReply<bool> reply = d->consoleKit->canStop();
190 reply.waitForFinished();
191 return reply.value();
195 void LdmGreeter::shutdown()
197 d->consoleKit->stop();
200 bool LdmGreeter::canRestart()
202 QDBusPendingReply<bool> reply = d->consoleKit->canRestart();
203 reply.waitForFinished();
204 return reply.value();
207 void LdmGreeter::restart()
209 d->consoleKit->restart();
213 void LdmGreeter::onAuthFinished(QDBusPendingCallWatcher *call)
215 QDBusPendingReply<int, QList<LdmAuthRequest> > reply = *call;
218 QList<LdmAuthRequest> requests = reply.argumentAt<1>();
220 if (requests.size() == 0) //if there are no requests
222 int returnValue = reply.argumentAt<0>();
223 if (returnValue == 0) //Magic number..FIXME
225 emit authenticationComplete(true);
229 emit authenticationComplete(false);
234 foreach(LdmAuthRequest request, requests)
236 switch(request.messageType())
238 //FIXME create an enum use that (or include PAM libs)
241 emit showPrompt(request.message());
244 emit showMessage(request.message());
247 emit showError(request.message());
255 qDebug() << reply.error().name();
256 qDebug() << reply.error().message();