Mon, 16 Apr 2007 00:52:52 +0000
Deal with Gaim in some error messages.
| 15230 | 1 | /* |
| 2 | * Autoaccept - Auto-accept file transfers from selected users | |
| 3 | * Copyright (C) 2006 | |
| 4 | * | |
| 5 | * This program is free software; you can redistribute it and/or | |
| 6 | * modify it under the terms of the GNU General Public License as | |
| 7 | * published by the Free Software Foundation; either version 2 of the | |
| 8 | * License, or (at your option) any later version. | |
| 9 | * | |
| 10 | * This program is distributed in the hope that it will be useful, but | |
| 11 | * WITHOUT ANY WARRANTY; without even the implied warranty of | |
| 12 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
| 13 | * General Public License for more details. | |
| 14 | * | |
| 15 | * You should have received a copy of the GNU General Public License | |
| 16 | * along with this program; if not, write to the Free Software | |
| 17 | * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA | |
| 18 | * 02111-1307, USA. | |
| 19 | */ | |
| 20 | #include "internal.h" | |
| 21 | ||
| 22 | #define PLUGIN_ID "core-plugin_pack-autoaccept" | |
|
15418
bf287f742a5a
[gaim-migrate @ 18149]
Luke Schierer <lschiere@pidgin.im>
parents:
15230
diff
changeset
|
23 | #define PLUGIN_NAME N_("Autoaccept") |
| 15230 | 24 | #define PLUGIN_STATIC_NAME "Autoaccept" |
|
15418
bf287f742a5a
[gaim-migrate @ 18149]
Luke Schierer <lschiere@pidgin.im>
parents:
15230
diff
changeset
|
25 | #define PLUGIN_SUMMARY N_("Auto-accept file transfer requests from selected users.") |
|
bf287f742a5a
[gaim-migrate @ 18149]
Luke Schierer <lschiere@pidgin.im>
parents:
15230
diff
changeset
|
26 | #define PLUGIN_DESCRIPTION N_("Auto-accept file transfer requests from selected users.") |
| 15230 | 27 | #define PLUGIN_AUTHOR "Sadrul H Chowdhury <sadrul@users.sourceforge.net>" |
| 28 | ||
| 29 | /* System headers */ | |
| 30 | #include <glib.h> | |
| 31 | #if GLIB_CHECK_VERSION(2,6,0) | |
| 32 | # include <glib/gstdio.h> | |
| 33 | #else | |
| 34 | # include <sys/types.h> | |
| 35 | # include <sys/stat.h> | |
| 36 | # define g_mkdir mkdir | |
| 37 | #endif | |
| 38 | ||
| 15884 | 39 | /* Purple headers */ |
| 15230 | 40 | #include <plugin.h> |
| 41 | #include <version.h> | |
| 42 | ||
| 43 | #include <blist.h> | |
| 44 | #include <conversation.h> | |
| 45 | #include <ft.h> | |
| 46 | #include <request.h> | |
| 47 | #include <notify.h> | |
| 48 | #include <util.h> | |
| 49 | ||
| 50 | #define PREF_PREFIX "/plugins/core/" PLUGIN_ID | |
| 51 | #define PREF_PATH PREF_PREFIX "/path" | |
| 52 | #define PREF_STRANGER PREF_PREFIX "/reject_stranger" | |
| 53 | #define PREF_NOTIFY PREF_PREFIX "/notify" | |
| 54 | ||
| 55 | typedef enum | |
| 56 | { | |
| 57 | FT_ASK, | |
| 58 | FT_ACCEPT, | |
| 59 | FT_REJECT | |
| 60 | } AutoAcceptSetting; | |
| 61 | ||
| 62 | static gboolean | |
| 63 | ensure_path_exists(const char *dir) | |
| 64 | { | |
| 65 | if (!g_file_test(dir, G_FILE_TEST_IS_DIR)) | |
| 66 | { | |
| 15884 | 67 | if (purple_build_dir(dir, S_IRUSR | S_IWUSR | S_IXUSR)) |
| 15230 | 68 | return FALSE; |
| 69 | } | |
| 70 | ||
| 71 | return TRUE; | |
| 72 | } | |
| 73 | ||
| 74 | static void | |
| 15884 | 75 | auto_accept_complete_cb(PurpleXfer *xfer, PurpleXfer *my) |
| 15230 | 76 | { |
| 15884 | 77 | if (xfer == my && purple_prefs_get_bool(PREF_NOTIFY) && |
| 78 | !purple_find_conversation_with_account(PURPLE_CONV_TYPE_IM, xfer->who, xfer->account)) | |
| 15230 | 79 | { |
| 80 | char *message = g_strdup_printf(_("Autoaccepted file transfer of \"%s\" from \"%s\" completed."), | |
| 81 | xfer->filename, xfer->who); | |
| 15884 | 82 | purple_notify_info(NULL, _("Autoaccept complete"), message, NULL); |
| 15230 | 83 | g_free(message); |
| 84 | } | |
| 85 | } | |
| 86 | ||
| 87 | static void | |
| 15884 | 88 | file_recv_request_cb(PurpleXfer *xfer, gpointer handle) |
| 15230 | 89 | { |
| 15884 | 90 | PurpleAccount *account; |
| 91 | PurpleBlistNode *node; | |
| 15230 | 92 | const char *pref; |
| 93 | char *filename; | |
| 94 | char *dirname; | |
| 95 | ||
| 96 | account = xfer->account; | |
| 15884 | 97 | node = (PurpleBlistNode *)purple_find_buddy(account, xfer->who); |
| 15230 | 98 | |
| 99 | if (!node) | |
| 100 | { | |
| 15884 | 101 | if (purple_prefs_get_bool(PREF_STRANGER)) |
| 102 | xfer->status = PURPLE_XFER_STATUS_CANCEL_LOCAL; | |
| 15230 | 103 | return; |
| 104 | } | |
| 105 | ||
| 106 | node = node->parent; | |
| 15884 | 107 | g_return_if_fail(PURPLE_BLIST_NODE_IS_CONTACT(node)); |
| 15230 | 108 | |
| 15884 | 109 | pref = purple_prefs_get_string(PREF_PATH); |
| 110 | switch (purple_blist_node_get_int(node, "autoaccept")) | |
| 15230 | 111 | { |
| 112 | case FT_ASK: | |
| 113 | break; | |
| 114 | case FT_ACCEPT: | |
| 115 | if (ensure_path_exists(pref)) | |
| 116 | { | |
| 117 | dirname = g_build_filename(pref, xfer->who, NULL); | |
| 118 | ||
| 119 | if (!ensure_path_exists(dirname)) | |
| 120 | { | |
| 121 | g_free(dirname); | |
| 122 | break; | |
| 123 | } | |
| 124 | ||
| 125 | filename = g_build_filename(dirname, xfer->filename, NULL); | |
| 126 | ||
| 15884 | 127 | purple_xfer_request_accepted(xfer, filename); |
| 15230 | 128 | |
| 129 | g_free(dirname); | |
| 130 | g_free(filename); | |
| 131 | } | |
| 132 | ||
| 15884 | 133 | purple_signal_connect(purple_xfers_get_handle(), "file-recv-complete", handle, |
| 134 | PURPLE_CALLBACK(auto_accept_complete_cb), xfer); | |
| 15230 | 135 | break; |
| 136 | case FT_REJECT: | |
| 15884 | 137 | xfer->status = PURPLE_XFER_STATUS_CANCEL_LOCAL; |
| 15230 | 138 | break; |
| 139 | } | |
| 140 | } | |
| 141 | ||
| 142 | static void | |
| 15884 | 143 | save_cb(PurpleBlistNode *node, int choice) |
| 15230 | 144 | { |
| 15884 | 145 | if (PURPLE_BLIST_NODE_IS_BUDDY(node)) |
| 15230 | 146 | node = node->parent; |
| 15884 | 147 | g_return_if_fail(PURPLE_BLIST_NODE_IS_CONTACT(node)); |
| 148 | purple_blist_node_set_int(node, "autoaccept", choice); | |
| 15230 | 149 | } |
| 150 | ||
| 151 | static void | |
| 15884 | 152 | set_auto_accept_settings(PurpleBlistNode *node, gpointer plugin) |
| 15230 | 153 | { |
| 154 | char *message; | |
| 155 | ||
| 15884 | 156 | if (PURPLE_BLIST_NODE_IS_BUDDY(node)) |
| 15230 | 157 | node = node->parent; |
| 15884 | 158 | g_return_if_fail(PURPLE_BLIST_NODE_IS_CONTACT(node)); |
| 15230 | 159 | |
| 160 | message = g_strdup_printf(_("When a file-transfer request arrives from %s"), | |
| 15884 | 161 | purple_contact_get_alias((PurpleContact *)node)); |
| 162 | purple_request_choice(plugin, _("Set Autoaccept Setting"), message, | |
| 163 | NULL, purple_blist_node_get_int(node, "autoaccept"), | |
| 15230 | 164 | _("_Save"), G_CALLBACK(save_cb), |
| 165 | _("_Cancel"), NULL, node, | |
| 166 | _("Ask"), FT_ASK, | |
| 167 | _("Auto Accept"), FT_ACCEPT, | |
| 168 | _("Auto Reject"), FT_REJECT, | |
| 169 | NULL); | |
| 170 | g_free(message); | |
| 171 | } | |
| 172 | ||
| 173 | static void | |
| 15884 | 174 | context_menu(PurpleBlistNode *node, GList **menu, gpointer plugin) |
| 15230 | 175 | { |
| 15884 | 176 | PurpleMenuAction *action; |
| 15230 | 177 | |
| 15884 | 178 | if (!PURPLE_BLIST_NODE_IS_BUDDY(node) && !PURPLE_BLIST_NODE_IS_CONTACT(node)) |
| 15230 | 179 | return; |
| 180 | ||
| 15884 | 181 | action = purple_menu_action_new(_("Autoaccept File Transfers..."), |
| 182 | PURPLE_CALLBACK(set_auto_accept_settings), plugin, NULL); | |
| 15230 | 183 | (*menu) = g_list_prepend(*menu, action); |
| 184 | } | |
| 185 | ||
| 186 | static gboolean | |
| 15884 | 187 | plugin_load(PurplePlugin *plugin) |
| 15230 | 188 | { |
| 15884 | 189 | purple_signal_connect(purple_xfers_get_handle(), "file-recv-request", plugin, |
| 190 | PURPLE_CALLBACK(file_recv_request_cb), plugin); | |
| 191 | purple_signal_connect(purple_blist_get_handle(), "blist-node-extended-menu", plugin, | |
| 192 | PURPLE_CALLBACK(context_menu), plugin); | |
| 15230 | 193 | return TRUE; |
| 194 | } | |
| 195 | ||
| 196 | static gboolean | |
| 15884 | 197 | plugin_unload(PurplePlugin *plugin) |
| 15230 | 198 | { |
| 199 | return TRUE; | |
| 200 | } | |
| 201 | ||
| 15884 | 202 | static PurplePluginPrefFrame * |
| 203 | get_plugin_pref_frame(PurplePlugin *plugin) | |
| 15230 | 204 | { |
| 15884 | 205 | PurplePluginPrefFrame *frame; |
| 206 | PurplePluginPref *pref; | |
| 15230 | 207 | |
| 15884 | 208 | frame = purple_plugin_pref_frame_new(); |
| 15230 | 209 | |
| 210 | /* XXX: Is there a better way than this? There really should be. */ | |
| 15884 | 211 | pref = purple_plugin_pref_new_with_name_and_label(PREF_PATH, _("Path to save the files in\n" |
| 15230 | 212 | "(Please provide the full path)")); |
| 15884 | 213 | purple_plugin_pref_frame_add(frame, pref); |
| 15230 | 214 | |
| 15884 | 215 | pref = purple_plugin_pref_new_with_name_and_label(PREF_STRANGER, |
| 15230 | 216 | _("Automatically reject from users not in buddy list")); |
| 15884 | 217 | purple_plugin_pref_frame_add(frame, pref); |
| 15230 | 218 | |
| 15884 | 219 | pref = purple_plugin_pref_new_with_name_and_label(PREF_NOTIFY, |
| 15230 | 220 | _("Notify with a popup when an autoaccepted file transfer is complete\n" |
| 221 | "(only when there's no conversation with the sender)")); | |
| 15884 | 222 | purple_plugin_pref_frame_add(frame, pref); |
| 15230 | 223 | |
| 224 | return frame; | |
| 225 | } | |
| 226 | ||
| 15884 | 227 | static PurplePluginUiInfo prefs_info = { |
| 15230 | 228 | get_plugin_pref_frame, |
| 229 | 0, | |
| 230 | NULL, | |
| 231 | }; | |
| 232 | ||
| 15884 | 233 | static PurplePluginInfo info = { |
| 234 | PURPLE_PLUGIN_MAGIC, /* Magic */ | |
| 235 | PURPLE_MAJOR_VERSION, /* Purple Major Version */ | |
| 236 | PURPLE_MINOR_VERSION, /* Purple Minor Version */ | |
| 237 | PURPLE_PLUGIN_STANDARD, /* plugin type */ | |
|
15418
bf287f742a5a
[gaim-migrate @ 18149]
Luke Schierer <lschiere@pidgin.im>
parents:
15230
diff
changeset
|
238 | NULL, /* ui requirement */ |
|
bf287f742a5a
[gaim-migrate @ 18149]
Luke Schierer <lschiere@pidgin.im>
parents:
15230
diff
changeset
|
239 | 0, /* flags */ |
|
bf287f742a5a
[gaim-migrate @ 18149]
Luke Schierer <lschiere@pidgin.im>
parents:
15230
diff
changeset
|
240 | NULL, /* dependencies */ |
| 15884 | 241 | PURPLE_PRIORITY_DEFAULT, /* priority */ |
| 15230 | 242 | |
|
15418
bf287f742a5a
[gaim-migrate @ 18149]
Luke Schierer <lschiere@pidgin.im>
parents:
15230
diff
changeset
|
243 | PLUGIN_ID, /* plugin id */ |
|
bf287f742a5a
[gaim-migrate @ 18149]
Luke Schierer <lschiere@pidgin.im>
parents:
15230
diff
changeset
|
244 | PLUGIN_NAME, /* name */ |
|
bf287f742a5a
[gaim-migrate @ 18149]
Luke Schierer <lschiere@pidgin.im>
parents:
15230
diff
changeset
|
245 | VERSION, /* version */ |
|
bf287f742a5a
[gaim-migrate @ 18149]
Luke Schierer <lschiere@pidgin.im>
parents:
15230
diff
changeset
|
246 | PLUGIN_SUMMARY, /* summary */ |
|
bf287f742a5a
[gaim-migrate @ 18149]
Luke Schierer <lschiere@pidgin.im>
parents:
15230
diff
changeset
|
247 | PLUGIN_DESCRIPTION, /* description */ |
| 15230 | 248 | PLUGIN_AUTHOR, /* author */ |
| 15884 | 249 | PURPLE_WEBSITE, /* website */ |
| 15230 | 250 | |
| 251 | plugin_load, /* load */ | |
| 252 | plugin_unload, /* unload */ | |
|
15418
bf287f742a5a
[gaim-migrate @ 18149]
Luke Schierer <lschiere@pidgin.im>
parents:
15230
diff
changeset
|
253 | NULL, /* destroy */ |
| 15230 | 254 | |
|
15418
bf287f742a5a
[gaim-migrate @ 18149]
Luke Schierer <lschiere@pidgin.im>
parents:
15230
diff
changeset
|
255 | NULL, /* ui_info */ |
|
bf287f742a5a
[gaim-migrate @ 18149]
Luke Schierer <lschiere@pidgin.im>
parents:
15230
diff
changeset
|
256 | NULL, /* extra_info */ |
| 15230 | 257 | &prefs_info, /* prefs_info */ |
|
15418
bf287f742a5a
[gaim-migrate @ 18149]
Luke Schierer <lschiere@pidgin.im>
parents:
15230
diff
changeset
|
258 | NULL /* actions */ |
| 15230 | 259 | }; |
| 260 | ||
| 261 | static void | |
| 15884 | 262 | init_plugin(PurplePlugin *plugin) { |
| 15230 | 263 | char *dirname; |
| 264 | ||
| 15884 | 265 | dirname = g_build_filename(purple_user_dir(), "autoaccept", NULL); |
| 266 | purple_prefs_add_none(PREF_PREFIX); | |
| 267 | purple_prefs_add_string(PREF_PATH, dirname); | |
| 268 | purple_prefs_add_bool(PREF_STRANGER, TRUE); | |
| 269 | purple_prefs_add_bool(PREF_NOTIFY, TRUE); | |
| 15230 | 270 | g_free(dirname); |
| 271 | } | |
| 272 | ||
| 15884 | 273 | PURPLE_INIT_PLUGIN(PLUGIN_STATIC_NAME, init_plugin, info) |