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) |