Mercurial > pidgin.yaz
diff gtk/plugins/raw.c @ 14191:009db0b357b5
This is a hand-crafted commit to migrate across subversion revisions
16854:16861, due to some vagaries of the way the original renames were
done. Witness that monotone can do in one revision what svn had to
spread across several.
author | Ethan Blanton <elb@pidgin.im> |
---|---|
date | Sat, 16 Dec 2006 04:59:55 +0000 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gtk/plugins/raw.c Sat Dec 16 04:59:55 2006 +0000 @@ -0,0 +1,197 @@ +/* + * Gaim - Send raw data across the connections of some protocols. + * + * Gaim is the legal property of its developers, whose names are too numerous + * to list here. Please refer to the COPYRIGHT file distributed with this + * source distribution. + * + * 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" +#include "gtkgaim.h" + +#include "conversation.h" +#include "debug.h" +#include "prpl.h" +#include "version.h" + +#include "gtkplugin.h" +#include "gtkutils.h" + +#include "protocols/jabber/jabber.h" +#include "protocols/msn/session.h" + +#ifdef MAX +# undef MAX +# undef MIN +#endif + +#define RAW_PLUGIN_ID "gtk-raw" + +static GtkWidget *window = NULL; +static GaimAccount *account = NULL; +static GaimPlugin *my_plugin = NULL; + +static int +window_closed_cb() +{ + gaim_plugin_unload(my_plugin); + + return FALSE; +} + +static void +text_sent_cb(GtkEntry *entry) +{ + const char *txt; + GaimConnection *gc; + const char *prpl_id; + + if (account == NULL) + return; + + gc = gaim_account_get_connection(account); + + txt = gtk_entry_get_text(entry); + + prpl_id = gaim_account_get_protocol_id(account); + + gaim_debug_misc("raw", "prpl_id = %s\n", prpl_id); + + if (strcmp(prpl_id, "prpl-toc") == 0) { + int *a = (int *)gc->proto_data; + unsigned short seqno = htons(a[1]++ & 0xffff); + unsigned short len = htons(strlen(txt) + 1); + write(*a, "*\002", 2); + write(*a, &seqno, 2); + write(*a, &len, 2); + write(*a, txt, ntohs(len)); + gaim_debug(GAIM_DEBUG_MISC, "raw", "TOC C: %s\n", txt); + + } else if (strcmp(prpl_id, "prpl-msn") == 0) { + MsnSession *session = gc->proto_data; + char buf[strlen(txt) + 3]; + + g_snprintf(buf, sizeof(buf), "%s\r\n", txt); + msn_servconn_write(session->notification->servconn, buf, strlen(buf)); + + } else if (strcmp(prpl_id, "prpl-irc") == 0) { + write(*(int *)gc->proto_data, txt, strlen(txt)); + write(*(int *)gc->proto_data, "\r\n", 2); + gaim_debug(GAIM_DEBUG_MISC, "raw", "IRC C: %s\n", txt); + + } else if (strcmp(prpl_id, "prpl-jabber") == 0) { + jabber_send_raw((JabberStream *)gc->proto_data, txt, -1); + + } else { + gaim_debug_error("raw", "Unknown protocol ID %s\n", prpl_id); + } + + gtk_entry_set_text(entry, ""); +} + +static void +account_changed_cb(GtkWidget *dropdown, GaimAccount *new_account, + void *user_data) +{ + account = new_account; +} + +static gboolean +plugin_load(GaimPlugin *plugin) +{ + GtkWidget *hbox; + GtkWidget *entry; + GtkWidget *dropdown; + + /* Setup the window. */ + window = gtk_window_new(GTK_WINDOW_TOPLEVEL); + gtk_container_set_border_width(GTK_CONTAINER(window), 6); + + g_signal_connect(G_OBJECT(window), "delete_event", + G_CALLBACK(window_closed_cb), NULL); + + /* Main hbox */ + hbox = gtk_hbox_new(FALSE, 6); + gtk_container_add(GTK_CONTAINER(window), hbox); + + /* Account drop-down menu. */ + dropdown = gaim_gtk_account_option_menu_new(NULL, FALSE, + G_CALLBACK(account_changed_cb), NULL, NULL); + + if (gaim_connections_get_all()) + account = (GaimAccount *)gaim_connections_get_all()->data; + + gtk_box_pack_start(GTK_BOX(hbox), dropdown, FALSE, FALSE, 0); + + /* Entry box */ + entry = gtk_entry_new(); + gtk_box_pack_start(GTK_BOX(hbox), entry, FALSE, FALSE, 0); + + g_signal_connect(G_OBJECT(entry), "activate", + G_CALLBACK(text_sent_cb), NULL); + + gtk_widget_show_all(window); + + return TRUE; +} + +static gboolean +plugin_unload(GaimPlugin *plugin) +{ + if (window) + gtk_widget_destroy(window); + + window = NULL; + + return TRUE; +} + +static GaimPluginInfo info = +{ + GAIM_PLUGIN_MAGIC, + GAIM_MAJOR_VERSION, + GAIM_MINOR_VERSION, + GAIM_PLUGIN_STANDARD, + GAIM_GTK_PLUGIN_TYPE, + 0, + NULL, + GAIM_PRIORITY_DEFAULT, + RAW_PLUGIN_ID, + N_("Raw"), + VERSION, + N_("Lets you send raw input to text-based protocols."), + N_("Lets you send raw input to text-based protocols (Jabber, MSN, IRC, " + "TOC). Hit 'Enter' in the entry box to send. Watch the debug window."), + "Eric Warmenhoven <eric@warmenhoven.org>", + GAIM_WEBSITE, + plugin_load, + plugin_unload, + NULL, + NULL, + NULL, + NULL, + NULL +}; + +static void +init_plugin(GaimPlugin *plugin) +{ + my_plugin = plugin; +} + +GAIM_INIT_PLUGIN(raw, init_plugin, info)