static void _handle_caps(const char *const jid, XMPPCaps *caps) { // hash supported, xep-0115, cache against ver if (g_strcmp0(caps->hash, "sha-1") == 0) { log_info("Hash %s supported", caps->hash); if (caps->ver) { if (caps_cache_contains(caps->ver)) { log_info("Capabilities cache hit: %s, for %s.", caps->ver, jid); caps_map_jid_to_ver(jid, caps->ver); } else { log_info("Capabilities cache miss: %s, for %s, sending service discovery request", caps->ver, jid); char *id = create_unique_id("caps"); iq_send_caps_request(jid, id, caps->node, caps->ver); free(id); } } // unsupported hash, xep-0115, associate with JID, no cache } else if (caps->hash) { log_info("Hash %s not supported: %s, sending service discovery request", caps->hash, jid); char *id = create_unique_id("caps"); iq_send_caps_request_for_jid(jid, id, caps->node, caps->ver); free(id); // no hash, legacy caps, cache against node#ver } else if (caps->node && caps->ver) { log_info("No hash specified: %s, legacy request made for %s#%s", jid, caps->node, caps->ver); char *id = create_unique_id("caps"); iq_send_caps_request_legacy(jid, id, caps->node, caps->ver); free(id); } else { log_info("No hash specified: %s, could not create ver string, not sending service discovery request.", jid); } }
static void _handle_caps(xmpp_stanza_t *const stanza) { char *from = xmpp_stanza_get_attribute(stanza, STANZA_ATTR_FROM); if (from) { char *hash = stanza_caps_get_hash(stanza); // hash supported xep-0115 if (g_strcmp0(hash, "sha-1") == 0) { log_info("Hash %s supported"); char *ver = stanza_get_caps_ver(stanza); if (ver) { if (caps_contains(ver)) { log_info("Capabilities cached: %s", ver); caps_map(from, ver); } else { log_info("Capabilities not cached: %s, sending service discovery request", ver); char *node = stanza_caps_get_node(stanza); char *id = create_unique_id("caps"); iq_send_caps_request(from, id, node, ver); free(id); } } // no hash, or not supported } else { if (hash) { log_info("Hash %s not supported, not sending service discovery request"); // send service discovery request, cache against from full jid } else { log_info("No hash specified, not sending service discovery request"); // do legacy } } } }