}
*/
+void ShutDownCLient(AsyncIO *IO)
+{
+ event_del(&IO->send_event);
+ event_del(&IO->recv_event);
+ IO->Terminate(IO->Data);
+
+// citthread_mutex_lock(&EventQueueMutex);
+
+///QueueEvents /// todo remove from hash.
+
+// citthread_mutex_unlock(&EventQueueMutex);
+}
+
eReadState HandleInbound(AsyncIO *IO)
{
eReadState Finished = eBufferNotEmpty;
}
else if ((IO->NextState == eTerminateConnection) ||
(IO->NextState == eAbort) )
-{
-
-
- }
+ ShutDownCLient(IO);
return Finished;
}
break;
case eSendMore:
IO->NextState = IO->SendDone(IO->Data);
- event_add(&IO->send_event, NULL);
+
+ if ((IO->NextState == eTerminateConnection) ||
+ (IO->NextState == eAbort) )
+ ShutDownCLient(IO);
+ else
+ event_add(&IO->send_event, NULL);
break;
case eReadMessage:
if (StrBufCheckBuffer(&IO->RecvBuf) == eBufferNotEmpty) {
void *pData,
IO_CallBack ReadDone,
IO_CallBack SendDone,
+ IO_CallBack Terminate,
IO_LineReaderCallback LineReader,
int ReadFirst)
{
IO->Data = pData;
IO->SendDone = SendDone;
IO->ReadDone = ReadDone;
+ IO->Terminate = Terminate;
IO->LineReader = LineReader;
event_set(&IO->recv_event,
struct event recv_event, send_event;
IOBuffer SendBuf, RecvBuf;
IO_LineReaderCallback LineReader;
- IO_CallBack ReadDone, SendDone;
+ IO_CallBack ReadDone, SendDone, Terminate;
StrBuf *IOBuf;
void *Data;
DeleteHashDataFunc DeleteData; /* data is expected to contain AsyncIO... */
void *pData,
IO_CallBack ReadDone,
IO_CallBack SendDone,
+ IO_CallBack Terminate,
IO_LineReaderCallback LineReader,
int ReadFirst);
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);
InitEventIO(&SendMsg->IO, SendMsg,
SMTP_C_DispatchReadDone,
SMTP_C_DispatchWriteDone,
+ SMTP_C_Terminate,
SMTP_C_ReadServerStatus,
1);
return 0;
CtdlLogPrintf(CTDL_INFO, "SMTP client[%ld]: delivery to <%s> @ <%s> (%s) succeeded\n",
SendMsg->n, SendMsg->user, SendMsg->node, SendMsg->name);
- return eSendReply;
+ return eTerminateConnection;
}
eNextState SMTPC_read_dummy(SmtpOutMsg *SendMsg)
SMTPC_send_QUIT
};
+eNextState SMTP_C_Terminate(void *Data)
+{
+ SmtpOutMsg *pMsg = Data;
+ FinalizeMessageSend(pMsg);
+
+}
eNextState SMTP_C_DispatchReadDone(void *Data)
{
SmtpOutMsg *pMsg = Data;