diff libpurple/plugins/autoaccept.c @ 15373:5fe8042783c1

Rename gtk/ and libgaim/ to pidgin/ and libpurple/
author Sean Egan <seanegan@gmail.com>
date Sat, 20 Jan 2007 02:32:10 +0000
parents
children 32c366eeeb99
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/libpurple/plugins/autoaccept.c	Sat Jan 20 02:32:10 2007 +0000
@@ -0,0 +1,273 @@
+/*
+ * 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)