libpurple/purplesavedpresence.c

changeset 42207
7c16e3b1cce8
child 42226
f44497b3f5d9
equal deleted inserted replaced
42206:cfa7c940ed62 42207:7c16e3b1cce8
1 /*
2 * purple
3 * Copyright (C) Pidgin Developers <devel@pidgin.im>
4 *
5 * Purple is the legal property of its developers, whose names are too numerous
6 * to list here. Please refer to the COPYRIGHT file distributed with this
7 * source distribution.
8 *
9 * This program is free software; you can redistribute it and/or modify
10 * it under the terms of the GNU General Public License as published by
11 * the Free Software Foundation; either version 2 of the License, or
12 * (at your option) any later version.
13 *
14 * This program is distributed in the hope that it will be useful,
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 * GNU General Public License for more details.
18 *
19 * You should have received a copy of the GNU General Public License
20 * along with this program; if not, see <https://www.gnu.org/licenses/>.
21 */
22
23 #include <glib/gi18n-lib.h>
24
25 #include "purpleenums.h"
26 #include "purplesavedpresence.h"
27 #include "util.h"
28
29 struct _PurpleSavedPresence {
30 GObject parent;
31
32 GDateTime *last_used;
33 guint use_count;
34
35 char *name;
36
37 PurplePresencePrimitive primitive;
38 char *message;
39 char *emoji;
40 };
41
42 enum {
43 PROP_0,
44 PROP_LAST_USED,
45 PROP_USE_COUNT,
46 PROP_NAME,
47 PROP_PRIMITIVE,
48 PROP_MESSAGE,
49 PROP_EMOJI,
50 N_PROPERTIES
51 };
52 static GParamSpec *properties[N_PROPERTIES];
53
54 G_DEFINE_TYPE(PurpleSavedPresence, purple_saved_presence, G_TYPE_OBJECT)
55
56 /******************************************************************************
57 * GObject Implementation
58 *****************************************************************************/
59 static void
60 purple_saved_presence_set_property(GObject *obj, guint param_id,
61 const GValue *value, GParamSpec *pspec)
62 {
63 PurpleSavedPresence *presence = PURPLE_SAVED_PRESENCE(obj);
64
65 switch(param_id) {
66 case PROP_LAST_USED:
67 purple_saved_presence_set_last_used(presence,
68 g_value_get_boxed(value));
69 break;
70 case PROP_USE_COUNT:
71 purple_saved_presence_set_use_count(presence,
72 g_value_get_uint(value));
73 break;
74 case PROP_NAME:
75 purple_saved_presence_set_name(presence,
76 g_value_get_string(value));
77 break;
78 case PROP_PRIMITIVE:
79 purple_saved_presence_set_primitive(presence,
80 g_value_get_enum(value));
81 break;
82 case PROP_MESSAGE:
83 purple_saved_presence_set_message(presence,
84 g_value_get_string(value));
85 break;
86 case PROP_EMOJI:
87 purple_saved_presence_set_emoji(presence,
88 g_value_get_string(value));
89 break;
90 default:
91 G_OBJECT_WARN_INVALID_PROPERTY_ID(obj, param_id, pspec);
92 break;
93 }
94 }
95
96 static void
97 purple_saved_presence_get_property(GObject *obj, guint param_id, GValue *value,
98 GParamSpec *pspec)
99 {
100 PurpleSavedPresence *presence = PURPLE_SAVED_PRESENCE(obj);
101
102 switch(param_id) {
103 case PROP_LAST_USED:
104 g_value_set_boxed(value,
105 purple_saved_presence_get_last_used(presence));
106 break;
107 case PROP_USE_COUNT:
108 g_value_set_uint(value,
109 purple_saved_presence_get_use_count(presence));
110 break;
111 case PROP_NAME:
112 g_value_set_string(value,
113 purple_saved_presence_get_name(presence));
114 break;
115 case PROP_PRIMITIVE:
116 g_value_set_enum(value,
117 purple_saved_presence_get_primitive(presence));
118 break;
119 case PROP_MESSAGE:
120 g_value_set_string(value,
121 purple_saved_presence_get_message(presence));
122 break;
123 case PROP_EMOJI:
124 g_value_set_string(value,
125 purple_saved_presence_get_emoji(presence));
126 break;
127 default:
128 G_OBJECT_WARN_INVALID_PROPERTY_ID(obj, param_id, pspec);
129 break;
130 }
131 }
132
133 static void
134 purple_saved_presence_init(G_GNUC_UNUSED PurpleSavedPresence *presence) {
135 }
136
137 static void
138 purple_saved_presence_finalize(GObject *obj) {
139 PurpleSavedPresence *presence = PURPLE_SAVED_PRESENCE(obj);
140
141 g_clear_pointer(&presence->last_used, g_date_time_unref);
142
143 g_clear_pointer(&presence->name, g_free);
144 g_clear_pointer(&presence->message, g_free);
145 g_clear_pointer(&presence->emoji, g_free);
146
147 G_OBJECT_CLASS(purple_saved_presence_parent_class)->finalize(obj);
148 }
149
150 static void
151 purple_saved_presence_class_init(PurpleSavedPresenceClass *klass) {
152 GObjectClass *obj_class = G_OBJECT_CLASS(klass);
153
154 obj_class->get_property = purple_saved_presence_get_property;
155 obj_class->set_property = purple_saved_presence_set_property;
156 obj_class->finalize = purple_saved_presence_finalize;
157
158 /**
159 * PurpleSavedPresence:last-used:
160 *
161 * The [struct@GLib.DateTime] when this saved presence was last used.
162 *
163 * Since: 3.0.0
164 */
165 properties[PROP_LAST_USED] = g_param_spec_boxed(
166 "last-used", "last-used",
167 "The time this presence was last used.",
168 G_TYPE_DATE_TIME,
169 G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS);
170
171 /**
172 * PurpleSavedPresence:use-count:
173 *
174 * The number of times this saved presence has been used.
175 *
176 * Since: 3.0.0
177 */
178 properties[PROP_USE_COUNT] = g_param_spec_uint(
179 "use-count", "use-count",
180 "The number of times this saved presence has been used.",
181 0, G_MAXUINT, 0,
182 G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS);
183
184 /**
185 * PurpleSavedPresence:name:
186 *
187 * The name of the saved presence.
188 *
189 * Since: 3.0.0
190 */
191 properties[PROP_NAME] = g_param_spec_string(
192 "name", "name",
193 "The name of this saved presence.",
194 NULL,
195 G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS);
196
197 /**
198 * PurpleSavedPresence:primitive:
199 *
200 * The [enum@Purple.StatusPrimitive] for this saved presence.
201 *
202 * Since: 3.0.0
203 */
204 properties[PROP_PRIMITIVE] = g_param_spec_enum(
205 "primitive", "primitive",
206 "The primitive for this saved presence.",
207 PURPLE_TYPE_PRESENCE_PRIMITIVE,
208 PURPLE_PRESENCE_PRIMITIVE_OFFLINE,
209 G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS);
210
211 /**
212 * PurpleSavedPresence:message:
213 *
214 * The status message of this saved presence.
215 *
216 * Since: 3.0.0
217 */
218 properties[PROP_MESSAGE] = g_param_spec_string(
219 "message", "message",
220 "The status message of this saved presence.",
221 NULL,
222 G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS);
223
224 /**
225 * PurpleSavedPresence:emoji:
226 *
227 * The emoji or mood of the presence.
228 *
229 * Since: 3.0.0
230 */
231 properties[PROP_EMOJI] = g_param_spec_string(
232 "emoji", "emoji",
233 "The emoji for this saved presence.",
234 NULL,
235 G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS);
236
237 g_object_class_install_properties(obj_class, N_PROPERTIES, properties);
238 }
239
240 /******************************************************************************
241 * Public API
242 *****************************************************************************/
243 PurpleSavedPresence *
244 purple_saved_presence_new(void) {
245 return g_object_new(PURPLE_TYPE_SAVED_PRESENCE, NULL);
246 }
247
248 GDateTime *
249 purple_saved_presence_get_last_used(PurpleSavedPresence *presence) {
250 g_return_val_if_fail(PURPLE_IS_SAVED_PRESENCE(presence), NULL);
251
252 return presence->last_used;
253 }
254
255 void
256 purple_saved_presence_set_last_used(PurpleSavedPresence *presence,
257 GDateTime *last_used)
258 {
259 g_return_if_fail(PURPLE_IS_SAVED_PRESENCE(presence));
260
261 if(presence->last_used != last_used) {
262 g_clear_pointer(&presence->last_used, g_date_time_unref);
263 if(last_used != NULL) {
264 presence->last_used = g_date_time_ref(last_used);
265 }
266
267 g_object_notify_by_pspec(G_OBJECT(presence),
268 properties[PROP_LAST_USED]);
269 }
270 }
271
272 guint
273 purple_saved_presence_get_use_count(PurpleSavedPresence *presence) {
274 g_return_val_if_fail(PURPLE_IS_SAVED_PRESENCE(presence), 0);
275
276 return presence->use_count;
277 }
278
279 void
280 purple_saved_presence_set_use_count(PurpleSavedPresence *presence,
281 guint use_count)
282 {
283 g_return_if_fail(PURPLE_IS_SAVED_PRESENCE(presence));
284
285 if(presence->use_count != use_count) {
286 presence->use_count = use_count;
287
288 g_object_notify_by_pspec(G_OBJECT(presence),
289 properties[PROP_USE_COUNT]);
290 }
291 }
292
293 const char *
294 purple_saved_presence_get_name(PurpleSavedPresence *presence) {
295 g_return_val_if_fail(PURPLE_IS_SAVED_PRESENCE(presence), NULL);
296
297 return presence->name;
298 }
299
300 void
301 purple_saved_presence_set_name(PurpleSavedPresence *presence,
302 const char *name)
303 {
304 g_return_if_fail(PURPLE_IS_SAVED_PRESENCE(presence));
305
306 if(!purple_strequal(presence->name, name)) {
307 g_free(presence->name);
308 presence->name = g_strdup(name);
309
310 g_object_notify_by_pspec(G_OBJECT(presence), properties[PROP_NAME]);
311 }
312 }
313
314 PurplePresencePrimitive
315 purple_saved_presence_get_primitive(PurpleSavedPresence *presence) {
316 g_return_val_if_fail(PURPLE_IS_SAVED_PRESENCE(presence),
317 PURPLE_PRESENCE_PRIMITIVE_OFFLINE);
318
319 return presence->primitive;
320 }
321
322 void
323 purple_saved_presence_set_primitive(PurpleSavedPresence *presence,
324 PurplePresencePrimitive primitive)
325 {
326 g_return_if_fail(PURPLE_IS_SAVED_PRESENCE(presence));
327
328 if(presence->primitive != primitive) {
329 presence->primitive = primitive;
330
331 g_object_notify_by_pspec(G_OBJECT(presence),
332 properties[PROP_PRIMITIVE]);
333 }
334 }
335
336 const char *
337 purple_saved_presence_get_message(PurpleSavedPresence *presence) {
338 g_return_val_if_fail(PURPLE_IS_SAVED_PRESENCE(presence), NULL);
339
340 return presence->message;
341 }
342
343 void
344 purple_saved_presence_set_message(PurpleSavedPresence *presence,
345 const char *message)
346 {
347 g_return_if_fail(PURPLE_IS_SAVED_PRESENCE(presence));
348
349 if(!purple_strequal(presence->message, message)) {
350 g_free(presence->message);
351 presence->message = g_strdup(message);
352
353 g_object_notify_by_pspec(G_OBJECT(presence), properties[PROP_MESSAGE]);
354 }
355 }
356
357 const char *
358 purple_saved_presence_get_emoji(PurpleSavedPresence *presence) {
359 g_return_val_if_fail(PURPLE_IS_SAVED_PRESENCE(presence), NULL);
360
361 return presence->emoji;
362 }
363
364 void
365 purple_saved_presence_set_emoji(PurpleSavedPresence *presence,
366 const char *emoji)
367 {
368 g_return_if_fail(PURPLE_IS_SAVED_PRESENCE(presence));
369
370 if(!purple_strequal(presence->emoji, emoji)) {
371 g_free(presence->emoji);
372 presence->emoji = g_strdup(emoji);
373
374 g_object_notify_by_pspec(G_OBJECT(presence), properties[PROP_EMOJI]);
375 }
376 }

mercurial