#include #include #include #include #define IQ_ADVERT \ AdvertiseSimple("http://jabber.org/protocol/chatstates") \ AdvertiseSimple("http://jabber.org/protocol/commands") \ AdvertiseSimple("http://jabber.org/protocol/caps") \ AdvertiseSimple("urn:xmpp:avatar:metadata+notify") \ AdvertiseSimple("urn:xmpp:avatar:data+notify") \ AdvertiseSimple("urn:xmpp:avatar:metadata") \ AdvertiseSimple("urn:xmpp:message-correct:0") \ AdvertiseSimple("urn:xmpp:message-moderate:0") \ AdvertiseSimple("urn:xmpp:message-moderate:1") \ AdvertiseSimple("urn:xmpp:message-retract:0") \ AdvertiseSimple("urn:xmpp:message-retract:1") \ AdvertiseSimple("urn:xmpp:avatar:data") \ AdvertiseSimple("urn:xmpp:chat-markers:0") \ AdvertiseSimple("urn:xmpp:reactions:0") \ AdvertiseSimple("urn:xmpp:styling:0") \ AdvertiseSimple("urn:xmpp:receipts") \ AdvertiseSimple("urn:xmpp:reply:0") \ AdvertiseSimple("jabber:x:oob") \ AdvertiseSimple("vcard-temp") \ AdvertiseSimple("jabber:iq:version") \ AdvertiseSimple("urn:parsee:x-parsee:0") \ AdvertiseSimple("urn:parsee:jealousy:0") #define IQ_IDENTITY \ IdentitySimple("gateway", "matrix", "Parsee Matrix Gateway") \ IdentitySimple("client", "pc", NAME " v" VERSION " bridge") \ IdentitySimple("component", "generic", "Parsee's component") typedef struct PEPManager PEPManager; typedef void (*PEPEvent)(PEPManager *m, XMLElement *stanza, XMLElement *item); typedef struct XMPPIdentity { char *category, *type, *lang, *name; } XMPPIdentity; typedef struct XMPPThread XMPPThread; typedef struct XMPPThreadInfo { /* A FIFO of stanzas inbound, to be read by dispatcher * threads. */ Array *stanzas; pthread_mutex_t lock; ParseeData *args; XMPPComponent *jabber; XMPPCommandManager *m; PEPManager *pep_manager; struct XMPPThread *dispatchers; size_t available_dispatchers; bool running; pthread_mutex_t chk_lock; } XMPPThreadInfo; struct XMPPThread { pthread_t thr; XMPPThreadInfo *info; }; int ICollate(unsigned char *cata, unsigned char *catb); int IdentitySort(void *idap, void *idbp); char * ParseeGetBridgedRoom(ParseeData *data, XMLElement *stanza); char * ParseeGetEventFromID(ParseeData *data, XMLElement *stanza, char *id); char * ParseeGetReactedEvent(ParseeData *data, XMLElement *stanza); bool ParseeVerifyAllStanza(ParseeData *args, XMLElement *stanza); HashMap * ShoveStanza(HashMap *content, XMLElement *stanza); void ManageProfileItem(ParseeData *args, XMLElement *item, XMLElement *stanza, XMPPThread *thr); XMLElement * CreatePubsubRequest(char *from, char *to, char *node); bool MessageStanza(ParseeData *args, XMLElement *stanza, XMPPThread *thr); void IQStanza(ParseeData *args, XMLElement *stanza, XMPPThread *thr); void PresenceStanza(ParseeData *args, XMLElement *stanza, XMPPThread *thr); bool ServerHasXEP421(ParseeData *data, char *from); PEPManager * CreatePEPManager(ParseeData *data, void *cookie); void * PEPManagerCookie(PEPManager *manager); void PEPManagerAddEvent(PEPManager *manager, char *node, PEPEvent event); bool PEPManagerHandle(PEPManager *manager, XMLElement *stanza); void PEPManagerBroadcast(PEPManager *manager, char *as, XMLElement *item); void DestroyPEPManager(PEPManager *manager); /* PEP callbacks for the handler */ void PEPAvatarEvent(PEPManager *m, XMLElement *stanza, XMLElement *item); void PEPVCardEvent(PEPManager *m, XMLElement *stanza, XMLElement *item); char * ScrambleOID(ParseeData *data, char *opaque_oid); /* Presence management */ void AddPresenceSubscriber(ParseeData *data, char *from, char *to); bool IsSubscribed(ParseeData *data, char *user, char *to);