mcabber/src/jab_iq.c
changeset 1476 77afd831f8f7
parent 1461 8fa24a6d1a93
child 1491 3d47694b4dcc
equal deleted inserted replaced
1475:ef09de538e8f 1476:77afd831f8f7
  1098   xmlnode_free(x);
  1098   xmlnode_free(x);
  1099 }
  1099 }
  1100 
  1100 
  1101 static void xmlnode_insert_dataform_result_message(xmlnode node, char *message)
  1101 static void xmlnode_insert_dataform_result_message(xmlnode node, char *message)
  1102 {
  1102 {
  1103   xmlnode x = xmlnode_insert_tag(node, "x");
  1103   xmlnode x, field, value;
       
  1104 
       
  1105   x = xmlnode_insert_tag(node, "x");
  1104   xmlnode_put_attrib(x, "type", "result");
  1106   xmlnode_put_attrib(x, "type", "result");
  1105   xmlnode_put_attrib(x, "xmlns", "jabber:x:data");
  1107   xmlnode_put_attrib(x, "xmlns", "jabber:x:data");
  1106 
  1108 
  1107   xmlnode field = xmlnode_insert_tag(x, "field");
  1109   field = xmlnode_insert_tag(x, "field");
  1108   xmlnode_put_attrib(field, "type", "text-single");
  1110   xmlnode_put_attrib(field, "type", "text-single");
  1109   xmlnode_put_attrib(field, "var", "message");
  1111   xmlnode_put_attrib(field, "var", "message");
  1110 
  1112 
  1111   xmlnode value = xmlnode_insert_tag(field, "value");
  1113   value = xmlnode_insert_tag(field, "value");
  1112   xmlnode_insert_cdata(value, message, -1);
  1114   xmlnode_insert_cdata(value, message, -1);
  1113 }
  1115 }
  1114 
  1116 
  1115 static char *generate_session_id(char *prefix)
  1117 static char *generate_session_id(char *prefix)
  1116 {
  1118 {
  1138   command = xmlnode_insert_tag(iq, "command");
  1140   command = xmlnode_insert_tag(iq, "command");
  1139   xmlnode_put_attrib(command, "node", node);
  1141   xmlnode_put_attrib(command, "node", node);
  1140   xmlnode_put_attrib(command, "xmlns", NS_COMMANDS);
  1142   xmlnode_put_attrib(command, "xmlns", NS_COMMANDS);
  1141 
  1143 
  1142   if (!sessionid) {
  1144   if (!sessionid) {
       
  1145     xmlnode value;
       
  1146 
  1143     sessionid = generate_session_id("set-status");
  1147     sessionid = generate_session_id("set-status");
  1144     xmlnode_put_attrib(command, "sessionid", sessionid);
  1148     xmlnode_put_attrib(command, "sessionid", sessionid);
  1145     g_free(sessionid);
  1149     g_free(sessionid);
  1146     xmlnode_put_attrib(command, "status", "executing");
  1150     xmlnode_put_attrib(command, "status", "executing");
  1147 
  1151 
  1159     // (with xmlnode_insert_dataform_result_message)
  1163     // (with xmlnode_insert_dataform_result_message)
  1160     y = xmlnode_insert_tag(x, "field");
  1164     y = xmlnode_insert_tag(x, "field");
  1161     xmlnode_put_attrib(y, "type", "hidden");
  1165     xmlnode_put_attrib(y, "type", "hidden");
  1162     xmlnode_put_attrib(y, "var", "FORM_TYPE");
  1166     xmlnode_put_attrib(y, "var", "FORM_TYPE");
  1163 
  1167 
  1164     xmlnode value = xmlnode_insert_tag(y, "value");
  1168     value = xmlnode_insert_tag(y, "value");
  1165     xmlnode_insert_cdata(value, "http://jabber.org/protocol/rc", -1);
  1169     xmlnode_insert_cdata(value, "http://jabber.org/protocol/rc", -1);
  1166 
  1170 
  1167     y = xmlnode_insert_tag(x, "field");
  1171     y = xmlnode_insert_tag(x, "field");
  1168     xmlnode_put_attrib(y, "type", "list-single");
  1172     xmlnode_put_attrib(y, "type", "list-single");
  1169     xmlnode_put_attrib(y, "var", "status");
  1173     xmlnode_put_attrib(y, "var", "status");
  1215   xmlnode_free(iq);
  1219   xmlnode_free(iq);
  1216 }
  1220 }
  1217 
  1221 
  1218 static void _callback_foreach_buddy_groupchat(gpointer rosterdata, void *param)
  1222 static void _callback_foreach_buddy_groupchat(gpointer rosterdata, void *param)
  1219 {
  1223 {
  1220   xmlnode value;
  1224   xmlnode value, option;
  1221   xmlnode *field;
  1225   xmlnode *field;
  1222   const char *room_jid, *nickname;
  1226   const char *room_jid, *nickname;
  1223   char *desc;
  1227   char *desc;
  1224 
  1228 
  1225   room_jid = buddy_getjid(rosterdata);
  1229   room_jid = buddy_getjid(rosterdata);
  1226   if (!room_jid) return;
  1230   if (!room_jid) return;
  1227   nickname = buddy_getnickname(rosterdata);
  1231   nickname = buddy_getnickname(rosterdata);
  1228   if (!nickname) return;
  1232   if (!nickname) return;
  1229   field = param;
  1233   field = param;
  1230 
  1234 
  1231   xmlnode option = xmlnode_insert_tag(*field, "option");
  1235   option = xmlnode_insert_tag(*field, "option");
  1232   value = xmlnode_insert_tag(option, "value");
  1236   value = xmlnode_insert_tag(option, "value");
  1233   xmlnode_insert_cdata(value, room_jid, -1);
  1237   xmlnode_insert_cdata(value, room_jid, -1);
  1234   desc = g_strdup_printf("%s on %s", nickname, room_jid);
  1238   desc = g_strdup_printf("%s on %s", nickname, room_jid);
  1235   xmlnode_put_attrib(option, "label", desc);
  1239   xmlnode_put_attrib(option, "label", desc);
  1236   g_free(desc);
  1240   g_free(desc);
  1251   command = xmlnode_insert_tag(iq, "command");
  1255   command = xmlnode_insert_tag(iq, "command");
  1252   xmlnode_put_attrib(command, "node", node);
  1256   xmlnode_put_attrib(command, "node", node);
  1253   xmlnode_put_attrib(command, "xmlns", NS_COMMANDS);
  1257   xmlnode_put_attrib(command, "xmlns", NS_COMMANDS);
  1254 
  1258 
  1255   if (!sessionid) {
  1259   if (!sessionid) {
       
  1260     xmlnode title, instructions, field, value;
       
  1261 
  1256     sessionid = generate_session_id("leave-groupchats");
  1262     sessionid = generate_session_id("leave-groupchats");
  1257     xmlnode_put_attrib(command, "sessionid", sessionid);
  1263     xmlnode_put_attrib(command, "sessionid", sessionid);
  1258     g_free(sessionid);
  1264     g_free(sessionid);
  1259     xmlnode_put_attrib(command, "status", "executing");
  1265     xmlnode_put_attrib(command, "status", "executing");
  1260 
  1266 
  1261     x = xmlnode_insert_tag(command, "x");
  1267     x = xmlnode_insert_tag(command, "x");
  1262     xmlnode_put_attrib(x, "type", "form");
  1268     xmlnode_put_attrib(x, "type", "form");
  1263     xmlnode_put_attrib(x, "xmlns", "jabber:x:data");
  1269     xmlnode_put_attrib(x, "xmlns", "jabber:x:data");
  1264 
  1270 
  1265     xmlnode title = xmlnode_insert_tag(x, "title");
  1271     title = xmlnode_insert_tag(x, "title");
  1266     xmlnode_insert_cdata(title, "Leave groupchat(s)", -1);
  1272     xmlnode_insert_cdata(title, "Leave groupchat(s)", -1);
  1267 
  1273 
  1268     xmlnode instructions = xmlnode_insert_tag(x, "instructions");
  1274     instructions = xmlnode_insert_tag(x, "instructions");
  1269     xmlnode_insert_cdata(instructions, "What groupchats do you want to leave?",
  1275     xmlnode_insert_cdata(instructions, "What groupchats do you want to leave?",
  1270                          -1);
  1276                          -1);
  1271 
  1277 
  1272     xmlnode field = xmlnode_insert_tag(x, "field");
  1278     field = xmlnode_insert_tag(x, "field");
  1273     xmlnode_put_attrib(field, "type", "hidden");
  1279     xmlnode_put_attrib(field, "type", "hidden");
  1274     xmlnode_put_attrib(field, "var", "FORM_TYPE");
  1280     xmlnode_put_attrib(field, "var", "FORM_TYPE");
  1275 
  1281 
  1276     xmlnode value = xmlnode_insert_tag(field, "value");
  1282     value = xmlnode_insert_tag(field, "value");
  1277     xmlnode_insert_cdata(value, "http://jabber.org/protocol/rc", -1);
  1283     xmlnode_insert_cdata(value, "http://jabber.org/protocol/rc", -1);
  1278 
  1284 
  1279     field = xmlnode_insert_tag(x, "field");
  1285     field = xmlnode_insert_tag(x, "field");
  1280     xmlnode_put_attrib(field, "type", "list-multi");
  1286     xmlnode_put_attrib(field, "type", "list-multi");
  1281     xmlnode_put_attrib(field, "var", "groupchats");
  1287     xmlnode_put_attrib(field, "var", "groupchats");
  1286   }
  1292   }
  1287   else // (if sessionid)
  1293   else // (if sessionid)
  1288   {
  1294   {
  1289     xmlnode form = xmlnode_get_tag(x, "x?xmlns=jabber:x:data");
  1295     xmlnode form = xmlnode_get_tag(x, "x?xmlns=jabber:x:data");
  1290     if (form) {
  1296     if (form) {
       
  1297       xmlnode x, gc;
       
  1298 
  1291       xmlnode_put_attrib(command, "status", "completed");
  1299       xmlnode_put_attrib(command, "status", "completed");
  1292       xmlnode gc = xmlnode_get_tag(form, "field?var=groupchats");
  1300       gc = xmlnode_get_tag(form, "field?var=groupchats");
  1293       xmlnode x;
       
  1294 
  1301 
  1295       for (x = xmlnode_get_firstchild(gc) ; x ; x = xmlnode_get_nextsibling(x))
  1302       for (x = xmlnode_get_firstchild(gc) ; x ; x = xmlnode_get_nextsibling(x))
  1296       {
  1303       {
  1297         char* to_leave = xmlnode_get_tag_data(x, "value");
  1304         char* to_leave = xmlnode_get_tag_data(x, "value");
  1298         if (to_leave) {
  1305         if (to_leave) {