diff libpurple/plugins/filectl.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 21bc8d84974f
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/libpurple/plugins/filectl.c	Sat Jan 20 02:32:10 2007 +0000
@@ -0,0 +1,270 @@
+/**
+ * Send commands to Gaim via ~/.gaim/control
+ *
+ * Originally by Eric Warmenhoven <eric@warmenhoven.org>
+ * Compile fixes/mini hacks Alex Bennee <alex@bennee.com>
+ * and Brian Tarricone <bjt23@users.sourceforge.net>
+ */
+
+/* system includes */
+#include <stdlib.h>
+#include <stdio.h>
+#include <unistd.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <string.h>
+#include <ctype.h>
+
+#include "account.h"
+#include "config.h"
+#include "core.h"
+#include "conversation.h"
+#include "debug.h"
+#include "eventloop.h"
+#include "internal.h"
+#include "util.h"
+#include "version.h"
+
+#define FILECTL_PLUGIN_ID "core-filectl"
+static int check;
+static time_t mtime;
+
+static void init_file(void);
+static gboolean check_file(void);
+
+/* parse char * as if were word array */
+char *getarg(char *, int, int);
+
+/* go through file and run any commands */
+void
+run_commands()
+{
+	struct stat finfo;
+	char filename[256];
+	char buffer[1024];
+	char *command, *arg1, *arg2;
+	FILE *file;
+
+	sprintf(filename, "%s" G_DIR_SEPARATOR_S "control", gaim_user_dir());
+
+	file = g_fopen(filename, "r+");
+	while (fgets(buffer, sizeof(buffer), file)) {
+
+		/* Read the next command */
+		if (buffer[strlen(buffer) - 1] == '\n')
+			buffer[strlen(buffer) - 1] = 0;
+		gaim_debug_misc("filectl", "read: %s\n", buffer);
+		command = getarg(buffer, 0, 0);
+
+		if (!strncasecmp(command, "login", 6)) {
+			GaimAccount *account;
+
+			arg1 = getarg(buffer, 1, 0);
+			arg2 = getarg(buffer, 2, 1);
+
+			account = gaim_accounts_find(arg1, arg2);
+			if (account != NULL) /* username found */
+				gaim_account_connect(account);
+
+			free(arg1);
+			free(arg2);
+
+		} else if (!strncasecmp(command, "logout", 7)) {
+			GaimAccount *account;
+
+			arg1 = getarg(buffer, 1, 1);
+			arg2 = getarg(buffer, 2, 1);
+
+			account = gaim_accounts_find(arg1, arg2);
+			if (account != NULL)
+			{
+				gaim_account_disconnect(account);
+			}
+			else if (arg1 == NULL)
+				gaim_connections_disconnect_all();
+
+			free(arg1);
+			free(arg2);
+
+/* gaim_find_conversation() is gone in 2.0.0. */
+#if 0
+		} else if (!strncasecmp(command, "send", 4)) {
+			GaimConversation *conv;
+
+			arg1 = getarg(buffer, 1, 0);
+			arg2 = getarg(buffer, 2, 1);
+
+			conv = gaim_find_conversation(GAIM_CONV_TYPE_ANY, arg1);
+			if (conv != NULL)
+			{
+				/*
+				gaim_conversation_write(conv, arg2, WFLAG_SEND, NULL, time(NULL), -1);
+				serv_send_im(conv->gc, arg1, arg2, 0);
+				*/
+			}
+
+			free(arg1);
+			free(arg2);
+#endif
+
+		} else if (!strncasecmp(command, "away", 4)) {
+			arg1 = getarg(buffer, 1, 1);
+			/* serv_set_away_all(arg1); */
+			free(arg1);
+
+		} else if (!strncasecmp(command, "hide", 4)) {
+			gaim_blist_set_visible(FALSE);
+
+		} else if (!strncasecmp(command, "unhide", 6)) {
+			gaim_blist_set_visible(TRUE);
+
+		} else if (!strncasecmp(command, "back", 4)) {
+			/* do_im_back(); */
+
+		} else if (!strncasecmp(command, "quit", 4)) {
+			gaim_core_quit();
+
+		}
+
+		free(command);
+	}
+
+	fclose(file);
+
+	if (g_stat(filename, &finfo) != 0)
+		return;
+	mtime = finfo.st_mtime;
+}
+
+/**
+ * Check to see if the size of the file is > 0. if so, run commands.
+ */
+void
+init_file()
+{
+	/* most of this was taken from Bash v2.04 by the FSF */
+	struct stat finfo;
+	char filename[256];
+
+	sprintf(filename, "%s" G_DIR_SEPARATOR_S "control", gaim_user_dir());
+
+	if ((g_stat(filename, &finfo) == 0) && (finfo.st_size > 0))
+		run_commands();
+}
+
+/**
+ * Check to see if we need to run commands from the file.
+ */
+gboolean
+check_file()
+{
+	/* most of this was taken from Bash v2.04 by the FSF */
+	struct stat finfo;
+	char filename[256];
+
+	sprintf(filename, "%s" G_DIR_SEPARATOR_S "control", gaim_user_dir());
+
+	if ((g_stat(filename, &finfo) == 0) && (finfo.st_size > 0))
+	{
+		if (mtime != finfo.st_mtime) {
+			gaim_debug_info("filectl", "control changed, checking\n");
+			run_commands();
+		}
+	}
+
+	return TRUE;
+}
+
+char *
+getarg(char *line, int which, int remain)
+{
+	char *arr;
+	char *val;
+	int count = -1;
+	int i;
+	int state = 0;
+
+	for (i = 0; i < strlen(line) && count < which; i++) {
+		switch (state) {
+		case 0: /* in whitespace, expecting word */
+			if (isalnum(line[i])) {
+				count++;
+				state = 1;
+			}
+			break;
+		case 1: /* inside word, waiting for whitespace */
+			if (isspace(line[i])) {
+				state = 0;
+			}
+			break;
+		}
+	}
+
+	arr = strdup(&line[i - 1]);
+	if (remain)
+		return arr;
+
+	for (i = 0; i < strlen(arr) && isalnum(arr[i]); i++);
+	arr[i] = 0;
+	val = strdup(arr);
+	arr[i] = ' ';
+	free(arr);
+	return val;
+}
+
+/*
+ *  EXPORTED FUNCTIONS
+ */
+
+static gboolean
+plugin_load(GaimPlugin *plugin)
+{
+	init_file();
+	check = gaim_timeout_add(5000, (GSourceFunc)check_file, NULL);
+
+	return TRUE;
+}
+
+static gboolean
+plugin_unload(GaimPlugin *plugin)
+{
+	gaim_timeout_remove(check);
+
+	return TRUE;
+}
+
+static GaimPluginInfo info =
+{
+	GAIM_PLUGIN_MAGIC,
+	GAIM_MAJOR_VERSION,
+	GAIM_MINOR_VERSION,
+	GAIM_PLUGIN_STANDARD,                             /**< type           */
+	NULL,                                             /**< ui_requirement */
+	0,                                                /**< flags          */
+	NULL,                                             /**< dependencies   */
+	GAIM_PRIORITY_DEFAULT,                            /**< priority       */
+
+	FILECTL_PLUGIN_ID,                                /**< id             */
+	N_("Gaim File Control"),                          /**< name           */
+	VERSION,                                          /**< version        */
+	                                                  /**  summary        */
+	N_("Allows you to control Gaim by entering commands in a file."),
+	                                                  /**  description    */
+	N_("Allows you to control Gaim by entering commands in a file."),
+	"Eric Warmenhoven <eric@warmenhoven.org>",        /**< author         */
+	GAIM_WEBSITE,                                          /**< homepage       */
+
+	plugin_load,                                      /**< load           */
+	plugin_unload,                                    /**< unload         */
+	NULL,                                             /**< destroy        */
+
+	NULL,                                             /**< ui_info        */
+	NULL                                              /**< extra_info     */
+};
+
+static void
+init_plugin(GaimPlugin *plugin)
+{
+}
+
+GAIM_INIT_PLUGIN(filectl, init_plugin, info)