+/*
+ * Stupidly, XMPP does not specify a way to tell the client to flush its client-side roster
+ * and prepare to receive a new one. So instead we remember every buddy we've ever told the
+ * client about, and push delete operations out at the beginning of a session.
+ *
+ * We omit any users who happen to be online right now, but we still keep them in the mortuary,
+ * which needs to be maintained as a list of every buddy the user has ever seen. We don't know
+ * when they're connecting from the same client and when they're connecting from a different client,
+ * so we have no guarantee of what is in the client side roster at connect time.
+ */
+void xmpp_delete_old_buddies_who_no_longer_exist_from_the_client_roster(void)
+{
+ long len;
+ void *Value;
+ const char *Key;
+ struct CitContext *cptr;
+ int nContexts, i;
+ int online_now = 0;
+ HashList *mortuary = xmpp_fetch_mortuary();
+ HashPos *HashPos = GetNewHashPos(mortuary, 0);
+
+ /* we need to omit anyone who is currently online */
+ cptr = CtdlGetContextArray(&nContexts);
+
+ /* go through the list of users in the mortuary... */
+ while (GetNextHashPos(mortuary, HashPos, &len, &Key, &Value) != 0)
+ {
+
+ online_now = 0;
+ if (cptr) for (i=0; i<nContexts; i++) {
+ if (xmpp_is_visible(&cptr[i], CC)) {
+ if (!strcasecmp(cptr[i].cs_inet_email, (char *)Value)) {
+ online_now = 1;
+ }
+ }
+ }
+
+ if (!online_now) {
+ xmpp_destroy_buddy((char *)Value);
+ }
+
+ }
+ DeleteHashPos(&HashPos);
+ DeleteHash(&mortuary);
+ free(cptr);
+}
+