| |
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 } |