/*
* Consolidate mail from remote POP3 accounts.
*
- * Copyright (c) 2007-2011 by the citadel.org team
+ * Copyright (c) 2007-2015 by the citadel.org team
*
* This program is open source software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License as published
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#include <stdlib.h>
#include <unistd.h>
#include <stdio.h>
+#include <sysconfig.h>
#if TIME_WITH_SYS_TIME
# include <sys/time.h>
#define EVP3C_syslog(LEVEL, FORMAT, ...) \
DBGLOG(LEVEL) syslog(LEVEL, \
- "IO[%ld]CC[%d][%ld]POP3: " FORMAT, \
- IO->ID, CCID, N, __VA_ARGS__)
+ "%s[%ld]CC[%d][%ld]POP3: " FORMAT, \
+ IOSTR, IO->ID, CCID, N, __VA_ARGS__)
#define EVP3CM_syslog(LEVEL, FORMAT) \
DBGLOG(LEVEL) syslog(LEVEL, \
- "IO[%ld]CC[%d][%ld]POP3: " FORMAT, \
- IO->ID, CCID, N)
+ "%s[%ld]CC[%d][%ld]POP3: " FORMAT, \
+ IOSTR, IO->ID, CCID, N)
#define EVP3CQ_syslog(LEVEL, FORMAT, ...) \
DBGLOG(LEVEL) syslog(LEVEL, \
- "P3Q:" FORMAT, \
- __VA_ARGS__)
+ "%s P3Q:" FORMAT, \
+ IOSTR, __VA_ARGS__)
#define EVP3CQM_syslog(LEVEL, FORMAT) \
DBGLOG(LEVEL) syslog(LEVEL, \
- "P3Q" FORMAT \
- )
+ "%s P3Q" FORMAT, \
+ IOSTR)
#define EVP3CCS_syslog(LEVEL, FORMAT, ...) \
- DBGLOG(LEVEL) syslog(LEVEL, "IO[%ld][%ld]POP3: " FORMAT, \
- IO->ID, N, __VA_ARGS__)
+ DBGLOG(LEVEL) syslog(LEVEL, "%s[%ld][%ld]POP3: " FORMAT, \
+ IOSTR, IO->ID, N, __VA_ARGS__)
#define EVP3CCSM_syslog(LEVEL, FORMAT) \
- DBGLOG(LEVEL) syslog(LEVEL, "IO[%ld][%ld]POP3: " FORMAT, \
- IO->ID, N)
+ DBGLOG(LEVEL) syslog(LEVEL, "%s[%ld][%ld]POP3: " FORMAT, \
+ IOSTR, IO->ID, N)
#define POP3C_DBG_SEND() \
EVP3C_syslog(LOG_DEBUG, \
- "IO[%ld]CC[%d][%ld]POP3: > %s\n", \
- IO->ID, CCID, N, \
+ "%s[%ld]CC[%d][%ld]POP3: > %s\n", \
+ IOSTR, IO->ID, CCID, N, \
ChrPtr(RecvMsg->IO.SendBuf.Buf))
#define POP3C_DBG_READ() \
EVP3C_syslog(LOG_DEBUG, \
- "IO[%ld]CC[%d][%ld]POP3: < %s\n", \
- IO->ID, CCID, N, \
+ "%s[%ld]CC[%d][%ld]POP3: < %s\n", \
+ IOSTR, IO->ID, CCID, N, \
ChrPtr(RecvMsg->IO.IOBuf))
const char *HKey;
void *vData;
pop3aggr *RecvMsg = (pop3aggr *) IO->Data;
+ time_t seenstamp = 0;
SetPOP3State(IO, eUseTable);
if (server_shutting_down)
return eAbort;
- if (CheckIfAlreadySeen("POP3 Item Seen",
- RecvMsg->CurrMsg->MsgUID,
- IO->Now,
- IO->Now, //// todo
- eCheckUpdate,
- IO->ID, CCID)
- != 0)
+ RecvMsg->CurrMsg = (FetchItem*)vData;
+
+ seenstamp = CheckIfAlreadySeen("POP3 Item Seen",
+ RecvMsg->CurrMsg->MsgUID,
+ EvGetNow(IO),
+ EvGetNow(IO) - USETABLE_ANTIEXPIRE,
+ eCheckUpdate,
+ IO->ID, CCID);
+ if (seenstamp != 0)
{
/* Item has already been seen */
RecvMsg->CurrMsg->NeedFetch = 0;
/* ok, now we know them all,
* continue with reading the actual messages. */
DeleteHashPos(&RecvMsg->Pos);
- StopDBWatchers(IO);
- return QueueEventContext(IO, POP3_C_ReAttachToFetchMessages);
+ return DBQueueEventContext(IO, POP3_C_ReAttachToFetchMessages);
}
}
DeleteHashPos(&RecvMsg->Pos);
/// done receiving uidls.. start looking them up now.
RecvMsg->Pos = GetNewHashPos(RecvMsg->MsgNumbers, 0);
- return QueueDBOperation(&RecvMsg->IO,
- POP3_FetchNetworkUsetableEntry);
+ return EventQueueDBOperation(&RecvMsg->IO,
+ POP3_FetchNetworkUsetableEntry,
+ 0);
}
return eReadMore; /* TODO */
}
SetPOP3State(IO, eGetMsg);
+ EVP3CM_syslog(LOG_DEBUG, "fast forwarding to the next unknown message");
+
RecvMsg->CurrMsg = NULL;
while ((RecvMsg->Pos != NULL) &&
GetNextHashPos(RecvMsg->MsgNumbers,
if ((RecvMsg->CurrMsg != NULL ) && (RecvMsg->CurrMsg->NeedFetch == 1))
{
+ EVP3CM_syslog(LOG_DEBUG, "fetching next");
/* Message has not been seen.
* Tell the server to fetch the message... */
StrBufPrintf(RecvMsg->IO.SendBuf.Buf,
return eReadMessage;
}
else {
+ EVP3CM_syslog(LOG_DEBUG, "no more messages to fetch.");
RecvMsg->State = ReadQuitState;
return POP3_C_DispatchWriteDone(&RecvMsg->IO);
}
if (!POP3C_OK) return eTerminateConnection;
RecvMsg->IO.ReadMsg = NewAsyncMsg(HKEY("."),
RecvMsg->CurrMsg->MSGSize,
- config.c_maxmsglen,
+ CtdlGetConfigLong("c_maxmsglen"),
NULL, -1,
1);
ChrPtr(RecvMsg->CurrMsg->MsgUID));
CheckIfAlreadySeen("POP3 Item Seen",
RecvMsg->CurrMsg->MsgUID,
- IO->Now,
- IO->Now, //// todo
+ EvGetNow(IO),
+ EvGetNow(IO) - USETABLE_ANTIEXPIRE,
eWrite,
IO->ID, CCID);
- StopDBWatchers(IO);
- return QueueEventContext(&RecvMsg->IO, POP3_C_ReAttachToFetchMessages);
+ return DBQueueEventContext(&RecvMsg->IO, POP3_C_ReAttachToFetchMessages);
}
eNextState POP3C_SaveMsg(AsyncIO *IO)
{
* so we don't fetch this message again
*/
}
- CtdlFreeMessage(RecvMsg->CurrMsg->Msg);
+ CM_Free(RecvMsg->CurrMsg->Msg);
RecvMsg->count ++;
return NextDBOperation(&RecvMsg->IO, POP3C_StoreMsgRead);
EVP3CM_syslog(LOG_DEBUG, "Converting message...");
RecvMsg->CurrMsg->Msg =
convert_internet_message_buf(&RecvMsg->IO.ReadMsg->MsgBuf);
- StopClientWatchers(IO, 0);
- return QueueDBOperation(&RecvMsg->IO, POP3C_SaveMsg);
+ return EventQueueDBOperation(&RecvMsg->IO, POP3C_SaveMsg, 0);
}
eNextState POP3C_SendDelete(pop3aggr *RecvMsg)
AsyncIO *IO = &RecvMsg->IO;
POP3C_DBG_READ();
RecvMsg->State = GetOneMessageIDState;
- return eReadMessage;
+ return POP3_C_DispatchWriteDone(&RecvMsg->IO);
}
eNextState POP3C_SendQuit(pop3aggr *RecvMsg)
become_session(&pop3_client_CC);
- if (config.c_pop3_fastest < config.c_pop3_fetch)
- fastest_scan = config.c_pop3_fastest;
+ if (CtdlGetConfigLong("c_pop3_fastest") < CtdlGetConfigLong("c_pop3_fetch"))
+ fastest_scan = CtdlGetConfigLong("c_pop3_fastest");
else
- fastest_scan = config.c_pop3_fetch;
+ fastest_scan = CtdlGetConfigLong("c_pop3_fetch");
/*
* Run POP3 aggregation no more frequently than once every n seconds
doing_pop3client = 1;
EVP3CQM_syslog(LOG_DEBUG, "pop3client started");
- CtdlForEachNetCfgRoom(pop3client_scan_room, NULL, pop3client);
+ CtdlForEachNetCfgRoom(pop3client_scan_room, NULL);
pthread_mutex_lock(&POP3QueueMutex);
it = GetNewHashPos(POP3FetchUrls, 0);
/*
if ((palist->interval && time(NULL) > (last_run + palist->interval))
- || (time(NULL) > last_run + config.c_pop3_fetch))
+ || (time(NULL) > last_run + CtdlGetConfigLong("c_pop3_fetch")))
pop3_do_fetching(palist->roomname, palist->pop3host,
palist->pop3user, palist->pop3pass, palist->keep);
pptr = palist;