Open Source Telephony
 help / color / mirror / Atom feed
From: Andrzej Zaborowski <andrew.zaborowski@intel.com>
To: ofono@ofono.org
Subject: [PATCH 2/4] stk: Allow registering proactive command handlers.
Date: Wed, 16 Jun 2010 17:26:53 +0200	[thread overview]
Message-ID: <1276702015-8711-2-git-send-email-andrew.zaborowski@intel.com> (raw)
In-Reply-To: <1276702015-8711-1-git-send-email-andrew.zaborowski@intel.com>

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

---
 src/stk.c |  144 +++++++++++++++++++++++++++++++++++++++++++++++++++++++------
 1 files changed, 131 insertions(+), 13 deletions(-)

diff --git a/src/stk.c b/src/stk.c
index f472a63..1dd5b77 100644
--- a/src/stk.c
+++ b/src/stk.c
@@ -40,14 +40,85 @@
 
 static GSList *g_drivers = NULL;
 
+typedef void (*generic_cb_t)(const struct ofono_error *error,
+				struct ofono_stk *stk);
+
+typedef void (*envelope_cb_t)(const struct ofono_error *error,
+				const unsigned char *rdata,
+				int length, struct ofono_stk *stk);
+
+typedef gboolean (*command_handler_t)(const struct stk_command *cmd,
+					struct stk_response *rsp,
+					struct ofono_stk *stk);
+
 struct ofono_stk {
 	const struct ofono_stk_driver *driver;
 	void *driver_data;
 	struct ofono_atom *atom;
+	command_handler_t handlers[256];
+	struct stk_command *pending_cmd;
 };
 
+static void stk_respond(struct ofono_stk *stk, struct stk_command *cmd,
+			struct stk_response *rsp, generic_cb_t cb)
+{
+	struct ofono_error error = { .type = OFONO_ERROR_TYPE_FAILURE };
+	const guint8 *tlv;
+	unsigned int tlv_len;
+
+	if (cmd == NULL)
+		cmd = stk->pending_cmd;
+	else
+		stk->pending_cmd = cmd;
+
+	rsp->src = STK_DEVICE_IDENTITY_TYPE_TERMINAL;
+	rsp->dst = STK_DEVICE_IDENTITY_TYPE_UICC;
+	rsp->number = cmd->number;
+	rsp->type = cmd->type;
+	rsp->qualifier = cmd->qualifier;
+
+	if (stk->driver->terminal_response == NULL) {
+		cb(&error, stk);
+		return;
+	}
+
+	tlv = stk_pdu_from_response(rsp, &tlv_len);
+	if (!tlv) {
+		cb(&error, stk);
+		return;
+	}
+
+	stk->driver->terminal_response(stk, tlv_len, tlv,
+					(ofono_stk_generic_cb_t) cb, stk);
+}
+
+static void stk_send_envelope(struct ofono_stk *stk, struct stk_envelope *e,
+				envelope_cb_t cb)
+{
+	struct ofono_error error = { .type = OFONO_ERROR_TYPE_FAILURE };
+	const guint8 *tlv;
+	unsigned int tlv_len;
+
+	e->dst = STK_DEVICE_IDENTITY_TYPE_UICC;
+
+	if (stk->driver->envelope == NULL) {
+		cb(&error, NULL, -1, stk);
+		return;
+	}
+
+	tlv = stk_pdu_from_envelope(e, &tlv_len);
+	if (!tlv) {
+		cb(&error, NULL, -1, stk);
+		return;
+	}
+
+	stk->driver->envelope(stk, tlv_len, tlv,
+				(ofono_stk_envelope_cb_t) cb, stk);
+}
+
 static void stk_cbs_download_cb(const struct ofono_error *error,
-				const unsigned char *data, int len, void *user)
+				const unsigned char *data, int len,
+				struct ofono_stk *stk)
 {
 	if (error->type != OFONO_ERROR_TYPE_NO_ERROR) {
 		ofono_error("CellBroadcast download to UICC failed");
@@ -56,34 +126,47 @@ static void stk_cbs_download_cb(const struct ofono_error *error,
 		return;
 	}
 
+	if (len)
+		ofono_error("CellBroadcast download returned %i bytes of data",
+				len);
+
 	DBG("CellBroadcast download to UICC reported no error");
 }
 
 void __ofono_cbs_sim_download(struct ofono_stk *stk, const struct cbs *msg)
 {
-	const guint8 *tlv;
-	unsigned int tlv_len;
 	struct stk_envelope e;
 
-	if (stk->driver->envelope == NULL)
-		return;
+	memset(&e, 0, sizeof(e));
 
 	e.type = STK_ENVELOPE_TYPE_CBS_PP_DOWNLOAD;
 	e.src = STK_DEVICE_IDENTITY_TYPE_NETWORK;
-	e.dst = STK_DEVICE_IDENTITY_TYPE_UICC;
 	memcpy(&e.cbs_pp_download.page, msg, sizeof(msg));
 
-	tlv = stk_pdu_from_envelope(&e, &tlv_len);
-	if (!tlv)
+	stk_send_envelope(stk, &e, stk_cbs_download_cb);
+}
+
+static void stk_command_cb(const struct ofono_error *error,
+				struct ofono_stk *stk)
+{
+	stk_command_free(stk->pending_cmd);
+	stk->pending_cmd = NULL;
+
+	if (error->type != OFONO_ERROR_TYPE_NO_ERROR) {
+		ofono_error("TERMINAL RESPONSE to a UICC command failed");
+		/* "The ME may retry to deliver the same Cell Broadcast
+		 * page." */
 		return;
+	}
 
-	stk->driver->envelope(stk, tlv_len, tlv, stk_cbs_download_cb, stk);
+	DBG("TERMINAL RESPONSE to a command reported no errors");
 }
 
 void ofono_stk_proactive_command_notify(struct ofono_stk *stk,
 					int length, const unsigned char *pdu)
 {
 	struct stk_command *cmd;
+	struct stk_response rsp;
 	char *buf;
 	int i;
 
@@ -97,14 +180,49 @@ void ofono_stk_proactive_command_notify(struct ofono_stk *stk,
 		ofono_error("Can't parse proactive command: %s", buf);
 		g_free(buf);
 
-		/* TODO: return TERMINAL RESPONSE with permanent error */
+		/*
+		 * There's nothing we can do, we'd need at least Command
+		 * Details to respond with an error.
+		 */
 		return;
 	}
+	g_free(buf);
 
-	/* TODO: execute */
+	memset(&rsp, 0, sizeof(rsp));
 
-	g_free(buf);
-	stk_command_free(cmd);
+	switch (cmd->status) {
+	case STK_PARSE_RESULT_OK:
+		if (stk->handlers[cmd->type]) {
+			if (stk->handlers[cmd->type](cmd, &rsp, stk) == TRUE)
+				break;
+
+			stk->pending_cmd = cmd;
+			return;
+		}
+		/* Fall through */
+
+	case STK_PARSE_RESULT_TYPE_NOT_UNDERSTOOD:
+	default:
+		rsp.result.type = STK_RESULT_TYPE_COMMAND_NOT_UNDERSTOOD;
+		break;
+
+	case STK_PARSE_RESULT_MISSING_VALUE:
+		rsp.result.type = STK_RESULT_TYPE_MINIMUM_NOT_MET;
+		break;
+
+	case STK_PARSE_RESULT_DATA_NOT_UNDERSTOOD:
+		rsp.result.type = STK_RESULT_TYPE_DATA_NOT_UNDERSTOOD;
+		break;
+	}
+
+	stk_respond(stk, cmd, &rsp, stk_command_cb);
+}
+
+static void stk_command_handler_register(struct ofono_stk *stk,
+						enum stk_command_type type,
+						command_handler_t handler)
+{
+	stk->handlers[type] = handler;
 }
 
 int ofono_stk_driver_register(const struct ofono_stk_driver *d)
-- 
1.7.1.86.g0e460.dirty


  reply	other threads:[~2010-06-16 15:26 UTC|newest]

Thread overview: 7+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2010-06-16 15:26 [PATCH 1/4][RFC] stkutil: Refactor command parser error handling Andrzej Zaborowski
2010-06-16 15:26 ` Andrzej Zaborowski [this message]
2010-06-22 21:42   ` [PATCH 2/4] stk: Allow registering proactive command handlers Denis Kenzior
2010-06-22 22:14     ` Andrzej Zaborowski
2010-06-16 15:26 ` [PATCH 3/4] stk: Handle the More Time command as a nop Andrzej Zaborowski
2010-06-16 15:26 ` [PATCH 4/4] Add STK Menu D-bus interface Andrzej Zaborowski
2010-06-22 21:44 ` [PATCH 1/4][RFC] stkutil: Refactor command parser error handling Denis Kenzior

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=1276702015-8711-2-git-send-email-andrew.zaborowski@intel.com \
    --to=andrew.zaborowski@intel.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