#include "transport_internal.h"
#include <assert.h>
void transport_init (transport_t *transport, const struct transport_type *type, const struct transport_info *info)
{
// not already bound
assert(!transport->type);
// store
transport->type = type;
transport->info = *info;
}
void* transport_check (transport_t *transport, const struct transport_type *type)
{
// sanity check
assert(type && transport->type == type);
// ok
return transport;
}
void transport_connected (transport_t *transport, const error_t *err, bool direct)
{
// update state
transport->connected = true;
if (direct || !transport->type->methods._connected) {
// user callback
if (err)
// connect failed
transport->info.cb_tbl->on_error(transport, err, transport->info.cb_arg);
else
// connect succesfull
transport->info.cb_tbl->on_connect(transport, transport->info.cb_arg);
} else {
// wrapper method
transport->type->methods._connected(transport, err);
}
}
void transport_invoke (transport_t *transport, short what)
{
// on_ready
if (what & TRANSPORT_READ && transport->info.cb_tbl->on_read)
transport->info.cb_tbl->on_read(transport, transport->info.cb_arg);
// on_write
if (what & TRANSPORT_WRITE && transport->info.cb_tbl->on_write)
transport->info.cb_tbl->on_write(transport, transport->info.cb_arg);
}
void transport_error (transport_t *transport, const error_t *err)
{
// update state
transport->connected = false;
// invoke callback
transport->info.cb_tbl->on_error(transport, err, transport->info.cb_arg);
}