Mercurial > pidgin.yaz
diff src/protocols/oscar/chat.c @ 2821:9467e4ee81be
[gaim-migrate @ 2834]
new libfaim stuff.
committer: Tailor Script <tailor@pidgin.im>
author | Eric Warmenhoven <eric@warmenhoven.org> |
---|---|
date | Sat, 01 Dec 2001 00:56:31 +0000 |
parents | c41030cfed76 |
children | 07283934dedd |
line wrap: on
line diff
--- a/src/protocols/oscar/chat.c Fri Nov 30 21:16:28 2001 +0000 +++ b/src/protocols/oscar/chat.c Sat Dec 01 00:56:31 2001 +0000 @@ -8,16 +8,37 @@ #define FAIM_INTERNAL #include <aim.h> +/* Stored in the ->priv of chat connections */ +struct chatconnpriv { + fu16_t exchange; + char *name; + fu16_t instance; +}; + +faim_internal void aim_conn_kill_chat(aim_session_t *sess, aim_conn_t *conn) +{ + struct chatconnpriv *ccp = (struct chatconnpriv *)conn->priv; + + if (ccp) + free(ccp->name); + free(ccp); + + return; +} + faim_export char *aim_chat_getname(aim_conn_t *conn) { - + struct chatconnpriv *ccp; + if (!conn) return NULL; - + if (conn->type != AIM_CONN_TYPE_CHAT) return NULL; - return (char *)conn->priv; /* yuck ! */ + ccp = (struct chatconnpriv *)conn->priv; + + return ccp->name; } /* XXX get this into conn.c -- evil!! */ @@ -26,21 +47,25 @@ aim_conn_t *cur; for (cur = sess->connlist; cur; cur = cur->next) { + struct chatconnpriv *ccp = (struct chatconnpriv *)cur->priv; + if (cur->type != AIM_CONN_TYPE_CHAT) continue; if (!cur->priv) { faimdprintf(sess, 0, "faim: chat: chat connection with no name! (fd = %d)\n", cur->fd); continue; } - if (strcmp((char *)cur->priv, name) == 0) + + if (strcmp(ccp->name, name) == 0) break; } return cur; } -faim_export int aim_chat_attachname(aim_conn_t *conn, const char *roomname) +faim_export int aim_chat_attachname(aim_conn_t *conn, fu16_t exchange, const char *roomname, fu16_t instance) { + struct chatconnpriv *ccp; if (!conn || !roomname) return -EINVAL; @@ -48,7 +73,14 @@ if (conn->priv) free(conn->priv); - conn->priv = strdup(roomname); + if (!(ccp = malloc(sizeof(struct chatconnpriv)))) + return -ENOMEM; + + ccp->exchange = exchange; + ccp->name = strdup(roomname); + ccp->instance = instance; + + conn->priv = (void *)ccp; return 0; } @@ -95,7 +127,7 @@ aimutil_put8(ckstr+i, (fu8_t) rand()); cookie = aim_mkcookie(ckstr, AIM_COOKIETYPE_CHAT, NULL); - cookie->data = strdup(conn->priv); /* chat hack dependent */ + cookie->data = NULL; /* XXX store something useful here */ aim_cachecookie(sess, cookie); @@ -186,15 +218,20 @@ aim_frame_t *fr; aim_snacid_t snacid; aim_tlvlist_t *tl = NULL; + struct chatsnacinfo csi; if (!sess || !conn || !roomname || !strlen(roomname)) return -EINVAL; - if (!(fr = aim_tx_new(sess, conn, AIM_FRAMETYPE_FLAP, 0x02, 10+9+strlen(roomname)+2))) + if (!(fr = aim_tx_new(sess, conn, AIM_FRAMETYPE_FLAP, 0x02, 512))) return -ENOMEM; + memset(&csi, 0, sizeof(csi)); + csi.exchange = exchange; + strncpy(csi.name, roomname, sizeof(csi.name)); + csi.instance = instance; - snacid = aim_cachesnac(sess, 0x0001, 0x0004, 0x0000, roomname, strlen(roomname)+1); + snacid = aim_cachesnac(sess, 0x0001, 0x0004, 0x0000, &csi, sizeof(csi)); aim_putsnac(&fr->data, 0x0001, 0x0004, 0x0000, snacid); /* @@ -206,18 +243,6 @@ aim_writetlvchain(&fr->data, &tl); aim_freetlvchain(&tl); - /* - * Chat hack. - * - * XXX: A problem occurs here if we request a channel - * join but it fails....pendingjoin will be nonnull - * even though the channel is never going to get a - * redirect! - * - */ - sess->pendingjoin = strdup(roomname); - sess->pendingjoinexchange = exchange; - aim_tx_enqueue(sess, fr); return 0; @@ -371,7 +396,7 @@ fu16_t tlvcount = 0; aim_tlvlist_t *tlvlist; char *roomdesc = NULL; - fu16_t unknown_c9 = 0; + fu16_t flags = 0; fu32_t creationtime = 0; fu16_t maxmsglen = 0, maxvisiblemsglen = 0; fu16_t unknown_d2 = 0, unknown_d5 = 0; @@ -424,10 +449,10 @@ } /* - * Type 0x00c9: Unknown. (2 bytes) + * Type 0x00c9: Flags. (AIM_CHATROOM_FLAG) */ if (aim_gettlv(tlvlist, 0x00c9, 1)) - unknown_c9 = aim_gettlv16(tlvlist, 0x00c9, 1); + flags = aim_gettlv16(tlvlist, 0x00c9, 1); /* * Type 0x00ca: Creation time (4 bytes) @@ -504,7 +529,7 @@ usercount, userinfo, roomdesc, - unknown_c9, + flags, creationtime, maxmsglen, unknown_d2,