Branch data Line data Source code
1 : : // SPDX-License-Identifier: GPL-3.0-or-later
2 : : // SPDX-FileCopyrightText: Andy Holmes <andrew.g.r.holmes@gmail.com>
3 : :
4 : : #define G_LOG_DOMAIN "valent-notifications-adapter"
5 : :
6 : : #include "config.h"
7 : :
8 : : #include <libvalent-core.h>
9 : :
10 : : #include "valent-notification.h"
11 : : #include "valent-notifications-adapter.h"
12 : :
13 : :
14 : : /**
15 : : * ValentNotificationsAdapter:
16 : : *
17 : : * An abstract base class for notification servers.
18 : : *
19 : : * `ValentNotificationsAdapter` is a base class for notification servers. This
20 : : * usually means monitoring a D-Bus service for notifications being sent and
21 : : * withdrawn.
22 : : *
23 : : * ## `.plugin` File
24 : : *
25 : : * Implementations may define the following extra fields in the `.plugin` file:
26 : : *
27 : : * - `X-NotificationsAdapterPriority`
28 : : *
29 : : * An integer indicating the adapter priority. The implementation with the
30 : : * lowest value will be used as the primary adapter.
31 : : *
32 : : * Since: 1.0
33 : : */
34 : :
35 : : typedef struct
36 : : {
37 : : GPtrArray *notifications;
38 : : } ValentNotificationsAdapterPrivate;
39 : :
40 [ + + + - ]: 392 : G_DEFINE_ABSTRACT_TYPE_WITH_PRIVATE (ValentNotificationsAdapter, valent_notifications_adapter, VALENT_TYPE_EXTENSION)
41 : :
42 : : enum {
43 : : NOTIFICATION_ADDED,
44 : : NOTIFICATION_REMOVED,
45 : : N_SIGNALS
46 : : };
47 : :
48 : : static guint signals[N_SIGNALS] = { 0, };
49 : :
50 : :
51 : : /* LCOV_EXCL_START */
52 : : static void
53 : : valent_notifications_adapter_real_add_notification (ValentNotificationsAdapter *adapter,
54 : : ValentNotification *notification)
55 : : {
56 : : }
57 : :
58 : : static void
59 : : valent_notifications_adapter_real_remove_notification (ValentNotificationsAdapter *adapter,
60 : : const char *id)
61 : : {
62 : : }
63 : : /* LCOV_EXCL_STOP */
64 : :
65 : : /*
66 : : * GObject
67 : : */
68 : : static void
69 : 58 : valent_notifications_adapter_class_init (ValentNotificationsAdapterClass *klass)
70 : : {
71 : 58 : klass->add_notification = valent_notifications_adapter_real_add_notification;
72 : 58 : klass->remove_notification = valent_notifications_adapter_real_remove_notification;
73 : :
74 : : /**
75 : : * ValentNotificationsAdapter::notification-added:
76 : : * @adapter: a `ValentNotificationsAdapter`
77 : : * @notification: a `ValentNotification`
78 : : *
79 : : * Emitted when a [class@Valent.Notification] is added to @adapter.
80 : : *
81 : : * Implementations must chain up if they override
82 : : * [vfunc@Valent.NotificationsAdapter.notification_added].
83 : : *
84 : : * Since: 1.0
85 : : */
86 : 116 : signals [NOTIFICATION_ADDED] =
87 : 58 : g_signal_new ("notification-added",
88 : : G_TYPE_FROM_CLASS (klass),
89 : : G_SIGNAL_RUN_LAST,
90 : : G_STRUCT_OFFSET (ValentNotificationsAdapterClass, notification_added),
91 : : NULL, NULL,
92 : : g_cclosure_marshal_VOID__OBJECT,
93 : : G_TYPE_NONE, 1, VALENT_TYPE_NOTIFICATION);
94 : 58 : g_signal_set_va_marshaller (signals [NOTIFICATION_ADDED],
95 : : G_TYPE_FROM_CLASS (klass),
96 : : g_cclosure_marshal_VOID__OBJECTv);
97 : :
98 : : /**
99 : : * ValentNotificationsAdapter::notification-removed:
100 : : * @adapter: a `ValentNotificationsAdapter`
101 : : * @notification: a `ValentNotification`
102 : : *
103 : : * Emitted when a [class@Valent.Notification] is removed from @adapter.
104 : : *
105 : : * Implementations must chain up if they override
106 : : * [vfunc@Valent.NotificationsAdapter.notification_removed].
107 : : *
108 : : * Since: 1.0
109 : : */
110 : 116 : signals [NOTIFICATION_REMOVED] =
111 : 58 : g_signal_new ("notification-removed",
112 : : G_TYPE_FROM_CLASS (klass),
113 : : G_SIGNAL_RUN_LAST,
114 : : G_STRUCT_OFFSET (ValentNotificationsAdapterClass, notification_removed),
115 : : NULL, NULL,
116 : : g_cclosure_marshal_VOID__STRING,
117 : : G_TYPE_NONE, 1, G_TYPE_STRING);
118 : 58 : g_signal_set_va_marshaller (signals [NOTIFICATION_REMOVED],
119 : : G_TYPE_FROM_CLASS (klass),
120 : : g_cclosure_marshal_VOID__STRINGv);
121 : 58 : }
122 : :
123 : : static void
124 : 7 : valent_notifications_adapter_init (ValentNotificationsAdapter *adapter)
125 : : {
126 : 7 : }
127 : :
128 : : /**
129 : : * valent_notifications_adapter_notification_added:
130 : : * @adapter: a `ValentNotificationsAdapter`
131 : : * @notification: a `ValentNotification`
132 : : *
133 : : * Emit [signal@Valent.NotificationsAdapter::notification-added] on @adapter.
134 : : *
135 : : * This method should only be called by implementations of
136 : : * [class@Valent.NotificationsAdapter].
137 : : *
138 : : * Since: 1.0
139 : : */
140 : : void
141 : 11 : valent_notifications_adapter_notification_added (ValentNotificationsAdapter *adapter,
142 : : ValentNotification *notification)
143 : : {
144 [ + - ]: 11 : g_return_if_fail (VALENT_IS_NOTIFICATIONS_ADAPTER (adapter));
145 : :
146 : 11 : g_signal_emit (G_OBJECT (adapter), signals [NOTIFICATION_ADDED], 0, notification);
147 : : }
148 : :
149 : : /**
150 : : * valent_notifications_adapter_notification_removed:
151 : : * @adapter: a `ValentNotificationsAdapter`
152 : : * @id: a notification id
153 : : *
154 : : * Emit [signal@Valent.NotificationsAdapter::notification-removed] on @adapter.
155 : : *
156 : : * This method should only be called by implementations of
157 : : * [class@Valent.NotificationsAdapter].
158 : : *
159 : : * Since: 1.0
160 : : */
161 : : void
162 : 6 : valent_notifications_adapter_notification_removed (ValentNotificationsAdapter *adapter,
163 : : const char *id)
164 : : {
165 [ + - ]: 6 : g_return_if_fail (VALENT_IS_NOTIFICATIONS_ADAPTER (adapter));
166 : :
167 : 6 : g_signal_emit (G_OBJECT (adapter), signals [NOTIFICATION_REMOVED], 0, id);
168 : : }
169 : :
170 : : /**
171 : : * valent_notifications_adapter_add_notification: (virtual add_notification)
172 : : * @adapter: a `ValentNotificationsAdapter`
173 : : * @notification: a `ValentNotification`
174 : : *
175 : : * Send @notification to the @adapter.
176 : : *
177 : : * Since: 1.0
178 : : */
179 : : void
180 : 0 : valent_notifications_adapter_add_notification (ValentNotificationsAdapter *adapter,
181 : : ValentNotification *notification)
182 : : {
183 : 0 : VALENT_ENTRY;
184 : :
185 [ # # ]: 0 : g_return_if_fail (VALENT_IS_NOTIFICATIONS_ADAPTER (adapter));
186 [ # # ]: 0 : g_return_if_fail (VALENT_IS_NOTIFICATION (notification));
187 : :
188 : 0 : VALENT_NOTIFICATIONS_ADAPTER_GET_CLASS (adapter)->add_notification (adapter,
189 : : notification);
190 : :
191 : 0 : VALENT_EXIT;
192 : : }
193 : :
194 : : /**
195 : : * valent_notifications_adapter_remove_notification: (virtual remove_notification)
196 : : * @adapter: a `ValentNotificationsAdapter`
197 : : * @id: a notification id
198 : : *
199 : : * Withdraw @id from @adapter.
200 : : *
201 : : * Since: 1.0
202 : : */
203 : : void
204 : 0 : valent_notifications_adapter_remove_notification (ValentNotificationsAdapter *adapter,
205 : : const char *id)
206 : : {
207 : 0 : VALENT_ENTRY;
208 : :
209 [ # # ]: 0 : g_return_if_fail (VALENT_IS_NOTIFICATIONS_ADAPTER (adapter));
210 [ # # ]: 0 : g_return_if_fail (id == NULL);
211 : :
212 : 0 : VALENT_NOTIFICATIONS_ADAPTER_GET_CLASS (adapter)->remove_notification (adapter,
213 : : id);
214 : :
215 : 0 : VALENT_EXIT;
216 : : }
217 : :
|