From: Denis Kenzior <denkenz@gmail.com>
To: ofono@ofono.org
Subject: Re: [PATCH v3 7/7] cdmaphonesim: Add CDMA SMS Support
Date: Tue, 04 Jan 2011 15:44:01 -0600 [thread overview]
Message-ID: <4D2394A1.7010205@gmail.com> (raw)
In-Reply-To: <1293051795-17758-2-git-send-email-lei.2.yu@nokia.com>
[-- Attachment #1: Type: text/plain, Size: 10139 bytes --]
Hi Lei,
On 12/22/2010 03:03 PM, Lei Yu wrote:
> ---
> Makefile.am | 10 ++
> plugins/cdmaphonesim.c | 328 ++++++++++++++++++++++++++++++++++++++++++++++++
> plugins/phonesim.conf | 4 +
> 3 files changed, 342 insertions(+), 0 deletions(-)
> create mode 100644 plugins/cdmaphonesim.c
>
> diff --git a/Makefile.am b/Makefile.am
> index 771f57d..f2a686c 100644
> --- a/Makefile.am
> +++ b/Makefile.am
> @@ -247,6 +247,16 @@ builtin_modules += cdma_atmodem
> builtin_sources += drivers/cdmamodem/cdmamodem.h \
> drivers/cdmamodem/cdmamodem.c \
> drivers/cdmamodem/sms.c
> +
> +if PHONESIM
> +
> +if DATAFILES
> +conf_DATA += plugins/phonesim.conf
> +endif
> +endif
> +
Yikes, you better check this logic. I suspect simply adding:
+builtin_modules += cdmaphonesim
+builtin_sources += plugins/cdmaphonesim.c
to the existing if PHONESIM block should be enough.
> endif
>
> builtin_modules += g1
> diff --git a/plugins/cdmaphonesim.c b/plugins/cdmaphonesim.c
> new file mode 100644
> index 0000000..c9a88b4
> --- /dev/null
> +++ b/plugins/cdmaphonesim.c
> @@ -0,0 +1,328 @@
> +/*
> + * This file is part of oFono - Open Source Telephony
> + *
> + * Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
> + *
> + * 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 <errno.h>
> +#include <unistd.h>
> +#include <stdlib.h>
> +#include <string.h>
> +#include <sys/socket.h>
> +#include <netinet/in.h>
> +#include <arpa/inet.h>
> +
> +#include <glib.h>
> +#include <gatmux.h>
> +#include <gatchat.h>
> +
> +#define OFONO_API_SUBJECT_TO_CHANGE
> +#include <ofono/plugin.h>
> +#include <ofono/log.h>
> +#include <ofono/modem.h>
> +#include <ofono/cdma-sms.h>
> +#include <drivers/atmodem/atutil.h>
> +
> +struct cdmaphonesim_data {
> + GAtChat *chat;
> +};
> +
> +static int cdmaphonesim_probe(struct ofono_modem *modem)
> +{
> + struct cdmaphonesim_data *data;
> +
> + DBG("%p", modem);
> +
> + data = g_try_new0(struct cdmaphonesim_data, 1);
> + if (data == NULL)
> + return -ENOMEM;
> +
> + ofono_modem_set_data(modem, data);
> +
> + return 0;
> +}
> +
> +static void cdmaphonesim_remove(struct ofono_modem *modem)
> +{
> + struct cdmaphonesim_data *data = ofono_modem_get_data(modem);
> +
> + DBG("%p", modem);
> +
> + g_free(data);
> + ofono_modem_set_data(modem, NULL);
> +}
> +
> +static void cdmaphonesim_debug(const char *str, void *user_data)
> +{
> + ofono_info("%s", str);
> +}
> +
> +static void cfun_set_on_cb(gboolean ok, GAtResult *result, gpointer user_data)
> +{
> + struct ofono_modem *modem = user_data;
> +
> + DBG("");
> +
> + ofono_modem_set_powered(modem, ok);
> +}
> +
> +static void cdmaphonesim_disconnected(gpointer user_data)
> +{
> + struct ofono_modem *modem = user_data;
> + struct cdmaphonesim_data *data = ofono_modem_get_data(modem);
> +
> + DBG("");
> +
> + ofono_modem_set_powered(modem, FALSE);
> +
> + g_at_chat_unref(data->chat);
> + data->chat = NULL;
> +}
> +
> +static int cdmaphonesim_enable(struct ofono_modem *modem)
> +{
> + struct cdmaphonesim_data *data = ofono_modem_get_data(modem);
> + GIOChannel *io;
> + GAtSyntax *syntax;
> + struct sockaddr_in addr;
> + const char *address;
> + int sk, err, port;
> +
> + DBG("%p", modem);
> +
> + address = ofono_modem_get_string(modem, "Address");
> + if (address == NULL)
> + return -EINVAL;
> +
> + port = ofono_modem_get_integer(modem, "Port");
> + if (port < 0)
> + return -EINVAL;
> +
> + sk = socket(PF_INET, SOCK_STREAM, 0);
> + if (sk < 0)
> + return -EINVAL;
> +
> + memset(&addr, 0, sizeof(addr));
> + addr.sin_family = AF_INET;
> + addr.sin_addr.s_addr = inet_addr(address);
> + addr.sin_port = htons(port);
> +
> + err = connect(sk, (struct sockaddr *) &addr, sizeof(addr));
> + if (err < 0) {
> + close(sk);
> + return err;
> + }
> +
> + io = g_io_channel_unix_new(sk);
> + if (io == NULL) {
> + close(sk);
> + return -ENOMEM;
> + }
> +
> + syntax = g_at_syntax_new_gsmv1();
> +
> + data->chat = g_at_chat_new(io, syntax);
> +
> + g_at_syntax_unref(syntax);
> + g_io_channel_unref(io);
> +
> + if (data->chat == NULL)
> + return -ENOMEM;
> +
> + if (getenv("OFONO_AT_DEBUG"))
> + g_at_chat_set_debug(data->chat, cdmaphonesim_debug, NULL);
> +
> + g_at_chat_set_disconnect_function(data->chat,
> + cdmaphonesim_disconnected, modem);
> +
> + g_at_chat_send(data->chat, "AT+CFUN=1", NULL,
> + cfun_set_on_cb, modem, NULL);
> +
> + return -EINPROGRESS;
> +}
> +
> +static int cdmaphonesim_disable(struct ofono_modem *modem)
> +{
> + struct cdmaphonesim_data *data = ofono_modem_get_data(modem);
> +
> + DBG("%p", modem);
> +
> + g_at_chat_unref(data->chat);
> + data->chat = NULL;
> +
> + return 0;
> +}
> +
> +static void cdmaphonesim_pre_sim(struct ofono_modem *modem)
> +{
> + DBG("%p", modem);
> +}
> +
> +static void set_online_cb(gboolean ok, GAtResult *result, gpointer user_data)
> +{
> + struct cb_data *cbd = user_data;
> + ofono_modem_online_cb_t callback = cbd->cb;
> + struct ofono_error error;
> +
> + decode_at_error(&error, g_at_result_final_response(result));
> +
> + callback(&error, cbd->data);
> +}
> +
> +static void cdmaphonesim_set_online(struct ofono_modem *modem,
> + ofono_bool_t online,
> + ofono_modem_online_cb_t cb,
> + void *user_data)
> +{
> + struct cdmaphonesim_data *data = ofono_modem_get_data(modem);
> + struct cb_data *cbd = cb_data_new(cb, user_data);
> + char const *command = online ? "AT+CFUN=1" : "AT+CFUN=4";
> +
> + DBG("modem %p %s", modem, online ? "online" : "offline");
> +
> + if (cbd == NULL)
> + goto error;
> +
> + if (g_at_chat_send(data->chat, command, NULL,
> + set_online_cb, cbd, g_free))
> + return;
> +
> +error:
> + g_free(cbd);
> +
> + CALLBACK_WITH_FAILURE(cb, cbd->data);
> +}
> +
> +static void cdmaphonesim_post_online(struct ofono_modem *modem)
> +{
> + struct cdmaphonesim_data *data = ofono_modem_get_data(modem);
> +
> + ofono_cdma_sms_create(modem, 0, "cdmamodem", data->chat);
> +}
> +
> +static struct ofono_modem_driver cdmaphonesim_driver = {
> + .name = "cdmaphonesim",
> + .probe = cdmaphonesim_probe,
> + .remove = cdmaphonesim_remove,
> + .enable = cdmaphonesim_enable,
> + .disable = cdmaphonesim_disable,
> + .pre_sim = cdmaphonesim_pre_sim,
> + .set_online = cdmaphonesim_set_online,
> + .post_online = cdmaphonesim_post_online,
> +};
> +
> +static struct ofono_modem *create_modem(GKeyFile *keyfile, const char *group)
> +{
> + struct ofono_modem *modem;
> + char *value;
> +
> + DBG("group %s", group);
> +
> + modem = ofono_modem_create(group, "cdmaphonesim");
> + if (modem == NULL)
> + return NULL;
> +
> + value = g_key_file_get_string(keyfile, group, "Address", NULL);
> + if (value == NULL)
> + goto error;
> +
> + ofono_modem_set_string(modem, "Address", value);
> + g_free(value);
> +
> + value = g_key_file_get_string(keyfile, group, "Port", NULL);
> + if (value == NULL)
> + goto error;
> +
> + ofono_modem_set_integer(modem, "Port", atoi(value));
> + g_free(value);
> +
> + DBG("%p", modem);
> +
> + return modem;
> +
> +error:
> + ofono_error("Missing address or port setting for %s", group);
> +
> + ofono_modem_remove(modem);
> +
> + return NULL;
> +}
> +
> +static GSList *modem_list;
> +
> +static void parse_config(const char *filename)
> +{
> + GKeyFile *keyfile;
> + GError *err = NULL;
> + char **modems;
> + int i;
> +
> + DBG("filename %s", filename);
> +
> + keyfile = g_key_file_new();
> +
> + g_key_file_set_list_separator(keyfile, ',');
> +
> + if (!g_key_file_load_from_file(keyfile, filename, 0, &err)) {
> + ofono_warn("Reading of %s failed: %s", filename, err->message);
> + g_error_free(err);
> + goto done;
> + }
> +
> + modems = g_key_file_get_groups(keyfile, NULL);
> +
> + for (i = 0; modems[i]; i++) {
> + struct ofono_modem *modem;
> +
> + modem = create_modem(keyfile, modems[i]);
> + if (modem == NULL)
> + continue;
> +
> + modem_list = g_slist_prepend(modem_list, modem);
> +
> + ofono_modem_register(modem);
> + }
> +
> + g_strfreev(modems);
> +
> +done:
> + g_key_file_free(keyfile);
> +}
> +
> +static int cdmaphonesim_init(void)
> +{
> + int err;
> +
> + err = ofono_modem_driver_register(&cdmaphonesim_driver);
> + if (err < 0)
> + return err;
> +
> + parse_config(CONFIGDIR "/phonesim.conf");
> + return 0;
> +}
> +
> +static void cdmaphonesim_exit(void)
> +{
> + ofono_modem_driver_unregister(&cdmaphonesim_driver);
> +}
> +
> +OFONO_PLUGIN_DEFINE(cdmaphonesim, "CDMA PhoneSIM driver", VERSION,
> + OFONO_PLUGIN_PRIORITY_DEFAULT, cdmaphonesim_init, cdmaphonesim_exit)
> diff --git a/plugins/phonesim.conf b/plugins/phonesim.conf
> index 74bb645..8cd9678 100644
> --- a/plugins/phonesim.conf
> +++ b/plugins/phonesim.conf
> @@ -12,3 +12,7 @@
> #[phonesim]
> #Address=127.0.0.1
> #Port=12345
> +
> +#[cdmaphonesim]
> +#Address=127.0.0.1
> +#Port=12345
If we have both phonesim and cdmaphonesim plugins active, we need to
make sure they don't interfere with each other. Perhaps adding a
Type=cdma and having cdmaphonesim look for that Type tag and ignore the
rest would be a good idea?
Regards,
-Denis
next prev parent reply other threads:[~2011-01-04 21:44 UTC|newest]
Thread overview: 5+ messages / expand[flat|nested] mbox.gz Atom feed top
2010-12-22 21:03 [PATCH v3 7/7] cdmaphonesim: Add CDMA SMS Support Lei Yu
2011-01-04 21:44 ` Denis Kenzior [this message]
2011-01-05 18:03 ` Lei Yu
2011-01-05 18:05 ` Denis Kenzior
2011-01-06 17:47 ` Lei Yu
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=4D2394A1.7010205@gmail.com \
--to=denkenz@gmail.com \
--cc=ofono@ofono.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox