Mercurial > hg
comparison mcabber/src/jabglue.c @ 438:b44be19d6229
Handle multiple resources for the same buddy
author | Mikael Berthe <mikael@lilotux.net> |
---|---|
date | Mon, 19 Sep 2005 23:32:42 +0200 |
parents | 802da817a684 |
children | 51b8f10cfeb8 |
comparison
equal
deleted
inserted
replaced
437:170f1aa12989 | 438:b44be19d6229 |
---|---|
97 char *jidtodisp(const char *jid) | 97 char *jidtodisp(const char *jid) |
98 { | 98 { |
99 char *ptr; | 99 char *ptr; |
100 char *alias; | 100 char *alias; |
101 | 101 |
102 while ((alias = g_strdup(jid)) == NULL) | 102 alias = g_strdup(jid); |
103 safe_usleep(100); | |
104 | 103 |
105 if ((ptr = strchr(alias, '/')) != NULL) { | 104 if ((ptr = strchr(alias, '/')) != NULL) { |
106 *ptr = 0; | 105 *ptr = 0; |
107 } | 106 } |
108 return alias; | 107 return alias; |
708 } | 707 } |
709 | 708 |
710 void packethandler(jconn conn, jpacket packet) | 709 void packethandler(jconn conn, jpacket packet) |
711 { | 710 { |
712 char *p, *r; | 711 char *p, *r; |
713 const char *m; | 712 const char *m, *rname; |
714 xmlnode x, y; | 713 xmlnode x, y; |
715 char *from=NULL, *type=NULL, *body=NULL, *enc=NULL; | 714 char *from=NULL, *type=NULL, *body=NULL, *enc=NULL; |
716 char *ns=NULL; | 715 char *ns=NULL; |
717 char *id=NULL; | 716 char *id=NULL; |
718 enum imstatus ust; | 717 enum imstatus ust; |
718 char bpprio; | |
719 | 719 |
720 jb_reset_keepalive(); // reset keepalive delay | 720 jb_reset_keepalive(); // reset keepalive delay |
721 jpacket_reset(packet); | 721 jpacket_reset(packet); |
722 | 722 |
723 p = xmlnode_get_attrib(packet->x, "from"); if (p) from = p; | 723 p = xmlnode_get_attrib(packet->x, "from"); if (p) from = p; |
901 if ((x = xmlnode_get_tag(packet->x, "error")) != NULL) | 901 if ((x = xmlnode_get_tag(packet->x, "error")) != NULL) |
902 display_server_error(x); | 902 display_server_error(x); |
903 g_free(r); | 903 g_free(r); |
904 break; | 904 break; |
905 } | 905 } |
906 x = xmlnode_get_tag(packet->x, "show"); | 906 |
907 p = xmlnode_get_tag_data(packet->x, "priority"); | |
908 if (p && *p) bpprio = (gchar)atoi(p); | |
909 else bpprio = 0; | |
910 | |
907 ust = available; | 911 ust = available; |
908 | 912 p = xmlnode_get_tag_data(packet->x, "show"); |
909 if (x) { | 913 if (p) { |
910 p = xmlnode_get_data(x); if (p) ns = p; | 914 if (!strcmp(p, "away")) ust = away; |
911 | 915 else if (!strcmp(p, "dnd")) ust = dontdisturb; |
912 if (ns) { | 916 else if (!strcmp(p, "xa")) ust = notavail; |
913 if (!strcmp(ns, "away")) ust = away; | 917 else if (!strcmp(p, "chat")) ust = freeforchat; |
914 else if (!strcmp(ns, "dnd")) ust = dontdisturb; | |
915 else if (!strcmp(ns, "xa")) ust = notavail; | |
916 else if (!strcmp(ns, "chat")) ust = freeforchat; | |
917 } | |
918 } | 918 } |
919 | 919 |
920 if (type && !strcmp(type, "unavailable")) | 920 if (type && !strcmp(type, "unavailable")) |
921 ust = offline; | 921 ust = offline; |
922 | 922 |
925 else | 925 else |
926 p = NULL; | 926 p = NULL; |
927 | 927 |
928 // Call hk_statuschange() if status has changed or if the | 928 // Call hk_statuschange() if status has changed or if the |
929 // status message is different | 929 // status message is different |
930 m = roster_getstatusmsg(r); | 930 rname = strchr(from, '/'); |
931 if ((ust != roster_getstatus(r)) || (p && (!m || strcmp(p, m)))) | 931 if (rname) rname++; |
932 hk_statuschange(r, 0, ust, p); | 932 m = roster_getstatusmsg(r, rname); |
933 if ((ust != roster_getstatus(r, rname)) || (p && (!m || strcmp(p, m)))) | |
934 hk_statuschange(r, rname, bpprio, 0, ust, p); | |
933 g_free(r); | 935 g_free(r); |
934 if (p) g_free(p); | 936 if (p) g_free(p); |
935 break; | 937 break; |
936 | 938 |
937 case JPACKET_S10N: | 939 case JPACKET_S10N: |