Unsettled API - An API for low-level IO integration. More...
Classes | |
struct | pn_connection_driver_t |
The elements needed to drive AMQP IO and events. More... | |
Macros | |
#define | PN_TRANSPORT_WRITE_CLOSED |
The write side of the transport is closed, it will no longer produce bytes to write to external IO. More... | |
#define | PN_TRANSPORT_READ_CLOSED |
The read side of the transport is closed, it will no longer read bytes from external IO. More... | |
Unsettled API - An API for low-level IO integration.
Associate a Connection and Transport with AMQP byte streams from any source.
The pn_connection_driver_*
functions provide a simplified API and extra logic to use pn_connection_t and pn_transport_t as a unit. You can also access them directly for features that do not have pn_connection_driver_*
functions.
The driver buffers events and data. You should run it until pn_connection_driver_finished() is true, to ensure all reading, writing, and event handling (including ERROR
and FINAL
events) is finished.
The pn_connection_driver_*
functions do not return an error code. IO errors are set on the transport condition and are returned as a PN_TRANSPORT_ERROR
. The integration code can set errors using pn_connection_driver_errorf().
This API supports asynchronous, proactive, non-blocking and reactive IO. An integration does not have to follow the dispatch-read-write sequence above, but note that you should handle all available events before calling pn_connection_driver_read_buffer() and check that size
is non-zero before starting a blocking or asynchronous read call. A read
started while there are unprocessed CLOSE
events in the buffer may never complete.
AMQP is a full-duplex, asynchronous protocol. The "read" and "write" sides of an AMQP connection can close separately.
The Connection driver types are not thread safe, but each connection and its associated types form an independent unit. Different connections can be processed concurrently by different threads.
struct pn_connection_driver_t |
The elements needed to drive AMQP IO and events.
Class Members | ||
---|---|---|
pn_connection_t * | connection | |
pn_transport_t * | transport | |
pn_collector_t * | collector |
#define PN_TRANSPORT_WRITE_CLOSED |
The write side of the transport is closed, it will no longer produce bytes to write to external IO.
Synonym for PN_TRANSPORT_HEAD_CLOSED
#define PN_TRANSPORT_READ_CLOSED |
The read side of the transport is closed, it will no longer read bytes from external IO.
Alias for PN_TRANSPORT_TAIL_CLOSED
int pn_connection_driver_init | ( | pn_connection_driver_t * | , |
pn_connection_t * | , | ||
pn_transport_t * | |||
) |
Set connection and transport to the provided values, or create a new pn_connection_t or pn_transport_t if either is NULL.
The provided values belong to the connection driver and will be freed by pn_connection_driver_destroy().
The transport is bound automatically after the PN_CONNECTION_INIT has been is handled by the application. It can be bound earlier with pn_connection_driver_bind().
The following functions must be called before the transport is bound to have effect: pn_connection_set_username(), pn_connection_set_password(), pn_transport_set_server().
int pn_connection_driver_bind | ( | pn_connection_driver_t * | d | ) |
Force binding of the transport.
This happens automatically after the PN_CONNECTION_INIT is processed.
void pn_connection_driver_destroy | ( | pn_connection_driver_t * | ) |
Unbind, release and free the connection and transport.
Set all pointers to NULL. Does not free the pn_connection_driver_t struct itself.
pn_connection_t* pn_connection_driver_release_connection | ( | pn_connection_driver_t * | d | ) |
Disassociate the driver's connection from its transport and collector and sets d->connection = NULL.
Returns the previous value, which must be freed by the caller.
The transport and collector are still owned by the driver and will be freed by pn_connection_driver_destroy().
pn_rwbytes_t pn_connection_driver_read_buffer_sized | ( | pn_connection_driver_t * | , |
size_t | n | ||
) |
Try to get a read buffer with the specified size.
This will try to grow the read buffer to the specified size and then it will return whatever size read buffer can be got.
Copy data from your input byte source to buf.start, up to buf.size. Call pn_connection_driver_read_done() when reading is complete.
buf.size==0 means reading is not possible: no buffer space or the read side is closed.
pn_rwbytes_t pn_connection_driver_read_buffer | ( | pn_connection_driver_t * | ) |
Get the read buffer.
Copy data from your input byte source to buf.start, up to buf.size. Call pn_connection_driver_read_done() when reading is complete.
buf.size==0 means reading is not possible: no buffer space or the read side is closed.
void pn_connection_driver_read_close | ( | pn_connection_driver_t * | ) |
Close the read side.
Call when the IO can no longer be read.
pn_bytes_t pn_connection_driver_write_buffer | ( | pn_connection_driver_t * | ) |
Get the write buffer.
Write data from buf.start to your IO destination, up to a max of buf.size. Call pn_connection_driver_write_done() when writing is complete.
buf.size==0 means there is nothing to write.
pn_bytes_t pn_connection_driver_write_done | ( | pn_connection_driver_t * | , |
size_t | n | ||
) |
Call when the first n bytes of pn_connection_driver_write_buffer() have been written to IO.
Reclaims the buffer space and reset the write buffer.
void pn_connection_driver_write_close | ( | pn_connection_driver_t * | ) |
Close the write side.
Call when IO can no longer be written to.
pn_event_t* pn_connection_driver_next_event | ( | pn_connection_driver_t * | ) |
Get the next event to handle.
bool pn_connection_driver_finished | ( | pn_connection_driver_t * | ) |
Return true if the the driver is closed for reading and writing and there are no more events.
Call pn_connection_driver_destroy() to free all related memory.
void pn_connection_driver_errorf | ( | pn_connection_driver_t * | d, |
const char * | name, | ||
const char * | fmt, | ||
... | |||
) |
Set transport error.
The name and formatted description are set on the transport condition, and returned as a PN_TRANSPORT_ERROR event from pn_connection_driver_next_event().
You must call this before pn_connection_driver_read_close() or pn_connection_driver_write_close() to ensure the error is processed.
pn_connection_driver_t** pn_connection_driver_ptr | ( | pn_connection_t * | connection | ) |
Associate a pn_connection_t with its pn_connection_driver_t.
NOTE: this is only for use by IO integration writers. If you are using the standard pn_proactor_t you must not use this function.
Return type is pointer to a pointer so that the caller can (if desired) use atomic operations when loading and storing the value.