diff options
author | Andrzej Zaborowski <andrew.zaborowski@intel.com> | 2010-06-30 17:24:15 +0200 |
---|---|---|
committer | Denis Kenzior <denkenz@gmail.com> | 2010-07-02 14:13:45 -0500 |
commit | 365183d5a08114c4ad51363dfa2a820bdce577d9 (patch) | |
tree | 767348052326971b1df4d8604bcec221d6967de4 /src/stkutil.c | |
parent | bf562fd639b3cd06206f64e699b3206bc2e464d8 (diff) | |
download | ofono-365183d5a08114c4ad51363dfa2a820bdce577d9.tar.bz2 |
stkutil: Move scaddr field to gsm_sms
Diffstat (limited to 'src/stkutil.c')
-rw-r--r-- | src/stkutil.c | 58 |
1 files changed, 43 insertions, 15 deletions
diff --git a/src/stkutil.c b/src/stkutil.c index 6f072e7d..e92add31 100644 --- a/src/stkutil.c +++ b/src/stkutil.c @@ -2633,7 +2633,6 @@ static enum stk_command_parse_result parse_select_item( static void destroy_send_sms(struct stk_command *command) { g_free(command->send_sms.alpha_id); - g_free(command->send_sms.address.number); g_free(command->send_sms.cdma_sms.array); } @@ -2644,6 +2643,7 @@ static enum stk_command_parse_result parse_send_sms( struct stk_command_send_sms *obj = &command->send_sms; enum stk_command_parse_result status; struct gsm_sms_tpdu gsm_tpdu; + struct stk_address sc_address = { 0, NULL }; if (command->src != STK_DEVICE_IDENTITY_TYPE_UICC) return STK_PARSE_RESULT_DATA_NOT_UNDERSTOOD; @@ -2655,7 +2655,7 @@ static enum stk_command_parse_result parse_send_sms( status = parse_dataobj(iter, STK_DATA_OBJECT_TYPE_ALPHA_ID, 0, &obj->alpha_id, STK_DATA_OBJECT_TYPE_ADDRESS, 0, - &obj->address, + &sc_address, STK_DATA_OBJECT_TYPE_GSM_SMS_TPDU, 0, &gsm_tpdu, STK_DATA_OBJECT_TYPE_CDMA_SMS_TPDU, 0, @@ -2671,35 +2671,63 @@ static enum stk_command_parse_result parse_send_sms( command->destructor = destroy_send_sms; if (status != STK_PARSE_RESULT_OK) - return status; + goto out; - if (gsm_tpdu.len == 0 && obj->cdma_sms.len == 0) - return STK_PARSE_RESULT_DATA_NOT_UNDERSTOOD; + if (gsm_tpdu.len == 0 && obj->cdma_sms.len == 0) { + status = STK_PARSE_RESULT_DATA_NOT_UNDERSTOOD; + goto out; + } - if (gsm_tpdu.len > 0 && obj->cdma_sms.len > 0) - return STK_PARSE_RESULT_DATA_NOT_UNDERSTOOD; + if (gsm_tpdu.len > 0 && obj->cdma_sms.len > 0) { + status = STK_PARSE_RESULT_DATA_NOT_UNDERSTOOD; + goto out; + } /* We don't process CDMA pdus for now */ if (obj->cdma_sms.len > 0) - return STK_PARSE_RESULT_OK; + goto out; /* packing is needed */ if (command->qualifier & 0x01) { if (sms_decode_unpacked_stk_pdu(gsm_tpdu.tpdu, gsm_tpdu.len, - &obj->gsm_sms) != TRUE) + &obj->gsm_sms) != + TRUE) { status = STK_PARSE_RESULT_DATA_NOT_UNDERSTOOD; - return status; + goto out; + } + + goto set_addr; } if (sms_decode(gsm_tpdu.tpdu, gsm_tpdu.len, TRUE, - gsm_tpdu.len, &obj->gsm_sms) == FALSE) - return STK_PARSE_RESULT_DATA_NOT_UNDERSTOOD; + gsm_tpdu.len, &obj->gsm_sms) == FALSE) { + status = STK_PARSE_RESULT_DATA_NOT_UNDERSTOOD; + goto out; + } if (obj->gsm_sms.type != SMS_TYPE_SUBMIT && - obj->gsm_sms.type != SMS_TYPE_COMMAND) - return STK_PARSE_RESULT_DATA_NOT_UNDERSTOOD; + obj->gsm_sms.type != SMS_TYPE_COMMAND) { + status = STK_PARSE_RESULT_DATA_NOT_UNDERSTOOD; + goto out; + } - return STK_PARSE_RESULT_OK; +set_addr: + if (sc_address.number == NULL) + goto out; + + if (strlen(sc_address.number) > 20) { + status = STK_PARSE_RESULT_DATA_NOT_UNDERSTOOD; + goto out; + } + + strcpy(obj->gsm_sms.sc_addr.address, sc_address.number); + obj->gsm_sms.sc_addr.numbering_plan = sc_address.ton_npi & 15; + obj->gsm_sms.sc_addr.number_type = (sc_address.ton_npi >> 4) & 7; + +out: + g_free(sc_address.number); + + return status; } static void destroy_send_ss(struct stk_command *command) |