Mercurial > pidgin
view src/protocols/oscar/bos.c @ 8440:be172fe866ac
[gaim-migrate @ 9170]
" This makes yahoo not send out html entities. This is
because the official client will show them raw instead
of parsing them.
This also makes us show html entities raw, since that's
how the other end meant them.
This has some side effects if you type in something
that's valid yahoo markup. The other end will probably
see it as markup and render it as such, etc. Oh well,
it's the way yahoo works.
Better this than "everyone says i'm typing "!"
(This isn't the patch Sean said to write. I still need
to write that. This is sort of related though.)" --marv
committer: Tailor Script <tailor@pidgin.im>
author | Luke Schierer <lschiere@pidgin.im> |
---|---|
date | Sun, 14 Mar 2004 05:37:41 +0000 |
parents | ad243bc63184 |
children | 92cbf9713795 |
line wrap: on
line source
/* * Family 0x0009 - Basic Oscar Service. * * The functionality of this family has been replaced by SSI. */ #define FAIM_INTERNAL #include <aim.h> #include <string.h> /* Subtype 0x0002 - Request BOS rights. */ faim_export int aim_bos_reqrights(aim_session_t *sess, aim_conn_t *conn) { return aim_genericreq_n_snacid(sess, conn, 0x0009, 0x0002); } /* Subtype 0x0003 - BOS Rights. */ static int rights(aim_session_t *sess, aim_module_t *mod, aim_frame_t *rx, aim_modsnac_t *snac, aim_bstream_t *bs) { aim_rxcallback_t userfunc; aim_tlvlist_t *tlvlist; fu16_t maxpermits = 0, maxdenies = 0; int ret = 0; /* * TLVs follow */ tlvlist = aim_tlvlist_read(bs); /* * TLV type 0x0001: Maximum number of buddies on permit list. */ if (aim_tlv_gettlv(tlvlist, 0x0001, 1)) maxpermits = aim_tlv_get16(tlvlist, 0x0001, 1); /* * TLV type 0x0002: Maximum number of buddies on deny list. */ if (aim_tlv_gettlv(tlvlist, 0x0002, 1)) maxdenies = aim_tlv_get16(tlvlist, 0x0002, 1); if ((userfunc = aim_callhandler(sess, rx->conn, snac->family, snac->subtype))) ret = userfunc(sess, rx, maxpermits, maxdenies); aim_tlvlist_free(&tlvlist); return ret; } /* * Subtype 0x0004 - 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 int aim_bos_setgroupperm(aim_session_t *sess, aim_conn_t *conn, fu32_t mask) { return aim_genericreq_l(sess, conn, 0x0009, 0x0004, &mask); } /* * Stubtypes 0x0005, 0x0006, 0x0007, and 0x0008 - Modify permit/deny lists. * * Changes your visibility depending on changetype: * * AIM_VISIBILITYCHANGE_PERMITADD: Lets provided list of names see you * AIM_VISIBILITYCHANGE_PERMIDREMOVE: Removes listed names from permit list * AIM_VISIBILITYCHANGE_DENYADD: Hides you from provided list of names * AIM_VISIBILITYCHANGE_DENYREMOVE: Lets list see you again * * list should be a list of * screen names in the form "Screen Name One&ScreenNameTwo&" etc. * * Equivelents to options in WinAIM: * - Allow all users to contact me: Send an AIM_VISIBILITYCHANGE_DENYADD * with only your name on it. * - Allow only users on my Buddy List: Send an * AIM_VISIBILITYCHANGE_PERMITADD with the list the same as your * buddy list * - Allow only the uesrs below: Send an AIM_VISIBILITYCHANGE_PERMITADD * with everyone listed that you want to see you. * - Block all users: Send an AIM_VISIBILITYCHANGE_PERMITADD with only * yourself in the list * - Block the users below: Send an AIM_VISIBILITYCHANGE_DENYADD with * the list of users to be blocked * * XXX ye gods. */ faim_export int aim_bos_changevisibility(aim_session_t *sess, aim_conn_t *conn, int changetype, const char *denylist) { aim_frame_t *fr; int packlen = 0; fu16_t subtype; char *localcpy = NULL, *tmpptr = NULL; int i; int listcount; aim_snacid_t snacid; if (!denylist) return -EINVAL; if (changetype == AIM_VISIBILITYCHANGE_PERMITADD) subtype = 0x05; else if (changetype == AIM_VISIBILITYCHANGE_PERMITREMOVE) subtype = 0x06; else if (changetype == AIM_VISIBILITYCHANGE_DENYADD) subtype = 0x07; else if (changetype == AIM_VISIBILITYCHANGE_DENYREMOVE) subtype = 0x08; else return -EINVAL; localcpy = strdup(denylist); listcount = aimutil_itemcnt(localcpy, '&'); packlen = aimutil_tokslen(localcpy, 99, '&') + listcount + 9; if (!(fr = aim_tx_new(sess, conn, AIM_FRAMETYPE_FLAP, 0x02, packlen))) { free(localcpy); return -ENOMEM; } snacid = aim_cachesnac(sess, 0x0009, subtype, 0x0000, NULL, 0); aim_putsnac(&fr->data, 0x0009, subtype, 0x00, snacid); for (i = 0; (i < (listcount - 1)) && (i < 99); i++) { tmpptr = aimutil_itemindex(localcpy, i, '&'); aimbs_put8(&fr->data, strlen(tmpptr)); aimbs_putraw(&fr->data, tmpptr, strlen(tmpptr)); free(tmpptr); } free(localcpy); aim_tx_enqueue(sess, fr); return 0; } static int snachandler(aim_session_t *sess, aim_module_t *mod, aim_frame_t *rx, aim_modsnac_t *snac, aim_bstream_t *bs) { if (snac->subtype == 0x0003) return rights(sess, mod, rx, snac, bs); return 0; } faim_internal int bos_modfirst(aim_session_t *sess, aim_module_t *mod) { mod->family = 0x0009; mod->version = 0x0001; mod->toolid = 0x0110; mod->toolversion = 0x0629; mod->flags = 0; strncpy(mod->name, "bos", sizeof(mod->name)); mod->snachandler = snachandler; return 0; }