void xmpp_fetch_mortuary_backend(long msgnum, void *userdata) {
HashList *mortuary = (HashList *) userdata;
struct CtdlMessage *msg;
- const char *ptr = NULL;
- const char *endptr = NULL;
- int in_body = 0;
- char buf[256];
+ char *ptr = NULL;
+ char *lasts = NULL;
msg = CtdlFetchMessage(msgnum, 1);
if (msg == NULL) {
/* now add anyone we find into the hashlist */
- ptr = msg->cm_fields['M'];
- endptr = ptr + strlen(ptr); // only do strlen once :)
- while (ptr = memreadline(ptr, buf, (sizeof buf - 2)), ((ptr < endptr) && (*ptr != 0)) ) {
- if (in_body) {
- Put(mortuary, buf, strlen(buf), buf, generic_free_handler);
+ /* skip past the headers */
+ ptr = strstr(msg->cm_fields['M'], "\n\n");
+ if (ptr != NULL) {
+ ptr += 2;
+ }
+ else {
+ ptr = strstr(msg->cm_fields['M'], "\n\r\n");
+ if (ptr != NULL) {
+ ptr += 3;
}
- if (IsEmptyStr(buf)) in_body = 1;
}
+ /* the remaining lines are addresses */
+ if (ptr != NULL) {
+ ptr = strtok_r(ptr, "\n", &lasts);
+ while (ptr != NULL) {
+ char *pch = strdup(ptr);
+ Put(mortuary, pch, strlen(pch), pch, NULL);
+ ptr = strtok_r(NULL, "\n", &lasts);
+ }
+ }
+
+ TRACE;
CtdlFreeMessage(msg);
+ TRACE;
}
(((cptr[i].cs_flags&CS_STEALTH)==0) || (aide))
&& (cptr[i].user.usernum != CC->user.usernum)
) {
- xmpp_destroy_buddy(cptr[i].cs_inet_email);
if (mortuary) {
char *buddy = strdup(cptr[i].cs_inet_email);
- Put(mortuary, buddy, strlen(buddy),
- buddy, generic_free_handler);
+ Put(mortuary, buddy, strlen(buddy), buddy, NULL);
}
}
}
+/*
+ * 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.
+ */
+void xmpp_delete_old_buddies_who_no_longer_exist_from_the_client_roster(void)
+{
+ long len;
+ void *Value;
+ const char *Key;
+ HashList *mortuary = xmpp_fetch_mortuary();
+ HashPos *HashPos = GetNewHashPos(mortuary, 0);
+
+ /* FIXME delete from the list anyone who is currently online */
+
+ while (GetNextHashPos(mortuary, HashPos, &len, &Key, &Value) != 0)
+ {
+ CtdlLogPrintf(CTDL_DEBUG, "\033[31mDELETE: %s\033[0m\n", (char *)Value);
+ // FIXME xmpp_destroy_buddy((char *)Value);
+ }
+ DeleteHashPos(&HashPos);
+ DeleteHash(&mortuary);
+}