X-Git-Url: http://andersk.mit.edu/gitweb/libfaim.git/blobdiff_plain/dd60ff8bdd253cd6c24a9c8bbf6bedeecaade99c..b309471db4d134ce1afd5f562034208b6fe50438:/src/misc.c diff --git a/src/misc.c b/src/misc.c index 5a32a0b..0da3d0d 100644 --- a/src/misc.c +++ b/src/misc.c @@ -81,7 +81,7 @@ faim_export unsigned long aim_bos_changevisibility(struct aim_session_t *sess, listcount = aimutil_itemcnt(localcpy, '&'); packlen = aimutil_tokslen(localcpy, 99, '&') + listcount + 9; - if (!(newpacket = aim_tx_new(AIM_FRAMETYPE_OSCAR, 0x0002, conn, packlen))) + if (!(newpacket = aim_tx_new(sess, conn, AIM_FRAMETYPE_OSCAR, 0x0002, packlen))) return -1; newpacket->lock = 1; @@ -158,18 +158,14 @@ faim_export unsigned long aim_bos_setbuddylist(struct aim_session_t *sess, i = 0; tmpptr = strtok(localcpy, "&"); while ((tmpptr != NULL) && (i < 150)) { -#if debug > 0 - printf("---adding %d: %s (%d)\n", i, tmpptr, strlen(tmpptr)); -#endif + faimdprintf(sess, 2, "---adding %d: %s (%d)\n", i, tmpptr, strlen(tmpptr)); len += 1+strlen(tmpptr); i++; tmpptr = strtok(NULL, "&"); } -#if debug > 0 - printf("*** send buddy list len: %d (%x)\n", len, len); -#endif + faimdprintf(sess, 2, "*** send buddy list len: %d (%x)\n", len, len); - if (!(newpacket = aim_tx_new(AIM_FRAMETYPE_OSCAR, 0x0002, conn, len))) + if (!(newpacket = aim_tx_new(sess, conn, AIM_FRAMETYPE_OSCAR, 0x0002, len))) return -1; newpacket->lock = 1; @@ -182,9 +178,7 @@ faim_export unsigned long aim_bos_setbuddylist(struct aim_session_t *sess, i = 0; tmpptr = strtok(localcpy, "&"); while ((tmpptr != NULL) & (i < 150)) { -#if debug > 0 - printf("---adding %d: %s (%d)\n", i, tmpptr, strlen(tmpptr)); -#endif + faimdprintf(sess, 2, "---adding %d: %s (%d)\n", i, tmpptr, strlen(tmpptr)); newpacket->data[j] = strlen(tmpptr); memcpy(&(newpacket->data[j+1]), tmpptr, strlen(tmpptr)); j += 1+strlen(tmpptr); @@ -210,27 +204,35 @@ faim_export unsigned long aim_bos_setbuddylist(struct aim_session_t *sess, */ faim_export unsigned long aim_bos_setprofile(struct aim_session_t *sess, struct aim_conn_t *conn, - char *profile, - char *awaymsg, + const char *profile, + const char *awaymsg, unsigned short caps) { struct command_tx_struct *newpacket; int i = 0, tmp, caplen; + static const char defencoding[] = {"text/aolrtf; charset=\"us-ascii\""}; - if (!(newpacket = aim_tx_new(AIM_FRAMETYPE_OSCAR, 0x0002, conn, 1152+strlen(profile)+1+(awaymsg?strlen(awaymsg):0)))) + i = 10; + if (profile) + i += 4+strlen(defencoding)+4+strlen(profile); + if (awaymsg) + i += 4+strlen(defencoding)+4+strlen(awaymsg); + i += 4+512; /* for capabilities */ + + if (!(newpacket = aim_tx_new(sess, conn, AIM_FRAMETYPE_OSCAR, 0x0002, i))) return -1; - i += aim_putsnac(newpacket->data, 0x0002, 0x004, 0x0000, sess->snac_nextid); - i += aim_puttlv_str(newpacket->data+i, 0x0001, strlen("text/x-aolrtf; charset=\"us-ascii\""), "text/x-aolrtf; charset=\"us-ascii\""); - i += aim_puttlv_str(newpacket->data+i, 0x0002, strlen(profile), profile); - /* why do we send this twice? */ - i += aim_puttlv_str(newpacket->data+i, 0x0003, strlen("text/x-aolrtf; charset=\"us-ascii\""), "text/x-aolrtf; charset=\"us-ascii\""); - - /* Away message -- we send this no matter what, even if its blank */ - if (awaymsg) + i = aim_putsnac(newpacket->data, 0x0002, 0x004, 0x0000, sess->snac_nextid); + + if (profile) { + i += aim_puttlv_str(newpacket->data+i, 0x0001, strlen(defencoding), defencoding); + i += aim_puttlv_str(newpacket->data+i, 0x0002, strlen(profile), profile); + } + + if (awaymsg) { + i += aim_puttlv_str(newpacket->data+i, 0x0003, strlen(defencoding), defencoding); i += aim_puttlv_str(newpacket->data+i, 0x0004, strlen(awaymsg), awaymsg); - else - i += aim_puttlv_str(newpacket->data+i, 0x0004, 0x0000, NULL); + } /* Capability information. */ @@ -245,58 +247,6 @@ faim_export unsigned long aim_bos_setprofile(struct aim_session_t *sess, return (sess->snac_nextid++); } -/* - * aim_bos_setgroupperm(mask) - * - * Set group permisson mask. Normally 0x1f (all classes). - * - * The group permission mask allows you to keep users of a certain - * class or classes from talking to you. The mask should be - * a bitwise OR of all the user classes you want to see you. - * - */ -faim_export unsigned long aim_bos_setgroupperm(struct aim_session_t *sess, - struct aim_conn_t *conn, - u_long mask) -{ - return aim_genericreq_l(sess, conn, 0x0009, 0x0004, &mask); -} - -faim_internal int aim_parse_bosrights(struct aim_session_t *sess, - struct command_rx_struct *command, ...) -{ - rxcallback_t userfunc = NULL; - int ret=1; - struct aim_tlvlist_t *tlvlist; - unsigned short maxpermits = 0, maxdenies = 0; - - /* - * TLVs follow - */ - if (!(tlvlist = aim_readtlvchain(command->data+10, command->commandlen-10))) - return ret; - - /* - * TLV type 0x0001: Maximum number of buddies on permit list. - */ - if (aim_gettlv(tlvlist, 0x0001, 1)) - maxpermits = aim_gettlv16(tlvlist, 0x0001, 1); - - /* - * TLV type 0x0002: Maximum number of buddies on deny list. - * - */ - if (aim_gettlv(tlvlist, 0x0002, 1)) - maxdenies = aim_gettlv16(tlvlist, 0x0002, 1); - - if ((userfunc = aim_callhandler(command->conn, 0x0009, 0x0003))) - ret = userfunc(sess, command, maxpermits, maxdenies); - - aim_freetlvchain(&tlvlist); - - return ret; -} - /* * aim_bos_clientready() * @@ -321,7 +271,7 @@ faim_export unsigned long aim_bos_clientready(struct aim_session_t *sess, struct command_tx_struct *newpacket; int toolcount = sizeof(tools)/sizeof(struct aim_tool_version); - if (!(newpacket = aim_tx_new(AIM_FRAMETYPE_OSCAR, 0x0002, conn, 1152))) + if (!(newpacket = aim_tx_new(sess, conn, AIM_FRAMETYPE_OSCAR, 0x0002, 1152))) return -1; newpacket->lock = 1; @@ -364,7 +314,7 @@ faim_export unsigned long aim_bos_ackrateresp(struct aim_session_t *sess, struct command_tx_struct *newpacket; int packlen = 20, i=0; - if(!(newpacket = aim_tx_new(AIM_FRAMETYPE_OSCAR, 0x0002, conn, packlen))) + if(!(newpacket = aim_tx_new(sess, conn, AIM_FRAMETYPE_OSCAR, 0x0002, packlen))) return (sess->snac_nextid); newpacket->lock = 1; @@ -419,7 +369,7 @@ faim_export unsigned long aim_setversions(struct aim_session_t *sess, struct command_tx_struct *newpacket; int i; - if (!(newpacket = aim_tx_new(AIM_FRAMETYPE_OSCAR, 0x0002, conn, 10 + (4*12)))) + if (!(newpacket = aim_tx_new(sess, conn, AIM_FRAMETYPE_OSCAR, 0x0002, 10 + (4*16)))) return -1; newpacket->lock = 1; @@ -430,9 +380,6 @@ faim_export unsigned long aim_setversions(struct aim_session_t *sess, i += aimutil_put16(newpacket->data+i, 0x0001); i += aimutil_put16(newpacket->data+i, 0x0003); - i += aimutil_put16(newpacket->data+i, 0x0013); - i += aimutil_put16(newpacket->data+i, 0x0001); - i += aimutil_put16(newpacket->data+i, 0x0002); i += aimutil_put16(newpacket->data+i, 0x0001); @@ -455,11 +402,17 @@ faim_export unsigned long aim_setversions(struct aim_session_t *sess, i += aimutil_put16(newpacket->data+i, 0x0001); i += aimutil_put16(newpacket->data+i, 0x000b); - i += aimutil_put16(newpacket->data+i, 0x0001); + i += aimutil_put16(newpacket->data+i, 0x0002); i += aimutil_put16(newpacket->data+i, 0x000c); i += aimutil_put16(newpacket->data+i, 0x0001); + i += aimutil_put16(newpacket->data+i, 0x0013); + i += aimutil_put16(newpacket->data+i, 0x0001); + + i += aimutil_put16(newpacket->data+i, 0x0015); + i += aimutil_put16(newpacket->data+i, 0x0001); + newpacket->commandlen = i; newpacket->lock = 0; aim_tx_enqueue(sess, newpacket); @@ -505,7 +458,7 @@ faim_export unsigned long aim_flap_nop(struct aim_session_t *sess, { struct command_tx_struct *newpacket; - if (!(newpacket = aim_tx_new(AIM_FRAMETYPE_OSCAR, 0x0005, conn, 0))) + if (!(newpacket = aim_tx_new(sess, conn, AIM_FRAMETYPE_OSCAR, 0x0005, 0))) return sess->snac_nextid; newpacket->lock = 1; @@ -556,7 +509,7 @@ faim_export int aim_send_warning(struct aim_session_t *sess, struct aim_conn_t * struct command_tx_struct *newpacket; int curbyte; - if (!(newpacket = aim_tx_new(AIM_FRAMETYPE_OSCAR, 0x0002, conn, strlen(destsn)+13))) + if (!(newpacket = aim_tx_new(sess, conn, AIM_FRAMETYPE_OSCAR, 0x0002, strlen(destsn)+13))) return -1; newpacket->lock = 1; @@ -608,17 +561,36 @@ faim_internal unsigned long aim_genericreq_n(struct aim_session_t *sess, { struct command_tx_struct *newpacket; - if (!(newpacket = aim_tx_new(AIM_FRAMETYPE_OSCAR, 0x0002, conn, 10))) + if (!(newpacket = aim_tx_new(sess, conn, AIM_FRAMETYPE_OSCAR, 0x0002, 10))) return 0; newpacket->lock = 1; - aim_putsnac(newpacket->data, family, subtype, 0x0000, sess->snac_nextid); + aim_putsnac(newpacket->data, family, subtype, 0x0000, 0x00000000); + + aim_tx_enqueue(sess, newpacket); + + return sess->snac_nextid; +} +faim_internal unsigned long aim_genericreq_n_snacid(struct aim_session_t *sess, + struct aim_conn_t *conn, + unsigned short family, + unsigned short subtype) +{ + struct command_tx_struct *newpacket; + + if (!(newpacket = aim_tx_new(sess, conn, AIM_FRAMETYPE_OSCAR, 0x0002, 10))) + return 0; + + newpacket->lock = 1; + + aim_putsnac(newpacket->data, family, subtype, 0x0000, sess->snac_nextid); aim_cachesnac(sess, family, subtype, 0x0000, NULL, 0); aim_tx_enqueue(sess, newpacket); - return sess->snac_nextid; + + return sess->snac_nextid++; } /* @@ -637,19 +609,19 @@ faim_internal unsigned long aim_genericreq_l(struct aim_session_t *sess, if (!longdata) return aim_genericreq_n(sess, conn, family, subtype); - if (!(newpacket = aim_tx_new(AIM_FRAMETYPE_OSCAR, 0x0002, conn, 10+sizeof(u_long)))) + if (!(newpacket = aim_tx_new(sess, conn, AIM_FRAMETYPE_OSCAR, 0x0002, 10+sizeof(u_long)))) return -1; newpacket->lock = 1; - aim_putsnac(newpacket->data, family, subtype, 0x0000, sess->snac_nextid); - aim_cachesnac(sess, family, subtype, 0x0000, NULL, 0); + aim_putsnac(newpacket->data, family, subtype, 0x0000, 0x00000000); /* copy in data */ newlong = htonl(*longdata); memcpy(&(newpacket->data[10]), &newlong, sizeof(u_long)); aim_tx_enqueue(sess, newpacket); + return sess->snac_nextid; } @@ -665,19 +637,19 @@ faim_internal unsigned long aim_genericreq_s(struct aim_session_t *sess, if (!shortdata) return aim_genericreq_n(sess, conn, family, subtype); - if (!(newpacket = aim_tx_new(AIM_FRAMETYPE_OSCAR, 0x0002, conn, 10+sizeof(u_short)))) + if (!(newpacket = aim_tx_new(sess, conn, AIM_FRAMETYPE_OSCAR, 0x0002, 10+sizeof(u_short)))) return -1; newpacket->lock = 1; - aim_putsnac(newpacket->data, family, subtype, 0x0000, sess->snac_nextid); - aim_cachesnac(sess, family, subtype, 0x0000, NULL, 0); + aim_putsnac(newpacket->data, family, subtype, 0x0000, 0x00000000); /* copy in data */ newshort = htons(*shortdata); memcpy(&(newpacket->data[10]), &newshort, sizeof(u_short)); aim_tx_enqueue(sess, newpacket); + return sess->snac_nextid; } @@ -714,13 +686,12 @@ faim_export unsigned long aim_addicbmparam(struct aim_session_t *sess, struct command_tx_struct *newpacket; int packlen = 10+16, i=0; - if(!(newpacket = aim_tx_new(AIM_FRAMETYPE_OSCAR, 0x0002, conn, packlen))) + if(!(newpacket = aim_tx_new(sess, conn, AIM_FRAMETYPE_OSCAR, 0x0002, packlen))) return (sess->snac_nextid); newpacket->lock = 1; - i = aim_putsnac(newpacket->data, 0x0004, 0x0002, 0x0000, sess->snac_nextid); - aim_cachesnac(sess, 0x0004, 0x0002, 0x0000, NULL, 0); + i = aim_putsnac(newpacket->data, 0x0004, 0x0002, 0x0000, 0x00000000); i += aimutil_put16(newpacket->data+i, 0x0000); i += aimutil_put16(newpacket->data+i, 0x0000); @@ -765,7 +736,7 @@ faim_export unsigned long aim_setdirectoryinfo(struct aim_session_t *sess, struc if(zip) packlen += (strlen(zip) + 4); - if(!(newpacket = aim_tx_new(AIM_FRAMETYPE_OSCAR, 0x0002, conn, packlen+10))) + if(!(newpacket = aim_tx_new(sess, conn, AIM_FRAMETYPE_OSCAR, 0x0002, packlen+10))) return -1; newpacket->lock = 1; @@ -822,7 +793,7 @@ faim_export unsigned long aim_setuserinterests(struct aim_session_t *sess, struc packlen += (strlen(interest5) + 4) ; - if(!(newpacket = aim_tx_new(AIM_FRAMETYPE_OSCAR, 0x0002, conn, packlen+10))) + if(!(newpacket = aim_tx_new(sess, conn, AIM_FRAMETYPE_OSCAR, 0x0002, packlen+10))) return -1; newpacket->lock = 1; @@ -861,7 +832,7 @@ faim_export unsigned long aim_icq_setstatus(struct aim_session_t *sess, data = 0x00030000 | status; /* yay for error checking ;^) */ - if(!(newpacket = aim_tx_new(AIM_FRAMETYPE_OSCAR, 0x0002, conn, 10 + 4))) + if(!(newpacket = aim_tx_new(sess, conn, AIM_FRAMETYPE_OSCAR, 0x0002, 10 + 4))) return -1; newpacket->lock = 1; @@ -876,3 +847,56 @@ faim_export unsigned long aim_icq_setstatus(struct aim_session_t *sess, return(sess->snac_nextid); } + +/* + * Should be generic enough to handle the errors for all families... + * + */ +static int generror(struct aim_session_t *sess, aim_module_t *mod, struct command_rx_struct *rx, aim_modsnac_t *snac, unsigned char *data, int datalen) +{ + int ret = 0; + int error = 0; + aim_rxcallback_t userfunc; + struct aim_snac_t *snac2; + + snac2 = aim_remsnac(sess, snac->id); + + if (datalen) + error = aimutil_get16(data); + + if ((userfunc = aim_callhandler(sess, rx->conn, snac->family, snac->subtype))) + ret = userfunc(sess, rx, error, snac2?snac2->data:NULL); + + if (snac2) + free(snac2->data); + free(snac2); + + return ret; +} + +static int snachandler(struct aim_session_t *sess, aim_module_t *mod, struct command_rx_struct *rx, aim_modsnac_t *snac, unsigned char *data, int datalen) +{ + + if (snac->subtype == 0x0001) + return generror(sess, mod, rx, snac, data, datalen); + else if ((snac->family == 0xffff) && (snac->subtype == 0xffff)) { + aim_rxcallback_t userfunc; + + if ((userfunc = aim_callhandler(sess, rx->conn, snac->family, snac->subtype))) + return userfunc(sess, rx); + } + + return 0; +} + +faim_internal int misc_modfirst(struct aim_session_t *sess, aim_module_t *mod) +{ + + mod->family = 0xffff; + mod->version = 0x0000; + mod->flags = AIM_MODFLAG_MULTIFAMILY; + strncpy(mod->name, "misc", sizeof(mod->name)); + mod->snachandler = snachandler; + + return 0; +}