]> rtime.felk.cvut.cz Git - sojka/lightdm.git/blob - libldmgreeter-qt/ldmgreeter.cpp
747f4f130e7eac5e196adfad0e13a112822b166b
[sojka/lightdm.git] / libldmgreeter-qt / ldmgreeter.cpp
1 #include "ldmgreeter.h"
2
3 #include "powermanagementinterface.h"
4 #include "displayinterface.h"
5 #include "usermanagerinterface.h"
6 #include "consolekitinterface.h"
7 #include "ldmuser.h"
8 #include "ldmsession.h"
9
10 #include <QtNetwork/QHostInfo> //needed for localHostName
11 #include <QDebug>
12 #include <QtDBus/QDBusReply>
13 #include <QtDBus/QDBusPendingReply>
14 #include <QtGui/QApplication>
15 #include <QtGui/QDesktopWidget>
16
17 class LdmGreeterPrivate
18 {
19 public:
20     QString language;
21     QString layout;
22     QString session;
23     QString username;
24     QString themeName; //TODO turn into a KConfig
25     int delay;
26
27     QString currentlyAuthenticatingUser;
28
29     PowerManagementInterface* powerManagement;
30     DisplayInterface* display;
31     UserManagerInterface* userManager;
32     ConsoleKitInterface* consoleKit;
33 };
34
35
36
37 LdmGreeter::LdmGreeter() :
38     QWidget(0),
39     d(new LdmGreeterPrivate)
40 {
41     QRect screen = QApplication::desktop()->rect();
42     this->setGeometry(screen);
43
44     qDBusRegisterMetaType<LdmUser>();
45     qDBusRegisterMetaType<QList<LdmUser> >();
46
47     qDBusRegisterMetaType<LdmAuthRequest>();
48     qDBusRegisterMetaType<QList<LdmAuthRequest> >();
49
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 );
54
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()));
58
59
60     if(!connectResult.isValid())
61     {
62         qDebug() << connectResult.error().name();
63     }
64     else
65     {
66         d->themeName = connectResult;
67         //TODO create a kconfig from this path name - or not. Keep this lib Qt only?
68     }
69 }
70
71 LdmGreeter::~LdmGreeter()
72 {
73     delete d;
74 }
75
76
77
78 QString LdmGreeter::hostname()
79 {
80     return QHostInfo::localHostName();
81 }
82
83 QString LdmGreeter::defaultLanguage()
84 {
85     return d->language;
86 }
87
88 QString LdmGreeter::defaultLayout()
89 {
90     return d->layout;
91 }
92
93 QString LdmGreeter::defaultSession()
94 {
95     return d->session;
96 }
97
98 QString LdmGreeter::defaultUsername()
99 {
100     return d->username;
101 }
102
103
104 QList<LdmUser> LdmGreeter::users()
105 {
106     QDBusPendingReply<QList<LdmUser> > users = d->userManager->GetUsers();
107     users.waitForFinished();
108     if (users.isValid())
109     {
110         return users.value();
111     }
112     else
113     {
114         qDebug() << users.error().name();
115         qDebug() << users.error().message();
116         return QList<LdmUser>();
117     }
118 }
119
120 QList<LdmSession> LdmGreeter::sessions()
121 {
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())
128     {
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);
135
136         sessions.append(session);
137     }
138     return sessions;
139 }
140
141
142 void LdmGreeter::startAuthentication(QString username)
143 {
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*)));
148 }
149
150 void LdmGreeter::provideSecret(QString secret)
151 {
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*)));
155 }
156
157 void LdmGreeter::login(QString username, QString session, QString language)
158 {
159     d->display->Login(username, session, language);
160 }
161
162
163 bool LdmGreeter::canSuspend()
164 {
165     QDBusPendingReply<bool> reply = d->powerManagement->canSuspend();
166     reply.waitForFinished();
167     return reply.value();
168 }
169
170 void LdmGreeter::suspend()
171 {
172     d->powerManagement->suspend();
173 }
174
175 bool LdmGreeter::canHibernate()
176 {
177     QDBusPendingReply<bool> reply = d->powerManagement->canHibernate();
178     reply.waitForFinished();
179     return reply.value();
180 }
181
182 void LdmGreeter::hibernate()
183 {
184     d->powerManagement->hibernate();
185 }
186
187 bool LdmGreeter::canShutdown()
188 {
189     QDBusPendingReply<bool> reply = d->consoleKit->canStop();
190     reply.waitForFinished();
191     return reply.value();
192 }
193
194
195 void LdmGreeter::shutdown()
196 {
197     d->consoleKit->stop();
198 }
199
200 bool LdmGreeter::canRestart()
201 {
202     QDBusPendingReply<bool> reply = d->consoleKit->canRestart();
203     reply.waitForFinished();
204         return reply.value();
205 }
206
207 void LdmGreeter::restart()
208 {
209     d->consoleKit->restart();
210 }
211
212
213 void LdmGreeter::onAuthFinished(QDBusPendingCallWatcher *call)
214 {
215     QDBusPendingReply<int, QList<LdmAuthRequest> > reply = *call;
216     if(reply.isValid())
217     {
218         QList<LdmAuthRequest> requests = reply.argumentAt<1>();
219
220         if (requests.size() == 0) //if there are no requests
221         {
222             int returnValue = reply.argumentAt<0>();
223             if (returnValue == 0) //Magic number..FIXME
224             {
225                 emit authenticationComplete(true);
226             }
227             else
228             {
229                 emit authenticationComplete(false);
230             }
231         }
232         else
233         {
234             foreach(LdmAuthRequest request, requests)
235             {
236                 switch(request.messageType())
237                 {
238                     //FIXME create an enum use that (or include PAM libs)
239                 case 0:
240                 case 1:
241                     emit showPrompt(request.message());
242                     break;
243                 case 2:
244                     emit showMessage(request.message());
245                     break;
246                 case 3:
247                     emit showError(request.message());
248                     break;
249                 }
250             }
251         }
252     }
253     else
254     {
255         qDebug() << reply.error().name();
256         qDebug() << reply.error().message();
257     }
258 }