pidgin/pidgin

1966704b3e42
merge of '77693555855fe9cd3215414f79964dba346cc5fa'
and '19a87e98e5857ad0289f2c760d460f7f1dbbb42d'
/*
* Autoaccept - Auto-accept file transfers from selected users
* Copyright (C) 2006
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License as
* published by the Free Software Foundation; either version 2 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
* 02111-1307, USA.
*/
#include "internal.h"
#define PLUGIN_ID "core-plugin_pack-autoaccept"
#define PLUGIN_NAME N_("Autoaccept")
#define PLUGIN_STATIC_NAME "Autoaccept"
#define PLUGIN_SUMMARY N_("Auto-accept file transfer requests from selected users.")
#define PLUGIN_DESCRIPTION N_("Auto-accept file transfer requests from selected users.")
#define PLUGIN_AUTHOR "Sadrul H Chowdhury <sadrul@users.sourceforge.net>"
/* System headers */
#include <glib.h>
#if GLIB_CHECK_VERSION(2,6,0)
# include <glib/gstdio.h>
#else
# include <sys/types.h>
# include <sys/stat.h>
# define g_mkdir mkdir
#endif
/* Gaim headers */
#include <plugin.h>
#include <version.h>
#include <blist.h>
#include <conversation.h>
#include <ft.h>
#include <request.h>
#include <notify.h>
#include <util.h>
#define PREF_PREFIX "/plugins/core/" PLUGIN_ID
#define PREF_PATH PREF_PREFIX "/path"
#define PREF_STRANGER PREF_PREFIX "/reject_stranger"
#define PREF_NOTIFY PREF_PREFIX "/notify"
typedef enum
{
FT_ASK,
FT_ACCEPT,
FT_REJECT
} AutoAcceptSetting;
static gboolean
ensure_path_exists(const char *dir)
{
if (!g_file_test(dir, G_FILE_TEST_IS_DIR))
{
if (gaim_build_dir(dir, S_IRUSR | S_IWUSR | S_IXUSR))
return FALSE;
}
return TRUE;
}
static void
auto_accept_complete_cb(GaimXfer *xfer, GaimXfer *my)
{
if (xfer == my && gaim_prefs_get_bool(PREF_NOTIFY) &&
!gaim_find_conversation_with_account(GAIM_CONV_TYPE_IM, xfer->who, xfer->account))
{
char *message = g_strdup_printf(_("Autoaccepted file transfer of \"%s\" from \"%s\" completed."),
xfer->filename, xfer->who);
gaim_notify_info(NULL, _("Autoaccept complete"), message, NULL);
g_free(message);
}
}
static void
file_recv_request_cb(GaimXfer *xfer, gpointer handle)
{
GaimAccount *account;
GaimBlistNode *node;
const char *pref;
char *filename;
char *dirname;
account = xfer->account;
node = (GaimBlistNode *)gaim_find_buddy(account, xfer->who);
if (!node)
{
if (gaim_prefs_get_bool(PREF_STRANGER))
xfer->status = GAIM_XFER_STATUS_CANCEL_LOCAL;
return;
}
node = node->parent;
g_return_if_fail(GAIM_BLIST_NODE_IS_CONTACT(node));
pref = gaim_prefs_get_string(PREF_PATH);
switch (gaim_blist_node_get_int(node, "autoaccept"))
{
case FT_ASK:
break;
case FT_ACCEPT:
if (ensure_path_exists(pref))
{
dirname = g_build_filename(pref, xfer->who, NULL);
if (!ensure_path_exists(dirname))
{
g_free(dirname);
break;
}
filename = g_build_filename(dirname, xfer->filename, NULL);
gaim_xfer_request_accepted(xfer, filename);
g_free(dirname);
g_free(filename);
}
gaim_signal_connect(gaim_xfers_get_handle(), "file-recv-complete", handle,
GAIM_CALLBACK(auto_accept_complete_cb), xfer);
break;
case FT_REJECT:
xfer->status = GAIM_XFER_STATUS_CANCEL_LOCAL;
break;
}
}
static void
save_cb(GaimBlistNode *node, int choice)
{
if (GAIM_BLIST_NODE_IS_BUDDY(node))
node = node->parent;
g_return_if_fail(GAIM_BLIST_NODE_IS_CONTACT(node));
gaim_blist_node_set_int(node, "autoaccept", choice);
}
static void
set_auto_accept_settings(GaimBlistNode *node, gpointer plugin)
{
char *message;
if (GAIM_BLIST_NODE_IS_BUDDY(node))
node = node->parent;
g_return_if_fail(GAIM_BLIST_NODE_IS_CONTACT(node));
message = g_strdup_printf(_("When a file-transfer request arrives from %s"),
gaim_contact_get_alias((GaimContact *)node));
gaim_request_choice(plugin, _("Set Autoaccept Setting"), message,
NULL, gaim_blist_node_get_int(node, "autoaccept"),
_("_Save"), G_CALLBACK(save_cb),
_("_Cancel"), NULL, node,
_("Ask"), FT_ASK,
_("Auto Accept"), FT_ACCEPT,
_("Auto Reject"), FT_REJECT,
NULL);
g_free(message);
}
static void
context_menu(GaimBlistNode *node, GList **menu, gpointer plugin)
{
GaimMenuAction *action;
if (!GAIM_BLIST_NODE_IS_BUDDY(node) && !GAIM_BLIST_NODE_IS_CONTACT(node))
return;
action = gaim_menu_action_new(_("Autoaccept File Transfers..."),
GAIM_CALLBACK(set_auto_accept_settings), plugin, NULL);
(*menu) = g_list_prepend(*menu, action);
}
static gboolean
plugin_load(GaimPlugin *plugin)
{
gaim_signal_connect(gaim_xfers_get_handle(), "file-recv-request", plugin,
GAIM_CALLBACK(file_recv_request_cb), plugin);
gaim_signal_connect(gaim_blist_get_handle(), "blist-node-extended-menu", plugin,
GAIM_CALLBACK(context_menu), plugin);
return TRUE;
}
static gboolean
plugin_unload(GaimPlugin *plugin)
{
return TRUE;
}
static GaimPluginPrefFrame *
get_plugin_pref_frame(GaimPlugin *plugin)
{
GaimPluginPrefFrame *frame;
GaimPluginPref *pref;
frame = gaim_plugin_pref_frame_new();
/* XXX: Is there a better way than this? There really should be. */
pref = gaim_plugin_pref_new_with_name_and_label(PREF_PATH, _("Path to save the files in\n"
"(Please provide the full path)"));
gaim_plugin_pref_frame_add(frame, pref);
pref = gaim_plugin_pref_new_with_name_and_label(PREF_STRANGER,
_("Automatically reject from users not in buddy list"));
gaim_plugin_pref_frame_add(frame, pref);
pref = gaim_plugin_pref_new_with_name_and_label(PREF_NOTIFY,
_("Notify with a popup when an autoaccepted file transfer is complete\n"
"(only when there's no conversation with the sender)"));
gaim_plugin_pref_frame_add(frame, pref);
return frame;
}
static GaimPluginUiInfo prefs_info = {
get_plugin_pref_frame,
0,
NULL,
};
static GaimPluginInfo info = {
GAIM_PLUGIN_MAGIC, /* Magic */
GAIM_MAJOR_VERSION, /* Gaim Major Version */
GAIM_MINOR_VERSION, /* Gaim Minor Version */
GAIM_PLUGIN_STANDARD, /* plugin type */
NULL, /* ui requirement */
0, /* flags */
NULL, /* dependencies */
GAIM_PRIORITY_DEFAULT, /* priority */
PLUGIN_ID, /* plugin id */
PLUGIN_NAME, /* name */
VERSION, /* version */
PLUGIN_SUMMARY, /* summary */
PLUGIN_DESCRIPTION, /* description */
PLUGIN_AUTHOR, /* author */
GAIM_WEBSITE, /* website */
plugin_load, /* load */
plugin_unload, /* unload */
NULL, /* destroy */
NULL, /* ui_info */
NULL, /* extra_info */
&prefs_info, /* prefs_info */
NULL /* actions */
};
static void
init_plugin(GaimPlugin *plugin) {
char *dirname;
dirname = g_build_filename(gaim_user_dir(), "autoaccept", NULL);
gaim_prefs_add_none(PREF_PREFIX);
gaim_prefs_add_string(PREF_PATH, dirname);
gaim_prefs_add_bool(PREF_STRANGER, TRUE);
gaim_prefs_add_bool(PREF_NOTIFY, TRUE);
g_free(dirname);
}
GAIM_INIT_PLUGIN(PLUGIN_STATIC_NAME, init_plugin, info)