--- a/mcabber/src/jabglue.c Sat Oct 28 18:14:22 2006 +0200
+++ b/mcabber/src/jabglue.c Sun Oct 29 11:43:00 2006 +0100
@@ -51,6 +51,7 @@
static void statehandler(jconn, int);
static void packethandler(jconn, jpacket);
+void handle_state_events(char* from, xmlnode xmldata);
static void logger(jconn j, int io, const char *buf)
{
@@ -429,6 +430,22 @@
y = xmlnode_insert_tag(x, "subject");
xmlnode_insert_cdata(y, subject, (unsigned) -1);
}
+
+ // TODO: insert event notifications request
+#undef USE_JEP_85
+#ifdef USE_JEP_85
+#define NS_CHAT_STATES "http://jabber.org/features/chatstates"
+ // JEP-85
+ xmlnode event = xmlnode_insert_tag(x, "composing");
+ xmlnode_put_attrib(event, "xmlns", NS_CHAT_STATES);
+#else
+ // JEP-22
+ xmlnode event = xmlnode_insert_tag(x, "x");
+ xmlnode_put_attrib(event, "xmlns", NS_EVENT);
+ xmlnode_insert_tag(event, "composing");
+#endif
+
+
jab_send(jc, x);
xmlnode_free(x);
@@ -1422,6 +1439,8 @@
}
}
+ handle_state_events(from, xmldata);
+
// Not used yet...
x = xml_get_xmlns(xmldata, NS_ENCRYPTED);
if (x && (p = xmlnode_get_data(x)) != NULL) {
@@ -1440,6 +1459,52 @@
g_free(tmp);
}
+void handle_state_events(char* from, xmlnode xmldata)
+{
+ xmlnode x = NULL;
+ char *rname = strchr(from, JID_RESOURCE_SEPARATOR) + 1;
+ char *jid = jidtodisp(from);
+ GSList *slist = roster_find(jid, jidsearch, ROSTER_TYPE_USER);
+ if (slist == NULL) return;
+ int jep85 = 0;
+
+ guint events = buddy_resource_getevents(slist->data, rname);
+
+ x = xml_get_xmlns(xmldata, NS_EVENT);
+ if (x == NULL) {
+ x = xmldata;
+ jep85 = 1;
+ }
+
+ xmlnode tag = xmlnode_get_tag(x, "composing");
+ if (tag != NULL) {
+ events |= ROSTER_EVENT_COMPOSING;
+ } else if (!jep85) {
+ events &= ~ROSTER_EVENT_COMPOSING;
+ }
+
+ if (jep85) {
+ tag = xmlnode_get_tag(x, "paused");
+ if (tag != NULL) {
+ events &= ~ROSTER_EVENT_COMPOSING;
+ }
+ }
+
+ // clear composing and set new message event
+ // if message contains message body
+ if (xmlnode_get_tag_data(xmldata, "body") != NULL) {
+ events |= ROSTER_EVENT_MSG;
+ events &= ~ROSTER_EVENT_COMPOSING;
+ }
+
+ buddy_resource_setevents(slist->data, rname, events);
+
+ scr_UpdateBuddyWindow();
+ scr_DrawRoster();
+
+ g_free(jid);
+}
+
static void evscallback_subscription(eviqs *evp, guint evcontext)
{
char *barejid;