-eNextState SMTP_C_DispatchReadDone(void *Data);
-eNextState SMTP_C_DispatchWriteDone(void *Data);
-eNextState SMTP_C_Terminate(void *Data);
-
-typedef eNextState (*SMTPReadHandler)(SmtpOutMsg *Msg);
-typedef eNextState (*SMTPSendHandler)(SmtpOutMsg *Msg);
-
-
-
-
-void FreeQueItem(OneQueItem **Item)
-{
- DeleteHash(&(*Item)->MailQEntries);
- FreeStrBuf(&(*Item)->EnvelopeFrom);
- FreeStrBuf(&(*Item)->BounceTo);
- free(*Item);
- Item = NULL;
-}
-void HFreeQueItem(void *Item)
-{
- FreeQueItem((OneQueItem**)&Item);
-}
-
-
-/* inspect recipients with a status of:
- * - 0 (no delivery yet attempted)
- * - 3/4 (transient errors
- * were experienced and it's time to try again)
- */
-int CountActiveQueueEntries(OneQueItem *MyQItem)
-{
- HashPos *It;
- long len;
- const char *Key;
- void *vQE;
-
- MyQItem->ActiveDeliveries = 0;
- It = GetNewHashPos(MyQItem->MailQEntries, 0);
- while (GetNextHashPos(MyQItem->MailQEntries, It, &len, &Key, &vQE))
- {
- MailQEntry *ThisItem = vQE;
- if ((ThisItem->Status == 0) ||
- (ThisItem->Status == 3) ||
- (ThisItem->Status == 4))
- {
- MyQItem->ActiveDeliveries++;
- ThisItem->Active = 1;
- }
- else
- ThisItem->Active = 0;
- }
- DeleteHashPos(&It);
- return MyQItem->ActiveDeliveries;
-}
-
-OneQueItem *DeserializeQueueItem(StrBuf *RawQItem, long QueMsgID)
-{
- OneQueItem *Item;
- const char *pLine = NULL;
- StrBuf *Line;
- StrBuf *Token;
- void *v;
-
- Item = (OneQueItem*)malloc(sizeof(OneQueItem));
- memset(Item, 0, sizeof(OneQueItem));
- Item->LastAttempt.retry = SMTP_RETRY_INTERVAL;
- Item->MessageID = -1;
- Item->QueMsgID = QueMsgID;
-
- citthread_mutex_lock(&ActiveQItemsLock);
- if (GetHash(ActiveQItems,
- IKEY(Item->QueMsgID),
- &v))
- {
- /* WHOOPS. somebody else is already working on this. */
- citthread_mutex_unlock(&ActiveQItemsLock);
- FreeQueItem(&Item);
- return NULL;
- }
- else {
- /* mark our claim on this. */
- Put(ActiveQItems,
- IKEY(Item->QueMsgID),
- Item,
- HFreeQueItem);
- citthread_mutex_unlock(&ActiveQItemsLock);
- }
-
- Token = NewStrBuf();
- Line = NewStrBufPlain(NULL, 128);
- while (pLine != StrBufNOTNULL) {
- const char *pItemPart = NULL;
- void *vHandler;
-
- StrBufExtract_NextToken(Line, RawQItem, &pLine, '\n');
- if (StrLength(Line) == 0) continue;
- StrBufExtract_NextToken(Token, Line, &pItemPart, '|');
- if (GetHash(QItemHandlers, SKEY(Token), &vHandler))
- {
- QItemHandler H;
- H = (QItemHandler) vHandler;
- H(Item, Line, &pItemPart);
- }
- }
- FreeStrBuf(&Line);
- FreeStrBuf(&Token);
- return Item;
-}
-
-StrBuf *SerializeQueueItem(OneQueItem *MyQItem)
-{
- StrBuf *QMessage;
- HashPos *It;
- const char *Key;
- long len;
- void *vQE;
-
- QMessage = NewStrBufPlain(NULL, SIZ);
- StrBufPrintf(QMessage, "Content-type: %s\n", SPOOLMIME);
-
-// "attempted|%ld\n" "retry|%ld\n",, (long)time(NULL), (long)retry );
- StrBufAppendBufPlain(QMessage, HKEY("\nmsgid|"), 0);
- StrBufAppendPrintf(QMessage, "%ld", MyQItem->MessageID);
-
- if (StrLength(MyQItem->BounceTo) > 0) {
- StrBufAppendBufPlain(QMessage, HKEY("\nbounceto|"), 0);
- StrBufAppendBuf(QMessage, MyQItem->BounceTo, 0);
- }
-
- if (StrLength(MyQItem->EnvelopeFrom) > 0) {
- StrBufAppendBufPlain(QMessage, HKEY("\nenvelope_from|"), 0);
- StrBufAppendBuf(QMessage, MyQItem->EnvelopeFrom, 0);
- }
-
- It = GetNewHashPos(MyQItem->MailQEntries, 0);
- while (GetNextHashPos(MyQItem->MailQEntries, It, &len, &Key, &vQE))
- {
- MailQEntry *ThisItem = vQE;
- int i;
-
- if (!ThisItem->Active)
- continue; /* skip already sent ones from the spoolfile. */