23 #include "connection-manager.h" 25 #include "libsignoncommon.h" 26 #include "signond/signoncommon.h" 28 #include <QDBusConnectionInterface> 30 #include <QDBusPendingCallWatcher> 32 #include <QProcessEnvironment> 33 #if QT_VERSION >= QT_VERSION_CHECK(5, 0, 0) 34 #include <QStandardPaths> 39 static QPointer<ConnectionManager> connectionInstance = 0;
41 ConnectionManager::ConnectionManager(QObject *parent):
43 m_connection(QLatin1String(
"libsignon-qt-invalid")),
44 m_serviceStatus(ServiceStatusUnknown)
46 if (connectionInstance == 0) {
48 connectionInstance =
this;
50 BLAME() <<
"SignOn::ConnectionManager instantiated more than once!";
54 ConnectionManager::~ConnectionManager()
60 if (connectionInstance == 0) {
63 return connectionInstance;
66 void ConnectionManager::connect()
68 if (m_connection.isConnected()) {
69 Q_EMIT connected(m_connection);
75 bool ConnectionManager::hasConnection()
const 77 return m_connection.isConnected();
80 ConnectionManager::SocketConnectionStatus
81 ConnectionManager::setupSocketConnection()
83 QProcessEnvironment environment = QProcessEnvironment::systemEnvironment();
84 QLatin1String one(
"1");
85 if (environment.value(QLatin1String(
"SSO_USE_PEER_BUS"), one) != one) {
86 return SocketConnectionUnavailable;
89 #if QT_VERSION >= QT_VERSION_CHECK(5, 0, 0) 91 QStandardPaths::writableLocation(QStandardPaths::RuntimeLocation);
93 QString runtimeDir = environment.value(QLatin1String(
"XDG_RUNTIME_DIR"));
95 if (runtimeDir.isEmpty())
return SocketConnectionUnavailable;
97 QString socketFileName =
98 QString::fromLatin1(
"unix:path=%1/" SIGNOND_SOCKET_FILENAME).arg(runtimeDir);
101 QDBusConnection connection =
102 QDBusConnection::connectToPeer(socketFileName,
103 QString(QLatin1String(
"libsignon-qt%1")).arg(count++));
104 if (!connection.isConnected()) {
105 QDBusError
error = connection.lastError();
106 QString
name = error.name();
107 TRACE() <<
"p2p error:" << error << error.type();
108 if (name == QLatin1String(
"org.freedesktop.DBus.Error.FileNotFound") &&
109 m_serviceStatus != ServiceActivated) {
110 return SocketConnectionNoService;
112 return SocketConnectionUnavailable;
116 m_connection = connection;
117 m_connection.connect(QString(),
118 QLatin1String(
"/org/freedesktop/DBus/Local"),
119 QLatin1String(
"org.freedesktop.DBus.Local"),
120 QLatin1String(
"Disconnected"),
121 this, SLOT(onDisconnected()));
123 return SocketConnectionOk;
126 void ConnectionManager::init()
128 if (m_serviceStatus == ServiceActivating)
return;
130 SocketConnectionStatus status = setupSocketConnection();
132 if (status == SocketConnectionNoService) {
133 TRACE() <<
"Peer connection unavailable, activating service";
134 QDBusConnectionInterface *
interface =
135 QDBusConnection::sessionBus().interface();
136 QDBusPendingCall call =
137 interface->asyncCall(QLatin1String(
"StartServiceByName"),
138 SIGNOND_SERVICE, uint(0));
139 m_serviceStatus = ServiceActivating;
140 QDBusPendingCallWatcher *watcher =
141 new QDBusPendingCallWatcher(call,
this);
142 QObject::connect(watcher,
143 SIGNAL(finished(QDBusPendingCallWatcher*)),
145 SLOT(onActivationDone(QDBusPendingCallWatcher*)));
146 }
else if (status == SocketConnectionUnavailable) {
147 m_connection = SIGNOND_BUS;
150 if (m_connection.isConnected()) {
151 TRACE() <<
"Connected to" << m_connection.name();
152 Q_EMIT connected(m_connection);
156 void ConnectionManager::onActivationDone(QDBusPendingCallWatcher *watcher)
158 QDBusPendingReply<> reply(*watcher);
159 watcher->deleteLater();
161 if (!reply.isError()) {
162 m_serviceStatus = ServiceActivated;
166 BLAME() << reply.error();
170 void ConnectionManager::onDisconnected()
172 TRACE() <<
"Disconnected from daemon";
173 m_serviceStatus = ServiceStatusUnknown;
174 Q_EMIT disconnected();
const QString name() const
Name of method for session.
void error(const SignOn::Error &err)
Emitted when an error occurs while performing an operation.