All of lore.kernel.org
 help / color / mirror / Atom feed
From: Lei Yu <lei.2.yu@nokia.com>
To: ofono@ofono.org
Subject: [PATCH 3/5] cdma-atmodem: Add CDMA SMS Support
Date: Wed, 08 Dec 2010 16:35:49 -0800	[thread overview]
Message-ID: <1291854951-2378-4-git-send-email-lei.2.yu@nokia.com> (raw)
In-Reply-To: <y>

[-- Attachment #1: Type: text/plain, Size: 11656 bytes --]

---
 Makefile.am                    |    7 ++
 configure.ac                   |    5 ++
 drivers/cdma-atmodem/atmodem.c |   47 ++++++++++++
 drivers/cdma-atmodem/atmodem.h |   23 ++++++
 drivers/cdma-atmodem/atutil.c  |   45 ++++++++++++
 drivers/cdma-atmodem/atutil.h  |   64 +++++++++++++++++
 drivers/cdma-atmodem/sms.c     |  151 ++++++++++++++++++++++++++++++++++++++++
 7 files changed, 342 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/sms.c

diff --git a/Makefile.am b/Makefile.am
index b7dc5ee..400d4c0 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.h \
+			drivers/cdma-atmodem/atmodem.c \
+			drivers/cdma-atmodem/sms.c
+endif
+
 builtin_modules += g1
 builtin_sources += plugins/g1.c
 
diff --git a/configure.ac b/configure.ac
index 5c18f68..abbd8cc 100644
--- a/configure.ac
+++ b/configure.ac
@@ -166,6 +166,11 @@ AC_ARG_ENABLE(phonesim, AC_HELP_STRING([--disable-phonesim],
 AM_CONDITIONAL(PHONESIM, test "${enable_phonesim}" != "no" &&
 					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(isimodem, AC_HELP_STRING([--disable-isimodem],
 				[disable PhoNet/ISI modem support]),
 					[enable_isimodem=${enableval}])
diff --git a/drivers/cdma-atmodem/atmodem.c b/drivers/cdma-atmodem/atmodem.c
new file mode 100644
index 0000000..fac9069
--- /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_sms_init();
+
+	return 0;
+}
+
+static void cdma_atmodem_exit(void)
+{
+	cdma_at_sms_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..28d3d63
--- /dev/null
+++ b/drivers/cdma-atmodem/atmodem.h
@@ -0,0 +1,23 @@
+/*
+ *
+ *  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_sms_init();
+extern void cdma_at_sms_exit();
diff --git a/drivers/cdma-atmodem/atutil.c b/drivers/cdma-atmodem/atutil.c
new file mode 100644
index 0000000..f0da2d0
--- /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
+
+ *  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..6b5c77a
--- /dev/null
+++ b/drivers/cdma-atmodem/atutil.h
@@ -0,0 +1,64 @@
+/*
+ *
+ *  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/sms.c b/drivers/cdma-atmodem/sms.c
new file mode 100644
index 0000000..ffa371c
--- /dev/null
+++ b/drivers/cdma-atmodem/sms.c
@@ -0,0 +1,151 @@
+/*
+ *
+ *  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-sms.h>
+#include "util.h"
+
+#include "gatchat.h"
+#include "gatresult.h"
+
+#include "atmodem.h"
+
+struct cdmasms_data {
+	unsigned int vendor;
+	GAtChat *chat;
+};
+
+static gboolean cdma_at_parse_pdu_common(GAtResult *result, const char *prefix,
+											const char **pdu, int *pdulen)
+{
+	GAtResultIter iter;
+
+	g_at_result_iter_init(&iter, result);
+
+	if (!g_at_result_iter_next(&iter, prefix))
+		return FALSE;
+
+	if (!strcmp(prefix, "+CMT:") && !g_at_result_iter_skip_next(&iter))
+		return FALSE;
+
+	if (!g_at_result_iter_next_number(&iter, pdulen))
+		return FALSE;
+
+	*pdu = g_at_result_pdu(result);
+
+	return TRUE;
+}
+
+static void cdma_at_cmt_notify(GAtResult *result, gpointer user_data)
+{
+	struct ofono_cdmasms *cdmasms = user_data;
+	const char *hexpdu;
+	long pdu_len;
+	int tpdu_len;
+	unsigned char pdu[256];
+
+	if (!cdma_at_parse_pdu_common(result, "+CMT:", &hexpdu, &tpdu_len)) {
+		ofono_error("Unable to parse CMT notification");
+		return;
+	}
+
+	if (strlen(hexpdu) > sizeof(pdu) * 2) {
+		ofono_error("Bad PDU length in CMT notification");
+		return;
+	}
+
+	DBG("Got new SMS Deliver PDU via CMT: %s, %d", hexpdu, tpdu_len);
+
+	decode_hex_own_buf(hexpdu, -1, &pdu_len, 0, pdu);
+	ofono_cdmasms_deliver_notify(cdmasms, pdu, pdu_len);
+}
+
+static void cdma_at_sms_initialized(struct ofono_cdmasms *cdmasms)
+{
+	struct cdmasms_data *data = ofono_cdmasms_get_data(cdmasms);
+
+	g_at_chat_register(data->chat, "+CMT:", cdma_at_cmt_notify, TRUE,
+				cdmasms, NULL);
+
+	ofono_cdmasms_register(cdmasms);
+}
+
+static int cdma_at_sms_probe(struct ofono_cdmasms *cdmasms, unsigned int vendor,
+								void *user)
+{
+	GAtChat *chat = user;
+	struct cdmasms_data *data;
+
+	data = g_new0(struct cdmasms_data, 1);
+	if (data == NULL)
+		return -ENOMEM;
+
+	data->chat = g_at_chat_clone(chat);
+	if (data->chat == NULL)
+		return -ENOMEM;
+
+	data->vendor = vendor;
+
+	ofono_cdmasms_set_data(cdmasms, data);
+
+	cdma_at_sms_initialized(cdmasms);
+
+	return 0;
+}
+
+static void cdma_at_sms_remove(struct ofono_cdmasms *cdmasms)
+{
+	struct cdmasms_data *data = ofono_cdmasms_get_data(cdmasms);
+
+	ofono_cdmasms_set_data(cdmasms, NULL);
+
+	g_at_chat_unref(data->chat);
+	g_free(data);
+}
+
+static struct ofono_cdmasms_driver driver = {
+	.name		= "cdma-atmodem",
+	.probe		= cdma_at_sms_probe,
+	.remove		= cdma_at_sms_remove,
+};
+
+void cdma_at_sms_init()
+{
+	ofono_cdmasms_driver_register(&driver);
+}
+
+void cdma_at_sms_exit()
+{
+	ofono_cdmasms_driver_unregister(&driver);
+}
-- 
1.7.0.4


             reply	other threads:[~2010-12-09  0:35 UTC|newest]

Thread overview: 3+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2010-12-09  0:35 Lei Yu [this message]
2010-12-20 20:39 ` [PATCH 3/5] cdma-atmodem: Add CDMA SMS Support Denis Kenzior
2010-12-20 21:31   ` 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=1291854951-2378-4-git-send-email-lei.2.yu@nokia.com \
    --to=lei.2.yu@nokia.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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.