From cbffc8d64707828b045b679e8db0269ae362ffcf Mon Sep 17 00:00:00 2001 From: laforge Date: Mon, 23 Oct 2006 20:28:37 +0000 Subject: more gsmd/libgsm implementation git-svn-id: http://svn.openmoko.org/trunk/src/target/gsm@114 99fdad57-331a-0410-800a-d7fa5415bdb3 --- src/libgsmd/libgsmd_event.c | 57 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 57 insertions(+) create mode 100644 src/libgsmd/libgsmd_event.c (limited to 'src/libgsmd/libgsmd_event.c') diff --git a/src/libgsmd/libgsmd_event.c b/src/libgsmd/libgsmd_event.c new file mode 100644 index 0000000..6e19eff --- /dev/null +++ b/src/libgsmd/libgsmd_event.c @@ -0,0 +1,57 @@ +/* libgsmd event demultiplexer handler */ + +#include +#include +#include + +#include +#include + +#include +#include + +#include "lgsm_internals.h" + +static lgsm_evt_handler *evt_handlers[__NUM_GSMD_EVT]; + +int lgsm_evt_handler_register(struct lgsm_handle *lh, int evt_type, + lgsm_evt_handler *handler) +{ + if (evt_type >= __NUM_GSMD_EVT) + return -EINVAL; + + evt_handlers[evt_type] = handler; + + return 0; +} + +void lgsm_evt_handler_unregister(struct lgsm_handle *lh, int evt_type) +{ + if (evt_type < __NUM_GSMD_EVT) + evt_handlers[evt_type] = NULL; +} + + +static int evt_demux_msghandler(struct lgsm_handle *lh, struct gsmd_msg_hdr *gmh) +{ + struct gsmd_evt_auxdata *aux = gmh->data; + + if (gmh->len < sizeof(*aux)) + return -EIO; + + if (gmh->msg_type != GSMD_MSG_EVENT || + gmh->msg_subtype >= __NUM_GSMD_EVT) + return -EINVAL; + + return evt_handlers[gmh->msg_subtype](lh, gmh->msg_subtype, aux); +} + +int lgsm_evt_init(struct lgsm_handle *lh) +{ + return lgsm_register_handler(lh, GSMD_MSG_EVENT, &evt_demux_msghandler); +} + +void lgsm_evt_exit(struct lgsm_handle *lh) +{ + lgsm_unregister_handler(lh, GSMD_MSG_EVENT); +} -- cgit v1.2.3