diff options
author | Andrzej Zaborowski <andrew.zaborowski@intel.com> | 2010-11-07 18:42:18 +0100 |
---|---|---|
committer | Denis Kenzior <denkenz@gmail.com> | 2010-11-08 13:36:23 -0600 |
commit | 65159c2f0ba8fb516b0e0d9ef66aaaaba066434a (patch) | |
tree | 463f559b2a2e5606523b051a8549d44e3fd32997 /src | |
parent | 061982c9f3c3e77fb6e5108645b223bce14ad1ab (diff) | |
download | ofono-65159c2f0ba8fb516b0e0d9ef66aaaaba066434a.tar.bz2 |
stk: API for SMS Point-to-Point download to UICC
The callback returns the TP-User-Data element content of the RP-ACK or
RP-ERROR message, returned by the UICC.
Diffstat (limited to 'src')
-rw-r--r-- | src/ofono.h | 8 | ||||
-rw-r--r-- | src/stk.c | 39 |
2 files changed, 47 insertions, 0 deletions
diff --git a/src/ofono.h b/src/ofono.h index ab6ecd2f..e5b4acbe 100644 --- a/src/ofono.h +++ b/src/ofono.h @@ -283,9 +283,17 @@ unsigned short __ofono_sms_get_next_ref(struct ofono_sms *sms); #include <ofono/sim.h> #include <ofono/stk.h> +typedef void (*__ofono_sms_sim_download_cb_t)(ofono_bool_t ok, + const unsigned char *tp_ud, + int len, void *data); + struct cbs; void __ofono_cbs_sim_download(struct ofono_stk *stk, const struct cbs *msg); +struct sms; +int __ofono_sms_sim_download(struct ofono_stk *stk, const struct sms *msg, + __ofono_sms_sim_download_cb_t cb, void *data); + #include <ofono/ssn.h> typedef void (*ofono_ssn_mo_notify_cb)(int index, void *user); @@ -75,6 +75,9 @@ struct ofono_stk { struct stk_icon_id idle_mode_icon; struct timeval get_inkey_start_ts; int dtmf_id; + + __ofono_sms_sim_download_cb_t sms_pp_cb; + void *sms_pp_userdata; }; struct envelope_op { @@ -257,6 +260,42 @@ void __ofono_cbs_sim_download(struct ofono_stk *stk, const struct cbs *msg) stk_cbs_download_cb(stk, FALSE, NULL, -1); } +static void stk_sms_download_cb(struct ofono_stk *stk, gboolean ok, + const unsigned char *data, int len) +{ + DBG("SMS-PP download to UICC reported %s", ok ? "success" : "error"); + + if (stk->sms_pp_cb) + stk->sms_pp_cb(ok, data, len, stk->sms_pp_userdata); +} + +int __ofono_sms_sim_download(struct ofono_stk *stk, const struct sms *msg, + __ofono_sms_sim_download_cb_t cb, void *data) +{ + struct stk_envelope e; + + if (msg->type != SMS_TYPE_DELIVER) + return -EINVAL; + + DBG(""); + + memset(&e, 0, sizeof(e)); + + e.type = STK_ENVELOPE_TYPE_SMS_PP_DOWNLOAD; + e.src = STK_DEVICE_IDENTITY_TYPE_NETWORK; + + e.sms_pp_download.address.number = (char *) msg->sc_addr.address; + e.sms_pp_download.address.ton_npi = msg->sc_addr.numbering_plan | + (msg->sc_addr.number_type << 4); + memcpy(&e.sms_pp_download.message, &msg->deliver, sizeof(msg->deliver)); + + stk->sms_pp_cb = cb; + stk->sms_pp_userdata = data; + + return stk_send_envelope(stk, &e, stk_sms_download_cb, + ENVELOPE_RETRIES_DEFAULT); +} + static char *dbus_apply_text_attributes(const char *text, const struct stk_text_attribute *attr) { |