comparison libpurple/protocols/jabber/jingle.c @ 25699:301bb7478f74

Simplify the Jingle handlers by moving repetitive code into the parse function.
author Mike Ruprecht <maiku@soc.pidgin.im>
date Fri, 11 Jul 2008 01:04:44 +0000
parents dfa7c7f676b2
children 84c7bb2ca41f
comparison
equal deleted inserted replaced
25698:dfa7c7f676b2 25699:301bb7478f74
583 583
584 return jingle; 584 return jingle;
585 } 585 }
586 586
587 static JabberIq * 587 static JabberIq *
588 jabber_jingle_session_create_ack(JabberStream *js, xmlnode *packet) 588 jabber_jingle_session_create_ack(JingleSession *session, xmlnode *jingle)
589 { 589 {
590 JabberIq *result = jabber_iq_new(js, JABBER_IQ_RESULT); 590 JabberIq *result = jabber_iq_new(
591 jabber_jingle_session_get_js(session),
592 JABBER_IQ_RESULT);
593 xmlnode *packet = jingle->parent;
591 jabber_iq_set_id(result, xmlnode_get_attrib(packet, "id")); 594 jabber_iq_set_id(result, xmlnode_get_attrib(packet, "id"));
592 xmlnode_set_attrib(result->node, "from", xmlnode_get_attrib(packet, "to")); 595 xmlnode_set_attrib(result->node, "from", xmlnode_get_attrib(packet, "to"));
593 xmlnode_set_attrib(result->node, "to", xmlnode_get_attrib(packet, "from")); 596 xmlnode_set_attrib(result->node, "to", xmlnode_get_attrib(packet, "from"));
594 return result; 597 return result;
595 } 598 }
1119 1122
1120 g_list_free(values); 1123 g_list_free(values);
1121 } 1124 }
1122 1125
1123 static void 1126 static void
1124 jabber_jingle_session_handle_content_replace(JabberStream *js, xmlnode *packet) 1127 jabber_jingle_session_handle_content_replace(JingleSession *session, xmlnode *jingle)
1125 { 1128 {
1126 #if 0 1129 #if 0
1127 xmlnode *jingle = xmlnode_get_child(packet, "jingle"); 1130 xmlnode *jingle = xmlnode_get_child(packet, "jingle");
1128 const char *sid = xmlnode_get_attrib(jingle, "sid"); 1131 const char *sid = xmlnode_get_attrib(jingle, "sid");
1129 JingleSession *session = jabber_jingle_session_find_by_id(js, sid); 1132 JingleSession *session = jabber_jingle_session_find_by_id(js, sid);
1148 } 1151 }
1149 #endif 1152 #endif
1150 } 1153 }
1151 1154
1152 static void 1155 static void
1153 jabber_jingle_session_handle_session_accept(JabberStream *js, xmlnode *packet) 1156 jabber_jingle_session_handle_session_accept(JingleSession *session, xmlnode *jingle)
1154 { 1157 {
1155 JabberIq *result = jabber_iq_new(js, JABBER_IQ_RESULT);
1156 xmlnode *jingle = xmlnode_get_child(packet, "jingle");
1157 xmlnode *content = xmlnode_get_child(jingle, "content"); 1158 xmlnode *content = xmlnode_get_child(jingle, "content");
1158 const char *sid = xmlnode_get_attrib(jingle, "sid");
1159 const char *action = xmlnode_get_attrib(jingle, "action"); 1159 const char *action = xmlnode_get_attrib(jingle, "action");
1160 JingleSession *session = jabber_jingle_session_find_by_id(js, sid);
1161 GList *remote_codecs = NULL; 1160 GList *remote_codecs = NULL;
1162 GList *remote_transports = NULL; 1161 GList *remote_transports = NULL;
1163 GList *codec_intersection; 1162 GList *codec_intersection;
1164 FsCodec *top = NULL; 1163 FsCodec *top = NULL;
1165 xmlnode *description = NULL; 1164 xmlnode *description = NULL;
1166 xmlnode *transport = NULL; 1165 xmlnode *transport = NULL;
1167 1166
1168 /* We should probably check validity of the incoming XML... */ 1167 /* We should probably check validity of the incoming XML... */
1169
1170 xmlnode_set_attrib(result->node, "to",
1171 jabber_jingle_session_get_remote_jid(session));
1172 jabber_iq_set_id(result, xmlnode_get_attrib(packet, "id"));
1173 1168
1174 for (content = xmlnode_get_child(jingle, "content"); content; 1169 for (content = xmlnode_get_child(jingle, "content"); content;
1175 content = xmlnode_get_next_twin(content)) { 1170 content = xmlnode_get_next_twin(content)) {
1176 description = xmlnode_get_child(content, "description"); 1171 description = xmlnode_get_child(content, "description");
1177 transport = xmlnode_get_child(content, "transport"); 1172 transport = xmlnode_get_child(content, "transport");
1236 purple_debug_info("jingle", "Got session-accept, starting stream\n"); 1231 purple_debug_info("jingle", "Got session-accept, starting stream\n");
1237 gst_element_set_state(purple_media_get_pipeline(session->media), 1232 gst_element_set_state(purple_media_get_pipeline(session->media),
1238 GST_STATE_PLAYING); 1233 GST_STATE_PLAYING);
1239 } 1234 }
1240 1235
1241 jabber_iq_send(result); 1236 jabber_iq_send(jabber_jingle_session_create_ack(session, jingle));
1242 1237
1243 jabber_jingle_session_set_state(session, ACTIVE); 1238 jabber_jingle_session_set_state(session, ACTIVE);
1244 } 1239 }
1245 1240
1246 static void 1241 static void
1247 jabber_jingle_session_handle_session_info(JabberStream *js, xmlnode *packet) 1242 jabber_jingle_session_handle_session_info(JingleSession *session, xmlnode *jingle)
1248 { 1243 {
1249 purple_debug_info("jingle", "got session-info\n"); 1244 purple_debug_info("jingle", "got session-info\n");
1250 jabber_iq_send(jabber_jingle_session_create_ack(js, packet)); 1245 jabber_iq_send(jabber_jingle_session_create_ack(session, jingle));
1251 } 1246 }
1252 1247
1253 static void 1248 static void
1254 jabber_jingle_session_handle_session_initiate(JabberStream *js, xmlnode *packet) 1249 jabber_jingle_session_handle_session_initiate(JingleSession *session, xmlnode *jingle)
1255 { 1250 {
1256 JingleSession *session = NULL;
1257 xmlnode *jingle = xmlnode_get_child(packet, "jingle");
1258 xmlnode *content = NULL; 1251 xmlnode *content = NULL;
1259 xmlnode *description = NULL; 1252 xmlnode *description = NULL;
1260 xmlnode *transport = NULL; 1253 xmlnode *transport = NULL;
1261 const char *sid = NULL;
1262 const char *initiator = NULL; 1254 const char *initiator = NULL;
1263 GList *codecs = NULL; 1255 GList *codecs = NULL;
1264 1256
1265 if (!jingle) { 1257 if (!jingle) {
1266 purple_debug_error("jingle", "Malformed request"); 1258 purple_debug_error("jingle", "Malformed request");
1267 return; 1259 return;
1268 } 1260 }
1269 1261
1270 sid = xmlnode_get_attrib(jingle, "sid");
1271 initiator = xmlnode_get_attrib(jingle, "initiator"); 1262 initiator = xmlnode_get_attrib(jingle, "initiator");
1272
1273 if (jabber_jingle_session_find_by_id(js, sid)) {
1274 /* This should only happen if you start a session with yourself */
1275 purple_debug_error("jingle", "Jingle session with id={%s} already exists\n", sid);
1276 return;
1277 }
1278
1279 session = jabber_jingle_session_create_by_id(js, sid);
1280 1263
1281 for (content = xmlnode_get_child(jingle, "content"); content; 1264 for (content = xmlnode_get_child(jingle, "content"); content;
1282 content = xmlnode_get_next_twin(content)) { 1265 content = xmlnode_get_next_twin(content)) {
1283 /* init media */ 1266 /* init media */
1284 if (!content) { 1267 if (!content) {
1336 initiator, codecs); 1319 initiator, codecs);
1337 purple_debug_info("jingle", "codec intersection: %i\n", 1320 purple_debug_info("jingle", "codec intersection: %i\n",
1338 g_list_length(purple_media_get_negotiated_codecs(session->media, 1321 g_list_length(purple_media_get_negotiated_codecs(session->media,
1339 xmlnode_get_attrib(content, "name")))); 1322 xmlnode_get_attrib(content, "name"))));
1340 } 1323 }
1341 jabber_iq_send(jabber_jingle_session_create_ack(js, packet)); 1324 jabber_iq_send(jabber_jingle_session_create_ack(session, jingle));
1342 jabber_iq_send(jabber_jingle_session_create_session_info(session, "ringing")); 1325 jabber_iq_send(jabber_jingle_session_create_session_info(session, "ringing"));
1343 1326
1344 purple_media_got_request(jabber_jingle_session_get_media(session)); 1327 purple_media_got_request(jabber_jingle_session_get_media(session));
1345 } 1328 }
1346 1329
1347 static void 1330 static void
1348 jabber_jingle_session_handle_session_terminate(JabberStream *js, xmlnode *packet) 1331 jabber_jingle_session_handle_session_terminate(JingleSession *session, xmlnode *jingle)
1349 { 1332 {
1350 xmlnode *jingle = xmlnode_get_child(packet, "jingle");
1351 const char *sid = xmlnode_get_attrib(jingle, "sid");
1352 JingleSession *session = jabber_jingle_session_find_by_id(js, sid);
1353
1354 if (!session) { 1333 if (!session) {
1355 purple_debug_error("jingle", "jabber_handle_session_terminate couldn't find session\n"); 1334 purple_debug_error("jingle", "jabber_handle_session_terminate couldn't find session\n");
1356 return; 1335 return;
1357 } 1336 }
1358 1337
1359 /* maybe we should look at the reasoncode to determine if it was 1338 /* maybe we should look at the reasoncode to determine if it was
1360 a hangup or a reject, and call different callbacks to purple_media */ 1339 a hangup or a reject, and call different callbacks to purple_media */
1361 gst_element_set_state(purple_media_get_pipeline(session->media), GST_STATE_NULL); 1340 gst_element_set_state(purple_media_get_pipeline(session->media), GST_STATE_NULL);
1362 1341
1363 purple_media_got_hangup(jabber_jingle_session_get_media(session)); 1342 purple_media_got_hangup(jabber_jingle_session_get_media(session));
1364 jabber_iq_send(jabber_jingle_session_create_ack(js, packet)); 1343 jabber_iq_send(jabber_jingle_session_create_ack(session, jingle));
1365 jabber_jingle_session_destroy(session); 1344 jabber_jingle_session_destroy(session);
1366 } 1345 }
1367 1346
1368 static void 1347 static void
1369 jabber_jingle_session_handle_transport_info(JabberStream *js, xmlnode *packet) 1348 jabber_jingle_session_handle_transport_info(JingleSession *session, xmlnode *jingle)
1370 { 1349 {
1371 JabberIq *result = jabber_iq_new(js, JABBER_IQ_RESULT);
1372 xmlnode *jingle = xmlnode_get_child(packet, "jingle");
1373 xmlnode *content = xmlnode_get_child(jingle, "content"); 1350 xmlnode *content = xmlnode_get_child(jingle, "content");
1374 xmlnode *transport = xmlnode_get_child(content, "transport"); 1351 xmlnode *transport = xmlnode_get_child(content, "transport");
1375 GList *remote_candidates = jabber_jingle_get_candidates(transport); 1352 GList *remote_candidates = jabber_jingle_get_candidates(transport);
1376 const char *sid = xmlnode_get_attrib(jingle, "sid");
1377 JingleSession *session = jabber_jingle_session_find_by_id(js, sid);
1378 1353
1379 if (!session) 1354 if (!session)
1380 purple_debug_error("jingle", "jabber_handle_session_candidates couldn't find session\n"); 1355 purple_debug_error("jingle", "jabber_handle_session_candidates couldn't find session\n");
1381 1356
1382 /* send acknowledement */ 1357 /* send acknowledement */
1383 xmlnode_set_attrib(result->node, "id", xmlnode_get_attrib(packet, "id")); 1358 jabber_iq_send(jabber_jingle_session_create_ack(session, jingle));
1384 xmlnode_set_attrib(result->node, "to", xmlnode_get_attrib(packet, "from"));
1385 jabber_iq_send(result);
1386 1359
1387 /* add candidates to our list of remote candidates */ 1360 /* add candidates to our list of remote candidates */
1388 if (g_list_length(remote_candidates) > 0) { 1361 if (g_list_length(remote_candidates) > 0) {
1389 purple_media_add_remote_candidates(session->media, 1362 purple_media_add_remote_candidates(session->media,
1390 xmlnode_get_attrib(content, "name"), 1363 xmlnode_get_attrib(content, "name"),
1391 xmlnode_get_attrib(packet, "from"), 1364 xmlnode_get_attrib(jingle->parent, "from"),
1392 remote_candidates); 1365 remote_candidates);
1393 fs_candidate_list_destroy(remote_candidates); 1366 fs_candidate_list_destroy(remote_candidates);
1394 } 1367 }
1395 } 1368 }
1396 1369
1397 void 1370 void
1398 jabber_jingle_session_parse(JabberStream *js, xmlnode *packet) 1371 jabber_jingle_session_parse(JabberStream *js, xmlnode *packet)
1399 { 1372 {
1400 const gchar *type = xmlnode_get_attrib(packet, "type"); 1373 const gchar *type = xmlnode_get_attrib(packet, "type");
1401 1374 xmlnode *jingle;
1402 if (type && !strcmp(type, "set")) { 1375 const gchar *action;
1403 /* is this a Jingle package? */ 1376 const char *sid;
1404 xmlnode *jingle = xmlnode_get_child(packet, "jingle"); 1377 JingleSession *session;
1405 if (jingle) { 1378
1406 const char *action = xmlnode_get_attrib(jingle, "action"); 1379 if (!type || strcmp(type, "set")) {
1407 purple_debug_info("jabber", "got Jingle package action = %s\n", 1380 /* send iq error here */
1408 action); 1381 return;
1409 if (!strcmp(action, "session-initiate")) { 1382 }
1410 jabber_jingle_session_handle_session_initiate(js, packet); 1383
1411 } else if (!strcmp(action, "session-accept") 1384 /* is this a Jingle package? */
1412 || !strcmp(action, "content-accept")) { 1385 if (!(jingle = xmlnode_get_child(packet, "jingle"))) {
1413 jabber_jingle_session_handle_session_accept(js, packet); 1386 /* send iq error here */
1414 } else if (!strcmp(action, "session-info")) { 1387 return;
1415 jabber_jingle_session_handle_session_info(js, packet); 1388 }
1416 } else if (!strcmp(action, "session-terminate")) { 1389
1417 jabber_jingle_session_handle_session_terminate(js, packet); 1390 if (!(action = xmlnode_get_attrib(jingle, "action"))) {
1418 } else if (!strcmp(action, "transport-info")) { 1391 /* send iq error here */
1419 jabber_jingle_session_handle_transport_info(js, packet); 1392 return;
1420 } else if (!strcmp(action, "content-replace")) { 1393 }
1421 jabber_jingle_session_handle_content_replace(js, packet); 1394
1422 } 1395 purple_debug_info("jabber", "got Jingle package action = %s\n",
1423 1396 action);
1424 return; 1397
1425 } 1398 if (!(sid = xmlnode_get_attrib(jingle, "sid"))) {
1399 /* send iq error here */
1400 return;
1401 }
1402
1403 if (!(session = jabber_jingle_session_find_by_id(js, sid))
1404 && strcmp(action, "session-initiate")) {
1405 purple_debug_error("jingle", "jabber_jingle_session_parse couldn't find session\n");
1406 /* send iq error here */
1407 return;
1408 }
1409
1410 if (!strcmp(action, "session-initiate")) {
1411 if (session) {
1412 /* This should only happen if you start a session with yourself */
1413 purple_debug_error("jingle", "Jingle session with "
1414 "id={%s} already exists\n", sid);
1415 /* send iq error */
1416 } else {
1417 session = jabber_jingle_session_create_by_id(js, sid);
1418 jabber_jingle_session_handle_session_initiate(session, jingle);
1419 }
1420 } else if (!strcmp(action, "session-accept")
1421 || !strcmp(action, "content-accept")) {
1422 jabber_jingle_session_handle_session_accept(session, jingle);
1423 } else if (!strcmp(action, "session-info")) {
1424 jabber_jingle_session_handle_session_info(session, jingle);
1425 } else if (!strcmp(action, "session-terminate")) {
1426 jabber_jingle_session_handle_session_terminate(session, jingle);
1427 } else if (!strcmp(action, "transport-info")) {
1428 jabber_jingle_session_handle_transport_info(session, jingle);
1429 } else if (!strcmp(action, "content-replace")) {
1430 jabber_jingle_session_handle_content_replace(session, jingle);
1426 } 1431 }
1427 } 1432 }
1428 1433
1429 #endif /* USE_VV */ 1434 #endif /* USE_VV */
1430 1435