Mercurial > pidgin
comparison libpurple/protocols/jabber/google.c @ 26476:cd1f3a1750a1
And google session handling
(it turns out this workingdir was --disable-vv. whoops...)
author | Paul Aurich <paul@darkrain42.org> |
---|---|
date | Sat, 04 Apr 2009 08:02:52 +0000 |
parents | 91583903b478 |
children | df9042312063 676494d92262 |
comparison
equal
deleted
inserted
replaced
26475:bf9438ea308d | 26476:cd1f3a1750a1 |
---|---|
372 | 372 |
373 return (session->media != NULL) ? TRUE : FALSE; | 373 return (session->media != NULL) ? TRUE : FALSE; |
374 } | 374 } |
375 | 375 |
376 static void | 376 static void |
377 google_session_handle_initiate(JabberStream *js, GoogleSession *session, xmlnode *packet, xmlnode *sess) | 377 google_session_handle_initiate(JabberStream *js, GoogleSession *session, xmlnode *sess, const char *iq_id) |
378 { | 378 { |
379 JabberIq *result; | 379 JabberIq *result; |
380 GList *codecs = NULL; | 380 GList *codecs = NULL; |
381 xmlnode *desc_element, *codec_element; | 381 xmlnode *desc_element, *codec_element; |
382 PurpleMediaCodec *codec; | 382 PurpleMediaCodec *codec; |
438 G_CALLBACK(google_session_stream_info_cb), session); | 438 G_CALLBACK(google_session_stream_info_cb), session); |
439 | 439 |
440 purple_media_codec_list_free(codecs); | 440 purple_media_codec_list_free(codecs); |
441 | 441 |
442 result = jabber_iq_new(js, JABBER_IQ_RESULT); | 442 result = jabber_iq_new(js, JABBER_IQ_RESULT); |
443 jabber_iq_set_id(result, xmlnode_get_attrib(packet, "id")); | 443 jabber_iq_set_id(result, iq_id); |
444 xmlnode_set_attrib(result->node, "to", session->remote_jid); | 444 xmlnode_set_attrib(result->node, "to", session->remote_jid); |
445 jabber_iq_send(result); | 445 jabber_iq_send(result); |
446 } | 446 } |
447 | 447 |
448 static void | 448 static void |
449 google_session_handle_candidates(JabberStream *js, GoogleSession *session, xmlnode *packet, xmlnode *sess) | 449 google_session_handle_candidates(JabberStream *js, GoogleSession *session, xmlnode *sess, const char *iq_id) |
450 { | 450 { |
451 JabberIq *result; | 451 JabberIq *result; |
452 GList *list = NULL; | 452 GList *list = NULL; |
453 xmlnode *cand; | 453 xmlnode *cand; |
454 static int name = 0; | 454 static int name = 0; |
478 | 478 |
479 purple_media_add_remote_candidates(session->media, "google-voice", session->remote_jid, list); | 479 purple_media_add_remote_candidates(session->media, "google-voice", session->remote_jid, list); |
480 purple_media_candidate_list_free(list); | 480 purple_media_candidate_list_free(list); |
481 | 481 |
482 result = jabber_iq_new(js, JABBER_IQ_RESULT); | 482 result = jabber_iq_new(js, JABBER_IQ_RESULT); |
483 jabber_iq_set_id(result, xmlnode_get_attrib(packet, "id")); | 483 jabber_iq_set_id(result, iq_id); |
484 xmlnode_set_attrib(result->node, "to", session->remote_jid); | 484 xmlnode_set_attrib(result->node, "to", session->remote_jid); |
485 jabber_iq_send(result); | 485 jabber_iq_send(result); |
486 } | 486 } |
487 | 487 |
488 static void | 488 static void |
489 google_session_handle_accept(JabberStream *js, GoogleSession *session, xmlnode *packet, xmlnode *sess) | 489 google_session_handle_accept(JabberStream *js, GoogleSession *session, xmlnode *sess, const char *iq_id) |
490 { | 490 { |
491 xmlnode *desc_element = xmlnode_get_child(sess, "description"); | 491 xmlnode *desc_element = xmlnode_get_child(sess, "description"); |
492 xmlnode *codec_element = xmlnode_get_child(desc_element, "payload-type"); | 492 xmlnode *codec_element = xmlnode_get_child(desc_element, "payload-type"); |
493 GList *codecs = NULL; | 493 GList *codecs = NULL; |
494 JabberIq *result = NULL; | 494 JabberIq *result = NULL; |
512 | 512 |
513 purple_media_stream_info(session->media, PURPLE_MEDIA_INFO_ACCEPT, | 513 purple_media_stream_info(session->media, PURPLE_MEDIA_INFO_ACCEPT, |
514 NULL, NULL, FALSE); | 514 NULL, NULL, FALSE); |
515 | 515 |
516 result = jabber_iq_new(js, JABBER_IQ_RESULT); | 516 result = jabber_iq_new(js, JABBER_IQ_RESULT); |
517 jabber_iq_set_id(result, xmlnode_get_attrib(packet, "id")); | 517 jabber_iq_set_id(result, iq_id); |
518 xmlnode_set_attrib(result->node, "to", session->remote_jid); | 518 xmlnode_set_attrib(result->node, "to", session->remote_jid); |
519 jabber_iq_send(result); | 519 jabber_iq_send(result); |
520 } | 520 } |
521 | 521 |
522 static void | 522 static void |
523 google_session_handle_reject(JabberStream *js, GoogleSession *session, xmlnode *packet, xmlnode *sess) | 523 google_session_handle_reject(JabberStream *js, GoogleSession *session, xmlnode *sess) |
524 { | 524 { |
525 purple_media_end(session->media, NULL, NULL); | 525 purple_media_end(session->media, NULL, NULL); |
526 } | 526 } |
527 | 527 |
528 static void | 528 static void |
529 google_session_handle_terminate(JabberStream *js, GoogleSession *session, xmlnode *packet, xmlnode *sess) | 529 google_session_handle_terminate(JabberStream *js, GoogleSession *session, xmlnode *sess) |
530 { | 530 { |
531 purple_media_end(session->media, NULL, NULL); | 531 purple_media_end(session->media, NULL, NULL); |
532 } | 532 } |
533 | 533 |
534 static void | 534 static void |
535 google_session_parse_iq(JabberStream *js, GoogleSession *session, xmlnode *packet) | 535 google_session_parse_iq(JabberStream *js, GoogleSession *session, xmlnode *sess, const char *iq_id) |
536 { | 536 { |
537 xmlnode *sess = xmlnode_get_child(packet, "session"); | |
538 const char *type = xmlnode_get_attrib(sess, "type"); | 537 const char *type = xmlnode_get_attrib(sess, "type"); |
539 | 538 |
540 if (!strcmp(type, "initiate")) { | 539 if (!strcmp(type, "initiate")) { |
541 google_session_handle_initiate(js, session, packet, sess); | 540 google_session_handle_initiate(js, session, sess, iq_id); |
542 } else if (!strcmp(type, "accept")) { | 541 } else if (!strcmp(type, "accept")) { |
543 google_session_handle_accept(js, session, packet, sess); | 542 google_session_handle_accept(js, session, sess, iq_id); |
544 } else if (!strcmp(type, "reject")) { | 543 } else if (!strcmp(type, "reject")) { |
545 google_session_handle_reject(js, session, packet, sess); | 544 google_session_handle_reject(js, session, sess); |
546 } else if (!strcmp(type, "terminate")) { | 545 } else if (!strcmp(type, "terminate")) { |
547 google_session_handle_terminate(js, session, packet, sess); | 546 google_session_handle_terminate(js, session, sess); |
548 } else if (!strcmp(type, "candidates")) { | 547 } else if (!strcmp(type, "candidates")) { |
549 google_session_handle_candidates(js, session, packet, sess); | 548 google_session_handle_candidates(js, session, sess, iq_id); |
550 } | 549 } |
551 } | 550 } |
552 | 551 |
553 void | 552 void |
554 jabber_google_session_parse(JabberStream *js, xmlnode *packet) | 553 jabber_google_session_parse(JabberStream *js, const char *from, |
554 JabberIqType type, const char *iq_id, | |
555 xmlnode *session_node) | |
555 { | 556 { |
556 GoogleSession *session = NULL; | 557 GoogleSession *session = NULL; |
557 GoogleSessionId id; | 558 GoogleSessionId id; |
558 | 559 |
559 xmlnode *session_node; | |
560 xmlnode *desc_node; | 560 xmlnode *desc_node; |
561 | 561 |
562 GList *iter = NULL; | 562 GList *iter = NULL; |
563 | 563 |
564 if (strcmp(xmlnode_get_attrib(packet, "type"), "set")) | 564 if (type != JABBER_IQ_SET) |
565 return; | |
566 | |
567 session_node = xmlnode_get_child(packet, "session"); | |
568 if (!session_node) | |
569 return; | 565 return; |
570 | 566 |
571 id.id = (gchar*)xmlnode_get_attrib(session_node, "id"); | 567 id.id = (gchar*)xmlnode_get_attrib(session_node, "id"); |
572 if (!id.id) | 568 if (!id.id) |
573 return; | 569 return; |
589 if (iter != NULL) { | 585 if (iter != NULL) { |
590 g_list_free(iter); | 586 g_list_free(iter); |
591 } | 587 } |
592 | 588 |
593 if (session) { | 589 if (session) { |
594 google_session_parse_iq(js, session, packet); | 590 google_session_parse_iq(js, session, session_node, iq_id); |
595 return; | 591 return; |
596 } | 592 } |
597 | 593 |
598 /* If the session doesn't exist, this has to be an initiate message */ | 594 /* If the session doesn't exist, this has to be an initiate message */ |
599 if (strcmp(xmlnode_get_attrib(session_node, "type"), "initiate")) | 595 if (strcmp(xmlnode_get_attrib(session_node, "type"), "initiate")) |
606 session->id.initiator = g_strdup(id.initiator); | 602 session->id.initiator = g_strdup(id.initiator); |
607 session->state = UNINIT; | 603 session->state = UNINIT; |
608 session->js = js; | 604 session->js = js; |
609 session->remote_jid = g_strdup(session->id.initiator); | 605 session->remote_jid = g_strdup(session->id.initiator); |
610 | 606 |
611 google_session_parse_iq(js, session, packet); | 607 google_session_parse_iq(js, session, session_node, iq_id); |
612 } | 608 } |
613 #endif /* USE_VV */ | 609 #endif /* USE_VV */ |
614 | 610 |
615 static void | 611 static void |
616 jabber_gmail_parse(JabberStream *js, const char *from, | 612 jabber_gmail_parse(JabberStream *js, const char *from, |