Fri, 18 Jan 2013 03:51:05 -0500
Move blist loading into purple_core_init.
The comments say we want to move this into purple_blist_init, but that
seems like it would be problematic. We need the UI ops to be set, which
moves blist init after UI init. But stuff needs blist signals to be
registered before UI init, etc., etc. It seemed like a pain to work that
all out. I made purple_blist_boot for purple_core_init to call after the
UI init happened. It could have been called _load, but I didn't want
people to accidentally continue calling it.
| 9130 | 1 | /** |
| 2 | * @file cmds.c Commands API | |
| 3 | * @ingroup core | |
|
20147
66f05a854eee
applied changes from 8a731bbd0197fbcc91a705c2d8f528154216defa
Richard Laager <rlaager@pidgin.im>
parents:
19859
diff
changeset
|
4 | */ |
|
66f05a854eee
applied changes from 8a731bbd0197fbcc91a705c2d8f528154216defa
Richard Laager <rlaager@pidgin.im>
parents:
19859
diff
changeset
|
5 | |
|
66f05a854eee
applied changes from 8a731bbd0197fbcc91a705c2d8f528154216defa
Richard Laager <rlaager@pidgin.im>
parents:
19859
diff
changeset
|
6 | /* Copyright (C) 2003-2004 Timothy Ringenbach <omarvo@hotmail.com |
| 9130 | 7 | * |
| 8 | * This program is free software; you can redistribute it and/or modify | |
| 9 | * it under the terms of the GNU General Public License as published by | |
| 10 | * the Free Software Foundation; either version 2 of the License, or | |
| 11 | * (at your option) any later version. | |
| 12 | * | |
| 13 | * This program is distributed in the hope that it will be useful, | |
| 14 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
| 15 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
| 16 | * GNU General Public License for more details. | |
| 17 | * | |
| 18 | * You should have received a copy of the GNU General Public License | |
| 19 | * along with this program; if not, write to the Free Software | |
|
19859
71d37b57eff2
The FSF changed its address a while ago; our files were out of date.
John Bailey <rekkanoryo@rekkanoryo.org>
parents:
18265
diff
changeset
|
20 | * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1301 USA |
| 9130 | 21 | * |
| 22 | */ | |
| 23 | ||
|
18265
9f26190d7f46
Move the define in internal.h instead.
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents:
15884
diff
changeset
|
24 | #include "internal.h" |
|
9f26190d7f46
Move the define in internal.h instead.
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents:
15884
diff
changeset
|
25 | |
| 9130 | 26 | #include "account.h" |
| 9175 | 27 | #include "util.h" |
| 9130 | 28 | #include "cmds.h" |
| 29 | ||
| 30 | static GList *cmds = NULL; | |
| 31 | static guint next_id = 1; | |
| 32 | ||
| 15884 | 33 | typedef struct _PurpleCmd { |
| 34 | PurpleCmdId id; | |
| 9130 | 35 | gchar *cmd; |
| 36 | gchar *args; | |
| 15884 | 37 | PurpleCmdPriority priority; |
| 38 | PurpleCmdFlag flags; | |
| 9130 | 39 | gchar *prpl_id; |
| 15884 | 40 | PurpleCmdFunc func; |
| 9130 | 41 | gchar *help; |
| 9597 | 42 | void *data; |
| 15884 | 43 | } PurpleCmd; |
| 9130 | 44 | |
| 45 | ||
| 15884 | 46 | static gint cmds_compare_func(const PurpleCmd *a, const PurpleCmd *b) |
| 9130 | 47 | { |
|
10504
eae130eefbfe
[gaim-migrate @ 11796]
Stu Tomlinson <nosnilmot@pidgin.im>
parents:
9597
diff
changeset
|
48 | if (a->priority > b->priority) |
| 9130 | 49 | return -1; |
|
10504
eae130eefbfe
[gaim-migrate @ 11796]
Stu Tomlinson <nosnilmot@pidgin.im>
parents:
9597
diff
changeset
|
50 | else if (a->priority < b->priority) |
| 9130 | 51 | return 1; |
| 52 | else return 0; | |
| 53 | } | |
| 54 | ||
| 15884 | 55 | PurpleCmdId purple_cmd_register(const gchar *cmd, const gchar *args, |
| 56 | PurpleCmdPriority p, PurpleCmdFlag f, | |
| 57 | const gchar *prpl_id, PurpleCmdFunc func, | |
| 9597 | 58 | const gchar *helpstr, void *data) |
| 9130 | 59 | { |
| 15884 | 60 | PurpleCmdId id; |
| 61 | PurpleCmd *c; | |
| 9130 | 62 | |
| 9343 | 63 | g_return_val_if_fail(cmd != NULL && *cmd != '\0', 0); |
| 64 | g_return_val_if_fail(args != NULL, 0); | |
| 65 | g_return_val_if_fail(func != NULL, 0); | |
| 9130 | 66 | |
| 9343 | 67 | id = next_id++; |
| 9130 | 68 | |
| 15884 | 69 | c = g_new0(PurpleCmd, 1); |
| 9343 | 70 | c->id = id; |
| 9130 | 71 | c->cmd = g_strdup(cmd); |
| 72 | c->args = g_strdup(args); | |
| 73 | c->priority = p; | |
| 74 | c->flags = f; | |
|
14097
0c340861ab79
[gaim-migrate @ 16638]
Mark Doliner <markdoliner@pidgin.im>
parents:
12014
diff
changeset
|
75 | c->prpl_id = g_strdup(prpl_id); |
| 9130 | 76 | c->func = func; |
|
14097
0c340861ab79
[gaim-migrate @ 16638]
Mark Doliner <markdoliner@pidgin.im>
parents:
12014
diff
changeset
|
77 | c->help = g_strdup(helpstr); |
| 9597 | 78 | c->data = data; |
| 9130 | 79 | |
| 80 | cmds = g_list_insert_sorted(cmds, c, (GCompareFunc)cmds_compare_func); | |
| 81 | ||
|
23555
82dab41b4163
cmd-added and cmd-removed signals to emit when commands are registered/unregistered.
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents:
20147
diff
changeset
|
82 | purple_signal_emit(purple_cmds_get_handle(), "cmd-added", cmd, p, f); |
|
82dab41b4163
cmd-added and cmd-removed signals to emit when commands are registered/unregistered.
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents:
20147
diff
changeset
|
83 | |
| 9130 | 84 | return id; |
| 85 | } | |
| 86 | ||
| 15884 | 87 | static void purple_cmd_free(PurpleCmd *c) |
| 9130 | 88 | { |
| 89 | g_free(c->cmd); | |
| 90 | g_free(c->args); | |
|
14097
0c340861ab79
[gaim-migrate @ 16638]
Mark Doliner <markdoliner@pidgin.im>
parents:
12014
diff
changeset
|
91 | g_free(c->prpl_id); |
|
0c340861ab79
[gaim-migrate @ 16638]
Mark Doliner <markdoliner@pidgin.im>
parents:
12014
diff
changeset
|
92 | g_free(c->help); |
| 9130 | 93 | g_free(c); |
| 94 | } | |
| 95 | ||
| 15884 | 96 | void purple_cmd_unregister(PurpleCmdId id) |
| 9130 | 97 | { |
| 15884 | 98 | PurpleCmd *c; |
| 9130 | 99 | GList *l; |
| 100 | ||
| 101 | for (l = cmds; l; l = l->next) { | |
| 102 | c = l->data; | |
| 103 | ||
| 9343 | 104 | if (c->id == id) { |
| 9130 | 105 | cmds = g_list_remove(cmds, c); |
|
23555
82dab41b4163
cmd-added and cmd-removed signals to emit when commands are registered/unregistered.
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents:
20147
diff
changeset
|
106 | purple_signal_emit(purple_cmds_get_handle(), "cmd-removed", c->cmd); |
| 15884 | 107 | purple_cmd_free(c); |
| 9130 | 108 | return; |
| 109 | } | |
| 110 | } | |
| 111 | } | |
| 112 | ||
|
14097
0c340861ab79
[gaim-migrate @ 16638]
Mark Doliner <markdoliner@pidgin.im>
parents:
12014
diff
changeset
|
113 | /** |
|
0c340861ab79
[gaim-migrate @ 16638]
Mark Doliner <markdoliner@pidgin.im>
parents:
12014
diff
changeset
|
114 | * This sets args to a NULL-terminated array of strings. It should |
|
0c340861ab79
[gaim-migrate @ 16638]
Mark Doliner <markdoliner@pidgin.im>
parents:
12014
diff
changeset
|
115 | * be freed using g_strfreev(). |
|
0c340861ab79
[gaim-migrate @ 16638]
Mark Doliner <markdoliner@pidgin.im>
parents:
12014
diff
changeset
|
116 | */ |
| 15884 | 117 | static gboolean purple_cmd_parse_args(PurpleCmd *cmd, const gchar *s, const gchar *m, gchar ***args) |
| 9130 | 118 | { |
| 119 | int i; | |
| 120 | const char *end, *cur; | |
| 121 | ||
| 122 | *args = g_new0(char *, strlen(cmd->args) + 1); | |
| 123 | ||
| 124 | cur = s; | |
| 125 | ||
| 126 | for (i = 0; cmd->args[i]; i++) { | |
| 127 | if (!*cur) | |
| 15884 | 128 | return (cmd->flags & PURPLE_CMD_FLAG_ALLOW_WRONG_ARGS); |
| 9130 | 129 | |
| 130 | switch (cmd->args[i]) { | |
| 131 | case 'w': | |
| 9428 | 132 | if (!(end = strchr(cur, ' '))) { |
| 133 | end = cur + strlen(cur); | |
| 134 | (*args)[i] = g_strndup(cur, end - cur); | |
| 135 | cur = end; | |
| 136 | } else { | |
| 137 | (*args)[i] = g_strndup(cur, end - cur); | |
| 138 | cur = end + 1; | |
| 139 | } | |
| 9130 | 140 | break; |
| 141 | case 'W': | |
| 9428 | 142 | if (!(end = strchr(cur, ' '))) { |
| 143 | end = cur + strlen(cur); | |
| 15884 | 144 | (*args)[i] = purple_markup_slice(m, g_utf8_pointer_to_offset(s, cur), g_utf8_pointer_to_offset(s, end)); |
| 9428 | 145 | cur = end; |
| 146 | } else { | |
| 15884 | 147 | (*args)[i] = purple_markup_slice(m, g_utf8_pointer_to_offset(s, cur), g_utf8_pointer_to_offset(s, end)); |
| 9428 | 148 | cur = end +1; |
| 149 | } | |
|
14097
0c340861ab79
[gaim-migrate @ 16638]
Mark Doliner <markdoliner@pidgin.im>
parents:
12014
diff
changeset
|
150 | break; |
| 9130 | 151 | case 's': |
| 152 | (*args)[i] = g_strdup(cur); | |
| 153 | cur = cur + strlen(cur); | |
| 154 | break; | |
| 155 | case 'S': | |
| 15884 | 156 | (*args)[i] = purple_markup_slice(m, g_utf8_pointer_to_offset(s, cur), g_utf8_strlen(cur, -1) + 1); |
| 9130 | 157 | cur = cur + strlen(cur); |
| 158 | break; | |
| 159 | } | |
| 160 | } | |
| 161 | ||
| 162 | if (*cur) | |
| 15884 | 163 | return (cmd->flags & PURPLE_CMD_FLAG_ALLOW_WRONG_ARGS); |
| 9130 | 164 | |
| 165 | return TRUE; | |
| 166 | } | |
| 167 | ||
| 15884 | 168 | static void purple_cmd_strip_current_char(gunichar c, char *s, guint len) |
| 9175 | 169 | { |
| 170 | int bytes; | |
| 171 | ||
| 172 | bytes = g_unichar_to_utf8(c, NULL); | |
| 173 | memmove(s, s + bytes, len + 1 - bytes); | |
| 174 | } | |
| 175 | ||
| 15884 | 176 | static void purple_cmd_strip_cmd_from_markup(char *markup) |
| 9175 | 177 | { |
| 178 | guint len = strlen(markup); | |
| 179 | char *s = markup; | |
| 180 | ||
| 181 | while (*s) { | |
| 182 | gunichar c = g_utf8_get_char(s); | |
| 183 | ||
| 184 | if (c == '<') { | |
| 185 | s = strchr(s, '>'); | |
| 186 | if (!s) | |
| 187 | return; | |
| 188 | } else if (g_unichar_isspace(c)) { | |
| 15884 | 189 | purple_cmd_strip_current_char(c, s, len - (s - markup)); |
| 9175 | 190 | return; |
| 191 | } else { | |
| 15884 | 192 | purple_cmd_strip_current_char(c, s, len - (s - markup)); |
| 9175 | 193 | continue; |
| 194 | } | |
| 195 | s = g_utf8_next_char(s); | |
| 196 | } | |
| 197 | } | |
| 9597 | 198 | |
| 15884 | 199 | PurpleCmdStatus purple_cmd_do_command(PurpleConversation *conv, const gchar *cmdline, |
| 9175 | 200 | const gchar *markup, gchar **error) |
| 9130 | 201 | { |
| 15884 | 202 | PurpleCmd *c; |
| 9130 | 203 | GList *l; |
| 204 | gchar *err = NULL; | |
| 205 | gboolean is_im; | |
| 206 | gboolean found = FALSE, tried_cmd = FALSE, right_type = FALSE, right_prpl = FALSE; | |
| 207 | const gchar *prpl_id; | |
| 208 | gchar **args = NULL; | |
| 9175 | 209 | gchar *cmd, *rest, *mrest; |
| 15884 | 210 | PurpleCmdRet ret = PURPLE_CMD_RET_CONTINUE; |
| 9130 | 211 | |
| 9149 | 212 | *error = NULL; |
| 15884 | 213 | prpl_id = purple_account_get_protocol_id(purple_conversation_get_account(conv)); |
| 9130 | 214 | |
| 15884 | 215 | if (purple_conversation_get_type(conv) == PURPLE_CONV_TYPE_IM) |
| 9130 | 216 | is_im = TRUE; |
| 15884 | 217 | else if (purple_conversation_get_type(conv) == PURPLE_CONV_TYPE_CHAT) |
| 9130 | 218 | is_im = FALSE; |
| 219 | else | |
| 15884 | 220 | return PURPLE_CMD_STATUS_FAILED; |
| 9130 | 221 | |
| 222 | rest = strchr(cmdline, ' '); | |
| 223 | if (rest) { | |
| 224 | cmd = g_strndup(cmdline, rest - cmdline); | |
| 225 | rest++; | |
| 226 | } else { | |
| 227 | cmd = g_strdup(cmdline); | |
| 228 | rest = ""; | |
| 229 | } | |
| 230 | ||
| 9175 | 231 | mrest = g_strdup(markup); |
| 15884 | 232 | purple_cmd_strip_cmd_from_markup(mrest); |
| 9175 | 233 | |
| 9130 | 234 | for (l = cmds; l; l = l->next) { |
| 235 | c = l->data; | |
| 236 | ||
|
25859
b42be7bb9dac
Patch from Paul Aurich to add purple_strequal to help readability and simplicity of code. Ie, don't need to negate the value of strcmp, since this does a strcmp and does the negation for us
Paul Aurich <darkrain42@pidgin.im>
parents:
23555
diff
changeset
|
237 | if (!purple_strequal(c->cmd, cmd)) |
| 9130 | 238 | continue; |
| 239 | ||
| 240 | found = TRUE; | |
| 241 | ||
| 242 | if (is_im) | |
| 15884 | 243 | if (!(c->flags & PURPLE_CMD_FLAG_IM)) |
| 9130 | 244 | continue; |
| 245 | if (!is_im) | |
| 15884 | 246 | if (!(c->flags & PURPLE_CMD_FLAG_CHAT)) |
| 9130 | 247 | continue; |
| 248 | ||
| 249 | right_type = TRUE; | |
| 250 | ||
|
25859
b42be7bb9dac
Patch from Paul Aurich to add purple_strequal to help readability and simplicity of code. Ie, don't need to negate the value of strcmp, since this does a strcmp and does the negation for us
Paul Aurich <darkrain42@pidgin.im>
parents:
23555
diff
changeset
|
251 | if ((c->flags & PURPLE_CMD_FLAG_PRPL_ONLY) && |
|
b42be7bb9dac
Patch from Paul Aurich to add purple_strequal to help readability and simplicity of code. Ie, don't need to negate the value of strcmp, since this does a strcmp and does the negation for us
Paul Aurich <darkrain42@pidgin.im>
parents:
23555
diff
changeset
|
252 | !purple_strequal(c->prpl_id, prpl_id)) |
| 9130 | 253 | continue; |
| 254 | ||
| 255 | right_prpl = TRUE; | |
| 256 | ||
| 257 | /* this checks the allow bad args flag for us */ | |
| 15884 | 258 | if (!purple_cmd_parse_args(c, rest, mrest, &args)) { |
|
14097
0c340861ab79
[gaim-migrate @ 16638]
Mark Doliner <markdoliner@pidgin.im>
parents:
12014
diff
changeset
|
259 | g_strfreev(args); |
| 9130 | 260 | args = NULL; |
| 261 | continue; | |
| 262 | } | |
| 263 | ||
| 264 | tried_cmd = TRUE; | |
| 9597 | 265 | ret = c->func(conv, cmd, args, &err, c->data); |
| 15884 | 266 | if (ret == PURPLE_CMD_RET_CONTINUE) { |
|
14097
0c340861ab79
[gaim-migrate @ 16638]
Mark Doliner <markdoliner@pidgin.im>
parents:
12014
diff
changeset
|
267 | g_free(err); |
| 9149 | 268 | err = NULL; |
|
14097
0c340861ab79
[gaim-migrate @ 16638]
Mark Doliner <markdoliner@pidgin.im>
parents:
12014
diff
changeset
|
269 | g_strfreev(args); |
| 9130 | 270 | args = NULL; |
| 271 | continue; | |
| 272 | } else { | |
| 273 | break; | |
| 274 | } | |
| 275 | ||
| 276 | } | |
| 277 | ||
|
14097
0c340861ab79
[gaim-migrate @ 16638]
Mark Doliner <markdoliner@pidgin.im>
parents:
12014
diff
changeset
|
278 | g_strfreev(args); |
| 9130 | 279 | g_free(cmd); |
| 9175 | 280 | g_free(mrest); |
| 9130 | 281 | |
| 282 | if (!found) | |
| 15884 | 283 | return PURPLE_CMD_STATUS_NOT_FOUND; |
| 9130 | 284 | |
| 285 | if (!right_type) | |
| 15884 | 286 | return PURPLE_CMD_STATUS_WRONG_TYPE; |
| 9130 | 287 | if (!right_prpl) |
| 15884 | 288 | return PURPLE_CMD_STATUS_WRONG_PRPL; |
| 9130 | 289 | if (!tried_cmd) |
| 15884 | 290 | return PURPLE_CMD_STATUS_WRONG_ARGS; |
| 9130 | 291 | |
| 15884 | 292 | if (ret == PURPLE_CMD_RET_OK) { |
| 293 | return PURPLE_CMD_STATUS_OK; | |
| 9130 | 294 | } else { |
| 295 | *error = err; | |
| 15884 | 296 | if (ret == PURPLE_CMD_RET_CONTINUE) |
| 297 | return PURPLE_CMD_STATUS_NOT_FOUND; | |
| 9130 | 298 | else |
| 15884 | 299 | return PURPLE_CMD_STATUS_FAILED; |
| 9130 | 300 | } |
| 301 | ||
| 302 | } | |
| 303 | ||
| 304 | ||
| 15884 | 305 | GList *purple_cmd_list(PurpleConversation *conv) |
| 9130 | 306 | { |
| 307 | GList *ret = NULL; | |
| 15884 | 308 | PurpleCmd *c; |
| 9130 | 309 | GList *l; |
| 310 | ||
| 311 | for (l = cmds; l; l = l->next) { | |
| 312 | c = l->data; | |
| 313 | ||
| 15884 | 314 | if (conv && (purple_conversation_get_type(conv) == PURPLE_CONV_TYPE_IM)) |
| 315 | if (!(c->flags & PURPLE_CMD_FLAG_IM)) | |
| 9130 | 316 | continue; |
| 15884 | 317 | if (conv && (purple_conversation_get_type(conv) == PURPLE_CONV_TYPE_CHAT)) |
| 318 | if (!(c->flags & PURPLE_CMD_FLAG_CHAT)) | |
| 9130 | 319 | continue; |
| 320 | ||
|
25859
b42be7bb9dac
Patch from Paul Aurich to add purple_strequal to help readability and simplicity of code. Ie, don't need to negate the value of strcmp, since this does a strcmp and does the negation for us
Paul Aurich <darkrain42@pidgin.im>
parents:
23555
diff
changeset
|
321 | if (conv && (c->flags & PURPLE_CMD_FLAG_PRPL_ONLY) && |
|
b42be7bb9dac
Patch from Paul Aurich to add purple_strequal to help readability and simplicity of code. Ie, don't need to negate the value of strcmp, since this does a strcmp and does the negation for us
Paul Aurich <darkrain42@pidgin.im>
parents:
23555
diff
changeset
|
322 | !purple_strequal(c->prpl_id, purple_account_get_protocol_id(purple_conversation_get_account(conv)))) |
| 9130 | 323 | continue; |
| 324 | ||
| 325 | ret = g_list_append(ret, c->cmd); | |
| 326 | } | |
| 327 | ||
|
12014
8a45c4f43021
[gaim-migrate @ 14307]
Mark Doliner <markdoliner@pidgin.im>
parents:
11338
diff
changeset
|
328 | ret = g_list_sort(ret, (GCompareFunc)strcmp); |
|
8a45c4f43021
[gaim-migrate @ 14307]
Mark Doliner <markdoliner@pidgin.im>
parents:
11338
diff
changeset
|
329 | |
| 9130 | 330 | return ret; |
| 331 | } | |
| 332 | ||
| 333 | ||
| 15884 | 334 | GList *purple_cmd_help(PurpleConversation *conv, const gchar *cmd) |
| 9130 | 335 | { |
| 336 | GList *ret = NULL; | |
| 15884 | 337 | PurpleCmd *c; |
| 9130 | 338 | GList *l; |
| 339 | ||
| 340 | for (l = cmds; l; l = l->next) { | |
| 341 | c = l->data; | |
| 342 | ||
|
25859
b42be7bb9dac
Patch from Paul Aurich to add purple_strequal to help readability and simplicity of code. Ie, don't need to negate the value of strcmp, since this does a strcmp and does the negation for us
Paul Aurich <darkrain42@pidgin.im>
parents:
23555
diff
changeset
|
343 | if (cmd && !purple_strequal(cmd, c->cmd)) |
| 9130 | 344 | continue; |
| 345 | ||
| 15884 | 346 | if (conv && (purple_conversation_get_type(conv) == PURPLE_CONV_TYPE_IM)) |
| 347 | if (!(c->flags & PURPLE_CMD_FLAG_IM)) | |
| 9130 | 348 | continue; |
| 15884 | 349 | if (conv && (purple_conversation_get_type(conv) == PURPLE_CONV_TYPE_CHAT)) |
| 350 | if (!(c->flags & PURPLE_CMD_FLAG_CHAT)) | |
| 9130 | 351 | continue; |
| 352 | ||
|
25859
b42be7bb9dac
Patch from Paul Aurich to add purple_strequal to help readability and simplicity of code. Ie, don't need to negate the value of strcmp, since this does a strcmp and does the negation for us
Paul Aurich <darkrain42@pidgin.im>
parents:
23555
diff
changeset
|
353 | if (conv && (c->flags & PURPLE_CMD_FLAG_PRPL_ONLY) && |
|
b42be7bb9dac
Patch from Paul Aurich to add purple_strequal to help readability and simplicity of code. Ie, don't need to negate the value of strcmp, since this does a strcmp and does the negation for us
Paul Aurich <darkrain42@pidgin.im>
parents:
23555
diff
changeset
|
354 | !purple_strequal(c->prpl_id, purple_account_get_protocol_id(purple_conversation_get_account(conv)))) |
| 9130 | 355 | continue; |
| 356 | ||
| 357 | ret = g_list_append(ret, c->help); | |
| 358 | } | |
| 359 | ||
|
12014
8a45c4f43021
[gaim-migrate @ 14307]
Mark Doliner <markdoliner@pidgin.im>
parents:
11338
diff
changeset
|
360 | ret = g_list_sort(ret, (GCompareFunc)strcmp); |
|
8a45c4f43021
[gaim-migrate @ 14307]
Mark Doliner <markdoliner@pidgin.im>
parents:
11338
diff
changeset
|
361 | |
| 9130 | 362 | return ret; |
| 363 | } | |
| 364 | ||
|
23555
82dab41b4163
cmd-added and cmd-removed signals to emit when commands are registered/unregistered.
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents:
20147
diff
changeset
|
365 | gpointer purple_cmds_get_handle(void) |
|
82dab41b4163
cmd-added and cmd-removed signals to emit when commands are registered/unregistered.
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents:
20147
diff
changeset
|
366 | { |
|
82dab41b4163
cmd-added and cmd-removed signals to emit when commands are registered/unregistered.
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents:
20147
diff
changeset
|
367 | static int handle; |
|
82dab41b4163
cmd-added and cmd-removed signals to emit when commands are registered/unregistered.
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents:
20147
diff
changeset
|
368 | return &handle; |
|
82dab41b4163
cmd-added and cmd-removed signals to emit when commands are registered/unregistered.
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents:
20147
diff
changeset
|
369 | } |
|
82dab41b4163
cmd-added and cmd-removed signals to emit when commands are registered/unregistered.
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents:
20147
diff
changeset
|
370 | |
|
82dab41b4163
cmd-added and cmd-removed signals to emit when commands are registered/unregistered.
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents:
20147
diff
changeset
|
371 | void purple_cmds_init(void) |
|
82dab41b4163
cmd-added and cmd-removed signals to emit when commands are registered/unregistered.
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents:
20147
diff
changeset
|
372 | { |
|
82dab41b4163
cmd-added and cmd-removed signals to emit when commands are registered/unregistered.
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents:
20147
diff
changeset
|
373 | gpointer handle = purple_cmds_get_handle(); |
|
82dab41b4163
cmd-added and cmd-removed signals to emit when commands are registered/unregistered.
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents:
20147
diff
changeset
|
374 | |
|
82dab41b4163
cmd-added and cmd-removed signals to emit when commands are registered/unregistered.
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents:
20147
diff
changeset
|
375 | purple_signal_register(handle, "cmd-added", |
|
82dab41b4163
cmd-added and cmd-removed signals to emit when commands are registered/unregistered.
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents:
20147
diff
changeset
|
376 | purple_marshal_VOID__POINTER_INT_INT, NULL, 3, |
|
82dab41b4163
cmd-added and cmd-removed signals to emit when commands are registered/unregistered.
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents:
20147
diff
changeset
|
377 | purple_value_new(PURPLE_TYPE_STRING), |
|
82dab41b4163
cmd-added and cmd-removed signals to emit when commands are registered/unregistered.
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents:
20147
diff
changeset
|
378 | purple_value_new(PURPLE_TYPE_INT), |
|
82dab41b4163
cmd-added and cmd-removed signals to emit when commands are registered/unregistered.
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents:
20147
diff
changeset
|
379 | purple_value_new(PURPLE_TYPE_INT)); |
|
82dab41b4163
cmd-added and cmd-removed signals to emit when commands are registered/unregistered.
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents:
20147
diff
changeset
|
380 | purple_signal_register(handle, "cmd-removed", |
|
82dab41b4163
cmd-added and cmd-removed signals to emit when commands are registered/unregistered.
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents:
20147
diff
changeset
|
381 | purple_marshal_VOID__POINTER, NULL, 1, |
|
82dab41b4163
cmd-added and cmd-removed signals to emit when commands are registered/unregistered.
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents:
20147
diff
changeset
|
382 | purple_value_new(PURPLE_TYPE_STRING)); |
|
82dab41b4163
cmd-added and cmd-removed signals to emit when commands are registered/unregistered.
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents:
20147
diff
changeset
|
383 | } |
|
82dab41b4163
cmd-added and cmd-removed signals to emit when commands are registered/unregistered.
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents:
20147
diff
changeset
|
384 | |
|
82dab41b4163
cmd-added and cmd-removed signals to emit when commands are registered/unregistered.
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents:
20147
diff
changeset
|
385 | void purple_cmds_uninit(void) |
|
82dab41b4163
cmd-added and cmd-removed signals to emit when commands are registered/unregistered.
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents:
20147
diff
changeset
|
386 | { |
|
82dab41b4163
cmd-added and cmd-removed signals to emit when commands are registered/unregistered.
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents:
20147
diff
changeset
|
387 | purple_signals_unregister_by_instance(purple_cmds_get_handle()); |
|
32438
dc8991868906
A boring and large patch so I can merge heads.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
28981
diff
changeset
|
388 | |
|
dc8991868906
A boring and large patch so I can merge heads.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
28981
diff
changeset
|
389 | while (cmds) { |
|
dc8991868906
A boring and large patch so I can merge heads.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
28981
diff
changeset
|
390 | purple_cmd_free(cmds->data); |
|
dc8991868906
A boring and large patch so I can merge heads.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
28981
diff
changeset
|
391 | cmds = g_list_delete_link(cmds, cmds); |
|
dc8991868906
A boring and large patch so I can merge heads.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
28981
diff
changeset
|
392 | } |
|
23555
82dab41b4163
cmd-added and cmd-removed signals to emit when commands are registered/unregistered.
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents:
20147
diff
changeset
|
393 | } |
|
82dab41b4163
cmd-added and cmd-removed signals to emit when commands are registered/unregistered.
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents:
20147
diff
changeset
|
394 |