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 }