File indexing completed on 2024-04-28 16:01:53
0001 /* 0002 This file is part of the Polkit-qt project 0003 SPDX-FileCopyrightText: 2009 Jaroslav Reznik <jreznik@redhat.com> 0004 0005 SPDX-License-Identifier: LGPL-2.0-or-later 0006 */ 0007 0008 #include "listeneradapter_p.h" 0009 #include <QDebug> 0010 #define POLKIT_AGENT_I_KNOW_API_IS_SUBJECT_TO_CHANGE 1 0011 #include <polkitagent/polkitagent.h> 0012 0013 namespace PolkitQt1 0014 { 0015 0016 namespace Agent 0017 { 0018 0019 class ListenerAdapterHelper 0020 { 0021 public: 0022 ListenerAdapterHelper() : q(nullptr) {} 0023 ~ListenerAdapterHelper() { 0024 delete q; 0025 } 0026 ListenerAdapter *q; 0027 }; 0028 0029 Q_GLOBAL_STATIC(ListenerAdapterHelper, s_globalListenerAdapter) 0030 0031 ListenerAdapter *ListenerAdapter::instance() 0032 { 0033 if (!s_globalListenerAdapter()->q) { 0034 new ListenerAdapter(); 0035 } 0036 0037 return s_globalListenerAdapter()->q; 0038 } 0039 0040 ListenerAdapter::ListenerAdapter(QObject *parent) 0041 : QObject(parent) 0042 { 0043 Q_ASSERT(!s_globalListenerAdapter()->q); 0044 s_globalListenerAdapter()->q = this; 0045 } 0046 0047 Listener* ListenerAdapter::findListener(PolkitAgentListener *listener) 0048 { 0049 Listener *listItem; 0050 0051 Q_FOREACH(listItem, m_listeners) { 0052 Q_ASSERT(listItem); 0053 0054 if (listItem->listener() == listener) { 0055 return listItem; 0056 } 0057 } 0058 0059 return nullptr; 0060 } 0061 0062 void ListenerAdapter::polkit_qt_listener_initiate_authentication(PolkitAgentListener *listener, 0063 const gchar *action_id, 0064 const gchar *message, 0065 const gchar *icon_name, 0066 PolkitDetails *details, 0067 const gchar *cookie, 0068 GList *identities, 0069 GCancellable *cancellable, 0070 GSimpleAsyncResult *result) 0071 { 0072 qDebug() << "polkit_qt_listener_initiate_authentication callback for " << listener; 0073 0074 PolkitQt1::Identity::List idents; 0075 PolkitQt1::Details dets(details); 0076 0077 Listener *list = findListener(listener); 0078 0079 for (GList *identity = g_list_first(identities); identity != nullptr; identity = g_list_next(identity)) { 0080 idents.append(PolkitQt1::Identity((PolkitIdentity *)identity->data)); 0081 } 0082 0083 list->initiateAuthentication(QString::fromUtf8(action_id), 0084 QString::fromUtf8(message), 0085 QString::fromUtf8(icon_name), 0086 dets, 0087 QString::fromUtf8(cookie), 0088 idents, 0089 new AsyncResult(result)); 0090 } 0091 0092 gboolean ListenerAdapter::polkit_qt_listener_initiate_authentication_finish(PolkitAgentListener *listener, 0093 GAsyncResult *res, 0094 GError **error) 0095 { 0096 qDebug() << "polkit_qt_listener_initiate_authentication_finish callback for " << listener; 0097 0098 GSimpleAsyncResult *simple = G_SIMPLE_ASYNC_RESULT(res); 0099 if (g_simple_async_result_propagate_error(simple, error)) { 0100 return false; 0101 } 0102 return true; 0103 } 0104 0105 void ListenerAdapter::cancelled_cb(PolkitAgentListener *listener) 0106 { 0107 qDebug() << "cancelled_cb for " << listener; 0108 0109 Listener *list = findListener(listener); 0110 0111 list->cancelAuthentication(); 0112 } 0113 0114 void ListenerAdapter::addListener(Listener *listener) 0115 { 0116 qDebug() << "Adding new listener " << listener << "for " << listener->listener(); 0117 0118 m_listeners.append(listener); 0119 } 0120 0121 void ListenerAdapter::removeListener(Listener *listener) 0122 { 0123 qDebug() << "Removing listener " << listener; 0124 0125 // should be safe as we don't have more than one same listener registered in one time 0126 m_listeners.removeOne(listener); 0127 } 0128 0129 } 0130 0131 }