From 9cb67dd0c77c9cb3136ac0414e2e646d3b979559 Mon Sep 17 00:00:00 2001 From: Gideon Sadan Date: Wed, 21 Dec 2011 18:41:56 -0500 Subject: [PATCH] freetdm: initializing wat library interface --- libs/freetdm/src/ftmod/ftmod_gsm/ftmod_gsm.c | 187 ++++++++++++++++++- 1 file changed, 185 insertions(+), 2 deletions(-) diff --git a/libs/freetdm/src/ftmod/ftmod_gsm/ftmod_gsm.c b/libs/freetdm/src/ftmod/ftmod_gsm/ftmod_gsm.c index 8337a3829e..f0b62e36ac 100644 --- a/libs/freetdm/src/ftmod/ftmod_gsm/ftmod_gsm.c +++ b/libs/freetdm/src/ftmod/ftmod_gsm/ftmod_gsm.c @@ -2,7 +2,7 @@ * Copyright (c) 2011, Sangoma Technologies * All rights reserved. * - * Redistribution and use in source and binary forms, with or without + Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * @@ -37,11 +37,145 @@ * */ +#define _GNU_SOURCE + +#include +#include +#include + +#include +#include +#include +#include +#include +/*========================*/ + #include #include #include #include + + +typedef struct ftdm_gsm_data_s { + + wat_interface_t wat_interface; + +} ftdm_gsm_data_t; + +/* wat callbacks */ +void on_wat_sigstatus_change(unsigned char span_id, wat_sigstatus_t sigstatus); +void on_wat_span_alarm(unsigned char span_id, wat_alarm_t alarm); +int on_wat_span_write(unsigned char span_id, void *buffer, unsigned len); + +void on_wat_con_ind(unsigned char span_id, uint8_t call_id, wat_con_event_t *con_event); +void on_wat_con_sts(unsigned char span_id, uint8_t call_id, wat_con_status_t *status); +void on_wat_rel_ind(unsigned char span_id, uint8_t call_id, wat_rel_event_t *rel_event); +void on_wat_rel_cfm(unsigned char span_id, uint8_t call_id); +void on_wat_sms_ind(unsigned char span_id, wat_sms_event_t *sms_event); +void on_wat_sms_sts(unsigned char span_id, uint8_t sms_id, wat_sms_status_t *status); + + +void on_wat_log(uint8_t level, char *fmt, ...); +void *on_wat_malloc(size_t size); +void *on_wat_calloc(size_t nmemb, size_t size); +void on_wat_free(void *ptr); +void on_wat_log_span(uint8_t span_id, uint8_t level, char *fmt, ...); + + +/* gsm_data->wat_interface.wat_log = on_log; */ + +/* gsm_data->wat_interface.wat_log_span = on_log_span; */ + +/* gsm_data->wat_interface.wat_malloc = on_wat_malloc;*/ +/* gsm_data->wat_interface.wat_calloc = on_wat_calloc;*/ +/* gsm_data->wat_interface.wat_free = on_wat_free;*/ + + +int on_wat_span_write(unsigned char span_id, void *buffer, unsigned len) +{ + int res = 0; + + return res; +} + +void on_wat_sigstatus_change(unsigned char span_id, wat_sigstatus_t sigstatus) +{ + fprintf(stdout, "span:%d Signalling status changed %d\n", span_id, sigstatus); + + return; +} + +void on_wat_span_alarm(unsigned char span_id, wat_alarm_t alrm) +{ + fprintf(stdout, "span:%d Alarm received\n", span_id); + return;ftdm_log(FTDM_LOG_DEBUG, "Registered interface to WAT Library\n"); +} + +void on_wat_con_ind(unsigned char span_id, uint8_t call_id, wat_con_event_t *con_event) +{ + fprintf(stdout, "s%d: Incoming call (id:%d) Calling Number:%s type:%d plan:%d\n", span_id, call_id, con_event->calling_num.digits, con_event->calling_num.type, con_event->calling_num.plan); + + + return; +} + +void on_wat_con_sts(unsigned char span_id, uint8_t call_id, wat_con_status_t *status) +{ + return; +} + +void on_wat_rel_ind(unsigned char span_id, uint8_t call_id, wat_rel_event_t *rel_event) +{ + fprintf(stdout, "s%d: Call hangup (id:%d) cause:%d\n", span_id, call_id, rel_event->cause); + + return; +} + +void on_wat_rel_cfm(unsigned char span_id, uint8_t call_id) +{ + fprintf(stdout, "s%d: Call hangup complete (id:%d)\n", span_id, call_id); + return; +} + +void on_wat_sms_ind(unsigned char span_id, wat_sms_event_t *sms_event) +{ + return; +} + +void on_wat_sms_sts(unsigned char span_id, uint8_t sms_id, wat_sms_status_t *status) +{ + return; +} + + + +void on_wat_log(uint8_t level, char *fmt, ...) +{ + +} + + +void *on_wat_malloc(size_t size) +{ + return NULL; +} +void *on_wat_calloc(size_t nmemb, size_t size) +{ + return NULL; +} +void on_wat_free(void *ptr) +{ + +} +void on_wat_log_span(uint8_t span_id, uint8_t level, char *fmt, ...) +{ + +} + + +/* END wat callbacks */ + /* span monitor thread */ static void *ftdm_gsm_run(ftdm_thread_t *me, void *obj); @@ -212,6 +346,49 @@ static FIO_CONFIGURE_SPAN_SIGNALING_FUNCTION(ftdm_gsm_configure_span_signaling) const char *var = NULL; const char *val = NULL; + ftdm_gsm_data_t *gsm_data = malloc(sizeof(*gsm_data)); + if (!gsm_data) { + snprintf(span->last_error, sizeof(span->last_error), "Failed to allocate GSM data."); + return FTDM_FAIL; + } + memset(gsm_data,0, sizeof(*gsm_data)); + + + /* */ + + +ftdm_log(FTDM_LOG_DEBUG, "Registering interface to WAT Library...\n"); + + gsm_data->wat_interface.wat_sigstatus_change = on_wat_sigstatus_change; + gsm_data->wat_interface.wat_span_write = on_wat_span_write; + + gsm_data->wat_interface.wat_log = on_wat_log; + gsm_data->wat_interface.wat_log_span = on_wat_log_span; + gsm_data->wat_interface.wat_malloc = on_wat_malloc; + gsm_data->wat_interface.wat_calloc = on_wat_calloc; + gsm_data->wat_interface.wat_free = on_wat_free; + + gsm_data->wat_interface.wat_alarm = on_wat_span_alarm; + gsm_data->wat_interface.wat_con_ind = on_wat_con_ind; + gsm_data->wat_interface.wat_con_sts = on_wat_con_sts; + gsm_data->wat_interface.wat_rel_ind = on_wat_rel_ind; + gsm_data->wat_interface.wat_rel_cfm = on_wat_rel_cfm; + gsm_data->wat_interface.wat_sms_ind = on_wat_sms_ind; + gsm_data->wat_interface.wat_sms_sts = on_wat_sms_sts; + + if (wat_register(&gsm_data->wat_interface)) { + snprintf(span->last_error, sizeof(span->last_error), "Failed to register WAT Library !!!\n"); + ftdm_log(FTDM_LOG_DEBUG, "FAILED Registering interface to WAT Library...\n"); + return FTDM_FAIL; + + } + ftdm_log(FTDM_LOG_DEBUG, "Registered interface to WAT Library\n"); + + + /* */ + + + ftdm_assert_return(sig_cb != NULL, FTDM_FAIL, "No signaling cb provided\n"); if (span->signal_type) { @@ -219,6 +396,9 @@ static FIO_CONFIGURE_SPAN_SIGNALING_FUNCTION(ftdm_gsm_configure_span_signaling) return FTDM_FAIL; } + + + for (; ftdm_parameters[paramindex].var; paramindex++) { var = ftdm_parameters[paramindex].var; val = ftdm_parameters[paramindex].val; @@ -355,12 +535,15 @@ static FIO_API_FUNCTION(ftdm_gsm_api) if (data) { mycmd = ftdm_strdup(data); + argc = ftdm_separate_string(mycmd, ' ', argv, (sizeof(argv) / sizeof(argv[0]))); } if (argc == 1) { if (!strcasecmp(argv[0], "version")) { - stream->write_function(stream, "libwat GSM version: implement me!!\n"); + uint8_t current = 0, revision = 0, age = 0; + wat_version(¤t, &revision, &age); + stream->write_function(stream, "libwat GSM VERSION: %d.%d.%d\n", current, revision, age); stream->write_function(stream, "+OK.\n"); goto done; }