libpurple/purpleidlemanager.c

Thu, 24 Apr 2025 21:42:59 -0500

author
Gary Kramlich <grim@reaperworld.com>
date
Thu, 24 Apr 2025 21:42:59 -0500
changeset 43241
e41969a43e42
parent 43071
071588186662
permissions
-rw-r--r--

Add Purple.Contact.is_own_account

This checks to see if a Purple.Contact shares the Purple.ContactInfo with the
account it is tied to.

Testing Done:
Ran the unit tests under valgrind and called in the turtles.

Reviewed at https://reviews.imfreedom.org/r/3985/

42383
e8302a55fddb Create PurpleIdleManager for managing idle states
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
1 /*
e8302a55fddb Create PurpleIdleManager for managing idle states
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
2 * Purple - Internet Messaging Library
e8302a55fddb Create PurpleIdleManager for managing idle states
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
3 * Copyright (C) Pidgin Developers <devel@pidgin.im>
e8302a55fddb Create PurpleIdleManager for managing idle states
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
4 *
e8302a55fddb Create PurpleIdleManager for managing idle states
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
5 * Purple is the legal property of its developers, whose names are too numerous
42594
eddde70cedd8 Create a test for verifying license headers and correct the ones that were wrong
Gary Kramlich <grim@reaperworld.com>
parents: 42576
diff changeset
6 * to list here. Please refer to the COPYRIGHT file distributed with this
42383
e8302a55fddb Create PurpleIdleManager for managing idle states
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
7 * source distribution.
e8302a55fddb Create PurpleIdleManager for managing idle states
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
8 *
42594
eddde70cedd8 Create a test for verifying license headers and correct the ones that were wrong
Gary Kramlich <grim@reaperworld.com>
parents: 42576
diff changeset
9 * This library is free software; you can redistribute it and/or modify it
eddde70cedd8 Create a test for verifying license headers and correct the ones that were wrong
Gary Kramlich <grim@reaperworld.com>
parents: 42576
diff changeset
10 * under the terms of the GNU General Public License as published by the Free
eddde70cedd8 Create a test for verifying license headers and correct the ones that were wrong
Gary Kramlich <grim@reaperworld.com>
parents: 42576
diff changeset
11 * Software Foundation; either version 2 of the License, or (at your option)
eddde70cedd8 Create a test for verifying license headers and correct the ones that were wrong
Gary Kramlich <grim@reaperworld.com>
parents: 42576
diff changeset
12 * any later version.
42383
e8302a55fddb Create PurpleIdleManager for managing idle states
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
13 *
42594
eddde70cedd8 Create a test for verifying license headers and correct the ones that were wrong
Gary Kramlich <grim@reaperworld.com>
parents: 42576
diff changeset
14 * This library is distributed in the hope that it will be useful, but WITHOUT
eddde70cedd8 Create a test for verifying license headers and correct the ones that were wrong
Gary Kramlich <grim@reaperworld.com>
parents: 42576
diff changeset
15 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
eddde70cedd8 Create a test for verifying license headers and correct the ones that were wrong
Gary Kramlich <grim@reaperworld.com>
parents: 42576
diff changeset
16 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
eddde70cedd8 Create a test for verifying license headers and correct the ones that were wrong
Gary Kramlich <grim@reaperworld.com>
parents: 42576
diff changeset
17 * more details.
42383
e8302a55fddb Create PurpleIdleManager for managing idle states
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
18 *
42594
eddde70cedd8 Create a test for verifying license headers and correct the ones that were wrong
Gary Kramlich <grim@reaperworld.com>
parents: 42576
diff changeset
19 * You should have received a copy of the GNU General Public License along with
eddde70cedd8 Create a test for verifying license headers and correct the ones that were wrong
Gary Kramlich <grim@reaperworld.com>
parents: 42576
diff changeset
20 * this library; if not, see <https://www.gnu.org/licenses/>.
42383
e8302a55fddb Create PurpleIdleManager for managing idle states
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
21 */
e8302a55fddb Create PurpleIdleManager for managing idle states
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
22
e8302a55fddb Create PurpleIdleManager for managing idle states
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
23 #include "purpleidlemanager.h"
e8302a55fddb Create PurpleIdleManager for managing idle states
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
24 #include "purpleidlemanagerprivate.h"
e8302a55fddb Create PurpleIdleManager for managing idle states
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
25
e8302a55fddb Create PurpleIdleManager for managing idle states
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
26 #include "util.h"
e8302a55fddb Create PurpleIdleManager for managing idle states
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
27
e8302a55fddb Create PurpleIdleManager for managing idle states
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
28 enum {
e8302a55fddb Create PurpleIdleManager for managing idle states
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
29 PROP_0,
e8302a55fddb Create PurpleIdleManager for managing idle states
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
30 PROP_TIMESTAMP,
e8302a55fddb Create PurpleIdleManager for managing idle states
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
31 N_PROPERTIES,
e8302a55fddb Create PurpleIdleManager for managing idle states
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
32 };
e8302a55fddb Create PurpleIdleManager for managing idle states
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
33 static GParamSpec *properties[N_PROPERTIES] = {NULL, };
e8302a55fddb Create PurpleIdleManager for managing idle states
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
34
e8302a55fddb Create PurpleIdleManager for managing idle states
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
35 struct _PurpleIdleManager {
e8302a55fddb Create PurpleIdleManager for managing idle states
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
36 GObject parent;
e8302a55fddb Create PurpleIdleManager for managing idle states
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
37
e8302a55fddb Create PurpleIdleManager for managing idle states
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
38 GHashTable *sources;
e8302a55fddb Create PurpleIdleManager for managing idle states
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
39 char *active_source;
e8302a55fddb Create PurpleIdleManager for managing idle states
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
40 };
e8302a55fddb Create PurpleIdleManager for managing idle states
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
41
e8302a55fddb Create PurpleIdleManager for managing idle states
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
42 /******************************************************************************
e8302a55fddb Create PurpleIdleManager for managing idle states
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
43 * GObject Implementation
e8302a55fddb Create PurpleIdleManager for managing idle states
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
44 *****************************************************************************/
42576
ab1ca778ddb2 Make sure all of the final types in libpurple are defined as such
Gary Kramlich <grim@reaperworld.com>
parents: 42383
diff changeset
45 G_DEFINE_FINAL_TYPE(PurpleIdleManager, purple_idle_manager, G_TYPE_OBJECT)
42383
e8302a55fddb Create PurpleIdleManager for managing idle states
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
46
e8302a55fddb Create PurpleIdleManager for managing idle states
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
47 static void
e8302a55fddb Create PurpleIdleManager for managing idle states
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
48 purple_idle_manager_finalize(GObject *obj) {
e8302a55fddb Create PurpleIdleManager for managing idle states
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
49 PurpleIdleManager *manager = PURPLE_IDLE_MANAGER(obj);
e8302a55fddb Create PurpleIdleManager for managing idle states
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
50
e8302a55fddb Create PurpleIdleManager for managing idle states
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
51 g_clear_pointer(&manager->sources, g_hash_table_destroy);
e8302a55fddb Create PurpleIdleManager for managing idle states
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
52 g_clear_pointer(&manager->active_source, g_free);
e8302a55fddb Create PurpleIdleManager for managing idle states
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
53
e8302a55fddb Create PurpleIdleManager for managing idle states
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
54 G_OBJECT_CLASS(purple_idle_manager_parent_class)->finalize(obj);
e8302a55fddb Create PurpleIdleManager for managing idle states
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
55 }
e8302a55fddb Create PurpleIdleManager for managing idle states
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
56
e8302a55fddb Create PurpleIdleManager for managing idle states
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
57 static void
e8302a55fddb Create PurpleIdleManager for managing idle states
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
58 purple_idle_manager_get_property(GObject *obj, guint param_id,
e8302a55fddb Create PurpleIdleManager for managing idle states
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
59 GValue *value, GParamSpec *pspec)
e8302a55fddb Create PurpleIdleManager for managing idle states
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
60 {
e8302a55fddb Create PurpleIdleManager for managing idle states
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
61 PurpleIdleManager *manager = PURPLE_IDLE_MANAGER(obj);
e8302a55fddb Create PurpleIdleManager for managing idle states
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
62
e8302a55fddb Create PurpleIdleManager for managing idle states
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
63 switch(param_id) {
e8302a55fddb Create PurpleIdleManager for managing idle states
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
64 case PROP_TIMESTAMP:
e8302a55fddb Create PurpleIdleManager for managing idle states
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
65 g_value_set_boxed(value, purple_idle_manager_get_timestamp(manager));
e8302a55fddb Create PurpleIdleManager for managing idle states
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
66 break;
e8302a55fddb Create PurpleIdleManager for managing idle states
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
67 default:
e8302a55fddb Create PurpleIdleManager for managing idle states
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
68 G_OBJECT_WARN_INVALID_PROPERTY_ID(obj, param_id, pspec);
e8302a55fddb Create PurpleIdleManager for managing idle states
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
69 break;
e8302a55fddb Create PurpleIdleManager for managing idle states
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
70 }
e8302a55fddb Create PurpleIdleManager for managing idle states
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
71 }
e8302a55fddb Create PurpleIdleManager for managing idle states
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
72
e8302a55fddb Create PurpleIdleManager for managing idle states
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
73 static void
e8302a55fddb Create PurpleIdleManager for managing idle states
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
74 purple_idle_manager_init(PurpleIdleManager *manager) {
e8302a55fddb Create PurpleIdleManager for managing idle states
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
75 manager->sources = g_hash_table_new_full(g_str_hash, g_str_equal, g_free,
e8302a55fddb Create PurpleIdleManager for managing idle states
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
76 (GDestroyNotify)g_date_time_unref);
e8302a55fddb Create PurpleIdleManager for managing idle states
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
77 }
e8302a55fddb Create PurpleIdleManager for managing idle states
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
78
e8302a55fddb Create PurpleIdleManager for managing idle states
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
79 static void
e8302a55fddb Create PurpleIdleManager for managing idle states
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
80 purple_idle_manager_class_init(PurpleIdleManagerClass *klass) {
e8302a55fddb Create PurpleIdleManager for managing idle states
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
81 GObjectClass *obj_class = G_OBJECT_CLASS(klass);
e8302a55fddb Create PurpleIdleManager for managing idle states
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
82
e8302a55fddb Create PurpleIdleManager for managing idle states
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
83 obj_class->finalize = purple_idle_manager_finalize;
e8302a55fddb Create PurpleIdleManager for managing idle states
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
84 obj_class->get_property = purple_idle_manager_get_property;
e8302a55fddb Create PurpleIdleManager for managing idle states
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
85
e8302a55fddb Create PurpleIdleManager for managing idle states
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
86 /**
42656
df9aafbae930 Add a doc-check unit test to libpurple and fix the issues it has found
Gary Kramlich <grim@reaperworld.com>
parents: 42614
diff changeset
87 * PurpleIdleManager:timestamp:
42383
e8302a55fddb Create PurpleIdleManager for managing idle states
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
88 *
e8302a55fddb Create PurpleIdleManager for managing idle states
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
89 * The aggregate of the oldest idle timestamp of all of the sources that
e8302a55fddb Create PurpleIdleManager for managing idle states
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
90 * are known.
e8302a55fddb Create PurpleIdleManager for managing idle states
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
91 *
42614
b75a5bbf6c35 Remove the micro version from since tags for libpurple part 3
Gary Kramlich <grim@reaperworld.com>
parents: 42594
diff changeset
92 * Since: 3.0
42383
e8302a55fddb Create PurpleIdleManager for managing idle states
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
93 */
e8302a55fddb Create PurpleIdleManager for managing idle states
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
94 properties[PROP_TIMESTAMP] = g_param_spec_boxed(
43071
071588186662 Remove nick and blurb from libpurple properties
Elliott Sales de Andrade <quantum.analyst@gmail.com>
parents: 42767
diff changeset
95 "timestamp", NULL, NULL,
42383
e8302a55fddb Create PurpleIdleManager for managing idle states
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
96 G_TYPE_DATE_TIME,
e8302a55fddb Create PurpleIdleManager for managing idle states
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
97 G_PARAM_READABLE | G_PARAM_STATIC_STRINGS);
e8302a55fddb Create PurpleIdleManager for managing idle states
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
98
e8302a55fddb Create PurpleIdleManager for managing idle states
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
99 g_object_class_install_properties(obj_class, N_PROPERTIES, properties);
e8302a55fddb Create PurpleIdleManager for managing idle states
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
100 }
e8302a55fddb Create PurpleIdleManager for managing idle states
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
101
e8302a55fddb Create PurpleIdleManager for managing idle states
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
102 /******************************************************************************
e8302a55fddb Create PurpleIdleManager for managing idle states
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
103 * Private API
e8302a55fddb Create PurpleIdleManager for managing idle states
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
104 *****************************************************************************/
e8302a55fddb Create PurpleIdleManager for managing idle states
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
105 static PurpleIdleManager *default_manager = NULL;
e8302a55fddb Create PurpleIdleManager for managing idle states
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
106
e8302a55fddb Create PurpleIdleManager for managing idle states
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
107 void
e8302a55fddb Create PurpleIdleManager for managing idle states
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
108 purple_idle_manager_startup(void) {
e8302a55fddb Create PurpleIdleManager for managing idle states
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
109 if(!PURPLE_IS_IDLE_MANAGER(default_manager)) {
e8302a55fddb Create PurpleIdleManager for managing idle states
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
110 default_manager = g_object_new(PURPLE_TYPE_IDLE_MANAGER, NULL);
e8302a55fddb Create PurpleIdleManager for managing idle states
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
111 g_object_add_weak_pointer(G_OBJECT(default_manager),
e8302a55fddb Create PurpleIdleManager for managing idle states
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
112 (gpointer *)&default_manager);
e8302a55fddb Create PurpleIdleManager for managing idle states
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
113 }
e8302a55fddb Create PurpleIdleManager for managing idle states
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
114 }
e8302a55fddb Create PurpleIdleManager for managing idle states
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
115
e8302a55fddb Create PurpleIdleManager for managing idle states
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
116 void
e8302a55fddb Create PurpleIdleManager for managing idle states
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
117 purple_idle_manager_shutdown(void) {
e8302a55fddb Create PurpleIdleManager for managing idle states
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
118 g_clear_object(&default_manager);
e8302a55fddb Create PurpleIdleManager for managing idle states
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
119 }
e8302a55fddb Create PurpleIdleManager for managing idle states
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
120
e8302a55fddb Create PurpleIdleManager for managing idle states
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
121 /******************************************************************************
e8302a55fddb Create PurpleIdleManager for managing idle states
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
122 * Public API
e8302a55fddb Create PurpleIdleManager for managing idle states
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
123 *****************************************************************************/
e8302a55fddb Create PurpleIdleManager for managing idle states
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
124 PurpleIdleManager *
e8302a55fddb Create PurpleIdleManager for managing idle states
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
125 purple_idle_manager_get_default(void) {
e8302a55fddb Create PurpleIdleManager for managing idle states
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
126 return default_manager;
e8302a55fddb Create PurpleIdleManager for managing idle states
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
127 }
e8302a55fddb Create PurpleIdleManager for managing idle states
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
128
e8302a55fddb Create PurpleIdleManager for managing idle states
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
129 gboolean
e8302a55fddb Create PurpleIdleManager for managing idle states
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
130 purple_idle_manager_set_source(PurpleIdleManager *manager,
e8302a55fddb Create PurpleIdleManager for managing idle states
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
131 const char *source,
e8302a55fddb Create PurpleIdleManager for managing idle states
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
132 GDateTime *timestamp)
e8302a55fddb Create PurpleIdleManager for managing idle states
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
133 {
e8302a55fddb Create PurpleIdleManager for managing idle states
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
134 GHashTableIter iter;
e8302a55fddb Create PurpleIdleManager for managing idle states
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
135 GDateTime *oldest = NULL;
e8302a55fddb Create PurpleIdleManager for managing idle states
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
136 const char *new_source = NULL;
e8302a55fddb Create PurpleIdleManager for managing idle states
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
137 gpointer key;
e8302a55fddb Create PurpleIdleManager for managing idle states
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
138 gpointer value;
e8302a55fddb Create PurpleIdleManager for managing idle states
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
139
e8302a55fddb Create PurpleIdleManager for managing idle states
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
140 g_return_val_if_fail(PURPLE_IS_IDLE_MANAGER(manager), FALSE);
e8302a55fddb Create PurpleIdleManager for managing idle states
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
141 g_return_val_if_fail(!purple_strempty(source), FALSE);
e8302a55fddb Create PurpleIdleManager for managing idle states
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
142
e8302a55fddb Create PurpleIdleManager for managing idle states
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
143 /* We're adding/updating a source. */
e8302a55fddb Create PurpleIdleManager for managing idle states
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
144 if(timestamp != NULL) {
e8302a55fddb Create PurpleIdleManager for managing idle states
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
145 g_hash_table_insert(manager->sources, g_strdup(source),
e8302a55fddb Create PurpleIdleManager for managing idle states
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
146 g_date_time_ref(timestamp));
e8302a55fddb Create PurpleIdleManager for managing idle states
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
147 } else {
e8302a55fddb Create PurpleIdleManager for managing idle states
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
148 g_hash_table_remove(manager->sources, source);
e8302a55fddb Create PurpleIdleManager for managing idle states
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
149 }
e8302a55fddb Create PurpleIdleManager for managing idle states
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
150
e8302a55fddb Create PurpleIdleManager for managing idle states
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
151 g_hash_table_iter_init(&iter, manager->sources);
e8302a55fddb Create PurpleIdleManager for managing idle states
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
152 while(g_hash_table_iter_next(&iter, &key, &value)) {
e8302a55fddb Create PurpleIdleManager for managing idle states
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
153 /* If we don't have an oldest yet, use this value. */
e8302a55fddb Create PurpleIdleManager for managing idle states
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
154 if(oldest == NULL || g_date_time_compare(value, oldest) < 0) {
e8302a55fddb Create PurpleIdleManager for managing idle states
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
155 oldest = value;
e8302a55fddb Create PurpleIdleManager for managing idle states
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
156 new_source = key;
e8302a55fddb Create PurpleIdleManager for managing idle states
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
157 }
e8302a55fddb Create PurpleIdleManager for managing idle states
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
158 }
e8302a55fddb Create PurpleIdleManager for managing idle states
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
159
42767
8cf1d11b59c1 Use g_set_str everywhere
Elliott Sales de Andrade <quantum.analyst@gmail.com>
parents: 42656
diff changeset
160 /* We have to set the active source before emitting the property change
8cf1d11b59c1 Use g_set_str everywhere
Elliott Sales de Andrade <quantum.analyst@gmail.com>
parents: 42656
diff changeset
161 * otherwise purple_idle_manager_get_timestamp will look up the wrong
8cf1d11b59c1 Use g_set_str everywhere
Elliott Sales de Andrade <quantum.analyst@gmail.com>
parents: 42656
diff changeset
162 * value.
8cf1d11b59c1 Use g_set_str everywhere
Elliott Sales de Andrade <quantum.analyst@gmail.com>
parents: 42656
diff changeset
163 */
8cf1d11b59c1 Use g_set_str everywhere
Elliott Sales de Andrade <quantum.analyst@gmail.com>
parents: 42656
diff changeset
164 if(g_set_str(&manager->active_source, new_source)) {
42383
e8302a55fddb Create PurpleIdleManager for managing idle states
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
165 g_object_notify_by_pspec(G_OBJECT(manager),
e8302a55fddb Create PurpleIdleManager for managing idle states
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
166 properties[PROP_TIMESTAMP]);
e8302a55fddb Create PurpleIdleManager for managing idle states
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
167
e8302a55fddb Create PurpleIdleManager for managing idle states
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
168 return TRUE;
e8302a55fddb Create PurpleIdleManager for managing idle states
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
169 }
e8302a55fddb Create PurpleIdleManager for managing idle states
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
170
e8302a55fddb Create PurpleIdleManager for managing idle states
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
171 return FALSE;
e8302a55fddb Create PurpleIdleManager for managing idle states
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
172 }
e8302a55fddb Create PurpleIdleManager for managing idle states
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
173
e8302a55fddb Create PurpleIdleManager for managing idle states
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
174 GDateTime *
e8302a55fddb Create PurpleIdleManager for managing idle states
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
175 purple_idle_manager_get_timestamp(PurpleIdleManager *manager) {
e8302a55fddb Create PurpleIdleManager for managing idle states
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
176 g_return_val_if_fail(PURPLE_IS_IDLE_MANAGER(manager), NULL);
e8302a55fddb Create PurpleIdleManager for managing idle states
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
177
e8302a55fddb Create PurpleIdleManager for managing idle states
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
178 if(manager->active_source == NULL) {
e8302a55fddb Create PurpleIdleManager for managing idle states
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
179 return NULL;
e8302a55fddb Create PurpleIdleManager for managing idle states
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
180 }
e8302a55fddb Create PurpleIdleManager for managing idle states
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
181
e8302a55fddb Create PurpleIdleManager for managing idle states
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
182 return g_hash_table_lookup(manager->sources, manager->active_source);
e8302a55fddb Create PurpleIdleManager for managing idle states
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
183 }

mercurial