# HG changeset patch # User Eric Warmenhoven # Date 964159295 0 # Node ID b33ed0a7f49bc75e20fdbd96a54429e9976f4271 # Parent 44123888a9410493e008b8ce72091f4db6dfb822 [gaim-migrate @ 525] DirectIM. fun. bleh. committer: Tailor Script diff -r 44123888a941 -r b33ed0a7f49b src/buddy.c --- a/src/buddy.c Fri Jul 21 01:21:38 2000 +0000 +++ b/src/buddy.c Fri Jul 21 06:01:35 2000 +0000 @@ -472,19 +472,17 @@ gtk_widget_show(button); if (USE_OSCAR) { + button = gtk_menu_item_new_with_label(_("Direct IM")); + gtk_signal_connect(GTK_OBJECT(button), "activate", + GTK_SIGNAL_FUNC(serv_do_imimage), b->name); + gtk_menu_append(GTK_MENU(menu), button); + gtk_widget_show(button); + button = gtk_menu_item_new_with_label(_("Away Msg")); gtk_signal_connect(GTK_OBJECT(button), "activate", GTK_SIGNAL_FUNC(pressed_away_msg), b); gtk_menu_append(GTK_MENU(menu), button); gtk_widget_show(button); - -#if 0 - button = gtk_menu_item_new_with_label(_("Direct IM")); - gtk_signal_connect(GTK_OBJECT(button), "activate", - GTK_SIGNAL_FUNC(serv_do_imimage), b->name); - gtk_menu_append(GTK_MENU(menu), button); - gtk_widget_show(button); -#endif } button = gtk_menu_item_new_with_label(_("Toggle Logging")); @@ -913,6 +911,7 @@ b->pix = gtk_pixmap_new(pm, bm); b->idle = 0; + b->caps = 0; gtk_widget_show(b->pix); diff -r 44123888a941 -r b33ed0a7f49b src/conversation.c --- a/src/conversation.c Fri Jul 21 01:21:38 2000 +0000 +++ b/src/conversation.c Fri Jul 21 06:01:35 2000 +0000 @@ -306,7 +306,10 @@ if (!USE_OSCAR) { /* FIXME */ } else { - aim_conn_kill(c->conn); + gdk_input_remove(c->watcher); + sprintf(debug_buff, "Closing DirectIM conversation (0x%x)\n", c->conn); + debug_print(debug_buff); + aim_conn_kill(gaim_sess, &c->conn); } } delete_conversation(c); diff -r 44123888a941 -r b33ed0a7f49b src/gaim.h --- a/src/gaim.h Fri Jul 21 01:21:38 2000 +0000 +++ b/src/gaim.h Fri Jul 21 06:01:35 2000 +0000 @@ -278,6 +278,7 @@ /* DirectIM stuff */ gboolean is_direct; struct aim_conn_t *conn; /* needed for Oscar */ + int watcher; }; struct file_header { @@ -380,7 +381,7 @@ #define TYPE_SIGNOFF 4 #define TYPE_KEEPALIVE 5 -#define REVISION "gaim:$Revision: 523 $" +#define REVISION "gaim:$Revision: 525 $" #define FLAPON "FLAPON\r\n\r\n" #define ROAST "Tic/Toc" diff -r 44123888a941 -r b33ed0a7f49b src/oscar.c --- a/src/oscar.c Fri Jul 21 01:21:38 2000 +0000 +++ b/src/oscar.c Fri Jul 21 06:01:35 2000 +0000 @@ -85,8 +85,9 @@ static int gaim_parse_msgack (struct aim_session_t *, struct command_rx_struct *, ...); static int gaim_parse_ratechange (struct aim_session_t *, struct command_rx_struct *, ...); -static int gaim_directim_incoming (struct aim_session_t *, struct command_rx_struct *, ...); -static int gaim_directim_typing (struct aim_session_t *, struct command_rx_struct *, ...); +static int gaim_directim_incoming(struct aim_session_t *, struct command_rx_struct *, ...); +static int gaim_directim_typing (struct aim_session_t *, struct command_rx_struct *, ...); +static int gaim_directim_initiate(struct aim_session_t *, struct command_rx_struct *, ...); extern void auth_failed(); @@ -104,14 +105,28 @@ } if (condition & GDK_INPUT_READ) { if (conn->type == AIM_CONN_TYPE_RENDEZVOUS_OUT) { + debug_print("got information on rendezvous\n"); if (aim_handlerendconnect(gaim_sess, conn) < 0) { debug_print(_("connection error (rend)\n")); } } else { + char *direct = NULL; + if (conn->type == AIM_CONN_TYPE_RENDEZVOUS && + conn->subtype == AIM_CONN_SUBTYPE_OFT_DIRECTIM) + direct = g_strdup(((struct aim_directim_priv *)conn->priv)->sn); if (aim_get_command(gaim_sess, conn) >= 0) { aim_rxdispatch(gaim_sess); } else { debug_print(_("connection error!\n")); + if (direct) { + struct conversation *cnv = find_conversation(direct); + debug_print("connection error for directim\n"); + if (cnv) { + cnv->is_direct = 0; + cnv->conn = NULL; + gdk_input_remove(cnv->watcher); + } + } aim_conn_kill(gaim_sess, &conn); if (!aim_getconn_type(gaim_sess, AIM_CONN_TYPE_BOS)) { debug_print(_("major connection error\n")); @@ -122,6 +137,7 @@ gdk_input_remove(inpa); } } + if (direct) g_free(direct); } } } @@ -587,6 +603,7 @@ /* DirectIM stuff */ struct aim_directim_priv *priv; struct aim_conn_t *newconn; + int watcher; userinfo = va_arg(ap, struct aim_userinfo_s *); priv = va_arg(ap, struct aim_directim_priv *); @@ -603,13 +620,13 @@ aim_conn_addhandler(sess, newconn, AIM_CB_FAM_OFT, AIM_CB_OFT_DIRECTIMINCOMING, gaim_directim_incoming, 0); aim_conn_addhandler(sess, newconn, AIM_CB_FAM_OFT, AIM_CB_OFT_DIRECTIMTYPING, gaim_directim_typing, 0); - gdk_input_add(newconn->fd, GDK_INPUT_READ | GDK_INPUT_EXCEPTION, - oscar_callback, newconn); + watcher = gdk_input_add(newconn->fd, GDK_INPUT_READ | GDK_INPUT_EXCEPTION, + oscar_callback, newconn); sprintf(debug_buff, "DirectIM: connected to %s\n", userinfo->sn); debug_print(debug_buff); - serv_got_imimage(priv->sn, priv->cookie, priv->ip, newconn); + serv_got_imimage(priv->sn, priv->cookie, priv->ip, newconn, watcher); } else { sprintf(debug_buff, "Unknown rendtype %d\n", rendtype); debug_print(debug_buff); @@ -905,6 +922,34 @@ return 1; } +/* this is such a f*cked up function */ +int gaim_directim_initiate(struct aim_session_t *sess, struct command_rx_struct *command, ...) { + va_list ap; + struct aim_directim_priv *priv; + struct aim_conn_t *newconn; + struct conversation *cnv; + + va_start(ap, command); + newconn = va_arg(ap, struct aim_conn_t *); + va_end(ap); + + priv = (struct aim_directim_priv *)newconn->priv; + + sprintf(debug_buff, "DirectIM: initiate success to %s\n", priv->sn); + debug_print(debug_buff); + + cnv = find_conversation(priv->sn); + cnv->conn = newconn; + gdk_input_remove(cnv->watcher); + cnv->watcher = gdk_input_add(newconn->fd, GDK_INPUT_READ | GDK_INPUT_EXCEPTION, + oscar_callback, newconn); + + aim_conn_addhandler(sess, newconn, AIM_CB_FAM_OFT, AIM_CB_OFT_DIRECTIMINCOMING, gaim_directim_incoming, 0); + aim_conn_addhandler(sess, newconn, AIM_CB_FAM_OFT, AIM_CB_OFT_DIRECTIMTYPING, gaim_directim_typing, 0); + + return 1; +} + int gaim_directim_typing(struct aim_session_t *sess, struct command_rx_struct *command, ...) { va_list ap; char *sn; @@ -922,5 +967,9 @@ void oscar_do_directim(char *name) { struct aim_conn_t *newconn = aim_directim_initiate(gaim_sess, gaim_conn, NULL, name); - gdk_input_add(newconn->fd, GDK_INPUT_READ | GDK_INPUT_EXCEPTION, oscar_callback, newconn); + struct conversation *cnv = find_conversation(name); /* this will never be null because it just got set up */ + cnv->is_direct = TRUE; + cnv->conn = newconn; + cnv->watcher = gdk_input_add(newconn->fd, GDK_INPUT_READ | GDK_INPUT_EXCEPTION, oscar_callback, newconn); + aim_conn_addhandler(gaim_sess, newconn, AIM_CB_FAM_OFT, AIM_CB_OFT_DIRECTIMINITIATE, gaim_directim_initiate, 0); } diff -r 44123888a941 -r b33ed0a7f49b src/server.c --- a/src/server.c Fri Jul 21 01:21:38 2000 +0000 +++ b/src/server.c Fri Jul 21 06:01:35 2000 +0000 @@ -822,7 +822,7 @@ } #endif b->uc = type; - b->caps = caps; + if (caps) b->caps = caps; b->signon = signon; @@ -1104,13 +1104,17 @@ } void serv_do_imimage(GtkWidget *w, char *name) { + struct conversation *cnv = find_conversation(name); + if (!cnv) cnv = new_conversation(name); + if (!USE_OSCAR) { + /* FIXME */ } else { oscar_do_directim(name); } } -void serv_got_imimage(char *name, char *cookie, char *ip, struct aim_conn_t *conn) +void serv_got_imimage(char *name, char *cookie, char *ip, struct aim_conn_t *conn, int watcher) { if (!USE_OSCAR) { /* FIXME */ @@ -1119,5 +1123,6 @@ if (!cnv) cnv = new_conversation(name); cnv->is_direct = 1; cnv->conn = conn; + cnv->watcher = watcher; } }