diff mbox

[4/4] core: Parse GSM0480_OP_CODE_PROCESS_USS_DATA message

Message ID 1448447824-10290-4-git-send-email-Sergey.Kostanbaev@moex.com
State Superseded
Headers show

Commit Message

Sergey Kostanbaev Nov. 25, 2015, 10:37 a.m. UTC
From: Sergey Kostanbaev <Sergey.Kostanbaev@gmail.com>

Add parsing of PROCESS_USS_DATA seen on old phones, it uses 8-bit encoding
so the language is hardcoded to it.

---
 src/gsm/gsm0480.c | 31 +++++++++++++++++++++++++++++++
 1 file changed, 31 insertions(+)
diff mbox

Patch

diff --git a/src/gsm/gsm0480.c b/src/gsm/gsm0480.c
index 41eea5f..8c86f49 100644
--- a/src/gsm/gsm0480.c
+++ b/src/gsm/gsm0480.c
@@ -206,6 +206,8 @@  static int parse_ss_return_result(const uint8_t *rr_data, uint16_t length,
 				  struct ss_request *req);
 static int parse_process_uss_req(const uint8_t *uss_req_data, uint16_t length,
 					struct ss_request *req);
+static int parse_process_uss_data(const uint8_t *uss_req_data, uint16_t length,
+					struct ss_request *req);
 static int parse_ss_for_bs_req(const uint8_t *ss_req_data,
 				     uint16_t length,
 				     struct ss_request *req);
@@ -483,6 +485,11 @@  static int parse_ss_invoke(const uint8_t *invoke_data, uint16_t length,
 						   length - offset - 3,
 						   req);
 			break;
+		case GSM0480_OP_CODE_PROCESS_USS_DATA:
+			rc = parse_process_uss_data(invoke_data + offset + 3,
+						    length - offset - 3,
+						    req);
+			break;
 		case GSM0480_OP_CODE_ACTIVATE_SS:
 		case GSM0480_OP_CODE_DEACTIVATE_SS:
 		case GSM0480_OP_CODE_INTERROGATE_SS:
@@ -506,6 +513,30 @@  static int parse_ss_invoke(const uint8_t *invoke_data, uint16_t length,
 	return rc;
 }
 
+static int parse_process_uss_data(const uint8_t *uss_req_data, uint16_t length,
+				  struct ss_request *req)
+{
+	uint8_t num_chars;
+
+	/* we need at least that much */
+	if (length < 3)
+		return 0;
+
+	if (uss_req_data[0] != ASN1_IA5_STRING_TAG)
+		return 0;
+
+	num_chars = uss_req_data[1];
+	if (num_chars > length - 2)
+		return 0;
+	if (num_chars > MAX_ASN1_LEN_USSD_STRING)
+		num_chars = MAX_ASN1_LEN_USSD_STRING;
+
+	req->ussd_text_language = 1;
+	req->ussd_text_len = num_chars;
+	memcpy(req->ussd_text, uss_req_data + 2, num_chars);
+	return 1;
+}
+
 static const uint8_t *parse_asn1_small_len(const uint8_t *codedlen, uint16_t available,
 					   uint8_t *out_len)
 {