Mercurial > ~mikael > mcabber > hg
comparison mcabber/src/xmpp_iq.c @ 1600:c5ee395fbc8c
Updated Entity Capabilities support (XEP-0115)
author | franky |
---|---|
date | Tue, 23 Sep 2008 10:59:25 +0200 |
parents | dcd5d4c75199 |
children | 351427ef0b4b |
comparison
equal
deleted
inserted
replaced
1599:dcd5d4c75199 | 1600:c5ee395fbc8c |
---|---|
459 } | 459 } |
460 return LM_HANDLER_RESULT_REMOVE_MESSAGE; | 460 return LM_HANDLER_RESULT_REMOVE_MESSAGE; |
461 } | 461 } |
462 | 462 |
463 | 463 |
464 // disco_info_set_ext(ansquery, ext) | 464 void _disco_add_feature_helper(gpointer data, gpointer user_data) |
465 // Add features attributes to ansquery for extension ext. | 465 { |
466 static void disco_info_set_ext(LmMessageNode *ansquery, const char *ext) | 466 LmMessageNode *node = user_data; |
467 { | 467 lm_message_node_set_attribute |
468 char *nodename = g_strdup_printf("%s#%s", MCABBER_CAPS_NODE, ext); | 468 (lm_message_node_add_child(node, "feature", NULL), "var", data); |
469 lm_message_node_set_attribute(ansquery, "node", nodename); | 469 } |
470 g_free(nodename); | 470 |
471 if (!strcasecmp(ext, "csn")) { | 471 // disco_info_set_caps(ansquery, entitycaps) |
472 // I guess it's ok to send this even if it's not compiled in. | 472 // Add features attributes to ansquery. entitycaps should either be a |
473 lm_message_node_set_attribute(lm_message_node_add_child(ansquery, | 473 // valid capabilities hash or NULL. If it is NULL, the node attribute won't |
474 "feature", NULL), | 474 // be added to the query child and Entity Capabilities will be announced |
475 "var", NS_CHATSTATES); | 475 // as a feature. |
476 } | |
477 if (!strcasecmp(ext, "iql")) { | |
478 // I guess it's ok to send this even if it's not compiled in. | |
479 lm_message_node_set_attribute(lm_message_node_add_child(ansquery, | |
480 "feature", NULL), | |
481 "var", NS_LAST); | |
482 } | |
483 } | |
484 | |
485 // disco_info_set_default(ansquery, entitycaps) | |
486 // Add features attributes to ansquery. If entitycaps is TRUE, assume | |
487 // that we're answering an Entity Caps request (if not, the request was | |
488 // a basic discovery query). | |
489 // Please change the entity version string if you modify mcabber disco | 476 // Please change the entity version string if you modify mcabber disco |
490 // source code, so that it doesn't conflict with the upstream client. | 477 // source code, so that it doesn't conflict with the upstream client. |
491 static void disco_info_set_default(LmMessageNode *ansquery, guint entitycaps) | 478 static void disco_info_set_caps(LmMessageNode *ansquery, |
492 { | 479 const char *entitycaps) |
493 LmMessageNode *y; | 480 { |
494 char *eversion; | 481 if (entitycaps) { |
495 | 482 char *eversion; |
496 eversion = g_strdup_printf("%s#%s", MCABBER_CAPS_NODE, entity_version()); | 483 eversion = g_strdup_printf("%s#%s", MCABBER_CAPS_NODE, entitycaps); |
497 lm_message_node_set_attribute(ansquery, "node", eversion); | 484 lm_message_node_set_attribute(ansquery, "node", eversion); |
498 g_free(eversion); | 485 g_free(eversion); |
499 | 486 } |
500 y = lm_message_node_add_child(ansquery, "identity", NULL); | 487 |
501 | 488 lm_message_node_set_attributes |
502 lm_message_node_set_attributes(y, | 489 (lm_message_node_add_child(ansquery, "identity", NULL), |
503 "category", "client", | 490 "category", "client", |
504 "type", "pc", | 491 "name", PACKAGE_STRING, |
505 "name", PACKAGE_NAME, | 492 "type", "pc", |
506 NULL); | 493 NULL); |
507 | 494 |
508 lm_message_node_set_attribute | 495 if (entitycaps) |
509 (lm_message_node_add_child(ansquery, "feature", NULL), | 496 caps_foreach_feature(entitycaps, _disco_add_feature_helper, ansquery); |
510 "var", NS_DISCO_INFO); | 497 else { |
511 lm_message_node_set_attribute | 498 caps_foreach_feature(entity_version(xmpp_getstatus()), |
512 (lm_message_node_add_child(ansquery, "feature", NULL), | 499 _disco_add_feature_helper, |
513 "var", NS_MUC); | 500 ansquery); |
514 #ifdef JEP0085 | |
515 // Advertise ChatStates only if we're not using Entity Capabilities | |
516 if (!entitycaps) | |
517 lm_message_node_set_attribute | 501 lm_message_node_set_attribute |
518 (lm_message_node_add_child(ansquery, "feature", NULL), | 502 (lm_message_node_add_child(ansquery, "feature", NULL), |
519 "var", NS_CHATSTATES); | 503 "var", NS_CAPS); |
520 #endif | 504 } |
521 lm_message_node_set_attribute | |
522 (lm_message_node_add_child(ansquery, "feature", NULL), | |
523 "var", NS_TIME); | |
524 lm_message_node_set_attribute | |
525 (lm_message_node_add_child(ansquery, "feature", NULL), | |
526 "var", NS_XMPP_TIME); | |
527 lm_message_node_set_attribute | |
528 (lm_message_node_add_child(ansquery, "feature", NULL), | |
529 "var", NS_VERSION); | |
530 lm_message_node_set_attribute | |
531 (lm_message_node_add_child(ansquery, "feature", NULL), | |
532 "var", NS_PING); | |
533 lm_message_node_set_attribute | |
534 (lm_message_node_add_child(ansquery, "feature", NULL), | |
535 "var", NS_COMMANDS); | |
536 if (!entitycaps) | |
537 lm_message_node_set_attribute | |
538 (lm_message_node_add_child(ansquery, "feature", NULL), | |
539 "var", NS_LAST); | |
540 } | 505 } |
541 | 506 |
542 static LmHandlerResult handle_iq_disco_info(LmMessageHandler *h, | 507 static LmHandlerResult handle_iq_disco_info(LmMessageHandler *h, |
543 LmConnection *c, | 508 LmConnection *c, |
544 LmMessage *m, gpointer ud) | 509 LmMessage *m, gpointer ud) |
545 { | 510 { |
546 LmMessage *r; | 511 LmMessage *r; |
547 LmMessageNode *query, *tmp; | 512 LmMessageNode *query, *tmp; |
548 const char *node = NULL; | 513 const char *node = NULL; |
514 const char *param = NULL; | |
549 | 515 |
550 r = lm_message_new_iq_from_query(m, LM_MESSAGE_SUB_TYPE_RESULT); | 516 r = lm_message_new_iq_from_query(m, LM_MESSAGE_SUB_TYPE_RESULT); |
551 query = lm_message_node_add_child(r->node, "query", NULL); | 517 query = lm_message_node_add_child(r->node, "query", NULL); |
552 lm_message_node_set_attribute(query, "xmlns", NS_DISCO_INFO); | 518 lm_message_node_set_attribute(query, "xmlns", NS_DISCO_INFO); |
553 tmp = lm_message_node_find_child(m->node, "query"); | 519 tmp = lm_message_node_find_child(m->node, "query"); |
554 if (tmp) | 520 if (tmp) { |
555 node = lm_message_node_get_attribute(tmp, "node"); | 521 node = lm_message_node_get_attribute(tmp, "node"); |
556 if (node && startswith(node, MCABBER_CAPS_NODE "#", FALSE)) { | 522 param = node+strlen(MCABBER_CAPS_NODE)+1; |
557 const char *param = node+strlen(MCABBER_CAPS_NODE)+1; | 523 } |
558 if (!strcmp(param, entity_version())) | 524 if (node && startswith(node, MCABBER_CAPS_NODE "#", FALSE)) |
559 disco_info_set_default(query, TRUE); // client#version | 525 disco_info_set_caps(query, param); // client#version |
560 else | 526 else |
561 disco_info_set_ext(query, param); // client#extension | |
562 } else { | |
563 // Basic discovery request | 527 // Basic discovery request |
564 disco_info_set_default(query, FALSE); | 528 disco_info_set_caps(query, NULL); |
565 } | |
566 | 529 |
567 lm_connection_send(c, r, NULL); | 530 lm_connection_send(c, r, NULL); |
568 lm_message_unref(r); | 531 lm_message_unref(r); |
569 return LM_HANDLER_RESULT_REMOVE_MESSAGE; | 532 return LM_HANDLER_RESULT_REMOVE_MESSAGE; |
570 } | 533 } |