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 0x48 /* REMOTE ENTITY ADDRESS TAG */
95 /* general data object lengths */
96 #define SATK_DCS_LENGTH 0x01
97 #define SATK_COMMAND_DETAILS_LENGTH 0x03 /* COMMAND DETAILS LENGTH */
98 #define SATK_DEVICE_IDENTITY_LENGTH 0x02 /* DEVICE IDENTITY LENGTH */
99 #define SATK_ICON_IDENTITY_LENGTH 0x02 /* ICON IDENTITY LENGTH */
100 #define SATK_DURATION_LENGTH 0x02 /* DURATION LENGTH */
101 #define SATK_ITEM_IDENTIFIER_LENGTH 0x01 /* ITEM IDENTIFIER LENGTH */
102 #define SATK_LOCATION_INFORMATION_LENGTH 0x07 /* LOCATION INFORMATION LENGTH */
103 #define SATK_HELP_REQUEST_LENGTH 0x00 /* HELP REQUEST LENGTH */
104 #define SATK_LOCATION_STATUS_LENGTH 0x01 /* LOCATION STATUS LENGTH */
105 #define SATK_DATE_TIME_AND_TIME_ZONE_LENGTH 0x07 /* DATE TIME AND TIME ZONE LENGTH */
106 #define SATK_LANGUAGE_LENGTH 0x02 /* LANGUAGE LENGTH */
107 #define SATK_BC_REPEAT_IND_LENGTH 0x01 /* BC REPEAT INDICATION LENGTH */
108 #define SATK_RESPONSE_LENGTH_LENGTH 0x02 /* RESPONSE LENGTH LENGTH */
109 #define SATK_TONE_LENGTH 0x01 /* TONE LENGTH */
110 #define SATK_BROWSER_ID_LENGTH 0x01 /* BROWSER ID LENGTH */
111 #define SATK_BROWSER_TERMINATION_CAUSE_LENGTH 0x01 /* BROWSER TERMINATION CAUSE LENGTH */
112 #define SATK_BUFFER_SIZE_LENGTH 0x02 /* BUFFER SIZE LENGTH */
113 #define SATK_UICC_ME_TRANS_INTERFACE_LEVEL_LENGTH 0x03 /* UICC TERMINAL TRANSPORT INTERFACE LEVEL LENGTH */
114 #define SATK_CHANNEL_DATA_LENGTH_VALUE_LENGTH 0x01 /* CHANNEL DATA LENGTH VALUE LENGTH */
115 #define SATK_CHANNEL_STATUS_LENGTH 0x02 /* CHANNEL STATUS LENGTH */
117 struct private_object_data {
118 struct tcore_sat_operations *ops;
121 gboolean b_comprehensive = FALSE;
123 static void _clone_sat_operations(struct private_object_data *po, struct tcore_sat_operations *sat_ops)
125 if (sat_ops->envelope) {
126 po->ops->envelope = sat_ops->envelope;
128 if (sat_ops->terminal_response) {
129 po->ops->terminal_response = sat_ops->terminal_response;
135 static TReturn _dispatcher(CoreObject *o, UserRequest *ur)
137 enum tcore_request_command command;
138 struct private_object_data *po = NULL;
140 CORE_OBJECT_CHECK_RETURN(o, CORE_OBJECT_TYPE_SAT, TCORE_RETURN_EINVAL);
142 po = tcore_object_ref_object(o);
144 return TCORE_RETURN_ENOSYS;
146 command = tcore_user_request_get_command(ur);
148 case TREQ_SAT_REQ_ENVELOPE:
149 if (!po->ops->envelope)
150 return TCORE_RETURN_ENOSYS;
152 return po->ops->envelope(o, ur);
155 case TREQ_SAT_REQ_TERMINALRESPONSE:
156 if (!po->ops->terminal_response)
157 return TCORE_RETURN_ENOSYS;
159 return po->ops->terminal_response(o, ur);
166 return TCORE_RETURN_SUCCESS;
169 static void _clone_hook(CoreObject *src, CoreObject *dest)
171 struct private_object_data *src_po = NULL;
172 struct private_object_data *dest_po = NULL;
177 dest_po = calloc(1, sizeof(struct private_object_data));
179 tcore_object_link_object(dest, NULL);
183 src_po = tcore_object_ref_object(src);
184 dest_po->ops = src_po->ops;
186 tcore_object_link_object(dest, dest_po);
189 static void _free_hook(CoreObject *o)
191 struct private_object_data *po = NULL;
193 CORE_OBJECT_CHECK(o, CORE_OBJECT_TYPE_SAT);
195 po = tcore_object_ref_object(o);
198 tcore_object_link_object(o, NULL);
202 static gboolean _check_file_for_refresh(enum tel_sim_file_id file_id)
205 enum tel_sim_file_id ef_under_mf[3] = { SIM_EF_DIR, SIM_EF_ELP, SIM_EF_ICCID };
206 enum tel_sim_file_id ef_under_df[29] = {
207 SIM_EF_IMSI, SIM_EF_SST,
208 SIM_EF_EST, SIM_EF_OPLMN_ACT,
209 SIM_EF_GID1, SIM_EF_GID2,
210 SIM_EF_LP, SIM_EF_ECC,
211 SIM_EF_SPN, SIM_EF_SPDI,
212 SIM_EF_PNN, SIM_EF_OPL,
213 SIM_EF_MBDN, SIM_EF_MSISDN,
214 SIM_EF_USIM_MBI, SIM_EF_USIM_MWIS,
215 SIM_EF_USIM_CFIS, SIM_EF_CPHS_VOICE_MSG_WAITING,
216 SIM_EF_CPHS_SERVICE_STRING_TABLE, SIM_EF_CPHS_CALL_FORWARD_FLAGS,
217 SIM_EF_CPHS_OPERATOR_NAME_STRING, SIM_EF_CPHS_CUSTOMER_SERVICE_PROFILE,
218 SIM_EF_CPHS_CPHS_INFO, SIM_EF_CPHS_MAILBOX_NUMBERS,
219 SIM_EF_CPHS_OPERATOR_NAME_SHORT_FORM_STRING, SIM_EF_CPHS_INFORMATION_NUMBERS,
220 SIM_EF_CPHS_DYNAMICFLAGS, SIM_EF_CPHS_DYNAMIC2FLAG,
221 SIM_EF_CPHS_CUSTOMER_SERVICE_PROFILE_LINE2 };
223 dbg("[SAT] SAT PARSER - FILE ID=0x%04x", (unsigned int)file_id);
225 if ( (file_id & 0x2F00) == 0x2F00 )
227 dbg("[SAT] SAT PARSER - MF, EF=0x%04x",file_id);
229 if (file_id == ef_under_mf[i]) {
230 dbg("[SAT] SAT PARSER - MATCH!");
235 else if ( (file_id & 0x6F00) == 0x6F00)
237 dbg("[SAT] SAT PARSER - ADF_USIM EF=0x%04x",file_id);
239 if (file_id == ef_under_df[i]) {
240 dbg("[SAT] SAT PARSER - MATCH!");
248 static int _get_length_filed_size(unsigned char firstLenByte)
250 if (firstLenByte <= 0x7F) return 1;
251 else if (firstLenByte == 0x81) return 2;
252 else return 0; //return zero, as the length field can only be 1 or 2.
255 static void _get_string_data(unsigned char* src, int len,
256 struct tel_sat_text_string_object *text_obj)
258 if (!src || !text_obj) return;
260 switch (text_obj->dcs.a_format) {
261 case ALPHABET_FORMAT_SMS_DEFAULT: {
264 text_obj->string_length = 0;
265 unpacked_str = (char *)tcore_util_unpack_gsm7bit(src, (unsigned int)len);
266 if (!unpacked_str) return;
268 text_obj->dcs.a_format = ALPHABET_FORMAT_8BIT_DATA;
269 text_obj->string_length = strlen(unpacked_str);
271 if (text_obj->string_length >= SAT_TEXT_STRING_LEN_MAX) {
272 text_obj->string_length = SAT_TEXT_STRING_LEN_MAX;
273 memcpy(text_obj->string, unpacked_str, SAT_TEXT_STRING_LEN_MAX);
274 text_obj->string[SAT_TEXT_STRING_LEN_MAX] = 0x00;
277 memcpy(text_obj->string, unpacked_str, text_obj->string_length);
278 text_obj->string[text_obj->string_length] = 0x00;
281 g_free(unpacked_str);
283 case ALPHABET_FORMAT_UCS2:
284 case ALPHABET_FORMAT_8BIT_DATA: {
286 if (text_obj->string_length >= SAT_TEXT_STRING_LEN_MAX) {
287 text_obj->string_length = SAT_TEXT_STRING_LEN_MAX;
288 memcpy(text_obj->string, src, SAT_TEXT_STRING_LEN_MAX);
289 text_obj->string[SAT_TEXT_STRING_LEN_MAX] = 0x00;
292 memcpy(text_obj->string, src, text_obj->string_length);
293 text_obj->string[text_obj->string_length] = 0x00;
297 dbg("[SAT] SAT PARSER - Unknown alphabet format(%d)", text_obj->dcs.a_format);
304 static void _sat_decode_dcs(unsigned char dcs, struct data_coding_scheme* dsc_obj)
306 dbg("[SAT] SAT PARSER - dcs=[0x%x]", dcs);
307 dsc_obj->raw_dcs = dcs;
308 //bit 5 of DCS byte will tell us if the text is compressed or not.
311 dsc_obj->is_compressed_format = TRUE;
313 dsc_obj->is_compressed_format = FALSE;
315 //bit 4 when set, indicates that bits 0 & 1 have message class meaning.
316 dsc_obj->m_class = MSG_CLASS_NONE;
318 switch (dcs & 0x03) {
320 dsc_obj->m_class = MSG_CLASS_0;
323 dsc_obj->m_class = MSG_CLASS_1;
326 dsc_obj->m_class = MSG_CLASS_2;
329 dsc_obj->m_class = MSG_CLASS_3;
332 dsc_obj->m_class = MSG_CLASS_RESERVED;
337 /*bits 2 & 3 indicate the character set being used*/
338 switch (dcs & 0x0C) {
341 dsc_obj->a_format = ALPHABET_FORMAT_SMS_DEFAULT;
345 dsc_obj->a_format = ALPHABET_FORMAT_8BIT_DATA;
349 dsc_obj->a_format = ALPHABET_FORMAT_UCS2;
353 dsc_obj->a_format = ALPHABET_FORMAT_RESERVED;
357 dbg("[SAT] SAT PARSER - is_compressed_format(%d), msgClass(0x%x), alpha_format(0x%x)",
358 dsc_obj->is_compressed_format, dsc_obj->m_class, dsc_obj->a_format);
363 static void _sat_decode_ton_npi(unsigned char ton_npi, enum type_of_number *ton, enum numbering_plan_identifier *npi)
371 ton_value = (ton_npi & 0x70) >> 4;
373 if (*ton > TON_NETWORK_SPECIFIC)
376 npi_value = (ton_npi & 0x0F);
379 case NPI_DATA_NUMBERING_PLAN:
382 case NPI_RESERVED_FOR_EXT:
390 dbg("[SAT] SAT PATSER - ton(0x%x) npi(0x%x)", *ton, *npi);
394 static enum tel_sim_language_type _sat_decode_language(unsigned char byte1, unsigned char byte2)
396 if ((byte1 == 'e')&&(byte2 == 'n')) {
397 return SIM_LANG_ENGLISH;
398 } else if ((byte1 == 'd')&&(byte2 == 'e')) {
399 return SIM_LANG_GERMAN;
400 } else if ((byte1 == 'i')&&(byte2 == 't')) {
401 return SIM_LANG_ITALIAN;
402 } else if ((byte1 == 'f')&&(byte2 == 'r')) {
403 return SIM_LANG_FRENCH;
404 } else if ((byte1 == 'e')&&(byte2 == 's')) {
405 return SIM_LANG_SPANISH;
406 } else if ((byte1 == 'n')&&(byte2 == 'l')) {
407 return SIM_LANG_DUTCH;
408 } else if ((byte1 == 's')&&(byte2 == 'v')) {
409 return SIM_LANG_SWEDISH;
410 } else if ((byte1 == 'd')&&(byte2 == 'a')) {
411 return SIM_LANG_DANISH;
412 } else if ((byte1 == 'p')&&(byte2 == 't')) {
413 return SIM_LANG_PORTUGUESE;
414 } else if ((byte1 == 'f')&&(byte2 == 'i')) {
415 return SIM_LANG_FINNISH;
416 } else if ((byte1 == 'n')&&(byte2 == 'o')) {
417 return SIM_LANG_NORWEGIAN;
418 } else if ((byte1 == 'e')&&(byte2 == 'l')) {
419 return SIM_LANG_GREEK;
420 } else if ((byte1 == 't')&&(byte2 == 'r')) {
421 return SIM_LANG_TURKISH;
422 } else if ((byte1 == 'h')&&(byte2 == 'u')) {
423 return SIM_LANG_HUNGARIAN;
424 } else if ((byte1 == 'p')&&(byte2 == 'i')) {
425 return SIM_LANG_POLISH;
427 dbg("[SAT] SAT PARSER - unknown language, default to english.");
428 return SIM_LANG_ENGLISH;
433 * Decode TLV data object
435 static enum tcore_sat_result _sat_decode_address_tlv(unsigned char* tlv_str, int tlv_len,
436 int curr_offset, struct tel_sat_address* address_obj, int* consumed_data_len)
438 unsigned char* src_data;
439 int index, len_of_len = 0;
441 gboolean comprehensive_req = FALSE;
443 if (tlv_str == NULL || consumed_data_len == NULL || address_obj == NULL) {
444 dbg("[SAT] SAT PARSER - tlv_str == NULL || consumed_data_len == NULL || address_obj == NULL");
445 return TCORE_SAT_ERROR_FATAL;
448 if (tlv_len <= (curr_offset + 1)) {
449 dbg("[SAT] SAT PARSER - incorrect length original_command_len=%d", tlv_len);
450 return TCORE_SAT_COMMAND_NOT_UNDERSTOOD;
455 src_data = &tlv_str[0];
456 if ((src_data[index] & 0x7F) != SATK_ADDRESS_TAG) {
457 dbg("[SAT] SAT PARSER - address TAG missing");
458 return TCORE_SAT_REQUIRED_VALUE_MISSING;
461 //comprehensive required
462 if ((src_data[index++] & 0x80))
463 comprehensive_req = TRUE;
466 len_of_len = _get_length_filed_size(src_data[index]);
468 dbg("[SAT] SAT PARSER - incorrect length");
469 return TCORE_SAT_COMMAND_NOT_UNDERSTOOD;
471 address_len = src_data[index + len_of_len - 1];
473 //check the address length
475 if ((index + address_len) > tlv_len) {
476 dbg("[SAT] SAT PARSER - incorrect length");
477 return TCORE_SAT_COMMAND_NOT_UNDERSTOOD;
480 address_obj->dialing_number_len = 0;
481 if (address_len > 1) {
482 char* str_ascii = NULL;
483 _sat_decode_ton_npi(src_data[index++], &address_obj->ton, &address_obj->npi);
484 str_ascii = tcore_util_convert_bcd2ascii((const char*)&src_data[index], address_len-1, SAT_DIALING_NUMBER_LEN_MAX);
486 memcpy(address_obj->dialing_number, str_ascii, strlen(str_ascii));
487 address_obj->dialing_number_len = strlen(str_ascii);
492 if (address_obj->dialing_number_len == 0) {
493 if (comprehensive_req) {
494 err("[SAT] SAT PARSER - incorrect address");
495 return TCORE_SAT_REQUIRED_VALUE_MISSING;
497 dbg("comprehensive partial proactive command");
498 //global variable (comprehensive_partial= TRUE)
501 *consumed_data_len = 1 + len_of_len + address_len;
502 return TCORE_SAT_SUCCESS;
505 static enum tcore_sat_result _sat_decode_subaddress_tlv(unsigned char* tlv_str, int tlv_len,
506 int curr_offset, struct tel_sat_subaddress* sub_address_obj, int* consumed_data_len)
508 unsigned char* src_data;
509 int index, len_of_len = 0;
510 int sub_address_len = 0;
511 gboolean comprehensive_req = FALSE;
513 if (tlv_str == NULL || consumed_data_len == NULL || sub_address_obj == NULL) {
514 dbg("[SAT] SAT PARSER - tlv_str == NULL || consumed_data_len == NULL || sub_address_obj == NULL");
515 return TCORE_SAT_ERROR_FATAL;
518 if (tlv_len <= (curr_offset + 1)) {
519 dbg("[SAT] SAT PARSER - incorrect length original_command_len=%d", tlv_len);
520 return TCORE_SAT_COMMAND_NOT_UNDERSTOOD;
525 src_data = &tlv_str[0];
526 if ((src_data[index] & 0x7F) != SATK_SUB_ADDRESS_TAG) {
527 dbg("[SAT] SAT PARSER - sub address TAG missing");
528 return TCORE_SAT_REQUIRED_VALUE_MISSING;
531 //comprehensive required
532 if ((src_data[index++] & 0x80))
533 comprehensive_req = TRUE;
536 len_of_len = _get_length_filed_size(src_data[index]);
538 dbg("[SAT] SAT PARSER - incorrect length");
539 return TCORE_SAT_COMMAND_NOT_UNDERSTOOD;
541 sub_address_len = src_data[index + len_of_len - 1];
543 //check the address length
545 if ((index + sub_address_len) > tlv_len) {
546 dbg("[SAT] SAT PARSER - incorrect length");
547 return TCORE_SAT_COMMAND_NOT_UNDERSTOOD;
551 if (sub_address_len <= 0) {
552 dbg("[SAT] SAT PARSER - no sub address data");
553 return TCORE_SAT_COMMAND_NOT_UNDERSTOOD;
556 sub_address_obj->subaddress_len = sub_address_len;
557 if ( sub_address_obj->subaddress_len > SAT_CCP_DATA_LEN_MAX) {
558 if (comprehensive_req) {
559 dbg("[SAT] SAT PARSER - sub address is too big");
560 return TCORE_SAT_COMMAND_NOT_UNDERSTOOD;
563 //bIsComprehensionPartial = TRUE;
564 sub_address_obj->subaddress_len = 0;
568 memcpy(sub_address_obj->subaddress, &src_data[index], sub_address_obj->subaddress_len);
571 *consumed_data_len = 1 + len_of_len + sub_address_len;
572 return TCORE_SAT_SUCCESS;
575 static enum tcore_sat_result _sat_decode_alpha_identifier_tlv(unsigned char* tlv_str, int tlv_len,
576 int curr_offset, struct tel_sat_alpha_identifier* alpha_id_obj, int* consumed_data_len)
578 unsigned char* src_data;
579 int index, len_of_len = 0;
582 if (tlv_str == NULL || consumed_data_len == NULL || alpha_id_obj == NULL) {
583 dbg("[SAT] SAT PARSER - tlv_str == NULL || consumed_data_len == NULL || alpha_id_obj == NULL");
584 return TCORE_SAT_ERROR_FATAL;
587 if (tlv_len <= (curr_offset + 1)) {
588 dbg("[SAT] SAT PARSER - incorrect length original_command_len=%d", tlv_len);
589 return TCORE_SAT_COMMAND_NOT_UNDERSTOOD;
594 src_data = &tlv_str[0];
595 if ((src_data[index++] & 0x7F) != SATK_ALPHA_IDENTIFIER_TAG) {
596 dbg("[SAT] SAT PARSER - alphaID TAG missing");
597 return TCORE_SAT_COMMAND_NOT_UNDERSTOOD;
601 alpha_id_obj->is_exist = TRUE;
602 len_of_len = _get_length_filed_size(src_data[index]);
604 dbg("[SAT] SAT PARSER - incorrect length");
605 return TCORE_SAT_COMMAND_NOT_UNDERSTOOD;
607 alpha_len = alpha_id_obj->alpha_data_len = src_data[index + len_of_len - 1];
611 if ((index + alpha_len) > tlv_len) {
612 dbg("[SAT] SAT PARSER - incorrect length");
613 return TCORE_SAT_COMMAND_NOT_UNDERSTOOD;
616 if (alpha_id_obj->alpha_data_len > 0) {
620 if (alpha_id_obj->alpha_data_len >= SAT_ALPHA_ID_LEN_MAX)
621 alpha_id_obj->alpha_data_len = SAT_ALPHA_ID_LEN_MAX - 1;
623 memcpy(alpha_id_obj->alpha_data, &src_data[index], alpha_id_obj->alpha_data_len);
624 alpha_id_obj->alpha_data[alpha_id_obj->alpha_data_len] = 0x00;
626 if (src_data[index] == 0x80 || src_data[index] == 0x81 || src_data[index] == 0x82)
631 _sat_decode_dcs(dcs, &alpha_id_obj->dcs);
634 *consumed_data_len = 1 + len_of_len + alpha_len;
635 dbg("[SAT] SAT PARSER alphaId= %s", alpha_id_obj->alpha_data);
636 return TCORE_SAT_SUCCESS;
639 static enum tcore_sat_result _sat_decode_sub_address_tlv(unsigned char* tlv_str, int tlv_len,
640 int curr_offset, struct tel_sat_subaddress* sub_address_obj, int* consumed_data_len)
643 int index, len_of_len = 0;
644 int sub_address_len = 0;
645 unsigned char* src_data;
646 gboolean comprehension_req = FALSE;
648 if (tlv_str == NULL || consumed_data_len == NULL || sub_address_obj == NULL) {
649 dbg("[SAT] SAT PARSER - tlv_str == NULL || consumed_data_len == NULL || sub_address_obj == NULL");
650 return TCORE_SAT_ERROR_FATAL;
653 if (tlv_len <= (curr_offset + 1)) {
654 dbg("[SAT] SAT PARSER - incorrect length original_command_len=%d", tlv_len);
655 return TCORE_SAT_COMMAND_NOT_UNDERSTOOD;
660 src_data = &tlv_str[0];
661 if ((src_data[index] & 0x7F) != SATK_SUB_ADDRESS_TAG) {
662 dbg("[SAT] SAT PARSER - address TAG missing");
663 return TCORE_SAT_REQUIRED_VALUE_MISSING;
666 //comprehensive required
667 if ((src_data[index++] & 0x80))
668 comprehension_req = TRUE;
671 len_of_len = _get_length_filed_size(src_data[index]);
673 dbg("[SAT] SAT PARSER - incorrect length");
674 return TCORE_SAT_COMMAND_NOT_UNDERSTOOD;
676 sub_address_len = src_data[index + len_of_len - 1];
678 //check the address length
680 if ((index + sub_address_len) > tlv_len) {
681 dbg("[SAT] SAT PARSER - incorrect length");
682 return TCORE_SAT_COMMAND_NOT_UNDERSTOOD;
685 if (sub_address_len <= 0) {
686 dbg("[SAT] SAT PARSER - no sub address");
687 return TCORE_SAT_COMMAND_NOT_UNDERSTOOD;
690 sub_address_obj->subaddress_len = sub_address_len;
691 if (sub_address_obj->subaddress_len > SAT_SUB_ADDR_LEN_MAX) {
692 if (comprehension_req)
693 return TCORE_SAT_COMMAND_NOT_UNDERSTOOD;
695 sub_address_obj->subaddress_len = 0;
698 memcpy(sub_address_obj->subaddress, &src_data[index],sub_address_obj->subaddress_len);
701 dbg("[SAT] SAT PARSER - subAddressLen=%d",sub_address_obj->subaddress_len);
702 for(i=0;i<sub_address_obj->subaddress_len;i++)
703 dbg("[SAT] SAT PARSER - 0x%02x\t",sub_address_obj->subaddress[i]);
705 *consumed_data_len = 1+len_of_len+sub_address_len;
706 return TCORE_SAT_SUCCESS;
709 static enum tcore_sat_result _sat_decode_ccp_tlv(unsigned char* tlv_str, int tlv_len,
710 int curr_offset, struct tel_sat_ccp* ccp_obj, int* consumed_data_len)
713 int index, len_of_len = 0;
715 unsigned char* src_data;
716 gboolean comprehension_req = FALSE;
718 if (tlv_str == NULL || consumed_data_len == NULL || ccp_obj == NULL) {
719 dbg("[SAT] SAT PARSER - tlv_str == NULL || consumed_data_len == NULL || ccp_obj == NULL");
720 return TCORE_SAT_ERROR_FATAL;
723 if (tlv_len <= (curr_offset + 1)) {
724 dbg("[SAT] SAT PARSER - incorrect length original_command_len=%d", tlv_len);
725 return TCORE_SAT_COMMAND_NOT_UNDERSTOOD;
730 src_data = &tlv_str[0];
731 if ((src_data[index] & 0x7F) != SATK_CAPABILITY_CONFIGURATION_PARAMETERS_TAG) {
732 dbg("[SAT] SAT PARSER - CCP TAG missing");
733 return TCORE_SAT_REQUIRED_VALUE_MISSING;
736 //comprehensive required
737 if ((src_data[index++] & 0x80))
738 comprehension_req = TRUE;
741 len_of_len = _get_length_filed_size(src_data[index]);
743 dbg("[SAT] SAT PARSER - incorrect length");
744 return TCORE_SAT_COMMAND_NOT_UNDERSTOOD;
746 ccp_len = src_data[index + len_of_len - 1];
748 //check the address length
750 if ((index + ccp_len) > tlv_len) {
751 dbg("[SAT] SAT PARSER - incorrect length");
752 return TCORE_SAT_COMMAND_NOT_UNDERSTOOD;
756 dbg("[SAT] SAT PARSER - no ccp data");
757 return TCORE_SAT_COMMAND_NOT_UNDERSTOOD;
760 ccp_obj->data_len = ccp_len;
761 if (ccp_obj->data_len > SAT_CCP_DATA_LEN_MAX) {
762 if (comprehension_req)
763 return TCORE_SAT_COMMAND_NOT_UNDERSTOOD;
765 ccp_obj->data_len = 0;
768 memcpy(ccp_obj->data, &src_data[index],ccp_obj->data_len);
771 dbg("[SAT] SAT PARSER - ccp len=%d",ccp_obj->data_len);
772 for(i=0;i<ccp_obj->data_len;i++)
773 dbg("[SAT] SAT PARSER - 0x%02x\t",ccp_obj->data[i]);
775 *consumed_data_len = 1+len_of_len+ccp_len;
776 return TCORE_SAT_SUCCESS;
779 static enum tcore_sat_result _sat_decode_device_identities_tlv(unsigned char* tlv_str,
780 struct tel_sat_device_identities* dev_id_obj)
784 if (tlv_str == NULL || dev_id_obj == NULL) {
785 dbg("[SAT] SAT PARSER - tlv_str ==NULL || dev_id_obj == NULL");
786 return TCORE_SAT_ERROR_FATAL;
789 if ((tlv_str[index++] & 0x7F) != SATK_DEVICE_IDENTITY_TAG) {
790 dbg("[SAT] SAT PARSER - device identity tag missing.");
791 return TCORE_SAT_REQUIRED_VALUE_MISSING; //send TR
794 if (tlv_str[index++] != SATK_DEVICE_IDENTITY_LENGTH) {
795 dbg("[SAT] SAT PARSER - device identity length incorrect.");
796 return TCORE_SAT_REQUIRED_VALUE_MISSING; //send TR
799 for (i = 0; i < 2; i++) {
800 switch (tlv_str[index]) {
801 case DEVICE_ID_KEYPAD:
802 case DEVICE_ID_DISPLAY:
803 case DEVICE_ID_EARPIECE:
806 case DEVICE_ID_NETWORK:
807 if (i == 0) dev_id_obj->src = tlv_str[index];
808 if (i == 1) dev_id_obj->dest = tlv_str[index];
811 if (tlv_str[index] >= 0x21 && tlv_str[index] <= 0x27) {
812 dbg("BIP channel id(0x%x)", tlv_str[index]);
813 if (i == 0) dev_id_obj->src = tlv_str[index];
814 if (i == 1) dev_id_obj->dest = tlv_str[index];
817 dbg("unmatched device id");
818 return TCORE_SAT_REQUIRED_VALUE_MISSING;
825 dbg("[SAT] SAT PARSER - source=%d, dest=%d", dev_id_obj->src, dev_id_obj->dest);
826 return TCORE_SAT_SUCCESS;
829 static enum tcore_sat_result _sat_decode_duration_tlv(unsigned char* tlv_str, int tlv_len,
830 int curr_offset, struct tel_sat_duration *duration_obj, int* consumed_data_len)
833 unsigned char* src_data = NULL;
835 if (!tlv_str || !duration_obj || !consumed_data_len) {
836 err("[SAT] SAT PARSER data is null");
837 return TCORE_SAT_ERROR_FATAL;
840 if (tlv_len < curr_offset + 3) {
841 err("[SAT] SAT PARSER - incorrect length original_command_len=%d", tlv_len);
842 return TCORE_SAT_COMMAND_NOT_UNDERSTOOD;
846 src_data = &tlv_str[0];
847 if ((src_data[index++] & 0x7F) != SATK_DURATION_TAG) {
848 err("[SAT] SAT PARSER - duration tag missing.");
849 return TCORE_SAT_COMMAND_NOT_UNDERSTOOD; //send TR
852 if (src_data[index++] != SATK_DURATION_LENGTH) {
853 err("[SAT] SAT PARSER - incorrect length value.");
854 return TCORE_SAT_COMMAND_NOT_UNDERSTOOD; //send TR
858 switch (src_data[index]) {
859 case TIME_UNIT_MINUTES:
860 case TIME_UNIT_SECONDS:
861 case TIME_UNIT_TENTHS_OF_SECONDS:
862 duration_obj->time_unit = src_data[index];
865 duration_obj->time_unit = TIME_UNIT_RESERVED;
871 duration_obj->time_interval = src_data[index];
872 *consumed_data_len = 4;
874 dbg("[SAT] SAT PARSER - timeUnit=%d, interval=%d", duration_obj->time_unit, duration_obj->time_interval);
876 return TCORE_SAT_SUCCESS;
879 static enum tcore_sat_result _sat_decode_item_tlv(unsigned char* tlv_str, int tlv_len,
880 int curr_offset, struct tel_sat_item_info* item_obj, int* consumed_data_len)
882 int index, len_of_len=0, i=0;
884 unsigned char* src_data = NULL;
886 if ((tlv_str == NULL)
887 || (consumed_data_len == NULL)
888 || (item_obj == NULL)) {
889 err("[SAT PARSER] TLV: [0x%x] Item Object: [0x%x] Consumed Data length(ptr): [0x%x]",
890 tlv_str, item_obj, consumed_data_len);
891 return TCORE_SAT_ERROR_FATAL;
894 if (tlv_len <= (curr_offset+1)) {
895 err("[SAT PARSER] SAT PARSER - incorrect length original_command_len=%d", tlv_len);
896 return TCORE_SAT_COMMAND_NOT_UNDERSTOOD;
899 /* ITEM TAG - 0x0F */
901 src_data = &tlv_str[0];
902 if ((src_data[index++]&0x7F) != SATK_ITEM_TAG) {
903 err("[SAT PARSER] ITEM TAG not found: [0x%02x]", src_data[index-1]);
904 return TCORE_SAT_COMMAND_NOT_UNDERSTOOD;
908 len_of_len = _get_length_filed_size(src_data[index]);
910 err("[SAT PARSER] Incorrect length");
911 return TCORE_SAT_COMMAND_NOT_UNDERSTOOD;
913 item_len = src_data[index+len_of_len-1];
915 index+=len_of_len; /* index pointing to item */
916 if ((index+item_len) > tlv_len) {
917 err("[SAT PARSER] Incorrect length");
918 return TCORE_SAT_COMMAND_NOT_UNDERSTOOD;
921 memset(item_obj->text, 0x00,(SAT_ITEM_TEXT_LEN_MAX+1));
923 dbg("[SAT PARSER] Menu Text is NULL, remove the Menu");
924 *consumed_data_len = 1+len_of_len+item_len;
925 return TCORE_SAT_SUCCESS;
929 item_obj->item_id = src_data[index++];
930 dbg("[SAT PARSER] Item ID: [%d]", item_obj->item_id);
931 // fix for orange SIM issue
932 // H0100078487 Strange Character display on SIM SAT
933 // The string length was less than its real length
934 // So garbage characters was displayed. To fix it, we would recalculate the real length.
935 dbg("[SAT PARSER] Text");
936 for(i = 0 ; i < (item_len - 1) ; i++) {
937 msg(" [SAT PARSER] - [%d]: [%c]", i, src_data[index+i]);
938 if (src_data[index+i] == 0xFF)
941 item_obj->text_len = i;
943 if (item_obj->text_len <= 0) {
944 dbg("[SAT PARSER] Text length: [%d]", item_obj->text_len);
945 return TCORE_SAT_COMMAND_NOT_UNDERSTOOD;
948 if (item_obj->text_len > SAT_ITEM_TEXT_LEN_MAX)
949 item_obj->text_len = SAT_ITEM_TEXT_LEN_MAX;
951 memcpy(item_obj->text, &src_data[index], item_obj->text_len);
952 dbg("[SAT PARSER] Item Text: [%s]", item_obj->text);
954 *consumed_data_len = 1+len_of_len+item_len;
956 return TCORE_SAT_SUCCESS;
959 static enum tcore_sat_result _sat_decode_response_length_tlv(unsigned char* tlv_str, int tlv_len,
960 int curr_offset, struct tel_sat_response_length *response_obj, int* consumed_data_len)
963 unsigned char* src_data = NULL;
965 if (!tlv_str || !response_obj || !consumed_data_len) {
966 err("[SAT] SAT PARSER data is null");
967 return TCORE_SAT_ERROR_FATAL;
970 if (tlv_len <= curr_offset + 1) {
971 err("[SAT] SAT PARSER - incorrect length original_command_len=%d", tlv_len);
972 return TCORE_SAT_COMMAND_NOT_UNDERSTOOD;
976 src_data = &tlv_str[0];
977 if ((src_data[index++] & 0x7F) != SATK_RESPONSE_LENGTH_TAG) {
978 err("[SAT] SAT PARSER - response length tag missing.");
979 return TCORE_SAT_COMMAND_NOT_UNDERSTOOD; //send TR
982 if (src_data[index++] != SATK_RESPONSE_LENGTH_LENGTH) {
983 err("[SAT] SAT PARSER - incorrect length value.");
984 return TCORE_SAT_COMMAND_NOT_UNDERSTOOD; //send TR
987 response_obj->min = src_data[index++];
988 response_obj->max = src_data[index++];
989 dbg("[SAT] SAT PARSER min length(%d), max length(%d)", response_obj->min, response_obj->max);
991 *consumed_data_len = 4;
992 if (response_obj->min > response_obj->max) {
993 err("[SAT] SAT PARSER - : min length is larger than max length");
994 return TCORE_SAT_BEYOND_ME_CAPABILITY;
997 return TCORE_SAT_SUCCESS;
1000 static enum tcore_sat_result _sat_decode_sms_tpdu_tlv(unsigned char* tlv_str, int tlv_len,
1001 int curr_offset, struct tel_sat_sms_tpdu *sms_tpdu_obj, int* consumed_data_len)
1003 int index = 0, len_of_len = 0;
1005 unsigned char* src_data = NULL;
1007 if (!tlv_str || !sms_tpdu_obj || !consumed_data_len) {
1008 err("[SAT] SAT PARSER data is null");
1009 return TCORE_SAT_ERROR_FATAL;
1012 if (tlv_len <= curr_offset + 1) {
1013 err("[SAT] SAT PARSER - incorrect length original_command_len=%d", tlv_len);
1014 return TCORE_SAT_COMMAND_NOT_UNDERSTOOD;
1017 index = curr_offset;
1018 src_data = &tlv_str[0];
1019 if ((src_data[index++] & 0x7F) != SATK_SMS_TPDU_TAG) {
1020 err("[SAT] SAT PARSER - sat tpdu tag missing.");
1021 return TCORE_SAT_COMMAND_NOT_UNDERSTOOD;
1025 len_of_len = _get_length_filed_size(src_data[index]);
1027 err("[SAT] parser: invalid length.");
1028 return TCORE_SAT_COMMAND_NOT_UNDERSTOOD;
1030 tpdu_len = src_data[index+len_of_len-1];
1031 index += len_of_len;
1034 return TCORE_SAT_REQUIRED_VALUE_MISSING;
1037 sms_tpdu_obj->data_len = tpdu_len;
1038 if (sms_tpdu_obj->data_len > SAT_SMS_TPDU_SMS_DATA_LEN_MAX) {
1039 sms_tpdu_obj->data_len = SAT_SMS_TPDU_SMS_DATA_LEN_MAX;
1043 memcpy(sms_tpdu_obj->data, &src_data[index], sms_tpdu_obj->data_len);
1044 dbg("[SAT] SAT PARSER tpdu_len (%d)", sms_tpdu_obj->data_len);
1046 *consumed_data_len = 1+len_of_len+tpdu_len;
1047 return TCORE_SAT_SUCCESS;
1050 static enum tcore_sat_result _sat_decode_item_identifier_tlv(unsigned char* tlv_str, int tlv_len,
1051 int curr_offset, struct tel_sat_item_identifier *item_identifier_obj, int* consumed_data_len)
1054 unsigned char* src_data = NULL;
1056 if (!tlv_str || !item_identifier_obj || !consumed_data_len) {
1057 err("[SAT] SAT PARSER data is null");
1058 return TCORE_SAT_ERROR_FATAL;
1061 if (tlv_len <= curr_offset + 1) {
1062 err("[SAT] SAT PARSER - incorrect length original_command_len=%d", tlv_len);
1063 return TCORE_SAT_COMMAND_NOT_UNDERSTOOD;
1066 index = curr_offset;
1067 src_data = &tlv_str[0];
1068 if ((src_data[index++] & 0x7F) != SATK_ITEM_IDENTIFIER_TAG) {
1069 err("[SAT] SAT PARSER - Item identifier tag missing.");
1070 return TCORE_SAT_COMMAND_NOT_UNDERSTOOD; //send TR
1073 if (src_data[index++] != SATK_ITEM_IDENTIFIER_LENGTH) {
1074 err("[SAT] SAT PARSER - incorrect length value.");
1075 return TCORE_SAT_COMMAND_NOT_UNDERSTOOD; //send TR
1078 item_identifier_obj->item_identifier = src_data[index++];
1079 *consumed_data_len = 3;
1080 dbg("[SAT] SAT PARSER item identifier(0x%02x)", item_identifier_obj->item_identifier);
1082 return TCORE_SAT_SUCCESS;
1085 static enum tcore_sat_result _sat_decode_ss_string_tlv(unsigned char* tlv_str, int tlv_len,
1086 int curr_offset, struct tel_sat_ss_string *ss_str_obj, int* consumed_data_len)
1088 char* str_ascii = NULL;
1089 int index, len_of_len=0;
1091 unsigned char* src_data;
1092 gboolean comprehension_req = FALSE;
1094 if (!tlv_str || !ss_str_obj || !consumed_data_len) {
1095 err("[SAT] SAT PARSER data is null");
1096 return TCORE_SAT_ERROR_FATAL;
1099 if (tlv_len <= curr_offset + 1) {
1100 err("[SAT] SAT PARSER - incorrect length original_command_len=%d", tlv_len);
1101 return TCORE_SAT_COMMAND_NOT_UNDERSTOOD;
1104 index = curr_offset;
1105 src_data = &tlv_str[0];
1106 if ((src_data[index] & 0x7F) != SATK_SS_STRING_TAG) {
1107 err("[SAT] SAT PARSER - SS string tag missing.");
1108 return TCORE_SAT_COMMAND_NOT_UNDERSTOOD; //send TR
1111 if (src_data[index++]&0x80)
1112 comprehension_req = TRUE;
1115 len_of_len = _get_length_filed_size(src_data[index]);
1117 err("[SAT] parser: invalid length.");
1118 return TCORE_SAT_COMMAND_NOT_UNDERSTOOD;
1121 ss_len = src_data[index+len_of_len-1];
1122 dbg("[SAT] parser: ss_tlv len=%d",ss_len);
1124 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[index++], &ss_str_obj->ton, &ss_str_obj->npi);
1132 str_ascii = tcore_util_convert_bcd2ascii((const char*)&src_data[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 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 index = curr_offset;
1164 src_data = &tlv_str[0];
1165 if ((src_data[index]&0x7F) != SATK_TEXT_STRING_TAG && (src_data[index]&0x7F) != SATK_DEFAULT_TEXT_TAG) {
1166 err("[SAT] parser: text string tag missing, tag=0x%x",src_data[index]);
1167 return TCORE_SAT_COMMAND_NOT_UNDERSTOOD;
1170 if (src_data[index++]&0x80)
1171 comprehension_req = TRUE;
1174 len_of_len = _get_length_filed_size(src_data[index]);
1176 err("[SAT] parser: invalid length.");
1177 return TCORE_SAT_COMMAND_NOT_UNDERSTOOD;
1180 text_len = src_data[index+len_of_len-1];
1181 dbg("[SAT] parser: text_tlv_len=%d",text_len);
1183 index += len_of_len;
1184 memset(text_obj->string, 0x00, SAT_TEXT_STRING_LEN_MAX);
1188 text_obj->string_length = 0;
1190 text_obj->string_length = text_len-1;
1191 _sat_decode_dcs(src_data[index++], &text_obj->dcs);
1192 _get_string_data(&src_data[index], text_obj->string_length, text_obj);
1195 // 1 is the length of Tag.
1196 *consumed_data_len = 1 + len_of_len + text_len;
1198 return TCORE_SAT_SUCCESS;
1201 static enum tcore_sat_result _sat_decode_tone_tlv(unsigned char* tlv_str, int tlv_len,
1202 int curr_offset, struct tel_sat_tone *tone_obj, int* consumed_data_len)
1205 unsigned char* src_data;
1206 gboolean comprehension_req = FALSE;
1208 if (tlv_str == NULL || consumed_data_len == NULL || tone_obj == NULL) {
1209 dbg("[SAT] SAT PARSER - tlv_str == NULL || consumed_data_len == NULL || tone_obj == NULL");
1210 return TCORE_SAT_ERROR_FATAL;
1213 if (tlv_len <= (curr_offset+1)) {
1214 dbg("[SAT] SAT PARSER - incorrect length original_command_len=%d", tlv_len);
1215 return TCORE_SAT_COMMAND_NOT_UNDERSTOOD;
1219 index = curr_offset;
1220 src_data = &tlv_str[0];
1221 if ((src_data[index]&0x7F) != SATK_TONE_TAG) {
1222 err("[SAT] parser: tone tag missing");
1223 return TCORE_SAT_COMMAND_NOT_UNDERSTOOD;
1226 if (src_data[index++]&0x80)
1227 comprehension_req = TRUE;
1230 if (src_data[index++] != SATK_TONE_LENGTH) {
1231 err("[SAT] SAT PARSER - incorrect length value.");
1232 return TCORE_SAT_COMMAND_NOT_UNDERSTOOD; //send TR
1235 if ((index+SATK_TONE_LENGTH) > tlv_len)
1237 err("[SAT] SAT PARSER - incorrect cmd len, expected len = %d, orig_len=%d", (index+SATK_TONE_LENGTH),tlv_len);
1238 return TCORE_SAT_COMMAND_NOT_UNDERSTOOD;
1242 switch(src_data[index])
1244 // standard supervisory tones
1246 case CALLED_SUBSCRIBER_BUSY :
1248 case RADIO_PATH_ACK:
1249 case RADIO_PATH_NOT_AVAILABLE_CALL_DROPPED:
1250 case ERR_SPECIAL_INFO:
1251 case CALL_WAITING_TONE:
1253 // ME proprietary tones
1255 case POSITIVE_ACK_TONE:
1256 case NEGATIVE_ACK_OR_ERROR_TONE:
1257 case RINGING_TONE_SLCTD_BY_USR_FOR_INCOM_SPEECH_CALL:
1258 case ALERT_TONE_SELECTED_BY_USER_FOR_INCOMING_SMS:
1259 case CRITICAL_ALERT:
1263 case URGENT_ACTION_TONE :
1265 case MESSAGE_RECEIVED_TONE :
1275 dbg("[SAT] SAT PARSER - Tone =0x%x", src_data[index]);
1276 tone_obj->tone_type = src_data[index];
1279 case TONE_TYPE_RESERVED:
1281 dbg("[SAT] SAT PARSER - Reserved value of Tone =0x%x", src_data[index]);
1282 if (comprehension_req)
1283 return TCORE_SAT_COMMAND_NOT_UNDERSTOOD;
1287 *consumed_data_len = 3;
1288 return TCORE_SAT_SUCCESS;
1291 static enum tcore_sat_result _sat_decode_ussd_string_tlv(unsigned char* tlv_str, int tlv_len,
1292 int curr_offset, struct tel_sat_ussd_string *ussd_str_obj, int* consumed_data_len)
1294 int index, len_of_len=0;
1296 unsigned char* src_data;
1297 gboolean comprehension_req = FALSE;
1299 if (!tlv_str || !ussd_str_obj || !consumed_data_len) {
1300 err("[SAT] SAT PARSER data is null");
1301 return TCORE_SAT_ERROR_FATAL;
1304 if (tlv_len <= curr_offset + 1) {
1305 err("[SAT] SAT PARSER - incorrect length original_command_len=%d", tlv_len);
1306 return TCORE_SAT_COMMAND_NOT_UNDERSTOOD;
1309 index = curr_offset;
1310 src_data = &tlv_str[0];
1311 if ((src_data[index] & 0x7F) != SATK_USSD_STRING_TAG) {
1312 err("[SAT] SAT PARSER - SS string tag missing.");
1313 return TCORE_SAT_COMMAND_NOT_UNDERSTOOD; //send TR
1316 if (src_data[index++]&0x80)
1317 comprehension_req = TRUE;
1320 len_of_len = _get_length_filed_size(src_data[index]);
1322 err("[SAT] parser: invalid length.");
1323 return TCORE_SAT_COMMAND_NOT_UNDERSTOOD;
1326 ussd_len = src_data[index+len_of_len-1];
1327 dbg("[SAT] parser: ussd_tlv len=%d",ussd_len);
1329 index += len_of_len;
1330 ussd_str_obj->string_len = 0;
1334 return TCORE_SAT_REQUIRED_VALUE_MISSING;
1336 _sat_decode_dcs(src_data[index++], &ussd_str_obj->dsc);
1337 ussd_str_obj->string_len = ussd_len - 1;
1338 memcpy(ussd_str_obj->ussd_string, &src_data[index], ussd_str_obj->string_len);
1340 // 1 is the length of Tag.
1341 *consumed_data_len = 1 + len_of_len + ussd_len;
1342 return TCORE_SAT_SUCCESS;
1345 static enum tcore_sat_result _sat_decode_file_list_tlv(unsigned char* tlv_str, int tlv_len,
1346 int curr_offset, struct tel_sat_file_list *file_list_obj, int* consumed_data_len)
1349 int tmp_cnt, tmp_path_len;
1351 unsigned int ef = 0x0000;
1353 int index, len_of_len=0;
1354 int file_list_len = 0;
1355 unsigned char* src_data;
1357 if (tlv_str == NULL || consumed_data_len == NULL || file_list_obj == NULL) {
1358 dbg("[SAT] SAT PARSER - tlv_str == NULL || consumed_data_len == NULL || file_list_obj == NULL");
1359 return TCORE_SAT_ERROR_FATAL;
1362 if (tlv_len <= (curr_offset+1)) {
1363 dbg("[SAT] SAT PARSER - incorrect length original_command_len=%d", tlv_len);
1364 return TCORE_SAT_COMMAND_NOT_UNDERSTOOD;
1368 index = curr_offset;
1369 src_data = &tlv_str[0];
1370 if ((src_data[index]&0x7F) != SATK_FILE_LIST_TAG) {
1371 err("[SAT] parser: tag missing, tag=0x%x",src_data[index]);
1372 return TCORE_SAT_COMMAND_NOT_UNDERSTOOD;
1376 len_of_len = _get_length_filed_size(src_data[index]);
1378 err("[SAT] parser: invalid length.");
1379 return TCORE_SAT_COMMAND_NOT_UNDERSTOOD;
1381 file_list_len = src_data[index+len_of_len-1];
1382 index += len_of_len;
1384 if ((index+file_list_len) > tlv_len) {
1385 dbg("[SAT] SAT PARSER - incorrect cmd len, expected len = %d, orig_len=%d", (index+file_list_len),tlv_len);
1386 return TCORE_SAT_COMMAND_NOT_UNDERSTOOD;
1389 tmp_cnt = src_data[index++];
1390 tmp_path_len = file_list_len - 1;
1391 file_list_obj->file_count = 0;
1392 memset(file_list_obj->file_id, 0, SAT_FILE_ID_LIST_MAX_COUNT);
1395 dbg("file cnt = 0");
1396 return TCORE_SAT_COMMAND_NOT_UNDERSTOOD;
1402 if ( src_data[index] != 0x3F || src_data[index+1] != 0x00) {
1404 if (index > tlv_len) break;
1407 index+=2; //MASTER FILE (DIR) 0x3F00
1409 if (src_data[index] == 0x2F) {
1410 //ELEMENTRY FILE (VALUE)
1411 ef = src_data[index] << 8;
1413 ef = ef | src_data[index];
1415 if ( _check_file_for_refresh((enum tel_sim_file_id)ef) ) {//check file registered for refresh?
1416 file_list_obj->file_id[file_list_obj->file_count] = ef;
1417 file_list_obj->file_count++;
1420 else if (src_data[index] == 0x7F && src_data[index+1] == 0xFF) {
1421 //USIM DIRECTORY FILE (DIR) 0x7FFF
1423 if (src_data[index] == 0x6F) {
1426 ef = ef | src_data[index];
1428 if ( _check_file_for_refresh((enum tel_sim_file_id)ef) ) {//check file registered for refresh?
1429 file_list_obj->file_id[file_list_obj->file_count] = ef;
1430 file_list_obj->file_count++;
1437 else if (src_data[index] == 0x7F && (src_data[index+1] == 0x10 || src_data[index+1] == 0x20) ) {
1438 //TELECOM DIRECTORY FILE 0x7F10 or GSM DIRECTORY FILE 0x7F20
1440 if (src_data[index] == 0x6F) {
1441 ef = src_data[index] << 8;
1443 ef = ef | src_data[index];
1445 if ( _check_file_for_refresh((enum tel_sim_file_id)ef) ) {//check file registered for refresh?
1446 file_list_obj->file_id[file_list_obj->file_count] = ef;
1447 file_list_obj->file_count++;
1457 }while( f_count < tmp_cnt);
1459 dbg("[SAT] SAT PARSER - total file count=%d, PDA file count = %d", tmp_cnt, file_list_obj->file_count);
1460 *consumed_data_len = 1 + len_of_len + file_list_len;
1461 return TCORE_SAT_SUCCESS;
1464 static enum tcore_sat_result _sat_decode_item_next_action_indicator_tlv(unsigned char* tlv_str,
1465 int tlv_len, int curr_offset,
1466 struct tel_sat_item_next_action_indicatior_list* item_next_act_indi_obj,
1467 int* consumed_data_len)
1471 unsigned char* src_data;
1472 gboolean comprehension_req = FALSE;
1474 if (tlv_str == NULL || consumed_data_len == NULL || item_next_act_indi_obj == NULL) {
1475 dbg("[SAT] SAT PARSER - tlv_str == NULL || consumed_data_len == NULL || item_next_act_indi_obj == NULL");
1476 return TCORE_SAT_ERROR_FATAL;
1479 if (tlv_len <= (curr_offset+1)) {
1480 dbg("[SAT] SAT PARSER - incorrect length original_command_len=%d", tlv_len);
1481 return TCORE_SAT_COMMAND_NOT_UNDERSTOOD;
1485 index = curr_offset;
1486 src_data = &tlv_str[0];
1487 if ((src_data[index]&0x7F) != SATK_ITEMS_NEXT_ACTION_INDICATOR_TAG) {
1488 dbg("[SAT] SAT PARSER - tag not found.=%d",src_data[index]);
1489 return TCORE_SAT_COMMAND_NOT_UNDERSTOOD;
1492 if ((src_data[index++]&0x7F))
1493 comprehension_req = TRUE;
1496 item_nai_len = item_next_act_indi_obj->cnt = src_data[index++];
1497 if ((index+item_nai_len) > tlv_len) {
1498 dbg("[SAT] SAT PARSER - incorrect cmd len, expected len = %d, orig_len=%d", (index+item_nai_len),tlv_len);
1499 return TCORE_SAT_COMMAND_NOT_UNDERSTOOD;
1502 if (item_next_act_indi_obj->cnt > SAT_ITEMS_NEXT_ACTION_INDI_LIST_MAX_COUNT) {
1503 if (comprehension_req == TRUE) {
1504 dbg("[SAT] SAT PARSER - list count exceeds maximum allowed count=%d",item_next_act_indi_obj->cnt);
1505 return TCORE_SAT_COMMAND_NOT_UNDERSTOOD;
1507 item_next_act_indi_obj->cnt = 0;
1510 memset(item_next_act_indi_obj->indicator_list, 0xFF, SAT_ITEMS_NEXT_ACTION_INDI_LIST_MAX_COUNT);
1511 if (item_next_act_indi_obj->cnt > 0)
1512 memcpy(item_next_act_indi_obj->indicator_list, &src_data[index], item_next_act_indi_obj->cnt);
1514 *consumed_data_len = 1+1+item_nai_len;
1515 dbg("[SAT] SAT PARSER - listCount=%d, consumed_data_len = %d",item_next_act_indi_obj->cnt, *consumed_data_len);
1516 return TCORE_SAT_SUCCESS;
1519 static enum tcore_sat_result _sat_decode_event_list_tlv(unsigned char* tlv_str, int tlv_len,
1520 int curr_offset, struct tel_sat_event_list* event_list_obj, struct tel_sat_event_list* modem_event_list_obj, int* consumed_data_len)
1523 int index, len_of_len=0;
1525 unsigned char* src_data;
1526 gboolean comprehension_req = FALSE;
1528 if (tlv_str == NULL || consumed_data_len == NULL || event_list_obj == NULL) {
1529 dbg("[SAT] SAT PARSER - tlv_str == NULL || consumed_data_len == NULL || event_list_obj == NULL");
1530 return TCORE_SAT_ERROR_FATAL;
1533 if (tlv_len <= (curr_offset+1)) {
1534 dbg("[SAT] SAT PARSER - incorrect length original_command_len=%d", tlv_len);
1535 return TCORE_SAT_COMMAND_NOT_UNDERSTOOD;
1539 index = curr_offset;
1540 src_data = &tlv_str[0];
1541 if ((src_data[index]&0x7F) != SATK_EVENT_LIST_TAG) {
1542 dbg("[SAT] SAT PARSER - tag not found.=%d",src_data[index]);
1543 return TCORE_SAT_COMMAND_NOT_UNDERSTOOD;
1546 if ((src_data[index++]&0x80))
1547 comprehension_req = TRUE;
1550 len_of_len = _get_length_filed_size(src_data[index]);
1552 err("[SAT] parser: invalid length.");
1553 return TCORE_SAT_COMMAND_NOT_UNDERSTOOD;
1556 evt_list_len = src_data[index+len_of_len-1];
1557 dbg("[SAT] parser: evt_list_len=%d",evt_list_len);
1558 index += len_of_len;
1560 if ((index+evt_list_len) > tlv_len) {
1561 dbg("[SAT] SAT PARSER - incorrect cmd len, expected len = %d, orig_len=%d", (index+evt_list_len),tlv_len);
1562 return TCORE_SAT_COMMAND_NOT_UNDERSTOOD;
1565 if (evt_list_len > SAT_EVENT_LIST_MAX) {
1566 dbg("[SAT] SAT PARSER - event list contains more items than it is supposed to have! len=%d", evt_list_len);
1567 if (comprehension_req)
1568 return TCORE_SAT_COMMAND_NOT_UNDERSTOOD;
1570 evt_list_len = SAT_EVENT_LIST_MAX;
1573 event_list_obj->event_list_cnt = 0;
1574 memset(event_list_obj->evt_list, 0xFF, SAT_EVENT_LIST_MAX);
1576 modem_event_list_obj->event_list_cnt = 0;
1577 memset(modem_event_list_obj->evt_list, 0xFF, SAT_EVENT_LIST_MAX);
1580 for(i = 0; i < evt_list_len; i++) {
1581 dbg("[SAT] SAT PARSER - event[%d]=0x%x", i, src_data[index]);
1582 switch(src_data[index]) {
1584 case EVENT_USER_ACTIVITY:
1585 case EVENT_IDLE_SCREEN_AVAILABLE:
1586 case EVENT_LANGUAGE_SELECTION:
1587 case EVENT_BROWSER_TERMINATION:
1588 case EVENT_DATA_AVAILABLE:
1589 case EVENT_CHANNEL_STATUS:
1590 event_list_obj->evt_list[i] = src_data[index];
1591 event_list_obj->event_list_cnt++;
1594 case EVENT_MT_CALL :
1595 case EVENT_CALL_CONNECTED:
1596 case EVENT_CALL_DISCONNECTED:
1597 case EVENT_LOCATION_STATUS:
1598 case EVENT_ACCESS_TECHNOLOGY_CHANGED:
1599 modem_event_list_obj->evt_list[i] = src_data[index];
1600 modem_event_list_obj->event_list_cnt++;
1604 if (comprehension_req)
1605 return TCORE_SAT_BEYOND_ME_CAPABILITY;
1611 // 1 is the length of Tag.
1612 *consumed_data_len = 1 + len_of_len + evt_list_len;
1613 return TCORE_SAT_SUCCESS;
1616 static enum tcore_sat_result _sat_decode_icon_identifier_tlv(unsigned char* tlv_str, int tlv_len,
1617 int curr_offset, struct tel_sat_icon_identifier* icon_id_obj, int* consumed_data_len)
1619 unsigned char* src_data;
1622 if (tlv_str == NULL || icon_id_obj == NULL ||consumed_data_len == NULL) {
1623 dbg("[SAT] SAT PARSER - tlv_str == NULL || icon_id_obj == NULL ||consumed_data_len == NULL");
1624 return TCORE_SAT_ERROR_FATAL;
1627 if (tlv_len <= (curr_offset+1)) {//length of icon id tlv is 4
1628 dbg("[SAT] SAT PARSER - incorrect length original_command_len=%d", tlv_len);
1629 return TCORE_SAT_COMMAND_NOT_UNDERSTOOD;
1633 index = curr_offset;
1634 src_data = &tlv_str[0];
1635 if ((src_data[index++]&0x7F) != SATK_ICON_IDENTIFIER_TAG) {
1636 dbg("[SAT] SAT PARSER - icon identity tag missing.");
1637 return TCORE_SAT_COMMAND_NOT_UNDERSTOOD; //send TR
1640 if (src_data[index++] != SATK_ICON_IDENTITY_LENGTH) {
1641 dbg("[SAT] SAT PARSER - incorrect length value.");
1642 return FALSE; //send TR
1645 if ((index+SATK_ICON_IDENTITY_LENGTH) > tlv_len) {
1646 dbg("[SAT] SAT PARSER - incorrect cmd len, expected len = %d, orig_len=%d", (index+SATK_ICON_IDENTITY_LENGTH),tlv_len);
1647 return TCORE_SAT_COMMAND_NOT_UNDERSTOOD;
1649 icon_id_obj->is_exist = TRUE;
1651 if ((src_data[index++]&0x01))
1652 icon_id_obj->icon_qualifer = ICON_QUALI_NOT_SELF_EXPLANATORY;
1654 icon_id_obj->icon_qualifer = ICON_QUALI_SELF_EXPLANATORY;
1656 if (src_data[index] > 0x00) {
1657 icon_id_obj->icon_identifier = src_data[index];
1660 dbg("[SAT] SAT PARSER - incorrect icon identifier");
1661 return TCORE_SAT_COMMAND_NOT_UNDERSTOOD; //send TR
1664 dbg("[SAT] SAT PARSER - icon_qual=%d, iconId=%d",icon_id_obj->icon_qualifer, icon_id_obj->icon_identifier);
1665 *consumed_data_len = 4;
1666 return TCORE_SAT_SUCCESS;
1669 static enum tcore_sat_result _sat_decode_icon_identifier_list_tlv(unsigned char* tlv_str,
1670 int tlv_len, int curr_offset, struct tel_sat_icon_identifier_list* icon_list_obj,
1671 int* consumed_data_len)
1675 unsigned char* src_data;
1676 gboolean comprehension_req = FALSE;
1678 if (tlv_str == NULL || consumed_data_len == NULL || icon_list_obj == NULL) {
1679 dbg("[SAT] SAT PARSER - tlv_str == NULL || consumed_data_len == NULL || icon_list_obj == NULL");
1680 return TCORE_SAT_ERROR_FATAL;
1683 if (tlv_len <= (curr_offset+1)+1) {
1684 dbg("[SAT] SAT PARSER - incorrect length original_command_len=%d", tlv_len);
1685 return TCORE_SAT_COMMAND_NOT_UNDERSTOOD;
1689 index = curr_offset;
1690 src_data = &tlv_str[0];
1691 if ((src_data[index]&0x7F) != SATK_ITEM_ICON_IDENTIFIER_LIST_TAG) {
1692 dbg("[SAT] SAT PARSER - icon identity tag missing.");
1693 return TCORE_SAT_COMMAND_NOT_UNDERSTOOD; //send TR
1696 icon_list_obj->is_exist = TRUE;
1697 if (src_data[index++]&0x80)
1698 comprehension_req = TRUE;
1700 len_value = src_data[index++];
1701 if (src_data[index++]&0x01)
1702 icon_list_obj->icon_qualifer = ICON_QUALI_NOT_SELF_EXPLANATORY;
1704 icon_list_obj->icon_qualifer = ICON_QUALI_SELF_EXPLANATORY;
1706 icon_list_obj->icon_cnt = len_value-1;
1707 if (icon_list_obj->icon_cnt > SAT_ICON_LIST_MAX_COUNT) {
1708 if (comprehension_req == TRUE) {
1709 dbg("[SAT] SAT PARSER - list count exceeds maximum allowed count=%d",icon_list_obj->icon_cnt);
1710 return TCORE_SAT_COMMAND_NOT_UNDERSTOOD;
1712 icon_list_obj->icon_cnt = 0;
1716 for(i=0;i<icon_list_obj->icon_cnt;i++) {
1717 if (src_data[index] > 0x00) {
1718 icon_list_obj->icon_id_list[i]= src_data[index++];
1720 dbg("[SAT] SAT PARSER - incorrect icon identifier");
1721 return TCORE_SAT_COMMAND_NOT_UNDERSTOOD; //send TR
1726 *consumed_data_len = 1+1+len_value;
1727 dbg("[SAT] SAT PARSER - icon_qual=%d, iconCount=%d",icon_list_obj->icon_qualifer, icon_list_obj->icon_cnt);
1728 return TCORE_SAT_SUCCESS;
1731 static enum tcore_sat_result _sat_decode_dtmf_string_tlv(unsigned char* tlv_str, int tlv_len,
1732 int curr_offset, struct tel_sat_dtmf_string* dtmf_string_obj, int* consumed_data_len)
1734 unsigned char* src_data;
1735 int index, len_of_len = 0;
1737 gboolean comprehension_req = FALSE;
1738 char* str_ascii = NULL;
1740 if (tlv_str == NULL || consumed_data_len == NULL || dtmf_string_obj == NULL) {
1741 dbg("[SAT] SAT PARSER - tlv_str == NULL || consumed_data_len == NULL || dtmf_string_obj == NULL");
1742 return TCORE_SAT_ERROR_FATAL;
1745 src_data = &tlv_str[0];
1747 if (tlv_len <= (curr_offset + 1)) {
1748 dbg("[SAT] SAT PARSER - incorrect length original_command_len=%d", tlv_len);
1749 return TCORE_SAT_COMMAND_NOT_UNDERSTOOD;
1753 index = curr_offset;
1754 if ((src_data[index] & 0x7F) != SATK_DTMF_STRING_TAG) {
1755 dbg("[SAT] SAT PARSER - address tag missing");
1756 return TCORE_SAT_REQUIRED_VALUE_MISSING;
1759 //comprehensive required
1760 if ((src_data[index++] & 0x80))
1761 comprehension_req = TRUE;
1764 len_of_len = _get_length_filed_size(src_data[index]);
1766 err("[SAT] parser: invalid length.");
1767 return TCORE_SAT_COMMAND_NOT_UNDERSTOOD;
1770 dtmf_len = src_data[index + len_of_len - 1];
1771 index += len_of_len; //index pointing to TON/NPI
1773 if ((index + dtmf_len) > tlv_len) {
1774 dbg("[SAT] SAT PARSER - incorrect cmd len, expected len = %d, orig_len=%d", (index+dtmf_len), tlv_len);
1775 return TCORE_SAT_COMMAND_NOT_UNDERSTOOD;
1778 dtmf_string_obj->dtmf_length = 0;
1781 str_ascii = tcore_util_convert_bcd2ascii((const char*)&src_data[index], dtmf_len, SAT_DTMF_STRING_LEN_MAX);
1783 memcpy(dtmf_string_obj->dtmf_string, str_ascii, strlen(str_ascii));
1784 dtmf_string_obj->dtmf_length = strlen(str_ascii);
1789 if (dtmf_string_obj->dtmf_length == 0) {
1790 dbg("[SAT] SAT PARSER - DTMF string length is either 0 or it is too long for the ME to handle.");
1791 return TCORE_SAT_COMMAND_NOT_UNDERSTOOD;
1794 *consumed_data_len = 1 + len_of_len + dtmf_len;
1795 return TCORE_SAT_SUCCESS;
1798 static enum tcore_sat_result _sat_decode_language_tlv(unsigned char* tlv_str, int tlv_len,
1799 int curr_offset, enum tel_sim_language_type* language_obj)
1801 unsigned char* src_data;
1804 if (tlv_len <= (curr_offset+1)) {
1805 dbg("[SAT] SAT PARSER - incorrect length original_command_len=%d", tlv_len);
1806 return TCORE_SAT_COMMAND_NOT_UNDERSTOOD;
1809 src_data = &tlv_str[0];
1810 index = curr_offset;
1812 if ((src_data[index++]&0x7F) != SATK_LANGUAGE_TAG) {
1813 dbg("[SAT] SAT PARSER - Language tag missing.");
1814 return TCORE_SAT_COMMAND_NOT_UNDERSTOOD;
1816 if (src_data[index++] != SATK_LANGUAGE_LENGTH) {
1817 dbg("[SAT] SAT PARSER - incorrect length value.");
1818 return TCORE_SAT_COMMAND_NOT_UNDERSTOOD;
1821 if ((index+SATK_LANGUAGE_LENGTH) > tlv_len) {
1822 dbg("[SAT] SAT PARSER - incorrect cmd len, expected len = %d, orig_len=%d", (index+SATK_LANGUAGE_LENGTH),tlv_len);
1823 return TCORE_SAT_COMMAND_NOT_UNDERSTOOD;
1825 *language_obj = _sat_decode_language(src_data[index], src_data[index+1]);
1826 dbg("[SAT] SAT PARSER - <in> %c %c, <out> %d", src_data[index], src_data[index+1], *language_obj);
1827 return TCORE_SAT_SUCCESS;
1830 static enum tcore_sat_result _sat_decode_browser_identity_tlv(unsigned char* tlv_str, int tlv_len, int curr_offset,
1831 enum browser_identity* browser_id, int* consumed_data_len)
1833 unsigned char* src_data;
1836 if (tlv_str == NULL || browser_id == NULL || consumed_data_len == NULL) {
1837 dbg("[SAT] SAT PARSER - tlv_str == NULL || browser_id == NULL ||consumed_data_len == NULL");
1838 return TCORE_SAT_ERROR_FATAL;
1841 if (tlv_len <= (curr_offset + 1)) {
1842 dbg("[SAT] SAT PARSER - incorrect length original_command_len=%d", tlv_len);
1843 return TCORE_SAT_COMMAND_NOT_UNDERSTOOD;
1846 index = curr_offset;
1847 src_data = &tlv_str[0];
1849 if ((src_data[index++] & 0x7F) != SATK_BROWSER_IDENTITY_TAG) {
1850 dbg("[SAT] SAT PARSER - Browser ID tag missing.");
1851 return TCORE_SAT_COMMAND_NOT_UNDERSTOOD;
1853 if (src_data[index++] != SATK_BROWSER_ID_LENGTH) {
1854 dbg("[SAT] SAT PARSER - incorrect length value.");
1855 return TCORE_SAT_COMMAND_NOT_UNDERSTOOD;
1858 dbg("[SAT] SAT PARSER - : browser ID value:ox%x", src_data[index]);
1860 switch (src_data[index]) {
1862 *browser_id = BROWSER_ID_DEFAULT;
1865 *browser_id = BROWSER_ID_WML;
1868 *browser_id = BROWSER_ID_HTML;
1871 *browser_id = BROWSER_ID_XHTML;
1874 *browser_id = BROWSER_ID_CHTML;
1877 *browser_id = BROWSER_ID_RESERVED;
1881 *consumed_data_len = 3;
1882 return TCORE_SAT_SUCCESS;
1885 static enum tcore_sat_result _sat_decode_url_tlv(unsigned char* tlv_str, int tlv_len, int curr_offset,
1886 struct tel_sat_url* url, int* consumed_data_len)
1888 unsigned char* src_data;
1889 int index= curr_offset;
1890 int len_of_len=0, url_len=0;
1892 if (tlv_str == NULL || url == NULL || consumed_data_len == NULL) {
1893 dbg("[SAT] SAT PARSER - tlv_str == NULL || url == NULL ||consumed_data_len == NULL");
1894 return TCORE_SAT_ERROR_FATAL;
1897 src_data = &tlv_str[0];
1898 if (tlv_len <= (curr_offset+1)) {
1899 dbg("[SAT] SAT PARSER - incorrect length original_command_len=%d", tlv_len);
1900 return TCORE_SAT_COMMAND_NOT_UNDERSTOOD;
1903 if ((src_data[index++]&0x7F) != SATK_URL_TAG) {
1904 dbg("[SAT] SAT PARSER - Browser URL tag missing.");
1905 return TCORE_SAT_COMMAND_NOT_UNDERSTOOD; //send TR
1909 len_of_len = _get_length_filed_size(src_data[index]);
1911 err("[SAT] parser: invalid length.");
1912 return TCORE_SAT_COMMAND_NOT_UNDERSTOOD;
1915 url_len = src_data[index+len_of_len-1];
1916 index+=len_of_len; //index pointing to url.
1919 if (url_len > SAT_URL_LEN_MAX)
1920 return TCORE_SAT_COMMAND_NOT_UNDERSTOOD;
1922 memcpy(url->url, &src_data[index], url_len);
1924 dbg("[SAT] SAT PARSER - NULL string for URL");
1927 *consumed_data_len = 1+len_of_len+url_len;
1928 return TCORE_SAT_SUCCESS;
1931 static enum tcore_sat_result _sat_decode_bearer_tlv(unsigned char* tlv_str, int tlv_len, int curr_offset,
1932 struct tel_sat_bearer_list* satk_bearer, int* consumed_data_len)
1934 unsigned char* src_data;
1935 int index, len_of_len = 0;
1936 int list_len = 0, list_idx = 0;
1938 if (tlv_str == NULL || consumed_data_len == NULL || satk_bearer == NULL) {
1939 dbg("[SAT] SAT PARSER - tlv_str == NULL || consumed_data_len == NULL || satk_bearer == NULL");
1940 return TCORE_SAT_ERROR_FATAL;
1943 if (tlv_len <= (curr_offset + 1)) {
1944 dbg("[SAT] SAT PARSER - incorrect length original_command_len=%d", tlv_len);
1945 return TCORE_SAT_COMMAND_NOT_UNDERSTOOD;
1948 src_data = &tlv_str[0];
1949 index = curr_offset;
1951 if ((src_data[index++] & 0x7F) != SATK_BEARER_TAG) {
1952 dbg("[SAT] SAT PARSER - _sat_decode_bearer_tlv: alphaID TAG missing");
1953 return TCORE_SAT_COMMAND_NOT_UNDERSTOOD;
1957 len_of_len = _get_length_filed_size(src_data[index]);
1959 err("[SAT] parser: invalid length.");
1960 return TCORE_SAT_COMMAND_NOT_UNDERSTOOD;
1963 satk_bearer->count = src_data[index + len_of_len - 1];
1964 list_len = satk_bearer->count;
1965 index += len_of_len;
1967 if ((index + list_len) > tlv_len) {
1968 dbg("[SAT] SAT PARSER - incorrect cmd len, expected len = %d, orig_len=%d", (index + list_len), tlv_len);
1969 return TCORE_SAT_COMMAND_NOT_UNDERSTOOD;
1972 if (satk_bearer->count > 0) {
1973 if (list_len > SAT_BEARER_LIST_MAX_COUNT)
1974 list_len = SAT_BEARER_LIST_MAX_COUNT;
1976 for (list_idx = 0; list_idx < list_len; list_idx++) {
1977 switch (src_data[index]) {
1979 satk_bearer->bear[list_idx] = BEARER_LIST_SMS;
1982 satk_bearer->bear[list_idx] = BEARER_LIST_CSD;
1985 satk_bearer->bear[list_idx] = BEARER_LIST_USSD;
1988 satk_bearer->bear[list_idx] = BEARER_LIST_GPRS;
1991 satk_bearer->bear[list_idx] = BEARER_LIST_RESERVED;
1994 dbg("[SAT] SAT PARSER - bearer[%d]=0x%x", list_idx, satk_bearer->bear[list_idx]);
1998 return TCORE_SAT_COMMAND_NOT_UNDERSTOOD;
2001 *consumed_data_len = 1 + len_of_len + list_len;
2002 return TCORE_SAT_SUCCESS;
2005 static enum tcore_sat_result _sat_decode_provisioning_file_ref_tlv(unsigned char* tlv_str,
2006 int tlv_len, int curr_offset, struct tel_sat_provisioning_file_ref* prf, int* data_len_consumed)
2008 unsigned char* src_data;
2009 int index = curr_offset;
2010 int len_of_len = 0, prf_len = 0;
2012 if (tlv_str == NULL || prf == NULL || data_len_consumed == NULL) {
2013 dbg("[SAT] SAT PARSER - tlv_str == NULL || prf == NULL ||data_len_consumed == NULL");
2014 return TCORE_SAT_ERROR_FATAL;
2017 src_data = &tlv_str[0];
2018 if (tlv_len <= (curr_offset + 1)) {
2019 dbg("[SAT] SAT PARSER - incorrect length original_command_len=%d",tlv_len);
2020 return TCORE_SAT_COMMAND_NOT_UNDERSTOOD;
2023 if ((src_data[index++] & 0x7F) != SATK_PROVISIONING_REF_FILE_TAG) {
2024 dbg("[SAT] SAT PARSER - PRF tag missing.");
2025 return TCORE_SAT_COMMAND_NOT_UNDERSTOOD; //send TR
2029 len_of_len = _get_length_filed_size(src_data[index]);
2031 err("[SAT] parser: invalid length.");
2032 return TCORE_SAT_COMMAND_NOT_UNDERSTOOD;
2035 prf_len = src_data[index + len_of_len - 1];
2036 prf->file_path_length = prf_len;
2037 index += len_of_len; //index pointing to prf.
2040 if (prf_len > SAT_PROVISIONING_FILE_PATH_LEN_MAX)
2041 return TCORE_SAT_COMMAND_NOT_UNDERSTOOD;
2043 memcpy(prf->file_path, &src_data[index], prf_len);
2045 dbg("[SAT] SAT PARSER - NULL string for PRF");
2046 return TCORE_SAT_COMMAND_NOT_UNDERSTOOD;
2049 *data_len_consumed = 1 + len_of_len + prf_len;
2050 return TCORE_SAT_SUCCESS;
2053 static enum tcore_sat_result _sat_decode_bearer_description_tlv(unsigned char* tlv_str,
2054 int tlv_len, int curr_offset, struct tel_sat_bearer_description *bearer_desc_obj,
2055 int* consumed_data_len)
2057 int index, length=0;
2058 unsigned char* src_data;
2060 if (tlv_len <= (curr_offset+1)+1) {
2061 dbg("[SAT] SAT PARSER - incorrect length original_command_len=%d", tlv_len);
2062 return TCORE_SAT_COMMAND_NOT_UNDERSTOOD;
2065 index = curr_offset;
2066 src_data = &tlv_str[0];
2068 if (index >= tlv_len) {
2069 dbg("bearer desc cannot find. UICC Server mode");
2070 *consumed_data_len = 0;
2071 return TCORE_SAT_SUCCESS;
2074 if ( (src_data[index]&0x7F) == SATK_BEARER_DISCRIPTION_TAG ) {
2075 dbg("find bearer description tag index(%d)", index);
2083 length = src_data[index++];
2084 dbg("bearer description length (%d)", length);
2087 switch(src_data[index++]) {
2089 bearer_desc_obj->bearer_type = BEARER_CSD;
2090 bearer_desc_obj->bearer_parameter.cs_bearer_param.data_rate = src_data[index++];
2091 bearer_desc_obj->bearer_parameter.cs_bearer_param.service_type = src_data[index++];
2092 bearer_desc_obj->bearer_parameter.cs_bearer_param.connection_element_type = src_data[index++];
2095 bearer_desc_obj->bearer_type = BEARER_GPRS;
2096 bearer_desc_obj->bearer_parameter.ps_bearer_param.precedence_class = src_data[index++];
2097 bearer_desc_obj->bearer_parameter.ps_bearer_param.delay_class = src_data[index++];
2098 bearer_desc_obj->bearer_parameter.ps_bearer_param.reliability_class = src_data[index++];
2099 bearer_desc_obj->bearer_parameter.ps_bearer_param.peak_throughput_class = src_data[index++];
2100 bearer_desc_obj->bearer_parameter.ps_bearer_param.mean_throughput_class = src_data[index++];
2101 bearer_desc_obj->bearer_parameter.ps_bearer_param.pdp_type = BIP_GPRS_PDP_TYPE_RESERVED;
2102 if (src_data[index] == BIP_GPRS_PDP_TYPE_IP)
2103 bearer_desc_obj->bearer_parameter.ps_bearer_param.pdp_type = BIP_GPRS_PDP_TYPE_IP;
2105 case BEARER_DEFAULT_BEARER_FROM_TRANSPORT_LAYER:
2106 bearer_desc_obj->bearer_type = BEARER_DEFAULT_BEARER_FROM_TRANSPORT_LAYER;
2108 case BEARER_LOCAL_LINK_TECHNOLOGY_INDEPENDENT:
2109 bearer_desc_obj->bearer_type = BEARER_DEFAULT_BEARER_FROM_TRANSPORT_LAYER;
2112 bearer_desc_obj->bearer_type = BEARER_RESERVED;
2113 dbg("bearer type not supported");
2114 return TCORE_SAT_BEYOND_ME_CAPABILITY;
2117 *consumed_data_len = 1+1+length;
2118 return TCORE_SAT_SUCCESS;
2121 static enum tcore_sat_result _sat_decode_channel_data_tlv(unsigned char* tlv_str,
2122 int tlv_len, int curr_offset, struct tel_sat_channel_data *channel_data_obj,
2123 int* consumed_data_len)
2126 int len_of_len = 0, channel_data_len = 0;
2127 unsigned char* src_data;
2129 if (tlv_str == NULL || consumed_data_len == NULL || channel_data_obj == NULL) {
2130 dbg("[SAT] SAT PARSER - tlv_str == NULL || consumed_data_len == NULL || channel_data_obj == NULL");
2131 return TCORE_SAT_ERROR_FATAL;
2134 if (tlv_len <= (curr_offset+1)) {
2135 dbg("[SAT] SAT PARSER - incorrect length original_command_len=%d", tlv_len);
2136 return TCORE_SAT_COMMAND_NOT_UNDERSTOOD;
2140 index = curr_offset;
2141 src_data = &tlv_str[0];
2142 if ((src_data[index++]&0x7F) != SATK_CHANNEL_DATA_TAG) {
2143 dbg("[SAT] SAT PARSER - tag not found.=%d",src_data[index]);
2144 return TCORE_SAT_COMMAND_NOT_UNDERSTOOD;
2148 len_of_len = _get_length_filed_size(src_data[index]);
2150 err("[SAT] parser: invalid length.");
2151 return TCORE_SAT_COMMAND_NOT_UNDERSTOOD;
2154 channel_data_len = src_data[index+len_of_len-1];
2155 dbg("[SAT] parser: channel_data_len=%d",channel_data_len);
2156 index += len_of_len;
2158 if ((index+channel_data_len) > tlv_len) {
2159 dbg("[SAT] SAT PARSER - incorrect cmd len, expected len = %d, orig_len=%d", (index+channel_data_len),tlv_len);
2160 return TCORE_SAT_COMMAND_NOT_UNDERSTOOD;
2164 channel_data_obj->data_string_len = channel_data_len;
2165 memcpy(channel_data_obj->data_string, &src_data[index], channel_data_len);
2167 *consumed_data_len = 1+len_of_len+channel_data_len;
2168 return TCORE_SAT_SUCCESS;
2171 static enum tcore_sat_result _sat_decode_channel_data_length_tlv(unsigned char* tlv_str,
2172 int tlv_len, int curr_offset, struct tel_sat_channel_data_len *data_len_obj,
2173 int* consumed_data_len)
2176 unsigned char* src_data;
2178 if (tlv_str == NULL || consumed_data_len == NULL || data_len_obj == NULL) {
2179 dbg("[SAT] SAT PARSER - tlv_str == NULL || consumed_data_len == NULL || data_len_obj == NULL");
2180 return TCORE_SAT_ERROR_FATAL;
2184 index = curr_offset;
2185 src_data = &tlv_str[0];
2186 if ((src_data[index++]&0x7F) != SATK_CHANNEL_DATA_LEN_TAG) {
2187 dbg("[SAT] SAT PARSER - channel data tag missing.");
2188 return TCORE_SAT_COMMAND_NOT_UNDERSTOOD; //send TR
2192 if (src_data[index++] != SATK_CHANNEL_DATA_LENGTH_VALUE_LENGTH) {
2193 dbg("[SAT] SAT PARSER - incorrect length");
2194 return TCORE_SAT_COMMAND_NOT_UNDERSTOOD; //send TR
2198 data_len_obj->data_len = src_data[index];
2200 *consumed_data_len = 3;
2201 return TCORE_SAT_SUCCESS;
2204 static enum tcore_sat_result _sat_decode_buffer_size_tlv(unsigned char* tlv_str,
2205 int tlv_len, int curr_offset, struct tel_sat_buffer_size *buffer_size_obj,
2206 int* consumed_data_len)
2209 unsigned char* src_data;
2211 if (tlv_str == NULL || consumed_data_len == NULL || buffer_size_obj == NULL) {
2212 dbg("[SAT] SAT PARSER - tlv_str == NULL || consumed_data_len == NULL || buffer_size_obj == NULL");
2213 return TCORE_SAT_ERROR_FATAL;
2216 if (tlv_len <= (curr_offset+1)+SATK_BUFFER_SIZE_LENGTH) {
2217 dbg("[SAT] SAT PARSER - incorrect length original_command_len=%d", tlv_len);
2218 return TCORE_SAT_COMMAND_NOT_UNDERSTOOD;
2222 index = curr_offset;
2223 src_data = &tlv_str[0];
2224 if ((src_data[index++]&0x7F) != SATK_BUFFER_SIZE_TAG) {
2225 dbg("[SAT] SAT PARSER - buffer size tag missing.");
2226 return TCORE_SAT_COMMAND_NOT_UNDERSTOOD; //send TR
2230 if (src_data[index++] != SATK_BUFFER_SIZE_LENGTH) {
2231 dbg("[SAT] SAT PARSER - incorrect length");
2232 return TCORE_SAT_COMMAND_NOT_UNDERSTOOD; //send TR
2235 buffer_size_obj->size[0] = src_data[index++];
2236 buffer_size_obj->size[1] = src_data[index];
2238 *consumed_data_len = 4;
2239 dbg("[SAT] SAT PARSER - buffer size = 0x%x%x", buffer_size_obj->size[0], buffer_size_obj->size[1]);
2240 return TCORE_SAT_SUCCESS;
2243 static enum tcore_sat_result _sat_decode_other_address_tlv(unsigned char* tlv_str,
2244 int tlv_len, int curr_offset, struct tel_sat_other_address *other_address_obj,
2245 int* consumed_data_len)
2247 gchar* address = NULL;
2248 int index, address_len;
2249 unsigned char* src_data;
2251 if (tlv_str == NULL || consumed_data_len == NULL || other_address_obj == NULL) {
2252 dbg("[SAT] SAT PARSER - tlv_str == NULL || consumed_data_len == NULL || other_address_obj == NULL");
2253 return TCORE_SAT_ERROR_FATAL;
2256 if (tlv_len <= (curr_offset+1)) {
2257 dbg("[SAT] SAT PARSER - incorrect length original_command_len=%d", tlv_len);
2258 return TCORE_SAT_COMMAND_NOT_UNDERSTOOD;
2262 index = curr_offset;
2263 src_data = &tlv_str[0];
2264 if ((src_data[index++]&0x7F) != SATK_OTHER_ADDRESS_TAG) {
2265 dbg("[SAT] SAT PARSER - other address tag missing.");
2266 return TCORE_SAT_COMMAND_NOT_UNDERSTOOD; //send TR
2270 address_len = src_data[index++];
2271 if ((index+address_len) > tlv_len) {
2272 dbg("[SAT] SAT PARSER - incorrect cmd len, expected len = %d, orig_len=%d", (index+address_len),tlv_len);
2273 return TCORE_SAT_COMMAND_NOT_UNDERSTOOD;
2276 if (address_len-1 > SAT_OTHER_ADDR_LEN_MAX) {
2277 dbg("[SAT] SAT PARSER - address is longer than capability");
2278 return TCORE_SAT_BEYOND_ME_CAPABILITY;
2281 //other address type
2282 switch(src_data[index++]) {
2283 case ADDR_TYPE_IPv4:{
2284 other_address_obj->address_type = ADDR_TYPE_IPv4;
2285 address = g_strdup_printf("%d.%d.%d.%d", src_data[index], src_data[index+1], src_data[index+2], src_data[index+3]);
2287 case ADDR_TYPE_IPv6:{
2288 other_address_obj->address_type = ADDR_TYPE_IPv6;
2289 address = g_strdup_printf("%x%x:%x%x:%x%x:%x%x:%x%x:%x%x:%x%x:%x%x:",
2290 src_data[index], src_data[index+1], src_data[index+2], src_data[index+3],
2291 src_data[index+4], src_data[index+5], src_data[index+6], src_data[index+7],
2292 src_data[index+8], src_data[index+9], src_data[index+10], src_data[index+11],
2293 src_data[index+12], src_data[index+13], src_data[index+14], src_data[index+15]);
2296 other_address_obj->address_type = ADDR_RESERVED;
2297 address = g_strdup("");
2303 other_address_obj->address_len = strlen(address);
2304 memcpy(other_address_obj->address, address, other_address_obj->address_len);
2307 dbg("destination address(%s)", other_address_obj->address);
2310 *consumed_data_len = 2+address_len;
2311 return TCORE_SAT_SUCCESS;
2314 static enum tcore_sat_result _sat_decode_uicc_terminal_interface_tlv(unsigned char* tlv_str,
2315 int tlv_len, int curr_offset, struct tel_sat_uicc_terminal_interface_transport_level *level_obj,
2316 int* consumed_data_len)
2319 unsigned char* src_data;
2321 if (tlv_str == NULL || consumed_data_len == NULL || level_obj == NULL) {
2322 dbg("[SAT] SAT PARSER - tlv_str == NULL || consumed_data_len == NULL || level_obj == NULL");
2323 return TCORE_SAT_ERROR_FATAL;
2326 if (tlv_len <= (curr_offset+1)+SATK_UICC_ME_TRANS_INTERFACE_LEVEL_LENGTH) {
2327 dbg("[SAT] SAT PARSER - incorrect length original_command_len=%d", tlv_len);
2328 return TCORE_SAT_COMMAND_NOT_UNDERSTOOD;
2332 index = curr_offset;
2333 src_data = &tlv_str[0];
2334 if ((src_data[index++]&0x7F) != SATK_USIM_ME_INTERFACE_TRANSPORT_LEVEL_TAG) {
2335 dbg("[SAT] SAT PARSER - UICC/TERMINAL Interface transport level tag missing.");
2336 return TCORE_SAT_COMMAND_NOT_UNDERSTOOD; //send TR
2340 if (src_data[index++] != SATK_UICC_ME_TRANS_INTERFACE_LEVEL_LENGTH) {
2341 dbg("[SAT] SAT PARSER - incorrect length");
2342 return TCORE_SAT_COMMAND_NOT_UNDERSTOOD; //send TR
2345 level_obj->protocol_type = src_data[index++];
2346 level_obj->port_number = src_data[index++] << 8;
2347 level_obj->port_number |= src_data[index];
2349 *consumed_data_len = 2+SATK_UICC_ME_TRANS_INTERFACE_LEVEL_LENGTH;
2350 dbg("[SAT] SAT PARSER - protocol type(%d) , port number(%d)", level_obj->protocol_type, level_obj->port_number);
2351 return TCORE_SAT_SUCCESS;
2354 static enum tcore_sat_result _sat_decode_remote_entity_address_tlv(unsigned char* tlv_str,
2355 int tlv_len, int curr_offset, struct tel_sat_remote_entity_address *remote_address_obj,
2356 int* consumed_data_len)
2359 int len_of_len = 0, remote_data_len = 0;
2360 unsigned char* src_data;
2362 if (tlv_str == NULL || consumed_data_len == NULL || remote_address_obj == NULL) {
2363 dbg("[SAT] SAT PARSER - tlv_str == NULL || consumed_data_len == NULL || remote_address_obj == NULL");
2364 return TCORE_SAT_ERROR_FATAL;
2367 if (tlv_len <= (curr_offset+1)) {
2368 dbg("[SAT] SAT PARSER - incorrect length original_command_len=%d", tlv_len);
2369 return TCORE_SAT_COMMAND_NOT_UNDERSTOOD;
2373 index = curr_offset;
2374 src_data = &tlv_str[0];
2375 if ((src_data[index]&0x7F) != SATK_REMOTE_ENTITY_ADDRESS_TAG) {
2376 dbg("[SAT] SAT PARSER - tag not found.=%d",src_data[index]);
2377 return TCORE_SAT_COMMAND_NOT_UNDERSTOOD;
2381 len_of_len = _get_length_filed_size(src_data[index]);
2383 err("[SAT] parser: invalid length.");
2384 return TCORE_SAT_COMMAND_NOT_UNDERSTOOD;
2387 remote_data_len = src_data[index+len_of_len-1];
2388 dbg("[SAT] parser: remote_data_len=%d",remote_data_len);
2389 index += len_of_len;
2392 switch(src_data[index++]) {
2393 case REMOTE_ENTITY_ADDR_CODING_TYPE_IEEE802_48BIT:
2394 remote_address_obj->coding_type = REMOTE_ENTITY_ADDR_CODING_TYPE_IEEE802_48BIT;
2396 case REMOTE_ENTITY_ADDR_CODING_TYPE_IRDA_32BIT:
2397 remote_address_obj->coding_type = REMOTE_ENTITY_ADDR_CODING_TYPE_IRDA_32BIT;
2400 remote_address_obj->coding_type =REMOTE_ENTITY_ADDR_CODING_TYPE_RESERVED;
2404 remote_address_obj->length = remote_data_len - 1;
2405 memcpy(remote_address_obj->remote_entity_address, &src_data[index], remote_address_obj->length);
2407 *consumed_data_len = 1+len_of_len+remote_data_len;
2408 return TCORE_SAT_SUCCESS;
2411 static enum tcore_sat_result _sat_decode_network_access_name_tlv(unsigned char* tlv_str,
2412 int tlv_len, int curr_offset, struct tel_sat_network_access_name *access_name_obj,
2413 int* consumed_data_len)
2415 int index, idx, name_idx, name_length;
2416 unsigned char* src_data;
2418 if (tlv_str == NULL || consumed_data_len == NULL || access_name_obj == NULL) {
2419 dbg("[SAT] SAT PARSER - tlv_str == NULL || consumed_data_len == NULL || access_name_obj == NULL");
2420 return TCORE_SAT_ERROR_FATAL;
2423 if (tlv_len <= (curr_offset+1)) {
2424 dbg("[SAT] SAT PARSER - incorrect length original_command_len=%d", tlv_len);
2425 return TCORE_SAT_COMMAND_NOT_UNDERSTOOD;
2429 index = curr_offset;
2430 src_data = &tlv_str[0];
2431 if ((src_data[index++]&0x7F) != SATK_NETWORK_ACCESS_TAG) {
2432 dbg("[SAT] SAT PARSER - network access name tag missing.");
2433 return TCORE_SAT_COMMAND_NOT_UNDERSTOOD; //send TR
2437 name_length = src_data[index++];
2438 if ((index+name_length) > tlv_len) {
2439 dbg("[SAT] SAT PARSER - incorrect cmd len, expected len = %d, orig_len=%d", (index+name_length),tlv_len);
2440 return TCORE_SAT_COMMAND_NOT_UNDERSTOOD;
2443 access_name_obj->length = name_length;
2444 if (access_name_obj->length > SAT_NET_ACC_NAM_LEN_MAX) {
2445 dbg("[SAT] SAT PARSER - network access name is longer than capability");
2446 return TCORE_SAT_BEYOND_ME_CAPABILITY;
2450 for(idx = 0; idx < access_name_obj->length; idx++) {
2451 dbg("data (%c) Bool(%d)",src_data[index], g_ascii_isalpha(src_data[index]) );
2453 if ( g_ascii_isalpha(src_data[index]) ) {
2454 access_name_obj->network_access_name[name_idx] = src_data[index];
2459 if (src_data[index] == 0x02) {//02 convert to "."
2460 access_name_obj->network_access_name[name_idx] = '.';
2467 //network access name
2468 dbg("network access name(%s)", access_name_obj->network_access_name);
2470 *consumed_data_len = 2+name_length;
2471 return TCORE_SAT_SUCCESS;
2474 //decode proactive cmd
2475 //6.4.1 DISPLAY TEXT
2476 static enum tcore_sat_result _sat_decode_display_text(unsigned char* o_cmd_data, int o_length,
2477 int curr_offset, struct tcore_sat_proactive_command *sat_cmd_ind_data)
2480 int data_len_consumed=0;
2481 unsigned char dev_id[4];
2482 unsigned char* cmd_data = NULL;
2483 enum tcore_sat_result rv = TCORE_SAT_SUCCESS;
2485 if (o_cmd_data == NULL) {
2486 dbg("[SAT] SAT PARSER - o_cmd_data == NULL");
2487 return TCORE_SAT_ERROR_FATAL;
2490 cmd_data = &o_cmd_data[0];
2491 index = curr_offset+2;
2492 sat_cmd_ind_data->data.display_text.command_detail.cmd_num = cmd_data[index++];
2493 sat_cmd_ind_data->data.display_text.command_detail.cmd_type = cmd_data[index++];
2495 /* ******decode command qualifier****** */
2496 if (cmd_data[index] & 0x01) {
2497 sat_cmd_ind_data->data.display_text.command_detail.cmd_qualifier.display_text.text_priority =
2499 dbg("[SAT] SAT PARSER - msg_prio=TAPI_SAT_MSG_PRIORITY_HIGH.");
2502 sat_cmd_ind_data->data.display_text.command_detail.cmd_qualifier.display_text.text_priority =
2503 TEXT_PRIORITY_NORMAL;
2504 dbg("[SAT] SAT PARSER - : msg_prio=TAPI_SAT_MSG_PRIORITY_NORMAL.");
2507 if (cmd_data[index] & 0x80) {
2508 sat_cmd_ind_data->data.display_text.command_detail.cmd_qualifier.display_text.text_clear_type =
2509 TEXT_WAIT_FOR_USER_TO_CLEAR_MSG;
2510 dbg("[SAT] SAT PARSER - : msgClear=TAPI_SAT_WAIT_FOR_USER_TO_CLEAR_MSG.");
2513 sat_cmd_ind_data->data.display_text.command_detail.cmd_qualifier.display_text.text_clear_type =
2514 TEXT_AUTO_CLEAR_MSG_AFTER_A_DELAY;
2515 dbg("[SAT] SAT PARSER - msgClear=TAPI_SAT_AUTO_CLEAR_MSG_AFTER_A_DELAY.");
2519 memcpy(dev_id,&cmd_data[index],4);
2520 rv = _sat_decode_device_identities_tlv(dev_id, &sat_cmd_ind_data->data.display_text.device_id);
2521 if (rv != TCORE_SAT_SUCCESS)
2525 rv = _sat_decode_text_tlv(o_cmd_data, o_length, index, &sat_cmd_ind_data->data.display_text.text, &data_len_consumed);
2526 if (rv != TCORE_SAT_SUCCESS)
2529 if (sat_cmd_ind_data->data.display_text.text.string_length <= 0) {
2530 err("[SAT] SAT PARSER - :string length is 0");
2531 return TCORE_SAT_COMMAND_NOT_UNDERSTOOD;
2534 dbg("[SAT] SAT PARSER text(%s)",sat_cmd_ind_data->data.display_text.text.string);
2535 dbg("[SAT] SAT PARSER o_len(%d) index(%d) data_len_consumed(%d)",o_length , index, data_len_consumed);
2537 if (index+data_len_consumed > o_length) {
2538 err("[SAT] SAT PARSER - Wrong String TLV");
2539 return TCORE_SAT_BEYOND_ME_CAPABILITY;
2541 else if (index+data_len_consumed == o_length) {
2542 dbg("[SAT] SAT PARSER - :no more TLVs to decode.");
2543 return TCORE_SAT_SUCCESS;
2547 index+=data_len_consumed;
2548 if ((cmd_data[index]&0x7F) == SATK_ICON_IDENTIFIER_TAG) {
2549 data_len_consumed = 0;
2550 rv = _sat_decode_icon_identifier_tlv(o_cmd_data, o_length, index, &sat_cmd_ind_data->data.display_text.icon_id, &data_len_consumed);
2552 if (rv != TCORE_SAT_SUCCESS) {
2553 return TCORE_SAT_COMMAND_NOT_UNDERSTOOD; //SEND TR
2556 if (index+data_len_consumed >= o_length) {
2557 dbg("[SAT] SAT PARSER - no more TLVs to decode.");
2558 return TCORE_SAT_SUCCESS;
2561 index+=data_len_consumed; //index pointing to the Tag of next TLV
2564 //immediate response
2565 sat_cmd_ind_data->data.display_text.immediate_response_requested = FALSE;
2566 if ((cmd_data[index]&0x7F) == SATK_IMMEDIATE_RESPONSE_TAG) {
2567 dbg("[SAT] SAT PARSER - :immediate response required.");
2568 sat_cmd_ind_data->data.display_text.immediate_response_requested = TRUE;
2572 if (index >= o_length) {
2573 dbg("[SAT] SAT PARSER - :no more TLVs to decode.");
2574 return TCORE_SAT_SUCCESS;
2578 if ((cmd_data[index]&0x7F)==SATK_DURATION_TAG) {
2579 rv =_sat_decode_duration_tlv(o_cmd_data, o_length, index, &sat_cmd_ind_data->data.display_text.duration, &data_len_consumed);
2580 if (rv != TCORE_SAT_SUCCESS) {
2581 return rv; //SEND TR
2585 dbg("[SAT] SAT PARSER - :decoding done!.");
2586 return TCORE_SAT_SUCCESS;
2590 static enum tcore_sat_result _sat_decode_get_inkey(unsigned char* o_cmd_data, int o_length,
2591 int curr_offset, struct tcore_sat_proactive_command *sat_cmd_ind_data)
2594 int data_len_consumed=0;
2595 unsigned char dev_id[4];
2596 unsigned char* cmd_data = NULL;
2597 enum tcore_sat_result rv = TCORE_SAT_SUCCESS;
2599 if (o_cmd_data == NULL) {
2600 dbg("[SAT] SAT PARSER - o_cmd_data == NULL");
2601 return TCORE_SAT_ERROR_FATAL;
2604 cmd_data = &o_cmd_data[0];
2605 index = curr_offset+2;
2606 sat_cmd_ind_data->data.get_inkey.command_detail.cmd_num = cmd_data[index++];
2607 sat_cmd_ind_data->data.get_inkey.command_detail.cmd_type = cmd_data[index++];
2609 /* ******decode command qualifier****** */
2610 if (cmd_data[index] & 0x01) {
2611 sat_cmd_ind_data->data.get_inkey.command_detail.cmd_qualifier.get_inkey.alphabet_set = TRUE;
2612 dbg("[SAT] SAT PARSER - Alphabet set");
2615 if (cmd_data[index]&0x02) {
2616 sat_cmd_ind_data->data.get_inkey.command_detail.cmd_qualifier.get_inkey.alphabet_type = INPUT_ALPHABET_TYPE_UCS2;
2617 dbg("[SAT] SAT PARSER - INPUT_ALPHABET_TYPE_UCS2");
2620 sat_cmd_ind_data->data.get_inkey.command_detail.cmd_qualifier.get_inkey.alphabet_type = INPUT_ALPHABET_TYPE_SMS_DEFAULT;
2621 dbg("[SAT] SAT PARSER - INPUT_ALPHABET_TYPE_SMS_DEFAULT");
2624 if (cmd_data[index]&0x04) {
2625 sat_cmd_ind_data->data.get_inkey.command_detail.cmd_qualifier.get_inkey.inkey_type = INKEY_TYPE_YES_NO_REQUESTED;
2626 dbg("[SAT] SAT PARSER - INKEY_TYPE_YES_NO_REQUESTED");
2629 sat_cmd_ind_data->data.get_inkey.command_detail.cmd_qualifier.get_inkey.inkey_type = INKEY_TYPE_CHARACTER_SET_ENABLED;
2630 dbg("[SAT] SAT PARSER - INKEY_TYPE_YES_NO_REQUESTED");
2633 if (cmd_data[index]&0x08) {
2634 sat_cmd_ind_data->data.get_inkey.command_detail.cmd_qualifier.get_inkey.immediate_rsp_required = TRUE;
2635 dbg("[SAT] SAT PARSER - immediate response requested");
2638 if (cmd_data[index] & 0x80) {
2639 sat_cmd_ind_data->data.get_inkey.command_detail.cmd_qualifier.get_inkey.help_info = TRUE;
2640 dbg("[SAT] SAT PARSER - Help info");
2645 memcpy(dev_id,&cmd_data[index],4);
2646 rv = _sat_decode_device_identities_tlv(dev_id, &sat_cmd_ind_data->data.get_inkey.device_id);
2647 if (rv != TCORE_SAT_SUCCESS)
2652 rv = _sat_decode_text_tlv(o_cmd_data, o_length, index, &sat_cmd_ind_data->data.get_inkey.text, &data_len_consumed);
2653 if (rv != TCORE_SAT_SUCCESS)
2656 if (sat_cmd_ind_data->data.get_inkey.text.string_length <= 0) {
2657 err("[SAT] SAT PARSER - :string length is 0");
2658 return TCORE_SAT_COMMAND_NOT_UNDERSTOOD;
2661 dbg("[SAT] SAT PARSER text(%s)",sat_cmd_ind_data->data.get_inkey.text.string);
2662 dbg("[SAT] SAT PARSER o_len(%d) index(%d) data_len_consumed(%d)",o_length , index, data_len_consumed);
2664 if (index+data_len_consumed > o_length) {
2665 err("[SAT] SAT PARSER - Wrong String TLV");
2666 return TCORE_SAT_BEYOND_ME_CAPABILITY;
2668 else if (index+data_len_consumed == o_length) {
2669 dbg("[SAT] SAT PARSER - :no more TLVs to decode.");
2670 return TCORE_SAT_SUCCESS;
2674 index+=data_len_consumed;
2675 if ((cmd_data[index]&0x7F) == SATK_ICON_IDENTIFIER_TAG) {
2676 data_len_consumed = 0;
2677 rv = _sat_decode_icon_identifier_tlv(o_cmd_data, o_length, index, &sat_cmd_ind_data->data.get_inkey.icon_id, &data_len_consumed);
2679 if (rv != TCORE_SAT_SUCCESS) {
2680 return TCORE_SAT_COMMAND_NOT_UNDERSTOOD; //SEND TR
2683 if (index+data_len_consumed >= o_length) {
2684 dbg("[SAT] SAT PARSER - no more TLVs to decode.");
2685 return TCORE_SAT_SUCCESS;
2688 index+=data_len_consumed; //index pointing to the Tag of next TLV
2692 if ((cmd_data[index]&0x7F)==SATK_DURATION_TAG) {
2693 rv =_sat_decode_duration_tlv(o_cmd_data, o_length, index, &sat_cmd_ind_data->data.get_inkey.duration, &data_len_consumed);
2694 if (rv != TCORE_SAT_SUCCESS) {
2695 return rv; //SEND TR
2699 dbg("[SAT] SAT PARSER - :decoding done!.");
2700 return TCORE_SAT_SUCCESS;
2704 static enum tcore_sat_result _sat_decode_get_input(unsigned char* o_cmd_data, int o_length,
2705 int curr_offset, struct tcore_sat_proactive_command *sat_cmd_ind_data)
2708 int data_len_consumed=0;
2709 unsigned char dev_id[4];
2710 unsigned char* cmd_data = NULL;
2711 enum tcore_sat_result rv = TCORE_SAT_SUCCESS;
2713 if (o_cmd_data == NULL) {
2714 dbg("[SAT] SAT PARSER - o_cmd_data == NULL");
2715 return TCORE_SAT_ERROR_FATAL;
2718 cmd_data = &o_cmd_data[0];
2719 index = curr_offset+2;
2720 sat_cmd_ind_data->data.get_input.command_detail.cmd_num = cmd_data[index++];
2721 sat_cmd_ind_data->data.get_input.command_detail.cmd_type = cmd_data[index++];
2723 /* ******decode command qualifier****** */
2724 if (cmd_data[index] & 0x01) {
2725 sat_cmd_ind_data->data.get_input.command_detail.cmd_qualifier.get_input.alphabet_set = TRUE;
2726 dbg("[SAT] SAT PARSER - Alphabet set");
2729 sat_cmd_ind_data->data.get_input.command_detail.cmd_qualifier.get_input.alphabet_set = FALSE;
2730 dbg("[SAT] SAT PARSER - Numeric info");
2733 if (cmd_data[index]&0x02) {
2734 sat_cmd_ind_data->data.get_input.command_detail.cmd_qualifier.get_input.alphabet_type = INPUT_ALPHABET_TYPE_UCS2;
2735 dbg("[SAT] SAT PARSER - INPUT_ALPHABET_TYPE_UCS2");
2738 sat_cmd_ind_data->data.get_input.command_detail.cmd_qualifier.get_input.alphabet_type = INPUT_ALPHABET_TYPE_SMS_DEFAULT;
2739 dbg("[SAT] SAT PARSER - INPUT_ALPHABET_TYPE_SMS_DEFAULT");
2742 if (cmd_data[index]&0x04) {
2743 sat_cmd_ind_data->data.get_input.command_detail.cmd_qualifier.get_input.me_echo_user_input = FALSE;
2744 dbg("[SAT] SAT PARSER - user input not be revealed");
2747 sat_cmd_ind_data->data.get_input.command_detail.cmd_qualifier.get_input.me_echo_user_input = TRUE;
2748 dbg("[SAT] SAT PARSER - Me echo user input");
2751 if (cmd_data[index]&0x08) {
2752 sat_cmd_ind_data->data.get_input.command_detail.cmd_qualifier.get_input.user_input_unpacked_format = FALSE;
2753 dbg("[SAT] SAT PARSER - packing required");
2756 sat_cmd_ind_data->data.get_input.command_detail.cmd_qualifier.get_input.user_input_unpacked_format = TRUE;
2757 dbg("[SAT] SAT PARSER - unpacked format");
2760 if (cmd_data[index] & 0x80) {
2761 sat_cmd_ind_data->data.get_input.command_detail.cmd_qualifier.get_input.help_info = TRUE;
2762 dbg("[SAT] SAT PARSER - Help info");
2767 memcpy(dev_id,&cmd_data[index],4);
2768 rv = _sat_decode_device_identities_tlv(dev_id, &sat_cmd_ind_data->data.get_input.device_id);
2769 if (rv != TCORE_SAT_SUCCESS)
2774 rv = _sat_decode_text_tlv(o_cmd_data, o_length, index, &sat_cmd_ind_data->data.get_input.text, &data_len_consumed);
2775 if (rv != TCORE_SAT_SUCCESS)
2778 if (sat_cmd_ind_data->data.get_input.text.string_length <= 0) {
2779 err("[SAT] SAT PARSER - :string length is 0");
2781 dbg("[SAT] SAT PARSER text(%s)",sat_cmd_ind_data->data.get_input.text.string);
2784 index+=data_len_consumed;
2785 rv = _sat_decode_response_length_tlv(o_cmd_data, o_length, index, &sat_cmd_ind_data->data.get_input.rsp_len, &data_len_consumed);
2786 if (rv != TCORE_SAT_SUCCESS)
2789 if (index+data_len_consumed >= o_length) {
2790 err("[SAT] SAT PARSER - no more TLVs");
2791 return TCORE_SAT_SUCCESS;
2795 index+=data_len_consumed;
2796 if ((o_cmd_data[index]&0x7F) == SATK_DEFAULT_TEXT_TAG) {
2797 rv = _sat_decode_text_tlv(o_cmd_data, o_length, index, &sat_cmd_ind_data->data.get_input.default_text, &data_len_consumed);
2798 if (rv != TCORE_SAT_SUCCESS)
2801 if (sat_cmd_ind_data->data.get_input.default_text.string_length <= 0) {
2802 err("[SAT] SAT PARSER - :string length is 0");
2804 dbg("[SAT] SAT PARSER default text(%s)",sat_cmd_ind_data->data.get_input.default_text.string);
2805 index+=data_len_consumed;
2809 if ((cmd_data[index]&0x7F) == SATK_ICON_IDENTIFIER_TAG) {
2810 data_len_consumed = 0;
2811 rv = _sat_decode_icon_identifier_tlv(o_cmd_data, o_length, index, &sat_cmd_ind_data->data.display_text.icon_id, &data_len_consumed);
2813 if (rv != TCORE_SAT_SUCCESS) {
2814 return TCORE_SAT_COMMAND_NOT_UNDERSTOOD; //SEND TR
2817 if (index+data_len_consumed >= o_length) {
2818 dbg("[SAT] SAT PARSER - no more TLVs to decode.");
2819 return TCORE_SAT_SUCCESS;
2822 index+=data_len_consumed; //index pointing to the Tag of next TLV
2825 dbg("[SAT] SAT PARSER - :decoding done!.");
2826 return TCORE_SAT_SUCCESS;
2830 static enum tcore_sat_result _sat_decode_more_time(unsigned char* o_cmd_data, int o_length,
2831 int curr_offset, struct tcore_sat_proactive_command *sat_cmd_ind_data)
2834 unsigned char dev_id[4];
2835 unsigned char* cmd_data = NULL;
2836 enum tcore_sat_result rv = TCORE_SAT_SUCCESS;
2838 if (o_cmd_data == NULL) {
2839 dbg("[SAT] SAT PARSER - o_cmd_data == NULL");
2840 return TCORE_SAT_ERROR_FATAL;
2844 cmd_data = &o_cmd_data[0];
2845 index = curr_offset+2;
2846 sat_cmd_ind_data->data.setup_event_list.command_detail.cmd_num = cmd_data[index++];
2847 sat_cmd_ind_data->data.setup_event_list.command_detail.cmd_type = cmd_data[index++];
2851 memcpy(dev_id,&cmd_data[index],4);
2852 rv = _sat_decode_device_identities_tlv(dev_id, &sat_cmd_ind_data->data.setup_event_list.device_id);
2853 if (rv != TCORE_SAT_SUCCESS)
2857 dbg("[SAT] SAT PARSER - :decoding done!.");
2858 return TCORE_SAT_SUCCESS;
2862 static enum tcore_sat_result _sat_decode_play_tone(unsigned char* o_cmd_data, int o_length,
2863 int curr_offset, struct tcore_sat_proactive_command *sat_cmd_ind_data)
2865 int index = 0, data_len_consumed = 0;
2866 unsigned char dev_id[4];
2867 unsigned char* cmd_data = NULL;
2868 enum tcore_sat_result rv = TCORE_SAT_SUCCESS;
2870 if (o_cmd_data == NULL) {
2871 dbg("[SAT] SAT PARSER - o_cmd_data == NULL");
2872 return TCORE_SAT_ERROR_FATAL;
2876 cmd_data = &o_cmd_data[0];
2877 index = curr_offset+2;
2878 sat_cmd_ind_data->data.play_tone.command_detail.cmd_num = cmd_data[index++];
2879 sat_cmd_ind_data->data.play_tone.command_detail.cmd_type = cmd_data[index++];
2881 /* ******decode command qualifier****** */
2882 if (cmd_data[index] & 0x01)
2883 sat_cmd_ind_data->data.play_tone.command_detail.cmd_qualifier.play_tone.vibration_alert = VIBRATE_ALERT_REQUIRED;
2885 sat_cmd_ind_data->data.play_tone.command_detail.cmd_qualifier.play_tone.vibration_alert = VIBRATE_ALERT_OPTIONAL;
2889 memcpy(dev_id,&cmd_data[index],4);
2890 rv = _sat_decode_device_identities_tlv(dev_id, &sat_cmd_ind_data->data.play_tone.device_id);
2891 if (rv != TCORE_SAT_SUCCESS)
2894 //alpha id - optional
2896 if ((cmd_data[index]&0x7F) == SATK_ALPHA_IDENTIFIER_TAG) {
2897 rv = _sat_decode_alpha_identifier_tlv(o_cmd_data, o_length, index, &sat_cmd_ind_data->data.play_tone.alpha_id, &data_len_consumed);
2898 if (rv != TCORE_SAT_SUCCESS) {
2902 index+=data_len_consumed;
2903 if (index >= o_length) {
2904 dbg("[SAT] SAT PARSER - no more TLVs to decode.");
2905 dbg("[SAT] SAT PARSER - default value is set - tone type, duration");
2906 sat_cmd_ind_data->data.play_tone.tone.tone_type = GENERAL_BEEP;
2907 sat_cmd_ind_data->data.play_tone.duration.time_unit = TIME_UNIT_SECONDS;
2908 sat_cmd_ind_data->data.play_tone.duration.time_interval = 2;
2909 return TCORE_SAT_SUCCESS;
2914 if ((cmd_data[index]&0x7F) == SATK_TONE_TAG) {
2915 rv = _sat_decode_tone_tlv(o_cmd_data, o_length, index, &sat_cmd_ind_data->data.play_tone.tone, &data_len_consumed);
2916 if (rv != TCORE_SAT_SUCCESS) {
2919 index+=data_len_consumed;
2922 sat_cmd_ind_data->data.play_tone.tone.tone_type = GENERAL_BEEP;
2925 //time duration - optional
2926 if ((cmd_data[index]&0x7F)==SATK_DURATION_TAG) {
2927 rv =_sat_decode_duration_tlv(o_cmd_data, o_length, index, &sat_cmd_ind_data->data.play_tone.duration, &data_len_consumed);
2928 if (rv != TCORE_SAT_SUCCESS) {
2929 return rv; //SEND TR
2932 index+=data_len_consumed;
2933 if (index >= o_length) {
2934 dbg("[SAT] SAT PARSER - no more TLVs to decode.");
2935 return TCORE_SAT_SUCCESS;
2939 dbg("[SAT] SAT PARSER - Duration TLV not present, ME should use a default value.");
2940 sat_cmd_ind_data->data.play_tone.duration.time_unit = TIME_UNIT_SECONDS;
2941 sat_cmd_ind_data->data.play_tone.duration.time_interval = 2;
2945 if ((cmd_data[index]&0x7F) == SATK_ICON_IDENTIFIER_TAG) {
2946 data_len_consumed = 0;
2947 rv = _sat_decode_icon_identifier_tlv(o_cmd_data, o_length, index, &sat_cmd_ind_data->data.play_tone.icon_id, &data_len_consumed);
2949 if (rv != TCORE_SAT_SUCCESS) {
2950 return TCORE_SAT_COMMAND_NOT_UNDERSTOOD; //SEND TR
2953 if (index+data_len_consumed >= o_length) {
2954 dbg("[SAT] SAT PARSER - no more TLVs to decode.");
2955 return TCORE_SAT_SUCCESS;
2958 index+=data_len_consumed; //index pointing to the Tag of next TLV
2961 //ToDo: Text Attribute and frames
2962 dbg("[SAT] SAT PARSER - :decoding done!.");
2963 return TCORE_SAT_SUCCESS;
2967 static enum tcore_sat_result _sat_decode_refresh(unsigned char* o_cmd_data, int o_length,
2968 int curr_offset, struct tcore_sat_proactive_command *sat_cmd_ind_data)
2970 int index = 0, data_len_consumed = 0;
2971 unsigned char dev_id[4];
2972 unsigned char* cmd_data = NULL;
2973 enum tcore_sat_result rv = TCORE_SAT_SUCCESS;
2975 if (o_cmd_data == NULL) {
2976 dbg("[SAT] SAT PARSER - o_cmd_data == NULL");
2977 return TCORE_SAT_ERROR_FATAL;
2981 cmd_data = &o_cmd_data[0];
2982 index = curr_offset+2;
2983 sat_cmd_ind_data->data.refresh.command_detail.cmd_num = cmd_data[index++];
2984 sat_cmd_ind_data->data.refresh.command_detail.cmd_type = cmd_data[index++];
2986 /* ******decode command qualifier****** */
2987 switch(cmd_data[index]) {
2988 case REFRESH_SIM_INIT_AND_FULL_FCN:
2990 case REFRESH_SIM_INIT_AND_FCN:
2991 case REFRESH_SIM_INIT :
2992 case REFRESH_SIM_RESET:
2993 sat_cmd_ind_data->data.refresh.command_detail.cmd_qualifier.refresh.refresh = cmd_data[index];
2994 dbg("[SAT] SAT PARSER - : refresh mode=[0x%02x]:0-init&FFCN, 1-FCN, 2-init&FCN, 3-init, 4-reset", cmd_data[index]);
2997 case REFRESH_3G_APPLICATION_RESET:
2998 case REFRESH_3G_SESSION_RESET:
2999 case REFRESH_RESERVED:
3001 dbg("[SAT] SAT PARSER - : refresh mode=0x%02x Not Supported", cmd_data[index]);
3002 return TCORE_SAT_BEYOND_ME_CAPABILITY;
3008 memcpy(dev_id,&cmd_data[index],4);
3009 rv = _sat_decode_device_identities_tlv(dev_id, &sat_cmd_ind_data->data.refresh.device_id);
3010 if (rv != TCORE_SAT_SUCCESS)
3015 if ( (sat_cmd_ind_data->data.refresh.command_detail.cmd_qualifier.refresh.refresh == REFRESH_FCN)
3016 || (sat_cmd_ind_data->data.refresh.command_detail.cmd_qualifier.refresh.refresh == REFRESH_SIM_INIT_AND_FCN) ) {
3018 rv = _sat_decode_file_list_tlv(o_cmd_data, o_length, index, &sat_cmd_ind_data->data.refresh.file_list, &data_len_consumed);
3019 if (rv != TCORE_SAT_SUCCESS)
3023 sat_cmd_ind_data->data.refresh.file_list.file_count = 0;
3025 dbg("[SAT] SAT PARSER - :decoding done!.");
3026 return TCORE_SAT_SUCCESS;
3030 static enum tcore_sat_result _sat_decode_setup_menu(unsigned char* tlv_str, int tlv_len,
3031 int curr_offset, struct tcore_sat_proactive_command *pactive_cmd_ind_obj)
3034 int data_len_consumed=0;
3035 unsigned char dev_id[4];
3036 unsigned char* src_data;
3037 enum tcore_sat_result rv = TCORE_SAT_SUCCESS;
3039 //access command detail
3040 index = curr_offset+2; //move the index to command detail info +2(tag and length)
3041 src_data = &tlv_str[0];
3043 // In this time, the point of index is COMMAND NUMBER
3044 // [1] insert command detail information into each proactive command data structure.
3045 pactive_cmd_ind_obj->data.setup_menu.command_detail.cmd_num = src_data[index++];
3046 pactive_cmd_ind_obj->data.setup_menu.command_detail.cmd_type = src_data[index++];
3048 // [2] decode COMMAND QUALIFIER
3050 -bit 1: 0 = no selection preference;
3051 1 = selection using soft key preferred.
3052 -bits 2 to 7: = RFU.
3053 -bit 8: 0 = no help information available;
3054 1 = help information available.
3057 //[2-1] selection preference
3058 if (src_data[index] & 0x01) {
3059 pactive_cmd_ind_obj->data.setup_menu.command_detail.cmd_qualifier.setup_menu.select_preference =
3060 SELECTION_PREFERENCE_USING_SOFT_KEY;
3061 dbg("[SAT] SAT PARSER - sel_pref=SAT_SELECTION_PREFERENCE_USING_SOFT_KEY.");
3064 pactive_cmd_ind_obj->data.setup_menu.command_detail.cmd_qualifier.setup_menu.select_preference =
3065 SELECTION_PREFERENCE_NONE_REQUESTED;
3066 dbg("[SAT] SAT PARSER - : sel_pref=SAT_SELECTION_PREFERENCE_NONE_REQUESTED.");
3069 //[2-2] help available
3070 if (src_data[index] & 0x80) {
3071 pactive_cmd_ind_obj->data.setup_menu.command_detail.cmd_qualifier.setup_menu.help_info =
3073 ;dbg("[SAT] SAT PARSER - : is help Available=TRUE.");
3076 pactive_cmd_ind_obj->data.setup_menu.command_detail.cmd_qualifier.setup_menu.help_info =
3078 dbg("[SAT] SAT PARSER - is help Available=FALSE.");
3081 // In this time, the point of index is DEVICE IDENTITIES.
3082 //[3] decode DEVICE IDENTITIES TLV
3084 memcpy(dev_id, &src_data[index], 4);
3085 rv = _sat_decode_device_identities_tlv(dev_id, &pactive_cmd_ind_obj->data.setup_menu.device_id);
3086 if (rv != TCORE_SAT_SUCCESS) {
3087 //send TR in SatkProcessProactiveCmdInd()
3092 // In this time, the point of index is ALPHA IDENTIFIER. 11 or 12.
3093 //[4] decode ALPHA IDENTIFIER TLV
3095 dbg("[SAT] SAT PARSER - :index=%d",index);
3096 rv = _sat_decode_alpha_identifier_tlv(src_data, tlv_len, index,
3097 &pactive_cmd_ind_obj->data.setup_menu.alpha_id, &data_len_consumed);
3098 if (rv != TCORE_SAT_SUCCESS) {
3102 // In this time, the point of index is ITEM TLV
3103 //[5] decode ITEM LIST (at least one is mandatory)
3104 index+= data_len_consumed;
3105 pactive_cmd_ind_obj->data.setup_menu.menu_item_cnt = 0;
3107 data_len_consumed=0;
3108 if ((src_data[index]&0x7F) == SATK_ITEM_TAG) {
3109 rv = _sat_decode_item_tlv(src_data, tlv_len, index,
3110 &pactive_cmd_ind_obj->data.setup_menu.menu_item[pactive_cmd_ind_obj->data.setup_menu.menu_item_cnt],
3111 &data_len_consumed);
3113 if (rv != TCORE_SAT_SUCCESS)
3117 if (pactive_cmd_ind_obj->data.setup_menu.menu_item_cnt == 0) {
3118 dbg("menu item is not exist.");
3119 return TCORE_SAT_REQUIRED_VALUE_MISSING;
3124 pactive_cmd_ind_obj->data.setup_menu.menu_item_cnt++;
3125 index += data_len_consumed;
3127 if (index >= tlv_len)
3129 }while(pactive_cmd_ind_obj->data.setup_menu.menu_item_cnt < SAT_MENU_ITEM_COUNT_MAX);
3131 dbg("[SAT] SAT PARSER - :setup menu item_count=%d",pactive_cmd_ind_obj->data.setup_menu.menu_item_cnt);
3132 if (index >= tlv_len) {
3133 dbg("[SAT] SAT PARSER - :no more TLVs to decode.");
3134 //send TR in SatkProcessProactiveCmdInd()
3135 return TCORE_SAT_SUCCESS;
3138 //[6] (optional TLV) decode ITEMS NEXT ACTION INDICATOR TLV
3139 if ((src_data[index]&0x7F) == SATK_ITEMS_NEXT_ACTION_INDICATOR_TAG) {
3140 data_len_consumed = 0;
3141 rv = _sat_decode_item_next_action_indicator_tlv(tlv_str, tlv_len, index,
3142 &pactive_cmd_ind_obj->data.setup_menu.next_act_ind_list, &data_len_consumed);
3143 if (rv!=TCORE_SAT_SUCCESS) return rv;
3145 if (index+data_len_consumed >= tlv_len) {
3146 dbg("[SAT] SAT PARSER - no more TLVs to decode.");
3147 //send the data to Noti manager.
3148 return TCORE_SAT_SUCCESS;
3151 index+=data_len_consumed; //index pointing to the Tag of next TLV
3154 dbg("[SAT] SAT PARSER - ITEMS NEXT ACTION INDICATOR TLV Not present");
3157 //[7] (optional TLV) decode ICON IDENTIFIER TLV
3158 if ((src_data[index]&0x7F) == SATK_ICON_IDENTIFIER_TAG) {
3159 data_len_consumed = 0;
3160 rv = _sat_decode_icon_identifier_tlv(tlv_str, tlv_len, index,
3161 &pactive_cmd_ind_obj->data.setup_menu.icon_id, &data_len_consumed);
3162 if (rv !=TCORE_SAT_SUCCESS) return rv;
3164 if (index+data_len_consumed >= tlv_len) {
3165 dbg("[SAT] SAT PARSER - no more TLVs to decode.");
3166 //send the data to Noti manager.
3167 return TCORE_SAT_SUCCESS;
3170 index+=data_len_consumed; //index pointing to the Tag of next TLV
3173 dbg("[SAT] SAT PARSER - ICON IDENTIFIER TLV Not present");
3176 //[8] (optional TLV) decode ICON IDENTIFIER LIST TLV
3177 if ((src_data[index]&0x7F) == SATK_ITEM_ICON_IDENTIFIER_LIST_TAG) {
3178 data_len_consumed = 0;
3179 rv = _sat_decode_icon_identifier_list_tlv(tlv_str, tlv_len, index,
3180 &pactive_cmd_ind_obj->data.setup_menu.icon_list, &data_len_consumed);
3181 if (rv !=TCORE_SAT_SUCCESS) return rv; //SEND TR
3183 if (index+data_len_consumed >= tlv_len) {
3184 dbg("[SAT] SAT PARSER - no more TLVs to decode.");
3185 //send the data to Noti manager.
3186 return TCORE_SAT_SUCCESS;
3188 index+=data_len_consumed; //index pointing to the Tag of next TLV
3192 dbg("[SAT] SAT PARSER - ICON IDENTIFIER LIST TLV not present");
3195 //ToDo: Text Attribute, Text Attribute list. refer ETSI 102.223.
3196 dbg("[SAT] SAT PARSER - no more TLVs to decode.");
3197 return TCORE_SAT_SUCCESS;
3201 static enum tcore_sat_result _sat_decode_select_item(unsigned char* o_cmd_data, int o_length,
3202 int curr_offset, struct tcore_sat_proactive_command *sat_cmd_ind_data)
3205 int data_len_consumed=0;
3206 unsigned char dev_id[4];
3207 unsigned char* cmd_data = NULL;
3208 enum tcore_sat_result rv = TCORE_SAT_SUCCESS;
3210 if (o_cmd_data == NULL) {
3211 dbg("[SAT] SAT PARSER - o_cmd_data == NULL");
3212 return TCORE_SAT_ERROR_FATAL;
3215 cmd_data = &o_cmd_data[0];
3216 index = curr_offset+2;
3217 sat_cmd_ind_data->data.select_item.command_detail.cmd_num = cmd_data[index++];
3218 sat_cmd_ind_data->data.select_item.command_detail.cmd_type = cmd_data[index++];
3220 /* ******decode command qualifier****** */
3221 if (cmd_data[index] & 0x01) {
3222 if (cmd_data[index] & 0x02) {
3223 sat_cmd_ind_data->data.select_item.command_detail.cmd_qualifier.select_item.presentation_type = PRESENTATION_TYPE_NAVIGATION_OPTION;
3224 dbg("[SAT] SAT PARSER - PRESENTATION_TYPE_NAVIGATION_OPTION");
3227 sat_cmd_ind_data->data.select_item.command_detail.cmd_qualifier.select_item.presentation_type = PRESENTATION_TYPE_DATA_VALUE;
3228 dbg("[SAT] SAT PARSER - PRESENTATION_TYPE_DATA_VALUE");
3232 sat_cmd_ind_data->data.select_item.command_detail.cmd_qualifier.select_item.presentation_type = PRESENTATION_TYPE_NOT_SPECIFIED;
3233 dbg("[SAT] SAT PARSER - PRESENTATION_TYPE_NOT_SPECIFIED");
3236 if (cmd_data[index] & 0x04) {
3237 sat_cmd_ind_data->data.select_item.command_detail.cmd_qualifier.select_item.select_preference = SELECTION_PREFERENCE_USING_SOFT_KEY;
3238 dbg("[SAT] SAT PARSER - SELECTION_PREFERENCE_USING_SOFT_KEY");
3241 sat_cmd_ind_data->data.select_item.command_detail.cmd_qualifier.select_item.select_preference = SELECTION_PREFERENCE_NONE_REQUESTED;
3242 dbg("[SAT] SAT PARSER - SELECTION_PREFERENCE_NONE_REQUESTED");
3245 if (cmd_data[index] & 0x80) {
3246 sat_cmd_ind_data->data.select_item.command_detail.cmd_qualifier.select_item.help_info = TRUE;
3247 dbg("[SAT] SAT PARSER - Help info");
3252 memcpy(dev_id,&cmd_data[index],4);
3253 rv = _sat_decode_device_identities_tlv(dev_id, &sat_cmd_ind_data->data.select_item.device_id);
3254 if (rv != TCORE_SAT_SUCCESS)
3259 if ((cmd_data[index]&0x7F) == SATK_ALPHA_IDENTIFIER_TAG) {
3260 rv = _sat_decode_alpha_identifier_tlv(o_cmd_data, o_length, index, &sat_cmd_ind_data->data.select_item.alpha_id, &data_len_consumed);
3261 if (rv != TCORE_SAT_SUCCESS) {
3264 index+=data_len_consumed;
3268 sat_cmd_ind_data->data.select_item.menu_item_cnt = 0;
3270 data_len_consumed=0;
3272 if ((cmd_data[index]&0x7F) == SATK_ITEM_TAG) {
3273 rv = _sat_decode_item_tlv(o_cmd_data, o_length, index,
3274 &sat_cmd_ind_data->data.select_item.menu_item[sat_cmd_ind_data->data.select_item.menu_item_cnt],
3275 &data_len_consumed);
3277 if (rv != TCORE_SAT_SUCCESS)
3281 if (sat_cmd_ind_data->data.select_item.menu_item_cnt == 0) {
3282 dbg("menu item is not exist.");
3283 return TCORE_SAT_REQUIRED_VALUE_MISSING;
3288 sat_cmd_ind_data->data.select_item.menu_item_cnt++;
3289 index += data_len_consumed;
3291 if (index >= o_length)
3294 }while(sat_cmd_ind_data->data.select_item.menu_item_cnt < SAT_MENU_ITEM_COUNT_MAX);
3296 dbg("[SAT] SAT PARSER - select menu item_count=%d",sat_cmd_ind_data->data.select_item.menu_item_cnt);
3297 if (index >= o_length) {
3298 dbg("[SAT] SAT PARSER - :no more TLVs to decode.");
3299 return TCORE_SAT_SUCCESS;
3302 //item next action indicator
3303 if ((cmd_data[index]&0x7F) == SATK_ITEMS_NEXT_ACTION_INDICATOR_TAG) {
3304 data_len_consumed = 0;
3305 rv = _sat_decode_item_next_action_indicator_tlv(o_cmd_data, o_length, index,
3306 &sat_cmd_ind_data->data.select_item.item_next_act_ind_list, &data_len_consumed);
3307 if (rv!=TCORE_SAT_SUCCESS)
3310 if (index+data_len_consumed >= o_length) {
3311 dbg("[SAT] SAT PARSER - no more TLVs to decode.");
3312 return TCORE_SAT_SUCCESS;
3315 index+=data_len_consumed;
3319 if ((cmd_data[index]&0x7F) == SATK_ITEM_IDENTIFIER_TAG) {
3320 data_len_consumed = 0;
3321 rv = _sat_decode_item_identifier_tlv(o_cmd_data, o_length, index,
3322 &sat_cmd_ind_data->data.select_item.item_identifier, &data_len_consumed);
3323 if (rv !=TCORE_SAT_SUCCESS)
3326 if (index+data_len_consumed >= o_length) {
3327 dbg("[SAT] SAT PARSER - no more TLVs to decode.");
3328 return TCORE_SAT_SUCCESS;
3331 index+=data_len_consumed; //index pointing to the Tag of next TLV
3335 if ((cmd_data[index]&0x7F) == SATK_ICON_IDENTIFIER_TAG) {
3336 data_len_consumed = 0;
3337 rv = _sat_decode_icon_identifier_tlv(o_cmd_data, o_length, index,
3338 &sat_cmd_ind_data->data.select_item.icon_id, &data_len_consumed);
3340 if (rv != TCORE_SAT_SUCCESS) {
3341 return TCORE_SAT_COMMAND_NOT_UNDERSTOOD; //SEND TR
3344 if (index+data_len_consumed >= o_length) {
3345 dbg("[SAT] SAT PARSER - no more TLVs to decode.");
3346 return TCORE_SAT_SUCCESS;
3349 index+=data_len_consumed; //index pointing to the Tag of next TLV
3352 if ((cmd_data[index]&0x7F) == SATK_ITEM_ICON_IDENTIFIER_LIST_TAG) {
3353 data_len_consumed = 0;
3354 rv = _sat_decode_icon_identifier_list_tlv(o_cmd_data, o_length, index,
3355 &sat_cmd_ind_data->data.select_item.icon_list, &data_len_consumed);
3356 if (rv !=TCORE_SAT_SUCCESS)
3357 return rv; //SEND TR
3359 if (index+data_len_consumed >= o_length) {
3360 dbg("[SAT] SAT PARSER - no more TLVs to decode.");
3361 return TCORE_SAT_SUCCESS;
3363 index+=data_len_consumed; //index pointing to the Tag of next TLV
3366 dbg("[SAT] SAT PARSER - :decoding done!.");
3367 return TCORE_SAT_SUCCESS;
3371 static enum tcore_sat_result _sat_decode_send_sms(unsigned char* o_cmd_data, int o_length,
3372 int curr_offset, struct tcore_sat_proactive_command *sat_cmd_ind_data)
3375 int data_len_consumed=0;
3376 unsigned char dev_id[4];
3377 unsigned char* cmd_data = NULL;
3378 enum tcore_sat_result rv = TCORE_SAT_SUCCESS;
3380 if (o_cmd_data == NULL) {
3381 dbg("[SAT] SAT PARSER - o_cmd_data == NULL");
3382 return TCORE_SAT_ERROR_FATAL;
3385 cmd_data = &o_cmd_data[0];
3386 index = curr_offset+2;
3387 sat_cmd_ind_data->data.send_sms.command_detail.cmd_num = cmd_data[index++];
3388 sat_cmd_ind_data->data.send_sms.command_detail.cmd_type = cmd_data[index++];
3390 /* ******decode command qualifier****** */
3391 if (cmd_data[index] & 0x01) {
3392 sat_cmd_ind_data->data.send_sms.command_detail.cmd_qualifier.send_sms.packing_by_me_required = TRUE;
3395 sat_cmd_ind_data->data.send_sms.command_detail.cmd_qualifier.send_sms.packing_by_me_required = FALSE;
3396 dbg("[SAT] SAT PARSER - packing by me required is false");
3401 memcpy(dev_id,&cmd_data[index],4);
3402 rv = _sat_decode_device_identities_tlv(dev_id, &sat_cmd_ind_data->data.send_sms.device_id);
3403 if (rv != TCORE_SAT_SUCCESS)
3408 if ((cmd_data[index]&0x7F) == SATK_ALPHA_IDENTIFIER_TAG) {
3409 data_len_consumed = 0;
3410 rv = _sat_decode_alpha_identifier_tlv(o_cmd_data, o_length, index, &sat_cmd_ind_data->data.send_sms.alpha_id, &data_len_consumed);
3411 if (rv != TCORE_SAT_SUCCESS) {
3414 index+=data_len_consumed;
3418 if ((cmd_data[index]&0x7F) == SATK_ADDRESS_TAG) {
3419 data_len_consumed = 0;
3420 rv = _sat_decode_address_tlv(o_cmd_data, o_length, index, &sat_cmd_ind_data->data.send_sms.address, &data_len_consumed);
3421 if (rv != TCORE_SAT_SUCCESS) {
3424 index+=data_len_consumed;
3428 data_len_consumed = 0;
3429 rv = _sat_decode_sms_tpdu_tlv(o_cmd_data, o_length, index, &sat_cmd_ind_data->data.send_sms.sms_tpdu, &data_len_consumed);
3430 if (rv != TCORE_SAT_SUCCESS)
3433 if (index+data_len_consumed >= o_length) {
3434 dbg("[SAT] SAT PARSER - no more TLVs to decode.");
3435 return TCORE_SAT_SUCCESS;
3439 index+=data_len_consumed;
3440 if ((cmd_data[index]&0x7F) == SATK_ICON_IDENTIFIER_TAG) {
3441 data_len_consumed = 0;
3442 rv = _sat_decode_icon_identifier_tlv(o_cmd_data, o_length, index,
3443 &sat_cmd_ind_data->data.select_item.icon_id, &data_len_consumed);
3445 if (rv != TCORE_SAT_SUCCESS) {
3446 return TCORE_SAT_COMMAND_NOT_UNDERSTOOD; //SEND TR
3449 if (index+data_len_consumed >= o_length) {
3450 dbg("[SAT] SAT PARSER - no more TLVs to decode.");
3451 return TCORE_SAT_SUCCESS;
3454 index+=data_len_consumed; //index pointing to the Tag of next TLV
3457 dbg("[SAT] SAT PARSER - :decoding done!.");
3458 return TCORE_SAT_SUCCESS;
3462 static enum tcore_sat_result _sat_decode_send_ss(unsigned char* o_cmd_data, int o_length,
3463 int curr_offset, struct tcore_sat_proactive_command *sat_cmd_ind_data)
3465 int index = 0, data_len_consumed = 0;
3466 unsigned char dev_id[4];
3467 unsigned char* cmd_data = NULL;
3468 enum tcore_sat_result rv = TCORE_SAT_SUCCESS;
3470 if (o_cmd_data == NULL || sat_cmd_ind_data == NULL) {
3471 dbg("[SAT] SAT PARSER - o_cmd_data == NULL");
3472 return TCORE_SAT_ERROR_FATAL;
3475 cmd_data = &o_cmd_data[0];
3476 index = curr_offset+2;
3477 sat_cmd_ind_data->data.send_ss.command_detail.cmd_num = cmd_data[index++];
3478 sat_cmd_ind_data->data.send_ss.command_detail.cmd_type = cmd_data[index++];
3480 /** command detail **/
3484 memcpy(dev_id,&cmd_data[index],4);
3485 rv = _sat_decode_device_identities_tlv(dev_id, &sat_cmd_ind_data->data.send_ss.device_id);
3486 if (rv != TCORE_SAT_SUCCESS)
3489 //alpha identifier - optional
3491 if ((cmd_data[index]&0x7F) == SATK_ALPHA_IDENTIFIER_TAG) {
3492 rv = _sat_decode_alpha_identifier_tlv(o_cmd_data, o_length, index, &sat_cmd_ind_data->data.send_ss.alpha_id, &data_len_consumed);
3493 if (rv != TCORE_SAT_SUCCESS) {
3496 index+=data_len_consumed;
3500 rv = _sat_decode_ss_string_tlv(o_cmd_data, o_length, index, &sat_cmd_ind_data->data.send_ss.ss_string, &data_len_consumed);
3501 if (rv != TCORE_SAT_SUCCESS)
3504 //icon identifier- optional
3505 index+=data_len_consumed;
3506 if ((cmd_data[index]&0x7F) == SATK_ICON_IDENTIFIER_TAG) {
3507 data_len_consumed = 0;
3509 rv = _sat_decode_icon_identifier_tlv(o_cmd_data, o_length, index, &sat_cmd_ind_data->data.send_ss.icon_id, &data_len_consumed);
3510 if (rv != TCORE_SAT_SUCCESS) {
3511 return TCORE_SAT_COMMAND_NOT_UNDERSTOOD; //SEND TR
3516 dbg("[SAT] SAT PARSER - :decoding done!.");
3517 return TCORE_SAT_SUCCESS;
3521 static enum tcore_sat_result _sat_decode_send_ussd(unsigned char* o_cmd_data, int o_length,
3522 int curr_offset, struct tcore_sat_proactive_command *sat_cmd_ind_data)
3524 int index = 0, data_len_consumed = 0;
3525 unsigned char dev_id[4];
3526 unsigned char* cmd_data = NULL;
3527 enum tcore_sat_result rv = TCORE_SAT_SUCCESS;
3529 if (o_cmd_data == NULL || sat_cmd_ind_data == NULL) {
3530 dbg("[SAT] SAT PARSER - o_cmd_data == NULL");
3531 return TCORE_SAT_ERROR_FATAL;
3534 cmd_data = &o_cmd_data[0];
3535 index = curr_offset+2;
3536 sat_cmd_ind_data->data.send_ussd.command_detail.cmd_num = cmd_data[index++];
3537 sat_cmd_ind_data->data.send_ussd.command_detail.cmd_type = cmd_data[index++];
3539 /** command detail **/
3543 memcpy(dev_id,&cmd_data[index],4);
3544 rv = _sat_decode_device_identities_tlv(dev_id, &sat_cmd_ind_data->data.send_ussd.device_id);
3545 if (rv != TCORE_SAT_SUCCESS)
3548 //alpha identifier - optional
3550 if ((cmd_data[index]&0x7F) == SATK_ALPHA_IDENTIFIER_TAG) {
3551 rv = _sat_decode_alpha_identifier_tlv(o_cmd_data, o_length, index, &sat_cmd_ind_data->data.send_ussd.alpha_id, &data_len_consumed);
3552 if (rv != TCORE_SAT_SUCCESS) {
3555 index+=data_len_consumed;
3559 rv = _sat_decode_ussd_string_tlv(o_cmd_data, o_length, index, &sat_cmd_ind_data->data.send_ussd.ussd_string, &data_len_consumed);
3560 if (rv != TCORE_SAT_SUCCESS)
3563 //icon identifier- optional
3564 index+=data_len_consumed;
3565 if ((cmd_data[index]&0x7F) == SATK_ICON_IDENTIFIER_TAG) {
3566 data_len_consumed = 0;
3568 rv = _sat_decode_icon_identifier_tlv(o_cmd_data, o_length, index, &sat_cmd_ind_data->data.send_ussd.icon_id, &data_len_consumed);
3569 if (rv != TCORE_SAT_SUCCESS) {
3570 return TCORE_SAT_COMMAND_NOT_UNDERSTOOD; //SEND TR
3575 dbg("[SAT] SAT PARSER - :decoding done!.");
3576 return TCORE_SAT_SUCCESS;
3580 static enum tcore_sat_result _sat_decode_setup_call(unsigned char* o_cmd_data, int o_length,
3581 int curr_offset, struct tcore_sat_proactive_command *sat_cmd_ind_data)
3583 int index = 0, data_len_consumed = 0;
3584 unsigned char dev_id[4];
3585 unsigned char* cmd_data = NULL;
3586 enum tcore_sat_result rv = TCORE_SAT_SUCCESS;
3588 if (o_cmd_data == NULL || sat_cmd_ind_data == NULL) {
3589 dbg("[SAT] SAT PARSER - o_cmd_data == NULL");
3590 return TCORE_SAT_ERROR_FATAL;
3594 cmd_data = &o_cmd_data[0];
3595 index = curr_offset+2;
3596 sat_cmd_ind_data->data.setup_call.command_detail.cmd_num = cmd_data[index++];
3597 sat_cmd_ind_data->data.setup_call.command_detail.cmd_type = cmd_data[index++];
3599 /* ******decode command qualifier****** */
3600 switch(cmd_data[index]) {
3601 case SETUP_CALL_IF_ANOTHER_CALL_NOT_BUSY:
3602 case SETUP_CALL_IF_ANOTHER_CALL_NOT_BUSY_WITH_REDIAL:
3603 case SETUP_CALL_PUT_ALL_OTHER_CALLS_ON_HOLD:
3604 case SETUP_CALL_PUT_ALL_OTHER_CALLS_ON_HOLD_WITH_REDIAL:
3605 case SETUP_CALL_DISCONN_ALL_OTHER_CALLS:
3606 case SETUP_CALL_DISCONN_ALL_OTHER_CALLS_WITH_REDIAL:
3607 sat_cmd_ind_data->data.setup_call.command_detail.cmd_qualifier.setup_call.setup_call = cmd_data[index];
3608 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);
3610 case SETUP_CALL_RESERVED:
3612 dbg("[SAT] SAT PARSER - setup_call.cmd_qualifier= 0x%02x", cmd_data[index]);
3613 return TCORE_SAT_BEYOND_ME_CAPABILITY;
3619 memcpy(dev_id,&cmd_data[index],4);
3620 rv = _sat_decode_device_identities_tlv(dev_id, &sat_cmd_ind_data->data.setup_call.device_id);
3621 if (rv != TCORE_SAT_SUCCESS)
3624 //alpha identifier (user confirmation) - optional
3626 if ((cmd_data[index]&0x7F) == SATK_ALPHA_IDENTIFIER_TAG) {
3627 rv = _sat_decode_alpha_identifier_tlv(o_cmd_data, o_length, index, &sat_cmd_ind_data->data.setup_call.user_confirm_alpha_id, &data_len_consumed);
3628 if (rv != TCORE_SAT_SUCCESS) {
3631 index+=data_len_consumed;
3635 rv = _sat_decode_address_tlv(o_cmd_data, o_length, index, &sat_cmd_ind_data->data.setup_call.address, &data_len_consumed);
3636 if (rv != TCORE_SAT_SUCCESS) {
3640 index+=data_len_consumed;
3641 if (index >= o_length) {
3642 dbg("[SAT] SAT PARSER - no more TLVs to decode.");
3643 return TCORE_SAT_SUCCESS;
3646 //capability configuration parameter - optional
3647 if ((cmd_data[index]&0x7F)==SATK_CAPABILITY_CONFIGURATION_PARAMETERS_TAG) {
3648 rv =_sat_decode_ccp_tlv(o_cmd_data, o_length, index, &sat_cmd_ind_data->data.setup_call.ccp, &data_len_consumed);
3649 if (rv != TCORE_SAT_SUCCESS) {
3650 return rv; //SEND TR
3653 index+=data_len_consumed;
3654 if (index >= o_length) {
3655 dbg("[SAT] SAT PARSER - no more TLVs to decode.");
3656 return TCORE_SAT_SUCCESS;
3660 //sub address - optional
3661 if ((cmd_data[index]&0x7F)==SATK_SUB_ADDRESS_TAG) {
3662 rv =_sat_decode_sub_address_tlv(o_cmd_data, o_length, index, &sat_cmd_ind_data->data.setup_call.subaddress, &data_len_consumed);
3663 if (rv != TCORE_SAT_SUCCESS) {
3664 return rv; //SEND TR
3667 index+=data_len_consumed;
3668 if (index >= o_length) {
3669 dbg("[SAT] SAT PARSER - no more TLVs to decode.");
3670 return TCORE_SAT_SUCCESS;
3674 //time duration - optional
3675 if ((cmd_data[index]&0x7F)==SATK_DURATION_TAG) {
3676 rv =_sat_decode_duration_tlv(o_cmd_data, o_length, index, &sat_cmd_ind_data->data.setup_call.duration, &data_len_consumed);
3677 if (rv != TCORE_SAT_SUCCESS) {
3678 return rv; //SEND TR
3681 index+=data_len_consumed;
3682 if (index >= o_length) {
3683 dbg("[SAT] SAT PARSER - no more TLVs to decode.");
3684 return TCORE_SAT_SUCCESS;
3688 //icon identifier (user confirmation) - optional
3689 if ((cmd_data[index]&0x7F) == SATK_ICON_IDENTIFIER_TAG) {
3690 data_len_consumed = 0;
3691 rv = _sat_decode_icon_identifier_tlv(o_cmd_data, o_length, index, &sat_cmd_ind_data->data.setup_call.user_confirm_icon_id, &data_len_consumed);
3693 if (rv != TCORE_SAT_SUCCESS) {
3694 return TCORE_SAT_COMMAND_NOT_UNDERSTOOD; //SEND TR
3697 index+=data_len_consumed;
3698 if (index >= o_length) {
3699 dbg("[SAT] SAT PARSER - no more TLVs to decode.");
3700 return TCORE_SAT_SUCCESS;
3704 //alpha identifier (call setup) - optional
3705 if ((cmd_data[index]&0x7F) == SATK_ALPHA_IDENTIFIER_TAG) {
3706 rv = _sat_decode_alpha_identifier_tlv(o_cmd_data, o_length, index, &sat_cmd_ind_data->data.setup_call.call_setup_alpha_id, &data_len_consumed);
3707 if (rv != TCORE_SAT_SUCCESS) {
3711 index+=data_len_consumed;
3712 if (index >= o_length) {
3713 dbg("[SAT] SAT PARSER - no more TLVs to decode.");
3714 return TCORE_SAT_SUCCESS;
3718 //icon identifier (call setup) - optional
3719 if ((cmd_data[index]&0x7F) == SATK_ICON_IDENTIFIER_TAG) {
3720 data_len_consumed = 0;
3721 rv = _sat_decode_icon_identifier_tlv(o_cmd_data, o_length, index, &sat_cmd_ind_data->data.setup_call.call_setup_icon_id, &data_len_consumed);
3723 if (rv != TCORE_SAT_SUCCESS) {
3724 return TCORE_SAT_COMMAND_NOT_UNDERSTOOD; //SEND TR
3727 index+=data_len_consumed;
3728 if (index >= o_length) {
3729 dbg("[SAT] SAT PARSER - no more TLVs to decode.");
3730 return TCORE_SAT_SUCCESS;
3734 //ToDo: Text Attribute (user_confirmation , call_setup)
3736 dbg("[SAT] SAT PARSER - :decoding done!.");
3737 return TCORE_SAT_SUCCESS;
3740 //6.4.15 PROVIDE LOCAL INFO
3741 static enum tcore_sat_result _sat_decode_provide_local_info(unsigned char* o_cmd_data, int o_length,
3742 int curr_offset, struct tcore_sat_proactive_command *sat_cmd_ind_data)
3745 unsigned char dev_id[4];
3746 unsigned char* cmd_data = NULL;
3747 enum tcore_sat_result rv = TCORE_SAT_SUCCESS;
3749 if (o_cmd_data == NULL) {
3750 dbg("[SAT] SAT PARSER - o_cmd_data == NULL");
3751 return TCORE_SAT_ERROR_FATAL;
3755 cmd_data = &o_cmd_data[0];
3756 index = curr_offset+2;
3757 sat_cmd_ind_data->data.setup_event_list.command_detail.cmd_num = cmd_data[index++];
3758 sat_cmd_ind_data->data.setup_event_list.command_detail.cmd_type = cmd_data[index++];
3760 /* ******decode command qualifier****** */
3761 switch(cmd_data[index]) {
3762 case LOCAL_INFO_DATE_TIME_AND_TIMEZONE:
3763 case LOCAL_INFO_LANGUAGE:
3764 sat_cmd_ind_data->data.setup_event_list.command_detail.cmd_qualifier.provide_local_info.provide_local_info = cmd_data[index];
3766 //TODO - Other cases
3768 sat_cmd_ind_data->data.setup_event_list.command_detail.cmd_qualifier.provide_local_info.provide_local_info = LOCAL_INFO_RESERVED;
3774 memcpy(dev_id,&cmd_data[index],4);
3775 rv = _sat_decode_device_identities_tlv(dev_id, &sat_cmd_ind_data->data.setup_event_list.device_id);
3776 if (rv != TCORE_SAT_SUCCESS)
3779 //TODO - UTRAN Measurement Qualifier
3781 dbg("[SAT] SAT PARSER - :decoding done!.");
3782 return TCORE_SAT_SUCCESS;
3785 //6.4.16 SETUP EVENT LIST
3786 static enum tcore_sat_result _sat_decode_setup_event_list(unsigned char* o_cmd_data, int o_length,
3787 int curr_offset, struct tcore_sat_proactive_command *sat_cmd_ind_data)
3789 int index = 0, data_len_consumed = 0;
3790 unsigned char dev_id[4];
3791 unsigned char* cmd_data = NULL;
3792 enum tcore_sat_result rv = TCORE_SAT_SUCCESS;
3794 if (o_cmd_data == NULL) {
3795 dbg("[SAT] SAT PARSER - o_cmd_data == NULL");
3796 return TCORE_SAT_ERROR_FATAL;
3800 cmd_data = &o_cmd_data[0];
3801 index = curr_offset+2;
3802 sat_cmd_ind_data->data.setup_event_list.command_detail.cmd_num = cmd_data[index++];
3803 sat_cmd_ind_data->data.setup_event_list.command_detail.cmd_type = cmd_data[index++];
3807 memcpy(dev_id,&cmd_data[index],4);
3808 rv = _sat_decode_device_identities_tlv(dev_id, &sat_cmd_ind_data->data.setup_event_list.device_id);
3809 if (rv != TCORE_SAT_SUCCESS)
3814 rv = _sat_decode_event_list_tlv(o_cmd_data, o_length, index,
3815 &sat_cmd_ind_data->data.setup_event_list.event_list,
3816 &sat_cmd_ind_data->data.setup_event_list.event_list, &data_len_consumed);
3818 dbg("[SAT] SAT PARSER - :decoding done!.");
3819 return TCORE_SAT_SUCCESS;
3822 //6.4.22 SETUP IDLE MODE TEXT
3823 static enum tcore_sat_result _sat_decode_setup_idle_mode_text(unsigned char* o_cmd_data, int o_length,
3824 int curr_offset, struct tcore_sat_proactive_command *sat_cmd_ind_data)
3826 int index = 0, data_len_consumed = 0;
3827 unsigned char dev_id[4];
3828 unsigned char* cmd_data = NULL;
3829 enum tcore_sat_result rv = TCORE_SAT_SUCCESS;
3831 if (o_cmd_data == NULL) {
3832 dbg("[SAT] SAT PARSER - o_cmd_data == NULL");
3833 return TCORE_SAT_ERROR_FATAL;
3837 cmd_data = &o_cmd_data[0];
3838 index = curr_offset+2;
3839 sat_cmd_ind_data->data.setup_idle_mode_text.command_detail.cmd_num = cmd_data[index++];
3840 sat_cmd_ind_data->data.setup_idle_mode_text.command_detail.cmd_type = cmd_data[index++];
3844 memcpy(dev_id,&cmd_data[index],4);
3845 rv = _sat_decode_device_identities_tlv(dev_id, &sat_cmd_ind_data->data.setup_idle_mode_text.device_id);
3846 if (rv != TCORE_SAT_SUCCESS)
3851 rv = _sat_decode_text_tlv(o_cmd_data, o_length, index, &sat_cmd_ind_data->data.setup_idle_mode_text.text, &data_len_consumed);
3852 if (rv != TCORE_SAT_SUCCESS)
3855 if (sat_cmd_ind_data->data.setup_idle_mode_text.text.string_length <= 0) {
3856 err("[SAT] SAT PARSER - :string length is 0");
3857 return TCORE_SAT_COMMAND_NOT_UNDERSTOOD;
3860 dbg("[SAT] SAT PARSER text(%s)",sat_cmd_ind_data->data.setup_idle_mode_text.text.string);
3861 dbg("[SAT] SAT PARSER o_len(%d) index(%d) data_len_consumed(%d)",o_length , index, data_len_consumed);
3863 if (index+data_len_consumed > o_length) {
3864 err("[SAT] SAT PARSER - Wrong String TLV");
3865 return TCORE_SAT_BEYOND_ME_CAPABILITY;
3867 else if (index+data_len_consumed == o_length) {
3868 dbg("[SAT] SAT PARSER - :no more TLVs to decode.");
3869 return TCORE_SAT_SUCCESS;
3873 index+=data_len_consumed;
3874 if ((cmd_data[index]&0x7F) == SATK_ICON_IDENTIFIER_TAG) {
3875 data_len_consumed = 0;
3876 rv = _sat_decode_icon_identifier_tlv(o_cmd_data, o_length, index, &sat_cmd_ind_data->data.setup_idle_mode_text.icon_id, &data_len_consumed);
3878 if (rv != TCORE_SAT_SUCCESS) {
3879 return TCORE_SAT_COMMAND_NOT_UNDERSTOOD; //SEND TR
3882 if (index+data_len_consumed >= o_length) {
3883 dbg("[SAT] SAT PARSER - no more TLVs to decode.");
3884 return TCORE_SAT_SUCCESS;
3887 index+=data_len_consumed; //index pointing to the Tag of next TLV
3890 //ToDo: Text Attribute
3891 dbg("[SAT] SAT PARSER - :decoding done!.");
3892 return TCORE_SAT_SUCCESS;
3896 static enum tcore_sat_result _sat_decode_send_dtmf(unsigned char* o_cmd_data, int o_length,
3897 int curr_offset, struct tcore_sat_proactive_command *sat_cmd_ind_data)
3899 int index = 0, data_len_consumed = 0;
3900 unsigned char dev_id[4];
3901 unsigned char* cmd_data = NULL;
3902 enum tcore_sat_result rv = TCORE_SAT_SUCCESS;
3904 if (o_cmd_data == NULL) {
3905 dbg("[SAT] SAT PARSER - o_cmd_data == NULL");
3906 return TCORE_SAT_ERROR_FATAL;
3910 cmd_data = &o_cmd_data[0];
3911 index = curr_offset+2;
3912 sat_cmd_ind_data->data.send_dtmf.command_detail.cmd_num = cmd_data[index++];
3913 sat_cmd_ind_data->data.send_dtmf.command_detail.cmd_type = cmd_data[index++];
3917 memcpy(dev_id,&cmd_data[index],4);
3918 rv = _sat_decode_device_identities_tlv(dev_id, &sat_cmd_ind_data->data.send_dtmf.device_id);
3919 if (rv != TCORE_SAT_SUCCESS)
3922 //alpha identifier - optional
3924 if ((cmd_data[index]&0x7F) == SATK_ALPHA_IDENTIFIER_TAG) {
3925 rv = _sat_decode_alpha_identifier_tlv(o_cmd_data, o_length, index, &sat_cmd_ind_data->data.send_dtmf.alpha_id, &data_len_consumed);
3926 if (rv != TCORE_SAT_SUCCESS) {
3929 index+=data_len_consumed;
3932 // DTMF string - mandatory
3933 if ((cmd_data[index] & 0x7F) == SATK_DTMF_STRING_TAG) {
3934 rv = _sat_decode_dtmf_string_tlv(o_cmd_data, o_length, index,
3935 &sat_cmd_ind_data->data.send_dtmf.dtmf_string, &data_len_consumed);
3936 if (rv != TCORE_SAT_SUCCESS) {
3940 if (index + data_len_consumed >= o_length) {
3941 dbg("[SAT] SAT PARSER - no more TLVs to decode.");
3942 return TCORE_SAT_SUCCESS;
3944 index += data_len_consumed;
3946 dbg("[SAT] SAT PARSER - DTMF tlv is missed.");
3947 return TCORE_SAT_REQUIRED_VALUE_MISSING;
3950 //icon identifier - optional
3951 if ((cmd_data[index] & 0x7F) == SATK_ICON_IDENTIFIER_TAG) {
3952 data_len_consumed = 0;
3953 rv = _sat_decode_icon_identifier_tlv(o_cmd_data, o_length, index,
3954 &sat_cmd_ind_data->data.setup_idle_mode_text.icon_id, &data_len_consumed);
3956 if (rv != TCORE_SAT_SUCCESS) {
3957 return TCORE_SAT_COMMAND_NOT_UNDERSTOOD;
3960 if (index + data_len_consumed >= o_length) {
3961 dbg("[SAT] SAT PARSER - no more TLVs to decode.");
3962 return TCORE_SAT_SUCCESS;
3964 index += data_len_consumed; //index pointing to the Tag of next TLV
3967 //ToDo: Text Attribute, Frame Identifier
3968 dbg("[SAT] SAT PARSER - :decoding done!.");
3969 return TCORE_SAT_SUCCESS;
3972 //6.4.25 LANGUAGE NOTIFICATION
3973 static enum tcore_sat_result _sat_decode_language_notification(unsigned char* o_cmd_data, int o_length,
3974 int curr_offset, struct tcore_sat_proactive_command *sat_cmd_ind_data)
3977 unsigned char dev_id[4];
3978 unsigned char* cmd_data = NULL;
3979 enum tcore_sat_result rv = TCORE_SAT_SUCCESS;
3981 if (o_cmd_data == NULL) {
3982 dbg("[SAT] SAT PARSER - o_cmd_data == NULL");
3983 return TCORE_SAT_ERROR_FATAL;
3987 cmd_data = &o_cmd_data[0];
3988 index = curr_offset+2;
3989 sat_cmd_ind_data->data.language_notification.command_detail.cmd_num = cmd_data[index++];
3990 sat_cmd_ind_data->data.language_notification.command_detail.cmd_type = cmd_data[index++];
3992 /* ******decode command qualifier****** */
3993 if (cmd_data[index]&0x01)
3994 sat_cmd_ind_data->data.language_notification.command_detail.cmd_qualifier.language_notification.specific_language = TRUE;
3996 sat_cmd_ind_data->data.language_notification.command_detail.cmd_qualifier.language_notification.specific_language = FALSE;
4000 memcpy(dev_id,&cmd_data[index],4);
4001 rv = _sat_decode_device_identities_tlv(dev_id, &sat_cmd_ind_data->data.language_notification.device_id);
4002 if (rv != TCORE_SAT_SUCCESS)
4005 //language - conditional
4007 if (sat_cmd_ind_data->data.language_notification.command_detail.cmd_qualifier.language_notification.specific_language == TRUE) {
4008 if ((cmd_data[index]&0x7F) == SATK_LANGUAGE_TAG) {
4009 rv = _sat_decode_language_tlv(cmd_data, o_length, index, &sat_cmd_ind_data->data.language_notification.language);
4010 if (rv != TCORE_SAT_SUCCESS)
4013 dbg("[SAT] SAT PARSER - Language TLV is required but missing.");
4014 return TCORE_SAT_COMMAND_NOT_UNDERSTOOD;
4017 sat_cmd_ind_data->data.language_notification.language = SIM_LANG_UNSPECIFIED;
4018 dbg("[SAT] SAT PARSER - non-specific language");
4021 dbg("[SAT] SAT PARSER - :decoding done!.");
4022 return TCORE_SAT_SUCCESS;
4025 //6.4.26 LAUNCH BROWSER
4026 static enum tcore_sat_result _sat_decode_launch_browser(unsigned char* o_cmd_data, int o_length,
4027 int curr_offset, struct tcore_sat_proactive_command *sat_cmd_ind_data)
4029 int index = 0, data_len_consumed = 0;
4030 unsigned char dev_id[4];
4031 unsigned char* cmd_data = NULL;
4032 enum tcore_sat_result rv = TCORE_SAT_SUCCESS;
4034 if (o_cmd_data == NULL) {
4035 dbg("[SAT] SAT PARSER - o_cmd_data == NULL");
4036 return TCORE_SAT_ERROR_FATAL;
4040 cmd_data = &o_cmd_data[0];
4041 index = curr_offset+2;
4042 sat_cmd_ind_data->data.launch_browser.command_detail.cmd_num = cmd_data[index++];
4043 sat_cmd_ind_data->data.launch_browser.command_detail.cmd_type = cmd_data[index++];
4045 // decode command qualifier
4046 switch (cmd_data[index]) {
4048 sat_cmd_ind_data->data.launch_browser.command_detail.cmd_qualifier.launch_browser.launch_browser =
4049 LAUNCH_BROWSER_IF_NOT_ALREADY_LAUNCHED;
4052 sat_cmd_ind_data->data.launch_browser.command_detail.cmd_qualifier.launch_browser.launch_browser =
4053 LAUNCH_BROWSER_NOT_USED;
4056 sat_cmd_ind_data->data.launch_browser.command_detail.cmd_qualifier.launch_browser.launch_browser =
4057 LAUNCH_BROWSER_USE_EXISTING_BROWSER;
4060 sat_cmd_ind_data->data.launch_browser.command_detail.cmd_qualifier.launch_browser.launch_browser =
4061 LAUNCH_BROWSER_CLOSE_AND_LAUNCH_NEW_BROWSER;
4064 sat_cmd_ind_data->data.launch_browser.command_detail.cmd_qualifier.launch_browser.launch_browser =
4065 LAUNCH_BROWSER_NOT_USED2;
4068 sat_cmd_ind_data->data.launch_browser.command_detail.cmd_qualifier.launch_browser.launch_browser =
4069 LAUNCH_BROWSER_RESERVED;
4075 memcpy(dev_id,&cmd_data[index],4);
4076 rv = _sat_decode_device_identities_tlv(dev_id, &sat_cmd_ind_data->data.language_notification.device_id);
4077 if (rv != TCORE_SAT_SUCCESS)
4082 //Browser Identity TLV - Optional
4083 if ((cmd_data[index] & 0x7F) == SATK_BROWSER_IDENTITY_TAG) {
4084 rv = _sat_decode_browser_identity_tlv(o_cmd_data, o_length, index, &sat_cmd_ind_data->data.launch_browser.browser_id, &data_len_consumed);
4085 if (rv != TCORE_SAT_SUCCESS)
4087 index += data_len_consumed;
4089 dbg("[SAT] SAT PARSER - Browser ID NOT present");
4092 //URL TLV - Mandatory
4093 if ((cmd_data[index] & 0x7F) == SATK_URL_TAG) {
4094 rv = _sat_decode_url_tlv(o_cmd_data, o_length, index, &sat_cmd_ind_data->data.launch_browser.url, &data_len_consumed);
4095 if (rv != TCORE_SAT_SUCCESS)
4098 if (index + data_len_consumed >= o_length) {
4099 dbg("[SAT] SAT PARSER - No more TLVs to decode, decoding done.");
4100 return TCORE_SAT_SUCCESS;
4102 dbg("[SAT] SAT PARSER - more TLVs to decode, decoding continue.");
4103 index += data_len_consumed;
4106 dbg("[SAT] SAT PARSER - Browser URL NOT present! BUG! this value is mandatory!!!");
4107 return TCORE_SAT_REQUIRED_VALUE_MISSING;
4111 if ((cmd_data[index] & 0x7F) == SATK_BEARER_TAG) {
4112 rv = _sat_decode_bearer_tlv(o_cmd_data, o_length, index, &sat_cmd_ind_data->data.launch_browser.bearer, &data_len_consumed);
4113 if (rv != TCORE_SAT_SUCCESS)
4116 if (index + data_len_consumed >= o_length) {
4117 dbg("[SAT] SAT PARSER - No more TLVs to decode, decoding done.");
4118 return TCORE_SAT_SUCCESS;
4120 index += data_len_consumed;
4123 dbg("[SAT] SAT PARSER - Bearer TLV Not present.");
4126 //Provisioning reference file - optional
4127 sat_cmd_ind_data->data.launch_browser.file_ref_count = 0;
4128 while ((cmd_data[index] & 0x7F) == SATK_PROVISIONING_REF_FILE_TAG) {
4129 if (sat_cmd_ind_data->data.launch_browser.file_ref_count >= SAT_PROVISIONING_REF_MAX_COUNT) {
4130 dbg("[SAT] SAT PARSER - More number of PRF entries than can be handled");
4131 return TCORE_SAT_COMMAND_NOT_UNDERSTOOD;
4134 rv = _sat_decode_provisioning_file_ref_tlv(
4138 &sat_cmd_ind_data->data.launch_browser.file_list[sat_cmd_ind_data->data.launch_browser.file_ref_count],
4139 &data_len_consumed);
4140 if (rv != TCORE_SAT_SUCCESS) {
4143 sat_cmd_ind_data->data.launch_browser.file_ref_count++;
4146 if (index + data_len_consumed >= o_length) {
4147 dbg("[SAT] SAT PARSER - No more TLVs to decode, decoding done.");
4148 return TCORE_SAT_SUCCESS;
4150 index += data_len_consumed;
4154 //text string(gateway/proxy identity) - optional
4155 if ((cmd_data[index] & 0x7F) == SATK_TEXT_STRING_TAG) {
4156 rv = _sat_decode_text_tlv(o_cmd_data, o_length, index, &sat_cmd_ind_data->data.launch_browser.gateway_proxy_text, &data_len_consumed);
4157 if (rv != TCORE_SAT_SUCCESS)
4160 if (index + data_len_consumed >= o_length) {
4161 dbg("[SAT] SAT PARSER - No more TLVs to decode, decoding done.");
4162 return TCORE_SAT_SUCCESS;
4164 index += data_len_consumed;
4168 //alpha identifier - optional
4169 if ((cmd_data[index]&0x7F) == SATK_ALPHA_IDENTIFIER_TAG) {
4170 rv = _sat_decode_alpha_identifier_tlv(o_cmd_data, o_length, index, &sat_cmd_ind_data->data.launch_browser.user_confirm_alpha_id, &data_len_consumed);
4171 if (rv != TCORE_SAT_SUCCESS) {
4174 if (index + data_len_consumed >= o_length) {
4175 dbg("[SAT] SAT PARSER - No more TLVs to decode, decoding done.");
4176 return TCORE_SAT_SUCCESS;
4178 index+=data_len_consumed;
4180 dbg("[SAT] SAT PARSER - No Alpha ID TLV.");
4183 //icon identifier - optional
4184 if ((cmd_data[index] & 0x7F) == SATK_ICON_IDENTIFIER_TAG) {
4185 data_len_consumed = 0;
4186 rv = _sat_decode_icon_identifier_tlv(o_cmd_data, o_length, index,
4187 &sat_cmd_ind_data->data.launch_browser.user_confirm_icon_id, &data_len_consumed);
4189 if (rv != TCORE_SAT_SUCCESS) {
4190 return TCORE_SAT_COMMAND_NOT_UNDERSTOOD;
4193 if (index + data_len_consumed >= o_length) {
4194 dbg("[SAT] SAT PARSER - no more TLVs to decode.");
4195 return TCORE_SAT_SUCCESS;
4197 index += data_len_consumed; //index pointing to the Tag of next TLV
4200 //ToDo: Text Attribute, Frame Identifier
4201 dbg("[SAT] SAT PARSER - :decoding done!.");
4202 return TCORE_SAT_SUCCESS;
4205 //6.4.27 OPEN CHANNEL
4206 static enum tcore_sat_result _sat_decode_open_channel(unsigned char* o_cmd_data, int o_length,
4207 int curr_offset, struct tcore_sat_proactive_command *sat_cmd_ind_data)
4210 gboolean b_1st_duration = FALSE;
4211 int bearer_desc_len =0, data_len_consumed=0;
4212 unsigned char dev_id[4];
4213 unsigned char* cmd_data = NULL;
4214 enum tcore_sat_result rv = TCORE_SAT_SUCCESS;
4216 if (o_cmd_data == NULL) {
4217 dbg("[SAT] SAT PARSER - o_cmd_data == NULL");
4218 return TCORE_SAT_ERROR_FATAL;
4221 cmd_data = &o_cmd_data[0];
4222 index = curr_offset+2;
4223 sat_cmd_ind_data->data.open_channel.command_detail.cmd_num = cmd_data[index++];
4224 sat_cmd_ind_data->data.open_channel.command_detail.cmd_type = cmd_data[index++];
4226 /** command detail **/
4227 sat_cmd_ind_data->data.open_channel.command_detail.cmd_qualifier.open_channel.immediate_link = FALSE;
4228 sat_cmd_ind_data->data.open_channel.command_detail.cmd_qualifier.open_channel.automatic_reconnection = FALSE;
4229 sat_cmd_ind_data->data.open_channel.command_detail.cmd_qualifier.open_channel.background_mode = FALSE;
4231 if (cmd_data[index]&0x01) {
4232 sat_cmd_ind_data->data.open_channel.command_detail.cmd_qualifier.open_channel.immediate_link = TRUE;
4233 dbg("[SAT] SAT PARSER - Immediate Link Establishment");
4236 if (cmd_data[index]&0x02) {
4237 sat_cmd_ind_data->data.open_channel.command_detail.cmd_qualifier.open_channel.automatic_reconnection = TRUE;
4238 dbg("[SAT] SAT PARSER - Auto Reconnection");
4241 if (cmd_data[index]&0x04) {
4242 sat_cmd_ind_data->data.open_channel.command_detail.cmd_qualifier.open_channel.background_mode = TRUE;
4243 dbg("[SAT] SAT PARSER - Background mode");
4248 memcpy(dev_id,&cmd_data[index],4);
4249 rv = _sat_decode_device_identities_tlv(dev_id, &sat_cmd_ind_data->data.open_channel.device_id);
4250 if (rv != TCORE_SAT_SUCCESS)
4253 //alpha identifier - optional
4255 if ((cmd_data[index]&0x7F) == SATK_ALPHA_IDENTIFIER_TAG) {
4256 rv = _sat_decode_alpha_identifier_tlv(o_cmd_data, o_length, index, &sat_cmd_ind_data->data.open_channel.alpha_id, &data_len_consumed);
4257 if (rv != TCORE_SAT_SUCCESS) {
4260 index+=data_len_consumed;
4263 //icon id - optional
4264 if ((cmd_data[index]&0x7F) == SATK_ICON_IDENTIFIER_TAG) {
4265 data_len_consumed = 0;
4266 rv = _sat_decode_icon_identifier_tlv(o_cmd_data, o_length, index, &sat_cmd_ind_data->data.open_channel.icon_id, &data_len_consumed);
4267 if (rv != TCORE_SAT_SUCCESS) {
4268 return rv; //SEND TR
4270 index+=data_len_consumed; //index pointing to the Tag of next TLV
4273 //bearer description
4274 rv =_sat_decode_bearer_description_tlv(o_cmd_data, o_length, index, &sat_cmd_ind_data->data.open_channel.bearer_desc, &data_len_consumed);
4275 bearer_desc_len = data_len_consumed;
4276 if (rv != TCORE_SAT_SUCCESS)
4278 //TODO UICC SERVER MODE
4280 switch(sat_cmd_ind_data->data.open_channel.bearer_desc.bearer_type) {
4284 rv = _sat_decode_address_tlv(o_cmd_data, o_length, index, &sat_cmd_ind_data->data.open_channel.bearer_detail.cs_bearer.address, &data_len_consumed);
4285 if (rv != TCORE_SAT_SUCCESS) {
4288 index+=data_len_consumed;
4290 //sub address - optional
4291 if ((cmd_data[index]&0x7F) == SATK_SUB_ADDRESS_TAG) {
4292 data_len_consumed = 0;
4293 rv = _sat_decode_subaddress_tlv(o_cmd_data, o_length, index, &sat_cmd_ind_data->data.open_channel.bearer_detail.cs_bearer.subaddress, &data_len_consumed);
4294 if (rv != TCORE_SAT_SUCCESS) {
4297 index+=data_len_consumed;
4300 //time duration 1- optional
4301 if ((cmd_data[index]&0x7F)==SATK_DURATION_TAG) {
4302 data_len_consumed = 0;
4303 rv =_sat_decode_duration_tlv(o_cmd_data, o_length, index, &sat_cmd_ind_data->data.open_channel.bearer_detail.cs_bearer.duration1, &data_len_consumed);
4304 if (rv != TCORE_SAT_SUCCESS) {
4305 return rv; //SEND TR
4307 index+=data_len_consumed;
4308 b_1st_duration = TRUE;
4311 //time duration 2- optional
4312 if ((cmd_data[index]&0x7F)==SATK_DURATION_TAG) {
4314 if (!b_1st_duration) {
4315 dbg("duration 1 does not present!");
4316 return TCORE_SAT_COMMAND_NOT_UNDERSTOOD;
4319 data_len_consumed = 0;
4320 rv =_sat_decode_duration_tlv(o_cmd_data, o_length, index, &sat_cmd_ind_data->data.open_channel.bearer_detail.cs_bearer.duration2, &data_len_consumed);
4321 if (rv != TCORE_SAT_SUCCESS) {
4322 return rv; //SEND TR
4324 index+=data_len_consumed;
4327 //bearer description - already did it
4328 index+=bearer_desc_len;
4331 rv =_sat_decode_buffer_size_tlv(o_cmd_data, o_length, index, &sat_cmd_ind_data->data.open_channel.buffer_size, &data_len_consumed);
4332 if (rv != TCORE_SAT_SUCCESS) {
4333 return rv; //SEND TR
4336 index+=data_len_consumed;
4337 if (index >= o_length) {
4338 dbg("[SAT] SAT PARSER - no more TLVs to decode.");
4339 return TCORE_SAT_SUCCESS;
4342 //other address - optional
4343 if ((cmd_data[index]&0x7F)==SATK_OTHER_ADDRESS_TAG) {
4344 data_len_consumed = 0;
4345 rv =_sat_decode_other_address_tlv(o_cmd_data, o_length, index, &sat_cmd_ind_data->data.open_channel.bearer_detail.cs_bearer.other_address, &data_len_consumed);
4346 if (rv != TCORE_SAT_SUCCESS) {
4347 return rv; //SEND TR
4350 index+=data_len_consumed;
4351 if (index >= o_length) {
4352 dbg("[SAT] SAT PARSER - no more TLVs to decode.");
4353 return TCORE_SAT_SUCCESS;
4357 //text string - user login - optional
4358 if ((cmd_data[index]&0x7F)==SATK_TEXT_STRING_TAG) {
4359 data_len_consumed = 0;
4360 rv = _sat_decode_text_tlv(o_cmd_data, o_length, index, &sat_cmd_ind_data->data.open_channel.bearer_detail.cs_bearer.text_user_login, &data_len_consumed);
4361 if (rv != TCORE_SAT_SUCCESS)
4364 index+=data_len_consumed;
4365 if (index >= o_length) {
4366 dbg("[SAT] SAT PARSER - no more TLVs to decode.");
4367 return TCORE_SAT_SUCCESS;
4371 //text string - user password - optional
4372 if ((cmd_data[index]&0x7F)==SATK_TEXT_STRING_TAG) {
4373 data_len_consumed = 0;
4374 rv = _sat_decode_text_tlv(o_cmd_data, o_length, index, &sat_cmd_ind_data->data.open_channel.bearer_detail.cs_bearer.text_user_pwd, &data_len_consumed);
4375 if (rv != TCORE_SAT_SUCCESS)
4378 index+=data_len_consumed;
4379 if (index >= o_length) {
4380 dbg("[SAT] SAT PARSER - no more TLVs to decode.");
4381 return TCORE_SAT_SUCCESS;
4385 //UICC/TERMINAL interface transport level - optional
4386 if ((cmd_data[index]&0x7F)==SATK_USIM_ME_INTERFACE_TRANSPORT_LEVEL_TAG) {
4387 data_len_consumed = 0;
4388 rv = _sat_decode_uicc_terminal_interface_tlv(o_cmd_data, o_length, index, &sat_cmd_ind_data->data.open_channel.interface_transport_level, &data_len_consumed);
4389 if (rv != TCORE_SAT_SUCCESS)
4392 index+=data_len_consumed;
4393 if (index >= o_length) {
4394 dbg("[SAT] SAT PARSER - no more TLVs to decode.");
4395 return TCORE_SAT_SUCCESS;
4399 //destination address - optional
4400 if ((cmd_data[index]&0x7F)==SATK_OTHER_ADDRESS_TAG) {
4401 data_len_consumed = 0;
4402 rv =_sat_decode_other_address_tlv(o_cmd_data, o_length, index, &sat_cmd_ind_data->data.open_channel.data_destination_address, &data_len_consumed);
4403 if (rv != TCORE_SAT_SUCCESS) {
4404 return rv; //SEND TR
4407 index+=data_len_consumed;
4408 if (index >= o_length) {
4409 dbg("[SAT] SAT PARSER - no more TLVs to decode.");
4410 return TCORE_SAT_SUCCESS;
4416 //bearer description - already did it
4417 index+=bearer_desc_len;
4420 rv =_sat_decode_buffer_size_tlv(o_cmd_data, o_length, index, &sat_cmd_ind_data->data.open_channel.buffer_size, &data_len_consumed);
4421 if (rv != TCORE_SAT_SUCCESS) {
4422 return rv; //SEND TR
4425 index+=data_len_consumed;
4426 if (index >= o_length) {
4427 dbg("[SAT] SAT PARSER - no more TLVs to decode.");
4428 return TCORE_SAT_SUCCESS;
4431 //Network Access Name - optional
4432 if ((cmd_data[index]&0x7F)==SATK_NETWORK_ACCESS_TAG) {
4433 data_len_consumed = 0;
4434 rv =_sat_decode_network_access_name_tlv(o_cmd_data, o_length, index, &sat_cmd_ind_data->data.open_channel.bearer_detail.ps_bearer.network_access_name, &data_len_consumed);
4435 if (rv != TCORE_SAT_SUCCESS) {
4436 return rv; //SEND TR
4439 index+=data_len_consumed;
4440 if (index >= o_length) {
4441 dbg("[SAT] SAT PARSER - no more TLVs to decode.");
4442 return TCORE_SAT_SUCCESS;
4446 //other address - optional
4447 if ((cmd_data[index]&0x7F)==SATK_OTHER_ADDRESS_TAG) {
4448 data_len_consumed = 0;
4449 rv =_sat_decode_other_address_tlv(o_cmd_data, o_length, index, &sat_cmd_ind_data->data.open_channel.bearer_detail.ps_bearer.other_address, &data_len_consumed);
4450 if (rv != TCORE_SAT_SUCCESS) {
4451 return rv; //SEND TR
4454 index+=data_len_consumed;
4455 if (index >= o_length) {
4456 dbg("[SAT] SAT PARSER - no more TLVs to decode.");
4457 return TCORE_SAT_SUCCESS;
4461 //text string - user login - optional
4462 if ((cmd_data[index]&0x7F)==SATK_TEXT_STRING_TAG) {
4463 data_len_consumed = 0;
4464 rv = _sat_decode_text_tlv(o_cmd_data, o_length, index, &sat_cmd_ind_data->data.open_channel.bearer_detail.ps_bearer.text_user_login, &data_len_consumed);
4465 if (rv != TCORE_SAT_SUCCESS)
4468 index+=data_len_consumed;
4469 if (index >= o_length) {
4470 dbg("[SAT] SAT PARSER - no more TLVs to decode.");
4471 return TCORE_SAT_SUCCESS;
4475 //text string - user password - optional
4476 if ((cmd_data[index]&0x7F)==SATK_TEXT_STRING_TAG) {
4477 data_len_consumed = 0;
4478 rv = _sat_decode_text_tlv(o_cmd_data, o_length, index, &sat_cmd_ind_data->data.open_channel.bearer_detail.ps_bearer.text_user_pwd, &data_len_consumed);
4479 if (rv != TCORE_SAT_SUCCESS)
4482 index+=data_len_consumed;
4483 if (index >= o_length) {
4484 dbg("[SAT] SAT PARSER - no more TLVs to decode.");
4485 return TCORE_SAT_SUCCESS;
4489 //UICC/TERMINAL interface transport level - optional
4490 if ((cmd_data[index]&0x7F)==SATK_USIM_ME_INTERFACE_TRANSPORT_LEVEL_TAG) {
4491 data_len_consumed = 0;
4492 rv = _sat_decode_uicc_terminal_interface_tlv(o_cmd_data, o_length, index, &sat_cmd_ind_data->data.open_channel.interface_transport_level, &data_len_consumed);
4493 if (rv != TCORE_SAT_SUCCESS)
4496 index+=data_len_consumed;
4497 if (index >= o_length) {
4498 dbg("[SAT] SAT PARSER - no more TLVs to decode.");
4499 return TCORE_SAT_SUCCESS;
4503 dbg("the value (0x%x) after interface transport level", cmd_data[index]&0x7F);
4505 //destination address - optional
4506 if ((cmd_data[index]&0x7F)==SATK_OTHER_ADDRESS_TAG) {
4507 data_len_consumed = 0;
4508 rv =_sat_decode_other_address_tlv(o_cmd_data, o_length, index, &sat_cmd_ind_data->data.open_channel.data_destination_address, &data_len_consumed);
4509 if (rv != TCORE_SAT_SUCCESS) {
4510 return rv; //SEND TR
4513 index+=data_len_consumed;
4514 if (index >= o_length) {
4515 dbg("[SAT] SAT PARSER - no more TLVs to decode.");
4516 return TCORE_SAT_SUCCESS;
4521 case BEARER_DEFAULT_BEARER_FROM_TRANSPORT_LAYER:
4522 //bearer description - already did it
4523 index+=bearer_desc_len;
4526 rv =_sat_decode_buffer_size_tlv(o_cmd_data, o_length, index, &sat_cmd_ind_data->data.open_channel.buffer_size, &data_len_consumed);
4527 if (rv != TCORE_SAT_SUCCESS) {
4528 return rv; //SEND TR
4531 index+=data_len_consumed;
4532 if (index >= o_length) {
4533 dbg("[SAT] SAT PARSER - no more TLVs to decode.");
4534 return TCORE_SAT_SUCCESS;
4537 //other address - optional
4538 if ((cmd_data[index]&0x7F)==SATK_OTHER_ADDRESS_TAG) {
4539 data_len_consumed = 0;
4540 rv =_sat_decode_other_address_tlv(o_cmd_data, o_length, index, &sat_cmd_ind_data->data.open_channel.bearer_detail.default_bearer.other_address, &data_len_consumed);
4541 if (rv != TCORE_SAT_SUCCESS) {
4542 return rv; //SEND TR
4545 index+=data_len_consumed;
4546 if (index >= o_length) {
4547 dbg("[SAT] SAT PARSER - no more TLVs to decode.");
4548 return TCORE_SAT_SUCCESS;
4552 //text string - user login - optional
4553 if ((cmd_data[index]&0x7F)==SATK_TEXT_STRING_TAG) {
4554 data_len_consumed = 0;
4555 rv = _sat_decode_text_tlv(o_cmd_data, o_length, index, &sat_cmd_ind_data->data.open_channel.bearer_detail.default_bearer.text_user_login, &data_len_consumed);
4556 if (rv != TCORE_SAT_SUCCESS)
4559 index+=data_len_consumed;
4560 if (index >= o_length) {
4561 dbg("[SAT] SAT PARSER - no more TLVs to decode.");
4562 return TCORE_SAT_SUCCESS;
4566 //text string - user password - optional
4567 if ((cmd_data[index]&0x7F)==SATK_TEXT_STRING_TAG) {
4568 data_len_consumed = 0;
4569 rv = _sat_decode_text_tlv(o_cmd_data, o_length, index, &sat_cmd_ind_data->data.open_channel.bearer_detail.default_bearer.text_user_pwd, &data_len_consumed);
4570 if (rv != TCORE_SAT_SUCCESS)
4573 index+=data_len_consumed;
4574 if (index >= o_length) {
4575 dbg("[SAT] SAT PARSER - no more TLVs to decode.");
4576 return TCORE_SAT_SUCCESS;
4580 //UICC/TERMINAL interface transport level - optional
4581 if ((cmd_data[index]&0x7F)==SATK_USIM_ME_INTERFACE_TRANSPORT_LEVEL_TAG) {
4582 data_len_consumed = 0;
4583 rv = _sat_decode_uicc_terminal_interface_tlv(o_cmd_data, o_length, index, &sat_cmd_ind_data->data.open_channel.interface_transport_level, &data_len_consumed);
4584 if (rv != TCORE_SAT_SUCCESS)
4587 index+=data_len_consumed;
4588 if (index >= o_length) {
4589 dbg("[SAT] SAT PARSER - no more TLVs to decode.");
4590 return TCORE_SAT_SUCCESS;
4594 //destination address - optional
4595 if ((cmd_data[index]&0x7F)==SATK_OTHER_ADDRESS_TAG) {
4596 data_len_consumed = 0;
4597 rv =_sat_decode_other_address_tlv(o_cmd_data, o_length, index, &sat_cmd_ind_data->data.open_channel.data_destination_address, &data_len_consumed);
4598 if (rv != TCORE_SAT_SUCCESS) {
4599 return rv; //SEND TR
4602 index+=data_len_consumed;
4603 if (index >= o_length) {
4604 dbg("[SAT] SAT PARSER - no more TLVs to decode.");
4605 return TCORE_SAT_SUCCESS;
4610 case BEARER_LOCAL_LINK_TECHNOLOGY_INDEPENDENT:
4612 //time duration 1- optional
4613 if ((cmd_data[index]&0x7F)==SATK_DURATION_TAG) {
4614 data_len_consumed = 0;
4615 rv =_sat_decode_duration_tlv(o_cmd_data, o_length, index, &sat_cmd_ind_data->data.open_channel.bearer_detail.local_bearer.duration1, &data_len_consumed);
4616 if (rv != TCORE_SAT_SUCCESS) {
4617 return rv; //SEND TR
4619 index+=data_len_consumed;
4620 b_1st_duration = TRUE;
4623 //time duration 2- optional
4624 if ((cmd_data[index]&0x7F)==SATK_DURATION_TAG) {
4626 if (!b_1st_duration) {
4627 dbg("duration 1 does not present!");
4628 return TCORE_SAT_COMMAND_NOT_UNDERSTOOD;
4631 data_len_consumed = 0;
4632 rv =_sat_decode_duration_tlv(o_cmd_data, o_length, index, &sat_cmd_ind_data->data.open_channel.bearer_detail.local_bearer.duration2, &data_len_consumed);
4633 if (rv != TCORE_SAT_SUCCESS) {
4634 return rv; //SEND TR
4636 index+=data_len_consumed;
4639 //bearer description - already did it
4640 index+=bearer_desc_len;
4643 rv =_sat_decode_buffer_size_tlv(o_cmd_data, o_length, index, &sat_cmd_ind_data->data.open_channel.buffer_size, &data_len_consumed);
4644 if (rv != TCORE_SAT_SUCCESS) {
4645 return rv; //SEND TR
4648 index+=data_len_consumed;
4649 if (index >= o_length) {
4650 dbg("[SAT] SAT PARSER - no more TLVs to decode.");
4651 return TCORE_SAT_SUCCESS;
4654 //text string - user password - optional
4655 if ((cmd_data[index]&0x7F)==SATK_TEXT_STRING_TAG) {
4656 data_len_consumed = 0;
4657 rv = _sat_decode_text_tlv(o_cmd_data, o_length, index, &sat_cmd_ind_data->data.open_channel.bearer_detail.local_bearer.text_user_pwd, &data_len_consumed);
4658 if (rv != TCORE_SAT_SUCCESS)
4661 index+=data_len_consumed;
4662 if (index >= o_length) {
4663 dbg("[SAT] SAT PARSER - no more TLVs to decode.");
4664 return TCORE_SAT_SUCCESS;
4668 //UICC/TERMINAL interface transport level - optional
4669 if ((cmd_data[index]&0x7F)==SATK_USIM_ME_INTERFACE_TRANSPORT_LEVEL_TAG) {
4670 data_len_consumed = 0;
4671 rv = _sat_decode_uicc_terminal_interface_tlv(o_cmd_data, o_length, index, &sat_cmd_ind_data->data.open_channel.interface_transport_level, &data_len_consumed);
4672 if (rv != TCORE_SAT_SUCCESS)
4675 index+=data_len_consumed;
4676 if (index >= o_length) {
4677 dbg("[SAT] SAT PARSER - no more TLVs to decode.");
4678 return TCORE_SAT_SUCCESS;
4682 //destination address - optional
4683 if ((cmd_data[index]&0x7F)==SATK_OTHER_ADDRESS_TAG) {
4684 data_len_consumed = 0;
4685 rv =_sat_decode_other_address_tlv(o_cmd_data, o_length, index, &sat_cmd_ind_data->data.open_channel.data_destination_address, &data_len_consumed);
4686 if (rv != TCORE_SAT_SUCCESS) {
4687 return rv; //SEND TR
4690 index+=data_len_consumed;
4691 if (index >= o_length) {
4692 dbg("[SAT] SAT PARSER - no more TLVs to decode.");
4693 return TCORE_SAT_SUCCESS;
4697 //remote entity address - optional
4698 if ((cmd_data[index]&0x7F)==SATK_REMOTE_ENTITY_ADDRESS_TAG) {
4699 data_len_consumed = 0;
4700 rv =_sat_decode_remote_entity_address_tlv(o_cmd_data, o_length, index, &sat_cmd_ind_data->data.open_channel.bearer_detail.local_bearer.remote_entity_address, &data_len_consumed);
4701 if (rv != TCORE_SAT_SUCCESS) {
4702 return rv; //SEND TR
4705 index+=data_len_consumed;
4706 if (index >= o_length) {
4707 dbg("[SAT] SAT PARSER - no more TLVs to decode.");
4708 return TCORE_SAT_SUCCESS;
4717 dbg("[SAT] SAT PARSER - :decoding done!.");
4718 return TCORE_SAT_SUCCESS;
4721 //6.4.28 CLOSE CHANNEL
4722 static enum tcore_sat_result _sat_decode_close_channel(unsigned char* o_cmd_data, int o_length,
4723 int curr_offset, struct tcore_sat_proactive_command *sat_cmd_ind_data)
4726 int data_len_consumed=0;
4727 unsigned char dev_id[4];
4728 unsigned char* cmd_data = NULL;
4729 enum tcore_sat_result rv = TCORE_SAT_SUCCESS;
4731 if (o_cmd_data == NULL) {
4732 dbg("[SAT] SAT PARSER - o_cmd_data == NULL");
4733 return TCORE_SAT_ERROR_FATAL;
4736 cmd_data = &o_cmd_data[0];
4737 index = curr_offset+2;
4738 sat_cmd_ind_data->data.close_channel.command_detail.cmd_num = cmd_data[index++];
4739 sat_cmd_ind_data->data.close_channel.command_detail.cmd_type = cmd_data[index++];
4741 /** command detail **/
4745 memcpy(dev_id,&cmd_data[index],4);
4746 rv = _sat_decode_device_identities_tlv(dev_id, &sat_cmd_ind_data->data.close_channel.device_id);
4747 if (rv != TCORE_SAT_SUCCESS)
4750 //alpha identifier - optional
4752 if ((cmd_data[index]&0x7F) == SATK_ALPHA_IDENTIFIER_TAG) {
4753 rv = _sat_decode_alpha_identifier_tlv(o_cmd_data, o_length, index, &sat_cmd_ind_data->data.close_channel.alpha_id, &data_len_consumed);
4754 if (rv != TCORE_SAT_SUCCESS) {
4757 index+=data_len_consumed;
4760 //icon id - optional
4761 if ((cmd_data[index]&0x7F) == SATK_ICON_IDENTIFIER_TAG) {
4762 data_len_consumed = 0;
4763 rv = _sat_decode_icon_identifier_tlv(o_cmd_data, o_length, index, &sat_cmd_ind_data->data.close_channel.icon_id, &data_len_consumed);
4764 if (rv != TCORE_SAT_SUCCESS) {
4765 return rv; //SEND TR
4767 index+=data_len_consumed; //index pointing to the Tag of next TLV
4770 //ToDo: Text Attribute and frames
4772 dbg("[SAT] SAT PARSER - :decoding done!.");
4773 return TCORE_SAT_SUCCESS;
4776 //6.4.29 RECEIVE DATA
4777 static enum tcore_sat_result _sat_decode_receive_data(unsigned char* o_cmd_data, int o_length,
4778 int curr_offset, struct tcore_sat_proactive_command *sat_cmd_ind_data)
4781 int data_len_consumed=0;
4782 unsigned char dev_id[4];
4783 unsigned char* cmd_data = NULL;
4784 enum tcore_sat_result rv = TCORE_SAT_SUCCESS;
4786 if (o_cmd_data == NULL) {
4787 dbg("[SAT] SAT PARSER - o_cmd_data == NULL");
4788 return TCORE_SAT_ERROR_FATAL;
4791 cmd_data = &o_cmd_data[0];
4792 index = curr_offset+2;
4793 sat_cmd_ind_data->data.receive_data.command_detail.cmd_num = cmd_data[index++];
4794 sat_cmd_ind_data->data.receive_data.command_detail.cmd_type = cmd_data[index++];
4796 /** command detail **/
4800 memcpy(dev_id,&cmd_data[index],4);
4801 rv = _sat_decode_device_identities_tlv(dev_id, &sat_cmd_ind_data->data.receive_data.device_id);
4802 if (rv != TCORE_SAT_SUCCESS)
4805 //alpha identifier - optional
4807 if ((cmd_data[index]&0x7F) == SATK_ALPHA_IDENTIFIER_TAG) {
4808 rv = _sat_decode_alpha_identifier_tlv(o_cmd_data, o_length, index, &sat_cmd_ind_data->data.receive_data.alpha_id, &data_len_consumed);
4809 if (rv != TCORE_SAT_SUCCESS) {
4812 index+=data_len_consumed;
4815 //icon id - optional
4816 if ((cmd_data[index]&0x7F) == SATK_ICON_IDENTIFIER_TAG) {
4817 data_len_consumed = 0;
4818 rv = _sat_decode_icon_identifier_tlv(o_cmd_data, o_length, index, &sat_cmd_ind_data->data.receive_data.icon_id, &data_len_consumed);
4819 if (rv != TCORE_SAT_SUCCESS) {
4820 return rv; //SEND TR
4822 index+=data_len_consumed; //index pointing to the Tag of next TLV
4825 //channel data length
4826 rv =_sat_decode_channel_data_length_tlv(o_cmd_data, o_length, index, &sat_cmd_ind_data->data.receive_data.channel_data_len, &data_len_consumed);
4827 if (rv != TCORE_SAT_SUCCESS) {
4828 return rv; //SEND TR
4831 //ToDo: Text Attribute and frames
4833 dbg("[SAT] SAT PARSER - :decoding done!.");
4834 return TCORE_SAT_SUCCESS;
4838 static enum tcore_sat_result _sat_decode_send_data(unsigned char* o_cmd_data, int o_length,
4839 int curr_offset, struct tcore_sat_proactive_command *sat_cmd_ind_data)
4842 int data_len_consumed=0;
4843 unsigned char dev_id[4];
4844 unsigned char* cmd_data = NULL;
4845 enum tcore_sat_result rv = TCORE_SAT_SUCCESS;
4847 if (o_cmd_data == NULL) {
4848 dbg("[SAT] SAT PARSER - o_cmd_data == NULL");
4849 return TCORE_SAT_ERROR_FATAL;
4852 cmd_data = &o_cmd_data[0];
4853 index = curr_offset+2;
4854 sat_cmd_ind_data->data.send_data.command_detail.cmd_num = cmd_data[index++];
4855 sat_cmd_ind_data->data.send_data.command_detail.cmd_type = cmd_data[index++];
4857 /** command detail **/
4858 sat_cmd_ind_data->data.send_data.command_detail.cmd_qualifier.send_data.send_data_immediately = FALSE;
4859 if (cmd_data[index]&0x01) {
4860 sat_cmd_ind_data->data.send_data.command_detail.cmd_qualifier.send_data.send_data_immediately = TRUE;
4861 dbg("[SAT] SAT PARSER - Send data immediately");
4866 memcpy(dev_id,&cmd_data[index],4);
4867 rv = _sat_decode_device_identities_tlv(dev_id, &sat_cmd_ind_data->data.send_data.device_id);
4868 if (rv != TCORE_SAT_SUCCESS)
4871 //alpha identifier - optional
4873 if ((cmd_data[index]&0x7F) == SATK_ALPHA_IDENTIFIER_TAG) {
4874 rv = _sat_decode_alpha_identifier_tlv(o_cmd_data, o_length, index, &sat_cmd_ind_data->data.send_data.alpha_id, &data_len_consumed);
4875 if (rv != TCORE_SAT_SUCCESS) {
4878 index+=data_len_consumed;
4881 //icon id - optional
4882 if ((cmd_data[index]&0x7F) == SATK_ICON_IDENTIFIER_TAG) {
4883 data_len_consumed = 0;
4884 rv = _sat_decode_icon_identifier_tlv(o_cmd_data, o_length, index, &sat_cmd_ind_data->data.send_data.icon_id, &data_len_consumed);
4885 if (rv != TCORE_SAT_SUCCESS) {
4886 return rv; //SEND TR
4888 index+=data_len_consumed; //index pointing to the Tag of next TLV
4892 rv =_sat_decode_channel_data_tlv(o_cmd_data, o_length, index, &sat_cmd_ind_data->data.send_data.channel_data, &data_len_consumed);
4893 if (rv != TCORE_SAT_SUCCESS) {
4894 return rv; //SEND TR
4897 //ToDo: Text Attribute and frames
4899 dbg("[SAT] SAT PARSER - :decoding done!.");
4900 return TCORE_SAT_SUCCESS;
4903 //6.4.31 GET CHANNEL STATUS
4904 static enum tcore_sat_result _sat_decode_get_channel_status(unsigned char* o_cmd_data, int o_length,
4905 int curr_offset, struct tcore_sat_proactive_command *sat_cmd_ind_data)
4908 unsigned char dev_id[4];
4909 unsigned char* cmd_data = NULL;
4910 enum tcore_sat_result rv = TCORE_SAT_SUCCESS;
4912 if (o_cmd_data == NULL) {
4913 dbg("[SAT] SAT PARSER - o_cmd_data == NULL");
4914 return TCORE_SAT_ERROR_FATAL;
4917 cmd_data = &o_cmd_data[0];
4918 index = curr_offset+2;
4919 sat_cmd_ind_data->data.get_channel_status.command_detail.cmd_num = cmd_data[index++];
4920 sat_cmd_ind_data->data.get_channel_status.command_detail.cmd_type = cmd_data[index++];
4922 /** command detail **/
4926 memcpy(dev_id,&cmd_data[index],4);
4927 rv = _sat_decode_device_identities_tlv(dev_id, &sat_cmd_ind_data->data.get_channel_status.device_id);
4928 if (rv != TCORE_SAT_SUCCESS)
4931 dbg("[SAT] SAT PARSER - :decoding done!.");
4932 return TCORE_SAT_SUCCESS;
4935 int tcore_sat_decode_proactive_command(unsigned char* tlv_origin, unsigned int tlv_length,
4936 struct tcore_sat_proactive_command* decoded_tlv)
4938 unsigned int index = 0;
4939 int length_field_len = 0;
4940 enum tcore_sat_result rv = TCORE_SAT_SUCCESS;
4942 if (tlv_origin == NULL || tlv_length <=2) {
4943 dbg("[SAT] SAT PARSER - pointer pData passed is NULL or invalid length.");
4944 return TCORE_SAT_ERROR_FATAL;
4948 if (tlv_origin[index++]!= SATK_PROACTIVE_CMD_TAG) {
4949 dbg("[SAT] SAT PARSER - Did not find Proactive command tag.tag=%d", tlv_origin[index-1]);
4950 return TCORE_SAT_ERROR_FATAL;
4954 length_field_len = _get_length_filed_size(tlv_origin[index]);
4955 if (length_field_len == 0) {
4956 dbg("[SAT] SAT PARSER - Invalid length.");
4957 return TCORE_SAT_ERROR_FATAL;
4960 index+=length_field_len;
4962 //check command validation
4963 if (tlv_length < index+5+4)//command detail(5) and device identities(4)
4964 return TCORE_SAT_ERROR_FATAL;
4966 //check comprehensive value
4967 if ((tlv_origin[index] | 0x7F) != 0x7F) {
4968 dbg("comprehensive value 0x%x", tlv_origin[index] | 0x7F);
4969 b_comprehensive = TRUE;
4972 if ( (tlv_origin[index] & 0x7F) != SATK_COMMAND_DETAILS_TAG) {
4973 err("[SAT] no command detail info");
4974 return TCORE_SAT_ERROR_FATAL;
4977 if ( tlv_origin[index+1] != SATK_COMMAND_DETAILS_LENGTH) {
4978 err("[SAT] invalid command detail length");
4979 return TCORE_SAT_ERROR_FATAL;
4982 decoded_tlv->cmd_num= tlv_origin[index+2];
4983 decoded_tlv->cmd_type = tlv_origin[index+3];
4985 switch(decoded_tlv->cmd_type) {
4986 case SAT_PROATV_CMD_DISPLAY_TEXT: //6.4.1
4987 dbg("[SAT] SAT PARSER - SAT_CMD_TYPE_DISPLAY_TEXT");
4988 rv = _sat_decode_display_text(tlv_origin, tlv_length, index, decoded_tlv);
4990 case SAT_PROATV_CMD_GET_INKEY: //6.4.2
4991 dbg("[SAT] SAT PARSER - SAT_CMD_TYPE_GET_INKEY");
4992 rv = _sat_decode_get_inkey(tlv_origin, tlv_length, index, decoded_tlv);
4994 case SAT_PROATV_CMD_GET_INPUT: //6.4.3
4995 dbg("[SAT] SAT PARSER - SAT_CMD_TYPE_GET_INPUT");
4996 rv = _sat_decode_get_input(tlv_origin, tlv_length, index, decoded_tlv);
4998 case SAT_PROATV_CMD_MORE_TIME: //6.4.4
4999 dbg("[SAT] SAT PARSER - SAT_CMD_TYPE_MORE_TIME");
5000 rv = _sat_decode_more_time(tlv_origin, tlv_length, index, decoded_tlv);
5002 case SAT_PROATV_CMD_PLAY_TONE: //6.4.5
5003 dbg("[SAT] SAT PARSER - SAT_CMD_TYPE_PLAY TONE");
5004 rv = _sat_decode_play_tone(tlv_origin, tlv_length, index, decoded_tlv);
5006 //case POLL INTERVAL //6.4.6 processing by cp
5007 case SAT_PROATV_CMD_REFRESH: //6.4.7
5008 dbg("[SAT] SAT PARSER - SAT_CMD_TYPE_REFRESH");
5009 rv = _sat_decode_refresh(tlv_origin, tlv_length, index, decoded_tlv);
5011 case SAT_PROATV_CMD_SETUP_MENU: //6.4.8
5012 dbg("[SAT] SAT PARSER - SAT_PROATV_CMD_SETUP_MENU");
5013 rv = _sat_decode_setup_menu(tlv_origin, tlv_length, index, decoded_tlv);
5015 case SAT_PROATV_CMD_SELECT_ITEM: //6.4.9
5016 dbg("[SAT] SAT PARSER - SAT_CMD_TYPE_SELECT_ITEM");
5017 rv = _sat_decode_select_item(tlv_origin, tlv_length, index, decoded_tlv);
5019 case SAT_PROATV_CMD_SEND_SMS: //6.4.10
5020 dbg("[SAT] SAT PARSER - SAT_CMD_TYPE_SEND_SMS");
5021 rv = _sat_decode_send_sms(tlv_origin, tlv_length, index, decoded_tlv);
5023 case SAT_PROATV_CMD_SEND_SS: //6.4.11
5024 dbg("[SAT] SAT PARSER - SAT_CMD_TYPE_SEND_SS");
5025 rv = _sat_decode_send_ss(tlv_origin, tlv_length, index, decoded_tlv);
5027 case SAT_PROATV_CMD_SEND_USSD: //6.4.12
5028 dbg("[SAT] SAT PARSER - SAT_CMD_TYPE_SEND_USSD");
5029 rv = _sat_decode_send_ussd(tlv_origin, tlv_length, index, decoded_tlv);
5031 case SAT_PROATV_CMD_SETUP_CALL: //6.4.13
5032 dbg("[SAT] SAT PARSER - SAT_CMD_TYPE_SETUP_CALL");
5033 rv = _sat_decode_setup_call(tlv_origin, tlv_length, index, decoded_tlv);
5035 case SAT_PROATV_CMD_PROVIDE_LOCAL_INFO: //6.4.15
5036 dbg("[SAT] SAT PARSER - SAT_PROATV_CMD_PROVIDE_LOCAL_INFO");
5037 rv = _sat_decode_provide_local_info(tlv_origin, tlv_length, index, decoded_tlv);
5039 case SAT_PROATV_CMD_SETUP_EVENT_LIST: //6.4.16
5040 dbg("[SAT] SAT PARSER - SAT_CMD_TYPE_SETUP_EVENT_LIST");
5041 rv = _sat_decode_setup_event_list(tlv_origin, tlv_length, index, decoded_tlv);
5043 case SAT_PROATV_CMD_SETUP_IDLE_MODE_TEXT: //6.4.22
5044 dbg("[SAT] SAT PARSER - SAT_PROATV_CMD_SETUP_IDLE_MODE_TEXT");
5045 rv = _sat_decode_setup_idle_mode_text(tlv_origin, tlv_length, index, decoded_tlv);
5047 case SAT_PROATV_CMD_SEND_DTMF: //6.4.24
5048 dbg("[SAT] SAT PARSER - SAT_PROATV_CMD_SEND_DTMF");
5049 rv = _sat_decode_send_dtmf(tlv_origin, tlv_length, index, decoded_tlv);
5051 case SAT_PROATV_CMD_LANGUAGE_NOTIFICATION: //6.4.25
5052 dbg("[SAT] SAT PARSER - SAT_PROATV_CMD_LANGUAGE_NOTIFICATION");
5053 rv = _sat_decode_language_notification(tlv_origin, tlv_length, index, decoded_tlv);
5055 case SAT_PROATV_CMD_LAUNCH_BROWSER: //6.4.26
5056 dbg("[SAT] SAT PARSER - SAT_PROATV_CMD_LAUNCH_BROWSER");
5057 rv = _sat_decode_launch_browser(tlv_origin, tlv_length, index, decoded_tlv);
5059 case SAT_PROATV_CMD_OPEN_CHANNEL://6.4.27
5060 dbg("[SAT] SAT PARSER - SAT_CMD_TYPE_OPEN_CHANNEL");
5061 rv = _sat_decode_open_channel(tlv_origin, tlv_length, index, decoded_tlv);
5063 case SAT_PROATV_CMD_CLOSE_CHANNEL://6.4.28
5064 dbg("[SAT] SAT PARSER - SAT_CMD_TYPE_CLOSE_CHANNEL");
5065 rv = _sat_decode_close_channel(tlv_origin, tlv_length, index, decoded_tlv);
5067 case SAT_PROATV_CMD_RECEIVE_DATA://6.4.29
5068 dbg("[SAT] SAT PARSER - SAT_CMD_TYPE_RECEIVE_DATA");
5069 rv = _sat_decode_receive_data(tlv_origin, tlv_length, index, decoded_tlv);
5071 case SAT_PROATV_CMD_SEND_DATA://6.4.30
5072 dbg("[SAT] SAT PARSER - SAT_CMD_TYPE_SEND_DATA");
5073 rv = _sat_decode_send_data(tlv_origin, tlv_length, index, decoded_tlv);
5075 case SAT_PROATV_CMD_GET_CHANNEL_STATUS://6.4.31
5076 dbg("[SAT] SAT PARSER - SAT_CMD_TYPE_GET_CHANNEL_STATUS");
5077 rv = _sat_decode_get_channel_status(tlv_origin, tlv_length, index, decoded_tlv);
5080 dbg("[SAT] SAT PARSER - ME cannot perform this command =0x[%02x]", decoded_tlv->cmd_type);
5081 //SEND TR with command not understood by ME, those command that are defined but not implemented by ME should be sent as beyond me's capability.
5082 rv = TCORE_SAT_BEYOND_ME_CAPABILITY;
5086 //return value will be success if the proactive command has been successfuly decoded, then send it to clients.
5087 dbg("[SAT] SAT PARSER - each command parsing done.");
5091 static unsigned char _sat_encode_dcs_tlv(const struct data_coding_scheme* src)
5093 unsigned char rv = 0x00;
5098 if (src->is_compressed_format)
5102 switch(src->m_class) {
5111 case MSG_CLASS_RESERVED:
5112 case MSG_CLASS_NONE:
5119 switch(src->a_format)
5121 case ALPHABET_FORMAT_SMS_DEFAULT:
5125 case ALPHABET_FORMAT_8BIT_DATA:
5129 case ALPHABET_FORMAT_UCS2:
5141 static int _sat_encode_command_detail_tlv(const struct tel_sat_cmd_detail_info* src, char *dst, int current_index)
5143 dst[current_index++] = (b_comprehensive ? (SATK_COMMAND_DETAILS_TAG | 0x80) : SATK_COMMAND_DETAILS_TAG);
5144 dst[current_index++] = SATK_COMMAND_DETAILS_LENGTH;
5145 dst[current_index++] = src->cmd_num;
5146 dst[current_index++] = src->cmd_type;
5147 dst[current_index] = 0x00;
5149 switch(src->cmd_type) {
5150 case SAT_PROATV_CMD_DISPLAY_TEXT:{
5151 //command detail text priority
5152 if (src->cmd_qualifier.display_text.text_priority == TEXT_PRIORITY_HIGH)
5153 dst[current_index] += 0x01;
5155 //command detail text clear type
5156 if (src->cmd_qualifier.display_text.text_clear_type == TEXT_WAIT_FOR_USER_TO_CLEAR_MSG)
5157 dst[current_index] += 0x80;
5159 case SAT_PROATV_CMD_GET_INKEY:{
5160 //command detail alphabet set
5161 if (src->cmd_qualifier.get_inkey.alphabet_set)
5162 dst[current_index] += 0x01;
5164 //command detail alphabet type
5165 if (src->cmd_qualifier.get_inkey.alphabet_type == INPUT_ALPHABET_TYPE_UCS2)
5166 dst[current_index] += 0x02;
5168 //command detail get inkey type
5169 if (src->cmd_qualifier.get_inkey.inkey_type == INKEY_TYPE_YES_NO_REQUESTED)
5170 dst[current_index] += 0x04;
5173 //command detail immediate response required
5174 if (src->cmd_qualifier.get_inkey.immediate_rsp_required)
5175 dst[current_index] += 0x08;
5177 //command detail help available
5178 if (src->cmd_qualifier.get_inkey.help_info)
5179 dst[current_index] += 0x80;
5181 case SAT_PROATV_CMD_GET_INPUT:{
5182 //command detail alphabet set
5183 if (src->cmd_qualifier.get_input.alphabet_set)
5184 dst[current_index] += 0x01;
5186 //command detail alphabet type
5187 if (src->cmd_qualifier.get_input.alphabet_type == INPUT_ALPHABET_TYPE_UCS2)
5188 dst[current_index] += 0x02;
5190 //command detail echo user input
5191 if (!src->cmd_qualifier.get_input.me_echo_user_input)
5192 dst[current_index] += 0x04;
5194 //command detail user input unpacked format
5195 if (!src->cmd_qualifier.get_input.user_input_unpacked_format)
5196 dst[current_index] += 0x08;
5198 //command detail help available
5199 if (src->cmd_qualifier.get_input.help_info)
5200 dst[current_index] += 0x80;
5202 case SAT_PROATV_CMD_MORE_TIME:{
5203 dbg("more time : 1bit RFU");
5205 case SAT_PROATV_CMD_PLAY_TONE:{
5206 //command detail vibration alert
5207 if (src->cmd_qualifier.play_tone.vibration_alert == VIBRATE_ALERT_REQUIRED)
5208 dst[current_index] += 0x01;
5210 case SAT_PROATV_CMD_REFRESH:{
5211 //command detail refresh command
5212 dst[current_index] += src->cmd_qualifier.refresh.refresh;
5214 case SAT_PROATV_CMD_SETUP_MENU:{
5215 //command detail preferences
5216 if (src->cmd_qualifier.setup_menu.select_preference == SELECTION_PREFERENCE_USING_SOFT_KEY)
5217 dst[current_index] += 0x01;
5219 //command detail help available
5220 if (src->cmd_qualifier.setup_menu.help_info)
5221 dst[current_index] += 0x80;
5223 case SAT_PROATV_CMD_SELECT_ITEM:{
5224 //command detail presentation
5225 if (src->cmd_qualifier.select_item.presentation_type != PRESENTATION_TYPE_NOT_SPECIFIED) {
5226 dst[current_index] += 0x01;
5227 if (src->cmd_qualifier.select_item.presentation_type == PRESENTATION_TYPE_NAVIGATION_OPTION) {
5228 dst[current_index] += PRESENTATION_TYPE_NAVIGATION_OPTION;
5232 //command detail selection preference
5233 if (src->cmd_qualifier.select_item.select_preference == SELECTION_PREFERENCE_USING_SOFT_KEY)
5234 dst[current_index] += 0x04;
5236 //command detail help available
5237 if (src->cmd_qualifier.select_item.help_info)
5238 dst[current_index] += 0x80;
5240 case SAT_PROATV_CMD_SEND_SMS:{
5241 //command detail sms packing by me required
5242 if (src->cmd_qualifier.send_sms.packing_by_me_required)
5243 dst[current_index] += 0x01;
5245 case SAT_PROATV_CMD_SETUP_CALL:{
5246 //command detail setup call command;
5247 dst[current_index] += src->cmd_qualifier.setup_call.setup_call;
5249 case SAT_PROATV_CMD_SETUP_EVENT_LIST:{
5250 dbg("setup evnet list : 1bit RFU");
5252 case SAT_PROATV_CMD_OPEN_CHANNEL:{
5253 if (src->cmd_qualifier.open_channel.immediate_link)
5254 dst[current_index] += 0x01;
5255 if (src->cmd_qualifier.open_channel.automatic_reconnection)
5256 dst[current_index] += 0x02;
5257 if (src->cmd_qualifier.open_channel.background_mode)
5258 dst[current_index] += 0x04;
5260 case SAT_PROATV_CMD_SEND_DATA:{
5261 if (src->cmd_qualifier.send_data.send_data_immediately)
5262 dst[current_index] += 0x01;
5264 case SAT_PROATV_CMD_PROVIDE_LOCAL_INFO:{
5265 dst[current_index] += src->cmd_qualifier.provide_local_info.provide_local_info;
5267 case SAT_PROATV_CMD_LANGUAGE_NOTIFICATION:{
5268 if (src->cmd_qualifier.language_notification.specific_language)
5269 dst[current_index] += 0x01;
5271 case SAT_PROATV_CMD_LAUNCH_BROWSER:{
5272 dst[current_index] += src->cmd_qualifier.launch_browser.launch_browser;
5275 err("no matched cmd type(%d)", src->cmd_type);
5282 static int _sat_encode_device_identities_tlv(const struct tel_sat_device_identities* src, char *dst, int current_index)
5284 dst[current_index++] = (b_comprehensive ? (SATK_DEVICE_IDENTITY_TAG | 0x80) : SATK_DEVICE_IDENTITY_TAG);
5285 dst[current_index++] =SATK_DEVICE_IDENTITY_LENGTH;
5286 dst[current_index++] = src->src;
5287 dst[current_index++] = src->dest;
5289 //device identities total len 4
5293 static int _sat_encode_item_identifier_tlv(const struct tel_sat_item_identifier* src, char *dst, int current_index)
5295 dst[current_index++] =SATK_ITEM_IDENTIFIER_TAG;
5296 dst[current_index++] =SATK_ITEM_IDENTIFIER_LENGTH;
5297 dst[current_index++] = src->item_identifier;
5299 //item identifier total len 3
5303 /*static int _sat_encode_duration_tlv(const struct tel_sat_duration* src, char *dst, int current_index)
5305 dst[current_index++] =SATK_DURATION_TAG;
5306 dst[current_index++] =SATK_DURATION_LENGTH;
5307 dst[current_index++] = src->time_unit;
5308 dst[current_index++] = src->time_interval;
5310 //duration total len 4
5314 static int _sat_encode_text_tlv(const struct tel_sat_text_string_object* src, char *dst, int current_index, gboolean raw_dcs)
5317 int length_index = 0;
5320 dst[current_index++] =SATK_TEXT_STRING_TAG;
5323 if (src->string_length <= 0x7F) {
5324 dst[current_index++] =SATK_DCS_LENGTH+src->string_length;
5328 dst[current_index++] = 0x81;
5329 dst[current_index++] =SATK_DCS_LENGTH+src->string_length;
5335 dst[current_index++] = src->dcs.raw_dcs;
5337 dst[current_index++] =_sat_encode_dcs_tlv(&(src->dcs));
5340 if (src->string_length > 0) {
5341 memcpy(&(dst[current_index]), src->string, src->string_length);
5344 //tag+index+dcs+data
5345 total_len = 1+length_index+1+src->string_length;
5350 static int _sat_encode_eventlist_tlv(const enum event_list src, char *dst, int current_index)
5352 dst[current_index++] =SATK_EVENT_LIST_TAG;
5353 dst[current_index++] =0x01;
5354 dst[current_index++] =src;
5359 static int _sat_encode_date_time_and_timezone_tlv(const struct tel_sat_date_time_and_timezone *src, char *dst, int current_index)
5361 dst[current_index++] = SATK_DATE_TIME_AND_TIME_ZONE_TAG;
5362 dst[current_index++] = SATK_DATE_TIME_AND_TIME_ZONE_LENGTH;
5363 dst[current_index++] = src->year;
5364 dst[current_index++] = src->month;
5365 dst[current_index++] = src->day;
5366 dst[current_index++] = src->hour;
5367 dst[current_index++] = src->minute;
5368 dst[current_index++] = src->second;
5369 dst[current_index++] = src->timeZone;
5371 return 1+1+SATK_DATE_TIME_AND_TIME_ZONE_LENGTH; //tag length+len field length+value length;
5374 static int _sat_encode_language_tlv(const enum tel_sim_language_type src, char *dst, int current_index)
5376 dst[current_index++] =SATK_LANGUAGE_TAG;
5377 dst[current_index++] =SATK_LANGUAGE_LENGTH;
5379 dbg("language (%d)", src);
5383 case SIM_LANG_GERMAN :
5384 dst[current_index++] = 'd';
5385 dst[current_index++] = 'e';
5388 case SIM_LANG_ENGLISH :
5389 dst[current_index++] = 'e';
5390 dst[current_index++] = 'n';
5393 case SIM_LANG_ITALIAN :
5394 dst[current_index++] = 'i';
5395 dst[current_index++] = 't';
5398 case SIM_LANG_FRENCH :
5399 dst[current_index++] = 'f';
5400 dst[current_index++] = 'r';
5403 case SIM_LANG_SPANISH :
5404 dst[current_index++] = 'e';
5405 dst[current_index++] = 's';
5408 case SIM_LANG_DUTCH :
5409 dst[current_index++] = 'n';
5410 dst[current_index++] = 'l';
5413 case SIM_LANG_SWEDISH :
5414 dst[current_index++] = 's';
5415 dst[current_index++] = 'v';
5418 case SIM_LANG_DANISH :
5419 dst[current_index++] = 'd';
5420 dst[current_index++] = 'a';
5423 case SIM_LANG_PORTUGUESE :
5424 dst[current_index++] = 'p';
5425 dst[current_index++] = 't';
5428 case SIM_LANG_FINNISH :
5429 dst[current_index++] = 'f';
5430 dst[current_index++] = 'i';
5433 case SIM_LANG_NORWEGIAN :
5434 dst[current_index++] = 'n';
5435 dst[current_index++] = 'b';
5438 case SIM_LANG_GREEK :
5439 dst[current_index++] = 'e';
5440 dst[current_index++] = 'l';
5443 case SIM_LANG_TURKISH :
5444 dst[current_index++] = 't';
5445 dst[current_index++] = 'k';
5448 case SIM_LANG_HUNGARIAN :
5449 dst[current_index++] = 'h';
5450 dst[current_index++] = 'u';
5453 case SIM_LANG_POLISH :
5454 dst[current_index++] = 'p';
5455 dst[current_index++] = 'l';
5459 dst[current_index++] = 'e';
5460 dst[current_index++] = 'n';
5461 dbg("[SAT] SAT PARSER - Unknown Language: 0x%x",src);
5468 static int _sat_encode_browser_termination_tlv(const enum browser_termination_cause src, char *dst, int current_index)
5470 dst[current_index++] =SATK_BROWSER_TERMINATION_CAUSE_TAG;
5471 dst[current_index++] =SATK_BROWSER_TERMINATION_CAUSE_LENGTH;
5472 dst[current_index++] =src;
5477 static int _sat_encode_bearer_desc_tlv(const struct tel_sat_bearer_description* src, char *dst, int current_index)
5480 int length_index = 0;
5482 dst[current_index++] =SATK_BEARER_DISCRIPTION_TAG;
5485 length_index = current_index++;
5488 dst[current_index++] = src->bearer_type;
5490 switch(src->bearer_type) {
5492 dst[current_index++] = src->bearer_parameter.cs_bearer_param.data_rate;
5493 dst[current_index++] = src->bearer_parameter.cs_bearer_param.service_type;
5494 dst[current_index++] = src->bearer_parameter.cs_bearer_param.connection_element_type;
5497 dst[current_index++] = src->bearer_parameter.ps_bearer_param.precedence_class;
5498 dst[current_index++] = src->bearer_parameter.ps_bearer_param.delay_class;
5499 dst[current_index++] = src->bearer_parameter.ps_bearer_param.reliability_class;
5500 dst[current_index++] = src->bearer_parameter.ps_bearer_param.peak_throughput_class;
5501 dst[current_index++] = src->bearer_parameter.ps_bearer_param.mean_throughput_class;
5502 dst[current_index++] = src->bearer_parameter.ps_bearer_param.pdp_type;
5504 case BEARER_DEFAULT_BEARER_FROM_TRANSPORT_LAYER:
5505 case BEARER_LOCAL_LINK_TECHNOLOGY_INDEPENDENT:
5510 dst[length_index] = (current_index-1) - length_index;
5511 total_len = (current_index-1) - length_index + 2; //tag and length
5516 static int _sat_encode_buffer_size_tlv(const struct tel_sat_buffer_size* src, char *dst, int current_index)
5518 dst[current_index++] = SATK_BUFFER_SIZE_TAG;
5519 dst[current_index++] = SATK_BUFFER_SIZE_LENGTH;
5520 dst[current_index++] = src->size[0];
5521 dst[current_index++] = src->size[1];
5526 static int _sat_encode_channel_data_tlv(const struct tel_sat_channel_data* src, char *dst, int current_index)
5529 int length_index = 0;
5531 dst[current_index++] = SATK_CHANNEL_DATA_TAG;
5533 if (src->data_string_len <= 0x7F) {
5534 dst[current_index++] = src->data_string_len;
5538 dst[current_index++] = 0x81;
5539 dst[current_index++] = src->data_string_len;
5543 memcpy(&(dst[current_index]), src->data_string, src->data_string_len);
5545 total_len = 1+length_index+src->data_string_len;
5550 static int _sat_encode_channel_data_length_tlv(const struct tel_sat_channel_data_len* src, char *dst, int current_index)
5552 dst[current_index++] = SATK_CHANNEL_DATA_LEN_TAG;
5553 dst[current_index++] = SATK_CHANNEL_DATA_LENGTH_VALUE_LENGTH;
5554 dst[current_index++] = src->data_len;
5559 static int _sat_encode_channel_status_tlv(const struct tel_sat_channel_status* src, char *dst, int current_index)
5561 dst[current_index++] = SATK_CHANNEL_STATUS_TAG;
5562 dst[current_index++] = SATK_CHANNEL_STATUS_LENGTH;
5564 if (src->status == link_or_packet_service_activated) //(bit 8)
5565 dst[current_index] += 0x80;
5567 dst[current_index++] += src->channel_id; //(bit 1~3)
5568 dst[current_index++] = src->status_info;
5573 static int _sat_encode_download_event(const struct tel_sat_envelop_event_download_tlv *evt_dl, char *dst_envelop)
5576 int encoded_len = 0;
5578 dbg("event type(%d)", evt_dl->event);
5581 encoded_len = _sat_encode_eventlist_tlv(evt_dl->event, dst_envelop, index);
5582 index += encoded_len;
5585 encoded_len =_sat_encode_device_identities_tlv(&(evt_dl->device_identitie), dst_envelop, index);
5586 index += encoded_len;
5588 switch(evt_dl->event) {
5589 case EVENT_LANGUAGE_SELECTION:
5590 encoded_len = _sat_encode_language_tlv(evt_dl->language, dst_envelop, index);
5591 index += encoded_len;
5593 case EVENT_BROWSER_TERMINATION:
5594 encoded_len = _sat_encode_browser_termination_tlv(evt_dl->browser_termination, dst_envelop, index);
5595 index += encoded_len;
5597 case EVENT_DATA_AVAILABLE:
5598 encoded_len = _sat_encode_channel_status_tlv(&(evt_dl->channel_status), dst_envelop, index);
5599 index += encoded_len;
5601 encoded_len = _sat_encode_channel_data_length_tlv(&(evt_dl->channel_data_len), dst_envelop, index);
5602 index += encoded_len;
5604 case EVENT_CHANNEL_STATUS:
5605 encoded_len = _sat_encode_channel_status_tlv(&(evt_dl->channel_status), dst_envelop, index);
5606 index += encoded_len;
5612 dst_envelop[0] = SATK_EVENT_DOWNLOAD_TAG;
5613 dst_envelop[1] = index-2;
5615 dbg("download envelop cmd len(%d)", index);
5617 if (index-2 > 0x7F) {
5619 for(idx = index; idx > 0; idx--) {
5620 dst_envelop[idx] = dst_envelop[idx+1];
5622 dst_envelop[1] = 0x81;
5624 dbg("download envelop added cmd len(%d)", index);
5630 int tcore_sat_encode_envelop_cmd(const struct treq_sat_envelop_cmd_data *src_envelop, char *dst_envelop)
5632 int index = 0, encoded_len= 0;
5637 if (src_envelop->sub_cmd == ENVELOP_MENU_SELECTION) {
5638 index = 2; //set the cursor to device identity
5639 dbg("item id(%d)", src_envelop->envelop_data.menu_select.item_identifier.item_identifier);
5640 encoded_len =_sat_encode_device_identities_tlv(&(src_envelop->envelop_data.menu_select.device_identitie), dst_envelop, index);
5641 index += encoded_len;
5644 encoded_len = _sat_encode_item_identifier_tlv(&(src_envelop->envelop_data.menu_select.item_identifier), dst_envelop, index);
5645 index += encoded_len;
5647 if (src_envelop->envelop_data.menu_select.help_request) {
5648 encoded_len = 2;//help request
5649 dst_envelop[index++] = SATK_HELP_REQUEST_TAG;
5650 dst_envelop[index++] = SATK_HELP_REQUEST_LENGTH;
5653 dbg("menu selection cmd len(%d)", index);
5656 dst_envelop[0] = SATK_MENU_SELECTION_TAG;
5657 dst_envelop[1] = index-2;
5659 else if (src_envelop->sub_cmd == ENVELOP_EVENT_DOWNLOAD) {
5660 index = _sat_encode_download_event(&(src_envelop->envelop_data.event_download),dst_envelop);
5668 static int _sat_encode_display_text(const struct tel_sat_tr_display_text_tlv *src_tr, char *dst_tr)
5670 int index = 0, encoded_len = 0;
5672 //set command detail info
5673 encoded_len = _sat_encode_command_detail_tlv(&(src_tr->command_detail), dst_tr, index);
5674 index += encoded_len;
5676 //set device identities info
5677 encoded_len = _sat_encode_device_identities_tlv(&(src_tr->device_id), dst_tr, index);
5678 index += encoded_len;
5681 dst_tr[index++] = (b_comprehensive ? (SATK_RESULT_TAG | 0x80) : SATK_RESULT_TAG);
5682 switch(src_tr->result_type) {
5683 case RESULT_SUCCESS:
5684 case RESULT_SUCCESS_WITH_PARTIAL_COMPREHENSION:
5685 case RESULT_SUCCESS_WITH_MISSING_INFO:
5686 case RESULT_SUCCESS_BUT_REQUESTED_ICON_NOT_DISPLAYED:
5687 case RESULT_PROACTIVE_SESSION_TERMINATED_BY_USER:
5688 case RESULT_BACKWARD_MOVE_BY_USER:
5689 case RESULT_NO_RESPONSE_FROM_USER:
5690 case RESULT_BEYOND_ME_CAPABILITIES:
5691 case RESULT_COMMAND_TYPE_NOT_UNDERSTOOD_BY_ME:
5692 case RESULT_COMMAND_DATA_NOT_UNDERSTOOD_BY_ME:
5693 case RESULT_COMMAND_NUMBER_NOT_KNOWN_BY_ME:
5694 case RESULT_ERROR_REQUIRED_VALUES_ARE_MISSING:
5695 dst_tr[index++] = 1;
5696 dst_tr[index++] = src_tr->result_type;
5698 case RESULT_ME_UNABLE_TO_PROCESS_COMMAND:
5699 case RESULT_FRAMES_ERROR:
5700 dst_tr[index++] = 2;
5701 dst_tr[index++] = src_tr->result_type;
5702 dst_tr[index++] = src_tr->me_problem_type;
5705 dbg("invalid response value[0x%x] in current TR",src_tr->result_type);
5713 static int _sat_encode_get_inkey(const struct tel_sat_tr_get_inkey_tlv *src_tr, char *dst_tr)
5715 int index = 0, encoded_len = 0;
5717 //set command detail info
5718 encoded_len = _sat_encode_command_detail_tlv(&(src_tr->command_detail), dst_tr, index);
5719 index += encoded_len;
5721 //set device identities info
5722 encoded_len = _sat_encode_device_identities_tlv(&(src_tr->device_id), dst_tr, index);
5723 index += encoded_len;
5726 dst_tr[index++] = (b_comprehensive ? (SATK_RESULT_TAG | 0x80) : SATK_RESULT_TAG);;
5728 switch(src_tr->result_type) {
5729 case RESULT_SUCCESS:
5730 case RESULT_SUCCESS_WITH_PARTIAL_COMPREHENSION:
5731 case RESULT_SUCCESS_WITH_MISSING_INFO:
5732 case RESULT_SUCCESS_BUT_REQUESTED_ICON_NOT_DISPLAYED:
5733 dst_tr[index++] = 1;
5734 dst_tr[index++] = src_tr->result_type;
5736 encoded_len = _sat_encode_text_tlv(&(src_tr->text), dst_tr, index, FALSE);
5737 index += encoded_len;
5739 case RESULT_PROACTIVE_SESSION_TERMINATED_BY_USER:
5740 case RESULT_BACKWARD_MOVE_BY_USER:
5741 case RESULT_HELP_INFO_REQUIRED_BY_USER:
5742 case RESULT_BEYOND_ME_CAPABILITIES:
5743 case RESULT_COMMAND_TYPE_NOT_UNDERSTOOD_BY_ME:
5744 case RESULT_COMMAND_DATA_NOT_UNDERSTOOD_BY_ME:
5745 case RESULT_COMMAND_NUMBER_NOT_KNOWN_BY_ME:
5746 case RESULT_ERROR_REQUIRED_VALUES_ARE_MISSING:
5747 case RESULT_NO_RESPONSE_FROM_USER:
5748 dst_tr[index++] = 1;
5749 dst_tr[index++] = src_tr->result_type;
5751 case RESULT_ME_UNABLE_TO_PROCESS_COMMAND:
5752 case RESULT_FRAMES_ERROR:
5753 dst_tr[index++] = 2;
5754 dst_tr[index++] = src_tr->result_type;
5755 dst_tr[index++] = src_tr->me_problem_type;
5758 dbg("invalid response value[0x%x] in current TR",src_tr->result_type);
5766 static int _sat_encode_get_input(const struct tel_sat_tr_get_input_tlv *src_tr, char *dst_tr)
5768 int index = 0, encoded_len = 0;
5770 //set command detail info
5771 encoded_len = _sat_encode_command_detail_tlv(&(src_tr->command_detail), dst_tr, index);
5772 index += encoded_len;
5774 //set device identities info
5775 encoded_len = _sat_encode_device_identities_tlv(&(src_tr->device_id), dst_tr, index);
5776 index += encoded_len;
5779 dst_tr[index++] = (b_comprehensive ? (SATK_RESULT_TAG | 0x80) : SATK_RESULT_TAG);;
5781 switch(src_tr->result_type) {
5782 case RESULT_SUCCESS:
5783 case RESULT_SUCCESS_WITH_PARTIAL_COMPREHENSION:
5784 case RESULT_SUCCESS_WITH_MISSING_INFO:
5785 case RESULT_SUCCESS_BUT_REQUESTED_ICON_NOT_DISPLAYED:
5786 dst_tr[index++] = 1;
5787 dst_tr[index++] = src_tr->result_type;
5789 encoded_len = _sat_encode_text_tlv(&(src_tr->text), dst_tr, index, FALSE);
5790 index += encoded_len;
5792 case RESULT_PROACTIVE_SESSION_TERMINATED_BY_USER:
5793 case RESULT_BACKWARD_MOVE_BY_USER:
5794 case RESULT_NO_RESPONSE_FROM_USER:
5795 case RESULT_HELP_INFO_REQUIRED_BY_USER:
5796 case RESULT_BEYOND_ME_CAPABILITIES:
5797 case RESULT_COMMAND_TYPE_NOT_UNDERSTOOD_BY_ME:
5798 case RESULT_COMMAND_DATA_NOT_UNDERSTOOD_BY_ME:
5799 case RESULT_COMMAND_NUMBER_NOT_KNOWN_BY_ME:
5800 case RESULT_ERROR_REQUIRED_VALUES_ARE_MISSING:
5801 dst_tr[index++] = 1;
5802 dst_tr[index++] = src_tr->result_type;
5804 case RESULT_ME_UNABLE_TO_PROCESS_COMMAND:
5805 case RESULT_FRAMES_ERROR:
5806 dst_tr[index++] = 2;
5807 dst_tr[index++] = src_tr->result_type;
5808 dst_tr[index++] = src_tr->me_problem_type;
5811 dbg("invalid response value[0x%x] in current TR",src_tr->result_type);
5819 static int _sat_encode_more_time(const struct tel_sat_tr_more_time_tlv *src_tr, char *dst_tr)
5821 int index = 0, encoded_len = 0;
5823 //set command detail info
5824 encoded_len = _sat_encode_command_detail_tlv(&(src_tr->command_detail), dst_tr, index);
5825 index += encoded_len;
5827 //set device identities info
5828 encoded_len = _sat_encode_device_identities_tlv(&(src_tr->device_id), dst_tr, index);
5829 index += encoded_len;
5832 dst_tr[index++] = (b_comprehensive ? (SATK_RESULT_TAG | 0x80) : SATK_RESULT_TAG);;
5834 switch(src_tr->result_type) {
5835 case RESULT_SUCCESS:
5836 case RESULT_SUCCESS_WITH_PARTIAL_COMPREHENSION:
5837 case RESULT_SUCCESS_WITH_MISSING_INFO:
5838 case RESULT_BEYOND_ME_CAPABILITIES:
5839 case RESULT_COMMAND_TYPE_NOT_UNDERSTOOD_BY_ME:
5840 case RESULT_COMMAND_DATA_NOT_UNDERSTOOD_BY_ME:
5841 case RESULT_COMMAND_NUMBER_NOT_KNOWN_BY_ME:
5842 case RESULT_ERROR_REQUIRED_VALUES_ARE_MISSING:
5843 dst_tr[index++] = 1;
5844 dst_tr[index++] = src_tr->result_type;
5846 case RESULT_ME_UNABLE_TO_PROCESS_COMMAND:
5847 dst_tr[index++] = 2;
5848 dst_tr[index++] = src_tr->result_type;
5849 dst_tr[index++] = src_tr->me_problem_type;
5852 dbg("invalid response value[0x%x] in current TR",src_tr->result_type);
5860 static int _sat_encode_play_tone(const struct tel_sat_tr_play_tone_tlv *src_tr, char *dst_tr)
5862 int index = 0, encoded_len = 0;
5864 //set command detail info
5865 encoded_len = _sat_encode_command_detail_tlv(&(src_tr->command_detail), dst_tr, index);
5866 index += encoded_len;
5868 //set device identities info
5869 encoded_len = _sat_encode_device_identities_tlv(&(src_tr->device_id), dst_tr, index);
5870 index += encoded_len;
5873 dst_tr[index++] = (b_comprehensive ? (SATK_RESULT_TAG | 0x80) : SATK_RESULT_TAG);;
5875 switch(src_tr->result_type) {
5876 case RESULT_SUCCESS:
5877 case RESULT_SUCCESS_WITH_PARTIAL_COMPREHENSION:
5878 case RESULT_SUCCESS_WITH_MISSING_INFO:
5879 case RESULT_SUCCESS_BUT_REQUESTED_ICON_NOT_DISPLAYED:
5880 case RESULT_SUCCESS_BUT_TONE_NOT_PLAYED:
5881 case RESULT_PROACTIVE_SESSION_TERMINATED_BY_USER:
5882 case RESULT_BEYOND_ME_CAPABILITIES:
5883 case RESULT_COMMAND_TYPE_NOT_UNDERSTOOD_BY_ME:
5884 case RESULT_COMMAND_DATA_NOT_UNDERSTOOD_BY_ME:
5885 case RESULT_COMMAND_NUMBER_NOT_KNOWN_BY_ME:
5886 case RESULT_ERROR_REQUIRED_VALUES_ARE_MISSING:
5887 dst_tr[index++] = 1;
5888 dst_tr[index++] = src_tr->result_type;
5890 case RESULT_ME_UNABLE_TO_PROCESS_COMMAND:
5891 case RESULT_FRAMES_ERROR:
5892 dst_tr[index++] = 2;
5893 dst_tr[index++] = src_tr->result_type;
5894 dst_tr[index++] = src_tr->me_problem_type;
5897 dbg("invalid response value[0x%x] in current TR",src_tr->result_type);
5905 static int _sat_encode_refresh(const struct tel_sat_tr_refresh_tlv *src_tr, char *dst_tr)
5907 int index = 0, encoded_len = 0;
5909 //set command detail info
5910 encoded_len = _sat_encode_command_detail_tlv(&(src_tr->command_detail), dst_tr, index);
5911 index += encoded_len;
5913 //set device identities info
5914 encoded_len = _sat_encode_device_identities_tlv(&(src_tr->device_id), dst_tr, index);
5915 index += encoded_len;
5918 dst_tr[index++] = (b_comprehensive ? (SATK_RESULT_TAG | 0x80) : SATK_RESULT_TAG);;
5920 switch(src_tr->result_type) {
5921 case RESULT_SUCCESS:
5922 case RESULT_SUCCESS_WITH_PARTIAL_COMPREHENSION:
5923 case RESULT_SUCCESS_WITH_MISSING_INFO:
5924 case RESULT_REFRESH_PERFORMED_WITH_ADDITIONAL_EFS_READ:
5925 case RESULT_REFRESH_PRFRMD_BUT_INDICATED_USIM_NOT_ACTIVE:
5926 case RESULT_BEYOND_ME_CAPABILITIES:
5927 case RESULT_COMMAND_TYPE_NOT_UNDERSTOOD_BY_ME:
5928 case RESULT_COMMAND_DATA_NOT_UNDERSTOOD_BY_ME:
5929 case RESULT_COMMAND_NUMBER_NOT_KNOWN_BY_ME:
5930 case RESULT_ERROR_REQUIRED_VALUES_ARE_MISSING:
5931 dst_tr[index++] = 1;
5932 dst_tr[index++] = src_tr->result_type;
5934 case RESULT_ME_UNABLE_TO_PROCESS_COMMAND:
5935 dst_tr[index++] = 2;
5936 dst_tr[index++] = src_tr->result_type;
5937 dst_tr[index++] = src_tr->me_problem_type;
5940 dbg("invalid response value[0x%x] in current TR",src_tr->result_type);
5948 static int _sat_encode_setup_menu(const struct tel_sat_tr_setup_menu_tlv *src_tr, char *dst_tr)
5950 int index = 0, encoded_len = 0;
5952 //set command detail info
5953 encoded_len = _sat_encode_command_detail_tlv(&(src_tr->command_detail), dst_tr, index);
5954 index += encoded_len;
5956 //set device identities info
5957 encoded_len = _sat_encode_device_identities_tlv(&(src_tr->device_id), dst_tr, index);
5958 index += encoded_len;
5961 dst_tr[index++] = (b_comprehensive ? (SATK_RESULT_TAG | 0x80) : SATK_RESULT_TAG);;
5962 switch(src_tr->result_type) {
5963 case RESULT_SUCCESS:
5964 case RESULT_SUCCESS_WITH_PARTIAL_COMPREHENSION:
5965 case RESULT_SUCCESS_WITH_MISSING_INFO:
5966 case RESULT_SUCCESS_BUT_REQUESTED_ICON_NOT_DISPLAYED:
5967 case RESULT_BEYOND_ME_CAPABILITIES:
5968 case RESULT_COMMAND_TYPE_NOT_UNDERSTOOD_BY_ME:
5969 case RESULT_COMMAND_DATA_NOT_UNDERSTOOD_BY_ME:
5970 case RESULT_COMMAND_NUMBER_NOT_KNOWN_BY_ME:
5971 case RESULT_ERROR_REQUIRED_VALUES_ARE_MISSING:
5972 dst_tr[index++] = 1;
5973 dst_tr[index++] = src_tr->result_type;
5975 case RESULT_ME_UNABLE_TO_PROCESS_COMMAND:
5976 dst_tr[index++] = 2;
5977 dst_tr[index++] = src_tr->result_type;
5978 dst_tr[index++] = src_tr->me_problem_type;
5981 dbg("invalid response value[0x%x] in current TR",src_tr->result_type);
5989 static int _sat_encode_select_item(const struct tel_sat_tr_select_item_tlv *src_tr, char *dst_tr)
5991 int index = 0, encoded_len = 0;
5993 //set command detail info
5994 encoded_len = _sat_encode_command_detail_tlv(&(src_tr->command_detail), dst_tr, index);
5995 index += encoded_len;
5997 //set device identities info
5998 encoded_len = _sat_encode_device_identities_tlv(&(src_tr->device_id), dst_tr, index);
5999 index += encoded_len;
6002 dst_tr[index++] = (b_comprehensive ? (SATK_RESULT_TAG | 0x80) : SATK_RESULT_TAG);;
6004 switch(src_tr->result_type) {
6005 case RESULT_SUCCESS:
6006 case RESULT_SUCCESS_WITH_PARTIAL_COMPREHENSION:
6007 case RESULT_SUCCESS_WITH_MISSING_INFO:
6008 case RESULT_SUCCESS_BUT_REQUESTED_ICON_NOT_DISPLAYED:
6009 case RESULT_HELP_INFO_REQUIRED_BY_USER:
6010 dst_tr[index++] = 1;
6011 dst_tr[index++] = src_tr->result_type;
6012 encoded_len = _sat_encode_item_identifier_tlv(&(src_tr->item_identifier), dst_tr, index);
6013 index += encoded_len;
6015 case RESULT_PROACTIVE_SESSION_TERMINATED_BY_USER:
6016 case RESULT_BACKWARD_MOVE_BY_USER:
6017 case RESULT_NO_RESPONSE_FROM_USER:
6018 case RESULT_BEYOND_ME_CAPABILITIES:
6019 case RESULT_COMMAND_TYPE_NOT_UNDERSTOOD_BY_ME:
6020 case RESULT_COMMAND_DATA_NOT_UNDERSTOOD_BY_ME:
6021 case RESULT_COMMAND_NUMBER_NOT_KNOWN_BY_ME:
6022 case RESULT_ERROR_REQUIRED_VALUES_ARE_MISSING:
6023 dst_tr[index++] = 1;
6024 dst_tr[index++] = src_tr->result_type;
6026 case RESULT_ME_UNABLE_TO_PROCESS_COMMAND:
6027 case RESULT_FRAMES_ERROR:
6028 dst_tr[index++] = 2;
6029 dst_tr[index++] = src_tr->result_type;
6030 dst_tr[index++] = src_tr->me_problem_type;
6033 dbg("invalid response value[0x%x] in current TR",src_tr->result_type);
6041 static int _sat_encode_send_sms(const struct tel_sat_tr_send_sms_tlv *src_tr, char *dst_tr)
6043 int index = 0, encoded_len = 0;
6045 //set command detail info
6046 encoded_len = _sat_encode_command_detail_tlv(&(src_tr->command_detail), dst_tr, index);
6047 index += encoded_len;
6049 //set device identities info
6050 encoded_len = _sat_encode_device_identities_tlv(&(src_tr->device_id), dst_tr, index);
6051 index += encoded_len;
6054 dst_tr[index++] = (b_comprehensive ? (SATK_RESULT_TAG | 0x80) : SATK_RESULT_TAG);;
6056 switch(src_tr->result_type) {
6057 case RESULT_SUCCESS:
6058 case RESULT_SUCCESS_WITH_PARTIAL_COMPREHENSION:
6059 case RESULT_SUCCESS_WITH_MISSING_INFO:
6060 case RESULT_SUCCESS_BUT_REQUESTED_ICON_NOT_DISPLAYED:
6061 dst_tr[index++] = 1;
6062 dst_tr[index++] = src_tr->result_type;
6064 case RESULT_ME_UNABLE_TO_PROCESS_COMMAND:
6065 case RESULT_NETWORK_UNABLE_TO_PROCESS_COMMAND:
6066 case RESULT_BEYOND_ME_CAPABILITIES:
6067 case RESULT_COMMAND_TYPE_NOT_UNDERSTOOD_BY_ME:
6068 case RESULT_COMMAND_DATA_NOT_UNDERSTOOD_BY_ME:
6069 case RESULT_SMS_RP_ERROR:
6070 case RESULT_INTRCTN_WITH_CC_OR_SMS_CTRL_PRMNT_PRBLM:
6071 dst_tr[index++] = 2;
6072 dst_tr[index++] = src_tr->result_type;
6073 dst_tr[index++] = src_tr->me_problem_type;
6076 dbg("invalid response value[0x%x] in current TR",src_tr->result_type);
6084 static int _sat_encode_send_ss(const struct tel_sat_tr_send_ss_tlv *src_tr, char *dst_tr)
6086 int index = 0, encoded_len = 0;
6088 //set command detail info
6089 encoded_len = _sat_encode_command_detail_tlv(&(src_tr->command_detail), dst_tr, index);
6090 index += encoded_len;
6092 //set device identities info
6093 encoded_len = _sat_encode_device_identities_tlv(&(src_tr->device_id), dst_tr, index);
6094 index += encoded_len;
6097 dst_tr[index++] = (b_comprehensive ? (SATK_RESULT_TAG | 0x80) : SATK_RESULT_TAG);;
6099 switch(src_tr->result_type) {
6100 case RESULT_SUCCESS:
6101 case RESULT_SUCCESS_WITH_PARTIAL_COMPREHENSION:
6102 case RESULT_SUCCESS_WITH_MISSING_INFO:
6103 case RESULT_SUCCESS_BUT_REQUESTED_ICON_NOT_DISPLAYED:
6104 case RESULT_SUCCESS_BUT_MODIFIED_BY_CALL_CONTROL_BY_SIM:
6105 case RESULT_USSD_OR_SS_TRANSACTION_TERMINATED_BY_USER:
6106 dst_tr[index++] = 1;
6107 dst_tr[index++] = src_tr->result_type;
6109 memcpy(&(dst_tr[index]), src_tr->text.string, src_tr->text.string_length);
6110 encoded_len = src_tr->text.string_length;
6111 index += encoded_len;
6113 case RESULT_ME_UNABLE_TO_PROCESS_COMMAND:
6114 case RESULT_NETWORK_UNABLE_TO_PROCESS_COMMAND:
6115 dst_tr[index++] = 2;
6116 dst_tr[index++] = src_tr->result_type;
6117 dst_tr[index++] = src_tr->me_problem_type;
6119 case RESULT_INTRCTN_WITH_CC_OR_SMS_CTRL_PRMNT_PRBLM:
6120 dst_tr[index++] = 2;
6121 dst_tr[index++] = src_tr->result_type;
6122 dst_tr[index++] = src_tr->cc_problem_type;
6124 case RESULT_SS_RETURN_ERROR:
6125 dst_tr[index++] = 2;
6126 dst_tr[index++] = src_tr->result_type;
6127 dst_tr[index++] = src_tr->ss_problem;
6130 dbg("invalid response value[0x%x] in current TR",src_tr->result_type);
6138 static int _sat_encode_send_ussd(const struct tel_sat_tr_send_ussd_tlv *src_tr, char *dst_tr)
6140 int index = 0, encoded_len = 0;
6142 //set command detail info
6143 encoded_len = _sat_encode_command_detail_tlv(&(src_tr->command_detail), dst_tr, index);
6144 index += encoded_len;
6146 //set device identities info
6147 encoded_len = _sat_encode_device_identities_tlv(&(src_tr->device_id), dst_tr, index);
6148 index += encoded_len;
6151 dst_tr[index++] = (b_comprehensive ? (SATK_RESULT_TAG | 0x80) : SATK_RESULT_TAG);;
6153 switch(src_tr->result_type) {
6154 case RESULT_SUCCESS:
6155 case RESULT_SUCCESS_WITH_PARTIAL_COMPREHENSION:
6156 case RESULT_SUCCESS_WITH_MISSING_INFO:
6157 case RESULT_SUCCESS_BUT_REQUESTED_ICON_NOT_DISPLAYED:
6158 case RESULT_SUCCESS_BUT_MODIFIED_BY_CALL_CONTROL_BY_SIM:
6159 case RESULT_USSD_OR_SS_TRANSACTION_TERMINATED_BY_USER:
6160 dst_tr[index++] = 1;
6161 dst_tr[index++] = src_tr->result_type;
6163 encoded_len = _sat_encode_text_tlv(&(src_tr->text), dst_tr, index, TRUE);
6164 index += encoded_len;
6166 case RESULT_ME_UNABLE_TO_PROCESS_COMMAND:
6167 case RESULT_NETWORK_UNABLE_TO_PROCESS_COMMAND:
6168 dst_tr[index++] = 2;
6169 dst_tr[index++] = src_tr->result_type;
6170 dst_tr[index++] = src_tr->me_problem_type;
6172 case RESULT_INTRCTN_WITH_CC_OR_SMS_CTRL_PRMNT_PRBLM:
6173 dst_tr[index++] = 2;
6174 dst_tr[index++] = src_tr->result_type;
6175 dst_tr[index++] = src_tr->cc_problem_type;
6177 case RESULT_USSD_RETURN_ERROR:
6178 dst_tr[index++] = 2;
6179 dst_tr[index++] = src_tr->result_type;
6180 dst_tr[index++] = src_tr->ussd_problem;
6183 dbg("invalid response value[0x%x] in current TR",src_tr->result_type);
6191 static int _sat_encode_setup_call(const struct tel_sat_tr_setup_call_tlv *src_tr, char *dst_tr)
6193 int index = 0, encoded_len = 0;
6195 //set command detail info
6196 encoded_len = _sat_encode_command_detail_tlv(&(src_tr->command_detail), dst_tr, index);
6197 index += encoded_len;
6199 //set device identities info
6200 encoded_len = _sat_encode_device_identities_tlv(&(src_tr->device_id), dst_tr, index);
6201 index += encoded_len;
6204 dst_tr[index++] = (b_comprehensive ? (SATK_RESULT_TAG | 0x80) : SATK_RESULT_TAG);;
6206 switch(src_tr->result_type) {
6207 case RESULT_SUCCESS:
6208 case RESULT_SUCCESS_WITH_PARTIAL_COMPREHENSION:
6209 case RESULT_SUCCESS_WITH_MISSING_INFO:
6210 case RESULT_SUCCESS_BUT_REQUESTED_ICON_NOT_DISPLAYED:
6211 case RESULT_SUCCESS_BUT_MODIFIED_BY_CALL_CONTROL_BY_SIM:
6212 case RESULT_PROACTIVE_SESSION_TERMINATED_BY_USER:
6213 case RESULT_BEYOND_ME_CAPABILITIES:
6214 case RESULT_COMMAND_TYPE_NOT_UNDERSTOOD_BY_ME:
6215 case RESULT_COMMAND_DATA_NOT_UNDERSTOOD_BY_ME:
6216 case RESULT_COMMAND_NUMBER_NOT_KNOWN_BY_ME:
6217 case RESULT_ERROR_REQUIRED_VALUES_ARE_MISSING:
6218 case RESULT_SS_RETURN_ERROR:
6219 dst_tr[index++] = 1;
6220 dst_tr[index++] = src_tr->result_type;
6222 case RESULT_ME_UNABLE_TO_PROCESS_COMMAND:
6223 case RESULT_USER_DID_NOT_ACCEPT_CALL_SETUP_REQ:
6224 case RESULT_USER_CLEAR_DOWN_CALL_BEFORE_CONN:
6225 case RESULT_FRAMES_ERROR:
6226 dst_tr[index++] = 2;
6227 dst_tr[index++] = src_tr->result_type;
6228 dst_tr[index++] = src_tr->me_problem_type;
6230 case RESULT_NETWORK_UNABLE_TO_PROCESS_COMMAND:
6231 dst_tr[index++] = 2;
6232 dst_tr[index++] = src_tr->result_type;
6233 dst_tr[index++] = src_tr->network_problem_type;
6235 case RESULT_INTRCTN_WITH_CC_OR_SMS_CTRL_PRMNT_PRBLM:
6236 dst_tr[index++] = 2;
6237 dst_tr[index++] = src_tr->result_type;
6238 dst_tr[index++] = src_tr->cc_problem_type;
6241 dbg("invalid response value[0x%x] in current TR",src_tr->result_type);
6249 static int _sat_encode_provide_local_info(const struct tel_sat_tr_provide_local_info_tlv *src_tr, char *dst_tr)
6251 int index = 0, encoded_len = 0;
6253 //set command detail info
6254 encoded_len = _sat_encode_command_detail_tlv(&(src_tr->command_detail), dst_tr, index);
6255 index += encoded_len;
6257 //set device identities info
6258 encoded_len = _sat_encode_device_identities_tlv(&(src_tr->device_id), dst_tr, index);
6259 index += encoded_len;
6262 dst_tr[index++] = (b_comprehensive ? (SATK_RESULT_TAG | 0x80) : SATK_RESULT_TAG);;
6263 switch(src_tr->result_type) {
6264 case RESULT_SUCCESS:
6265 case RESULT_SUCCESS_WITH_PARTIAL_COMPREHENSION:
6266 case RESULT_SUCCESS_WITH_MISSING_INFO:
6267 case RESULT_SUCCESS_LIMITED_SERVICE:
6268 dst_tr[index++] = 1;
6269 dst_tr[index++] = src_tr->result_type;
6270 switch(src_tr->command_detail.cmd_qualifier.provide_local_info.provide_local_info) {
6271 case LOCAL_INFO_DATE_TIME_AND_TIMEZONE:
6272 encoded_len = _sat_encode_date_time_and_timezone_tlv(&(src_tr->other.date_time_and_timezone), dst_tr, index);
6274 case LOCAL_INFO_LANGUAGE:
6275 encoded_len = _sat_encode_language_tlv(src_tr->other.language, dst_tr, index);
6278 dbg("local info type[%d] is not handled", src_tr->command_detail.cmd_qualifier.provide_local_info.provide_local_info);
6281 index += encoded_len;
6283 case RESULT_BEYOND_ME_CAPABILITIES:
6284 case RESULT_COMMAND_TYPE_NOT_UNDERSTOOD_BY_ME:
6285 case RESULT_COMMAND_DATA_NOT_UNDERSTOOD_BY_ME:
6286 case RESULT_COMMAND_NUMBER_NOT_KNOWN_BY_ME:
6287 case RESULT_ERROR_REQUIRED_VALUES_ARE_MISSING:
6288 dst_tr[index++] = 1;
6289 dst_tr[index++] = src_tr->result_type;
6291 case RESULT_ME_UNABLE_TO_PROCESS_COMMAND:
6292 dst_tr[index++] = 2;
6293 dst_tr[index++] = src_tr->result_type;
6294 dst_tr[index++] = src_tr->me_problem_type;
6297 dbg("invalid response value[0x%x] in current TR",src_tr->result_type);
6305 static int _sat_encode_setup_event_list(const struct tel_sat_tr_setup_event_list_tlv *src_tr, char *dst_tr)
6307 int index = 0, encoded_len = 0;
6309 //set command detail info
6310 encoded_len = _sat_encode_command_detail_tlv(&(src_tr->command_detail), dst_tr, index);
6311 index += encoded_len;
6313 //set device identities info
6314 encoded_len = _sat_encode_device_identities_tlv(&(src_tr->device_id), dst_tr, index);
6315 index += encoded_len;
6318 dst_tr[index++] = (b_comprehensive ? (SATK_RESULT_TAG | 0x80) : SATK_RESULT_TAG);;
6319 switch(src_tr->result_type) {
6320 case RESULT_SUCCESS:
6321 case RESULT_SUCCESS_WITH_PARTIAL_COMPREHENSION:
6322 case RESULT_SUCCESS_WITH_MISSING_INFO:
6323 case RESULT_BEYOND_ME_CAPABILITIES:
6324 case RESULT_COMMAND_TYPE_NOT_UNDERSTOOD_BY_ME:
6325 case RESULT_COMMAND_DATA_NOT_UNDERSTOOD_BY_ME:
6326 case RESULT_COMMAND_NUMBER_NOT_KNOWN_BY_ME:
6327 case RESULT_ERROR_REQUIRED_VALUES_ARE_MISSING:
6328 dst_tr[index++] = 1;
6329 dst_tr[index++] = src_tr->result_type;
6331 case RESULT_ME_UNABLE_TO_PROCESS_COMMAND:
6332 dst_tr[index++] = 2;
6333 dst_tr[index++] = src_tr->result_type;
6334 dst_tr[index++] = src_tr->me_problem_type;
6337 dbg("invalid response value[0x%x] in current TR",src_tr->result_type);
6345 static int _sat_encode_setup_idle_mode_text(const struct tel_sat_tr_setup_idle_mode_text_tlv *src_tr, char *dst_tr)
6347 int index = 0, encoded_len = 0;
6349 //set command detail info
6350 encoded_len = _sat_encode_command_detail_tlv(&(src_tr->command_detail), dst_tr, index);
6351 index += encoded_len;
6353 //set device identities info
6354 encoded_len = _sat_encode_device_identities_tlv(&(src_tr->device_id), dst_tr, index);
6355 index += encoded_len;
6358 dst_tr[index++] = (b_comprehensive ? (SATK_RESULT_TAG | 0x80) : SATK_RESULT_TAG);;
6360 switch(src_tr->result_type) {
6361 case RESULT_SUCCESS:
6362 case RESULT_SUCCESS_WITH_PARTIAL_COMPREHENSION:
6363 case RESULT_SUCCESS_WITH_MISSING_INFO:
6364 case RESULT_BEYOND_ME_CAPABILITIES:
6365 case RESULT_COMMAND_TYPE_NOT_UNDERSTOOD_BY_ME:
6366 case RESULT_COMMAND_DATA_NOT_UNDERSTOOD_BY_ME:
6367 case RESULT_COMMAND_NUMBER_NOT_KNOWN_BY_ME:
6368 case RESULT_ERROR_REQUIRED_VALUES_ARE_MISSING:
6369 dst_tr[index++] = 1;
6370 dst_tr[index++] = src_tr->result_type;
6372 case RESULT_ME_UNABLE_TO_PROCESS_COMMAND:
6373 case RESULT_FRAMES_ERROR:
6374 dst_tr[index++] = 2;
6375 dst_tr[index++] = src_tr->result_type;
6376 dst_tr[index++] = src_tr->me_problem_type;
6379 dbg("invalid response value[0x%x] in current TR",src_tr->result_type);
6387 static int _sat_encode_send_dtmf(const struct tel_sat_tr_send_dtmf_tlv *src_tr, char *dst_tr)
6389 int index = 0, encoded_len = 0;
6391 //set command detail info
6392 encoded_len = _sat_encode_command_detail_tlv(&(src_tr->command_detail), dst_tr, index);
6393 index += encoded_len;
6395 //set device identities info
6396 encoded_len = _sat_encode_device_identities_tlv(&(src_tr->device_id), dst_tr, index);
6397 index += encoded_len;
6400 dst_tr[index++] = (b_comprehensive ? (SATK_RESULT_TAG | 0x80) : SATK_RESULT_TAG);;
6402 switch(src_tr->result_type) {
6403 case RESULT_SUCCESS:
6404 case RESULT_SUCCESS_WITH_PARTIAL_COMPREHENSION:
6405 case RESULT_SUCCESS_WITH_MISSING_INFO:
6406 case RESULT_SUCCESS_BUT_REQUESTED_ICON_NOT_DISPLAYED:
6407 case RESULT_PROACTIVE_SESSION_TERMINATED_BY_USER:
6408 case RESULT_BEYOND_ME_CAPABILITIES:
6409 case RESULT_COMMAND_TYPE_NOT_UNDERSTOOD_BY_ME:
6410 case RESULT_COMMAND_DATA_NOT_UNDERSTOOD_BY_ME:
6411 case RESULT_COMMAND_NUMBER_NOT_KNOWN_BY_ME:
6412 case RESULT_ERROR_REQUIRED_VALUES_ARE_MISSING:
6413 dst_tr[index++] = 1;
6414 dst_tr[index++] = src_tr->result_type;
6416 case RESULT_ME_UNABLE_TO_PROCESS_COMMAND:
6417 dst_tr[index++] = 2;
6418 dst_tr[index++] = src_tr->result_type;
6419 dst_tr[index++] = src_tr->me_problem_type;
6422 dbg("invalid response value[0x%x] in current TR",src_tr->result_type);
6430 static int _sat_encode_language_notification(const struct tel_sat_tr_language_notification_tlv *src_tr, char *dst_tr)
6432 int index = 0, encoded_len = 0;
6434 //set command detail info
6435 encoded_len = _sat_encode_command_detail_tlv(&(src_tr->command_detail), dst_tr, index);
6436 index += encoded_len;
6438 //set device identities info
6439 encoded_len = _sat_encode_device_identities_tlv(&(src_tr->device_id), dst_tr, index);
6440 index += encoded_len;
6443 dst_tr[index++] = (b_comprehensive ? (SATK_RESULT_TAG | 0x80) : SATK_RESULT_TAG);;
6445 switch(src_tr->result_type) {
6446 case RESULT_SUCCESS:
6447 case RESULT_SUCCESS_WITH_PARTIAL_COMPREHENSION:
6448 case RESULT_SUCCESS_WITH_MISSING_INFO:
6449 case RESULT_BEYOND_ME_CAPABILITIES:
6450 case RESULT_COMMAND_TYPE_NOT_UNDERSTOOD_BY_ME:
6451 case RESULT_COMMAND_DATA_NOT_UNDERSTOOD_BY_ME:
6452 case RESULT_COMMAND_NUMBER_NOT_KNOWN_BY_ME:
6453 case RESULT_ERROR_REQUIRED_VALUES_ARE_MISSING:
6454 dst_tr[index++] = 1;
6455 dst_tr[index++] = src_tr->result_type;
6457 case RESULT_ME_UNABLE_TO_PROCESS_COMMAND:
6458 case RESULT_FRAMES_ERROR:
6459 dst_tr[index++] = 2;
6460 dst_tr[index++] = src_tr->result_type;
6461 dst_tr[index++] = src_tr->me_problem_type;
6464 dbg("invalid response value[0x%x] in current TR",src_tr->result_type);
6472 static int _sat_encode_launch_browser(const struct tel_sat_tr_launch_browser_tlv *src_tr, char *dst_tr)
6474 int index = 0, encoded_len = 0;
6476 //set command detail info
6477 encoded_len = _sat_encode_command_detail_tlv(&(src_tr->command_detail), dst_tr, index);
6478 index += encoded_len;
6480 //set device identities info
6481 encoded_len = _sat_encode_device_identities_tlv(&(src_tr->device_id), dst_tr, index);
6482 index += encoded_len;
6485 dst_tr[index++] = (b_comprehensive ? (SATK_RESULT_TAG | 0x80) : SATK_RESULT_TAG);;
6487 switch(src_tr->result_type) {
6488 case RESULT_SUCCESS:
6489 case RESULT_SUCCESS_WITH_PARTIAL_COMPREHENSION:
6490 case RESULT_SUCCESS_WITH_MISSING_INFO:
6491 case RESULT_BEYOND_ME_CAPABILITIES:
6492 case RESULT_COMMAND_TYPE_NOT_UNDERSTOOD_BY_ME:
6493 case RESULT_COMMAND_DATA_NOT_UNDERSTOOD_BY_ME:
6494 case RESULT_COMMAND_NUMBER_NOT_KNOWN_BY_ME:
6495 dst_tr[index++] = 1;
6496 dst_tr[index++] = src_tr->result_type;
6498 case RESULT_ME_UNABLE_TO_PROCESS_COMMAND:
6499 case RESULT_NETWORK_UNABLE_TO_PROCESS_COMMAND:
6500 case RESULT_FRAMES_ERROR:
6501 dst_tr[index++] = 2;
6502 dst_tr[index++] = src_tr->result_type;
6503 dst_tr[index++] = src_tr->me_problem_type;
6505 case RESULT_LAUNCH_BROWSER_GENERIC_ERROR_CODE:
6506 dst_tr[index++] = 2;
6507 dst_tr[index++] = src_tr->result_type;
6508 dst_tr[index++] = src_tr->browser_problem_type;
6511 dbg("invalid response value[0x%x] in current TR",src_tr->result_type);
6519 static int _sat_encode_open_channel(const struct tel_sat_tr_open_channel_tlv *src_tr, char *dst_tr)
6521 int index = 0, encoded_len = 0;
6523 //set command detail info
6524 encoded_len = _sat_encode_command_detail_tlv(&(src_tr->command_detail), dst_tr, index);
6525 index += encoded_len;
6527 //set device identities info
6528 encoded_len = _sat_encode_device_identities_tlv(&(src_tr->device_id), dst_tr, index);
6529 index += encoded_len;
6532 dst_tr[index++] = (b_comprehensive ? (SATK_RESULT_TAG | 0x80) : SATK_RESULT_TAG);;
6533 switch(src_tr->result_type) {
6534 case RESULT_SUCCESS:
6535 case RESULT_SUCCESS_WITH_PARTIAL_COMPREHENSION:
6536 case RESULT_SUCCESS_WITH_MISSING_INFO:
6537 case RESULT_SUCCESS_BUT_REQUESTED_ICON_NOT_DISPLAYED:
6538 case RESULT_SUCCESS_WITH_MODIFICATION:
6539 dst_tr[index++] = 1;
6540 dst_tr[index++] = src_tr->result_type;
6542 //set channel status
6543 encoded_len = _sat_encode_channel_status_tlv(&(src_tr->channel_status), dst_tr, index);
6544 index += encoded_len;
6546 case RESULT_REFRESH_PRFRMD_BUT_INDICATED_USIM_NOT_ACTIVE:
6547 case RESULT_PROACTIVE_SESSION_TERMINATED_BY_USER:
6548 case RESULT_INTERACTION_WITH_CC_BY_SIM_IN_TMP_PRBLM:
6549 case RESULT_BEYOND_ME_CAPABILITIES:
6550 case RESULT_COMMAND_TYPE_NOT_UNDERSTOOD_BY_ME:
6551 case RESULT_COMMAND_DATA_NOT_UNDERSTOOD_BY_ME:
6552 case RESULT_COMMAND_NUMBER_NOT_KNOWN_BY_ME:
6553 case RESULT_ERROR_REQUIRED_VALUES_ARE_MISSING:
6554 case RESULT_USER_DID_NOT_ACCEPT_CALL_SETUP_REQ:
6555 dst_tr[index++] = 1;
6556 dst_tr[index++] = src_tr->result_type;
6558 case RESULT_ME_UNABLE_TO_PROCESS_COMMAND:
6559 case RESULT_NETWORK_UNABLE_TO_PROCESS_COMMAND:
6560 case RESULT_FRAMES_ERROR:
6561 dst_tr[index++] = 2;
6562 dst_tr[index++] = src_tr->result_type;
6563 dst_tr[index++] = src_tr->me_problem_type;
6565 case RESULT_BEARER_INDEPENDENT_PROTOCOL_ERROR:
6566 dst_tr[index++] = 2;
6567 dst_tr[index++] = src_tr->result_type;
6568 dst_tr[index++] = src_tr->bip_problem_type;
6571 dbg("invalid response value[0x%x] in current TR",src_tr->result_type);
6577 encoded_len = _sat_encode_bearer_desc_tlv(&(src_tr->bearer_desc), dst_tr, index);
6578 index += encoded_len;
6581 encoded_len = _sat_encode_buffer_size_tlv(&(src_tr->buffer_size), dst_tr, index);
6582 index += encoded_len;
6587 static int _sat_encode_close_channel(const struct tel_sat_tr_close_channel_tlv *src_tr, char *dst_tr)
6589 int index = 0, encoded_len = 0;
6591 //set command detail info
6592 encoded_len = _sat_encode_command_detail_tlv(&(src_tr->command_detail), dst_tr, index);
6593 index += encoded_len;
6595 //set device identities info
6596 encoded_len = _sat_encode_device_identities_tlv(&(src_tr->device_id), dst_tr, index);
6597 index += encoded_len;
6600 dst_tr[index++] = (b_comprehensive ? (SATK_RESULT_TAG | 0x80) : SATK_RESULT_TAG);;
6601 switch(src_tr->result_type) {
6602 case RESULT_SUCCESS:
6603 case RESULT_SUCCESS_WITH_PARTIAL_COMPREHENSION:
6604 case RESULT_SUCCESS_WITH_MISSING_INFO:
6605 case RESULT_SUCCESS_BUT_REQUESTED_ICON_NOT_DISPLAYED:
6606 case RESULT_PROACTIVE_SESSION_TERMINATED_BY_USER:
6607 case RESULT_BEYOND_ME_CAPABILITIES:
6608 case RESULT_COMMAND_TYPE_NOT_UNDERSTOOD_BY_ME:
6609 case RESULT_COMMAND_DATA_NOT_UNDERSTOOD_BY_ME:
6610 case RESULT_COMMAND_NUMBER_NOT_KNOWN_BY_ME:
6611 case RESULT_ERROR_REQUIRED_VALUES_ARE_MISSING:
6612 dst_tr[index++] = 1;
6613 dst_tr[index++] = src_tr->result_type;
6615 case RESULT_ME_UNABLE_TO_PROCESS_COMMAND:
6616 case RESULT_FRAMES_ERROR:
6617 dst_tr[index++] = 2;
6618 dst_tr[index++] = src_tr->result_type;
6619 dst_tr[index++] = src_tr->me_problem_type;
6621 case RESULT_BEARER_INDEPENDENT_PROTOCOL_ERROR:
6622 dst_tr[index++] = 2;
6623 dst_tr[index++] = src_tr->result_type;
6624 dst_tr[index++] = src_tr->bip_problem_type;
6627 dbg("invalid response value[0x%x] in current TR",src_tr->result_type);
6635 static int _sat_encode_send_data(const struct tel_sat_tr_send_data_tlv *src_tr, char *dst_tr)
6637 int index = 0, encoded_len = 0;
6639 //set command detail info
6640 encoded_len = _sat_encode_command_detail_tlv(&(src_tr->command_detail), dst_tr, index);
6641 index += encoded_len;
6643 //set device identities info
6644 encoded_len = _sat_encode_device_identities_tlv(&(src_tr->device_id), dst_tr, index);
6645 index += encoded_len;
6648 dst_tr[index++] = (b_comprehensive ? (SATK_RESULT_TAG | 0x80) : SATK_RESULT_TAG);;
6649 switch(src_tr->result_type) {
6650 case RESULT_SUCCESS:
6651 case RESULT_SUCCESS_WITH_PARTIAL_COMPREHENSION:
6652 case RESULT_SUCCESS_WITH_MISSING_INFO:
6653 case RESULT_SUCCESS_BUT_REQUESTED_ICON_NOT_DISPLAYED:
6654 case RESULT_PROACTIVE_SESSION_TERMINATED_BY_USER:
6655 case RESULT_BEYOND_ME_CAPABILITIES:
6656 case RESULT_COMMAND_TYPE_NOT_UNDERSTOOD_BY_ME:
6657 case RESULT_COMMAND_DATA_NOT_UNDERSTOOD_BY_ME:
6658 case RESULT_COMMAND_NUMBER_NOT_KNOWN_BY_ME:
6659 case RESULT_ERROR_REQUIRED_VALUES_ARE_MISSING:
6660 dst_tr[index++] = 1;
6661 dst_tr[index++] = src_tr->result_type;
6662 encoded_len = _sat_encode_channel_data_length_tlv(&(src_tr->channel_data_len), dst_tr, index);
6663 index += encoded_len;
6665 case RESULT_ME_UNABLE_TO_PROCESS_COMMAND:
6666 case RESULT_NETWORK_UNABLE_TO_PROCESS_COMMAND:
6667 case RESULT_FRAMES_ERROR:
6668 dst_tr[index++] = 2;
6669 dst_tr[index++] = src_tr->result_type;
6670 dst_tr[index++] = src_tr->me_problem_type;
6673 case RESULT_BEARER_INDEPENDENT_PROTOCOL_ERROR:
6674 dst_tr[index++] = 2;
6675 dst_tr[index++] = src_tr->result_type;
6676 dst_tr[index++] = src_tr->bip_problem_type;
6679 dbg("invalid response value[0x%x] in current TR",src_tr->result_type);
6687 static int _sat_encode_receive_data(const struct tel_sat_tr_receive_data_tlv *src_tr, char *dst_tr)
6689 int index = 0, encoded_len = 0;
6691 //set command detail info
6692 encoded_len = _sat_encode_command_detail_tlv(&(src_tr->command_detail), dst_tr, index);
6693 index += encoded_len;
6695 //set device identities info
6696 encoded_len = _sat_encode_device_identities_tlv(&(src_tr->device_id), dst_tr, index);
6697 index += encoded_len;
6700 dst_tr[index++] = (b_comprehensive ? (SATK_RESULT_TAG | 0x80) : SATK_RESULT_TAG);;
6701 switch(src_tr->result_type) {
6702 case RESULT_SUCCESS:
6703 case RESULT_SUCCESS_WITH_PARTIAL_COMPREHENSION:
6704 case RESULT_SUCCESS_WITH_MISSING_INFO:
6705 case RESULT_SUCCESS_BUT_REQUESTED_ICON_NOT_DISPLAYED:
6706 case RESULT_PROACTIVE_SESSION_TERMINATED_BY_USER:
6707 case RESULT_BEYOND_ME_CAPABILITIES:
6708 case RESULT_COMMAND_TYPE_NOT_UNDERSTOOD_BY_ME:
6709 case RESULT_COMMAND_DATA_NOT_UNDERSTOOD_BY_ME:
6710 case RESULT_COMMAND_NUMBER_NOT_KNOWN_BY_ME:
6711 case RESULT_ERROR_REQUIRED_VALUES_ARE_MISSING:
6712 dst_tr[index++] = 1;
6713 dst_tr[index++] = src_tr->result_type;
6714 encoded_len = _sat_encode_channel_data_tlv(&(src_tr->channel_data), dst_tr, index);
6715 index += encoded_len;
6716 encoded_len = _sat_encode_channel_data_length_tlv(&(src_tr->channel_data_len), dst_tr, index);
6717 index += encoded_len;
6719 case RESULT_ME_UNABLE_TO_PROCESS_COMMAND:
6720 case RESULT_FRAMES_ERROR:
6721 dst_tr[index++] = 2;
6722 dst_tr[index++] = src_tr->result_type;
6723 dst_tr[index++] = src_tr->me_problem_type;
6726 case RESULT_BEARER_INDEPENDENT_PROTOCOL_ERROR:
6727 dst_tr[index++] = 2;
6728 dst_tr[index++] = src_tr->result_type;
6729 dst_tr[index++] = src_tr->bip_problem_type;
6732 dbg("invalid response value[0x%x] in current TR",src_tr->result_type);
6740 static int _sat_encode_get_channel_status(const struct tel_sat_tr_get_channel_status_tlv *src_tr, char *dst_tr)
6742 int index = 0, encoded_len = 0;
6744 //set command detail info
6745 encoded_len = _sat_encode_command_detail_tlv(&(src_tr->command_detail), dst_tr, index);
6746 index += encoded_len;
6748 //set device identities info
6749 encoded_len = _sat_encode_device_identities_tlv(&(src_tr->device_id), dst_tr, index);
6750 index += encoded_len;
6753 dst_tr[index++] = (b_comprehensive ? (SATK_RESULT_TAG | 0x80) : SATK_RESULT_TAG);;
6754 switch(src_tr->result_type) {
6755 case RESULT_SUCCESS:
6756 case RESULT_SUCCESS_WITH_PARTIAL_COMPREHENSION:
6757 case RESULT_SUCCESS_WITH_MISSING_INFO:
6758 case RESULT_SUCCESS_BUT_REQUESTED_ICON_NOT_DISPLAYED:
6759 dst_tr[index++] = 1;
6760 dst_tr[index++] = src_tr->result_type;
6761 encoded_len = _sat_encode_channel_status_tlv(&(src_tr->channel_status), dst_tr, index);
6762 index += encoded_len;
6764 case RESULT_PROACTIVE_SESSION_TERMINATED_BY_USER:
6765 case RESULT_BEYOND_ME_CAPABILITIES:
6766 case RESULT_COMMAND_TYPE_NOT_UNDERSTOOD_BY_ME:
6767 case RESULT_COMMAND_DATA_NOT_UNDERSTOOD_BY_ME:
6768 case RESULT_COMMAND_NUMBER_NOT_KNOWN_BY_ME:
6769 case RESULT_ERROR_REQUIRED_VALUES_ARE_MISSING:
6770 dst_tr[index++] = 1;
6771 dst_tr[index++] = src_tr->result_type;
6773 case RESULT_ME_UNABLE_TO_PROCESS_COMMAND:
6774 case RESULT_NETWORK_UNABLE_TO_PROCESS_COMMAND:
6775 dst_tr[index++] = 2;
6776 dst_tr[index++] = src_tr->result_type;
6777 dst_tr[index++] = src_tr->me_problem_type;
6779 case RESULT_BEARER_INDEPENDENT_PROTOCOL_ERROR:
6780 dst_tr[index++] = 2;
6781 dst_tr[index++] = src_tr->result_type;
6782 dst_tr[index++] = src_tr->bip_problem_type;
6785 dbg("invalid response value[0x%x] in current TR",src_tr->result_type);
6793 int tcore_sat_encode_terminal_response(const struct treq_sat_terminal_rsp_data *src_tr, char *dst_tr) {
6799 switch(src_tr->cmd_type) {
6800 case SAT_PROATV_CMD_DISPLAY_TEXT:{
6801 tr_len = _sat_encode_display_text(&(src_tr->terminal_rsp_data.display_text), dst_tr);
6803 case SAT_PROATV_CMD_GET_INKEY:{
6804 tr_len = _sat_encode_get_inkey(&(src_tr->terminal_rsp_data.get_inkey), dst_tr);
6806 case SAT_PROATV_CMD_GET_INPUT:{
6807 tr_len = _sat_encode_get_input(&(src_tr->terminal_rsp_data.get_input), dst_tr);
6809 case SAT_PROATV_CMD_MORE_TIME:{
6810 tr_len = _sat_encode_more_time(&(src_tr->terminal_rsp_data.more_time), dst_tr);
6812 case SAT_PROATV_CMD_PLAY_TONE:{
6813 tr_len = _sat_encode_play_tone(&(src_tr->terminal_rsp_data.play_tone), dst_tr);
6815 case SAT_PROATV_CMD_REFRESH:{
6816 tr_len = _sat_encode_refresh(&(src_tr->terminal_rsp_data.refresh), dst_tr);
6818 case SAT_PROATV_CMD_SETUP_MENU:{
6819 tr_len = _sat_encode_setup_menu(&(src_tr->terminal_rsp_data.setup_menu), dst_tr);
6821 case SAT_PROATV_CMD_SELECT_ITEM:{
6822 tr_len = _sat_encode_select_item(&(src_tr->terminal_rsp_data.select_item), dst_tr);
6824 case SAT_PROATV_CMD_SEND_SMS:{
6825 tr_len = _sat_encode_send_sms(&(src_tr->terminal_rsp_data.send_sms), dst_tr);
6827 case SAT_PROATV_CMD_SEND_SS:{
6828 tr_len = _sat_encode_send_ss(&(src_tr->terminal_rsp_data.send_ss), dst_tr);
6830 case SAT_PROATV_CMD_SEND_USSD:{
6831 tr_len = _sat_encode_send_ussd(&(src_tr->terminal_rsp_data.send_ussd), dst_tr);
6833 case SAT_PROATV_CMD_SETUP_CALL:{
6834 tr_len = _sat_encode_setup_call(&(src_tr->terminal_rsp_data.setup_call), dst_tr);
6836 case SAT_PROATV_CMD_PROVIDE_LOCAL_INFO:{
6837 tr_len = _sat_encode_provide_local_info(&(src_tr->terminal_rsp_data.provide_local_info), dst_tr);
6839 case SAT_PROATV_CMD_SETUP_EVENT_LIST:{
6840 tr_len = _sat_encode_setup_event_list(&(src_tr->terminal_rsp_data.setup_event_list), dst_tr);
6842 case SAT_PROATV_CMD_SETUP_IDLE_MODE_TEXT:{
6843 tr_len = _sat_encode_setup_idle_mode_text(&(src_tr->terminal_rsp_data.setup_idle_mode_text), dst_tr);
6845 case SAT_PROATV_CMD_SEND_DTMF:{
6846 tr_len = _sat_encode_send_dtmf(&(src_tr->terminal_rsp_data.send_dtmf), dst_tr);
6848 case SAT_PROATV_CMD_LANGUAGE_NOTIFICATION:{
6849 tr_len = _sat_encode_language_notification(&(src_tr->terminal_rsp_data.language_notification), dst_tr);
6851 case SAT_PROATV_CMD_LAUNCH_BROWSER:{
6852 tr_len = _sat_encode_launch_browser(&(src_tr->terminal_rsp_data.launch_browser), dst_tr);
6854 case SAT_PROATV_CMD_OPEN_CHANNEL:{
6855 tr_len = _sat_encode_open_channel(&(src_tr->terminal_rsp_data.open_channel), dst_tr);
6857 case SAT_PROATV_CMD_CLOSE_CHANNEL:{
6858 tr_len = _sat_encode_close_channel(&(src_tr->terminal_rsp_data.close_channel), dst_tr);
6860 case SAT_PROATV_CMD_SEND_DATA:{
6861 tr_len = _sat_encode_send_data(&(src_tr->terminal_rsp_data.send_data), dst_tr);
6863 case SAT_PROATV_CMD_RECEIVE_DATA:{
6864 tr_len = _sat_encode_receive_data(&(src_tr->terminal_rsp_data.receive_data), dst_tr);
6866 case SAT_PROATV_CMD_GET_CHANNEL_STATUS:{
6867 tr_len = _sat_encode_get_channel_status(&(src_tr->terminal_rsp_data.get_channel_status), dst_tr);
6870 err("no matched cmd type(%d)", src_tr->cmd_type);
6877 void tcore_sat_override_ops(CoreObject *o, struct tcore_sat_operations *sat_ops)
6879 struct private_object_data *po = NULL;
6881 CORE_OBJECT_CHECK(o, CORE_OBJECT_TYPE_SAT);
6883 po = (struct private_object_data *)tcore_object_ref_object(o);
6889 _clone_sat_operations(po, sat_ops);
6895 CoreObject *tcore_sat_new(TcorePlugin *p,
6896 struct tcore_sat_operations *ops, TcoreHal *hal)
6898 CoreObject *o = NULL;
6899 struct private_object_data *po = NULL;
6904 o = tcore_object_new(p, hal);
6908 po = calloc(1, sizeof(struct private_object_data));
6910 tcore_object_free(o);
6916 tcore_object_set_type(o, CORE_OBJECT_TYPE_SAT);
6917 tcore_object_link_object(o, po);
6918 tcore_object_set_clone_hook(o, _clone_hook);
6919 tcore_object_set_free_hook(o, _free_hook);
6920 tcore_object_set_dispatcher(o, _dispatcher);
6925 void tcore_sat_free(CoreObject *o)
6927 struct private_object_data *po = NULL;
6929 CORE_OBJECT_CHECK(o, CORE_OBJECT_TYPE_SAT);
6931 po = tcore_object_ref_object(o);
6936 tcore_object_free(o);