libpurple/purplescheduler.c

Thu, 24 Jul 2025 23:35:13 -0500

author
Gary Kramlich <grim@reaperworld.com>
date
Thu, 24 Jul 2025 23:35:13 -0500
changeset 43293
f5d33dbc18a9
permissions
-rw-r--r--

Create Purple.Scheduler

This manages Purple.ScheduledTask instances and propagates their execute
signals.

This can be used for stuff like reconnecting accounts, scheduling messages
regardless of protocol support, changing avatars at a set time, really
whatever you can think of and write a plugin to implement.

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

Also run in a dev environment and verified that there were no weird error messages.

Bugs closed: PIDGIN-18105

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

43293
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
1 /*
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
2 * Purple - Internet Messaging Library
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
3 * Copyright (C) Pidgin Developers <devel@pidgin.im>
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
4 *
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
5 * Purple is the legal property of its developers, whose names are too numerous
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
6 * to list here. Please refer to the COPYRIGHT file distributed with this
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
7 * source distribution.
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
8 *
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
9 * This library is free software; you can redistribute it and/or modify it
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
10 * under the terms of the GNU General Public License as published by the Free
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
11 * Software Foundation; either version 2 of the License, or (at your option)
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
12 * any later version.
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
13 *
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
14 * This library is distributed in the hope that it will be useful, but WITHOUT
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
15 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
16 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
17 * more details.
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
18 *
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
19 * You should have received a copy of the GNU General Public License along with
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
20 * this library; if not, see <https://www.gnu.org/licenses/>.
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
21 */
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
22
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
23 #ifdef G_LOG_DOMAIN
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
24 # undef G_LOG_DOMAIN
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
25 #endif
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
26 #define G_LOG_DOMAIN "PurpleScheduler"
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
27
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
28 #include <birb.h>
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
29
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
30 #include "purplescheduler.h"
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
31 #include "purpleschedulerprivate.h"
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
32
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
33 struct _PurpleScheduler {
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
34 GObject parent;
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
35
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
36 GPtrArray *tasks;
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
37 };
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
38
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
39 enum {
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
40 PROP_0,
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
41 PROP_ITEM_TYPE,
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
42 PROP_N_ITEMS,
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
43 N_PROPERTIES,
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
44 };
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
45 static GParamSpec *properties[N_PROPERTIES] = {NULL, };
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
46
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
47 enum {
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
48 SIG_EXECUTE_TASK,
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
49 N_SIGNALS,
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
50 };
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
51 static guint signals[N_SIGNALS] = {0, };
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
52
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
53 G_DEFINE_QUARK(purple-scheduler-error, purple_scheduler_error)
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
54
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
55 static PurpleScheduler *default_scheduler = NULL;
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
56
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
57 /******************************************************************************
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
58 * Helpers
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
59 *****************************************************************************/
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
60 /**
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
61 * purple_scheduler_find_task_with_id: (skip)
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
62 * @id: the id of the task to search for
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
63 * @position: (out) (nullable): a return address for the position of the item
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
64 *
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
65 * Looks for a task with the given id.
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
66 *
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
67 * If the task is found it will be returned as well as it's position.
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
68 *
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
69 * Returns: (transfer none) (nullable): The task if found.
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
70 *
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
71 * Since: 3.0
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
72 */
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
73 static PurpleScheduledTask *
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
74 purple_scheduler_find_task_with_id(PurpleScheduler *scheduler,
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
75 const char *id,
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
76 guint *position)
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
77 {
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
78 g_return_val_if_fail(PURPLE_IS_SCHEDULER(scheduler), NULL);
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
79
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
80 for(guint i = 0; i < scheduler->tasks->len; i++) {
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
81 PurpleScheduledTask *task = NULL;
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
82 const char *task_id = NULL;
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
83
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
84 task = g_ptr_array_index(scheduler->tasks, i);
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
85 task_id = purple_scheduled_task_get_id(task);
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
86
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
87 if(birb_str_equal(id, task_id)) {
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
88 if(position != NULL) {
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
89 *position = i;
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
90 }
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
91
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
92 return task;
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
93 }
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
94 }
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
95
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
96 return NULL;
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
97 }
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
98
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
99 /**
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
100 * purple_scheduler_unref_task: (skip)
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
101 * @task: the task to cancel and unref
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
102 *
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
103 * Cancels a task if necessary before unreferencing it.
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
104 *
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
105 * Since: 3.0
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
106 */
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
107 static void
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
108 purple_scheduler_unref_task(PurpleScheduledTask *task) {
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
109 PurpleScheduledTaskState state = PURPLE_SCHEDULED_TASK_STATE_UNSCHEDULED;
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
110
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
111 g_return_if_fail(PURPLE_IS_SCHEDULED_TASK(task));
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
112
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
113 state = purple_scheduled_task_get_state(task);
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
114 if(state == PURPLE_SCHEDULED_TASK_STATE_SCHEDULED) {
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
115 purple_scheduled_task_cancel(task);
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
116 }
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
117
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
118 g_object_unref(task);
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
119 }
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
120
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
121 /******************************************************************************
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
122 * Callbacks
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
123 *****************************************************************************/
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
124 static void
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
125 purple_scheduler_task_execute_cb(PurpleScheduledTask *task, gpointer data) {
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
126 PurpleScheduler *scheduler = data;
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
127 const char *task_type = NULL;
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
128
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
129 task_type = purple_scheduled_task_get_task_type(task);
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
130 g_signal_emit(scheduler,
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
131 signals[SIG_EXECUTE_TASK],
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
132 g_quark_from_string(task_type),
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
133 task,
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
134 task_type);
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
135 }
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
136
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
137 static void
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
138 purple_scheduler_task_notify_state_cb(GObject *obj,
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
139 G_GNUC_UNUSED GParamSpec *pspec,
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
140 gpointer data)
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
141 {
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
142 PurpleScheduledTask *task = PURPLE_SCHEDULED_TASK(obj);
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
143 PurpleScheduledTaskState state = PURPLE_SCHEDULED_TASK_STATE_UNSCHEDULED;
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
144 PurpleScheduler *scheduler = data;
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
145
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
146 state = purple_scheduled_task_get_state(task);
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
147 if(state == PURPLE_SCHEDULED_TASK_STATE_EXECUTED) {
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
148 purple_scheduler_remove_task(scheduler,
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
149 purple_scheduled_task_get_id(task));
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
150 }
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
151 }
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
152
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
153 /******************************************************************************
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
154 * GListModel Implementation
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
155 *****************************************************************************/
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
156 static GType
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
157 purple_scheduler_get_item_type(G_GNUC_UNUSED GListModel *model) {
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
158 return PURPLE_TYPE_SCHEDULED_TASK;
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
159 }
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
160
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
161 static guint
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
162 purple_scheduler_get_n_items(GListModel *list) {
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
163 PurpleScheduler *scheduler = PURPLE_SCHEDULER(list);
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
164
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
165 return scheduler->tasks->len;
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
166 }
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
167
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
168 static gpointer
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
169 purple_scheduler_get_item(GListModel *list, guint position) {
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
170 PurpleScheduler *scheduler = PURPLE_SCHEDULER(list);
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
171 PurpleScheduledTask *task = NULL;
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
172
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
173 if(position < scheduler->tasks->len) {
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
174 task = g_ptr_array_index(scheduler->tasks, position);
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
175 g_object_ref(task);
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
176 }
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
177
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
178 return task;
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
179 }
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
180
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
181 static void
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
182 purple_scheduler_list_model_init(GListModelInterface *iface) {
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
183 iface->get_item_type = purple_scheduler_get_item_type;
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
184 iface->get_n_items = purple_scheduler_get_n_items;
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
185 iface->get_item = purple_scheduler_get_item;
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
186 }
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
187
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
188 /******************************************************************************
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
189 * GObject Implementation
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
190 *****************************************************************************/
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
191 G_DEFINE_FINAL_TYPE_WITH_CODE(PurpleScheduler, purple_scheduler, G_TYPE_OBJECT,
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
192 G_IMPLEMENT_INTERFACE(G_TYPE_LIST_MODEL,
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
193 purple_scheduler_list_model_init));
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
194
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
195 static void
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
196 purple_scheduler_finalize(GObject *obj) {
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
197 PurpleScheduler *scheduler = PURPLE_SCHEDULER(obj);
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
198
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
199 g_clear_pointer(&scheduler->tasks, g_ptr_array_unref);
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
200
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
201 G_OBJECT_CLASS(purple_scheduler_parent_class)->finalize(obj);
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
202 }
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
203
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
204 static void
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
205 purple_scheduler_get_property(GObject *obj, guint param_id, GValue *value,
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
206 GParamSpec *pspec)
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
207 {
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
208 GListModel *model = G_LIST_MODEL(obj);
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
209
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
210 switch(param_id) {
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
211 case PROP_ITEM_TYPE:
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
212 g_value_set_gtype(value, g_list_model_get_item_type(model));
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
213 break;
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
214 case PROP_N_ITEMS:
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
215 g_value_set_uint(value, g_list_model_get_n_items(model));
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
216 break;
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
217 default:
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
218 G_OBJECT_WARN_INVALID_PROPERTY_ID(obj, param_id, pspec);
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
219 break;
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
220 }
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
221 }
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
222
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
223 static void
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
224 purple_scheduler_init(PurpleScheduler *scheduler) {
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
225 scheduler->tasks = g_ptr_array_new_full(10,
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
226 (GDestroyNotify)purple_scheduler_unref_task);
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
227 }
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
228
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
229 static void
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
230 purple_scheduler_class_init(PurpleSchedulerClass *klass) {
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
231 GObjectClass *obj_class = G_OBJECT_CLASS(klass);
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
232
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
233 obj_class->finalize = purple_scheduler_finalize;
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
234 obj_class->get_property = purple_scheduler_get_property;
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
235
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
236 /**
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
237 * PurpleScheduler:item-type:
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
238 *
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
239 * The type of items. See [vfunc@Gio.ListModel.get_item_type].
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
240 *
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
241 * Since: 3.0
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
242 */
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
243 properties[PROP_ITEM_TYPE] = g_param_spec_gtype(
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
244 "item-type", NULL, NULL,
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
245 G_TYPE_OBJECT,
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
246 G_PARAM_READABLE | G_PARAM_STATIC_STRINGS);
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
247
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
248 /**
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
249 * PurpleScheduler:n-items:
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
250 *
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
251 * The number of items. See [vfunc@Gio.ListModel.get_n_items].
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
252 *
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
253 * Since: 3.0
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
254 */
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
255 properties[PROP_N_ITEMS] = g_param_spec_uint(
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
256 "n-items", NULL, NULL,
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
257 0, G_MAXUINT, 0,
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
258 G_PARAM_READABLE | G_PARAM_STATIC_STRINGS);
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
259
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
260 g_object_class_install_properties(obj_class, N_PROPERTIES, properties);
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
261
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
262 /**
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
263 * PurpleScheduler::execute-task:
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
264 * @scheduler: the instance
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
265 * @task: the task being executed
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
266 * @task_type: the task type
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
267 *
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
268 * Emitted when a task is being executed.
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
269 *
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
270 * This signal supports details on [property@ScheduledTask:task-type] to
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
271 * make it easier to listen for specific task types being executed.
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
272 *
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
273 * Since: 3.0
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
274 */
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
275 signals[SIG_EXECUTE_TASK] = g_signal_new_class_handler(
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
276 "execute-task",
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
277 G_OBJECT_CLASS_TYPE(klass),
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
278 G_SIGNAL_RUN_LAST | G_SIGNAL_DETAILED,
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
279 NULL,
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
280 NULL,
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
281 NULL,
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
282 NULL,
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
283 G_TYPE_NONE,
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
284 2,
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
285 PURPLE_TYPE_SCHEDULED_TASK,
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
286 G_TYPE_STRING);
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
287 }
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
288
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
289 /******************************************************************************
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
290 * Private API
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
291 *****************************************************************************/
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
292 void
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
293 purple_scheduler_startup(void) {
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
294 if(!PURPLE_IS_SCHEDULER(default_scheduler)) {
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
295 default_scheduler = purple_scheduler_new();
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
296 g_object_add_weak_pointer(G_OBJECT(default_scheduler),
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
297 (gpointer *)&default_scheduler);
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
298 }
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
299 }
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
300
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
301 void
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
302 purple_scheduler_shutdown(void) {
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
303 g_clear_object(&default_scheduler);
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
304 }
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
305
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
306 /******************************************************************************
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
307 * Public API
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
308 *****************************************************************************/
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
309 gboolean
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
310 purple_scheduler_add_task(PurpleScheduler *scheduler,
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
311 PurpleScheduledTask *task,
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
312 GDateTime *execute_at,
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
313 GError **error)
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
314 {
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
315 PurpleScheduledTask *existing = NULL;
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
316 GError *local_error = NULL;
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
317 const char *id = NULL;
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
318
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
319 g_return_val_if_fail(PURPLE_IS_SCHEDULER(scheduler), FALSE);
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
320 g_return_val_if_fail(PURPLE_IS_SCHEDULED_TASK(task), FALSE);
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
321 g_return_val_if_fail(execute_at != NULL, FALSE);
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
322
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
323 id = purple_scheduled_task_get_id(task);
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
324 existing = purple_scheduler_find_task_with_id(scheduler, id, NULL);
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
325 if(PURPLE_IS_SCHEDULED_TASK(existing)) {
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
326 g_set_error(error,
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
327 PURPLE_SCHEDULER_ERROR,
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
328 PURPLE_SCHEDULER_ERROR_TASK_EXISTS,
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
329 "a task with id %s already exists",
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
330 id);
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
331 return FALSE;
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
332 }
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
333
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
334 if(!purple_scheduled_task_schedule(task, execute_at, &local_error)) {
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
335 if(local_error != NULL) {
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
336 g_propagate_error(error, local_error);
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
337 } else {
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
338 g_set_error_literal(error,
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
339 PURPLE_SCHEDULER_ERROR,
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
340 PURPLE_SCHEDULER_ERROR_FAILED_TO_SCHEDULE,
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
341 "the task failed to schedule for an unknown "
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
342 "reason");
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
343 }
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
344
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
345 return FALSE;
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
346 }
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
347
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
348 /* Connect to the execute signal so we can propagate the signal. */
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
349 g_signal_connect_object(task,
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
350 "execute",
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
351 G_CALLBACK(purple_scheduler_task_execute_cb),
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
352 scheduler,
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
353 G_CONNECT_DEFAULT);
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
354
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
355 /* Add a handler to remove the task after it's been executed. */
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
356 g_signal_connect_object(task,
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
357 "notify::state",
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
358 G_CALLBACK(purple_scheduler_task_notify_state_cb),
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
359 scheduler,
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
360 G_CONNECT_DEFAULT);
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
361
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
362 /* Finally add the item and emit the items-changed signal. */
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
363 g_ptr_array_add(scheduler->tasks, g_object_ref(task));
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
364 g_list_model_items_changed(G_LIST_MODEL(scheduler),
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
365 scheduler->tasks->len - 1, 0, 1);
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
366
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
367 return TRUE;
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
368 }
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
369
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
370 gboolean
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
371 purple_scheduler_add_task_relative(PurpleScheduler *scheduler,
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
372 PurpleScheduledTask *task,
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
373 GTimeSpan when,
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
374 GError **error)
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
375 {
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
376 GDateTime *now = NULL;
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
377 GDateTime *execute_at = NULL;
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
378 gboolean ret = FALSE;
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
379
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
380 g_return_val_if_fail(PURPLE_IS_SCHEDULER(scheduler), FALSE);
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
381 g_return_val_if_fail(PURPLE_IS_SCHEDULED_TASK(task), FALSE);
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
382
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
383 now = g_date_time_new_now_local();
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
384 execute_at = g_date_time_add(now, when);
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
385 g_date_time_unref(now);
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
386
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
387 ret = purple_scheduler_add_task(scheduler, task, execute_at, error);
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
388
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
389 g_date_time_unref(execute_at);
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
390
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
391 return ret;
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
392 }
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
393
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
394 PurpleScheduler *
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
395 purple_scheduler_get_default(void) {
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
396 return default_scheduler;
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
397 }
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
398
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
399 GListModel *
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
400 purple_scheduler_get_default_as_model(void) {
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
401 if(G_IS_LIST_MODEL(default_scheduler)) {
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
402 return G_LIST_MODEL(default_scheduler);
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
403 }
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
404
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
405 return NULL;
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
406 }
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
407
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
408 PurpleScheduler *
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
409 purple_scheduler_new(void) {
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
410 return g_object_new(PURPLE_TYPE_SCHEDULER, NULL);
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
411 }
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
412
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
413 gboolean
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
414 purple_scheduler_remove_task(PurpleScheduler *scheduler, const char *id) {
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
415 PurpleScheduledTask *task = NULL;
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
416 PurpleScheduledTaskState state = PURPLE_SCHEDULED_TASK_STATE_UNSCHEDULED;
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
417 guint position = 0;
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
418
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
419 g_return_val_if_fail(PURPLE_IS_SCHEDULER(scheduler), FALSE);
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
420 g_return_val_if_fail(!birb_str_is_empty(id), FALSE);
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
421
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
422 task = purple_scheduler_find_task_with_id(scheduler, id, &position);
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
423 if(!PURPLE_IS_SCHEDULED_TASK(task)) {
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
424 return FALSE;
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
425 }
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
426
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
427 state = purple_scheduled_task_get_state(task);
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
428 if(state == PURPLE_SCHEDULED_TASK_STATE_SCHEDULED) {
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
429 purple_scheduled_task_cancel(task);
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
430 }
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
431
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
432 g_ptr_array_remove_index(scheduler->tasks, position);
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
433
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
434 g_list_model_items_changed(G_LIST_MODEL(scheduler), position, 1, 0);
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
435
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
436 return TRUE;
f5d33dbc18a9 Create Purple.Scheduler
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
437 }

mercurial