# HG changeset patch # User Mikael Berthe # Date 1163188450 -3600 # Node ID e5c10cc296603fbe6bc8564f9c67762cd274a34c # Parent b57a01ffeed631a2c6df0af0f9b2b98482012a21 Improve vcard support This patch adds support for the address, telephone and email fields when receiving a vCard IQ result. diff -r b57a01ffeed6 -r e5c10cc29660 mcabber/src/jab_iq.c --- a/mcabber/src/jab_iq.c Wed Nov 08 22:26:27 2006 +0100 +++ b/mcabber/src/jab_iq.c Fri Nov 10 20:54:10 2006 +0100 @@ -403,13 +403,160 @@ scr_WriteIncomingMessage(barejid, buf, 0, HBB_PREFIX_NONE); g_free(buf); } - } else if (!strcmp(p, "ADR")) { // TODO - } else if (!strcmp(p, "TEL")) { // TODO + } else if (!strcmp(p, "ADR")) { + enum { + adr_home = 1<<0, + adr_work = 1<<1, + adr_postal = 1<<2, + adr_pref = 1<<3, + } adr_attrib = 0; + if (xmlnode_get_tag(x, "HOME")) + adr_attrib |= adr_home; + if (xmlnode_get_tag(x, "WORK")) + adr_attrib |= adr_work; + if (xmlnode_get_tag(x, "POSTAL")) + adr_attrib |= adr_postal; + if (xmlnode_get_tag(x, "PREF")) + adr_attrib |= adr_pref; + data = xmlnode_get_tag_data(x, "EXTADD"); // Ext. Address + if (data) { + buf = g_strdup_printf("Addr (ext): %s%s%s%s %s", + (adr_attrib & adr_home ? "[home]" : ""), + (adr_attrib & adr_work ? "[work]" : ""), + (adr_attrib & adr_postal ? "[voice]" : ""), + (adr_attrib & adr_pref ? "[pref]" : ""), + data); + scr_WriteIncomingMessage(barejid, buf, 0, HBB_PREFIX_NONE); + g_free(buf); + } + data = xmlnode_get_tag_data(x, "STREET"); // Street + if (data) { + buf = g_strdup_printf("Street: %s%s%s%s %s", + (adr_attrib & adr_home ? "[home]" : ""), + (adr_attrib & adr_work ? "[work]" : ""), + (adr_attrib & adr_postal ? "[voice]" : ""), + (adr_attrib & adr_pref ? "[pref]" : ""), + data); + scr_WriteIncomingMessage(barejid, buf, 0, HBB_PREFIX_NONE); + g_free(buf); + } + data = xmlnode_get_tag_data(x, "LOCALITY"); // Locality + if (data) { + buf = g_strdup_printf("Locality: %s%s%s%s %s", + (adr_attrib & adr_home ? "[home]" : ""), + (adr_attrib & adr_work ? "[work]" : ""), + (adr_attrib & adr_postal ? "[voice]" : ""), + (adr_attrib & adr_pref ? "[pref]" : ""), + data); + scr_WriteIncomingMessage(barejid, buf, 0, HBB_PREFIX_NONE); + g_free(buf); + } + data = xmlnode_get_tag_data(x, "REGION"); // Region + if (data) { + buf = g_strdup_printf("Region: %s%s%s%s %s", + (adr_attrib & adr_home ? "[home]" : ""), + (adr_attrib & adr_work ? "[work]" : ""), + (adr_attrib & adr_postal ? "[voice]" : ""), + (adr_attrib & adr_pref ? "[pref]" : ""), + data); + scr_WriteIncomingMessage(barejid, buf, 0, HBB_PREFIX_NONE); + g_free(buf); + } + data = xmlnode_get_tag_data(x, "PCODE"); // Postal Code + if (data) { + buf = g_strdup_printf("Postal code: %s%s%s%s %s", + (adr_attrib & adr_home ? "[home]" : ""), + (adr_attrib & adr_work ? "[work]" : ""), + (adr_attrib & adr_postal ? "[voice]" : ""), + (adr_attrib & adr_pref ? "[pref]" : ""), + data); + scr_WriteIncomingMessage(barejid, buf, 0, HBB_PREFIX_NONE); + g_free(buf); + } + data = xmlnode_get_tag_data(x, "CTRY"); // Country + if (data) { + buf = g_strdup_printf("Country: %s%s%s%s %s", + (adr_attrib & adr_home ? "[home]" : ""), + (adr_attrib & adr_work ? "[work]" : ""), + (adr_attrib & adr_postal ? "[voice]" : ""), + (adr_attrib & adr_pref ? "[pref]" : ""), + data); + scr_WriteIncomingMessage(barejid, buf, 0, HBB_PREFIX_NONE); + g_free(buf); + } + } else if (!strcmp(p, "TEL")) { + enum { + tel_home = 1<<0, + tel_work = 1<<1, + tel_voice = 1<<2, + tel_fax = 1<<3, + tel_cell = 1<<4, + tel_pref = 1<<5 + } tel_attrib = 0; + data = xmlnode_get_tag_data(x, "NUMBER"); + if (data) { + if (xmlnode_get_tag(x, "HOME")) + tel_attrib |= tel_home; + if (xmlnode_get_tag(x, "WORK")) + tel_attrib |= tel_work; + if (xmlnode_get_tag(x, "VOICE")) + tel_attrib |= tel_voice; + if (xmlnode_get_tag(x, "FAX")) + tel_attrib |= tel_fax; + if (xmlnode_get_tag(x, "CELL")) + tel_attrib |= tel_cell; + if (xmlnode_get_tag(x, "PREF")) + tel_attrib |= tel_pref; + buf = g_strdup_printf("Phone: %s%s%s%s%s%s %s", + (tel_attrib & tel_home ? "[home]" : ""), + (tel_attrib & tel_work ? "[work]" : ""), + (tel_attrib & tel_voice ? "[voice]" : ""), + (tel_attrib & tel_fax ? "[fax]" : ""), + (tel_attrib & tel_cell ? "[cell]" : ""), + (tel_attrib & tel_pref ? "[pref]" : ""), + data); + scr_WriteIncomingMessage(barejid, buf, 0, HBB_PREFIX_NONE); + g_free(buf); + } } else if (!strcmp(p, "EMAIL")) { + enum { + email_home = 1<<0, + email_work = 1<<1, + email_inet = 1<<2, + email_pref = 1<<3 + } email_attrib = 0; data = xmlnode_get_tag_data(x, "USERID"); - if (data) - title = "Email"; // XXX - } else if (!strcmp(p, "ORG")) { // TODO + if (data) { + if (xmlnode_get_tag(x, "HOME")) + email_attrib |= email_home; + if (xmlnode_get_tag(x, "WORK")) + email_attrib |= email_work; + if (xmlnode_get_tag(x, "INTERNET")) + email_attrib |= email_inet; + if (xmlnode_get_tag(x, "PREF")) + email_attrib |= email_pref; + buf = g_strdup_printf("Email: %s%s%s%s %s", + (email_attrib & email_home ? "[home]" : ""), + (email_attrib & email_work ? "[work]" : ""), + (email_attrib & email_inet ? "[inet]" : ""), + (email_attrib & email_pref ? "[pref]" : ""), + data); + scr_WriteIncomingMessage(barejid, buf, 0, HBB_PREFIX_NONE); + g_free(buf); + } + } else if (!strcmp(p, "ORG")) { + data = xmlnode_get_tag_data(x, "ORGNAME"); + if (data) { + buf = g_strdup_printf("Organisation name: %s", data); + scr_WriteIncomingMessage(barejid, buf, 0, HBB_PREFIX_NONE); + g_free(buf); + } + data = xmlnode_get_tag_data(x, "ORGUNIT"); + if (data) { + buf = g_strdup_printf("Organisation unit: %s", data); + scr_WriteIncomingMessage(barejid, buf, 0, HBB_PREFIX_NONE); + g_free(buf); + } } if (title) {