📄 buddies.c
字号:
else { status = xmlnode_insert_tag(x, "show"); show = pmalloco(xmlnode_pool(x), 30); if(buddy->is_away&AIM_ICQ_STATE_CHAT) sprintf(show, "chat"); else if(buddy->is_away&AIM_ICQ_STATE_OCCUPIED) sprintf(show, "dnd"); else if(buddy->is_away&AIM_ICQ_STATE_NA) sprintf(show, "xa"); else if(buddy->is_away&AIM_ICQ_STATE_DND) sprintf(show, "dnd"); else if(buddy->is_away&AIM_ICQ_STATE_AWAY) sprintf(show, "away"); else sprintf(show, "xa"); xmlnode_insert_cdata(status, show, -1); status = xmlnode_insert_tag(x, "status"); status_msg = pmalloco(xmlnode_pool(x), 30); if(buddy->is_away&AIM_ICQ_STATE_NA) sprintf(status_msg, "not available"); else if(buddy->is_away&AIM_ICQ_STATE_OCCUPIED && !(buddy->is_away&AIM_ICQ_STATE_DND)) sprintf(status_msg, "occupied"); else sprintf(status_msg, "%s", show); } xmlnode_insert_cdata(status, status_msg, -1); at_deliver(ti,jp->x); } else if(buddy->is_away == 1 && (buddy->is_away != was_away)) { log_debug(ZONE, "[AT] Requesting Away message for %s", userinfo->sn); aim_getinfo(ass, command->conn, userinfo->sn, AIM_GETINFO_AWAYMESSAGE); } return 1;}int at_parse_offgoing(aim_session_t *ass, aim_frame_t *command, ...){ xmlnode x; jpacket jp; at_buddy buddy; at_session s; ati ti; char *sn; aim_userinfo_t *userinfo; va_list ap; va_start(ap, command); userinfo = va_arg(ap, aim_userinfo_t *); va_end(ap); s = (at_session)ass->aux_data; ti = s->ti; sn = userinfo->sn; buddy = (at_buddy)xhash_get(s->buddies, sn); if(buddy == NULL) { jid jtmp; buddy = pmalloco(s->p, (sizeof(_at_buddy))); buddy->full = jid_new(s->p, ti->i->id); jid_set(buddy->full, sn, JID_USER); buddy->last = xmlnode_new_tag_pool(s->p,"query"); xmlnode_put_attrib(buddy->last,"xmlns",NS_LAST); xmlnode_put_attrib(buddy->last,"stamp",jutil_timestamp()); xhash_put(s->buddies, buddy->full->user, buddy); } buddy->is_away = -1; xmlnode_put_attrib(buddy->last,"stamp",jutil_timestamp()); x = xmlnode_new_tag("presence"); xmlnode_put_attrib(x, "to", jid_full(s->cur)); xmlnode_put_attrib(x, "from", ti->i->id); xmlnode_put_attrib(x, "type","unavailable"); jp = jpacket_new(x); jid_set(jp->from, at_normalize(sn), JID_USER); xmlnode_put_attrib(jp->x, "from", jid_full(jp->from)); at_deliver(ti,jp->x); return 1;}int at_parse_evilnotify(aim_session_t *sess, aim_frame_t *command, ...){ va_list ap; xmlnode x; xmlnode body; jpacket jp; at_session s; ati ti; char msg[100]; int newevil; aim_userinfo_t *userinfo; va_start(ap, command); newevil = va_arg(ap, int); userinfo = va_arg(ap, aim_userinfo_t *); va_end(ap); memset(msg, '\0', 100); snprintf(msg, 100, "Warning from: %s (new level: %2.1f%%", (userinfo && strlen(userinfo->sn))?userinfo->sn:"anonymous", ((float)newevil)/10); s = (at_session)sess->aux_data; ti = s->ti; x = xmlnode_new_tag("message"); xmlnode_put_attrib(x, "to", jid_full(s->cur)); xmlnode_put_attrib(x, "from", jid_full(s->from)); xmlnode_put_attrib(x, "type","error"); body = xmlnode_insert_tag(x, "error"); xmlnode_insert_cdata(body, (char *)&msg, strlen((char *)&msg)); jp = jpacket_new(x); at_deliver(ti,jp->x); return 1;}int at_parse_userinfo(aim_session_t *sess, aim_frame_t *command, ...){ aim_userinfo_t *userinfo; char *prof_encoding = NULL; char *prof = NULL; unsigned short inforeq = 0; xmlnode x; xmlnode show; xmlnode status; jpacket jp; at_session s; ati ti; va_list ap; va_start(ap, command); userinfo = va_arg(ap, aim_userinfo_t *); prof_encoding = va_arg(ap, char *); prof = va_arg(ap, char *); inforeq = va_arg(ap, int); va_end(ap); s = (at_session)sess->aux_data; ti = s->ti; if (inforeq == AIM_GETINFO_GENERALINFO) { /* printf("faimtest: userinfo: profile_encoding: %s\n", prof_encoding ? prof_encoding : "[none]"); printf("faimtest: userinfo: prof: %s\n", prof ? prof : "[none]"); */ } else if (inforeq == AIM_GETINFO_AWAYMESSAGE) { x = xmlnode_new_tag("presence"); xmlnode_put_attrib(x, "to", jid_full(s->cur)); xmlnode_put_attrib(x, "from", ti->i->id); jp = jpacket_new(x); jid_set(jp->from, at_normalize(userinfo->sn), JID_USER); xmlnode_put_attrib(jp->x, "from", jid_full(jp->from)); show = xmlnode_insert_tag(x, "show"); xmlnode_insert_cdata(show, "away", -1); status = xmlnode_insert_tag(x, "status"); if(prof != NULL) { char *p1, *p2; char charset[32]; int len; char *utf8_str; utf8_str = malloc(8192); // obtain charset charset[0] = 0; p1 = strstr(prof_encoding, "charset="); if(p1) { p1 += 8; if(*p1 == '\"') { ++p1; p2 = strchr(p1, '\"'); if(p2) { len = p2 - p1; if(len < 32) { strncpy(charset, p1, len); charset[len] = 0; } } } } // not utf8? if(strcmp(charset, "utf-8")) prof = str_to_UTF8(jp->p, prof); if(!s->icq) { msgconv_aim2plain(prof, utf8_str, 8192); prof = utf8_str; } xmlnode_insert_cdata(status, prof, -1); free(utf8_str); } else { xmlnode_insert_cdata(status, "Away", -1); } at_deliver(ti,jp->x); } else log_debug(ZONE, "[AT] userinfo: unknown info request"); return 1;}#define VCARD_ADD(q, parent, name, value) \ xmlnode_insert_cdata(xmlnode_insert_tag(xmlnode_insert_tag(q,parent),name), \ it_convert_windows2utf8(p,value),-1)int at_parse_icq_simpleinfo(aim_session_t *sess, aim_frame_t *command, ...){ va_list ap; struct aim_icq_simpleinfo *info; jpacket jp; at_session s; xmlnode t, q; pool p; s = (at_session)sess->aux_data; va_start(ap, command); info = va_arg(ap, struct aim_icq_simpleinfo *); va_end(ap); jp = s->icq_vcard_response; if(!jp) log_debug(ZONE, "[AT] got icq_simpleinfo without request, dropped"); q = jp->iq; p = jp->p; t = xmlnode_insert_tag(q,"FN"); if (info->first) { /* we have a first name - if we have a last name, we have to concatenate it */ if (info->last) xmlnode_insert_cdata(t,it_convert_windows2utf8(p,spools(p,info->first," ",info->last,p)),-1); else xmlnode_insert_cdata(t,it_convert_windows2utf8(p,info->first),-1); } else if (info->last) xmlnode_insert_cdata(t,it_convert_windows2utf8(p,info->last),-1); t = xmlnode_insert_tag(q,"N"); if (info->first) xmlnode_insert_cdata(xmlnode_insert_tag(t,"GIVEN"),it_convert_windows2utf8(p,info->first),-1); if (info->last) xmlnode_insert_cdata(xmlnode_insert_tag(t,"FAMILY"),it_convert_windows2utf8(p,info->last),-1); if (info->nick) xmlnode_insert_cdata(xmlnode_insert_tag(q,"NICKNAME"),it_convert_windows2utf8(p,info->nick),-1); if (info->email) { t = VCARD_ADD(q,"EMAIL","USERID",info->email); xmlnode_insert_tag(t,"INTERNET"); xmlnode_insert_tag(t,"PREF"); } at_deliver(s->ti,jp->x); s->icq_vcard_response = NULL; return 1;}int at_parse_locerr(aim_session_t *sess, aim_frame_t *command, ...){/* XXX Do we want this? va_list ap; char *destsn; unsigned short reason; char *sn; xmlnode x; xmlnode body; jpacket jp; session s; char msg[1024]; va_start(ap, command); reason = va_arg(ap, unsigned short); destsn = va_arg(ap, char *); va_end(ap); memset(&msg, '\0', 1024); snprintf("User information for %s unavailable (reason 0x%04x: %s)\n", destsn, reason, (reason<msgerrreasonslen)?msgerrreasons[reason]:"unknown"); s = (session)ass->aux_data; x = xmlnode_new_tag("message"); xmlnode_put_attrib(x, "to", jid_full(s->j)); xmlnode_put_attrib(x, "from", aimtrans__instance->id); xmlnode_put_attrib(x, "type","error"); body = xmlnode_insert_tag(x, "error"); xmlnode_insert_cdata(body, &msg, strlen(&msg)); jp = jpacket_new(x); ehandler_send(ehandler_at, jp->x, s->j->server);*/ return 1;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -