Daniel Stenberg wrote:
Without considering the code for the moment, let's play with a modified
imaginary setup (adopting some of Rich's ideas too):
#define CURLXFER_INIT 0x00 /* nothing really happened yet */
#define CURLXFER_NAMERES 0x10 /* name resolving */
#define CURLXFER_CONNECT 0x20 /* TCP (or similar) connect */
#define CURLXFER_SECCONNECT 0x24 /* SSL/SSH crypto-oriented handshake */
#define CURLXFER_PROTOCONNECT 0x28 /* protocol specific connect */
#define CURLXFER_PROXYCONNECT 0x2c /* proxy CONNECT procedure */
#define CURLXFER_WAITDO 0x30 /* waiting to issue request */
#define CURLXFER_DO 0x34 /* issuing request */
#define CURLXFER_TRANSFER 0x40 /* transfer */
#define CURLXFER_TOOFAST 0x44 /* toggled transfer due to rate limiting,
basically a variation of *TRANSFER */
#define CURLXFER_DONE 0xf0 /* transfer complete */
So _PROTOCONNECT would be where non-secure logins, etc. would be?
This allows for some grouping like:
#define CURLXFER_RANGE_INIT(x) (!((x)&0xf0))
#define CURLXFER_RANGE_NAME(x) ((x)&0x10)
#define CURLXFER_RANGE_CONNECT(x) ((x)&0x20)
#define CURLXFER_RANGE_DO(x) ((x)&0x30)
#define CURLXFER_RANGE_XFER(x) ((x)&0x40)
#define CURLXFER_RANGE_DONE(x) ((x)&0xf0)
... and there's actually room for adding new states inbetween somewhere in a
future, if we'd ever come to that!
Would it be worth making this switch() friendly??
#define CURLXFER_PHASE(x) ((x)&0xf0) /* or ((x)>>4) ? */
#define CURLXFER_PHASE_INIT CURLXFER_PHASE(CURLXFER_INIT)
#define CURLXFER_PHASE_NAME CURLXFER_PHASE(CURLXFER_NAMERES)
#define CURLXFER_PHASE_CONNECT CURLXFER_PHASE(CURLXFER_CONNECT)
#define CURLXFER_PHASE_DO CURLXFER_PHASE(CURLXFER_DO)
#define CURLXFER_PHASE_XFER CURLXFER_PHASE(CURLXFER_TRANSFER)
#define CURLXFER_PHASE_DONE CURLXFER_PHASE(CURLXFER_DONE)
switch(CURL_XFER_PHASE(foo->state)) {
case CURLXFER_PHASE_INIT: ...
case CURLXFER_PHASE_NAME: ...
...
This also allows relational testing :
if (CURLXFER_PHASE(foo->state) < CURLXFER_PHASE_XFER)) ...
It would be very useful to get opinions on this from someone who actually
has an application or other ideas of how to use this in a real world
application!
Which would not be me at this time, I'm just kibitzing. :/
- Rich
-------------------------------------------------------------------
List admin: http://cool.haxx.se/list/listinfo/curl-library
Etiquette: http://curl.haxx.se/mail/etiquette.html