Add parser for address objects
authorYang Gu <yang.gu@intel.com>
Fri, 5 Mar 2010 04:34:28 +0000 (12:34 +0800)
committerDenis Kenzior <denkenz@gmail.com>
Wed, 10 Mar 2010 19:14:11 +0000 (13:14 -0600)
src/stkutil.c
src/stkutil.h

index 6a95cd2..e98ad58 100644 (file)
@@ -41,6 +41,32 @@ enum stk_data_object_flag {
 
 typedef gboolean (*dataobj_handler)(struct comprehension_tlv_iter *, void *);
 
+/* Defined in TS 102.223 Section 8.1 */
+static gboolean parse_dataobj_address(struct comprehension_tlv_iter *iter,
+                                       void *user)
+{
+       struct stk_address *addr = user;
+       const unsigned char *data;
+       unsigned int len;
+
+       if (comprehension_tlv_iter_get_tag(iter) !=
+                       STK_DATA_OBJECT_TYPE_ADDRESS)
+               return FALSE;
+
+       len = comprehension_tlv_iter_get_length(iter);
+       if (len < 2)
+               return FALSE;
+
+       data = comprehension_tlv_iter_get_data(iter);
+
+       addr->ton = (data[0] >> 4) & 0x07;
+       addr->npi = data[0] & 0x0f;
+       addr->number = g_malloc(len*2-1);
+       extract_bcd_number(data+1, len-1, addr->number);
+
+       return TRUE;
+}
+
 /* Described in TS 102.223 Section 8.8 */
 static gboolean parse_dataobj_duration(struct comprehension_tlv_iter *iter,
                                        void *user)
@@ -253,6 +279,8 @@ static gboolean parse_dataobj_frame_id(struct comprehension_tlv_iter *iter,
 static dataobj_handler handler_for_type(enum stk_data_object_type type)
 {
        switch (type) {
+       case STK_DATA_OBJECT_TYPE_ADDRESS:
+               return parse_dataobj_address;
        case STK_DATA_OBJECT_TYPE_DURATION:
                return parse_dataobj_duration;
        case STK_DATA_OBJECT_TYPE_RESPONSE_LENGTH:
index a319141..4576ddd 100644 (file)
@@ -192,6 +192,13 @@ enum stk_duration_type {
        STK_DURATION_TYPE_SECOND_TENTHS = 0x02,
 };
 
+/* Defined in TS 102.223 Section 8.1 */
+struct stk_address {
+       unsigned char ton;
+       unsigned char npi;
+       char *number;
+};
+
 /*
  * Icon ID denotes a file on the SIM filesystem.  Since EF cannot have record
  * ids of 0, we use icon_id with 0 to denote empty icon_identifier objects