pidgin/pidgincommands.c

Thu, 23 Mar 2023 23:11:59 -0500

author
Elliott Sales de Andrade <quantum.analyst@gmail.com>
date
Thu, 23 Mar 2023 23:11:59 -0500
changeset 42184
4e1bf25f5575
parent 42070
5d5363c55331
child 42341
cc9e9b7c040a
permissions
-rw-r--r--

Fix several leaks in tests

All of these are specific to tests, not the library code.

For the moment, `protocol_xfer` still leaks connections (and anything they hold on to) because it is very difficult to disentangle them from the connection manager in the partially implemented state they are in.

This fixes leaks of options in the account option test (these two leaks occur for every test since they all leak the option):
```
61 (48 direct, 13 indirect) bytes in 1 blocks are definitely lost in loss record 133 of 276
at 0x4848464: calloc (vg_replace_malloc.c:1340)
by 0x49F75F0: g_malloc0 (gmem.c:163)
by 0x48C3B2E: purple_account_option_new (purpleaccountoption.c:78)
by 0x4014AF: test_purple_account_option_copy_int (test_account_option.c:67)
by 0x4A1CC7D: UnknownInlinedFun (gtestutils.c:2933)
by 0x4A1CC7D: g_test_run_suite_internal (gtestutils.c:3021)
by 0x4A1C9E4: g_test_run_suite_internal (gtestutils.c:3038)
by 0x4A1C9E4: g_test_run_suite_internal (gtestutils.c:3038)
by 0x4A1D181: g_test_run_suite (gtestutils.c:3115)
by 0x4A156EC: UnknownInlinedFun (gtestutils.c:2234)
by 0x4A156EC: g_test_run (gtestutils.c:2221)
by 0x401721: main (test_account_option.c:157)

61 (48 direct, 13 indirect) bytes in 1 blocks are definitely lost in loss record 134 of 276
at 0x4848464: calloc (vg_replace_malloc.c:1340)
by 0x49F75F0: g_malloc0 (gmem.c:163)
by 0x48C3BC7: purple_account_option_copy (purpleaccountoption.c:93)
by 0x4014BF: test_purple_account_option_copy_int (test_account_option.c:68)
by 0x4A1CC7D: UnknownInlinedFun (gtestutils.c:2933)
by 0x4A1CC7D: g_test_run_suite_internal (gtestutils.c:3021)
by 0x4A1C9E4: g_test_run_suite_internal (gtestutils.c:3038)
by 0x4A1C9E4: g_test_run_suite_internal (gtestutils.c:3038)
by 0x4A1D181: g_test_run_suite (gtestutils.c:3115)
by 0x4A156EC: UnknownInlinedFun (gtestutils.c:2234)
by 0x4A156EC: g_test_run (gtestutils.c:2221)
by 0x401721: main (test_account_option.c:157)
```
leaks in the credential manager test (times 3 for read/write/cancel tests):
```
69 (16 direct, 53 indirect) bytes in 1 blocks are definitely lost in loss record 2,427 of 3,503
at 0x484386F: malloc (vg_replace_malloc.c:393)
by 0x4A58168: g_malloc (gmem.c:130)
by 0x4A6FAB5: g_slice_alloc (gslice.c:1074)
by 0x4A700EC: g_slice_alloc0 (gslice.c:1100)
by 0x4A3BECB: g_error_allocate (gerror.c:710)
by 0x4A3C93F: UnknownInlinedFun (gerror.c:724)
by 0x4A3C93F: g_error_new_valist (gerror.c:766)
by 0x4BEE558: g_task_return_new_error (gtask.c:1941)
by 0x48D82C0: purple_credential_manager_read_password_async (purplecredentialmanager.c:492)
by 0x403634: test_purple_credential_manager_no_provider_read_password_idle (test_credential_manager.c:329)
by 0x4A4ECB1: g_idle_dispatch (gmain.c:6124)
by 0x4A4FCBE: UnknownInlinedFun (gmain.c:3444)
by 0x4A4FCBE: g_main_context_dispatch (gmain.c:4162)
by 0x4AA5597: g_main_context_iterate.constprop.0 (gmain.c:4238)
by 0x4A4F28E: g_main_loop_run (gmain.c:4438)
by 0x40369F: test_purple_credential_manager_no_provider_read_password_async (test_credential_manager.c:345)
by 0x4A7DC7D: UnknownInlinedFun (gtestutils.c:2933)
by 0x4A7DC7D: g_test_run_suite_internal (gtestutils.c:3021)
by 0x4A7D9E4: g_test_run_suite_internal (gtestutils.c:3038)
by 0x4A7D9E4: g_test_run_suite_internal (gtestutils.c:3038)
by 0x4A7E181: g_test_run_suite (gtestutils.c:3115)
by 0x4A766EC: UnknownInlinedFun (gtestutils.c:2234)
by 0x4A766EC: g_test_run (gtestutils.c:2221)
by 0x4048F6: main (test_credential_manager.c:695)
```
a leak in the image test:
```
161 bytes in 1 blocks are definitely lost in loss record 260 of 274
at 0x484386F: malloc (vg_replace_malloc.c:393)
by 0x4A55363: g_try_malloc (gmem.c:286)
by 0x4A3D630: UnknownInlinedFun (gfileutils.c:819)
by 0x4A3D630: UnknownInlinedFun (gfileutils.c:924)
by 0x4A3D630: g_file_get_contents (gfileutils.c:1027)
by 0x401890: test_image_new_from_file (test_image.c:144)
by 0x4A7DC7D: UnknownInlinedFun (gtestutils.c:2933)
by 0x4A7DC7D: g_test_run_suite_internal (gtestutils.c:3021)
by 0x4A7D9E4: g_test_run_suite_internal (gtestutils.c:3038)
by 0x4A7E181: g_test_run_suite (gtestutils.c:3115)
by 0x4A766EC: UnknownInlinedFun (gtestutils.c:2234)
by 0x4A766EC: g_test_run (gtestutils.c:2221)
by 0x40195D: main (test_image.c:172)
```
a leak in queued output stream test:
```
72 (40 direct, 32 indirect) bytes in 1 blocks are definitely lost in loss record 219 of 396
at 0x49D51EF: g_type_create_instance (gtype.c:1909)
by 0x49BAC1F: g_object_new_internal (gobject.c:2228)
by 0x49BC247: g_object_new_with_properties (gobject.c:2391)
by 0x49BCFF0: g_object_new (gobject.c:2037)
by 0x402003: test_queued_output_stream_push_bytes_async_error (test_queued_output_stream.c:219)
by 0x4A7DC7D: UnknownInlinedFun (gtestutils.c:2933)
by 0x4A7DC7D: g_test_run_suite_internal (gtestutils.c:3021)
by 0x4A7D9E4: g_test_run_suite_internal (gtestutils.c:3038)
by 0x4A7E181: g_test_run_suite (gtestutils.c:3115)
by 0x4A766EC: UnknownInlinedFun (gtestutils.c:2234)
by 0x4A766EC: g_test_run (gtestutils.c:2221)
by 0x402429: main (test_queued_output_stream.c:280)
```
and protocol xfer tests (times 3 for each test that creates a test protocol object):
```
112 (48 direct, 64 indirect) bytes in 1 blocks are definitely lost in loss record 3,430 of 3,698
at 0x49D51EF: g_type_create_instance (gtype.c:1909)
by 0x49BAC1F: g_object_new_internal (gobject.c:2228)
by 0x49BC247: g_object_new_with_properties (gobject.c:2391)
by 0x49BCFF0: g_object_new (gobject.c:2037)
by 0x40291C: test_purple_protocol_xfer_send_file_func (test_protocol_xfer.c:146)
by 0x4A7DC7D: UnknownInlinedFun (gtestutils.c:2933)
by 0x4A7DC7D: g_test_run_suite_internal (gtestutils.c:3021)
by 0x4A7D9E4: g_test_run_suite_internal (gtestutils.c:3038)
by 0x4A7E181: g_test_run_suite (gtestutils.c:3115)
by 0x4A766EC: UnknownInlinedFun (gtestutils.c:2234)
by 0x4A766EC: g_test_run (gtestutils.c:2221)
by 0x402B64: main (test_protocol_xfer.c:195)
```
and util tests (times 3 for each call to `purple_text_strip_mnemonic` in the test):
```
5 bytes in 1 blocks are definitely lost in loss record 5 of 247
at 0x484386F: malloc (vg_replace_malloc.c:393)
by 0x49F7168: g_malloc (gmem.c:130)
by 0x491975B: purple_text_strip_mnemonic (util.c:895)
by 0x4015B0: test_util_text_strip_mnemonic (test_util.c:49)
by 0x4A1CC7D: UnknownInlinedFun (gtestutils.c:2933)
by 0x4A1CC7D: g_test_run_suite_internal (gtestutils.c:3021)
by 0x4A1C9E4: g_test_run_suite_internal (gtestutils.c:3038)
by 0x4A1C9E4: g_test_run_suite_internal (gtestutils.c:3038)
by 0x4A1D181: g_test_run_suite (gtestutils.c:3115)
by 0x4A156EC: UnknownInlinedFun (gtestutils.c:2234)
by 0x4A156EC: g_test_run (gtestutils.c:2221)
by 0x401901: main (test_util.c:224)
```
and these leaks in any test that initializes the test UI:
```
4,104 bytes in 1 blocks are possibly lost in loss record 3,451 of 3,457
at 0x484386F: malloc (vg_replace_malloc.c:393)
by 0x5235B67: sqlite3MemMalloc.lto_priv.0 (sqlite3.c:25493)
by 0x5232797: UnknownInlinedFun (sqlite3.c:29181)
by 0x5232797: UnknownInlinedFun (sqlite3.c:29227)
by 0x5232797: sqlite3Malloc.lto_priv.0 (sqlite3.c:29221)
by 0x523BD8B: pcache1Alloc.lto_priv.0 (sqlite3.c:53546)
by 0x5249A8B: UnknownInlinedFun (sqlite3.c:53675)
by 0x5249A8B: allocateTempSpace (sqlite3.c:70848)
by 0x52625A6: sqlite3VdbeExec.lto_priv.0 (sqlite3.c:93857)
by 0x525CBEE: UnknownInlinedFun (sqlite3.c:87995)
by 0x525CBEE: UnknownInlinedFun (sqlite3.c:88056)
by 0x525CBEE: sqlite3_step (sqlite3.c:88045)
by 0x529B324: sqlite3_exec (sqlite3.c:131002)
by 0x48FD558: purple_sqlite3_run_migration (purplesqlite3.c:37)
by 0x48FDBB4: purple_sqlite3_run_migrations_from_resources (purplesqlite3.c:195)
by 0x48FDED9: purple_sqlite_history_adapter_run_migrations (purplesqlitehistoryadapter.c:69)
by 0x48FE7F0: purple_sqlite_history_adapter_activate (purplesqlitehistoryadapter.c:287)
by 0x48DB656: purple_history_adapter_activate (purplehistoryadapter.c:181)
by 0x48DC9BC: purple_history_manager_set_active (purplehistorymanager.c:308)
by 0x402BA8: test_ui_init_history (test_ui.c:132)
by 0x402C80: test_ui_purple_init (test_ui.c:167)
by 0x4027BB: main (test_contact.c:88)

4,368 bytes in 1 blocks are possibly lost in loss record 3,453 of 3,457
at 0x484386F: malloc (vg_replace_malloc.c:393)
by 0x5235B67: sqlite3MemMalloc.lto_priv.0 (sqlite3.c:25493)
by 0x5232797: UnknownInlinedFun (sqlite3.c:29181)
by 0x5232797: UnknownInlinedFun (sqlite3.c:29227)
by 0x5232797: sqlite3Malloc.lto_priv.0 (sqlite3.c:29221)
by 0x523BD8B: pcache1Alloc.lto_priv.0 (sqlite3.c:53546)
by 0x5240077: UnknownInlinedFun (sqlite3.c:53634)
by 0x5240077: pcache1FetchStage2 (sqlite3.c:54104)
by 0x5243E9C: UnknownInlinedFun (sqlite3.c:52671)
by 0x5243E9C: getPageNormal.lto_priv.0 (sqlite3.c:60628)
by 0x524A510: UnknownInlinedFun (sqlite3.c:60805)
by 0x524A510: btreeGetPage.lto_priv.0 (sqlite3.c:70289)
by 0x524C2F6: UnknownInlinedFun (sqlite3.c:71257)
by 0x524C2F6: sqlite3BtreeBeginTrans.lto_priv.0 (sqlite3.c:71647)
by 0x5266B3A: sqlite3VdbeExec.lto_priv.0 (sqlite3.c:93532)
by 0x525CBEE: UnknownInlinedFun (sqlite3.c:87995)
by 0x525CBEE: UnknownInlinedFun (sqlite3.c:88056)
by 0x525CBEE: sqlite3_step (sqlite3.c:88045)
by 0x48FD715: purple_sqlite3_get_schema_version (purplesqlite3.c:79)
by 0x48FD9DD: purple_sqlite3_run_migrations_from_resources (purplesqlite3.c:146)
by 0x48FDED9: purple_sqlite_history_adapter_run_migrations (purplesqlitehistoryadapter.c:69)
by 0x48FE7F0: purple_sqlite_history_adapter_activate (purplesqlitehistoryadapter.c:287)
by 0x48DB656: purple_history_adapter_activate (purplehistoryadapter.c:181)
by 0x48DC9BC: purple_history_manager_set_active (purplehistorymanager.c:308)
by 0x402BA8: test_ui_init_history (test_ui.c:132)
by 0x402C80: test_ui_purple_init (test_ui.c:167)
by 0x4027BB: main (test_contact.c:88)

4,368 bytes in 1 blocks are possibly lost in loss record 3,454 of 3,457
at 0x484386F: malloc (vg_replace_malloc.c:393)
by 0x5235B67: sqlite3MemMalloc.lto_priv.0 (sqlite3.c:25493)
by 0x5232797: UnknownInlinedFun (sqlite3.c:29181)
by 0x5232797: UnknownInlinedFun (sqlite3.c:29227)
by 0x5232797: sqlite3Malloc.lto_priv.0 (sqlite3.c:29221)
by 0x523BD8B: pcache1Alloc.lto_priv.0 (sqlite3.c:53546)
by 0x5240077: UnknownInlinedFun (sqlite3.c:53634)
by 0x5240077: pcache1FetchStage2 (sqlite3.c:54104)
by 0x5243E9C: UnknownInlinedFun (sqlite3.c:52671)
by 0x5243E9C: getPageNormal.lto_priv.0 (sqlite3.c:60628)
by 0x52499BC: UnknownInlinedFun (sqlite3.c:60805)
by 0x52499BC: UnknownInlinedFun (sqlite3.c:70289)
by 0x52499BC: btreeGetUnusedPage (sqlite3.c:70432)
by 0x524F504: allocateBtreePage.lto_priv.0 (sqlite3.c:74604)
by 0x5256209: btreeCreateTable.lto_priv.0 (sqlite3.c:77830)
by 0x5265EB2: UnknownInlinedFun (sqlite3.c:77849)
by 0x5265EB2: sqlite3VdbeExec.lto_priv.0 (sqlite3.c:96382)
by 0x525CBEE: UnknownInlinedFun (sqlite3.c:87995)
by 0x525CBEE: UnknownInlinedFun (sqlite3.c:88056)
by 0x525CBEE: sqlite3_step (sqlite3.c:88045)
by 0x529B324: sqlite3_exec (sqlite3.c:131002)
by 0x48FD558: purple_sqlite3_run_migration (purplesqlite3.c:37)
by 0x48FDBB4: purple_sqlite3_run_migrations_from_resources (purplesqlite3.c:195)
by 0x48FDED9: purple_sqlite_history_adapter_run_migrations (purplesqlitehistoryadapter.c:69)
by 0x48FE7F0: purple_sqlite_history_adapter_activate (purplesqlitehistoryadapter.c:287)
by 0x48DB656: purple_history_adapter_activate (purplehistoryadapter.c:181)
by 0x48DC9BC: purple_history_manager_set_active (purplehistorymanager.c:308)
by 0x402BA8: test_ui_init_history (test_ui.c:132)
by 0x402C80: test_ui_purple_init (test_ui.c:167)
by 0x4027BB: main (test_contact.c:88)
```

Testing Done:
Ran tests in valgrind, and all above leaks were gone except for noted `protocol_xfer` issues, and a bunch of leaks of the `PurpleBuddy`-`PurpleContact` compatibility bindings, which will go away in their entirety eventually.

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

40871
7c5b89b33e19 Separate the conversation commands out to their own file
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
1 /*
7c5b89b33e19 Separate the conversation commands out to their own file
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
2 * Pidgin - Internet Messenger
7c5b89b33e19 Separate the conversation commands out to their own file
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
3 * Copyright (C) Pidgin Developers <devel@pidgin.im>
7c5b89b33e19 Separate the conversation commands out to their own file
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
4 *
7c5b89b33e19 Separate the conversation commands out to their own file
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
5 * Pidgin is the legal property of its developers, whose names are too numerous
7c5b89b33e19 Separate the conversation commands out to their own file
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
6 * to list here. Please refer to the COPYRIGHT file distributed with this
7c5b89b33e19 Separate the conversation commands out to their own file
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
7 * source distribution.
7c5b89b33e19 Separate the conversation commands out to their own file
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
8 *
7c5b89b33e19 Separate the conversation commands out to their own file
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
9 * This program is free software; you can redistribute it and/or modify
7c5b89b33e19 Separate the conversation commands out to their own file
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
10 * it under the terms of the GNU General Public License as published by
7c5b89b33e19 Separate the conversation commands out to their own file
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
11 * the Free Software Foundation; either version 2 of the License, or
7c5b89b33e19 Separate the conversation commands out to their own file
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
12 * (at your option) any later version.
7c5b89b33e19 Separate the conversation commands out to their own file
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
13 *
7c5b89b33e19 Separate the conversation commands out to their own file
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
14 * This program is distributed in the hope that it will be useful,
7c5b89b33e19 Separate the conversation commands out to their own file
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
7c5b89b33e19 Separate the conversation commands out to their own file
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
7c5b89b33e19 Separate the conversation commands out to their own file
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
17 * GNU General Public License for more details.
7c5b89b33e19 Separate the conversation commands out to their own file
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
18 *
7c5b89b33e19 Separate the conversation commands out to their own file
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
19 * You should have received a copy of the GNU General Public License
7c5b89b33e19 Separate the conversation commands out to their own file
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
20 * along with this program; if not, see <https://www.gnu.org/licenses/>.
7c5b89b33e19 Separate the conversation commands out to their own file
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
21 */
7c5b89b33e19 Separate the conversation commands out to their own file
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
22
7c5b89b33e19 Separate the conversation commands out to their own file
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
23 #include <glib/gi18n-lib.h>
7c5b89b33e19 Separate the conversation commands out to their own file
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
24
7c5b89b33e19 Separate the conversation commands out to their own file
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
25 #include <pidginprivate.h>
7c5b89b33e19 Separate the conversation commands out to their own file
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
26
7c5b89b33e19 Separate the conversation commands out to their own file
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
27 /******************************************************************************
7c5b89b33e19 Separate the conversation commands out to their own file
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
28 * Command Implementations
7c5b89b33e19 Separate the conversation commands out to their own file
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
29 *****************************************************************************/
7c5b89b33e19 Separate the conversation commands out to their own file
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
30 static PurpleCmdRet
41947
7b3312d0760c Bump C standard to C99 for Pidgin files and fix warnings
Elliott Sales de Andrade <quantum.analyst@gmail.com>
parents: 40952
diff changeset
31 say_command_cb(PurpleConversation *conv, G_GNUC_UNUSED const char *cmd,
7b3312d0760c Bump C standard to C99 for Pidgin files and fix warnings
Elliott Sales de Andrade <quantum.analyst@gmail.com>
parents: 40952
diff changeset
32 char **args, G_GNUC_UNUSED char **error,
7b3312d0760c Bump C standard to C99 for Pidgin files and fix warnings
Elliott Sales de Andrade <quantum.analyst@gmail.com>
parents: 40952
diff changeset
33 G_GNUC_UNUSED gpointer data)
40871
7c5b89b33e19 Separate the conversation commands out to their own file
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
34 {
7c5b89b33e19 Separate the conversation commands out to their own file
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
35 purple_conversation_send(conv, args[0]);
7c5b89b33e19 Separate the conversation commands out to their own file
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
36
7c5b89b33e19 Separate the conversation commands out to their own file
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
37 return PURPLE_CMD_RET_OK;
7c5b89b33e19 Separate the conversation commands out to their own file
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
38 }
7c5b89b33e19 Separate the conversation commands out to their own file
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
39
7c5b89b33e19 Separate the conversation commands out to their own file
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
40 static PurpleCmdRet
41947
7b3312d0760c Bump C standard to C99 for Pidgin files and fix warnings
Elliott Sales de Andrade <quantum.analyst@gmail.com>
parents: 40952
diff changeset
41 me_command_cb(PurpleConversation *conv, G_GNUC_UNUSED const char *cmd,
7b3312d0760c Bump C standard to C99 for Pidgin files and fix warnings
Elliott Sales de Andrade <quantum.analyst@gmail.com>
parents: 40952
diff changeset
42 char **args, G_GNUC_UNUSED char **error,
7b3312d0760c Bump C standard to C99 for Pidgin files and fix warnings
Elliott Sales de Andrade <quantum.analyst@gmail.com>
parents: 40952
diff changeset
43 G_GNUC_UNUSED gpointer data)
40871
7c5b89b33e19 Separate the conversation commands out to their own file
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
44 {
7c5b89b33e19 Separate the conversation commands out to their own file
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
45 char *tmp;
7c5b89b33e19 Separate the conversation commands out to their own file
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
46
7c5b89b33e19 Separate the conversation commands out to their own file
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
47 tmp = g_strdup_printf("/me %s", args[0]);
7c5b89b33e19 Separate the conversation commands out to their own file
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
48 purple_conversation_send(conv, tmp);
7c5b89b33e19 Separate the conversation commands out to their own file
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
49
7c5b89b33e19 Separate the conversation commands out to their own file
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
50 g_free(tmp);
7c5b89b33e19 Separate the conversation commands out to their own file
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
51 return PURPLE_CMD_RET_OK;
7c5b89b33e19 Separate the conversation commands out to their own file
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
52 }
7c5b89b33e19 Separate the conversation commands out to their own file
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
53
7c5b89b33e19 Separate the conversation commands out to their own file
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
54 static PurpleCmdRet
41947
7b3312d0760c Bump C standard to C99 for Pidgin files and fix warnings
Elliott Sales de Andrade <quantum.analyst@gmail.com>
parents: 40952
diff changeset
55 debug_command_cb(PurpleConversation *conv, G_GNUC_UNUSED const char *cmd,
7b3312d0760c Bump C standard to C99 for Pidgin files and fix warnings
Elliott Sales de Andrade <quantum.analyst@gmail.com>
parents: 40952
diff changeset
56 char **args, G_GNUC_UNUSED char **error,
7b3312d0760c Bump C standard to C99 for Pidgin files and fix warnings
Elliott Sales de Andrade <quantum.analyst@gmail.com>
parents: 40952
diff changeset
57 G_GNUC_UNUSED gpointer data)
40871
7c5b89b33e19 Separate the conversation commands out to their own file
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
58 {
7c5b89b33e19 Separate the conversation commands out to their own file
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
59 char *tmp, *markup;
7c5b89b33e19 Separate the conversation commands out to their own file
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
60
7c5b89b33e19 Separate the conversation commands out to their own file
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
61 if (!g_ascii_strcasecmp(args[0], "version")) {
7c5b89b33e19 Separate the conversation commands out to their own file
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
62 tmp = g_strdup_printf("Using Pidgin v%s with libpurple v%s.",
7c5b89b33e19 Separate the conversation commands out to their own file
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
63 DISPLAY_VERSION, purple_core_get_version());
7c5b89b33e19 Separate the conversation commands out to their own file
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
64 } else if (!g_ascii_strcasecmp(args[0], "plugins")) {
7c5b89b33e19 Separate the conversation commands out to their own file
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
65 /* Show all the loaded plugins, including plugins marked internal.
7c5b89b33e19 Separate the conversation commands out to their own file
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
66 * This is intentional, since third party protocols are often sources of bugs, and some
7c5b89b33e19 Separate the conversation commands out to their own file
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
67 * plugin loaders can also be buggy.
7c5b89b33e19 Separate the conversation commands out to their own file
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
68 */
7c5b89b33e19 Separate the conversation commands out to their own file
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
69 GString *str = g_string_new("Loaded Plugins: ");
7c5b89b33e19 Separate the conversation commands out to their own file
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
70 const GList *plugins = purple_plugins_get_loaded();
7c5b89b33e19 Separate the conversation commands out to their own file
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
71 if (plugins) {
7c5b89b33e19 Separate the conversation commands out to their own file
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
72 for (; plugins; plugins = plugins->next) {
7c5b89b33e19 Separate the conversation commands out to their own file
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
73 GPluginPluginInfo *info = GPLUGIN_PLUGIN_INFO(
7c5b89b33e19 Separate the conversation commands out to their own file
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
74 purple_plugin_get_info(
7c5b89b33e19 Separate the conversation commands out to their own file
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
75 PURPLE_PLUGIN(plugins->data)));
7c5b89b33e19 Separate the conversation commands out to their own file
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
76 str = g_string_append(
7c5b89b33e19 Separate the conversation commands out to their own file
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
77 str,
7c5b89b33e19 Separate the conversation commands out to their own file
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
78 gplugin_plugin_info_get_name(info));
7c5b89b33e19 Separate the conversation commands out to their own file
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
79
7c5b89b33e19 Separate the conversation commands out to their own file
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
80 if (plugins->next)
7c5b89b33e19 Separate the conversation commands out to their own file
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
81 str = g_string_append(str, ", ");
7c5b89b33e19 Separate the conversation commands out to their own file
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
82 }
7c5b89b33e19 Separate the conversation commands out to their own file
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
83 } else {
7c5b89b33e19 Separate the conversation commands out to their own file
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
84 str = g_string_append(str, "(none)");
7c5b89b33e19 Separate the conversation commands out to their own file
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
85 }
7c5b89b33e19 Separate the conversation commands out to their own file
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
86
7c5b89b33e19 Separate the conversation commands out to their own file
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
87 tmp = g_string_free(str, FALSE);
7c5b89b33e19 Separate the conversation commands out to their own file
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
88 } else if (!g_ascii_strcasecmp(args[0], "unsafe")) {
7c5b89b33e19 Separate the conversation commands out to their own file
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
89 if (purple_debug_is_unsafe()) {
7c5b89b33e19 Separate the conversation commands out to their own file
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
90 purple_debug_set_unsafe(FALSE);
7c5b89b33e19 Separate the conversation commands out to their own file
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
91 purple_conversation_write_system_message(conv,
7c5b89b33e19 Separate the conversation commands out to their own file
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
92 _("Unsafe debugging is now disabled."),
7c5b89b33e19 Separate the conversation commands out to their own file
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
93 PURPLE_MESSAGE_NO_LOG);
7c5b89b33e19 Separate the conversation commands out to their own file
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
94 } else {
7c5b89b33e19 Separate the conversation commands out to their own file
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
95 purple_debug_set_unsafe(TRUE);
7c5b89b33e19 Separate the conversation commands out to their own file
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
96 purple_conversation_write_system_message(conv,
7c5b89b33e19 Separate the conversation commands out to their own file
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
97 _("Unsafe debugging is now enabled."),
7c5b89b33e19 Separate the conversation commands out to their own file
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
98 PURPLE_MESSAGE_NO_LOG);
7c5b89b33e19 Separate the conversation commands out to their own file
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
99 }
7c5b89b33e19 Separate the conversation commands out to their own file
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
100
7c5b89b33e19 Separate the conversation commands out to their own file
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
101 return PURPLE_CMD_RET_OK;
7c5b89b33e19 Separate the conversation commands out to their own file
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
102 } else if (!g_ascii_strcasecmp(args[0], "verbose")) {
7c5b89b33e19 Separate the conversation commands out to their own file
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
103 if (purple_debug_is_verbose()) {
7c5b89b33e19 Separate the conversation commands out to their own file
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
104 purple_debug_set_verbose(FALSE);
7c5b89b33e19 Separate the conversation commands out to their own file
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
105 purple_conversation_write_system_message(conv,
7c5b89b33e19 Separate the conversation commands out to their own file
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
106 _("Verbose debugging is now disabled."),
7c5b89b33e19 Separate the conversation commands out to their own file
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
107 PURPLE_MESSAGE_NO_LOG);
7c5b89b33e19 Separate the conversation commands out to their own file
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
108 } else {
7c5b89b33e19 Separate the conversation commands out to their own file
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
109 purple_debug_set_verbose(TRUE);
7c5b89b33e19 Separate the conversation commands out to their own file
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
110 purple_conversation_write_system_message(conv,
7c5b89b33e19 Separate the conversation commands out to their own file
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
111 _("Verbose debugging is now enabled."),
7c5b89b33e19 Separate the conversation commands out to their own file
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
112 PURPLE_MESSAGE_NO_LOG);
7c5b89b33e19 Separate the conversation commands out to their own file
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
113 }
7c5b89b33e19 Separate the conversation commands out to their own file
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
114
7c5b89b33e19 Separate the conversation commands out to their own file
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
115 return PURPLE_CMD_RET_OK;
7c5b89b33e19 Separate the conversation commands out to their own file
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
116 } else {
7c5b89b33e19 Separate the conversation commands out to their own file
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
117 purple_conversation_write_system_message(conv,
7c5b89b33e19 Separate the conversation commands out to their own file
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
118 _("Supported debug options are: plugins, version, unsafe, verbose"),
7c5b89b33e19 Separate the conversation commands out to their own file
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
119 PURPLE_MESSAGE_NO_LOG);
7c5b89b33e19 Separate the conversation commands out to their own file
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
120 return PURPLE_CMD_RET_OK;
7c5b89b33e19 Separate the conversation commands out to their own file
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
121 }
7c5b89b33e19 Separate the conversation commands out to their own file
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
122
7c5b89b33e19 Separate the conversation commands out to their own file
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
123 markup = g_markup_escape_text(tmp, -1);
7c5b89b33e19 Separate the conversation commands out to their own file
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
124 purple_conversation_send(conv, markup);
7c5b89b33e19 Separate the conversation commands out to their own file
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
125
7c5b89b33e19 Separate the conversation commands out to their own file
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
126 g_free(tmp);
7c5b89b33e19 Separate the conversation commands out to their own file
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
127 g_free(markup);
7c5b89b33e19 Separate the conversation commands out to their own file
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
128 return PURPLE_CMD_RET_OK;
7c5b89b33e19 Separate the conversation commands out to their own file
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
129 }
7c5b89b33e19 Separate the conversation commands out to their own file
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
130
7c5b89b33e19 Separate the conversation commands out to their own file
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
131 static PurpleCmdRet
41947
7b3312d0760c Bump C standard to C99 for Pidgin files and fix warnings
Elliott Sales de Andrade <quantum.analyst@gmail.com>
parents: 40952
diff changeset
132 help_command_cb(PurpleConversation *conv, G_GNUC_UNUSED const char *cmd,
7b3312d0760c Bump C standard to C99 for Pidgin files and fix warnings
Elliott Sales de Andrade <quantum.analyst@gmail.com>
parents: 40952
diff changeset
133 char **args, G_GNUC_UNUSED char **error,
7b3312d0760c Bump C standard to C99 for Pidgin files and fix warnings
Elliott Sales de Andrade <quantum.analyst@gmail.com>
parents: 40952
diff changeset
134 G_GNUC_UNUSED gpointer data)
40871
7c5b89b33e19 Separate the conversation commands out to their own file
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
135 {
7c5b89b33e19 Separate the conversation commands out to their own file
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
136 GList *l, *text;
7c5b89b33e19 Separate the conversation commands out to their own file
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
137 GString *s;
7c5b89b33e19 Separate the conversation commands out to their own file
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
138
7c5b89b33e19 Separate the conversation commands out to their own file
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
139 if (args[0] != NULL) {
7c5b89b33e19 Separate the conversation commands out to their own file
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
140 s = g_string_new("");
7c5b89b33e19 Separate the conversation commands out to their own file
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
141 text = purple_cmd_help(conv, args[0]);
7c5b89b33e19 Separate the conversation commands out to their own file
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
142
7c5b89b33e19 Separate the conversation commands out to their own file
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
143 if (text) {
7c5b89b33e19 Separate the conversation commands out to their own file
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
144 for (l = text; l; l = l->next)
7c5b89b33e19 Separate the conversation commands out to their own file
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
145 if (l->next)
7c5b89b33e19 Separate the conversation commands out to their own file
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
146 g_string_append_printf(s, "%s\n", (char *)l->data);
7c5b89b33e19 Separate the conversation commands out to their own file
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
147 else
7c5b89b33e19 Separate the conversation commands out to their own file
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
148 g_string_append_printf(s, "%s", (char *)l->data);
7c5b89b33e19 Separate the conversation commands out to their own file
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
149 } else {
7c5b89b33e19 Separate the conversation commands out to their own file
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
150 g_string_append(s, _("No such command (in this context)."));
7c5b89b33e19 Separate the conversation commands out to their own file
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
151 }
7c5b89b33e19 Separate the conversation commands out to their own file
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
152 } else {
7c5b89b33e19 Separate the conversation commands out to their own file
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
153 s = g_string_new(_("Use \"/help &lt;command&gt;\" for help with a "
7c5b89b33e19 Separate the conversation commands out to their own file
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
154 "specific command.<br/>The following commands are available "
7c5b89b33e19 Separate the conversation commands out to their own file
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
155 "in this context:<br/>"));
7c5b89b33e19 Separate the conversation commands out to their own file
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
156
7c5b89b33e19 Separate the conversation commands out to their own file
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
157 text = purple_cmd_list(conv);
7c5b89b33e19 Separate the conversation commands out to their own file
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
158 for (l = text; l; l = l->next)
7c5b89b33e19 Separate the conversation commands out to their own file
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
159 if (l->next)
7c5b89b33e19 Separate the conversation commands out to their own file
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
160 g_string_append_printf(s, "%s, ", (char *)l->data);
7c5b89b33e19 Separate the conversation commands out to their own file
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
161 else
7c5b89b33e19 Separate the conversation commands out to their own file
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
162 g_string_append_printf(s, "%s.", (char *)l->data);
7c5b89b33e19 Separate the conversation commands out to their own file
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
163 g_list_free(text);
7c5b89b33e19 Separate the conversation commands out to their own file
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
164 }
7c5b89b33e19 Separate the conversation commands out to their own file
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
165
7c5b89b33e19 Separate the conversation commands out to their own file
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
166 purple_conversation_write_system_message(conv, s->str, PURPLE_MESSAGE_NO_LOG);
7c5b89b33e19 Separate the conversation commands out to their own file
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
167 g_string_free(s, TRUE);
7c5b89b33e19 Separate the conversation commands out to their own file
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
168
7c5b89b33e19 Separate the conversation commands out to their own file
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
169 return PURPLE_CMD_RET_OK;
7c5b89b33e19 Separate the conversation commands out to their own file
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
170 }
7c5b89b33e19 Separate the conversation commands out to their own file
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
171
7c5b89b33e19 Separate the conversation commands out to their own file
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
172 /******************************************************************************
7c5b89b33e19 Separate the conversation commands out to their own file
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
173 * Public API
7c5b89b33e19 Separate the conversation commands out to their own file
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
174 *****************************************************************************/
7c5b89b33e19 Separate the conversation commands out to their own file
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
175 void
7c5b89b33e19 Separate the conversation commands out to their own file
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
176 pidgin_commands_init(void) {
7c5b89b33e19 Separate the conversation commands out to their own file
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
177 purple_cmd_register("say", "S", PURPLE_CMD_P_DEFAULT,
7c5b89b33e19 Separate the conversation commands out to their own file
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
178 PURPLE_CMD_FLAG_CHAT | PURPLE_CMD_FLAG_IM, NULL,
7c5b89b33e19 Separate the conversation commands out to their own file
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
179 say_command_cb, _("say &lt;message&gt;: Send a message normally as if you weren't using a command."), NULL);
7c5b89b33e19 Separate the conversation commands out to their own file
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
180 purple_cmd_register("me", "S", PURPLE_CMD_P_DEFAULT,
7c5b89b33e19 Separate the conversation commands out to their own file
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
181 PURPLE_CMD_FLAG_CHAT | PURPLE_CMD_FLAG_IM, NULL,
7c5b89b33e19 Separate the conversation commands out to their own file
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
182 me_command_cb, _("me &lt;action&gt;: Send an IRC style action to a buddy or chat."), NULL);
7c5b89b33e19 Separate the conversation commands out to their own file
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
183 purple_cmd_register("debug", "w", PURPLE_CMD_P_DEFAULT,
7c5b89b33e19 Separate the conversation commands out to their own file
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
184 PURPLE_CMD_FLAG_CHAT | PURPLE_CMD_FLAG_IM, NULL,
7c5b89b33e19 Separate the conversation commands out to their own file
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
185 debug_command_cb, _("debug &lt;option&gt;: Send various debug information to the current conversation."), NULL);
7c5b89b33e19 Separate the conversation commands out to their own file
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
186 purple_cmd_register("help", "w", PURPLE_CMD_P_DEFAULT,
7c5b89b33e19 Separate the conversation commands out to their own file
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
187 PURPLE_CMD_FLAG_CHAT | PURPLE_CMD_FLAG_IM | PURPLE_CMD_FLAG_ALLOW_WRONG_ARGS, NULL,
7c5b89b33e19 Separate the conversation commands out to their own file
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
188 help_command_cb, _("help &lt;command&gt;: Help on a specific command."), NULL);
7c5b89b33e19 Separate the conversation commands out to their own file
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
189 }
7c5b89b33e19 Separate the conversation commands out to their own file
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
190
7c5b89b33e19 Separate the conversation commands out to their own file
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
191 void
7c5b89b33e19 Separate the conversation commands out to their own file
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
192 pidgin_commands_uninit(void) {
7c5b89b33e19 Separate the conversation commands out to their own file
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
193 }

mercurial