[MOD/FIX] Separate XMPP thread, fix EINVAL issue

threading is good actually. please hmu if you ever trigger the
achievement.
This commit is contained in:
LDA 2024-07-17 22:55:25 +02:00
commit 143bdf0a5a
21 changed files with 2314 additions and 1764 deletions

View file

@ -0,0 +1,85 @@
#include "XMPPThread/internal.h"
#include <Cytoplasm/Memory.h>
#include <Cytoplasm/Json.h>
#include <Cytoplasm/Str.h>
#include <Parsee.h>
#include <XMPP.h>
#include <XML.h>
/* Manages an avatar metadata pubsub item */
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
ManageProfileItem(ParseeData *args, XMLElement *item, XMLElement *stanza, XMPPThread *thr)
{
XMPPComponent *jabber = args->jabber;
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);
pthread_mutex_lock(&jabber->write_lock);
XMLEncode(jabber->stream, request);
StreamFlush(jabber->stream);
pthread_mutex_unlock(&jabber->write_lock);
XMLFreeElement(request);
(void) url; /* TODO */
}
end:
DbUnlock(args->db, avatars);
}