4 * Copyright (c) 2012 Samsung Electronics Co., Ltd. All rights reserved.
6 * Contact: Ja-young Gu <jygu@samsung.com>
8 * Licensed under the Apache License, Version 2.0 (the "License");
9 * you may not use this file except in compliance with the License.
10 * You may obtain a copy of the License at
12 * http://www.apache.org/licenses/LICENSE-2.0
14 * Unless required by applicable law or agreed to in writing, software
15 * distributed under the License is distributed on an "AS IS" BASIS,
16 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
17 * See the License for the specific language governing permissions and
18 * limitations under the License.
30 #include "user_request.h"
31 #include "core_object.h"
35 #define SATK_PROACTIVE_CMD_TAG 0xD0 /*Proactive Command Tag*/
36 #define SATK_MENU_SELECTION_TAG 0xD3 /*Menu Selection Tag*/
37 #define SATK_EVENT_DOWNLOAD_TAG 0xD6 /*Event Download Tag*/
39 /*Tag Values (without Comprehension bit)*/
40 #define SATK_COMMAND_DETAILS_TAG 0x01 /* COMMAND DETAILS TAG */
41 #define SATK_DEVICE_IDENTITY_TAG 0x02 /* DEVICE IDENTITY TAG */
42 #define SATK_RESULT_TAG 0x03 /* RESULT TAG */
43 #define SATK_DURATION_TAG 0x04 /* DURATION TAG */
44 #define SATK_ALPHA_IDENTIFIER_TAG 0x05 /* ALPHA IDENTIFIER TAG */
45 #define SATK_ADDRESS_TAG 0x06 /* ADDRESS TAG */
46 #define SATK_CAPABILITY_CONFIGURATION_PARAMETERS_TAG 0x07 /* CAPABILITY CONFIGURATION PARAMETERS TAG */
47 #define SATK_SUB_ADDRESS_TAG 0x08 /* SUB ADDRESS TAG */
48 #define SATK_SS_STRING_TAG 0x09 /* SS STRING TAG */
49 #define SATK_USSD_STRING_TAG 0x0A /* USSD STRING TAG */
50 #define SATK_SMS_TPDU_TAG 0x0B /* SMS TPDU TAG */
51 #define SATK_CELL_BROADCAST_PAGE_TAG 0x0C /* CELL BROADCAST PAGE TAG */
52 #define SATK_TEXT_STRING_TAG 0x0D /* TEXT STRING TAG */
53 #define SATK_TONE_TAG 0x0E /* TONE TAG */
54 #define SATK_ITEM_TAG 0x0F /* ITEM TAG */
55 #define SATK_ITEM_IDENTIFIER_TAG 0x10 /* ITEM IDENTIFIER TAG */
56 #define SATK_RESPONSE_LENGTH_TAG 0x11 /* RESPONSE LENGTH TAG */
57 #define SATK_FILE_LIST_TAG 0x12 /* FILE LIST TAG */
58 #define SATK_LOCATION_INFORMATION_TAG 0x13 /* LOCATION INFORMATION TAG */
59 #define SATK_IMEI_TAG 0x14 /* IMEI TAG */
60 #define SATK_HELP_REQUEST_TAG 0x15 /* HELP REQUEST TAG */
61 #define SATK_NETWORK_MEASUREMENT_RESULTS_TAG 0x16 /* NETWORK MEASUREMENT RESULTS TAG */
62 #define SATK_DEFAULT_TEXT_TAG 0x17 /* DEFAULT TEXT TAG */
63 #define SATK_ITEMS_NEXT_ACTION_INDICATOR_TAG 0x18 /* ITEMS NEXT ACTION INDICATOR TAG */
64 #define SATK_EVENT_LIST_TAG 0x19 /* EVENT LIST TAG */
65 #define SATK_CAUSE_TAG 0x1A /* CAUSE TAG */
66 #define SATK_LOCATION_STATUS_TAG 0x1B /* LOCATION STATUS TAG */
67 #define SATK_BCCH_CHANNEL_LIST_TAG 0x1D /* BCCH CHANNEL LIST TAG */
68 #define SATK_ICON_IDENTIFIER_TAG 0x1E /* ICON IDENTIFIER TAG */
69 #define SATK_ITEM_ICON_IDENTIFIER_LIST_TAG 0x1F /* ITEM ICON IDENTIFIER LIST TAG */
70 #define SATK_DATE_TIME_AND_TIME_ZONE_TAG 0x26 /* DATE TIME AND TIME ZONE TAG */
71 #define SATK_CALL_CONTROL_REQUESTED_ACTION_TAG 0x27 /* CALL CONTROL REQUESTED ACTION TAG */
72 #define SATK_AT_COMMAND_TAG 0x28 /* AT COMMAND TAG */
73 #define SATK_AT_RESPONSE_TAG 0x29 /* AT RESPONSE TAG */
74 #define SATK_BC_REPEAT_INDICATOR_TAG 0x2A /* BC REPEAT INDICATOR TAG */
75 #define SATK_IMMEDIATE_RESPONSE_TAG 0x2B /* IMMEDIATE RESPONSE TAG */
76 #define SATK_DTMF_STRING_TAG 0x2C /* DTMF STRING TAG */
77 #define SATK_LANGUAGE_TAG 0x2D /* LANGUAGE TAG */
78 #define SATK_BROWSER_IDENTITY_TAG 0x30 /* BROWSER IDENTITY TAG */
79 #define SATK_URL_TAG 0x31 /* URL TAG */
80 #define SATK_BEARER_TAG 0x32 /* BEARER TAG */
81 #define SATK_PROVISIONING_REF_FILE_TAG 0x33 /* PROVISIONING REFERENCE FILE TAG */
82 #define SATK_BROWSER_TERMINATION_CAUSE_TAG 0x34 /* BROWSER TERMINATION CAUSE TAG */
83 #define SATK_BEARER_DISCRIPTION_TAG 0x35 /* BEARER DISCRIPTION TAG */
84 #define SATK_CHANNEL_DATA_TAG 0x36 /* CHANNEL DATA TAG */
85 #define SATK_CHANNEL_DATA_LEN_TAG 0x37 /* CHANNEL DATA LEN TAG */
86 #define SATK_CHANNEL_STATUS_TAG 0x38 /* CHANNEL STATUS TAG */
87 #define SATK_BUFFER_SIZE_TAG 0x39 /* BUFFER SIZE TAG */
88 #define SATK_CARD_READER_IDENTIFIER_TAG 0x3A /* CARD READER IDENTIFIER TAG */
89 #define SATK_USIM_ME_INTERFACE_TRANSPORT_LEVEL_TAG 0x3C /* USIM ME INTERFACE TRANSPORT LEVEL */
90 #define SATK_OTHER_ADDRESS_TAG 0x3E /* OTHER ADDRESS */
91 #define SATK_NETWORK_ACCESS_TAG 0x47 /* NETWORK ACCESS NAME TAG */
92 #define SATK_CDMA_SMS_TPDU_TAG 0x48 /* CDMA SMS TPDU TAG */
93 #define SATK_REMOTE_ENTITY_ADDRESS_TAG 0x49 /* REMOTE ENTITY ADDRESS TAG */
94 #define SATK_TEXT_ATTRIBUTE_TAG 0x50 /* TEXT ATTRIBUTE TAG */
95 #define SATK_TEXT_ATTRIBUTE_LIST_TAG 0x51 /* TEXT ATTRIBUTE LIST TAG */
97 /* general data object lengths */
98 #define SATK_DCS_LENGTH 0x01
99 #define SATK_COMMAND_DETAILS_LENGTH 0x03 /* COMMAND DETAILS LENGTH */
100 #define SATK_DEVICE_IDENTITY_LENGTH 0x02 /* DEVICE IDENTITY LENGTH */
101 #define SATK_ICON_IDENTITY_LENGTH 0x02 /* ICON IDENTITY LENGTH */
102 #define SATK_DURATION_LENGTH 0x02 /* DURATION LENGTH */
103 #define SATK_ITEM_IDENTIFIER_LENGTH 0x01 /* ITEM IDENTIFIER LENGTH */
104 #define SATK_LOCATION_INFORMATION_LENGTH 0x07 /* LOCATION INFORMATION LENGTH */
105 #define SATK_HELP_REQUEST_LENGTH 0x00 /* HELP REQUEST LENGTH */
106 #define SATK_LOCATION_STATUS_LENGTH 0x01 /* LOCATION STATUS LENGTH */
107 #define SATK_DATE_TIME_AND_TIME_ZONE_LENGTH 0x07 /* DATE TIME AND TIME ZONE LENGTH */
108 #define SATK_LANGUAGE_LENGTH 0x02 /* LANGUAGE LENGTH */
109 #define SATK_BC_REPEAT_IND_LENGTH 0x01 /* BC REPEAT INDICATION LENGTH */
110 #define SATK_RESPONSE_LENGTH_LENGTH 0x02 /* RESPONSE LENGTH LENGTH */
111 #define SATK_TONE_LENGTH 0x01 /* TONE LENGTH */
112 #define SATK_BROWSER_ID_LENGTH 0x01 /* BROWSER ID LENGTH */
113 #define SATK_BROWSER_TERMINATION_CAUSE_LENGTH 0x01 /* BROWSER TERMINATION CAUSE LENGTH */
114 #define SATK_BUFFER_SIZE_LENGTH 0x02 /* BUFFER SIZE LENGTH */
115 #define SATK_UICC_ME_TRANS_INTERFACE_LEVEL_LENGTH 0x03 /* UICC TERMINAL TRANSPORT INTERFACE LEVEL LENGTH */
116 #define SATK_CHANNEL_DATA_LENGTH_VALUE_LENGTH 0x01 /* CHANNEL DATA LENGTH VALUE LENGTH */
117 #define SATK_CHANNEL_STATUS_LENGTH 0x02 /* CHANNEL STATUS LENGTH */
119 struct private_object_data {
120 struct tcore_sat_operations *ops;
123 gboolean b_comprehensive = FALSE;
125 static TReturn _dispatcher(CoreObject *o, UserRequest *ur)
127 enum tcore_request_command command;
128 struct private_object_data *po = NULL;
130 CORE_OBJECT_CHECK_RETURN(o, CORE_OBJECT_TYPE_SAT, TCORE_RETURN_EINVAL);
132 po = tcore_object_ref_object(o);
134 return TCORE_RETURN_ENOSYS;
136 command = tcore_user_request_get_command(ur);
138 case TREQ_SAT_REQ_ENVELOPE:
139 if (!po->ops->envelope)
140 return TCORE_RETURN_ENOSYS;
142 return po->ops->envelope(o, ur);
145 case TREQ_SAT_REQ_TERMINALRESPONSE:
146 if (!po->ops->terminal_response)
147 return TCORE_RETURN_ENOSYS;
149 return po->ops->terminal_response(o, ur);
152 case TREQ_SAT_REQ_USERCONFIRMATION:
153 if (!po->ops->user_confirmation)
154 return TCORE_RETURN_ENOSYS;
156 return po->ops->user_confirmation(o, ur);
163 return TCORE_RETURN_SUCCESS;
166 static void _clone_hook(CoreObject *src, CoreObject *dest)
168 struct private_object_data *src_po = NULL;
169 struct private_object_data *dest_po = NULL;
174 dest_po = calloc(1, sizeof(struct private_object_data));
176 tcore_object_link_object(dest, NULL);
180 src_po = tcore_object_ref_object(src);
181 dest_po->ops = src_po->ops;
183 tcore_object_link_object(dest, dest_po);
186 static void _free_hook(CoreObject *o)
188 struct private_object_data *po = NULL;
190 CORE_OBJECT_CHECK(o, CORE_OBJECT_TYPE_SAT);
192 po = tcore_object_ref_object(o);
195 tcore_object_link_object(o, NULL);
199 static gboolean _check_file_for_refresh(enum tel_sim_file_id file_id)
202 enum tel_sim_file_id ef_under_mf[3] = { SIM_EF_DIR, SIM_EF_ELP, SIM_EF_ICCID };
203 enum tel_sim_file_id ef_under_df[29] = {
204 SIM_EF_IMSI, SIM_EF_SST,
205 SIM_EF_EST, SIM_EF_OPLMN_ACT,
206 SIM_EF_GID1, SIM_EF_GID2,
207 SIM_EF_LP, SIM_EF_ECC,
208 SIM_EF_SPN, SIM_EF_SPDI,
209 SIM_EF_PNN, SIM_EF_OPL,
210 SIM_EF_MBDN, SIM_EF_MSISDN,
211 SIM_EF_USIM_MBI, SIM_EF_USIM_MWIS,
212 SIM_EF_USIM_CFIS, SIM_EF_CPHS_VOICE_MSG_WAITING,
213 SIM_EF_CPHS_SERVICE_STRING_TABLE, SIM_EF_CPHS_CALL_FORWARD_FLAGS,
214 SIM_EF_CPHS_OPERATOR_NAME_STRING, SIM_EF_CPHS_CUSTOMER_SERVICE_PROFILE,
215 SIM_EF_CPHS_CPHS_INFO, SIM_EF_CPHS_MAILBOX_NUMBERS,
216 SIM_EF_CPHS_OPERATOR_NAME_SHORT_FORM_STRING, SIM_EF_CPHS_INFORMATION_NUMBERS,
217 SIM_EF_CPHS_DYNAMICFLAGS, SIM_EF_CPHS_DYNAMIC2FLAG,
218 SIM_EF_CPHS_CUSTOMER_SERVICE_PROFILE_LINE2 };
220 dbg("[SAT] SAT PARSER - FILE ID=0x%04x", (unsigned int)file_id);
222 if( (file_id & 0x2F00) == 0x2F00 )
224 dbg("[SAT] SAT PARSER - MF, EF=0x%04x",file_id);
226 if(file_id == ef_under_mf[i]){
227 dbg("[SAT] SAT PARSER - MATCH!");
232 else if( (file_id & 0x6F00) == 0x6F00)
234 dbg("[SAT] SAT PARSER - ADF_USIM EF=0x%04x",file_id);
236 if(file_id == ef_under_df[i]){
237 dbg("[SAT] SAT PARSER - MATCH!");
245 static int _get_length_filed_size(unsigned char firstLenByte)
247 if (firstLenByte <= 0x7F) return 1;
248 else if (firstLenByte == 0x81) return 2;
249 else return 0; //return zero, as the length field can only be 1 or 2.
252 static void _get_string_data(unsigned char* src, int len,
253 struct tel_sat_text_string_object *text_obj)
255 if (!src || !text_obj) return;
257 switch (text_obj->dcs.a_format) {
258 case ALPHABET_FORMAT_SMS_DEFAULT: {
261 text_obj->string_length = 0;
262 unpacked_str = (char *)tcore_util_unpack_gsm7bit(src, (unsigned int)len);
263 if (!unpacked_str) return;
265 text_obj->dcs.a_format = ALPHABET_FORMAT_8BIT_DATA;
266 text_obj->string_length = strlen(unpacked_str);
268 if (text_obj->string_length >= SAT_TEXT_STRING_LEN_MAX) {
269 text_obj->string_length = SAT_TEXT_STRING_LEN_MAX;
270 memcpy(text_obj->string, unpacked_str, SAT_TEXT_STRING_LEN_MAX);
271 text_obj->string[SAT_TEXT_STRING_LEN_MAX] = 0x00;
274 memcpy(text_obj->string, unpacked_str, text_obj->string_length);
275 text_obj->string[text_obj->string_length] = 0x00;
278 g_free(unpacked_str);
280 case ALPHABET_FORMAT_UCS2:
281 case ALPHABET_FORMAT_8BIT_DATA: {
282 text_obj->string_length = len;
283 if (text_obj->string_length >= SAT_TEXT_STRING_LEN_MAX) {
284 text_obj->string_length = SAT_TEXT_STRING_LEN_MAX;
285 memcpy(text_obj->string, src, SAT_TEXT_STRING_LEN_MAX);
286 text_obj->string[SAT_TEXT_STRING_LEN_MAX] = 0x00;
289 memcpy(text_obj->string, src, text_obj->string_length);
290 text_obj->string[text_obj->string_length+1] = 0x00;
294 dbg("[SAT] SAT PARSER - Unknown alphabet format(%d)", text_obj->dcs.a_format);
301 static void _sat_decode_dcs(unsigned char dcs, struct data_coding_scheme* dsc_obj)
303 dbg("[SAT] SAT PARSER - dcs=[0x%x]", dcs);
304 dsc_obj->raw_dcs = dcs;
305 //bit 5 of DCS byte will tell us if the text is compressed or not.
308 dsc_obj->is_compressed_format = TRUE;
310 dsc_obj->is_compressed_format = FALSE;
312 //bit 4 when set, indicates that bits 0 & 1 have message class meaning.
313 dsc_obj->m_class = MSG_CLASS_NONE;
315 switch (dcs & 0x03) {
317 dsc_obj->m_class = MSG_CLASS_0;
320 dsc_obj->m_class = MSG_CLASS_1;
323 dsc_obj->m_class = MSG_CLASS_2;
326 dsc_obj->m_class = MSG_CLASS_3;
329 err("invalid dcs type");
334 /*bits 2 & 3 indicate the character set being used*/
335 switch (dcs & 0x0C) {
338 dsc_obj->a_format = ALPHABET_FORMAT_SMS_DEFAULT;
342 dsc_obj->a_format = ALPHABET_FORMAT_8BIT_DATA;
346 dsc_obj->a_format = ALPHABET_FORMAT_UCS2;
350 dsc_obj->a_format = ALPHABET_FORMAT_RESERVED;
354 dbg("[SAT] SAT PARSER - is_compressed_format(%d), msgClass(0x%x), alpha_format(0x%x)",
355 dsc_obj->is_compressed_format, dsc_obj->m_class, dsc_obj->a_format);
360 static void _sat_decode_ton_npi(unsigned char ton_npi, enum type_of_number *ton, enum numbering_plan_identifier *npi)
368 ton_value = (ton_npi & 0x70) >> 4;
370 if(*ton > TON_NETWORK_SPECIFIC)
371 *ton = TON_RESERVED_FOR_EXT;
373 npi_value = (ton_npi & 0x0F);
376 case NPI_DATA_NUMBERING_PLAN:
379 case NPI_RESERVED_FOR_EXT:
387 dbg("[SAT] SAT PATSER - ton(0x%x) npi(0x%x)", *ton, *npi);
391 static enum tel_sim_language_type _sat_decode_language(unsigned char byte1, unsigned char byte2)
393 if((byte1 == 'e')&&(byte2 == 'n')){
394 return SIM_LANG_ENGLISH;
395 } else if((byte1 == 'd')&&(byte2 == 'e')){
396 return SIM_LANG_GERMAN;
397 } else if((byte1 == 'i')&&(byte2 == 't')){
398 return SIM_LANG_ITALIAN;
399 } else if((byte1 == 'f')&&(byte2 == 'r')){
400 return SIM_LANG_FRENCH;
401 } else if((byte1 == 'e')&&(byte2 == 's')){
402 return SIM_LANG_SPANISH;
403 } else if((byte1 == 'n')&&(byte2 == 'l')){
404 return SIM_LANG_DUTCH;
405 } else if((byte1 == 's')&&(byte2 == 'v')){
406 return SIM_LANG_SWEDISH;
407 } else if((byte1 == 'd')&&(byte2 == 'a')){
408 return SIM_LANG_DANISH;
409 } else if((byte1 == 'p')&&(byte2 == 't')){
410 return SIM_LANG_PORTUGUESE;
411 } else if((byte1 == 'f')&&(byte2 == 'i')){
412 return SIM_LANG_FINNISH;
413 } else if((byte1 == 'n')&&(byte2 == 'o')){
414 return SIM_LANG_NORWEGIAN;
415 } else if((byte1 == 'e')&&(byte2 == 'l')){
416 return SIM_LANG_GREEK;
417 } else if((byte1 == 't')&&(byte2 == 'r')){
418 return SIM_LANG_TURKISH;
419 } else if((byte1 == 'h')&&(byte2 == 'u')){
420 return SIM_LANG_HUNGARIAN;
421 } else if((byte1 == 'p')&&(byte2 == 'i')){
422 return SIM_LANG_POLISH;
424 dbg("[SAT] SAT PARSER - unknown language, default to english.");
425 return SIM_LANG_ENGLISH;
430 * Decode TLV data object
432 static enum tcore_sat_result _sat_decode_address_tlv(unsigned char* tlv_str, int tlv_len,
433 int curr_offset, struct tel_sat_address* address_obj, int* consumed_data_len)
435 unsigned char* src_data;
436 int temp_index, len_of_len = 0;
438 gboolean comprehensive_req = FALSE;
440 if (tlv_str == NULL || consumed_data_len == NULL || address_obj == NULL) {
441 dbg("[SAT] SAT PARSER - tlv_str == NULL || consumed_data_len == NULL || address_obj == NULL");
442 return TCORE_SAT_ERROR_FATAL;
445 if (tlv_len <= (curr_offset + 1)) {
446 dbg("[SAT] SAT PARSER - incorrect length original_command_len=%d", tlv_len);
447 return TCORE_SAT_COMMAND_NOT_UNDERSTOOD;
451 temp_index = curr_offset;
452 src_data = &tlv_str[0];
453 if ((src_data[temp_index] & 0x7F) != SATK_ADDRESS_TAG) {
454 dbg("[SAT] SAT PARSER - address TAG missing");
455 return TCORE_SAT_REQUIRED_VALUE_MISSING;
458 //comprehensive required
459 if((src_data[temp_index++] & 0x80))
460 comprehensive_req = TRUE;
463 len_of_len = _get_length_filed_size(src_data[temp_index]);
465 dbg("[SAT] SAT PARSER - incorrect length");
466 return TCORE_SAT_COMMAND_NOT_UNDERSTOOD;
468 address_len = src_data[temp_index + len_of_len - 1];
470 //check the address length
471 temp_index += len_of_len;
472 if ((temp_index + address_len) > tlv_len) {
473 dbg("[SAT] SAT PARSER - incorrect length");
474 return TCORE_SAT_COMMAND_NOT_UNDERSTOOD;
477 address_obj->dialing_number_len = 0;
479 char* str_ascii = NULL;
480 _sat_decode_ton_npi(src_data[temp_index++], &address_obj->ton, &address_obj->npi);
481 str_ascii = tcore_util_convert_bcd2ascii((const char*)&src_data[temp_index], address_len-1, SAT_DIALING_NUMBER_LEN_MAX);
483 memcpy(address_obj->dialing_number, str_ascii, strlen(str_ascii));
484 address_obj->dialing_number_len = strlen(str_ascii);
489 if(address_obj->dialing_number_len == 0){
490 if(comprehensive_req){
491 err("[SAT] SAT PARSER - incorrect address");
492 return TCORE_SAT_REQUIRED_VALUE_MISSING;
494 dbg("comprehensive partial proactive command");
495 //global variable (comprehensive_partial= TRUE)
498 *consumed_data_len = 1 + len_of_len + address_len;
499 return TCORE_SAT_SUCCESS;
502 static enum tcore_sat_result _sat_decode_subaddress_tlv(unsigned char* tlv_str, int tlv_len,
503 int curr_offset, struct tel_sat_subaddress* sub_address_obj, int* consumed_data_len)
505 unsigned char* src_data;
506 int temp_index, len_of_len = 0;
507 int sub_address_len = 0;
508 gboolean comprehensive_req = FALSE;
510 if (tlv_str == NULL || consumed_data_len == NULL || sub_address_obj == NULL) {
511 dbg("[SAT] SAT PARSER - tlv_str == NULL || consumed_data_len == NULL || sub_address_obj == NULL");
512 return TCORE_SAT_ERROR_FATAL;
515 if (tlv_len <= (curr_offset + 1)) {
516 dbg("[SAT] SAT PARSER - incorrect length original_command_len=%d", tlv_len);
517 return TCORE_SAT_COMMAND_NOT_UNDERSTOOD;
521 temp_index = curr_offset;
522 src_data = &tlv_str[0];
523 if ((src_data[temp_index] & 0x7F) != SATK_SUB_ADDRESS_TAG) {
524 dbg("[SAT] SAT PARSER - sub address TAG missing");
525 return TCORE_SAT_REQUIRED_VALUE_MISSING;
528 //comprehensive required
529 if((src_data[temp_index++] & 0x80))
530 comprehensive_req = TRUE;
533 len_of_len = _get_length_filed_size(src_data[temp_index]);
535 dbg("[SAT] SAT PARSER - incorrect length");
536 return TCORE_SAT_COMMAND_NOT_UNDERSTOOD;
538 sub_address_len = src_data[temp_index + len_of_len - 1];
540 //check the address length
541 temp_index += len_of_len;
542 if ((temp_index + sub_address_len) > tlv_len) {
543 dbg("[SAT] SAT PARSER - incorrect length");
544 return TCORE_SAT_COMMAND_NOT_UNDERSTOOD;
548 if(sub_address_len <= 0){
549 dbg("[SAT] SAT PARSER - no sub address data");
550 return TCORE_SAT_COMMAND_NOT_UNDERSTOOD;
553 sub_address_obj->subaddress_len = sub_address_len;
554 if( sub_address_obj->subaddress_len > SAT_CCP_DATA_LEN_MAX){
555 if(comprehensive_req){
556 dbg("[SAT] SAT PARSER - sub address is too big");
557 return TCORE_SAT_COMMAND_NOT_UNDERSTOOD;
560 //bIsComprehensionPartial = TRUE;
561 sub_address_obj->subaddress_len = 0;
565 memcpy(sub_address_obj->subaddress, &src_data[temp_index], sub_address_obj->subaddress_len);
568 *consumed_data_len = 1 + len_of_len + sub_address_len;
569 return TCORE_SAT_SUCCESS;
572 static enum tcore_sat_result _sat_decode_alpha_identifier_tlv(unsigned char* tlv_str, int tlv_len,
573 int curr_offset, struct tel_sat_alpha_identifier* alpha_id_obj, int* consumed_data_len)
575 unsigned char* src_data;
576 int temp_index, len_of_len = 0;
579 if (tlv_str == NULL || consumed_data_len == NULL || alpha_id_obj == NULL) {
580 dbg("[SAT] SAT PARSER - tlv_str == NULL || consumed_data_len == NULL || alpha_id_obj == NULL");
581 return TCORE_SAT_ERROR_FATAL;
584 if (tlv_len <= (curr_offset + 1)) {
585 dbg("[SAT] SAT PARSER - incorrect length original_command_len=%d", tlv_len);
586 return TCORE_SAT_COMMAND_NOT_UNDERSTOOD;
590 temp_index = curr_offset;
591 src_data = &tlv_str[0];
592 if ((src_data[temp_index++] & 0x7F) != SATK_ALPHA_IDENTIFIER_TAG) {
593 dbg("[SAT] SAT PARSER - alphaID TAG missing");
594 return TCORE_SAT_COMMAND_NOT_UNDERSTOOD;
598 alpha_id_obj->is_exist = TRUE;
599 len_of_len = _get_length_filed_size(src_data[temp_index]);
601 dbg("[SAT] SAT PARSER - incorrect length");
602 return TCORE_SAT_COMMAND_NOT_UNDERSTOOD;
604 alpha_len = alpha_id_obj->alpha_data_len = src_data[temp_index + len_of_len - 1];
607 temp_index += len_of_len;
608 if ((temp_index + alpha_len) > tlv_len) {
609 dbg("[SAT] SAT PARSER - incorrect length");
610 return TCORE_SAT_COMMAND_NOT_UNDERSTOOD;
613 if (alpha_id_obj->alpha_data_len > 0) {
617 if (alpha_id_obj->alpha_data_len >= SAT_ALPHA_ID_LEN_MAX)
618 alpha_id_obj->alpha_data_len = SAT_ALPHA_ID_LEN_MAX - 1;
620 memcpy(alpha_id_obj->alpha_data, &src_data[temp_index], alpha_id_obj->alpha_data_len);
621 alpha_id_obj->alpha_data[alpha_id_obj->alpha_data_len] = 0x00;
623 if (src_data[temp_index] == 0x80 || src_data[temp_index] == 0x81 || src_data[temp_index] == 0x82)
628 _sat_decode_dcs(dcs, &alpha_id_obj->dcs);
631 *consumed_data_len = 1 + len_of_len + alpha_len;
632 dbg("[SAT] SAT PARSER alphaId= %s", alpha_id_obj->alpha_data);
633 return TCORE_SAT_SUCCESS;
636 static enum tcore_sat_result _sat_decode_sub_address_tlv(unsigned char* tlv_str, int tlv_len,
637 int curr_offset, struct tel_sat_subaddress* sub_address_obj, int* consumed_data_len)
640 int temp_index, len_of_len = 0;
641 int sub_address_len = 0;
642 unsigned char* src_data;
643 gboolean comprehension_req = FALSE;
645 if (tlv_str == NULL || consumed_data_len == NULL || sub_address_obj == NULL) {
646 dbg("[SAT] SAT PARSER - tlv_str == NULL || consumed_data_len == NULL || sub_address_obj == NULL");
647 return TCORE_SAT_ERROR_FATAL;
650 if (tlv_len <= (curr_offset + 1)) {
651 dbg("[SAT] SAT PARSER - incorrect length original_command_len=%d", tlv_len);
652 return TCORE_SAT_COMMAND_NOT_UNDERSTOOD;
656 temp_index = curr_offset;
657 src_data = &tlv_str[0];
658 if ((src_data[temp_index] & 0x7F) != SATK_SUB_ADDRESS_TAG) {
659 dbg("[SAT] SAT PARSER - address TAG missing");
660 return TCORE_SAT_REQUIRED_VALUE_MISSING;
663 //comprehensive required
664 if((src_data[temp_index++] & 0x80))
665 comprehension_req = TRUE;
668 len_of_len = _get_length_filed_size(src_data[temp_index]);
670 dbg("[SAT] SAT PARSER - incorrect length");
671 return TCORE_SAT_COMMAND_NOT_UNDERSTOOD;
673 sub_address_len = src_data[temp_index + len_of_len - 1];
675 //check the address length
676 temp_index += len_of_len;
677 if ((temp_index + sub_address_len) > tlv_len) {
678 dbg("[SAT] SAT PARSER - incorrect length");
679 return TCORE_SAT_COMMAND_NOT_UNDERSTOOD;
682 if(sub_address_len <= 0){
683 dbg("[SAT] SAT PARSER - no sub address");
684 return TCORE_SAT_COMMAND_NOT_UNDERSTOOD;
687 sub_address_obj->subaddress_len = sub_address_len;
688 if(sub_address_obj->subaddress_len > SAT_SUB_ADDR_LEN_MAX){
689 if(comprehension_req)
690 return TCORE_SAT_COMMAND_NOT_UNDERSTOOD;
692 sub_address_obj->subaddress_len = 0;
695 memcpy(sub_address_obj->subaddress, &src_data[temp_index],sub_address_obj->subaddress_len);
698 dbg("[SAT] SAT PARSER - subAddressLen=%d",sub_address_obj->subaddress_len);
699 for(i=0;i<sub_address_obj->subaddress_len;i++)
700 dbg("[SAT] SAT PARSER - 0x%02x\t",sub_address_obj->subaddress[i]);
702 *consumed_data_len = 1+len_of_len+sub_address_len;
703 return TCORE_SAT_SUCCESS;
706 static enum tcore_sat_result _sat_decode_ccp_tlv(unsigned char* tlv_str, int tlv_len,
707 int curr_offset, struct tel_sat_ccp* ccp_obj, int* consumed_data_len)
710 int temp_index, len_of_len = 0;
712 unsigned char* src_data;
713 gboolean comprehension_req = FALSE;
715 if (tlv_str == NULL || consumed_data_len == NULL || ccp_obj == NULL) {
716 dbg("[SAT] SAT PARSER - tlv_str == NULL || consumed_data_len == NULL || ccp_obj == NULL");
717 return TCORE_SAT_ERROR_FATAL;
720 if (tlv_len <= (curr_offset + 1)) {
721 dbg("[SAT] SAT PARSER - incorrect length original_command_len=%d", tlv_len);
722 return TCORE_SAT_COMMAND_NOT_UNDERSTOOD;
726 temp_index = curr_offset;
727 src_data = &tlv_str[0];
728 if ((src_data[temp_index] & 0x7F) != SATK_CAPABILITY_CONFIGURATION_PARAMETERS_TAG) {
729 dbg("[SAT] SAT PARSER - CCP TAG missing");
730 return TCORE_SAT_REQUIRED_VALUE_MISSING;
733 //comprehensive required
734 if((src_data[temp_index++] & 0x80))
735 comprehension_req = TRUE;
738 len_of_len = _get_length_filed_size(src_data[temp_index]);
740 dbg("[SAT] SAT PARSER - incorrect length");
741 return TCORE_SAT_COMMAND_NOT_UNDERSTOOD;
743 ccp_len = src_data[temp_index + len_of_len - 1];
745 //check the address length
746 temp_index += len_of_len;
747 if ((temp_index + ccp_len) > tlv_len) {
748 dbg("[SAT] SAT PARSER - incorrect length");
749 return TCORE_SAT_COMMAND_NOT_UNDERSTOOD;
753 dbg("[SAT] SAT PARSER - no ccp data");
754 return TCORE_SAT_COMMAND_NOT_UNDERSTOOD;
757 ccp_obj->data_len = ccp_len;
758 if(ccp_obj->data_len > SAT_CCP_DATA_LEN_MAX){
759 if(comprehension_req)
760 return TCORE_SAT_COMMAND_NOT_UNDERSTOOD;
762 ccp_obj->data_len = 0;
765 memcpy(ccp_obj->data, &src_data[temp_index],ccp_obj->data_len);
768 dbg("[SAT] SAT PARSER - ccp len=%d",ccp_obj->data_len);
769 for(i=0;i<ccp_obj->data_len;i++)
770 dbg("[SAT] SAT PARSER - 0x%02x\t",ccp_obj->data[i]);
772 *consumed_data_len = 1+len_of_len+ccp_len;
773 return TCORE_SAT_SUCCESS;
776 static enum tcore_sat_result _sat_decode_device_identities_tlv(unsigned char* tlv_str,
777 struct tel_sat_device_identities* dev_id_obj)
779 int temp_index = 0, i;
781 if (tlv_str == NULL || dev_id_obj == NULL) {
782 dbg("[SAT] SAT PARSER - tlv_str ==NULL || dev_id_obj == NULL");
783 return TCORE_SAT_ERROR_FATAL;
786 if ((tlv_str[temp_index++] & 0x7F) != SATK_DEVICE_IDENTITY_TAG) {
787 dbg("[SAT] SAT PARSER - device identity tag missing.");
788 return TCORE_SAT_REQUIRED_VALUE_MISSING; //send TR
791 if (tlv_str[temp_index++] != SATK_DEVICE_IDENTITY_LENGTH) {
792 dbg("[SAT] SAT PARSER - device identity length incorrect.");
793 return TCORE_SAT_REQUIRED_VALUE_MISSING; //send TR
796 for (i = 0; i < 2; i++) {
797 switch (tlv_str[temp_index]) {
798 case DEVICE_ID_KEYPAD:
799 case DEVICE_ID_DISPLAY:
800 case DEVICE_ID_EARPIECE:
803 case DEVICE_ID_NETWORK:
804 if (i == 0) dev_id_obj->src = tlv_str[temp_index];
805 if (i == 1) dev_id_obj->dest = tlv_str[temp_index];
808 if(tlv_str[temp_index] >= 0x21 && tlv_str[temp_index] <= 0x27){
809 dbg("BIP channel id(0x%x)", tlv_str[temp_index])
810 if (i == 0) dev_id_obj->src = tlv_str[temp_index];
811 if (i == 1) dev_id_obj->dest = tlv_str[temp_index];
814 dbg("unmatched device id");
815 return TCORE_SAT_REQUIRED_VALUE_MISSING;
822 dbg("[SAT] SAT PARSER - source=%d, dest=%d", dev_id_obj->src, dev_id_obj->dest);
823 return TCORE_SAT_SUCCESS;
826 static enum tcore_sat_result _sat_decode_duration_tlv(unsigned char* tlv_str, int tlv_len,
827 int curr_offset, struct tel_sat_duration *duration_obj, int* consumed_data_len)
830 unsigned char* src_data = NULL;
832 if (!tlv_str || !duration_obj || !consumed_data_len) {
833 err("[SAT] SAT PARSER data is null");
834 return TCORE_SAT_ERROR_FATAL;
837 if (tlv_len < curr_offset + 3) {
838 err("[SAT] SAT PARSER - incorrect length original_command_len=%d", tlv_len);
839 return TCORE_SAT_COMMAND_NOT_UNDERSTOOD;
842 temp_index = curr_offset;
843 src_data = &tlv_str[0];
844 if ((src_data[temp_index++] & 0x7F) != SATK_DURATION_TAG) {
845 err("[SAT] SAT PARSER - duration tag missing.");
846 return TCORE_SAT_COMMAND_NOT_UNDERSTOOD; //send TR
849 if (src_data[temp_index++] != SATK_DURATION_LENGTH) {
850 err("[SAT] SAT PARSER - incorrect length value.");
851 return TCORE_SAT_COMMAND_NOT_UNDERSTOOD; //send TR
855 switch (src_data[temp_index]) {
856 case TIME_UNIT_MINUTES:
857 case TIME_UNIT_SECONDS:
858 case TIME_UNIT_TENTHS_OF_SECONDS:
859 duration_obj->time_unit = src_data[temp_index];
862 duration_obj->time_unit = TIME_UNIT_RESERVED;
868 duration_obj->time_interval = src_data[temp_index];
869 *consumed_data_len = 4;
871 dbg("[SAT] SAT PARSER - timeUnit=%d, interval=%d", duration_obj->time_unit, duration_obj->time_interval);
873 return TCORE_SAT_SUCCESS;
876 static enum tcore_sat_result _sat_decode_item_tlv(unsigned char* tlv_str, int tlv_len,
877 int curr_offset, struct tel_sat_item_info* item_obj, int* consumed_data_len)
879 int temp_index, len_of_len=0, i=0;
882 unsigned char* src_data = NULL;
884 if(tlv_str == NULL || consumed_data_len == NULL || item_obj == NULL) {
885 dbg("[SAT] SAT PARSER - tlv_str == NULL || consumed_data_len == NULL || item_obj == NULL");
886 return TCORE_SAT_ERROR_FATAL;
889 if(tlv_len <= (curr_offset+1)) {
890 dbg("[SAT] SAT PARSER - incorrect length original_command_len=%d", tlv_len);
891 return TCORE_SAT_COMMAND_NOT_UNDERSTOOD;
895 temp_index = curr_offset;
896 src_data = &tlv_str[0];
897 if((src_data[temp_index++]&0x7F) != SATK_ITEM_TAG){
898 dbg("[SAT] SAT PARSER - tag not found.=%d",src_data[temp_index-1]);
899 return TCORE_SAT_COMMAND_NOT_UNDERSTOOD;
903 len_of_len = _get_length_filed_size(src_data[temp_index]);
905 dbg("[SAT] SAT PARSER - incorrect length");
906 return TCORE_SAT_COMMAND_NOT_UNDERSTOOD;
908 item_len = src_data[temp_index+len_of_len-1];
910 temp_index+=len_of_len; //temp_index pointing to item.
911 if((temp_index+item_len) > tlv_len){
912 dbg("[SAT] SAT PARSER - incorrect length");
913 return TCORE_SAT_COMMAND_NOT_UNDERSTOOD;
916 memset(item_obj->text, 0x00,(SAT_ITEM_TEXT_LEN_MAX+1));
918 dbg("[SAT] SAT PARSER - menu_text is NULL, remove the menu");
919 *consumed_data_len = 1+len_of_len+item_len;
920 return TCORE_SAT_SUCCESS;
924 item_obj->item_id = src_data[temp_index++];
925 // fix for orange SIM issue
926 // H0100078487 Strange Character display on SIM SAT
927 // The string length was less than its real length
928 // So garbage characters was displayed. To fix it, we would recalculate the real length.
929 for(i=0; i<item_len-1;i++){
930 dbg("[SAT] %d: %c", i, src_data[temp_index+i]);
931 if(src_data[temp_index+i] == 0xFF) break;
933 item_obj->text_len = i;
935 if(item_obj->text_len <= 0){
936 dbg("[SAT] SAT PARSER - text len = 0");
937 return TCORE_SAT_COMMAND_NOT_UNDERSTOOD;
940 if(item_obj->text_len >= SAT_ITEM_TEXT_LEN_MAX)
941 item_obj->text_len = SAT_ITEM_TEXT_LEN_MAX-1;
943 memcpy(item_obj->text, &src_data[temp_index], item_obj->text_len);
944 if (src_data[temp_index] == 0x80 || src_data[temp_index] == 0x81 || src_data[temp_index] == 0x82)
949 _sat_decode_dcs(dcs, &item_obj->dcs);
952 dbg("[SAT] SAT PARSER - item_text=%s", item_obj->text);
953 *consumed_data_len = 1+len_of_len+item_len;
954 return TCORE_SAT_SUCCESS;
957 static enum tcore_sat_result _sat_decode_response_length_tlv(unsigned char* tlv_str, int tlv_len,
958 int curr_offset, struct tel_sat_response_length *response_obj, int* consumed_data_len)
961 unsigned char* src_data = NULL;
963 if (!tlv_str || !response_obj || !consumed_data_len) {
964 err("[SAT] SAT PARSER data is null");
965 return TCORE_SAT_ERROR_FATAL;
968 if (tlv_len <= curr_offset + 1) {
969 err("[SAT] SAT PARSER - incorrect length original_command_len=%d", tlv_len);
970 return TCORE_SAT_COMMAND_NOT_UNDERSTOOD;
973 temp_index = curr_offset;
974 src_data = &tlv_str[0];
975 if ((src_data[temp_index++] & 0x7F) != SATK_RESPONSE_LENGTH_TAG) {
976 err("[SAT] SAT PARSER - response length tag missing.");
977 return TCORE_SAT_COMMAND_NOT_UNDERSTOOD; //send TR
980 if (src_data[temp_index++] != SATK_RESPONSE_LENGTH_LENGTH) {
981 err("[SAT] SAT PARSER - incorrect length value.");
982 return TCORE_SAT_COMMAND_NOT_UNDERSTOOD; //send TR
985 response_obj->min = src_data[temp_index++];
986 response_obj->max = src_data[temp_index++];
987 dbg("[SAT] SAT PARSER min length(%d), max length(%d)", response_obj->min, response_obj->max);
989 *consumed_data_len = 4;
990 if(response_obj->min > response_obj->max){
991 err("[SAT] SAT PARSER - : min length is larger than max length");
992 return TCORE_SAT_COMMAND_NOT_UNDERSTOOD;
995 return TCORE_SAT_SUCCESS;
998 static enum tcore_sat_result _sat_decode_sms_tpdu_tlv(unsigned char* tlv_str, int tlv_len,
999 int curr_offset, struct tel_sat_sms_tpdu *sms_tpdu_obj, int* consumed_data_len)
1001 int temp_index = 0, len_of_len = 0;
1003 unsigned char* src_data = NULL;
1005 if (!tlv_str || !sms_tpdu_obj || !consumed_data_len) {
1006 err("[SAT] SAT PARSER data is null");
1007 return TCORE_SAT_ERROR_FATAL;
1010 if (tlv_len <= curr_offset + 1) {
1011 err("[SAT] SAT PARSER - incorrect length original_command_len=%d", tlv_len);
1012 return TCORE_SAT_COMMAND_NOT_UNDERSTOOD;
1015 temp_index = curr_offset;
1016 src_data = &tlv_str[0];
1017 if ((src_data[temp_index++] & 0x7F) != SATK_SMS_TPDU_TAG) {
1018 err("[SAT] SAT PARSER - sat tpdu tag missing.");
1019 return TCORE_SAT_COMMAND_NOT_UNDERSTOOD;
1023 len_of_len = _get_length_filed_size(src_data[temp_index]);
1025 err("[SAT] parser: invalid length.");
1026 return TCORE_SAT_COMMAND_NOT_UNDERSTOOD;
1028 tpdu_len = src_data[temp_index+len_of_len-1];
1029 temp_index += len_of_len;
1032 return TCORE_SAT_REQUIRED_VALUE_MISSING;
1035 sms_tpdu_obj->data_len = tpdu_len;
1036 if(sms_tpdu_obj->data_len > SAT_SMS_TPDU_SMS_DATA_LEN_MAX){
1037 sms_tpdu_obj->data_len = SAT_SMS_TPDU_SMS_DATA_LEN_MAX;
1041 memcpy(sms_tpdu_obj->data, &src_data[temp_index], sms_tpdu_obj->data_len);
1042 dbg("[SAT] SAT PARSER tpdu_len (%d)", sms_tpdu_obj->data_len);
1044 *consumed_data_len = 1+len_of_len+tpdu_len;
1045 return TCORE_SAT_SUCCESS;
1048 static enum tcore_sat_result _sat_decode_item_identifier_tlv(unsigned char* tlv_str, int tlv_len,
1049 int curr_offset, struct tel_sat_item_identifier *item_identifier_obj, int* consumed_data_len)
1052 unsigned char* src_data = NULL;
1054 if (!tlv_str || !item_identifier_obj || !consumed_data_len) {
1055 err("[SAT] SAT PARSER data is null");
1056 return TCORE_SAT_ERROR_FATAL;
1059 if (tlv_len <= curr_offset + 1) {
1060 err("[SAT] SAT PARSER - incorrect length original_command_len=%d", tlv_len);
1061 return TCORE_SAT_COMMAND_NOT_UNDERSTOOD;
1064 temp_index = curr_offset;
1065 src_data = &tlv_str[0];
1066 if ((src_data[temp_index++] & 0x7F) != SATK_ITEM_IDENTIFIER_TAG) {
1067 err("[SAT] SAT PARSER - Item identifier tag missing.");
1068 return TCORE_SAT_COMMAND_NOT_UNDERSTOOD; //send TR
1071 if (src_data[temp_index++] != SATK_ITEM_IDENTIFIER_LENGTH) {
1072 err("[SAT] SAT PARSER - incorrect length value.");
1073 return TCORE_SAT_COMMAND_NOT_UNDERSTOOD; //send TR
1076 item_identifier_obj->item_identifier = src_data[temp_index++];
1077 *consumed_data_len = 3;
1078 dbg("[SAT] SAT PARSER item identifier(0x%02x)", item_identifier_obj->item_identifier);
1080 return TCORE_SAT_SUCCESS;
1083 static enum tcore_sat_result _sat_decode_ss_string_tlv(unsigned char* tlv_str, int tlv_len,
1084 int curr_offset, struct tel_sat_ss_string *ss_str_obj, int* consumed_data_len)
1086 char* str_ascii = NULL;
1087 int temp_index, len_of_len=0;
1089 unsigned char* src_data;
1090 gboolean comprehension_req = FALSE;
1092 if (!tlv_str || !ss_str_obj || !consumed_data_len) {
1093 err("[SAT] SAT PARSER data is null");
1094 return TCORE_SAT_ERROR_FATAL;
1097 if (tlv_len <= curr_offset + 1) {
1098 err("[SAT] SAT PARSER - incorrect length original_command_len=%d", tlv_len);
1099 return TCORE_SAT_COMMAND_NOT_UNDERSTOOD;
1102 temp_index = curr_offset;
1103 src_data = &tlv_str[0];
1104 if ((src_data[temp_index] & 0x7F) != SATK_SS_STRING_TAG) {
1105 err("[SAT] SAT PARSER - SS string tag missing.");
1106 return TCORE_SAT_COMMAND_NOT_UNDERSTOOD; //send TR
1109 if(src_data[temp_index++]&0x80)
1110 comprehension_req = TRUE;
1112 dbg("comprehension_req=[%d]", comprehension_req);
1115 len_of_len = _get_length_filed_size(src_data[temp_index]);
1117 err("[SAT] parser: invalid length.");
1118 return TCORE_SAT_COMMAND_NOT_UNDERSTOOD;
1121 ss_len = src_data[temp_index+len_of_len-1];
1122 dbg("[SAT] parser: ss_tlv len=%d",ss_len);
1124 temp_index += len_of_len;
1125 ss_str_obj->string_len = 0;
1129 return TCORE_SAT_REQUIRED_VALUE_MISSING;
1131 _sat_decode_ton_npi(src_data[temp_index++], &ss_str_obj->ton, &ss_str_obj->npi);
1132 str_ascii = tcore_util_convert_bcd2ascii((const char*)&src_data[temp_index], ss_len-1, SAT_SS_STRING_LEN_MAX);
1134 memcpy(ss_str_obj->ss_string, str_ascii, strlen(str_ascii));
1135 ss_str_obj->string_len = strlen(str_ascii);
1139 // 1 is the length of Tag.
1140 *consumed_data_len = 1 + len_of_len + ss_len;
1141 return TCORE_SAT_SUCCESS;
1144 static enum tcore_sat_result _sat_decode_text_tlv(unsigned char* tlv_str, int tlv_len,
1145 int curr_offset, struct tel_sat_text_string_object *text_obj, int* consumed_data_len)
1147 int temp_index, len_of_len=0;
1149 unsigned char* src_data;
1150 gboolean comprehension_req = FALSE;
1152 if (!tlv_str || !consumed_data_len ) {
1153 err("[SAT] parser: data is null");
1154 return TCORE_SAT_ERROR_FATAL;
1157 if(tlv_len <= (curr_offset+1)){
1158 err("[SAT] parser: incorrect length");
1159 return TCORE_SAT_COMMAND_NOT_UNDERSTOOD;
1163 temp_index = curr_offset;
1164 src_data = &tlv_str[0];
1165 if((src_data[temp_index]&0x7F) != SATK_TEXT_STRING_TAG && (src_data[temp_index]&0x7F) != SATK_DEFAULT_TEXT_TAG){
1166 err("[SAT] parser: text string tag missing, tag=0x%x",src_data[temp_index]);
1167 return TCORE_SAT_COMMAND_NOT_UNDERSTOOD;
1170 if(src_data[temp_index++]&0x80)
1171 comprehension_req = TRUE;
1173 dbg("comprehension_req=[%d]", comprehension_req);
1176 len_of_len = _get_length_filed_size(src_data[temp_index]);
1178 err("[SAT] parser: invalid length.");
1179 return TCORE_SAT_COMMAND_NOT_UNDERSTOOD;
1182 text_len = src_data[temp_index+len_of_len-1];
1183 temp_index += len_of_len;
1184 memset(text_obj->string, 0x00, SAT_TEXT_STRING_LEN_MAX);
1188 text_obj->string_length = 0;
1190 _sat_decode_dcs(src_data[temp_index++], &text_obj->dcs);
1191 _get_string_data(&src_data[temp_index], text_len-1, text_obj);
1194 dbg("[SAT] parser: text_tlv_len=%d, parsed text length=%d", text_len, text_obj->string_length);
1196 // 1 is the length of Tag.
1197 *consumed_data_len = 1 + len_of_len + text_len;
1199 return TCORE_SAT_SUCCESS;
1202 static enum tcore_sat_result _sat_decode_tone_tlv(unsigned char* tlv_str, int tlv_len,
1203 int curr_offset, struct tel_sat_tone *tone_obj, int* consumed_data_len)
1206 unsigned char* src_data;
1207 gboolean comprehension_req = FALSE;
1209 if(tlv_str == NULL || consumed_data_len == NULL || tone_obj == NULL) {
1210 dbg("[SAT] SAT PARSER - tlv_str == NULL || consumed_data_len == NULL || tone_obj == NULL");
1211 return TCORE_SAT_ERROR_FATAL;
1214 if(tlv_len <= (curr_offset+1)) {
1215 dbg("[SAT] SAT PARSER - incorrect length original_command_len=%d", tlv_len);
1216 return TCORE_SAT_COMMAND_NOT_UNDERSTOOD;
1220 temp_index = curr_offset;
1221 src_data = &tlv_str[0];
1222 if((src_data[temp_index]&0x7F) != SATK_TONE_TAG){
1223 err("[SAT] parser: tone tag missing");
1224 return TCORE_SAT_COMMAND_NOT_UNDERSTOOD;
1227 if(src_data[temp_index++]&0x80)
1228 comprehension_req = TRUE;
1231 if (src_data[temp_index++] != SATK_TONE_LENGTH) {
1232 err("[SAT] SAT PARSER - incorrect length value.");
1233 return TCORE_SAT_COMMAND_NOT_UNDERSTOOD; //send TR
1236 if((temp_index+SATK_TONE_LENGTH) > tlv_len)
1238 err("[SAT] SAT PARSER - incorrect cmd len, expected len = %d, orig_len=%d", (temp_index+SATK_TONE_LENGTH),tlv_len);
1239 return TCORE_SAT_COMMAND_NOT_UNDERSTOOD;
1243 switch(src_data[temp_index])
1245 // standard supervisory tones
1247 case CALLED_SUBSCRIBER_BUSY :
1249 case RADIO_PATH_ACK:
1250 case RADIO_PATH_NOT_AVAILABLE_CALL_DROPPED:
1251 case ERR_SPECIAL_INFO:
1252 case CALL_WAITING_TONE:
1254 // ME proprietary tones
1256 case POSITIVE_ACK_TONE:
1257 case NEGATIVE_ACK_OR_ERROR_TONE:
1258 case RINGING_TONE_SLCTD_BY_USR_FOR_INCOM_SPEECH_CALL:
1259 case ALERT_TONE_SELECTED_BY_USER_FOR_INCOMING_SMS:
1260 case CRITICAL_ALERT:
1264 case URGENT_ACTION_TONE :
1266 case MESSAGE_RECEIVED_TONE :
1276 dbg("[SAT] SAT PARSER - Tone =0x%x", src_data[temp_index]);
1277 tone_obj->tone_type = src_data[temp_index];
1280 case TONE_TYPE_RESERVED:
1282 dbg("[SAT] SAT PARSER - Reserved value of Tone =0x%x", src_data[temp_index]);
1283 if(comprehension_req)
1284 return TCORE_SAT_COMMAND_NOT_UNDERSTOOD;
1288 *consumed_data_len = 3;
1289 return TCORE_SAT_SUCCESS;
1292 static enum tcore_sat_result _sat_decode_ussd_string_tlv(unsigned char* tlv_str, int tlv_len,
1293 int curr_offset, struct tel_sat_ussd_string *ussd_str_obj, int* consumed_data_len)
1295 int temp_index, len_of_len=0;
1297 unsigned char* src_data;
1298 gboolean comprehension_req = FALSE;
1300 if (!tlv_str || !ussd_str_obj || !consumed_data_len) {
1301 err("[SAT] SAT PARSER data is null");
1302 return TCORE_SAT_ERROR_FATAL;
1305 if (tlv_len <= curr_offset + 1) {
1306 err("[SAT] SAT PARSER - incorrect length original_command_len=%d", tlv_len);
1307 return TCORE_SAT_COMMAND_NOT_UNDERSTOOD;
1310 temp_index = curr_offset;
1311 src_data = &tlv_str[0];
1312 if ((src_data[temp_index] & 0x7F) != SATK_USSD_STRING_TAG) {
1313 err("[SAT] SAT PARSER - SS string tag missing.");
1314 return TCORE_SAT_COMMAND_NOT_UNDERSTOOD; //send TR
1317 if(src_data[temp_index++]&0x80)
1318 comprehension_req = TRUE;
1320 dbg("comprehension_req=[%d]", comprehension_req);
1323 len_of_len = _get_length_filed_size(src_data[temp_index]);
1325 err("[SAT] parser: invalid length.");
1326 return TCORE_SAT_COMMAND_NOT_UNDERSTOOD;
1329 ussd_len = src_data[temp_index+len_of_len-1];
1330 dbg("[SAT] parser: ussd_tlv len=%d",ussd_len);
1332 temp_index += len_of_len;
1333 ussd_str_obj->string_len = 0;
1337 return TCORE_SAT_REQUIRED_VALUE_MISSING;
1339 _sat_decode_dcs(src_data[temp_index++], &ussd_str_obj->dsc);
1340 ussd_str_obj->string_len = ussd_len - 1;
1341 memcpy(ussd_str_obj->ussd_string, &src_data[temp_index], ussd_str_obj->string_len);
1343 // 1 is the length of Tag.
1344 *consumed_data_len = 1 + len_of_len + ussd_len;
1345 return TCORE_SAT_SUCCESS;
1348 static enum tcore_sat_result _sat_decode_file_list_tlv(unsigned char* tlv_str, int tlv_len,
1349 int curr_offset, struct tel_sat_file_list *file_list_obj, int* consumed_data_len)
1354 unsigned int ef = 0x0000;
1356 int temp_index, len_of_len=0;
1357 int file_list_len = 0;
1358 unsigned char* src_data;
1360 if(tlv_str == NULL || consumed_data_len == NULL || file_list_obj == NULL) {
1361 dbg("[SAT] SAT PARSER - tlv_str == NULL || consumed_data_len == NULL || file_list_obj == NULL");
1362 return TCORE_SAT_ERROR_FATAL;
1365 if(tlv_len <= (curr_offset+1)) {
1366 dbg("[SAT] SAT PARSER - incorrect length original_command_len=%d", tlv_len);
1367 return TCORE_SAT_COMMAND_NOT_UNDERSTOOD;
1371 temp_index = curr_offset;
1372 src_data = &tlv_str[0];
1373 if((src_data[temp_index]&0x7F) != SATK_FILE_LIST_TAG){
1374 err("[SAT] parser: tag missing, tag=0x%x",src_data[temp_index]);
1375 return TCORE_SAT_COMMAND_NOT_UNDERSTOOD;
1379 len_of_len = _get_length_filed_size(src_data[temp_index]);
1381 err("[SAT] parser: invalid length.");
1382 return TCORE_SAT_COMMAND_NOT_UNDERSTOOD;
1384 file_list_len = src_data[temp_index+len_of_len-1];
1385 temp_index += len_of_len;
1387 if((temp_index+file_list_len) > tlv_len) {
1388 dbg("[SAT] SAT PARSER - incorrect cmd len, expected len = %d, orig_len=%d", (temp_index+file_list_len),tlv_len);
1389 return TCORE_SAT_COMMAND_NOT_UNDERSTOOD;
1392 tmp_cnt = src_data[temp_index++];
1393 file_list_obj->file_count = 0;
1394 memset(file_list_obj->file_id, 0, SAT_FILE_ID_LIST_MAX_COUNT);
1397 dbg("file cnt = 0");
1398 return TCORE_SAT_COMMAND_NOT_UNDERSTOOD;
1404 if( src_data[temp_index] != 0x3F || src_data[temp_index+1] != 0x00){
1406 if(temp_index > tlv_len) break;
1409 temp_index+=2; //MASTER FILE (DIR) 0x3F00
1411 if(src_data[temp_index] == 0x2F){
1412 //ELEMENTRY FILE (VALUE)
1413 ef = src_data[temp_index] << 8;
1415 ef = ef | src_data[temp_index];
1417 if( _check_file_for_refresh((enum tel_sim_file_id)ef) ){//check file registered for refresh?
1418 file_list_obj->file_id[file_list_obj->file_count] = ef;
1419 file_list_obj->file_count++;
1422 else if(src_data[temp_index] == 0x7F && src_data[temp_index+1] == 0xFF){
1423 //USIM DIRECTORY FILE (DIR) 0x7FFF
1425 if(src_data[temp_index] == 0x6F){
1428 ef = ef | src_data[temp_index];
1430 if( _check_file_for_refresh((enum tel_sim_file_id)ef) ){//check file registered for refresh?
1431 file_list_obj->file_id[file_list_obj->file_count] = ef;
1432 file_list_obj->file_count++;
1439 else if(src_data[temp_index] == 0x7F && (src_data[temp_index+1] == 0x10 || src_data[temp_index+1] == 0x20) ){
1440 //TELECOM DIRECTORY FILE 0x7F10 or GSM DIRECTORY FILE 0x7F20
1442 if(src_data[temp_index] == 0x6F){
1443 ef = src_data[temp_index] << 8;
1445 ef = ef | src_data[temp_index];
1447 if( _check_file_for_refresh((enum tel_sim_file_id)ef) ){//check file registered for refresh?
1448 file_list_obj->file_id[file_list_obj->file_count] = ef;
1449 file_list_obj->file_count++;
1459 }while( f_count < tmp_cnt);
1461 dbg("[SAT] SAT PARSER - total file count=%d, PDA file count = %d", tmp_cnt, file_list_obj->file_count);
1462 *consumed_data_len = 1 + len_of_len + file_list_len;
1463 return TCORE_SAT_SUCCESS;
1466 static enum tcore_sat_result _sat_decode_item_next_action_indicator_tlv(unsigned char* tlv_str,
1467 int tlv_len, int curr_offset,
1468 struct tel_sat_item_next_action_indicatior_list* item_next_act_indi_obj,
1469 int* consumed_data_len)
1473 unsigned char* src_data;
1474 gboolean comprehension_req = FALSE;
1476 if(tlv_str == NULL || consumed_data_len == NULL || item_next_act_indi_obj == NULL) {
1477 dbg("[SAT] SAT PARSER - tlv_str == NULL || consumed_data_len == NULL || item_next_act_indi_obj == NULL");
1478 return TCORE_SAT_ERROR_FATAL;
1481 if(tlv_len <= (curr_offset+1)) {
1482 dbg("[SAT] SAT PARSER - incorrect length original_command_len=%d", tlv_len);
1483 return TCORE_SAT_COMMAND_NOT_UNDERSTOOD;
1487 temp_index = curr_offset;
1488 src_data = &tlv_str[0];
1489 if((src_data[temp_index]&0x7F) != SATK_ITEMS_NEXT_ACTION_INDICATOR_TAG){
1490 dbg("[SAT] SAT PARSER - tag not found.=%d",src_data[temp_index]);
1491 return TCORE_SAT_COMMAND_NOT_UNDERSTOOD;
1494 if((src_data[temp_index++]&0x7F))
1495 comprehension_req = TRUE;
1498 item_nai_len = item_next_act_indi_obj->cnt = src_data[temp_index++];
1499 if((temp_index+item_nai_len) > tlv_len) {
1500 dbg("[SAT] SAT PARSER - incorrect cmd len, expected len = %d, orig_len=%d", (temp_index+item_nai_len),tlv_len);
1501 return TCORE_SAT_COMMAND_NOT_UNDERSTOOD;
1504 if(item_next_act_indi_obj->cnt > SAT_ITEMS_NEXT_ACTION_INDI_LIST_MAX_COUNT) {
1505 if(comprehension_req == TRUE) {
1506 dbg("[SAT] SAT PARSER - list count exceeds maximum allowed count=%d",item_next_act_indi_obj->cnt);
1507 return TCORE_SAT_COMMAND_NOT_UNDERSTOOD;
1509 item_next_act_indi_obj->cnt = 0;
1512 memset(item_next_act_indi_obj->indicator_list, 0xFF, SAT_ITEMS_NEXT_ACTION_INDI_LIST_MAX_COUNT);
1513 if(item_next_act_indi_obj->cnt > 0)
1514 memcpy(item_next_act_indi_obj->indicator_list, &src_data[temp_index], item_next_act_indi_obj->cnt);
1516 *consumed_data_len = 1+1+item_nai_len;
1517 dbg("[SAT] SAT PARSER - listCount=%d, consumed_data_len = %d",item_next_act_indi_obj->cnt, *consumed_data_len);
1518 return TCORE_SAT_SUCCESS;
1521 static enum tcore_sat_result _sat_decode_event_list_tlv(unsigned char* tlv_str, int tlv_len,
1522 int curr_offset, struct tel_sat_event_list* event_list_obj, int* consumed_data_len)
1525 int temp_index, len_of_len=0;
1527 unsigned char* src_data;
1528 gboolean comprehension_req = FALSE;
1530 if(tlv_str == NULL || consumed_data_len == NULL || event_list_obj == NULL) {
1531 dbg("[SAT] SAT PARSER - tlv_str == NULL || consumed_data_len == NULL || event_list_obj == NULL");
1532 return TCORE_SAT_ERROR_FATAL;
1535 if(tlv_len <= (curr_offset+1)) {
1536 dbg("[SAT] SAT PARSER - incorrect length original_command_len=%d", tlv_len);
1537 return TCORE_SAT_COMMAND_NOT_UNDERSTOOD;
1541 temp_index = curr_offset;
1542 src_data = &tlv_str[0];
1543 if((src_data[temp_index]&0x7F) != SATK_EVENT_LIST_TAG){
1544 dbg("[SAT] SAT PARSER - tag not found.=%d",src_data[temp_index]);
1545 return TCORE_SAT_COMMAND_NOT_UNDERSTOOD;
1548 if((src_data[temp_index++]&0x80))
1549 comprehension_req = TRUE;
1552 len_of_len = _get_length_filed_size(src_data[temp_index]);
1554 err("[SAT] parser: invalid length.");
1555 return TCORE_SAT_COMMAND_NOT_UNDERSTOOD;
1558 evt_list_len = src_data[temp_index+len_of_len-1];
1559 dbg("[SAT] parser: evt_list_len=%d",evt_list_len);
1560 temp_index += len_of_len;
1562 if((temp_index+evt_list_len) > tlv_len) {
1563 dbg("[SAT] SAT PARSER - incorrect cmd len, expected len = %d, orig_len=%d", (temp_index+evt_list_len),tlv_len);
1564 return TCORE_SAT_COMMAND_NOT_UNDERSTOOD;
1567 if(evt_list_len > SAT_EVENT_LIST_MAX){
1568 dbg("[SAT] SAT PARSER - event list contains more items than it is supposed to have! len=%d", evt_list_len);
1569 if(comprehension_req)
1570 return TCORE_SAT_COMMAND_NOT_UNDERSTOOD;
1572 evt_list_len = SAT_EVENT_LIST_MAX;
1575 event_list_obj->event_list_cnt = 0;
1576 memset(event_list_obj->evt_list, 0xFF, SAT_EVENT_LIST_MAX);
1579 for(i = 0; i < evt_list_len; i++){
1580 dbg("[SAT] SAT PARSER - event[%d]=0x%x", i, src_data[temp_index]);
1581 switch(src_data[temp_index]){
1583 case EVENT_USER_ACTIVITY:
1584 case EVENT_IDLE_SCREEN_AVAILABLE:
1585 case EVENT_LANGUAGE_SELECTION:
1586 case EVENT_BROWSER_TERMINATION:
1587 case EVENT_DATA_AVAILABLE:
1588 case EVENT_CHANNEL_STATUS:
1589 case EVENT_MT_CALL :
1590 case EVENT_CALL_CONNECTED:
1591 case EVENT_CALL_DISCONNECTED:
1592 case EVENT_LOCATION_STATUS:
1593 case EVENT_ACCESS_TECHNOLOGY_CHANGED:
1594 event_list_obj->evt_list[i] = src_data[temp_index];
1595 event_list_obj->event_list_cnt++;
1599 if(comprehension_req)
1600 return TCORE_SAT_BEYOND_ME_CAPABILITY;
1606 // 1 is the length of Tag.
1607 *consumed_data_len = 1 + len_of_len + evt_list_len;
1608 return TCORE_SAT_SUCCESS;
1611 static enum tcore_sat_result _sat_decode_icon_identifier_tlv(unsigned char* tlv_str, int tlv_len,
1612 int curr_offset, struct tel_sat_icon_identifier* icon_id_obj, int* consumed_data_len)
1614 unsigned char* src_data;
1617 if(tlv_str == NULL || icon_id_obj == NULL ||consumed_data_len == NULL) {
1618 dbg("[SAT] SAT PARSER - tlv_str == NULL || icon_id_obj == NULL ||consumed_data_len == NULL");
1619 return TCORE_SAT_ERROR_FATAL;
1622 if(tlv_len <= (curr_offset+1)) {//length of icon id tlv is 4
1623 dbg("[SAT] SAT PARSER - incorrect length original_command_len=%d", tlv_len);
1624 return TCORE_SAT_COMMAND_NOT_UNDERSTOOD;
1628 temp_index = curr_offset;
1629 src_data = &tlv_str[0];
1630 if((src_data[temp_index++]&0x7F) != SATK_ICON_IDENTIFIER_TAG) {
1631 dbg("[SAT] SAT PARSER - icon identity tag missing.");
1632 return TCORE_SAT_COMMAND_NOT_UNDERSTOOD; //send TR
1635 if(src_data[temp_index++] != SATK_ICON_IDENTITY_LENGTH) {
1636 dbg("[SAT] SAT PARSER - incorrect length value.");
1637 return FALSE; //send TR
1640 if((temp_index+SATK_ICON_IDENTITY_LENGTH) > tlv_len) {
1641 dbg("[SAT] SAT PARSER - incorrect cmd len, expected len = %d, orig_len=%d", (temp_index+SATK_ICON_IDENTITY_LENGTH),tlv_len);
1642 return TCORE_SAT_COMMAND_NOT_UNDERSTOOD;
1644 icon_id_obj->is_exist = TRUE;
1646 if((src_data[temp_index++]&0x01))
1647 icon_id_obj->icon_qualifer = ICON_QUALI_NOT_SELF_EXPLANATORY;
1649 icon_id_obj->icon_qualifer = ICON_QUALI_SELF_EXPLANATORY;
1651 if(src_data[temp_index] > 0x00) {
1652 icon_id_obj->icon_identifier = src_data[temp_index];
1655 dbg("[SAT] SAT PARSER - incorrect icon identifier");
1656 return TCORE_SAT_COMMAND_NOT_UNDERSTOOD; //send TR
1659 dbg("[SAT] SAT PARSER - icon_qual=%d, iconId=%d",icon_id_obj->icon_qualifer, icon_id_obj->icon_identifier);
1660 *consumed_data_len = 4;
1661 return TCORE_SAT_SUCCESS;
1664 static enum tcore_sat_result _sat_decode_icon_identifier_list_tlv(unsigned char* tlv_str,
1665 int tlv_len, int curr_offset, struct tel_sat_icon_identifier_list* icon_list_obj,
1666 int* consumed_data_len)
1670 unsigned char* src_data;
1671 gboolean comprehension_req = FALSE;
1673 if(tlv_str == NULL || consumed_data_len == NULL || icon_list_obj == NULL) {
1674 dbg("[SAT] SAT PARSER - tlv_str == NULL || consumed_data_len == NULL || icon_list_obj == NULL");
1675 return TCORE_SAT_ERROR_FATAL;
1678 if(tlv_len <= (curr_offset+1)+1) {
1679 dbg("[SAT] SAT PARSER - incorrect length original_command_len=%d", tlv_len);
1680 return TCORE_SAT_COMMAND_NOT_UNDERSTOOD;
1684 temp_index = curr_offset;
1685 src_data = &tlv_str[0];
1686 if((src_data[temp_index]&0x7F) != SATK_ITEM_ICON_IDENTIFIER_LIST_TAG) {
1687 dbg("[SAT] SAT PARSER - icon identity tag missing.");
1688 return TCORE_SAT_COMMAND_NOT_UNDERSTOOD; //send TR
1691 icon_list_obj->is_exist = TRUE;
1692 if(src_data[temp_index++]&0x80)
1693 comprehension_req = TRUE;
1695 len_value = src_data[temp_index++];
1696 if(src_data[temp_index++]&0x01)
1697 icon_list_obj->icon_qualifer = ICON_QUALI_NOT_SELF_EXPLANATORY;
1699 icon_list_obj->icon_qualifer = ICON_QUALI_SELF_EXPLANATORY;
1701 icon_list_obj->icon_cnt = len_value-1;
1702 if(icon_list_obj->icon_cnt > SAT_ICON_LIST_MAX_COUNT){
1703 if(comprehension_req == TRUE) {
1704 dbg("[SAT] SAT PARSER - list count exceeds maximum allowed count=%d",icon_list_obj->icon_cnt);
1705 return TCORE_SAT_COMMAND_NOT_UNDERSTOOD;
1707 icon_list_obj->icon_cnt = 0;
1711 for(i=0;i<icon_list_obj->icon_cnt;i++) {
1712 if(src_data[temp_index] > 0x00) {
1713 icon_list_obj->icon_id_list[i]= src_data[temp_index++];
1715 dbg("[SAT] SAT PARSER - incorrect icon identifier");
1716 return TCORE_SAT_COMMAND_NOT_UNDERSTOOD; //send TR
1721 *consumed_data_len = 1+1+len_value;
1722 dbg("[SAT] SAT PARSER - icon_qual=%d, iconCount=%d",icon_list_obj->icon_qualifer, icon_list_obj->icon_cnt);
1723 return TCORE_SAT_SUCCESS;
1726 static enum tcore_sat_result _sat_decode_dtmf_string_tlv(unsigned char* tlv_str, int tlv_len,
1727 int curr_offset, struct tel_sat_dtmf_string* dtmf_string_obj, int* consumed_data_len)
1729 unsigned char* src_data;
1730 int temp_index, len_of_len = 0;
1732 gboolean comprehension_req = FALSE;
1733 char* str_ascii = NULL;
1735 if (tlv_str == NULL || consumed_data_len == NULL || dtmf_string_obj == NULL) {
1736 dbg("[SAT] SAT PARSER - tlv_str == NULL || consumed_data_len == NULL || dtmf_string_obj == NULL");
1737 return TCORE_SAT_ERROR_FATAL;
1740 src_data = &tlv_str[0];
1742 if (tlv_len <= (curr_offset + 1)) {
1743 dbg("[SAT] SAT PARSER - incorrect length original_command_len=%d", tlv_len);
1744 return TCORE_SAT_COMMAND_NOT_UNDERSTOOD;
1748 temp_index = curr_offset;
1749 if ((src_data[temp_index] & 0x7F) != SATK_DTMF_STRING_TAG) {
1750 dbg("[SAT] SAT PARSER - address tag missing");
1751 return TCORE_SAT_REQUIRED_VALUE_MISSING;
1754 //comprehensive required
1755 if((src_data[temp_index++] & 0x80))
1756 comprehension_req = TRUE;
1758 dbg("comprehension_req=[%d]", comprehension_req);
1761 len_of_len = _get_length_filed_size(src_data[temp_index]);
1763 err("[SAT] parser: invalid length.");
1764 return TCORE_SAT_COMMAND_NOT_UNDERSTOOD;
1767 dtmf_len = src_data[temp_index + len_of_len - 1];
1768 temp_index += len_of_len; //temp_index pointing to TON/NPI
1770 if ((temp_index + dtmf_len) > tlv_len) {
1771 dbg("[SAT] SAT PARSER - incorrect cmd len, expected len = %d, orig_len=%d", (temp_index+dtmf_len), tlv_len);
1772 return TCORE_SAT_COMMAND_NOT_UNDERSTOOD;
1775 dtmf_string_obj->dtmf_length = 0;
1778 str_ascii = tcore_util_convert_bcd2ascii((const char*)&src_data[temp_index], dtmf_len, SAT_DTMF_STRING_LEN_MAX);
1780 memcpy(dtmf_string_obj->dtmf_string, str_ascii, strlen(str_ascii));
1781 dtmf_string_obj->dtmf_length = strlen(str_ascii);
1786 if (dtmf_string_obj->dtmf_length == 0) {
1787 dbg("[SAT] SAT PARSER - DTMF string length is either 0 or it is too long for the ME to handle.");
1788 return TCORE_SAT_COMMAND_NOT_UNDERSTOOD;
1791 *consumed_data_len = 1 + len_of_len + dtmf_len;
1792 return TCORE_SAT_SUCCESS;
1795 static enum tcore_sat_result _sat_decode_language_tlv(unsigned char* tlv_str, int tlv_len,
1796 int curr_offset, enum tel_sim_language_type* language_obj)
1798 unsigned char* src_data;
1801 if(tlv_len <= (curr_offset+1)) {
1802 dbg("[SAT] SAT PARSER - incorrect length original_command_len=%d", tlv_len);
1803 return TCORE_SAT_COMMAND_NOT_UNDERSTOOD;
1806 src_data = &tlv_str[0];
1807 temp_index = curr_offset;
1809 if((src_data[temp_index++]&0x7F) != SATK_LANGUAGE_TAG) {
1810 dbg("[SAT] SAT PARSER - Language tag missing.");
1811 return TCORE_SAT_COMMAND_NOT_UNDERSTOOD;
1813 if(src_data[temp_index++] != SATK_LANGUAGE_LENGTH) {
1814 dbg("[SAT] SAT PARSER - incorrect length value.");
1815 return TCORE_SAT_COMMAND_NOT_UNDERSTOOD;
1818 if((temp_index+SATK_LANGUAGE_LENGTH) > tlv_len) {
1819 dbg("[SAT] SAT PARSER - incorrect cmd len, expected len = %d, orig_len=%d", (temp_index+SATK_LANGUAGE_LENGTH),tlv_len);
1820 return TCORE_SAT_COMMAND_NOT_UNDERSTOOD;
1822 *language_obj = _sat_decode_language(src_data[temp_index], src_data[temp_index+1]);
1823 dbg("[SAT] SAT PARSER - <in> %c %c, <out> %d", src_data[temp_index], src_data[temp_index+1], *language_obj);
1824 return TCORE_SAT_SUCCESS;
1827 static enum tcore_sat_result _sat_decode_browser_identity_tlv(unsigned char* tlv_str, int tlv_len, int curr_offset,
1828 enum browser_identity* browser_id, int* consumed_data_len)
1830 unsigned char* src_data;
1833 if (tlv_str == NULL || browser_id == NULL || consumed_data_len == NULL) {
1834 dbg("[SAT] SAT PARSER - tlv_str == NULL || browser_id == NULL ||consumed_data_len == NULL");
1835 return TCORE_SAT_ERROR_FATAL;
1838 if (tlv_len <= (curr_offset + 1)) {
1839 dbg("[SAT] SAT PARSER - incorrect length original_command_len=%d", tlv_len);
1840 return TCORE_SAT_COMMAND_NOT_UNDERSTOOD;
1843 temp_index = curr_offset;
1844 src_data = &tlv_str[0];
1846 if ((src_data[temp_index++] & 0x7F) != SATK_BROWSER_IDENTITY_TAG) {
1847 dbg("[SAT] SAT PARSER - Browser ID tag missing.");
1848 return TCORE_SAT_COMMAND_NOT_UNDERSTOOD;
1850 if (src_data[temp_index++] != SATK_BROWSER_ID_LENGTH) {
1851 dbg("[SAT] SAT PARSER - incorrect length value.");
1852 return TCORE_SAT_COMMAND_NOT_UNDERSTOOD;
1855 dbg("[SAT] SAT PARSER - : browser ID value:ox%x", src_data[temp_index]);
1857 switch (src_data[temp_index]) {
1859 *browser_id = BROWSER_ID_DEFAULT;
1862 *browser_id = BROWSER_ID_WML;
1865 *browser_id = BROWSER_ID_HTML;
1868 *browser_id = BROWSER_ID_XHTML;
1871 *browser_id = BROWSER_ID_CHTML;
1874 *browser_id = BROWSER_ID_RESERVED;
1878 *consumed_data_len = 3;
1879 return TCORE_SAT_SUCCESS;
1882 static enum tcore_sat_result _sat_decode_url_tlv(unsigned char* tlv_str, int tlv_len, int curr_offset,
1883 struct tel_sat_url* url, int* consumed_data_len)
1885 unsigned char* src_data;
1886 int temp_index= curr_offset;
1887 int len_of_len=0, url_len=0;
1889 if (tlv_str == NULL || url == NULL || consumed_data_len == NULL) {
1890 dbg("[SAT] SAT PARSER - tlv_str == NULL || url == NULL ||consumed_data_len == NULL");
1891 return TCORE_SAT_ERROR_FATAL;
1894 src_data = &tlv_str[0];
1895 if(tlv_len <= (curr_offset+1)) {
1896 dbg("[SAT] SAT PARSER - incorrect length original_command_len=%d", tlv_len);
1897 return TCORE_SAT_COMMAND_NOT_UNDERSTOOD;
1900 if((src_data[temp_index++]&0x7F) != SATK_URL_TAG) {
1901 dbg("[SAT] SAT PARSER - Browser URL tag missing.");
1902 return TCORE_SAT_COMMAND_NOT_UNDERSTOOD; //send TR
1906 len_of_len = _get_length_filed_size(src_data[temp_index]);
1908 err("[SAT] parser: invalid length.");
1909 return TCORE_SAT_COMMAND_NOT_UNDERSTOOD;
1912 url_len = src_data[temp_index+len_of_len-1];
1913 url->url_length = url_len;
1914 temp_index+=len_of_len; //temp_index pointing to url.
1915 dbg("URL length (%d)", url_len);
1918 dbg("[SAT] URL is null");
1919 *consumed_data_len = 1+len_of_len+url_len;
1920 return TCORE_SAT_SUCCESS;
1923 if(url_len > SAT_URL_LEN_MAX){
1924 dbg("[SAT] URL length is wrong");
1925 *consumed_data_len = 1+len_of_len+url_len;
1926 return TCORE_SAT_COMMAND_NOT_UNDERSTOOD;
1929 memcpy(url->url, &src_data[temp_index], url_len);
1930 dbg("[SAT] url(%s)", url->url);
1931 *consumed_data_len = 1+len_of_len+url_len;
1933 return TCORE_SAT_SUCCESS;
1936 static enum tcore_sat_result _sat_decode_bearer_tlv(unsigned char* tlv_str, int tlv_len, int curr_offset,
1937 struct tel_sat_bearer_list* satk_bearer, int* consumed_data_len)
1939 unsigned char* src_data;
1940 int temp_index, len_of_len = 0;
1941 int list_len = 0, list_idx = 0;
1943 if (tlv_str == NULL || consumed_data_len == NULL || satk_bearer == NULL) {
1944 dbg("[SAT] SAT PARSER - tlv_str == NULL || consumed_data_len == NULL || satk_bearer == NULL");
1945 return TCORE_SAT_ERROR_FATAL;
1948 if (tlv_len <= (curr_offset + 1)) {
1949 dbg("[SAT] SAT PARSER - incorrect length original_command_len=%d", tlv_len);
1950 return TCORE_SAT_COMMAND_NOT_UNDERSTOOD;
1953 src_data = &tlv_str[0];
1954 temp_index = curr_offset;
1956 if ((src_data[temp_index++] & 0x7F) != SATK_BEARER_TAG) {
1957 dbg("[SAT] SAT PARSER - _sat_decode_bearer_tlv: alphaID TAG missing");
1958 return TCORE_SAT_COMMAND_NOT_UNDERSTOOD;
1962 len_of_len = _get_length_filed_size(src_data[temp_index]);
1964 err("[SAT] parser: invalid length.");
1965 return TCORE_SAT_COMMAND_NOT_UNDERSTOOD;
1968 satk_bearer->count = src_data[temp_index + len_of_len - 1];
1969 list_len = satk_bearer->count;
1970 temp_index += len_of_len;
1972 if ((temp_index + list_len) > tlv_len) {
1973 dbg("[SAT] SAT PARSER - incorrect cmd len, expected len = %d, orig_len=%d", (temp_index + list_len), tlv_len);
1974 return TCORE_SAT_COMMAND_NOT_UNDERSTOOD;
1977 if (satk_bearer->count > 0) {
1978 if (list_len > SAT_BEARER_LIST_MAX_COUNT)
1979 list_len = SAT_BEARER_LIST_MAX_COUNT;
1981 for (list_idx = 0; list_idx < list_len; list_idx++) {
1982 switch (src_data[temp_index]) {
1984 satk_bearer->bear[list_idx] = BEARER_LIST_SMS;
1987 satk_bearer->bear[list_idx] = BEARER_LIST_CSD;
1990 satk_bearer->bear[list_idx] = BEARER_LIST_USSD;
1993 satk_bearer->bear[list_idx] = BEARER_LIST_GPRS;
1996 satk_bearer->bear[list_idx] = BEARER_LIST_RESERVED;
1999 dbg("[SAT] SAT PARSER - bearer[%d]=0x%x", list_idx, satk_bearer->bear[list_idx]);
2003 return TCORE_SAT_COMMAND_NOT_UNDERSTOOD;
2006 *consumed_data_len = 1 + len_of_len + list_len;
2007 return TCORE_SAT_SUCCESS;
2010 static enum tcore_sat_result _sat_decode_provisioning_file_ref_tlv(unsigned char* tlv_str,
2011 int tlv_len, int curr_offset, struct tel_sat_provisioning_file_ref* prf, int* data_len_consumed)
2013 unsigned char* src_data;
2014 int temp_index = curr_offset;
2015 int len_of_len = 0, prf_len = 0;
2017 if (tlv_str == NULL || prf == NULL || data_len_consumed == NULL) {
2018 dbg("[SAT] SAT PARSER - tlv_str == NULL || prf == NULL ||data_len_consumed == NULL");
2019 return TCORE_SAT_ERROR_FATAL;
2022 src_data = &tlv_str[0];
2023 if (tlv_len <= (curr_offset + 1)) {
2024 dbg("[SAT] SAT PARSER - incorrect length original_command_len=%d",tlv_len);
2025 return TCORE_SAT_COMMAND_NOT_UNDERSTOOD;
2028 if ((src_data[temp_index++] & 0x7F) != SATK_PROVISIONING_REF_FILE_TAG) {
2029 dbg("[SAT] SAT PARSER - PRF tag missing.");
2030 return TCORE_SAT_COMMAND_NOT_UNDERSTOOD; //send TR
2034 len_of_len = _get_length_filed_size(src_data[temp_index]);
2036 err("[SAT] parser: invalid length.");
2037 return TCORE_SAT_COMMAND_NOT_UNDERSTOOD;
2040 prf_len = src_data[temp_index + len_of_len - 1];
2041 prf->file_path_length = prf_len;
2042 temp_index += len_of_len; //temp_index pointing to prf.
2045 if (prf_len > SAT_PROVISIONING_FILE_PATH_LEN_MAX)
2046 return TCORE_SAT_COMMAND_NOT_UNDERSTOOD;
2048 memcpy(prf->file_path, &src_data[temp_index], prf_len);
2050 dbg("[SAT] SAT PARSER - NULL string for PRF");
2051 return TCORE_SAT_COMMAND_NOT_UNDERSTOOD;
2054 *data_len_consumed = 1 + len_of_len + prf_len;
2055 return TCORE_SAT_SUCCESS;
2058 static enum tcore_sat_result _sat_decode_bearer_description_tlv(unsigned char* tlv_str,
2059 int tlv_len, int curr_offset, struct tel_sat_bearer_description *bearer_desc_obj,
2060 int* consumed_data_len)
2062 int temp_index, length=0;
2063 unsigned char* src_data;
2065 if(tlv_len <= (curr_offset+1)+1) {
2066 dbg("[SAT] SAT PARSER - incorrect length original_command_len=%d", tlv_len);
2067 return TCORE_SAT_COMMAND_NOT_UNDERSTOOD;
2070 temp_index = curr_offset;
2071 src_data = &tlv_str[0];
2073 if(temp_index >= tlv_len){
2074 dbg("bearer desc cannot find. UICC Server mode");
2075 *consumed_data_len = 0;
2076 return TCORE_SAT_SUCCESS;
2079 if( (src_data[temp_index]&0x7F) == SATK_BEARER_DISCRIPTION_TAG ){
2080 dbg("find bearer description tag temp_index(%d)", temp_index);
2088 length = src_data[temp_index++];
2089 dbg("bearer description length (%d)", length);
2092 switch(src_data[temp_index++]){
2094 bearer_desc_obj->bearer_type = BEARER_CSD;
2095 bearer_desc_obj->bearer_parameter.cs_bearer_param.data_rate = src_data[temp_index++];
2096 bearer_desc_obj->bearer_parameter.cs_bearer_param.service_type = src_data[temp_index++];
2097 bearer_desc_obj->bearer_parameter.cs_bearer_param.connection_element_type = src_data[temp_index++];
2100 bearer_desc_obj->bearer_type = BEARER_GPRS;
2101 bearer_desc_obj->bearer_parameter.ps_bearer_param.precedence_class = src_data[temp_index++];
2102 bearer_desc_obj->bearer_parameter.ps_bearer_param.delay_class = src_data[temp_index++];
2103 bearer_desc_obj->bearer_parameter.ps_bearer_param.reliability_class = src_data[temp_index++];
2104 bearer_desc_obj->bearer_parameter.ps_bearer_param.peak_throughput_class = src_data[temp_index++];
2105 bearer_desc_obj->bearer_parameter.ps_bearer_param.mean_throughput_class = src_data[temp_index++];
2106 bearer_desc_obj->bearer_parameter.ps_bearer_param.pdp_type = BIP_GPRS_PDP_TYPE_RESERVED;
2107 if(src_data[temp_index] == BIP_GPRS_PDP_TYPE_IP)
2108 bearer_desc_obj->bearer_parameter.ps_bearer_param.pdp_type = BIP_GPRS_PDP_TYPE_IP;
2110 case BEARER_DEFAULT_BEARER_FROM_TRANSPORT_LAYER:
2111 bearer_desc_obj->bearer_type = BEARER_DEFAULT_BEARER_FROM_TRANSPORT_LAYER;
2113 case BEARER_LOCAL_LINK_TECHNOLOGY_INDEPENDENT:
2114 bearer_desc_obj->bearer_type = BEARER_DEFAULT_BEARER_FROM_TRANSPORT_LAYER;
2117 bearer_desc_obj->bearer_type = BEARER_RESERVED;
2118 dbg("bearer type not supported");
2119 return TCORE_SAT_BEYOND_ME_CAPABILITY;
2122 *consumed_data_len = 1+1+length;
2123 return TCORE_SAT_SUCCESS;
2126 static enum tcore_sat_result _sat_decode_channel_data_tlv(unsigned char* tlv_str,
2127 int tlv_len, int curr_offset, struct tel_sat_channel_data *channel_data_obj,
2128 int* consumed_data_len)
2131 int len_of_len = 0, channel_data_len = 0;
2132 unsigned char* src_data;
2134 if(tlv_str == NULL || consumed_data_len == NULL || channel_data_obj == NULL) {
2135 dbg("[SAT] SAT PARSER - tlv_str == NULL || consumed_data_len == NULL || channel_data_obj == NULL");
2136 return TCORE_SAT_ERROR_FATAL;
2139 if(tlv_len <= (curr_offset+1)) {
2140 dbg("[SAT] SAT PARSER - incorrect length original_command_len=%d", tlv_len);
2141 return TCORE_SAT_COMMAND_NOT_UNDERSTOOD;
2145 temp_index = curr_offset;
2146 src_data = &tlv_str[0];
2147 if((src_data[temp_index++]&0x7F) != SATK_CHANNEL_DATA_TAG){
2148 dbg("[SAT] SAT PARSER - tag not found.=%d",src_data[temp_index]);
2149 return TCORE_SAT_COMMAND_NOT_UNDERSTOOD;
2153 len_of_len = _get_length_filed_size(src_data[temp_index]);
2155 err("[SAT] parser: invalid length.");
2156 return TCORE_SAT_COMMAND_NOT_UNDERSTOOD;
2159 channel_data_len = src_data[temp_index+len_of_len-1];
2160 dbg("[SAT] parser: channel_data_len=%d",channel_data_len);
2161 temp_index += len_of_len;
2163 if((temp_index+channel_data_len) > tlv_len) {
2164 dbg("[SAT] SAT PARSER - incorrect cmd len, expected len = %d, orig_len=%d", (temp_index+channel_data_len),tlv_len);
2165 return TCORE_SAT_COMMAND_NOT_UNDERSTOOD;
2169 channel_data_obj->data_string_len = channel_data_len;
2170 memcpy(channel_data_obj->data_string, &src_data[temp_index], channel_data_len);
2172 *consumed_data_len = 1+len_of_len+channel_data_len;
2173 return TCORE_SAT_SUCCESS;
2176 static enum tcore_sat_result _sat_decode_channel_data_length_tlv(unsigned char* tlv_str,
2177 int tlv_len, int curr_offset, struct tel_sat_channel_data_len *data_len_obj,
2178 int* consumed_data_len)
2181 unsigned char* src_data;
2183 if(tlv_str == NULL || consumed_data_len == NULL || data_len_obj == NULL) {
2184 dbg("[SAT] SAT PARSER - tlv_str == NULL || consumed_data_len == NULL || data_len_obj == NULL");
2185 return TCORE_SAT_ERROR_FATAL;
2189 temp_index = curr_offset;
2190 src_data = &tlv_str[0];
2191 if((src_data[temp_index++]&0x7F) != SATK_CHANNEL_DATA_LEN_TAG) {
2192 dbg("[SAT] SAT PARSER - channel data tag missing.");
2193 return TCORE_SAT_COMMAND_NOT_UNDERSTOOD; //send TR
2197 if(src_data[temp_index++] != SATK_CHANNEL_DATA_LENGTH_VALUE_LENGTH) {
2198 dbg("[SAT] SAT PARSER - incorrect length");
2199 return TCORE_SAT_COMMAND_NOT_UNDERSTOOD; //send TR
2203 data_len_obj->data_len = src_data[temp_index];
2205 *consumed_data_len = 3;
2206 return TCORE_SAT_SUCCESS;
2209 static enum tcore_sat_result _sat_decode_buffer_size_tlv(unsigned char* tlv_str,
2210 int tlv_len, int curr_offset, struct tel_sat_buffer_size *buffer_size_obj,
2211 int* consumed_data_len)
2214 unsigned char* src_data;
2216 if(tlv_str == NULL || consumed_data_len == NULL || buffer_size_obj == NULL) {
2217 dbg("[SAT] SAT PARSER - tlv_str == NULL || consumed_data_len == NULL || buffer_size_obj == NULL");
2218 return TCORE_SAT_ERROR_FATAL;
2221 if(tlv_len <= (curr_offset+1)+SATK_BUFFER_SIZE_LENGTH) {
2222 dbg("[SAT] SAT PARSER - incorrect length original_command_len=%d", tlv_len);
2223 return TCORE_SAT_COMMAND_NOT_UNDERSTOOD;
2227 temp_index = curr_offset;
2228 src_data = &tlv_str[0];
2229 if((src_data[temp_index++]&0x7F) != SATK_BUFFER_SIZE_TAG) {
2230 dbg("[SAT] SAT PARSER - buffer size tag missing.");
2231 return TCORE_SAT_COMMAND_NOT_UNDERSTOOD; //send TR
2235 if(src_data[temp_index++] != SATK_BUFFER_SIZE_LENGTH) {
2236 dbg("[SAT] SAT PARSER - incorrect length");
2237 return TCORE_SAT_COMMAND_NOT_UNDERSTOOD; //send TR
2240 buffer_size_obj->size[0] = src_data[temp_index++];
2241 buffer_size_obj->size[1] = src_data[temp_index];
2243 *consumed_data_len = 4;
2244 dbg("[SAT] SAT PARSER - buffer size = 0x%x%x", buffer_size_obj->size[0], buffer_size_obj->size[1]);
2245 return TCORE_SAT_SUCCESS;
2248 static enum tcore_sat_result _sat_decode_other_address_tlv(unsigned char* tlv_str,
2249 int tlv_len, int curr_offset, struct tel_sat_other_address *other_address_obj,
2250 int* consumed_data_len)
2252 gchar* address = NULL;
2253 int temp_index, address_len;
2254 unsigned char* src_data;
2256 if(tlv_str == NULL || consumed_data_len == NULL || other_address_obj == NULL) {
2257 dbg("[SAT] SAT PARSER - tlv_str == NULL || consumed_data_len == NULL || other_address_obj == NULL");
2258 return TCORE_SAT_ERROR_FATAL;
2261 if(tlv_len <= (curr_offset+1)) {
2262 dbg("[SAT] SAT PARSER - incorrect length original_command_len=%d", tlv_len);
2263 return TCORE_SAT_COMMAND_NOT_UNDERSTOOD;
2267 temp_index = curr_offset;
2268 src_data = &tlv_str[0];
2269 if((src_data[temp_index++]&0x7F) != SATK_OTHER_ADDRESS_TAG) {
2270 dbg("[SAT] SAT PARSER - other address tag missing.");
2271 return TCORE_SAT_COMMAND_NOT_UNDERSTOOD; //send TR
2275 address_len = src_data[temp_index++];
2276 if((temp_index+address_len) > tlv_len) {
2277 dbg("[SAT] SAT PARSER - incorrect cmd len, expected len = %d, orig_len=%d", (temp_index+address_len),tlv_len);
2278 return TCORE_SAT_COMMAND_NOT_UNDERSTOOD;
2281 if(address_len-1 > SAT_OTHER_ADDR_LEN_MAX){
2282 dbg("[SAT] SAT PARSER - address is longer than capability");
2283 return TCORE_SAT_BEYOND_ME_CAPABILITY;
2286 //other address type
2287 switch(src_data[temp_index++]){
2288 case ADDR_TYPE_IPv4:{
2289 other_address_obj->address_type = ADDR_TYPE_IPv4;
2290 address = g_strdup_printf("%d.%d.%d.%d", src_data[temp_index], src_data[temp_index+1], src_data[temp_index+2], src_data[temp_index+3]);
2292 case ADDR_TYPE_IPv6:{
2293 other_address_obj->address_type = ADDR_TYPE_IPv6;
2294 address = g_strdup_printf("%x%x:%x%x:%x%x:%x%x:%x%x:%x%x:%x%x:%x%x:",
2295 src_data[temp_index], src_data[temp_index+1], src_data[temp_index+2], src_data[temp_index+3],
2296 src_data[temp_index+4], src_data[temp_index+5], src_data[temp_index+6], src_data[temp_index+7],
2297 src_data[temp_index+8], src_data[temp_index+9], src_data[temp_index+10], src_data[temp_index+11],
2298 src_data[temp_index+12], src_data[temp_index+13], src_data[temp_index+14], src_data[temp_index+15]);
2301 other_address_obj->address_type = ADDR_RESERVED;
2302 address = g_strdup("");
2308 memcpy(other_address_obj->address, address, strlen(address));
2309 other_address_obj->address_len = strlen(address);
2312 dbg("destination address(%s)", other_address_obj->address);
2315 *consumed_data_len = 2+address_len;
2316 return TCORE_SAT_SUCCESS;
2319 static enum tcore_sat_result _sat_decode_uicc_terminal_interface_tlv(unsigned char* tlv_str,
2320 int tlv_len, int curr_offset, struct tel_sat_uicc_terminal_interface_transport_level *level_obj,
2321 int* consumed_data_len)
2324 unsigned char* src_data;
2326 if(tlv_str == NULL || consumed_data_len == NULL || level_obj == NULL) {
2327 dbg("[SAT] SAT PARSER - tlv_str == NULL || consumed_data_len == NULL || level_obj == NULL");
2328 return TCORE_SAT_ERROR_FATAL;
2331 if(tlv_len <= (curr_offset+1)+SATK_UICC_ME_TRANS_INTERFACE_LEVEL_LENGTH) {
2332 dbg("[SAT] SAT PARSER - incorrect length original_command_len=%d", tlv_len);
2333 return TCORE_SAT_COMMAND_NOT_UNDERSTOOD;
2337 temp_index = curr_offset;
2338 src_data = &tlv_str[0];
2339 if((src_data[temp_index++]&0x7F) != SATK_USIM_ME_INTERFACE_TRANSPORT_LEVEL_TAG) {
2340 dbg("[SAT] SAT PARSER - UICC/TERMINAL Interface transport level tag missing.");
2341 return TCORE_SAT_COMMAND_NOT_UNDERSTOOD; //send TR
2345 if(src_data[temp_index++] != SATK_UICC_ME_TRANS_INTERFACE_LEVEL_LENGTH) {
2346 dbg("[SAT] SAT PARSER - incorrect length");
2347 return TCORE_SAT_COMMAND_NOT_UNDERSTOOD; //send TR
2350 level_obj->protocol_type = src_data[temp_index++];
2351 level_obj->port_number = src_data[temp_index++] << 8;
2352 level_obj->port_number |= src_data[temp_index];
2354 *consumed_data_len = 2+SATK_UICC_ME_TRANS_INTERFACE_LEVEL_LENGTH;
2355 dbg("[SAT] SAT PARSER - protocol type(%d) , port number(%d)", level_obj->protocol_type, level_obj->port_number);
2356 return TCORE_SAT_SUCCESS;
2359 static enum tcore_sat_result _sat_decode_remote_entity_address_tlv(unsigned char* tlv_str,
2360 int tlv_len, int curr_offset, struct tel_sat_remote_entity_address *remote_address_obj,
2361 int* consumed_data_len)
2364 int len_of_len = 0, remote_data_len = 0;
2365 unsigned char* src_data;
2367 if(tlv_str == NULL || consumed_data_len == NULL || remote_address_obj == NULL) {
2368 dbg("[SAT] SAT PARSER - tlv_str == NULL || consumed_data_len == NULL || remote_address_obj == NULL");
2369 return TCORE_SAT_ERROR_FATAL;
2372 if(tlv_len <= (curr_offset+1)) {
2373 dbg("[SAT] SAT PARSER - incorrect length original_command_len=%d", tlv_len);
2374 return TCORE_SAT_COMMAND_NOT_UNDERSTOOD;
2378 temp_index = curr_offset;
2379 src_data = &tlv_str[0];
2380 if((src_data[temp_index]&0x7F) != SATK_REMOTE_ENTITY_ADDRESS_TAG){
2381 dbg("[SAT] SAT PARSER - tag not found.=%d",src_data[temp_index]);
2382 return TCORE_SAT_COMMAND_NOT_UNDERSTOOD;
2386 len_of_len = _get_length_filed_size(src_data[temp_index]);
2388 err("[SAT] parser: invalid length.");
2389 return TCORE_SAT_COMMAND_NOT_UNDERSTOOD;
2392 remote_data_len = src_data[temp_index+len_of_len-1];
2393 dbg("[SAT] parser: remote_data_len=%d",remote_data_len);
2394 temp_index += len_of_len;
2397 switch(src_data[temp_index++]){
2398 case REMOTE_ENTITY_ADDR_CODING_TYPE_IEEE802_48BIT:
2399 remote_address_obj->coding_type = REMOTE_ENTITY_ADDR_CODING_TYPE_IEEE802_48BIT;
2401 case REMOTE_ENTITY_ADDR_CODING_TYPE_IRDA_32BIT:
2402 remote_address_obj->coding_type = REMOTE_ENTITY_ADDR_CODING_TYPE_IRDA_32BIT;
2405 remote_address_obj->coding_type =REMOTE_ENTITY_ADDR_CODING_TYPE_RESERVED;
2409 remote_address_obj->length = remote_data_len - 1;
2410 memcpy(remote_address_obj->remote_entity_address, &src_data[temp_index], remote_address_obj->length);
2412 *consumed_data_len = 1+len_of_len+remote_data_len;
2413 return TCORE_SAT_SUCCESS;
2416 static enum tcore_sat_result _sat_decode_network_access_name_tlv(unsigned char* tlv_str,
2417 int tlv_len, int curr_offset, struct tel_sat_network_access_name *access_name_obj,
2418 int* consumed_data_len)
2420 int temp_index, idx, name_idx, name_length;
2421 unsigned char* src_data;
2423 if(tlv_str == NULL || consumed_data_len == NULL || access_name_obj == NULL) {
2424 dbg("[SAT] SAT PARSER - tlv_str == NULL || consumed_data_len == NULL || access_name_obj == NULL");
2425 return TCORE_SAT_ERROR_FATAL;
2428 if(tlv_len <= (curr_offset+1)) {
2429 dbg("[SAT] SAT PARSER - incorrect length original_command_len=%d", tlv_len);
2430 return TCORE_SAT_COMMAND_NOT_UNDERSTOOD;
2434 temp_index = curr_offset;
2435 src_data = &tlv_str[0];
2436 if((src_data[temp_index++]&0x7F) != SATK_NETWORK_ACCESS_TAG) {
2437 dbg("[SAT] SAT PARSER - network access name tag missing.");
2438 return TCORE_SAT_COMMAND_NOT_UNDERSTOOD; //send TR
2442 name_length = src_data[temp_index++];
2443 if((temp_index+name_length) > tlv_len) {
2444 dbg("[SAT] SAT PARSER - incorrect cmd len, expected len = %d, orig_len=%d", (temp_index+name_length),tlv_len);
2445 return TCORE_SAT_COMMAND_NOT_UNDERSTOOD;
2448 access_name_obj->length = name_length;
2449 if(access_name_obj->length > SAT_NET_ACC_NAM_LEN_MAX){
2450 dbg("[SAT] SAT PARSER - network access name is longer than capability");
2451 return TCORE_SAT_BEYOND_ME_CAPABILITY;
2455 for(idx = 0; idx < access_name_obj->length; idx++){
2456 dbg("data (%c) Bool(%d)",src_data[temp_index], g_ascii_isalpha(src_data[temp_index]) );
2458 if( g_ascii_isalpha(src_data[temp_index]) ){
2459 access_name_obj->network_access_name[name_idx] = src_data[temp_index];
2464 if(src_data[temp_index] == 0x02){//02 convert to "."
2465 access_name_obj->network_access_name[name_idx] = '.';
2472 //network access name
2473 dbg("network access name(%s)", access_name_obj->network_access_name);
2475 *consumed_data_len = 2+name_length;
2476 return TCORE_SAT_SUCCESS;
2479 static enum tcore_sat_result _sat_decode_text_attribute_tlv(unsigned char* tlv_str,
2480 int tlv_len, int curr_offset, struct tel_sat_text_attribute *text_attribute_obj,
2481 int* consumed_data_len)
2483 int temp_index, length;
2484 unsigned char* src_data;
2486 if(tlv_str == NULL || consumed_data_len == NULL || text_attribute_obj == NULL) {
2487 dbg("[SAT] SAT PARSER - tlv_str == NULL || consumed_data_len == NULL || text_attribute_obj == NULL");
2488 return TCORE_SAT_ERROR_FATAL;
2491 if(tlv_len <= (curr_offset+1)) {
2492 dbg("[SAT] SAT PARSER - incorrect length original_command_len=%d", tlv_len);
2493 return TCORE_SAT_COMMAND_NOT_UNDERSTOOD;
2497 temp_index = curr_offset;
2498 src_data = &tlv_str[0];
2499 if((src_data[temp_index++]&0x7F) != SATK_TEXT_ATTRIBUTE_TAG) {
2500 dbg("[SAT] SAT PARSER - text attribute tag is missing");
2501 return TCORE_SAT_COMMAND_NOT_UNDERSTOOD; //send TR
2505 length = src_data[temp_index++];
2506 if((temp_index+length) > tlv_len) {
2507 dbg("[SAT] SAT PARSER - incorrect cmd len, expected len = %d, orig_len=%d", (temp_index+length),tlv_len);
2508 return TCORE_SAT_COMMAND_NOT_UNDERSTOOD;
2512 text_attribute_obj->b_txt_attr = TRUE;
2513 memcpy(text_attribute_obj->text_formatting, &src_data[temp_index], length);
2515 *consumed_data_len = 2+length;
2516 return TCORE_SAT_SUCCESS;
2519 //decode proactive cmd
2520 //6.4.1 DISPLAY TEXT
2521 static enum tcore_sat_result _sat_decode_display_text(unsigned char* o_cmd_data, int o_length,
2522 int curr_offset, struct tcore_sat_proactive_command *sat_cmd_ind_data)
2525 int tlv_length = 0, remain_len = 0, expected_len = 0;
2526 int data_len_consumed=0;
2527 unsigned char dev_id[4];
2528 unsigned char* cmd_data = NULL;
2529 enum tcore_sat_result rv = TCORE_SAT_SUCCESS;
2531 if(o_cmd_data == NULL){
2532 dbg("[SAT] SAT PARSER - o_cmd_data == NULL");
2533 return TCORE_SAT_ERROR_FATAL;
2536 cmd_data = &o_cmd_data[0];
2537 tlv_length = cmd_data[curr_offset-1];
2538 temp_index = curr_offset+2;
2539 sat_cmd_ind_data->data.display_text.command_detail.cmd_num = cmd_data[temp_index++];
2540 sat_cmd_ind_data->data.display_text.command_detail.cmd_type = cmd_data[temp_index++];
2542 /* ******decode command qualifier****** */
2543 if (cmd_data[temp_index] & 0x01) {
2544 sat_cmd_ind_data->data.display_text.command_detail.cmd_qualifier.display_text.text_priority =
2546 dbg("[SAT] SAT PARSER - msg_prio=TAPI_SAT_MSG_PRIORITY_HIGH.");
2549 sat_cmd_ind_data->data.display_text.command_detail.cmd_qualifier.display_text.text_priority =
2550 TEXT_PRIORITY_NORMAL;
2551 dbg("[SAT] SAT PARSER - : msg_prio=TAPI_SAT_MSG_PRIORITY_NORMAL.");
2554 if (cmd_data[temp_index] & 0x80) {
2555 sat_cmd_ind_data->data.display_text.command_detail.cmd_qualifier.display_text.text_clear_type =
2556 TEXT_WAIT_FOR_USER_TO_CLEAR_MSG;
2557 dbg("[SAT] SAT PARSER - : msgClear=TAPI_SAT_WAIT_FOR_USER_TO_CLEAR_MSG.");
2560 sat_cmd_ind_data->data.display_text.command_detail.cmd_qualifier.display_text.text_clear_type =
2561 TEXT_AUTO_CLEAR_MSG_AFTER_A_DELAY;
2562 dbg("[SAT] SAT PARSER - msgClear=TAPI_SAT_AUTO_CLEAR_MSG_AFTER_A_DELAY.");
2566 memcpy(dev_id,&cmd_data[temp_index],4);
2567 rv = _sat_decode_device_identities_tlv(dev_id, &sat_cmd_ind_data->data.display_text.device_id);
2568 if(rv != TCORE_SAT_SUCCESS)
2571 temp_index+=4; // device identities consumes 4 bytes.
2573 remain_len = o_length-temp_index;
2574 expected_len = tlv_length-5-4;
2575 if(remain_len!=expected_len){
2576 dbg("[SAT] SAT PARSER - : mismatch!! remain_len=%d, expected_len=%d", remain_len, expected_len);
2577 return TCORE_SAT_COMMAND_NOT_UNDERSTOOD;
2580 rv = _sat_decode_text_tlv(o_cmd_data, o_length, temp_index, &sat_cmd_ind_data->data.display_text.text, &data_len_consumed);
2581 if(rv != TCORE_SAT_SUCCESS)
2584 if(sat_cmd_ind_data->data.display_text.text.string_length <= 0){
2585 err("[SAT] SAT PARSER - :string length is 0");
2586 return TCORE_SAT_COMMAND_NOT_UNDERSTOOD;
2589 dbg("[SAT] SAT PARSER text(%s)",sat_cmd_ind_data->data.display_text.text.string);
2590 dbg("[SAT] SAT PARSER o_len(%d) temp_index(%d) data_len_consumed(%d)",o_length , temp_index, data_len_consumed);
2592 if(o_length-temp_index < data_len_consumed){
2593 dbg("[SAT] SAT PARSER - :wrong text TLV.");
2594 return TCORE_SAT_COMMAND_NOT_UNDERSTOOD;
2597 if(o_length-temp_index == data_len_consumed){
2598 dbg("[SAT] SAT PARSER - :no more TLVs to decode.");
2599 return TCORE_SAT_SUCCESS;
2601 temp_index+=data_len_consumed; //temp_index pointing to the Tag of next TLV
2604 if((cmd_data[temp_index]&0x7F) == SATK_ICON_IDENTIFIER_TAG){
2605 rv = _sat_decode_icon_identifier_tlv(o_cmd_data, o_length, temp_index, &sat_cmd_ind_data->data.display_text.icon_id, &data_len_consumed);
2607 if(rv != TCORE_SAT_SUCCESS){
2608 return rv; //SEND TR
2611 if(o_length-temp_index == data_len_consumed){
2612 dbg("[SAT] SAT PARSER - :no more TLVs to decode.");
2613 return TCORE_SAT_SUCCESS;
2615 temp_index+=data_len_consumed; //temp_index pointing to the Tag of next TLV
2618 //immediate response
2619 sat_cmd_ind_data->data.display_text.immediate_response_requested = FALSE;
2620 if((cmd_data[temp_index]&0x7F) == SATK_IMMEDIATE_RESPONSE_TAG){
2621 data_len_consumed = 2;
2622 dbg("[SAT] SAT PARSER - :immediate response required.");
2623 sat_cmd_ind_data->data.display_text.immediate_response_requested = TRUE;
2624 if(o_length-temp_index == data_len_consumed){
2625 dbg("[SAT] SAT PARSER - :no more TLVs to decode.");
2626 return TCORE_SAT_SUCCESS;
2628 temp_index+=data_len_consumed; //temp_index pointing to the Tag of next TLV
2631 //time duration - optional
2632 if((cmd_data[temp_index]&0x7F)==SATK_DURATION_TAG){
2633 rv =_sat_decode_duration_tlv(o_cmd_data, o_length, temp_index, &sat_cmd_ind_data->data.display_text.duration, &data_len_consumed);
2634 if(rv != TCORE_SAT_SUCCESS){
2635 return rv; //SEND TR
2638 if(o_length-temp_index == data_len_consumed){
2639 dbg("[SAT] SAT PARSER - :no more TLVs to decode.");
2640 return TCORE_SAT_SUCCESS;
2642 temp_index+=data_len_consumed; //temp_index pointing to the Tag of next TLV
2645 //text attribute - optional
2646 if((cmd_data[temp_index]&0x7F)==SATK_TEXT_ATTRIBUTE_TAG){
2647 rv =_sat_decode_text_attribute_tlv(o_cmd_data, o_length, temp_index, &sat_cmd_ind_data->data.display_text.text_attribute, &data_len_consumed);
2648 if(rv != TCORE_SAT_SUCCESS){
2649 return rv; //SEND TR
2652 if(o_length-temp_index == data_len_consumed){
2653 dbg("[SAT] SAT PARSER - :no more TLVs to decode.");
2654 return TCORE_SAT_SUCCESS;
2656 temp_index+=data_len_consumed; //temp_index pointing to the Tag of next TLV
2659 if(o_length > temp_index){
2660 dbg("[SAT] SAT PARSER - : wrong text TLV, remaining data is found!!");
2661 return TCORE_SAT_COMMAND_NOT_UNDERSTOOD;
2664 dbg("[SAT] SAT PARSER - :decoding done!.");
2665 return TCORE_SAT_SUCCESS;
2669 static enum tcore_sat_result _sat_decode_get_inkey(unsigned char* o_cmd_data, int o_length,
2670 int curr_offset, struct tcore_sat_proactive_command *sat_cmd_ind_data)
2673 int tlv_length = 0, remain_len = 0, expected_len = 0;
2674 int data_len_consumed=0;
2675 unsigned char dev_id[4];
2676 unsigned char* cmd_data = NULL;
2677 enum tcore_sat_result rv = TCORE_SAT_SUCCESS;
2679 if(o_cmd_data == NULL){
2680 dbg("[SAT] SAT PARSER - o_cmd_data == NULL");
2681 return TCORE_SAT_ERROR_FATAL;
2684 cmd_data = &o_cmd_data[0];
2685 tlv_length = cmd_data[curr_offset-1];
2686 temp_index = curr_offset+2;
2687 sat_cmd_ind_data->data.get_inkey.command_detail.cmd_num = cmd_data[temp_index++];
2688 sat_cmd_ind_data->data.get_inkey.command_detail.cmd_type = cmd_data[temp_index++];
2690 /* ******decode command qualifier****** */
2691 if (cmd_data[temp_index] & 0x01) {
2692 sat_cmd_ind_data->data.get_inkey.command_detail.cmd_qualifier.get_inkey.alphabet_set = TRUE;
2693 dbg("[SAT] SAT PARSER - Alphabet set");
2696 if(cmd_data[temp_index]&0x02){
2697 sat_cmd_ind_data->data.get_inkey.command_detail.cmd_qualifier.get_inkey.alphabet_type = INPUT_ALPHABET_TYPE_UCS2;
2698 dbg("[SAT] SAT PARSER - INPUT_ALPHABET_TYPE_UCS2");
2701 sat_cmd_ind_data->data.get_inkey.command_detail.cmd_qualifier.get_inkey.alphabet_type = INPUT_ALPHABET_TYPE_SMS_DEFAULT;
2702 dbg("[SAT] SAT PARSER - INPUT_ALPHABET_TYPE_SMS_DEFAULT");
2705 if(cmd_data[temp_index]&0x04){
2706 sat_cmd_ind_data->data.get_inkey.command_detail.cmd_qualifier.get_inkey.inkey_type = INKEY_TYPE_YES_NO_REQUESTED;
2707 dbg("[SAT] SAT PARSER - INKEY_TYPE_YES_NO_REQUESTED");
2710 sat_cmd_ind_data->data.get_inkey.command_detail.cmd_qualifier.get_inkey.inkey_type = INKEY_TYPE_CHARACTER_SET_ENABLED;
2711 dbg("[SAT] SAT PARSER - INKEY_TYPE_YES_NO_REQUESTED");
2714 if(cmd_data[temp_index]&0x08){
2715 sat_cmd_ind_data->data.get_inkey.command_detail.cmd_qualifier.get_inkey.immediate_rsp_required = TRUE;
2716 dbg("[SAT] SAT PARSER - immediate response requested");
2719 if (cmd_data[temp_index] & 0x80) {
2720 sat_cmd_ind_data->data.get_inkey.command_detail.cmd_qualifier.get_inkey.help_info = TRUE;
2721 dbg("[SAT] SAT PARSER - Help info");
2726 memcpy(dev_id,&cmd_data[temp_index],4);
2727 rv = _sat_decode_device_identities_tlv(dev_id, &sat_cmd_ind_data->data.get_inkey.device_id);
2728 if(rv != TCORE_SAT_SUCCESS)
2734 remain_len = o_length-temp_index;
2735 expected_len = tlv_length-5-4;
2736 if(remain_len!=expected_len){
2737 dbg("[SAT] SAT PARSER - : mismatch!! remain_len=%d, expected_len=%d", remain_len, expected_len);
2738 return TCORE_SAT_COMMAND_NOT_UNDERSTOOD;
2741 rv = _sat_decode_text_tlv(o_cmd_data, o_length, temp_index, &sat_cmd_ind_data->data.get_inkey.text, &data_len_consumed);
2742 if(rv != TCORE_SAT_SUCCESS)
2745 if(sat_cmd_ind_data->data.get_inkey.text.string_length <= 0){
2746 err("[SAT] SAT PARSER - :string length is 0");
2747 return TCORE_SAT_COMMAND_NOT_UNDERSTOOD;
2750 dbg("[SAT] SAT PARSER text(%s)",sat_cmd_ind_data->data.get_inkey.text.string);
2751 dbg("[SAT] SAT PARSER o_len(%d) temp_index(%d) data_len_consumed(%d)",o_length , temp_index, data_len_consumed);
2753 if(o_length-temp_index < data_len_consumed){
2754 dbg("[SAT] SAT PARSER - :wrong text TLV.");
2755 return TCORE_SAT_COMMAND_NOT_UNDERSTOOD;
2758 if(o_length-temp_index == data_len_consumed){
2759 dbg("[SAT] SAT PARSER - :no more TLVs to decode.");
2760 return TCORE_SAT_SUCCESS;
2762 temp_index+=data_len_consumed; //temp_index pointing to the Tag of next TLV
2764 //icon identifier - optional
2765 if((cmd_data[temp_index]&0x7F) == SATK_ICON_IDENTIFIER_TAG){
2766 rv = _sat_decode_icon_identifier_tlv(o_cmd_data, o_length, temp_index, &sat_cmd_ind_data->data.get_inkey.icon_id, &data_len_consumed);
2768 if(rv != TCORE_SAT_SUCCESS){
2769 return rv; //SEND TR
2772 if(o_length-temp_index == data_len_consumed){
2773 dbg("[SAT] SAT PARSER - :no more TLVs to decode.");
2774 return TCORE_SAT_SUCCESS;
2776 temp_index+=data_len_consumed; //temp_index pointing to the Tag of next TLV
2779 //time duration - optional
2780 if((cmd_data[temp_index]&0x7F)==SATK_DURATION_TAG){
2781 rv =_sat_decode_duration_tlv(o_cmd_data, o_length, temp_index, &sat_cmd_ind_data->data.get_inkey.duration, &data_len_consumed);
2782 if(rv != TCORE_SAT_SUCCESS){
2783 return rv; //SEND TR
2786 if(o_length-temp_index == data_len_consumed){
2787 dbg("[SAT] SAT PARSER - :no more TLVs to decode.");
2788 return TCORE_SAT_SUCCESS;
2790 temp_index+=data_len_consumed; //temp_index pointing to the Tag of next TLV
2793 //text attribute - optional
2794 if((cmd_data[temp_index]&0x7F)==SATK_TEXT_ATTRIBUTE_TAG){
2795 rv =_sat_decode_text_attribute_tlv(o_cmd_data, o_length, temp_index, &sat_cmd_ind_data->data.get_inkey.text_attribute, &data_len_consumed);
2796 if(rv != TCORE_SAT_SUCCESS){
2797 return rv; //SEND TR
2800 if(o_length-temp_index == data_len_consumed){
2801 dbg("[SAT] SAT PARSER - :no more TLVs to decode.");
2802 return TCORE_SAT_SUCCESS;
2804 temp_index+=data_len_consumed; //temp_index pointing to the Tag of next TLV
2807 if(o_length > temp_index){
2808 dbg("[SAT] SAT PARSER - : wrong text TLV, remaining data is found!!");
2809 return TCORE_SAT_COMMAND_NOT_UNDERSTOOD;
2812 dbg("[SAT] SAT PARSER - :decoding done!.");
2813 return TCORE_SAT_SUCCESS;
2817 static enum tcore_sat_result _sat_decode_get_input(unsigned char* o_cmd_data, int o_length,
2818 int curr_offset, struct tcore_sat_proactive_command *sat_cmd_ind_data)
2821 int tlv_length = 0, remain_len = 0, expected_len = 0;
2822 int data_len_consumed=0;
2823 unsigned char dev_id[4];
2824 unsigned char* cmd_data = NULL;
2825 enum tcore_sat_result rv = TCORE_SAT_SUCCESS;
2827 if(o_cmd_data == NULL){
2828 dbg("[SAT] SAT PARSER - o_cmd_data == NULL");
2829 return TCORE_SAT_ERROR_FATAL;
2832 cmd_data = &o_cmd_data[0];
2833 tlv_length = cmd_data[curr_offset-1];
2834 temp_index = curr_offset+2;
2835 sat_cmd_ind_data->data.get_input.command_detail.cmd_num = cmd_data[temp_index++];
2836 sat_cmd_ind_data->data.get_input.command_detail.cmd_type = cmd_data[temp_index++];
2838 /* ******decode command qualifier****** */
2839 if (cmd_data[temp_index] & 0x01) {
2840 sat_cmd_ind_data->data.get_input.command_detail.cmd_qualifier.get_input.alphabet_set = TRUE;
2841 dbg("[SAT] SAT PARSER - Alphabet set");
2844 sat_cmd_ind_data->data.get_input.command_detail.cmd_qualifier.get_input.alphabet_set = FALSE;
2845 dbg("[SAT] SAT PARSER - Numeric info");
2848 if(cmd_data[temp_index]&0x02){
2849 sat_cmd_ind_data->data.get_input.command_detail.cmd_qualifier.get_input.alphabet_type = INPUT_ALPHABET_TYPE_UCS2;
2850 dbg("[SAT] SAT PARSER - INPUT_ALPHABET_TYPE_UCS2");
2853 sat_cmd_ind_data->data.get_input.command_detail.cmd_qualifier.get_input.alphabet_type = INPUT_ALPHABET_TYPE_SMS_DEFAULT;
2854 dbg("[SAT] SAT PARSER - INPUT_ALPHABET_TYPE_SMS_DEFAULT");
2857 if(cmd_data[temp_index]&0x04){
2858 sat_cmd_ind_data->data.get_input.command_detail.cmd_qualifier.get_input.me_echo_user_input = FALSE;
2859 dbg("[SAT] SAT PARSER - user input not be revealed");
2862 sat_cmd_ind_data->data.get_input.command_detail.cmd_qualifier.get_input.me_echo_user_input = TRUE;
2863 dbg("[SAT] SAT PARSER - Me echo user input");
2866 if(cmd_data[temp_index]&0x08){
2867 sat_cmd_ind_data->data.get_input.command_detail.cmd_qualifier.get_input.user_input_unpacked_format = FALSE;
2868 dbg("[SAT] SAT PARSER - packing required");
2871 sat_cmd_ind_data->data.get_input.command_detail.cmd_qualifier.get_input.user_input_unpacked_format = TRUE;
2872 dbg("[SAT] SAT PARSER - unpacked format");
2875 if (cmd_data[temp_index] & 0x80) {
2876 sat_cmd_ind_data->data.get_input.command_detail.cmd_qualifier.get_input.help_info = TRUE;
2877 dbg("[SAT] SAT PARSER - Help info");
2882 memcpy(dev_id,&cmd_data[temp_index],4);
2883 rv = _sat_decode_device_identities_tlv(dev_id, &sat_cmd_ind_data->data.get_input.device_id);
2884 if(rv != TCORE_SAT_SUCCESS)
2890 remain_len = o_length-temp_index;
2891 expected_len = tlv_length-5-4;
2892 if(remain_len!=expected_len){
2893 dbg("[SAT] SAT PARSER - : mismatch!! remain_len=%d, expected_len=%d", remain_len, expected_len);
2894 return TCORE_SAT_COMMAND_NOT_UNDERSTOOD;
2897 rv = _sat_decode_text_tlv(o_cmd_data, o_length, temp_index, &sat_cmd_ind_data->data.get_input.text, &data_len_consumed);
2898 if(rv != TCORE_SAT_SUCCESS)
2901 if(sat_cmd_ind_data->data.get_input.text.string_length <= 0){
2902 err("[SAT] SAT PARSER - :string length is 0");
2904 dbg("[SAT] SAT PARSER text(%s)",sat_cmd_ind_data->data.get_input.text.string);
2905 dbg("[SAT] SAT PARSER o_len(%d) temp_index(%d) data_len_consumed(%d)",o_length , temp_index, data_len_consumed);
2907 if(o_length-temp_index < data_len_consumed){
2908 dbg("[SAT] SAT PARSER - :wrong text TLV.");
2909 return TCORE_SAT_COMMAND_NOT_UNDERSTOOD;
2912 if(o_length-temp_index == data_len_consumed){
2913 dbg("[SAT] SAT PARSER - :no more TLVs to decode.");
2914 return TCORE_SAT_SUCCESS;
2916 temp_index+=data_len_consumed; //temp_index pointing to the Tag of next TLV
2918 //response length - mandatory
2919 rv = _sat_decode_response_length_tlv(o_cmd_data, o_length, temp_index, &sat_cmd_ind_data->data.get_input.rsp_len, &data_len_consumed);
2920 if(rv != TCORE_SAT_SUCCESS)
2923 if(o_length-temp_index == data_len_consumed){
2924 dbg("[SAT] SAT PARSER - :no more TLVs to decode.");
2925 return TCORE_SAT_SUCCESS;
2927 temp_index+=data_len_consumed; //temp_index pointing to the Tag of next TLV
2929 //default text - optional
2930 if((o_cmd_data[temp_index]&0x7F) == SATK_DEFAULT_TEXT_TAG){
2931 rv = _sat_decode_text_tlv(o_cmd_data, o_length, temp_index, &sat_cmd_ind_data->data.get_input.default_text, &data_len_consumed);
2932 if(rv != TCORE_SAT_SUCCESS)
2935 if(sat_cmd_ind_data->data.get_input.default_text.string_length <= 0){
2936 err("[SAT] SAT PARSER - :string length is 0");
2938 dbg("[SAT] SAT PARSER default text(%s)",sat_cmd_ind_data->data.get_input.default_text.string);
2939 if(o_length-temp_index == data_len_consumed){
2940 dbg("[SAT] SAT PARSER - :no more TLVs to decode.");
2941 return TCORE_SAT_SUCCESS;
2943 temp_index+=data_len_consumed; //temp_index pointing to the Tag of next TLV
2947 if((cmd_data[temp_index]&0x7F) == SATK_ICON_IDENTIFIER_TAG){
2948 rv = _sat_decode_icon_identifier_tlv(o_cmd_data, o_length, temp_index, &sat_cmd_ind_data->data.get_input.icon_id, &data_len_consumed);
2950 if(rv != TCORE_SAT_SUCCESS){
2951 return rv; //SEND TR
2954 if(o_length-temp_index == data_len_consumed){
2955 dbg("[SAT] SAT PARSER - :no more TLVs to decode.");
2956 return TCORE_SAT_SUCCESS;
2958 temp_index+=data_len_consumed; //temp_index pointing to the Tag of next TLV
2961 //text attribute - optional
2962 if((cmd_data[temp_index]&0x7F)==SATK_TEXT_ATTRIBUTE_TAG){
2963 rv =_sat_decode_text_attribute_tlv(o_cmd_data, o_length, temp_index, &sat_cmd_ind_data->data.get_input.text_attribute, &data_len_consumed);
2964 if(rv != TCORE_SAT_SUCCESS){
2965 return rv; //SEND TR
2968 if(o_length-temp_index == data_len_consumed){
2969 dbg("[SAT] SAT PARSER - :no more TLVs to decode.");
2970 return TCORE_SAT_SUCCESS;
2972 temp_index+=data_len_consumed; //temp_index pointing to the Tag of next TLV
2975 if(o_length > temp_index){
2976 dbg("[SAT] SAT PARSER - : wrong text TLV, remaining data is found!!");
2977 return TCORE_SAT_COMMAND_NOT_UNDERSTOOD;
2980 dbg("[SAT] SAT PARSER - :decoding done!.");
2981 return TCORE_SAT_SUCCESS;
2985 static enum tcore_sat_result _sat_decode_more_time(unsigned char* o_cmd_data, int o_length,
2986 int curr_offset, struct tcore_sat_proactive_command *sat_cmd_ind_data)
2989 unsigned char dev_id[4];
2990 unsigned char* cmd_data = NULL;
2991 enum tcore_sat_result rv = TCORE_SAT_SUCCESS;
2993 if(o_cmd_data == NULL){
2994 dbg("[SAT] SAT PARSER - o_cmd_data == NULL");
2995 return TCORE_SAT_ERROR_FATAL;
2999 cmd_data = &o_cmd_data[0];
3000 temp_index = curr_offset+2;
3001 sat_cmd_ind_data->data.setup_event_list.command_detail.cmd_num = cmd_data[temp_index++];
3002 sat_cmd_ind_data->data.setup_event_list.command_detail.cmd_type = cmd_data[temp_index++];
3006 memcpy(dev_id,&cmd_data[temp_index],4);
3007 rv = _sat_decode_device_identities_tlv(dev_id, &sat_cmd_ind_data->data.setup_event_list.device_id);
3008 if(rv != TCORE_SAT_SUCCESS)
3012 dbg("[SAT] SAT PARSER - :decoding done!.");
3013 return TCORE_SAT_SUCCESS;
3017 static enum tcore_sat_result _sat_decode_play_tone(unsigned char* o_cmd_data, int o_length,
3018 int curr_offset, struct tcore_sat_proactive_command *sat_cmd_ind_data)
3020 int temp_index = 0, data_len_consumed = 0;
3021 unsigned char dev_id[4];
3022 unsigned char* cmd_data = NULL;
3023 enum tcore_sat_result rv = TCORE_SAT_SUCCESS;
3025 if(o_cmd_data == NULL){
3026 dbg("[SAT] SAT PARSER - o_cmd_data == NULL");
3027 return TCORE_SAT_ERROR_FATAL;
3031 cmd_data = &o_cmd_data[0];
3032 temp_index = curr_offset+2;
3033 sat_cmd_ind_data->data.play_tone.command_detail.cmd_num = cmd_data[temp_index++];
3034 sat_cmd_ind_data->data.play_tone.command_detail.cmd_type = cmd_data[temp_index++];
3036 /* ******decode command qualifier****** */
3037 if (cmd_data[temp_index] & 0x01)
3038 sat_cmd_ind_data->data.play_tone.command_detail.cmd_qualifier.play_tone.vibration_alert = VIBRATE_ALERT_REQUIRED;
3040 sat_cmd_ind_data->data.play_tone.command_detail.cmd_qualifier.play_tone.vibration_alert = VIBRATE_ALERT_OPTIONAL;
3044 memcpy(dev_id,&cmd_data[temp_index],4);
3045 rv = _sat_decode_device_identities_tlv(dev_id, &sat_cmd_ind_data->data.play_tone.device_id);
3046 if(rv != TCORE_SAT_SUCCESS)
3049 //alpha id - optional
3051 if((cmd_data[temp_index]&0x7F) == SATK_ALPHA_IDENTIFIER_TAG){
3052 rv = _sat_decode_alpha_identifier_tlv(o_cmd_data, o_length, temp_index, &sat_cmd_ind_data->data.play_tone.alpha_id, &data_len_consumed);
3053 if(rv != TCORE_SAT_SUCCESS) {
3057 temp_index+=data_len_consumed;
3058 if(temp_index >= o_length){
3059 dbg("[SAT] SAT PARSER - no more TLVs to decode.");
3060 dbg("[SAT] SAT PARSER - default value is set - tone type, duration");
3061 sat_cmd_ind_data->data.play_tone.tone.tone_type = GENERAL_BEEP;
3062 sat_cmd_ind_data->data.play_tone.duration.time_unit = TIME_UNIT_SECONDS;
3063 sat_cmd_ind_data->data.play_tone.duration.time_interval = 2;
3064 return TCORE_SAT_SUCCESS;
3069 if((cmd_data[temp_index]&0x7F) == SATK_TONE_TAG){
3070 rv = _sat_decode_tone_tlv(o_cmd_data, o_length, temp_index, &sat_cmd_ind_data->data.play_tone.tone, &data_len_consumed);
3071 if(rv != TCORE_SAT_SUCCESS) {
3074 temp_index+=data_len_consumed;
3077 sat_cmd_ind_data->data.play_tone.tone.tone_type = GENERAL_BEEP;
3080 //time duration - optional
3081 if((cmd_data[temp_index]&0x7F)==SATK_DURATION_TAG){
3082 rv =_sat_decode_duration_tlv(o_cmd_data, o_length, temp_index, &sat_cmd_ind_data->data.play_tone.duration, &data_len_consumed);
3083 if(rv != TCORE_SAT_SUCCESS){
3084 return rv; //SEND TR
3087 temp_index+=data_len_consumed;
3088 if(temp_index >= o_length){
3089 dbg("[SAT] SAT PARSER - no more TLVs to decode.");
3090 return TCORE_SAT_SUCCESS;
3094 dbg("[SAT] SAT PARSER - Duration TLV not present, ME should use a default value.");
3095 sat_cmd_ind_data->data.play_tone.duration.time_unit = TIME_UNIT_SECONDS;
3096 sat_cmd_ind_data->data.play_tone.duration.time_interval = 2;
3100 if((cmd_data[temp_index]&0x7F) == SATK_ICON_IDENTIFIER_TAG){
3101 data_len_consumed = 0;
3102 rv = _sat_decode_icon_identifier_tlv(o_cmd_data, o_length, temp_index, &sat_cmd_ind_data->data.play_tone.icon_id, &data_len_consumed);
3104 if(rv != TCORE_SAT_SUCCESS){
3105 return TCORE_SAT_COMMAND_NOT_UNDERSTOOD; //SEND TR
3108 if(temp_index+data_len_consumed >= o_length){
3109 dbg("[SAT] SAT PARSER - no more TLVs to decode.");
3110 return TCORE_SAT_SUCCESS;
3113 temp_index+=data_len_consumed; //temp_index pointing to the Tag of next TLV
3116 //text attribute - optional
3117 if((cmd_data[temp_index]&0x7F)==SATK_TEXT_ATTRIBUTE_TAG){
3118 rv =_sat_decode_text_attribute_tlv(o_cmd_data, o_length, temp_index, &sat_cmd_ind_data->data.play_tone.text_attribute, &data_len_consumed);
3119 if(rv != TCORE_SAT_SUCCESS){
3120 return rv; //SEND TR
3123 if(temp_index+data_len_consumed >= o_length){
3124 dbg("[SAT] SAT PARSER - no more TLVs to decode.");
3125 return TCORE_SAT_SUCCESS;
3128 temp_index+=data_len_consumed; //temp_index pointing to the Tag of next TLV
3133 dbg("[SAT] SAT PARSER - :decoding done!.");
3134 return TCORE_SAT_SUCCESS;
3138 static enum tcore_sat_result _sat_decode_refresh(unsigned char* o_cmd_data, int o_length,
3139 int curr_offset, struct tcore_sat_proactive_command *sat_cmd_ind_data)
3141 int temp_index = 0, data_len_consumed = 0;
3142 unsigned char dev_id[4];
3143 unsigned char* cmd_data = NULL;
3144 enum tcore_sat_result rv = TCORE_SAT_SUCCESS;
3146 if(o_cmd_data == NULL){
3147 dbg("[SAT] SAT PARSER - o_cmd_data == NULL");
3148 return TCORE_SAT_ERROR_FATAL;
3152 cmd_data = &o_cmd_data[0];
3153 temp_index = curr_offset+2;
3154 sat_cmd_ind_data->data.refresh.command_detail.cmd_num = cmd_data[temp_index++];
3155 sat_cmd_ind_data->data.refresh.command_detail.cmd_type = cmd_data[temp_index++];
3157 /* ******decode command qualifier****** */
3158 switch(cmd_data[temp_index]){
3159 case SIM_REFRESH_CMD_INIT_AND_FULL_FCN:
3160 case SIM_REFRESH_CMD_FCN:
3161 case SIM_REFRESH_CMD_INIT_AND_FCN:
3162 case SIM_REFRESH_CMD_INIT :
3163 case SIM_REFRESH_CMD_RESET:
3164 sat_cmd_ind_data->data.refresh.command_detail.cmd_qualifier.refresh.refresh = cmd_data[temp_index];
3165 dbg("[SAT] SAT PARSER - : refresh mode=[0x%02x]:0-init&FFCN, 1-FCN, 2-init&FCN, 3-init, 4-reset", cmd_data[temp_index]);
3168 case SIM_REFRESH_CMD_3G_APPLICATION_RESET:
3169 case SIM_REFRESH_CMD_3G_SESSION_RESET:
3170 case SIM_REFRESH_CMD_RESERVED:
3172 dbg("[SAT] SAT PARSER - : refresh mode=0x%02x Not Supported", cmd_data[temp_index]);
3173 return TCORE_SAT_BEYOND_ME_CAPABILITY;
3179 memcpy(dev_id,&cmd_data[temp_index],4);
3180 rv = _sat_decode_device_identities_tlv(dev_id, &sat_cmd_ind_data->data.refresh.device_id);
3181 if(rv != TCORE_SAT_SUCCESS)
3186 if( (sat_cmd_ind_data->data.refresh.command_detail.cmd_qualifier.refresh.refresh == SIM_REFRESH_CMD_FCN)
3187 || (sat_cmd_ind_data->data.refresh.command_detail.cmd_qualifier.refresh.refresh == SIM_REFRESH_CMD_INIT_AND_FCN) ){
3189 rv = _sat_decode_file_list_tlv(o_cmd_data, o_length, temp_index, &sat_cmd_ind_data->data.refresh.file_list, &data_len_consumed);
3190 if(rv != TCORE_SAT_SUCCESS)
3194 sat_cmd_ind_data->data.refresh.file_list.file_count = 0;
3196 dbg("[SAT] SAT PARSER - :decoding done!.");
3197 return TCORE_SAT_SUCCESS;
3201 static enum tcore_sat_result _sat_decode_setup_menu(unsigned char* tlv_str, int tlv_len,
3202 int curr_offset, struct tcore_sat_proactive_command *pactive_cmd_ind_obj)
3205 int data_len_consumed=0;
3206 unsigned char dev_id[4];
3207 unsigned char* src_data;
3208 enum tcore_sat_result rv = TCORE_SAT_SUCCESS;
3210 //access command detail
3211 temp_index = curr_offset+2; //move the temp_index to command detail info +2(tag and length)
3212 src_data = &tlv_str[0];
3214 // In this time, the point of temp_index is COMMAND NUMBER
3215 // [1] insert command detail information into each proactive command data structure.
3216 pactive_cmd_ind_obj->data.setup_menu.command_detail.cmd_num = src_data[temp_index++];
3217 pactive_cmd_ind_obj->data.setup_menu.command_detail.cmd_type = src_data[temp_index++];
3219 // [2] decode COMMAND QUALIFIER
3221 -bit 1: 0 = no selection preference;
3222 1 = selection using soft key preferred.
3223 -bits 2 to 7: = RFU.
3224 -bit 8: 0 = no help information available;
3225 1 = help information available.
3228 //[2-1] selection preference
3229 if (src_data[temp_index] & 0x01) {
3230 pactive_cmd_ind_obj->data.setup_menu.command_detail.cmd_qualifier.setup_menu.select_preference =
3231 SELECTION_PREFERENCE_USING_SOFT_KEY;
3232 dbg("[SAT] SAT PARSER - sel_pref=SAT_SELECTION_PREFERENCE_USING_SOFT_KEY.");
3235 pactive_cmd_ind_obj->data.setup_menu.command_detail.cmd_qualifier.setup_menu.select_preference =
3236 SELECTION_PREFERENCE_NONE_REQUESTED;
3237 dbg("[SAT] SAT PARSER - : sel_pref=SAT_SELECTION_PREFERENCE_NONE_REQUESTED.");
3240 //[2-2] help available
3241 if (src_data[temp_index] & 0x80) {
3242 pactive_cmd_ind_obj->data.setup_menu.command_detail.cmd_qualifier.setup_menu.help_info =
3244 ;dbg("[SAT] SAT PARSER - : is help Available=TRUE.");
3247 pactive_cmd_ind_obj->data.setup_menu.command_detail.cmd_qualifier.setup_menu.help_info =
3249 dbg("[SAT] SAT PARSER - is help Available=FALSE.");
3252 // In this time, the point of temp_index is DEVICE IDENTITIES.
3253 //[3] decode DEVICE IDENTITIES TLV
3255 memcpy(dev_id, &src_data[temp_index], 4);
3256 rv = _sat_decode_device_identities_tlv(dev_id, &pactive_cmd_ind_obj->data.setup_menu.device_id);
3257 if (rv != TCORE_SAT_SUCCESS) {
3258 //send TR in SatkProcessProactiveCmdInd()
3263 // In this time, the point of temp_index is ALPHA IDENTIFIER. 11 or 12.
3264 //[4] decode ALPHA IDENTIFIER TLV
3266 dbg("[SAT] SAT PARSER - :temp_index=%d",temp_index);
3267 rv = _sat_decode_alpha_identifier_tlv(src_data, tlv_len, temp_index,
3268 &pactive_cmd_ind_obj->data.setup_menu.alpha_id, &data_len_consumed);
3269 if(rv != TCORE_SAT_SUCCESS) {
3273 // In this time, the point of temp_index is ITEM TLV
3274 //[5] decode ITEM LIST (at least one is mandatory)
3275 temp_index+= data_len_consumed;
3276 pactive_cmd_ind_obj->data.setup_menu.menu_item_cnt = 0;
3278 data_len_consumed=0;
3279 if((src_data[temp_index]&0x7F) == SATK_ITEM_TAG) {
3280 rv = _sat_decode_item_tlv(src_data, tlv_len, temp_index,
3281 &pactive_cmd_ind_obj->data.setup_menu.menu_item[pactive_cmd_ind_obj->data.setup_menu.menu_item_cnt],
3282 &data_len_consumed);
3284 if(rv != TCORE_SAT_SUCCESS)
3287 if(!pactive_cmd_ind_obj->data.setup_menu.menu_item[0].text_len)
3291 if(pactive_cmd_ind_obj->data.setup_menu.menu_item_cnt == 0) {
3292 dbg("menu item is not exist.");
3293 return TCORE_SAT_REQUIRED_VALUE_MISSING;
3298 pactive_cmd_ind_obj->data.setup_menu.menu_item_cnt++;
3299 temp_index += data_len_consumed;
3301 if(temp_index >= tlv_len)
3303 }while(pactive_cmd_ind_obj->data.setup_menu.menu_item_cnt < SAT_MENU_ITEM_COUNT_MAX);
3305 dbg("[SAT] SAT PARSER - :setup menu item_count=%d",pactive_cmd_ind_obj->data.setup_menu.menu_item_cnt);
3306 if(temp_index >= tlv_len){
3307 dbg("[SAT] SAT PARSER - :no more TLVs to decode.");
3308 //send TR in SatkProcessProactiveCmdInd()
3309 return TCORE_SAT_SUCCESS;
3312 //[6] (optional TLV) decode ITEMS NEXT ACTION INDICATOR TLV
3313 if((src_data[temp_index]&0x7F) == SATK_ITEMS_NEXT_ACTION_INDICATOR_TAG) {
3314 data_len_consumed = 0;
3315 rv = _sat_decode_item_next_action_indicator_tlv(tlv_str, tlv_len, temp_index,
3316 &pactive_cmd_ind_obj->data.setup_menu.next_act_ind_list, &data_len_consumed);
3317 if(rv!=TCORE_SAT_SUCCESS) return rv;
3319 if(temp_index+data_len_consumed >= tlv_len) {
3320 dbg("[SAT] SAT PARSER - no more TLVs to decode.");
3321 //send the data to Noti manager.
3322 return TCORE_SAT_SUCCESS;
3325 temp_index+=data_len_consumed; //temp_index pointing to the Tag of next TLV
3328 dbg("[SAT] SAT PARSER - ITEMS NEXT ACTION INDICATOR TLV Not present");
3331 //[7] (optional TLV) decode ICON IDENTIFIER TLV
3332 if((src_data[temp_index]&0x7F) == SATK_ICON_IDENTIFIER_TAG) {
3333 data_len_consumed = 0;
3334 rv = _sat_decode_icon_identifier_tlv(tlv_str, tlv_len, temp_index,
3335 &pactive_cmd_ind_obj->data.setup_menu.icon_id, &data_len_consumed);
3336 if(rv !=TCORE_SAT_SUCCESS) return rv;
3338 if(temp_index+data_len_consumed >= tlv_len) {
3339 dbg("[SAT] SAT PARSER - no more TLVs to decode.");
3340 //send the data to Noti manager.
3341 return TCORE_SAT_SUCCESS;
3344 temp_index+=data_len_consumed; //temp_index pointing to the Tag of next TLV
3347 dbg("[SAT] SAT PARSER - ICON IDENTIFIER TLV Not present");
3350 //[8] (optional TLV) decode ICON IDENTIFIER LIST TLV
3351 if((src_data[temp_index]&0x7F) == SATK_ITEM_ICON_IDENTIFIER_LIST_TAG) {
3352 data_len_consumed = 0;
3353 rv = _sat_decode_icon_identifier_list_tlv(tlv_str, tlv_len, temp_index,
3354 &pactive_cmd_ind_obj->data.setup_menu.icon_list, &data_len_consumed);
3355 if(rv !=TCORE_SAT_SUCCESS) return rv; //SEND TR
3357 if(temp_index+data_len_consumed >= tlv_len){
3358 dbg("[SAT] SAT PARSER - no more TLVs to decode.");
3359 //send the data to Noti manager.
3360 return TCORE_SAT_SUCCESS;
3362 temp_index+=data_len_consumed; //temp_index pointing to the Tag of next TLV
3366 dbg("[SAT] SAT PARSER - ICON IDENTIFIER LIST TLV not present");
3369 //text attribute - optional
3370 if((src_data[temp_index]&0x7F)==SATK_TEXT_ATTRIBUTE_TAG){
3371 rv =_sat_decode_text_attribute_tlv(tlv_str, tlv_len, temp_index, &pactive_cmd_ind_obj->data.setup_menu.text_attribute, &data_len_consumed);
3372 if(rv != TCORE_SAT_SUCCESS){
3373 return rv; //SEND TR
3376 if(temp_index+data_len_consumed >= tlv_len){
3377 dbg("[SAT] SAT PARSER - no more TLVs to decode.");
3378 return TCORE_SAT_SUCCESS;
3381 temp_index+=data_len_consumed; //temp_index pointing to the Tag of next TLV
3384 //text attribute list - optional
3385 if((src_data[temp_index]&0x7F) == SATK_TEXT_ATTRIBUTE_LIST_TAG){
3386 int attr_item_temp_index = 0, item_cnt = 0;
3387 int txt_attr_list_len = 0;
3389 struct tel_sat_text_attribute_list *txt_attr_list = NULL;
3391 txt_attr_list = &pactive_cmd_ind_obj->data.setup_menu.text_attribute_list;
3395 txt_attr_list_len = src_data[temp_index];
3396 if(txt_attr_list_len == 0){
3397 dbg("[SAT] - Text Attribute List is nothing");
3398 return TCORE_SAT_REQUIRED_VALUE_MISSING;
3401 //item cnt - each text attribute length is 4byte
3402 item_cnt = txt_attr_list_len/4;
3403 txt_attr_list->list_cnt = item_cnt;
3404 dbg("[SAT] - text attribute item cnt(%d)", item_cnt);
3406 //get attribute data
3408 for(attr_item_temp_index = 0; attr_item_temp_index < item_cnt; attr_item_temp_index++){
3409 memcpy(txt_attr_list->text_attribute_list[attr_item_temp_index].text_formatting, &src_data[temp_index], 4);
3413 dbg("[SAT] SAT PARSER - done to decode text attribute list");
3416 dbg("[SAT] SAT PARSER - no more TLVs to decode.");
3417 return TCORE_SAT_SUCCESS;
3421 static enum tcore_sat_result _sat_decode_select_item(unsigned char* o_cmd_data, int o_length,
3422 int curr_offset, struct tcore_sat_proactive_command *sat_cmd_ind_data)
3425 int data_len_consumed=0;
3426 unsigned char dev_id[4];
3427 unsigned char* cmd_data = NULL;
3428 enum tcore_sat_result rv = TCORE_SAT_SUCCESS;
3430 if(o_cmd_data == NULL){
3431 dbg("[SAT] SAT PARSER - o_cmd_data == NULL");
3432 return TCORE_SAT_ERROR_FATAL;
3435 cmd_data = &o_cmd_data[0];
3436 temp_index = curr_offset+2;
3437 sat_cmd_ind_data->data.select_item.command_detail.cmd_num = cmd_data[temp_index++];
3438 sat_cmd_ind_data->data.select_item.command_detail.cmd_type = cmd_data[temp_index++];
3440 /* ******decode command qualifier****** */
3441 if (cmd_data[temp_index] & 0x01) {
3442 if (cmd_data[temp_index] & 0x02) {
3443 sat_cmd_ind_data->data.select_item.command_detail.cmd_qualifier.select_item.presentation_type = PRESENTATION_TYPE_NAVIGATION_OPTION;
3444 dbg("[SAT] SAT PARSER - PRESENTATION_TYPE_NAVIGATION_OPTION");
3447 sat_cmd_ind_data->data.select_item.command_detail.cmd_qualifier.select_item.presentation_type = PRESENTATION_TYPE_DATA_VALUE;
3448 dbg("[SAT] SAT PARSER - PRESENTATION_TYPE_DATA_VALUE");
3452 sat_cmd_ind_data->data.select_item.command_detail.cmd_qualifier.select_item.presentation_type = PRESENTATION_TYPE_NOT_SPECIFIED;
3453 dbg("[SAT] SAT PARSER - PRESENTATION_TYPE_NOT_SPECIFIED");
3456 if (cmd_data[temp_index] & 0x04) {
3457 sat_cmd_ind_data->data.select_item.command_detail.cmd_qualifier.select_item.select_preference = SELECTION_PREFERENCE_USING_SOFT_KEY;
3458 dbg("[SAT] SAT PARSER - SELECTION_PREFERENCE_USING_SOFT_KEY");
3461 sat_cmd_ind_data->data.select_item.command_detail.cmd_qualifier.select_item.select_preference = SELECTION_PREFERENCE_NONE_REQUESTED;
3462 dbg("[SAT] SAT PARSER - SELECTION_PREFERENCE_NONE_REQUESTED");
3465 if (cmd_data[temp_index] & 0x80) {
3466 sat_cmd_ind_data->data.select_item.command_detail.cmd_qualifier.select_item.help_info = TRUE;
3467 dbg("[SAT] SAT PARSER - Help info");
3472 memcpy(dev_id,&cmd_data[temp_index],4);
3473 rv = _sat_decode_device_identities_tlv(dev_id, &sat_cmd_ind_data->data.select_item.device_id);
3474 if(rv != TCORE_SAT_SUCCESS)
3479 if((cmd_data[temp_index]&0x7F) == SATK_ALPHA_IDENTIFIER_TAG){
3480 rv = _sat_decode_alpha_identifier_tlv(o_cmd_data, o_length, temp_index, &sat_cmd_ind_data->data.select_item.alpha_id, &data_len_consumed);
3481 if(rv != TCORE_SAT_SUCCESS) {
3484 temp_index+=data_len_consumed;
3488 sat_cmd_ind_data->data.select_item.menu_item_cnt = 0;
3490 data_len_consumed=0;
3492 if((cmd_data[temp_index]&0x7F) == SATK_ITEM_TAG) {
3493 rv = _sat_decode_item_tlv(o_cmd_data, o_length, temp_index,
3494 &sat_cmd_ind_data->data.select_item.menu_item[sat_cmd_ind_data->data.select_item.menu_item_cnt],
3495 &data_len_consumed);
3497 if(rv != TCORE_SAT_SUCCESS)
3501 if(sat_cmd_ind_data->data.select_item.menu_item_cnt == 0) {
3502 dbg("menu item is not exist.");
3503 return TCORE_SAT_REQUIRED_VALUE_MISSING;
3508 sat_cmd_ind_data->data.select_item.menu_item_cnt++;
3509 temp_index += data_len_consumed;
3511 if(temp_index >= o_length)
3514 }while(sat_cmd_ind_data->data.select_item.menu_item_cnt < SAT_MENU_ITEM_COUNT_MAX);
3516 dbg("[SAT] SAT PARSER - select menu item_count=%d",sat_cmd_ind_data->data.select_item.menu_item_cnt);
3517 if(temp_index >= o_length){
3518 dbg("[SAT] SAT PARSER - :no more TLVs to decode.");
3519 return TCORE_SAT_SUCCESS;
3522 //item next action indicator
3523 if((cmd_data[temp_index]&0x7F) == SATK_ITEMS_NEXT_ACTION_INDICATOR_TAG) {
3524 data_len_consumed = 0;
3525 rv = _sat_decode_item_next_action_indicator_tlv(o_cmd_data, o_length, temp_index,
3526 &sat_cmd_ind_data->data.select_item.item_next_act_ind_list, &data_len_consumed);
3527 if(rv!=TCORE_SAT_SUCCESS)
3530 if(temp_index+data_len_consumed >= o_length) {
3531 dbg("[SAT] SAT PARSER - no more TLVs to decode.");
3532 return TCORE_SAT_SUCCESS;
3535 temp_index+=data_len_consumed;
3539 if((cmd_data[temp_index]&0x7F) == SATK_ITEM_IDENTIFIER_TAG) {
3540 data_len_consumed = 0;
3541 rv = _sat_decode_item_identifier_tlv(o_cmd_data, o_length, temp_index,
3542 &sat_cmd_ind_data->data.select_item.item_identifier, &data_len_consumed);
3543 if(rv !=TCORE_SAT_SUCCESS)
3546 if(temp_index+data_len_consumed >= o_length) {
3547 dbg("[SAT] SAT PARSER - no more TLVs to decode.");
3548 return TCORE_SAT_SUCCESS;
3551 temp_index+=data_len_consumed; //temp_index pointing to the Tag of next TLV
3555 if((cmd_data[temp_index]&0x7F) == SATK_ICON_IDENTIFIER_TAG){
3556 data_len_consumed = 0;
3557 rv = _sat_decode_icon_identifier_tlv(o_cmd_data, o_length, temp_index,
3558 &sat_cmd_ind_data->data.select_item.icon_id, &data_len_consumed);
3560 if(rv != TCORE_SAT_SUCCESS){
3561 return TCORE_SAT_COMMAND_NOT_UNDERSTOOD; //SEND TR
3564 if(temp_index+data_len_consumed >= o_length){
3565 dbg("[SAT] SAT PARSER - no more TLVs to decode.");
3566 return TCORE_SAT_SUCCESS;
3569 temp_index+=data_len_consumed; //temp_index pointing to the Tag of next TLV
3572 if((cmd_data[temp_index]&0x7F) == SATK_ITEM_ICON_IDENTIFIER_LIST_TAG) {
3573 data_len_consumed = 0;
3574 rv = _sat_decode_icon_identifier_list_tlv(o_cmd_data, o_length, temp_index,
3575 &sat_cmd_ind_data->data.select_item.icon_list, &data_len_consumed);
3576 if(rv !=TCORE_SAT_SUCCESS)
3577 return rv; //SEND TR
3579 if(temp_index+data_len_consumed >= o_length){
3580 dbg("[SAT] SAT PARSER - no more TLVs to decode.");
3581 return TCORE_SAT_SUCCESS;
3583 temp_index+=data_len_consumed; //temp_index pointing to the Tag of next TLV
3586 //text attribute - optional
3587 if((cmd_data[temp_index]&0x7F)==SATK_TEXT_ATTRIBUTE_TAG){
3588 rv =_sat_decode_text_attribute_tlv(o_cmd_data, o_length, temp_index,
3589 &sat_cmd_ind_data->data.select_item.text_attribute, &data_len_consumed);
3590 if(rv != TCORE_SAT_SUCCESS){
3591 return rv; //SEND TR
3594 if(temp_index+data_len_consumed >= o_length){
3595 dbg("[SAT] SAT PARSER - no more TLVs to decode.");
3596 return TCORE_SAT_SUCCESS;
3599 temp_index+=data_len_consumed; //temp_index pointing to the Tag of next TLV
3602 //text attribute list - optional
3603 if((cmd_data[temp_index]&0x7F) == SATK_TEXT_ATTRIBUTE_LIST_TAG){
3604 int attr_item_temp_index = 0, item_cnt = 0;
3605 int txt_attr_list_len = 0;
3607 struct tel_sat_text_attribute_list *txt_attr_list = NULL;
3609 txt_attr_list = &sat_cmd_ind_data->data.select_item.text_attribute_list;
3613 txt_attr_list_len = cmd_data[temp_index];
3614 if(txt_attr_list_len == 0){
3615 dbg("[SAT] - Text Attribute List is nothing");
3616 return TCORE_SAT_REQUIRED_VALUE_MISSING;
3619 //item cnt - each text attribute length is 4byte
3620 item_cnt = txt_attr_list_len/4;
3621 txt_attr_list->list_cnt = item_cnt;
3622 dbg("[SAT] - text attribute item cnt(%d)", item_cnt);
3624 //get attribute data
3626 for(attr_item_temp_index = 0; attr_item_temp_index < item_cnt; attr_item_temp_index++){
3627 memcpy(txt_attr_list->text_attribute_list[attr_item_temp_index].text_formatting, &cmd_data[temp_index], 4);
3631 dbg("[SAT] SAT PARSER - done to decode text attribute list");
3634 dbg("[SAT] SAT PARSER - :decoding done!.");
3635 return TCORE_SAT_SUCCESS;
3639 static enum tcore_sat_result _sat_decode_send_sms(unsigned char* o_cmd_data, int o_length,
3640 int curr_offset, struct tcore_sat_proactive_command *sat_cmd_ind_data)
3643 int data_len_consumed=0;
3644 unsigned char dev_id[4];
3645 unsigned char* cmd_data = NULL;
3646 enum tcore_sat_result rv = TCORE_SAT_SUCCESS;
3648 if(o_cmd_data == NULL){
3649 dbg("[SAT] SAT PARSER - o_cmd_data == NULL");
3650 return TCORE_SAT_ERROR_FATAL;
3653 cmd_data = &o_cmd_data[0];
3654 temp_index = curr_offset+2;
3655 sat_cmd_ind_data->data.send_sms.command_detail.cmd_num = cmd_data[temp_index++];
3656 sat_cmd_ind_data->data.send_sms.command_detail.cmd_type = cmd_data[temp_index++];
3658 /* ******decode command qualifier****** */
3659 if (cmd_data[temp_index] & 0x01) {
3660 sat_cmd_ind_data->data.send_sms.command_detail.cmd_qualifier.send_sms.packing_by_me_required = TRUE;
3663 sat_cmd_ind_data->data.send_sms.command_detail.cmd_qualifier.send_sms.packing_by_me_required = FALSE;
3664 dbg("[SAT] SAT PARSER - packing by me required is false");
3669 memcpy(dev_id,&cmd_data[temp_index],4);
3670 rv = _sat_decode_device_identities_tlv(dev_id, &sat_cmd_ind_data->data.send_sms.device_id);
3671 if(rv != TCORE_SAT_SUCCESS)
3676 if((cmd_data[temp_index]&0x7F) == SATK_ALPHA_IDENTIFIER_TAG){
3677 data_len_consumed = 0;
3678 rv = _sat_decode_alpha_identifier_tlv(o_cmd_data, o_length, temp_index, &sat_cmd_ind_data->data.send_sms.alpha_id, &data_len_consumed);
3679 if(rv != TCORE_SAT_SUCCESS) {
3682 temp_index+=data_len_consumed;
3686 if((cmd_data[temp_index]&0x7F) == SATK_ADDRESS_TAG){
3687 data_len_consumed = 0;
3688 rv = _sat_decode_address_tlv(o_cmd_data, o_length, temp_index, &sat_cmd_ind_data->data.send_sms.address, &data_len_consumed);
3689 if(rv != TCORE_SAT_SUCCESS) {
3692 temp_index+=data_len_consumed;
3696 data_len_consumed = 0;
3697 rv = _sat_decode_sms_tpdu_tlv(o_cmd_data, o_length, temp_index, &sat_cmd_ind_data->data.send_sms.sms_tpdu, &data_len_consumed);
3698 if(rv != TCORE_SAT_SUCCESS)
3701 if(temp_index+data_len_consumed >= o_length){
3702 dbg("[SAT] SAT PARSER - no more TLVs to decode.");
3703 return TCORE_SAT_SUCCESS;
3707 temp_index+=data_len_consumed;
3708 if((cmd_data[temp_index]&0x7F) == SATK_ICON_IDENTIFIER_TAG){
3709 data_len_consumed = 0;
3710 rv = _sat_decode_icon_identifier_tlv(o_cmd_data, o_length, temp_index,
3711 &sat_cmd_ind_data->data.send_sms.icon_id, &data_len_consumed);
3713 if(rv != TCORE_SAT_SUCCESS){
3714 return TCORE_SAT_COMMAND_NOT_UNDERSTOOD; //SEND TR
3717 if(temp_index+data_len_consumed >= o_length){
3718 dbg("[SAT] SAT PARSER - no more TLVs to decode.");
3719 return TCORE_SAT_SUCCESS;
3722 temp_index+=data_len_consumed; //temp_index pointing to the Tag of next TLV
3725 dbg("[SAT] SAT PARSER - :decoding done!.");
3726 return TCORE_SAT_SUCCESS;
3730 static enum tcore_sat_result _sat_decode_send_ss(unsigned char* o_cmd_data, int o_length,
3731 int curr_offset, struct tcore_sat_proactive_command *sat_cmd_ind_data)
3733 int temp_index = 0, data_len_consumed = 0;
3734 unsigned char dev_id[4];
3735 unsigned char* cmd_data = NULL;
3736 enum tcore_sat_result rv = TCORE_SAT_SUCCESS;
3738 if(o_cmd_data == NULL || sat_cmd_ind_data == NULL){
3739 dbg("[SAT] SAT PARSER - o_cmd_data == NULL");
3740 return TCORE_SAT_ERROR_FATAL;
3743 cmd_data = &o_cmd_data[0];
3744 temp_index = curr_offset+2;
3745 sat_cmd_ind_data->data.send_ss.command_detail.cmd_num = cmd_data[temp_index++];
3746 sat_cmd_ind_data->data.send_ss.command_detail.cmd_type = cmd_data[temp_index++];
3748 /** command detail **/
3752 memcpy(dev_id,&cmd_data[temp_index],4);
3753 rv = _sat_decode_device_identities_tlv(dev_id, &sat_cmd_ind_data->data.send_ss.device_id);
3754 if(rv != TCORE_SAT_SUCCESS)
3757 //alpha identifier - optional
3759 if((cmd_data[temp_index]&0x7F) == SATK_ALPHA_IDENTIFIER_TAG){
3760 rv = _sat_decode_alpha_identifier_tlv(o_cmd_data, o_length, temp_index, &sat_cmd_ind_data->data.send_ss.alpha_id, &data_len_consumed);
3761 if(rv != TCORE_SAT_SUCCESS) {
3764 temp_index+=data_len_consumed;
3768 rv = _sat_decode_ss_string_tlv(o_cmd_data, o_length, temp_index, &sat_cmd_ind_data->data.send_ss.ss_string, &data_len_consumed);
3769 if(rv != TCORE_SAT_SUCCESS)
3772 //icon identifier- optional
3773 temp_index+=data_len_consumed;
3774 if((cmd_data[temp_index]&0x7F) == SATK_ICON_IDENTIFIER_TAG){
3775 data_len_consumed = 0;
3777 rv = _sat_decode_icon_identifier_tlv(o_cmd_data, o_length, temp_index, &sat_cmd_ind_data->data.send_ss.icon_id, &data_len_consumed);
3778 if(rv != TCORE_SAT_SUCCESS){
3779 return TCORE_SAT_COMMAND_NOT_UNDERSTOOD; //SEND TR
3784 dbg("[SAT] SAT PARSER - :decoding done!.");
3785 return TCORE_SAT_SUCCESS;
3789 static enum tcore_sat_result _sat_decode_send_ussd(unsigned char* o_cmd_data, int o_length,
3790 int curr_offset, struct tcore_sat_proactive_command *sat_cmd_ind_data)
3792 int temp_index = 0, data_len_consumed = 0;
3793 unsigned char dev_id[4];
3794 unsigned char* cmd_data = NULL;
3795 enum tcore_sat_result rv = TCORE_SAT_SUCCESS;
3797 if(o_cmd_data == NULL || sat_cmd_ind_data == NULL){
3798 dbg("[SAT] SAT PARSER - o_cmd_data == NULL");
3799 return TCORE_SAT_ERROR_FATAL;
3802 cmd_data = &o_cmd_data[0];
3803 temp_index = curr_offset+2;
3804 sat_cmd_ind_data->data.send_ussd.command_detail.cmd_num = cmd_data[temp_index++];
3805 sat_cmd_ind_data->data.send_ussd.command_detail.cmd_type = cmd_data[temp_index++];
3807 /** command detail **/
3811 memcpy(dev_id,&cmd_data[temp_index],4);
3812 rv = _sat_decode_device_identities_tlv(dev_id, &sat_cmd_ind_data->data.send_ussd.device_id);
3813 if(rv != TCORE_SAT_SUCCESS)
3816 //alpha identifier - optional
3818 if((cmd_data[temp_index]&0x7F) == SATK_ALPHA_IDENTIFIER_TAG){
3819 rv = _sat_decode_alpha_identifier_tlv(o_cmd_data, o_length, temp_index, &sat_cmd_ind_data->data.send_ussd.alpha_id, &data_len_consumed);
3820 if(rv != TCORE_SAT_SUCCESS) {
3823 temp_index+=data_len_consumed;
3827 rv = _sat_decode_ussd_string_tlv(o_cmd_data, o_length, temp_index, &sat_cmd_ind_data->data.send_ussd.ussd_string, &data_len_consumed);
3828 if(rv != TCORE_SAT_SUCCESS)
3831 //icon identifier- optional
3832 temp_index+=data_len_consumed;
3833 if((cmd_data[temp_index]&0x7F) == SATK_ICON_IDENTIFIER_TAG){
3834 data_len_consumed = 0;
3836 rv = _sat_decode_icon_identifier_tlv(o_cmd_data, o_length, temp_index, &sat_cmd_ind_data->data.send_ussd.icon_id, &data_len_consumed);
3837 if(rv != TCORE_SAT_SUCCESS){
3838 return TCORE_SAT_COMMAND_NOT_UNDERSTOOD; //SEND TR
3843 dbg("[SAT] SAT PARSER - :decoding done!.");
3844 return TCORE_SAT_SUCCESS;
3848 static enum tcore_sat_result _sat_decode_setup_call(unsigned char* o_cmd_data, int o_length,
3849 int curr_offset, struct tcore_sat_proactive_command *sat_cmd_ind_data)
3851 int temp_index = 0, data_len_consumed = 0;
3852 unsigned char dev_id[4];
3853 unsigned char* cmd_data = NULL;
3854 enum tcore_sat_result rv = TCORE_SAT_SUCCESS;
3856 if(o_cmd_data == NULL || sat_cmd_ind_data == NULL){
3857 dbg("[SAT] SAT PARSER - o_cmd_data == NULL");
3858 return TCORE_SAT_ERROR_FATAL;
3862 cmd_data = &o_cmd_data[0];
3863 temp_index = curr_offset+2;
3864 sat_cmd_ind_data->data.setup_call.command_detail.cmd_num = cmd_data[temp_index++];
3865 sat_cmd_ind_data->data.setup_call.command_detail.cmd_type = cmd_data[temp_index++];
3867 /* ******decode command qualifier****** */
3868 switch(cmd_data[temp_index]){
3869 case SETUP_CALL_IF_ANOTHER_CALL_NOT_BUSY:
3870 case SETUP_CALL_IF_ANOTHER_CALL_NOT_BUSY_WITH_REDIAL:
3871 case SETUP_CALL_PUT_ALL_OTHER_CALLS_ON_HOLD:
3872 case SETUP_CALL_PUT_ALL_OTHER_CALLS_ON_HOLD_WITH_REDIAL:
3873 case SETUP_CALL_DISCONN_ALL_OTHER_CALLS:
3874 case SETUP_CALL_DISCONN_ALL_OTHER_CALLS_WITH_REDIAL:
3875 sat_cmd_ind_data->data.setup_call.command_detail.cmd_qualifier.setup_call.setup_call = cmd_data[temp_index];
3876 dbg("[SAT] SAT PARSER - setup_call.cmd_qualifier= 0x%02x", sat_cmd_ind_data->data.setup_call.command_detail.cmd_qualifier.setup_call.setup_call);
3878 case SETUP_CALL_RESERVED:
3880 dbg("[SAT] SAT PARSER - setup_call.cmd_qualifier= 0x%02x", cmd_data[temp_index]);
3881 return TCORE_SAT_BEYOND_ME_CAPABILITY;
3887 memcpy(dev_id,&cmd_data[temp_index],4);
3888 rv = _sat_decode_device_identities_tlv(dev_id, &sat_cmd_ind_data->data.setup_call.device_id);
3889 if(rv != TCORE_SAT_SUCCESS)
3892 //alpha identifier (user confirmation) - optional
3894 if((cmd_data[temp_index]&0x7F) == SATK_ALPHA_IDENTIFIER_TAG){
3895 rv = _sat_decode_alpha_identifier_tlv(o_cmd_data, o_length, temp_index, &sat_cmd_ind_data->data.setup_call.user_confirm_alpha_id, &data_len_consumed);
3896 if(rv != TCORE_SAT_SUCCESS) {
3899 temp_index+=data_len_consumed;
3903 rv = _sat_decode_address_tlv(o_cmd_data, o_length, temp_index, &sat_cmd_ind_data->data.setup_call.address, &data_len_consumed);
3904 if(rv != TCORE_SAT_SUCCESS) {
3908 temp_index+=data_len_consumed;
3909 if(temp_index >= o_length){
3910 dbg("[SAT] SAT PARSER - no more TLVs to decode.");
3911 return TCORE_SAT_SUCCESS;
3914 //capability configuration parameter - optional
3915 if((cmd_data[temp_index]&0x7F)==SATK_CAPABILITY_CONFIGURATION_PARAMETERS_TAG){
3916 rv =_sat_decode_ccp_tlv(o_cmd_data, o_length, temp_index, &sat_cmd_ind_data->data.setup_call.ccp, &data_len_consumed);
3917 if(rv != TCORE_SAT_SUCCESS){
3918 return rv; //SEND TR
3921 temp_index+=data_len_consumed;
3922 if(temp_index >= o_length){
3923 dbg("[SAT] SAT PARSER - no more TLVs to decode.");
3924 return TCORE_SAT_SUCCESS;
3928 //sub address - optional
3929 if((cmd_data[temp_index]&0x7F)==SATK_SUB_ADDRESS_TAG){
3930 rv =_sat_decode_sub_address_tlv(o_cmd_data, o_length, temp_index, &sat_cmd_ind_data->data.setup_call.subaddress, &data_len_consumed);
3931 if(rv != TCORE_SAT_SUCCESS){
3932 return rv; //SEND TR
3935 temp_index+=data_len_consumed;
3936 if(temp_index >= o_length){
3937 dbg("[SAT] SAT PARSER - no more TLVs to decode.");
3938 return TCORE_SAT_SUCCESS;
3942 //time duration - optional
3943 if((cmd_data[temp_index]&0x7F)==SATK_DURATION_TAG){
3944 rv =_sat_decode_duration_tlv(o_cmd_data, o_length, temp_index, &sat_cmd_ind_data->data.setup_call.duration, &data_len_consumed);
3945 if(rv != TCORE_SAT_SUCCESS){
3946 return rv; //SEND TR
3949 temp_index+=data_len_consumed;
3950 if(temp_index >= o_length){
3951 dbg("[SAT] SAT PARSER - no more TLVs to decode.");
3952 return TCORE_SAT_SUCCESS;
3956 //icon identifier (user confirmation) - optional
3957 if((cmd_data[temp_index]&0x7F) == SATK_ICON_IDENTIFIER_TAG){
3958 data_len_consumed = 0;
3959 rv = _sat_decode_icon_identifier_tlv(o_cmd_data, o_length, temp_index, &sat_cmd_ind_data->data.setup_call.user_confirm_icon_id, &data_len_consumed);
3961 if(rv != TCORE_SAT_SUCCESS){
3962 return TCORE_SAT_COMMAND_NOT_UNDERSTOOD; //SEND TR
3965 temp_index+=data_len_consumed;
3966 if(temp_index >= o_length){
3967 dbg("[SAT] SAT PARSER - no more TLVs to decode.");
3968 return TCORE_SAT_SUCCESS;
3972 //alpha identifier (call setup) - optional
3973 if((cmd_data[temp_index]&0x7F) == SATK_ALPHA_IDENTIFIER_TAG){
3974 rv = _sat_decode_alpha_identifier_tlv(o_cmd_data, o_length, temp_index, &sat_cmd_ind_data->data.setup_call.call_setup_alpha_id, &data_len_consumed);
3975 if(rv != TCORE_SAT_SUCCESS) {
3979 temp_index+=data_len_consumed;
3980 if(temp_index >= o_length){
3981 dbg("[SAT] SAT PARSER - no more TLVs to decode.");
3982 return TCORE_SAT_SUCCESS;
3986 //icon identifier (call setup) - optional
3987 if((cmd_data[temp_index]&0x7F) == SATK_ICON_IDENTIFIER_TAG){
3988 data_len_consumed = 0;
3989 rv = _sat_decode_icon_identifier_tlv(o_cmd_data, o_length, temp_index, &sat_cmd_ind_data->data.setup_call.call_setup_icon_id, &data_len_consumed);
3991 if(rv != TCORE_SAT_SUCCESS){
3992 return TCORE_SAT_COMMAND_NOT_UNDERSTOOD; //SEND TR
3995 temp_index+=data_len_consumed;
3996 if(temp_index >= o_length){
3997 dbg("[SAT] SAT PARSER - no more TLVs to decode.");
3998 return TCORE_SAT_SUCCESS;
4002 //ToDo: Text Attribute (user_confirmation , call_setup)
4004 dbg("[SAT] SAT PARSER - :decoding done!.");
4005 return TCORE_SAT_SUCCESS;
4008 //6.4.15 PROVIDE LOCAL INFO
4009 static enum tcore_sat_result _sat_decode_provide_local_info(unsigned char* o_cmd_data, int o_length,
4010 int curr_offset, struct tcore_sat_proactive_command *sat_cmd_ind_data)
4013 unsigned char dev_id[4];
4014 unsigned char* cmd_data = NULL;
4015 enum tcore_sat_result rv = TCORE_SAT_SUCCESS;
4017 if(o_cmd_data == NULL){
4018 dbg("[SAT] SAT PARSER - o_cmd_data == NULL");
4019 return TCORE_SAT_ERROR_FATAL;
4023 cmd_data = &o_cmd_data[0];
4024 temp_index = curr_offset+2;
4025 sat_cmd_ind_data->data.setup_event_list.command_detail.cmd_num = cmd_data[temp_index++];
4026 sat_cmd_ind_data->data.setup_event_list.command_detail.cmd_type = cmd_data[temp_index++];
4028 /* ******decode command qualifier****** */
4029 switch(cmd_data[temp_index]){
4030 case LOCAL_INFO_DATE_TIME_AND_TIMEZONE:
4031 case LOCAL_INFO_LANGUAGE:
4032 sat_cmd_ind_data->data.setup_event_list.command_detail.cmd_qualifier.provide_local_info.provide_local_info = cmd_data[temp_index];
4034 //TODO - Other cases
4036 sat_cmd_ind_data->data.setup_event_list.command_detail.cmd_qualifier.provide_local_info.provide_local_info = LOCAL_INFO_RESERVED;
4042 memcpy(dev_id,&cmd_data[temp_index],4);
4043 rv = _sat_decode_device_identities_tlv(dev_id, &sat_cmd_ind_data->data.setup_event_list.device_id);
4044 if(rv != TCORE_SAT_SUCCESS)
4047 //TODO - UTRAN Measurement Qualifier
4049 dbg("[SAT] SAT PARSER - :decoding done!.");
4050 return TCORE_SAT_SUCCESS;
4053 //6.4.16 SETUP EVENT LIST
4054 static enum tcore_sat_result _sat_decode_setup_event_list(unsigned char* o_cmd_data, int o_length,
4055 int curr_offset, struct tcore_sat_proactive_command *sat_cmd_ind_data)
4057 int temp_index = 0, data_len_consumed = 0;
4058 unsigned char dev_id[4];
4059 unsigned char* cmd_data = NULL;
4060 enum tcore_sat_result rv = TCORE_SAT_SUCCESS;
4062 if(o_cmd_data == NULL){
4063 dbg("[SAT] SAT PARSER - o_cmd_data == NULL");
4064 return TCORE_SAT_ERROR_FATAL;
4068 cmd_data = &o_cmd_data[0];
4069 temp_index = curr_offset+2;
4070 sat_cmd_ind_data->data.setup_event_list.command_detail.cmd_num = cmd_data[temp_index++];
4071 sat_cmd_ind_data->data.setup_event_list.command_detail.cmd_type = cmd_data[temp_index++];
4075 memcpy(dev_id,&cmd_data[temp_index],4);
4076 rv = _sat_decode_device_identities_tlv(dev_id, &sat_cmd_ind_data->data.setup_event_list.device_id);
4077 if(rv != TCORE_SAT_SUCCESS)
4082 rv = _sat_decode_event_list_tlv(o_cmd_data, o_length, temp_index,
4083 &sat_cmd_ind_data->data.setup_event_list.event_list, &data_len_consumed);
4085 dbg("[SAT] SAT PARSER - :decoding done!.");
4086 return TCORE_SAT_SUCCESS;
4089 //6.4.22 SETUP IDLE MODE TEXT
4090 static enum tcore_sat_result _sat_decode_setup_idle_mode_text(unsigned char* o_cmd_data, int o_length,
4091 int curr_offset, struct tcore_sat_proactive_command *sat_cmd_ind_data)
4093 int temp_index = 0, data_len_consumed = 0;
4094 unsigned char dev_id[4];
4095 unsigned char* cmd_data = NULL;
4096 enum tcore_sat_result rv = TCORE_SAT_SUCCESS;
4098 if(o_cmd_data == NULL){
4099 dbg("[SAT] SAT PARSER - o_cmd_data == NULL");
4100 return TCORE_SAT_ERROR_FATAL;
4104 cmd_data = &o_cmd_data[0];
4105 temp_index = curr_offset+2;
4106 sat_cmd_ind_data->data.setup_idle_mode_text.command_detail.cmd_num = cmd_data[temp_index++];
4107 sat_cmd_ind_data->data.setup_idle_mode_text.command_detail.cmd_type = cmd_data[temp_index++];
4111 memcpy(dev_id,&cmd_data[temp_index],4);
4112 rv = _sat_decode_device_identities_tlv(dev_id, &sat_cmd_ind_data->data.setup_idle_mode_text.device_id);
4113 if(rv != TCORE_SAT_SUCCESS)
4118 rv = _sat_decode_text_tlv(o_cmd_data, o_length, temp_index, &sat_cmd_ind_data->data.setup_idle_mode_text.text, &data_len_consumed);
4119 if(rv != TCORE_SAT_SUCCESS)
4122 if(sat_cmd_ind_data->data.setup_idle_mode_text.text.string_length < 0){
4123 err("[SAT] SAT PARSER - :string length is less than 0");
4124 return TCORE_SAT_COMMAND_NOT_UNDERSTOOD;
4127 dbg("[SAT] SAT PARSER text(%s)",sat_cmd_ind_data->data.setup_idle_mode_text.text.string);
4128 dbg("[SAT] SAT PARSER o_len(%d) temp_index(%d) data_len_consumed(%d)",o_length , temp_index, data_len_consumed);
4130 if(temp_index+data_len_consumed > o_length){
4131 err("[SAT] SAT PARSER - Wrong String TLV");
4132 return TCORE_SAT_BEYOND_ME_CAPABILITY;
4134 else if(temp_index+data_len_consumed == o_length){
4135 dbg("[SAT] SAT PARSER - :no more TLVs to decode.");
4136 return TCORE_SAT_SUCCESS;
4140 temp_index+=data_len_consumed;
4141 if((cmd_data[temp_index]&0x7F) == SATK_ICON_IDENTIFIER_TAG){
4142 data_len_consumed = 0;
4143 rv = _sat_decode_icon_identifier_tlv(o_cmd_data, o_length, temp_index, &sat_cmd_ind_data->data.setup_idle_mode_text.icon_id, &data_len_consumed);
4145 if(rv != TCORE_SAT_SUCCESS){
4146 return TCORE_SAT_COMMAND_NOT_UNDERSTOOD; //SEND TR
4149 if(temp_index+data_len_consumed >= o_length){
4150 dbg("[SAT] SAT PARSER - no more TLVs to decode.");
4151 return TCORE_SAT_SUCCESS;
4154 temp_index+=data_len_consumed; //temp_index pointing to the Tag of next TLV
4157 //ToDo: Text Attribute
4158 dbg("[SAT] SAT PARSER - :decoding done!.");
4159 return TCORE_SAT_SUCCESS;
4163 static enum tcore_sat_result _sat_decode_send_dtmf(unsigned char* o_cmd_data, int o_length,
4164 int curr_offset, struct tcore_sat_proactive_command *sat_cmd_ind_data)
4166 int temp_index = 0, data_len_consumed = 0;
4167 unsigned char dev_id[4];
4168 unsigned char* cmd_data = NULL;
4169 enum tcore_sat_result rv = TCORE_SAT_SUCCESS;
4171 if(o_cmd_data == NULL){
4172 dbg("[SAT] SAT PARSER - o_cmd_data == NULL");
4173 return TCORE_SAT_ERROR_FATAL;
4177 cmd_data = &o_cmd_data[0];
4178 temp_index = curr_offset+2;
4179 sat_cmd_ind_data->data.send_dtmf.command_detail.cmd_num = cmd_data[temp_index++];
4180 sat_cmd_ind_data->data.send_dtmf.command_detail.cmd_type = cmd_data[temp_index++];
4184 memcpy(dev_id,&cmd_data[temp_index],4);
4185 rv = _sat_decode_device_identities_tlv(dev_id, &sat_cmd_ind_data->data.send_dtmf.device_id);
4186 if(rv != TCORE_SAT_SUCCESS)
4189 //alpha identifier - optional
4191 if((cmd_data[temp_index]&0x7F) == SATK_ALPHA_IDENTIFIER_TAG){
4192 rv = _sat_decode_alpha_identifier_tlv(o_cmd_data, o_length, temp_index, &sat_cmd_ind_data->data.send_dtmf.alpha_id, &data_len_consumed);
4193 if(rv != TCORE_SAT_SUCCESS) {
4196 temp_index+=data_len_consumed;
4199 // DTMF string - mandatory
4200 if ((cmd_data[temp_index] & 0x7F) == SATK_DTMF_STRING_TAG) {
4201 rv = _sat_decode_dtmf_string_tlv(o_cmd_data, o_length, temp_index,
4202 &sat_cmd_ind_data->data.send_dtmf.dtmf_string, &data_len_consumed);
4203 if (rv != TCORE_SAT_SUCCESS) {
4207 if (temp_index + data_len_consumed >= o_length) {
4208 dbg("[SAT] SAT PARSER - no more TLVs to decode.");
4209 return TCORE_SAT_SUCCESS;
4211 temp_index += data_len_consumed;
4213 dbg("[SAT] SAT PARSER - DTMF tlv is missed.");
4214 return TCORE_SAT_REQUIRED_VALUE_MISSING;
4217 //icon identifier - optional
4218 if ((cmd_data[temp_index] & 0x7F) == SATK_ICON_IDENTIFIER_TAG) {
4219 data_len_consumed = 0;
4220 rv = _sat_decode_icon_identifier_tlv(o_cmd_data, o_length, temp_index,
4221 &sat_cmd_ind_data->data.send_dtmf.icon_id, &data_len_consumed);
4223 if (rv != TCORE_SAT_SUCCESS) {
4224 return TCORE_SAT_COMMAND_NOT_UNDERSTOOD;
4227 if (temp_index + data_len_consumed >= o_length) {
4228 dbg("[SAT] SAT PARSER - no more TLVs to decode.");
4229 return TCORE_SAT_SUCCESS;
4231 temp_index += data_len_consumed; //temp_index pointing to the Tag of next TLV
4234 //ToDo: Text Attribute, Frame Identifier
4235 dbg("[SAT] SAT PARSER - :decoding done!.");
4236 return TCORE_SAT_SUCCESS;
4239 //6.4.25 LANGUAGE NOTIFICATION
4240 static enum tcore_sat_result _sat_decode_language_notification(unsigned char* o_cmd_data, int o_length,
4241 int curr_offset, struct tcore_sat_proactive_command *sat_cmd_ind_data)
4244 unsigned char dev_id[4];
4245 unsigned char* cmd_data = NULL;
4246 enum tcore_sat_result rv = TCORE_SAT_SUCCESS;
4248 if(o_cmd_data == NULL){
4249 dbg("[SAT] SAT PARSER - o_cmd_data == NULL");
4250 return TCORE_SAT_ERROR_FATAL;
4254 cmd_data = &o_cmd_data[0];
4255 temp_index = curr_offset+2;
4256 sat_cmd_ind_data->data.language_notification.command_detail.cmd_num = cmd_data[temp_index++];
4257 sat_cmd_ind_data->data.language_notification.command_detail.cmd_type = cmd_data[temp_index++];
4259 /* ******decode command qualifier****** */
4260 if(cmd_data[temp_index]&0x01)
4261 sat_cmd_ind_data->data.language_notification.command_detail.cmd_qualifier.language_notification.specific_language = TRUE;
4263 sat_cmd_ind_data->data.language_notification.command_detail.cmd_qualifier.language_notification.specific_language = FALSE;
4267 memcpy(dev_id,&cmd_data[temp_index],4);
4268 rv = _sat_decode_device_identities_tlv(dev_id, &sat_cmd_ind_data->data.language_notification.device_id);
4269 if(rv != TCORE_SAT_SUCCESS)
4272 //language - conditional
4274 if (sat_cmd_ind_data->data.language_notification.command_detail.cmd_qualifier.language_notification.specific_language == TRUE) {
4275 if((cmd_data[temp_index]&0x7F) == SATK_LANGUAGE_TAG) {
4276 rv = _sat_decode_language_tlv(cmd_data, o_length, temp_index, &sat_cmd_ind_data->data.language_notification.language);
4277 if(rv != TCORE_SAT_SUCCESS)
4280 dbg("[SAT] SAT PARSER - Language TLV is required but missing.");
4281 return TCORE_SAT_COMMAND_NOT_UNDERSTOOD;
4284 sat_cmd_ind_data->data.language_notification.language = SIM_LANG_UNSPECIFIED;
4285 dbg("[SAT] SAT PARSER - non-specific language");
4288 dbg("[SAT] SAT PARSER - :decoding done!.");
4289 return TCORE_SAT_SUCCESS;
4292 //6.4.26 LAUNCH BROWSER
4293 static enum tcore_sat_result _sat_decode_launch_browser(unsigned char* o_cmd_data, int o_length,
4294 int curr_offset, struct tcore_sat_proactive_command *sat_cmd_ind_data)
4296 int temp_index = 0, data_len_consumed = 0;
4297 unsigned char dev_id[4];
4298 unsigned char* cmd_data = NULL;
4299 enum tcore_sat_result rv = TCORE_SAT_SUCCESS;
4301 if(o_cmd_data == NULL){
4302 dbg("[SAT] SAT PARSER - o_cmd_data == NULL");
4303 return TCORE_SAT_ERROR_FATAL;
4307 cmd_data = &o_cmd_data[0];
4308 temp_index = curr_offset+2;
4309 sat_cmd_ind_data->data.launch_browser.command_detail.cmd_num = cmd_data[temp_index++];
4310 sat_cmd_ind_data->data.launch_browser.command_detail.cmd_type = cmd_data[temp_index++];
4312 // decode command qualifier
4313 switch (cmd_data[temp_index]) {
4315 sat_cmd_ind_data->data.launch_browser.command_detail.cmd_qualifier.launch_browser.launch_browser =
4316 LAUNCH_BROWSER_IF_NOT_ALREADY_LAUNCHED;
4319 sat_cmd_ind_data->data.launch_browser.command_detail.cmd_qualifier.launch_browser.launch_browser =
4320 LAUNCH_BROWSER_NOT_USED;
4323 sat_cmd_ind_data->data.launch_browser.command_detail.cmd_qualifier.launch_browser.launch_browser =
4324 LAUNCH_BROWSER_USE_EXISTING_BROWSER;
4327 sat_cmd_ind_data->data.launch_browser.command_detail.cmd_qualifier.launch_browser.launch_browser =
4328 LAUNCH_BROWSER_CLOSE_AND_LAUNCH_NEW_BROWSER;
4331 sat_cmd_ind_data->data.launch_browser.command_detail.cmd_qualifier.launch_browser.launch_browser =
4332 LAUNCH_BROWSER_NOT_USED2;
4335 sat_cmd_ind_data->data.launch_browser.command_detail.cmd_qualifier.launch_browser.launch_browser =
4336 LAUNCH_BROWSER_RESERVED;
4342 memcpy(dev_id,&cmd_data[temp_index],4);
4343 rv = _sat_decode_device_identities_tlv(dev_id, &sat_cmd_ind_data->data.language_notification.device_id);
4344 if(rv != TCORE_SAT_SUCCESS)
4349 //Browser Identity TLV - Optional
4350 if ((cmd_data[temp_index] & 0x7F) == SATK_BROWSER_IDENTITY_TAG) {
4351 rv = _sat_decode_browser_identity_tlv(o_cmd_data, o_length, temp_index, &sat_cmd_ind_data->data.launch_browser.browser_id, &data_len_consumed);
4352 if(rv != TCORE_SAT_SUCCESS)
4354 temp_index += data_len_consumed;
4356 dbg("[SAT] SAT PARSER - Browser ID NOT present");
4359 //URL TLV - Mandatory
4360 if ((cmd_data[temp_index] & 0x7F) == SATK_URL_TAG) {
4361 rv = _sat_decode_url_tlv(o_cmd_data, o_length, temp_index, &sat_cmd_ind_data->data.launch_browser.url, &data_len_consumed);
4362 if(rv != TCORE_SAT_SUCCESS)
4365 if (temp_index + data_len_consumed >= o_length) {
4366 dbg("[SAT] SAT PARSER - No more TLVs to decode, decoding done.");
4367 return TCORE_SAT_SUCCESS;
4369 dbg("[SAT] SAT PARSER - more TLVs to decode, decoding continue.");
4370 temp_index += data_len_consumed;
4373 dbg("[SAT] SAT PARSER - Browser URL NOT present! BUG! this value is mandatory!!!");
4374 return TCORE_SAT_REQUIRED_VALUE_MISSING;
4378 if ((cmd_data[temp_index] & 0x7F) == SATK_BEARER_TAG) {
4379 rv = _sat_decode_bearer_tlv(o_cmd_data, o_length, temp_index, &sat_cmd_ind_data->data.launch_browser.bearer, &data_len_consumed);
4380 if(rv != TCORE_SAT_SUCCESS)
4383 if (temp_index + data_len_consumed >= o_length) {
4384 dbg("[SAT] SAT PARSER - No more TLVs to decode, decoding done.");
4385 return TCORE_SAT_SUCCESS;
4387 temp_index += data_len_consumed;
4390 dbg("[SAT] SAT PARSER - Bearer TLV Not present.");
4393 //Provisioning reference file - optional
4394 sat_cmd_ind_data->data.launch_browser.file_ref_count = 0;
4395 while ((cmd_data[temp_index] & 0x7F) == SATK_PROVISIONING_REF_FILE_TAG) {
4396 if (sat_cmd_ind_data->data.launch_browser.file_ref_count >= SAT_PROVISIONING_REF_MAX_COUNT) {
4397 dbg("[SAT] SAT PARSER - More number of PRF entries than can be handled");
4398 return TCORE_SAT_COMMAND_NOT_UNDERSTOOD;
4401 rv = _sat_decode_provisioning_file_ref_tlv(
4405 &sat_cmd_ind_data->data.launch_browser.file_list[sat_cmd_ind_data->data.launch_browser.file_ref_count],
4406 &data_len_consumed);
4407 if(rv != TCORE_SAT_SUCCESS) {
4410 sat_cmd_ind_data->data.launch_browser.file_ref_count++;
4413 if (temp_index + data_len_consumed >= o_length) {
4414 dbg("[SAT] SAT PARSER - No more TLVs to decode, decoding done.");
4415 return TCORE_SAT_SUCCESS;
4417 temp_index += data_len_consumed;
4421 //text string(gateway/proxy identity) - optional
4422 if ((cmd_data[temp_index] & 0x7F) == SATK_TEXT_STRING_TAG) {
4423 rv = _sat_decode_text_tlv(o_cmd_data, o_length, temp_index, &sat_cmd_ind_data->data.launch_browser.gateway_proxy_text, &data_len_consumed);
4424 if(rv != TCORE_SAT_SUCCESS)
4427 if (temp_index + data_len_consumed >= o_length) {
4428 dbg("[SAT] SAT PARSER - No more TLVs to decode, decoding done.");
4429 return TCORE_SAT_SUCCESS;
4431 temp_index += data_len_consumed;
4435 //alpha identifier - optional
4436 if((cmd_data[temp_index]&0x7F) == SATK_ALPHA_IDENTIFIER_TAG){
4437 rv = _sat_decode_alpha_identifier_tlv(o_cmd_data, o_length, temp_index, &sat_cmd_ind_data->data.launch_browser.user_confirm_alpha_id, &data_len_consumed);
4438 if(rv != TCORE_SAT_SUCCESS) {
4441 if (temp_index + data_len_consumed >= o_length) {
4442 dbg("[SAT] SAT PARSER - No more TLVs to decode, decoding done.");
4443 return TCORE_SAT_SUCCESS;
4445 temp_index+=data_len_consumed;
4447 dbg("[SAT] SAT PARSER - No Alpha ID TLV.");
4450 //icon identifier - optional
4451 if ((cmd_data[temp_index] & 0x7F) == SATK_ICON_IDENTIFIER_TAG) {
4452 data_len_consumed = 0;
4453 rv = _sat_decode_icon_identifier_tlv(o_cmd_data, o_length, temp_index,
4454 &sat_cmd_ind_data->data.launch_browser.user_confirm_icon_id, &data_len_consumed);
4456 if (rv != TCORE_SAT_SUCCESS) {
4457 return TCORE_SAT_COMMAND_NOT_UNDERSTOOD;
4460 if (temp_index + data_len_consumed >= o_length) {
4461 dbg("[SAT] SAT PARSER - no more TLVs to decode.");
4462 return TCORE_SAT_SUCCESS;
4464 temp_index += data_len_consumed; //temp_index pointing to the Tag of next TLV
4467 //ToDo: Text Attribute, Frame Identifier
4468 dbg("[SAT] SAT PARSER - :decoding done!.");
4469 return TCORE_SAT_SUCCESS;
4472 //6.4.27 OPEN CHANNEL
4473 static enum tcore_sat_result _sat_decode_open_channel(unsigned char* o_cmd_data, int o_length,
4474 int curr_offset, struct tcore_sat_proactive_command *sat_cmd_ind_data)
4477 gboolean b_1st_duration = FALSE;
4478 int bearer_desc_len =0, data_len_consumed=0;
4479 unsigned char dev_id[4];
4480 unsigned char* cmd_data = NULL;
4481 enum tcore_sat_result rv = TCORE_SAT_SUCCESS;
4483 if(o_cmd_data == NULL){
4484 dbg("[SAT] SAT PARSER - o_cmd_data == NULL");
4485 return TCORE_SAT_ERROR_FATAL;
4488 cmd_data = &o_cmd_data[0];
4489 temp_index = curr_offset+2;
4490 sat_cmd_ind_data->data.open_channel.command_detail.cmd_num = cmd_data[temp_index++];
4491 sat_cmd_ind_data->data.open_channel.command_detail.cmd_type = cmd_data[temp_index++];
4493 /** command detail **/
4494 sat_cmd_ind_data->data.open_channel.command_detail.cmd_qualifier.open_channel.immediate_link = FALSE;
4495 sat_cmd_ind_data->data.open_channel.command_detail.cmd_qualifier.open_channel.automatic_reconnection = FALSE;
4496 sat_cmd_ind_data->data.open_channel.command_detail.cmd_qualifier.open_channel.background_mode = FALSE;
4498 if(cmd_data[temp_index]&0x01){
4499 sat_cmd_ind_data->data.open_channel.command_detail.cmd_qualifier.open_channel.immediate_link = TRUE;
4500 dbg("[SAT] SAT PARSER - Immediate Link Establishment");
4503 if(cmd_data[temp_index]&0x02){
4504 sat_cmd_ind_data->data.open_channel.command_detail.cmd_qualifier.open_channel.automatic_reconnection = TRUE;
4505 dbg("[SAT] SAT PARSER - Auto Reconnection");
4508 if(cmd_data[temp_index]&0x04){
4509 sat_cmd_ind_data->data.open_channel.command_detail.cmd_qualifier.open_channel.background_mode = TRUE;
4510 dbg("[SAT] SAT PARSER - Background mode");
4515 memcpy(dev_id,&cmd_data[temp_index],4);
4516 rv = _sat_decode_device_identities_tlv(dev_id, &sat_cmd_ind_data->data.open_channel.device_id);
4517 if(rv != TCORE_SAT_SUCCESS)
4520 //alpha identifier - optional
4522 if((cmd_data[temp_index]&0x7F) == SATK_ALPHA_IDENTIFIER_TAG){
4523 rv = _sat_decode_alpha_identifier_tlv(o_cmd_data, o_length, temp_index, &sat_cmd_ind_data->data.open_channel.alpha_id, &data_len_consumed);
4524 if(rv != TCORE_SAT_SUCCESS) {
4527 temp_index+=data_len_consumed;
4530 //icon id - optional
4531 if((cmd_data[temp_index]&0x7F) == SATK_ICON_IDENTIFIER_TAG){
4532 data_len_consumed = 0;
4533 rv = _sat_decode_icon_identifier_tlv(o_cmd_data, o_length, temp_index, &sat_cmd_ind_data->data.open_channel.icon_id, &data_len_consumed);
4534 if(rv != TCORE_SAT_SUCCESS){
4535 return rv; //SEND TR
4537 temp_index+=data_len_consumed; //temp_index pointing to the Tag of next TLV
4540 //bearer description
4541 rv =_sat_decode_bearer_description_tlv(o_cmd_data, o_length, temp_index, &sat_cmd_ind_data->data.open_channel.bearer_desc, &data_len_consumed);
4542 bearer_desc_len = data_len_consumed;
4543 if(rv != TCORE_SAT_SUCCESS)
4545 //TODO UICC SERVER MODE
4547 switch(sat_cmd_ind_data->data.open_channel.bearer_desc.bearer_type){
4551 rv = _sat_decode_address_tlv(o_cmd_data, o_length, temp_index, &sat_cmd_ind_data->data.open_channel.bearer_detail.cs_bearer.address, &data_len_consumed);
4552 if(rv != TCORE_SAT_SUCCESS) {
4555 temp_index+=data_len_consumed;
4557 //sub address - optional
4558 if((cmd_data[temp_index]&0x7F) == SATK_SUB_ADDRESS_TAG){
4559 data_len_consumed = 0;
4560 rv = _sat_decode_subaddress_tlv(o_cmd_data, o_length, temp_index, &sat_cmd_ind_data->data.open_channel.bearer_detail.cs_bearer.subaddress, &data_len_consumed);
4561 if(rv != TCORE_SAT_SUCCESS) {
4564 temp_index+=data_len_consumed;
4567 //time duration 1- optional
4568 if((cmd_data[temp_index]&0x7F)==SATK_DURATION_TAG){
4569 data_len_consumed = 0;
4570 rv =_sat_decode_duration_tlv(o_cmd_data, o_length, temp_index, &sat_cmd_ind_data->data.open_channel.bearer_detail.cs_bearer.duration1, &data_len_consumed);
4571 if(rv != TCORE_SAT_SUCCESS){
4572 return rv; //SEND TR
4574 temp_index+=data_len_consumed;
4575 b_1st_duration = TRUE;
4578 //time duration 2- optional
4579 if((cmd_data[temp_index]&0x7F)==SATK_DURATION_TAG){
4581 if(!b_1st_duration){
4582 dbg("duration 1 does not present!");
4583 return TCORE_SAT_COMMAND_NOT_UNDERSTOOD;
4586 data_len_consumed = 0;
4587 rv =_sat_decode_duration_tlv(o_cmd_data, o_length, temp_index, &sat_cmd_ind_data->data.open_channel.bearer_detail.cs_bearer.duration2, &data_len_consumed);
4588 if(rv != TCORE_SAT_SUCCESS){
4589 return rv; //SEND TR
4591 temp_index+=data_len_consumed;
4594 //bearer description - already did it
4595 temp_index+=bearer_desc_len;
4598 rv =_sat_decode_buffer_size_tlv(o_cmd_data, o_length, temp_index, &sat_cmd_ind_data->data.open_channel.buffer_size, &data_len_consumed);
4599 if(rv != TCORE_SAT_SUCCESS){
4600 return rv; //SEND TR
4603 temp_index+=data_len_consumed;
4604 if(temp_index >= o_length){
4605 dbg("[SAT] SAT PARSER - no more TLVs to decode.");
4606 return TCORE_SAT_SUCCESS;
4609 //other address - optional
4610 if((cmd_data[temp_index]&0x7F)==SATK_OTHER_ADDRESS_TAG){
4611 data_len_consumed = 0;
4612 rv =_sat_decode_other_address_tlv(o_cmd_data, o_length, temp_index, &sat_cmd_ind_data->data.open_channel.bearer_detail.cs_bearer.other_address, &data_len_consumed);
4613 if(rv != TCORE_SAT_SUCCESS){
4614 return rv; //SEND TR
4617 temp_index+=data_len_consumed;
4618 if(temp_index >= o_length){
4619 dbg("[SAT] SAT PARSER - no more TLVs to decode.");
4620 return TCORE_SAT_SUCCESS;
4624 //text string - user login - optional
4625 if((cmd_data[temp_index]&0x7F)==SATK_TEXT_STRING_TAG){
4626 data_len_consumed = 0;
4627 rv = _sat_decode_text_tlv(o_cmd_data, o_length, temp_index, &sat_cmd_ind_data->data.open_channel.bearer_detail.cs_bearer.text_user_login, &data_len_consumed);
4628 if(rv != TCORE_SAT_SUCCESS)
4631 temp_index+=data_len_consumed;
4632 if(temp_index >= o_length){
4633 dbg("[SAT] SAT PARSER - no more TLVs to decode.");
4634 return TCORE_SAT_SUCCESS;
4638 //text string - user password - optional
4639 if((cmd_data[temp_index]&0x7F)==SATK_TEXT_STRING_TAG){
4640 data_len_consumed = 0;
4641 rv = _sat_decode_text_tlv(o_cmd_data, o_length, temp_index, &sat_cmd_ind_data->data.open_channel.bearer_detail.cs_bearer.text_user_pwd, &data_len_consumed);
4642 if(rv != TCORE_SAT_SUCCESS)
4645 temp_index+=data_len_consumed;
4646 if(temp_index >= o_length){
4647 dbg("[SAT] SAT PARSER - no more TLVs to decode.");
4648 return TCORE_SAT_SUCCESS;
4652 //UICC/TERMINAL interface transport level - optional
4653 if((cmd_data[temp_index]&0x7F)==SATK_USIM_ME_INTERFACE_TRANSPORT_LEVEL_TAG){
4654 data_len_consumed = 0;
4655 rv = _sat_decode_uicc_terminal_interface_tlv(o_cmd_data, o_length, temp_index, &sat_cmd_ind_data->data.open_channel.interface_transport_level, &data_len_consumed);
4656 if(rv != TCORE_SAT_SUCCESS)
4659 temp_index+=data_len_consumed;
4660 if(temp_index >= o_length){
4661 dbg("[SAT] SAT PARSER - no more TLVs to decode.");
4662 return TCORE_SAT_SUCCESS;
4666 //destination address - optional
4667 if((cmd_data[temp_index]&0x7F)==SATK_OTHER_ADDRESS_TAG){
4668 data_len_consumed = 0;
4669 rv =_sat_decode_other_address_tlv(o_cmd_data, o_length, temp_index, &sat_cmd_ind_data->data.open_channel.data_destination_address, &data_len_consumed);
4670 if(rv != TCORE_SAT_SUCCESS){
4671 return rv; //SEND TR
4674 temp_index+=data_len_consumed;
4675 if(temp_index >= o_length){
4676 dbg("[SAT] SAT PARSER - no more TLVs to decode.");
4677 return TCORE_SAT_SUCCESS;
4683 //bearer description - already did it
4684 temp_index+=bearer_desc_len;
4687 rv =_sat_decode_buffer_size_tlv(o_cmd_data, o_length, temp_index, &sat_cmd_ind_data->data.open_channel.buffer_size, &data_len_consumed);
4688 if(rv != TCORE_SAT_SUCCESS){
4689 return rv; //SEND TR
4692 temp_index+=data_len_consumed;
4693 if(temp_index >= o_length){
4694 dbg("[SAT] SAT PARSER - no more TLVs to decode.");
4695 return TCORE_SAT_SUCCESS;
4698 //Network Access Name - optional
4699 if((cmd_data[temp_index]&0x7F)==SATK_NETWORK_ACCESS_TAG){
4700 data_len_consumed = 0;
4701 rv =_sat_decode_network_access_name_tlv(o_cmd_data, o_length, temp_index, &sat_cmd_ind_data->data.open_channel.bearer_detail.ps_bearer.network_access_name, &data_len_consumed);
4702 if(rv != TCORE_SAT_SUCCESS){
4703 return rv; //SEND TR
4706 temp_index+=data_len_consumed;
4707 if(temp_index >= o_length){
4708 dbg("[SAT] SAT PARSER - no more TLVs to decode.");
4709 return TCORE_SAT_SUCCESS;
4713 //other address - optional
4714 if((cmd_data[temp_index]&0x7F)==SATK_OTHER_ADDRESS_TAG){
4715 data_len_consumed = 0;
4716 rv =_sat_decode_other_address_tlv(o_cmd_data, o_length, temp_index, &sat_cmd_ind_data->data.open_channel.bearer_detail.ps_bearer.other_address, &data_len_consumed);
4717 if(rv != TCORE_SAT_SUCCESS){
4718 return rv; //SEND TR
4721 temp_index+=data_len_consumed;
4722 if(temp_index >= o_length){
4723 dbg("[SAT] SAT PARSER - no more TLVs to decode.");
4724 return TCORE_SAT_SUCCESS;
4728 //text string - user login - optional
4729 if((cmd_data[temp_index]&0x7F)==SATK_TEXT_STRING_TAG){
4730 data_len_consumed = 0;
4731 rv = _sat_decode_text_tlv(o_cmd_data, o_length, temp_index, &sat_cmd_ind_data->data.open_channel.bearer_detail.ps_bearer.text_user_login, &data_len_consumed);
4732 if(rv != TCORE_SAT_SUCCESS)
4735 temp_index+=data_len_consumed;
4736 if(temp_index >= o_length){
4737 dbg("[SAT] SAT PARSER - no more TLVs to decode.");
4738 return TCORE_SAT_SUCCESS;
4742 //text string - user password - optional
4743 if((cmd_data[temp_index]&0x7F)==SATK_TEXT_STRING_TAG){
4744 data_len_consumed = 0;
4745 rv = _sat_decode_text_tlv(o_cmd_data, o_length, temp_index, &sat_cmd_ind_data->data.open_channel.bearer_detail.ps_bearer.text_user_pwd, &data_len_consumed);
4746 if(rv != TCORE_SAT_SUCCESS)
4749 temp_index+=data_len_consumed;
4750 if(temp_index >= o_length){
4751 dbg("[SAT] SAT PARSER - no more TLVs to decode.");
4752 return TCORE_SAT_SUCCESS;
4756 //UICC/TERMINAL interface transport level - optional
4757 if((cmd_data[temp_index]&0x7F)==SATK_USIM_ME_INTERFACE_TRANSPORT_LEVEL_TAG){
4758 data_len_consumed = 0;
4759 rv = _sat_decode_uicc_terminal_interface_tlv(o_cmd_data, o_length, temp_index, &sat_cmd_ind_data->data.open_channel.interface_transport_level, &data_len_consumed);
4760 if(rv != TCORE_SAT_SUCCESS)
4763 temp_index+=data_len_consumed;
4764 if(temp_index >= o_length){
4765 dbg("[SAT] SAT PARSER - no more TLVs to decode.");
4766 return TCORE_SAT_SUCCESS;
4770 dbg("the value (0x%x) after interface transport level", cmd_data[temp_index]&0x7F);
4772 //destination address - optional
4773 if((cmd_data[temp_index]&0x7F)==SATK_OTHER_ADDRESS_TAG){
4774 data_len_consumed = 0;
4775 rv =_sat_decode_other_address_tlv(o_cmd_data, o_length, temp_index, &sat_cmd_ind_data->data.open_channel.data_destination_address, &data_len_consumed);
4776 if(rv != TCORE_SAT_SUCCESS){
4777 return rv; //SEND TR
4780 temp_index+=data_len_consumed;
4781 if(temp_index >= o_length){
4782 dbg("[SAT] SAT PARSER - no more TLVs to decode.");
4783 return TCORE_SAT_SUCCESS;
4788 case BEARER_DEFAULT_BEARER_FROM_TRANSPORT_LAYER:
4789 //bearer description - already did it
4790 temp_index+=bearer_desc_len;
4793 rv =_sat_decode_buffer_size_tlv(o_cmd_data, o_length, temp_index, &sat_cmd_ind_data->data.open_channel.buffer_size, &data_len_consumed);
4794 if(rv != TCORE_SAT_SUCCESS){
4795 return rv; //SEND TR
4798 temp_index+=data_len_consumed;
4799 if(temp_index >= o_length){
4800 dbg("[SAT] SAT PARSER - no more TLVs to decode.");
4801 return TCORE_SAT_SUCCESS;
4804 //other address - optional
4805 if((cmd_data[temp_index]&0x7F)==SATK_OTHER_ADDRESS_TAG){
4806 data_len_consumed = 0;
4807 rv =_sat_decode_other_address_tlv(o_cmd_data, o_length, temp_index, &sat_cmd_ind_data->data.open_channel.bearer_detail.default_bearer.other_address, &data_len_consumed);
4808 if(rv != TCORE_SAT_SUCCESS){
4809 return rv; //SEND TR
4812 temp_index+=data_len_consumed;
4813 if(temp_index >= o_length){
4814 dbg("[SAT] SAT PARSER - no more TLVs to decode.");
4815 return TCORE_SAT_SUCCESS;
4819 //text string - user login - optional
4820 if((cmd_data[temp_index]&0x7F)==SATK_TEXT_STRING_TAG){
4821 data_len_consumed = 0;
4822 rv = _sat_decode_text_tlv(o_cmd_data, o_length, temp_index, &sat_cmd_ind_data->data.open_channel.bearer_detail.default_bearer.text_user_login, &data_len_consumed);
4823 if(rv != TCORE_SAT_SUCCESS)
4826 temp_index+=data_len_consumed;
4827 if(temp_index >= o_length){
4828 dbg("[SAT] SAT PARSER - no more TLVs to decode.");
4829 return TCORE_SAT_SUCCESS;
4833 //text string - user password - optional
4834 if((cmd_data[temp_index]&0x7F)==SATK_TEXT_STRING_TAG){
4835 data_len_consumed = 0;
4836 rv = _sat_decode_text_tlv(o_cmd_data, o_length, temp_index, &sat_cmd_ind_data->data.open_channel.bearer_detail.default_bearer.text_user_pwd, &data_len_consumed);
4837 if(rv != TCORE_SAT_SUCCESS)
4840 temp_index+=data_len_consumed;
4841 if(temp_index >= o_length){
4842 dbg("[SAT] SAT PARSER - no more TLVs to decode.");
4843 return TCORE_SAT_SUCCESS;
4847 //UICC/TERMINAL interface transport level - optional
4848 if((cmd_data[temp_index]&0x7F)==SATK_USIM_ME_INTERFACE_TRANSPORT_LEVEL_TAG){
4849 data_len_consumed = 0;
4850 rv = _sat_decode_uicc_terminal_interface_tlv(o_cmd_data, o_length, temp_index, &sat_cmd_ind_data->data.open_channel.interface_transport_level, &data_len_consumed);
4851 if(rv != TCORE_SAT_SUCCESS)
4854 temp_index+=data_len_consumed;
4855 if(temp_index >= o_length){
4856 dbg("[SAT] SAT PARSER - no more TLVs to decode.");
4857 return TCORE_SAT_SUCCESS;
4861 //destination address - optional
4862 if((cmd_data[temp_index]&0x7F)==SATK_OTHER_ADDRESS_TAG){
4863 data_len_consumed = 0;
4864 rv =_sat_decode_other_address_tlv(o_cmd_data, o_length, temp_index, &sat_cmd_ind_data->data.open_channel.data_destination_address, &data_len_consumed);
4865 if(rv != TCORE_SAT_SUCCESS){
4866 return rv; //SEND TR
4869 temp_index+=data_len_consumed;
4870 if(temp_index >= o_length){
4871 dbg("[SAT] SAT PARSER - no more TLVs to decode.");
4872 return TCORE_SAT_SUCCESS;
4877 case BEARER_LOCAL_LINK_TECHNOLOGY_INDEPENDENT:
4879 //time duration 1- optional
4880 if((cmd_data[temp_index]&0x7F)==SATK_DURATION_TAG){
4881 data_len_consumed = 0;
4882 rv =_sat_decode_duration_tlv(o_cmd_data, o_length, temp_index, &sat_cmd_ind_data->data.open_channel.bearer_detail.local_bearer.duration1, &data_len_consumed);
4883 if(rv != TCORE_SAT_SUCCESS){
4884 return rv; //SEND TR
4886 temp_index+=data_len_consumed;
4887 b_1st_duration = TRUE;
4890 //time duration 2- optional
4891 if((cmd_data[temp_index]&0x7F)==SATK_DURATION_TAG){
4893 if(!b_1st_duration){
4894 dbg("duration 1 does not present!");
4895 return TCORE_SAT_COMMAND_NOT_UNDERSTOOD;
4898 data_len_consumed = 0;
4899 rv =_sat_decode_duration_tlv(o_cmd_data, o_length, temp_index, &sat_cmd_ind_data->data.open_channel.bearer_detail.local_bearer.duration2, &data_len_consumed);
4900 if(rv != TCORE_SAT_SUCCESS){
4901 return rv; //SEND TR
4903 temp_index+=data_len_consumed;
4906 //bearer description - already did it
4907 temp_index+=bearer_desc_len;
4910 rv =_sat_decode_buffer_size_tlv(o_cmd_data, o_length, temp_index, &sat_cmd_ind_data->data.open_channel.buffer_size, &data_len_consumed);
4911 if(rv != TCORE_SAT_SUCCESS){
4912 return rv; //SEND TR
4915 temp_index+=data_len_consumed;
4916 if(temp_index >= o_length){
4917 dbg("[SAT] SAT PARSER - no more TLVs to decode.");
4918 return TCORE_SAT_SUCCESS;
4921 //text string - user password - optional
4922 if((cmd_data[temp_index]&0x7F)==SATK_TEXT_STRING_TAG){
4923 data_len_consumed = 0;
4924 rv = _sat_decode_text_tlv(o_cmd_data, o_length, temp_index, &sat_cmd_ind_data->data.open_channel.bearer_detail.local_bearer.text_user_pwd, &data_len_consumed);
4925 if(rv != TCORE_SAT_SUCCESS)
4928 temp_index+=data_len_consumed;
4929 if(temp_index >= o_length){
4930 dbg("[SAT] SAT PARSER - no more TLVs to decode.");
4931 return TCORE_SAT_SUCCESS;
4935 //UICC/TERMINAL interface transport level - optional
4936 if((cmd_data[temp_index]&0x7F)==SATK_USIM_ME_INTERFACE_TRANSPORT_LEVEL_TAG){
4937 data_len_consumed = 0;
4938 rv = _sat_decode_uicc_terminal_interface_tlv(o_cmd_data, o_length, temp_index, &sat_cmd_ind_data->data.open_channel.interface_transport_level, &data_len_consumed);
4939 if(rv != TCORE_SAT_SUCCESS)
4942 temp_index+=data_len_consumed;
4943 if(temp_index >= o_length){
4944 dbg("[SAT] SAT PARSER - no more TLVs to decode.");
4945 return TCORE_SAT_SUCCESS;
4949 //destination address - optional
4950 if((cmd_data[temp_index]&0x7F)==SATK_OTHER_ADDRESS_TAG){
4951 data_len_consumed = 0;
4952 rv =_sat_decode_other_address_tlv(o_cmd_data, o_length, temp_index, &sat_cmd_ind_data->data.open_channel.data_destination_address, &data_len_consumed);
4953 if(rv != TCORE_SAT_SUCCESS){
4954 return rv; //SEND TR
4957 temp_index+=data_len_consumed;
4958 if(temp_index >= o_length){
4959 dbg("[SAT] SAT PARSER - no more TLVs to decode.");
4960 return TCORE_SAT_SUCCESS;
4964 //remote entity address - optional
4965 if((cmd_data[temp_index]&0x7F)==SATK_REMOTE_ENTITY_ADDRESS_TAG){
4966 data_len_consumed = 0;
4967 rv =_sat_decode_remote_entity_address_tlv(o_cmd_data, o_length, temp_index, &sat_cmd_ind_data->data.open_channel.bearer_detail.local_bearer.remote_entity_address, &data_len_consumed);
4968 if(rv != TCORE_SAT_SUCCESS){
4969 return rv; //SEND TR
4972 temp_index+=data_len_consumed;
4973 if(temp_index >= o_length){
4974 dbg("[SAT] SAT PARSER - no more TLVs to decode.");
4975 return TCORE_SAT_SUCCESS;
4984 dbg("[SAT] SAT PARSER - :decoding done!.");
4985 return TCORE_SAT_SUCCESS;
4988 //6.4.28 CLOSE CHANNEL
4989 static enum tcore_sat_result _sat_decode_close_channel(unsigned char* o_cmd_data, int o_length,
4990 int curr_offset, struct tcore_sat_proactive_command *sat_cmd_ind_data)
4993 int data_len_consumed=0;
4994 unsigned char dev_id[4];
4995 unsigned char* cmd_data = NULL;
4996 enum tcore_sat_result rv = TCORE_SAT_SUCCESS;
4998 if(o_cmd_data == NULL){
4999 dbg("[SAT] SAT PARSER - o_cmd_data == NULL");
5000 return TCORE_SAT_ERROR_FATAL;
5003 cmd_data = &o_cmd_data[0];
5004 temp_index = curr_offset+2;
5005 sat_cmd_ind_data->data.close_channel.command_detail.cmd_num = cmd_data[temp_index++];
5006 sat_cmd_ind_data->data.close_channel.command_detail.cmd_type = cmd_data[temp_index++];
5008 /** command detail **/
5012 memcpy(dev_id,&cmd_data[temp_index],4);
5013 rv = _sat_decode_device_identities_tlv(dev_id, &sat_cmd_ind_data->data.close_channel.device_id);
5014 if(rv != TCORE_SAT_SUCCESS)
5017 //alpha identifier - optional
5019 if((cmd_data[temp_index]&0x7F) == SATK_ALPHA_IDENTIFIER_TAG){
5020 rv = _sat_decode_alpha_identifier_tlv(o_cmd_data, o_length, temp_index, &sat_cmd_ind_data->data.close_channel.alpha_id, &data_len_consumed);
5021 if(rv != TCORE_SAT_SUCCESS) {
5024 temp_index+=data_len_consumed;
5027 //icon id - optional
5028 if((cmd_data[temp_index]&0x7F) == SATK_ICON_IDENTIFIER_TAG){
5029 data_len_consumed = 0;
5030 rv = _sat_decode_icon_identifier_tlv(o_cmd_data, o_length, temp_index, &sat_cmd_ind_data->data.close_channel.icon_id, &data_len_consumed);
5031 if(rv != TCORE_SAT_SUCCESS){
5032 return rv; //SEND TR
5034 temp_index+=data_len_consumed; //temp_index pointing to the Tag of next TLV
5037 //ToDo: Text Attribute and frames
5039 dbg("[SAT] SAT PARSER - :decoding done!.");
5040 return TCORE_SAT_SUCCESS;
5043 //6.4.29 RECEIVE DATA
5044 static enum tcore_sat_result _sat_decode_receive_data(unsigned char* o_cmd_data, int o_length,
5045 int curr_offset, struct tcore_sat_proactive_command *sat_cmd_ind_data)
5048 int data_len_consumed=0;
5049 unsigned char dev_id[4];
5050 unsigned char* cmd_data = NULL;
5051 enum tcore_sat_result rv = TCORE_SAT_SUCCESS;
5053 if(o_cmd_data == NULL){
5054 dbg("[SAT] SAT PARSER - o_cmd_data == NULL");
5055 return TCORE_SAT_ERROR_FATAL;
5058 cmd_data = &o_cmd_data[0];
5059 temp_index = curr_offset+2;
5060 sat_cmd_ind_data->data.receive_data.command_detail.cmd_num = cmd_data[temp_index++];
5061 sat_cmd_ind_data->data.receive_data.command_detail.cmd_type = cmd_data[temp_index++];
5063 /** command detail **/
5067 memcpy(dev_id,&cmd_data[temp_index],4);
5068 rv = _sat_decode_device_identities_tlv(dev_id, &sat_cmd_ind_data->data.receive_data.device_id);
5069 if(rv != TCORE_SAT_SUCCESS)
5072 //alpha identifier - optional
5074 if((cmd_data[temp_index]&0x7F) == SATK_ALPHA_IDENTIFIER_TAG){
5075 rv = _sat_decode_alpha_identifier_tlv(o_cmd_data, o_length, temp_index, &sat_cmd_ind_data->data.receive_data.alpha_id, &data_len_consumed);
5076 if(rv != TCORE_SAT_SUCCESS) {
5079 temp_index+=data_len_consumed;
5082 //icon id - optional
5083 if((cmd_data[temp_index]&0x7F) == SATK_ICON_IDENTIFIER_TAG){
5084 data_len_consumed = 0;
5085 rv = _sat_decode_icon_identifier_tlv(o_cmd_data, o_length, temp_index, &sat_cmd_ind_data->data.receive_data.icon_id, &data_len_consumed);
5086 if(rv != TCORE_SAT_SUCCESS){
5087 return rv; //SEND TR
5089 temp_index+=data_len_consumed; //temp_index pointing to the Tag of next TLV
5092 //channel data length
5093 rv =_sat_decode_channel_data_length_tlv(o_cmd_data, o_length, temp_index, &sat_cmd_ind_data->data.receive_data.channel_data_len, &data_len_consumed);
5094 if(rv != TCORE_SAT_SUCCESS){
5095 return rv; //SEND TR
5098 //ToDo: Text Attribute and frames
5100 dbg("[SAT] SAT PARSER - :decoding done!.");
5101 return TCORE_SAT_SUCCESS;
5105 static enum tcore_sat_result _sat_decode_send_data(unsigned char* o_cmd_data, int o_length,
5106 int curr_offset, struct tcore_sat_proactive_command *sat_cmd_ind_data)
5109 int data_len_consumed=0;
5110 unsigned char dev_id[4];
5111 unsigned char* cmd_data = NULL;
5112 enum tcore_sat_result rv = TCORE_SAT_SUCCESS;
5114 if(o_cmd_data == NULL){
5115 dbg("[SAT] SAT PARSER - o_cmd_data == NULL");
5116 return TCORE_SAT_ERROR_FATAL;
5119 cmd_data = &o_cmd_data[0];
5120 temp_index = curr_offset+2;
5121 sat_cmd_ind_data->data.send_data.command_detail.cmd_num = cmd_data[temp_index++];
5122 sat_cmd_ind_data->data.send_data.command_detail.cmd_type = cmd_data[temp_index++];
5124 /** command detail **/
5125 sat_cmd_ind_data->data.send_data.command_detail.cmd_qualifier.send_data.send_data_immediately = FALSE;
5126 if(cmd_data[temp_index]&0x01){
5127 sat_cmd_ind_data->data.send_data.command_detail.cmd_qualifier.send_data.send_data_immediately = TRUE;
5128 dbg("[SAT] SAT PARSER - Send data immediately");
5133 memcpy(dev_id,&cmd_data[temp_index],4);
5134 rv = _sat_decode_device_identities_tlv(dev_id, &sat_cmd_ind_data->data.send_data.device_id);
5135 if(rv != TCORE_SAT_SUCCESS)
5138 //alpha identifier - optional
5140 if((cmd_data[temp_index]&0x7F) == SATK_ALPHA_IDENTIFIER_TAG){
5141 rv = _sat_decode_alpha_identifier_tlv(o_cmd_data, o_length, temp_index, &sat_cmd_ind_data->data.send_data.alpha_id, &data_len_consumed);
5142 if(rv != TCORE_SAT_SUCCESS) {
5145 temp_index+=data_len_consumed;
5148 //icon id - optional
5149 if((cmd_data[temp_index]&0x7F) == SATK_ICON_IDENTIFIER_TAG){
5150 data_len_consumed = 0;
5151 rv = _sat_decode_icon_identifier_tlv(o_cmd_data, o_length, temp_index, &sat_cmd_ind_data->data.send_data.icon_id, &data_len_consumed);
5152 if(rv != TCORE_SAT_SUCCESS){
5153 return rv; //SEND TR
5155 temp_index+=data_len_consumed; //temp_index pointing to the Tag of next TLV
5159 rv =_sat_decode_channel_data_tlv(o_cmd_data, o_length, temp_index, &sat_cmd_ind_data->data.send_data.channel_data, &data_len_consumed);
5160 if(rv != TCORE_SAT_SUCCESS){
5161 return rv; //SEND TR
5164 //ToDo: Text Attribute and frames
5166 dbg("[SAT] SAT PARSER - :decoding done!.");
5167 return TCORE_SAT_SUCCESS;
5170 //6.4.31 GET CHANNEL STATUS
5171 static enum tcore_sat_result _sat_decode_get_channel_status(unsigned char* o_cmd_data, int o_length,
5172 int curr_offset, struct tcore_sat_proactive_command *sat_cmd_ind_data)
5175 unsigned char dev_id[4];
5176 unsigned char* cmd_data = NULL;
5177 enum tcore_sat_result rv = TCORE_SAT_SUCCESS;
5179 if(o_cmd_data == NULL){
5180 dbg("[SAT] SAT PARSER - o_cmd_data == NULL");
5181 return TCORE_SAT_ERROR_FATAL;
5184 cmd_data = &o_cmd_data[0];
5185 temp_index = curr_offset+2;
5186 sat_cmd_ind_data->data.get_channel_status.command_detail.cmd_num = cmd_data[temp_index++];
5187 sat_cmd_ind_data->data.get_channel_status.command_detail.cmd_type = cmd_data[temp_index++];
5189 /** command detail **/
5193 memcpy(dev_id,&cmd_data[temp_index],4);
5194 rv = _sat_decode_device_identities_tlv(dev_id, &sat_cmd_ind_data->data.get_channel_status.device_id);
5195 if(rv != TCORE_SAT_SUCCESS)
5198 dbg("[SAT] SAT PARSER - :decoding done!.");
5199 return TCORE_SAT_SUCCESS;
5202 //6.4.XX Unsupported Command
5203 static enum tcore_sat_result _sat_decode_unsupported_command(unsigned char* o_cmd_data, int o_length,
5204 int curr_offset, struct tcore_sat_proactive_command *sat_cmd_ind_data)
5207 unsigned char dev_id[4];
5208 unsigned char* cmd_data = NULL;
5209 enum tcore_sat_result rv = TCORE_SAT_SUCCESS;
5211 if(o_cmd_data == NULL){
5212 dbg("[SAT] SAT PARSER - o_cmd_data == NULL");
5213 return TCORE_SAT_ERROR_FATAL;
5216 cmd_data = &o_cmd_data[0];
5217 temp_index = curr_offset+2;
5218 sat_cmd_ind_data->data.unsupport_cmd.command_detail.cmd_num = cmd_data[temp_index++];
5219 sat_cmd_ind_data->data.unsupport_cmd.command_detail.cmd_type = cmd_data[temp_index++];
5221 /** command detail **/
5225 memcpy(dev_id,&cmd_data[temp_index],4);
5226 rv = _sat_decode_device_identities_tlv(dev_id, &sat_cmd_ind_data->data.unsupport_cmd.device_id);
5227 if(rv != TCORE_SAT_SUCCESS)
5230 dbg("[SAT] SAT PARSER - :decoding done!.");
5231 return TCORE_SAT_SUCCESS;
5234 int tcore_sat_decode_proactive_command(unsigned char* tlv_origin, unsigned int tlv_length,
5235 struct tcore_sat_proactive_command* decoded_tlv)
5237 unsigned int temp_index = 0;
5238 int length_field_len = 0;
5239 enum tcore_sat_result rv = TCORE_SAT_SUCCESS;
5241 if(tlv_origin == NULL || tlv_length <=2) {
5242 dbg("[SAT] SAT PARSER - pointer pData passed is NULL or invalid length.");
5243 return TCORE_SAT_ERROR_FATAL;
5247 if(tlv_origin[temp_index++]!= SATK_PROACTIVE_CMD_TAG) {
5248 dbg("[SAT] SAT PARSER - Did not find Proactive command tag.tag=%d", tlv_origin[temp_index-1]);
5249 return TCORE_SAT_ERROR_FATAL;
5253 length_field_len = _get_length_filed_size(tlv_origin[temp_index]);
5254 if(length_field_len == 0) {
5255 dbg("[SAT] SAT PARSER - Invalid length.");
5256 return TCORE_SAT_ERROR_FATAL;
5259 dbg("[SAT] SAT PARSER - tlv_length=%d", tlv_length);
5260 temp_index+=length_field_len;
5262 //check command validation
5263 if(tlv_length < temp_index+5+4)//command detail(5) and device identities(4)
5264 return TCORE_SAT_ERROR_FATAL;
5266 //check comprehensive value
5267 if((tlv_origin[temp_index] | 0x7F) != 0x7F){
5268 dbg("comprehensive value 0x%x", tlv_origin[temp_index] | 0x7F);
5269 b_comprehensive = TRUE;
5272 if( (tlv_origin[temp_index] & 0x7F) != SATK_COMMAND_DETAILS_TAG){
5273 err("[SAT] no command detail info");
5274 return TCORE_SAT_ERROR_FATAL;
5277 if( tlv_origin[temp_index+1] != SATK_COMMAND_DETAILS_LENGTH){
5278 err("[SAT] invalid command detail length");
5279 return TCORE_SAT_ERROR_FATAL;
5282 decoded_tlv->cmd_num= tlv_origin[temp_index+2];
5283 decoded_tlv->cmd_type = tlv_origin[temp_index+3];
5285 switch(decoded_tlv->cmd_type) {
5286 case SAT_PROATV_CMD_DISPLAY_TEXT: //6.4.1
5287 dbg("[SAT] SAT PARSER - SAT_CMD_TYPE_DISPLAY_TEXT");
5288 rv = _sat_decode_display_text(tlv_origin, tlv_length, temp_index, decoded_tlv);
5290 case SAT_PROATV_CMD_GET_INKEY: //6.4.2
5291 dbg("[SAT] SAT PARSER - SAT_CMD_TYPE_GET_INKEY");
5292 rv = _sat_decode_get_inkey(tlv_origin, tlv_length, temp_index, decoded_tlv);
5294 case SAT_PROATV_CMD_GET_INPUT: //6.4.3
5295 dbg("[SAT] SAT PARSER - SAT_CMD_TYPE_GET_INPUT");
5296 rv = _sat_decode_get_input(tlv_origin, tlv_length, temp_index, decoded_tlv);
5298 case SAT_PROATV_CMD_MORE_TIME: //6.4.4
5299 dbg("[SAT] SAT PARSER - SAT_CMD_TYPE_MORE_TIME");
5300 rv = _sat_decode_more_time(tlv_origin, tlv_length, temp_index, decoded_tlv);
5302 case SAT_PROATV_CMD_PLAY_TONE: //6.4.5
5303 dbg("[SAT] SAT PARSER - SAT_CMD_TYPE_PLAY TONE");
5304 rv = _sat_decode_play_tone(tlv_origin, tlv_length, temp_index, decoded_tlv);
5306 //case POLL INTERVAL //6.4.6 processing by cp
5307 case SAT_PROATV_CMD_REFRESH: //6.4.7
5308 dbg("[SAT] SAT PARSER - SAT_CMD_TYPE_REFRESH");
5309 rv = _sat_decode_refresh(tlv_origin, tlv_length, temp_index, decoded_tlv);
5311 case SAT_PROATV_CMD_SETUP_MENU: //6.4.8
5312 dbg("[SAT] SAT PARSER - SAT_PROATV_CMD_SETUP_MENU");
5313 rv = _sat_decode_setup_menu(tlv_origin, tlv_length, temp_index, decoded_tlv);
5315 case SAT_PROATV_CMD_SELECT_ITEM: //6.4.9
5316 dbg("[SAT] SAT PARSER - SAT_CMD_TYPE_SELECT_ITEM");
5317 rv = _sat_decode_select_item(tlv_origin, tlv_length, temp_index, decoded_tlv);
5319 case SAT_PROATV_CMD_SEND_SMS: //6.4.10
5320 dbg("[SAT] SAT PARSER - SAT_CMD_TYPE_SEND_SMS");
5321 rv = _sat_decode_send_sms(tlv_origin, tlv_length, temp_index, decoded_tlv);
5323 case SAT_PROATV_CMD_SEND_SS: //6.4.11
5324 dbg("[SAT] SAT PARSER - SAT_CMD_TYPE_SEND_SS");
5325 rv = _sat_decode_send_ss(tlv_origin, tlv_length, temp_index, decoded_tlv);
5327 case SAT_PROATV_CMD_SEND_USSD: //6.4.12
5328 dbg("[SAT] SAT PARSER - SAT_CMD_TYPE_SEND_USSD");
5329 rv = _sat_decode_send_ussd(tlv_origin, tlv_length, temp_index, decoded_tlv);
5331 case SAT_PROATV_CMD_SETUP_CALL: //6.4.13
5332 dbg("[SAT] SAT PARSER - SAT_CMD_TYPE_SETUP_CALL");
5333 rv = _sat_decode_setup_call(tlv_origin, tlv_length, temp_index, decoded_tlv);
5335 case SAT_PROATV_CMD_PROVIDE_LOCAL_INFO: //6.4.15
5336 dbg("[SAT] SAT PARSER - SAT_PROATV_CMD_PROVIDE_LOCAL_INFO");
5337 rv = _sat_decode_provide_local_info(tlv_origin, tlv_length, temp_index, decoded_tlv);
5339 case SAT_PROATV_CMD_SETUP_EVENT_LIST: //6.4.16
5340 dbg("[SAT] SAT PARSER - SAT_CMD_TYPE_SETUP_EVENT_LIST");
5341 rv = _sat_decode_setup_event_list(tlv_origin, tlv_length, temp_index, decoded_tlv);
5343 case SAT_PROATV_CMD_SETUP_IDLE_MODE_TEXT: //6.4.22
5344 dbg("[SAT] SAT PARSER - SAT_PROATV_CMD_SETUP_IDLE_MODE_TEXT");
5345 rv = _sat_decode_setup_idle_mode_text(tlv_origin, tlv_length, temp_index, decoded_tlv);
5347 case SAT_PROATV_CMD_SEND_DTMF: //6.4.24
5348 dbg("[SAT] SAT PARSER - SAT_PROATV_CMD_SEND_DTMF");
5349 rv = _sat_decode_send_dtmf(tlv_origin, tlv_length, temp_index, decoded_tlv);
5351 case SAT_PROATV_CMD_LANGUAGE_NOTIFICATION: //6.4.25
5352 dbg("[SAT] SAT PARSER - SAT_PROATV_CMD_LANGUAGE_NOTIFICATION");
5353 rv = _sat_decode_language_notification(tlv_origin, tlv_length, temp_index, decoded_tlv);
5355 case SAT_PROATV_CMD_LAUNCH_BROWSER: //6.4.26
5356 dbg("[SAT] SAT PARSER - SAT_PROATV_CMD_LAUNCH_BROWSER");
5357 rv = _sat_decode_launch_browser(tlv_origin, tlv_length, temp_index, decoded_tlv);
5359 case SAT_PROATV_CMD_OPEN_CHANNEL://6.4.27
5360 dbg("[SAT] SAT PARSER - SAT_CMD_TYPE_OPEN_CHANNEL");
5361 rv = _sat_decode_open_channel(tlv_origin, tlv_length, temp_index, decoded_tlv);
5363 case SAT_PROATV_CMD_CLOSE_CHANNEL://6.4.28
5364 dbg("[SAT] SAT PARSER - SAT_CMD_TYPE_CLOSE_CHANNEL");
5365 rv = _sat_decode_close_channel(tlv_origin, tlv_length, temp_index, decoded_tlv);
5367 case SAT_PROATV_CMD_RECEIVE_DATA://6.4.29
5368 dbg("[SAT] SAT PARSER - SAT_CMD_TYPE_RECEIVE_DATA");
5369 rv = _sat_decode_receive_data(tlv_origin, tlv_length, temp_index, decoded_tlv);
5371 case SAT_PROATV_CMD_SEND_DATA://6.4.30
5372 dbg("[SAT] SAT PARSER - SAT_CMD_TYPE_SEND_DATA");
5373 rv = _sat_decode_send_data(tlv_origin, tlv_length, temp_index, decoded_tlv);
5375 case SAT_PROATV_CMD_GET_CHANNEL_STATUS://6.4.31
5376 dbg("[SAT] SAT PARSER - SAT_CMD_TYPE_GET_CHANNEL_STATUS");
5377 rv = _sat_decode_get_channel_status(tlv_origin, tlv_length, temp_index, decoded_tlv);
5380 dbg("[SAT] SAT PARSER - ME cannot perform this command =0x[%02x]", decoded_tlv->cmd_type);
5381 rv = _sat_decode_unsupported_command(tlv_origin, tlv_length, temp_index, decoded_tlv);
5385 dbg("[SAT] SAT PARSER - each command parsing done.");
5389 int tcore_sat_decode_call_control_result(unsigned char* tlv_origin, unsigned int tlv_length, struct tnoti_sat_call_control_result_ind* call_ctrl_result_tlv)
5391 unsigned int temp_index = 0;
5392 int length = 0, data_len = 0, data_len_consumed = 0;
5393 enum tcore_sat_result rv = TCORE_SAT_SUCCESS;
5395 if(tlv_origin == NULL || tlv_length <=2) {
5396 dbg("[SAT] SAT PARSER - pointer pData passed is NULL or invalid length.");
5397 return TCORE_SAT_ERROR_FATAL;
5400 //call conrol result
5401 call_ctrl_result_tlv->cc_result = tlv_origin[temp_index++];
5402 length = _get_length_filed_size(tlv_origin[temp_index]);
5404 dbg("[SAT] fail to get the call control result length");
5405 return TCORE_SAT_ERROR_FATAL;
5407 temp_index = temp_index+length-1;
5408 data_len = tlv_origin[temp_index];
5409 dbg("[SAT] call control result (%d), data len(%d)",call_ctrl_result_tlv->cc_result, data_len);
5411 dbg("no more call control result - decoding done");
5416 //address - optional (voice call)
5417 if((tlv_origin[temp_index]&0x7F) == SATK_ADDRESS_TAG){
5418 rv = _sat_decode_address_tlv(tlv_origin, tlv_length, temp_index, &call_ctrl_result_tlv->address, &data_len_consumed);
5419 if(rv != TCORE_SAT_SUCCESS) {
5422 temp_index+=data_len_consumed;
5424 if(temp_index >= tlv_length){
5425 dbg("[SAT] call control decoding done");
5426 return TCORE_SAT_SUCCESS;
5430 //ss string - optional (ss)
5431 if((tlv_origin[temp_index]&0x7F) == SATK_SS_STRING_TAG){
5432 rv = _sat_decode_ss_string_tlv(tlv_origin, tlv_length, temp_index, &call_ctrl_result_tlv->ss_string, &data_len_consumed);
5433 if(rv != TCORE_SAT_SUCCESS) {
5436 temp_index+=data_len_consumed;
5438 if(temp_index >= tlv_length){
5439 dbg("[SAT] call control decoding done");
5440 return TCORE_SAT_SUCCESS;
5445 if((tlv_origin[temp_index]&0x7F)==SATK_CAPABILITY_CONFIGURATION_PARAMETERS_TAG){
5446 rv =_sat_decode_ccp_tlv(tlv_origin, tlv_length, temp_index, &call_ctrl_result_tlv->ccp1, &data_len_consumed);
5447 if(rv != TCORE_SAT_SUCCESS){
5448 return rv; //SEND TR
5450 temp_index+=data_len_consumed;
5452 if(temp_index >= tlv_length){
5453 dbg("[SAT] call control decoding done");
5454 return TCORE_SAT_SUCCESS;
5459 if((tlv_origin[temp_index]&0x7F) == SATK_SUB_ADDRESS_TAG){
5460 rv = _sat_decode_sub_address_tlv(tlv_origin, tlv_length, temp_index, &call_ctrl_result_tlv->sub_address, &data_len_consumed);
5461 if(rv != TCORE_SAT_SUCCESS) {
5464 temp_index+=data_len_consumed;
5466 if(temp_index >= tlv_length){
5467 dbg("[SAT] call control decoding done");
5468 return TCORE_SAT_SUCCESS;
5473 if((tlv_origin[temp_index]&0x7F) == SATK_ALPHA_IDENTIFIER_TAG){
5474 rv = _sat_decode_alpha_identifier_tlv(tlv_origin, tlv_length, temp_index, &call_ctrl_result_tlv->alpha_id, &data_len_consumed);
5475 if(rv != TCORE_SAT_SUCCESS) {
5478 temp_index+=data_len_consumed;
5480 if(temp_index >= tlv_length){
5481 dbg("[SAT] call control decoding done");
5482 return TCORE_SAT_SUCCESS;
5486 //bc repeated indicator
5487 if((tlv_origin[temp_index]&0x7F) == SATK_BC_REPEAT_INDICATOR_TAG){
5489 int bc_repeat_ind_len = 0;
5491 tag = tlv_origin[temp_index++];
5492 bc_repeat_ind_len = tlv_origin[temp_index++];
5493 call_ctrl_result_tlv->bc_repeat_type.bc_indi_repeat_type = tlv_origin[temp_index++];
5495 dbg("bc repeated indication tag(%x) len(%x) type(%x)", tag, bc_repeat_ind_len, call_ctrl_result_tlv->bc_repeat_type.bc_indi_repeat_type);
5496 if(temp_index >= tlv_length){
5497 dbg("[SAT] call control decoding done");
5498 return TCORE_SAT_SUCCESS;
5503 if((tlv_origin[temp_index]&0x7F)==SATK_CAPABILITY_CONFIGURATION_PARAMETERS_TAG){
5504 rv =_sat_decode_ccp_tlv(tlv_origin, tlv_length, temp_index, &call_ctrl_result_tlv->ccp2, &data_len_consumed);
5505 if(rv != TCORE_SAT_SUCCESS){
5506 return rv; //SEND TR
5508 temp_index+=data_len_consumed;
5510 if(temp_index >= tlv_length){
5511 dbg("[SAT] call control decoding done");
5512 return TCORE_SAT_SUCCESS;
5519 static unsigned char _sat_encode_dcs_tlv(const struct data_coding_scheme* src)
5521 unsigned char rv = 0x00;
5526 if(src->is_compressed_format)
5530 switch(src->m_class){
5539 case MSG_CLASS_RESERVED:
5540 case MSG_CLASS_NONE:
5547 switch(src->a_format)
5549 case ALPHABET_FORMAT_SMS_DEFAULT:
5553 case ALPHABET_FORMAT_8BIT_DATA:
5557 case ALPHABET_FORMAT_UCS2:
5569 static int _sat_encode_command_detail_tlv(const struct tel_sat_cmd_detail_info* src, char *dst, int current_temp_index)
5571 dst[current_temp_index++] = (b_comprehensive ? (SATK_COMMAND_DETAILS_TAG | 0x80) : SATK_COMMAND_DETAILS_TAG);
5572 dst[current_temp_index++] = SATK_COMMAND_DETAILS_LENGTH;
5573 dst[current_temp_index++] = src->cmd_num;
5574 dst[current_temp_index++] = src->cmd_type;
5575 dst[current_temp_index] = 0x00;
5577 switch(src->cmd_type){
5578 case SAT_PROATV_CMD_DISPLAY_TEXT:{
5579 //command detail text priority
5580 if (src->cmd_qualifier.display_text.text_priority == TEXT_PRIORITY_HIGH)
5581 dst[current_temp_index] += 0x01;
5583 //command detail text clear type
5584 if (src->cmd_qualifier.display_text.text_clear_type == TEXT_WAIT_FOR_USER_TO_CLEAR_MSG)
5585 dst[current_temp_index] += 0x80;
5587 case SAT_PROATV_CMD_GET_INKEY:{
5588 //command detail alphabet set
5589 if(src->cmd_qualifier.get_inkey.alphabet_set)
5590 dst[current_temp_index] += 0x01;
5592 //command detail alphabet type
5593 if(src->cmd_qualifier.get_inkey.alphabet_type == INPUT_ALPHABET_TYPE_UCS2)
5594 dst[current_temp_index] += 0x02;
5596 //command detail get inkey type
5597 if(src->cmd_qualifier.get_inkey.inkey_type == INKEY_TYPE_YES_NO_REQUESTED)
5598 dst[current_temp_index] += 0x04;
5601 //command detail immediate response required
5602 if(src->cmd_qualifier.get_inkey.immediate_rsp_required)
5603 dst[current_temp_index] += 0x08;
5605 //command detail help available
5606 if (src->cmd_qualifier.get_inkey.help_info)
5607 dst[current_temp_index] += 0x80;
5609 case SAT_PROATV_CMD_GET_INPUT:{
5610 //command detail alphabet set
5611 if(src->cmd_qualifier.get_input.alphabet_set)
5612 dst[current_temp_index] += 0x01;
5614 //command detail alphabet type
5615 if(src->cmd_qualifier.get_input.alphabet_type == INPUT_ALPHABET_TYPE_UCS2)
5616 dst[current_temp_index] += 0x02;
5618 //command detail echo user input
5619 if(!src->cmd_qualifier.get_input.me_echo_user_input)
5620 dst[current_temp_index] += 0x04;
5622 //command detail user input unpacked format
5623 if(!src->cmd_qualifier.get_input.user_input_unpacked_format)
5624 dst[current_temp_index] += 0x08;
5626 //command detail help available
5627 if (src->cmd_qualifier.get_input.help_info)
5628 dst[current_temp_index] += 0x80;
5630 case SAT_PROATV_CMD_MORE_TIME:{
5631 dbg("more time : 1bit RFU")
5633 case SAT_PROATV_CMD_PLAY_TONE:{
5634 //command detail vibration alert
5635 if(src->cmd_qualifier.play_tone.vibration_alert == VIBRATE_ALERT_REQUIRED)
5636 dst[current_temp_index] += 0x01;
5638 case SAT_PROATV_CMD_REFRESH:{
5639 //command detail refresh command
5640 dst[current_temp_index] += src->cmd_qualifier.refresh.refresh;
5642 case SAT_PROATV_CMD_SETUP_MENU:{
5643 //command detail preferences
5644 if (src->cmd_qualifier.setup_menu.select_preference == SELECTION_PREFERENCE_USING_SOFT_KEY)
5645 dst[current_temp_index] += 0x01;
5647 //command detail help available
5648 if (src->cmd_qualifier.setup_menu.help_info)
5649 dst[current_temp_index] += 0x80;
5651 case SAT_PROATV_CMD_SELECT_ITEM:{
5652 //command detail presentation
5653 if(src->cmd_qualifier.select_item.presentation_type != PRESENTATION_TYPE_NOT_SPECIFIED){
5654 dst[current_temp_index] += 0x01;
5655 if(src->cmd_qualifier.select_item.presentation_type == PRESENTATION_TYPE_NAVIGATION_OPTION){
5656 dst[current_temp_index] += PRESENTATION_TYPE_NAVIGATION_OPTION;
5660 //command detail selection preference
5661 if(src->cmd_qualifier.select_item.select_preference == SELECTION_PREFERENCE_USING_SOFT_KEY)
5662 dst[current_temp_index] += 0x04;
5664 //command detail help available
5665 if (src->cmd_qualifier.select_item.help_info)
5666 dst[current_temp_index] += 0x80;
5668 case SAT_PROATV_CMD_SEND_SMS:{
5669 //command detail sms packing by me required
5670 if(src->cmd_qualifier.send_sms.packing_by_me_required)
5671 dst[current_temp_index] += 0x01;
5673 case SAT_PROATV_CMD_SETUP_CALL:{
5674 //command detail setup call command;
5675 dst[current_temp_index] += src->cmd_qualifier.setup_call.setup_call;
5677 case SAT_PROATV_CMD_SETUP_EVENT_LIST:{
5678 dbg("setup evnet list : 1bit RFU")
5680 case SAT_PROATV_CMD_OPEN_CHANNEL:{
5681 if(src->cmd_qualifier.open_channel.immediate_link)
5682 dst[current_temp_index] += 0x01;
5683 if(src->cmd_qualifier.open_channel.automatic_reconnection)
5684 dst[current_temp_index] += 0x02;
5685 if(src->cmd_qualifier.open_channel.background_mode)
5686 dst[current_temp_index] += 0x04;
5688 case SAT_PROATV_CMD_SEND_DATA:{
5689 if(src->cmd_qualifier.send_data.send_data_immediately)
5690 dst[current_temp_index] += 0x01;
5692 case SAT_PROATV_CMD_PROVIDE_LOCAL_INFO:{
5693 dst[current_temp_index] += src->cmd_qualifier.provide_local_info.provide_local_info;
5695 case SAT_PROATV_CMD_LANGUAGE_NOTIFICATION:{
5696 if(src->cmd_qualifier.language_notification.specific_language)
5697 dst[current_temp_index] += 0x01;
5699 case SAT_PROATV_CMD_LAUNCH_BROWSER:{
5700 dst[current_temp_index] += src->cmd_qualifier.launch_browser.launch_browser;
5703 err("no matched cmd type(%d)", src->cmd_type);
5710 static int _sat_encode_device_identities_tlv(const struct tel_sat_device_identities* src, char *dst, int current_temp_index)
5712 dst[current_temp_index++] = SATK_DEVICE_IDENTITY_TAG;
5713 dst[current_temp_index++] = SATK_DEVICE_IDENTITY_LENGTH;
5714 dst[current_temp_index++] = src->src;
5715 dst[current_temp_index++] = src->dest;
5717 //device identities total len 4
5721 static int _sat_encode_item_identifier_tlv(const struct tel_sat_item_identifier* src, char *dst, int current_temp_index)
5723 dst[current_temp_index++] =SATK_ITEM_IDENTIFIER_TAG;
5724 dst[current_temp_index++] =SATK_ITEM_IDENTIFIER_LENGTH;
5725 dst[current_temp_index++] = src->item_identifier;
5727 //item identifier total len 3
5731 /*static int _sat_encode_duration_tlv(const struct tel_sat_duration* src, char *dst, int current_temp_index)
5733 dst[current_temp_index++] =SATK_DURATION_TAG;
5734 dst[current_temp_index++] =SATK_DURATION_LENGTH;
5735 dst[current_temp_index++] = src->time_unit;
5736 dst[current_temp_index++] = src->time_interval;
5738 //duration total len 4
5742 static int _sat_encode_text_tlv(const struct tel_sat_text_string_object* src, char *dst, int current_temp_index, gboolean raw_dcs)
5745 int length_temp_index = 0;
5748 dst[current_temp_index++] =SATK_TEXT_STRING_TAG;
5751 if(src->string_length <= 0x7F){
5752 dst[current_temp_index++] =SATK_DCS_LENGTH+src->string_length;
5753 length_temp_index = 1;
5756 dst[current_temp_index++] = 0x81;
5757 dst[current_temp_index++] =SATK_DCS_LENGTH+src->string_length;
5758 length_temp_index = 2;
5763 dst[current_temp_index++] = src->dcs.raw_dcs;
5765 dst[current_temp_index++] =_sat_encode_dcs_tlv(&(src->dcs));
5768 if(src->string_length > 0){
5769 memcpy(&(dst[current_temp_index]), src->string, src->string_length);
5772 //tag+temp_index+dcs+data
5773 total_len = 1+length_temp_index+1+src->string_length;
5778 static int _sat_encode_eventlist_tlv(const enum event_list src, char *dst, int current_temp_index)
5780 dst[current_temp_index++] =SATK_EVENT_LIST_TAG;
5781 dst[current_temp_index++] =0x01;
5782 dst[current_temp_index++] =src;
5787 static int _sat_encode_date_time_and_timezone_tlv(const struct tel_sat_date_time_and_timezone *src, char *dst, int current_temp_index)
5789 dst[current_temp_index++] = SATK_DATE_TIME_AND_TIME_ZONE_TAG;
5790 dst[current_temp_index++] = SATK_DATE_TIME_AND_TIME_ZONE_LENGTH;
5791 dst[current_temp_index++] = src->year;
5792 dst[current_temp_index++] = src->month;
5793 dst[current_temp_index++] = src->day;
5794 dst[current_temp_index++] = src->hour;
5795 dst[current_temp_index++] = src->minute;
5796 dst[current_temp_index++] = src->second;
5797 dst[current_temp_index++] = src->timeZone;
5799 return 1+1+SATK_DATE_TIME_AND_TIME_ZONE_LENGTH; //tag length+len field length+value length;
5802 static int _sat_encode_language_tlv(const enum tel_sim_language_type src, char *dst, int current_temp_index)
5804 dst[current_temp_index++] =SATK_LANGUAGE_TAG;
5805 dst[current_temp_index++] =SATK_LANGUAGE_LENGTH;
5807 dbg("language (%d)", src);
5811 case SIM_LANG_GERMAN :
5812 dst[current_temp_index++] = 'd';
5813 dst[current_temp_index++] = 'e';
5816 case SIM_LANG_ENGLISH :
5817 dst[current_temp_index++] = 'e';
5818 dst[current_temp_index++] = 'n';
5821 case SIM_LANG_ITALIAN :
5822 dst[current_temp_index++] = 'i';
5823 dst[current_temp_index++] = 't';
5826 case SIM_LANG_FRENCH :
5827 dst[current_temp_index++] = 'f';
5828 dst[current_temp_index++] = 'r';
5831 case SIM_LANG_SPANISH :
5832 dst[current_temp_index++] = 'e';
5833 dst[current_temp_index++] = 's';
5836 case SIM_LANG_DUTCH :
5837 dst[current_temp_index++] = 'n';
5838 dst[current_temp_index++] = 'l';
5841 case SIM_LANG_SWEDISH :
5842 dst[current_temp_index++] = 's';
5843 dst[current_temp_index++] = 'v';
5846 case SIM_LANG_DANISH :
5847 dst[current_temp_index++] = 'd';
5848 dst[current_temp_index++] = 'a';
5851 case SIM_LANG_PORTUGUESE :
5852 dst[current_temp_index++] = 'p';
5853 dst[current_temp_index++] = 't';
5856 case SIM_LANG_FINNISH :
5857 dst[current_temp_index++] = 'f';
5858 dst[current_temp_index++] = 'i';
5861 case SIM_LANG_NORWEGIAN :
5862 dst[current_temp_index++] = 'n';
5863 dst[current_temp_index++] = 'b';
5866 case SIM_LANG_GREEK :
5867 dst[current_temp_index++] = 'e';
5868 dst[current_temp_index++] = 'l';
5871 case SIM_LANG_TURKISH :
5872 dst[current_temp_index++] = 't';
5873 dst[current_temp_index++] = 'k';
5876 case SIM_LANG_HUNGARIAN :
5877 dst[current_temp_index++] = 'h';
5878 dst[current_temp_index++] = 'u';
5881 case SIM_LANG_POLISH :
5882 dst[current_temp_index++] = 'p';
5883 dst[current_temp_index++] = 'l';
5886 case SIM_LANG_KOREAN :
5887 dst[current_temp_index++] = 'k';
5888 dst[current_temp_index++] = 'o';
5891 case SIM_LANG_CHINESE :
5892 dst[current_temp_index++] = 'z';
5893 dst[current_temp_index++] = 'h';
5896 case SIM_LANG_RUSSIAN :
5897 dst[current_temp_index++] = 'r';
5898 dst[current_temp_index++] = 'u';
5901 case SIM_LANG_JAPANESE:
5902 dst[current_temp_index++] = 'j';
5903 dst[current_temp_index++] = 'a';
5907 dst[current_temp_index++] = 'e';
5908 dst[current_temp_index++] = 'n';
5909 dbg("[SAT] SAT PARSER - Unknown Language: 0x%x",src);
5916 static int _sat_encode_browser_termination_tlv(const enum browser_termination_cause src, char *dst, int current_temp_index)
5918 dst[current_temp_index++] =SATK_BROWSER_TERMINATION_CAUSE_TAG;
5919 dst[current_temp_index++] =SATK_BROWSER_TERMINATION_CAUSE_LENGTH;
5920 dst[current_temp_index++] =src;
5925 static int _sat_encode_bearer_desc_tlv(const struct tel_sat_bearer_description* src, char *dst, int current_temp_index)
5928 int length_temp_index = 0;
5930 dst[current_temp_index++] =SATK_BEARER_DISCRIPTION_TAG;
5933 length_temp_index = current_temp_index++;
5936 dst[current_temp_index++] = src->bearer_type;
5938 switch(src->bearer_type){
5940 dst[current_temp_index++] = src->bearer_parameter.cs_bearer_param.data_rate;
5941 dst[current_temp_index++] = src->bearer_parameter.cs_bearer_param.service_type;
5942 dst[current_temp_index++] = src->bearer_parameter.cs_bearer_param.connection_element_type;
5945 dst[current_temp_index++] = src->bearer_parameter.ps_bearer_param.precedence_class;
5946 dst[current_temp_index++] = src->bearer_parameter.ps_bearer_param.delay_class;
5947 dst[current_temp_index++] = src->bearer_parameter.ps_bearer_param.reliability_class;
5948 dst[current_temp_index++] = src->bearer_parameter.ps_bearer_param.peak_throughput_class;
5949 dst[current_temp_index++] = src->bearer_parameter.ps_bearer_param.mean_throughput_class;
5950 dst[current_temp_index++] = src->bearer_parameter.ps_bearer_param.pdp_type;
5952 case BEARER_DEFAULT_BEARER_FROM_TRANSPORT_LAYER:
5953 case BEARER_LOCAL_LINK_TECHNOLOGY_INDEPENDENT:
5958 dst[length_temp_index] = (current_temp_index-1) - length_temp_index;
5959 total_len = (current_temp_index-1) - length_temp_index + 2; //tag and length
5964 static int _sat_encode_buffer_size_tlv(const struct tel_sat_buffer_size* src, char *dst, int current_temp_index)
5966 dst[current_temp_index++] = SATK_BUFFER_SIZE_TAG;
5967 dst[current_temp_index++] = SATK_BUFFER_SIZE_LENGTH;
5968 dst[current_temp_index++] = src->size[0];
5969 dst[current_temp_index++] = src->size[1];
5974 static int _sat_encode_channel_data_tlv(const struct tel_sat_channel_data* src, char *dst, int current_temp_index)
5977 int length_temp_index = 0;
5979 dst[current_temp_index++] = SATK_CHANNEL_DATA_TAG;
5981 if(src->data_string_len <= 0x7F){
5982 dst[current_temp_index++] = src->data_string_len;
5983 length_temp_index = 1;
5986 dst[current_temp_index++] = 0x81;
5987 dst[current_temp_index++] = src->data_string_len;
5988 length_temp_index = 2;
5991 memcpy(&(dst[current_temp_index]), src->data_string, src->data_string_len);
5993 total_len = 1+length_temp_index+src->data_string_len;
5998 static int _sat_encode_channel_data_length_tlv(const struct tel_sat_channel_data_len* src, char *dst, int current_temp_index)
6000 dst[current_temp_index++] = SATK_CHANNEL_DATA_LEN_TAG;
6001 dst[current_temp_index++] = SATK_CHANNEL_DATA_LENGTH_VALUE_LENGTH;
6002 dst[current_temp_index++] = src->data_len;
6007 static int _sat_encode_channel_status_tlv(const struct tel_sat_channel_status* src, char *dst, int current_temp_index)
6009 dst[current_temp_index++] = SATK_CHANNEL_STATUS_TAG;
6010 dst[current_temp_index++] = SATK_CHANNEL_STATUS_LENGTH;
6012 if(src->status == link_or_packet_service_activated) //(bit 8)
6013 dst[current_temp_index] += 0x80;
6015 dst[current_temp_index++] += src->channel_id; //(bit 1~3)
6016 dst[current_temp_index++] = src->status_info;
6021 static int _sat_encode_download_event(const struct tel_sat_envelop_event_download_tlv *evt_dl, char *dst_envelop)
6024 int encoded_len = 0;
6026 dbg("event type(%d)", evt_dl->event);
6029 encoded_len = _sat_encode_eventlist_tlv(evt_dl->event, dst_envelop, temp_index);
6030 temp_index += encoded_len;
6033 encoded_len =_sat_encode_device_identities_tlv(&(evt_dl->device_identitie), dst_envelop, temp_index);
6034 temp_index += encoded_len;
6036 switch(evt_dl->event){
6037 case EVENT_LANGUAGE_SELECTION:
6038 encoded_len = _sat_encode_language_tlv(evt_dl->language, dst_envelop, temp_index);
6039 temp_index += encoded_len;
6041 case EVENT_BROWSER_TERMINATION:
6042 encoded_len = _sat_encode_browser_termination_tlv(evt_dl->browser_termination, dst_envelop, temp_index);
6043 temp_index += encoded_len;
6045 case EVENT_DATA_AVAILABLE:
6046 encoded_len = _sat_encode_channel_status_tlv(&(evt_dl->channel_status), dst_envelop, temp_index);
6047 temp_index += encoded_len;
6049 encoded_len = _sat_encode_channel_data_length_tlv(&(evt_dl->channel_data_len), dst_envelop, temp_index);
6050 temp_index += encoded_len;
6052 case EVENT_CHANNEL_STATUS:
6053 encoded_len = _sat_encode_channel_status_tlv(&(evt_dl->channel_status), dst_envelop, temp_index);
6054 temp_index += encoded_len;
6060 dst_envelop[0] = SATK_EVENT_DOWNLOAD_TAG;
6061 dst_envelop[1] = temp_index-2;
6063 dbg("download envelop cmd len(%d)", temp_index);
6065 if(temp_index-2 > 0x7F){
6067 for(idx = temp_index; idx > 0; idx--){
6068 dst_envelop[idx] = dst_envelop[idx+1];
6070 dst_envelop[1] = 0x81;
6072 dbg("download envelop added cmd len(%d)", temp_index);
6078 int tcore_sat_encode_envelop_cmd(const struct treq_sat_envelop_cmd_data *src_envelop, char *dst_envelop)
6080 int temp_index = 0, encoded_len= 0;
6085 if(src_envelop->sub_cmd == ENVELOP_MENU_SELECTION){
6086 temp_index = 2; //set the cursor to device identity
6087 dbg("item id(%d)", src_envelop->envelop_data.menu_select.item_identifier.item_identifier);
6088 encoded_len =_sat_encode_device_identities_tlv(&(src_envelop->envelop_data.menu_select.device_identitie), dst_envelop, temp_index);
6089 temp_index += encoded_len;
6092 encoded_len = _sat_encode_item_identifier_tlv(&(src_envelop->envelop_data.menu_select.item_identifier), dst_envelop, temp_index);
6093 temp_index += encoded_len;
6095 if(src_envelop->envelop_data.menu_select.help_request){
6096 encoded_len = 2;//help request
6097 dst_envelop[temp_index++] = SATK_HELP_REQUEST_TAG;
6098 dst_envelop[temp_index++] = SATK_HELP_REQUEST_LENGTH;
6101 dbg("menu selection cmd len(%d)", temp_index);
6104 dst_envelop[0] = SATK_MENU_SELECTION_TAG;
6105 dst_envelop[1] = temp_index-2;
6107 else if(src_envelop->sub_cmd == ENVELOP_EVENT_DOWNLOAD){
6108 temp_index = _sat_encode_download_event(&(src_envelop->envelop_data.event_download),dst_envelop);
6116 static int _sat_encode_display_text(const struct tel_sat_tr_display_text_tlv *src_tr, char *dst_tr)
6118 int temp_index = 0, encoded_len = 0;
6120 //set command detail info
6121 encoded_len = _sat_encode_command_detail_tlv(&(src_tr->command_detail), dst_tr, temp_index);
6122 temp_index += encoded_len;
6124 //set device identities info
6125 encoded_len = _sat_encode_device_identities_tlv(&(src_tr->device_id), dst_tr, temp_index);
6126 temp_index += encoded_len;
6129 dst_tr[temp_index++] = (b_comprehensive ? (SATK_RESULT_TAG | 0x80) : SATK_RESULT_TAG);
6130 switch(src_tr->result_type){
6131 case RESULT_SUCCESS:
6132 case RESULT_SUCCESS_WITH_PARTIAL_COMPREHENSION:
6133 case RESULT_SUCCESS_WITH_MISSING_INFO:
6134 case RESULT_SUCCESS_BUT_REQUESTED_ICON_NOT_DISPLAYED:
6135 case RESULT_PROACTIVE_SESSION_TERMINATED_BY_USER:
6136 case RESULT_BACKWARD_MOVE_BY_USER:
6137 case RESULT_NO_RESPONSE_FROM_USER:
6138 case RESULT_BEYOND_ME_CAPABILITIES:
6139 case RESULT_COMMAND_TYPE_NOT_UNDERSTOOD_BY_ME:
6140 case RESULT_COMMAND_DATA_NOT_UNDERSTOOD_BY_ME:
6141 case RESULT_COMMAND_NUMBER_NOT_KNOWN_BY_ME:
6142 case RESULT_ERROR_REQUIRED_VALUES_ARE_MISSING:
6143 dst_tr[temp_index++] = 1;
6144 dst_tr[temp_index++] = src_tr->result_type;
6146 case RESULT_ME_UNABLE_TO_PROCESS_COMMAND:
6147 case RESULT_FRAMES_ERROR:
6148 dst_tr[temp_index++] = 2;
6149 dst_tr[temp_index++] = src_tr->result_type;
6150 dst_tr[temp_index++] = src_tr->me_problem_type;
6153 dbg("invalid response value[0x%x] in current TR",src_tr->result_type);
6161 static int _sat_encode_get_inkey(const struct tel_sat_tr_get_inkey_tlv *src_tr, char *dst_tr)
6163 int temp_index = 0, encoded_len = 0;
6165 //set command detail info
6166 encoded_len = _sat_encode_command_detail_tlv(&(src_tr->command_detail), dst_tr, temp_index);
6167 temp_index += encoded_len;
6169 //set device identities info
6170 encoded_len = _sat_encode_device_identities_tlv(&(src_tr->device_id), dst_tr, temp_index);
6171 temp_index += encoded_len;
6174 dst_tr[temp_index++] = (b_comprehensive ? (SATK_RESULT_TAG | 0x80) : SATK_RESULT_TAG);;
6176 switch(src_tr->result_type){
6177 case RESULT_SUCCESS:
6178 case RESULT_SUCCESS_WITH_PARTIAL_COMPREHENSION:
6179 case RESULT_SUCCESS_WITH_MISSING_INFO:
6180 case RESULT_SUCCESS_BUT_REQUESTED_ICON_NOT_DISPLAYED:
6181 dst_tr[temp_index++] = 1;
6182 dst_tr[temp_index++] = src_tr->result_type;
6184 encoded_len = _sat_encode_text_tlv(&(src_tr->text), dst_tr, temp_index, FALSE);
6185 temp_index += encoded_len;
6187 case RESULT_PROACTIVE_SESSION_TERMINATED_BY_USER:
6188 case RESULT_BACKWARD_MOVE_BY_USER:
6189 case RESULT_HELP_INFO_REQUIRED_BY_USER:
6190 case RESULT_BEYOND_ME_CAPABILITIES:
6191 case RESULT_COMMAND_TYPE_NOT_UNDERSTOOD_BY_ME:
6192 case RESULT_COMMAND_DATA_NOT_UNDERSTOOD_BY_ME:
6193 case RESULT_COMMAND_NUMBER_NOT_KNOWN_BY_ME:
6194 case RESULT_ERROR_REQUIRED_VALUES_ARE_MISSING:
6195 case RESULT_NO_RESPONSE_FROM_USER:
6196 dst_tr[temp_index++] = 1;
6197 dst_tr[temp_index++] = src_tr->result_type;
6199 case RESULT_ME_UNABLE_TO_PROCESS_COMMAND:
6200 case RESULT_FRAMES_ERROR:
6201 dst_tr[temp_index++] = 2;
6202 dst_tr[temp_index++] = src_tr->result_type;
6203 dst_tr[temp_index++] = src_tr->me_problem_type;
6206 dbg("invalid response value[0x%x] in current TR",src_tr->result_type);
6214 static int _sat_encode_get_input(const struct tel_sat_tr_get_input_tlv *src_tr, char *dst_tr)
6216 int temp_index = 0, encoded_len = 0;
6218 //set command detail info
6219 encoded_len = _sat_encode_command_detail_tlv(&(src_tr->command_detail), dst_tr, temp_index);
6220 temp_index += encoded_len;
6222 //set device identities info
6223 encoded_len = _sat_encode_device_identities_tlv(&(src_tr->device_id), dst_tr, temp_index);
6224 temp_index += encoded_len;
6227 dst_tr[temp_index++] = (b_comprehensive ? (SATK_RESULT_TAG | 0x80) : SATK_RESULT_TAG);;
6229 switch(src_tr->result_type){
6230 case RESULT_SUCCESS:
6231 case RESULT_SUCCESS_WITH_PARTIAL_COMPREHENSION:
6232 case RESULT_SUCCESS_WITH_MISSING_INFO:
6233 case RESULT_SUCCESS_BUT_REQUESTED_ICON_NOT_DISPLAYED:
6234 dst_tr[temp_index++] = 1;
6235 dst_tr[temp_index++] = src_tr->result_type;
6237 encoded_len = _sat_encode_text_tlv(&(src_tr->text), dst_tr, temp_index, FALSE);
6238 temp_index += encoded_len;
6240 case RESULT_PROACTIVE_SESSION_TERMINATED_BY_USER:
6241 case RESULT_BACKWARD_MOVE_BY_USER:
6242 case RESULT_NO_RESPONSE_FROM_USER:
6243 case RESULT_HELP_INFO_REQUIRED_BY_USER:
6244 case RESULT_BEYOND_ME_CAPABILITIES:
6245 case RESULT_COMMAND_TYPE_NOT_UNDERSTOOD_BY_ME:
6246 case RESULT_COMMAND_DATA_NOT_UNDERSTOOD_BY_ME:
6247 case RESULT_COMMAND_NUMBER_NOT_KNOWN_BY_ME:
6248 case RESULT_ERROR_REQUIRED_VALUES_ARE_MISSING:
6249 dst_tr[temp_index++] = 1;
6250 dst_tr[temp_index++] = src_tr->result_type;
6252 case RESULT_ME_UNABLE_TO_PROCESS_COMMAND:
6253 case RESULT_FRAMES_ERROR:
6254 dst_tr[temp_index++] = 2;
6255 dst_tr[temp_index++] = src_tr->result_type;
6256 dst_tr[temp_index++] = src_tr->me_problem_type;
6259 dbg("invalid response value[0x%x] in current TR",src_tr->result_type);
6267 static int _sat_encode_more_time(const struct tel_sat_tr_more_time_tlv *src_tr, char *dst_tr)
6269 int temp_index = 0, encoded_len = 0;
6271 //set command detail info
6272 encoded_len = _sat_encode_command_detail_tlv(&(src_tr->command_detail), dst_tr, temp_index);
6273 temp_index += encoded_len;
6275 //set device identities info
6276 encoded_len = _sat_encode_device_identities_tlv(&(src_tr->device_id), dst_tr, temp_index);
6277 temp_index += encoded_len;
6280 dst_tr[temp_index++] = (b_comprehensive ? (SATK_RESULT_TAG | 0x80) : SATK_RESULT_TAG);;
6282 switch(src_tr->result_type){
6283 case RESULT_SUCCESS:
6284 case RESULT_SUCCESS_WITH_PARTIAL_COMPREHENSION:
6285 case RESULT_SUCCESS_WITH_MISSING_INFO:
6286 case RESULT_BEYOND_ME_CAPABILITIES:
6287 case RESULT_COMMAND_TYPE_NOT_UNDERSTOOD_BY_ME:
6288 case RESULT_COMMAND_DATA_NOT_UNDERSTOOD_BY_ME:
6289 case RESULT_COMMAND_NUMBER_NOT_KNOWN_BY_ME:
6290 case RESULT_ERROR_REQUIRED_VALUES_ARE_MISSING:
6291 dst_tr[temp_index++] = 1;
6292 dst_tr[temp_index++] = src_tr->result_type;
6294 case RESULT_ME_UNABLE_TO_PROCESS_COMMAND:
6295 dst_tr[temp_index++] = 2;
6296 dst_tr[temp_index++] = src_tr->result_type;
6297 dst_tr[temp_index++] = src_tr->me_problem_type;
6300 dbg("invalid response value[0x%x] in current TR",src_tr->result_type);
6308 static int _sat_encode_play_tone(const struct tel_sat_tr_play_tone_tlv *src_tr, char *dst_tr)
6310 int temp_index = 0, encoded_len = 0;
6312 //set command detail info
6313 encoded_len = _sat_encode_command_detail_tlv(&(src_tr->command_detail), dst_tr, temp_index);
6314 temp_index += encoded_len;
6316 //set device identities info
6317 encoded_len = _sat_encode_device_identities_tlv(&(src_tr->device_id), dst_tr, temp_index);
6318 temp_index += encoded_len;
6321 dst_tr[temp_index++] = (b_comprehensive ? (SATK_RESULT_TAG | 0x80) : SATK_RESULT_TAG);;
6323 switch(src_tr->result_type){
6324 case RESULT_SUCCESS:
6325 case RESULT_SUCCESS_WITH_PARTIAL_COMPREHENSION:
6326 case RESULT_SUCCESS_WITH_MISSING_INFO:
6327 case RESULT_SUCCESS_BUT_REQUESTED_ICON_NOT_DISPLAYED:
6328 case RESULT_SUCCESS_BUT_TONE_NOT_PLAYED:
6329 case RESULT_PROACTIVE_SESSION_TERMINATED_BY_USER:
6330 case RESULT_BEYOND_ME_CAPABILITIES:
6331 case RESULT_COMMAND_TYPE_NOT_UNDERSTOOD_BY_ME:
6332 case RESULT_COMMAND_DATA_NOT_UNDERSTOOD_BY_ME:
6333 case RESULT_COMMAND_NUMBER_NOT_KNOWN_BY_ME:
6334 case RESULT_ERROR_REQUIRED_VALUES_ARE_MISSING:
6335 dst_tr[temp_index++] = 1;
6336 dst_tr[temp_index++] = src_tr->result_type;
6338 case RESULT_ME_UNABLE_TO_PROCESS_COMMAND:
6339 case RESULT_FRAMES_ERROR:
6340 dst_tr[temp_index++] = 2;
6341 dst_tr[temp_index++] = src_tr->result_type;
6342 dst_tr[temp_index++] = src_tr->me_problem_type;
6345 dbg("invalid response value[0x%x] in current TR",src_tr->result_type);
6353 static int _sat_encode_refresh(const struct tel_sat_tr_refresh_tlv *src_tr, char *dst_tr)
6355 int temp_index = 0, encoded_len = 0;
6357 //set command detail info
6358 encoded_len = _sat_encode_command_detail_tlv(&(src_tr->command_detail), dst_tr, temp_index);
6359 temp_index += encoded_len;
6361 //set device identities info
6362 encoded_len = _sat_encode_device_identities_tlv(&(src_tr->device_id), dst_tr, temp_index);
6363 temp_index += encoded_len;
6366 dst_tr[temp_index++] = (b_comprehensive ? (SATK_RESULT_TAG | 0x80) : SATK_RESULT_TAG);;
6368 switch(src_tr->result_type){
6369 case RESULT_SUCCESS:
6370 case RESULT_SUCCESS_WITH_PARTIAL_COMPREHENSION:
6371 case RESULT_SUCCESS_WITH_MISSING_INFO:
6372 case RESULT_REFRESH_PERFORMED_WITH_ADDITIONAL_EFS_READ:
6373 case RESULT_REFRESH_PRFRMD_BUT_INDICATED_USIM_NOT_ACTIVE:
6374 case RESULT_BEYOND_ME_CAPABILITIES:
6375 case RESULT_COMMAND_TYPE_NOT_UNDERSTOOD_BY_ME:
6376 case RESULT_COMMAND_DATA_NOT_UNDERSTOOD_BY_ME:
6377 case RESULT_COMMAND_NUMBER_NOT_KNOWN_BY_ME:
6378 case RESULT_ERROR_REQUIRED_VALUES_ARE_MISSING:
6379 dst_tr[temp_index++] = 1;
6380 dst_tr[temp_index++] = src_tr->result_type;
6382 case RESULT_ME_UNABLE_TO_PROCESS_COMMAND:
6383 dst_tr[temp_index++] = 2;
6384 dst_tr[temp_index++] = src_tr->result_type;
6385 dst_tr[temp_index++] = src_tr->me_problem_type;
6388 dbg("invalid response value[0x%x] in current TR",src_tr->result_type);
6396 static int _sat_encode_setup_menu(const struct tel_sat_tr_setup_menu_tlv *src_tr, char *dst_tr)
6398 int temp_index = 0, encoded_len = 0;
6400 //set command detail info
6401 encoded_len = _sat_encode_command_detail_tlv(&(src_tr->command_detail), dst_tr, temp_index);
6402 temp_index += encoded_len;
6404 //set device identities info
6405 encoded_len = _sat_encode_device_identities_tlv(&(src_tr->device_id), dst_tr, temp_index);
6406 temp_index += encoded_len;
6409 dst_tr[temp_index++] = (b_comprehensive ? (SATK_RESULT_TAG | 0x80) : SATK_RESULT_TAG);;
6410 switch(src_tr->result_type){
6411 case RESULT_SUCCESS:
6412 case RESULT_SUCCESS_WITH_PARTIAL_COMPREHENSION:
6413 case RESULT_SUCCESS_WITH_MISSING_INFO:
6414 case RESULT_SUCCESS_BUT_REQUESTED_ICON_NOT_DISPLAYED:
6415 case RESULT_BEYOND_ME_CAPABILITIES:
6416 case RESULT_COMMAND_TYPE_NOT_UNDERSTOOD_BY_ME:
6417 case RESULT_COMMAND_DATA_NOT_UNDERSTOOD_BY_ME:
6418 case RESULT_COMMAND_NUMBER_NOT_KNOWN_BY_ME:
6419 case RESULT_ERROR_REQUIRED_VALUES_ARE_MISSING:
6420 dst_tr[temp_index++] = 1;
6421 dst_tr[temp_index++] = src_tr->result_type;
6423 case RESULT_ME_UNABLE_TO_PROCESS_COMMAND:
6424 dst_tr[temp_index++] = 2;
6425 dst_tr[temp_index++] = src_tr->result_type;
6426 dst_tr[temp_index++] = src_tr->me_problem_type;
6429 dbg("invalid response value[0x%x] in current TR",src_tr->result_type);
6437 static int _sat_encode_select_item(const struct tel_sat_tr_select_item_tlv *src_tr, char *dst_tr)
6439 int temp_index = 0, encoded_len = 0;
6441 //set command detail info
6442 encoded_len = _sat_encode_command_detail_tlv(&(src_tr->command_detail), dst_tr, temp_index);
6443 temp_index += encoded_len;
6445 //set device identities info
6446 encoded_len = _sat_encode_device_identities_tlv(&(src_tr->device_id), dst_tr, temp_index);
6447 temp_index += encoded_len;
6450 dst_tr[temp_index++] = (b_comprehensive ? (SATK_RESULT_TAG | 0x80) : SATK_RESULT_TAG);;
6452 switch(src_tr->result_type){
6453 case RESULT_SUCCESS:
6454 case RESULT_SUCCESS_WITH_PARTIAL_COMPREHENSION:
6455 case RESULT_SUCCESS_WITH_MISSING_INFO:
6456 case RESULT_SUCCESS_BUT_REQUESTED_ICON_NOT_DISPLAYED:
6457 case RESULT_HELP_INFO_REQUIRED_BY_USER:
6458 dst_tr[temp_index++] = 1;
6459 dst_tr[temp_index++] = src_tr->result_type;
6460 encoded_len = _sat_encode_item_identifier_tlv(&(src_tr->item_identifier), dst_tr, temp_index);
6461 temp_index += encoded_len;
6463 case RESULT_PROACTIVE_SESSION_TERMINATED_BY_USER:
6464 case RESULT_BACKWARD_MOVE_BY_USER:
6465 case RESULT_NO_RESPONSE_FROM_USER:
6466 case RESULT_BEYOND_ME_CAPABILITIES:
6467 case RESULT_COMMAND_TYPE_NOT_UNDERSTOOD_BY_ME:
6468 case RESULT_COMMAND_DATA_NOT_UNDERSTOOD_BY_ME:
6469 case RESULT_COMMAND_NUMBER_NOT_KNOWN_BY_ME:
6470 case RESULT_ERROR_REQUIRED_VALUES_ARE_MISSING:
6471 dst_tr[temp_index++] = 1;
6472 dst_tr[temp_index++] = src_tr->result_type;
6474 case RESULT_ME_UNABLE_TO_PROCESS_COMMAND:
6475 case RESULT_FRAMES_ERROR:
6476 dst_tr[temp_index++] = 2;
6477 dst_tr[temp_index++] = src_tr->result_type;
6478 dst_tr[temp_index++] = src_tr->me_problem_type;
6481 dbg("invalid response value[0x%x] in current TR",src_tr->result_type);
6489 static int _sat_encode_send_sms(const struct tel_sat_tr_send_sms_tlv *src_tr, char *dst_tr)
6491 int temp_index = 0, encoded_len = 0;
6493 //set command detail info
6494 encoded_len = _sat_encode_command_detail_tlv(&(src_tr->command_detail), dst_tr, temp_index);
6495 temp_index += encoded_len;
6497 //set device identities info
6498 encoded_len = _sat_encode_device_identities_tlv(&(src_tr->device_id), dst_tr, temp_index);
6499 temp_index += encoded_len;
6502 dst_tr[temp_index++] = (b_comprehensive ? (SATK_RESULT_TAG | 0x80) : SATK_RESULT_TAG);;
6504 switch(src_tr->result_type){
6505 case RESULT_SUCCESS:
6506 case RESULT_SUCCESS_WITH_PARTIAL_COMPREHENSION:
6507 case RESULT_SUCCESS_WITH_MISSING_INFO:
6508 case RESULT_SUCCESS_BUT_REQUESTED_ICON_NOT_DISPLAYED:
6509 dst_tr[temp_index++] = 1;
6510 dst_tr[temp_index++] = src_tr->result_type;
6512 case RESULT_ME_UNABLE_TO_PROCESS_COMMAND:
6513 case RESULT_NETWORK_UNABLE_TO_PROCESS_COMMAND:
6514 case RESULT_BEYOND_ME_CAPABILITIES:
6515 case RESULT_COMMAND_TYPE_NOT_UNDERSTOOD_BY_ME:
6516 case RESULT_COMMAND_DATA_NOT_UNDERSTOOD_BY_ME:
6517 case RESULT_SMS_RP_ERROR:
6518 case RESULT_ERROR_REQUIRED_VALUES_ARE_MISSING:
6519 dst_tr[temp_index++] = 2;
6520 dst_tr[temp_index++] = src_tr->result_type;
6521 dst_tr[temp_index++] = src_tr->me_problem_type;
6523 case RESULT_INTRCTN_WITH_CC_OR_SMS_CTRL_PRMNT_PRBLM:
6524 dst_tr[temp_index++] = 2;
6525 dst_tr[temp_index++] = src_tr->result_type;
6526 dst_tr[temp_index++] = src_tr->cc_problem_type;
6529 dbg("invalid response value[0x%x] in current TR",src_tr->result_type);
6537 static int _sat_encode_send_ss(const struct tel_sat_tr_send_ss_tlv *src_tr, char *dst_tr)
6539 int temp_index = 0, encoded_len = 0;
6541 //set command detail info
6542 encoded_len = _sat_encode_command_detail_tlv(&(src_tr->command_detail), dst_tr, temp_index);
6543 temp_index += encoded_len;
6545 //set device identities info
6546 encoded_len = _sat_encode_device_identities_tlv(&(src_tr->device_id), dst_tr, temp_index);
6547 temp_index += encoded_len;
6550 dst_tr[temp_index++] = (b_comprehensive ? (SATK_RESULT_TAG | 0x80) : SATK_RESULT_TAG);;
6552 switch(src_tr->result_type){
6553 case RESULT_SUCCESS:
6554 case RESULT_SUCCESS_WITH_PARTIAL_COMPREHENSION:
6555 case RESULT_SUCCESS_WITH_MISSING_INFO:
6556 case RESULT_SUCCESS_BUT_REQUESTED_ICON_NOT_DISPLAYED:
6557 case RESULT_SUCCESS_BUT_MODIFIED_BY_CALL_CONTROL_BY_SIM:
6558 case RESULT_USSD_OR_SS_TRANSACTION_TERMINATED_BY_USER:
6559 dst_tr[temp_index++] = 1+src_tr->text.string_length;
6560 dst_tr[temp_index++] = src_tr->result_type;
6562 memcpy(&(dst_tr[temp_index]), src_tr->text.string, src_tr->text.string_length);
6563 encoded_len = src_tr->text.string_length;
6564 temp_index += encoded_len;
6566 case RESULT_COMMAND_DATA_NOT_UNDERSTOOD_BY_ME:
6567 dst_tr[temp_index++] = 1;
6568 dst_tr[temp_index++] = src_tr->result_type;
6570 case RESULT_ME_UNABLE_TO_PROCESS_COMMAND:
6571 case RESULT_NETWORK_UNABLE_TO_PROCESS_COMMAND:
6572 dst_tr[temp_index++] = 2;
6573 dst_tr[temp_index++] = src_tr->result_type;
6574 dst_tr[temp_index++] = src_tr->me_problem_type;
6576 case RESULT_INTRCTN_WITH_CC_OR_SMS_CTRL_PRMNT_PRBLM:
6577 dst_tr[temp_index++] = 2;
6578 dst_tr[temp_index++] = src_tr->result_type;
6579 dst_tr[temp_index++] = src_tr->cc_problem_type;
6581 case RESULT_SS_RETURN_ERROR:
6582 dst_tr[temp_index++] = 2;
6583 dst_tr[temp_index++] = src_tr->result_type;
6584 dst_tr[temp_index++] = src_tr->ss_problem;
6586 case RESULT_BEYOND_ME_CAPABILITIES:
6587 dst_tr[temp_index++] = 1;
6588 dst_tr[temp_index++] = src_tr->result_type;
6591 dbg("invalid response value[0x%x] in current TR",src_tr->result_type);
6599 static int _sat_encode_send_ussd(const struct tel_sat_tr_send_ussd_tlv *src_tr, char *dst_tr)
6601 int temp_index = 0, encoded_len = 0;
6603 //set command detail info
6604 encoded_len = _sat_encode_command_detail_tlv(&(src_tr->command_detail), dst_tr, temp_index);
6605 temp_index += encoded_len;
6607 //set device identities info
6608 encoded_len = _sat_encode_device_identities_tlv(&(src_tr->device_id), dst_tr, temp_index);
6609 temp_index += encoded_len;
6612 dst_tr[temp_index++] = (b_comprehensive ? (SATK_RESULT_TAG | 0x80) : SATK_RESULT_TAG);;
6614 switch(src_tr->result_type){
6615 case RESULT_SUCCESS:
6616 case RESULT_SUCCESS_WITH_PARTIAL_COMPREHENSION:
6617 case RESULT_SUCCESS_WITH_MISSING_INFO:
6618 case RESULT_SUCCESS_BUT_REQUESTED_ICON_NOT_DISPLAYED:
6619 case RESULT_SUCCESS_BUT_MODIFIED_BY_CALL_CONTROL_BY_SIM:
6620 case RESULT_USSD_OR_SS_TRANSACTION_TERMINATED_BY_USER:
6621 dst_tr[temp_index++] = 1;
6622 dst_tr[temp_index++] = src_tr->result_type;
6624 encoded_len = _sat_encode_text_tlv(&(src_tr->text), dst_tr, temp_index, TRUE);
6625 temp_index += encoded_len;
6627 case RESULT_COMMAND_DATA_NOT_UNDERSTOOD_BY_ME:
6628 case RESULT_BEYOND_ME_CAPABILITIES:
6629 dst_tr[temp_index++] = 1;
6630 dst_tr[temp_index++] = src_tr->result_type;
6632 case RESULT_ME_UNABLE_TO_PROCESS_COMMAND:
6633 case RESULT_NETWORK_UNABLE_TO_PROCESS_COMMAND:
6634 dst_tr[temp_index++] = 2;
6635 dst_tr[temp_index++] = src_tr->result_type;
6636 dst_tr[temp_index++] = src_tr->me_problem_type;
6638 case RESULT_INTRCTN_WITH_CC_OR_SMS_CTRL_PRMNT_PRBLM:
6639 dst_tr[temp_index++] = 2;
6640 dst_tr[temp_index++] = src_tr->result_type;
6641 dst_tr[temp_index++] = src_tr->cc_problem_type;
6643 case RESULT_USSD_RETURN_ERROR:
6644 dst_tr[temp_index++] = 2;
6645 dst_tr[temp_index++] = src_tr->result_type;
6646 dst_tr[temp_index++] = src_tr->ussd_problem;
6649 dbg("invalid response value[0x%x] in current TR",src_tr->result_type);
6657 static int _sat_encode_setup_call(const struct tel_sat_tr_setup_call_tlv *src_tr, char *dst_tr)
6659 int temp_index = 0, encoded_len = 0;
6661 //set command detail info
6662 encoded_len = _sat_encode_command_detail_tlv(&(src_tr->command_detail), dst_tr, temp_index);
6663 temp_index += encoded_len;
6665 //set device identities info
6666 encoded_len = _sat_encode_device_identities_tlv(&(src_tr->device_id), dst_tr, temp_index);
6667 temp_index += encoded_len;
6670 dst_tr[temp_index++] = (b_comprehensive ? (SATK_RESULT_TAG | 0x80) : SATK_RESULT_TAG);;
6672 switch(src_tr->result_type){
6673 case RESULT_SUCCESS:
6674 case RESULT_SUCCESS_WITH_PARTIAL_COMPREHENSION:
6675 case RESULT_SUCCESS_WITH_MISSING_INFO:
6676 case RESULT_SUCCESS_BUT_REQUESTED_ICON_NOT_DISPLAYED:
6677 case RESULT_SUCCESS_BUT_MODIFIED_BY_CALL_CONTROL_BY_SIM:
6678 case RESULT_PROACTIVE_SESSION_TERMINATED_BY_USER:
6679 case RESULT_BEYOND_ME_CAPABILITIES:
6680 case RESULT_COMMAND_TYPE_NOT_UNDERSTOOD_BY_ME:
6681 case RESULT_COMMAND_DATA_NOT_UNDERSTOOD_BY_ME:
6682 case RESULT_COMMAND_NUMBER_NOT_KNOWN_BY_ME:
6683 case RESULT_ERROR_REQUIRED_VALUES_ARE_MISSING:
6684 case RESULT_SS_RETURN_ERROR:
6685 dst_tr[temp_index++] = 1;
6686 dst_tr[temp_index++] = src_tr->result_type;
6688 case RESULT_ME_UNABLE_TO_PROCESS_COMMAND:
6689 case RESULT_USER_DID_NOT_ACCEPT_CALL_SETUP_REQ:
6690 case RESULT_USER_CLEAR_DOWN_CALL_BEFORE_CONN:
6691 case RESULT_FRAMES_ERROR:
6692 dst_tr[temp_index++] = 2;
6693 dst_tr[temp_index++] = src_tr->result_type;
6694 dst_tr[temp_index++] = src_tr->me_problem_type;
6696 case RESULT_NETWORK_UNABLE_TO_PROCESS_COMMAND:
6697 dst_tr[temp_index++] = 2;
6698 dst_tr[temp_index++] = src_tr->result_type;
6699 dst_tr[temp_index++] = src_tr->network_problem_type;
6701 case RESULT_INTRCTN_WITH_CC_OR_SMS_CTRL_PRMNT_PRBLM:
6702 dst_tr[temp_index++] = 2;
6703 dst_tr[temp_index++] = src_tr->result_type;
6704 dst_tr[temp_index++] = src_tr->cc_problem_type;
6707 dbg("invalid response value[0x%x] in current TR",src_tr->result_type);
6715 static int _sat_encode_provide_local_info(const struct tel_sat_tr_provide_local_info_tlv *src_tr, char *dst_tr)
6717 int temp_index = 0, encoded_len = 0;
6719 //set command detail info
6720 encoded_len = _sat_encode_command_detail_tlv(&(src_tr->command_detail), dst_tr, temp_index);
6721 temp_index += encoded_len;
6723 //set device identities info
6724 encoded_len = _sat_encode_device_identities_tlv(&(src_tr->device_id), dst_tr, temp_index);
6725 temp_index += encoded_len;
6728 dst_tr[temp_index++] = (b_comprehensive ? (SATK_RESULT_TAG | 0x80) : SATK_RESULT_TAG);;
6729 switch(src_tr->result_type){
6730 case RESULT_SUCCESS:
6731 case RESULT_SUCCESS_WITH_PARTIAL_COMPREHENSION:
6732 case RESULT_SUCCESS_WITH_MISSING_INFO:
6733 case RESULT_SUCCESS_LIMITED_SERVICE:
6734 dst_tr[temp_index++] = 1;
6735 dst_tr[temp_index++] = src_tr->result_type;
6736 switch(src_tr->command_detail.cmd_qualifier.provide_local_info.provide_local_info){
6737 case LOCAL_INFO_DATE_TIME_AND_TIMEZONE:
6738 encoded_len = _sat_encode_date_time_and_timezone_tlv(&(src_tr->other.date_time_and_timezone), dst_tr, temp_index);
6740 case LOCAL_INFO_LANGUAGE:
6741 encoded_len = _sat_encode_language_tlv(src_tr->other.language, dst_tr, temp_index);
6744 dbg("local info type[%d] is not handled", src_tr->command_detail.cmd_qualifier.provide_local_info.provide_local_info);
6747 temp_index += encoded_len;
6749 case RESULT_BEYOND_ME_CAPABILITIES:
6750 case RESULT_COMMAND_TYPE_NOT_UNDERSTOOD_BY_ME:
6751 case RESULT_COMMAND_DATA_NOT_UNDERSTOOD_BY_ME:
6752 case RESULT_COMMAND_NUMBER_NOT_KNOWN_BY_ME:
6753 case RESULT_ERROR_REQUIRED_VALUES_ARE_MISSING:
6754 dst_tr[temp_index++] = 1;
6755 dst_tr[temp_index++] = src_tr->result_type;
6757 case RESULT_ME_UNABLE_TO_PROCESS_COMMAND:
6758 dst_tr[temp_index++] = 2;
6759 dst_tr[temp_index++] = src_tr->result_type;
6760 dst_tr[temp_index++] = src_tr->me_problem_type;
6763 dbg("invalid response value[0x%x] in current TR",src_tr->result_type);
6771 static int _sat_encode_setup_event_list(const struct tel_sat_tr_setup_event_list_tlv *src_tr, char *dst_tr)
6773 int temp_index = 0, encoded_len = 0;
6775 //set command detail info
6776 encoded_len = _sat_encode_command_detail_tlv(&(src_tr->command_detail), dst_tr, temp_index);
6777 temp_index += encoded_len;
6779 //set device identities info
6780 encoded_len = _sat_encode_device_identities_tlv(&(src_tr->device_id), dst_tr, temp_index);
6781 temp_index += encoded_len;
6784 dst_tr[temp_index++] = (b_comprehensive ? (SATK_RESULT_TAG | 0x80) : SATK_RESULT_TAG);;
6785 switch(src_tr->result_type){
6786 case RESULT_SUCCESS:
6787 case RESULT_SUCCESS_WITH_PARTIAL_COMPREHENSION:
6788 case RESULT_SUCCESS_WITH_MISSING_INFO:
6789 case RESULT_BEYOND_ME_CAPABILITIES:
6790 case RESULT_COMMAND_TYPE_NOT_UNDERSTOOD_BY_ME:
6791 case RESULT_COMMAND_DATA_NOT_UNDERSTOOD_BY_ME:
6792 case RESULT_COMMAND_NUMBER_NOT_KNOWN_BY_ME:
6793 case RESULT_ERROR_REQUIRED_VALUES_ARE_MISSING:
6794 dst_tr[temp_index++] = 1;
6795 dst_tr[temp_index++] = src_tr->result_type;
6797 case RESULT_ME_UNABLE_TO_PROCESS_COMMAND:
6798 dst_tr[temp_index++] = 2;
6799 dst_tr[temp_index++] = src_tr->result_type;
6800 dst_tr[temp_index++] = src_tr->me_problem_type;
6803 dbg("invalid response value[0x%x] in current TR",src_tr->result_type);
6811 static int _sat_encode_setup_idle_mode_text(const struct tel_sat_tr_setup_idle_mode_text_tlv *src_tr, char *dst_tr)
6813 int temp_index = 0, encoded_len = 0;
6815 //set command detail info
6816 encoded_len = _sat_encode_command_detail_tlv(&(src_tr->command_detail), dst_tr, temp_index);
6817 temp_index += encoded_len;
6819 //set device identities info
6820 encoded_len = _sat_encode_device_identities_tlv(&(src_tr->device_id), dst_tr, temp_index);
6821 temp_index += encoded_len;
6824 dst_tr[temp_index++] = (b_comprehensive ? (SATK_RESULT_TAG | 0x80) : SATK_RESULT_TAG);;
6826 switch(src_tr->result_type){
6827 case RESULT_SUCCESS:
6828 case RESULT_SUCCESS_WITH_PARTIAL_COMPREHENSION:
6829 case RESULT_SUCCESS_WITH_MISSING_INFO:
6830 case RESULT_SUCCESS_BUT_REQUESTED_ICON_NOT_DISPLAYED:
6831 case RESULT_BEYOND_ME_CAPABILITIES:
6832 case RESULT_COMMAND_TYPE_NOT_UNDERSTOOD_BY_ME:
6833 case RESULT_COMMAND_DATA_NOT_UNDERSTOOD_BY_ME:
6834 case RESULT_COMMAND_NUMBER_NOT_KNOWN_BY_ME:
6835 case RESULT_ERROR_REQUIRED_VALUES_ARE_MISSING:
6836 dst_tr[temp_index++] = 1;
6837 dst_tr[temp_index++] = src_tr->result_type;
6839 case RESULT_ME_UNABLE_TO_PROCESS_COMMAND:
6840 case RESULT_FRAMES_ERROR:
6841 dst_tr[temp_index++] = 2;
6842 dst_tr[temp_index++] = src_tr->result_type;
6843 dst_tr[temp_index++] = src_tr->me_problem_type;
6846 dbg("invalid response value[0x%x] in current TR",src_tr->result_type);
6854 static int _sat_encode_send_dtmf(const struct tel_sat_tr_send_dtmf_tlv *src_tr, char *dst_tr)
6856 int temp_index = 0, encoded_len = 0;
6858 //set command detail info
6859 encoded_len = _sat_encode_command_detail_tlv(&(src_tr->command_detail), dst_tr, temp_index);
6860 temp_index += encoded_len;
6862 //set device identities info
6863 encoded_len = _sat_encode_device_identities_tlv(&(src_tr->device_id), dst_tr, temp_index);
6864 temp_index += encoded_len;
6867 dst_tr[temp_index++] = (b_comprehensive ? (SATK_RESULT_TAG | 0x80) : SATK_RESULT_TAG);;
6869 switch(src_tr->result_type){
6870 case RESULT_SUCCESS:
6871 case RESULT_SUCCESS_WITH_PARTIAL_COMPREHENSION:
6872 case RESULT_SUCCESS_WITH_MISSING_INFO:
6873 case RESULT_SUCCESS_BUT_REQUESTED_ICON_NOT_DISPLAYED:
6874 case RESULT_PROACTIVE_SESSION_TERMINATED_BY_USER:
6875 case RESULT_BEYOND_ME_CAPABILITIES:
6876 case RESULT_COMMAND_TYPE_NOT_UNDERSTOOD_BY_ME:
6877 case RESULT_COMMAND_DATA_NOT_UNDERSTOOD_BY_ME:
6878 case RESULT_COMMAND_NUMBER_NOT_KNOWN_BY_ME:
6879 case RESULT_ERROR_REQUIRED_VALUES_ARE_MISSING:
6880 dst_tr[temp_index++] = 1;
6881 dst_tr[temp_index++] = src_tr->result_type;
6883 case RESULT_ME_UNABLE_TO_PROCESS_COMMAND:
6884 dst_tr[temp_index++] = 2;
6885 dst_tr[temp_index++] = src_tr->result_type;
6886 dst_tr[temp_index++] = src_tr->me_problem_type;
6889 dbg("invalid response value[0x%x] in current TR",src_tr->result_type);
6897 static int _sat_encode_language_notification(const struct tel_sat_tr_language_notification_tlv *src_tr, char *dst_tr)
6899 int temp_index = 0, encoded_len = 0;
6901 //set command detail info
6902 encoded_len = _sat_encode_command_detail_tlv(&(src_tr->command_detail), dst_tr, temp_index);
6903 temp_index += encoded_len;
6905 //set device identities info
6906 encoded_len = _sat_encode_device_identities_tlv(&(src_tr->device_id), dst_tr, temp_index);
6907 temp_index += encoded_len;
6910 dst_tr[temp_index++] = (b_comprehensive ? (SATK_RESULT_TAG | 0x80) : SATK_RESULT_TAG);;
6912 switch(src_tr->result_type){
6913 case RESULT_SUCCESS:
6914 case RESULT_SUCCESS_WITH_PARTIAL_COMPREHENSION:
6915 case RESULT_SUCCESS_WITH_MISSING_INFO:
6916 case RESULT_BEYOND_ME_CAPABILITIES:
6917 case RESULT_COMMAND_TYPE_NOT_UNDERSTOOD_BY_ME:
6918 case RESULT_COMMAND_DATA_NOT_UNDERSTOOD_BY_ME:
6919 case RESULT_COMMAND_NUMBER_NOT_KNOWN_BY_ME:
6920 case RESULT_ERROR_REQUIRED_VALUES_ARE_MISSING:
6921 dst_tr[temp_index++] = 1;
6922 dst_tr[temp_index++] = src_tr->result_type;
6924 case RESULT_ME_UNABLE_TO_PROCESS_COMMAND:
6925 case RESULT_FRAMES_ERROR:
6926 dst_tr[temp_index++] = 2;
6927 dst_tr[temp_index++] = src_tr->result_type;
6928 dst_tr[temp_index++] = src_tr->me_problem_type;
6931 dbg("invalid response value[0x%x] in current TR",src_tr->result_type);
6939 static int _sat_encode_launch_browser(const struct tel_sat_tr_launch_browser_tlv *src_tr, char *dst_tr)
6941 int temp_index = 0, encoded_len = 0;
6943 //set command detail info
6944 encoded_len = _sat_encode_command_detail_tlv(&(src_tr->command_detail), dst_tr, temp_index);
6945 temp_index += encoded_len;
6947 //set device identities info
6948 encoded_len = _sat_encode_device_identities_tlv(&(src_tr->device_id), dst_tr, temp_index);
6949 temp_index += encoded_len;
6952 dst_tr[temp_index++] = (b_comprehensive ? (SATK_RESULT_TAG | 0x80) : SATK_RESULT_TAG);;
6954 switch(src_tr->result_type){
6955 case RESULT_SUCCESS:
6956 case RESULT_SUCCESS_WITH_PARTIAL_COMPREHENSION:
6957 case RESULT_SUCCESS_WITH_MISSING_INFO:
6958 case RESULT_PROACTIVE_SESSION_TERMINATED_BY_USER:
6959 case RESULT_BACKWARD_MOVE_BY_USER:
6960 case RESULT_NO_RESPONSE_FROM_USER:
6961 case RESULT_BEYOND_ME_CAPABILITIES:
6962 case RESULT_COMMAND_TYPE_NOT_UNDERSTOOD_BY_ME:
6963 case RESULT_COMMAND_DATA_NOT_UNDERSTOOD_BY_ME:
6964 case RESULT_COMMAND_NUMBER_NOT_KNOWN_BY_ME:
6965 case RESULT_SUCCESS_BUT_REQUESTED_ICON_NOT_DISPLAYED:
6966 dst_tr[temp_index++] = 1;
6967 dst_tr[temp_index++] = src_tr->result_type;
6969 case RESULT_ME_UNABLE_TO_PROCESS_COMMAND:
6970 case RESULT_NETWORK_UNABLE_TO_PROCESS_COMMAND:
6971 case RESULT_FRAMES_ERROR:
6972 dst_tr[temp_index++] = 2;
6973 dst_tr[temp_index++] = src_tr->result_type;
6974 dst_tr[temp_index++] = src_tr->me_problem_type;
6976 case RESULT_LAUNCH_BROWSER_GENERIC_ERROR_CODE:
6977 dst_tr[temp_index++] = 2;
6978 dst_tr[temp_index++] = src_tr->result_type;
6979 dst_tr[temp_index++] = src_tr->browser_problem_type;
6982 dbg("invalid response value[0x%x] in current TR",src_tr->result_type);
6990 static int _sat_encode_open_channel(const struct tel_sat_tr_open_channel_tlv *src_tr, char *dst_tr)
6992 int temp_index = 0, encoded_len = 0;
6994 //set command detail info
6995 encoded_len = _sat_encode_command_detail_tlv(&(src_tr->command_detail), dst_tr, temp_index);
6996 temp_index += encoded_len;
6998 //set device identities info
6999 encoded_len = _sat_encode_device_identities_tlv(&(src_tr->device_id), dst_tr, temp_index);
7000 temp_index += encoded_len;
7003 dst_tr[temp_index++] = (b_comprehensive ? (SATK_RESULT_TAG | 0x80) : SATK_RESULT_TAG);;
7004 switch(src_tr->result_type){
7005 case RESULT_SUCCESS:
7006 case RESULT_SUCCESS_WITH_PARTIAL_COMPREHENSION:
7007 case RESULT_SUCCESS_WITH_MISSING_INFO:
7008 case RESULT_SUCCESS_BUT_REQUESTED_ICON_NOT_DISPLAYED:
7009 case RESULT_SUCCESS_WITH_MODIFICATION:
7010 dst_tr[temp_index++] = 1;
7011 dst_tr[temp_index++] = src_tr->result_type;
7013 //set channel status
7014 encoded_len = _sat_encode_channel_status_tlv(&(src_tr->channel_status), dst_tr, temp_index);
7015 temp_index += encoded_len;
7017 case RESULT_REFRESH_PRFRMD_BUT_INDICATED_USIM_NOT_ACTIVE:
7018 case RESULT_PROACTIVE_SESSION_TERMINATED_BY_USER:
7019 case RESULT_INTERACTION_WITH_CC_BY_SIM_IN_TMP_PRBLM:
7020 case RESULT_BEYOND_ME_CAPABILITIES:
7021 case RESULT_COMMAND_TYPE_NOT_UNDERSTOOD_BY_ME:
7022 case RESULT_COMMAND_DATA_NOT_UNDERSTOOD_BY_ME:
7023 case RESULT_COMMAND_NUMBER_NOT_KNOWN_BY_ME:
7024 case RESULT_ERROR_REQUIRED_VALUES_ARE_MISSING:
7025 case RESULT_USER_DID_NOT_ACCEPT_CALL_SETUP_REQ:
7026 dst_tr[temp_index++] = 1;
7027 dst_tr[temp_index++] = src_tr->result_type;
7029 case RESULT_ME_UNABLE_TO_PROCESS_COMMAND:
7030 case RESULT_NETWORK_UNABLE_TO_PROCESS_COMMAND:
7031 case RESULT_FRAMES_ERROR:
7032 dst_tr[temp_index++] = 2;
7033 dst_tr[temp_index++] = src_tr->result_type;
7034 dst_tr[temp_index++] = src_tr->me_problem_type;
7036 case RESULT_BEARER_INDEPENDENT_PROTOCOL_ERROR:
7037 dst_tr[temp_index++] = 2;
7038 dst_tr[temp_index++] = src_tr->result_type;
7039 dst_tr[temp_index++] = src_tr->bip_problem_type;
7042 dbg("invalid response value[0x%x] in current TR",src_tr->result_type);
7050 static int _sat_encode_close_channel(const struct tel_sat_tr_close_channel_tlv *src_tr, char *dst_tr)
7052 int temp_index = 0, encoded_len = 0;
7054 //set command detail info
7055 encoded_len = _sat_encode_command_detail_tlv(&(src_tr->command_detail), dst_tr, temp_index);
7056 temp_index += encoded_len;
7058 //set device identities info
7059 encoded_len = _sat_encode_device_identities_tlv(&(src_tr->device_id), dst_tr, temp_index);
7060 temp_index += encoded_len;
7063 dst_tr[temp_index++] = (b_comprehensive ? (SATK_RESULT_TAG | 0x80) : SATK_RESULT_TAG);;
7064 switch(src_tr->result_type){
7065 case RESULT_SUCCESS:
7066 case RESULT_SUCCESS_WITH_PARTIAL_COMPREHENSION:
7067 case RESULT_SUCCESS_WITH_MISSING_INFO:
7068 case RESULT_SUCCESS_BUT_REQUESTED_ICON_NOT_DISPLAYED:
7069 case RESULT_PROACTIVE_SESSION_TERMINATED_BY_USER:
7070 case RESULT_BEYOND_ME_CAPABILITIES:
7071 case RESULT_COMMAND_TYPE_NOT_UNDERSTOOD_BY_ME:
7072 case RESULT_COMMAND_DATA_NOT_UNDERSTOOD_BY_ME:
7073 case RESULT_COMMAND_NUMBER_NOT_KNOWN_BY_ME:
7074 case RESULT_ERROR_REQUIRED_VALUES_ARE_MISSING:
7075 dst_tr[temp_index++] = 1;
7076 dst_tr[temp_index++] = src_tr->result_type;
7078 case RESULT_ME_UNABLE_TO_PROCESS_COMMAND:
7079 case RESULT_FRAMES_ERROR:
7080 dst_tr[temp_index++] = 2;
7081 dst_tr[temp_index++] = src_tr->result_type;
7082 dst_tr[temp_index++] = src_tr->me_problem_type;
7084 case RESULT_BEARER_INDEPENDENT_PROTOCOL_ERROR:
7085 dst_tr[temp_index++] = 2;
7086 dst_tr[temp_index++] = src_tr->result_type;
7087 dst_tr[temp_index++] = src_tr->bip_problem_type;
7090 dbg("invalid response value[0x%x] in current TR",src_tr->result_type);
7098 static int _sat_encode_send_data(const struct tel_sat_tr_send_data_tlv *src_tr, char *dst_tr)
7100 int temp_index = 0, encoded_len = 0;
7102 //set command detail info
7103 encoded_len = _sat_encode_command_detail_tlv(&(src_tr->command_detail), dst_tr, temp_index);
7104 temp_index += encoded_len;
7106 //set device identities info
7107 encoded_len = _sat_encode_device_identities_tlv(&(src_tr->device_id), dst_tr, temp_index);
7108 temp_index += encoded_len;
7111 dst_tr[temp_index++] = (b_comprehensive ? (SATK_RESULT_TAG | 0x80) : SATK_RESULT_TAG);;
7112 switch(src_tr->result_type){
7113 case RESULT_SUCCESS:
7114 case RESULT_SUCCESS_WITH_PARTIAL_COMPREHENSION:
7115 case RESULT_SUCCESS_WITH_MISSING_INFO:
7116 case RESULT_SUCCESS_BUT_REQUESTED_ICON_NOT_DISPLAYED:
7117 case RESULT_PROACTIVE_SESSION_TERMINATED_BY_USER:
7118 case RESULT_BEYOND_ME_CAPABILITIES:
7119 case RESULT_COMMAND_TYPE_NOT_UNDERSTOOD_BY_ME:
7120 case RESULT_COMMAND_DATA_NOT_UNDERSTOOD_BY_ME:
7121 case RESULT_COMMAND_NUMBER_NOT_KNOWN_BY_ME:
7122 case RESULT_ERROR_REQUIRED_VALUES_ARE_MISSING:
7123 dst_tr[temp_index++] = 1;
7124 dst_tr[temp_index++] = src_tr->result_type;
7125 encoded_len = _sat_encode_channel_data_length_tlv(&(src_tr->channel_data_len), dst_tr, temp_index);
7126 temp_index += encoded_len;
7128 case RESULT_ME_UNABLE_TO_PROCESS_COMMAND:
7129 case RESULT_NETWORK_UNABLE_TO_PROCESS_COMMAND:
7130 case RESULT_FRAMES_ERROR:
7131 dst_tr[temp_index++] = 2;
7132 dst_tr[temp_index++] = src_tr->result_type;
7133 dst_tr[temp_index++] = src_tr->me_problem_type;
7136 case RESULT_BEARER_INDEPENDENT_PROTOCOL_ERROR:
7137 dst_tr[temp_index++] = 2;
7138 dst_tr[temp_index++] = src_tr->result_type;
7139 dst_tr[temp_index++] = src_tr->bip_problem_type;
7142 dbg("invalid response value[0x%x] in current TR",src_tr->result_type);
7150 static int _sat_encode_receive_data(const struct tel_sat_tr_receive_data_tlv *src_tr, char *dst_tr)
7152 int temp_index = 0, encoded_len = 0;
7154 //set command detail info
7155 encoded_len = _sat_encode_command_detail_tlv(&(src_tr->command_detail), dst_tr, temp_index);
7156 temp_index += encoded_len;
7158 //set device identities info
7159 encoded_len = _sat_encode_device_identities_tlv(&(src_tr->device_id), dst_tr, temp_index);
7160 temp_index += encoded_len;
7163 dst_tr[temp_index++] = (b_comprehensive ? (SATK_RESULT_TAG | 0x80) : SATK_RESULT_TAG);;
7164 switch(src_tr->result_type){
7165 case RESULT_SUCCESS:
7166 case RESULT_SUCCESS_WITH_PARTIAL_COMPREHENSION:
7167 case RESULT_SUCCESS_WITH_MISSING_INFO:
7168 case RESULT_SUCCESS_BUT_REQUESTED_ICON_NOT_DISPLAYED:
7169 case RESULT_PROACTIVE_SESSION_TERMINATED_BY_USER:
7170 case RESULT_BEYOND_ME_CAPABILITIES:
7171 case RESULT_COMMAND_TYPE_NOT_UNDERSTOOD_BY_ME:
7172 case RESULT_COMMAND_DATA_NOT_UNDERSTOOD_BY_ME:
7173 case RESULT_COMMAND_NUMBER_NOT_KNOWN_BY_ME:
7174 case RESULT_ERROR_REQUIRED_VALUES_ARE_MISSING:
7175 dst_tr[temp_index++] = 1;
7176 dst_tr[temp_index++] = src_tr->result_type;
7177 encoded_len = _sat_encode_channel_data_tlv(&(src_tr->channel_data), dst_tr, temp_index);
7178 temp_index += encoded_len;
7179 encoded_len = _sat_encode_channel_data_length_tlv(&(src_tr->channel_data_len), dst_tr, temp_index);
7180 temp_index += encoded_len;
7182 case RESULT_ME_UNABLE_TO_PROCESS_COMMAND:
7183 case RESULT_FRAMES_ERROR:
7184 dst_tr[temp_index++] = 2;
7185 dst_tr[temp_index++] = src_tr->result_type;
7186 dst_tr[temp_index++] = src_tr->me_problem_type;
7189 case RESULT_BEARER_INDEPENDENT_PROTOCOL_ERROR:
7190 dst_tr[temp_index++] = 2;
7191 dst_tr[temp_index++] = src_tr->result_type;
7192 dst_tr[temp_index++] = src_tr->bip_problem_type;
7195 dbg("invalid response value[0x%x] in current TR",src_tr->result_type);
7203 static int _sat_encode_get_channel_status(const struct tel_sat_tr_get_channel_status_tlv *src_tr, char *dst_tr)
7205 int temp_index = 0, encoded_len = 0;
7207 //set command detail info
7208 encoded_len = _sat_encode_command_detail_tlv(&(src_tr->command_detail), dst_tr, temp_index);
7209 temp_index += encoded_len;
7211 //set device identities info
7212 encoded_len = _sat_encode_device_identities_tlv(&(src_tr->device_id), dst_tr, temp_index);
7213 temp_index += encoded_len;
7216 dst_tr[temp_index++] = (b_comprehensive ? (SATK_RESULT_TAG | 0x80) : SATK_RESULT_TAG);;
7217 switch(src_tr->result_type){
7218 case RESULT_SUCCESS:
7219 case RESULT_SUCCESS_WITH_PARTIAL_COMPREHENSION:
7220 case RESULT_SUCCESS_WITH_MISSING_INFO:
7221 case RESULT_SUCCESS_BUT_REQUESTED_ICON_NOT_DISPLAYED:
7222 dst_tr[temp_index++] = 1;
7223 dst_tr[temp_index++] = src_tr->result_type;
7224 encoded_len = _sat_encode_channel_status_tlv(&(src_tr->channel_status), dst_tr, temp_index);
7225 temp_index += encoded_len;
7227 case RESULT_PROACTIVE_SESSION_TERMINATED_BY_USER:
7228 case RESULT_BEYOND_ME_CAPABILITIES:
7229 case RESULT_COMMAND_TYPE_NOT_UNDERSTOOD_BY_ME:
7230 case RESULT_COMMAND_DATA_NOT_UNDERSTOOD_BY_ME:
7231 case RESULT_COMMAND_NUMBER_NOT_KNOWN_BY_ME:
7232 case RESULT_ERROR_REQUIRED_VALUES_ARE_MISSING:
7233 dst_tr[temp_index++] = 1;
7234 dst_tr[temp_index++] = src_tr->result_type;
7236 case RESULT_ME_UNABLE_TO_PROCESS_COMMAND:
7237 case RESULT_NETWORK_UNABLE_TO_PROCESS_COMMAND:
7238 dst_tr[temp_index++] = 2;
7239 dst_tr[temp_index++] = src_tr->result_type;
7240 dst_tr[temp_index++] = src_tr->me_problem_type;
7242 case RESULT_BEARER_INDEPENDENT_PROTOCOL_ERROR:
7243 dst_tr[temp_index++] = 2;
7244 dst_tr[temp_index++] = src_tr->result_type;
7245 dst_tr[temp_index++] = src_tr->bip_problem_type;
7248 dbg("invalid response value[0x%x] in current TR",src_tr->result_type);
7256 static int _sat_encode_unsupport_command(const struct tel_sat_tr_unsupport_command_tlv *src_tr, char *dst_tr)
7258 int temp_index = 0, encoded_len = 0;
7260 //set command detail info
7261 encoded_len = _sat_encode_command_detail_tlv(&(src_tr->command_detail), dst_tr, temp_index);
7262 temp_index += encoded_len;
7264 //set device identities info
7265 encoded_len = _sat_encode_device_identities_tlv(&(src_tr->device_id), dst_tr, temp_index);
7266 temp_index += encoded_len;
7269 dst_tr[temp_index++] = (b_comprehensive ? (SATK_RESULT_TAG | 0x80) : SATK_RESULT_TAG);;
7270 dst_tr[temp_index++] = 1;
7271 dst_tr[temp_index++] = src_tr->result_type;
7276 int tcore_sat_encode_terminal_response(const struct treq_sat_terminal_rsp_data *src_tr, char *dst_tr){
7282 switch(src_tr->cmd_type){
7283 case SAT_PROATV_CMD_DISPLAY_TEXT:{
7284 tr_len = _sat_encode_display_text(&(src_tr->terminal_rsp_data.display_text), dst_tr);
7286 case SAT_PROATV_CMD_GET_INKEY:{
7287 tr_len = _sat_encode_get_inkey(&(src_tr->terminal_rsp_data.get_inkey), dst_tr);
7289 case SAT_PROATV_CMD_GET_INPUT:{
7290 tr_len = _sat_encode_get_input(&(src_tr->terminal_rsp_data.get_input), dst_tr);
7292 case SAT_PROATV_CMD_MORE_TIME:{
7293 tr_len = _sat_encode_more_time(&(src_tr->terminal_rsp_data.more_time), dst_tr);
7295 case SAT_PROATV_CMD_PLAY_TONE:{
7296 tr_len = _sat_encode_play_tone(&(src_tr->terminal_rsp_data.play_tone), dst_tr);
7298 case SAT_PROATV_CMD_REFRESH:{
7299 tr_len = _sat_encode_refresh(&(src_tr->terminal_rsp_data.refresh), dst_tr);
7301 case SAT_PROATV_CMD_SETUP_MENU:{
7302 tr_len = _sat_encode_setup_menu(&(src_tr->terminal_rsp_data.setup_menu), dst_tr);
7304 case SAT_PROATV_CMD_SELECT_ITEM:{
7305 tr_len = _sat_encode_select_item(&(src_tr->terminal_rsp_data.select_item), dst_tr);
7307 case SAT_PROATV_CMD_SEND_SMS:{
7308 tr_len = _sat_encode_send_sms(&(src_tr->terminal_rsp_data.send_sms), dst_tr);
7310 case SAT_PROATV_CMD_SEND_SS:{
7311 tr_len = _sat_encode_send_ss(&(src_tr->terminal_rsp_data.send_ss), dst_tr);
7313 case SAT_PROATV_CMD_SEND_USSD:{
7314 tr_len = _sat_encode_send_ussd(&(src_tr->terminal_rsp_data.send_ussd), dst_tr);
7316 case SAT_PROATV_CMD_SETUP_CALL:{
7317 tr_len = _sat_encode_setup_call(&(src_tr->terminal_rsp_data.setup_call), dst_tr);
7319 case SAT_PROATV_CMD_PROVIDE_LOCAL_INFO:{
7320 tr_len = _sat_encode_provide_local_info(&(src_tr->terminal_rsp_data.provide_local_info), dst_tr);
7322 case SAT_PROATV_CMD_SETUP_EVENT_LIST:{
7323 tr_len = _sat_encode_setup_event_list(&(src_tr->terminal_rsp_data.setup_event_list), dst_tr);
7325 case SAT_PROATV_CMD_SETUP_IDLE_MODE_TEXT:{
7326 tr_len = _sat_encode_setup_idle_mode_text(&(src_tr->terminal_rsp_data.setup_idle_mode_text), dst_tr);
7328 case SAT_PROATV_CMD_SEND_DTMF:{
7329 tr_len = _sat_encode_send_dtmf(&(src_tr->terminal_rsp_data.send_dtmf), dst_tr);
7331 case SAT_PROATV_CMD_LANGUAGE_NOTIFICATION:{
7332 tr_len = _sat_encode_language_notification(&(src_tr->terminal_rsp_data.language_notification), dst_tr);
7334 case SAT_PROATV_CMD_LAUNCH_BROWSER:{
7335 tr_len = _sat_encode_launch_browser(&(src_tr->terminal_rsp_data.launch_browser), dst_tr);
7337 case SAT_PROATV_CMD_OPEN_CHANNEL:{
7338 tr_len = _sat_encode_open_channel(&(src_tr->terminal_rsp_data.open_channel), dst_tr);
7340 case SAT_PROATV_CMD_CLOSE_CHANNEL:{
7341 tr_len = _sat_encode_close_channel(&(src_tr->terminal_rsp_data.close_channel), dst_tr);
7343 case SAT_PROATV_CMD_SEND_DATA:{
7344 tr_len = _sat_encode_send_data(&(src_tr->terminal_rsp_data.send_data), dst_tr);
7346 case SAT_PROATV_CMD_RECEIVE_DATA:{
7347 tr_len = _sat_encode_receive_data(&(src_tr->terminal_rsp_data.receive_data), dst_tr);
7349 case SAT_PROATV_CMD_GET_CHANNEL_STATUS:{
7350 tr_len = _sat_encode_get_channel_status(&(src_tr->terminal_rsp_data.get_channel_status), dst_tr);
7353 tr_len = _sat_encode_unsupport_command(&(src_tr->terminal_rsp_data.unsupport_cmd), dst_tr);
7360 CoreObject *tcore_sat_new(TcorePlugin *p, const char *name,
7361 struct tcore_sat_operations *ops, TcoreHal *hal)
7363 CoreObject *o = NULL;
7364 struct private_object_data *po = NULL;
7369 o = tcore_object_new(p, name, hal);
7373 po = calloc(1, sizeof(struct private_object_data));
7375 tcore_object_free(o);
7381 tcore_object_set_type(o, CORE_OBJECT_TYPE_SAT);
7382 tcore_object_link_object(o, po);
7383 tcore_object_set_clone_hook(o, _clone_hook);
7384 tcore_object_set_free_hook(o, _free_hook);
7385 tcore_object_set_dispatcher(o, _dispatcher);
7390 void tcore_sat_free(CoreObject *o)
7392 CORE_OBJECT_CHECK(o, CORE_OBJECT_TYPE_SAT);
7394 tcore_object_free(o);
7397 void tcore_sat_set_ops(CoreObject *o, struct tcore_sat_operations *ops)
7399 struct private_object_data *po = NULL;
7401 CORE_OBJECT_CHECK(o, CORE_OBJECT_TYPE_SAT);
7403 po = (struct private_object_data *)tcore_object_ref_object(o);