From f04bd15fad8818671b0b8c3d87928427889c1aaf Mon Sep 17 00:00:00 2001 From: Art Cancro Date: Mon, 26 Jul 2010 20:23:11 +0000 Subject: [PATCH] * When searching instant message logs for transcripts to flush, if it is discovered that at least one party has logged out, flush immediately instead of waiting 5 minutes. --- citadel/modules/instmsg/serv_instmsg.c | 27 ++++++++++++++++++++++++++ citadel/serv_extensions.c | 3 +++ 2 files changed, 30 insertions(+) diff --git a/citadel/modules/instmsg/serv_instmsg.c b/citadel/modules/instmsg/serv_instmsg.c index fd0fa8e33..a061fc846 100644 --- a/citadel/modules/instmsg/serv_instmsg.c +++ b/citadel/modules/instmsg/serv_instmsg.c @@ -523,12 +523,38 @@ void flush_conversations_to_disk(time_t if_older_than) { struct imlog *flush_these = NULL; struct imlog *dont_flush_these = NULL; struct imlog *imptr = NULL; + struct CitContext *nptr; + int nContexts, i; + + nptr = CtdlGetContextArray(&nContexts) ; /* Make a copy of the current wholist */ begin_critical_section(S_IM_LOGS); while (imlist) { imptr = imlist; imlist = imlist->next; + + /* For a two party conversation, if one party has logged out, force flush. */ + if (nptr) { + int user0_is_still_online = 0; + int user1_is_still_online = 0; + for (i=0; iusernums[0]) ++user0_is_still_online; + if (nptr[i].user.usernum == imptr->usernums[1]) ++user1_is_still_online; + } + if (imptr->usernums[0] != imptr->usernums[1]) { /* two party conversation */ + if ((!user0_is_still_online) || (!user1_is_still_online)) { + imptr->lastmsg = 0L; /* force flush */ + } + } + else { /* one party conversation (yes, people do IM themselves) */ + if (!user0_is_still_online) { + imptr->lastmsg = 0L; /* force flush */ + } + } + } + + /* Now test this conversation to see if it qualifies for flushing. */ if ((time(NULL) - imptr->lastmsg) > if_older_than) { /* This conversation qualifies. Move it to the list of ones to flush. */ @@ -543,6 +569,7 @@ void flush_conversations_to_disk(time_t if_older_than) { } imlist = dont_flush_these; end_critical_section(S_IM_LOGS); + free(nptr); /* We are now outside of the critical section, and we are the only thread holding a * pointer to a linked list of conversations to be flushed to disk. diff --git a/citadel/serv_extensions.c b/citadel/serv_extensions.c index dee9b4549..0617cce0a 100644 --- a/citadel/serv_extensions.c +++ b/citadel/serv_extensions.c @@ -891,6 +891,9 @@ void PerformSessionHooks(int EventType) for (fcn = SessionHookTable; fcn != NULL; fcn = fcn->next) { if (fcn->eventtype == EventType) { + if (EventType == EVT_TIMER) { + citthread_setspecific(MyConKey, NULL); /* for every hook */ + } (*fcn->h_function_pointer) (); } } -- 2.30.2