Removing unref. functionality from server side AuthSession. Temporary fix, added...
[accounts-sso:signon.git] / src / signond / signonauthsession.cpp
1 /*
2  * This file is part of signon
3  *
4  * Copyright (C) 2009-2010 Nokia Corporation.
5  *
6  * Conta Alberto Mardegan <alberto.mardegan@nokia.com>
7  *
8  * This library is free software; you can redistribute it and/or
9  * modify it under the terms of the GNU Lesser General Public License
10  * version 2.1 as published by the Free Software Foundation.
11  *
12  * This library is distributed in the hope that it will be useful, but
13  * WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15  * Lesser General Public License for more details.
16  *
17  * You should have received a copy of the GNU Lesser General Public
18  * License along with this library; if not, write to the Free Software
19  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
20  * 02110-1301 USA
21  */
22
23 #include "signond-common.h"
24 #include "signonauthsession.h"
25 #include "signonauthsessionadaptor.h"
26
27 using namespace SignonDaemonNS;
28
29 SignonAuthSession::SignonAuthSession(quint32 id,
30                                      const QString &method) :
31                                      m_id(id),
32                                      m_method(method),
33                                      m_registered(false)
34 {
35     TRACE();
36
37     static quint32 incr = 0;
38     QString objectName = SIGNOND_DAEMON_OBJECTPATH + QLatin1String("/AuthSession_") + QString::number(incr++, 16);
39     TRACE() << objectName;
40
41     setObjectName(objectName);
42 }
43
44 SignonAuthSession::~SignonAuthSession()
45 {
46     TRACE();
47
48     if (m_registered)
49     {
50         emit unregistered();
51         QDBusConnection connection(SIGNOND_BUS);
52         connection.unregisterObject(objectName());
53     }
54 }
55
56 QString SignonAuthSession::getAuthSessionObjectPath(const quint32 id,
57                                                     const QString &method, SignonDaemon *parent)
58 {
59     TRACE();
60     SignonAuthSession* sas = new SignonAuthSession(id, method);
61
62     QDBusConnection connection(SIGNOND_BUS);
63     if (!connection.isConnected()) {
64         TRACE() << "Cannot get DBUS object connected";
65         delete sas;
66         return QString();
67     }
68
69     (void)new SignonAuthSessionAdaptor(sas);
70     QString objectName = sas->objectName();
71     if (!connection.registerObject(sas->objectName(), sas, QDBusConnection::ExportAdaptors)) {
72         TRACE() << "Object cannot be registered: " << objectName;
73         delete sas;
74         return QString();
75     }
76
77     SignonSessionCore *core = SignonSessionCore::sessionCore(id, method, parent);
78     if (!core) {
79         TRACE() << "Cannot retrieve proper tasks queue";
80         delete sas;
81         return QString();
82     }
83
84     sas->objectRegistered();
85     sas->setParent(core);
86
87     connect(core, SIGNAL(stateChanged(const QString&, int, const QString&)),
88             sas, SLOT(stateChangedSlot(const QString&, int, const QString&)));
89
90     TRACE() << "SignonAuthSession is created successfully: " << objectName;
91     return objectName;
92 }
93
94 void SignonAuthSession::stopAllAuthSessions()
95 {
96     SignonSessionCore::stopAllAuthSessions();
97 }
98
99 quint32 SignonAuthSession::id() const
100 {
101     return m_id;
102 }
103
104 QStringList SignonAuthSession::queryAvailableMechanisms(const QStringList &wantedMechanisms)
105 {
106     return parent()->queryAvailableMechanisms(wantedMechanisms);
107 }
108
109 QVariantMap SignonAuthSession::process(const QVariantMap &sessionDataVa,
110                                        const QString &mechanism)
111 {
112     TRACE();
113     setDelayedReply(true);
114     parent()->process(connection(),
115                       message(),
116                       sessionDataVa,
117                       mechanism,
118                       objectName());
119     return QVariantMap();
120 }
121
122 void SignonAuthSession::cancel()
123 {
124     TRACE();
125     parent()->cancel(objectName());
126 }
127
128 void SignonAuthSession::setId(quint32 id)
129 {
130     m_id = id;
131     parent()->setId(id);
132 }
133
134 void SignonAuthSession::objectUnref()
135 {
136     //TODO - remove the `objectUnref` functionality from the DBus API
137     TRACE();
138     cancel();
139
140     if (m_registered) {
141         QDBusConnection connection(SIGNOND_BUS);
142         connection.unregisterObject(objectName());
143         m_registered = false;
144     }
145
146     deleteLater();
147 }
148
149 void SignonAuthSession::stateChangedSlot(const QString &sessionKey, int state, const QString &message)
150 {
151     TRACE();
152
153     if (sessionKey == objectName())
154         emit stateChanged(state, message);
155 }
156
157 void SignonAuthSession::objectRegistered()
158 {
159     m_registered = true;
160 }