src/transport.c
author Tero Marttila <terom@fixme.fi>
Tue, 28 Apr 2009 20:27:45 +0300
branchnew-transport
changeset 155 c59d3eaff0fb
parent 154 f4472119de3b
child 156 6534a4ac957b
permissions -rw-r--r--
most of the new transport/sock code compiles, but things are still missing
#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);
}