mcabber/mcabber/xmpp.c
changeset 2013 8dc418af3e72
parent 2010 a73ce708c2c9
child 2017 87049d55e34f
equal deleted inserted replaced
2012:2039ea6bd7a5 2013:8dc418af3e72
   637 // The message is sent to one of the resources with the highest priority.
   637 // The message is sent to one of the resources with the highest priority.
   638 #if defined XEP0022 || defined XEP0085
   638 #if defined XEP0022 || defined XEP0085
   639 void xmpp_send_chatstate(gpointer buddy, guint chatstate)
   639 void xmpp_send_chatstate(gpointer buddy, guint chatstate)
   640 {
   640 {
   641   const char *bjid;
   641   const char *bjid;
       
   642   const char *activeres;
   642 #ifdef XEP0085
   643 #ifdef XEP0085
   643   GSList *resources, *p_res, *p_next;
   644   GSList *resources, *p_res, *p_next;
   644   struct xep0085 *xep85 = NULL;
   645   struct xep0085 *xep85 = NULL;
   645 #endif
   646 #endif
   646 #ifdef XEP0022
   647 #ifdef XEP0022
   647   struct xep0022 *xep22;
   648   struct xep0022 *xep22;
   648 #endif
   649 #endif
   649 
   650 
   650   bjid = buddy_getjid(buddy);
   651   bjid = buddy_getjid(buddy);
   651   if (!bjid) return;
   652   if (!bjid) return;
       
   653   activeres = buddy_getactiveresource(buddy);
   652 
   654 
   653 #ifdef XEP0085
   655 #ifdef XEP0085
   654   /* Send the chatstate to the last resource (which should have the highest
   656   /* Send the chatstate to the last resource (which should have the highest
   655      priority).
   657      priority).
   656      If chatstate is "active", send an "active" state to all resources
   658      If chatstate is "active", send an "active" state to all resources
   660   for (p_res = resources ; p_res ; p_res = p_next) {
   662   for (p_res = resources ; p_res ; p_res = p_next) {
   661     p_next = g_slist_next(p_res);
   663     p_next = g_slist_next(p_res);
   662     xep85 = buddy_resource_xep85(buddy, p_res->data);
   664     xep85 = buddy_resource_xep85(buddy, p_res->data);
   663     if (xep85 && xep85->support == CHATSTATES_SUPPORT_OK) {
   665     if (xep85 && xep85->support == CHATSTATES_SUPPORT_OK) {
   664       // If p_next is NULL, this is the highest (prio) resource, i.e.
   666       // If p_next is NULL, this is the highest (prio) resource, i.e.
   665       // the one we are probably writing to.
   667       // the one we are probably writing to - unless there is defined an
   666       if (!p_next || (xep85->last_state_sent != ROSTER_EVENT_ACTIVE &&
   668       // active resource
   667                       chatstate == ROSTER_EVENT_ACTIVE))
   669       if (!g_strcmp0(p_res->data, activeres) || (!p_next && !activeres) ||
       
   670              (xep85->last_state_sent != ROSTER_EVENT_ACTIVE &&
       
   671               chatstate == ROSTER_EVENT_ACTIVE))
   668         xmpp_send_xep85_chatstate(bjid, p_res->data, chatstate);
   672         xmpp_send_xep85_chatstate(bjid, p_res->data, chatstate);
   669     }
   673     }
   670     g_free(p_res->data);
   674     g_free(p_res->data);
   671   }
   675   }
   672   g_slist_free(resources);
   676   g_slist_free(resources);
   674   // we don't want to send a XEP22 event.
   678   // we don't want to send a XEP22 event.
   675   if (xep85 && xep85->support == CHATSTATES_SUPPORT_OK)
   679   if (xep85 && xep85->support == CHATSTATES_SUPPORT_OK)
   676     return;
   680     return;
   677 #endif
   681 #endif
   678 #ifdef XEP0022
   682 #ifdef XEP0022
   679   xep22 = buddy_resource_xep22(buddy, NULL);
   683   xep22 = buddy_resource_xep22(buddy, activeres);
   680   if (xep22 && xep22->support == CHATSTATES_SUPPORT_OK) {
   684   if (xep22 && xep22->support == CHATSTATES_SUPPORT_OK) {
   681     xmpp_send_xep22_event(bjid, chatstate);
   685     xmpp_send_xep22_event(bjid, chatstate);
   682   }
   686   }
   683 #endif
   687 #endif
   684 }
   688 }