comparison plugins/raw.c @ 5320:9445d59d9db8

[gaim-migrate @ 5692] It's still evil, but it helped me clean up a problem with MSN. I think. So, it compiles and runs... mostly... again. committer: Tailor Script <tailor@pidgin.im>
author Christian Hammond <chipx86@chipx86.com>
date Wed, 07 May 2003 01:40:51 +0000
parents 1f901484599d
children 88b5c9a45075
comparison
equal deleted inserted replaced
5319:3adb20b869b4 5320:9445d59d9db8
1 #define GAIM_PLUGINS
2 #include "gaim.h" 1 #include "gaim.h"
3 #include "prpl.h" 2 #include "prpl.h"
3 #include "gtkplugin.h"
4 #ifdef MAX 4 #ifdef MAX
5 #undef MAX 5 #undef MAX
6 #undef MIN 6 #undef MIN
7 #endif 7 #endif
8 #include "protocols/jabber/jabber.h" 8 #include "protocols/jabber/jabber.h"
9 #include "protocols/msn/session.h"
10
11 #define RAW_PLUGIN_ID "raw"
9 12
10 static GtkWidget *window = NULL; 13 static GtkWidget *window = NULL;
11 static GtkWidget *optmenu = NULL; 14 static GtkWidget *optmenu = NULL;
12 static struct gaim_connection *gc = NULL; 15 static struct gaim_connection *gc = NULL;
13 static GModule *me = NULL; 16 static GaimPlugin *me = NULL;
14
15 /* this is an evil hack.
16 * gc->proto_data for Jabber connections can be cast to a jconn *.
17 * gc->proto_data for MSN, TOC, and IRC connections can be cast to an int *.
18 */
19
20 struct gaim_plugin_description desc;
21 struct gaim_plugin_description *gaim_plugin_desc() {
22 desc.api_version = GAIM_PLUGIN_API_VERSION;
23 desc.name = g_strdup("Raw Input");
24 desc.version = g_strdup(VERSION);
25 desc.description = g_strdup("Lets you send raw input to text-vased protocols (Jabber, MSN, IRC, TOC). Hit 'Enter' in the entry box to send. Watch the debug window.");
26 desc.authors = g_strdup("Eric Warmehoven &lt;eric@warmenhoven.org>");
27 desc.url = g_strdup(WEBSITE);
28 return &desc;
29 }
30
31
32 char *name()
33 {
34 return "Raw";
35 }
36
37 char *description()
38 {
39 return "Lets you send raw XML to Jabber, or raw commands to MSN, IRC, and TOC."
40 " Not very useful except for debugging. Hit 'enter' in the entry to send."
41 " Watch the debug window.";
42 }
43 17
44 static int goodbye() 18 static int goodbye()
45 { 19 {
46 gaim_plugin_unload_self(me); 20 gaim_plugin_unload(me);
47 return FALSE; 21 return FALSE;
48 } 22 }
49 23
50 static void send_it(GtkEntry *entry) 24 static void send_it(GtkEntry *entry)
51 { 25 {
52 const char *txt; 26 const char *txt;
53 if (!gc) return; 27 if (!gc) return;
54 txt = gtk_entry_get_text(entry); 28 txt = gtk_entry_get_text(entry);
55 switch (gc->protocol) { 29 switch (gc->protocol) {
56 case PROTO_TOC: 30 case GAIM_PROTO_TOC:
57 { 31 {
58 int *a = (int *)gc->proto_data; 32 int *a = (int *)gc->proto_data;
59 unsigned short seqno = htons(a[1]++ & 0xffff); 33 unsigned short seqno = htons(a[1]++ & 0xffff);
60 unsigned short len = htons(strlen(txt) + 1); 34 unsigned short len = htons(strlen(txt) + 1);
61 write(*a, "*\002", 2); 35 write(*a, "*\002", 2);
63 write(*a, &len, 2); 37 write(*a, &len, 2);
64 write(*a, txt, ntohs(len)); 38 write(*a, txt, ntohs(len));
65 gaim_debug(GAIM_DEBUG_MISC, "raw", "TOC C: %s\n", txt); 39 gaim_debug(GAIM_DEBUG_MISC, "raw", "TOC C: %s\n", txt);
66 } 40 }
67 break; 41 break;
68 case PROTO_MSN: 42 case GAIM_PROTO_MSN:
69 write(*(int *)gc->proto_data, txt, strlen(txt)); 43 {
70 write(*(int *)gc->proto_data, "\r\n", 2); 44 MsnSession *session = gc->proto_data;
71 gaim_debug(GAIM_DEBUG_MISC, "raw", "MSN C: %s\n", txt); 45 char buf[strlen(txt) + 3];
46
47 g_snprintf(buf, sizeof(buf), "%s\r\n", txt);
48 msn_servconn_write(session->notification_conn, buf, strlen(buf));
49 }
72 break; 50 break;
73 case PROTO_IRC: 51 case GAIM_PROTO_IRC:
74 write(*(int *)gc->proto_data, txt, strlen(txt)); 52 write(*(int *)gc->proto_data, txt, strlen(txt));
75 write(*(int *)gc->proto_data, "\r\n", 2); 53 write(*(int *)gc->proto_data, "\r\n", 2);
76 gaim_debug(GAIM_DEBUG_MISC, "raw", "IRC C: %s\n", txt); 54 gaim_debug(GAIM_DEBUG_MISC, "raw", "IRC C: %s\n", txt);
77 break; 55 break;
78 case PROTO_JABBER: 56 case GAIM_PROTO_JABBER:
79 jab_send_raw(*(jconn *)gc->proto_data, txt); 57 jab_send_raw(*(jconn *)gc->proto_data, txt);
80 break; 58 break;
81 } 59 }
82 gtk_entry_set_text(entry, ""); 60 gtk_entry_set_text(entry, "");
83 } 61 }
101 GtkWidget *opt; 79 GtkWidget *opt;
102 c = (struct gaim_connection *)g->data; 80 c = (struct gaim_connection *)g->data;
103 g = g->next; 81 g = g->next;
104 if (x && c == arg) 82 if (x && c == arg)
105 continue; 83 continue;
106 if (c->protocol != PROTO_TOC && c->protocol != PROTO_MSN && 84 if (c->protocol != GAIM_PROTO_TOC && c->protocol != GAIM_PROTO_MSN &&
107 c->protocol != PROTO_IRC && c->protocol != PROTO_JABBER) 85 c->protocol != GAIM_PROTO_IRC && c->protocol != GAIM_PROTO_JABBER)
108 continue; 86 continue;
109 if (!gc) 87 if (!gc)
110 gc = c; 88 gc = c;
111 g_snprintf(buf, sizeof buf, "%s (%s)", c->username, c->prpl->name); 89 g_snprintf(buf, sizeof buf, "%s (%s)", c->username,
90 c->prpl->info->name);
112 opt = gtk_menu_item_new_with_label(buf); 91 opt = gtk_menu_item_new_with_label(buf);
113 g_signal_connect(G_OBJECT(opt), "activate", G_CALLBACK(set_gc), c); 92 g_signal_connect(G_OBJECT(opt), "activate", G_CALLBACK(set_gc), c);
114 gtk_widget_show(opt); 93 gtk_widget_show(opt);
115 gtk_menu_shell_append(GTK_MENU_SHELL(menu), opt); 94 gtk_menu_shell_append(GTK_MENU_SHELL(menu), opt);
116 } 95 }
118 gtk_option_menu_remove_menu(GTK_OPTION_MENU(optmenu)); 97 gtk_option_menu_remove_menu(GTK_OPTION_MENU(optmenu));
119 gtk_option_menu_set_menu(GTK_OPTION_MENU(optmenu), menu); 98 gtk_option_menu_set_menu(GTK_OPTION_MENU(optmenu), menu);
120 gtk_option_menu_set_history(GTK_OPTION_MENU(optmenu), 0); 99 gtk_option_menu_set_history(GTK_OPTION_MENU(optmenu), 0);
121 } 100 }
122 101
123 char *gaim_plugin_init(GModule *h) 102 static gboolean
103 plugin_load(GaimPlugin *plugin)
124 { 104 {
125 GtkWidget *hbox; 105 GtkWidget *hbox;
126 GtkWidget *entry; 106 GtkWidget *entry;
127 107
128 me = h; 108 gaim_signal_connect(plugin, event_signon, redo_optmenu, NULL);
129 109 gaim_signal_connect(plugin, event_signoff, redo_optmenu, me);
130 gaim_signal_connect(h, event_signon, redo_optmenu, NULL);
131 gaim_signal_connect(h, event_signoff, redo_optmenu, me);
132 110
133 window = gtk_window_new(GTK_WINDOW_TOPLEVEL); 111 window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
134 g_signal_connect(G_OBJECT(window), "delete_event", G_CALLBACK(goodbye), NULL); 112 g_signal_connect(G_OBJECT(window), "delete_event",
113 G_CALLBACK(goodbye), NULL);
135 114
136 hbox = gtk_hbox_new(FALSE, 0); 115 hbox = gtk_hbox_new(FALSE, 0);
137 gtk_container_add(GTK_CONTAINER(window), hbox); 116 gtk_container_add(GTK_CONTAINER(window), hbox);
138 117
139 optmenu = gtk_option_menu_new(); 118 optmenu = gtk_option_menu_new();
145 gtk_box_pack_start(GTK_BOX(hbox), entry, FALSE, FALSE, 5); 124 gtk_box_pack_start(GTK_BOX(hbox), entry, FALSE, FALSE, 5);
146 g_signal_connect(G_OBJECT(entry), "activate", G_CALLBACK(send_it), NULL); 125 g_signal_connect(G_OBJECT(entry), "activate", G_CALLBACK(send_it), NULL);
147 126
148 gtk_widget_show_all(window); 127 gtk_widget_show_all(window);
149 128
150 return NULL; 129 return TRUE;
151 } 130 }
152 131
153 void gaim_plugin_remove() 132 static gboolean
133 plugin_unload(GaimPlugin *plugin)
154 { 134 {
155 if (window) 135 if (window)
156 gtk_widget_destroy(window); 136 gtk_widget_destroy(window);
137
157 window = NULL; 138 window = NULL;
158 me = NULL; 139
140 return TRUE;
159 } 141 }
142
143 static GaimPluginInfo info =
144 {
145 2,
146 GAIM_PLUGIN_STANDARD,
147 GAIM_GTK_PLUGIN_TYPE,
148 0,
149 NULL,
150 GAIM_PRIORITY_DEFAULT,
151 RAW_PLUGIN_ID,
152 N_("Raw"),
153 VERSION,
154 N_("Lets you send raw input to text-vased protocols."),
155 N_("Lets you send raw input to text-vased protocols (Jabber, MSN, IRC, "
156 "TOC). Hit 'Enter' in the entry box to send. Watch the debug window."),
157 "Eric Warmenhoven <eric@warmenhoven.org>",
158 WEBSITE,
159 plugin_load,
160 plugin_unload,
161 NULL,
162 NULL,
163 NULL
164 };
165
166 static void
167 __init_plugin(GaimPlugin *plugin)
168 {
169 me = plugin;
170 }
171
172 GAIM_INIT_PLUGIN(raw, __init_plugin, info);