X-Git-Url: https://code.citadel.org/?a=blobdiff_plain;f=citadel%2Fevent_client.h;h=828ee0cb5a236b3fe073444dd7234232846e81c3;hb=192056a6112602350c1f8a73eae2e134a31c7ba2;hp=9ed88c01e15401a16d00ed26242d34c08eb3653f;hpb=969d199c6fb0d1f54220dc906202946a0b43f387;p=citadel.git diff --git a/citadel/event_client.h b/citadel/event_client.h index 9ed88c01e..828ee0cb5 100644 --- a/citadel/event_client.h +++ b/citadel/event_client.h @@ -14,11 +14,19 @@ typedef struct AsyncIO AsyncIO; typedef enum _eNextState { eSendDNSQuery, eReadDNSReply, + + eDBQuery, + eConnect, eSendReply, eSendMore, + eSendFile, + eReadMessage, eReadMore, + eReadPayload, + eReadFile, + eTerminateConnection, eAbort }eNextState; @@ -28,6 +36,21 @@ typedef eReadState (*IO_LineReaderCallback)(AsyncIO *IO); typedef void (*ParseDNSAnswerCb)(AsyncIO*, unsigned char*, int); typedef void (*FreeDNSReply)(void *DNSData); + +typedef struct __ReadAsyncMsg { + StrBuf *MsgBuf; + size_t maxlen; /* maximum message length */ + + const char *terminator; /* token signalling EOT */ + long tlen; + int dodot; + + int flushing; /* if we read maxlen, read until nothing more arives and ignore this. */ + + int crlf; /* CRLF newlines instead of LF */ +} ReadAsyncMsg; + + typedef struct _DNSQueryParts { ParseDNSAnswerCb DNS_CB; IO_CallBack PostDNS; @@ -65,11 +88,15 @@ struct AsyncIO { IOBuffer SendBuf, RecvBuf; + FDIOBuffer IOB; /* when sending from / reading into files, this is used. */ + /* our events... */ - ev_cleanup abort_by_shutdown; /* server wants to go down... */ + ev_cleanup abort_by_shutdown, /* server wants to go down... */ + db_abort_by_shutdown; /* server wants to go down... */ ev_timer conn_fail, /* connection establishing timed out */ rw_timeout; /* timeout while sending data */ ev_idle unwind_stack, /* get c-ares out of the stack */ + db_unwind_stack, /* wait for next db operation... */ conn_fail_immediate; /* unwind stack, but fail immediately. */ ev_io recv_event, /* receive data from the client */ send_event, /* send more data to the client */ @@ -83,7 +110,9 @@ struct AsyncIO { Terminate, /* shutting down... */ Timeout, /* Timeout handler; may also be connection timeout */ ConnFail, /* What to do when one connection failed? */ - ShutdownAbort;/* we're going down. make your piece. */ + DNSFail, /* the dns lookup didn't work out. */ + ShutdownAbort,/* we're going down. make your piece. */ + NextDBOperation; /* Perform Database IO */ IO_LineReaderCallback LineReader; /* if we have linereaders, maybe we want to read more lines before the real application logic is called? */ @@ -97,7 +126,7 @@ struct AsyncIO { evcurl_request_data HttpReq; /* Saving / loading a message async from / to disk */ - + ReadAsyncMsg *ReadMsg; struct CtdlMessage *AsyncMsg; struct recptypes *AsyncRcp; /* Custom data; its expected to contain AsyncIO so we can save malloc()s... */ @@ -112,9 +141,10 @@ typedef struct _IOAddHandler { void FreeAsyncIOContents(AsyncIO *IO); -void NextDBOperation(AsyncIO *IO, IO_CallBack CB); -int QueueDBOperation(AsyncIO *IO, IO_CallBack CB); -int QueueEventContext(AsyncIO *IO, IO_CallBack CB); +eNextState NextDBOperation(AsyncIO *IO, IO_CallBack CB); +eNextState QueueDBOperation(AsyncIO *IO, IO_CallBack CB); +eNextState QueueEventContext(AsyncIO *IO, IO_CallBack CB); +eNextState QueueCurlContext(AsyncIO *IO); int ShutDownEventQueue(void); eNextState InitEventIO(AsyncIO *IO, @@ -143,7 +173,7 @@ void InitC_ares_dns(AsyncIO *IO); do { \ sta = curl_easy_setopt(chnd, (CURLOPT_##s), (v)); \ if (sta) { \ - CtdlLogPrintf(CTDL_ERR, "error setting option " #s " on curl handle: %s", curl_easy_strerror(sta)); \ + syslog(LOG_ERR, "error setting option " #s " on curl handle: %s", curl_easy_strerror(sta)); \ } } while (0) @@ -153,6 +183,8 @@ int evcurl_init(AsyncIO *IO, IO_CallBack CallBack, IO_CallBack Terminate); -void evcurl_handle_start(AsyncIO *IO); +eNextState ReAttachIO(AsyncIO *IO, + void *pData, + int ReadFirst); #endif /* __EVENT_CLIENT_H__ */