+eNextState POP3_FetchNetworkUsetableEntry(AsyncIO *IO)
+{
+ long HKLen;
+ const char *HKey;
+ void *vData;
+ struct cdbdata *cdbut;
+ pop3aggr *RecvMsg = (pop3aggr *) IO->Data;
+
+ if(GetNextHashPos(RecvMsg->MsgNumbers,
+ RecvMsg->Pos,
+ &HKLen,
+ &HKey,
+ &vData))
+ {
+ struct UseTable ut;
+ if (server_shutting_down)
+ return eAbort;
+
+ RecvMsg->CurrMsg = (FetchItem*) vData;
+ syslog(LOG_DEBUG,
+ "CHECKING: whether %s has already been seen: ",
+ ChrPtr(RecvMsg->CurrMsg->MsgUID));
+
+ /* Find out if we've already seen this item */
+ safestrncpy(ut.ut_msgid,
+ ChrPtr(RecvMsg->CurrMsg->MsgUID),
+ sizeof(ut.ut_msgid));
+ ut.ut_timestamp = time(NULL);/// TODO: libev timestamp!
+
+ cdbut = cdb_fetch(CDB_USETABLE, SKEY(RecvMsg->CurrMsg->MsgUID));
+ if (cdbut != NULL) {
+ /* Item has already been seen */
+ syslog(LOG_DEBUG, "YES\n");
+ cdb_free(cdbut);
+
+ /* rewrite the record anyway, to update the timestamp */
+ cdb_store(CDB_USETABLE,
+ SKEY(RecvMsg->CurrMsg->MsgUID),
+ &ut, sizeof(struct UseTable) );
+ RecvMsg->CurrMsg->NeedFetch = 0; ////TODO0;
+ }
+ else
+ {
+ syslog(LOG_DEBUG, "NO\n");
+ RecvMsg->CurrMsg->NeedFetch = 1;
+ }
+ return NextDBOperation(&RecvMsg->IO,
+ POP3_FetchNetworkUsetableEntry);
+ }
+ else
+ {
+ /* ok, now we know them all,
+ * continue with reading the actual messages. */
+ DeleteHashPos(&RecvMsg->Pos);
+
+ return QueueEventContext(IO, POP3_C_ReAttachToFetchMessages);
+ }
+}
+