Mercurial > pidgin.yaz
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 |