1/*
2 * Copyright (C) 2014 Collabora Ltd.
3 *
4 * This library is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU Library General Public
6 * License as published by the Free Software Foundation; either
7 * version 2 of the License, or (at your option) any later version.
8 *
9 * This library is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 * Library General Public License for more details.
13 *
14 * You should have received a copy of the GNU Library General Public License
15 * along with this library; see the file COPYING.LIB. If not, write to
16 * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
17 * Boston, MA 02110-1301, USA.
18 */
19
20#include "config.h"
21#include "WebKitNotification.h"
22
23#include "WebKitNotificationPrivate.h"
24#include "WebNotification.h"
25#include <glib/gi18n-lib.h>
26#include <wtf/glib/WTFGType.h>
27#include <wtf/text/CString.h>
28
29/**
30 * SECTION: WebKitNotification
31 * @Short_description: Object used to hold information about a notification that should be shown to the user.
32 * @Title: WebKitNotification
33 *
34 * Since: 2.8
35 */
36
37enum {
38 PROP_0,
39
40 PROP_ID,
41 PROP_TITLE,
42 PROP_BODY,
43 PROP_TAG
44};
45
46enum {
47 CLOSED,
48 CLICKED,
49
50 LAST_SIGNAL
51};
52
53struct _WebKitNotificationPrivate {
54 CString title;
55 CString body;
56 CString tag;
57 guint64 id;
58
59 WebKitWebView* webView;
60};
61
62static guint signals[LAST_SIGNAL] = { 0, };
63
64WEBKIT_DEFINE_TYPE(WebKitNotification, webkit_notification, G_TYPE_OBJECT)
65
66static void webkitNotificationGetProperty(GObject* object, guint propId, GValue* value, GParamSpec* paramSpec)
67{
68 WebKitNotification* notification = WEBKIT_NOTIFICATION(object);
69
70 switch (propId) {
71 case PROP_ID:
72 g_value_set_uint64(value, webkit_notification_get_id(notification));
73 break;
74 case PROP_TITLE:
75 g_value_set_string(value, webkit_notification_get_title(notification));
76 break;
77 case PROP_BODY:
78 g_value_set_string(value, webkit_notification_get_body(notification));
79 break;
80 case PROP_TAG:
81 g_value_set_string(value, webkit_notification_get_tag(notification));
82 break;
83 default:
84 G_OBJECT_WARN_INVALID_PROPERTY_ID(object, propId, paramSpec);
85 }
86}
87
88static void webkit_notification_class_init(WebKitNotificationClass* notificationClass)
89{
90 GObjectClass* objectClass = G_OBJECT_CLASS(notificationClass);
91 objectClass->get_property = webkitNotificationGetProperty;
92
93 /**
94 * WebKitNotification:id:
95 *
96 * The unique id for the notification.
97 *
98 * Since: 2.8
99 */
100 g_object_class_install_property(objectClass,
101 PROP_ID,
102 g_param_spec_uint64("id",
103 _("ID"),
104 _("The unique id for the notification"),
105 0, G_MAXUINT64, 0,
106 WEBKIT_PARAM_READABLE));
107
108 /**
109 * WebKitNotification:title:
110 *
111 * The title for the notification.
112 *
113 * Since: 2.8
114 */
115 g_object_class_install_property(objectClass,
116 PROP_TITLE,
117 g_param_spec_string("title",
118 _("Title"),
119 _("The title for the notification"),
120 nullptr,
121 WEBKIT_PARAM_READABLE));
122
123 /**
124 * WebKitNotification:body:
125 *
126 * The body for the notification.
127 *
128 * Since: 2.8
129 */
130 g_object_class_install_property(objectClass,
131 PROP_BODY,
132 g_param_spec_string("body",
133 _("Body"),
134 _("The body for the notification"),
135 nullptr,
136 WEBKIT_PARAM_READABLE));
137
138 /**
139 * WebKitNotification:tag:
140 *
141 * The tag identifier for the notification.
142 *
143 * Since: 2.16
144 */
145 g_object_class_install_property(objectClass,
146 PROP_TAG,
147 g_param_spec_string("tag",
148 _("Tag"),
149 _("The tag identifier for the notification"),
150 nullptr,
151 WEBKIT_PARAM_READABLE));
152
153 /**
154 * WebKitNotification::closed:
155 * @notification: the #WebKitNotification on which the signal is emitted
156 *
157 * Emitted when a notification has been withdrawn.
158 *
159 * The default handler will close the notification using libnotify, if built with
160 * support for it.
161 *
162 * Since: 2.8
163 */
164 signals[CLOSED] =
165 g_signal_new(
166 "closed",
167 G_TYPE_FROM_CLASS(notificationClass),
168 G_SIGNAL_RUN_LAST,
169 0, 0,
170 nullptr,
171 g_cclosure_marshal_VOID__VOID,
172 G_TYPE_NONE, 0);
173
174 /**
175 * WebKitNotification::clicked:
176 * @notification: the #WebKitNotification on which the signal is emitted
177 *
178 * Emitted when a notification has been clicked. See webkit_notification_clicked().
179 *
180 * Since: 2.12
181 */
182 signals[CLICKED] =
183 g_signal_new(
184 "clicked",
185 G_TYPE_FROM_CLASS(notificationClass),
186 G_SIGNAL_RUN_LAST,
187 0, 0,
188 nullptr,
189 g_cclosure_marshal_VOID__VOID,
190 G_TYPE_NONE, 0);
191}
192
193WebKitNotification* webkitNotificationCreate(WebKitWebView* webView, const WebKit::WebNotification& webNotification)
194{
195 WebKitNotification* notification = WEBKIT_NOTIFICATION(g_object_new(WEBKIT_TYPE_NOTIFICATION, nullptr));
196 notification->priv->id = webNotification.notificationID();
197 notification->priv->title = webNotification.title().utf8();
198 notification->priv->body = webNotification.body().utf8();
199 notification->priv->tag = webNotification.tag().utf8();
200 notification->priv->webView = webView;
201 return notification;
202}
203
204WebKitWebView* webkitNotificationGetWebView(WebKitNotification* notification)
205{
206 return notification->priv->webView;
207}
208
209/**
210 * webkit_notification_get_id:
211 * @notification: a #WebKitNotification
212 *
213 * Obtains the unique id for the notification.
214 *
215 * Returns: the unique id for the notification
216 *
217 * Since: 2.8
218 */
219guint64 webkit_notification_get_id(WebKitNotification* notification)
220{
221 g_return_val_if_fail(WEBKIT_IS_NOTIFICATION(notification), 0);
222
223 return notification->priv->id;
224}
225
226/**
227 * webkit_notification_get_title:
228 * @notification: a #WebKitNotification
229 *
230 * Obtains the title for the notification.
231 *
232 * Returns: the title for the notification
233 *
234 * Since: 2.8
235 */
236const gchar* webkit_notification_get_title(WebKitNotification* notification)
237{
238 g_return_val_if_fail(WEBKIT_IS_NOTIFICATION(notification), nullptr);
239
240 return notification->priv->title.data();
241}
242
243/**
244 * webkit_notification_get_body:
245 * @notification: a #WebKitNotification
246 *
247 * Obtains the body for the notification.
248 *
249 * Returns: the body for the notification
250 *
251 * Since: 2.8
252 */
253const gchar* webkit_notification_get_body(WebKitNotification* notification)
254{
255 g_return_val_if_fail(WEBKIT_IS_NOTIFICATION(notification), nullptr);
256
257 return notification->priv->body.data();
258}
259
260/**
261 * webkit_notification_get_tag:
262 * @notification: a #WebKitNotification
263 *
264 * Obtains the tag identifier for the notification.
265 *
266 * Returns: (allow-none): the tag for the notification
267 *
268 * Since: 2.16
269 */
270const gchar* webkit_notification_get_tag(WebKitNotification* notification)
271{
272 g_return_val_if_fail(WEBKIT_IS_NOTIFICATION(notification), nullptr);
273
274 const gchar* tag = notification->priv->tag.data();
275 return notification->priv->tag.length() ? tag : nullptr;
276}
277
278/**
279 * webkit_notification_close:
280 * @notification: a #WebKitNotification
281 *
282 * Closes the notification.
283 *
284 * Since: 2.8
285 */
286void webkit_notification_close(WebKitNotification* notification)
287{
288 g_return_if_fail(WEBKIT_IS_NOTIFICATION(notification));
289
290 g_signal_emit(notification, signals[CLOSED], 0);
291}
292
293/**
294 * webkit_notification_clicked:
295 * @notification: a #WebKitNotification
296 *
297 * Tells WebKit the notification has been clicked. This will emit the
298 * #WebKitNotification::clicked signal.
299 *
300 * Since: 2.12
301 */
302void webkit_notification_clicked(WebKitNotification* notification)
303{
304 g_return_if_fail(WEBKIT_IS_NOTIFICATION(notification));
305
306 g_signal_emit(notification, signals[CLICKED], 0);
307}
308