Added per-protocol callback static tables, replacing callback ptr storage

in the connectdata structure by a single handler table ptr.
This commit is contained in:
Patrick Monnerat
2007-10-12 13:36:37 +00:00
parent 2741f97a69
commit 07b6e7363d
19 changed files with 713 additions and 410 deletions

View File

@@ -809,6 +809,59 @@ struct HandleData {
} proto;
};
/*
* Specific protocol handler.
*/
struct Curl_handler {
const char * scheme; /* URL scheme name. */
/* Complement to setup_connection_internals(). */
CURLcode (*setup_connection)(struct connectdata *);
/* These two functions MUST be set to be protocol dependent */
CURLcode (*do_it)(struct connectdata *, bool *done);
Curl_done_func done;
/* If the curl_do() function is better made in two halves, this
* curl_do_more() function will be called afterwards, if set. For example
* for doing the FTP stuff after the PASV/PORT command.
*/
Curl_do_more_func do_more;
/* This function *MAY* be set to a protocol-dependent function that is run
* after the connect() and everything is done, as a step in the connection.
* The 'done' pointer points to a bool that should be set to TRUE if the
* function completes before return. If it doesn't complete, the caller
* should call the curl_connecting() function until it is.
*/
CURLcode (*connect_it)(struct connectdata *, bool *done);
/* See above. Currently only used for FTP. */
CURLcode (*connecting)(struct connectdata *, bool *done);
CURLcode (*doing)(struct connectdata *, bool *done);
/* Called from the multi interface during the PROTOCONNECT phase, and it
should then return a proper fd set */
int (*proto_getsock)(struct connectdata *conn,
curl_socket_t *socks,
int numsocks);
/* Called from the multi interface during the DOING phase, and it should
then return a proper fd set */
int (*doing_getsock)(struct connectdata *conn,
curl_socket_t *socks,
int numsocks);
/* This function *MAY* be set to a protocol-dependent function that is run
* by the curl_disconnect(), as a step in the disconnection.
*/
CURLcode (*disconnect)(struct connectdata *);
long defport; /* Default port. */
long protocol; /* PROT_* flags concerning the protocol set */
};
/*
* The connectdata struct contains all fields and variables that should be
* unique for an entire connection.
@@ -894,50 +947,7 @@ struct connectdata {
struct ConnectBits bits; /* various state-flags for this connection */
/* These two functions MUST be set by the curl_connect() function to be
be protocol dependent */
CURLcode (*curl_do)(struct connectdata *, bool *done);
Curl_done_func curl_done;
/* If the curl_do() function is better made in two halves, this
* curl_do_more() function will be called afterwards, if set. For example
* for doing the FTP stuff after the PASV/PORT command.
*/
Curl_do_more_func curl_do_more;
/* This function *MAY* be set to a protocol-dependent function that is run
* after the connect() and everything is done, as a step in the connection.
* The 'done' pointer points to a bool that should be set to TRUE if the
* function completes before return. If it doesn't complete, the caller
* should call the curl_connecting() function until it is.
*/
CURLcode (*curl_connect)(struct connectdata *, bool *done);
/* See above. Currently only used for FTP. */
CURLcode (*curl_connecting)(struct connectdata *, bool *done);
CURLcode (*curl_doing)(struct connectdata *, bool *done);
/* Called from the multi interface during the PROTOCONNECT phase, and it
should then return a proper fd set */
int (*curl_proto_getsock)(struct connectdata *conn,
curl_socket_t *socks,
int numsocks);
/* Called from the multi interface during the DOING phase, and it should
then return a proper fd set */
int (*curl_doing_getsock)(struct connectdata *conn,
curl_socket_t *socks,
int numsocks);
/* This function *MAY* be set to a protocol-dependent function that is run
* by the curl_disconnect(), as a step in the disconnection.
*/
CURLcode (*curl_disconnect)(struct connectdata *);
/* This function *MAY* be set to a protocol-dependent function that is run
* in the curl_close() function if protocol-specific cleanups are required.
*/
CURLcode (*curl_close)(struct connectdata *);
const struct Curl_handler * handler; /* Connection's protocol handler. */
/**** curl_get() phase fields */