Hi Dara, On 12/02/2010 05:31 PM, Dara Spieker-Doyle wrote: > --- > Makefile.am | 7 ++ > configure.ac | 5 + > drivers/cdma-atmodem/atmodem.c | 47 +++++++++ > drivers/cdma-atmodem/atmodem.h | 26 +++++
Lets call this cdmamodem/cdmamodem.[ch] > drivers/cdma-atmodem/atutil.c | 45 +++++++++ > drivers/cdma-atmodem/atutil.h | 65 +++++++++++++ Are these verbatim copies of atmodem/atutil.[ch]? If so, then there's no reason why you can't re-use those. No need to copy them. > drivers/cdma-atmodem/voicecall.c | 195 > ++++++++++++++++++++++++++++++++++++++ > 7 files changed, 390 insertions(+), 0 deletions(-) > create mode 100644 drivers/cdma-atmodem/atmodem.c > create mode 100644 drivers/cdma-atmodem/atmodem.h > create mode 100644 drivers/cdma-atmodem/atutil.c > create mode 100644 drivers/cdma-atmodem/atutil.h > create mode 100644 drivers/cdma-atmodem/voicecall.c > > diff --git a/Makefile.am b/Makefile.am > index f111f96..9aac08b 100644 > --- a/Makefile.am > +++ b/Makefile.am > @@ -242,6 +242,13 @@ conf_DATA += plugins/phonesim.conf > endif > endif > > +if CDMA_ATMODEM > +builtin_modules += cdma_atmodem > +builtin_sources += drivers/cdma-atmodem/atmodem.c \ > + drivers/cdma-atmodem/atmodem.h \ > + drivers/cdma-atmodem/voicecall.c > +endif > + > builtin_modules += g1 > builtin_sources += plugins/g1.c > > diff --git a/configure.ac b/configure.ac > index 0c1986a..090f3ee 100644 > --- a/configure.ac > +++ b/configure.ac > @@ -158,6 +158,11 @@ AC_ARG_ENABLE(atmodem, > AC_HELP_STRING([--disable-atmodem], > [enable_atmodem=${enableval}]) > AM_CONDITIONAL(ATMODEM, test "${enable_atmodem}" != "no") > > +AC_ARG_ENABLE(cdmaatmodem, AC_HELP_STRING([--disable-cdma-atmodem], > + [disable CDMA AT modem support]), > + [enable_cdma_atmodem=${enableval}]) > +AM_CONDITIONAL(CDMA_ATMODEM, test "${enable_cdma_atmodem}" != "no") > + > AC_ARG_ENABLE(phonesim, AC_HELP_STRING([--disable-phonesim], > [disable Phone simulator support]), > [enable_phonesim=${enableval}]) > diff --git a/drivers/cdma-atmodem/atmodem.c b/drivers/cdma-atmodem/atmodem.c > new file mode 100644 > index 0000000..86dd074 > --- /dev/null > +++ b/drivers/cdma-atmodem/atmodem.c > @@ -0,0 +1,47 @@ > +/* > + * > + * oFono - Open Source Telephony > + * > + * Copyright (C) 2010 Nokia Corporation. All rights reserved. > + * > + * This program is free software; you can redistribute it and/or modify > + * it under the terms of the GNU General Public License version 2 as > + * published by the Free Software Foundation. > + * > + * This program is distributed in the hope that it will be useful, > + * but WITHOUT ANY WARRANTY; without even the implied warranty of > + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the > + * GNU General Public License for more details. > + * > + * You should have received a copy of the GNU General Public License > + * along with this program; if not, write to the Free Software > + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 > USA > + * > + */ > + > +#ifdef HAVE_CONFIG_H > +#include <config.h> > +#endif > + > +#include <glib.h> > + > +#define OFONO_API_SUBJECT_TO_CHANGE > +#include <ofono/plugin.h> > +#include <ofono/types.h> > + > +#include "atmodem.h" > + > +static int cdma_atmodem_init(void) > +{ > + cdma_at_voicecall_init(); > + > + return 0; > +} > + > +static void cdma_atmodem_exit(void) > +{ > + cdma_at_voicecall_exit(); > +} > + > +OFONO_PLUGIN_DEFINE(cdma_atmodem, "CDMA AT modem driver", VERSION, > + OFONO_PLUGIN_PRIORITY_DEFAULT, cdma_atmodem_init, cdma_atmodem_exit) > diff --git a/drivers/cdma-atmodem/atmodem.h b/drivers/cdma-atmodem/atmodem.h > new file mode 100644 > index 0000000..32facbc > --- /dev/null > +++ b/drivers/cdma-atmodem/atmodem.h > @@ -0,0 +1,26 @@ > +/* > + * > + * oFono - Open Source Telephony > + * > + * Copyright (C) 2010 Nokia Corporation. All rights reserved. > + * > + * This program is free software; you can redistribute it and/or modify > + * it under the terms of the GNU General Public License version 2 as > + * published by the Free Software Foundation. > + * > + * This program is distributed in the hope that it will be useful, > + * but WITHOUT ANY WARRANTY; without even the implied warranty of > + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the > + * GNU General Public License for more details. > + * > + * You should have received a copy of the GNU General Public License > + * along with this program; if not, write to the Free Software > + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 > USA > + * > + */ > + > +extern void cdma_at_voicecall_init(); > +extern void cdma_at_voicecall_exit(); > + > +extern void cdma_at_devinfo_init(); > +extern void cdma_at_devinfo_exit(); > diff --git a/drivers/cdma-atmodem/atutil.c b/drivers/cdma-atmodem/atutil.c > new file mode 100644 > index 0000000..b58c1ee > --- /dev/null > +++ b/drivers/cdma-atmodem/atutil.c > @@ -0,0 +1,45 @@ > +/* > + * > + * oFono - Open Source Telephony > + * > + * Copyright (C) 2010 Nokia Corporation. All rights reserved. > + * > + * This program is free software; you can redistribute it and/or modify > + * it under the terms of the GNU General Public License version 2 as > + * published by the Free Software Foundation. > + * > + * This program is distributed in the hope that it will be useful, > + * but WITHOUT ANY WARRANTY; without even the implied warranty of > + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the > + * GNU General Public License for more details. > + * > + * You should have received a copy of the GNU General Public License > + * along with this program; if not, write to the Free Software > + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 > USA > + * > + */ > + > +#ifdef HAVE_CONFIG_H > +#include <config.h> > +#endif > + > +#include <glib.h> > +#include <string.h> > +#include <stdlib.h> > + > +#define OFONO_API_SUBJECT_TO_CHANGE > +#include <ofono/log.h> > +#include <ofono/types.h> > + > +#include "atutil.h" > + > +void decode_at_error(struct ofono_error *error, const char *final) > +{ > + if (!strcmp(final, "OK")) { > + error->type = OFONO_ERROR_TYPE_NO_ERROR; > + error->error = 0; > + } else { > + error->type = OFONO_ERROR_TYPE_FAILURE; > + error->error = 0; > + } > +} > diff --git a/drivers/cdma-atmodem/atutil.h b/drivers/cdma-atmodem/atutil.h > new file mode 100644 > index 0000000..9a7c5e1 > --- /dev/null > +++ b/drivers/cdma-atmodem/atutil.h > @@ -0,0 +1,65 @@ > +/* > + * > + * oFono - Open Source Telephony > + * > + * Copyright (C) 2010 Nokia Corporation. All rights reserved. > + * > + * This program is free software; you can redistribute it and/or modify > + * it under the terms of the GNU General Public License version 2 as > + * published by the Free Software Foundation. > + * > + * This program is distributed in the hope that it will be useful, > + * but WITHOUT ANY WARRANTY; without even the implied warranty of > + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the > + * GNU General Public License for more details. > + * > + * You should have received a copy of the GNU General Public License > + * along with this program; if not, write to the Free Software > + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 > USA > + * > + */ > + > +#ifndef __AT_UTIL_H > +#define __AT_UTIL_H > + > +void decode_at_error(struct ofono_error *error, const char *final); > + > +struct cb_data { > + void *cb; > + void *data; > + void *user; > +}; > + > +static inline struct cb_data *cb_data_new(void *cb, void *data) > +{ > + struct cb_data *ret; > + > + ret = g_try_new0(struct cb_data, 1); > + > + if (ret == NULL) > + return ret; > + > + ret->cb = cb; > + ret->data = data; > + > + return ret; > +} > + > +#define CALLBACK_WITH_FAILURE(cb, args...) \ > + do { \ > + struct ofono_error cb_e; \ > + cb_e.type = OFONO_ERROR_TYPE_FAILURE; \ > + cb_e.error = 0; \ > + \ > + cb(&cb_e, ##args); \ > + } while (0) \ > + > +#define CALLBACK_WITH_SUCCESS(f, args...) \ > + do { \ > + struct ofono_error e; \ > + e.type = OFONO_ERROR_TYPE_NO_ERROR; \ > + e.error = 0; \ > + f(&e, ##args); \ > + } while (0) \ > + > +#endif /* __AT_UTIL_H */ > diff --git a/drivers/cdma-atmodem/voicecall.c > b/drivers/cdma-atmodem/voicecall.c > new file mode 100644 > index 0000000..efae370 > --- /dev/null > +++ b/drivers/cdma-atmodem/voicecall.c > @@ -0,0 +1,195 @@ > +/* > + * > + * oFono - Open Source Telephony > + * > + * Copyright (C) 2010 Nokia Corporation. All rights reserved. > + * > + * This program is free software; you can redistribute it and/or modify > + * it under the terms of the GNU General Public License version 2 as > + * published by the Free Software Foundation. > + * > + * This program is distributed in the hope that it will be useful, > + * but WITHOUT ANY WARRANTY; without even the implied warranty of > + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the > + * GNU General Public License for more details. > + * > + * You should have received a copy of the GNU General Public License > + * along with this program; if not, write to the Free Software > + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 > USA > + * > + */ > + > +#ifdef HAVE_CONFIG_H > +#include <config.h> > +#endif > + > +#define _GNU_SOURCE > +#include <string.h> > +#include <stdlib.h> > +#include <stdio.h> > +#include <errno.h> > + > +#include <glib.h> > + > +#include <ofono/log.h> > +#include <ofono/modem.h> > +#include <ofono/cdma-voicecall.h> > + > +#include "gatchat.h" > +#include "gatresult.h" > + > +#include "atutil.h" > +#include "atmodem.h" > + > +static const char *none_prefix[] = { NULL }; > + > +struct voicecall_driver { > + struct ofono_cdma_voicecall_manager *vc; > + unsigned int local_release; > + GAtChat *chat; > + unsigned int vendor; > +}; > + > +struct change_state_req { > + struct ofono_cdma_voicecall_manager *vc; > + ofono_cdma_voicecall_cb_t cb; > + void *data; > +}; > + > +static void at_dial_cb(gboolean ok, GAtResult *result, gpointer user_data) > +{ > + struct cb_data *cbd = user_data; > + ofono_cdma_voicecall_cb_t cb = cbd->cb; > + GAtResultIter iter; > + struct ofono_error error; > + > + decode_at_error(&error, g_at_result_final_response(result)); > + > + if (!ok) > + goto out; > + > + g_at_result_iter_init(&iter, result); What is this for? > + > +out: > + cb(&error, cbd->data); > +} > + > +static void at_dial(struct ofono_cdma_voicecall_manager *vc, > + const struct ofono_cdma_phone_number *ph, > + ofono_cdma_voicecall_cb_t cb, void *data) > +{ > + struct voicecall_driver *vd = ofono_cdma_voicecall_manager_get_data(vc); > + struct cb_data *cbd = cb_data_new(cb, data); > + char buf[256]; > + > + if (cbd == NULL) > + goto error; > + > + cbd->user = vc; > + > + snprintf(buf, sizeof(buf), "AT+CDV=%s", ph->number); > + > + if (g_at_chat_send(vd->chat, buf, none_prefix, > + at_dial_cb, cbd, g_free) > 0) > + return; > + > +error: > + g_free(cbd); > + > + CALLBACK_WITH_FAILURE(cb, data); > +} > + > +static void at_template(const char *cmd, > + struct ofono_cdma_voicecall_manager *vc, > + GAtResultFunc result_cb, > + ofono_cdma_voicecall_cb_t cb, void *data) > +{ > + struct voicecall_driver *vd = ofono_cdma_voicecall_manager_get_data(vc); > + struct change_state_req *req = g_try_new0(struct change_state_req, 1); > + > + if (req == NULL) > + goto error; > + > + req->vc = vc; > + req->cb = cb; > + req->data = data; > + > + if (g_at_chat_send(vd->chat, cmd, none_prefix, > + result_cb, req, g_free) > 0) > + return; > + > +error: > + g_free(req); > + > + CALLBACK_WITH_FAILURE(cb, data); > +} > + > +static void at_hangup_cb(gboolean ok, GAtResult *result, gpointer user_data) > +{ > + struct change_state_req *req = user_data; > + > + if (!ok) { > + ofono_error("hangup failed."); > + return; > + } > + > + ofono_cdma_voicecall_manager_disconnected(req->vc, > + OFONO_DISCONNECT_REASON_LOCAL_HANGUP, NULL); > + CALLBACK_WITH_SUCCESS(req->cb, req->data); > + Why the extra empty line? How do we handle remote side hanging up? > +} > + > +static void at_hangup(struct ofono_cdma_voicecall_manager *vc, > + ofono_cdma_voicecall_cb_t cb, void *data) > +{ > + /* Hangup active call */ > + at_template("AT+CHV", vc, at_hangup_cb, cb, data); > +} > + > +static int at_voicecall_probe(struct ofono_cdma_voicecall_manager *vc, > + unsigned int vendor, void *data) > +{ > + GAtChat *chat = data; > + struct voicecall_driver *vd; > + > + vd = g_try_new0(struct voicecall_driver, 1); > + if (vd == NULL) > + return -ENOMEM; > + > + vd->chat = g_at_chat_clone(chat); > + vd->vendor = vendor; > + > + ofono_cdma_voicecall_manager_set_data(vc, vd); > + > + ofono_cdma_voicecall_manager_register(vc); > + > + return 0; > +} > + > +static void at_voicecall_remove(struct ofono_cdma_voicecall_manager *vc) > +{ > + struct voicecall_driver *vd = ofono_cdma_voicecall_manager_get_data(vc); > + > + ofono_cdma_voicecall_manager_set_data(vc, NULL); > + > + g_at_chat_unref(vd->chat); > + g_free(vd); > +} > + > +static struct ofono_cdma_voicecall_manager_driver driver = { > + .name = "cdma-atmodem", > + .probe = at_voicecall_probe, > + .remove = at_voicecall_remove, > + .dial = at_dial, > + .hangup = at_hangup, > +}; > + > +void cdma_at_voicecall_init() > +{ > + ofono_cdma_voicecall_manager_driver_register(&driver); > +} > + > +void cdma_at_voicecall_exit() > +{ > + ofono_cdma_voicecall_manager_driver_unregister(&driver); > +} Regards, -Denis _______________________________________________ ofono mailing list ofono@ofono.org http://lists.ofono.org/listinfo/ofono