/*
 * Copyright 2014, NICTA
 *
 * This software may be distributed and modified according to the terms of
 * the GNU General Public License version 2. Note that NO WARRANTY is provided.
 * See "LICENSE_GPLv2.txt" for details.
 *
 * @TAG(NICTA_GPL)
 */

#ifndef __VCHAN_COMPONENT
#define __VCHAN_COMPONENT

#include "libvchan.h"
#include "vchan_sharemem.h"
#include "vchan_copy.h"

typedef void (*callback_func_t)(void *);

typedef struct camkes_vchan_con {
    /* Domain */
    int component_dom_num;
    void *data_buf;

    /* Function Pointers */
    int (*connect)(vchan_connect_t);
    int (*disconnect)(vchan_connect_t);
    intptr_t (*get_buf)(vchan_ctrl_t, int);
    int (*status)(vchan_ctrl_t);
    int (*alert_status)(vchan_ctrl_t);

    void (*wait)(void);
    void (*alert)(void);
    int (*poll)(void);

    int (*reg_callback)(callback_func_t, void *);
} camkes_vchan_con_t;


struct libvchan {
    int is_server;
    int server_persists;
    int blocking;
    int domain_num, port_num;

    camkes_vchan_con_t *con;
};

void init_camkes_vchan(camkes_vchan_con_t *c);

int vchan_set_callback(callback_func_t cb, void *data);

vchan_buf_t *get_vchan_buf(vchan_ctrl_t *args, camkes_vchan_con_t *c, int action);

void vevent_wait(void);
int vevent_poll(void);
int vevent_reg_callback(void (*callback)(void*), void *arg);

#endif
