#include "XMPPThread/internal.h" #include #include #include #include #include #include #include #include static XMLElement * CreateAvatarRequest(char *from, char *to, char *avatar_id) { XMLElement *iq_req, *pubsub, *items, *item; char *id; iq_req = XMLCreateTag("iq"); XMLAddAttr(iq_req, "from", from); XMLAddAttr(iq_req, "to", to); XMLAddAttr(iq_req, "id", (id = StrRandom(16))); XMLAddAttr(iq_req, "type", "get"); pubsub = XMLCreateTag("pubsub"); XMLAddAttr(pubsub, "xmlns", "http://jabber.org/protocol/pubsub"); XMLAddChild(iq_req, pubsub); items = XMLCreateTag("items"); XMLAddAttr(items, "node", "urn:xmpp:avatar:data"); XMLAddChild(pubsub, items); item = XMLCreateTag("item"); XMLAddAttr(item, "id", avatar_id); XMLAddChild(items, item); Free(id); return iq_req; } void PEPAvatarEvent(PEPManager *m, XMLElement *stanza, XMLElement *item) { XMPPThreadInfo *info = PEPManagerCookie(m); XMPPComponent *jabber = info->jabber; ParseeData *args = info->args; DbRef *avatars; HashMap *json; char *publisher = HashMapGet(item->attrs, "publisher"); char *id = HashMapGet(item->attrs, "id"); char *mxid; avatars = DbLock(args->db, 1, "avatars"); if (!avatars) { avatars = DbCreate(args->db, 1, "avatars"); } json = DbJson(avatars); mxid = GrabString(json, 1, publisher); if (mxid && StrEquals(mxid, id)) { /* We have nothing to do. */ goto end; } /* We need to download the media to push it. Let's submit a pubsub request. */ { char *from = HashMapGet(stanza->attrs, "to"); char *to = HashMapGet(stanza->attrs, "from"); char *url = HashMapGet(item->attrs, "url"); XMLElement *request = CreateAvatarRequest(from, to, id); XMPPSendStanza(jabber, request, args->config->max_stanza_size); XMLFreeElement(request); (void) url; /* TODO */ } end: DbUnlock(args->db, avatars); }