summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAndrzej Zaborowski <andrew.zaborowski@intel.com>2010-07-07 00:39:09 +0200
committerDenis Kenzior <denkenz@gmail.com>2010-07-08 14:27:35 -0500
commit45d535b802713d28a23432e1287c72dea9fe32ec (patch)
treeeaf103534aa753ccb2c069e4c4173e2b2302d978
parent00cb839c837140aa97bba6bfb9592dc05b875380 (diff)
downloadofono-45d535b802713d28a23432e1287c72dea9fe32ec.tar.bz2
stk: Handle the Poll Interval proactive command
-rw-r--r--src/stk.c45
1 files changed, 45 insertions, 0 deletions
diff --git a/src/stk.c b/src/stk.c
index 32026615..69c4a492 100644
--- a/src/stk.c
+++ b/src/stk.c
@@ -521,6 +521,47 @@ static gboolean handle_command_timer_mgmt(const struct stk_command *cmd,
return TRUE;
}
+static gboolean handle_command_poll_interval(const struct stk_command *cmd,
+ struct stk_response *rsp,
+ struct ofono_stk *stk)
+{
+ struct ofono_modem *modem = __ofono_atom_get_modem(stk->atom);
+ int seconds;
+
+ switch (cmd->poll_interval.duration.unit) {
+ case STK_DURATION_TYPE_MINUTES:
+ seconds = cmd->poll_interval.duration.interval * 60;
+ break;
+ case STK_DURATION_TYPE_SECONDS:
+ seconds = cmd->poll_interval.duration.interval;
+ break;
+ case STK_DURATION_TYPE_SECOND_TENTHS:
+ seconds = (4 + cmd->poll_interval.duration.interval) / 10;
+ if (seconds < 1)
+ seconds = 1;
+ break;
+ }
+
+ if (ofono_modem_set_integer(modem, "status-poll-interval", seconds)) {
+ seconds = ofono_modem_get_integer(modem,
+ "status-poll-interval");
+ if (!seconds)
+ seconds = 30;
+ }
+
+ if (seconds > 255) {
+ rsp->poll_interval.max_interval.unit =
+ STK_DURATION_TYPE_MINUTES;
+ rsp->poll_interval.max_interval.interval = seconds / 60;
+ } else {
+ rsp->poll_interval.max_interval.unit =
+ STK_DURATION_TYPE_SECONDS;
+ rsp->poll_interval.max_interval.interval = seconds;
+ }
+
+ return TRUE;
+}
+
static void stk_proactive_command_cancel(struct ofono_stk *stk)
{
if (!stk->pending_cmd)
@@ -593,6 +634,10 @@ void ofono_stk_proactive_command_notify(struct ofono_stk *stk,
respond = handle_command_timer_mgmt(stk->pending_cmd,
&rsp, stk);
break;
+ case STK_COMMAND_TYPE_POLL_INTERVAL:
+ respond = handle_command_poll_interval(stk->pending_cmd,
+ &rsp, stk);
+ break;
}
if (respond)