mcabber/src/jabglue.c
changeset 625 028c01940490
parent 624 4e882a19077d
child 628 454399f026fa
equal deleted inserted replaced
624:4e882a19077d 625:028c01940490
   900         break;
   900         break;
   901   }
   901   }
   902   previous_state = state;
   902   previous_state = state;
   903 }
   903 }
   904 
   904 
       
   905 static time_t xml_get_timestamp(xmlnode xmldata)
       
   906 {
       
   907   xmlnode x;
       
   908   char *p;
       
   909 
       
   910   x = xmlnode_get_firstchild(xmldata);
       
   911   for ( ; x; x = xmlnode_get_nextsibling(x)) {
       
   912     if ((p = xmlnode_get_name(x)) && !strcmp(p, "x"))
       
   913       if ((p = xmlnode_get_attrib(x, "xmlns")) && !strcmp(p, NS_DELAY)) {
       
   914         break;
       
   915     }
       
   916   }
       
   917   if ((p = xmlnode_get_attrib(x, "stamp")) != NULL)
       
   918     return from_iso8601(p, 1);
       
   919   return 0;
       
   920 }
       
   921 
   905 static void handle_presence_muc(const char *from, xmlnode xmldata,
   922 static void handle_presence_muc(const char *from, xmlnode xmldata,
   906                                 const char *roomjid, const char *rname,
   923                                 const char *roomjid, const char *rname,
   907                                 enum imstatus ust, char *ustmsg, char bpprio)
   924                                 enum imstatus ust, char *ustmsg,
       
   925                                 time_t usttime, char bpprio)
   908 {
   926 {
   909   xmlnode y;
   927   xmlnode y;
   910   char *p;
   928   char *p;
   911   const char *m;
   929   const char *m;
   912   enum imrole mbrole = role_none;
   930   enum imrole mbrole = role_none;
  1100   }
  1118   }
  1101 
  1119 
  1102   // Update room member status
  1120   // Update room member status
  1103   if (rname) {
  1121   if (rname) {
  1104     gchar *mbrjid_noutf8 = from_utf8(mbjid);
  1122     gchar *mbrjid_noutf8 = from_utf8(mbjid);
  1105     roster_setstatus(roomjid, rname, bpprio, ust, ustmsg,
  1123     roster_setstatus(roomjid, rname, bpprio, ust, ustmsg, usttime,
  1106                      mbrole, mbaffil, mbrjid_noutf8);
  1124                      mbrole, mbaffil, mbrjid_noutf8);
  1107     if (mbrjid_noutf8)
  1125     if (mbrjid_noutf8)
  1108       g_free(mbrjid_noutf8);
  1126       g_free(mbrjid_noutf8);
  1109   } else
  1127   } else
  1110     scr_LogPrint(LPRINT_LOGNORM, "MUC DBG: no rname!"); /* DBG */
  1128     scr_LogPrint(LPRINT_LOGNORM, "MUC DBG: no rname!"); /* DBG */
  1120   char *ustmsg;
  1138   char *ustmsg;
  1121   xmlnode x;
  1139   xmlnode x;
  1122   const char *rname;
  1140   const char *rname;
  1123   enum imstatus ust;
  1141   enum imstatus ust;
  1124   char bpprio;
  1142   char bpprio;
       
  1143   time_t timestamp = 0;
  1125 
  1144 
  1126   r = jidtodisp(from);
  1145   r = jidtodisp(from);
  1127   if (type && !strcmp(type, TMSG_ERROR)) {
  1146   if (type && !strcmp(type, TMSG_ERROR)) {
  1128     scr_LogPrint(LPRINT_LOGNORM, "Error presence packet from <%s>", r);
  1147     scr_LogPrint(LPRINT_LOGNORM, "Error presence packet from <%s>", r);
  1129     if ((x = xmlnode_get_tag(xmldata, TMSG_ERROR)) != NULL)
  1148     if ((x = xmlnode_get_tag(xmldata, TMSG_ERROR)) != NULL)
  1159   }
  1178   }
  1160 
  1179 
  1161   rname = strchr(from, '/');
  1180   rname = strchr(from, '/');
  1162   if (rname) rname++;
  1181   if (rname) rname++;
  1163 
  1182 
       
  1183   // Timestamp?
       
  1184   timestamp = xml_get_timestamp(xmldata);
       
  1185 
  1164   // Check for MUC presence packet
  1186   // Check for MUC presence packet
  1165   // There can be multiple <x> tags!!
  1187   // There can be multiple <x> tags!!
  1166   x = xmlnode_get_firstchild(xmldata);
  1188   x = xmlnode_get_firstchild(xmldata);
  1167   for ( ; x; x = xmlnode_get_nextsibling(x)) {
  1189   for ( ; x; x = xmlnode_get_nextsibling(x)) {
  1168     if ((p = xmlnode_get_name(x)) && !strcmp(p, "x"))
  1190     if ((p = xmlnode_get_name(x)) && !strcmp(p, "x"))
  1169       if ((p = xmlnode_get_attrib(x, "xmlns")) &&
  1191       if ((p = xmlnode_get_attrib(x, "xmlns")) &&
  1170           !strcasecmp(p, "http://jabber.org/protocol/muc#user"))
  1192           !strcmp(p, "http://jabber.org/protocol/muc#user"))
  1171         break;
  1193         break;
  1172   }
  1194   }
  1173   if (x) {
  1195   if (x) {
  1174     // This is a MUC presence message
  1196     // This is a MUC presence message
  1175     handle_presence_muc(from, x, r, rname, ust, ustmsg, bpprio);
  1197     handle_presence_muc(from, x, r, rname, ust, ustmsg, timestamp, bpprio);
  1176   } else {
  1198   } else {
  1177     // Not a MUC message, so this is a regular buddy...
  1199     // Not a MUC message, so this is a regular buddy...
  1178     // Call hk_statuschange() if status has changed or if the
  1200     // Call hk_statuschange() if status has changed or if the
  1179     // status message is different
  1201     // status message is different
  1180     const char *m = roster_getstatusmsg(r, rname);
  1202     const char *m = roster_getstatusmsg(r, rname);
  1181     if ((ust != roster_getstatus(r, rname)) ||
  1203     if ((ust != roster_getstatus(r, rname)) ||
  1182         (!ustmsg && m && m[0]) || (ustmsg && (!m || strcmp(ustmsg, m))))
  1204         (!ustmsg && m && m[0]) || (ustmsg && (!m || strcmp(ustmsg, m))))
  1183       hk_statuschange(r, rname, bpprio, 0, ust, ustmsg);
  1205       hk_statuschange(r, rname, bpprio, timestamp, ust, ustmsg);
  1184   }
  1206   }
  1185 
  1207 
  1186   g_free(r);
  1208   g_free(r);
  1187   if (ustmsg) g_free(ustmsg);
  1209   if (ustmsg) g_free(ustmsg);
  1188 }
  1210 }
  1247      xmlns = jabber:x:encrypted */
  1269      xmlns = jabber:x:encrypted */
  1248 
  1270 
  1249   x = xmlnode_get_firstchild(xmldata);
  1271   x = xmlnode_get_firstchild(xmldata);
  1250   for ( ; x; x = xmlnode_get_nextsibling(x)) {
  1272   for ( ; x; x = xmlnode_get_nextsibling(x)) {
  1251     if ((p = xmlnode_get_name(x)) && !strcmp(p, "x"))
  1273     if ((p = xmlnode_get_name(x)) && !strcmp(p, "x"))
  1252       if ((p = xmlnode_get_attrib(x, "xmlns")) &&
  1274       if ((p = xmlnode_get_attrib(x, "xmlns")) && !strcmp(p, NS_ENCRYPTED))
  1253               !strcasecmp(p, "jabber:x:encrypted"))
       
  1254         if ((p = xmlnode_get_data(x)) != NULL) {
  1275         if ((p = xmlnode_get_data(x)) != NULL) {
  1255           enc = p;
  1276           enc = p;
  1256           break;
  1277           break;
  1257         }
  1278         }
  1258   }
  1279   }
  1259 
  1280 
  1260   // Timestamp?
  1281   // Timestamp?
  1261   if ((x = xmlnode_get_tag(xmldata, "x")) != NULL) {
  1282   timestamp = xml_get_timestamp(xmldata);
  1262     if ((p = xmlnode_get_attrib(x, "stamp")) != NULL)
       
  1263       timestamp = from_iso8601(p, 1);
       
  1264   }
       
  1265 
  1283 
  1266   if (type && !strcmp(type, TMSG_ERROR)) {
  1284   if (type && !strcmp(type, TMSG_ERROR)) {
  1267     if ((x = xmlnode_get_tag(xmldata, TMSG_ERROR)) != NULL)
  1285     if ((x = xmlnode_get_tag(xmldata, TMSG_ERROR)) != NULL)
  1268       display_server_error(x);
  1286       display_server_error(x);
  1269   }
  1287   }