Open Source Telephony
 help / color / mirror / Atom feed
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

  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