-/*\r
- * tel-plugin-imc\r
- *\r
- * Copyright (c) 2012 Samsung Electronics Co., Ltd. All rights reserved.\r
- *\r
- * Contact: Hayoon Ko <hayoon.ko@samsung.com>\r
- *\r
- * Licensed under the Apache License, Version 2.0 (the "License");\r
- * you may not use this file except in compliance with the License.\r
- * You may obtain a copy of the License at\r
- *\r
- * http://www.apache.org/licenses/LICENSE-2.0\r
- *\r
- * Unless required by applicable law or agreed to in writing, software\r
- * distributed under the License is distributed on an "AS IS" BASIS,\r
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
- * See the License for the specific language governing permissions and\r
- * limitations under the License.\r
- */\r
-\r
-\r
-/**\r
- * @open\r
- * @ingroup TelephonyAPI\r
- * @addtogroup COMMON_TAPI COMMON\r
- * @{\r
- * These error codes are used by Applications.\r
- */\r
-\r
-\r
-#ifndef _TEL_ERR_H_\r
-#define _TEL_ERR_H_\r
-/*==================================================================================================\r
- INCLUDE FILES\r
-==================================================================================================*/\r
-\r
-#ifdef __cplusplus\r
-extern "C"\r
-{\r
-#endif\r
-\r
-/*==================================================================================================\r
- CONSTANTS\r
-==================================================================================================*/\r
-\r
-\r
-/*==================================================================================================\r
- MACROS\r
-==================================================================================================*/\r
-\r
-\r
-/*==================================================================================================\r
- ENUMS\r
-==================================================================================================*/\r
-\r
-/************************************************************\r
-** Errors defined in "+CME ERROR" ,\r
-** - see 3GPP TS 27.007\r
-** - ranges are 0x00 ~ 0x7FFF\r
-************************************************************/\r
-/**\r
- Error codes sent by the modem in response to the above operations.\r
-*/\r
-typedef enum\r
-{\r
- /* GENERAL ERRORS */\r
- TAPI_OP_GEN_ERR_PHONE_FAILURE = 0, /* 0 */\r
- TAPI_OP_GEN_ERR_NO_CONNECTION_TO_PHONE, /* 1 */\r
- TAPI_OP_GEN_ERR_PHONE_ADAPTOR_LINK_RESERVED, /* 2 */\r
- TAPI_OP_GEN_ERR_OPER_NOT_ALLOWED, /* 3 */\r
- TAPI_OP_GEN_ERR_OPER_NOT_SUPPORTED, /* 4 */\r
- TAPI_OP_GEN_ERR_PH_SIM_PIN_REQU, /* 5 */\r
- TAPI_OP_GEN_ERR_PH_FSIM_PIN_REQU, /* 6 */\r
- TAPI_OP_GEN_ERR_PH_FSIM_PUK_REQU, /* 7 */\r
- TAPI_OP_GEN_ERR_SIM_NOT_INSERTED =10, /* 10 */\r
- TAPI_OP_GEN_ERR_SIM_PIN_REQU, /* 11 */\r
- TAPI_OP_GEN_ERR_SIM_PUK_REQU, /* 12 */\r
- TAPI_OP_GEN_ERR_SIM_FAILURE, /* 13 */\r
- TAPI_OP_GEN_ERR_SIM_BUSY, /* 14 */\r
- TAPI_OP_GEN_ERR_SIM_WRONG, /* 15 */\r
- TAPI_OP_GEN_ERR_INCORRECT_PW, /* 16 */\r
- TAPI_OP_GEN_ERR_SIM_PIN2_REQU, /* 17 */\r
- TAPI_OP_GEN_ERR_SIM_PUK2_REQU, /* 18 */\r
- TAPI_OP_GEN_ERR_MEM_FULL = 20, /* 20 */\r
- TAPI_OP_GEN_ERR_INVALID_INDEX, /* 21 */\r
- TAPI_OP_GEN_ERR_NOT_FOUND, /* 22 */\r
- TAPI_OP_GEN_ERR_MEM_FAILURE, /* 23 */\r
- TAPI_OP_GEN_ERR_TEXT_STR_TOO_LONG, /* 24 */\r
- TAPI_OP_GEN_ERR_INVALID_CHARACTERS_IN_TEXT_STR, /* 25 */\r
- TAPI_OP_GEN_ERR_DIAL_STR_TOO_LONG, /* 26 */\r
- TAPI_OP_GEN_ERR_INVALID_CHARACTERS_IN_DIAL_STR, /* 27 */\r
- TAPI_OP_GEN_ERR_NO_NET_SVC = 30, /* 30 */\r
- TAPI_OP_GEN_ERR_NET_TIMEOUT, /* 31 */\r
- TAPI_OP_GEN_ERR_NET_NOT_ALLOWED_EMERGENCY_CALLS_ONLY, /* 32 */\r
- TAPI_OP_GEN_ERR_NET_PERS_PIN_REQU = 40, /* 40 */\r
- TAPI_OP_GEN_ERR_NET_PERS_PUK_REQU, /* 41 */\r
- TAPI_OP_GEN_ERR_NET_SUBSET_PERS_PIN_REQU, /* 42 */\r
- TAPI_OP_GEN_ERR_NET_SUBSET_PERS_PUK_REQU, /* 43 */\r
- TAPI_OP_GEN_ERR_SVC_PROVIDER_PERS_PIN_REQU, /* 44 */\r
- TAPI_OP_GEN_ERR_SVC_PROVIDER_PERS_PUK_REQU, /* 45 */\r
- TAPI_OP_GEN_ERR_CORPORATE_PERS_PIN_REQU, /* 46 */\r
- TAPI_OP_GEN_ERR_CORPORATE_PERS_PUK_REQU, /* 47 */\r
- TAPI_OP_GEN_ERR_HIDDEN_KEY_REQU, /* 48 */\r
- TAPI_OP_GEN_ERR_UNKNOWN = 100, /* 100 */\r
-\r
- /* Errors related to a failure to perform an Attach */\r
- TAPI_OP_GEN_ERR_ILLEGAL_MS = 103, /* 103 */\r
- TAPI_OP_GEN_ERR_ILLEGAL_ME = 106, /* 106 */\r
- TAPI_OP_GEN_ERR_GPRS_SVC_NOT_ALLOWED, /* 107 */\r
- TAPI_OP_GEN_ERR_PLMN_NOT_ALLOWED = 111, /* 111 */\r
- TAPI_OP_GEN_ERR_LOCATION_AREA_NOT_ALLOWED, /* 112 */\r
- TAPI_OP_GEN_ERR_ROAMING_NOT_ALLOWED_IN_THIS_LOCATION_AREA,/* 113 */\r
-\r
- /* Errors related to a failure to Activate a Context */\r
- TAPI_OP_GEN_ERR_SVC_OPT_NOT_SUPPORTED = 132, /* 132 */\r
- TAPI_OP_GEN_ERR_REQ_SVC_OPT_NOT_SUBSCRIBED, /* 133 */\r
- TAPI_OP_GEN_ERR_SVC_OPT_TEMPORARILY_OUT_OF_ORDER, /* 134 */\r
- TAPI_OP_GEN_ERR_UNSPECIFIED_GPRS_ERR = 148, /* 148 */\r
- TAPI_OP_GEN_ERR_PDP_AUTHENTICATION_FAILURE, /* 149 */\r
- TAPI_OP_GEN_ERR_INVALID_MOBILE_CLASS, /* 150 */\r
-\r
- /* VBS / VGCS and eMLPP -related errors */\r
- TAPI_OP_GEN_ERR_VBS_VGCS_NOT_SUPPORTED_BY_THE_NET = 151, /* 151 */\r
- TAPI_OP_GEN_ERR_NO_SVC_SUBSCRIPTION_ON_SIM, /* 152 */\r
- TAPI_OP_GEN_ERR_NO_SUBSCRIPTION_FOR_GROUP_ID, /* 153 */\r
- TAPI_OP_GEN_ERR_GROUP_ID_NOT_ACTIVATED_ON_SIM, /* 154 */\r
- TAPI_OP_GEN_ERR_NO_MATCHING_NOTI = 155, /* 155 */\r
- TAPI_OP_GEN_ERR_VBS_VGCS_CALL_ALREADY_PRESENT, /* 156 */\r
- TAPI_OP_GEN_ERR_CONGESTION, /* 157 */\r
- TAPI_OP_GEN_ERR_NET_FAILURE, /* 158 */\r
- TAPI_OP_GEN_ERR_UPLINK_BUSY, /* 159 */\r
- TAPI_OP_GEN_ERR_NO_ACCESS_RIGHTS_FOR_SIM_FILE = 160, /* 160 */\r
- TAPI_OP_GEN_ERR_NO_SUBSCRIPTION_FOR_PRIORITY, /* 161 */\r
- TAPI_OP_GEN_ERR_OPER_NOT_APPLICABLE_OR_NOT_POSSIBLE, /* 162 */\r
-\r
-\r
- /************************************************************\r
- ** SAMSUNG ADDED ERRORS\r
- ************************************************************/\r
- TAPI_OP_GEN_ERR_NONE = 0x8000, /* 0x8000 : No Errors */\r
-\r
- /* General Common Errors : 0x8000 - 0x80FF */\r
- TAPI_OP_GEN_ERR_INVALID_FORMAT, /* 0x8001 : Invalid Parameter or Format */\r
- TAPI_OP_GEN_ERR_PHONE_OFFLINE, /* 0x8002 : */\r
- TAPI_OP_GEN_ERR_CMD_NOT_ALLOWED, /* 0x8003 : */\r
- TAPI_OP_GEN_ERR_PHONE_IS_INUSE, /* 0x8004 : */\r
- TAPI_OP_GEN_ERR_INVALID_STATE = 0x8005, /* 0x8005 : */\r
-\r
- TAPI_OP_GEN_ERR_NO_BUFFER, /* 0x8006 : No internal free buffers */\r
- TAPI_OP_GEN_ERR_OPER_REJ, /* 0x8007 : Operation Rejected */\r
- TAPI_OP_GEN_ERR_INSUFFICIENT_RESOURCE, /* 0x8008 : insufficient resource */\r
- TAPI_OP_GEN_ERR_NET_NOT_RESPOND, /* 0x8009 : Network not responding */\r
- TAPI_OP_GEN_ERR_SIM_PIN_ENABLE_REQ = 0x800A, /* 0x800A : SIM Pin Enable Required */\r
- TAPI_OP_GEN_ERR_SIM_PERM_BLOCKED, /* 0x800B : SIM Permanent Blocked */\r
- TAPI_OP_GEN_ERR_SIM_PHONEBOOK_RESTRICTED, /*0x800C: SIM Phonebook Restricted*/\r
- TAPI_OP_GEM_ERR_FIXED_DIALING_NUMBER_ONLY, /*0x800D: Restricted By FDN Mode */\r
-\r
- /* Reserved : 0x800E ~ 0x80FF */\r
- TAPI_OP_GEN_ERR_800E_RESERVED_START = 0x800E, /* 0x800E */\r
-\r
- TAPI_OP_GEN_ERR_80FF_RESERVED_END = 0x80ff, /* 0x80FF */\r
-\r
- /* the other errors */\r
- TAPI_OP_GEN_ERR_OTHERS = 0xFFFE, /* 0xFFFE */\r
-\r
- TAPI_OP_GEN_ERR_MAX = 0xFFFF\r
-\r
-}tapi_phone_err_t;\r
-\r
-\r
-/*==================================================================================================\r
- STRUCTURES AND OTHER TYPEDEFS\r
-==================================================================================================*/\r
-\r
-\r
-/*==================================================================================================\r
- FUNCTION PROTOTYPES\r
-==================================================================================================*/\r
-\r
-\r
-#ifdef __cplusplus\r
-}\r
-#endif\r
-\r
-#endif // _TEL_ERR_H_\r
-\r
-/**\r
-* @}\r
-*/\r
-\r
+/*
+ * tel-plugin-imc
+ *
+ * Copyright (c) 2012 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: Hayoon Ko <hayoon.ko@samsung.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/**
+ * @open
+ * @ingroup TelephonyAPI
+ * @addtogroup COMMON_TAPI COMMON
+ * @{
+ * These error codes are used by Applications.
+ */
+
+
+#ifndef _TEL_ERR_H_
+#define _TEL_ERR_H_
+/*==================================================================================================
+ INCLUDE FILES
+==================================================================================================*/
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+/*==================================================================================================
+ CONSTANTS
+==================================================================================================*/
+
+
+/*==================================================================================================
+ MACROS
+==================================================================================================*/
+
+
+/*==================================================================================================
+ ENUMS
+==================================================================================================*/
+
+/************************************************************
+** Errors defined in "+CME ERROR" ,
+** - see 3GPP TS 27.007
+** - ranges are 0x00 ~ 0x7FFF
+************************************************************/
+/**
+ Error codes sent by the modem in response to the above operations.
+*/
+typedef enum {
+ /* GENERAL ERRORS */
+ TAPI_OP_GEN_ERR_PHONE_FAILURE = 0, /* 0 */
+ TAPI_OP_GEN_ERR_NO_CONNECTION_TO_PHONE, /* 1 */
+ TAPI_OP_GEN_ERR_PHONE_ADAPTOR_LINK_RESERVED, /* 2 */
+ TAPI_OP_GEN_ERR_OPER_NOT_ALLOWED, /* 3 */
+ TAPI_OP_GEN_ERR_OPER_NOT_SUPPORTED, /* 4 */
+ TAPI_OP_GEN_ERR_PH_SIM_PIN_REQU, /* 5 */
+ TAPI_OP_GEN_ERR_PH_FSIM_PIN_REQU, /* 6 */
+ TAPI_OP_GEN_ERR_PH_FSIM_PUK_REQU, /* 7 */
+ TAPI_OP_GEN_ERR_SIM_NOT_INSERTED = 10, /* 10 */
+ TAPI_OP_GEN_ERR_SIM_PIN_REQU, /* 11 */
+ TAPI_OP_GEN_ERR_SIM_PUK_REQU, /* 12 */
+ TAPI_OP_GEN_ERR_SIM_FAILURE, /* 13 */
+ TAPI_OP_GEN_ERR_SIM_BUSY, /* 14 */
+ TAPI_OP_GEN_ERR_SIM_WRONG, /* 15 */
+ TAPI_OP_GEN_ERR_INCORRECT_PW, /* 16 */
+ TAPI_OP_GEN_ERR_SIM_PIN2_REQU, /* 17 */
+ TAPI_OP_GEN_ERR_SIM_PUK2_REQU, /* 18 */
+ TAPI_OP_GEN_ERR_MEM_FULL = 20, /* 20 */
+ TAPI_OP_GEN_ERR_INVALID_INDEX, /* 21 */
+ TAPI_OP_GEN_ERR_NOT_FOUND, /* 22 */
+ TAPI_OP_GEN_ERR_MEM_FAILURE, /* 23 */
+ TAPI_OP_GEN_ERR_TEXT_STR_TOO_LONG, /* 24 */
+ TAPI_OP_GEN_ERR_INVALID_CHARACTERS_IN_TEXT_STR, /* 25 */
+ TAPI_OP_GEN_ERR_DIAL_STR_TOO_LONG, /* 26 */
+ TAPI_OP_GEN_ERR_INVALID_CHARACTERS_IN_DIAL_STR, /* 27 */
+ TAPI_OP_GEN_ERR_NO_NET_SVC = 30, /* 30 */
+ TAPI_OP_GEN_ERR_NET_TIMEOUT, /* 31 */
+ TAPI_OP_GEN_ERR_NET_NOT_ALLOWED_EMERGENCY_CALLS_ONLY, /* 32 */
+ TAPI_OP_GEN_ERR_NET_PERS_PIN_REQU = 40, /* 40 */
+ TAPI_OP_GEN_ERR_NET_PERS_PUK_REQU, /* 41 */
+ TAPI_OP_GEN_ERR_NET_SUBSET_PERS_PIN_REQU, /* 42 */
+ TAPI_OP_GEN_ERR_NET_SUBSET_PERS_PUK_REQU, /* 43 */
+ TAPI_OP_GEN_ERR_SVC_PROVIDER_PERS_PIN_REQU, /* 44 */
+ TAPI_OP_GEN_ERR_SVC_PROVIDER_PERS_PUK_REQU, /* 45 */
+ TAPI_OP_GEN_ERR_CORPORATE_PERS_PIN_REQU, /* 46 */
+ TAPI_OP_GEN_ERR_CORPORATE_PERS_PUK_REQU, /* 47 */
+ TAPI_OP_GEN_ERR_HIDDEN_KEY_REQU, /* 48 */
+ TAPI_OP_GEN_ERR_UNKNOWN = 100, /* 100 */
+
+ /* Errors related to a failure to perform an Attach */
+ TAPI_OP_GEN_ERR_ILLEGAL_MS = 103, /* 103 */
+ TAPI_OP_GEN_ERR_ILLEGAL_ME = 106, /* 106 */
+ TAPI_OP_GEN_ERR_GPRS_SVC_NOT_ALLOWED, /* 107 */
+ TAPI_OP_GEN_ERR_PLMN_NOT_ALLOWED = 111, /* 111 */
+ TAPI_OP_GEN_ERR_LOCATION_AREA_NOT_ALLOWED, /* 112 */
+ TAPI_OP_GEN_ERR_ROAMING_NOT_ALLOWED_IN_THIS_LOCATION_AREA, /* 113 */
+
+ /* Errors related to a failure to Activate a Context */
+ TAPI_OP_GEN_ERR_SVC_OPT_NOT_SUPPORTED = 132, /* 132 */
+ TAPI_OP_GEN_ERR_REQ_SVC_OPT_NOT_SUBSCRIBED, /* 133 */
+ TAPI_OP_GEN_ERR_SVC_OPT_TEMPORARILY_OUT_OF_ORDER, /* 134 */
+ TAPI_OP_GEN_ERR_UNSPECIFIED_GPRS_ERR = 148, /* 148 */
+ TAPI_OP_GEN_ERR_PDP_AUTHENTICATION_FAILURE, /* 149 */
+ TAPI_OP_GEN_ERR_INVALID_MOBILE_CLASS, /* 150 */
+
+ /* VBS / VGCS and eMLPP -related errors */
+ TAPI_OP_GEN_ERR_VBS_VGCS_NOT_SUPPORTED_BY_THE_NET = 151, /* 151 */
+ TAPI_OP_GEN_ERR_NO_SVC_SUBSCRIPTION_ON_SIM, /* 152 */
+ TAPI_OP_GEN_ERR_NO_SUBSCRIPTION_FOR_GROUP_ID, /* 153 */
+ TAPI_OP_GEN_ERR_GROUP_ID_NOT_ACTIVATED_ON_SIM, /* 154 */
+ TAPI_OP_GEN_ERR_NO_MATCHING_NOTI = 155, /* 155 */
+ TAPI_OP_GEN_ERR_VBS_VGCS_CALL_ALREADY_PRESENT, /* 156 */
+ TAPI_OP_GEN_ERR_CONGESTION, /* 157 */
+ TAPI_OP_GEN_ERR_NET_FAILURE, /* 158 */
+ TAPI_OP_GEN_ERR_UPLINK_BUSY, /* 159 */
+ TAPI_OP_GEN_ERR_NO_ACCESS_RIGHTS_FOR_SIM_FILE = 160, /* 160 */
+ TAPI_OP_GEN_ERR_NO_SUBSCRIPTION_FOR_PRIORITY, /* 161 */
+ TAPI_OP_GEN_ERR_OPER_NOT_APPLICABLE_OR_NOT_POSSIBLE, /* 162 */
+
+
+ /************************************************************
+ ** SAMSUNG ADDED ERRORS
+ ************************************************************/
+ TAPI_OP_GEN_ERR_NONE = 0x8000, /* 0x8000 : No Errors */
+
+ /* General Common Errors : 0x8000 - 0x80FF */
+ TAPI_OP_GEN_ERR_INVALID_FORMAT, /* 0x8001 : Invalid Parameter or Format */
+ TAPI_OP_GEN_ERR_PHONE_OFFLINE, /* 0x8002 : */
+ TAPI_OP_GEN_ERR_CMD_NOT_ALLOWED, /* 0x8003 : */
+ TAPI_OP_GEN_ERR_PHONE_IS_INUSE, /* 0x8004 : */
+ TAPI_OP_GEN_ERR_INVALID_STATE = 0x8005, /* 0x8005 : */
+
+ TAPI_OP_GEN_ERR_NO_BUFFER, /* 0x8006 : No internal free buffers */
+ TAPI_OP_GEN_ERR_OPER_REJ, /* 0x8007 : Operation Rejected */
+ TAPI_OP_GEN_ERR_INSUFFICIENT_RESOURCE, /* 0x8008 : insufficient resource */
+ TAPI_OP_GEN_ERR_NET_NOT_RESPOND, /* 0x8009 : Network not responding */
+ TAPI_OP_GEN_ERR_SIM_PIN_ENABLE_REQ = 0x800A, /* 0x800A : SIM Pin Enable Required */
+ TAPI_OP_GEN_ERR_SIM_PERM_BLOCKED, /* 0x800B : SIM Permanent Blocked */
+ TAPI_OP_GEN_ERR_SIM_PHONEBOOK_RESTRICTED, /*0x800C: SIM Phonebook Restricted*/
+ TAPI_OP_GEM_ERR_FIXED_DIALING_NUMBER_ONLY, /*0x800D: Restricted By FDN Mode */
+
+ /* Reserved : 0x800E ~ 0x80FF */
+ TAPI_OP_GEN_ERR_800E_RESERVED_START = 0x800E, /* 0x800E */
+
+ TAPI_OP_GEN_ERR_80FF_RESERVED_END = 0x80ff, /* 0x80FF */
+
+ /* the other errors */
+ TAPI_OP_GEN_ERR_OTHERS = 0xFFFE, /* 0xFFFE */
+
+ TAPI_OP_GEN_ERR_MAX = 0xFFFF
+} tapi_phone_err_t;
+
+
+/*==================================================================================================
+ STRUCTURES AND OTHER TYPEDEFS
+==================================================================================================*/
+
+
+/*==================================================================================================
+ FUNCTION PROTOTYPES
+==================================================================================================*/
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif // _TEL_ERR_H_
+
+/**
+* @}
+*/
-/*\r
- * tel-plugin-imc\r
- *\r
- * Copyright (c) 2012 Samsung Electronics Co., Ltd. All rights reserved.\r
- *\r
- * Contact: Sharanayya Mathapati <sharan.m@samsung.com>\r
- *\r
- * Licensed under the Apache License, Version 2.0 (the "License");\r
- * you may not use this file except in compliance with the License.\r
- * You may obtain a copy of the License at\r
- *\r
- * http://www.apache.org/licenses/LICENSE-2.0\r
- *\r
- * Unless required by applicable law or agreed to in writing, software\r
- * distributed under the License is distributed on an "AS IS" BASIS,\r
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
- * See the License for the specific language governing permissions and\r
- * limitations under the License.\r
- */\r
-\r
-#ifndef __S_CALL_H__\r
-#define __S_CALL_H__\r
-\r
-gboolean s_call_init(TcorePlugin *p, TcoreHal *h);\r
-void s_call_exit(TcorePlugin *p);\r
-\r
-#endif\r
-\r
+/*
+ * tel-plugin-imc
+ *
+ * Copyright (c) 2012 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: Sharanayya Mathapati <sharan.m@samsung.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __S_CALL_H__
+#define __S_CALL_H__
+
+gboolean s_call_init(TcorePlugin *p, TcoreHal *h);
+void s_call_exit(TcorePlugin *p);
+
+#endif
-/*\r
- * tel-plugin-imc\r
- *\r
- * Copyright (c) 2012 Samsung Electronics Co., Ltd. All rights reserved.\r
- *\r
- * Contact: Hayoon Ko <hayoon.ko@samsung.com>\r
- *\r
- * Licensed under the Apache License, Version 2.0 (the "License");\r
- * you may not use this file except in compliance with the License.\r
- * You may obtain a copy of the License at\r
- *\r
- * http://www.apache.org/licenses/LICENSE-2.0\r
- *\r
- * Unless required by applicable law or agreed to in writing, software\r
- * distributed under the License is distributed on an "AS IS" BASIS,\r
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
- * See the License for the specific language governing permissions and\r
- * limitations under the License.\r
- */\r
-\r
-\r
-#ifndef __S_COMMON_H__\r
-#define __S_COMMON_H__\r
-\r
-#include <tcore.h>\r
-#include <glib.h>\r
-#include <user_request.h>\r
-\r
-\r
-#define EVENT_SYS_NOTI_MODEM_POWER "system_power"\r
-#define EVENT_NOTI_MODEM_POWER "modem_power"\r
-#define EVENT_NOTI_MODEM_PHONE_STATE "modem_phone_state"\r
-#define EVENT_NOTI_MODEM_PIN_CTRL "ps_pin_control"\r
-\r
-#define EVENT_NOTI_CALL_STATUS "call_status"\r
-#define EVENT_NOTI_CALL_INCOMING "call_incoming"\r
-#define EVENT_NOTI_CALL_WAITING "call_waiting"\r
-#define EVENT_NOTI_CALL_SOUND_WBAMR_REPORT "call_sound_wbamr_report"\r
-#define EVENT_NOTI_CALL_SOUND_TWO_MIC "call_sound_two_mic"\r
-#define EVENT_NOTI_CALL_SOUND_DHA "call_sound_dha"\r
-\r
-#define EVENT_NOTI_SS_INFO "ss_info"\r
-#define EVENT_NOTI_SS_USSD "ss_ussd"\r
-\r
-#define EVENT_NOTI_PS_CALL_STATUS "ps_call_status"\r
-#define EVENT_NOTI_PS_DATA_COUNTER "ps_data_counter"\r
-#define EVENT_NOTI_PS_IPCONFIGURATION "ps_ipconfiguration"\r
-#define EVENT_NOTI_PS_HSDPA_STATUS "ps_hsdpa_status"\r
-#define EVENT_NOTI_PS_ATTACH_DETACH "ps_attach_detach"\r
-#define EVENT_NOTI_PS_EXTERNAL_CALL "ps_external_call"\r
-\r
-#define EVENT_NOTI_SAP_STATUS "sap_status"\r
-#define EVENT_NOTI_SAP_DISCONNECT "sap_disconnect"\r
-\r
-#define EVENT_NOTI_SIM_PIN_STATUS "sim_pin_status"\r
-\r
-#define EVENT_NOTI_SAT_ENVELOPE_RESP "sat_envelope_response"\r
-#define EVENT_NOTI_SAT_REFRESH_STATUS "sat_refresh_status"\r
-#define EVENT_NOTI_SAT_PROACTIVE_COMMAND "sat_proactive_command"\r
-#define EVENT_NOTI_SAT_CONTROL_RESULT "sat_control_result"\r
-\r
-#define EVENT_NOTI_NETWORK_REGISTRATION "network_regist"\r
-#define EVENT_NOTI_NETWORK_ICON_INFO "network_icon_info"\r
-#define EVENT_NOTI_NETWORK_TIME_INFO "network_time_info"\r
-#define EVENT_NOTI_NETWORK_IDENTITY "network_identity"\r
-\r
-#define EVENT_NOTI_SMS_INCOM_MSG "sms_incom_msg"\r
-#define EVENT_NOTI_SMS_SEND_ACK "sms_send_ack"\r
-#define EVENT_NOTI_SMS_MEMORY_STATUS "sms_memory_status"\r
-#define EVENT_NOTI_SMS_CB_INCOM_MSG "sms_cb_incom_msg"\r
-#define EVENT_NOTI_SMS_DELETE_MSG_CNF "sms_delete_msg_cnf"\r
-#define EVENT_NOTI_SMS_WRITE_MSG_CNF "sms_write_msg_cnf"\r
-#define EVENT_NOTI_SMS_DELIVERY_RPT_CNF "sms_deliver_rpt_cnf"\r
-#define EVENT_NOTI_SMS_DEVICE_READY "sms_device_ready"\r
-\r
-#define EVENT_NOTI_PHONEBOOK_STATUS "phonebook_status"\r
-#define EVENT_NOTI_PHONEBOOK_FIRST_INDEX "phonebook_first_index"\r
-\r
-#define EVENT_NOTI_GPS_ASSIST_DATA "gps_assist_data"\r
-#define EVENT_IND_GPS_MEASURE_POSITION "gps_measure_position"\r
-#define EVENT_NOTI_RESET_ASSIST_DATA "gps_reset_assist_data"\r
-\r
-enum direction_e {\r
- RX,\r
- TX\r
-};\r
-\r
-struct global_data {\r
- unsigned int msg_auto_id_current;\r
- unsigned int msg_auto_id_start;\r
- unsigned int msg_auto_id_end;\r
- \r
- TcoreHal *hal;\r
-};\r
-\r
-struct work_queue_data {\r
- unsigned int id;\r
- UserRequest *ur;\r
-};\r
-\r
-#define UTIL_ID(hdr) ((hdr).main_cmd << 8 | (hdr).sub_cmd)\r
-#define UTIL_IDP(hdr) ((hdr)->main_cmd << 8 | (hdr)->sub_cmd)\r
-\r
-void hook_hex_dump(enum direction_e d, int size, const void *data);\r
-unsigned int util_assign_message_sequence_id(TcorePlugin *p);\r
-gboolean util_add_waiting_job(GQueue *queue, unsigned int id, UserRequest *ur);\r
-UserRequest* util_pop_waiting_job(GQueue *queue, unsigned int id);\r
-void util_hex_dump(char *pad, int size, const void *data);\r
-unsigned char util_hexCharToInt(char c);\r
-char* util_hexStringToBytes(char * s);\r
-char* util_removeQuotes(void *data);
-\r
-#endif\r
+/*
+ * tel-plugin-imc
+ *
+ * Copyright (c) 2012 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: Hayoon Ko <hayoon.ko@samsung.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __S_COMMON_H__
+#define __S_COMMON_H__
+
+#include <tcore.h>
+#include <glib.h>
+#include <user_request.h>
+
+#define EVENT_SYS_NOTI_MODEM_POWER "system_power"
+#define EVENT_NOTI_MODEM_POWER "modem_power"
+#define EVENT_NOTI_MODEM_PHONE_STATE "modem_phone_state"
+#define EVENT_NOTI_MODEM_PIN_CTRL "ps_pin_control"
+
+#define EVENT_NOTI_CALL_STATUS "call_status"
+#define EVENT_NOTI_CALL_INCOMING "call_incoming"
+#define EVENT_NOTI_CALL_WAITING "call_waiting"
+#define EVENT_NOTI_CALL_SOUND_WBAMR_REPORT "call_sound_wbamr_report"
+#define EVENT_NOTI_CALL_SOUND_TWO_MIC "call_sound_two_mic"
+#define EVENT_NOTI_CALL_SOUND_DHA "call_sound_dha"
+
+#define EVENT_NOTI_SS_INFO "ss_info"
+#define EVENT_NOTI_SS_USSD "ss_ussd"
+
+#define EVENT_NOTI_PS_CALL_STATUS "ps_call_status"
+#define EVENT_NOTI_PS_DATA_COUNTER "ps_data_counter"
+#define EVENT_NOTI_PS_IPCONFIGURATION "ps_ipconfiguration"
+#define EVENT_NOTI_PS_HSDPA_STATUS "ps_hsdpa_status"
+#define EVENT_NOTI_PS_ATTACH_DETACH "ps_attach_detach"
+#define EVENT_NOTI_PS_EXTERNAL_CALL "ps_external_call"
+
+#define EVENT_NOTI_SAP_STATUS "sap_status"
+#define EVENT_NOTI_SAP_DISCONNECT "sap_disconnect"
+
+#define EVENT_NOTI_SIM_PIN_STATUS "sim_pin_status"
+
+#define EVENT_NOTI_SAT_ENVELOPE_RESP "sat_envelope_response"
+#define EVENT_NOTI_SAT_REFRESH_STATUS "sat_refresh_status"
+#define EVENT_NOTI_SAT_PROACTIVE_COMMAND "sat_proactive_command"
+#define EVENT_NOTI_SAT_CONTROL_RESULT "sat_control_result"
+
+#define EVENT_NOTI_NETWORK_REGISTRATION "network_regist"
+#define EVENT_NOTI_NETWORK_ICON_INFO "network_icon_info"
+#define EVENT_NOTI_NETWORK_TIME_INFO "network_time_info"
+#define EVENT_NOTI_NETWORK_IDENTITY "network_identity"
+
+#define EVENT_NOTI_SMS_INCOM_MSG "sms_incom_msg"
+#define EVENT_NOTI_SMS_SEND_ACK "sms_send_ack"
+#define EVENT_NOTI_SMS_MEMORY_STATUS "sms_memory_status"
+#define EVENT_NOTI_SMS_CB_INCOM_MSG "sms_cb_incom_msg"
+#define EVENT_NOTI_SMS_DELETE_MSG_CNF "sms_delete_msg_cnf"
+#define EVENT_NOTI_SMS_WRITE_MSG_CNF "sms_write_msg_cnf"
+#define EVENT_NOTI_SMS_DELIVERY_RPT_CNF "sms_deliver_rpt_cnf"
+#define EVENT_NOTI_SMS_DEVICE_READY "sms_device_ready"
+
+#define EVENT_NOTI_PHONEBOOK_STATUS "phonebook_status"
+#define EVENT_NOTI_PHONEBOOK_FIRST_INDEX "phonebook_first_index"
+
+#define EVENT_NOTI_GPS_ASSIST_DATA "gps_assist_data"
+#define EVENT_IND_GPS_MEASURE_POSITION "gps_measure_position"
+#define EVENT_NOTI_RESET_ASSIST_DATA "gps_reset_assist_data"
+
+enum direction_e {
+ RX,
+ TX
+};
+
+struct global_data {
+ unsigned int msg_auto_id_current;
+ unsigned int msg_auto_id_start;
+ unsigned int msg_auto_id_end;
+
+ TcoreHal *hal;
+};
+
+struct work_queue_data {
+ unsigned int id;
+ UserRequest *ur;
+};
+
+#define UTIL_ID(hdr) ((hdr).main_cmd << 8 | (hdr).sub_cmd)
+#define UTIL_IDP(hdr) ((hdr)->main_cmd << 8 | (hdr)->sub_cmd)
+
+void hook_hex_dump(enum direction_e d, int size, const void *data);
+unsigned int util_assign_message_sequence_id(TcorePlugin *p);
+gboolean util_add_waiting_job(GQueue *queue, unsigned int id, UserRequest *ur);
+UserRequest* util_pop_waiting_job(GQueue *queue, unsigned int id);
+void util_hex_dump(char *pad, int size, const void *data);
+unsigned char util_hexCharToInt(char c);
+char* util_hexStringToBytes(char *s);
+char* util_removeQuotes(void *data);
+
+#endif
-/*\r
- * tel-plugin-imc\r
- *\r
- * Copyright (c) 2012 Samsung Electronics Co., Ltd. All rights reserved.\r
- *\r
- * Contact: Ja-young Gu <jygu@samsung.com>\r
- *\r
- * Licensed under the Apache License, Version 2.0 (the "License");\r
- * you may not use this file except in compliance with the License.\r
- * You may obtain a copy of the License at\r
- *\r
- * http://www.apache.org/licenses/LICENSE-2.0\r
- *\r
- * Unless required by applicable law or agreed to in writing, software\r
- * distributed under the License is distributed on an "AS IS" BASIS,\r
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
- * See the License for the specific language governing permissions and\r
- * limitations under the License.\r
- */\r
-\r
-#ifndef __S_DISPATCH_H__\r
-#define __S_DISPATCH_H__\r
-\r
-void do_factory(TcoreHal *h, const ipc_message_type *ipc);\r
-void do_notification_message(TcorePlugin *p, const ipc_message_type *ipc);\r
-void do_notification_sys_message(TcorePlugin *p, const void *data);\r
-\r
-#endif\r
+/*
+ * tel-plugin-imc
+ *
+ * Copyright (c) 2012 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: Ja-young Gu <jygu@samsung.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __S_DISPATCH_H__
+#define __S_DISPATCH_H__
+
+void do_factory(TcoreHal *h, const ipc_message_type *ipc);
+void do_notification_message(TcorePlugin *p, const ipc_message_type *ipc);
+void do_notification_sys_message(TcorePlugin *p, const void *data);
+
+#endif
-/*\r
- * tel-plugin-imc\r
- *\r
- * Copyright (c) 2012 Samsung Electronics Co., Ltd. All rights reserved.\r
- *\r
- * Contact: Arun Shukla <arun.shukla@samsung.com>\r
- *\r
- * Licensed under the Apache License, Version 2.0 (the "License");\r
- * you may not use this file except in compliance with the License.\r
- * You may obtain a copy of the License at\r
- *\r
- * http://www.apache.org/licenses/LICENSE-2.0\r
- *\r
- * Unless required by applicable law or agreed to in writing, software\r
- * distributed under the License is distributed on an "AS IS" BASIS,\r
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
- * See the License for the specific language governing permissions and\r
- * limitations under the License.\r
- */\r
-\r
-\r
-#ifndef __S_GPS_H__\r
-#define __S_GPS_H__\r
-\r
-\r
-gboolean s_gps_init(TcorePlugin *p, TcoreHal *h);\r
-void s_gps_exit(TcorePlugin *p);\r
-\r
-#endif\r
+/*
+ * tel-plugin-imc
+ *
+ * Copyright (c) 2012 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: Arun Shukla <arun.shukla@samsung.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __S_GPS_H__
+#define __S_GPS_H__
+
+gboolean s_gps_init(TcorePlugin *p, TcoreHal *h);
+void s_gps_exit(TcorePlugin *p);
+
+#endif
-/*\r
- * tel-plugin-imc\r
- *\r
- * Copyright (c) 2012 Samsung Electronics Co., Ltd. All rights reserved.\r
- *\r
- * Contact: Hayoon Ko <hayoon.ko@samsung.com>\r
- *\r
- * Licensed under the Apache License, Version 2.0 (the "License");\r
- * you may not use this file except in compliance with the License.\r
- * You may obtain a copy of the License at\r
- *\r
- * http://www.apache.org/licenses/LICENSE-2.0\r
- *\r
- * Unless required by applicable law or agreed to in writing, software\r
- * distributed under the License is distributed on an "AS IS" BASIS,\r
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
- * See the License for the specific language governing permissions and\r
- * limitations under the License.\r
- */\r
-\r
-\r
-#ifndef __S_MODEM_H__\r
-#define __S_MODEM_H__\r
-\r
-gboolean on_event_modem_power(TcoreAT *at, const char *line, TcorePlugin *p);\r
-\r
-gboolean s_modem_init(TcorePlugin *p, TcoreHal *h);\r
-void s_modem_exit(TcorePlugin *p);\r
-\r
-gboolean s_modem_send_poweron(TcorePlugin *p);\r
-#endif\r
+/*
+ * tel-plugin-imc
+ *
+ * Copyright (c) 2012 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: Hayoon Ko <hayoon.ko@samsung.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __S_MODEM_H__
+#define __S_MODEM_H__
+
+gboolean on_event_modem_power(TcoreAT *at, const char *line, TcorePlugin *p);
+gboolean s_modem_init(TcorePlugin *p, TcoreHal *h);
+void s_modem_exit(TcorePlugin *p);
+gboolean s_modem_send_poweron(TcorePlugin *p);
+
+#endif
-/*\r
- * tel-plugin-imc\r
- *\r
- * Copyright (c) 2012 Samsung Electronics Co., Ltd. All rights reserved.\r
- *\r
- * Contact: Harish Bishnoi <hbishnoi@samsung.com>\r
- *\r
- * Licensed under the Apache License, Version 2.0 (the "License");\r
- * you may not use this file except in compliance with the License.\r
- * You may obtain a copy of the License at\r
- *\r
- * http://www.apache.org/licenses/LICENSE-2.0\r
- *\r
- * Unless required by applicable law or agreed to in writing, software\r
- * distributed under the License is distributed on an "AS IS" BASIS,\r
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
- * See the License for the specific language governing permissions and\r
- * limitations under the License.\r
- */\r
-\r
-\r
-#ifndef __S_NETWORK_H__\r
-#define __S_NETWORK_H__\r
-\r
-\r
-gboolean s_network_init(TcorePlugin *p, TcoreHal *h);\r
-void s_network_exit(TcorePlugin *p);\r
-\r
-#endif\r
+/*
+ * tel-plugin-imc
+ *
+ * Copyright (c) 2012 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: Harish Bishnoi <hbishnoi@samsung.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __S_NETWORK_H__
+#define __S_NETWORK_H__
+
+gboolean s_network_init(TcorePlugin *p, TcoreHal *h);
+void s_network_exit(TcorePlugin *p);
+
+#endif
-/*\r
- * tel-plugin-imc\r
- *\r
- * Copyright (c) 2012 Samsung Electronics Co., Ltd. All rights reserved.\r
- *\r
- * Contact: Ja-young Gu <jygu@samsung.com>\r
- *\r
- * Licensed under the Apache License, Version 2.0 (the "License");\r
- * you may not use this file except in compliance with the License.\r
- * You may obtain a copy of the License at\r
- *\r
- * http://www.apache.org/licenses/LICENSE-2.0\r
- *\r
- * Unless required by applicable law or agreed to in writing, software\r
- * distributed under the License is distributed on an "AS IS" BASIS,\r
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
- * See the License for the specific language governing permissions and\r
- * limitations under the License.\r
- */\r
-\r
-\r
-#ifndef S_PHONEBOOK_H_\r
-#define S_PHONEBOOK_H_\r
-\r
-gboolean s_phonebook_init(TcorePlugin *p, TcoreHal *h);\r
-void s_phonebook_exit(TcorePlugin *p);\r
-\r
-#endif /* S_PHONEBOOK_H_ */\r
+/*
+ * tel-plugin-imc
+ *
+ * Copyright (c) 2012 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: Ja-young Gu <jygu@samsung.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef S_PHONEBOOK_H_
+#define S_PHONEBOOK_H_
+
+gboolean s_phonebook_init(TcorePlugin *p, TcoreHal *h);
+void s_phonebook_exit(TcorePlugin *p);
+
+#endif /* S_PHONEBOOK_H_ */
-/*\r
- * tel-plugin-imc\r
- *\r
- * Copyright (c) 2012 Samsung Electronics Co., Ltd. All rights reserved.\r
- *\r
- * Contact: Arun Shukla <arun.shukla@samsung.com>\r
- *\r
- * Licensed under the Apache License, Version 2.0 (the "License");\r
- * you may not use this file except in compliance with the License.\r
- * You may obtain a copy of the License at\r
- *\r
- * http://www.apache.org/licenses/LICENSE-2.0\r
- *\r
- * Unless required by applicable law or agreed to in writing, software\r
- * distributed under the License is distributed on an "AS IS" BASIS,\r
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
- * See the License for the specific language governing permissions and\r
- * limitations under the License.\r
- */\r
-\r
- \r
-#ifndef __S_PS_H__\r
-#define __S_PS_H__\r
-\r
-gboolean s_ps_init(TcorePlugin *p,TcoreHal *hal);\r
-void s_ps_exit(TcorePlugin *p);\r
-\r
-\r
-#endif/*__S_PS_H__*/\r
+/*
+ * tel-plugin-imc
+ *
+ * Copyright (c) 2012 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: Arun Shukla <arun.shukla@samsung.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __S_PS_H__
+#define __S_PS_H__
+
+gboolean s_ps_init(TcorePlugin *p, TcoreHal *hal);
+void s_ps_exit(TcorePlugin *p);
+
+#endif /*__S_PS_H__*/
-/*\r
- * tel-plugin-imc\r
- *\r
- * Copyright (c) 2012 Samsung Electronics Co., Ltd. All rights reserved.\r
- *\r
- * Contact: Hayoon Ko <hayoon.ko@samsung.com>\r
- *\r
- * Licensed under the Apache License, Version 2.0 (the "License");\r
- * you may not use this file except in compliance with the License.\r
- * You may obtain a copy of the License at\r
- *\r
- * http://www.apache.org/licenses/LICENSE-2.0\r
- *\r
- * Unless required by applicable law or agreed to in writing, software\r
- * distributed under the License is distributed on an "AS IS" BASIS,\r
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
- * See the License for the specific language governing permissions and\r
- * limitations under the License.\r
- */\r
-\r
-\r
-#ifndef S_SAP_H_\r
-#define S_SAP_H_\r
-\r
-gboolean s_sap_init(TcorePlugin *p, TcoreHal *h);\r
-void s_sap_exit(TcorePlugin *p);\r
-\r
-#endif /* S_SAP_H_ */\r
+/*
+ * tel-plugin-imc
+ *
+ * Copyright (c) 2012 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: Hayoon Ko <hayoon.ko@samsung.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef S_SAP_H_
+#define S_SAP_H_
+
+gboolean s_sap_init(TcorePlugin *p, TcoreHal *h);
+void s_sap_exit(TcorePlugin *p);
+
+#endif /* S_SAP_H_ */
-/*\r
- * tel-plugin-imc\r
- *\r
- * Copyright (c) 2012 Samsung Electronics Co., Ltd. All rights reserved.\r
- *\r
- * Contact: Harish Bishnoi <hbishnoi@samsung.com>\r
- *\r
- * Licensed under the Apache License, Version 2.0 (the "License");\r
- * you may not use this file except in compliance with the License.\r
- * You may obtain a copy of the License at\r
- *\r
- * http://www.apache.org/licenses/LICENSE-2.0\r
- *\r
- * Unless required by applicable law or agreed to in writing, software\r
- * distributed under the License is distributed on an "AS IS" BASIS,\r
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
- * See the License for the specific language governing permissions and\r
- * limitations under the License.\r
- */\r
-\r
-\r
-#ifndef S_SAT_H_\r
-#define S_SAT_H_\r
-\r
-gboolean s_sat_init(TcorePlugin *p, TcoreHal *h);\r
-void s_sat_exit(TcorePlugin *p);\r
-\r
-#endif /* S_SAT_H_ */\r
+/*
+ * tel-plugin-imc
+ *
+ * Copyright (c) 2012 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: Harish Bishnoi <hbishnoi@samsung.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+
+#ifndef S_SAT_H_
+#define S_SAT_H_
+
+gboolean s_sat_init(TcorePlugin *p, TcoreHal *h);
+void s_sat_exit(TcorePlugin *p);
+
+#endif /* S_SAT_H_ */
-/**\r
- * tel-plugin-imc\r
- *\r
- * Copyright (c) 2000 - 2012 Samsung Electronics Co., Ltd All Rights Reserved\r
- *\r
- * Contact: Ankit Jogi <ankit.jogi@samsung.com>\r
- *\r
- * Licensed under the Apache License, Version 2.0 (the "License");\r
- * you may not use this file except in compliance with the License.\r
- * You may obtain a copy of the License at\r
- *\r
- * http://www.apache.org/licenses/LICENSE-2.0\r
- *\r
- * Unless required by applicable law or agreed to in writing, software\r
- * distributed under the License is distributed on an "AS IS" BASIS,\r
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
- * See the License for the specific language governing permissions and\r
- * limitations under the License.\r
- */\r
-\r
-#ifndef __S_SIM_H__\r
-#define __S_SIM_H__\r
-\r
-\r
-gboolean s_sim_init(TcorePlugin *p, TcoreHal *h);\r
-void s_sim_exit(TcorePlugin *p);\r
-\r
-#endif\r
+/**
+ * tel-plugin-imc
+ *
+ * Copyright (c) 2000 - 2012 Samsung Electronics Co., Ltd All Rights Reserved
+ *
+ * Contact: Ankit Jogi <ankit.jogi@samsung.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __S_SIM_H__
+#define __S_SIM_H__
+
+gboolean s_sim_init(TcorePlugin *p, TcoreHal *h);
+void s_sim_exit(TcorePlugin *p);
+
+#endif
-/*\r
- * tel-plugin-imc\r
- *\r
- * Copyright (c) 2012 Samsung Electronics Co., Ltd. All rights reserved.\r
- *\r
- * Contact: Madhavi Akella <madhavi.a@samsung.com>\r
- *\r
- * Licensed under the Apache License, Version 2.0 (the "License");\r
- * you may not use this file except in compliance with the License.\r
- * You may obtain a copy of the License at\r
- *\r
- * http://www.apache.org/licenses/LICENSE-2.0\r
- *\r
- * Unless required by applicable law or agreed to in writing, software\r
- * distributed under the License is distributed on an "AS IS" BASIS,\r
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
- * See the License for the specific language governing permissions and\r
- * limitations under the License.\r
- */\r
-\r
-\r
+/*
+ * tel-plugin-imc
+ *
+ * Copyright (c) 2012 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: Madhavi Akella <madhavi.a@samsung.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
#ifndef S_SMS_H_
#define S_SMS_H_
-\r
-gboolean s_sms_init(TcorePlugin *p, TcoreHal *h);\r
-void s_sms_exit(TcorePlugin *p);\r
-\r
-#endif //S_SMS_H_
\ No newline at end of file
+
+gboolean s_sms_init(TcorePlugin *p, TcoreHal *h);
+void s_sms_exit(TcorePlugin *p);
+
+#endif // S_SMS_H_
-/*\r
- * tel-plugin-imc\r
- *\r
- * Copyright (c) 2012 Samsung Electronics Co., Ltd. All rights reserved.\r
- *\r
- * Contact: Sharanayya Mathapati <sharan.m@samsung.com>\r
- *\r
- * Licensed under the Apache License, Version 2.0 (the "License");\r
- * you may not use this file except in compliance with the License.\r
- * You may obtain a copy of the License at\r
- *\r
- * http://www.apache.org/licenses/LICENSE-2.0\r
- *\r
- * Unless required by applicable law or agreed to in writing, software\r
- * distributed under the License is distributed on an "AS IS" BASIS,\r
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
- * See the License for the specific language governing permissions and\r
- * limitations under the License.\r
- */\r
-\r
-\r
-#ifndef __S_SS_H__\r
-#define __S_SS_H__\r
-\r
-\r
-gboolean s_ss_init(TcorePlugin *p, TcoreHal *h);\r
-void s_ss_exit(TcorePlugin *p);\r
-\r
-\r
-\r
-#endif\r
+/*
+ * tel-plugin-imc
+ *
+ * Copyright (c) 2012 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: Sharanayya Mathapati <sharan.m@samsung.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __S_SS_H__
+#define __S_SS_H__
+
+gboolean s_ss_init(TcorePlugin *p, TcoreHal *h);
+void s_ss_exit(TcorePlugin *p);
+
+#endif
#define TABLE_NAME "mcc_mnc_oper_list"
#define TABLE_SCHEMA "create table " TABLE_NAME " (id integer primary key, country char(3), mcc integer, mnc char(3), oper char(45));"
-#define dbg(fmt,args...) fprintf(stderr, fmt, ##args);
+#define dbg(fmt, args ...) fprintf(stderr, fmt, ## args)
int main(int argc, char *argv[])
{
printf("BEGIN;\n");
while (1) {
- fgets (buf, 255, fp_in);
+ fgets(buf, 255, fp_in);
- if (feof(fp_in)) {
+ if (feof(fp_in)) {
break;
}
// remove '\n'
- buf[strlen(buf)-1] = '\0';
+ buf[strlen(buf) - 1] = '\0';
dbg("\n%s\n", buf);
- pos1 = strchr (buf, ',');
- memset (country, 0, 10);
- memcpy(country, buf, pos1-buf);
+ pos1 = strchr(buf, ',');
+ memset(country, 0, 10);
+ memcpy(country, buf, pos1 - buf);
dbg("country=[%s]\n", country);
- sscanf (pos1+1, "%d", &mcc);
+ sscanf(pos1 + 1, "%d", &mcc);
dbg("mcc=[%d]\n", mcc);
// get mnc
- pos1 = strchr (pos1+1, ',');
- pos2 = strchr (pos1+1, ',');
+ pos1 = strchr(pos1 + 1, ',');
+ pos2 = strchr(pos1 + 1, ',');
- dbg("mnc=[%s]\n", pos1+1);
+ dbg("mnc=[%s]\n", pos1 + 1);
- memset (mnc, 0, 10);
- strncpy (mnc, pos1+1, pos2-pos1-1);
+ memset(mnc, 0, 10);
+ strncpy(mnc, pos1 + 1, pos2 - pos1 - 1);
// get brand
pos1 = pos2;
- pos2 = strchr (pos1+1, ',');
+ pos2 = strchr(pos1 + 1, ',');
- dbg("brand=[%s]\n", pos1+1);
+ dbg("brand=[%s]\n", pos1 + 1);
- memset (brand, 0, 255);
- strncpy (brand, pos1+1, pos2-pos1-1);
+ memset(brand, 0, 255);
+ strncpy(brand, pos1 + 1, pos2 - pos1 - 1);
// get oper
pos1 = pos2;
- pos2 = strchr (pos1+1, ',');
+ pos2 = strchr(pos1 + 1, ',');
- dbg("oper=[%s]\n", pos1+1);
+ dbg("oper=[%s]\n", pos1 + 1);
- memset (oper, 0, 255);
- strcpy (oper, pos1+1);
+ memset(oper, 0, 255);
+ strcpy(oper, pos1 + 1);
oper_select = brand;
if (strlen(brand) == 0)
if (oper_select[0] == '\"') {
memset(buf, 0, 255);
- snprintf(buf, strlen(oper_select)-2, "%s", oper_select+1);
+ snprintf(buf, strlen(oper_select) - 2, "%s", oper_select + 1);
snprintf(oper_select, 255, "%s", buf);
}
snprintf(buf, 255, "insert into %s "
- " (country, mcc, mnc, oper) "
- " values (\"%s\", %d, \"%s\", \"%s\");",
- TABLE_NAME, country, mcc, mnc, oper_select);
- printf("%s\n",buf);
+ " (country, mcc, mnc, oper) "
+ " values (\"%s\", %d, \"%s\", \"%s\");",
+ TABLE_NAME, country, mcc, mnc, oper_select);
+ printf("%s\n", buf);
}
printf("COMMIT;\n");
-/*\r
- * tel-plugin-imc\r
- *\r
- * Copyright (c) 2012 Samsung Electronics Co., Ltd. All rights reserved.\r
- *\r
- * Contact: Hayoon Ko <hayoon.ko@samsung.com>\r
- *\r
- * Licensed under the Apache License, Version 2.0 (the "License");\r
- * you may not use this file except in compliance with the License.\r
- * You may obtain a copy of the License at\r
- *\r
- * http://www.apache.org/licenses/LICENSE-2.0\r
- *\r
- * Unless required by applicable law or agreed to in writing, software\r
- * distributed under the License is distributed on an "AS IS" BASIS,\r
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
- * See the License for the specific language governing permissions and\r
- * limitations under the License.\r
- */\r
-\r
-\r
-#include <stdio.h>\r
-#include <stdlib.h>\r
-#include <string.h>\r
-#include <sys/utsname.h>\r
-\r
-#include <glib.h>\r
-\r
-#include <tcore.h>\r
-#include <plugin.h>\r
-#include <hal.h>\r
-#include <server.h>\r
-#include <at.h>\r
-\r
-#include "s_common.h"\r
-#include "s_network.h"\r
-#include "s_modem.h"\r
-#include "s_sim.h"\r
-#include "s_sap.h"\r
-#include "s_ps.h"\r
-#include "s_call.h"\r
-#include "s_ss.h"\r
-#include "s_sms.h"\r
-#include "s_sat.h"\r
-#include "s_phonebook.h"\r
-#include "s_gps.h"\r
-\r
-static char *cp_name;\r
-\r
-static enum tcore_hook_return on_hal_send(TcoreHal *hal, unsigned int data_len, void *data, void *user_data)\r
-{\r
- hook_hex_dump(TX, data_len, data);\r
- return TCORE_HOOK_RETURN_CONTINUE;\r
-}\r
-\r
-static void on_hal_recv(TcoreHal *hal, unsigned int data_len, const void *data, void *user_data)\r
-{\r
- msg("=== RX data DUMP =====");\r
- util_hex_dump(" ", data_len, data);\r
- msg("=== RX data DUMP =====");\r
-}\r
-\r
-static gboolean on_load()\r
-{\r
- dbg("i'm load!");\r
-\r
- return TRUE;\r
-}\r
-\r
-static int _get_cp_name(char** name)\r
-{\r
- struct utsname u;\r
-\r
- char *svnet1_models[] = { "F1", "S1", "M2", "H2", "H2_SDK",\r
- "CRESPO", "STEALTHV", "SLP45", "Kessler", "P1P2",\r
- "U1SLP", "U1HD", "SLP7_C210", "SLP10_C210", NULL };\r
-\r
- char *svnet2_models[] = { "SMDK4410", "SMDK4212", "SLP_PQ", "SLP_PQ_LTE", "SLP_NAPLES", "REDWOOD", "TRATS", NULL };\r
-\r
- char* tty_models[] = {"QCT MSM8X55 SURF" , "QCT MSM7x27a FFA", NULL };\r
-\r
- int i=0;\r
-\r
- if (*name) {\r
- dbg("[ error ] name is not empty");\r
- return FALSE;\r
- }\r
-\r
- memset(&u, '\0', sizeof(struct utsname));\r
-\r
- uname(&u);\r
-\r
- dbg("u.nodename : [ %s ]", u.nodename);\r
-\r
- for(i=0; svnet1_models[i]; i++) {\r
- if (!strcmp(u.nodename, svnet1_models[i])) {\r
- *name = g_new0(char, 5);\r
- strcpy(*name, "6260");\r
- return 5;\r
- }\r
- }\r
-\r
- for(i=0; svnet2_models[i]; i++) {\r
- if (!strcmp(u.nodename, svnet2_models[i])) {\r
- *name = g_new0(char, 5);\r
- strcpy(*name, "6262");\r
- return 5;\r
- }\r
- }\r
-\r
- for(i=0; tty_models[i]; i++) {\r
- if (!strcmp(u.nodename, tty_models[i])) {\r
- *name = g_new0(char, 6);\r
- strcpy(*name, "dpram");\r
- return 6;\r
- }\r
- }\r
-\r
- dbg("[ error ] unknown model : (%s)", u.nodename);\r
-\r
- return 0;\r
-}\r
-\r
-static gboolean on_init(TcorePlugin *p)\r
-{\r
- TcoreHal *h;\r
- struct global_data *gd;\r
- //char *cp_name = 0;\r
- int len = 0;\r
-\r
- if (!p)\r
- return FALSE;\r
-\r
- gd = calloc(sizeof(struct global_data), 1);\r
- if (!gd)\r
- return FALSE;\r
-\r
- dbg("i'm init!");\r
-\r
- gd->msg_auto_id_current = 0;\r
- gd->msg_auto_id_start = 1;\r
- gd->msg_auto_id_end = 255;\r
-\r
- len = _get_cp_name(&cp_name);\r
- if (!len) {\r
- dbg("[ error ] unsupport cp (name : %s)", cp_name);\r
- free(gd);\r
- return FALSE;\r
- }\r
-\r
- /* FIXME: HAL will reside in Co-object.\r
- * This HAL is just used as default before MUX setup.\r
- * Each HAL has AT pasre functionality.\r
- */\r
- h = tcore_server_find_hal(tcore_plugin_ref_server(p), cp_name);\r
- if (!h) {\r
- g_free(cp_name);\r
- free(gd);\r
- return FALSE;\r
- }\r
-\r
- //set physical hal into plugin's userdata \r
- gd->hal = h;\r
-\r
- tcore_plugin_link_user_data(p, gd);\r
-\r
- tcore_hal_add_send_hook(h, on_hal_send, p);\r
- tcore_hal_add_recv_callback(h, on_hal_recv, p);\r
-\r
- dbg("skip _register_unsolicited_messages() - this should be done in each co-object");\r
-\r
- /* Register Unsolicited msg handler */\r
- //_register_unsolicited_messages(p);\r
-\r
- s_modem_init(p, h);\r
- s_sim_init(p, h);\r
- s_sat_init(p, h);\r
- s_network_init(p, h);\r
-// s_sap_init(p, h);\r
- s_ps_init(p, h);\r
- s_call_init(p, h);\r
- s_ss_init(p, h);\r
- s_sms_init(p, h);\r
-// s_phonebook_init(p, h);\r
-// s_gps_init(p, h);\r
-\r
- g_free(cp_name);\r
-\r
- tcore_hal_set_power(h, TRUE);\r
- /* SEND CPAS command to invoke modem power on. */\r
- s_modem_send_poweron(p);\r
-\r
- return TRUE;\r
-}\r
-\r
-static void on_unload(TcorePlugin *p)\r
-{\r
- struct global_data *gd;\r
-\r
- if (!p)\r
- return;\r
-\r
- dbg("i'm unload");\r
-\r
- gd = tcore_plugin_ref_user_data(p);\r
- if (gd) {\r
- free(gd);\r
- }\r
-}\r
-\r
-struct tcore_plugin_define_desc plugin_define_desc =\r
-{\r
- .name = "IMC",\r
- .priority = TCORE_PLUGIN_PRIORITY_MID,\r
- .version = 1,\r
- .load = on_load,\r
- .init = on_init,\r
- .unload = on_unload\r
-};\r
+/*
+ * tel-plugin-imc
+ *
+ * Copyright (c) 2012 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: Hayoon Ko <hayoon.ko@samsung.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <sys/utsname.h>
+
+#include <glib.h>
+
+#include <tcore.h>
+#include <plugin.h>
+#include <hal.h>
+#include <server.h>
+#include <at.h>
+
+#include "s_common.h"
+#include "s_network.h"
+#include "s_modem.h"
+#include "s_sim.h"
+#include "s_sap.h"
+#include "s_ps.h"
+#include "s_call.h"
+#include "s_ss.h"
+#include "s_sms.h"
+#include "s_sat.h"
+#include "s_phonebook.h"
+#include "s_gps.h"
+
+static char *cp_name;
+
+static enum tcore_hook_return on_hal_send(TcoreHal *hal, unsigned int data_len, void *data, void *user_data)
+{
+ hook_hex_dump(TX, data_len, data);
+ return TCORE_HOOK_RETURN_CONTINUE;
+}
+
+static void on_hal_recv(TcoreHal *hal, unsigned int data_len, const void *data, void *user_data)
+{
+ msg("=== RX data DUMP =====");
+ util_hex_dump(" ", data_len, data);
+ msg("=== RX data DUMP =====");
+}
+
+static gboolean on_load()
+{
+ dbg("i'm load!");
+
+ return TRUE;
+}
+
+static int _get_cp_name(char **name)
+{
+ struct utsname u;
+
+ char *svnet1_models[] = {
+ "F1", "S1", "M2", "H2", "H2_SDK",
+ "CRESPO", "STEALTHV", "SLP45", "Kessler", "P1P2",
+ "U1SLP", "U1HD", "SLP7_C210", "SLP10_C210", NULL
+ };
+
+ char *svnet2_models[] = { "SMDK4410", "SMDK4212", "SLP_PQ", "SLP_PQ_LTE", "SLP_NAPLES", "REDWOOD", "TRATS", NULL };
+
+ char *tty_models[] = { "QCT MSM8X55 SURF", "QCT MSM7x27a FFA", NULL };
+
+ int i = 0;
+
+ if (*name) {
+ dbg("[ error ] name is not empty");
+ return FALSE;
+ }
+
+ memset(&u, '\0', sizeof(struct utsname));
+
+ uname(&u);
+
+ dbg("u.nodename : [ %s ]", u.nodename);
+
+ for (i = 0; svnet1_models[i]; i++) {
+ if (!strcmp(u.nodename, svnet1_models[i])) {
+ *name = g_new0(char, 5);
+ strcpy(*name, "6260");
+ return 5;
+ }
+ }
+
+ for (i = 0; svnet2_models[i]; i++) {
+ if (!strcmp(u.nodename, svnet2_models[i])) {
+ *name = g_new0(char, 5);
+ strcpy(*name, "6262");
+ return 5;
+ }
+ }
+
+ for (i = 0; tty_models[i]; i++) {
+ if (!strcmp(u.nodename, tty_models[i])) {
+ *name = g_new0(char, 6);
+ strcpy(*name, "dpram");
+ return 6;
+ }
+ }
+
+ dbg("[ error ] unknown model : (%s)", u.nodename);
+
+ return 0;
+}
+
+static gboolean on_init(TcorePlugin *p)
+{
+ TcoreHal *h;
+ struct global_data *gd;
+ // char *cp_name = 0;
+ int len = 0;
+
+ if (!p)
+ return FALSE;
+
+ gd = calloc(sizeof(struct global_data), 1);
+ if (!gd)
+ return FALSE;
+
+ dbg("i'm init!");
+
+ gd->msg_auto_id_current = 0;
+ gd->msg_auto_id_start = 1;
+ gd->msg_auto_id_end = 255;
+
+ len = _get_cp_name(&cp_name);
+ if (!len) {
+ dbg("[ error ] unsupport cp (name : %s)", cp_name);
+ free(gd);
+ return FALSE;
+ }
+
+ /* FIXME: HAL will reside in Co-object.
+ * This HAL is just used as default before MUX setup.
+ * Each HAL has AT pasre functionality.
+ */
+ h = tcore_server_find_hal(tcore_plugin_ref_server(p), cp_name);
+ if (!h) {
+ g_free(cp_name);
+ free(gd);
+ return FALSE;
+ }
+
+ // set physical hal into plugin's userdata
+ gd->hal = h;
+
+ tcore_plugin_link_user_data(p, gd);
+
+ tcore_hal_add_send_hook(h, on_hal_send, p);
+ tcore_hal_add_recv_callback(h, on_hal_recv, p);
+
+ dbg("skip _register_unsolicited_messages() - this should be done in each co-object");
+
+ /* Register Unsolicited msg handler */
+ // _register_unsolicited_messages(p);
+
+ s_modem_init(p, h);
+ s_sim_init(p, h);
+ s_sat_init(p, h);
+ s_network_init(p, h);
+// s_sap_init(p, h);
+ s_ps_init(p, h);
+ s_call_init(p, h);
+ s_ss_init(p, h);
+ s_sms_init(p, h);
+// s_phonebook_init(p, h);
+// s_gps_init(p, h);
+
+ g_free(cp_name);
+
+ tcore_hal_set_power(h, TRUE);
+ /* SEND CPAS command to invoke modem power on. */
+ s_modem_send_poweron(p);
+
+ return TRUE;
+}
+
+static void on_unload(TcorePlugin *p)
+{
+ struct global_data *gd;
+
+ if (!p)
+ return;
+
+ dbg("i'm unload");
+
+ gd = tcore_plugin_ref_user_data(p);
+ if (gd) {
+ free(gd);
+ }
+}
+
+struct tcore_plugin_define_desc plugin_define_desc = {
+ .name = "IMC",
+ .priority = TCORE_PLUGIN_PRIORITY_MID,
+ .version = 1,
+ .load = on_load,
+ .init = on_init,
+ .unload = on_unload
+};
-/*\r
- * tel-plugin-imc\r
- *\r
- * Copyright (c) 2012 Samsung Electronics Co., Ltd. All rights reserved.\r
- *\r
- * Contact: sharanayya mathapati <sharan.m@samsung.com>\r
- *\r
- * Licensed under the Apache License, Version 2.0 (the "License");\r
- * you may not use this file except in compliance with the License.\r
- * You may obtain a copy of the License at\r
- *\r
- * http://www.apache.org/licenses/LICENSE-2.0\r
- *\r
- * Unless required by applicable law or agreed to in writing, software\r
- * distributed under the License is distributed on an "AS IS" BASIS,\r
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
- * See the License for the specific language governing permissions and\r
- * limitations under the License.\r
- */\r
-\r
-\r
-#include <stdio.h>\r
-#include <stdlib.h>\r
-#include <string.h>\r
-#include <glib.h>\r
-\r
-#include <tcore.h>\r
-#include <hal.h>\r
-#include <core_object.h>\r
-#include <plugin.h>\r
-#include <queue.h>\r
-#include <co_call.h>\r
-#include <user_request.h>\r
-#include <server.h>\r
-#include <at.h>\r
-\r
-#include "s_common.h"\r
-#include "s_call.h"\r
-\r
-\r
-#define STATUS_INCOMING 4\r
-#define STATUS_WAITING 5\r
-#define STATUS_CONNECTED 7\r
-#define COMMA 0X2c\r
-\r
-static gboolean setsoundpath = FALSE;\r
-static gboolean soundvolume = FALSE;\r
-\r
-// End Cause field - Call state end cause\r
-\r
-typedef enum {\r
- CALL_END_NO_CAUSE,\r
-\r
- // These definitions are taken from GSM 04.08 Table 10.86\r
-\r
- CC_CAUSE_UNASSIGNED_NUMBER,\r
- CC_CAUSE_NO_ROUTE_TO_DEST,\r
- CC_CAUSE_CHANNEL_UNACCEPTABLE,\r
- CC_CAUSE_OPERATOR_DETERMINED_BARRING,\r
- CC_CAUSE_NORMAL_CALL_CLEARING,\r
- CC_CAUSE_USER_BUSY,\r
- CC_CAUSE_NO_USER_RESPONDING,\r
- CC_CAUSE_USER_ALERTING_NO_ANSWER,\r
- CC_CAUSE_CALL_REJECTED,\r
- CC_CAUSE_NUMBER_CHANGED,\r
- CC_CAUSE_NON_SELECTED_USER_CLEARING,\r
- CC_CAUSE_DESTINATION_OUT_OF_ORDER,\r
- CC_CAUSE_INVALID_NUMBER_FORMAT,\r
- CC_CAUSE_FACILITY_REJECTED,\r
- CC_CAUSE_RESPONSE_TO_STATUS_ENQUIRY,\r
- CC_CAUSE_NORMAL_UNSPECIFIED,\r
- CC_CAUSE_NO_CIRCUIT_CHANNEL_AVAILABLE,\r
- CC_CAUSE_NETWORK_OUT_OF_ORDER,\r
- CC_CAUSE_TEMPORARY_FAILURE,\r
- CC_CAUSE_SWITCHING_EQUIPMENT_CONGESTION,\r
- CC_CAUSE_ACCESS_INFORMATION_DISCARDED,\r
- CC_CAUSE_REQUESTED_CIRCUIT_CHANNEL_NOT_AVAILABLE,\r
- CC_CAUSE_RESOURCES_UNAVAILABLE_UNSPECIFIED,\r
- CC_CAUSE_QUALITY_OF_SERVICE_UNAVAILABLE,\r
- CC_CAUSE_REQUESTED_FACILITY_NOT_SUBSCRIBED,\r
- CC_CAUSE_INCOMING_CALL_BARRED_WITHIN_CUG,\r
- CC_CAUSE_BEARER_CAPABILITY_NOT_AUTHORISED,\r
- CC_CAUSE_BEARER_CAPABILITY_NOT_PRESENTLY_AVAILABLE,\r
- CC_CAUSE_SERVICE_OR_OPTION_NOT_AVAILABLE,\r
- CC_CAUSE_BEARER_SERVICE_NOT_IMPLEMENTED,\r
- CC_CAUSE_ACM_GEQ_ACMMAX,\r
- CC_CAUSE_REQUESTED_FACILITY_NOT_IMPLEMENTED,\r
- CC_CAUSE_ONLY_RESTRICTED_DIGITAL_INFO_BC_AVAILABLE,\r
- CC_CAUSE_SERVICE_OR_OPTION_NOT_IMPLEMENTED,\r
- CC_CAUSE_INVALID_TRANSACTION_ID_VALUE,\r
- CC_CAUSE_USER_NOT_MEMBER_OF_CUG,\r
- CC_CAUSE_INCOMPATIBLE_DESTINATION,\r
- CC_CAUSE_INVALID_TRANSIT_NETWORK_SELECTION,\r
- CC_CAUSE_SEMANTICALLY_INCORRECT_MESSAGE,\r
- CC_CAUSE_INVALID_MANDATORY_INFORMATION,\r
- CC_CAUSE_MESSAGE_TYPE_NON_EXISTENT,\r
- CC_CAUSE_MESSAGE_TYPE_NOT_COMPATIBLE_WITH_PROT_STATE,\r
- CC_CAUSE_IE_NON_EXISTENT_OR_NOT_IMPLEMENTED,\r
- CC_CAUSE_CONDITIONAL_IE_ERROR,\r
- CC_CAUSE_MESSAGE_NOT_COMPATIBLE_WITH_PROTOCOL_STATE,\r
- CC_CAUSE_RECOVERY_ON_TIMER_EXPIRY,\r
- CC_CAUSE_PROTOCOL_ERROR_UNSPECIFIED,\r
- CC_CAUSE_INTERWORKING_UNSPECIFIED,\r
- CC_CAUSE_END = 128,\r
-\r
- // Reject causes\r
- REJECT_CAUSE_IMSI_UNKNOWN_IN_HLR,\r
- REJECT_CAUSE_ILLEGAL_MS,\r
- REJECT_CAUSE_IMSI_UNKNOWN_IN_VLR,\r
- REJECT_CAUSE_IMEI_NOT_ACCEPTED,\r
- REJECT_CAUSE_ILLEGAL_ME,\r
- REJECT_CAUSE_GPRS_SERVICES_NOT_ALLOWED,\r
- REJECT_CAUSE_GPRS_SERVICES_AND_NON_GPRS_SERVICES_NOT_ALLOWED,\r
- REJECT_CAUSE_MS_IDENTITY_CANNOT_BE_DERIVED_BY_THE_NETWORK,\r
- REJECT_CAUSE_IMPLICITLY_DETACHED,\r
- REJECT_CAUSE_PLMN_NOT_ALLOWED,\r
- REJECT_CAUSE_LA_NOT_ALLOWED,\r
- REJECT_CAUSE_NATIONAL_ROAMING_NOT_ALLOWED,\r
- REJECT_CAUSE_GPRS_SERVICES_NOT_ALLOWED_IN_THIS_PLMN,\r
- REJECT_CAUSE_NO_SUITABLE_CELLS_IN_LA,\r
- REJECT_CAUSE_MSC_TEMPORARILY_NOT_REACHABLE,\r
- REJECT_CAUSE_NETWORK_FAILURE ,\r
- REJECT_CAUSE_MAC_FAILURE,\r
- REJECT_CAUSE_SYNCH_FAILURE,\r
- REJECT_CAUSE_CONGESTTION,\r
- REJECT_CAUSE_GSM_AUTH_UNACCEPTED,\r
- REJECT_CAUSE_SERVICE_OPTION_NOT_SUPPORTED,\r
- REJECT_CAUSE_REQ_SERV_OPT_NOT_SUBSCRIBED,\r
- REJECT_CAUSE_SERVICE_OPT__OUT_OF_ORDER,\r
- REJECT_CAUSE_CALL_CANNOT_BE_IDENTIFIED,\r
- REJECT_CAUSE_NO_PDP_CONTEXT_ACTIVATED,\r
- REJECT_CAUSE_RETRY_UPON_ENTRY_INTO_A_NEW_CELL_MIN_VALUE,\r
- REJECT_CAUSE_RETRY_UPON_ENTRY_INTO_A_NEW_CELL_MAX_VALUE,\r
- REJECT_CAUSE_SEMANTICALLY_INCORRECT_MSG,\r
- REJECT_CAUSE_INVALID_MANDATORY_INFO,\r
- REJECT_CAUSE_MESSAGE_TYPE_NON_EXISTANT,\r
- REJECT_CAUSE_MESSAGE_TYPE_NOT_COMP_PRT_ST,\r
- REJECT_CAUSE_IE_NON_EXISTANT,\r
- REJECT_CAUSE_MSG_NOT_COMPATIBLE_PROTOCOL_STATE,\r
-\r
-\r
- // Connection Management establishment rejection cause\r
- REJECT_CAUSE_REJ_UNSPECIFIED,\r
-\r
- // AS reject causes\r
- REJECT_CAUSE_AS_REJ_RR_REL_IND,\r
- REJECT_CAUSE_AS_REJ_RR_RANDOM_ACCESS_FAILURE,\r
- REJECT_CAUSE_AS_REJ_RRC_REL_IND,\r
- REJECT_CAUSE_AS_REJ_RRC_CLOSE_SESSION_IND,\r
- REJECT_CAUSE_AS_REJ_RRC_OPEN_SESSION_FAILURE,\r
- REJECT_CAUSE_AS_REJ_LOW_LEVEL_FAIL,\r
- REJECT_CAUSE_AS_REJ_LOW_LEVEL_FAIL_REDIAL_NOT_ALLOWED,\r
- REJECT_CAUSE_AS_REJ_LOW_LEVEL_IMMED_RETRY,\r
-\r
- // MM reject causes\r
- REJECT_CAUSE_MM_REJ_INVALID_SIM,\r
- REJECT_CAUSE_MM_REJ_NO_SERVICE,\r
- REJECT_CAUSE_MM_REJ_TIMER_T3230_EXP,\r
- REJECT_CAUSE_MM_REJ_NO_CELL_AVAILABLE,\r
- REJECT_CAUSE_MM_REJ_WRONG_STATE,\r
- REJECT_CAUSE_MM_REJ_ACCESS_CLASS_BLOCKED,\r
- // Definitions for release ind causes between MM and CNM\r
- REJECT_CAUSE_ABORT_MSG_RECEIVED,\r
- REJECT_CAUSE_OTHER_CAUSE,\r
-\r
- // CNM reject causes\r
- REJECT_CAUSE_CNM_REJ_TIMER_T303_EXP,\r
- REJECT_CAUSE_CNM_REJ_NO_RESOURCES,\r
- REJECT_CAUSE_CNM_MM_REL_PENDING,\r
- REJECT_CAUSE_CNM_INVALID_USER_DATA,\r
- CALL_END_CAUSE_MAX = 255\r
-}call_end_cause_e_type;\r
-\r
-\r
-struct clcc_call_t {\r
- struct call_CLCC_info {\r
- int id;\r
- enum tcore_call_direction direction;\r
- enum tcore_call_status status;\r
- enum tcore_call_type type;\r
- int mpty;\r
- int num_len;\r
- int num_type;\r
- } info;\r
- char number[90];\r
-};\r
-\r
-typedef struct {\r
- int network_cause;\r
- int tapi_cause;\r
-}call_end_cause_info;\r
-\r
-/**************************************************************************\r
- * Local Function Prototypes\r
- **************************************************************************/\r
-/************************* REQUESTS ***************************/\r
-static void _call_status_idle(TcorePlugin *p, CallObject *co);\r
-static void _call_status_active(TcorePlugin *p, CallObject *co);\r
-static void _call_status_dialing(TcorePlugin *p, CallObject *co);\r
-static void _call_status_alert(TcorePlugin *p, CallObject *co);\r
-static void _call_status_incoming(TcorePlugin *p, CallObject *co);\r
-static void _call_status_waiting(TcorePlugin *p, CallObject *co);\r
-static TReturn _call_list_get(CoreObject *o, gboolean *event_flag);\r
-static TReturn _set_dtmf_tone_duration(CoreObject *o, UserRequest *ur);\r
-\r
-/************************* CONFIRMATION ***************************/\r
-static void on_confirmation_call_message_send(TcorePending *p, gboolean result, void *user_data); // from Kernel\r
-static void on_confirmation_call_hold(TcorePending *p, int data_len, const void *data, void *user_data);\r
-static void on_confirmation_call_swap(TcorePending *p, int data_len, const void *data, void *user_data);\r
-static void on_confirmation_call_split(TcorePending *p, int data_len, const void *data, void *user_data);\r
-static void on_confirmation_call_hold_and_accept(TcorePending *p, int data_len, const void *data, void *user_data);\r
-\r
-static void _on_confirmation_call_release(TcorePending *p, int data_len, const void *data, void *user_data, int type);\r
-static void _on_confirmation_call(TcorePending *p, int data_len, const void *data, void *user_data, int type);\r
-static void _on_confirmation_dtmf_tone_duration(TcorePending *p, int data_len, const void *data, void *user_data);\r
-static void _on_confirmation_call_end_cause(TcorePending * p, int data_len, const void * data, void * user_data);\r
-\r
-/************************* RESPONSES ***************************/\r
-static void on_response_call_list_get(TcorePending *p, int data_len, const void *data, void *user_data);\r
-\r
-/************************* NOTIIFICATIONS ***************************/\r
-static void on_notification_call_waiting(CoreObject *o, const void *data, void *user_data);\r
-static void on_notification_call_incoming(CoreObject *o, const void *data, void *user_data);\r
-static void on_notification_call_status(CoreObject *o, const void *data, void *user_data);\r
-static gboolean on_notification_call_info(CoreObject *o, const void *data, void *user_data);\r
-static gboolean on_notification_call_clip_info(CoreObject *o, const void *data, void *user_data);\r
-\r
-\r
-/**************************************************************************\r
- * Local Utility Function Prototypes\r
- **************************************************************************/\r
-static gboolean _call_request_message(TcorePending *pending, CoreObject *o, UserRequest* ur, void* on_resp, void* user_data);\r
-static void _call_branch_by_status(TcorePlugin *p, CallObject *co, unsigned int status);\r
-static int _callFromCLCCLine(char *line, struct clcc_call_t *p_call);\r
-\r
-/**************************************************************************\r
- * Local Function Definitions\r
- **************************************************************************/\r
-\r
-const call_end_cause_info call_end_cause_table[] = { // call end cause table to convert Netwotk cause to TAPI cause\r
-\r
- { 1, CC_CAUSE_UNASSIGNED_NUMBER}, { 3, CC_CAUSE_NO_ROUTE_TO_DEST},\r
- { 6, CC_CAUSE_CHANNEL_UNACCEPTABLE}, { 8, CC_CAUSE_OPERATOR_DETERMINED_BARRING},\r
- { 16, CC_CAUSE_NORMAL_CALL_CLEARING}, { 17, CC_CAUSE_USER_BUSY},\r
- { 18, CC_CAUSE_NO_USER_RESPONDING}, { 19, CC_CAUSE_USER_ALERTING_NO_ANSWER},\r
- { 21, CC_CAUSE_CALL_REJECTED}, { 22, CC_CAUSE_NUMBER_CHANGED},\r
- { 26, CC_CAUSE_NON_SELECTED_USER_CLEARING}, { 27, CC_CAUSE_DESTINATION_OUT_OF_ORDER},\r
- { 28, CC_CAUSE_INVALID_NUMBER_FORMAT}, { 29, CC_CAUSE_FACILITY_REJECTED},\r
- { 30, CC_CAUSE_RESPONSE_TO_STATUS_ENQUIRY}, { 31, CC_CAUSE_NORMAL_UNSPECIFIED},\r
- { 34, CC_CAUSE_NO_CIRCUIT_CHANNEL_AVAILABLE},{ 38, CC_CAUSE_NETWORK_OUT_OF_ORDER},\r
- { 41, CC_CAUSE_TEMPORARY_FAILURE}, { 42, CC_CAUSE_SWITCHING_EQUIPMENT_CONGESTION},\r
- { 43, CC_CAUSE_ACCESS_INFORMATION_DISCARDED},{ 44, CC_CAUSE_REQUESTED_CIRCUIT_CHANNEL_NOT_AVAILABLE},\r
- { 47, CC_CAUSE_RESOURCES_UNAVAILABLE_UNSPECIFIED}, { 49, CC_CAUSE_QUALITY_OF_SERVICE_UNAVAILABLE},\r
- { 50, CC_CAUSE_REQUESTED_FACILITY_NOT_SUBSCRIBED}, { 55, CC_CAUSE_INCOMING_CALL_BARRED_WITHIN_CUG},\r
- { 57, CC_CAUSE_BEARER_CAPABILITY_NOT_AUTHORISED}, { 58, CC_CAUSE_BEARER_CAPABILITY_NOT_PRESENTLY_AVAILABLE},\r
- { 63, CC_CAUSE_SERVICE_OR_OPTION_NOT_AVAILABLE}, { 65, CC_CAUSE_BEARER_SERVICE_NOT_IMPLEMENTED},\r
- { 68, CC_CAUSE_ACM_GEQ_ACMMAX}, { 69, CC_CAUSE_REQUESTED_FACILITY_NOT_IMPLEMENTED},\r
- { 70, CC_CAUSE_ONLY_RESTRICTED_DIGITAL_INFO_BC_AVAILABLE}, { 79, CC_CAUSE_SERVICE_OR_OPTION_NOT_IMPLEMENTED},\r
- { 81, CC_CAUSE_INVALID_TRANSACTION_ID_VALUE}, { 87, CC_CAUSE_USER_NOT_MEMBER_OF_CUG},\r
- { 88, CC_CAUSE_INCOMPATIBLE_DESTINATION}, { 91, CC_CAUSE_INVALID_TRANSIT_NETWORK_SELECTION},\r
- { 95, CC_CAUSE_SEMANTICALLY_INCORRECT_MESSAGE}, { 96, CC_CAUSE_INVALID_MANDATORY_INFORMATION},\r
- { 97, CC_CAUSE_MESSAGE_TYPE_NON_EXISTENT}, { 98, CC_CAUSE_MESSAGE_TYPE_NOT_COMPATIBLE_WITH_PROT_STATE},\r
- { 99, CC_CAUSE_IE_NON_EXISTENT_OR_NOT_IMPLEMENTED}, { 100, CC_CAUSE_CONDITIONAL_IE_ERROR},\r
- { 101,CC_CAUSE_MESSAGE_NOT_COMPATIBLE_WITH_PROTOCOL_STATE},{ 102, CC_CAUSE_RECOVERY_ON_TIMER_EXPIRY},\r
- { 111 ,CC_CAUSE_PROTOCOL_ERROR_UNSPECIFIED}, {127, CC_CAUSE_INTERWORKING_UNSPECIFIED},\r
-\r
-};\r
-\r
-static enum tcore_call_cli_mode _get_clir_status(char *num)\r
-{\r
- enum tcore_call_cli_mode clir = CALL_CLI_MODE_DEFAULT;\r
- dbg("Entry");\r
-\r
- if(!strncmp(num, "*31#", 4)) {\r
- dbg("CLI mode restricted");\r
- return TCORE_CALL_CLI_MODE_RESTRICT;\r
- }\r
-\r
- if(!strncmp(num, "#31#", 4)) {\r
- dbg("CLI mode allowed");\r
- return TCORE_CALL_CLI_MODE_PRESENT;\r
- }\r
-\r
- err("Exit");\r
- return clir;\r
-}\r
-\r
-static enum tcore_call_status _call_status(unsigned int status)\r
-{\r
- dbg("Entry");\r
-\r
- switch(status) {\r
- case 0:\r
- return TCORE_CALL_STATUS_ACTIVE;\r
- case 1:\r
- return TCORE_CALL_STATUS_HELD;\r
- case 2:\r
- return TCORE_CALL_STATUS_DIALING;\r
- case 3:\r
- return TCORE_CALL_STATUS_ALERT;\r
- case 4:\r
- return TCORE_CALL_STATUS_INCOMING;\r
- case 5:\r
- return TCORE_CALL_STATUS_WAITING;\r
- case 6: // DISCONNECTED state // FALL THROUGH\r
- default:\r
- return TCORE_CALL_STATUS_IDLE;\r
- }\r
-}\r
-\r
-static gboolean _call_is_in_mpty(int mpty)\r
-{\r
- dbg("Entry");\r
-\r
- switch(mpty) {\r
- case 0:\r
- return FALSE;\r
- case 1:\r
- return TRUE;\r
- default:\r
- break;\r
- }\r
-\r
- return FALSE;\r
-}\r
-\r
-static enum tcore_call_type call_type(int type)\r
-{\r
- dbg("Entry");\r
-\r
- switch (type) {\r
- case 0:\r
- return TCORE_CALL_TYPE_VOICE;\r
- case 1:\r
- return TCORE_CALL_TYPE_VIDEO;\r
- default:\r
- break;\r
- }\r
-\r
- return TCORE_CALL_TYPE_VOICE;\r
-}\r
-\r
-static int _compare_call_end_cause(int networkcause)\r
-{\r
- unsigned int count;\r
- for (count = 0; count < sizeof(call_end_cause_table)/sizeof(call_end_cause_info); count++){\r
- if (call_end_cause_table[count].network_cause == networkcause)\r
- return (call_end_cause_table[count].tapi_cause);\r
- }\r
- return CC_CAUSE_NORMAL_CALL_CLEARING;\r
- dbg("Exit");\r
-}\r
-\r
-static gboolean on_notification_call_clip_info(CoreObject *o, const void *data, void *user_data)\r
-{\r
- dbg("Entry");\r
-\r
- // TODO\r
-\r
- return TRUE;\r
-}\r
-\r
-static gboolean on_notification_call_info(CoreObject *o, const void *data, void *user_data)\r
-{\r
- GSList *tokens = NULL;\r
- GSList *lines = NULL;\r
- const char *line = NULL;\r
- char *stat;\r
- int status;\r
-\r
- dbg("Entry");\r
-\r
- lines = (GSList*)data;\r
- if (1 != g_slist_length(lines)) {\r
- err("Unsolicited message, BUT multiple lines present");\r
- goto OUT;\r
- }\r
-\r
- line = (char*)(lines->data);\r
- tokens = tcore_at_tok_new(line);\r
-\r
- stat = g_slist_nth_data(tokens, 1);\r
- if(!stat) {\r
- dbg("Stat is missing from %XCALLSTAT indiaction");\r
- }\r
- else {\r
- status = atoi(stat);\r
-\r
- switch(status) {\r
- case STATUS_INCOMING:\r
- dbg("calling on_notification_call_incoming");\r
- on_notification_call_incoming(o, line, user_data);\r
- break;\r
- case STATUS_WAITING:\r
- dbg("calling on_notification_call_waiting");\r
- on_notification_call_waiting(o, line, user_data);\r
- break;\r
- case STATUS_CONNECTED: /*igonre Connected state. */\r
- dbg("Connected state");\r
- break;\r
- default:\r
- dbg("calling on_notification_call_status");\r
- on_notification_call_status(o, line, user_data);\r
- break;\r
- }\r
- }\r
-\r
- // Free tokens\r
- tcore_at_tok_free(tokens);\r
-\r
-OUT:\r
- dbg("Exit");\r
- return TRUE;\r
-}\r
-\r
-static gboolean _call_request_message(TcorePending *pending,\r
- CoreObject *o,\r
- UserRequest *ur,\r
- void* on_resp,\r
- void* user_data)\r
-{\r
- TcoreHal *hal = NULL;\r
- TReturn ret;\r
- dbg("Entry");\r
-\r
- tcore_pending_set_priority(pending, TCORE_PENDING_PRIORITY_DEFAULT);\r
-\r
- if (on_resp) {\r
- tcore_pending_set_response_callback(pending, on_resp, user_data);\r
- }\r
- tcore_pending_set_send_callback(pending, on_confirmation_call_message_send, NULL);\r
-\r
- if (ur) {\r
- tcore_pending_link_user_request(pending, ur);\r
- }\r
- else {\r
- err("User Request is NULL, is this internal request??");\r
- }\r
-\r
- // HAL\r
- hal = tcore_object_get_hal(o);\r
- // Send request to HAL\r
- ret = tcore_hal_send_request(hal, pending);\r
- if(TCORE_RETURN_SUCCESS != ret) {\r
- err("Request send failed");\r
- return FALSE;\r
- }\r
-\r
- dbg("Exit");\r
- return TRUE;\r
-}\r
-\r
-static void _call_status_idle(TcorePlugin *p, CallObject *co)\r
-{\r
- CoreObject *core_obj = NULL;\r
- char *cmd_str = NULL;\r
- TcorePending *pending = NULL;\r
- TcoreATRequest *req = NULL;\r
- gboolean ret = FALSE;\r
- UserRequest *ur;\r
-\r
- dbg("Entry");\r
- core_obj = tcore_plugin_ref_core_object(p, "call");\r
- dbg("Call ID [%d], Call Status [%d]", tcore_call_object_get_id(co), tcore_call_object_get_status(co));\r
-\r
- if (tcore_call_object_get_status(co) != TCORE_CALL_STATUS_IDLE) {\r
-\r
- //get call end cause.\r
- cmd_str = g_strdup_printf("%s","AT+XCEER");\r
- dbg("Request command string: %s", cmd_str);\r
-\r
- // Create new Pending request\r
- pending = tcore_pending_new(core_obj, 0);\r
-\r
- // Create new AT-Command request\r
- req = tcore_at_request_new(cmd_str, "+XCEER", TCORE_AT_SINGLELINE);\r
- dbg("Command: %s, prefix(if any): %s, Command length: %d", req->cmd, req->prefix, strlen(req->cmd));\r
- // Free command string\r
- g_free(cmd_str);\r
-\r
- // Set request data (AT command) to Pending request\r
- tcore_pending_set_request_data(pending, 0, req);\r
-\r
- ur = tcore_user_request_new(NULL, NULL);\r
- // Send request\r
- ret = _call_request_message (pending, core_obj, ur, _on_confirmation_call_end_cause, co);\r
-\r
- if (!ret) {\r
- err("Failed to send AT-Command request");\r
- return ;\r
- }\r
-\r
- }\r
- else {\r
- err("Call object was not free");\r
- tcore_call_object_free(core_obj, co);\r
- }\r
- dbg("Exit");\r
- return;\r
-}\r
-\r
-static void _call_status_dialing(TcorePlugin *p, CallObject *co)\r
-{\r
- struct tnoti_call_status_dialing data;\r
- dbg("Entry");\r
-\r
- if (tcore_call_object_get_status(co) != TCORE_CALL_STATUS_DIALING) {\r
- data.type = tcore_call_object_get_type(co);\r
- dbg("data.type : [%d]", data.type);\r
-\r
- data.id = tcore_call_object_get_id(co);\r
- dbg("data.id : [%d]", data.id);\r
-\r
- // Set Status\r
- tcore_call_object_set_status(co, TCORE_CALL_STATUS_DIALING);\r
-\r
- // Send notification to TAPI\r
- tcore_server_send_notification(tcore_plugin_ref_server(p),\r
- tcore_plugin_ref_core_object(p, "call"),\r
- TNOTI_CALL_STATUS_DIALING,\r
- sizeof(struct tnoti_call_status_dialing),\r
- (void*)&data);\r
-\r
- }\r
-\r
- dbg("Exit");\r
- return;\r
-}\r
-\r
-static void _call_status_alert(TcorePlugin *p, CallObject *co)\r
-{\r
- struct tnoti_call_status_alert data;\r
- dbg("Entry");\r
-\r
- // Alerting has just 1 data 'CALL ID'\r
- if (tcore_call_object_get_status(co) != TCORE_CALL_STATUS_ALERT) {\r
- data.type = tcore_call_object_get_type(co);\r
- dbg("data.type : [%d]", data.type);\r
-\r
- data.id = tcore_call_object_get_id(co);\r
- dbg("data.id : [%d]", data.id);\r
-\r
- // Set Status\r
- tcore_call_object_set_status(co, TCORE_CALL_STATUS_ALERT);\r
-\r
- // Send notification to TAPI\r
- tcore_server_send_notification(tcore_plugin_ref_server(p),\r
- tcore_plugin_ref_core_object(p, "call"),\r
- TNOTI_CALL_STATUS_ALERT,\r
- sizeof(struct tnoti_call_status_alert),\r
- (void*)&data);\r
- }\r
-\r
- dbg("Exit");\r
- return;\r
-}\r
-\r
-static void _call_status_active(TcorePlugin *p, CallObject *co)\r
-{\r
- struct tnoti_call_status_active data;\r
- dbg("Entry");\r
-\r
- if (tcore_call_object_get_status(co) != TCORE_CALL_STATUS_ACTIVE) {\r
- data.type = tcore_call_object_get_type(co);\r
- dbg("data.type : [%d]", data.type);\r
-\r
- data.id = tcore_call_object_get_id(co);\r
- dbg("data.id : [%d]", data.id);\r
-\r
- // Set Status\r
- tcore_call_object_set_status(co, TCORE_CALL_STATUS_ACTIVE);\r
-\r
- // Send notification to TAPI\r
- tcore_server_send_notification(tcore_plugin_ref_server(p),\r
- tcore_plugin_ref_core_object(p, "call"),\r
- TNOTI_CALL_STATUS_ACTIVE,\r
- sizeof(struct tnoti_call_status_active),\r
- (void*)&data);\r
- }\r
-\r
- dbg("Exit");\r
- return;\r
-}\r
-\r
-static void _call_status_held(TcorePlugin *p, CallObject *co)\r
-{\r
- struct tnoti_call_status_held data;\r
- dbg("Entry");\r
-\r
- if (tcore_call_object_get_status(co) != TCORE_CALL_STATUS_HELD) {\r
- data.type = tcore_call_object_get_type(co);\r
- dbg("data.type : [%d]", data.type);\r
-\r
- data.id = tcore_call_object_get_id(co);\r
- dbg("data.id : [%d]", data.id);\r
-\r
- // Set Status\r
- tcore_call_object_set_status(co, TCORE_CALL_STATUS_HELD);\r
-\r
- // Send notification to TAPI\r
- tcore_server_send_notification(tcore_plugin_ref_server(p),\r
- tcore_plugin_ref_core_object(p, "call"),\r
- TNOTI_CALL_STATUS_HELD,\r
- sizeof(struct tnoti_call_status_held),\r
- (void*)&data);\r
- }\r
-\r
- dbg("Exit");\r
- return;\r
-}\r
-\r
-static void _call_status_incoming(TcorePlugin *p, CallObject *co)\r
-{\r
- struct tnoti_call_status_incoming data;\r
- dbg("Entry");\r
-\r
- if (tcore_call_object_get_status(co) != TCORE_CALL_STATUS_INCOMING) {\r
- tcore_call_object_set_status(co, TCORE_CALL_STATUS_INCOMING);\r
-\r
- data.type = tcore_call_object_get_type(co);\r
- dbg("data.type : [%d]", data.type);\r
-\r
- data.id = tcore_call_object_get_id(co);\r
- dbg("data.id : [%d]", data.id);\r
-\r
- data.cli.mode = tcore_call_object_get_cli_mode(co);\r
- dbg("data.cli.mode : [%d]", data.cli.mode);\r
-\r
- tcore_call_object_get_number(co, data.cli.number);\r
- dbg("data.cli.number : [%s]", data.cli.number);\r
-\r
- data.cna.mode = tcore_call_object_get_cna_mode(co);\r
- dbg("data.cna.mode : [%d]", data.cna.mode);\r
-\r
- tcore_call_object_get_name(co, data.cna.name);\r
- dbg("data.cna.name : [%s]", data.cna.name);\r
-\r
- data.forward = FALSE; // this is tmp code\r
-\r
- data.active_line = tcore_call_object_get_active_line(co);\r
- dbg("data.active_line : [%d]", data.active_line);\r
-\r
- // Send notification to TAPI\r
- tcore_server_send_notification(tcore_plugin_ref_server(p),\r
- tcore_plugin_ref_core_object(p, "call"),\r
- TNOTI_CALL_STATUS_INCOMING,\r
- sizeof(struct tnoti_call_status_incoming),\r
- (void*)&data);\r
- }\r
-\r
- dbg("Exit");\r
- return;\r
-}\r
-\r
-static void _call_status_waiting(TcorePlugin *p, CallObject *co)\r
-{\r
- dbg("Entry");\r
- _call_status_incoming(p, co);\r
-\r
- dbg("Exit");\r
- return;\r
-}\r
-\r
-static void _call_branch_by_status(TcorePlugin *p, CallObject *co, unsigned int status)\r
-{\r
- dbg("Entry");\r
-\r
- dbg("Call Status is %d", status);\r
- switch (status) {\r
- case TCORE_CALL_STATUS_IDLE:\r
- _call_status_idle(p, co);\r
- break;\r
-\r
- case TCORE_CALL_STATUS_ACTIVE:\r
- _call_status_active(p, co);\r
- break;\r
-\r
- case TCORE_CALL_STATUS_HELD:\r
- _call_status_held(p, co);\r
- break;\r
-\r
- case TCORE_CALL_STATUS_DIALING:\r
- _call_status_dialing(p, co);\r
- break;\r
-\r
- case TCORE_CALL_STATUS_ALERT:\r
- _call_status_alert(p, co);\r
- break;\r
-\r
- case TCORE_CALL_STATUS_INCOMING:\r
- _call_status_incoming(p, co);\r
- break;\r
-\r
- case TCORE_CALL_STATUS_WAITING:\r
- _call_status_waiting(p, co);\r
- break;\r
- }\r
-\r
- dbg("Exit");\r
- return;\r
-}\r
-\r
-static TReturn _call_list_get(CoreObject *o, gboolean *event_flag)\r
-{\r
- UserRequest* ur = NULL;\r
- TcorePending *pending = NULL;\r
- char *cmd_str = NULL;\r
- TcoreATRequest *req = NULL;\r
- gboolean ret = FALSE;\r
-\r
- dbg("Entry");\r
- if (!o) {\r
- err("Core Object is NULL");\r
- return TCORE_RETURN_FAILURE;\r
- }\r
-\r
- // Create new User Request\r
- ur = tcore_user_request_new(NULL, NULL);\r
-\r
- // Command string\r
- cmd_str = g_strdup("AT+CLCC");\r
-\r
- // Create new Pending Request\r
- pending = tcore_pending_new(o, 0);\r
- req = tcore_at_request_new(cmd_str, "+CLCC", TCORE_AT_MULTILINE);\r
-\r
- g_free(cmd_str);\r
-\r
- dbg("cmd : %s, prefix(if any) :%s, cmd_len : %d", req->cmd, req->prefix, strlen(req->cmd));\r
-\r
- tcore_pending_set_request_data(pending, 0, req);\r
-\r
- ret = _call_request_message (pending, o, ur, on_response_call_list_get, event_flag);\r
- if (!ret) {\r
- err("AT request (%s) sending failed", req->cmd);\r
- return TCORE_RETURN_FAILURE;\r
- }\r
-\r
- dbg("AT request sent success");\r
- return TCORE_RETURN_SUCCESS;\r
-}\r
-\r
-// CONFIRMATION\r
-static void on_confirmation_call_message_send(TcorePending *p, gboolean result, void *user_data)\r
-{\r
- dbg("Entry");\r
-\r
- if (result == FALSE) { // Fail\r
- dbg("SEND FAIL");\r
- }\r
- else {\r
- dbg("SEND OK");\r
- }\r
-\r
- dbg("Exit");\r
- return;\r
-}\r
-\r
-static void on_confirmation_call_outgoing(TcorePending *p, int data_len, const void *data, void *user_data)\r
-{\r
- UserRequest *ur = NULL;\r
- GSList *tokens = NULL;\r
- const char *line = NULL;\r
- const TcoreATResponse* response = data;\r
- struct tresp_call_dial resp;\r
- int error;\r
- dbg("Entry");\r
-\r
- ur = tcore_pending_ref_user_request(p);\r
- if (ur) {\r
- if (response->success > 0) {\r
- dbg("RESPONSE OK");\r
- resp.err = TCORE_RETURN_SUCCESS;\r
- }\r
- else {\r
- dbg("RESPONSE NOT OK");\r
-\r
- line = (const char*)response->final_response;\r
- tokens = tcore_at_tok_new(line);\r
-\r
- if (g_slist_length(tokens) < 1) {\r
- err("Unspecified error cause OR string corrupted");\r
- resp.err = TCORE_RETURN_3GPP_ERROR;\r
- }\r
- else {\r
- error = atoi(g_slist_nth_data(tokens, 0));\r
-\r
- // TODO: CMEE error mapping is required.\r
- resp.err = TCORE_RETURN_3GPP_ERROR;\r
- }\r
-\r
- // Free tokens\r
- tcore_at_tok_free(tokens);\r
- }\r
-\r
- // Send Response to TAPI\r
- tcore_user_request_send_response(ur, TRESP_CALL_DIAL, sizeof(struct tresp_call_dial), &resp);\r
- }\r
- else {\r
- err("User Request is NULL");\r
- }\r
-\r
- dbg("Exit")\r
- return;\r
-}\r
-\r
-static void on_confirmation_call_accept(TcorePending *p, int data_len, const void *data, void *user_data)\r
-{\r
- UserRequest *ur = NULL;\r
- GSList *tokens = NULL;\r
- const char *line = NULL;\r
- const TcoreATResponse* response = data;\r
- struct tresp_call_answer resp;\r
- int error;\r
- dbg("Entry");\r
-\r
- ur = tcore_pending_ref_user_request(p);\r
- if (ur) {\r
- if (response->success > 0) {\r
- dbg("RESPONSE OK");\r
- resp.err = TCORE_RETURN_SUCCESS;\r
- }\r
- else {\r
- dbg("RESPONSE NOT OK");\r
-\r
- line = (const char*)response->final_response;\r
- tokens = tcore_at_tok_new(line);\r
-\r
- if (g_slist_length(tokens) < 1) {\r
- err("Unspecified error cause OR string corrupted");\r
- resp.err = TCORE_RETURN_3GPP_ERROR;\r
- }\r
- else {\r
- error = atoi(g_slist_nth_data(tokens, 0));\r
-\r
- // TODO: CMEE error mapping is required.\r
- resp.err = TCORE_RETURN_3GPP_ERROR;\r
- }\r
-\r
- //Free tokens\r
- tcore_at_tok_free(tokens);\r
- }\r
-\r
- resp.id = tcore_call_object_get_id((CallObject*)user_data);\r
-\r
- // Send Response to TAPI\r
- tcore_user_request_send_response(ur, TRESP_CALL_ANSWER, sizeof(struct tresp_call_answer), &resp);\r
- }\r
- else {\r
- err("User Request is NULL");\r
- }\r
-\r
- dbg("Exit");\r
- return;\r
-}\r
-\r
-\r
-static void on_confirmation_call_reject(TcorePending *p, int data_len, const void *data, void *user_data)\r
-{\r
- UserRequest *ur = NULL;\r
- GSList *tokens = NULL;\r
- const char *line = NULL;\r
- const TcoreATResponse* response = data;\r
- struct tresp_call_answer resp;\r
- int error;\r
-\r
- dbg("Entry");\r
-\r
- ur = tcore_pending_ref_user_request(p);\r
- if (ur) {\r
- if (response->success > 0) {\r
-\r
- dbg("RESPONSE OK");\r
- resp.err = TCORE_RETURN_SUCCESS;\r
- }\r
- else {\r
-\r
- dbg("RESPONSE NOT OK");\r
- line = (const char*)response->final_response;\r
- tokens = tcore_at_tok_new(line);\r
-\r
- if (g_slist_length(tokens) < 1) {\r
- err("Unspecified error cause OR string corrupted");\r
- resp.err = TCORE_RETURN_3GPP_ERROR;\r
- }\r
- else {\r
-\r
- error = atoi(g_slist_nth_data(tokens, 0));\r
- // TODO: CMEE error mapping is required.\r
- resp.err = TCORE_RETURN_3GPP_ERROR;\r
- }\r
-\r
- // Free tokens\r
- tcore_at_tok_free(tokens);\r
- }\r
-\r
- resp.id = tcore_call_object_get_id((CallObject*)user_data);\r
-\r
- //Send Response to TAPI\r
- tcore_user_request_send_response(ur, TRESP_CALL_ANSWER, sizeof(struct tresp_call_answer), &resp);\r
- }\r
- else {\r
- err("User Request is NULL");\r
- }\r
-\r
- dbg("Exit");\r
- return;\r
-}\r
-\r
-static void on_confirmation_call_replace(TcorePending *p, int data_len, const void *data, void *user_data)\r
-{\r
- UserRequest *ur = NULL;\r
- GSList *tokens = NULL;\r
- const char *line = NULL;\r
- const TcoreATResponse* response = data;\r
- struct tresp_call_answer resp;\r
- int error;\r
-\r
- dbg("Entry");\r
- ur = tcore_pending_ref_user_request(p);\r
- if (ur) {\r
- if (response->success > 0) {\r
- dbg("RESPONSE OK");\r
- resp.err = TCORE_RETURN_SUCCESS;\r
- }\r
- else {\r
-\r
- dbg("RESPONSE NOT OK");\r
- line = (const char*)response->final_response;\r
- tokens = tcore_at_tok_new(line);\r
-\r
- if (g_slist_length(tokens) < 1) {\r
- err("Unspecified error cause OR string corrupted");\r
- resp.err = TCORE_RETURN_3GPP_ERROR;\r
- }\r
- else {\r
- error = atoi(g_slist_nth_data(tokens, 0));\r
- // TODO: CMEE error mapping is required.\r
- resp.err = TCORE_RETURN_3GPP_ERROR;\r
- }\r
-\r
- // Free tokens\r
- tcore_at_tok_free(tokens);\r
- }\r
- resp.id = tcore_call_object_get_id((CallObject*)user_data);\r
-\r
- // Send Response to TAPI\r
- tcore_user_request_send_response(ur, TRESP_CALL_ANSWER, sizeof(struct tresp_call_answer), &resp);\r
- }\r
- else {\r
- dbg("User Request is NULL");\r
- }\r
-\r
- dbg("Exit");\r
- return;\r
-}\r
-\r
-static void on_confirmation_call_hold_and_accept(TcorePending *p, int data_len, const void *data, void *user_data)\r
-{\r
- CoreObject *o = NULL;\r
- UserRequest *ur = NULL;\r
- GSList *tokens = NULL;\r
- const char *line = NULL;\r
- const TcoreATResponse* response = data;\r
- struct tresp_call_answer resp;\r
- int error;\r
-\r
- dbg("Entry");\r
-\r
- o = tcore_pending_ref_core_object(p);\r
- ur = tcore_pending_ref_user_request(p);\r
- resp.id = tcore_call_object_get_id((CallObject*)user_data);\r
-\r
- if (ur) {\r
- if (response->success > 0) {\r
- dbg("RESPONSE OK");\r
- resp.err = TCORE_RETURN_SUCCESS;\r
- }\r
- else {\r
- err("RESPONSE NOT OK");\r
- line = (const char*)response->final_response;\r
- tokens = tcore_at_tok_new(line);\r
-\r
- if (g_slist_length(tokens) < 1) {\r
- err("Unspecified error cause OR string corrupted");\r
- resp.err = TCORE_RETURN_3GPP_ERROR;\r
- }\r
- else {\r
- error = atoi(g_slist_nth_data(tokens, 0));\r
-\r
- // TODO: CMEE error mapping is required.\r
- resp.err = TCORE_RETURN_3GPP_ERROR;\r
- }\r
-\r
- // Free tokens\r
- tcore_at_tok_free(tokens);\r
- }\r
-\r
- // Send response to TAPI\r
- tcore_user_request_send_response(ur, TRESP_CALL_ANSWER, sizeof(struct tresp_call_answer), &resp);\r
- if (!resp.err) {\r
-\r
- GSList *list = 0;\r
- CallObject *co = NULL;\r
-\r
- // Active Call\r
- list = tcore_call_object_find_by_status(o, TCORE_CALL_STATUS_ACTIVE);\r
- if (!list) {\r
- err("Can't find active Call");\r
- return;\r
- }\r
-\r
- co = (CallObject*)list->data;\r
- if (!co) {\r
- err("Can't get active Call object");\r
- return;\r
- }\r
-\r
- // Set Call Status\r
- tcore_call_object_set_status(co, TCORE_CALL_STATUS_HELD);\r
- dbg("Call status is set to HELD");\r
- }\r
- }\r
- else {\r
- err("User Request is NULL");\r
- }\r
-\r
- dbg("Exit");\r
- return;\r
-}\r
-\r
-static void _on_confirmation_call_release(TcorePending *p, int data_len, const void *data, void *user_data, int type)\r
-{\r
- UserRequest *ur = NULL;\r
- struct tresp_call_end resp;\r
- GSList *tokens = NULL;\r
- const char *line = NULL;\r
- int error;\r
- const TcoreATResponse* response = data;\r
-\r
- dbg("Entry");\r
- ur = tcore_pending_ref_user_request(p);\r
- if (ur) {\r
- if (response->success > 0) {\r
- dbg("RESPONSE OK");\r
- resp.err = TCORE_RETURN_SUCCESS;\r
- }\r
- else {\r
- err("RESPONSE NOT OK");\r
-\r
- line = (const char*)response->final_response;\r
- tokens = tcore_at_tok_new(line);\r
-\r
- if (g_slist_length(tokens) < 1) {\r
- err("Unspecified error cause OR string corrupted");\r
- resp.err = TCORE_RETURN_3GPP_ERROR;\r
- }\r
- else {\r
- error = atoi(g_slist_nth_data(tokens, 0));\r
-\r
- // TODO: CMEE error mapping is required.\r
- resp.err = TCORE_RETURN_3GPP_ERROR;\r
- }\r
- tcore_at_tok_free(tokens);\r
- }\r
-\r
- resp.type = type;\r
- resp.id = tcore_call_object_get_id((CallObject*)user_data);\r
- dbg("resp.type = %d resp.id= %d", resp.type,resp.id);\r
-\r
- // Send reponse to TAPI\r
- tcore_user_request_send_response(ur, TRESP_CALL_END, sizeof(struct tresp_call_end), &resp);\r
- }\r
- else {\r
- err("User Request is NULL");\r
- }\r
-\r
- dbg("Exit");\r
- return;\r
-}\r
-\r
-// RESPONSE\r
-static void on_confirmation_call_endall(TcorePending *p, int data_len, const void *data, void *user_data)\r
-{\r
- // skip response handling - actual result will be handled in on_confirmation_call_release_all\r
- const TcoreATResponse* response = data;\r
- dbg("Entry");\r
-\r
- if (response->success > 0) {\r
- dbg("RESPONSE OK");\r
- }\r
- else {\r
- err("RESPONSE NOT OK");\r
- }\r
-\r
- dbg("Exit");\r
- return;\r
-}\r
-\r
-\r
-static void on_confirmation_call_release_all(TcorePending *p, int data_len, const void *data, void *user_data)\r
-{\r
- dbg("Entry");\r
- _on_confirmation_call_release(p, data_len, data, user_data, CALL_END_TYPE_ALL);\r
-\r
- return;\r
-}\r
-\r
-\r
-static void on_confirmation_call_release_specific(TcorePending *p, int data_len, const void *data, void *user_data)\r
-{\r
- dbg("Entry");\r
- _on_confirmation_call_release(p, data_len, data, user_data, CALL_END_TYPE_DEFAULT);\r
-\r
- return;\r
-}\r
-\r
-static void on_confirmation_call_release_all_active(TcorePending *p, int data_len, const void *data, void *user_data)\r
-{\r
- dbg("Entry");\r
- _on_confirmation_call_release(p, data_len, data, user_data, CALL_END_TYPE_ACTIVE_ALL);\r
-\r
- return;\r
-}\r
-\r
-static void on_confirmation_call_release_all_held(TcorePending *p, int data_len, const void *data, void *user_data)\r
-{\r
- dbg("Entry");\r
- _on_confirmation_call_release(p, data_len, data, user_data, CALL_END_TYPE_HOLD_ALL);\r
-\r
- return;\r
-}\r
-\r
-static void _on_confirmation_call(TcorePending *p, int data_len, const void *data, void *user_data, int type)\r
-{\r
- UserRequest *ur = NULL;\r
- GSList *tokens = NULL;\r
- const char *line = NULL;\r
- const TcoreATResponse *response = NULL;\r
- int error;\r
-\r
- dbg("Entry");\r
- ur = tcore_pending_ref_user_request(p);\r
- response = (TcoreATResponse *)data;\r
- if (response->success > 0) {\r
- dbg("RESPONSE OK");\r
- error = TCORE_RETURN_SUCCESS;\r
- }\r
- else {\r
- err("RESPONSE NOT OK");\r
-\r
- line = (const char*)response->final_response;\r
- tokens = tcore_at_tok_new(line);\r
-\r
- if (g_slist_length(tokens) < 1) {\r
- err("Unspecified error cause OR string corrupted");\r
- error = TCORE_RETURN_3GPP_ERROR;\r
- }\r
- else {\r
- error = atoi(g_slist_nth_data(tokens, 0));\r
-\r
- // TODO: CMEE error mapping is required.\r
- error = TCORE_RETURN_3GPP_ERROR;\r
- }\r
-\r
- // Free tokens\r
- tcore_at_tok_free(tokens);\r
- }\r
-\r
- dbg("Response Call type -%d", type);\r
- switch(type){\r
-\r
- case TRESP_CALL_HOLD:\r
- {\r
- struct tresp_call_hold resp;\r
-\r
- resp.err = error;\r
- resp.id = tcore_call_object_get_id((CallObject*)user_data);\r
- dbg("call hold response");\r
- // Send reponse to TAPI\r
- tcore_user_request_send_response(ur, TRESP_CALL_HOLD, sizeof(struct tresp_call_hold), &resp);\r
- }\r
- break;\r
- case TRESP_CALL_ACTIVE:\r
- {\r
- struct tresp_call_active resp;\r
-\r
- resp.err = error;\r
- resp.id = tcore_call_object_get_id((CallObject*)user_data);\r
- dbg("call active response");\r
- // Send reponse to TAPI\r
- tcore_user_request_send_response(ur, TRESP_CALL_ACTIVE, sizeof(struct tresp_call_active), &resp);\r
- }\r
- break;\r
- case TRESP_CALL_JOIN:\r
- {\r
- struct tresp_call_join resp;\r
-\r
- resp.err = error;\r
- resp.id = tcore_call_object_get_id((CallObject*)user_data);\r
- dbg("call join response");\r
-\r
- // Send reponse to TAPI\r
- tcore_user_request_send_response(ur, TRESP_CALL_JOIN, sizeof(struct tresp_call_join), &resp);\r
- }\r
- break;\r
- case TRESP_CALL_SPLIT:\r
- {\r
- struct tresp_call_split resp;\r
-\r
- resp.err = error;\r
- resp.id = tcore_call_object_get_id((CallObject*)user_data);\r
- dbg("call split response");\r
- // Send reponse to TAPI\r
- tcore_user_request_send_response(ur, TRESP_CALL_SPLIT, sizeof(struct tresp_call_split), &resp);\r
- }\r
- break;\r
- case TRESP_CALL_DEFLECT:\r
- {\r
- struct tresp_call_deflect resp;\r
-\r
- resp.err = error;\r
- resp.id = tcore_call_object_get_id((CallObject*)user_data);\r
- dbg("call deflect response");\r
- // Send reponse to TAPI\r
- tcore_user_request_send_response(ur, TRESP_CALL_DEFLECT, sizeof(struct tresp_call_deflect), &resp);\r
- }\r
-\r
- break;\r
- case TRESP_CALL_TRANSFER:\r
- {\r
- struct tresp_call_transfer resp;\r
-\r
- resp.err = error;\r
- resp.id = tcore_call_object_get_id((CallObject*)user_data);\r
- dbg("call transfer response");\r
- //Send reponse to TAPI\r
- tcore_user_request_send_response(ur, TRESP_CALL_TRANSFER, sizeof(struct tresp_call_transfer), &resp);\r
- }\r
- break;\r
- case TRESP_CALL_SEND_DTMF:\r
- {\r
- struct tresp_call_dtmf resp;\r
-\r
- resp.err = error;\r
- dbg("call dtmf response");\r
- // Send reponse to TAPI\r
- tcore_user_request_send_response(ur, TRESP_CALL_SEND_DTMF, sizeof(struct tresp_call_dtmf), &resp);\r
- }\r
- break;\r
- default:\r
- {\r
- dbg("type not supported");\r
- return;\r
- }\r
- }\r
-\r
- if ((type == TRESP_CALL_HOLD)||(type == TRESP_CALL_ACTIVE)||(type == TRESP_CALL_JOIN)\r
- ||(type == TRESP_CALL_SPLIT)) {\r
-\r
- if (!error) {\r
- CoreObject *core_obj = NULL;\r
- gboolean *eflag = g_new0(gboolean, 1);\r
-\r
- core_obj = tcore_pending_ref_core_object(p);\r
- *eflag = FALSE;\r
-\r
- dbg("Calling _call_list_get");\r
- _call_list_get(core_obj, eflag);\r
- }\r
- }\r
-\r
- dbg("Exit");\r
- return;\r
-}\r
-\r
-static void on_confirmation_call_hold(TcorePending *p, int data_len, const void *data, void *user_data)\r
-{\r
- dbg("Entry");\r
- _on_confirmation_call(p, data_len, data, user_data, TRESP_CALL_HOLD);\r
-\r
- return;\r
-}\r
-\r
-static void on_confirmation_call_active(TcorePending *p, int data_len, const void *data, void *user_data)\r
-{\r
- dbg("Entry");\r
- _on_confirmation_call(p, data_len, data, user_data, TRESP_CALL_ACTIVE);\r
-\r
- return;\r
-}\r
-\r
-static void on_confirmation_call_join(TcorePending *p, int data_len, const void *data, void *user_data)\r
-{\r
- dbg("Entry");\r
- _on_confirmation_call(p, data_len, data, user_data, TRESP_CALL_JOIN);\r
-\r
- return;\r
-}\r
-\r
-static void on_confirmation_call_split(TcorePending *p, int data_len, const void *data, void *user_data)\r
-{\r
- dbg("Entry");\r
- _on_confirmation_call(p, data_len, data, user_data, TRESP_CALL_SPLIT);\r
-\r
- return;\r
-}\r
-\r
-static void on_confirmation_call_deflect(TcorePending *p, int data_len, const void *data, void *user_data)\r
-{\r
- dbg("Entry");\r
- _on_confirmation_call(p, data_len, data, user_data, TRESP_CALL_DEFLECT);\r
-\r
- return;\r
-}\r
-\r
-static void on_confirmation_call_transfer(TcorePending *p, int data_len, const void *data, void *user_data)\r
-{\r
- dbg("Entry");\r
- _on_confirmation_call(p, data_len, data, user_data, TRESP_CALL_TRANSFER);\r
-\r
- return;\r
-}\r
-\r
-static void on_confirmation_call_dtmf(TcorePending *p, int data_len, const void *data, void *user_data)\r
-{\r
- dbg("Entry");\r
- _on_confirmation_call(p, data_len, data, user_data, TRESP_CALL_SEND_DTMF);\r
-\r
- return;\r
-}\r
-\r
-static void _on_confirmation_dtmf_tone_duration(TcorePending * p, int data_len, const void * data, void * user_data)\r
-{\r
- GSList *tokens = NULL;\r
- const char *line = NULL;\r
- const TcoreATResponse* response = data;\r
- int error;\r
-\r
- dbg("Entry");\r
-\r
- if (response->success > 0) {\r
- dbg("RESPONSE OK");\r
- error = TCORE_RETURN_SUCCESS;\r
- }\r
- else {\r
-\r
- err("RESPONSE NOT OK");\r
- line = (const char*)response->final_response;\r
- tokens = tcore_at_tok_new(line);\r
- if (g_slist_length(tokens) < 1) {\r
- err("err cause not specified or string corrupted");\r
- error = TCORE_RETURN_3GPP_ERROR;\r
- }\r
- else {\r
- error = atoi(g_slist_nth_data(tokens, 0));\r
- // TODO: CMEE error mapping is required.\r
- }\r
-\r
- // Free tokens\r
- tcore_at_tok_free(tokens);\r
- }\r
-\r
- dbg("Set dtmf tone duration response - %d", error);\r
- return;\r
-}\r
-\r
-static void on_confirmation_call_swap(TcorePending *p, int data_len, const void *data, void *user_data)\r
-{\r
- CoreObject *core_obj = NULL;\r
- UserRequest *ur = NULL;\r
- const TcoreATResponse* response = data;\r
- struct tresp_call_swap resp;\r
- GSList *tokens = NULL;\r
- const char *line = NULL;\r
-\r
- dbg("Entry");\r
- core_obj = tcore_pending_ref_core_object(p);\r
- ur = tcore_pending_ref_user_request(p);\r
-\r
- if (ur) {\r
- if (response->success > 0) {\r
- dbg("RESPONSE OK");\r
- resp.err = TCORE_RETURN_SUCCESS;\r
- }\r
- else {\r
-\r
- err("RESPONSE NOT OK");\r
- line = (const char*)response->final_response;\r
- tokens = tcore_at_tok_new(line);\r
- if (g_slist_length(tokens) < 1) {\r
- err("err cause not specified or string corrupted");\r
- resp.err = TCORE_RETURN_3GPP_ERROR;\r
- }\r
- else {\r
- resp.err = atoi(g_slist_nth_data(tokens, 0));\r
-\r
- // TODO: CMEE error mapping is required.\r
- resp.err = TCORE_RETURN_3GPP_ERROR;\r
- }\r
-\r
- //Free tokens\r
- tcore_at_tok_free(tokens);\r
- }\r
-\r
- resp.id = tcore_call_object_get_id((CallObject*)user_data);\r
- dbg("resp.id = %d", resp.id);\r
-\r
- // Send response to TAPI\r
- tcore_user_request_send_response(ur, TRESP_CALL_SWAP, sizeof(struct tresp_call_swap), &resp);\r
-\r
- if (!resp.err) {\r
-\r
- GSList *active = NULL;\r
- GSList *held = NULL;\r
- CallObject *co = NULL;\r
- gboolean *eflag = NULL;\r
-\r
- held = tcore_call_object_find_by_status(core_obj, TCORE_CALL_STATUS_HELD);\r
- if (!held) {\r
- err("Can't find held Call");\r
- return;\r
- }\r
-\r
- active = tcore_call_object_find_by_status(core_obj, TCORE_CALL_STATUS_ACTIVE);\r
- if (!active) {\r
- dbg("Can't find active Call");\r
- return;\r
- }\r
-\r
- while (held) {\r
- co = (CallObject*)held->data;\r
- if (!co) {\r
- err("Can't get held Call object");\r
- return;\r
- }\r
-\r
- resp.id = tcore_call_object_get_id(co);\r
-\r
- // Send response to TAPI\r
- tcore_user_request_send_response(ur, TRESP_CALL_ACTIVE, sizeof(struct tresp_call_active), &resp);\r
-\r
- held = g_slist_next(held);\r
- }\r
-\r
- while (active) {\r
- co = (CallObject*)active->data;\r
- if (!co) {\r
- err("[ error ] can't get active call object");\r
- return;\r
- }\r
-\r
- resp.id = tcore_call_object_get_id(co);\r
-\r
- // Send response to TAPI\r
- tcore_user_request_send_response(ur, TRESP_CALL_HOLD, sizeof(struct tresp_call_hold), &resp);\r
- active = g_slist_next(active);\r
- }\r
-\r
- eflag = g_new0(gboolean, 1);\r
- *eflag = FALSE;\r
-\r
- dbg("calling _call_list_get");\r
- _call_list_get(core_obj, eflag);\r
- }\r
- }\r
- else {\r
-\r
- err("User Request is NULL");\r
- }\r
-\r
- dbg("Exit");\r
- return;\r
-}\r
-\r
-static void on_confirmation_call_set_source_sound_path(TcorePending *p, int data_len, const void *data, void *user_data)\r
-{\r
- UserRequest *ur = NULL;\r
- GSList *tokens = NULL;\r
- const char *line = NULL;\r
- const TcoreATResponse* response = data;\r
- char *resp_str = NULL;\r
- struct tresp_call_sound_set_path resp;\r
- int error;\r
-\r
- dbg("Entry");\r
- ur = tcore_pending_ref_user_request(p);\r
-\r
- //+XDRV: <group_id>,<function_id>,<xdrv_result>[,<response_n>]\ 3\r
- if (!response) {\r
- err("Input data is NULL");\r
- return;\r
- }\r
-\r
- if (response->success > 0) {\r
- dbg("RESPONSE OK");\r
-\r
- line = (const char*) (((GSList*)response->lines)->data);\r
- tokens = tcore_at_tok_new(line);\r
-\r
- resp_str = g_slist_nth_data(tokens, 0);\r
- if(!g_slist_nth_data(tokens, 0)) {\r
- err("group_id is missing");\r
- resp.err = TCORE_RETURN_3GPP_ERROR;\r
- goto OUT;\r
- }\r
-\r
- if(!g_slist_nth_data(tokens, 1)) {\r
- err(" function_id is missing");\r
- resp.err = TCORE_RETURN_3GPP_ERROR;\r
- goto OUT;\r
- }\r
-\r
- resp_str = g_slist_nth_data(tokens, 2);\r
-\r
- if(resp_str) {\r
- error = atoi(resp_str);\r
- if(0 == error) {\r
- dbg("Response is Success");\r
- resp.err = TCORE_RETURN_SUCCESS;\r
- }\r
- else {\r
- resp.err = TCORE_RETURN_3GPP_ERROR;\r
- }\r
- }\r
-OUT:\r
- // Free tokens\r
- tcore_at_tok_free(tokens);\r
- }\r
- else {\r
- dbg("RESPONSE NOT OK");\r
-\r
- line = (const char*)response->final_response;\r
- tokens = tcore_at_tok_new(line);\r
-\r
- if (g_slist_length(tokens) < 1) {\r
- err("err cause not specified or string corrupted");\r
- resp.err = TCORE_RETURN_3GPP_ERROR;\r
- }\r
- else {\r
- error = atoi(g_slist_nth_data(tokens, 0));\r
-\r
- // TODO: CMEE error mapping is required.\r
- resp.err = TCORE_RETURN_3GPP_ERROR;\r
- }\r
-\r
- // Free tokens\r
- tcore_at_tok_free(tokens);\r
- }\r
-\r
- if (ur) {\r
- if(resp.err != TCORE_RETURN_SUCCESS) { // Send only failed notification . success notification send when destination device is set.\r
- // Send notification to TAPI\r
- tcore_user_request_send_response(ur, TRESP_CALL_SET_SOUND_PATH, sizeof(struct tresp_call_sound_set_path), &resp);\r
- setsoundpath = TRUE;\r
- }\r
- }\r
- else {\r
- err("User Request is NULL");\r
- }\r
-\r
- dbg("Exit");\r
- return;\r
-}\r
-\r
-static void on_confirmation_call_set_destination_sound_path(TcorePending *p, int data_len, const void *data, void *user_data)\r
-{\r
- UserRequest *ur = NULL;\r
- GSList *tokens = NULL;\r
- const char *line = NULL;\r
- char *resp_str = NULL ;\r
- struct tresp_call_sound_set_path resp;\r
- const TcoreATResponse* response = data;\r
- int error;\r
-\r
- dbg("Entry");\r
-\r
- ur = tcore_pending_ref_user_request(p);\r
- // +XDRV: <group_id>,<function_id>,<xdrv_result>[,<response_n>]\ 3\r
-\r
- if (!response) {\r
- err("Input data is NULL");\r
- return;\r
- }\r
-\r
- if (ur) {\r
- if (response->success > 0) {\r
- dbg("RESPONSE OK");\r
-\r
- line = (const char*) (((GSList*)response->lines)->data);\r
- tokens = tcore_at_tok_new(line);\r
-\r
- resp_str = g_slist_nth_data(tokens, 0);\r
- if(!g_slist_nth_data(tokens, 0)) {\r
- dbg("group_id is missing");\r
- resp.err = TCORE_RETURN_3GPP_ERROR;\r
- goto OUT;\r
- }\r
-\r
- if(!g_slist_nth_data(tokens, 1)) {\r
- dbg("function_id is missing");\r
- resp.err = TCORE_RETURN_3GPP_ERROR;\r
- goto OUT;\r
- }\r
-\r
- resp_str = g_slist_nth_data(tokens, 2);\r
- if(resp_str) {\r
- error = atoi(resp_str);\r
- if(0 == error) {\r
- dbg("Response is Success");\r
- resp.err = TCORE_RETURN_SUCCESS;\r
- }\r
- else {\r
- resp.err = TCORE_RETURN_3GPP_ERROR;\r
- }\r
- }\r
-\r
-OUT:\r
- // Free tokens\r
- tcore_at_tok_free(tokens);\r
- }\r
- else {\r
- dbg("RESPONSE NOT OK");\r
-\r
- line = (const char*)response->final_response;\r
- tokens = tcore_at_tok_new(line);\r
-\r
- if (g_slist_length(tokens) < 1) {\r
- err("err cause not specified or string corrupted");\r
- resp.err = TCORE_RETURN_3GPP_ERROR;\r
- }\r
- else {\r
- error = atoi(g_slist_nth_data(tokens, 0));\r
- // TODO: CMEE error mapping is required.\r
- resp.err = TCORE_RETURN_3GPP_ERROR;\r
- }\r
-\r
- // Free tokens\r
- tcore_at_tok_free(tokens);\r
- }\r
-\r
- if(setsoundpath == TRUE) {\r
- setsoundpath = FALSE;\r
- }\r
- else {\r
- // Send response to TAPI\r
- tcore_user_request_send_response(ur, TRESP_CALL_SET_SOUND_PATH, sizeof(struct tresp_call_sound_set_path), &resp);\r
- }\r
- }\r
- else {\r
- dbg("User Request is NULL");\r
- }\r
-\r
- dbg("Exit");\r
- return;\r
-}\r
-\r
-static void on_confirmation_call_set_source_sound_volume_level(TcorePending *p, int data_len, const void *data, void *user_data)\r
-{\r
- UserRequest *ur = NULL;\r
- GSList *tokens = NULL;\r
- const char *line = NULL;\r
- const TcoreATResponse* response = data;\r
- char *resp_str = NULL;\r
- struct tresp_call_sound_set_volume_level resp;\r
- int error;\r
-\r
- ur = tcore_pending_ref_user_request(p);\r
- dbg("Entry");\r
- // +XDRV: <group_id>,<function_id>,<xdrv_result>[,<response_n>]\ 3\r
- if (!response) {\r
- err("Input data is NULL");\r
- return;\r
- }\r
-\r
- if (response->success > 0) {\r
- dbg("RESPONSE OK");\r
-\r
- line = (const char*) (((GSList*)response->lines)->data);\r
- tokens = tcore_at_tok_new(line);\r
-\r
- resp_str = g_slist_nth_data(tokens, 0);\r
- if(!g_slist_nth_data(tokens, 0)) {\r
- err("group_id is missing");\r
- resp.err = TCORE_RETURN_3GPP_ERROR;\r
- goto OUT;\r
- }\r
-\r
- if(!g_slist_nth_data(tokens, 1)) {\r
- err("function_id is missing");\r
- resp.err = TCORE_RETURN_3GPP_ERROR;\r
- goto OUT;\r
- }\r
-\r
- resp_str = g_slist_nth_data(tokens, 2);\r
- if(resp_str) {\r
- error = atoi(resp_str);\r
-\r
- if(0 == error) {\r
- dbg("Response is Success ");\r
- resp.err = TCORE_RETURN_SUCCESS;\r
- }\r
- else {\r
- resp.err = TCORE_RETURN_3GPP_ERROR;\r
- }\r
- }\r
-\r
-OUT:\r
- // Free tokens\r
- tcore_at_tok_free(tokens);\r
- }\r
- else {\r
- dbg("RESPONSE NOT OK");\r
-\r
- line = (const char*)response->final_response;\r
- tokens = tcore_at_tok_new(line);\r
-\r
- if (g_slist_length(tokens) < 1) {\r
- err("err cause not specified or string corrupted");\r
- resp.err = TCORE_RETURN_3GPP_ERROR;\r
- }\r
- else {\r
- error = atoi(g_slist_nth_data(tokens, 0));\r
-\r
- // TODO: CMEE error mapping is required.\r
- resp.err = TCORE_RETURN_3GPP_ERROR;\r
- }\r
-\r
- // Free tokens\r
- tcore_at_tok_free(tokens);\r
- }\r
-\r
- if (ur) {\r
- if(resp.err && soundvolume == FALSE) { // Send only failed notification . success notification send when destination device is set.\r
- // Send reposne to TAPI\r
- tcore_user_request_send_response(ur, TRESP_CALL_SET_SOUND_VOLUME_LEVEL, sizeof(struct tresp_call_sound_set_volume_level), &resp);\r
- soundvolume = TRUE;\r
- }\r
- }\r
- else {\r
- err("User Request is NULL");\r
- }\r
-\r
- dbg("Exit");\r
- return;\r
-}\r
-\r
-\r
-static void on_confirmation_call_set_destination_sound_volume_level(TcorePending *p, int data_len, const void *data, void *user_data)\r
-{\r
- UserRequest *ur = NULL;\r
- GSList *tokens = NULL;\r
- const char *line = NULL;\r
- char *resp_str = NULL;\r
- const TcoreATResponse* response = data;\r
- struct tresp_call_sound_set_volume_level resp;\r
- int error;\r
-\r
- dbg("Entry");\r
-\r
- ur = tcore_pending_ref_user_request(p);\r
-\r
- // +XDRV: <group_id>,<function_id>,<xdrv_result>[,<response_n>]\ 3\r
- if (!response) {\r
- err("Input data is NULL");\r
- return;\r
- }\r
-\r
- if (ur) {\r
- if (response->success > 0) {\r
-\r
- dbg("RESPONSE OK");\r
- line = (const char*) (((GSList*)response->lines)->data);\r
- tokens = tcore_at_tok_new(line);\r
- resp_str = g_slist_nth_data(tokens, 0);\r
-\r
- if(!g_slist_nth_data(tokens, 0)) {\r
- err("group_id is missing");\r
- resp.err = TCORE_RETURN_3GPP_ERROR;\r
- goto OUT;\r
- }\r
-\r
- if(!g_slist_nth_data(tokens, 1)) {\r
- err("function_id is missing");\r
- resp.err = TCORE_RETURN_3GPP_ERROR;\r
- goto OUT;\r
- }\r
-\r
- resp_str = g_slist_nth_data(tokens, 2);\r
-\r
- if(resp_str) {\r
- error = atoi(resp_str);\r
-\r
- if(0 == error) {\r
- dbg("Response is Success");\r
- resp.err = TCORE_RETURN_SUCCESS;\r
- }\r
- else {\r
- resp.err = TCORE_RETURN_3GPP_ERROR;\r
- }\r
- }\r
-\r
-OUT:\r
- // Free tokens\r
- tcore_at_tok_free(tokens);\r
- }\r
- else {\r
- dbg("RESPONSE NOT OK");\r
-\r
- line = (const char*)response->final_response;\r
- tokens = tcore_at_tok_new(line);\r
-\r
- if (g_slist_length(tokens) < 1) {\r
- err("err cause not specified or string corrupted");\r
- resp.err = TCORE_RETURN_3GPP_ERROR;\r
- }\r
- else {\r
- error = atoi(g_slist_nth_data(tokens, 0));\r
-\r
- // TODO: CMEE error mapping is required.\r
- resp.err = TCORE_RETURN_3GPP_ERROR;\r
- }\r
-\r
- tcore_at_tok_free(tokens);\r
- }\r
-\r
- if(soundvolume == TRUE){\r
- soundvolume = FALSE;\r
- }\r
- else{\r
- // Send reposne to TAPI\r
- tcore_user_request_send_response(ur, TRESP_CALL_SET_SOUND_VOLUME_LEVEL, sizeof(struct tresp_call_sound_set_volume_level), &resp);\r
- }\r
- }\r
- else {\r
- err("User Request is NULL");\r
- }\r
-\r
- dbg("Exit");\r
- return;\r
-}\r
-\r
-\r
-static void on_confirmation_call_mute(TcorePending *p, int data_len, const void *data, void *user_data)\r
-{\r
- UserRequest *ur = NULL;\r
- GSList *tokens = NULL;\r
- const char *line = NULL;\r
- char *resp_str = NULL;\r
- struct tresp_call_mute resp;\r
- const TcoreATResponse* response = data;\r
- int error;\r
-\r
- dbg("Entry");\r
-\r
- ur = tcore_pending_ref_user_request(p);\r
-\r
- if (!response) {\r
- err("Input data is NULL");\r
- return;\r
- }\r
-\r
- if (response->success > 0) {\r
- dbg("RESPONSE OK");\r
-\r
- line = (const char*) (((GSList*)response->lines)->data);\r
- tokens = tcore_at_tok_new(line);\r
- resp_str = g_slist_nth_data(tokens, 0);\r
-\r
- if(!g_slist_nth_data(tokens, 0)) {\r
- err("group_id is missing");\r
- resp.err = TCORE_RETURN_3GPP_ERROR;\r
- goto OUT;\r
- }\r
-\r
- if(!g_slist_nth_data(tokens, 1)) {\r
- err(" function_id is missing");\r
- resp.err = TCORE_RETURN_3GPP_ERROR;\r
- goto OUT;\r
- }\r
-\r
- resp_str = g_slist_nth_data(tokens, 2);\r
-\r
- if(resp_str) {\r
- error = atoi(resp_str);\r
- if(0 == error) {\r
- dbg("Response is Success");\r
- resp.err = TCORE_RETURN_SUCCESS;\r
- }\r
- else {\r
- resp.err = TCORE_RETURN_3GPP_ERROR;\r
- }\r
- }\r
-OUT:\r
- // Free tokens\r
- tcore_at_tok_free(tokens);\r
- }\r
- else {\r
- dbg("RESPONSE NOT OK");\r
-\r
- line = (const char*)response->final_response;\r
- tokens = tcore_at_tok_new(line);\r
-\r
- if (g_slist_length(tokens) < 1) {\r
- err("err cause not specified or string corrupted");\r
- resp.err = TCORE_RETURN_3GPP_ERROR;\r
- }\r
- else {\r
- error = atoi(g_slist_nth_data(tokens, 0));\r
-\r
- // TODO: CMEE error mapping is required.\r
- resp.err = TCORE_RETURN_3GPP_ERROR;\r
- }\r
-\r
- // Free tokens\r
- tcore_at_tok_free(tokens);\r
- }\r
-\r
- if (ur) {\r
- tcore_user_request_send_response(ur, TRESP_CALL_MUTE, sizeof(struct tresp_call_mute), &resp);\r
- }\r
- else {\r
- err("User Request is NULL");\r
- }\r
-\r
- dbg("Exit");\r
- return;\r
-}\r
-\r
-static void on_confirmation_call_unmute(TcorePending *p, int data_len, const void *data, void *user_data)\r
-{\r
- const TcoreATResponse *response = NULL;\r
- struct tresp_call_unmute resp;\r
- GSList *tokens = NULL;\r
- const char *line = NULL;\r
- UserRequest *ur = NULL;\r
- char *resp_str = NULL;\r
- int error;\r
-\r
- dbg("Entry");\r
-\r
- response = (TcoreATResponse *)data;\r
- ur = tcore_pending_ref_user_request(p);\r
-\r
- if (!response) {\r
- err("Input data is NULL");\r
- return;\r
- }\r
-\r
- if (response->success > 0) {\r
- dbg("RESPONSE OK");\r
-\r
- line = (const char*) (((GSList*)response->lines)->data);\r
- tokens = tcore_at_tok_new(line);\r
- resp_str = g_slist_nth_data(tokens, 0);\r
-\r
- if(!g_slist_nth_data(tokens, 0)) {\r
- err("group_id is missing");\r
- resp.err = TCORE_RETURN_3GPP_ERROR;\r
- goto OUT;\r
- }\r
-\r
- if(!g_slist_nth_data(tokens, 1)) {\r
- err(" function_id is missing");\r
- resp.err = TCORE_RETURN_3GPP_ERROR;\r
- goto OUT;\r
- }\r
-\r
- resp_str = g_slist_nth_data(tokens, 2);\r
-\r
- if(resp_str) {\r
- error = atoi(resp_str);\r
- if(0 == error) {\r
- dbg("Response is Success");\r
- resp.err = TCORE_RETURN_SUCCESS;\r
- }\r
- else {\r
- resp.err = TCORE_RETURN_3GPP_ERROR;\r
- }\r
- }\r
-OUT:\r
- // Free tokens\r
- tcore_at_tok_free(tokens);\r
- }\r
- else {\r
- dbg("RESPONSE NOT OK");\r
-\r
- line = (const char*)response->final_response;\r
- tokens = tcore_at_tok_new(line);\r
-\r
- if (g_slist_length(tokens) < 1) {\r
- err("err cause not specified or string corrupted");\r
- resp.err = TCORE_RETURN_3GPP_ERROR;\r
- }\r
- else {\r
- error = atoi(g_slist_nth_data(tokens, 0));\r
-\r
- // TODO: CMEE error mapping is required.\r
- resp.err = TCORE_RETURN_3GPP_ERROR;\r
- }\r
-\r
- // Free tokens\r
- tcore_at_tok_free(tokens);\r
- }\r
-\r
- if (ur) {\r
- tcore_user_request_send_response(ur, TRESP_CALL_UNMUTE, sizeof(struct tresp_call_unmute), &resp);\r
- }\r
- else {\r
- err("User Request is NULL");\r
- }\r
-\r
- dbg("Exit");\r
- return;\r
-}\r
-\r
-// RESPONSE\r
-static void on_response_call_list_get(TcorePending *p, int data_len, const void *data, void *user_data)\r
-{\r
- TcorePlugin *plugin = NULL;\r
- CoreObject *core_obj = NULL;\r
- CallObject *co = NULL;\r
- struct clcc_call_t *call_list = NULL;\r
- gboolean *event_flag = (gboolean*)user_data;\r
- const TcoreATResponse *response = data;\r
- GSList *resp_data = NULL;\r
- char *line = NULL;\r
-\r
- int cllc_info = 0, countCalls = 0, countValidCalls = 0;\r
- int error = 0;\r
- dbg("Entry");\r
-\r
- plugin = tcore_pending_ref_plugin(p);\r
- core_obj = tcore_pending_ref_core_object(p);\r
-\r
- if(response->success > 0) {\r
- dbg("RESPONCE OK");\r
- if(response->lines) {\r
- resp_data = (GSList*)response->lines;\r
- countCalls = g_slist_length(resp_data);\r
- dbg("Total records : %d",countCalls);\r
- }\r
-\r
- if (0 == countCalls) {\r
- err("Call count is zero");\r
- return;\r
- }\r
-\r
- call_list = g_new0(struct clcc_call_t, countCalls);\r
-\r
- for (countValidCalls = 0;resp_data != NULL ;resp_data = resp_data->next,countValidCalls++,cllc_info++) {\r
-\r
- line = (char*)(resp_data->data);\r
-\r
- error = _callFromCLCCLine(line, call_list + countValidCalls);\r
- if (0 != error) {\r
- continue;\r
- }\r
-\r
- co = tcore_call_object_find_by_id(core_obj, call_list[cllc_info].info.id);\r
- if (!co) {\r
- co = tcore_call_object_new(core_obj, call_list[cllc_info].info.id);\r
- if (!co) {\r
- err("error : tcore_call_object_new [ id : %d ]", call_list[cllc_info].info.id);\r
- continue;\r
- }\r
- }\r
-\r
- // Call set parameters\r
- tcore_call_object_set_type(co, call_type(call_list[cllc_info].info.type));\r
- tcore_call_object_set_direction(co, call_list[cllc_info].info.direction);\r
- tcore_call_object_set_multiparty_state(co, _call_is_in_mpty(call_list[cllc_info].info.mpty));\r
- tcore_call_object_set_cli_info(co, CALL_CLI_MODE_DEFAULT, call_list[cllc_info].number);\r
- tcore_call_object_set_active_line(co, 0);\r
-\r
- if (*event_flag) {\r
- dbg("Call status before calling _call_branch_by_status() : (%d)", call_list[cllc_info].info.status);\r
- _call_branch_by_status(plugin, co, call_list[cllc_info].info.status);\r
- }\r
- else {\r
- // Set Status\r
- tcore_call_object_set_status(co, call_list[cllc_info].info.status);\r
-\r
- dbg("Call id : (%d)", call_list[cllc_info].info.id);\r
- dbg("Call direction : (%d)", call_list[cllc_info].info.direction);\r
- dbg("Call type : (%d)", call_list[cllc_info].info.type);\r
- dbg("Call mpty : (%d)", call_list[cllc_info].info.mpty);\r
- dbg("Call number : (%s)", call_list[cllc_info].number);\r
- dbg("Call status : (%d)", call_list[cllc_info].info.status);\r
- }\r
- }\r
-\r
- // Free Call list\r
- g_free(call_list);\r
- }\r
-\r
- // Free User data\r
- g_free(event_flag);\r
-\r
- dbg("Exit");\r
- return;\r
-}\r
-\r
-static void _on_confirmation_call_end_cause(TcorePending * p, int data_len, const void * data, void * user_data)\r
-{\r
- TcorePlugin *plugin = NULL;\r
- CoreObject *core_obj = NULL;\r
- CallObject *co = (CallObject *)user_data;\r
- const TcoreATResponse *response = data;\r
- const char *line = NULL;\r
- struct tnoti_call_status_idle call_status;\r
- GSList *tokens = NULL;\r
- char* resp_str;\r
- int error;\r
-\r
- dbg("Entry");\r
- plugin = tcore_pending_ref_plugin(p);\r
- core_obj = tcore_pending_ref_core_object(p);\r
-\r
- if (response->success > 0){\r
- dbg("RESPONSE OK");\r
- line = (const char*) (((GSList*)response->lines)->data);\r
- tokens = tcore_at_tok_new(line);\r
- resp_str = g_slist_nth_data(tokens, 0);\r
- if(!resp_str){\r
- err("call end cause - report value missing");\r
- }\r
- else {\r
- resp_str = g_slist_nth_data(tokens, 1);\r
- if(!resp_str){\r
- err("call end cause value missing");\r
- }\r
- error = atoi(resp_str);\r
- dbg("call end cause - %d",error);\r
- call_status.cause =_compare_call_end_cause(error);\r
- dbg("TAPI call end cause - %d",call_status.cause);\r
- }\r
-\r
- //Free tokens\r
- tcore_at_tok_free(tokens);\r
- }\r
- else {\r
- err("RESPONSE NOT OK");\r
- line = (char*)response->final_response;\r
- tokens = tcore_at_tok_new(line);\r
- if (g_slist_length(tokens) < 1) {\r
- err("err cause not specified or string corrupted");\r
- }\r
- else {\r
- err(" err cause value: %d",atoi(g_slist_nth_data(tokens, 0)));\r
- }\r
- call_status.cause = CC_CAUSE_NORMAL_CALL_CLEARING;\r
- //Free tokens\r
- tcore_at_tok_free(tokens);\r
- }\r
-\r
- call_status.type = tcore_call_object_get_type(co);\r
- dbg("data.type : [%d]", call_status.type);\r
-\r
- call_status.id = tcore_call_object_get_id(co);\r
- dbg("data.id : [%d]", call_status.id);\r
-\r
- // Set Status\r
- tcore_call_object_set_status(co, TCORE_CALL_STATUS_IDLE);\r
-\r
- // Send Notification to TAPI\r
- tcore_server_send_notification(tcore_plugin_ref_server(plugin),\r
- core_obj,\r
- TNOTI_CALL_STATUS_IDLE,\r
- sizeof(struct tnoti_call_status_idle),\r
- (void*)&call_status);\r
-\r
- // Free Call object\r
- tcore_call_object_free(core_obj, co);\r
-}\r
-\r
-static int _callFromCLCCLine(char *line, struct clcc_call_t *p_call)\r
-{\r
- //+CLCC: 1,0,2,0,0,"18005551212",145\r
- //[+CLCC: <id1>, <dir>, <stat>, <mode>,<mpty>[,<number>,<type>[,<alpha>[,<priority>]]]\r
- int state;\r
- int mode;\r
- int isMT;\r
- char *num = NULL;\r
- unsigned int num_type;\r
- GSList *tokens = NULL;\r
- char *resp = NULL;\r
- dbg("Entry");\r
-\r
- tokens = tcore_at_tok_new(line);\r
- // parse <id>\r
- resp = g_slist_nth_data(tokens, 0);\r
- if(!resp) {\r
- err("InValid ID");\r
- goto ERROR;\r
- }\r
- p_call->info.id = atoi(resp);\r
- dbg("id : [%d]\n", p_call->info.id);\r
-\r
- //parse <dir>\r
- resp = g_slist_nth_data(tokens, 1);\r
- if(!resp) {\r
- err("InValid Dir");\r
- goto ERROR;\r
- }\r
- isMT = atoi(resp);\r
- if(0 == isMT) {\r
- p_call->info.direction = TCORE_CALL_DIRECTION_OUTGOING;\r
- }\r
- else {\r
- p_call->info.direction = TCORE_CALL_DIRECTION_INCOMING;\r
- }\r
- dbg("Direction : [ %d ]\n", p_call->info.direction);\r
-\r
- // parse <stat>\r
- resp = g_slist_nth_data(tokens, 2);\r
- if(!resp) {\r
- err("InValid Stat");\r
- goto ERROR;\r
- }\r
- state = atoi(resp);\r
- dbg("Call state : %d", state);\r
- switch(state){\r
- case 0: //active\r
- p_call->info.status = TCORE_CALL_STATUS_ACTIVE;\r
- break;\r
- case 1:\r
- p_call->info.status = TCORE_CALL_STATUS_HELD;\r
- break;\r
- case 2:\r
- p_call->info.status = TCORE_CALL_STATUS_DIALING;\r
- break;\r
- case 3:\r
- p_call->info.status = TCORE_CALL_STATUS_ALERT;\r
- break;\r
- case 4:\r
- p_call->info.status = TCORE_CALL_STATUS_INCOMING;\r
- break;\r
- case 5:\r
- p_call->info.status = TCORE_CALL_STATUS_WAITING;\r
- break;\r
- }\r
- dbg("Status : [%d]\n", p_call->info.status);\r
-\r
- // parse <mode>\r
- resp = g_slist_nth_data(tokens, 3);\r
- if(!resp) {\r
- err("InValid Mode");\r
- goto ERROR;\r
- }\r
- mode = atoi(resp);\r
- switch(mode)\r
- {\r
- case 0:\r
- p_call->info.type = TCORE_CALL_TYPE_VOICE;\r
- break;\r
- case 1:\r
- p_call->info.type = TCORE_CALL_TYPE_VIDEO;\r
- break;\r
- default: // only Voice/VT call is supported in CS. treat other unknown calls as error\r
- dbg("invalid type : [%d]\n", mode);\r
- goto ERROR;\r
- }\r
- dbg("Call type : [%d]\n", p_call->info.type);\r
-\r
- // parse <mpty>\r
- resp = g_slist_nth_data(tokens, 4);\r
- if(!resp) {\r
- err("InValid Mpty");\r
- goto ERROR;\r
- }\r
-\r
- p_call->info.mpty = atoi(resp);\r
- dbg("Mpty : [ %d ]\n", p_call->info.mpty);\r
-\r
- // parse <num>\r
- resp = g_slist_nth_data(tokens, 5);\r
- dbg("Incoming number - %s and its len - %d", resp, strlen(resp));\r
-\r
- // tolerate null here\r
- if (!resp) {\r
- err("Number is NULL");\r
- goto ERROR;\r
- }\r
- // Strike off double quotes\r
+/*
+ * tel-plugin-imc
+ *
+ * Copyright (c) 2012 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: sharanayya mathapati <sharan.m@samsung.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <glib.h>
+
+#include <tcore.h>
+#include <hal.h>
+#include <core_object.h>
+#include <plugin.h>
+#include <queue.h>
+#include <co_call.h>
+#include <user_request.h>
+#include <server.h>
+#include <at.h>
+
+#include "s_common.h"
+#include "s_call.h"
+
+
+#define STATUS_INCOMING 4
+#define STATUS_WAITING 5
+#define STATUS_CONNECTED 7
+#define COMMA 0X2c
+
+static gboolean setsoundpath = FALSE;
+static gboolean soundvolume = FALSE;
+
+// End Cause field - Call state end cause
+
+typedef enum {
+ CALL_END_NO_CAUSE,
+
+ // These definitions are taken from GSM 04.08 Table 10.86
+
+ CC_CAUSE_UNASSIGNED_NUMBER,
+ CC_CAUSE_NO_ROUTE_TO_DEST,
+ CC_CAUSE_CHANNEL_UNACCEPTABLE,
+ CC_CAUSE_OPERATOR_DETERMINED_BARRING,
+ CC_CAUSE_NORMAL_CALL_CLEARING,
+ CC_CAUSE_USER_BUSY,
+ CC_CAUSE_NO_USER_RESPONDING,
+ CC_CAUSE_USER_ALERTING_NO_ANSWER,
+ CC_CAUSE_CALL_REJECTED,
+ CC_CAUSE_NUMBER_CHANGED,
+ CC_CAUSE_NON_SELECTED_USER_CLEARING,
+ CC_CAUSE_DESTINATION_OUT_OF_ORDER,
+ CC_CAUSE_INVALID_NUMBER_FORMAT,
+ CC_CAUSE_FACILITY_REJECTED,
+ CC_CAUSE_RESPONSE_TO_STATUS_ENQUIRY,
+ CC_CAUSE_NORMAL_UNSPECIFIED,
+ CC_CAUSE_NO_CIRCUIT_CHANNEL_AVAILABLE,
+ CC_CAUSE_NETWORK_OUT_OF_ORDER,
+ CC_CAUSE_TEMPORARY_FAILURE,
+ CC_CAUSE_SWITCHING_EQUIPMENT_CONGESTION,
+ CC_CAUSE_ACCESS_INFORMATION_DISCARDED,
+ CC_CAUSE_REQUESTED_CIRCUIT_CHANNEL_NOT_AVAILABLE,
+ CC_CAUSE_RESOURCES_UNAVAILABLE_UNSPECIFIED,
+ CC_CAUSE_QUALITY_OF_SERVICE_UNAVAILABLE,
+ CC_CAUSE_REQUESTED_FACILITY_NOT_SUBSCRIBED,
+ CC_CAUSE_INCOMING_CALL_BARRED_WITHIN_CUG,
+ CC_CAUSE_BEARER_CAPABILITY_NOT_AUTHORISED,
+ CC_CAUSE_BEARER_CAPABILITY_NOT_PRESENTLY_AVAILABLE,
+ CC_CAUSE_SERVICE_OR_OPTION_NOT_AVAILABLE,
+ CC_CAUSE_BEARER_SERVICE_NOT_IMPLEMENTED,
+ CC_CAUSE_ACM_GEQ_ACMMAX,
+ CC_CAUSE_REQUESTED_FACILITY_NOT_IMPLEMENTED,
+ CC_CAUSE_ONLY_RESTRICTED_DIGITAL_INFO_BC_AVAILABLE,
+ CC_CAUSE_SERVICE_OR_OPTION_NOT_IMPLEMENTED,
+ CC_CAUSE_INVALID_TRANSACTION_ID_VALUE,
+ CC_CAUSE_USER_NOT_MEMBER_OF_CUG,
+ CC_CAUSE_INCOMPATIBLE_DESTINATION,
+ CC_CAUSE_INVALID_TRANSIT_NETWORK_SELECTION,
+ CC_CAUSE_SEMANTICALLY_INCORRECT_MESSAGE,
+ CC_CAUSE_INVALID_MANDATORY_INFORMATION,
+ CC_CAUSE_MESSAGE_TYPE_NON_EXISTENT,
+ CC_CAUSE_MESSAGE_TYPE_NOT_COMPATIBLE_WITH_PROT_STATE,
+ CC_CAUSE_IE_NON_EXISTENT_OR_NOT_IMPLEMENTED,
+ CC_CAUSE_CONDITIONAL_IE_ERROR,
+ CC_CAUSE_MESSAGE_NOT_COMPATIBLE_WITH_PROTOCOL_STATE,
+ CC_CAUSE_RECOVERY_ON_TIMER_EXPIRY,
+ CC_CAUSE_PROTOCOL_ERROR_UNSPECIFIED,
+ CC_CAUSE_INTERWORKING_UNSPECIFIED,
+ CC_CAUSE_END = 128,
+
+ // Reject causes
+ REJECT_CAUSE_IMSI_UNKNOWN_IN_HLR,
+ REJECT_CAUSE_ILLEGAL_MS,
+ REJECT_CAUSE_IMSI_UNKNOWN_IN_VLR,
+ REJECT_CAUSE_IMEI_NOT_ACCEPTED,
+ REJECT_CAUSE_ILLEGAL_ME,
+ REJECT_CAUSE_GPRS_SERVICES_NOT_ALLOWED,
+ REJECT_CAUSE_GPRS_SERVICES_AND_NON_GPRS_SERVICES_NOT_ALLOWED,
+ REJECT_CAUSE_MS_IDENTITY_CANNOT_BE_DERIVED_BY_THE_NETWORK,
+ REJECT_CAUSE_IMPLICITLY_DETACHED,
+ REJECT_CAUSE_PLMN_NOT_ALLOWED,
+ REJECT_CAUSE_LA_NOT_ALLOWED,
+ REJECT_CAUSE_NATIONAL_ROAMING_NOT_ALLOWED,
+ REJECT_CAUSE_GPRS_SERVICES_NOT_ALLOWED_IN_THIS_PLMN,
+ REJECT_CAUSE_NO_SUITABLE_CELLS_IN_LA,
+ REJECT_CAUSE_MSC_TEMPORARILY_NOT_REACHABLE,
+ REJECT_CAUSE_NETWORK_FAILURE,
+ REJECT_CAUSE_MAC_FAILURE,
+ REJECT_CAUSE_SYNCH_FAILURE,
+ REJECT_CAUSE_CONGESTTION,
+ REJECT_CAUSE_GSM_AUTH_UNACCEPTED,
+ REJECT_CAUSE_SERVICE_OPTION_NOT_SUPPORTED,
+ REJECT_CAUSE_REQ_SERV_OPT_NOT_SUBSCRIBED,
+ REJECT_CAUSE_SERVICE_OPT__OUT_OF_ORDER,
+ REJECT_CAUSE_CALL_CANNOT_BE_IDENTIFIED,
+ REJECT_CAUSE_NO_PDP_CONTEXT_ACTIVATED,
+ REJECT_CAUSE_RETRY_UPON_ENTRY_INTO_A_NEW_CELL_MIN_VALUE,
+ REJECT_CAUSE_RETRY_UPON_ENTRY_INTO_A_NEW_CELL_MAX_VALUE,
+ REJECT_CAUSE_SEMANTICALLY_INCORRECT_MSG,
+ REJECT_CAUSE_INVALID_MANDATORY_INFO,
+ REJECT_CAUSE_MESSAGE_TYPE_NON_EXISTANT,
+ REJECT_CAUSE_MESSAGE_TYPE_NOT_COMP_PRT_ST,
+ REJECT_CAUSE_IE_NON_EXISTANT,
+ REJECT_CAUSE_MSG_NOT_COMPATIBLE_PROTOCOL_STATE,
+
+
+ // Connection Management establishment rejection cause
+ REJECT_CAUSE_REJ_UNSPECIFIED,
+
+ // AS reject causes
+ REJECT_CAUSE_AS_REJ_RR_REL_IND,
+ REJECT_CAUSE_AS_REJ_RR_RANDOM_ACCESS_FAILURE,
+ REJECT_CAUSE_AS_REJ_RRC_REL_IND,
+ REJECT_CAUSE_AS_REJ_RRC_CLOSE_SESSION_IND,
+ REJECT_CAUSE_AS_REJ_RRC_OPEN_SESSION_FAILURE,
+ REJECT_CAUSE_AS_REJ_LOW_LEVEL_FAIL,
+ REJECT_CAUSE_AS_REJ_LOW_LEVEL_FAIL_REDIAL_NOT_ALLOWED,
+ REJECT_CAUSE_AS_REJ_LOW_LEVEL_IMMED_RETRY,
+
+ // MM reject causes
+ REJECT_CAUSE_MM_REJ_INVALID_SIM,
+ REJECT_CAUSE_MM_REJ_NO_SERVICE,
+ REJECT_CAUSE_MM_REJ_TIMER_T3230_EXP,
+ REJECT_CAUSE_MM_REJ_NO_CELL_AVAILABLE,
+ REJECT_CAUSE_MM_REJ_WRONG_STATE,
+ REJECT_CAUSE_MM_REJ_ACCESS_CLASS_BLOCKED,
+ // Definitions for release ind causes between MM and CNM
+ REJECT_CAUSE_ABORT_MSG_RECEIVED,
+ REJECT_CAUSE_OTHER_CAUSE,
+
+ // CNM reject causes
+ REJECT_CAUSE_CNM_REJ_TIMER_T303_EXP,
+ REJECT_CAUSE_CNM_REJ_NO_RESOURCES,
+ REJECT_CAUSE_CNM_MM_REL_PENDING,
+ REJECT_CAUSE_CNM_INVALID_USER_DATA,
+ CALL_END_CAUSE_MAX = 255
+} call_end_cause_e_type;
+
+
+struct clcc_call_t {
+ struct call_CLCC_info {
+ int id;
+ enum tcore_call_direction direction;
+ enum tcore_call_status status;
+ enum tcore_call_type type;
+ int mpty;
+ int num_len;
+ int num_type;
+ }
+ info;
+ char number[90];
+};
+
+typedef struct {
+ int network_cause;
+ int tapi_cause;
+} call_end_cause_info;
+
+/**************************************************************************
+ * Local Function Prototypes
+ **************************************************************************/
+/************************* REQUESTS ***************************/
+static void _call_status_idle(TcorePlugin *p, CallObject *co);
+static void _call_status_active(TcorePlugin *p, CallObject *co);
+static void _call_status_dialing(TcorePlugin *p, CallObject *co);
+static void _call_status_alert(TcorePlugin *p, CallObject *co);
+static void _call_status_incoming(TcorePlugin *p, CallObject *co);
+static void _call_status_waiting(TcorePlugin *p, CallObject *co);
+static TReturn _call_list_get(CoreObject *o, gboolean *event_flag);
+static TReturn _set_dtmf_tone_duration(CoreObject *o, UserRequest *ur);
+
+/************************* CONFIRMATION ***************************/
+static void on_confirmation_call_message_send(TcorePending *p, gboolean result, void *user_data); // from Kernel
+static void on_confirmation_call_hold(TcorePending *p, int data_len, const void *data, void *user_data);
+static void on_confirmation_call_swap(TcorePending *p, int data_len, const void *data, void *user_data);
+static void on_confirmation_call_split(TcorePending *p, int data_len, const void *data, void *user_data);
+static void on_confirmation_call_hold_and_accept(TcorePending *p, int data_len, const void *data, void *user_data);
+
+static void _on_confirmation_call_release(TcorePending *p, int data_len, const void *data, void *user_data, int type);
+static void _on_confirmation_call(TcorePending *p, int data_len, const void *data, void *user_data, int type);
+static void _on_confirmation_dtmf_tone_duration(TcorePending *p, int data_len, const void *data, void *user_data);
+static void _on_confirmation_call_end_cause(TcorePending *p, int data_len, const void *data, void *user_data);
+
+/************************* RESPONSES ***************************/
+static void on_response_call_list_get(TcorePending *p, int data_len, const void *data, void *user_data);
+
+/************************* NOTIIFICATIONS ***************************/
+static void on_notification_call_waiting(CoreObject *o, const void *data, void *user_data);
+static void on_notification_call_incoming(CoreObject *o, const void *data, void *user_data);
+static void on_notification_call_status(CoreObject *o, const void *data, void *user_data);
+static gboolean on_notification_call_info(CoreObject *o, const void *data, void *user_data);
+static gboolean on_notification_call_clip_info(CoreObject *o, const void *data, void *user_data);
+
+
+/**************************************************************************
+ * Local Utility Function Prototypes
+ **************************************************************************/
+static gboolean _call_request_message(TcorePending *pending, CoreObject *o, UserRequest *ur, void *on_resp, void *user_data);
+static void _call_branch_by_status(TcorePlugin *p, CallObject *co, unsigned int status);
+static int _callFromCLCCLine(char *line, struct clcc_call_t *p_call);
+
+/**************************************************************************
+ * Local Function Definitions
+ **************************************************************************/
+
+const call_end_cause_info call_end_cause_table[] = // call end cause table to convert Netwotk cause to TAPI cause
+{
+ { 1, CC_CAUSE_UNASSIGNED_NUMBER}, { 3, CC_CAUSE_NO_ROUTE_TO_DEST},
+ { 6, CC_CAUSE_CHANNEL_UNACCEPTABLE}, { 8, CC_CAUSE_OPERATOR_DETERMINED_BARRING},
+ { 16, CC_CAUSE_NORMAL_CALL_CLEARING}, { 17, CC_CAUSE_USER_BUSY},
+ { 18, CC_CAUSE_NO_USER_RESPONDING}, { 19, CC_CAUSE_USER_ALERTING_NO_ANSWER},
+ { 21, CC_CAUSE_CALL_REJECTED}, { 22, CC_CAUSE_NUMBER_CHANGED},
+ { 26, CC_CAUSE_NON_SELECTED_USER_CLEARING}, { 27, CC_CAUSE_DESTINATION_OUT_OF_ORDER},
+ { 28, CC_CAUSE_INVALID_NUMBER_FORMAT}, { 29, CC_CAUSE_FACILITY_REJECTED},
+ { 30, CC_CAUSE_RESPONSE_TO_STATUS_ENQUIRY}, { 31, CC_CAUSE_NORMAL_UNSPECIFIED},
+ { 34, CC_CAUSE_NO_CIRCUIT_CHANNEL_AVAILABLE}, { 38, CC_CAUSE_NETWORK_OUT_OF_ORDER},
+ { 41, CC_CAUSE_TEMPORARY_FAILURE}, { 42, CC_CAUSE_SWITCHING_EQUIPMENT_CONGESTION},
+ { 43, CC_CAUSE_ACCESS_INFORMATION_DISCARDED}, { 44, CC_CAUSE_REQUESTED_CIRCUIT_CHANNEL_NOT_AVAILABLE},
+ { 47, CC_CAUSE_RESOURCES_UNAVAILABLE_UNSPECIFIED}, { 49, CC_CAUSE_QUALITY_OF_SERVICE_UNAVAILABLE},
+ { 50, CC_CAUSE_REQUESTED_FACILITY_NOT_SUBSCRIBED}, { 55, CC_CAUSE_INCOMING_CALL_BARRED_WITHIN_CUG},
+ { 57, CC_CAUSE_BEARER_CAPABILITY_NOT_AUTHORISED}, { 58, CC_CAUSE_BEARER_CAPABILITY_NOT_PRESENTLY_AVAILABLE},
+ { 63, CC_CAUSE_SERVICE_OR_OPTION_NOT_AVAILABLE}, { 65, CC_CAUSE_BEARER_SERVICE_NOT_IMPLEMENTED},
+ { 68, CC_CAUSE_ACM_GEQ_ACMMAX}, { 69, CC_CAUSE_REQUESTED_FACILITY_NOT_IMPLEMENTED},
+ { 70, CC_CAUSE_ONLY_RESTRICTED_DIGITAL_INFO_BC_AVAILABLE}, { 79, CC_CAUSE_SERVICE_OR_OPTION_NOT_IMPLEMENTED},
+ { 81, CC_CAUSE_INVALID_TRANSACTION_ID_VALUE}, { 87, CC_CAUSE_USER_NOT_MEMBER_OF_CUG},
+ { 88, CC_CAUSE_INCOMPATIBLE_DESTINATION}, { 91, CC_CAUSE_INVALID_TRANSIT_NETWORK_SELECTION},
+ { 95, CC_CAUSE_SEMANTICALLY_INCORRECT_MESSAGE}, { 96, CC_CAUSE_INVALID_MANDATORY_INFORMATION},
+ { 97, CC_CAUSE_MESSAGE_TYPE_NON_EXISTENT}, { 98, CC_CAUSE_MESSAGE_TYPE_NOT_COMPATIBLE_WITH_PROT_STATE},
+ { 99, CC_CAUSE_IE_NON_EXISTENT_OR_NOT_IMPLEMENTED}, { 100, CC_CAUSE_CONDITIONAL_IE_ERROR},
+ { 101, CC_CAUSE_MESSAGE_NOT_COMPATIBLE_WITH_PROTOCOL_STATE}, { 102, CC_CAUSE_RECOVERY_ON_TIMER_EXPIRY},
+ { 111, CC_CAUSE_PROTOCOL_ERROR_UNSPECIFIED}, {127, CC_CAUSE_INTERWORKING_UNSPECIFIED},
+};
+
+static enum tcore_call_cli_mode _get_clir_status(char *num)
+{
+ enum tcore_call_cli_mode clir = CALL_CLI_MODE_DEFAULT;
+ dbg("Entry");
+
+ if (!strncmp(num, "*31#", 4)) {
+ dbg("CLI mode restricted");
+ return TCORE_CALL_CLI_MODE_RESTRICT;
+ }
+
+ if (!strncmp(num, "#31#", 4)) {
+ dbg("CLI mode allowed");
+ return TCORE_CALL_CLI_MODE_PRESENT;
+ }
+
+ err("Exit");
+ return clir;
+}
+
+static enum tcore_call_status _call_status(unsigned int status)
+{
+ dbg("Entry");
+
+ switch (status) {
+ case 0:
+ return TCORE_CALL_STATUS_ACTIVE;
+
+ case 1:
+ return TCORE_CALL_STATUS_HELD;
+
+ case 2:
+ return TCORE_CALL_STATUS_DIALING;
+
+ case 3:
+ return TCORE_CALL_STATUS_ALERT;
+
+ case 4:
+ return TCORE_CALL_STATUS_INCOMING;
+
+ case 5:
+ return TCORE_CALL_STATUS_WAITING;
+
+ case 6: // DISCONNECTED state // FALL THROUGH
+ default:
+ return TCORE_CALL_STATUS_IDLE;
+ }
+}
+
+static gboolean _call_is_in_mpty(int mpty)
+{
+ dbg("Entry");
+
+ switch (mpty) {
+ case 0:
+ return FALSE;
+
+ case 1:
+ return TRUE;
+
+ default:
+ break;
+ }
+
+ return FALSE;
+}
+
+static enum tcore_call_type call_type(int type)
+{
+ dbg("Entry");
+
+ switch (type) {
+ case 0:
+ return TCORE_CALL_TYPE_VOICE;
+
+ case 1:
+ return TCORE_CALL_TYPE_VIDEO;
+
+ default:
+ break;
+ }
+
+ return TCORE_CALL_TYPE_VOICE;
+}
+
+static int _compare_call_end_cause(int networkcause)
+{
+ unsigned int count;
+ for (count = 0; count < sizeof(call_end_cause_table) / sizeof(call_end_cause_info); count++) {
+ if (call_end_cause_table[count].network_cause == networkcause)
+ return (call_end_cause_table[count].tapi_cause);
+ }
+ return CC_CAUSE_NORMAL_CALL_CLEARING;
+ dbg("Exit");
+}
+
+static gboolean on_notification_call_clip_info(CoreObject *o, const void *data, void *user_data)
+{
+ dbg("Entry");
+
+ // TODO
+
+ return TRUE;
+}
+
+static gboolean on_notification_call_info(CoreObject *o, const void *data, void *user_data)
+{
+ GSList *tokens = NULL;
+ GSList *lines = NULL;
+ const char *line = NULL;
+ char *stat;
+ int status;
+
+ dbg("Entry");
+
+ lines = (GSList *) data;
+ if (1 != g_slist_length(lines)) {
+ err("Unsolicited message, BUT multiple lines present");
+ goto OUT;
+ }
+
+ line = (char *) (lines->data);
+ tokens = tcore_at_tok_new(line);
+
+ stat = g_slist_nth_data(tokens, 1);
+ if (!stat) {
+ dbg("Stat is missing from %XCALLSTAT indiaction");
+ } else {
+ status = atoi(stat);
+
+ switch (status) {
+ case STATUS_INCOMING:
+ dbg("calling on_notification_call_incoming");
+ on_notification_call_incoming(o, line, user_data);
+ break;
+
+ case STATUS_WAITING:
+ dbg("calling on_notification_call_waiting");
+ on_notification_call_waiting(o, line, user_data);
+ break;
+
+ case STATUS_CONNECTED: /*igonre Connected state. */
+ dbg("Connected state");
+ break;
+
+ default:
+ dbg("calling on_notification_call_status");
+ on_notification_call_status(o, line, user_data);
+ break;
+ }
+ }
+
+ // Free tokens
+ tcore_at_tok_free(tokens);
+
+OUT:
+ dbg("Exit");
+ return TRUE;
+}
+
+static gboolean _call_request_message(TcorePending *pending,
+ CoreObject *o,
+ UserRequest *ur,
+ void *on_resp,
+ void *user_data)
+{
+ TcoreHal *hal = NULL;
+ TReturn ret;
+ dbg("Entry");
+
+ tcore_pending_set_priority(pending, TCORE_PENDING_PRIORITY_DEFAULT);
+
+ if (on_resp) {
+ tcore_pending_set_response_callback(pending, on_resp, user_data);
+ }
+ tcore_pending_set_send_callback(pending, on_confirmation_call_message_send, NULL);
+
+ if (ur) {
+ tcore_pending_link_user_request(pending, ur);
+ } else {
+ err("User Request is NULL, is this internal request??");
+ }
+
+ // HAL
+ hal = tcore_object_get_hal(o);
+ // Send request to HAL
+ ret = tcore_hal_send_request(hal, pending);
+ if (TCORE_RETURN_SUCCESS != ret) {
+ err("Request send failed");
+ return FALSE;
+ }
+
+ dbg("Exit");
+ return TRUE;
+}
+
+static void _call_status_idle(TcorePlugin *p, CallObject *co)
+{
+ CoreObject *core_obj = NULL;
+ char *cmd_str = NULL;
+ TcorePending *pending = NULL;
+ TcoreATRequest *req = NULL;
+ gboolean ret = FALSE;
+ UserRequest *ur;
+
+ dbg("Entry");
+ core_obj = tcore_plugin_ref_core_object(p, "call");
+ dbg("Call ID [%d], Call Status [%d]", tcore_call_object_get_id(co), tcore_call_object_get_status(co));
+
+ if (tcore_call_object_get_status(co) != TCORE_CALL_STATUS_IDLE) {
+ // get call end cause.
+ cmd_str = g_strdup_printf("%s", "AT+XCEER");
+ dbg("Request command string: %s", cmd_str);
+
+ // Create new Pending request
+ pending = tcore_pending_new(core_obj, 0);
+
+ // Create new AT-Command request
+ req = tcore_at_request_new(cmd_str, "+XCEER", TCORE_AT_SINGLELINE);
+ dbg("Command: %s, prefix(if any): %s, Command length: %d", req->cmd, req->prefix, strlen(req->cmd));
+ // Free command string
+ g_free(cmd_str);
+
+ // Set request data (AT command) to Pending request
+ tcore_pending_set_request_data(pending, 0, req);
+
+ ur = tcore_user_request_new(NULL, NULL);
+ // Send request
+ ret = _call_request_message(pending, core_obj, ur, _on_confirmation_call_end_cause, co);
+
+ if (!ret) {
+ err("Failed to send AT-Command request");
+ return;
+ }
+ } else {
+ err("Call object was not free");
+ tcore_call_object_free(core_obj, co);
+ }
+ dbg("Exit");
+ return;
+}
+
+static void _call_status_dialing(TcorePlugin *p, CallObject *co)
+{
+ struct tnoti_call_status_dialing data;
+ dbg("Entry");
+
+ if (tcore_call_object_get_status(co) != TCORE_CALL_STATUS_DIALING) {
+ data.type = tcore_call_object_get_type(co);
+ dbg("data.type : [%d]", data.type);
+
+ data.id = tcore_call_object_get_id(co);
+ dbg("data.id : [%d]", data.id);
+
+ // Set Status
+ tcore_call_object_set_status(co, TCORE_CALL_STATUS_DIALING);
+
+ // Send notification to TAPI
+ tcore_server_send_notification(tcore_plugin_ref_server(p),
+ tcore_plugin_ref_core_object(p, "call"),
+ TNOTI_CALL_STATUS_DIALING,
+ sizeof(struct tnoti_call_status_dialing),
+ (void *) &data);
+ }
+
+ dbg("Exit");
+ return;
+}
+
+static void _call_status_alert(TcorePlugin *p, CallObject *co)
+{
+ struct tnoti_call_status_alert data;
+ dbg("Entry");
+
+ // Alerting has just 1 data 'CALL ID'
+ if (tcore_call_object_get_status(co) != TCORE_CALL_STATUS_ALERT) {
+ data.type = tcore_call_object_get_type(co);
+ dbg("data.type : [%d]", data.type);
+
+ data.id = tcore_call_object_get_id(co);
+ dbg("data.id : [%d]", data.id);
+
+ // Set Status
+ tcore_call_object_set_status(co, TCORE_CALL_STATUS_ALERT);
+
+ // Send notification to TAPI
+ tcore_server_send_notification(tcore_plugin_ref_server(p),
+ tcore_plugin_ref_core_object(p, "call"),
+ TNOTI_CALL_STATUS_ALERT,
+ sizeof(struct tnoti_call_status_alert),
+ (void *) &data);
+ }
+
+ dbg("Exit");
+ return;
+}
+
+static void _call_status_active(TcorePlugin *p, CallObject *co)
+{
+ struct tnoti_call_status_active data;
+ dbg("Entry");
+
+ if (tcore_call_object_get_status(co) != TCORE_CALL_STATUS_ACTIVE) {
+ data.type = tcore_call_object_get_type(co);
+ dbg("data.type : [%d]", data.type);
+
+ data.id = tcore_call_object_get_id(co);
+ dbg("data.id : [%d]", data.id);
+
+ // Set Status
+ tcore_call_object_set_status(co, TCORE_CALL_STATUS_ACTIVE);
+
+ // Send notification to TAPI
+ tcore_server_send_notification(tcore_plugin_ref_server(p),
+ tcore_plugin_ref_core_object(p, "call"),
+ TNOTI_CALL_STATUS_ACTIVE,
+ sizeof(struct tnoti_call_status_active),
+ (void *) &data);
+ }
+
+ dbg("Exit");
+ return;
+}
+
+static void _call_status_held(TcorePlugin *p, CallObject *co)
+{
+ struct tnoti_call_status_held data;
+ dbg("Entry");
+
+ if (tcore_call_object_get_status(co) != TCORE_CALL_STATUS_HELD) {
+ data.type = tcore_call_object_get_type(co);
+ dbg("data.type : [%d]", data.type);
+
+ data.id = tcore_call_object_get_id(co);
+ dbg("data.id : [%d]", data.id);
+
+ // Set Status
+ tcore_call_object_set_status(co, TCORE_CALL_STATUS_HELD);
+
+ // Send notification to TAPI
+ tcore_server_send_notification(tcore_plugin_ref_server(p),
+ tcore_plugin_ref_core_object(p, "call"),
+ TNOTI_CALL_STATUS_HELD,
+ sizeof(struct tnoti_call_status_held),
+ (void *) &data);
+ }
+
+ dbg("Exit");
+ return;
+}
+
+static void _call_status_incoming(TcorePlugin *p, CallObject *co)
+{
+ struct tnoti_call_status_incoming data;
+ dbg("Entry");
+
+ if (tcore_call_object_get_status(co) != TCORE_CALL_STATUS_INCOMING) {
+ tcore_call_object_set_status(co, TCORE_CALL_STATUS_INCOMING);
+
+ data.type = tcore_call_object_get_type(co);
+ dbg("data.type : [%d]", data.type);
+
+ data.id = tcore_call_object_get_id(co);
+ dbg("data.id : [%d]", data.id);
+
+ data.cli.mode = tcore_call_object_get_cli_mode(co);
+ dbg("data.cli.mode : [%d]", data.cli.mode);
+
+ tcore_call_object_get_number(co, data.cli.number);
+ dbg("data.cli.number : [%s]", data.cli.number);
+
+ data.cna.mode = tcore_call_object_get_cna_mode(co);
+ dbg("data.cna.mode : [%d]", data.cna.mode);
+
+ tcore_call_object_get_name(co, data.cna.name);
+ dbg("data.cna.name : [%s]", data.cna.name);
+
+ data.forward = FALSE; // this is tmp code
+
+ data.active_line = tcore_call_object_get_active_line(co);
+ dbg("data.active_line : [%d]", data.active_line);
+
+ // Send notification to TAPI
+ tcore_server_send_notification(tcore_plugin_ref_server(p),
+ tcore_plugin_ref_core_object(p, "call"),
+ TNOTI_CALL_STATUS_INCOMING,
+ sizeof(struct tnoti_call_status_incoming),
+ (void *) &data);
+ }
+
+ dbg("Exit");
+ return;
+}
+
+static void _call_status_waiting(TcorePlugin *p, CallObject *co)
+{
+ dbg("Entry");
+ _call_status_incoming(p, co);
+
+ dbg("Exit");
+ return;
+}
+
+static void _call_branch_by_status(TcorePlugin *p, CallObject *co, unsigned int status)
+{
+ dbg("Entry");
+
+ dbg("Call Status is %d", status);
+ switch (status) {
+ case TCORE_CALL_STATUS_IDLE:
+ _call_status_idle(p, co);
+ break;
+
+ case TCORE_CALL_STATUS_ACTIVE:
+ _call_status_active(p, co);
+ break;
+
+ case TCORE_CALL_STATUS_HELD:
+ _call_status_held(p, co);
+ break;
+
+ case TCORE_CALL_STATUS_DIALING:
+ _call_status_dialing(p, co);
+ break;
+
+ case TCORE_CALL_STATUS_ALERT:
+ _call_status_alert(p, co);
+ break;
+
+ case TCORE_CALL_STATUS_INCOMING:
+ _call_status_incoming(p, co);
+ break;
+
+ case TCORE_CALL_STATUS_WAITING:
+ _call_status_waiting(p, co);
+ break;
+ }
+
+ dbg("Exit");
+ return;
+}
+
+static TReturn _call_list_get(CoreObject *o, gboolean *event_flag)
+{
+ UserRequest *ur = NULL;
+ TcorePending *pending = NULL;
+ char *cmd_str = NULL;
+ TcoreATRequest *req = NULL;
+ gboolean ret = FALSE;
+
+ dbg("Entry");
+ if (!o) {
+ err("Core Object is NULL");
+ return TCORE_RETURN_FAILURE;
+ }
+
+ // Create new User Request
+ ur = tcore_user_request_new(NULL, NULL);
+
+ // Command string
+ cmd_str = g_strdup("AT+CLCC");
+
+ // Create new Pending Request
+ pending = tcore_pending_new(o, 0);
+ req = tcore_at_request_new(cmd_str, "+CLCC", TCORE_AT_MULTILINE);
+
+ g_free(cmd_str);
+
+ dbg("cmd : %s, prefix(if any) :%s, cmd_len : %d", req->cmd, req->prefix, strlen(req->cmd));
+
+ tcore_pending_set_request_data(pending, 0, req);
+
+ ret = _call_request_message(pending, o, ur, on_response_call_list_get, event_flag);
+ if (!ret) {
+ err("AT request (%s) sending failed", req->cmd);
+ return TCORE_RETURN_FAILURE;
+ }
+
+ dbg("AT request sent success");
+ return TCORE_RETURN_SUCCESS;
+}
+
+// CONFIRMATION
+static void on_confirmation_call_message_send(TcorePending *p, gboolean result, void *user_data)
+{
+ dbg("Entry");
+
+ if (result == FALSE) { // Fail
+ dbg("SEND FAIL");
+ } else {
+ dbg("SEND OK");
+ }
+
+ dbg("Exit");
+ return;
+}
+
+static void on_confirmation_call_outgoing(TcorePending *p, int data_len, const void *data, void *user_data)
+{
+ UserRequest *ur = NULL;
+ GSList *tokens = NULL;
+ const char *line = NULL;
+ const TcoreATResponse *response = data;
+ struct tresp_call_dial resp;
+ int error;
+ dbg("Entry");
+
+ ur = tcore_pending_ref_user_request(p);
+ if (ur) {
+ if (response->success > 0) {
+ dbg("RESPONSE OK");
+ resp.err = TCORE_RETURN_SUCCESS;
+ } else {
+ dbg("RESPONSE NOT OK");
+
+ line = (const char *) response->final_response;
+ tokens = tcore_at_tok_new(line);
+
+ if (g_slist_length(tokens) < 1) {
+ err("Unspecified error cause OR string corrupted");
+ resp.err = TCORE_RETURN_3GPP_ERROR;
+ } else {
+ error = atoi(g_slist_nth_data(tokens, 0));
+
+ // TODO: CMEE error mapping is required.
+ resp.err = TCORE_RETURN_3GPP_ERROR;
+ }
+
+ // Free tokens
+ tcore_at_tok_free(tokens);
+ }
+
+ // Send Response to TAPI
+ tcore_user_request_send_response(ur, TRESP_CALL_DIAL, sizeof(struct tresp_call_dial), &resp);
+ } else {
+ err("User Request is NULL");
+ }
+
+ dbg("Exit")
+ return;
+}
+
+static void on_confirmation_call_accept(TcorePending *p, int data_len, const void *data, void *user_data)
+{
+ UserRequest *ur = NULL;
+ GSList *tokens = NULL;
+ const char *line = NULL;
+ const TcoreATResponse *response = data;
+ struct tresp_call_answer resp;
+ int error;
+ dbg("Entry");
+
+ ur = tcore_pending_ref_user_request(p);
+ if (ur) {
+ if (response->success > 0) {
+ dbg("RESPONSE OK");
+ resp.err = TCORE_RETURN_SUCCESS;
+ } else {
+ dbg("RESPONSE NOT OK");
+
+ line = (const char *) response->final_response;
+ tokens = tcore_at_tok_new(line);
+
+ if (g_slist_length(tokens) < 1) {
+ err("Unspecified error cause OR string corrupted");
+ resp.err = TCORE_RETURN_3GPP_ERROR;
+ } else {
+ error = atoi(g_slist_nth_data(tokens, 0));
+
+ // TODO: CMEE error mapping is required.
+ resp.err = TCORE_RETURN_3GPP_ERROR;
+ }
+
+ // Free tokens
+ tcore_at_tok_free(tokens);
+ }
+
+ resp.id = tcore_call_object_get_id((CallObject *) user_data);
+
+ // Send Response to TAPI
+ tcore_user_request_send_response(ur, TRESP_CALL_ANSWER, sizeof(struct tresp_call_answer), &resp);
+ } else {
+ err("User Request is NULL");
+ }
+
+ dbg("Exit");
+ return;
+}
+
+
+static void on_confirmation_call_reject(TcorePending *p, int data_len, const void *data, void *user_data)
+{
+ UserRequest *ur = NULL;
+ GSList *tokens = NULL;
+ const char *line = NULL;
+ const TcoreATResponse *response = data;
+ struct tresp_call_answer resp;
+ int error;
+
+ dbg("Entry");
+
+ ur = tcore_pending_ref_user_request(p);
+ if (ur) {
+ if (response->success > 0) {
+ dbg("RESPONSE OK");
+ resp.err = TCORE_RETURN_SUCCESS;
+ } else {
+ dbg("RESPONSE NOT OK");
+ line = (const char *) response->final_response;
+ tokens = tcore_at_tok_new(line);
+
+ if (g_slist_length(tokens) < 1) {
+ err("Unspecified error cause OR string corrupted");
+ resp.err = TCORE_RETURN_3GPP_ERROR;
+ } else {
+ error = atoi(g_slist_nth_data(tokens, 0));
+ // TODO: CMEE error mapping is required.
+ resp.err = TCORE_RETURN_3GPP_ERROR;
+ }
+
+ // Free tokens
+ tcore_at_tok_free(tokens);
+ }
+
+ resp.id = tcore_call_object_get_id((CallObject *) user_data);
+
+ // Send Response to TAPI
+ tcore_user_request_send_response(ur, TRESP_CALL_ANSWER, sizeof(struct tresp_call_answer), &resp);
+ } else {
+ err("User Request is NULL");
+ }
+
+ dbg("Exit");
+ return;
+}
+
+static void on_confirmation_call_replace(TcorePending *p, int data_len, const void *data, void *user_data)
+{
+ UserRequest *ur = NULL;
+ GSList *tokens = NULL;
+ const char *line = NULL;
+ const TcoreATResponse *response = data;
+ struct tresp_call_answer resp;
+ int error;
+
+ dbg("Entry");
+ ur = tcore_pending_ref_user_request(p);
+ if (ur) {
+ if (response->success > 0) {
+ dbg("RESPONSE OK");
+ resp.err = TCORE_RETURN_SUCCESS;
+ } else {
+ dbg("RESPONSE NOT OK");
+ line = (const char *) response->final_response;
+ tokens = tcore_at_tok_new(line);
+
+ if (g_slist_length(tokens) < 1) {
+ err("Unspecified error cause OR string corrupted");
+ resp.err = TCORE_RETURN_3GPP_ERROR;
+ } else {
+ error = atoi(g_slist_nth_data(tokens, 0));
+ // TODO: CMEE error mapping is required.
+ resp.err = TCORE_RETURN_3GPP_ERROR;
+ }
+
+ // Free tokens
+ tcore_at_tok_free(tokens);
+ }
+ resp.id = tcore_call_object_get_id((CallObject *) user_data);
+
+ // Send Response to TAPI
+ tcore_user_request_send_response(ur, TRESP_CALL_ANSWER, sizeof(struct tresp_call_answer), &resp);
+ } else {
+ dbg("User Request is NULL");
+ }
+
+ dbg("Exit");
+ return;
+}
+
+static void on_confirmation_call_hold_and_accept(TcorePending *p, int data_len, const void *data, void *user_data)
+{
+ CoreObject *o = NULL;
+ UserRequest *ur = NULL;
+ GSList *tokens = NULL;
+ const char *line = NULL;
+ const TcoreATResponse *response = data;
+ struct tresp_call_answer resp;
+ int error;
+
+ dbg("Entry");
+
+ o = tcore_pending_ref_core_object(p);
+ ur = tcore_pending_ref_user_request(p);
+ resp.id = tcore_call_object_get_id((CallObject *) user_data);
+
+ if (ur) {
+ if (response->success > 0) {
+ dbg("RESPONSE OK");
+ resp.err = TCORE_RETURN_SUCCESS;
+ } else {
+ err("RESPONSE NOT OK");
+ line = (const char *) response->final_response;
+ tokens = tcore_at_tok_new(line);
+
+ if (g_slist_length(tokens) < 1) {
+ err("Unspecified error cause OR string corrupted");
+ resp.err = TCORE_RETURN_3GPP_ERROR;
+ } else {
+ error = atoi(g_slist_nth_data(tokens, 0));
+
+ // TODO: CMEE error mapping is required.
+ resp.err = TCORE_RETURN_3GPP_ERROR;
+ }
+
+ // Free tokens
+ tcore_at_tok_free(tokens);
+ }
+
+ // Send response to TAPI
+ tcore_user_request_send_response(ur, TRESP_CALL_ANSWER, sizeof(struct tresp_call_answer), &resp);
+ if (!resp.err) {
+ GSList *list = 0;
+ CallObject *co = NULL;
+
+ // Active Call
+ list = tcore_call_object_find_by_status(o, TCORE_CALL_STATUS_ACTIVE);
+ if (!list) {
+ err("Can't find active Call");
+ return;
+ }
+
+ co = (CallObject *) list->data;
+ if (!co) {
+ err("Can't get active Call object");
+ return;
+ }
+
+ // Set Call Status
+ tcore_call_object_set_status(co, TCORE_CALL_STATUS_HELD);
+ dbg("Call status is set to HELD");
+ }
+ } else {
+ err("User Request is NULL");
+ }
+
+ dbg("Exit");
+ return;
+}
+
+static void _on_confirmation_call_release(TcorePending *p, int data_len, const void *data, void *user_data, int type)
+{
+ UserRequest *ur = NULL;
+ struct tresp_call_end resp;
+ GSList *tokens = NULL;
+ const char *line = NULL;
+ int error;
+ const TcoreATResponse *response = data;
+
+ dbg("Entry");
+ ur = tcore_pending_ref_user_request(p);
+ if (ur) {
+ if (response->success > 0) {
+ dbg("RESPONSE OK");
+ resp.err = TCORE_RETURN_SUCCESS;
+ } else {
+ err("RESPONSE NOT OK");
+
+ line = (const char *) response->final_response;
+ tokens = tcore_at_tok_new(line);
+
+ if (g_slist_length(tokens) < 1) {
+ err("Unspecified error cause OR string corrupted");
+ resp.err = TCORE_RETURN_3GPP_ERROR;
+ } else {
+ error = atoi(g_slist_nth_data(tokens, 0));
+
+ // TODO: CMEE error mapping is required.
+ resp.err = TCORE_RETURN_3GPP_ERROR;
+ }
+ tcore_at_tok_free(tokens);
+ }
+
+ resp.type = type;
+ resp.id = tcore_call_object_get_id((CallObject *) user_data);
+ dbg("resp.type = %d resp.id= %d", resp.type, resp.id);
+
+ // Send reponse to TAPI
+ tcore_user_request_send_response(ur, TRESP_CALL_END, sizeof(struct tresp_call_end), &resp);
+ } else {
+ err("User Request is NULL");
+ }
+
+ dbg("Exit");
+ return;
+}
+
+// RESPONSE
+static void on_confirmation_call_endall(TcorePending *p, int data_len, const void *data, void *user_data)
+{
+ // skip response handling - actual result will be handled in on_confirmation_call_release_all
+ const TcoreATResponse *response = data;
+ dbg("Entry");
+
+ if (response->success > 0) {
+ dbg("RESPONSE OK");
+ } else {
+ err("RESPONSE NOT OK");
+ }
+
+ dbg("Exit");
+ return;
+}
+
+
+static void on_confirmation_call_release_all(TcorePending *p, int data_len, const void *data, void *user_data)
+{
+ dbg("Entry");
+ _on_confirmation_call_release(p, data_len, data, user_data, CALL_END_TYPE_ALL);
+
+ return;
+}
+
+
+static void on_confirmation_call_release_specific(TcorePending *p, int data_len, const void *data, void *user_data)
+{
+ dbg("Entry");
+ _on_confirmation_call_release(p, data_len, data, user_data, CALL_END_TYPE_DEFAULT);
+
+ return;
+}
+
+static void on_confirmation_call_release_all_active(TcorePending *p, int data_len, const void *data, void *user_data)
+{
+ dbg("Entry");
+ _on_confirmation_call_release(p, data_len, data, user_data, CALL_END_TYPE_ACTIVE_ALL);
+
+ return;
+}
+
+static void on_confirmation_call_release_all_held(TcorePending *p, int data_len, const void *data, void *user_data)
+{
+ dbg("Entry");
+ _on_confirmation_call_release(p, data_len, data, user_data, CALL_END_TYPE_HOLD_ALL);
+
+ return;
+}
+
+static void _on_confirmation_call(TcorePending *p, int data_len, const void *data, void *user_data, int type)
+{
+ UserRequest *ur = NULL;
+ GSList *tokens = NULL;
+ const char *line = NULL;
+ const TcoreATResponse *response = NULL;
+ int error;
+
+ dbg("Entry");
+ ur = tcore_pending_ref_user_request(p);
+ response = (TcoreATResponse *) data;
+ if (response->success > 0) {
+ dbg("RESPONSE OK");
+ error = TCORE_RETURN_SUCCESS;
+ } else {
+ err("RESPONSE NOT OK");
+
+ line = (const char *) response->final_response;
+ tokens = tcore_at_tok_new(line);
+
+ if (g_slist_length(tokens) < 1) {
+ err("Unspecified error cause OR string corrupted");
+ error = TCORE_RETURN_3GPP_ERROR;
+ } else {
+ error = atoi(g_slist_nth_data(tokens, 0));
+
+ // TODO: CMEE error mapping is required.
+ error = TCORE_RETURN_3GPP_ERROR;
+ }
+
+ // Free tokens
+ tcore_at_tok_free(tokens);
+ }
+
+ dbg("Response Call type -%d", type);
+ switch (type) {
+ case TRESP_CALL_HOLD:
+ {
+ struct tresp_call_hold resp;
+
+ resp.err = error;
+ resp.id = tcore_call_object_get_id((CallObject *) user_data);
+ dbg("call hold response");
+ // Send reponse to TAPI
+ tcore_user_request_send_response(ur, TRESP_CALL_HOLD, sizeof(struct tresp_call_hold), &resp);
+ }
+ break;
+
+ case TRESP_CALL_ACTIVE:
+ {
+ struct tresp_call_active resp;
+
+ resp.err = error;
+ resp.id = tcore_call_object_get_id((CallObject *) user_data);
+ dbg("call active response");
+ // Send reponse to TAPI
+ tcore_user_request_send_response(ur, TRESP_CALL_ACTIVE, sizeof(struct tresp_call_active), &resp);
+ }
+ break;
+
+ case TRESP_CALL_JOIN:
+ {
+ struct tresp_call_join resp;
+
+ resp.err = error;
+ resp.id = tcore_call_object_get_id((CallObject *) user_data);
+ dbg("call join response");
+
+ // Send reponse to TAPI
+ tcore_user_request_send_response(ur, TRESP_CALL_JOIN, sizeof(struct tresp_call_join), &resp);
+ }
+ break;
+
+ case TRESP_CALL_SPLIT:
+ {
+ struct tresp_call_split resp;
+
+ resp.err = error;
+ resp.id = tcore_call_object_get_id((CallObject *) user_data);
+ dbg("call split response");
+ // Send reponse to TAPI
+ tcore_user_request_send_response(ur, TRESP_CALL_SPLIT, sizeof(struct tresp_call_split), &resp);
+ }
+ break;
+
+ case TRESP_CALL_DEFLECT:
+ {
+ struct tresp_call_deflect resp;
+
+ resp.err = error;
+ resp.id = tcore_call_object_get_id((CallObject *) user_data);
+ dbg("call deflect response");
+ // Send reponse to TAPI
+ tcore_user_request_send_response(ur, TRESP_CALL_DEFLECT, sizeof(struct tresp_call_deflect), &resp);
+ }
+
+ break;
+
+ case TRESP_CALL_TRANSFER:
+ {
+ struct tresp_call_transfer resp;
+
+ resp.err = error;
+ resp.id = tcore_call_object_get_id((CallObject *) user_data);
+ dbg("call transfer response");
+ // Send reponse to TAPI
+ tcore_user_request_send_response(ur, TRESP_CALL_TRANSFER, sizeof(struct tresp_call_transfer), &resp);
+ }
+ break;
+
+ case TRESP_CALL_SEND_DTMF:
+ {
+ struct tresp_call_dtmf resp;
+
+ resp.err = error;
+ dbg("call dtmf response");
+ // Send reponse to TAPI
+ tcore_user_request_send_response(ur, TRESP_CALL_SEND_DTMF, sizeof(struct tresp_call_dtmf), &resp);
+ }
+ break;
+
+ default:
+ {
+ dbg("type not supported");
+ return;
+ }
+ }
+
+ if ((type == TRESP_CALL_HOLD) || (type == TRESP_CALL_ACTIVE) || (type == TRESP_CALL_JOIN)
+ || (type == TRESP_CALL_SPLIT)) {
+ if (!error) {
+ CoreObject *core_obj = NULL;
+ gboolean *eflag = g_new0(gboolean, 1);
+
+ core_obj = tcore_pending_ref_core_object(p);
+ *eflag = FALSE;
+
+ dbg("Calling _call_list_get");
+ _call_list_get(core_obj, eflag);
+ }
+ }
+
+ dbg("Exit");
+ return;
+}
+
+static void on_confirmation_call_hold(TcorePending *p, int data_len, const void *data, void *user_data)
+{
+ dbg("Entry");
+ _on_confirmation_call(p, data_len, data, user_data, TRESP_CALL_HOLD);
+
+ return;
+}
+
+static void on_confirmation_call_active(TcorePending *p, int data_len, const void *data, void *user_data)
+{
+ dbg("Entry");
+ _on_confirmation_call(p, data_len, data, user_data, TRESP_CALL_ACTIVE);
+
+ return;
+}
+
+static void on_confirmation_call_join(TcorePending *p, int data_len, const void *data, void *user_data)
+{
+ dbg("Entry");
+ _on_confirmation_call(p, data_len, data, user_data, TRESP_CALL_JOIN);
+
+ return;
+}
+
+static void on_confirmation_call_split(TcorePending *p, int data_len, const void *data, void *user_data)
+{
+ dbg("Entry");
+ _on_confirmation_call(p, data_len, data, user_data, TRESP_CALL_SPLIT);
+
+ return;
+}
+
+static void on_confirmation_call_deflect(TcorePending *p, int data_len, const void *data, void *user_data)
+{
+ dbg("Entry");
+ _on_confirmation_call(p, data_len, data, user_data, TRESP_CALL_DEFLECT);
+
+ return;
+}
+
+static void on_confirmation_call_transfer(TcorePending *p, int data_len, const void *data, void *user_data)
+{
+ dbg("Entry");
+ _on_confirmation_call(p, data_len, data, user_data, TRESP_CALL_TRANSFER);
+
+ return;
+}
+
+static void on_confirmation_call_dtmf(TcorePending *p, int data_len, const void *data, void *user_data)
+{
+ dbg("Entry");
+ _on_confirmation_call(p, data_len, data, user_data, TRESP_CALL_SEND_DTMF);
+
+ return;
+}
+
+static void _on_confirmation_dtmf_tone_duration(TcorePending *p, int data_len, const void *data, void *user_data)
+{
+ GSList *tokens = NULL;
+ const char *line = NULL;
+ const TcoreATResponse *response = data;
+ int error;
+
+ dbg("Entry");
+
+ if (response->success > 0) {
+ dbg("RESPONSE OK");
+ error = TCORE_RETURN_SUCCESS;
+ } else {
+ err("RESPONSE NOT OK");
+ line = (const char *) response->final_response;
+ tokens = tcore_at_tok_new(line);
+ if (g_slist_length(tokens) < 1) {
+ err("err cause not specified or string corrupted");
+ error = TCORE_RETURN_3GPP_ERROR;
+ } else {
+ error = atoi(g_slist_nth_data(tokens, 0));
+ // TODO: CMEE error mapping is required.
+ }
+
+ // Free tokens
+ tcore_at_tok_free(tokens);
+ }
+
+ dbg("Set dtmf tone duration response - %d", error);
+ return;
+}
+
+static void on_confirmation_call_swap(TcorePending *p, int data_len, const void *data, void *user_data)
+{
+ CoreObject *core_obj = NULL;
+ UserRequest *ur = NULL;
+ const TcoreATResponse *response = data;
+ struct tresp_call_swap resp;
+ GSList *tokens = NULL;
+ const char *line = NULL;
+
+ dbg("Entry");
+ core_obj = tcore_pending_ref_core_object(p);
+ ur = tcore_pending_ref_user_request(p);
+
+ if (ur) {
+ if (response->success > 0) {
+ dbg("RESPONSE OK");
+ resp.err = TCORE_RETURN_SUCCESS;
+ } else {
+ err("RESPONSE NOT OK");
+ line = (const char *) response->final_response;
+ tokens = tcore_at_tok_new(line);
+ if (g_slist_length(tokens) < 1) {
+ err("err cause not specified or string corrupted");
+ resp.err = TCORE_RETURN_3GPP_ERROR;
+ } else {
+ resp.err = atoi(g_slist_nth_data(tokens, 0));
+
+ // TODO: CMEE error mapping is required.
+ resp.err = TCORE_RETURN_3GPP_ERROR;
+ }
+
+ // Free tokens
+ tcore_at_tok_free(tokens);
+ }
+
+ resp.id = tcore_call_object_get_id((CallObject *) user_data);
+ dbg("resp.id = %d", resp.id);
+
+ // Send response to TAPI
+ tcore_user_request_send_response(ur, TRESP_CALL_SWAP, sizeof(struct tresp_call_swap), &resp);
+
+ if (!resp.err) {
+ GSList *active = NULL;
+ GSList *held = NULL;
+ CallObject *co = NULL;
+ gboolean *eflag = NULL;
+
+ held = tcore_call_object_find_by_status(core_obj, TCORE_CALL_STATUS_HELD);
+ if (!held) {
+ err("Can't find held Call");
+ return;
+ }
+
+ active = tcore_call_object_find_by_status(core_obj, TCORE_CALL_STATUS_ACTIVE);
+ if (!active) {
+ dbg("Can't find active Call");
+ return;
+ }
+
+ while (held) {
+ co = (CallObject *) held->data;
+ if (!co) {
+ err("Can't get held Call object");
+ return;
+ }
+
+ resp.id = tcore_call_object_get_id(co);
+
+ // Send response to TAPI
+ tcore_user_request_send_response(ur, TRESP_CALL_ACTIVE, sizeof(struct tresp_call_active), &resp);
+
+ held = g_slist_next(held);
+ }
+
+ while (active) {
+ co = (CallObject *) active->data;
+ if (!co) {
+ err("[ error ] can't get active call object");
+ return;
+ }
+
+ resp.id = tcore_call_object_get_id(co);
+
+ // Send response to TAPI
+ tcore_user_request_send_response(ur, TRESP_CALL_HOLD, sizeof(struct tresp_call_hold), &resp);
+ active = g_slist_next(active);
+ }
+
+ eflag = g_new0(gboolean, 1);
+ *eflag = FALSE;
+
+ dbg("calling _call_list_get");
+ _call_list_get(core_obj, eflag);
+ }
+ } else {
+ err("User Request is NULL");
+ }
+
+ dbg("Exit");
+ return;
+}
+
+static void on_confirmation_call_set_source_sound_path(TcorePending *p, int data_len, const void *data, void *user_data)
+{
+ UserRequest *ur = NULL;
+ GSList *tokens = NULL;
+ const char *line = NULL;
+ const TcoreATResponse *response = data;
+ char *resp_str = NULL;
+ struct tresp_call_sound_set_path resp;
+ int error;
+
+ dbg("Entry");
+ ur = tcore_pending_ref_user_request(p);
+
+ // +XDRV: <group_id>,<function_id>,<xdrv_result>[,<response_n>]\ 3
+ if (!response) {
+ err("Input data is NULL");
+ return;
+ }
+
+ if (response->success > 0) {
+ dbg("RESPONSE OK");
+
+ line = (const char *) (((GSList *) response->lines)->data);
+ tokens = tcore_at_tok_new(line);
+
+ resp_str = g_slist_nth_data(tokens, 0);
+ if (!g_slist_nth_data(tokens, 0)) {
+ err("group_id is missing");
+ resp.err = TCORE_RETURN_3GPP_ERROR;
+ goto OUT;
+ }
+
+ if (!g_slist_nth_data(tokens, 1)) {
+ err(" function_id is missing");
+ resp.err = TCORE_RETURN_3GPP_ERROR;
+ goto OUT;
+ }
+
+ resp_str = g_slist_nth_data(tokens, 2);
+
+ if (resp_str) {
+ error = atoi(resp_str);
+ if (0 == error) {
+ dbg("Response is Success");
+ resp.err = TCORE_RETURN_SUCCESS;
+ } else {
+ resp.err = TCORE_RETURN_3GPP_ERROR;
+ }
+ }
+OUT:
+ // Free tokens
+ tcore_at_tok_free(tokens);
+ } else {
+ dbg("RESPONSE NOT OK");
+
+ line = (const char *) response->final_response;
+ tokens = tcore_at_tok_new(line);
+
+ if (g_slist_length(tokens) < 1) {
+ err("err cause not specified or string corrupted");
+ resp.err = TCORE_RETURN_3GPP_ERROR;
+ } else {
+ error = atoi(g_slist_nth_data(tokens, 0));
+
+ // TODO: CMEE error mapping is required.
+ resp.err = TCORE_RETURN_3GPP_ERROR;
+ }
+
+ // Free tokens
+ tcore_at_tok_free(tokens);
+ }
+
+ if (ur) {
+ if (resp.err != TCORE_RETURN_SUCCESS) { // Send only failed notification . success notification send when destination device is set.
+ // Send notification to TAPI
+ tcore_user_request_send_response(ur, TRESP_CALL_SET_SOUND_PATH, sizeof(struct tresp_call_sound_set_path), &resp);
+ setsoundpath = TRUE;
+ }
+ } else {
+ err("User Request is NULL");
+ }
+
+ dbg("Exit");
+ return;
+}
+
+static void on_confirmation_call_set_destination_sound_path(TcorePending *p, int data_len, const void *data, void *user_data)
+{
+ UserRequest *ur = NULL;
+ GSList *tokens = NULL;
+ const char *line = NULL;
+ char *resp_str = NULL;
+ struct tresp_call_sound_set_path resp;
+ const TcoreATResponse *response = data;
+ int error;
+
+ dbg("Entry");
+
+ ur = tcore_pending_ref_user_request(p);
+ // +XDRV: <group_id>,<function_id>,<xdrv_result>[,<response_n>]\ 3
+
+ if (!response) {
+ err("Input data is NULL");
+ return;
+ }
+
+ if (ur) {
+ if (response->success > 0) {
+ dbg("RESPONSE OK");
+
+ line = (const char *) (((GSList *) response->lines)->data);
+ tokens = tcore_at_tok_new(line);
+
+ resp_str = g_slist_nth_data(tokens, 0);
+ if (!g_slist_nth_data(tokens, 0)) {
+ dbg("group_id is missing");
+ resp.err = TCORE_RETURN_3GPP_ERROR;
+ goto OUT;
+ }
+
+ if (!g_slist_nth_data(tokens, 1)) {
+ dbg("function_id is missing");
+ resp.err = TCORE_RETURN_3GPP_ERROR;
+ goto OUT;
+ }
+
+ resp_str = g_slist_nth_data(tokens, 2);
+ if (resp_str) {
+ error = atoi(resp_str);
+ if (0 == error) {
+ dbg("Response is Success");
+ resp.err = TCORE_RETURN_SUCCESS;
+ } else {
+ resp.err = TCORE_RETURN_3GPP_ERROR;
+ }
+ }
+
+OUT:
+ // Free tokens
+ tcore_at_tok_free(tokens);
+ } else {
+ dbg("RESPONSE NOT OK");
+
+ line = (const char *) response->final_response;
+ tokens = tcore_at_tok_new(line);
+
+ if (g_slist_length(tokens) < 1) {
+ err("err cause not specified or string corrupted");
+ resp.err = TCORE_RETURN_3GPP_ERROR;
+ } else {
+ error = atoi(g_slist_nth_data(tokens, 0));
+ // TODO: CMEE error mapping is required.
+ resp.err = TCORE_RETURN_3GPP_ERROR;
+ }
+
+ // Free tokens
+ tcore_at_tok_free(tokens);
+ }
+
+ if (setsoundpath == TRUE) {
+ setsoundpath = FALSE;
+ } else {
+ // Send response to TAPI
+ tcore_user_request_send_response(ur, TRESP_CALL_SET_SOUND_PATH, sizeof(struct tresp_call_sound_set_path), &resp);
+ }
+ } else {
+ dbg("User Request is NULL");
+ }
+
+ dbg("Exit");
+ return;
+}
+
+static void on_confirmation_call_set_source_sound_volume_level(TcorePending *p, int data_len, const void *data, void *user_data)
+{
+ UserRequest *ur = NULL;
+ GSList *tokens = NULL;
+ const char *line = NULL;
+ const TcoreATResponse *response = data;
+ char *resp_str = NULL;
+ struct tresp_call_sound_set_volume_level resp;
+ int error;
+
+ ur = tcore_pending_ref_user_request(p);
+ dbg("Entry");
+ // +XDRV: <group_id>,<function_id>,<xdrv_result>[,<response_n>]\ 3
+ if (!response) {
+ err("Input data is NULL");
+ return;
+ }
+
+ if (response->success > 0) {
+ dbg("RESPONSE OK");
+
+ line = (const char *) (((GSList *) response->lines)->data);
+ tokens = tcore_at_tok_new(line);
+
+ resp_str = g_slist_nth_data(tokens, 0);
+ if (!g_slist_nth_data(tokens, 0)) {
+ err("group_id is missing");
+ resp.err = TCORE_RETURN_3GPP_ERROR;
+ goto OUT;
+ }
+
+ if (!g_slist_nth_data(tokens, 1)) {
+ err("function_id is missing");
+ resp.err = TCORE_RETURN_3GPP_ERROR;
+ goto OUT;
+ }
+
+ resp_str = g_slist_nth_data(tokens, 2);
+ if (resp_str) {
+ error = atoi(resp_str);
+
+ if (0 == error) {
+ dbg("Response is Success ");
+ resp.err = TCORE_RETURN_SUCCESS;
+ } else {
+ resp.err = TCORE_RETURN_3GPP_ERROR;
+ }
+ }
+
+OUT:
+ // Free tokens
+ tcore_at_tok_free(tokens);
+ } else {
+ dbg("RESPONSE NOT OK");
+
+ line = (const char *) response->final_response;
+ tokens = tcore_at_tok_new(line);
+
+ if (g_slist_length(tokens) < 1) {
+ err("err cause not specified or string corrupted");
+ resp.err = TCORE_RETURN_3GPP_ERROR;
+ } else {
+ error = atoi(g_slist_nth_data(tokens, 0));
+
+ // TODO: CMEE error mapping is required.
+ resp.err = TCORE_RETURN_3GPP_ERROR;
+ }
+
+ // Free tokens
+ tcore_at_tok_free(tokens);
+ }
+
+ if (ur) {
+ if (resp.err && soundvolume == FALSE) { // Send only failed notification . success notification send when destination device is set.
+ // Send reposne to TAPI
+ tcore_user_request_send_response(ur, TRESP_CALL_SET_SOUND_VOLUME_LEVEL, sizeof(struct tresp_call_sound_set_volume_level), &resp);
+ soundvolume = TRUE;
+ }
+ } else {
+ err("User Request is NULL");
+ }
+
+ dbg("Exit");
+ return;
+}
+
+
+static void on_confirmation_call_set_destination_sound_volume_level(TcorePending *p, int data_len, const void *data, void *user_data)
+{
+ UserRequest *ur = NULL;
+ GSList *tokens = NULL;
+ const char *line = NULL;
+ char *resp_str = NULL;
+ const TcoreATResponse *response = data;
+ struct tresp_call_sound_set_volume_level resp;
+ int error;
+
+ dbg("Entry");
+
+ ur = tcore_pending_ref_user_request(p);
+
+ // +XDRV: <group_id>,<function_id>,<xdrv_result>[,<response_n>]\ 3
+ if (!response) {
+ err("Input data is NULL");
+ return;
+ }
+
+ if (ur) {
+ if (response->success > 0) {
+ dbg("RESPONSE OK");
+ line = (const char *) (((GSList *) response->lines)->data);
+ tokens = tcore_at_tok_new(line);
+ resp_str = g_slist_nth_data(tokens, 0);
+
+ if (!g_slist_nth_data(tokens, 0)) {
+ err("group_id is missing");
+ resp.err = TCORE_RETURN_3GPP_ERROR;
+ goto OUT;
+ }
+
+ if (!g_slist_nth_data(tokens, 1)) {
+ err("function_id is missing");
+ resp.err = TCORE_RETURN_3GPP_ERROR;
+ goto OUT;
+ }
+
+ resp_str = g_slist_nth_data(tokens, 2);
+
+ if (resp_str) {
+ error = atoi(resp_str);
+
+ if (0 == error) {
+ dbg("Response is Success");
+ resp.err = TCORE_RETURN_SUCCESS;
+ } else {
+ resp.err = TCORE_RETURN_3GPP_ERROR;
+ }
+ }
+
+OUT:
+ // Free tokens
+ tcore_at_tok_free(tokens);
+ } else {
+ dbg("RESPONSE NOT OK");
+
+ line = (const char *) response->final_response;
+ tokens = tcore_at_tok_new(line);
+
+ if (g_slist_length(tokens) < 1) {
+ err("err cause not specified or string corrupted");
+ resp.err = TCORE_RETURN_3GPP_ERROR;
+ } else {
+ error = atoi(g_slist_nth_data(tokens, 0));
+
+ // TODO: CMEE error mapping is required.
+ resp.err = TCORE_RETURN_3GPP_ERROR;
+ }
+
+ tcore_at_tok_free(tokens);
+ }
+
+ if (soundvolume == TRUE) {
+ soundvolume = FALSE;
+ } else {
+ // Send reposne to TAPI
+ tcore_user_request_send_response(ur, TRESP_CALL_SET_SOUND_VOLUME_LEVEL, sizeof(struct tresp_call_sound_set_volume_level), &resp);
+ }
+ } else {
+ err("User Request is NULL");
+ }
+
+ dbg("Exit");
+ return;
+}
+
+
+static void on_confirmation_call_mute(TcorePending *p, int data_len, const void *data, void *user_data)
+{
+ UserRequest *ur = NULL;
+ GSList *tokens = NULL;
+ const char *line = NULL;
+ char *resp_str = NULL;
+ struct tresp_call_mute resp;
+ const TcoreATResponse *response = data;
+ int error;
+
+ dbg("Entry");
+
+ ur = tcore_pending_ref_user_request(p);
+
+ if (!response) {
+ err("Input data is NULL");
+ return;
+ }
+
+ if (response->success > 0) {
+ dbg("RESPONSE OK");
+
+ line = (const char *) (((GSList *) response->lines)->data);
+ tokens = tcore_at_tok_new(line);
+ resp_str = g_slist_nth_data(tokens, 0);
+
+ if (!g_slist_nth_data(tokens, 0)) {
+ err("group_id is missing");
+ resp.err = TCORE_RETURN_3GPP_ERROR;
+ goto OUT;
+ }
+
+ if (!g_slist_nth_data(tokens, 1)) {
+ err(" function_id is missing");
+ resp.err = TCORE_RETURN_3GPP_ERROR;
+ goto OUT;
+ }
+
+ resp_str = g_slist_nth_data(tokens, 2);
+
+ if (resp_str) {
+ error = atoi(resp_str);
+ if (0 == error) {
+ dbg("Response is Success");
+ resp.err = TCORE_RETURN_SUCCESS;
+ } else {
+ resp.err = TCORE_RETURN_3GPP_ERROR;
+ }
+ }
+OUT:
+ // Free tokens
+ tcore_at_tok_free(tokens);
+ } else {
+ dbg("RESPONSE NOT OK");
+
+ line = (const char *) response->final_response;
+ tokens = tcore_at_tok_new(line);
+
+ if (g_slist_length(tokens) < 1) {
+ err("err cause not specified or string corrupted");
+ resp.err = TCORE_RETURN_3GPP_ERROR;
+ } else {
+ error = atoi(g_slist_nth_data(tokens, 0));
+
+ // TODO: CMEE error mapping is required.
+ resp.err = TCORE_RETURN_3GPP_ERROR;
+ }
+
+ // Free tokens
+ tcore_at_tok_free(tokens);
+ }
+
+ if (ur) {
+ tcore_user_request_send_response(ur, TRESP_CALL_MUTE, sizeof(struct tresp_call_mute), &resp);
+ } else {
+ err("User Request is NULL");
+ }
+
+ dbg("Exit");
+ return;
+}
+
+static void on_confirmation_call_unmute(TcorePending *p, int data_len, const void *data, void *user_data)
+{
+ const TcoreATResponse *response = NULL;
+ struct tresp_call_unmute resp;
+ GSList *tokens = NULL;
+ const char *line = NULL;
+ UserRequest *ur = NULL;
+ char *resp_str = NULL;
+ int error;
+
+ dbg("Entry");
+
+ response = (TcoreATResponse *) data;
+ ur = tcore_pending_ref_user_request(p);
+
+ if (!response) {
+ err("Input data is NULL");
+ return;
+ }
+
+ if (response->success > 0) {
+ dbg("RESPONSE OK");
+
+ line = (const char *) (((GSList *) response->lines)->data);
+ tokens = tcore_at_tok_new(line);
+ resp_str = g_slist_nth_data(tokens, 0);
+
+ if (!g_slist_nth_data(tokens, 0)) {
+ err("group_id is missing");
+ resp.err = TCORE_RETURN_3GPP_ERROR;
+ goto OUT;
+ }
+
+ if (!g_slist_nth_data(tokens, 1)) {
+ err(" function_id is missing");
+ resp.err = TCORE_RETURN_3GPP_ERROR;
+ goto OUT;
+ }
+
+ resp_str = g_slist_nth_data(tokens, 2);
+
+ if (resp_str) {
+ error = atoi(resp_str);
+ if (0 == error) {
+ dbg("Response is Success");
+ resp.err = TCORE_RETURN_SUCCESS;
+ } else {
+ resp.err = TCORE_RETURN_3GPP_ERROR;
+ }
+ }
+OUT:
+ // Free tokens
+ tcore_at_tok_free(tokens);
+ } else {
+ dbg("RESPONSE NOT OK");
+
+ line = (const char *) response->final_response;
+ tokens = tcore_at_tok_new(line);
+
+ if (g_slist_length(tokens) < 1) {
+ err("err cause not specified or string corrupted");
+ resp.err = TCORE_RETURN_3GPP_ERROR;
+ } else {
+ error = atoi(g_slist_nth_data(tokens, 0));
+
+ // TODO: CMEE error mapping is required.
+ resp.err = TCORE_RETURN_3GPP_ERROR;
+ }
+
+ // Free tokens
+ tcore_at_tok_free(tokens);
+ }
+
+ if (ur) {
+ tcore_user_request_send_response(ur, TRESP_CALL_UNMUTE, sizeof(struct tresp_call_unmute), &resp);
+ } else {
+ err("User Request is NULL");
+ }
+
+ dbg("Exit");
+ return;
+}
+
+// RESPONSE
+static void on_response_call_list_get(TcorePending *p, int data_len, const void *data, void *user_data)
+{
+ TcorePlugin *plugin = NULL;
+ CoreObject *core_obj = NULL;
+ CallObject *co = NULL;
+ struct clcc_call_t *call_list = NULL;
+ gboolean *event_flag = (gboolean *) user_data;
+ const TcoreATResponse *response = data;
+ GSList *resp_data = NULL;
+ char *line = NULL;
+
+ int cllc_info = 0, countCalls = 0, countValidCalls = 0;
+ int error = 0;
+ dbg("Entry");
+
+ plugin = tcore_pending_ref_plugin(p);
+ core_obj = tcore_pending_ref_core_object(p);
+
+ if (response->success > 0) {
+ dbg("RESPONCE OK");
+ if (response->lines) {
+ resp_data = (GSList *) response->lines;
+ countCalls = g_slist_length(resp_data);
+ dbg("Total records : %d", countCalls);
+ }
+
+ if (0 == countCalls) {
+ err("Call count is zero");
+ return;
+ }
+
+ call_list = g_new0(struct clcc_call_t, countCalls);
+
+ for (countValidCalls = 0; resp_data != NULL; resp_data = resp_data->next, countValidCalls++, cllc_info++) {
+ line = (char *) (resp_data->data);
+
+ error = _callFromCLCCLine(line, call_list + countValidCalls);
+ if (0 != error) {
+ continue;
+ }
+
+ co = tcore_call_object_find_by_id(core_obj, call_list[cllc_info].info.id);
+ if (!co) {
+ co = tcore_call_object_new(core_obj, call_list[cllc_info].info.id);
+ if (!co) {
+ err("error : tcore_call_object_new [ id : %d ]", call_list[cllc_info].info.id);
+ continue;
+ }
+ }
+
+ // Call set parameters
+ tcore_call_object_set_type(co, call_type(call_list[cllc_info].info.type));
+ tcore_call_object_set_direction(co, call_list[cllc_info].info.direction);
+ tcore_call_object_set_multiparty_state(co, _call_is_in_mpty(call_list[cllc_info].info.mpty));
+ tcore_call_object_set_cli_info(co, CALL_CLI_MODE_DEFAULT, call_list[cllc_info].number);
+ tcore_call_object_set_active_line(co, 0);
+
+ if (*event_flag) {
+ dbg("Call status before calling _call_branch_by_status() : (%d)", call_list[cllc_info].info.status);
+ _call_branch_by_status(plugin, co, call_list[cllc_info].info.status);
+ } else {
+ // Set Status
+ tcore_call_object_set_status(co, call_list[cllc_info].info.status);
+
+ dbg("Call id : (%d)", call_list[cllc_info].info.id);
+ dbg("Call direction : (%d)", call_list[cllc_info].info.direction);
+ dbg("Call type : (%d)", call_list[cllc_info].info.type);
+ dbg("Call mpty : (%d)", call_list[cllc_info].info.mpty);
+ dbg("Call number : (%s)", call_list[cllc_info].number);
+ dbg("Call status : (%d)", call_list[cllc_info].info.status);
+ }
+ }
+
+ // Free Call list
+ g_free(call_list);
+ }
+
+ // Free User data
+ g_free(event_flag);
+
+ dbg("Exit");
+ return;
+}
+
+static void _on_confirmation_call_end_cause(TcorePending *p, int data_len, const void *data, void *user_data)
+{
+ TcorePlugin *plugin = NULL;
+ CoreObject *core_obj = NULL;
+ CallObject *co = (CallObject *) user_data;
+ const TcoreATResponse *response = data;
+ const char *line = NULL;
+ struct tnoti_call_status_idle call_status;
+ GSList *tokens = NULL;
+ char *resp_str;
+ int error;
+
+ dbg("Entry");
+ plugin = tcore_pending_ref_plugin(p);
+ core_obj = tcore_pending_ref_core_object(p);
+
+ if (response->success > 0) {
+ dbg("RESPONSE OK");
+ line = (const char *) (((GSList *) response->lines)->data);
+ tokens = tcore_at_tok_new(line);
+ resp_str = g_slist_nth_data(tokens, 0);
+ if (!resp_str) {
+ err("call end cause - report value missing");
+ } else {
+ resp_str = g_slist_nth_data(tokens, 1);
+ if (!resp_str) {
+ err("call end cause value missing");
+ }
+ error = atoi(resp_str);
+ dbg("call end cause - %d", error);
+ call_status.cause = _compare_call_end_cause(error);
+ dbg("TAPI call end cause - %d", call_status.cause);
+ }
+
+ // Free tokens
+ tcore_at_tok_free(tokens);
+ } else {
+ err("RESPONSE NOT OK");
+ line = (char *) response->final_response;
+ tokens = tcore_at_tok_new(line);
+ if (g_slist_length(tokens) < 1) {
+ err("err cause not specified or string corrupted");
+ } else {
+ err(" err cause value: %d", atoi(g_slist_nth_data(tokens, 0)));
+ }
+ call_status.cause = CC_CAUSE_NORMAL_CALL_CLEARING;
+ // Free tokens
+ tcore_at_tok_free(tokens);
+ }
+
+ call_status.type = tcore_call_object_get_type(co);
+ dbg("data.type : [%d]", call_status.type);
+
+ call_status.id = tcore_call_object_get_id(co);
+ dbg("data.id : [%d]", call_status.id);
+
+ // Set Status
+ tcore_call_object_set_status(co, TCORE_CALL_STATUS_IDLE);
+
+ // Send Notification to TAPI
+ tcore_server_send_notification(tcore_plugin_ref_server(plugin),
+ core_obj,
+ TNOTI_CALL_STATUS_IDLE,
+ sizeof(struct tnoti_call_status_idle),
+ (void *) &call_status);
+
+ // Free Call object
+ tcore_call_object_free(core_obj, co);
+}
+
+static int _callFromCLCCLine(char *line, struct clcc_call_t *p_call)
+{
+ // +CLCC: 1,0,2,0,0,"18005551212",145
+ // [+CLCC: <id1>, <dir>, <stat>, <mode>,<mpty>[,<number>,<type>[,<alpha>[,<priority>]]]
+ int state;
+ int mode;
+ int isMT;
+ char *num = NULL;
+ unsigned int num_type;
+ GSList *tokens = NULL;
+ char *resp = NULL;
+ dbg("Entry");
+
+ tokens = tcore_at_tok_new(line);
+ // parse <id>
+ resp = g_slist_nth_data(tokens, 0);
+ if (!resp) {
+ err("InValid ID");
+ goto ERROR;
+ }
+ p_call->info.id = atoi(resp);
+ dbg("id : [%d]\n", p_call->info.id);
+
+ // parse <dir>
+ resp = g_slist_nth_data(tokens, 1);
+ if (!resp) {
+ err("InValid Dir");
+ goto ERROR;
+ }
+ isMT = atoi(resp);
+ if (0 == isMT) {
+ p_call->info.direction = TCORE_CALL_DIRECTION_OUTGOING;
+ } else {
+ p_call->info.direction = TCORE_CALL_DIRECTION_INCOMING;
+ }
+ dbg("Direction : [ %d ]\n", p_call->info.direction);
+
+ // parse <stat>
+ resp = g_slist_nth_data(tokens, 2);
+ if (!resp) {
+ err("InValid Stat");
+ goto ERROR;
+ }
+ state = atoi(resp);
+ dbg("Call state : %d", state);
+ switch (state) {
+ case 0: // active
+ p_call->info.status = TCORE_CALL_STATUS_ACTIVE;
+ break;
+
+ case 1:
+ p_call->info.status = TCORE_CALL_STATUS_HELD;
+ break;
+
+ case 2:
+ p_call->info.status = TCORE_CALL_STATUS_DIALING;
+ break;
+
+ case 3:
+ p_call->info.status = TCORE_CALL_STATUS_ALERT;
+ break;
+
+ case 4:
+ p_call->info.status = TCORE_CALL_STATUS_INCOMING;
+ break;
+
+ case 5:
+ p_call->info.status = TCORE_CALL_STATUS_WAITING;
+ break;
+ }
+ dbg("Status : [%d]\n", p_call->info.status);
+
+ // parse <mode>
+ resp = g_slist_nth_data(tokens, 3);
+ if (!resp) {
+ err("InValid Mode");
+ goto ERROR;
+ }
+ mode = atoi(resp);
+ switch (mode) {
+ case 0:
+ p_call->info.type = TCORE_CALL_TYPE_VOICE;
+ break;
+
+ case 1:
+ p_call->info.type = TCORE_CALL_TYPE_VIDEO;
+ break;
+
+ default: // only Voice/VT call is supported in CS. treat other unknown calls as error
+ dbg("invalid type : [%d]\n", mode);
+ goto ERROR;
+ }
+ dbg("Call type : [%d]\n", p_call->info.type);
+
+ // parse <mpty>
+ resp = g_slist_nth_data(tokens, 4);
+ if (!resp) {
+ err("InValid Mpty");
+ goto ERROR;
+ }
+
+ p_call->info.mpty = atoi(resp);
+ dbg("Mpty : [ %d ]\n", p_call->info.mpty);
+
+ // parse <num>
+ resp = g_slist_nth_data(tokens, 5);
+ dbg("Incoming number - %s and its len - %d", resp, strlen(resp));
+
+ // tolerate null here
+ if (!resp) {
+ err("Number is NULL");
+ goto ERROR;
+ }
+ // Strike off double quotes
num = util_removeQuotes(resp);
- dbg("num after removing quotes - %s", num);\r
-\r
- p_call->info.num_len = strlen(resp);\r
- dbg("num_len : [0x%x]\n", p_call->info.num_len);\r
-\r
- // parse <num type>\r
- resp = g_slist_nth_data(tokens, 6);\r
- if(!resp) {\r
- dbg("InValid Num type");\r
- goto ERROR;\r
- }\r
- p_call->info.num_type = atoi(resp);\r
- dbg("BCD num type: [0x%x]\n", p_call->info.num_type);\r
-\r
- //check number is international or national.\r
- num_type = ((p_call->info.num_type) >> 4) & 0x07;\r
- dbg("called party's type of number : [0x%x]\n", num_type);\r
-\r
- if(num_type == 1 && num[0] != '+') {\r
- //international number\r
- p_call->number[0] = '+';\r
- memcpy(&(p_call->number[1]),num,strlen(num));\r
- }\r
- else{\r
- memcpy(&(p_call->number),num,strlen(num));\r
- }\r
- dbg("incoming number - %s", p_call->number);\r
-\r
- g_free(num);\r
- num = NULL;\r
- // Free tokens\r
- tcore_at_tok_free(tokens);\r
-\r
- dbg("Exit");\r
- return 0;\r
-\r
-ERROR:\r
- err("Invalid CLCC line");\r
-\r
- if(num){\r
- g_free(num);\r
- num = NULL;\r
- }\r
-\r
- // Free tokens\r
- tcore_at_tok_free(tokens);\r
- err("Exit");\r
- return -1;\r
-}\r
-\r
-// NOTIFICATION\r
-static void on_notification_call_waiting(CoreObject *o, const void *data, void *user_data)\r
-{\r
- GSList *tokens = NULL;\r
- const char *line = NULL;\r
- char *pId;\r
- int call_id;\r
- gboolean *eflag;\r
- GSList* pList = NULL;\r
- CallObject *co = NULL, *dupco = NULL;\r
-\r
- dbg("function entrance");\r
- // check call with waiting status already exist\r
- pList = tcore_call_object_find_by_status(o, TCORE_CALL_STATUS_WAITING);\r
-\r
- if(pList != NULL) {\r
- dbg("[error]Waiting call already exist. skip");\r
- return;\r
- }\r
- // check call with incoming status already exist\r
- pList = tcore_call_object_find_by_status(o, TCORE_CALL_STATUS_INCOMING);\r
-\r
- if(pList != NULL){\r
- dbg("[error]incoming call already exist. skip");\r
- return;\r
- }\r
- line = (char*)data;\r
- tokens = tcore_at_tok_new(line);\r
-\r
- pId = g_slist_nth_data(tokens, 0);\r
- if(!pId){\r
- dbg("[error]:Call id is missing from +XCALLSTAT indication");\r
- return;\r
- }\r
-\r
- call_id = atoi(pId);\r
- dupco = tcore_call_object_find_by_id(o, call_id);\r
- if(dupco!= NULL){\r
- dbg("co with same id already exist. skip");\r
- return;\r
- }\r
- co = tcore_call_object_new(o, call_id);\r
- if (!co){\r
- dbg("[ error ] co is NULL");\r
- return ;\r
- }\r
-\r
- tcore_at_tok_free(tokens);\r
-\r
- eflag = g_new0(gboolean, 1);\r
- *eflag = TRUE;\r
- dbg("calling _call_list_get");\r
- _call_list_get(o, eflag);\r
-\r
-}\r
-\r
-static void on_notification_call_incoming(CoreObject *o, const void *data, void *user_data)\r
-{\r
- GSList *tokens = NULL;\r
- const char *line = NULL;\r
- char *pId;\r
- int call_id;\r
- gboolean *eflag;\r
- GSList* pList = NULL;\r
- CallObject *co = NULL, *dupco = NULL;\r
-\r
- dbg("function entrance");\r
- // check call with incoming status already exist\r
- pList = tcore_call_object_find_by_status(o, TCORE_CALL_STATUS_INCOMING);\r
-\r
- if(pList != NULL){\r
- dbg("incoming call already exist. skip");\r
- return;\r
- }\r
-\r
- line = (char*)data;\r
- tokens = tcore_at_tok_new(line);\r
-\r
- pId = g_slist_nth_data(tokens, 0);\r
- if(!pId){\r
- dbg("Error:Call id is missing from %XCALLSTAT indication");\r
- return;\r
- }\r
-\r
- call_id = atoi(pId);\r
-\r
- dupco = tcore_call_object_find_by_id(o, call_id);\r
- if(dupco!= NULL){\r
- dbg("co with same id already exist. skip");\r
- return;\r
- }\r
-\r
- co = tcore_call_object_new(o, call_id);\r
- if (!co){\r
- dbg("[ error ] co is NULL");\r
- return ;\r
- }\r
-\r
- dbg("freeing at token")\r
- tcore_at_tok_free(tokens);\r
-\r
- eflag = g_new0(gboolean, 1);\r
- *eflag = TRUE;\r
-\r
- dbg("calling _call_list_get");\r
- _call_list_get(o, eflag);\r
-\r
-}\r
-\r
-static void on_notification_call_status(CoreObject *o, const void *data, void *user_data)\r
-{\r
- char* cmd = NULL;\r
- TcorePlugin *plugin = NULL;\r
- CallObject *co = NULL;\r
- int id = -1;\r
- int status = 0;\r
- int type = 0;\r
- char *stat = NULL;\r
- char *pCallId = NULL;\r
- GSList *tokens = NULL;\r
- gboolean *eflag = NULL;
- enum tcore_call_status co_status;\r
-\r
- dbg("function entrance");\r
- plugin = tcore_object_ref_plugin(o);\r
- cmd = (char*)data;\r
- tokens = tcore_at_tok_new(cmd);\r
-\r
- // parse <Call Id>\r
- pCallId = g_slist_nth_data(tokens, 0);\r
- if(!pCallId) {\r
- dbg("pCallId is missing from %XCALLSTAT indiaction");\r
-\r
- }\r
- else {\r
- id = atoi(pCallId);\r
- dbg("call id = %d", id);\r
- //parse <Stat>\r
- if ((stat = g_slist_nth_data(tokens, 1))) {\r
- status = atoi(stat);\r
- }\r
- dbg("call status = %d", status);\r
- }\r
-\r
- tcore_at_tok_free(tokens);\r
- co_status = _call_status(status);\r
-\r
- dbg("co_status = %d", co_status);\r
- switch (co_status) {\r
-\r
- case CALL_STATUS_ACTIVE:\r
- {\r
- dbg("call(%d) status : [ ACTIVE ]", id);\r
- co = tcore_call_object_find_by_id(o,id);\r
- if (!co) {\r
- dbg("co is NULL");\r
- return ;\r
- }\r
- _call_status_active(plugin, co);\r
-\r
- }\r
- break;\r
-\r
- case CALL_STATUS_HELD:\r
- dbg("call(%d) status : [ held ]", id);\r
- break;\r
-\r
- case CALL_STATUS_DIALING:\r
- {\r
- dbg("call(%d) status : [ dialing ]", id);\r
- co = tcore_call_object_find_by_id(o,id);\r
- if (!co) {\r
- co = tcore_call_object_new(o, id);\r
- if (!co) {\r
- dbg("error : tcore_call_object_new [ id : %d ]", id);\r
- return ;\r
- }\r
- }\r
-\r
- tcore_call_object_set_type(co, call_type(type));\r
- tcore_call_object_set_direction(co, TCORE_CALL_DIRECTION_OUTGOING);\r
- _call_status_dialing(plugin, co);\r
- }\r
- break;\r
- case CALL_STATUS_ALERT:\r
- {\r
- dbg("call(%d) status : [ alert ]", id);\r
- co = tcore_call_object_find_by_id(o, id);\r
- if (!co){\r
- dbg("co is NULL");\r
- return ;\r
- }\r
- //Store dialed number information into Call object.
- eflag = g_new0(gboolean, 1);
- *eflag = TRUE;
- dbg("calling _call_list_get");
- _call_list_get(o, eflag);
-\r
- }\r
- break;\r
- case CALL_STATUS_INCOMING:\r
- case CALL_STATUS_WAITING:\r
- dbg("call(%d) status : [ incoming ]", id);\r
- break;\r
- case CALL_STATUS_IDLE:\r
- {\r
-\r
- dbg("call(%d) status : [ release ]", id);\r
-\r
- co = tcore_call_object_find_by_id(o, id);\r
- if (!co) {\r
- dbg("co is NULL");\r
- return ;\r
- }\r
-\r
- plugin = tcore_object_ref_plugin(o);\r
- if (!plugin) {\r
- dbg("plugin is NULL");\r
- return ;\r
- }\r
- _call_status_idle(plugin, co);\r
- }\r
- break;\r
-\r
- default:\r
- dbg("invalid call status", id);\r
- break;\r
- }\r
-}\r
-\r
-static TReturn s_call_outgoing(CoreObject *o, UserRequest *ur)\r
-{\r
- struct treq_call_dial* data = 0;\r
- char* raw_str= NULL;\r
- char*cmd_str = NULL;\r
- const char *cclir;\r
- enum tcore_call_cli_mode clir = CALL_CLI_MODE_DEFAULT;\r
- TcorePending *pending = NULL;\r
- TcoreATRequest *req;\r
- gboolean ret = FALSE;\r
-\r
- dbg("function entrance");\r
- data = (struct treq_call_dial*)tcore_user_request_ref_data(ur, 0);\r
- clir = _get_clir_status(data->number);\r
-\r
- //Compose ATD Cmd string\r
- switch (clir) {\r
- case TCORE_CALL_CLI_MODE_PRESENT:\r
- dbg("CALL_CLI_MODE_PRESENT");\r
- cclir = "I";\r
- break; //invocation\r
- case TCORE_CALL_CLI_MODE_RESTRICT:\r
- dbg("CALL_CLI_MODE_RESTRICT");\r
- cclir = "i";\r
- break; //suppression\r
- case TCORE_CALL_CLI_MODE_DEFAULT:\r
- default:\r
- cclir = "";\r
- dbg("CALL_CLI_MODE_DEFAULT");\r
- break; //subscription default\r
- }\r
-\r
- dbg("data->number = %s",data->number);\r
-\r
- raw_str = g_strdup_printf("ATD%s%s;", data->number, cclir);\r
- cmd_str = g_strdup_printf("%s",raw_str);\r
-\r
- dbg("request command : %s", cmd_str);\r
-\r
- pending = tcore_pending_new(o, 0);\r
- req = tcore_at_request_new(cmd_str, NULL, TCORE_AT_NO_RESULT);\r
- dbg("cmd : %s, prefix(if any) :%s, cmd_len : %d", req->cmd, req->prefix, strlen(req->cmd));\r
-\r
- tcore_pending_set_request_data(pending, 0, req);\r
- ret = _call_request_message (pending, o, ur, on_confirmation_call_outgoing, NULL);\r
-\r
- g_free(raw_str);\r
- g_free(cmd_str);\r
-\r
- if (!ret) {\r
- dbg("AT request(%s) sent failed", req->cmd);\r
- return TCORE_RETURN_FAILURE;\r
- }\r
-\r
- dbg("AT request(%s) sent success",req->cmd);\r
-\r
- return TCORE_RETURN_SUCCESS;\r
-}\r
-\r
-static TReturn s_call_answer(CoreObject *o, UserRequest *ur)\r
-{\r
- char* cmd_str = NULL;\r
- CallObject* co = NULL;\r
- struct treq_call_answer* data = 0;\r
- TcorePending *pending = NULL;\r
- TcoreATRequest *req;\r
- gboolean ret = FALSE;\r
-\r
- dbg("function entrance");\r
-\r
- data = (struct treq_call_answer*)tcore_user_request_ref_data(ur, 0);\r
- co = tcore_call_object_find_by_id(o, data->id);\r
- if (data->type == CALL_ANSWER_TYPE_ACCEPT) {\r
-\r
- dbg(" request type CALL_ANSWER_TYPE_ACCEPT");\r
-\r
- cmd_str = g_strdup_printf("%s","ATA");\r
- pending = tcore_pending_new(o, 0);\r
- req = tcore_at_request_new(cmd_str, NULL, TCORE_AT_NO_RESULT);\r
- dbg("cmd : %s, prefix(if any) :%s, cmd_len : %d", req->cmd, req->prefix, strlen(req->cmd));\r
-\r
- tcore_pending_set_request_data(pending, 0, req);\r
- ret = _call_request_message (pending, o, ur, on_confirmation_call_accept, co);\r
- g_free(cmd_str);\r
-\r
- if (!ret) {\r
- dbg("AT request(%s) sent failed", req->cmd);\r
- return TCORE_RETURN_FAILURE;\r
- }\r
-\r
- }\r
- else {\r
-\r
- switch (data->type) {\r
- case CALL_ANSWER_TYPE_REJECT:\r
- {\r
- dbg("call answer reject");\r
- tcore_call_control_answer_reject(o, ur, on_confirmation_call_reject, co);\r
- } break;\r
-\r
- case CALL_ANSWER_TYPE_REPLACE:\r
- {\r
- dbg("call answer replace");\r
- tcore_call_control_answer_replace(o, ur, on_confirmation_call_replace, co);\r
- } break;\r
-\r
- case CALL_ANSWER_TYPE_HOLD_ACCEPT:\r
- {\r
- dbg("call answer hold and accept");\r
- tcore_call_control_answer_hold_and_accept(o, ur, on_confirmation_call_hold_and_accept, co);\r
- } break;\r
-\r
- default :\r
- dbg("[ error ] wrong answer type [ %d ]", data->type);\r
- return TCORE_RETURN_FAILURE;\r
- }\r
- }\r
-\r
- return TCORE_RETURN_SUCCESS;\r
-}\r
-\r
-static TReturn s_call_release(CoreObject *o, UserRequest *ur)\r
-{\r
- CallObject* co = NULL;\r
- struct treq_call_end* data = 0;\r
- UserRequest* ur_dup = NULL;\r
- char* chld0_cmd = NULL;\r
- char* chld1_cmd = NULL;\r
- TcorePending *pending = NULL, *pending1 = NULL;\r
- TcoreATRequest *req, *req1;\r
- gboolean ret = FALSE;\r
-\r
- dbg("function entrance");\r
- data = (struct treq_call_end*)tcore_user_request_ref_data(ur, 0);\r
- co = tcore_call_object_find_by_id(o, data->id);\r
-\r
- dbg("type of release call = %d" , data->type);\r
-\r
- if (data->type == CALL_END_TYPE_ALL) {\r
-\r
- //releaseAll do not exist on legacy request. send CHLD=0, CHLD=1 in sequence\r
- chld0_cmd = g_strdup("AT+CHLD=0");\r
- chld1_cmd = g_strdup("AT+CHLD=1");\r
-\r
- pending = tcore_pending_new(o, 0);\r
- req = tcore_at_request_new(chld0_cmd, NULL, TCORE_AT_NO_RESULT);\r
-\r
- dbg("input command is %s",chld0_cmd);\r
- dbg("req-cmd : %s, prefix(if any) :%s, cmd_len : %d", req->cmd, req->prefix, strlen(req->cmd));\r
-\r
- tcore_pending_set_request_data(pending, 0, req);\r
- ur_dup = tcore_user_request_new(NULL, NULL);\r
- ret = _call_request_message(pending ,o, ur_dup, on_confirmation_call_endall, NULL);\r
- g_free(chld0_cmd);\r
-\r
- if (!ret) {\r
- dbg("AT request %s has failed ",req->cmd);\r
- return TCORE_RETURN_FAILURE;\r
- }\r
-\r
- pending1 = tcore_pending_new(o, 0);\r
- req1 = tcore_at_request_new(chld1_cmd, NULL, TCORE_AT_NO_RESULT);\r
-\r
- dbg("input command is %s",chld1_cmd);\r
- dbg("req-cmd : %s, prefix(if any) :%s, cmd_len : %d", req1->cmd, req1->prefix, strlen(req1->cmd));\r
-\r
- tcore_pending_set_request_data(pending1, 0, req1);\r
- ret = _call_request_message(pending1, o, ur, on_confirmation_call_release_all, co);\r
- g_free(chld1_cmd);\r
-\r
- if (!ret) {\r
- dbg("AT request %s has failed ",req->cmd);\r
- return TCORE_RETURN_FAILURE;\r
- }\r
-\r
- }\r
- else {\r
-\r
- switch (data->type) {\r
-\r
- case CALL_END_TYPE_DEFAULT:\r
- {\r
- int id = 0;\r
- id = tcore_call_object_get_id(co);\r
-\r
- dbg("call end call id [%d]", id);\r
- tcore_call_control_end_specific(o, ur, id, on_confirmation_call_release_specific, co);\r
- } break;\r
-\r
- case CALL_END_TYPE_ACTIVE_ALL:\r
- {\r
-\r
- dbg("call end all active");\r
- tcore_call_control_end_all_active(o, ur, on_confirmation_call_release_all_active, co);\r
- } break;\r
-\r
- case CALL_END_TYPE_HOLD_ALL:\r
- {\r
-\r
- dbg("call end all held");\r
- tcore_call_control_end_all_held(o, ur, on_confirmation_call_release_all_held, co);\r
- } break;\r
-\r
- default :\r
- dbg("[ error ] wrong end type [ %d ]", data->type);\r
- return TCORE_RETURN_FAILURE;\r
- }\r
-\r
- }\r
-\r
- return TCORE_RETURN_SUCCESS;\r
-}\r
-\r
-static TReturn s_call_hold(CoreObject *o, UserRequest *ur)\r
-{\r
- struct treq_call_hold *hold = 0;\r
- CallObject *co = NULL;\r
-\r
- dbg("function entrance");\r
-\r
- hold = (struct treq_call_hold*)tcore_user_request_ref_data(ur, 0);\r
- dbg("call id : [ %d ]", hold->id);\r
-\r
- co = tcore_call_object_find_by_id(o, hold->id);\r
- tcore_call_control_hold(o, ur, on_confirmation_call_hold, co);\r
-\r
- return TCORE_RETURN_SUCCESS;\r
-}\r
-\r
-static TReturn s_call_active(CoreObject *o, UserRequest *ur)\r
-{\r
- struct treq_call_active *active = 0;\r
- CallObject *co = NULL;\r
-\r
- active = (struct treq_call_active*)tcore_user_request_ref_data(ur, 0);\r
- dbg("call id : [ %d ]", active->id);\r
-\r
- co = tcore_call_object_find_by_id(o, active->id);\r
- tcore_call_control_active(o, ur, on_confirmation_call_active, co);\r
-\r
- return TCORE_RETURN_SUCCESS;\r
-}\r
-\r
-static TReturn s_call_swap(CoreObject *o, UserRequest *ur)\r
-{\r
- struct treq_call_swap *swap = NULL;\r
- CallObject *co = NULL;\r
-\r
- swap = (struct treq_call_swap*)tcore_user_request_ref_data(ur, 0);\r
- dbg("call id : [ %d ]", swap->id);\r
-\r
- co = tcore_call_object_find_by_id(o, swap->id);\r
- tcore_call_control_swap(o, ur, on_confirmation_call_swap, co);\r
-\r
- return TCORE_RETURN_SUCCESS;\r
-}\r
-\r
-static TReturn s_call_join(CoreObject *o, UserRequest *ur)\r
-{\r
- struct treq_call_join *join = 0;\r
- CallObject *co = NULL;\r
-\r
- join = (struct treq_call_join*)tcore_user_request_ref_data(ur, 0);\r
- dbg("call id : [ %d ]", join->id);\r
-\r
- co = tcore_call_object_find_by_id(o, join->id);\r
- tcore_call_control_join(o, ur, on_confirmation_call_join, co);\r
-\r
- return TCORE_RETURN_SUCCESS;\r
-}\r
-\r
-static TReturn s_call_split(CoreObject *o, UserRequest *ur)\r
-{\r
- struct treq_call_split *split = 0;\r
- CallObject *co = NULL;\r
-\r
- split = (struct treq_call_split*)tcore_user_request_ref_data(ur, 0);\r
- co = tcore_call_object_find_by_id (o, split->id);\r
- dbg("call id : [ %d ]", split->id);\r
-\r
- tcore_call_control_split(o, ur, split->id, on_confirmation_call_split, co);\r
-\r
- return TCORE_RETURN_SUCCESS;\r
-}\r
-\r
-static TReturn s_call_deflect(CoreObject *o, UserRequest *ur)\r
-{\r
- struct treq_call_deflect *deflect = 0;\r
- CallObject *co = NULL;\r
-\r
- deflect = (struct treq_call_deflect*)tcore_user_request_ref_data(ur, 0);\r
- co = tcore_call_object_find_by_number(o, deflect->number);\r
- dbg("deflect number: [ %s ]", deflect->number);\r
-\r
- tcore_call_control_deflect(o, ur, deflect->number, on_confirmation_call_deflect, co);\r
-\r
- return TCORE_RETURN_SUCCESS;\r
-}\r
-\r
-static TReturn s_call_transfer(CoreObject *o, UserRequest *ur)\r
-{\r
- struct treq_call_transfer *transfer = 0;\r
- CallObject *co = NULL;\r
-\r
- transfer = (struct treq_call_transfer*)tcore_user_request_ref_data(ur, 0);\r
- dbg("call id : [ %d ]", transfer->id);\r
-\r
- co = tcore_call_object_find_by_id(o, transfer->id);\r
- tcore_call_control_transfer(o, ur, on_confirmation_call_transfer, co);\r
-\r
- return TCORE_RETURN_SUCCESS;\r
-}\r
-\r
-static TReturn s_call_send_dtmf(CoreObject *o, UserRequest *ur)\r
-{\r
- char*cmd_str = NULL;\r
- TcorePending *pending = NULL;\r
- TcoreATRequest *req;\r
- UserRequest *dup;\r
- gboolean ret = FALSE;\r
- struct treq_call_dtmf *dtmf = 0;\r
- char *dtmfstr = NULL, *tmp_dtmf = NULL;\r
- unsigned int dtmf_count;\r
-\r
- dbg("Function enter");\r
-\r
- dup = tcore_user_request_new(NULL, NULL);\r
- (void)_set_dtmf_tone_duration(o, dup);\r
-\r
- dtmf = (struct treq_call_dtmf*)tcore_user_request_ref_data(ur, 0);\r
- dtmfstr = g_malloc0((MAX_CALL_DTMF_DIGITS_LEN * 2)+ 1); // DTMF digits + comma for each dtmf digit.\r
-\r
- if(dtmfstr == NULL) {\r
- dbg("Memory allocation failed");\r
- return TCORE_RETURN_FAILURE;\r
- }\r
-\r
- tmp_dtmf = dtmfstr;\r
-\r
- for(dtmf_count = 0; dtmf_count < strlen(dtmf->digits); dtmf_count++) {\r
-\r
- *tmp_dtmf = dtmf->digits[dtmf_count];\r
- tmp_dtmf ++;\r
-\r
- *tmp_dtmf = COMMA;\r
- tmp_dtmf++;\r
- }\r
-\r
- //last digit is having COMMA , overwrite it with '\0' .\r
- *(--tmp_dtmf) = '\0';\r
- dbg("Input DTMF string(%s)",dtmfstr);\r
-\r
- //AT+VTS = <d1>,<d2>,<d3>,<d4>,<d5>,<d6>, ..... <d32>\r
- cmd_str = g_strdup_printf("AT+VTS=%s",dtmfstr);\r
- dbg("request command : %s", cmd_str);\r
-\r
- pending = tcore_pending_new(o, 0);\r
- req = tcore_at_request_new(cmd_str, NULL, TCORE_AT_NO_RESULT);\r
- dbg("cmd : %s, prefix(if any) :%s, cmd_len : %d", req->cmd, req->prefix, strlen(req->cmd));\r
-\r
- tcore_pending_set_request_data(pending, 0, req);\r
- ret = _call_request_message (pending, o, ur, on_confirmation_call_dtmf, NULL);\r
- g_free(dtmfstr);\r
- g_free(cmd_str);\r
-\r
- if (!ret) {\r
-\r
- dbg("AT request sent failed")\r
- return TCORE_RETURN_FAILURE;\r
- }\r
-\r
- return TCORE_RETURN_SUCCESS;\r
-}\r
-\r
-static TReturn s_call_set_sound_path(CoreObject *o, UserRequest *ur)\r
-{\r
- UserRequest *ur_dup = NULL;\r
- TcorePending *pending = NULL , *pending1 = NULL;\r
- TcoreATRequest *req , *req1;\r
- char *cmd_str = NULL , *cmd_str1 = NULL;\r
- gboolean ret = FALSE;\r
-\r
- dbg("function entrance");\r
-\r
- //hard coded value for speaker.\r
- cmd_str = g_strdup_printf("%s","AT+XDRV=40,4,3,0,0,0,0,0,1,0,1,0,1"); //source type.\r
- cmd_str1 = g_strdup_printf("%s","AT+XDRV=40,5,2,0,0,0,0,0,1,0,1,0,1"); //destination type\r
-\r
- pending = tcore_pending_new(o, 0);\r
- req = tcore_at_request_new(cmd_str, "+XDRV", TCORE_AT_SINGLELINE);\r
- dbg("cmd : %s, prefix(if any) :%s, cmd_len : %d", req->cmd, req->prefix, strlen(req->cmd));\r
-\r
- tcore_pending_set_request_data(pending, 0, req);\r
- ur_dup = tcore_user_request_ref(ur);\r
-\r
- ret = _call_request_message (pending, o, ur_dup, on_confirmation_call_set_source_sound_path, NULL);\r
-\r
- g_free(cmd_str);\r
-\r
- if (!ret) {\r
-\r
- dbg("At request(%s) sent failed",req->cmd);\r
- return TCORE_RETURN_FAILURE;\r
- }\r
-\r
- pending1 = tcore_pending_new(o, 0);\r
- req1 = tcore_at_request_new(cmd_str1,"+XDRV", TCORE_AT_SINGLELINE);\r
- dbg("input command is %s",cmd_str1);\r
- dbg("req-cmd : %s, prefix(if any) :%s, cmd_len : %d", req1->cmd, req1->prefix, strlen(req1->cmd));\r
-\r
- tcore_pending_set_request_data(pending1, 0, req1);\r
- ret = _call_request_message(pending1, o, ur, on_confirmation_call_set_destination_sound_path, NULL);\r
-\r
- g_free(cmd_str1);\r
-\r
- if (!ret) {\r
- dbg("AT request %s has failed ",req1->cmd);\r
- return TCORE_RETURN_FAILURE;\r
- }\r
-\r
- return TCORE_RETURN_SUCCESS;\r
-\r
-}\r
-\r
-static TReturn s_call_set_sound_volume_level(CoreObject *o, UserRequest *ur)\r
-{\r
- UserRequest *src_ur = NULL;\r
- UserRequest *dest_ur = NULL;\r
- TcorePending *src_pending = NULL;\r
- TcorePending *dest_pending = NULL;\r
- TcoreATRequest *src_req = NULL;\r
- TcoreATRequest *dest_req = NULL;\r
- char *cmd_str = NULL, *volume_level = NULL;\r
- gboolean ret = FALSE;\r
-\r
- struct treq_call_sound_set_volume_level* data = NULL;\r
- data = (struct treq_call_sound_set_volume_level*)tcore_user_request_ref_data( ur, 0 );\r
- dbg("Entry");\r
- // Hard-coded values for MIC & Speakers\r
- // Source volume\r
- dbg("Set Source volume");\r
-\r
- cmd_str = g_strdup_printf("%s", "AT+XDRV=40,7,3,88"); // Source type\r
- dbg("Request command string: %s", cmd_str);\r
-\r
- // Create new Pending request\r
- src_pending = tcore_pending_new(o, 0);\r
-\r
- // Create new AT-Command request\r
- src_req = tcore_at_request_new(cmd_str, "+XDRV", TCORE_AT_SINGLELINE);\r
- dbg("Command: %s, prefix(if any): %s, Command length: %d", src_req->cmd, src_req->prefix, strlen(src_req->cmd));\r
-\r
- // Free Command string\r
- g_free(cmd_str);\r
-\r
- tcore_pending_set_request_data(src_pending, 0, src_req);\r
- src_ur = tcore_user_request_ref(ur);\r
-\r
- // Send request\r
- ret = _call_request_message (src_pending, o, src_ur, on_confirmation_call_set_source_sound_volume_level, NULL);\r
- if (!ret) {\r
- err("Failed to send AT-Command request");\r
- return TCORE_RETURN_FAILURE;\r
- }\r
-\r
- cmd_str = g_strdup_printf("%s", "AT+XDRV=40,7,0,88"); // Destination type\r
- dbg("Request command string: %s", cmd_str);\r
-\r
- // Create new Pending request\r
- src_pending = tcore_pending_new(o, 0);\r
-\r
- // Create new AT-Command request\r
- src_req = tcore_at_request_new(cmd_str,"+XDRV", TCORE_AT_SINGLELINE);\r
- dbg("Command: %s, prefix(if any): %s, Command length: %d", src_req->cmd, src_req->prefix, strlen(src_req->cmd));\r
-\r
- // Free Command string\r
- g_free(cmd_str);\r
-\r
- tcore_pending_set_request_data(src_pending, 0, src_req);\r
-\r
- src_ur= tcore_user_request_ref(ur);\r
-\r
- // Send request\r
- ret = _call_request_message(src_pending, o, src_ur, on_confirmation_call_set_source_sound_volume_level, NULL);\r
- if (!ret) {\r
- err("Failed to send AT-Command request");\r
- return TCORE_RETURN_FAILURE;\r
- }\r
-\r
- // Destination volume\r
- dbg("Set Source volume");\r
-\r
- cmd_str = g_strdup_printf("%s", "AT+XDRV=40,8,0,88"); // Source type\r
- dbg("Request command string: %s", cmd_str);\r
-\r
- // Create new Pending request\r
- dest_pending = tcore_pending_new(o, 0);\r
-\r
- // Create new AT-Command request\r
- dest_req = tcore_at_request_new(cmd_str, "+XDRV", TCORE_AT_SINGLELINE);\r
- dbg("Command: %s, prefix(if any): %s, Command length: %d", dest_req->cmd, dest_req->prefix, strlen(dest_req->cmd));\r
-\r
- // Free Command string\r
- g_free(cmd_str);\r
-\r
- tcore_pending_set_request_data(dest_pending, 0, dest_req);\r
- dest_ur = tcore_user_request_ref(ur);\r
-\r
- // Send request\r
- ret = _call_request_message (dest_pending, o, dest_ur, on_confirmation_call_set_source_sound_volume_level, NULL);\r
- if (!ret) {\r
- err("Failed to send AT-Command request");\r
- return TCORE_RETURN_FAILURE;\r
- }\r
-\r
- dbg("Input volume level - %d",data->volume);\r
- switch(data->volume) {\r
-\r
- case CALL_SOUND_MUTE:\r
- volume_level = "0";\r
- break;\r
- case CALL_SOUND_VOLUME_LEVEL_1:\r
- volume_level = "40";\r
- break;\r
- case CALL_SOUND_VOLUME_LEVEL_2:\r
- volume_level = "46";\r
- break;\r
- case CALL_SOUND_VOLUME_LEVEL_3:\r
- volume_level = "52";\r
- break;\r
- case CALL_SOUND_VOLUME_LEVEL_4:\r
- volume_level = "58";\r
- break;\r
- case CALL_SOUND_VOLUME_LEVEL_5:\r
- volume_level = "64";\r
- break;\r
- case CALL_SOUND_VOLUME_LEVEL_6:\r
- volume_level = "70";\r
- break;\r
- case CALL_SOUND_VOLUME_LEVEL_7:\r
- volume_level = "76";\r
- break;\r
- case CALL_SOUND_VOLUME_LEVEL_8:\r
- volume_level = "82";\r
- break;\r
- case CALL_SOUND_VOLUME_LEVEL_9:\r
- default:\r
- volume_level = "88";\r
- break;\r
- }\r
- cmd_str = g_strdup_printf("%s%s","AT+XDRV=40,8,2,",volume_level); //Destination type\r
- dbg("Request command string: %s", cmd_str);\r
-\r
- // Create new Pending request\r
- dest_pending = tcore_pending_new(o, 0);\r
-\r
- // Create new AT-Command request\r
- dest_req = tcore_at_request_new(cmd_str,"+XDRV", TCORE_AT_SINGLELINE);\r
- dbg("Command: %s, prefix(if any): %s, Command length: %d", dest_req->cmd, dest_req->prefix, strlen(dest_req->cmd));\r
-\r
- // Free Command string\r
- g_free(cmd_str);\r
-\r
- tcore_pending_set_request_data(dest_pending, 0, dest_req);\r
-\r
- // Send request\r
- ret = _call_request_message(dest_pending, o, ur, on_confirmation_call_set_destination_sound_volume_level, NULL);\r
- if (!ret) {\r
- err("Failed to send AT-Command request");\r
- return TCORE_RETURN_FAILURE;\r
- }\r
-\r
- return TCORE_RETURN_SUCCESS;\r
-}\r
-\r
-\r
-static TReturn s_call_get_sound_volume_level(CoreObject *o, UserRequest *ur)\r
-{\r
- dbg("Entry");\r
-\r
- dbg("Exit");\r
- return TCORE_RETURN_SUCCESS;\r
-}\r
-\r
-static TReturn s_call_mute(CoreObject *o, UserRequest *ur)\r
-{\r
- char *cmd_str = NULL;\r
- TcorePending *pending = NULL;\r
- TcoreATRequest *req = NULL;\r
- gboolean ret = FALSE;\r
-\r
- dbg("Entry");\r
- cmd_str = g_strdup_printf("%s","AT+XDRV=40,8,0,0,0");\r
-\r
- dbg("Request command string: %s", cmd_str);\r
-\r
- // Create new Pending request\r
- pending = tcore_pending_new(o, 0);\r
-\r
- // Create new AT-Command request\r
- req = tcore_at_request_new(cmd_str, "+XDRV", TCORE_AT_SINGLELINE);\r
- dbg("Command: %s, prefix(if any): %s, Command length: %d", req->cmd, req->prefix, strlen(req->cmd));\r
-\r
- // Free command string\r
- g_free(cmd_str);\r
-\r
- // Set request data (AT command) to Pending request\r
- tcore_pending_set_request_data(pending, 0, req);\r
-\r
- // Send request\r
- ret = _call_request_message (pending, o, ur, on_confirmation_call_mute, NULL);\r
- if (!ret) {\r
- err("Failed to send AT-Command request");\r
- return TCORE_RETURN_FAILURE;\r
- }\r
-\r
- dbg("Exit");\r
- return TCORE_RETURN_SUCCESS;\r
-}\r
-\r
-static TReturn s_call_unmute(CoreObject *o, UserRequest *ur)\r
-{\r
- char *cmd_str = NULL;\r
- TcorePending *pending = NULL;\r
- TcoreATRequest *req = NULL;\r
- gboolean ret = FALSE;\r
- dbg("Entry");\r
-\r
- cmd_str = g_strdup_printf("%s","AT+XDRV=40,8,0,0,88");\r
- dbg("Request command string: %s", cmd_str);\r
-\r
- // Create new Pending request\r
- pending = tcore_pending_new(o, 0);\r
-\r
- // Create new AT-Command request\r
- req = tcore_at_request_new(cmd_str, "+XDRV", TCORE_AT_SINGLELINE);\r
- dbg("Command: %s, prefix(if any): %s, Command length: %d", req->cmd, req->prefix, strlen(req->cmd));\r
-\r
- // Free command string\r
- g_free(cmd_str);\r
-\r
- // Set request data (AT command) to Pending request\r
- tcore_pending_set_request_data(pending, 0, req);\r
-\r
- // Send request\r
- ret = _call_request_message (pending, o, ur, on_confirmation_call_unmute, NULL);\r
- if (!ret) {\r
- err("Failed to send AT-Command request");\r
- return TCORE_RETURN_FAILURE;\r
- }\r
-\r
- dbg("Exit");\r
- return TCORE_RETURN_SUCCESS;\r
-\r
-}\r
-\r
-\r
-static TReturn s_call_get_mute_status(CoreObject *o, UserRequest *ur)\r
-{\r
- dbg("Entry");\r
-\r
- dbg("Exit");\r
- return TCORE_RETURN_SUCCESS;\r
-}\r
-\r
-static TReturn _set_dtmf_tone_duration(CoreObject *o, UserRequest *ur)\r
-{\r
- char *cmd_str = NULL;\r
- TcorePending *pending = NULL;\r
- TcoreATRequest *req = NULL;\r
- gboolean ret = FALSE;\r
- dbg("Entry");\r
-\r
- cmd_str = g_strdup_printf("%s", "AT+VTD=3"); // ~300 mili secs. +VTD= n, where n = (0 - 255) * 1/10 secs.\r
- dbg("Request command string: %s", cmd_str);\r
-\r
- // Create new Pending request\r
- pending = tcore_pending_new(o, 0);\r
-\r
- // Create new AT-Command request\r
- req = tcore_at_request_new(cmd_str, NULL, TCORE_AT_NO_RESULT);\r
- dbg("Command: %s, prefix(if any): %s, Command length: %d", req->cmd, req->prefix, strlen(req->cmd));\r
-\r
- // Free command string */\r
- g_free(cmd_str);\r
-\r
- // Set request data (AT command) to Pending request\r
- tcore_pending_set_request_data(pending, 0, req);\r
-\r
- // Send request\r
- ret = _call_request_message (pending, o, ur, _on_confirmation_dtmf_tone_duration, NULL);\r
- if (!ret) {\r
- err("Failed to send AT-Command request");\r
- return TCORE_RETURN_FAILURE;\r
- }\r
-\r
- dbg("Exit");\r
- return TCORE_RETURN_SUCCESS;\r
-}\r
-\r
-//Call Operations\r
-static struct tcore_call_operations call_ops = {\r
- .dial = s_call_outgoing,\r
- .answer = s_call_answer,\r
- .end = s_call_release,\r
- .hold = s_call_hold,\r
- .active = s_call_active,\r
- .swap = s_call_swap,\r
- .join = s_call_join,\r
- .split = s_call_split,\r
- .deflect = s_call_deflect,\r
- .transfer = s_call_transfer,\r
- .send_dtmf = s_call_send_dtmf,\r
- .set_sound_path = s_call_set_sound_path,\r
- .set_sound_volume_level = s_call_set_sound_volume_level,\r
- .get_sound_volume_level = s_call_get_sound_volume_level,\r
- .mute = s_call_mute,\r
- .unmute = s_call_unmute,\r
- .get_mute_status = s_call_get_mute_status,\r
- .set_sound_recording = NULL,\r
- .set_sound_equalization = NULL,\r
- .set_sound_noise_reduction = NULL,\r
-};\r
-\r
-static void s_call_info_mo_waiting(CoreObject *o)\r
-{\r
- TcorePlugin *plugin = NULL;\r
- CallObject *co = NULL;\r
- int id = 0;\r
- dbg("Entry");\r
-\r
- // Parent plugin\r
- plugin = tcore_object_ref_plugin(o);\r
-\r
- // Call Core object\r
- co = tcore_call_object_current_on_mo_processing(o);\r
- if (!co) {\r
- err("Failed to find Call Core object!");\r
- return;\r
- }\r
-\r
- // Call ID\r
- id = tcore_call_object_get_id(co);\r
-\r
- // Send notification to TAPI\r
- tcore_server_send_notification(tcore_plugin_ref_server(plugin),\r
- tcore_plugin_ref_core_object(plugin, "call"),\r
- TNOTI_CALL_INFO_WAITING,\r
- sizeof(unsigned int),\r
- (void*)&id);\r
-\r
- dbg("Exit");\r
- return;\r
-}\r
-\r
-static void s_call_info_mo_forwarded(CoreObject *o)\r
-{\r
- TcorePlugin *plugin = NULL;\r
- CallObject *co = NULL;\r
- int id = 0;\r
- dbg("Entry");\r
-\r
- // Parent plugin\r
- plugin = tcore_object_ref_plugin(o);\r
-\r
- // Call Core object\r
- co = tcore_call_object_current_on_mo_processing(o);\r
- if (!co) {\r
- err("Failed to find Call Core object!");\r
- return;\r
- }\r
-\r
- // Call ID\r
- id = tcore_call_object_get_id(co);\r
-\r
- // Send notification to TAPI\r
- tcore_server_send_notification(tcore_plugin_ref_server(plugin),\r
- tcore_plugin_ref_core_object(plugin, "call"),\r
- TNOTI_CALL_INFO_FORWARDED,\r
- sizeof(unsigned int),\r
- (void*)&id);\r
-\r
- dbg("Exit");\r
- return;\r
-}\r
-\r
-static void s_call_info_mo_barred_incoming(CoreObject *o)\r
-{\r
- TcorePlugin *plugin = NULL;\r
- CallObject *co = NULL;\r
- int id = 0;\r
- dbg("Entry");\r
-\r
- // Parent plugin\r
- plugin = tcore_object_ref_plugin(o);\r
-\r
- // Call Core object\r
- co = tcore_call_object_current_on_mo_processing(o);\r
- if (!co) {\r
- err("Failed to find Call Core object!");\r
- return;\r
- }\r
-\r
- // Call ID\r
- id = tcore_call_object_get_id(co);\r
-\r
- // Send notification to TAPI\r
- tcore_server_send_notification(tcore_plugin_ref_server(plugin),\r
- tcore_plugin_ref_core_object(plugin, "call"),\r
- TNOTI_CALL_INFO_BARRED_INCOMING,\r
- sizeof(unsigned int),\r
- (void*)&id);\r
-\r
- dbg("Exit");\r
- return;\r
-}\r
-\r
-static void s_call_info_mo_barred_outgoing(CoreObject *o)\r
-{\r
- TcorePlugin *plugin = NULL;\r
- CallObject *co = NULL;\r
- int id = 0;\r
- dbg("Entry");\r
-\r
- // Parent plugin\r
- plugin = tcore_object_ref_plugin(o);\r
-\r
- // Call Core object\r
- co = tcore_call_object_current_on_mo_processing(o);\r
- if (!co) {\r
- err("Failed to find Call Core object!");\r
- return;\r
- }\r
-\r
- // Call ID\r
- id = tcore_call_object_get_id(co);\r
-\r
- // Send notification to TAPI\r
- tcore_server_send_notification(tcore_plugin_ref_server(plugin),\r
- tcore_plugin_ref_core_object(plugin, "call"),\r
- TNOTI_CALL_INFO_BARRED_OUTGOING,\r
- sizeof(unsigned int),\r
- (void*)&id);\r
-\r
- dbg("Exit");\r
- return;\r
-}\r
-\r
-static void s_call_info_mo_deflected(CoreObject *o)\r
-{\r
- TcorePlugin *plugin = NULL;\r
- CallObject *co = NULL;\r
- int id = 0;\r
- dbg("Entry");\r
-\r
- // Parent plugin\r
- plugin = tcore_object_ref_plugin(o);\r
-\r
- // Call Core object\r
- co = tcore_call_object_current_on_mo_processing(o);\r
- if (!co) {\r
- err("Failed to find Call Core object!");\r
- return;\r
- }\r
-\r
- // Call ID\r
- id = tcore_call_object_get_id(co);\r
-\r
- // Send notification to TAPI\r
- tcore_server_send_notification(tcore_plugin_ref_server(plugin),\r
- tcore_plugin_ref_core_object(plugin, "call"),\r
- TNOTI_CALL_INFO_DEFLECTED,\r
- sizeof(unsigned int),\r
- (void*)&id);\r
-\r
- dbg("Exit");\r
- return;\r
-}\r
-\r
-static void s_call_info_mo_clir_suppression_reject(CoreObject *o)\r
-{\r
- TcorePlugin *plugin = NULL;\r
- CallObject *co = NULL;\r
- int id = 0;\r
- dbg("Entry");\r
-\r
- // Parent plugin\r
- plugin = tcore_object_ref_plugin(o);\r
-\r
- // Call Core object\r
- co = tcore_call_object_current_on_mo_processing(o);\r
- if (!co) {\r
- err("Failed to find Call Core object!");\r
- return;\r
- }\r
-\r
- // Call ID\r
- id = tcore_call_object_get_id(co);\r
-\r
- // Send notification to TAPI\r
- tcore_server_send_notification(tcore_plugin_ref_server(plugin),\r
- tcore_plugin_ref_core_object(plugin, "call"),\r
- TNOTI_CALL_INFO_CLIR_SUPPRESSION_REJECT,\r
- sizeof(unsigned int),\r
- (void*)&id);\r
-\r
- dbg("Exit");\r
- return;\r
-}\r
-\r
-static void s_call_info_mo_cfu(CoreObject *o)\r
-{\r
- TcorePlugin *plugin = NULL;\r
- CallObject *co = NULL;\r
- int id = 0;\r
- dbg("Entry");\r
-\r
- // Parent plugin\r
- plugin = tcore_object_ref_plugin(o);\r
-\r
- // Call Core object\r
- co = tcore_call_object_current_on_mo_processing(o);\r
- if (!co) {\r
- err("Failed to find Call Core object!");\r
- return;\r
- }\r
-\r
- // Call ID\r
- id = tcore_call_object_get_id(co);\r
-\r
- // Send notification to TAPI\r
- tcore_server_send_notification(tcore_plugin_ref_server(plugin),\r
- tcore_plugin_ref_core_object(plugin, "call"),\r
- TNOTI_CALL_INFO_FORWARD_UNCONDITIONAL,\r
- sizeof(unsigned int),\r
- (void*)&id);\r
-\r
- dbg("Exit");\r
- return;\r
-}\r
-\r
-static void s_call_info_mo_cfc(CoreObject *o)\r
-{\r
- TcorePlugin *plugin = NULL;\r
- CallObject *co = NULL;\r
- int id = 0;\r
- dbg("Entry");\r
-\r
- // Parent plugin\r
- plugin = tcore_object_ref_plugin(o);\r
-\r
- // Call Core object\r
- co = tcore_call_object_current_on_mo_processing(o);\r
- if (!co) {\r
- err("Failed to find Call Core object!");\r
- return;\r
- }\r
-\r
- // Call ID\r
- id = tcore_call_object_get_id(co);\r
-\r
- // Send notification to TAPI\r
- tcore_server_send_notification(tcore_plugin_ref_server(plugin),\r
- tcore_plugin_ref_core_object(plugin, "call"),\r
- TNOTI_CALL_INFO_FORWARD_CONDITIONAL,\r
- sizeof(unsigned int),\r
- (void*)&id);\r
-\r
- dbg("Exit");\r
- return;\r
-}\r
-\r
-static void s_call_info_mt_cli(CoreObject *o, enum tcore_call_cli_mode mode, char* number)\r
-{\r
- CallObject *co = NULL;\r
- dbg("Entry");\r
-\r
- // Call Core object\r
- co = tcore_call_object_current_on_mt_processing(o);\r
- if (!co) {\r
- err("Failed to find Call Core object!");\r
- return;\r
- }\r
-\r
- // Set CLI information\r
- tcore_call_object_set_cli_info(co, mode, number);\r
-\r
- dbg("Exit");\r
- return;\r
-}\r
-\r
-static void s_call_info_mt_cna(CoreObject *o, enum tcore_call_cna_mode mode, char* name, int dcs)\r
-{\r
- CallObject *co = NULL;\r
- dbg("Entry");\r
-\r
- // Call Core object\r
- co = tcore_call_object_current_on_mt_processing(o);\r
- if (!co) {\r
- err("Failed to find Call Core object!");\r
- return;\r
- }\r
-\r
- // Set CNA information\r
- tcore_call_object_set_cna_info(co, mode, name, dcs);\r
-\r
- dbg("Exit");\r
- return;\r
-}\r
-\r
-static void s_call_info_mt_forwarded_call(CoreObject *o, char* number)\r
-{\r
- TcorePlugin *plugin = NULL;\r
- CallObject *co = NULL;\r
- int id = 0;\r
- dbg("Entry");\r
-\r
- // Parent plugin\r
- plugin = tcore_object_ref_plugin(o);\r
-\r
- // Call Core object\r
- co = tcore_call_object_find_by_number(o, number);\r
- if (!co) {\r
- err("Failed to find Call Core object!");\r
- return;\r
- }\r
-\r
- // Call ID\r
- id = tcore_call_object_get_id(co);\r
-\r
- // Send notification to TAPI\r
- tcore_server_send_notification(tcore_plugin_ref_server(plugin),\r
- tcore_plugin_ref_core_object(plugin, "call"),\r
- TNOTI_CALL_INFO_FORWARDED_CALL,\r
- sizeof(unsigned int),\r
- (void*)&id);\r
-\r
- dbg("Exit");\r
- return;\r
-}\r
-\r
-static void s_call_info_mt_deflected_call(CoreObject *o, char* number)\r
-{\r
- TcorePlugin *plugin = NULL;\r
- CallObject *co = NULL;\r
- int id = 0;\r
- dbg("Entry");\r
-\r
- // Parent plugin\r
- plugin = tcore_object_ref_plugin(o);\r
-\r
- // Call Core object\r
- co = tcore_call_object_find_by_number(o, number);\r
- if (!co) {\r
- err("Failed to find Call Core object!");\r
- return;\r
- }\r
-\r
- // Call ID\r
- id = tcore_call_object_get_id(co);\r
-\r
- // Send notification to TAPI\r
- tcore_server_send_notification(tcore_plugin_ref_server(plugin),\r
- tcore_plugin_ref_core_object(plugin, "call"),\r
- TNOTI_CALL_INFO_DEFLECTED_CALL,\r
- sizeof(unsigned int),\r
- (void*)&id);\r
-\r
- dbg("Exit");\r
- return;\r
-}\r
-\r
-static void s_call_info_mt_transfered(CoreObject *o, char* number)\r
-{\r
- TcorePlugin *plugin = NULL;\r
- CallObject *co = NULL;\r
- int id = 0;\r
- dbg("Entry");\r
-\r
- // Parent plugin\r
- plugin = tcore_object_ref_plugin(o);\r
-\r
- // Call Core object\r
- co = tcore_call_object_find_by_number(o, number);\r
- if (!co) {\r
- err("Failed to find Call Core object!");\r
- return;\r
- }\r
-\r
- // Call ID\r
- id = tcore_call_object_get_id(co);\r
-\r
- // Send notification to TAPI\r
- tcore_server_send_notification(tcore_plugin_ref_server(plugin),\r
- tcore_plugin_ref_core_object(plugin, "call"),\r
- TNOTI_CALL_INFO_TRANSFERED_CALL,\r
- sizeof(unsigned int),\r
- (void*)&id);\r
-\r
- dbg("Exit");\r
- return;\r
-}\r
-\r
-static void s_call_info_held(CoreObject *o, char* number)\r
-{\r
- TcorePlugin *plugin = NULL;\r
- CallObject *co = NULL;\r
- int id = 0;\r
- dbg("Entry");\r
-\r
- // Parent plugin\r
- plugin = tcore_object_ref_plugin(o);\r
-\r
- // Call Core object\r
- co = tcore_call_object_find_by_number(o, number);\r
- if (!co) {\r
- err("Failed to find Call Core object!");\r
- return;\r
- }\r
-\r
- // Call ID\r
- id = tcore_call_object_get_id(co);\r
-\r
- // Send notification to TAPI\r
- tcore_server_send_notification(tcore_plugin_ref_server(plugin),\r
- tcore_plugin_ref_core_object(plugin, "call"),\r
- TNOTI_CALL_INFO_HELD,\r
- sizeof(unsigned int),\r
- (void*)&id);\r
-\r
- dbg("Exit");\r
- return;\r
-}\r
-\r
-static void s_call_info_active(CoreObject *o, char* number)\r
-{\r
- TcorePlugin *plugin = NULL;\r
- CallObject *co = NULL;\r
- int id = 0;\r
- dbg("Entry");\r
-\r
- // Parent plugin\r
- plugin = tcore_object_ref_plugin(o);\r
-\r
- // Call Core object\r
- co = tcore_call_object_find_by_number(o, number);\r
- if (!co) {\r
- err("Failed to find Call Core object!");\r
- return;\r
- }\r
-\r
- // Call ID\r
- id = tcore_call_object_get_id(co);\r
-\r
- // Send notification to TAPI\r
- tcore_server_send_notification(tcore_plugin_ref_server(plugin),\r
- tcore_plugin_ref_core_object(plugin, "call"),\r
- TNOTI_CALL_INFO_ACTIVE,\r
- sizeof(unsigned int),\r
- (void*)&id);\r
-\r
- dbg("Exit");\r
- return;\r
-}\r
-\r
-static void s_call_info_joined(CoreObject *o, char* number)\r
-{\r
- TcorePlugin *plugin = NULL;\r
- CallObject *co = NULL;\r
- int id = 0;\r
- dbg("Entry");\r
-\r
- //Parent plugin\r
- plugin = tcore_object_ref_plugin(o);\r
-\r
- //Call Core object\r
- co = tcore_call_object_find_by_number(o, number);\r
- if (!co) {\r
- err("Failed to find Call Core object!");\r
- return;\r
- }\r
-\r
- // Call ID\r
- id = tcore_call_object_get_id(co);\r
-\r
- // Send notification to TAPI\r
- tcore_server_send_notification(tcore_plugin_ref_server(plugin),\r
- tcore_plugin_ref_core_object(plugin, "call"),\r
- TNOTI_CALL_INFO_JOINED,\r
- sizeof(unsigned int),\r
- (void*)&id);\r
-\r
- dbg("Exit");\r
- return;\r
-}\r
-\r
-static void s_call_info_released_on_hold(CoreObject *o, char* number)\r
-{\r
- TcorePlugin *plugin = NULL;\r
- CallObject *co = NULL;\r
- int id = 0;\r
- dbg("Entry");\r
-\r
- // Parent plugin\r
- plugin = tcore_object_ref_plugin(o);\r
-\r
- // Call Core object\r
- co = tcore_call_object_find_by_number(o, number);\r
- if (!co) {\r
- err("Failed to find Call Core object!");\r
- return;\r
- }\r
-\r
- // Call ID\r
- id = tcore_call_object_get_id(co);\r
-\r
- // Send notification to TAPI\r
- tcore_server_send_notification(tcore_plugin_ref_server(plugin),\r
- tcore_plugin_ref_core_object(plugin, "call"),\r
- TNOTI_CALL_INFO_RELEASED_ON_HOLD,\r
- sizeof(unsigned int),\r
- (void*)&id);\r
-\r
- dbg("Exit");\r
- return;\r
-}\r
-\r
-static void s_call_info_transfer_alert(CoreObject *o, char* number)\r
-{\r
- TcorePlugin *plugin = NULL;\r
- CallObject *co = NULL;\r
- int id = 0;\r
- dbg("Entry");\r
-\r
- //Parent plugin\r
- plugin = tcore_object_ref_plugin(o);\r
-\r
- // Call Core object\r
- co = tcore_call_object_find_by_number(o, number);\r
- if (!co) {\r
- err("Failed to find Call Core object!");\r
- return;\r
- }\r
-\r
- // Call ID\r
- id = tcore_call_object_get_id(co);\r
-\r
- //Send notification to TAPI\r
- tcore_server_send_notification(tcore_plugin_ref_server(plugin),\r
- tcore_plugin_ref_core_object(plugin, "call"),\r
- TNOTI_CALL_INFO_TRANSFER_ALERT,\r
- sizeof(unsigned int),\r
- (void*)&id);\r
-\r
- dbg("Exit");\r
- return;\r
-}\r
-\r
-static void s_call_info_transfered(CoreObject *o, char* number)\r
-{\r
- TcorePlugin *plugin = NULL;\r
- CallObject *co = NULL;\r
- int id = 0;\r
- dbg("Entry");\r
-\r
- // Parent plugin\r
- plugin = tcore_object_ref_plugin(o);\r
-\r
- // Call Core object\r
- co = tcore_call_object_find_by_number(o, number);\r
- if (!co) {\r
- err("Failed to find Call Core object!");\r
- return;\r
- }\r
-\r
- // Call ID\r
- id = tcore_call_object_get_id(co);\r
-\r
- // Send notification to TAPI\r
- tcore_server_send_notification(tcore_plugin_ref_server(plugin),\r
- tcore_plugin_ref_core_object(plugin, "call"),\r
- TNOTI_CALL_INFO_TRANSFERED,\r
- sizeof(unsigned int),\r
- (void*)&id);\r
-\r
- dbg("Exit");\r
- return;\r
-}\r
-\r
-static void s_call_info_cf_check_message(CoreObject *o, char* number)\r
-{\r
- TcorePlugin *plugin = NULL;\r
- CallObject *co = NULL;\r
- int id = 0;\r
- dbg("Entry");\r
-\r
- // Parent plugin\r
- plugin = tcore_object_ref_plugin(o);\r
-\r
- // Call Core object\r
- co = tcore_call_object_find_by_number(o, number);\r
- if (!co) {\r
- err("Failed to find Call Core object!");\r
- return;\r
- }\r
-\r
- // Call ID\r
- id = tcore_call_object_get_id(co);\r
-\r
- // Send notification to TAPI\r
- tcore_server_send_notification(tcore_plugin_ref_server(plugin),\r
- tcore_plugin_ref_core_object(plugin, "call"),\r
- TNOTI_CALL_INFO_CF_CHECK_MESSAGE,\r
- sizeof(unsigned int),\r
- (void*)&id);\r
-\r
- dbg("Exit");\r
- return;\r
-}\r
-\r
-// Call Information Operations\r
-static struct tcore_call_information_operations call_information_ops = {\r
- .mo_call_col = 0,\r
- .mo_call_waiting = s_call_info_mo_waiting,\r
- .mo_call_cug = 0,\r
- .mo_call_forwarded = s_call_info_mo_forwarded,\r
- .mo_call_barred_incoming = s_call_info_mo_barred_incoming,\r
- .mo_call_barred_outgoing = s_call_info_mo_barred_outgoing,\r
- .mo_call_deflected = s_call_info_mo_deflected,\r
- .mo_call_clir_suppression_reject = s_call_info_mo_clir_suppression_reject,\r
- .mo_call_cfu = s_call_info_mo_cfu,\r
- .mo_call_cfc = s_call_info_mo_cfc,\r
- .mt_call_cli = s_call_info_mt_cli,\r
- .mt_call_cna = s_call_info_mt_cna,\r
- .mt_call_forwarded_call = s_call_info_mt_forwarded_call,\r
- .mt_call_cug_call = 0,\r
- .mt_call_deflected_call = s_call_info_mt_deflected_call,\r
- .mt_call_transfered = s_call_info_mt_transfered,\r
- .call_held = s_call_info_held,\r
- .call_active = s_call_info_active,\r
- .call_joined = s_call_info_joined,\r
- .call_released_on_hold = s_call_info_released_on_hold,\r
- .call_transfer_alert = s_call_info_transfer_alert,\r
- .call_transfered = s_call_info_transfered,\r
- .call_cf_check_message = s_call_info_cf_check_message,\r
-};\r
-\r
-gboolean s_call_init(TcorePlugin *p, TcoreHal *h)\r
-{\r
- CoreObject *o = NULL;\r
- struct property_call_info *data = NULL;\r
- dbg("Entry");\r
-\r
- //Creating Call COre object\r
- o = tcore_call_new(p, "call", &call_ops, h);\r
- if (!o) {\r
- err("Failed to create Call Core Object");\r
- return FALSE;\r
- }\r
-\r
- //Set Call Operations\r
- tcore_call_information_set_operations(o, &call_information_ops);\r
-\r
- // Add Callbacks\r
- tcore_object_add_callback(o, "+XCALLSTAT", on_notification_call_info, NULL);\r
- tcore_object_add_callback(o, "+CLIP", on_notification_call_clip_info, NULL);\r
-\r
- // User Data\r
- data = calloc(sizeof(struct property_call_info *), 1);\r
- tcore_plugin_link_property(p, "CALL", data);\r
-\r
- dbg("Exit");\r
- return TRUE;\r
-}\r
-\r
-void s_call_exit(TcorePlugin *p)\r
-{\r
- CoreObject *o = NULL;\r
- struct property_network_info *data = NULL;\r
- dbg("Entry");\r
-\r
- o = tcore_plugin_ref_core_object(p, "call");\r
-\r
- // Free Call Core Object */\r
- tcore_call_free(o);\r
-\r
- // Free 'CALL' property */\r
- data = tcore_plugin_ref_property(p, "CALL");\r
- if (data) {\r
- g_free(data);\r
- }\r
-\r
- dbg("Exit");\r
- return;\r
-}\r
+ dbg("num after removing quotes - %s", num);
+
+ p_call->info.num_len = strlen(resp);
+ dbg("num_len : [0x%x]\n", p_call->info.num_len);
+
+ // parse <num type>
+ resp = g_slist_nth_data(tokens, 6);
+ if (!resp) {
+ dbg("InValid Num type");
+ goto ERROR;
+ }
+ p_call->info.num_type = atoi(resp);
+ dbg("BCD num type: [0x%x]\n", p_call->info.num_type);
+
+ // check number is international or national.
+ num_type = ((p_call->info.num_type) >> 4) & 0x07;
+ dbg("called party's type of number : [0x%x]\n", num_type);
+
+ if (num_type == 1 && num[0] != '+') {
+ // international number
+ p_call->number[0] = '+';
+ memcpy(&(p_call->number[1]), num, strlen(num));
+ } else {
+ memcpy(&(p_call->number), num, strlen(num));
+ }
+ dbg("incoming number - %s", p_call->number);
+
+ g_free(num);
+ num = NULL;
+ // Free tokens
+ tcore_at_tok_free(tokens);
+
+ dbg("Exit");
+ return 0;
+
+ERROR:
+ err("Invalid CLCC line");
+
+ if (num) {
+ g_free(num);
+ num = NULL;
+ }
+
+ // Free tokens
+ tcore_at_tok_free(tokens);
+ err("Exit");
+ return -1;
+}
+
+// NOTIFICATION
+static void on_notification_call_waiting(CoreObject *o, const void *data, void *user_data)
+{
+ GSList *tokens = NULL;
+ const char *line = NULL;
+ char *pId;
+ int call_id;
+ gboolean *eflag;
+ GSList *pList = NULL;
+ CallObject *co = NULL, *dupco = NULL;
+
+ dbg("function entrance");
+ // check call with waiting status already exist
+ pList = tcore_call_object_find_by_status(o, TCORE_CALL_STATUS_WAITING);
+
+ if (pList != NULL) {
+ dbg("[error]Waiting call already exist. skip");
+ return;
+ }
+ // check call with incoming status already exist
+ pList = tcore_call_object_find_by_status(o, TCORE_CALL_STATUS_INCOMING);
+
+ if (pList != NULL) {
+ dbg("[error]incoming call already exist. skip");
+ return;
+ }
+ line = (char *) data;
+ tokens = tcore_at_tok_new(line);
+
+ pId = g_slist_nth_data(tokens, 0);
+ if (!pId) {
+ dbg("[error]:Call id is missing from +XCALLSTAT indication");
+ return;
+ }
+
+ call_id = atoi(pId);
+ dupco = tcore_call_object_find_by_id(o, call_id);
+ if (dupco != NULL) {
+ dbg("co with same id already exist. skip");
+ return;
+ }
+ co = tcore_call_object_new(o, call_id);
+ if (!co) {
+ dbg("[ error ] co is NULL");
+ return;
+ }
+
+ tcore_at_tok_free(tokens);
+
+ eflag = g_new0(gboolean, 1);
+ *eflag = TRUE;
+ dbg("calling _call_list_get");
+ _call_list_get(o, eflag);
+}
+
+static void on_notification_call_incoming(CoreObject *o, const void *data, void *user_data)
+{
+ GSList *tokens = NULL;
+ const char *line = NULL;
+ char *pId;
+ int call_id;
+ gboolean *eflag;
+ GSList *pList = NULL;
+ CallObject *co = NULL, *dupco = NULL;
+
+ dbg("function entrance");
+ // check call with incoming status already exist
+ pList = tcore_call_object_find_by_status(o, TCORE_CALL_STATUS_INCOMING);
+
+ if (pList != NULL) {
+ dbg("incoming call already exist. skip");
+ return;
+ }
+
+ line = (char *) data;
+ tokens = tcore_at_tok_new(line);
+
+ pId = g_slist_nth_data(tokens, 0);
+ if (!pId) {
+ dbg("Error:Call id is missing from %XCALLSTAT indication");
+ return;
+ }
+
+ call_id = atoi(pId);
+
+ dupco = tcore_call_object_find_by_id(o, call_id);
+ if (dupco != NULL) {
+ dbg("co with same id already exist. skip");
+ return;
+ }
+
+ co = tcore_call_object_new(o, call_id);
+ if (!co) {
+ dbg("[ error ] co is NULL");
+ return;
+ }
+
+ dbg("freeing at token")
+ tcore_at_tok_free(tokens);
+
+ eflag = g_new0(gboolean, 1);
+ *eflag = TRUE;
+
+ dbg("calling _call_list_get");
+ _call_list_get(o, eflag);
+}
+
+static void on_notification_call_status(CoreObject *o, const void *data, void *user_data)
+{
+ char *cmd = NULL;
+ TcorePlugin *plugin = NULL;
+ CallObject *co = NULL;
+ int id = -1;
+ int status = 0;
+ int type = 0;
+ char *stat = NULL;
+ char *pCallId = NULL;
+ GSList *tokens = NULL;
+ gboolean *eflag = NULL;
+ enum tcore_call_status co_status;
+
+ dbg("function entrance");
+ plugin = tcore_object_ref_plugin(o);
+ cmd = (char *) data;
+ tokens = tcore_at_tok_new(cmd);
+
+ // parse <Call Id>
+ pCallId = g_slist_nth_data(tokens, 0);
+ if (!pCallId) {
+ dbg("pCallId is missing from %XCALLSTAT indiaction");
+ } else {
+ id = atoi(pCallId);
+ dbg("call id = %d", id);
+ // parse <Stat>
+ if ((stat = g_slist_nth_data(tokens, 1))) {
+ status = atoi(stat);
+ }
+ dbg("call status = %d", status);
+ }
+
+ tcore_at_tok_free(tokens);
+ co_status = _call_status(status);
+
+ dbg("co_status = %d", co_status);
+ switch (co_status) {
+ case CALL_STATUS_ACTIVE:
+ {
+ dbg("call(%d) status : [ ACTIVE ]", id);
+ co = tcore_call_object_find_by_id(o, id);
+ if (!co) {
+ dbg("co is NULL");
+ return;
+ }
+ _call_status_active(plugin, co);
+ }
+ break;
+
+ case CALL_STATUS_HELD:
+ dbg("call(%d) status : [ held ]", id);
+ break;
+
+ case CALL_STATUS_DIALING:
+ {
+ dbg("call(%d) status : [ dialing ]", id);
+ co = tcore_call_object_find_by_id(o, id);
+ if (!co) {
+ co = tcore_call_object_new(o, id);
+ if (!co) {
+ dbg("error : tcore_call_object_new [ id : %d ]", id);
+ return;
+ }
+ }
+
+ tcore_call_object_set_type(co, call_type(type));
+ tcore_call_object_set_direction(co, TCORE_CALL_DIRECTION_OUTGOING);
+ _call_status_dialing(plugin, co);
+ }
+ break;
+
+ case CALL_STATUS_ALERT:
+ {
+ dbg("call(%d) status : [ alert ]", id);
+ co = tcore_call_object_find_by_id(o, id);
+ if (!co) {
+ dbg("co is NULL");
+ return;
+ }
+ // Store dialed number information into Call object.
+ eflag = g_new0(gboolean, 1);
+ *eflag = TRUE;
+ dbg("calling _call_list_get");
+ _call_list_get(o, eflag);
+ }
+ break;
+
+ case CALL_STATUS_INCOMING:
+ case CALL_STATUS_WAITING:
+ dbg("call(%d) status : [ incoming ]", id);
+ break;
+
+ case CALL_STATUS_IDLE:
+ {
+ dbg("call(%d) status : [ release ]", id);
+
+ co = tcore_call_object_find_by_id(o, id);
+ if (!co) {
+ dbg("co is NULL");
+ return;
+ }
+
+ plugin = tcore_object_ref_plugin(o);
+ if (!plugin) {
+ dbg("plugin is NULL");
+ return;
+ }
+ _call_status_idle(plugin, co);
+ }
+ break;
+
+ default:
+ dbg("invalid call status", id);
+ break;
+ }
+}
+
+static TReturn s_call_outgoing(CoreObject *o, UserRequest *ur)
+{
+ struct treq_call_dial *data = 0;
+ char *raw_str = NULL;
+ char *cmd_str = NULL;
+ const char *cclir;
+ enum tcore_call_cli_mode clir = CALL_CLI_MODE_DEFAULT;
+ TcorePending *pending = NULL;
+ TcoreATRequest *req;
+ gboolean ret = FALSE;
+
+ dbg("function entrance");
+ data = (struct treq_call_dial *) tcore_user_request_ref_data(ur, 0);
+ clir = _get_clir_status(data->number);
+
+ // Compose ATD Cmd string
+ switch (clir) {
+ case TCORE_CALL_CLI_MODE_PRESENT:
+ dbg("CALL_CLI_MODE_PRESENT");
+ cclir = "I";
+ break; // invocation
+
+ case TCORE_CALL_CLI_MODE_RESTRICT:
+ dbg("CALL_CLI_MODE_RESTRICT");
+ cclir = "i";
+ break; // suppression
+
+ case TCORE_CALL_CLI_MODE_DEFAULT:
+ default:
+ cclir = "";
+ dbg("CALL_CLI_MODE_DEFAULT");
+ break; // subscription default
+ }
+
+ dbg("data->number = %s", data->number);
+
+ raw_str = g_strdup_printf("ATD%s%s;", data->number, cclir);
+ cmd_str = g_strdup_printf("%s", raw_str);
+
+ dbg("request command : %s", cmd_str);
+
+ pending = tcore_pending_new(o, 0);
+ req = tcore_at_request_new(cmd_str, NULL, TCORE_AT_NO_RESULT);
+ dbg("cmd : %s, prefix(if any) :%s, cmd_len : %d", req->cmd, req->prefix, strlen(req->cmd));
+
+ tcore_pending_set_request_data(pending, 0, req);
+ ret = _call_request_message(pending, o, ur, on_confirmation_call_outgoing, NULL);
+
+ g_free(raw_str);
+ g_free(cmd_str);
+
+ if (!ret) {
+ dbg("AT request(%s) sent failed", req->cmd);
+ return TCORE_RETURN_FAILURE;
+ }
+
+ dbg("AT request(%s) sent success", req->cmd);
+
+ return TCORE_RETURN_SUCCESS;
+}
+
+static TReturn s_call_answer(CoreObject *o, UserRequest *ur)
+{
+ char *cmd_str = NULL;
+ CallObject *co = NULL;
+ struct treq_call_answer *data = 0;
+ TcorePending *pending = NULL;
+ TcoreATRequest *req;
+ gboolean ret = FALSE;
+
+ dbg("function entrance");
+
+ data = (struct treq_call_answer *) tcore_user_request_ref_data(ur, 0);
+ co = tcore_call_object_find_by_id(o, data->id);
+ if (data->type == CALL_ANSWER_TYPE_ACCEPT) {
+ dbg(" request type CALL_ANSWER_TYPE_ACCEPT");
+
+ cmd_str = g_strdup_printf("%s", "ATA");
+ pending = tcore_pending_new(o, 0);
+ req = tcore_at_request_new(cmd_str, NULL, TCORE_AT_NO_RESULT);
+ dbg("cmd : %s, prefix(if any) :%s, cmd_len : %d", req->cmd, req->prefix, strlen(req->cmd));
+
+ tcore_pending_set_request_data(pending, 0, req);
+ ret = _call_request_message(pending, o, ur, on_confirmation_call_accept, co);
+ g_free(cmd_str);
+
+ if (!ret) {
+ dbg("AT request(%s) sent failed", req->cmd);
+ return TCORE_RETURN_FAILURE;
+ }
+ } else {
+ switch (data->type) {
+ case CALL_ANSWER_TYPE_REJECT:
+ {
+ dbg("call answer reject");
+ tcore_call_control_answer_reject(o, ur, on_confirmation_call_reject, co);
+ }
+ break;
+
+ case CALL_ANSWER_TYPE_REPLACE:
+ {
+ dbg("call answer replace");
+ tcore_call_control_answer_replace(o, ur, on_confirmation_call_replace, co);
+ }
+ break;
+
+ case CALL_ANSWER_TYPE_HOLD_ACCEPT:
+ {
+ dbg("call answer hold and accept");
+ tcore_call_control_answer_hold_and_accept(o, ur, on_confirmation_call_hold_and_accept, co);
+ }
+ break;
+
+ default:
+ dbg("[ error ] wrong answer type [ %d ]", data->type);
+ return TCORE_RETURN_FAILURE;
+ }
+ }
+
+ return TCORE_RETURN_SUCCESS;
+}
+
+static TReturn s_call_release(CoreObject *o, UserRequest *ur)
+{
+ CallObject *co = NULL;
+ struct treq_call_end *data = 0;
+ UserRequest *ur_dup = NULL;
+ char *chld0_cmd = NULL;
+ char *chld1_cmd = NULL;
+ TcorePending *pending = NULL, *pending1 = NULL;
+ TcoreATRequest *req, *req1;
+ gboolean ret = FALSE;
+
+ dbg("function entrance");
+ data = (struct treq_call_end *) tcore_user_request_ref_data(ur, 0);
+ co = tcore_call_object_find_by_id(o, data->id);
+
+ dbg("type of release call = %d", data->type);
+
+ if (data->type == CALL_END_TYPE_ALL) {
+ // releaseAll do not exist on legacy request. send CHLD=0, CHLD=1 in sequence
+ chld0_cmd = g_strdup("AT+CHLD=0");
+ chld1_cmd = g_strdup("AT+CHLD=1");
+
+ pending = tcore_pending_new(o, 0);
+ req = tcore_at_request_new(chld0_cmd, NULL, TCORE_AT_NO_RESULT);
+
+ dbg("input command is %s", chld0_cmd);
+ dbg("req-cmd : %s, prefix(if any) :%s, cmd_len : %d", req->cmd, req->prefix, strlen(req->cmd));
+
+ tcore_pending_set_request_data(pending, 0, req);
+ ur_dup = tcore_user_request_new(NULL, NULL);
+ ret = _call_request_message(pending, o, ur_dup, on_confirmation_call_endall, NULL);
+ g_free(chld0_cmd);
+
+ if (!ret) {
+ dbg("AT request %s has failed ", req->cmd);
+ return TCORE_RETURN_FAILURE;
+ }
+
+ pending1 = tcore_pending_new(o, 0);
+ req1 = tcore_at_request_new(chld1_cmd, NULL, TCORE_AT_NO_RESULT);
+
+ dbg("input command is %s", chld1_cmd);
+ dbg("req-cmd : %s, prefix(if any) :%s, cmd_len : %d", req1->cmd, req1->prefix, strlen(req1->cmd));
+
+ tcore_pending_set_request_data(pending1, 0, req1);
+ ret = _call_request_message(pending1, o, ur, on_confirmation_call_release_all, co);
+ g_free(chld1_cmd);
+
+ if (!ret) {
+ dbg("AT request %s has failed ", req->cmd);
+ return TCORE_RETURN_FAILURE;
+ }
+ } else {
+ switch (data->type) {
+ case CALL_END_TYPE_DEFAULT:
+ {
+ int id = 0;
+ id = tcore_call_object_get_id(co);
+
+ dbg("call end call id [%d]", id);
+ tcore_call_control_end_specific(o, ur, id, on_confirmation_call_release_specific, co);
+ }
+ break;
+
+ case CALL_END_TYPE_ACTIVE_ALL:
+ {
+ dbg("call end all active");
+ tcore_call_control_end_all_active(o, ur, on_confirmation_call_release_all_active, co);
+ }
+ break;
+
+ case CALL_END_TYPE_HOLD_ALL:
+ {
+ dbg("call end all held");
+ tcore_call_control_end_all_held(o, ur, on_confirmation_call_release_all_held, co);
+ }
+ break;
+
+ default:
+ dbg("[ error ] wrong end type [ %d ]", data->type);
+ return TCORE_RETURN_FAILURE;
+ }
+ }
+
+ return TCORE_RETURN_SUCCESS;
+}
+
+static TReturn s_call_hold(CoreObject *o, UserRequest *ur)
+{
+ struct treq_call_hold *hold = 0;
+ CallObject *co = NULL;
+
+ dbg("function entrance");
+
+ hold = (struct treq_call_hold *) tcore_user_request_ref_data(ur, 0);
+ dbg("call id : [ %d ]", hold->id);
+
+ co = tcore_call_object_find_by_id(o, hold->id);
+ tcore_call_control_hold(o, ur, on_confirmation_call_hold, co);
+
+ return TCORE_RETURN_SUCCESS;
+}
+
+static TReturn s_call_active(CoreObject *o, UserRequest *ur)
+{
+ struct treq_call_active *active = 0;
+ CallObject *co = NULL;
+
+ active = (struct treq_call_active *) tcore_user_request_ref_data(ur, 0);
+ dbg("call id : [ %d ]", active->id);
+
+ co = tcore_call_object_find_by_id(o, active->id);
+ tcore_call_control_active(o, ur, on_confirmation_call_active, co);
+
+ return TCORE_RETURN_SUCCESS;
+}
+
+static TReturn s_call_swap(CoreObject *o, UserRequest *ur)
+{
+ struct treq_call_swap *swap = NULL;
+ CallObject *co = NULL;
+
+ swap = (struct treq_call_swap *) tcore_user_request_ref_data(ur, 0);
+ dbg("call id : [ %d ]", swap->id);
+
+ co = tcore_call_object_find_by_id(o, swap->id);
+ tcore_call_control_swap(o, ur, on_confirmation_call_swap, co);
+
+ return TCORE_RETURN_SUCCESS;
+}
+
+static TReturn s_call_join(CoreObject *o, UserRequest *ur)
+{
+ struct treq_call_join *join = 0;
+ CallObject *co = NULL;
+
+ join = (struct treq_call_join *) tcore_user_request_ref_data(ur, 0);
+ dbg("call id : [ %d ]", join->id);
+
+ co = tcore_call_object_find_by_id(o, join->id);
+ tcore_call_control_join(o, ur, on_confirmation_call_join, co);
+
+ return TCORE_RETURN_SUCCESS;
+}
+
+static TReturn s_call_split(CoreObject *o, UserRequest *ur)
+{
+ struct treq_call_split *split = 0;
+ CallObject *co = NULL;
+
+ split = (struct treq_call_split *) tcore_user_request_ref_data(ur, 0);
+ co = tcore_call_object_find_by_id(o, split->id);
+ dbg("call id : [ %d ]", split->id);
+
+ tcore_call_control_split(o, ur, split->id, on_confirmation_call_split, co);
+
+ return TCORE_RETURN_SUCCESS;
+}
+
+static TReturn s_call_deflect(CoreObject *o, UserRequest *ur)
+{
+ struct treq_call_deflect *deflect = 0;
+ CallObject *co = NULL;
+
+ deflect = (struct treq_call_deflect *) tcore_user_request_ref_data(ur, 0);
+ co = tcore_call_object_find_by_number(o, deflect->number);
+ dbg("deflect number: [ %s ]", deflect->number);
+
+ tcore_call_control_deflect(o, ur, deflect->number, on_confirmation_call_deflect, co);
+
+ return TCORE_RETURN_SUCCESS;
+}
+
+static TReturn s_call_transfer(CoreObject *o, UserRequest *ur)
+{
+ struct treq_call_transfer *transfer = 0;
+ CallObject *co = NULL;
+
+ transfer = (struct treq_call_transfer *) tcore_user_request_ref_data(ur, 0);
+ dbg("call id : [ %d ]", transfer->id);
+
+ co = tcore_call_object_find_by_id(o, transfer->id);
+ tcore_call_control_transfer(o, ur, on_confirmation_call_transfer, co);
+
+ return TCORE_RETURN_SUCCESS;
+}
+
+static TReturn s_call_send_dtmf(CoreObject *o, UserRequest *ur)
+{
+ char *cmd_str = NULL;
+ TcorePending *pending = NULL;
+ TcoreATRequest *req;
+ UserRequest *dup;
+ gboolean ret = FALSE;
+ struct treq_call_dtmf *dtmf = 0;
+ char *dtmfstr = NULL, *tmp_dtmf = NULL;
+ unsigned int dtmf_count;
+
+ dbg("Function enter");
+
+ dup = tcore_user_request_new(NULL, NULL);
+ (void) _set_dtmf_tone_duration(o, dup);
+
+ dtmf = (struct treq_call_dtmf *) tcore_user_request_ref_data(ur, 0);
+ dtmfstr = g_malloc0((MAX_CALL_DTMF_DIGITS_LEN * 2) + 1); // DTMF digits + comma for each dtmf digit.
+
+ if (dtmfstr == NULL) {
+ dbg("Memory allocation failed");
+ return TCORE_RETURN_FAILURE;
+ }
+
+ tmp_dtmf = dtmfstr;
+
+ for (dtmf_count = 0; dtmf_count < strlen(dtmf->digits); dtmf_count++) {
+ *tmp_dtmf = dtmf->digits[dtmf_count];
+ tmp_dtmf++;
+
+ *tmp_dtmf = COMMA;
+ tmp_dtmf++;
+ }
+
+ // last digit is having COMMA , overwrite it with '\0' .
+ *(--tmp_dtmf) = '\0';
+ dbg("Input DTMF string(%s)", dtmfstr);
+
+ // AT+VTS = <d1>,<d2>,<d3>,<d4>,<d5>,<d6>, ..... <d32>
+ cmd_str = g_strdup_printf("AT+VTS=%s", dtmfstr);
+ dbg("request command : %s", cmd_str);
+
+ pending = tcore_pending_new(o, 0);
+ req = tcore_at_request_new(cmd_str, NULL, TCORE_AT_NO_RESULT);
+ dbg("cmd : %s, prefix(if any) :%s, cmd_len : %d", req->cmd, req->prefix, strlen(req->cmd));
+
+ tcore_pending_set_request_data(pending, 0, req);
+ ret = _call_request_message(pending, o, ur, on_confirmation_call_dtmf, NULL);
+ g_free(dtmfstr);
+ g_free(cmd_str);
+
+ if (!ret) {
+ dbg("AT request sent failed")
+ return TCORE_RETURN_FAILURE;
+ }
+
+ return TCORE_RETURN_SUCCESS;
+}
+
+static TReturn s_call_set_sound_path(CoreObject *o, UserRequest *ur)
+{
+ UserRequest *ur_dup = NULL;
+ TcorePending *pending = NULL, *pending1 = NULL;
+ TcoreATRequest *req, *req1;
+ char *cmd_str = NULL, *cmd_str1 = NULL;
+ gboolean ret = FALSE;
+
+ dbg("function entrance");
+
+ // hard coded value for speaker.
+ cmd_str = g_strdup_printf("%s", "AT+XDRV=40,4,3,0,0,0,0,0,1,0,1,0,1"); // source type.
+ cmd_str1 = g_strdup_printf("%s", "AT+XDRV=40,5,2,0,0,0,0,0,1,0,1,0,1"); // destination type
+
+ pending = tcore_pending_new(o, 0);
+ req = tcore_at_request_new(cmd_str, "+XDRV", TCORE_AT_SINGLELINE);
+ dbg("cmd : %s, prefix(if any) :%s, cmd_len : %d", req->cmd, req->prefix, strlen(req->cmd));
+
+ tcore_pending_set_request_data(pending, 0, req);
+ ur_dup = tcore_user_request_ref(ur);
+
+ ret = _call_request_message(pending, o, ur_dup, on_confirmation_call_set_source_sound_path, NULL);
+
+ g_free(cmd_str);
+
+ if (!ret) {
+ dbg("At request(%s) sent failed", req->cmd);
+ return TCORE_RETURN_FAILURE;
+ }
+
+ pending1 = tcore_pending_new(o, 0);
+ req1 = tcore_at_request_new(cmd_str1, "+XDRV", TCORE_AT_SINGLELINE);
+ dbg("input command is %s", cmd_str1);
+ dbg("req-cmd : %s, prefix(if any) :%s, cmd_len : %d", req1->cmd, req1->prefix, strlen(req1->cmd));
+
+ tcore_pending_set_request_data(pending1, 0, req1);
+ ret = _call_request_message(pending1, o, ur, on_confirmation_call_set_destination_sound_path, NULL);
+
+ g_free(cmd_str1);
+
+ if (!ret) {
+ dbg("AT request %s has failed ", req1->cmd);
+ return TCORE_RETURN_FAILURE;
+ }
+
+ return TCORE_RETURN_SUCCESS;
+}
+
+static TReturn s_call_set_sound_volume_level(CoreObject *o, UserRequest *ur)
+{
+ UserRequest *src_ur = NULL;
+ UserRequest *dest_ur = NULL;
+ TcorePending *src_pending = NULL;
+ TcorePending *dest_pending = NULL;
+ TcoreATRequest *src_req = NULL;
+ TcoreATRequest *dest_req = NULL;
+ char *cmd_str = NULL, *volume_level = NULL;
+ gboolean ret = FALSE;
+
+ struct treq_call_sound_set_volume_level *data = NULL;
+ data = (struct treq_call_sound_set_volume_level *) tcore_user_request_ref_data(ur, 0);
+ dbg("Entry");
+ // Hard-coded values for MIC & Speakers
+ // Source volume
+ dbg("Set Source volume");
+
+ cmd_str = g_strdup_printf("%s", "AT+XDRV=40,7,3,88"); // Source type
+ dbg("Request command string: %s", cmd_str);
+
+ // Create new Pending request
+ src_pending = tcore_pending_new(o, 0);
+
+ // Create new AT-Command request
+ src_req = tcore_at_request_new(cmd_str, "+XDRV", TCORE_AT_SINGLELINE);
+ dbg("Command: %s, prefix(if any): %s, Command length: %d", src_req->cmd, src_req->prefix, strlen(src_req->cmd));
+
+ // Free Command string
+ g_free(cmd_str);
+
+ tcore_pending_set_request_data(src_pending, 0, src_req);
+ src_ur = tcore_user_request_ref(ur);
+
+ // Send request
+ ret = _call_request_message(src_pending, o, src_ur, on_confirmation_call_set_source_sound_volume_level, NULL);
+ if (!ret) {
+ err("Failed to send AT-Command request");
+ return TCORE_RETURN_FAILURE;
+ }
+
+ cmd_str = g_strdup_printf("%s", "AT+XDRV=40,7,0,88"); // Destination type
+ dbg("Request command string: %s", cmd_str);
+
+ // Create new Pending request
+ src_pending = tcore_pending_new(o, 0);
+
+ // Create new AT-Command request
+ src_req = tcore_at_request_new(cmd_str, "+XDRV", TCORE_AT_SINGLELINE);
+ dbg("Command: %s, prefix(if any): %s, Command length: %d", src_req->cmd, src_req->prefix, strlen(src_req->cmd));
+
+ // Free Command string
+ g_free(cmd_str);
+
+ tcore_pending_set_request_data(src_pending, 0, src_req);
+
+ src_ur = tcore_user_request_ref(ur);
+
+ // Send request
+ ret = _call_request_message(src_pending, o, src_ur, on_confirmation_call_set_source_sound_volume_level, NULL);
+ if (!ret) {
+ err("Failed to send AT-Command request");
+ return TCORE_RETURN_FAILURE;
+ }
+
+ // Destination volume
+ dbg("Set Source volume");
+
+ cmd_str = g_strdup_printf("%s", "AT+XDRV=40,8,0,88"); // Source type
+ dbg("Request command string: %s", cmd_str);
+
+ // Create new Pending request
+ dest_pending = tcore_pending_new(o, 0);
+
+ // Create new AT-Command request
+ dest_req = tcore_at_request_new(cmd_str, "+XDRV", TCORE_AT_SINGLELINE);
+ dbg("Command: %s, prefix(if any): %s, Command length: %d", dest_req->cmd, dest_req->prefix, strlen(dest_req->cmd));
+
+ // Free Command string
+ g_free(cmd_str);
+
+ tcore_pending_set_request_data(dest_pending, 0, dest_req);
+ dest_ur = tcore_user_request_ref(ur);
+
+ // Send request
+ ret = _call_request_message(dest_pending, o, dest_ur, on_confirmation_call_set_source_sound_volume_level, NULL);
+ if (!ret) {
+ err("Failed to send AT-Command request");
+ return TCORE_RETURN_FAILURE;
+ }
+
+ dbg("Input volume level - %d", data->volume);
+ switch (data->volume) {
+ case CALL_SOUND_MUTE:
+ volume_level = "0";
+ break;
+
+ case CALL_SOUND_VOLUME_LEVEL_1:
+ volume_level = "40";
+ break;
+
+ case CALL_SOUND_VOLUME_LEVEL_2:
+ volume_level = "46";
+ break;
+
+ case CALL_SOUND_VOLUME_LEVEL_3:
+ volume_level = "52";
+ break;
+
+ case CALL_SOUND_VOLUME_LEVEL_4:
+ volume_level = "58";
+ break;
+
+ case CALL_SOUND_VOLUME_LEVEL_5:
+ volume_level = "64";
+ break;
+
+ case CALL_SOUND_VOLUME_LEVEL_6:
+ volume_level = "70";
+ break;
+
+ case CALL_SOUND_VOLUME_LEVEL_7:
+ volume_level = "76";
+ break;
+
+ case CALL_SOUND_VOLUME_LEVEL_8:
+ volume_level = "82";
+ break;
+
+ case CALL_SOUND_VOLUME_LEVEL_9:
+ default:
+ volume_level = "88";
+ break;
+ }
+ cmd_str = g_strdup_printf("%s%s", "AT+XDRV=40,8,2,", volume_level); // Destination type
+ dbg("Request command string: %s", cmd_str);
+
+ // Create new Pending request
+ dest_pending = tcore_pending_new(o, 0);
+
+ // Create new AT-Command request
+ dest_req = tcore_at_request_new(cmd_str, "+XDRV", TCORE_AT_SINGLELINE);
+ dbg("Command: %s, prefix(if any): %s, Command length: %d", dest_req->cmd, dest_req->prefix, strlen(dest_req->cmd));
+
+ // Free Command string
+ g_free(cmd_str);
+
+ tcore_pending_set_request_data(dest_pending, 0, dest_req);
+
+ // Send request
+ ret = _call_request_message(dest_pending, o, ur, on_confirmation_call_set_destination_sound_volume_level, NULL);
+ if (!ret) {
+ err("Failed to send AT-Command request");
+ return TCORE_RETURN_FAILURE;
+ }
+
+ return TCORE_RETURN_SUCCESS;
+}
+
+
+static TReturn s_call_get_sound_volume_level(CoreObject *o, UserRequest *ur)
+{
+ dbg("Entry");
+
+ dbg("Exit");
+ return TCORE_RETURN_SUCCESS;
+}
+
+static TReturn s_call_mute(CoreObject *o, UserRequest *ur)
+{
+ char *cmd_str = NULL;
+ TcorePending *pending = NULL;
+ TcoreATRequest *req = NULL;
+ gboolean ret = FALSE;
+
+ dbg("Entry");
+ cmd_str = g_strdup_printf("%s", "AT+XDRV=40,8,0,0,0");
+
+ dbg("Request command string: %s", cmd_str);
+
+ // Create new Pending request
+ pending = tcore_pending_new(o, 0);
+
+ // Create new AT-Command request
+ req = tcore_at_request_new(cmd_str, "+XDRV", TCORE_AT_SINGLELINE);
+ dbg("Command: %s, prefix(if any): %s, Command length: %d", req->cmd, req->prefix, strlen(req->cmd));
+
+ // Free command string
+ g_free(cmd_str);
+
+ // Set request data (AT command) to Pending request
+ tcore_pending_set_request_data(pending, 0, req);
+
+ // Send request
+ ret = _call_request_message(pending, o, ur, on_confirmation_call_mute, NULL);
+ if (!ret) {
+ err("Failed to send AT-Command request");
+ return TCORE_RETURN_FAILURE;
+ }
+
+ dbg("Exit");
+ return TCORE_RETURN_SUCCESS;
+}
+
+static TReturn s_call_unmute(CoreObject *o, UserRequest *ur)
+{
+ char *cmd_str = NULL;
+ TcorePending *pending = NULL;
+ TcoreATRequest *req = NULL;
+ gboolean ret = FALSE;
+ dbg("Entry");
+
+ cmd_str = g_strdup_printf("%s", "AT+XDRV=40,8,0,0,88");
+ dbg("Request command string: %s", cmd_str);
+
+ // Create new Pending request
+ pending = tcore_pending_new(o, 0);
+
+ // Create new AT-Command request
+ req = tcore_at_request_new(cmd_str, "+XDRV", TCORE_AT_SINGLELINE);
+ dbg("Command: %s, prefix(if any): %s, Command length: %d", req->cmd, req->prefix, strlen(req->cmd));
+
+ // Free command string
+ g_free(cmd_str);
+
+ // Set request data (AT command) to Pending request
+ tcore_pending_set_request_data(pending, 0, req);
+
+ // Send request
+ ret = _call_request_message(pending, o, ur, on_confirmation_call_unmute, NULL);
+ if (!ret) {
+ err("Failed to send AT-Command request");
+ return TCORE_RETURN_FAILURE;
+ }
+
+ dbg("Exit");
+ return TCORE_RETURN_SUCCESS;
+}
+
+
+static TReturn s_call_get_mute_status(CoreObject *o, UserRequest *ur)
+{
+ dbg("Entry");
+
+ dbg("Exit");
+ return TCORE_RETURN_SUCCESS;
+}
+
+static TReturn _set_dtmf_tone_duration(CoreObject *o, UserRequest *ur)
+{
+ char *cmd_str = NULL;
+ TcorePending *pending = NULL;
+ TcoreATRequest *req = NULL;
+ gboolean ret = FALSE;
+ dbg("Entry");
+
+ cmd_str = g_strdup_printf("%s", "AT+VTD=3"); // ~300 mili secs. +VTD= n, where n = (0 - 255) * 1/10 secs.
+ dbg("Request command string: %s", cmd_str);
+
+ // Create new Pending request
+ pending = tcore_pending_new(o, 0);
+
+ // Create new AT-Command request
+ req = tcore_at_request_new(cmd_str, NULL, TCORE_AT_NO_RESULT);
+ dbg("Command: %s, prefix(if any): %s, Command length: %d", req->cmd, req->prefix, strlen(req->cmd));
+
+ // Free command string */
+ g_free(cmd_str);
+
+ // Set request data (AT command) to Pending request
+ tcore_pending_set_request_data(pending, 0, req);
+
+ // Send request
+ ret = _call_request_message(pending, o, ur, _on_confirmation_dtmf_tone_duration, NULL);
+ if (!ret) {
+ err("Failed to send AT-Command request");
+ return TCORE_RETURN_FAILURE;
+ }
+
+ dbg("Exit");
+ return TCORE_RETURN_SUCCESS;
+}
+
+// Call Operations
+static struct tcore_call_operations call_ops = {
+ .dial = s_call_outgoing,
+ .answer = s_call_answer,
+ .end = s_call_release,
+ .hold = s_call_hold,
+ .active = s_call_active,
+ .swap = s_call_swap,
+ .join = s_call_join,
+ .split = s_call_split,
+ .deflect = s_call_deflect,
+ .transfer = s_call_transfer,
+ .send_dtmf = s_call_send_dtmf,
+ .set_sound_path = s_call_set_sound_path,
+ .set_sound_volume_level = s_call_set_sound_volume_level,
+ .get_sound_volume_level = s_call_get_sound_volume_level,
+ .mute = s_call_mute,
+ .unmute = s_call_unmute,
+ .get_mute_status = s_call_get_mute_status,
+ .set_sound_recording = NULL,
+ .set_sound_equalization = NULL,
+ .set_sound_noise_reduction = NULL,
+};
+
+static void s_call_info_mo_waiting(CoreObject *o)
+{
+ TcorePlugin *plugin = NULL;
+ CallObject *co = NULL;
+ int id = 0;
+ dbg("Entry");
+
+ // Parent plugin
+ plugin = tcore_object_ref_plugin(o);
+
+ // Call Core object
+ co = tcore_call_object_current_on_mo_processing(o);
+ if (!co) {
+ err("Failed to find Call Core object!");
+ return;
+ }
+
+ // Call ID
+ id = tcore_call_object_get_id(co);
+
+ // Send notification to TAPI
+ tcore_server_send_notification(tcore_plugin_ref_server(plugin),
+ tcore_plugin_ref_core_object(plugin, "call"),
+ TNOTI_CALL_INFO_WAITING,
+ sizeof(unsigned int),
+ (void *) &id);
+
+ dbg("Exit");
+ return;
+}
+
+static void s_call_info_mo_forwarded(CoreObject *o)
+{
+ TcorePlugin *plugin = NULL;
+ CallObject *co = NULL;
+ int id = 0;
+ dbg("Entry");
+
+ // Parent plugin
+ plugin = tcore_object_ref_plugin(o);
+
+ // Call Core object
+ co = tcore_call_object_current_on_mo_processing(o);
+ if (!co) {
+ err("Failed to find Call Core object!");
+ return;
+ }
+
+ // Call ID
+ id = tcore_call_object_get_id(co);
+
+ // Send notification to TAPI
+ tcore_server_send_notification(tcore_plugin_ref_server(plugin),
+ tcore_plugin_ref_core_object(plugin, "call"),
+ TNOTI_CALL_INFO_FORWARDED,
+ sizeof(unsigned int),
+ (void *) &id);
+
+ dbg("Exit");
+ return;
+}
+
+static void s_call_info_mo_barred_incoming(CoreObject *o)
+{
+ TcorePlugin *plugin = NULL;
+ CallObject *co = NULL;
+ int id = 0;
+ dbg("Entry");
+
+ // Parent plugin
+ plugin = tcore_object_ref_plugin(o);
+
+ // Call Core object
+ co = tcore_call_object_current_on_mo_processing(o);
+ if (!co) {
+ err("Failed to find Call Core object!");
+ return;
+ }
+
+ // Call ID
+ id = tcore_call_object_get_id(co);
+
+ // Send notification to TAPI
+ tcore_server_send_notification(tcore_plugin_ref_server(plugin),
+ tcore_plugin_ref_core_object(plugin, "call"),
+ TNOTI_CALL_INFO_BARRED_INCOMING,
+ sizeof(unsigned int),
+ (void *) &id);
+
+ dbg("Exit");
+ return;
+}
+
+static void s_call_info_mo_barred_outgoing(CoreObject *o)
+{
+ TcorePlugin *plugin = NULL;
+ CallObject *co = NULL;
+ int id = 0;
+ dbg("Entry");
+
+ // Parent plugin
+ plugin = tcore_object_ref_plugin(o);
+
+ // Call Core object
+ co = tcore_call_object_current_on_mo_processing(o);
+ if (!co) {
+ err("Failed to find Call Core object!");
+ return;
+ }
+
+ // Call ID
+ id = tcore_call_object_get_id(co);
+
+ // Send notification to TAPI
+ tcore_server_send_notification(tcore_plugin_ref_server(plugin),
+ tcore_plugin_ref_core_object(plugin, "call"),
+ TNOTI_CALL_INFO_BARRED_OUTGOING,
+ sizeof(unsigned int),
+ (void *) &id);
+
+ dbg("Exit");
+ return;
+}
+
+static void s_call_info_mo_deflected(CoreObject *o)
+{
+ TcorePlugin *plugin = NULL;
+ CallObject *co = NULL;
+ int id = 0;
+ dbg("Entry");
+
+ // Parent plugin
+ plugin = tcore_object_ref_plugin(o);
+
+ // Call Core object
+ co = tcore_call_object_current_on_mo_processing(o);
+ if (!co) {
+ err("Failed to find Call Core object!");
+ return;
+ }
+
+ // Call ID
+ id = tcore_call_object_get_id(co);
+
+ // Send notification to TAPI
+ tcore_server_send_notification(tcore_plugin_ref_server(plugin),
+ tcore_plugin_ref_core_object(plugin, "call"),
+ TNOTI_CALL_INFO_DEFLECTED,
+ sizeof(unsigned int),
+ (void *) &id);
+
+ dbg("Exit");
+ return;
+}
+
+static void s_call_info_mo_clir_suppression_reject(CoreObject *o)
+{
+ TcorePlugin *plugin = NULL;
+ CallObject *co = NULL;
+ int id = 0;
+ dbg("Entry");
+
+ // Parent plugin
+ plugin = tcore_object_ref_plugin(o);
+
+ // Call Core object
+ co = tcore_call_object_current_on_mo_processing(o);
+ if (!co) {
+ err("Failed to find Call Core object!");
+ return;
+ }
+
+ // Call ID
+ id = tcore_call_object_get_id(co);
+
+ // Send notification to TAPI
+ tcore_server_send_notification(tcore_plugin_ref_server(plugin),
+ tcore_plugin_ref_core_object(plugin, "call"),
+ TNOTI_CALL_INFO_CLIR_SUPPRESSION_REJECT,
+ sizeof(unsigned int),
+ (void *) &id);
+
+ dbg("Exit");
+ return;
+}
+
+static void s_call_info_mo_cfu(CoreObject *o)
+{
+ TcorePlugin *plugin = NULL;
+ CallObject *co = NULL;
+ int id = 0;
+ dbg("Entry");
+
+ // Parent plugin
+ plugin = tcore_object_ref_plugin(o);
+
+ // Call Core object
+ co = tcore_call_object_current_on_mo_processing(o);
+ if (!co) {
+ err("Failed to find Call Core object!");
+ return;
+ }
+
+ // Call ID
+ id = tcore_call_object_get_id(co);
+
+ // Send notification to TAPI
+ tcore_server_send_notification(tcore_plugin_ref_server(plugin),
+ tcore_plugin_ref_core_object(plugin, "call"),
+ TNOTI_CALL_INFO_FORWARD_UNCONDITIONAL,
+ sizeof(unsigned int),
+ (void *) &id);
+
+ dbg("Exit");
+ return;
+}
+
+static void s_call_info_mo_cfc(CoreObject *o)
+{
+ TcorePlugin *plugin = NULL;
+ CallObject *co = NULL;
+ int id = 0;
+ dbg("Entry");
+
+ // Parent plugin
+ plugin = tcore_object_ref_plugin(o);
+
+ // Call Core object
+ co = tcore_call_object_current_on_mo_processing(o);
+ if (!co) {
+ err("Failed to find Call Core object!");
+ return;
+ }
+
+ // Call ID
+ id = tcore_call_object_get_id(co);
+
+ // Send notification to TAPI
+ tcore_server_send_notification(tcore_plugin_ref_server(plugin),
+ tcore_plugin_ref_core_object(plugin, "call"),
+ TNOTI_CALL_INFO_FORWARD_CONDITIONAL,
+ sizeof(unsigned int),
+ (void *) &id);
+
+ dbg("Exit");
+ return;
+}
+
+static void s_call_info_mt_cli(CoreObject *o, enum tcore_call_cli_mode mode, char *number)
+{
+ CallObject *co = NULL;
+ dbg("Entry");
+
+ // Call Core object
+ co = tcore_call_object_current_on_mt_processing(o);
+ if (!co) {
+ err("Failed to find Call Core object!");
+ return;
+ }
+
+ // Set CLI information
+ tcore_call_object_set_cli_info(co, mode, number);
+
+ dbg("Exit");
+ return;
+}
+
+static void s_call_info_mt_cna(CoreObject *o, enum tcore_call_cna_mode mode, char *name, int dcs)
+{
+ CallObject *co = NULL;
+ dbg("Entry");
+
+ // Call Core object
+ co = tcore_call_object_current_on_mt_processing(o);
+ if (!co) {
+ err("Failed to find Call Core object!");
+ return;
+ }
+
+ // Set CNA information
+ tcore_call_object_set_cna_info(co, mode, name, dcs);
+
+ dbg("Exit");
+ return;
+}
+
+static void s_call_info_mt_forwarded_call(CoreObject *o, char *number)
+{
+ TcorePlugin *plugin = NULL;
+ CallObject *co = NULL;
+ int id = 0;
+ dbg("Entry");
+
+ // Parent plugin
+ plugin = tcore_object_ref_plugin(o);
+
+ // Call Core object
+ co = tcore_call_object_find_by_number(o, number);
+ if (!co) {
+ err("Failed to find Call Core object!");
+ return;
+ }
+
+ // Call ID
+ id = tcore_call_object_get_id(co);
+
+ // Send notification to TAPI
+ tcore_server_send_notification(tcore_plugin_ref_server(plugin),
+ tcore_plugin_ref_core_object(plugin, "call"),
+ TNOTI_CALL_INFO_FORWARDED_CALL,
+ sizeof(unsigned int),
+ (void *) &id);
+
+ dbg("Exit");
+ return;
+}
+
+static void s_call_info_mt_deflected_call(CoreObject *o, char *number)
+{
+ TcorePlugin *plugin = NULL;
+ CallObject *co = NULL;
+ int id = 0;
+ dbg("Entry");
+
+ // Parent plugin
+ plugin = tcore_object_ref_plugin(o);
+
+ // Call Core object
+ co = tcore_call_object_find_by_number(o, number);
+ if (!co) {
+ err("Failed to find Call Core object!");
+ return;
+ }
+
+ // Call ID
+ id = tcore_call_object_get_id(co);
+
+ // Send notification to TAPI
+ tcore_server_send_notification(tcore_plugin_ref_server(plugin),
+ tcore_plugin_ref_core_object(plugin, "call"),
+ TNOTI_CALL_INFO_DEFLECTED_CALL,
+ sizeof(unsigned int),
+ (void *) &id);
+
+ dbg("Exit");
+ return;
+}
+
+static void s_call_info_mt_transfered(CoreObject *o, char *number)
+{
+ TcorePlugin *plugin = NULL;
+ CallObject *co = NULL;
+ int id = 0;
+ dbg("Entry");
+
+ // Parent plugin
+ plugin = tcore_object_ref_plugin(o);
+
+ // Call Core object
+ co = tcore_call_object_find_by_number(o, number);
+ if (!co) {
+ err("Failed to find Call Core object!");
+ return;
+ }
+
+ // Call ID
+ id = tcore_call_object_get_id(co);
+
+ // Send notification to TAPI
+ tcore_server_send_notification(tcore_plugin_ref_server(plugin),
+ tcore_plugin_ref_core_object(plugin, "call"),
+ TNOTI_CALL_INFO_TRANSFERED_CALL,
+ sizeof(unsigned int),
+ (void *) &id);
+
+ dbg("Exit");
+ return;
+}
+
+static void s_call_info_held(CoreObject *o, char *number)
+{
+ TcorePlugin *plugin = NULL;
+ CallObject *co = NULL;
+ int id = 0;
+ dbg("Entry");
+
+ // Parent plugin
+ plugin = tcore_object_ref_plugin(o);
+
+ // Call Core object
+ co = tcore_call_object_find_by_number(o, number);
+ if (!co) {
+ err("Failed to find Call Core object!");
+ return;
+ }
+
+ // Call ID
+ id = tcore_call_object_get_id(co);
+
+ // Send notification to TAPI
+ tcore_server_send_notification(tcore_plugin_ref_server(plugin),
+ tcore_plugin_ref_core_object(plugin, "call"),
+ TNOTI_CALL_INFO_HELD,
+ sizeof(unsigned int),
+ (void *) &id);
+
+ dbg("Exit");
+ return;
+}
+
+static void s_call_info_active(CoreObject *o, char *number)
+{
+ TcorePlugin *plugin = NULL;
+ CallObject *co = NULL;
+ int id = 0;
+ dbg("Entry");
+
+ // Parent plugin
+ plugin = tcore_object_ref_plugin(o);
+
+ // Call Core object
+ co = tcore_call_object_find_by_number(o, number);
+ if (!co) {
+ err("Failed to find Call Core object!");
+ return;
+ }
+
+ // Call ID
+ id = tcore_call_object_get_id(co);
+
+ // Send notification to TAPI
+ tcore_server_send_notification(tcore_plugin_ref_server(plugin),
+ tcore_plugin_ref_core_object(plugin, "call"),
+ TNOTI_CALL_INFO_ACTIVE,
+ sizeof(unsigned int),
+ (void *) &id);
+
+ dbg("Exit");
+ return;
+}
+
+static void s_call_info_joined(CoreObject *o, char *number)
+{
+ TcorePlugin *plugin = NULL;
+ CallObject *co = NULL;
+ int id = 0;
+ dbg("Entry");
+
+ // Parent plugin
+ plugin = tcore_object_ref_plugin(o);
+
+ // Call Core object
+ co = tcore_call_object_find_by_number(o, number);
+ if (!co) {
+ err("Failed to find Call Core object!");
+ return;
+ }
+
+ // Call ID
+ id = tcore_call_object_get_id(co);
+
+ // Send notification to TAPI
+ tcore_server_send_notification(tcore_plugin_ref_server(plugin),
+ tcore_plugin_ref_core_object(plugin, "call"),
+ TNOTI_CALL_INFO_JOINED,
+ sizeof(unsigned int),
+ (void *) &id);
+
+ dbg("Exit");
+ return;
+}
+
+static void s_call_info_released_on_hold(CoreObject *o, char *number)
+{
+ TcorePlugin *plugin = NULL;
+ CallObject *co = NULL;
+ int id = 0;
+ dbg("Entry");
+
+ // Parent plugin
+ plugin = tcore_object_ref_plugin(o);
+
+ // Call Core object
+ co = tcore_call_object_find_by_number(o, number);
+ if (!co) {
+ err("Failed to find Call Core object!");
+ return;
+ }
+
+ // Call ID
+ id = tcore_call_object_get_id(co);
+
+ // Send notification to TAPI
+ tcore_server_send_notification(tcore_plugin_ref_server(plugin),
+ tcore_plugin_ref_core_object(plugin, "call"),
+ TNOTI_CALL_INFO_RELEASED_ON_HOLD,
+ sizeof(unsigned int),
+ (void *) &id);
+
+ dbg("Exit");
+ return;
+}
+
+static void s_call_info_transfer_alert(CoreObject *o, char *number)
+{
+ TcorePlugin *plugin = NULL;
+ CallObject *co = NULL;
+ int id = 0;
+ dbg("Entry");
+
+ // Parent plugin
+ plugin = tcore_object_ref_plugin(o);
+
+ // Call Core object
+ co = tcore_call_object_find_by_number(o, number);
+ if (!co) {
+ err("Failed to find Call Core object!");
+ return;
+ }
+
+ // Call ID
+ id = tcore_call_object_get_id(co);
+
+ // Send notification to TAPI
+ tcore_server_send_notification(tcore_plugin_ref_server(plugin),
+ tcore_plugin_ref_core_object(plugin, "call"),
+ TNOTI_CALL_INFO_TRANSFER_ALERT,
+ sizeof(unsigned int),
+ (void *) &id);
+
+ dbg("Exit");
+ return;
+}
+
+static void s_call_info_transfered(CoreObject *o, char *number)
+{
+ TcorePlugin *plugin = NULL;
+ CallObject *co = NULL;
+ int id = 0;
+ dbg("Entry");
+
+ // Parent plugin
+ plugin = tcore_object_ref_plugin(o);
+
+ // Call Core object
+ co = tcore_call_object_find_by_number(o, number);
+ if (!co) {
+ err("Failed to find Call Core object!");
+ return;
+ }
+
+ // Call ID
+ id = tcore_call_object_get_id(co);
+
+ // Send notification to TAPI
+ tcore_server_send_notification(tcore_plugin_ref_server(plugin),
+ tcore_plugin_ref_core_object(plugin, "call"),
+ TNOTI_CALL_INFO_TRANSFERED,
+ sizeof(unsigned int),
+ (void *) &id);
+
+ dbg("Exit");
+ return;
+}
+
+static void s_call_info_cf_check_message(CoreObject *o, char *number)
+{
+ TcorePlugin *plugin = NULL;
+ CallObject *co = NULL;
+ int id = 0;
+ dbg("Entry");
+
+ // Parent plugin
+ plugin = tcore_object_ref_plugin(o);
+
+ // Call Core object
+ co = tcore_call_object_find_by_number(o, number);
+ if (!co) {
+ err("Failed to find Call Core object!");
+ return;
+ }
+
+ // Call ID
+ id = tcore_call_object_get_id(co);
+
+ // Send notification to TAPI
+ tcore_server_send_notification(tcore_plugin_ref_server(plugin),
+ tcore_plugin_ref_core_object(plugin, "call"),
+ TNOTI_CALL_INFO_CF_CHECK_MESSAGE,
+ sizeof(unsigned int),
+ (void *) &id);
+
+ dbg("Exit");
+ return;
+}
+
+// Call Information Operations
+static struct tcore_call_information_operations call_information_ops = {
+ .mo_call_col = 0,
+ .mo_call_waiting = s_call_info_mo_waiting,
+ .mo_call_cug = 0,
+ .mo_call_forwarded = s_call_info_mo_forwarded,
+ .mo_call_barred_incoming = s_call_info_mo_barred_incoming,
+ .mo_call_barred_outgoing = s_call_info_mo_barred_outgoing,
+ .mo_call_deflected = s_call_info_mo_deflected,
+ .mo_call_clir_suppression_reject = s_call_info_mo_clir_suppression_reject,
+ .mo_call_cfu = s_call_info_mo_cfu,
+ .mo_call_cfc = s_call_info_mo_cfc,
+ .mt_call_cli = s_call_info_mt_cli,
+ .mt_call_cna = s_call_info_mt_cna,
+ .mt_call_forwarded_call = s_call_info_mt_forwarded_call,
+ .mt_call_cug_call = 0,
+ .mt_call_deflected_call = s_call_info_mt_deflected_call,
+ .mt_call_transfered = s_call_info_mt_transfered,
+ .call_held = s_call_info_held,
+ .call_active = s_call_info_active,
+ .call_joined = s_call_info_joined,
+ .call_released_on_hold = s_call_info_released_on_hold,
+ .call_transfer_alert = s_call_info_transfer_alert,
+ .call_transfered = s_call_info_transfered,
+ .call_cf_check_message = s_call_info_cf_check_message,
+};
+
+gboolean s_call_init(TcorePlugin *p, TcoreHal *h)
+{
+ CoreObject *o = NULL;
+ struct property_call_info *data = NULL;
+ dbg("Entry");
+
+ // Creating Call COre object
+ o = tcore_call_new(p, "call", &call_ops, h);
+ if (!o) {
+ err("Failed to create Call Core Object");
+ return FALSE;
+ }
+
+ // Set Call Operations
+ tcore_call_information_set_operations(o, &call_information_ops);
+
+ // Add Callbacks
+ tcore_object_add_callback(o, "+XCALLSTAT", on_notification_call_info, NULL);
+ tcore_object_add_callback(o, "+CLIP", on_notification_call_clip_info, NULL);
+
+ // User Data
+ data = calloc(sizeof(struct property_call_info *), 1);
+ tcore_plugin_link_property(p, "CALL", data);
+
+ dbg("Exit");
+ return TRUE;
+}
+
+void s_call_exit(TcorePlugin *p)
+{
+ CoreObject *o = NULL;
+ struct property_network_info *data = NULL;
+ dbg("Entry");
+
+ o = tcore_plugin_ref_core_object(p, "call");
+
+ // Free Call Core Object */
+ tcore_call_free(o);
+
+ // Free 'CALL' property */
+ data = tcore_plugin_ref_property(p, "CALL");
+ if (data) {
+ g_free(data);
+ }
+
+ dbg("Exit");
+ return;
+}
-/*\r
- * tel-plugin-imc\r
- *\r
- * Copyright (c) 2012 Samsung Electronics Co., Ltd. All rights reserved.\r
- *\r
- * Contact: Ja-young Gu <jygu@samsung.com>\r
- *\r
- * Licensed under the Apache License, Version 2.0 (the "License");\r
- * you may not use this file except in compliance with the License.\r
- * You may obtain a copy of the License at\r
- *\r
- * http://www.apache.org/licenses/LICENSE-2.0\r
- *\r
- * Unless required by applicable law or agreed to in writing, software\r
- * distributed under the License is distributed on an "AS IS" BASIS,\r
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
- * See the License for the specific language governing permissions and\r
- * limitations under the License.\r
- */\r
-\r
-#include <stdio.h>\r
-#include <string.h>\r
-#include <stdlib.h>\r
-\r
-#include <glib.h>\r
-\r
-\r
-#include "s_common.h"\r
-\r
-#include <plugin.h>\r
-\r
-#undef MAX\r
-#define MAX(a, b) (((a) > (b)) ? (a) : (b))\r
-\r
-#undef MIN\r
-#define MIN(a, b) (((a) < (b)) ? (a) : (b))\r
-\r
-#define bitsize(type) (sizeof(type) * 8)\r
-\r
-#define copymask(type) ((0xffffffff) >> (32 - bitsize(type)))\r
-\r
-#define MASK(width, offset, data) \\r
- (((width) == bitsize(data)) ? (data) : \\r
- ((((copymask(data) << (bitsize(data) - ((width) % bitsize(data)))) & copymask(data)) >> (offset)) & (data))) \\r
-\r
-\r
-#define MASK_AND_SHIFT(width, offset, shift, data) \\r
- ((((signed) (shift)) < 0) ? \\r
- MASK((width), (offset), (data)) << -(shift) : \\r
- MASK((width), (offset), (data)) >> (((signed) (shift)))) \\r
-\r
-char _util_unpackb(const char *src, int pos, int len);\r
-char _util_convert_byte_hexChar (char val);\r
-gboolean util_byte_to_hex(const char *byte_pdu, char *hex_pdu, int num_bytes);\r
-\r
-void util_hex_dump(char *pad, int size, const void *data)\r
-{\r
- char buf[255] = {0, };\r
- char hex[4] = {0, };\r
- int i;\r
- unsigned char *p;\r
-\r
- if (size <= 0) {\r
- msg("%sno data", pad);\r
- return;\r
- }\r
-\r
- p = (unsigned char *)data;\r
-\r
- snprintf(buf, 255, "%s%04X: ", pad, 0);\r
- for (i = 0; i<size; i++) {\r
- snprintf(hex, 4, "%02X ", p[i]);\r
- strcat(buf, hex);\r
-\r
- if ((i + 1) % 8 == 0) {\r
- if ((i + 1) % 16 == 0) {\r
- msg("%s", buf);\r
- memset(buf, 0, 255);\r
- snprintf(buf, 255, "%s%04X: ", pad, i + 1);\r
- }\r
- else {\r
- strcat(buf, " ");\r
- }\r
- }\r
- }\r
-\r
- msg("%s", buf);\r
-}\r
-\r
-void hook_hex_dump(enum direction_e d, int size, const void *data)\r
-{\r
- msg("=== TX data DUMP =====");\r
- util_hex_dump(" ", size, data);\r
- msg("=== TX data DUMP =====");\r
-\r
-}\r
-\r
-unsigned int util_assign_message_sequence_id(TcorePlugin *p)\r
-{\r
- struct global_data *gd;\r
-\r
- if (!p) {\r
- dbg("plugin is NULL");\r
- return -1;\r
- }\r
-\r
- gd = tcore_plugin_ref_user_data(p);\r
- if (!gd) {\r
- dbg("global data is NULL");\r
- return -1;\r
- }\r
-\r
- if (gd->msg_auto_id_current == 0) {\r
- gd->msg_auto_id_current = gd->msg_auto_id_start;\r
- dbg("pending_auto_id_current is 0, reset to start");\r
- }\r
- else if (gd->msg_auto_id_current >= gd->msg_auto_id_end) {\r
- gd->msg_auto_id_current = gd->msg_auto_id_start;\r
- dbg("pending_auto_id_current is over, reset to start");\r
- }\r
- else {\r
- gd->msg_auto_id_current++;\r
- }\r
-\r
- dbg("message_sequence_id = %d", gd->msg_auto_id_current);\r
-\r
- return gd->msg_auto_id_current;\r
-}\r
-\r
-gboolean util_add_waiting_job(GQueue *queue, unsigned int id, UserRequest *ur)\r
-{\r
- struct work_queue_data *wqd;\r
-\r
- if (!queue)\r
- return FALSE;\r
-\r
- wqd = calloc(sizeof(struct work_queue_data), 1);\r
- if (!wqd)\r
- return FALSE;\r
-\r
- wqd->id = id;\r
- wqd->ur = tcore_user_request_ref(ur);\r
- g_queue_push_tail(queue, wqd);\r
-\r
- dbg("id = %d, ur = 0x%x", wqd->id, wqd->ur);\r
- return TRUE;\r
-}\r
-\r
-UserRequest *util_pop_waiting_job(GQueue *queue, unsigned int id)\r
-{\r
- int i = 0;\r
- UserRequest *ur;\r
- struct work_queue_data *wqd;\r
-\r
- if (!queue)\r
- return NULL;\r
-\r
-\r
- dbg("before waiting job count: %d", g_queue_get_length(queue));\r
-\r
- do {\r
- wqd = g_queue_peek_nth(queue, i);\r
- if (!wqd)\r
- return NULL;\r
-\r
- if (wqd->id == id) {\r
- wqd = g_queue_pop_nth(queue, i);\r
- break;\r
- }\r
-\r
- i++;\r
- } while (wqd != NULL);\r
-\r
- dbg("after waiting job count: %d", g_queue_get_length(queue));\r
-\r
- if (!wqd)\r
- return NULL;\r
-\r
- ur = wqd->ur;\r
- free(wqd);\r
-\r
- return ur;\r
-}\r
-\r
-unsigned char util_hexCharToInt(char c)\r
-{\r
- if (c >= '0' && c <= '9')\r
- return (c - '0');\r
- else if (c >= 'A' && c <= 'F')\r
- return (c - 'A' + 10);\r
- else if (c >= 'a' && c <= 'f')\r
- return (c - 'a' + 10);\r
- else\r
- {\r
- dbg("invalid charater!!");\r
- return -1;\r
- }\r
-}\r
-\r
-char * util_hexStringToBytes(char * s)\r
-{\r
- char * ret;\r
- int i;\r
- int sz;\r
-\r
- if (s == NULL)\r
- return NULL;\r
-\r
- sz = strlen(s);\r
-\r
- ret = calloc((sz/2)+1, 1);\r
-\r
- dbg("Convert String to Binary!!");\r
-\r
- for (i = 0; i < sz; i += 2)
- {
- ret[i / 2] = (char) ((util_hexCharToInt(s[i]) << 4) | util_hexCharToInt(s[i + 1]));\r
- dbg("[%02x]", ret[i/2]);\r
- }\r
-\r
- return ret;\r
-}\r
-\r
-char _util_unpackb(const char *src, int pos, int len)\r
-{\r
- char result = 0;\r
- int rshift = 0;\r
-\r
- src += pos/8;\r
- pos %= 8;\r
-\r
- rshift = MAX( 8 - (pos + len), 0);\r
-\r
- if ( rshift > 0 ) {\r
-\r
- result = MASK_AND_SHIFT(len, pos, rshift, *src);\r
-\r
- } else {\r
-\r
- result = MASK(8-pos, pos, *src);\r
- src++;\r
- len -= 8 - pos;\r
-\r
- if ( len > 0 ) result = ( result<<len ) | (*src >> (8-len)); // if any bits left\r
- }\r
-\r
- return result;\r
-}\r
-\r
-char _util_convert_byte_hexChar (char val)\r
-{\r
- char hex_char;\r
-\r
- if (val <= 9)\r
- {\r
- hex_char = (char)(val+'0');\r
- }\r
- else if (val >= 10 && val <= 15)\r
- {\r
- hex_char = (char)(val-10+'A');\r
- }\r
- else\r
- {\r
- hex_char = '0';\r
- }\r
-\r
- return (hex_char);\r
-}\r
-\r
-gboolean util_byte_to_hex(const char *byte_pdu, char *hex_pdu, int num_bytes)\r
-{\r
- int i;\r
- char nibble;\r
- int buf_pos = 0;\r
-\r
- for (i=0; i<num_bytes*2; i++)\r
- {\r
- nibble = _util_unpackb(byte_pdu,buf_pos,4);\r
- buf_pos += 4;\r
- hex_pdu[i] = _util_convert_byte_hexChar(nibble);\r
- }\r
-\r
- return TRUE;\r
+/*
+ * tel-plugin-imc
+ *
+ * Copyright (c) 2012 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: Ja-young Gu <jygu@samsung.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+
+#include <glib.h>
+
+
+#include "s_common.h"
+
+#include <plugin.h>
+
+#undef MAX
+#define MAX(a, b) (((a) > (b)) ? (a) : (b))
+
+#undef MIN
+#define MIN(a, b) (((a) < (b)) ? (a) : (b))
+
+#define bitsize(type) (sizeof(type) * 8)
+
+#define copymask(type) ((0xffffffff) >> (32 - bitsize(type)))
+
+#define MASK(width, offset, data) \
+ (((width) == bitsize(data)) ? (data) : \
+ ((((copymask(data) << (bitsize(data) - ((width) % bitsize(data)))) & copymask(data)) >> (offset)) & (data))) \
+
+
+#define MASK_AND_SHIFT(width, offset, shift, data) \
+ ((((signed) (shift)) < 0) ? \
+ MASK((width), (offset), (data)) << -(shift) : \
+ MASK((width), (offset), (data)) >> (((signed) (shift)))) \
+
+char _util_unpackb(const char *src, int pos, int len);
+char _util_convert_byte_hexChar(char val);
+gboolean util_byte_to_hex(const char *byte_pdu, char *hex_pdu, int num_bytes);
+
+void util_hex_dump(char *pad, int size, const void *data)
+{
+ char buf[255] = {0, };
+ char hex[4] = {0, };
+ int i;
+ unsigned char *p;
+
+ if (size <= 0) {
+ msg("%sno data", pad);
+ return;
+ }
+
+ p = (unsigned char *) data;
+
+ snprintf(buf, 255, "%s%04X: ", pad, 0);
+ for (i = 0; i < size; i++) {
+ snprintf(hex, 4, "%02X ", p[i]);
+ strcat(buf, hex);
+
+ if ((i + 1) % 8 == 0) {
+ if ((i + 1) % 16 == 0) {
+ msg("%s", buf);
+ memset(buf, 0, 255);
+ snprintf(buf, 255, "%s%04X: ", pad, i + 1);
+ } else {
+ strcat(buf, " ");
+ }
+ }
+ }
+
+ msg("%s", buf);
+}
+
+void hook_hex_dump(enum direction_e d, int size, const void *data)
+{
+ msg("=== TX data DUMP =====");
+ util_hex_dump(" ", size, data);
+ msg("=== TX data DUMP =====");
+}
+
+unsigned int util_assign_message_sequence_id(TcorePlugin *p)
+{
+ struct global_data *gd;
+
+ if (!p) {
+ dbg("plugin is NULL");
+ return -1;
+ }
+
+ gd = tcore_plugin_ref_user_data(p);
+ if (!gd) {
+ dbg("global data is NULL");
+ return -1;
+ }
+
+ if (gd->msg_auto_id_current == 0) {
+ gd->msg_auto_id_current = gd->msg_auto_id_start;
+ dbg("pending_auto_id_current is 0, reset to start");
+ } else if (gd->msg_auto_id_current >= gd->msg_auto_id_end) {
+ gd->msg_auto_id_current = gd->msg_auto_id_start;
+ dbg("pending_auto_id_current is over, reset to start");
+ } else {
+ gd->msg_auto_id_current++;
+ }
+
+ dbg("message_sequence_id = %d", gd->msg_auto_id_current);
+
+ return gd->msg_auto_id_current;
+}
+
+gboolean util_add_waiting_job(GQueue *queue, unsigned int id, UserRequest *ur)
+{
+ struct work_queue_data *wqd;
+
+ if (!queue)
+ return FALSE;
+
+ wqd = calloc(sizeof(struct work_queue_data), 1);
+ if (!wqd)
+ return FALSE;
+
+ wqd->id = id;
+ wqd->ur = tcore_user_request_ref(ur);
+ g_queue_push_tail(queue, wqd);
+
+ dbg("id = %d, ur = 0x%x", wqd->id, wqd->ur);
+ return TRUE;
+}
+
+UserRequest* util_pop_waiting_job(GQueue *queue, unsigned int id)
+{
+ int i = 0;
+ UserRequest *ur;
+ struct work_queue_data *wqd;
+
+ if (!queue)
+ return NULL;
+
+
+ dbg("before waiting job count: %d", g_queue_get_length(queue));
+
+ do {
+ wqd = g_queue_peek_nth(queue, i);
+ if (!wqd)
+ return NULL;
+
+ if (wqd->id == id) {
+ wqd = g_queue_pop_nth(queue, i);
+ break;
+ }
+
+ i++;
+ } while (wqd != NULL);
+
+ dbg("after waiting job count: %d", g_queue_get_length(queue));
+
+ if (!wqd)
+ return NULL;
+
+ ur = wqd->ur;
+ free(wqd);
+
+ return ur;
+}
+
+unsigned char util_hexCharToInt(char c)
+{
+ if (c >= '0' && c <= '9')
+ return (c - '0');
+ else if (c >= 'A' && c <= 'F')
+ return (c - 'A' + 10);
+ else if (c >= 'a' && c <= 'f')
+ return (c - 'a' + 10);
+ else {
+ dbg("invalid charater!!");
+ return -1;
+ }
+}
+
+char* util_hexStringToBytes(char *s)
+{
+ char *ret;
+ int i;
+ int sz;
+
+ if (s == NULL)
+ return NULL;
+
+ sz = strlen(s);
+
+ ret = calloc((sz / 2) + 1, 1);
+
+ dbg("Convert String to Binary!!");
+
+ for (i = 0; i < sz; i += 2) {
+ ret[i / 2] = (char) ((util_hexCharToInt(s[i]) << 4) | util_hexCharToInt(s[i + 1]));
+ dbg("[%02x]", ret[i / 2]);
+ }
+
+ return ret;
+}
+
+char _util_unpackb(const char *src, int pos, int len)
+{
+ char result = 0;
+ int rshift = 0;
+
+ src += pos / 8;
+ pos %= 8;
+
+ rshift = MAX(8 - (pos + len), 0);
+
+ if (rshift > 0) {
+ result = MASK_AND_SHIFT(len, pos, rshift, *src);
+ } else {
+ result = MASK(8 - pos, pos, *src);
+ src++;
+ len -= 8 - pos;
+
+ if (len > 0) result = (result << len) | (*src >> (8 - len)); // if any bits left
+ }
+
+ return result;
+}
+
+char _util_convert_byte_hexChar(char val)
+{
+ char hex_char;
+
+ if (val <= 9) {
+ hex_char = (char) (val + '0');
+ } else if (val >= 10 && val <= 15) {
+ hex_char = (char) (val - 10 + 'A');
+ } else {
+ hex_char = '0';
+ }
+
+ return (hex_char);
+}
+
+gboolean util_byte_to_hex(const char *byte_pdu, char *hex_pdu, int num_bytes)
+{
+ int i;
+ char nibble;
+ int buf_pos = 0;
+
+ for (i = 0; i < num_bytes * 2; i++) {
+ nibble = _util_unpackb(byte_pdu, buf_pos, 4);
+ buf_pos += 4;
+ hex_pdu[i] = _util_convert_byte_hexChar(nibble);
+ }
+
+ return TRUE;
}
char* util_removeQuotes(void *data)
char *tmp = NULL;
int data_len = 0;
- data_len = strlen((const char*)data);
+ data_len = strlen((const char *) data);
dbg("data_len: %d----%s", data_len, data);
- if(data_len <= 0)
- {
+ if (data_len <= 0) {
return NULL;
- }
- tmp = calloc(1, data_len-1);
- memcpy(tmp, data+1, data_len-2);
+ }
+ tmp = calloc(1, data_len - 1);
+ memcpy(tmp, data + 1, data_len - 2);
dbg("tmp: %s", tmp);
return tmp;
-/*\r
- * tel-plugin-imc\r
- *\r
- * Copyright (c) 2012 Samsung Electronics Co., Ltd. All rights reserved.\r
- *\r
- * Contact: Harish Bishnoi <hbishnoi@samsung.com>\r
- *\r
- * Licensed under the Apache License, Version 2.0 (the "License");\r
- * you may not use this file except in compliance with the License.\r
- * You may obtain a copy of the License at\r
- *\r
- * http://www.apache.org/licenses/LICENSE-2.0\r
- *\r
- * Unless required by applicable law or agreed to in writing, software\r
- * distributed under the License is distributed on an "AS IS" BASIS,\r
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
- * See the License for the specific language governing permissions and\r
- * limitations under the License.\r
- */\r
-\r
-#include <stdio.h>\r
-#include <stdlib.h>\r
-#include <string.h>\r
-#include <unistd.h>\r
-\r
-#include <glib.h>\r
-\r
-#include <tcore.h>\r
-#include <hal.h>\r
-#include <core_object.h>\r
-#include <plugin.h>\r
-#include <queue.h>\r
-#include <co_modem.h>\r
-#include <storage.h>\r
-#include <server.h>\r
-#include <at.h>\r
-#include <mux.h>\r
-\r
-#include "s_common.h"\r
-#include "s_modem.h"\r
-\r
-\r
-#define ID_RESERVED_AT 0x0229\r
-\r
-#define MAX_VERSION_LEN 32\r
-#define TAPI_MISC_ME_SN_LEN_MAX 32\r
-#define TAPI_MISC_PRODUCT_CODE_LEN_MAX 32\r
-#define TAPI_MISC_MODEL_ID_LEN_MAX 17\r
-#define TAPI_MISC_PRL_ERI_VER_LEN_MAX 17\r
-\r
-#define CPAS_RES_READY 0\r
-#define CPAS_RES_UNAVAIL 1\r
-#define CPAS_RES_UNKNOWN 2\r
-#define CPAS_RES_RINGING 3\r
-#define CPAS_RES_CALL_PROGRESS 4\r
-#define CPAS_RES_ASLEEP 5\r
-#define AT_VER_LEN 20\r
-\r
-\r
-enum cp_state {\r
- CP_STATE_OFFLINE,\r
- CP_STATE_CRASH_RESET,\r
- CP_STATE_CRASH_EXIT,\r
- CP_STATE_BOOTING,\r
- CP_STATE_ONLINE,\r
- CP_STATE_NV_REBUILDING,\r
- CP_STATE_LOADER_DONE,\r
-};\r
-\r
-typedef enum {\r
- TAPI_MISC_ME_IMEI = 0x00, /**< 0x00: IMEI, GSM/UMTS device */\r
- TAPI_MISC_ME_ESN = 0x01, /**< 0x01: ESN(Electronic Serial Number), It`s essentially run out. CDMA device */\r
- TAPI_MISC_ME_MEID = 0x02, /**< 0x02: MEID, This value can have hexa decimal digits. CDMA device */\r
- TAPI_MISC_ME_MAX = 0xff /**< 0xff: reserved */\r
-} TelMiscSNIndexType_t;\r
-\r
-typedef struct {\r
- TelMiscSNIndexType_t sn_index; /**< serial number index */\r
- int sn_len; /**< Length */\r
- unsigned char szNumber[TAPI_MISC_ME_SN_LEN_MAX]; /**< Number */\r
-} TelMiscSNInformation;\r
-\r
-/**\r
- * Mobile Equipment Version Information\r
- */\r
-typedef struct {\r
- unsigned char ver_mask; /**< version mask - 0x01:SW_ver, 0x02:HW_ver, 0x04:RF_CAL_date, 0x08:Product_code, 0x10:Model_ID, 0x20:PRL, 0x04:ERI, 0xff:all */\r
- unsigned char szSwVersion[MAX_VERSION_LEN]; /**< Software version, null termination */\r
- unsigned char szHwVersion[MAX_VERSION_LEN]; /**< Hardware version, null termination */\r
- unsigned char szRfCalDate[MAX_VERSION_LEN]; /**< Calculation Date, null termination */\r
- unsigned char szProductCode[TAPI_MISC_PRODUCT_CODE_LEN_MAX]; /**< product code, null termination */\r
- unsigned char szModelId[TAPI_MISC_MODEL_ID_LEN_MAX]; /**< model id (only for CDMA), null termination */\r
- unsigned char prl_nam_num; /**< number of PRL NAM fields */\r
- unsigned char szPrlVersion[TAPI_MISC_PRL_ERI_VER_LEN_MAX * 3];/**< prl version (only for CDMA), null termination */\r
- unsigned char eri_nam_num; /**< number of PRL NAM fields */\r
- unsigned char szEriVersion[TAPI_MISC_PRL_ERI_VER_LEN_MAX * 3];/**< eri version (only for CDMA), null termination */\r
-} TelMiscVersionInformation;\r
-\r
- \r
-void prepare_and_send_pending_request(TcorePlugin *plugin, char *co_name, const char *at_cmd, const char* prefix, enum tcore_at_command_type at_cmd_type, TcorePendingResponseCallback callback);\r
-static void on_confirmation_modem_message_send(TcorePending *p, gboolean result, void *user_data); // from Kernel\r
-void on_response_bootup_subscription(TcorePending *p, int data_len, const void *data, void *user_data);\r
-void on_response_last_bootup_subscription(TcorePending *p, int data_len, const void *data, void *user_data);\r
-static void on_timeout_modem_poweron(TcorePending *p, void *user_data);\r
-static void on_response_enable_proactive_command(TcorePending *p, int data_len, const void *data, void *user_data);\r
-\r
-static void on_timeout_modem_poweron(TcorePending *p, void *user_data)\r
-{\r
- unsigned int data_len = 0;\r
- char data[] = "AT+CPAS"; \r
- dbg("TIMEOUT for 1st AT Command !!!!! NO Response for initial AT command. Resending it"); \r
- data_len = sizeof(data);\r
- \r
- /* Retransmit 1st AT command directly via HAL, don't disturb pending queue. */\r
- /* HAL was passed as user_data, re-use it */\r
- if (user_data) \r
- {\r
- tcore_hal_send_data(user_data, data_len, (void *)data); \r
- }\r
-}\r
-\r
-static void on_confirmation_modem_message_send(TcorePending *p, gboolean result, void *user_data)\r
-{\r
- dbg("on_confirmation_modem_message_send - msg out from queue.\n");\r
-\r
- if (result == FALSE) {\r
- /* Fail */\r
- dbg("SEND FAIL");\r
- }\r
- else {\r
- dbg("SEND OK");\r
- }\r
-}\r
-\r
-static void on_response_enable_proactive_command(TcorePending *p, int data_len, const void *data, void *user_data)\r
-{\r
- const TcoreATResponse *resp = data;\r
- \r
- if(resp->success > 0){\r
- dbg("RESPONSE OK proactive command enabled");\r
- \r
- }\r
- else {\r
- dbg("RESPONSE NOK proactive command disabled");\r
- }\r
-}\r
-\r
-void prepare_and_send_pending_request(TcorePlugin *plugin, char *co_name, const char *at_cmd, const char* prefix, enum tcore_at_command_type at_cmd_type, TcorePendingResponseCallback callback)\r
-{\r
- TcoreATRequest *req = NULL;\r
- TcoreHal *hal = NULL;\r
- CoreObject *o= NULL;\r
- TcorePending *pending = NULL;\r
- TReturn ret;\r
- \r
- o = tcore_plugin_ref_core_object(plugin, co_name);\r
- hal = tcore_object_get_hal(o);\r
- dbg("hal: %p", hal);\r
- \r
- pending = tcore_pending_new(o, 0);\r
- if(!pending)\r
- dbg("Pending is NULL");\r
- req = tcore_at_request_new(at_cmd, prefix, at_cmd_type);\r
-\r
- dbg("cmd : %s, prefix(if any) :%s, cmd_len : %d", req->cmd, req->prefix, strlen(req->cmd));\r
-\r
- tcore_pending_set_request_data(pending, 0, req);\r
- tcore_pending_set_response_callback(pending, callback, NULL);\r
- tcore_pending_set_send_callback(pending, on_confirmation_modem_message_send, NULL);\r
- tcore_pending_link_user_request(pending, NULL); //set user request to NULL - this is intenal request\r
- ret = tcore_hal_send_request(hal, pending);\r
- return;\r
-}\r
-\r
-void on_response_bootup_subscription(TcorePending *p, int data_len, const void *data, void *user_data)\r
-{\r
- const TcoreATResponse *resp = data;\r
- dbg("entry of on_response_bootup_subscription() - response comes\n");\r
-\r
- if(resp->success){\r
- dbg("result OK"); \r
- }\r
- else{\r
- dbg("result ERROR");\r
- }\r
-}\r
-\r
-void on_response_last_bootup_subscription(TcorePending *p, int data_len, const void *data, void *user_data)\r
-{\r
- const TcoreATResponse *resp = data;\r
- dbg("enry of on_response_last_bootup_subscription() - final response comes\n");\r
- if(resp->success){\r
- dbg("SEND OK"); \r
- }\r
- else{\r
- dbg("SEND FAIL");\r
- }\r
- dbg("Response for AT+CLIP. Boot-up configration completed for IMC modem. Bring CP to online based on Flightmode status\n");\r
- on_event_modem_power(NULL, NULL, tcore_pending_ref_plugin(p));\r
-}\r
-\r
-static void on_response_power_off(TcorePending *p, int data_len, const void *data, void *user_data)\r
-{\r
- CoreObject *o = 0;\r
- TcoreHal *h = 0;\r
- o = tcore_pending_ref_core_object(p);\r
- h = tcore_object_get_hal(o);\r
-\r
- dbg("modem power off");\r
-\r
- tcore_hal_set_power_state(h, FALSE);\r
-}\r
-\r
-static void on_response_set_flight_mode(TcorePending *p, int data_len, const void *data, void *user_data)\r
-{\r
- CoreObject *o = NULL;\r
- UserRequest *ur = NULL;\r
- const TcoreATResponse *ATresp = data;\r
- GSList *tokens=NULL;\r
- const char *line = NULL;\r
- struct tresp_modem_set_flightmode res = {0};\r
- int response = 0;\r
- struct tnoti_modem_flight_mode modem_flight_mode = {0};\r
- const struct treq_modem_set_flightmode *req_data = NULL;\r
-\r
- o = tcore_pending_ref_core_object(p);\r
-\r
- if(ATresp->success > 0){\r
- dbg("RESPONSE OK - flight mode operation finished");\r
- res.result = TCORE_RETURN_SUCCESS;\r
- }\r
- else {\r
- dbg("RESPONSE NOK");\r
- line = (const char*)ATresp->final_response;\r
- tokens = tcore_at_tok_new(line);\r
-\r
- if (g_slist_length(tokens) < 1) {\r
- dbg("err cause not specified or string corrupted");\r
- res.result = TCORE_RETURN_3GPP_ERROR;\r
- }\r
- else {\r
- response = atoi(g_slist_nth_data(tokens, 0));\r
- /* TODO: CMEE error mapping is required. */\r
- res.result = TCORE_RETURN_3GPP_ERROR;\r
- }\r
- }\r
-\r
- ur = tcore_pending_ref_user_request(p);\r
- if(NULL == ur){\r
- dbg("No user request. Internal request created during boot-up sequence");\r
- \r
- if(ATresp->success > 0){\r
- modem_flight_mode.enable = tcore_modem_get_flight_mode_state(o);\r
- dbg("sucess case - Sending Flight Mode Notification (%d) to Telephony Server",modem_flight_mode.enable);\r
- \r
- tcore_server_send_notification(tcore_plugin_ref_server(tcore_object_ref_plugin(o)), o, TNOTI_MODEM_FLIGHT_MODE,\r
- sizeof(struct tnoti_modem_flight_mode), &modem_flight_mode);\r
- }\r
- }\r
- else{\r
- dbg("Sending response for Flight mode operation");\r
- tcore_user_request_send_response(ur, TRESP_MODEM_SET_FLIGHTMODE, sizeof(struct tresp_modem_set_flightmode), &res);\r
- \r
- req_data = tcore_user_request_ref_data(ur, NULL);\r
-\r
- if (req_data->enable == 0) {\r
- dbg("Flight mode is disabled, trigger COPS to register on network");\r
- /* Trigger Network registration (for the moment automatic) */\r
- prepare_and_send_pending_request(tcore_object_ref_plugin(o), "modem", "AT+COPS=0", NULL, TCORE_AT_NO_RESULT, NULL);\r
- }\r
- }\r
- \r
- tcore_at_tok_free(tokens);\r
-}\r
-\r
-static void on_response_imei(TcorePending *p, int data_len, const void *data, void *user_data)\r
-{\r
- const TcoreATResponse* resp = data;\r
- TcorePlugin *plugin = NULL;\r
- struct tresp_modem_get_imei res;\r
- TelMiscSNInformation *imei_property = NULL;\r
- UserRequest* ur = NULL;\r
- GSList *tokens=NULL;\r
- const char *line;\r
- int response = 0;\r
-\r
- memset(&res, 0, sizeof(struct tresp_modem_get_imei));\r
-\r
- if(resp->success > 0)\r
- {\r
- dbg("RESPONSE OK");\r
- if(resp->lines) {\r
- line = (const char*)resp->lines->data;\r
- tokens = tcore_at_tok_new(line);\r
- if (g_slist_length(tokens) != 1) {\r
- msg("invalid message");\r
- goto OUT;\r
- }\r
- }\r
- res.result = TCORE_RETURN_SUCCESS;\r
- strncpy(res.imei, g_slist_nth_data(tokens, 0), 16);\r
-\r
- dbg("imei = [%s]", res.imei);\r
-\r
- plugin = tcore_pending_ref_plugin(p);\r
- imei_property = tcore_plugin_ref_property(plugin, "IMEI");\r
- if (imei_property)\r
- {\r
- imei_property->sn_index = TAPI_MISC_ME_IMEI;\r
- imei_property->sn_len = strlen(res.imei);\r
- memcpy(imei_property->szNumber, res.imei, imei_property->sn_len);\r
- }\r
- }\r
- else\r
- {\r
- dbg("RESPONSE NOK");\r
- if(resp->lines) {\r
- line = (const char*)resp->lines->data;\r
- tokens = tcore_at_tok_new(line);\r
- }\r
-\r
- \r
- if (g_slist_length(tokens) < 1) {\r
- dbg("err cause not specified or string corrupted");\r
- res.result = TCORE_RETURN_3GPP_ERROR;\r
- }\r
- else\r
- {\r
- response = atoi(g_slist_nth_data(tokens, 0));\r
- /* TODO: CMEE error mapping is required. */\r
- res.result = TCORE_RETURN_3GPP_ERROR;\r
- }\r
- }\r
-\r
- ur = tcore_pending_ref_user_request(p); \r
- tcore_user_request_send_response(ur, TRESP_MODEM_GET_IMEI, sizeof(struct tresp_modem_get_imei), &res); \r
-\r
-OUT:\r
- if(tokens != NULL)\r
- tcore_at_tok_free(tokens);\r
-\r
- return;\r
-}\r
-\r
-static void on_response_version(TcorePending *p, int data_len, const void *data, void *user_data)\r
-{\r
- const TcoreATResponse *resp = data;\r
- TcorePlugin *plugin = NULL;\r
- struct tresp_modem_get_version res = {0};\r
- TelMiscVersionInformation *vi_property = NULL;\r
- TelMiscVersionInformation *vi = NULL;\r
- UserRequest *ur = NULL;\r
- GSList* tokens = NULL;\r
- const char* line=NULL;\r
- char *swver= NULL;\r
- char *hwver=NULL; \r
- char *caldate=NULL;\r
- char *pcode=NULL;\r
- char *id=NULL;\r
-\r
- int response = 0;\r
-\r
- if(resp->success > 0)\r
- {\r
- dbg("RESPONSE OK");\r
- if(resp->lines) {\r
- line = (const char*)resp->lines->data;\r
- tokens = tcore_at_tok_new(line);\r
- if (g_slist_length(tokens) != 5) {\r
- msg("invalid message");\r
- goto OUT;\r
- }\r
- }\r
-\r
- swver = g_slist_nth_data(tokens, 0);\r
- hwver = g_slist_nth_data(tokens, 1);\r
- caldate = g_slist_nth_data(tokens, 2);\r
- pcode = g_slist_nth_data(tokens, 3);\r
- id = g_slist_nth_data(tokens, 4);\r
-\r
- dbg("version: sw=[%s], hw=[%s], rf_cal=[%s], product_code=[%s], model_id=[%s]", swver, hwver, caldate, pcode, id);\r
-\r
- vi = calloc(sizeof(TelMiscVersionInformation), 1);\r
- if(NULL!=swver)\r
- memcpy(vi->szSwVersion, swver, strlen(swver));\r
- if(NULL!=hwver)\r
- memcpy(vi->szHwVersion, hwver, strlen(hwver));\r
- if(NULL!=caldate)\r
- memcpy(vi->szRfCalDate, caldate, strlen(caldate));\r
- if(NULL!=pcode)\r
- memcpy(vi->szProductCode, pcode,strlen(pcode));\r
- if(NULL!=id)\r
- memcpy(vi->szModelId, id, strlen(id));\r
-\r
- memset(&res, 0, sizeof(struct tresp_modem_get_version));\r
-\r
- if(NULL!=swver) \r
- snprintf(res.software, (AT_VER_LEN >strlen(swver) ?strlen(swver):AT_VER_LEN), "%s", swver);\r
- if(NULL!=hwver)\r
- snprintf(res.hardware, (AT_VER_LEN >strlen(hwver) ?strlen(hwver):AT_VER_LEN), "%s", hwver);\r
-\r
- plugin = tcore_pending_ref_plugin(p);\r
- vi_property = tcore_plugin_ref_property(plugin, "VERSION");\r
- memcpy(vi_property, vi, sizeof(TelMiscVersionInformation));\r
- free(vi);\r
- }\r
- else\r
- {\r
- dbg("RESPONSE NOK");\r
- if(resp->lines) {\r
- line = (const char*)resp->lines->data;\r
- tokens = tcore_at_tok_new(line);\r
- }\r
-\r
- memset(&res, 0, sizeof(struct tresp_modem_get_version));\r
-\r
-\r
- if (g_slist_length(tokens) < 1) {\r
- dbg("err cause not specified or string corrupted");\r
- res.result = TCORE_RETURN_3GPP_ERROR;\r
- }\r
- else\r
- {\r
- response = atoi(g_slist_nth_data(tokens, 0));\r
- /* TODO: CMEE error mapping is required. */\r
- res.result = TCORE_RETURN_3GPP_ERROR;\r
- }\r
- }\r
-\r
- ur = tcore_pending_ref_user_request(p);\r
- tcore_user_request_send_response(ur, TRESP_MODEM_GET_VERSION, sizeof(struct tresp_modem_get_version), &res);\r
-\r
-OUT:\r
- if(tokens != NULL)\r
- tcore_at_tok_free(tokens);\r
-\r
- return; \r
-}\r
-\r
-static gboolean on_event_bootup_sim_status(CoreObject *o, const void *event_info, void *user_data)\r
-{\r
- GSList *tok = NULL;\r
- GSList *lines = NULL;\r
- int value = -1;\r
- char* line = NULL;\r
-\r
- lines = (GSList*)event_info;\r
- if (1 != g_slist_length(lines)) {\r
- dbg("unsolicited msg but multiple line");\r
- goto OUT;\r
- }\r
- line = (char*)(lines->data);\r
- dbg("on_bootup_event_sim_status notification : %s", line);\r
-\r
- tok = tcore_at_tok_new(line);\r
- value = atoi(g_slist_nth_data(tok, 0));\r
-\r
- if(7 == value){\r
- dbg("SIM ready. request COPS & remove callback");\r
- dbg("power on done set for proactive command receiving mode");\r
- prepare_and_send_pending_request(tcore_object_ref_plugin(o), "sat", "AT+CFUN=6", NULL, TCORE_AT_NO_RESULT, on_response_enable_proactive_command);\r
- prepare_and_send_pending_request(tcore_object_ref_plugin(o), "umts_network", "AT+COPS=0", NULL, TCORE_AT_NO_RESULT, on_response_bootup_subscription);\r
- return FALSE;\r
- }\r
-\r
-OUT:\r
- if (tok != NULL)\r
- tcore_at_tok_free(tok);\r
- \r
- return TRUE;\r
-}\r
-\r
-\r
-\r
-gboolean on_event_modem_power(TcoreAT *at, const char *line, TcorePlugin *p)\r
-{\r
- CoreObject *o = NULL;\r
- struct treq_modem_set_flightmode flight_mode_set = {0};\r
- struct tnoti_modem_power modem_power = {0};\r
- TcoreHal *h = NULL;\r
- Storage *strg = NULL; \r
- \r
- o = tcore_plugin_ref_core_object(p, "modem");\r
- \r
- strg = tcore_server_find_storage(tcore_plugin_ref_server(p), "vconf");\r
- flight_mode_set.enable = tcore_storage_get_bool(strg, STORAGE_KEY_SETAPPL_FLIGHT_MODE_BOOL);\r
-\r
- h = tcore_object_get_hal(o);\r
- tcore_hal_set_power_state(h, TRUE);\r
- \r
- /* Set Flight mode as per AP settings */\r
- if (flight_mode_set.enable)\r
- { /* Radio Off */\r
- prepare_and_send_pending_request(p, "modem", "AT+CFUN=4", NULL, TCORE_AT_NO_RESULT, on_response_set_flight_mode);\r
- tcore_modem_set_flight_mode_state(o, TRUE);\r
- }\r
- else\r
- {/* Radio On */\r
- prepare_and_send_pending_request(p, "modem", "AT+CFUN=1", NULL, TCORE_AT_NO_RESULT, on_response_set_flight_mode);\r
- tcore_modem_set_flight_mode_state(o, FALSE);\r
- }\r
- \r
- /* Get IMEI */\r
- prepare_and_send_pending_request(p, "modem", "AT+CGSN", NULL, TCORE_AT_NUMERIC, on_response_imei);\r
-\r
- /* Get Version Number */\r
- prepare_and_send_pending_request(p, "modem", "AT+CGMR", NULL, TCORE_AT_SINGLELINE, on_response_version);\r
- \r
- tcore_modem_set_powered(o, TRUE);\r
-\r
- modem_power.state = MODEM_STATE_ONLINE;\r
-\r
- tcore_server_send_notification(tcore_plugin_ref_server(tcore_object_ref_plugin(o)), o, TNOTI_MODEM_POWER,\r
- sizeof(struct tnoti_modem_power), &modem_power);\r
-\r
- return TRUE;\r
-}\r
-\r
-static void _modem_subscribe_events(TcorePlugin *plugin)\r
-{\r
- dbg("Entry");\r
- \r
- /* XCALLSTAT subscription */\r
- prepare_and_send_pending_request(plugin, "call", "at+xcallstat=1", NULL, TCORE_AT_NO_RESULT, on_response_bootup_subscription);\r
-\r
- /* XSIMSTATE subscription */\r
- prepare_and_send_pending_request(plugin, "sim", "at+xsimstate=1", NULL, TCORE_AT_NO_RESULT, on_response_bootup_subscription);\r
-\r
- prepare_and_send_pending_request(plugin, "umts_sms", "at+xsimstate=1", NULL, TCORE_AT_NO_RESULT, on_response_bootup_subscription);\r
- prepare_and_send_pending_request(plugin, "modem", "at+xsimstate=1", NULL, TCORE_AT_NO_RESULT, on_response_bootup_subscription);\r
-\r
- /* CREG subscription */\r
- prepare_and_send_pending_request(plugin, "umts_network", "at+creg=2", NULL, TCORE_AT_NO_RESULT, on_response_bootup_subscription);\r
-\r
- /* CGREG subscription */\r
- prepare_and_send_pending_request(plugin, "umts_network", "at+cgreg=2", NULL, TCORE_AT_NO_RESULT, on_response_bootup_subscription);\r
-\r
- /* Allow automatic time Zone updation via NITZ */\r
- prepare_and_send_pending_request(plugin, "umts_network", "at+ctzu=1", NULL, TCORE_AT_NO_RESULT, on_response_bootup_subscription);\r
-\r
- /* TZ, time & daylight changing event reporting subscription */\r
- prepare_and_send_pending_request(plugin, "umts_network", "at+ctzr=1", NULL, TCORE_AT_NO_RESULT, on_response_bootup_subscription);\r
- \r
- /* XMER subscription */\r
- prepare_and_send_pending_request(plugin, "umts_network", "at+xmer=1", NULL, TCORE_AT_NO_RESULT, on_response_bootup_subscription);\r
- \r
- /* CGEREP subscription */\r
- prepare_and_send_pending_request(plugin, "umts_ps", "at+cgerep=1", NULL, TCORE_AT_NO_RESULT, on_response_bootup_subscription);\r
-\r
- /* XDATASTAT subscription */\r
- prepare_and_send_pending_request(plugin, "umts_ps", "at+xdatastat=1", NULL, TCORE_AT_NO_RESULT, on_response_bootup_subscription);\r
-\r
- /* CSSN subscription */\r
- prepare_and_send_pending_request(plugin, "call", "at+cssn=1,1", NULL, TCORE_AT_NO_RESULT, on_response_bootup_subscription);\r
-\r
- /* CUSD subscription */\r
- prepare_and_send_pending_request(plugin, "call", "at+cusd=1", NULL, TCORE_AT_NO_RESULT, on_response_bootup_subscription);\r
-\r
- /* XDNS subscription */\r
- prepare_and_send_pending_request(plugin, "umts_ps", "at+xdns=1,1", NULL, TCORE_AT_NO_RESULT, on_response_bootup_subscription);\r
-\r
- /* CLIP subscription */\r
- prepare_and_send_pending_request(plugin, "call", "at+clip=1", NULL, TCORE_AT_NO_RESULT, on_response_bootup_subscription);\r
-\r
- /*CMEE subscription*/\r
- prepare_and_send_pending_request(plugin,"umts_ps","at+cmee=2",NULL,TCORE_AT_NO_RESULT, on_response_bootup_subscription);\r
-\r
- /*incoming sms,cb,status report subscription*/\r
- prepare_and_send_pending_request(plugin,"umts_sms","at+cnmi=1,2,2,1,0",NULL,TCORE_AT_NO_RESULT, on_response_bootup_subscription);\r
-\r
- /* text/pdu mode subscription*/\r
- prepare_and_send_pending_request(plugin,"umts_sms","at+cmgf=0",NULL,TCORE_AT_NO_RESULT, on_response_last_bootup_subscription);\r
-\r
- dbg("Exit");\r
- return;\r
-}\r
-\r
-\r
-static void on_response_setupmux(TcorePending *p, int data_len, const void *data, void *user_data)\r
-{\r
- TcorePlugin *plugin = NULL;\r
- TcoreHal *hal = NULL;\r
- TReturn ret;\r
- dbg("Entry");\r
- \r
- /* IMC Plugin dereferenced from pending request */\r
- plugin = tcore_pending_ref_plugin(p);\r
- \r
- /* Actual HAL - like svnet(2) */\r
- hal = (TcoreHal *)user_data;\r
-\r
- /* Initialize CMUX */\r
- ret = tcore_cmux_init(plugin, hal);\r
- if(TCORE_RETURN_SUCCESS == ret) {\r
- dbg("Successfully initialized CMUX");\r
- }\r
- else {\r
- err("Failed to initialize CMUX");\r
- }\r
- \r
- dbg("Exit");\r
- return;\r
-}\r
-\r
-\r
-\r
-static void setup_mux(CoreObject *o)\r
-{\r
- TcoreHal* hal = NULL;\r
- TcorePending *pending = NULL;\r
- dbg("Entered");\r
-\r
- /* HAL has type itself,\r
- * e.g.) TCORE_HAL_MODE_AT\r
- */\r
- hal = tcore_object_get_hal(o);\r
-\r
- pending = tcore_at_pending_new(o, "AT+CMUX=0,0,,1509,10,3,30,,", "+CMUX", TCORE_AT_NO_RESULT, on_response_setupmux, hal);\r
-\r
- tcore_pending_set_send_callback(pending, on_confirmation_modem_message_send, NULL);\r
-\r
- /* Send callback */\r
- tcore_hal_send_request(hal, pending);\r
-\r
- dbg("Exit");\r
- return;\r
-}\r
-\r
-\r
-static gboolean on_event_mux_channel_up(CoreObject *o, const void *event_info, void *user_data)\r
-{\r
- TcorePlugin *plugin = NULL;\r
- dbg("Entry");\r
-\r
- plugin = (TcorePlugin *)user_data;\r
- _modem_subscribe_events(plugin);\r
- dbg("Exit");\r
- return TRUE;\r
-}\r
-\r
- \r
-static void on_response_enable_logging(TcorePending *p, int data_len, const void *data, void *user_data)\r
-{\r
- const TcoreATResponse *resp = data;\r
- TcorePlugin *plugin = NULL;\r
- \r
- plugin = tcore_pending_ref_plugin(p);\r
- \r
- /* DELETE ME: only for DEBUG */\r
- if (!resp)\r
- dbg("no data");\r
-\r
- dbg("response...(result = %d, final_response = '%s')", resp->success, resp->final_response);\r
-\r
- if(resp->success){\r
- dbg("RESPONSE OK");\r
- dbg("Enabling CP logging is success !!!\n");\r
-\r
- }else {\r
- dbg("RESPONSE NOK");\r
- dbg("Enabling CP logging is failed !!!\n");\r
- }\r
-\r
- dbg("Calling setup_mux");\r
- setup_mux(tcore_pending_ref_core_object(p));\r
-\r
-\r
- dbg("Exit");\r
- return;\r
-\r
-}\r
-\r
-static void _send_enable_logging_command(CoreObject *o)\r
-{\r
- TcoreATRequest *req = NULL;\r
- TcoreHal *hal = NULL;\r
- TcorePending *pending = NULL;\r
- TReturn ret = 0;\r
- \r
- /* DLELTE ME */\r
- dbg("Send Trace enabling command for CP logging. \n");\r
-\r
- if(!o){\r
- dbg("Co-object is Null !!\n");\r
- //goto error;\r
- }\r
-\r
- hal = tcore_object_get_hal(o);\r
- pending = tcore_pending_new(o, 0);\r
- req = tcore_at_request_new("at+xsystrace=1,\"digrf=1;bb_sw=1;3g_sw=1\",\"digrf=0x84\",\"oct=4\";+xsystrace=11;+trace=1", NULL, TCORE_AT_NO_RESULT);\r
-\r
- dbg("cmd : %s, prefix(if any) :%s, cmd_len : %d", req->cmd, req->prefix, strlen(req->cmd));\r
-\r
- tcore_pending_set_request_data(pending, 0, req);\r
- tcore_pending_set_response_callback(pending, on_response_enable_logging, hal);\r
- tcore_pending_set_send_callback(pending, on_confirmation_modem_message_send, NULL);\r
-\r
- ret = tcore_hal_send_request(hal, pending);\r
- if(ret != TCORE_RETURN_SUCCESS)\r
- dbg("tcore_hal_send_request fail !!! (hal: 0x%x, pending: 0x%x)\n", hal, pending);\r
-\r
-}\r
-\r
-static void on_response_poweron(TcorePending *p, int data_len, const void *data, void *user_data)\r
-{\r
- const TcoreATResponse *resp = data;\r
- GSList*tokens=NULL;\r
- const char *line=NULL;\r
- gboolean bpoweron = FALSE;\r
- int response = 0;\r
- \r
- if(resp->success){\r
- dbg("RESPONSE OK");\r
- /* Parse AT Response */\r
- if (resp->lines) {\r
- line = (const char *)resp->lines->data;\r
- tokens = tcore_at_tok_new(line);\r
- if (g_slist_length(tokens) != 1) {\r
- dbg("invalid message");\r
- bpoweron = FALSE;\r
- goto error;\r
- }\r
- }\r
-\r
- response = atoi(g_slist_nth_data(tokens, 0));\r
-\r
- dbg("CPAS: response %d",response);\r
-\r
- switch(response)\r
- {\r
- case CPAS_RES_READY:\r
- case CPAS_RES_RINGING:\r
- case CPAS_RES_CALL_PROGRESS:\r
- case CPAS_RES_ASLEEP:\r
- bpoweron = TRUE;\r
- break;\r
-\r
- case CPAS_RES_UNAVAIL:\r
- case CPAS_RES_UNKNOWN:\r
- default:\r
- dbg("value is unvail/unknown - but CP responded - proceed poweron");\r
- //bpoweron = FALSE;\r
- bpoweron = TRUE;\r
- break;\r
- }\r
- }else{\r
- dbg("CPAS: RESPONSE NOK");\r
- bpoweron = FALSE;\r
- }\r
-\r
-error:\r
- /* DELE ME: AT request & response are freed after AT processing in HAL.\r
- * ref.) _emit_pending_response (libtcore/src/at.c)\r
- */\r
- if(tokens != NULL)\r
- tcore_at_tok_free(tokens);\r
-\r
- if(bpoweron == TRUE){\r
- dbg("Power on NOTI received, (pending: 0x%x, co: 0x%x)\n", p, tcore_pending_ref_core_object(p));\r
-\r
- _send_enable_logging_command(tcore_pending_ref_core_object(p));\r
- }\r
- else{\r
- dbg("CP is not ready, let us send CPAS once again");\r
- s_modem_send_poweron(tcore_object_ref_plugin(tcore_pending_ref_core_object(p)));\r
- }\r
- return;\r
-}\r
-\r
-static TReturn power_off(CoreObject *o, UserRequest *ur)\r
-{\r
- TcoreHal *hal = NULL;\r
- TcoreATRequest *req = NULL;\r
- TcorePending *pending = NULL;\r
-\r
- hal = tcore_object_get_hal(o);\r
- pending = tcore_pending_new(o, 0);\r
-\r
- req = tcore_at_request_new("AT+CFUN=0", NULL, TCORE_AT_NO_RESULT);\r
-\r
- dbg("cmd : %s, prefix(if any) :%s, cmd_len : %d", req->cmd, req->prefix, strlen(req->cmd));\r
-\r
- tcore_pending_set_request_data(pending, 0, req);\r
- tcore_pending_set_response_callback(pending, on_response_power_off, hal);\r
- tcore_pending_link_user_request(pending, ur);\r
- tcore_pending_set_send_callback(pending, on_confirmation_modem_message_send, NULL);\r
-\r
- tcore_hal_send_request(hal, pending);\r
-\r
- return TCORE_RETURN_SUCCESS;\r
-}\r
-\r
-static TReturn get_imei(CoreObject *o, UserRequest *ur)\r
-{\r
- TcoreHal* hal;\r
- TcoreATRequest *req;\r
- TcorePending *pending = NULL;\r
-\r
- hal = tcore_object_get_hal(o);\r
- pending = tcore_pending_new(o, 0);\r
-\r
- req = tcore_at_request_new("AT+CGSN", NULL, TCORE_AT_NUMERIC);\r
-\r
- dbg("cmd : %s, prefix(if any) :%s, cmd_len : %d", req->cmd, req->prefix, strlen(req->cmd));\r
-\r
- tcore_pending_set_request_data(pending, 0, req);\r
- tcore_pending_set_response_callback(pending, on_response_imei, hal);\r
- tcore_pending_link_user_request(pending, ur);\r
- tcore_pending_set_send_callback(pending, on_confirmation_modem_message_send, NULL);\r
-\r
- tcore_hal_send_request(hal, pending);\r
-\r
- return TCORE_RETURN_SUCCESS;\r
-}\r
-\r
-\r
-static TReturn get_version(CoreObject *o, UserRequest *ur)\r
-{\r
- TcoreHal* hal;\r
- TcoreATRequest *req;\r
- TcorePending *pending = NULL;\r
-\r
- hal = tcore_object_get_hal(o);\r
- pending = tcore_pending_new(o, 0);\r
-\r
- req = tcore_at_request_new("AT+CGMR", NULL, TCORE_AT_SINGLELINE);\r
-\r
- dbg("cmd : %s, prefix(if any) :%s, cmd_len : %d", req->cmd, req->prefix, strlen(req->cmd));\r
-\r
- tcore_pending_set_request_data(pending, 0, req);\r
- tcore_pending_set_response_callback(pending, on_response_version, hal);\r
- tcore_pending_link_user_request(pending, ur);\r
- tcore_pending_set_send_callback(pending, on_confirmation_modem_message_send, NULL);\r
-\r
- tcore_hal_send_request(hal, pending);\r
-\r
- return TCORE_RETURN_SUCCESS;\r
-}\r
-\r
-static TReturn set_flight_mode(CoreObject *o, UserRequest *ur)\r
-{\r
- TcoreHal *hal = NULL;\r
- TcoreATRequest *req = NULL;\r
- TcorePending *pending = NULL;\r
- const struct treq_modem_set_flightmode *req_data = NULL;\r
- char *cmd_str = NULL;\r
-\r
- hal = tcore_object_get_hal(o);\r
- pending = tcore_pending_new(o, 0);\r
-\r
- req_data = tcore_user_request_ref_data(ur, NULL);\r
-\r
- if (req_data->enable) {\r
- dbg("Flight mode on/n");\r
- cmd_str = g_strdup("AT+CFUN=4");\r
- }\r
- else {\r
- dbg("Flight mode off/n");\r
- cmd_str = g_strdup("AT+CFUN=1");\r
- }\r
-\r
- req = tcore_at_request_new((const char*)cmd_str, NULL, TCORE_AT_NO_RESULT);\r
-\r
- dbg("cmd : %s, prefix(if any) :%s, cmd_len : %d", req->cmd, req->prefix, strlen(req->cmd));\r
-\r
- tcore_pending_set_request_data(pending, 0, req);\r
- tcore_pending_set_response_callback(pending, on_response_set_flight_mode, hal);\r
- tcore_pending_link_user_request(pending, ur);\r
- tcore_pending_set_send_callback(pending, on_confirmation_modem_message_send, NULL);\r
-\r
- tcore_hal_send_request(hal, pending);\r
-\r
- return TCORE_RETURN_SUCCESS;\r
-}\r
-\r
-\r
-static struct tcore_modem_operations modem_ops =\r
-{\r
- .power_on = NULL,\r
- .power_off = power_off,\r
- .power_reset = NULL,\r
- .set_flight_mode = set_flight_mode,\r
- .get_imei = get_imei,\r
- .get_version = get_version,\r
- .get_sn = NULL,\r
- .dun_pin_ctrl = NULL,\r
-};\r
-\r
-gboolean s_modem_init(TcorePlugin *p, TcoreHal *h)\r
-{\r
- CoreObject *o = NULL;\r
- GQueue *work_queue = NULL;\r
- TelMiscVersionInformation *vi_property = NULL;\r
- TelMiscSNInformation *imei_property = NULL;\r
- TelMiscSNInformation *sn_property = NULL;\r
-\r
- o = tcore_modem_new(p, "modem", &modem_ops, h);\r
- if (!o)\r
- return FALSE;\r
-\r
- work_queue = g_queue_new();\r
- tcore_object_link_user_data(o, work_queue);\r
-\r
- vi_property = calloc(sizeof(TelMiscVersionInformation), 1);\r
- tcore_plugin_link_property(p, "VERSION", vi_property);\r
-\r
- imei_property = calloc(sizeof(TelMiscSNInformation), 1);\r
- tcore_plugin_link_property(p, "IMEI", imei_property);\r
-\r
- sn_property = calloc(sizeof(TelMiscSNInformation), 1);\r
- tcore_plugin_link_property(p, "SN", sn_property);\r
-\r
- dbg("Registerind for CMUX-UP event");\r
- tcore_object_add_callback(o, "CMUX-UP", on_event_mux_channel_up, p);\r
-\r
- dbg("Registering for +XSIM event");\r
- tcore_object_add_callback(o, "+XSIM", on_event_bootup_sim_status, NULL);\r
-\r
- return TRUE;\r
-}\r
-\r
-void s_modem_exit(TcorePlugin *p)\r
-{\r
- CoreObject *o = NULL;\r
- GQueue *work_queue = NULL;\r
- TelMiscVersionInformation *vi_property = NULL;\r
- TelMiscSNInformation *imei_property = NULL;\r
- TelMiscSNInformation *sn_property = NULL;\r
-\r
- if (!p)\r
- return;\r
-\r
- o = tcore_plugin_ref_core_object(p, "modem");\r
-\r
- work_queue = tcore_object_ref_user_data(o);\r
- g_queue_free(work_queue);\r
-\r
- vi_property = tcore_plugin_ref_property(p, "VERSION");\r
- if (vi_property)\r
- free(vi_property);\r
-\r
- imei_property = tcore_plugin_ref_property(p, "IMEI");\r
- if (imei_property)\r
- free(imei_property);\r
-\r
- sn_property = tcore_plugin_ref_property(p, "SN");\r
- if (sn_property)\r
- free(sn_property);\r
-\r
- tcore_modem_free(o);\r
- return;\r
-}\r
-\r
-gboolean s_modem_send_poweron(TcorePlugin *p)\r
-{\r
- TcoreHal* hal;\r
- TcoreATRequest *req;\r
- TcorePending *pending = NULL;\r
- CoreObject *o;\r
-\r
- o = tcore_plugin_ref_core_object(p, "modem");\r
- hal = tcore_object_get_hal(o);\r
-\r
- pending = tcore_pending_new(o, 0);\r
-\r
- req = tcore_at_request_new("AT+CPAS", "+CPAS", TCORE_AT_SINGLELINE);\r
-\r
- dbg("cmd : %s, prefix(if any) :%s, cmd_len : %d", req->cmd, req->prefix, strlen(req->cmd));\r
-\r
- tcore_pending_set_timeout(pending, 10);\r
- tcore_pending_set_priority(pending, TCORE_PENDING_PRIORITY_DEFAULT); \r
- tcore_pending_set_timeout_callback(pending, on_timeout_modem_poweron, hal);\r
- \r
- tcore_pending_set_request_data(pending, 0, req);\r
- tcore_pending_set_response_callback(pending, on_response_poweron, hal);\r
- tcore_pending_set_send_callback(pending, on_confirmation_modem_message_send, NULL);\r
-\r
- tcore_hal_send_request(hal, pending);\r
-\r
- return TRUE;\r
-}\r
+/*
+ * tel-plugin-imc
+ *
+ * Copyright (c) 2012 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: Harish Bishnoi <hbishnoi@samsung.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+
+#include <glib.h>
+
+#include <tcore.h>
+#include <hal.h>
+#include <core_object.h>
+#include <plugin.h>
+#include <queue.h>
+#include <co_modem.h>
+#include <storage.h>
+#include <server.h>
+#include <at.h>
+#include <mux.h>
+
+#include "s_common.h"
+#include "s_modem.h"
+
+
+#define ID_RESERVED_AT 0x0229
+
+#define MAX_VERSION_LEN 32
+#define TAPI_MISC_ME_SN_LEN_MAX 32
+#define TAPI_MISC_PRODUCT_CODE_LEN_MAX 32
+#define TAPI_MISC_MODEL_ID_LEN_MAX 17
+#define TAPI_MISC_PRL_ERI_VER_LEN_MAX 17
+
+#define CPAS_RES_READY 0
+#define CPAS_RES_UNAVAIL 1
+#define CPAS_RES_UNKNOWN 2
+#define CPAS_RES_RINGING 3
+#define CPAS_RES_CALL_PROGRESS 4
+#define CPAS_RES_ASLEEP 5
+#define AT_VER_LEN 20
+
+
+enum cp_state {
+ CP_STATE_OFFLINE,
+ CP_STATE_CRASH_RESET,
+ CP_STATE_CRASH_EXIT,
+ CP_STATE_BOOTING,
+ CP_STATE_ONLINE,
+ CP_STATE_NV_REBUILDING,
+ CP_STATE_LOADER_DONE,
+};
+
+typedef enum {
+ TAPI_MISC_ME_IMEI = 0x00, /**< 0x00: IMEI, GSM/UMTS device */
+ TAPI_MISC_ME_ESN = 0x01, /**< 0x01: ESN(Electronic Serial Number), It`s essentially run out. CDMA device */
+ TAPI_MISC_ME_MEID = 0x02, /**< 0x02: MEID, This value can have hexa decimal digits. CDMA device */
+ TAPI_MISC_ME_MAX = 0xff /**< 0xff: reserved */
+} TelMiscSNIndexType_t;
+
+typedef struct {
+ TelMiscSNIndexType_t sn_index; /**< serial number index */
+ int sn_len; /**< Length */
+ unsigned char szNumber[TAPI_MISC_ME_SN_LEN_MAX]; /**< Number */
+} TelMiscSNInformation;
+
+/**
+ * Mobile Equipment Version Information
+ */
+typedef struct {
+ unsigned char ver_mask; /**< version mask - 0x01:SW_ver, 0x02:HW_ver, 0x04:RF_CAL_date, 0x08:Product_code, 0x10:Model_ID, 0x20:PRL, 0x04:ERI, 0xff:all */
+ unsigned char szSwVersion[MAX_VERSION_LEN]; /**< Software version, null termination */
+ unsigned char szHwVersion[MAX_VERSION_LEN]; /**< Hardware version, null termination */
+ unsigned char szRfCalDate[MAX_VERSION_LEN]; /**< Calculation Date, null termination */
+ unsigned char szProductCode[TAPI_MISC_PRODUCT_CODE_LEN_MAX]; /**< product code, null termination */
+ unsigned char szModelId[TAPI_MISC_MODEL_ID_LEN_MAX]; /**< model id (only for CDMA), null termination */
+ unsigned char prl_nam_num; /**< number of PRL NAM fields */
+ unsigned char szPrlVersion[TAPI_MISC_PRL_ERI_VER_LEN_MAX * 3]; /**< prl version (only for CDMA), null termination */
+ unsigned char eri_nam_num; /**< number of PRL NAM fields */
+ unsigned char szEriVersion[TAPI_MISC_PRL_ERI_VER_LEN_MAX * 3]; /**< eri version (only for CDMA), null termination */
+} TelMiscVersionInformation;
+
+
+void prepare_and_send_pending_request(TcorePlugin *plugin, char *co_name, const char *at_cmd, const char *prefix, enum tcore_at_command_type at_cmd_type, TcorePendingResponseCallback callback);
+static void on_confirmation_modem_message_send(TcorePending *p, gboolean result, void *user_data); // from Kernel
+void on_response_bootup_subscription(TcorePending *p, int data_len, const void *data, void *user_data);
+void on_response_last_bootup_subscription(TcorePending *p, int data_len, const void *data, void *user_data);
+static void on_timeout_modem_poweron(TcorePending *p, void *user_data);
+static void on_response_enable_proactive_command(TcorePending *p, int data_len, const void *data, void *user_data);
+
+static void on_timeout_modem_poweron(TcorePending *p, void *user_data)
+{
+ unsigned int data_len = 0;
+ char data[] = "AT+CPAS";
+ dbg("TIMEOUT for 1st AT Command !!!!! NO Response for initial AT command. Resending it");
+ data_len = sizeof(data);
+
+ /* Retransmit 1st AT command directly via HAL, don't disturb pending queue. */
+ /* HAL was passed as user_data, re-use it */
+ if (user_data) {
+ tcore_hal_send_data(user_data, data_len, (void *) data);
+ }
+}
+
+static void on_confirmation_modem_message_send(TcorePending *p, gboolean result, void *user_data)
+{
+ dbg("on_confirmation_modem_message_send - msg out from queue.\n");
+
+ if (result == FALSE) {
+ /* Fail */
+ dbg("SEND FAIL");
+ } else {
+ dbg("SEND OK");
+ }
+}
+
+static void on_response_enable_proactive_command(TcorePending *p, int data_len, const void *data, void *user_data)
+{
+ const TcoreATResponse *resp = data;
+
+ if (resp->success > 0) {
+ dbg("RESPONSE OK proactive command enabled");
+ } else {
+ dbg("RESPONSE NOK proactive command disabled");
+ }
+}
+
+void prepare_and_send_pending_request(TcorePlugin *plugin, char *co_name, const char *at_cmd, const char *prefix, enum tcore_at_command_type at_cmd_type, TcorePendingResponseCallback callback)
+{
+ TcoreATRequest *req = NULL;
+ TcoreHal *hal = NULL;
+ CoreObject *o = NULL;
+ TcorePending *pending = NULL;
+ TReturn ret;
+
+ o = tcore_plugin_ref_core_object(plugin, co_name);
+ hal = tcore_object_get_hal(o);
+ dbg("hal: %p", hal);
+
+ pending = tcore_pending_new(o, 0);
+ if (!pending)
+ dbg("Pending is NULL");
+ req = tcore_at_request_new(at_cmd, prefix, at_cmd_type);
+
+ dbg("cmd : %s, prefix(if any) :%s, cmd_len : %d", req->cmd, req->prefix, strlen(req->cmd));
+
+ tcore_pending_set_request_data(pending, 0, req);
+ tcore_pending_set_response_callback(pending, callback, NULL);
+ tcore_pending_set_send_callback(pending, on_confirmation_modem_message_send, NULL);
+ tcore_pending_link_user_request(pending, NULL); // set user request to NULL - this is intenal request
+ ret = tcore_hal_send_request(hal, pending);
+ return;
+}
+
+void on_response_bootup_subscription(TcorePending *p, int data_len, const void *data, void *user_data)
+{
+ const TcoreATResponse *resp = data;
+ dbg("entry of on_response_bootup_subscription() - response comes\n");
+
+ if (resp->success) {
+ dbg("result OK");
+ } else {
+ dbg("result ERROR");
+ }
+}
+
+void on_response_last_bootup_subscription(TcorePending *p, int data_len, const void *data, void *user_data)
+{
+ const TcoreATResponse *resp = data;
+ dbg("enry of on_response_last_bootup_subscription() - final response comes\n");
+ if (resp->success) {
+ dbg("SEND OK");
+ } else {
+ dbg("SEND FAIL");
+ }
+ dbg("Response for AT+CLIP. Boot-up configration completed for IMC modem. Bring CP to online based on Flightmode status\n");
+ on_event_modem_power(NULL, NULL, tcore_pending_ref_plugin(p));
+}
+
+static void on_response_power_off(TcorePending *p, int data_len, const void *data, void *user_data)
+{
+ CoreObject *o = 0;
+ TcoreHal *h = 0;
+ o = tcore_pending_ref_core_object(p);
+ h = tcore_object_get_hal(o);
+
+ dbg("modem power off");
+
+ tcore_hal_set_power_state(h, FALSE);
+}
+
+static void on_response_set_flight_mode(TcorePending *p, int data_len, const void *data, void *user_data)
+{
+ CoreObject *o = NULL;
+ UserRequest *ur = NULL;
+ const TcoreATResponse *ATresp = data;
+ GSList *tokens = NULL;
+ const char *line = NULL;
+ struct tresp_modem_set_flightmode res = {0};
+ int response = 0;
+ struct tnoti_modem_flight_mode modem_flight_mode = {0};
+ const struct treq_modem_set_flightmode *req_data = NULL;
+
+ o = tcore_pending_ref_core_object(p);
+
+ if (ATresp->success > 0) {
+ dbg("RESPONSE OK - flight mode operation finished");
+ res.result = TCORE_RETURN_SUCCESS;
+ } else {
+ dbg("RESPONSE NOK");
+ line = (const char *) ATresp->final_response;
+ tokens = tcore_at_tok_new(line);
+
+ if (g_slist_length(tokens) < 1) {
+ dbg("err cause not specified or string corrupted");
+ res.result = TCORE_RETURN_3GPP_ERROR;
+ } else {
+ response = atoi(g_slist_nth_data(tokens, 0));
+ /* TODO: CMEE error mapping is required. */
+ res.result = TCORE_RETURN_3GPP_ERROR;
+ }
+ }
+
+ ur = tcore_pending_ref_user_request(p);
+ if (NULL == ur) {
+ dbg("No user request. Internal request created during boot-up sequence");
+
+ if (ATresp->success > 0) {
+ modem_flight_mode.enable = tcore_modem_get_flight_mode_state(o);
+ dbg("sucess case - Sending Flight Mode Notification (%d) to Telephony Server", modem_flight_mode.enable);
+
+ tcore_server_send_notification(tcore_plugin_ref_server(tcore_object_ref_plugin(o)), o, TNOTI_MODEM_FLIGHT_MODE,
+ sizeof(struct tnoti_modem_flight_mode), &modem_flight_mode);
+ }
+ } else {
+ dbg("Sending response for Flight mode operation");
+ tcore_user_request_send_response(ur, TRESP_MODEM_SET_FLIGHTMODE, sizeof(struct tresp_modem_set_flightmode), &res);
+
+ req_data = tcore_user_request_ref_data(ur, NULL);
+
+ if (req_data->enable == 0) {
+ dbg("Flight mode is disabled, trigger COPS to register on network");
+ /* Trigger Network registration (for the moment automatic) */
+ prepare_and_send_pending_request(tcore_object_ref_plugin(o), "modem", "AT+COPS=0", NULL, TCORE_AT_NO_RESULT, NULL);
+ }
+ }
+
+ tcore_at_tok_free(tokens);
+}
+
+static void on_response_imei(TcorePending *p, int data_len, const void *data, void *user_data)
+{
+ const TcoreATResponse *resp = data;
+ TcorePlugin *plugin = NULL;
+ struct tresp_modem_get_imei res;
+ TelMiscSNInformation *imei_property = NULL;
+ UserRequest *ur = NULL;
+ GSList *tokens = NULL;
+ const char *line;
+ int response = 0;
+
+ memset(&res, 0, sizeof(struct tresp_modem_get_imei));
+
+ if (resp->success > 0) {
+ dbg("RESPONSE OK");
+ if (resp->lines) {
+ line = (const char *) resp->lines->data;
+ tokens = tcore_at_tok_new(line);
+ if (g_slist_length(tokens) != 1) {
+ msg("invalid message");
+ goto OUT;
+ }
+ }
+ res.result = TCORE_RETURN_SUCCESS;
+ strncpy(res.imei, g_slist_nth_data(tokens, 0), 16);
+
+ dbg("imei = [%s]", res.imei);
+
+ plugin = tcore_pending_ref_plugin(p);
+ imei_property = tcore_plugin_ref_property(plugin, "IMEI");
+ if (imei_property) {
+ imei_property->sn_index = TAPI_MISC_ME_IMEI;
+ imei_property->sn_len = strlen(res.imei);
+ memcpy(imei_property->szNumber, res.imei, imei_property->sn_len);
+ }
+ } else {
+ dbg("RESPONSE NOK");
+ if (resp->lines) {
+ line = (const char *) resp->lines->data;
+ tokens = tcore_at_tok_new(line);
+ }
+
+
+ if (g_slist_length(tokens) < 1) {
+ dbg("err cause not specified or string corrupted");
+ res.result = TCORE_RETURN_3GPP_ERROR;
+ } else {
+ response = atoi(g_slist_nth_data(tokens, 0));
+ /* TODO: CMEE error mapping is required. */
+ res.result = TCORE_RETURN_3GPP_ERROR;
+ }
+ }
+
+ ur = tcore_pending_ref_user_request(p);
+ tcore_user_request_send_response(ur, TRESP_MODEM_GET_IMEI, sizeof(struct tresp_modem_get_imei), &res);
+
+OUT:
+ if (tokens != NULL)
+ tcore_at_tok_free(tokens);
+
+ return;
+}
+
+static void on_response_version(TcorePending *p, int data_len, const void *data, void *user_data)
+{
+ const TcoreATResponse *resp = data;
+ TcorePlugin *plugin = NULL;
+ struct tresp_modem_get_version res = {0};
+ TelMiscVersionInformation *vi_property = NULL;
+ TelMiscVersionInformation *vi = NULL;
+ UserRequest *ur = NULL;
+ GSList *tokens = NULL;
+ const char *line = NULL;
+ char *swver = NULL;
+ char *hwver = NULL;
+ char *caldate = NULL;
+ char *pcode = NULL;
+ char *id = NULL;
+
+ int response = 0;
+
+ if (resp->success > 0) {
+ dbg("RESPONSE OK");
+ if (resp->lines) {
+ line = (const char *) resp->lines->data;
+ tokens = tcore_at_tok_new(line);
+ if (g_slist_length(tokens) != 5) {
+ msg("invalid message");
+ goto OUT;
+ }
+ }
+
+ swver = g_slist_nth_data(tokens, 0);
+ hwver = g_slist_nth_data(tokens, 1);
+ caldate = g_slist_nth_data(tokens, 2);
+ pcode = g_slist_nth_data(tokens, 3);
+ id = g_slist_nth_data(tokens, 4);
+
+ dbg("version: sw=[%s], hw=[%s], rf_cal=[%s], product_code=[%s], model_id=[%s]", swver, hwver, caldate, pcode, id);
+
+ vi = calloc(sizeof(TelMiscVersionInformation), 1);
+ if (NULL != swver)
+ memcpy(vi->szSwVersion, swver, strlen(swver));
+ if (NULL != hwver)
+ memcpy(vi->szHwVersion, hwver, strlen(hwver));
+ if (NULL != caldate)
+ memcpy(vi->szRfCalDate, caldate, strlen(caldate));
+ if (NULL != pcode)
+ memcpy(vi->szProductCode, pcode, strlen(pcode));
+ if (NULL != id)
+ memcpy(vi->szModelId, id, strlen(id));
+
+ memset(&res, 0, sizeof(struct tresp_modem_get_version));
+
+ if (NULL != swver)
+ snprintf(res.software, (AT_VER_LEN > strlen(swver) ? strlen(swver) : AT_VER_LEN), "%s", swver);
+ if (NULL != hwver)
+ snprintf(res.hardware, (AT_VER_LEN > strlen(hwver) ? strlen(hwver) : AT_VER_LEN), "%s", hwver);
+
+ plugin = tcore_pending_ref_plugin(p);
+ vi_property = tcore_plugin_ref_property(plugin, "VERSION");
+ memcpy(vi_property, vi, sizeof(TelMiscVersionInformation));
+ free(vi);
+ } else {
+ dbg("RESPONSE NOK");
+ if (resp->lines) {
+ line = (const char *) resp->lines->data;
+ tokens = tcore_at_tok_new(line);
+ }
+
+ memset(&res, 0, sizeof(struct tresp_modem_get_version));
+
+
+ if (g_slist_length(tokens) < 1) {
+ dbg("err cause not specified or string corrupted");
+ res.result = TCORE_RETURN_3GPP_ERROR;
+ } else {
+ response = atoi(g_slist_nth_data(tokens, 0));
+ /* TODO: CMEE error mapping is required. */
+ res.result = TCORE_RETURN_3GPP_ERROR;
+ }
+ }
+
+ ur = tcore_pending_ref_user_request(p);
+ tcore_user_request_send_response(ur, TRESP_MODEM_GET_VERSION, sizeof(struct tresp_modem_get_version), &res);
+
+OUT:
+ if (tokens != NULL)
+ tcore_at_tok_free(tokens);
+
+ return;
+}
+
+static gboolean on_event_bootup_sim_status(CoreObject *o, const void *event_info, void *user_data)
+{
+ GSList *tok = NULL;
+ GSList *lines = NULL;
+ int value = -1;
+ char *line = NULL;
+
+ lines = (GSList *) event_info;
+ if (1 != g_slist_length(lines)) {
+ dbg("unsolicited msg but multiple line");
+ goto OUT;
+ }
+ line = (char *) (lines->data);
+ dbg("on_bootup_event_sim_status notification : %s", line);
+
+ tok = tcore_at_tok_new(line);
+ value = atoi(g_slist_nth_data(tok, 0));
+
+ if (7 == value) {
+ dbg("SIM ready. request COPS & remove callback");
+ dbg("power on done set for proactive command receiving mode");
+ prepare_and_send_pending_request(tcore_object_ref_plugin(o), "sat", "AT+CFUN=6", NULL, TCORE_AT_NO_RESULT, on_response_enable_proactive_command);
+ prepare_and_send_pending_request(tcore_object_ref_plugin(o), "umts_network", "AT+COPS=0", NULL, TCORE_AT_NO_RESULT, on_response_bootup_subscription);
+ return FALSE;
+ }
+
+OUT:
+ if (tok != NULL)
+ tcore_at_tok_free(tok);
+
+ return TRUE;
+}
+
+
+
+gboolean on_event_modem_power(TcoreAT *at, const char *line, TcorePlugin *p)
+{
+ CoreObject *o = NULL;
+ struct treq_modem_set_flightmode flight_mode_set = {0};
+ struct tnoti_modem_power modem_power = {0};
+ TcoreHal *h = NULL;
+ Storage *strg = NULL;
+
+ o = tcore_plugin_ref_core_object(p, "modem");
+
+ strg = tcore_server_find_storage(tcore_plugin_ref_server(p), "vconf");
+ flight_mode_set.enable = tcore_storage_get_bool(strg, STORAGE_KEY_SETAPPL_FLIGHT_MODE_BOOL);
+
+ h = tcore_object_get_hal(o);
+ tcore_hal_set_power_state(h, TRUE);
+
+ /* Set Flight mode as per AP settings */
+ if (flight_mode_set.enable) { /* Radio Off */
+ prepare_and_send_pending_request(p, "modem", "AT+CFUN=4", NULL, TCORE_AT_NO_RESULT, on_response_set_flight_mode);
+ tcore_modem_set_flight_mode_state(o, TRUE);
+ } else { /* Radio On */
+ prepare_and_send_pending_request(p, "modem", "AT+CFUN=1", NULL, TCORE_AT_NO_RESULT, on_response_set_flight_mode);
+ tcore_modem_set_flight_mode_state(o, FALSE);
+ }
+
+ /* Get IMEI */
+ prepare_and_send_pending_request(p, "modem", "AT+CGSN", NULL, TCORE_AT_NUMERIC, on_response_imei);
+
+ /* Get Version Number */
+ prepare_and_send_pending_request(p, "modem", "AT+CGMR", NULL, TCORE_AT_SINGLELINE, on_response_version);
+
+ tcore_modem_set_powered(o, TRUE);
+
+ modem_power.state = MODEM_STATE_ONLINE;
+
+ tcore_server_send_notification(tcore_plugin_ref_server(tcore_object_ref_plugin(o)), o, TNOTI_MODEM_POWER,
+ sizeof(struct tnoti_modem_power), &modem_power);
+
+ return TRUE;
+}
+
+static void _modem_subscribe_events(TcorePlugin *plugin)
+{
+ dbg("Entry");
+
+ /* XCALLSTAT subscription */
+ prepare_and_send_pending_request(plugin, "call", "at+xcallstat=1", NULL, TCORE_AT_NO_RESULT, on_response_bootup_subscription);
+
+ /* XSIMSTATE subscription */
+ prepare_and_send_pending_request(plugin, "sim", "at+xsimstate=1", NULL, TCORE_AT_NO_RESULT, on_response_bootup_subscription);
+
+ prepare_and_send_pending_request(plugin, "umts_sms", "at+xsimstate=1", NULL, TCORE_AT_NO_RESULT, on_response_bootup_subscription);
+ prepare_and_send_pending_request(plugin, "modem", "at+xsimstate=1", NULL, TCORE_AT_NO_RESULT, on_response_bootup_subscription);
+
+ /* CREG subscription */
+ prepare_and_send_pending_request(plugin, "umts_network", "at+creg=2", NULL, TCORE_AT_NO_RESULT, on_response_bootup_subscription);
+
+ /* CGREG subscription */
+ prepare_and_send_pending_request(plugin, "umts_network", "at+cgreg=2", NULL, TCORE_AT_NO_RESULT, on_response_bootup_subscription);
+
+ /* Allow automatic time Zone updation via NITZ */
+ prepare_and_send_pending_request(plugin, "umts_network", "at+ctzu=1", NULL, TCORE_AT_NO_RESULT, on_response_bootup_subscription);
+
+ /* TZ, time & daylight changing event reporting subscription */
+ prepare_and_send_pending_request(plugin, "umts_network", "at+ctzr=1", NULL, TCORE_AT_NO_RESULT, on_response_bootup_subscription);
+
+ /* XMER subscription */
+ prepare_and_send_pending_request(plugin, "umts_network", "at+xmer=1", NULL, TCORE_AT_NO_RESULT, on_response_bootup_subscription);
+
+ /* CGEREP subscription */
+ prepare_and_send_pending_request(plugin, "umts_ps", "at+cgerep=1", NULL, TCORE_AT_NO_RESULT, on_response_bootup_subscription);
+
+ /* XDATASTAT subscription */
+ prepare_and_send_pending_request(plugin, "umts_ps", "at+xdatastat=1", NULL, TCORE_AT_NO_RESULT, on_response_bootup_subscription);
+
+ /* CSSN subscription */
+ prepare_and_send_pending_request(plugin, "call", "at+cssn=1,1", NULL, TCORE_AT_NO_RESULT, on_response_bootup_subscription);
+
+ /* CUSD subscription */
+ prepare_and_send_pending_request(plugin, "call", "at+cusd=1", NULL, TCORE_AT_NO_RESULT, on_response_bootup_subscription);
+
+ /* XDNS subscription */
+ prepare_and_send_pending_request(plugin, "umts_ps", "at+xdns=1,1", NULL, TCORE_AT_NO_RESULT, on_response_bootup_subscription);
+
+ /* CLIP subscription */
+ prepare_and_send_pending_request(plugin, "call", "at+clip=1", NULL, TCORE_AT_NO_RESULT, on_response_bootup_subscription);
+
+ /*CMEE subscription*/
+ prepare_and_send_pending_request(plugin, "umts_ps", "at+cmee=2", NULL, TCORE_AT_NO_RESULT, on_response_bootup_subscription);
+
+ /*incoming sms,cb,status report subscription*/
+ prepare_and_send_pending_request(plugin, "umts_sms", "at+cnmi=1,2,2,1,0", NULL, TCORE_AT_NO_RESULT, on_response_bootup_subscription);
+
+ /* text/pdu mode subscription*/
+ prepare_and_send_pending_request(plugin, "umts_sms", "at+cmgf=0", NULL, TCORE_AT_NO_RESULT, on_response_last_bootup_subscription);
+
+ dbg("Exit");
+ return;
+}
+
+
+static void on_response_setupmux(TcorePending *p, int data_len, const void *data, void *user_data)
+{
+ TcorePlugin *plugin = NULL;
+ TcoreHal *hal = NULL;
+ TReturn ret;
+ dbg("Entry");
+
+ /* IMC Plugin dereferenced from pending request */
+ plugin = tcore_pending_ref_plugin(p);
+
+ /* Actual HAL - like svnet(2) */
+ hal = (TcoreHal *) user_data;
+
+ /* Initialize CMUX */
+ ret = tcore_cmux_init(plugin, hal);
+ if (TCORE_RETURN_SUCCESS == ret) {
+ dbg("Successfully initialized CMUX");
+ } else {
+ err("Failed to initialize CMUX");
+ }
+
+ dbg("Exit");
+ return;
+}
+
+
+
+static void setup_mux(CoreObject *o)
+{
+ TcoreHal *hal = NULL;
+ TcorePending *pending = NULL;
+ dbg("Entered");
+
+ /* HAL has type itself,
+ * e.g.) TCORE_HAL_MODE_AT
+ */
+ hal = tcore_object_get_hal(o);
+
+ pending = tcore_at_pending_new(o, "AT+CMUX=0,0,,1509,10,3,30,,", "+CMUX", TCORE_AT_NO_RESULT, on_response_setupmux, hal);
+
+ tcore_pending_set_send_callback(pending, on_confirmation_modem_message_send, NULL);
+
+ /* Send callback */
+ tcore_hal_send_request(hal, pending);
+
+ dbg("Exit");
+ return;
+}
+
+
+static gboolean on_event_mux_channel_up(CoreObject *o, const void *event_info, void *user_data)
+{
+ TcorePlugin *plugin = NULL;
+ dbg("Entry");
+
+ plugin = (TcorePlugin *) user_data;
+ _modem_subscribe_events(plugin);
+ dbg("Exit");
+ return TRUE;
+}
+
+
+static void on_response_enable_logging(TcorePending *p, int data_len, const void *data, void *user_data)
+{
+ const TcoreATResponse *resp = data;
+ TcorePlugin *plugin = NULL;
+
+ plugin = tcore_pending_ref_plugin(p);
+
+ /* DELETE ME: only for DEBUG */
+ if (!resp)
+ dbg("no data");
+
+ dbg("response...(result = %d, final_response = '%s')", resp->success, resp->final_response);
+
+ if (resp->success) {
+ dbg("RESPONSE OK");
+ dbg("Enabling CP logging is success !!!\n");
+ } else {
+ dbg("RESPONSE NOK");
+ dbg("Enabling CP logging is failed !!!\n");
+ }
+
+ dbg("Calling setup_mux");
+ setup_mux(tcore_pending_ref_core_object(p));
+
+
+ dbg("Exit");
+ return;
+}
+
+static void _send_enable_logging_command(CoreObject *o)
+{
+ TcoreATRequest *req = NULL;
+ TcoreHal *hal = NULL;
+ TcorePending *pending = NULL;
+ TReturn ret = 0;
+
+ /* DLELTE ME */
+ dbg("Send Trace enabling command for CP logging. \n");
+
+ if (!o) {
+ dbg("Co-object is Null !!\n");
+ // goto error;
+ }
+
+ hal = tcore_object_get_hal(o);
+ pending = tcore_pending_new(o, 0);
+ req = tcore_at_request_new("at+xsystrace=1,\"digrf=1;bb_sw=1;3g_sw=1\",\"digrf=0x84\",\"oct=4\";+xsystrace=11;+trace=1", NULL, TCORE_AT_NO_RESULT);
+
+ dbg("cmd : %s, prefix(if any) :%s, cmd_len : %d", req->cmd, req->prefix, strlen(req->cmd));
+
+ tcore_pending_set_request_data(pending, 0, req);
+ tcore_pending_set_response_callback(pending, on_response_enable_logging, hal);
+ tcore_pending_set_send_callback(pending, on_confirmation_modem_message_send, NULL);
+
+ ret = tcore_hal_send_request(hal, pending);
+ if (ret != TCORE_RETURN_SUCCESS)
+ dbg("tcore_hal_send_request fail !!! (hal: 0x%x, pending: 0x%x)\n", hal, pending);
+}
+
+static void on_response_poweron(TcorePending *p, int data_len, const void *data, void *user_data)
+{
+ const TcoreATResponse *resp = data;
+ GSList *tokens = NULL;
+ const char *line = NULL;
+ gboolean bpoweron = FALSE;
+ int response = 0;
+
+ if (resp->success) {
+ dbg("RESPONSE OK");
+ /* Parse AT Response */
+ if (resp->lines) {
+ line = (const char *) resp->lines->data;
+ tokens = tcore_at_tok_new(line);
+ if (g_slist_length(tokens) != 1) {
+ dbg("invalid message");
+ bpoweron = FALSE;
+ goto error;
+ }
+ }
+
+ response = atoi(g_slist_nth_data(tokens, 0));
+
+ dbg("CPAS: response %d", response);
+
+ switch (response) {
+ case CPAS_RES_READY:
+ case CPAS_RES_RINGING:
+ case CPAS_RES_CALL_PROGRESS:
+ case CPAS_RES_ASLEEP:
+ bpoweron = TRUE;
+ break;
+
+ case CPAS_RES_UNAVAIL:
+ case CPAS_RES_UNKNOWN:
+ default:
+ dbg("value is unvail/unknown - but CP responded - proceed poweron");
+ // bpoweron = FALSE;
+ bpoweron = TRUE;
+ break;
+ }
+ } else {
+ dbg("CPAS: RESPONSE NOK");
+ bpoweron = FALSE;
+ }
+
+error:
+ /* DELE ME: AT request & response are freed after AT processing in HAL.
+ * ref.) _emit_pending_response (libtcore/src/at.c)
+ */
+ if (tokens != NULL)
+ tcore_at_tok_free(tokens);
+
+ if (bpoweron == TRUE) {
+ dbg("Power on NOTI received, (pending: 0x%x, co: 0x%x)\n", p, tcore_pending_ref_core_object(p));
+
+ _send_enable_logging_command(tcore_pending_ref_core_object(p));
+ } else {
+ dbg("CP is not ready, let us send CPAS once again");
+ s_modem_send_poweron(tcore_object_ref_plugin(tcore_pending_ref_core_object(p)));
+ }
+ return;
+}
+
+static TReturn power_off(CoreObject *o, UserRequest *ur)
+{
+ TcoreHal *hal = NULL;
+ TcoreATRequest *req = NULL;
+ TcorePending *pending = NULL;
+
+ hal = tcore_object_get_hal(o);
+ pending = tcore_pending_new(o, 0);
+
+ req = tcore_at_request_new("AT+CFUN=0", NULL, TCORE_AT_NO_RESULT);
+
+ dbg("cmd : %s, prefix(if any) :%s, cmd_len : %d", req->cmd, req->prefix, strlen(req->cmd));
+
+ tcore_pending_set_request_data(pending, 0, req);
+ tcore_pending_set_response_callback(pending, on_response_power_off, hal);
+ tcore_pending_link_user_request(pending, ur);
+ tcore_pending_set_send_callback(pending, on_confirmation_modem_message_send, NULL);
+
+ tcore_hal_send_request(hal, pending);
+
+ return TCORE_RETURN_SUCCESS;
+}
+
+static TReturn get_imei(CoreObject *o, UserRequest *ur)
+{
+ TcoreHal *hal;
+ TcoreATRequest *req;
+ TcorePending *pending = NULL;
+
+ hal = tcore_object_get_hal(o);
+ pending = tcore_pending_new(o, 0);
+
+ req = tcore_at_request_new("AT+CGSN", NULL, TCORE_AT_NUMERIC);
+
+ dbg("cmd : %s, prefix(if any) :%s, cmd_len : %d", req->cmd, req->prefix, strlen(req->cmd));
+
+ tcore_pending_set_request_data(pending, 0, req);
+ tcore_pending_set_response_callback(pending, on_response_imei, hal);
+ tcore_pending_link_user_request(pending, ur);
+ tcore_pending_set_send_callback(pending, on_confirmation_modem_message_send, NULL);
+
+ tcore_hal_send_request(hal, pending);
+
+ return TCORE_RETURN_SUCCESS;
+}
+
+
+static TReturn get_version(CoreObject *o, UserRequest *ur)
+{
+ TcoreHal *hal;
+ TcoreATRequest *req;
+ TcorePending *pending = NULL;
+
+ hal = tcore_object_get_hal(o);
+ pending = tcore_pending_new(o, 0);
+
+ req = tcore_at_request_new("AT+CGMR", NULL, TCORE_AT_SINGLELINE);
+
+ dbg("cmd : %s, prefix(if any) :%s, cmd_len : %d", req->cmd, req->prefix, strlen(req->cmd));
+
+ tcore_pending_set_request_data(pending, 0, req);
+ tcore_pending_set_response_callback(pending, on_response_version, hal);
+ tcore_pending_link_user_request(pending, ur);
+ tcore_pending_set_send_callback(pending, on_confirmation_modem_message_send, NULL);
+
+ tcore_hal_send_request(hal, pending);
+
+ return TCORE_RETURN_SUCCESS;
+}
+
+static TReturn set_flight_mode(CoreObject *o, UserRequest *ur)
+{
+ TcoreHal *hal = NULL;
+ TcoreATRequest *req = NULL;
+ TcorePending *pending = NULL;
+ const struct treq_modem_set_flightmode *req_data = NULL;
+ char *cmd_str = NULL;
+
+ hal = tcore_object_get_hal(o);
+ pending = tcore_pending_new(o, 0);
+
+ req_data = tcore_user_request_ref_data(ur, NULL);
+
+ if (req_data->enable) {
+ dbg("Flight mode on/n");
+ cmd_str = g_strdup("AT+CFUN=4");
+ } else {
+ dbg("Flight mode off/n");
+ cmd_str = g_strdup("AT+CFUN=1");
+ }
+
+ req = tcore_at_request_new((const char *) cmd_str, NULL, TCORE_AT_NO_RESULT);
+
+ dbg("cmd : %s, prefix(if any) :%s, cmd_len : %d", req->cmd, req->prefix, strlen(req->cmd));
+
+ tcore_pending_set_request_data(pending, 0, req);
+ tcore_pending_set_response_callback(pending, on_response_set_flight_mode, hal);
+ tcore_pending_link_user_request(pending, ur);
+ tcore_pending_set_send_callback(pending, on_confirmation_modem_message_send, NULL);
+
+ tcore_hal_send_request(hal, pending);
+
+ return TCORE_RETURN_SUCCESS;
+}
+
+
+static struct tcore_modem_operations modem_ops = {
+ .power_on = NULL,
+ .power_off = power_off,
+ .power_reset = NULL,
+ .set_flight_mode = set_flight_mode,
+ .get_imei = get_imei,
+ .get_version = get_version,
+ .get_sn = NULL,
+ .dun_pin_ctrl = NULL,
+};
+
+gboolean s_modem_init(TcorePlugin *p, TcoreHal *h)
+{
+ CoreObject *o = NULL;
+ GQueue *work_queue = NULL;
+ TelMiscVersionInformation *vi_property = NULL;
+ TelMiscSNInformation *imei_property = NULL;
+ TelMiscSNInformation *sn_property = NULL;
+
+ o = tcore_modem_new(p, "modem", &modem_ops, h);
+ if (!o)
+ return FALSE;
+
+ work_queue = g_queue_new();
+ tcore_object_link_user_data(o, work_queue);
+
+ vi_property = calloc(sizeof(TelMiscVersionInformation), 1);
+ tcore_plugin_link_property(p, "VERSION", vi_property);
+
+ imei_property = calloc(sizeof(TelMiscSNInformation), 1);
+ tcore_plugin_link_property(p, "IMEI", imei_property);
+
+ sn_property = calloc(sizeof(TelMiscSNInformation), 1);
+ tcore_plugin_link_property(p, "SN", sn_property);
+
+ dbg("Registerind for CMUX-UP event");
+ tcore_object_add_callback(o, "CMUX-UP", on_event_mux_channel_up, p);
+
+ dbg("Registering for +XSIM event");
+ tcore_object_add_callback(o, "+XSIM", on_event_bootup_sim_status, NULL);
+
+ return TRUE;
+}
+
+void s_modem_exit(TcorePlugin *p)
+{
+ CoreObject *o = NULL;
+ GQueue *work_queue = NULL;
+ TelMiscVersionInformation *vi_property = NULL;
+ TelMiscSNInformation *imei_property = NULL;
+ TelMiscSNInformation *sn_property = NULL;
+
+ if (!p)
+ return;
+
+ o = tcore_plugin_ref_core_object(p, "modem");
+
+ work_queue = tcore_object_ref_user_data(o);
+ g_queue_free(work_queue);
+
+ vi_property = tcore_plugin_ref_property(p, "VERSION");
+ if (vi_property)
+ free(vi_property);
+
+ imei_property = tcore_plugin_ref_property(p, "IMEI");
+ if (imei_property)
+ free(imei_property);
+
+ sn_property = tcore_plugin_ref_property(p, "SN");
+ if (sn_property)
+ free(sn_property);
+
+ tcore_modem_free(o);
+ return;
+}
+
+gboolean s_modem_send_poweron(TcorePlugin *p)
+{
+ TcoreHal *hal;
+ TcoreATRequest *req;
+ TcorePending *pending = NULL;
+ CoreObject *o;
+
+ o = tcore_plugin_ref_core_object(p, "modem");
+ hal = tcore_object_get_hal(o);
+
+ pending = tcore_pending_new(o, 0);
+
+ req = tcore_at_request_new("AT+CPAS", "+CPAS", TCORE_AT_SINGLELINE);
+
+ dbg("cmd : %s, prefix(if any) :%s, cmd_len : %d", req->cmd, req->prefix, strlen(req->cmd));
+
+ tcore_pending_set_timeout(pending, 10);
+ tcore_pending_set_priority(pending, TCORE_PENDING_PRIORITY_DEFAULT);
+ tcore_pending_set_timeout_callback(pending, on_timeout_modem_poweron, hal);
+
+ tcore_pending_set_request_data(pending, 0, req);
+ tcore_pending_set_response_callback(pending, on_response_poweron, hal);
+ tcore_pending_set_send_callback(pending, on_confirmation_modem_message_send, NULL);
+
+ tcore_hal_send_request(hal, pending);
+
+ return TRUE;
+}
-/*\r
- * tel-plugin-imc\r
- *\r
- * Copyright (c) 2012 Samsung Electronics Co., Ltd. All rights reserved.\r
- *\r
- * Contact: Harish Bishnoi <hbishnoi@samsung.com>\r
- *\r
- * Licensed under the Apache License, Version 2.0 (the "License");\r
- * you may not use this file except in compliance with the License.\r
- * You may obtain a copy of the License at\r
- *\r
- * http://www.apache.org/licenses/LICENSE-2.0\r
- *\r
- * Unless required by applicable law or agreed to in writing, software\r
- * distributed under the License is distributed on an "AS IS" BASIS,\r
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
- * See the License for the specific language governing permissions and\r
- * limitations under the License.\r
- */\r
-\r
-#include <stdio.h>\r
-#include <stdlib.h>\r
-#include <string.h>\r
-\r
-#include <glib.h>\r
-\r
-#include <tcore.h>\r
-#include <hal.h>\r
-#include <core_object.h>\r
-#include <plugin.h>\r
-#include <queue.h>\r
-#include <co_network.h>\r
-#include <co_ps.h>\r
-#include <server.h>\r
-#include <storage.h>\r
-#include <util.h>\r
-#include <at.h>\r
-\r
-#include "s_common.h"\r
-#include "s_network.h"\r
-\r
-#define AT_CREG_STAT_NOT_REG 0 /* not registered, MT is not currently searching a new operator to register to */\r
-#define AT_CREG_STAT_REG_HOME 1 /* registered, home network */\r
-#define AT_CREG_STAT_SEARCHING 2 /* not registered, but MT is currently searching a new operator to register to */\r
-#define AT_CREG_STAT_REG_DENIED 3 /* registration denied */\r
-#define AT_CREG_STAT_UNKNOWN 4 /* unknown */\r
-#define AT_CREG_STAT_REG_ROAM 5 /* registered, roaming */\r
-\r
-#define AT_COPS_MODE_AUTOMATIC 0 /* automatic (<oper> field is ignored) */\r
-#define AT_COPS_MODE_MANUAL 1 /* manual (<oper> field shall be present, and <AcT> optionally) */\r
-#define AT_COPS_MODE_DEREGISTER 2 /* deregister from network */\r
-#define AT_COPS_MODE_SET_ONLY 3 /* set only <format> */\r
-#define AT_COPS_MODE_MANUAL_AUTOMATIC 4 /*automatic - manual*/\r
-\r
-#define AT_COPS_FORMAT_LONG_ALPHANUMERIC 0 /* long format alphanumeric <oper> */\r
-#define AT_COPS_FORMAT_SHORT_ALPHANUMERIC 1 /* short format alphanumeric <oper> */\r
-#define AT_COPS_FORMAT_NUMERIC 2 /* numeric <oper> */\r
-\r
-#define AT_COPS_ACT_GSM 0 /* GSM */\r
-#define AT_COPS_ACT_GSM_COMPACT 1 /* GSM Compact */\r
-#define AT_COPS_ACT_UTRAN 2 /* UTRAN */\r
-#define AT_COPS_ACT_GSM_EGPRS 3 /* GSM w/EGPRS */\r
-#define AT_COPS_ACT_UTRAN_HSDPA 4 /* UTRAN w/HSDPA */\r
-#define AT_COPS_ACT_UTRAN_HSUPA 5 /* UTRAN w/HSUPA */\r
-#define AT_COPS_ACT_UTRAN_HSDPA_HSUPA 6 /* UTRAN w/HSDPA and HSUPA */\r
-#define AT_COPS_ACT_E_UTRAN 7 /* E-UTRAN */\r
-\r
-#define AT_GSM_XBANDSEL_AUTOMATIC 0 \r
-#define AT_GSM_XBANDSEL_1800 1800\r
-#define AT_GSM_XBANDSEL_1900 1900\r
-#define AT_GSM_XBANDSEL_900 900\r
-#define AT_GSM_XBANDSEL_850 850\r
-#define AT_GSM_XBANDSEL_450 450\r
-#define AT_GSM_XBANDSEL_480 480\r
-#define AT_GSM_XBANDSEL_750 750\r
-#define AT_GSM_XBANDSEL_380 380\r
-#define AT_GSM_XBANDSEL_410 410\r
-\r
-#define AT_XRAT_GSM 0\r
-#define AT_XRAT_DUAL 1\r
-#define AT_XRAT_UMTS 2\r
-\r
-#define MAX_NETWORKS_PREF_PLMN_SUPPORT 150\r
-#define MAX_NETWORKS_MANUAL_SEARCH_SUPPORT 20\r
-\r
-static unsigned int lookup_tbl_net_status[] = {\r
- [AT_CREG_STAT_NOT_REG] = NETWORK_SERVICE_DOMAIN_STATUS_NO,\r
- [AT_CREG_STAT_REG_HOME] = NETWORK_SERVICE_DOMAIN_STATUS_FULL,\r
- [AT_CREG_STAT_SEARCHING] = NETWORK_SERVICE_DOMAIN_STATUS_SEARCH,\r
- [AT_CREG_STAT_REG_DENIED] = NETWORK_SERVICE_DOMAIN_STATUS_EMERGENCY,\r
- [AT_CREG_STAT_UNKNOWN] = NETWORK_SERVICE_DOMAIN_STATUS_NO,\r
- [AT_CREG_STAT_REG_ROAM] = NETWORK_SERVICE_DOMAIN_STATUS_FULL,\r
-};\r
-\r
-static unsigned int lookup_tbl_access_technology[] = {\r
- [AT_COPS_ACT_GSM] = NETWORK_ACT_GSM,\r
- [AT_COPS_ACT_GSM_COMPACT] = NETWORK_ACT_GSM,\r
- [AT_COPS_ACT_UTRAN] = NETWORK_ACT_UTRAN,\r
- [AT_COPS_ACT_GSM_EGPRS] = NETWORK_ACT_EGPRS,\r
- [AT_COPS_ACT_UTRAN_HSDPA] = NETWORK_ACT_UTRAN,\r
- [AT_COPS_ACT_UTRAN_HSUPA] = NETWORK_ACT_UTRAN,\r
- [AT_COPS_ACT_UTRAN_HSDPA_HSUPA] = NETWORK_ACT_UTRAN,\r
- [AT_COPS_ACT_E_UTRAN] = NETWORK_ACT_GSM_UTRAN,\r
-};\r
-\r
-static gboolean get_serving_network(CoreObject *o, UserRequest *ur);\r
-\r
-\r
-static void on_confirmation_network_message_send(TcorePending *p, gboolean result, void *user_data)\r
-{\r
- dbg("on_confirmation_modem_message_send - msg out from queue.\n");\r
-\r
- if (result == FALSE) {\r
- /* Fail */\r
- dbg("SEND FAIL");\r
- }\r
- else {\r
- dbg("SEND OK");\r
- }\r
-}\r
-\r
-static void nwk_prepare_and_send_pending_request(TcorePlugin *plugin, char *co_name, const char *at_cmd, const char* prefix,enum tcore_at_command_type at_cmd_type, UserRequest *ur, TcorePendingResponseCallback callback)\r
-{\r
- TcoreATRequest *req = NULL;\r
- TcoreHal *hal;\r
- CoreObject *o= NULL;\r
- TcorePending *pending = NULL;\r
- TReturn ret;\r
- \r
- o = tcore_plugin_ref_core_object(plugin, co_name);\r
- hal = tcore_object_get_hal(o);\r
- \r
- pending = tcore_pending_new(o, 0);\r
- req = tcore_at_request_new(at_cmd, prefix, at_cmd_type);\r
-\r
- dbg("cmd : %s, prefix(if any) :%s, cmd_len : %d", req->cmd, req->prefix, strlen(req->cmd));\r
-\r
- tcore_pending_set_request_data(pending, 0, req);\r
- tcore_pending_set_response_callback(pending, callback, req->cmd);\r
- tcore_pending_link_user_request(pending, ur);\r
- tcore_pending_set_send_callback(pending, on_confirmation_network_message_send, NULL);\r
-\r
- ret = tcore_hal_send_request(hal, pending);\r
- return;\r
-}\r
-\r
-\r
-static void _insert_mcc_mnc_oper_list(TcorePlugin *p, CoreObject *o)\r
-{\r
- Server *s;\r
- Storage *strg;\r
- void *handle;\r
- char query[255] = { 0, };\r
- GHashTableIter iter;\r
- gpointer key, value;\r
- GHashTable *result = NULL, *row = NULL;\r
- struct tcore_network_operator_info *noi = NULL;\r
- int count = 0;\r
-\r
- s = tcore_plugin_ref_server(p);\r
- strg = tcore_server_find_storage(s, "database");\r
-\r
- handle = tcore_storage_create_handle(strg, "/opt/dbspace/.mcc_mnc_oper_list.db");\r
- if (!handle) {\r
- dbg("fail to create database handle");\r
- return;\r
- }\r
-\r
- snprintf(query, 255, "select country, mcc, mnc, oper from mcc_mnc_oper_list");\r
-\r
- result = g_hash_table_new_full(g_str_hash, g_str_equal, NULL,\r
- (GDestroyNotify) g_hash_table_destroy);\r
-\r
- tcore_storage_read_query_database(strg, handle, query, NULL, result, 4);\r
-\r
- g_hash_table_iter_init(&iter, result);\r
- while (g_hash_table_iter_next(&iter, &key, &value) == TRUE) {\r
- row = value;\r
-\r
- noi = calloc(sizeof(struct tcore_network_operator_info), 1);\r
-\r
- snprintf(noi->mcc, 4, "%s", (char *)g_hash_table_lookup(row, "1"));\r
- snprintf(noi->mnc, 4, "%s", (char *)g_hash_table_lookup(row, "2"));\r
- snprintf(noi->name, 41, "%s", (char *)g_hash_table_lookup(row, "3"));\r
- snprintf(noi->country, 4, "%s", (char *)g_hash_table_lookup(row, "0"));\r
-\r
- tcore_network_operator_info_add(o, noi);\r
-\r
- count++;\r
- }\r
-\r
- dbg("count = %d", count);\r
-\r
- g_hash_table_destroy(result);\r
-\r
- tcore_storage_remove_handle(strg, handle);\r
-}\r
-\r
-static enum telephony_network_service_type _get_service_type(enum telephony_network_service_type prev_type,\r
- int domain, int act, int cs_status, int ps_status)\r
-{\r
- enum telephony_network_service_type ret;\r
-\r
- ret = prev_type;\r
-\r
- switch (act) {\r
- case NETWORK_ACT_UNKNOWN:\r
- ret = NETWORK_SERVICE_TYPE_UNKNOWN;\r
- break;\r
-\r
- case NETWORK_ACT_GSM:\r
- if (prev_type == NETWORK_SERVICE_TYPE_2_5G_EDGE && domain == NETWORK_SERVICE_DOMAIN_CS)\r
- ret = NETWORK_SERVICE_TYPE_2_5G_EDGE;\r
- else\r
- ret = NETWORK_SERVICE_TYPE_2G;\r
- break;\r
-\r
- case NETWORK_ACT_EGPRS:\r
- return NETWORK_SERVICE_TYPE_2_5G_EDGE;\r
- break;\r
-\r
- case NETWORK_ACT_UMTS:\r
- ret = NETWORK_SERVICE_TYPE_3G;\r
- break;\r
-\r
- }\r
-\r
- if (cs_status == NETWORK_SERVICE_DOMAIN_STATUS_NO && ps_status == NETWORK_SERVICE_DOMAIN_STATUS_NO) {\r
- ret = NETWORK_SERVICE_TYPE_NO_SERVICE;\r
- }\r
- else if (cs_status == NETWORK_SERVICE_DOMAIN_STATUS_SEARCH || ps_status == NETWORK_SERVICE_DOMAIN_STATUS_SEARCH) \r
- {\r
- if (cs_status == NETWORK_SERVICE_DOMAIN_STATUS_FULL || ps_status == NETWORK_SERVICE_DOMAIN_STATUS_FULL) \r
- {\r
- /* no change */\r
- }\r
- else \r
- {\r
- ret = NETWORK_SERVICE_TYPE_SEARCH;\r
- }\r
- }\r
- else if (cs_status == NETWORK_SERVICE_DOMAIN_STATUS_EMERGENCY || ps_status == NETWORK_SERVICE_DOMAIN_STATUS_EMERGENCY) \r
- {\r
- if (cs_status == NETWORK_SERVICE_DOMAIN_STATUS_FULL || ps_status == NETWORK_SERVICE_DOMAIN_STATUS_FULL) \r
- {\r
- /* no change */\r
- }\r
- else \r
- {\r
- ret = NETWORK_SERVICE_TYPE_EMERGENCY;\r
- }\r
- }\r
-\r
- return ret;\r
-}\r
-\r
-static void _ps_set(TcorePlugin *p, int status)\r
-{\r
- GSList *co_list = NULL;\r
-\r
- co_list = tcore_plugin_get_core_objects_bytype(p, CORE_OBJECT_TYPE_PS);\r
- do {\r
- CoreObject *o = NULL;\r
- o = (CoreObject *) co_list->data;\r
- if (!o)\r
- break;\r
-\r
- if (status == NETWORK_SERVICE_DOMAIN_STATUS_FULL) {\r
- tcore_ps_set_online(o, TRUE);\r
- }\r
- else {\r
- tcore_ps_set_online(o, FALSE);\r
- }\r
- } while ((co_list = g_slist_next(co_list)));\r
-\r
- g_slist_free(co_list);\r
-}\r
-\r
-\r
-static void on_response_set_plmn_selection_mode(TcorePending *p, int data_len, const void *data, void *user_data)\r
-{\r
- UserRequest *ur;\r
- const TcoreATResponse *atResp = data;\r
- //GSList *tokens = NULL;\r
- //char * line = NULL;\r
- struct tresp_network_set_plmn_selection_mode resp = {0};\r
- \r
- if(atResp->success > 0)\r
- {\r
- dbg("RESPONSE OK");\r
- resp.result = TCORE_RETURN_SUCCESS;\r
- }\r
- else\r
- {\r
- dbg("RESPONSE NOK");\r
- resp.result = TCORE_RETURN_FAILURE;\r
- }\r
-\r
- ur = tcore_pending_ref_user_request(p);\r
- if (ur) {\r
- tcore_user_request_send_response(ur, TRESP_NETWORK_SET_PLMN_SELECTION_MODE, sizeof(struct tresp_network_set_plmn_selection_mode), &resp);\r
- }\r
-}\r
-\r
-static void on_response_get_plmn_selection_mode(TcorePending *p, int data_len, const void *data, void *user_data)\r
-{\r
- UserRequest *ur;\r
- struct tresp_network_get_plmn_selection_mode resp = {0};\r
- const TcoreATResponse *atResp = data;\r
- GSList *tokens = NULL;\r
- char * line = NULL;\r
- int mode = 0;\r
-\r
- resp.result = TCORE_RETURN_FAILURE;\r
-\r
- if(atResp->success > 0)\r
- {\r
- dbg("RESPONSE OK");\r
- /* Format of output \r
- +COPS: <mode>[,<format>,<oper>[,< AcT>]]\r
- */\r
- \r
- if(atResp->lines)\r
- {\r
- line = (char*)atResp->lines->data;\r
- tokens = tcore_at_tok_new(line);\r
- if (g_slist_length(tokens) < 1){\r
- msg("invalid message");\r
- goto OUT;\r
- }\r
- mode = atoi(tcore_at_tok_nth(tokens, 0));\r
- dbg("mode = %d", mode);\r
- \r
- switch(mode) {\r
- case AT_COPS_MODE_AUTOMATIC:\r
- resp.mode = NETWORK_SELECT_MODE_GLOBAL_AUTOMATIC;\r
- break;\r
- case AT_COPS_MODE_MANUAL:\r
- case AT_COPS_MODE_MANUAL_AUTOMATIC:\r
- resp.mode = NETWORK_SELECT_MODE_GSM_MANUAL;\r
- break;\r
- case AT_COPS_MODE_DEREGISTER:\r
- case AT_COPS_MODE_SET_ONLY:\r
- resp.result = TCORE_RETURN_FAILURE;\r
- goto OUT;\r
- }\r
- resp.result = TCORE_RETURN_SUCCESS;\r
- }\r
- }\r
- else\r
- {\r
- dbg("RESPONSE NOK");\r
- resp.result = TCORE_RETURN_FAILURE;\r
- }\r
-\r
-OUT:\r
- ur = tcore_pending_ref_user_request(p);\r
- if (ur) {\r
- tcore_user_request_send_response(ur, TRESP_NETWORK_GET_PLMN_SELECTION_MODE, sizeof(struct tresp_network_get_plmn_selection_mode), &resp);\r
- }\r
-\r
- if(tokens != NULL)\r
- tcore_at_tok_free(tokens);\r
-\r
- return;\r
-\r
-}\r
-\r
-static void on_response_search_network(TcorePending *p, int data_len, const void *data, void *user_data)\r
-{\r
- UserRequest *ur;\r
- struct tresp_network_search resp;\r
- int i = 0;\r
- char* line=NULL;\r
- const TcoreATResponse *atResp = data;\r
- GSList *tokens = NULL;\r
- GSList *network_token = NULL;\r
- int AcT=0;\r
- char* temp_plmn_info =NULL;\r
- char *pResp = NULL;\r
- int num_network_avail = 0;\r
-\r
- memset(&resp, 0, sizeof(struct tresp_network_search));\r
- resp.result = TCORE_RETURN_FAILURE;\r
- resp.list_count = 0;\r
-\r
- if(atResp->success > 0)\r
- {\r
- dbg("RESPONSE OK");\r
- if(atResp->lines) {\r
- line = (char*)atResp->lines->data;\r
- tokens = tcore_at_tok_new(line);\r
- num_network_avail = g_slist_length(tokens);\r
- dbg(" length of tokens is %d\n", num_network_avail);\r
- if (num_network_avail < 1) {\r
- msg("invalid message");\r
- goto OUT;\r
- }\r
- }\r
- \r
- resp.result = TCORE_RETURN_SUCCESS;\r
- /*\r
- * +COPS: [list of supported (<stat>,long alphanumeric <oper>,short alphanumeric <oper>,numeric <oper>[,<AcT>])s]\r
- * [,,(list of supported <mode>s),(list of supported <format>s)]\r
- */\r
- \r
- /* (2,"IND airtel","airtel","40445",2,),(1,"IND airtel","airtel","40445",0,),(3,"TATA DOCOMO","TATA DO","405034",2,) */\r
- \r
- for(i=0; ((i<num_network_avail) && (i<MAX_NETWORKS_MANUAL_SEARCH_SUPPORT)); i++)\r
- {\r
- /* (2,"IND airtel","airtel","40445",2,) */\r
- network_token = tcore_at_tok_new(g_slist_nth_data(tokens, i));\r
-\r
- pResp = (tcore_at_tok_nth(network_token, 0));\r
- if(pResp != NULL){\r
- dbg("status : %s",pResp);\r
- resp.list[i].status = (enum telephony_network_plmn_status)atoi(pResp);\r
- }\r
-\r
- if ((pResp = tcore_at_tok_nth(network_token, 1)))\r
- { /* Long Aplha name */\r
- dbg("Long Aplha name : %s",pResp);\r
- \r
- if(strlen(pResp) > 0)\r
- /* Strip off starting quote & ending quote */\r
- strncpy(resp.list[i].name, pResp+1, strlen(pResp)-2);\r
- }\r
- else if ((pResp = tcore_at_tok_nth(network_token, 2)))\r
- { \r
- dbg("Short Aplha name : %s",pResp);\r
- /* Short Aplha name */\r
- /* Strip off starting quote & ending quote */\r
- if(strlen(pResp) > 0)\r
- strncpy(resp.list[i].name, pResp+1, strlen(pResp)-2);\r
- }\r
-\r
- /* PLMN ID */\r
- pResp = tcore_at_tok_nth(network_token, 3);\r
- if(pResp != NULL)\r
- {\r
- dbg("PLMN ID : %s",pResp);\r
+/*
+ * tel-plugin-imc
+ *
+ * Copyright (c) 2012 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: Harish Bishnoi <hbishnoi@samsung.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include <glib.h>
+
+#include <tcore.h>
+#include <hal.h>
+#include <core_object.h>
+#include <plugin.h>
+#include <queue.h>
+#include <co_network.h>
+#include <co_ps.h>
+#include <server.h>
+#include <storage.h>
+#include <util.h>
+#include <at.h>
+
+#include "s_common.h"
+#include "s_network.h"
+
+#define AT_CREG_STAT_NOT_REG 0 /* not registered, MT is not currently searching a new operator to register to */
+#define AT_CREG_STAT_REG_HOME 1 /* registered, home network */
+#define AT_CREG_STAT_SEARCHING 2 /* not registered, but MT is currently searching a new operator to register to */
+#define AT_CREG_STAT_REG_DENIED 3 /* registration denied */
+#define AT_CREG_STAT_UNKNOWN 4 /* unknown */
+#define AT_CREG_STAT_REG_ROAM 5 /* registered, roaming */
+
+#define AT_COPS_MODE_AUTOMATIC 0 /* automatic (<oper> field is ignored) */
+#define AT_COPS_MODE_MANUAL 1 /* manual (<oper> field shall be present, and <AcT> optionally) */
+#define AT_COPS_MODE_DEREGISTER 2 /* deregister from network */
+#define AT_COPS_MODE_SET_ONLY 3 /* set only <format> */
+#define AT_COPS_MODE_MANUAL_AUTOMATIC 4 /*automatic - manual*/
+
+#define AT_COPS_FORMAT_LONG_ALPHANUMERIC 0 /* long format alphanumeric <oper> */
+#define AT_COPS_FORMAT_SHORT_ALPHANUMERIC 1 /* short format alphanumeric <oper> */
+#define AT_COPS_FORMAT_NUMERIC 2 /* numeric <oper> */
+
+#define AT_COPS_ACT_GSM 0 /* GSM */
+#define AT_COPS_ACT_GSM_COMPACT 1 /* GSM Compact */
+#define AT_COPS_ACT_UTRAN 2 /* UTRAN */
+#define AT_COPS_ACT_GSM_EGPRS 3 /* GSM w/EGPRS */
+#define AT_COPS_ACT_UTRAN_HSDPA 4 /* UTRAN w/HSDPA */
+#define AT_COPS_ACT_UTRAN_HSUPA 5 /* UTRAN w/HSUPA */
+#define AT_COPS_ACT_UTRAN_HSDPA_HSUPA 6 /* UTRAN w/HSDPA and HSUPA */
+#define AT_COPS_ACT_E_UTRAN 7 /* E-UTRAN */
+
+#define AT_GSM_XBANDSEL_AUTOMATIC 0
+#define AT_GSM_XBANDSEL_1800 1800
+#define AT_GSM_XBANDSEL_1900 1900
+#define AT_GSM_XBANDSEL_900 900
+#define AT_GSM_XBANDSEL_850 850
+#define AT_GSM_XBANDSEL_450 450
+#define AT_GSM_XBANDSEL_480 480
+#define AT_GSM_XBANDSEL_750 750
+#define AT_GSM_XBANDSEL_380 380
+#define AT_GSM_XBANDSEL_410 410
+
+#define AT_XRAT_GSM 0
+#define AT_XRAT_DUAL 1
+#define AT_XRAT_UMTS 2
+
+#define MAX_NETWORKS_PREF_PLMN_SUPPORT 150
+#define MAX_NETWORKS_MANUAL_SEARCH_SUPPORT 20
+
+static unsigned int lookup_tbl_net_status[] = {
+ [AT_CREG_STAT_NOT_REG] = NETWORK_SERVICE_DOMAIN_STATUS_NO,
+ [AT_CREG_STAT_REG_HOME] = NETWORK_SERVICE_DOMAIN_STATUS_FULL,
+ [AT_CREG_STAT_SEARCHING] = NETWORK_SERVICE_DOMAIN_STATUS_SEARCH,
+ [AT_CREG_STAT_REG_DENIED] = NETWORK_SERVICE_DOMAIN_STATUS_EMERGENCY,
+ [AT_CREG_STAT_UNKNOWN] = NETWORK_SERVICE_DOMAIN_STATUS_NO,
+ [AT_CREG_STAT_REG_ROAM] = NETWORK_SERVICE_DOMAIN_STATUS_FULL,
+};
+
+static unsigned int lookup_tbl_access_technology[] = {
+ [AT_COPS_ACT_GSM] = NETWORK_ACT_GSM,
+ [AT_COPS_ACT_GSM_COMPACT] = NETWORK_ACT_GSM,
+ [AT_COPS_ACT_UTRAN] = NETWORK_ACT_UTRAN,
+ [AT_COPS_ACT_GSM_EGPRS] = NETWORK_ACT_EGPRS,
+ [AT_COPS_ACT_UTRAN_HSDPA] = NETWORK_ACT_UTRAN,
+ [AT_COPS_ACT_UTRAN_HSUPA] = NETWORK_ACT_UTRAN,
+ [AT_COPS_ACT_UTRAN_HSDPA_HSUPA] = NETWORK_ACT_UTRAN,
+ [AT_COPS_ACT_E_UTRAN] = NETWORK_ACT_GSM_UTRAN,
+};
+
+static gboolean get_serving_network(CoreObject *o, UserRequest *ur);
+
+
+static void on_confirmation_network_message_send(TcorePending *p, gboolean result, void *user_data)
+{
+ dbg("on_confirmation_modem_message_send - msg out from queue.\n");
+
+ if (result == FALSE) {
+ /* Fail */
+ dbg("SEND FAIL");
+ } else {
+ dbg("SEND OK");
+ }
+}
+
+static void nwk_prepare_and_send_pending_request(TcorePlugin *plugin, char *co_name, const char *at_cmd, const char *prefix, enum tcore_at_command_type at_cmd_type, UserRequest *ur, TcorePendingResponseCallback callback)
+{
+ TcoreATRequest *req = NULL;
+ TcoreHal *hal;
+ CoreObject *o = NULL;
+ TcorePending *pending = NULL;
+ TReturn ret;
+
+ o = tcore_plugin_ref_core_object(plugin, co_name);
+ hal = tcore_object_get_hal(o);
+
+ pending = tcore_pending_new(o, 0);
+ req = tcore_at_request_new(at_cmd, prefix, at_cmd_type);
+
+ dbg("cmd : %s, prefix(if any) :%s, cmd_len : %d", req->cmd, req->prefix, strlen(req->cmd));
+
+ tcore_pending_set_request_data(pending, 0, req);
+ tcore_pending_set_response_callback(pending, callback, req->cmd);
+ tcore_pending_link_user_request(pending, ur);
+ tcore_pending_set_send_callback(pending, on_confirmation_network_message_send, NULL);
+
+ ret = tcore_hal_send_request(hal, pending);
+ return;
+}
+
+
+static void _insert_mcc_mnc_oper_list(TcorePlugin *p, CoreObject *o)
+{
+ Server *s;
+ Storage *strg;
+ void *handle;
+ char query[255] = { 0, };
+ GHashTableIter iter;
+ gpointer key, value;
+ GHashTable *result = NULL, *row = NULL;
+ struct tcore_network_operator_info *noi = NULL;
+ int count = 0;
+
+ s = tcore_plugin_ref_server(p);
+ strg = tcore_server_find_storage(s, "database");
+
+ handle = tcore_storage_create_handle(strg, "/opt/dbspace/.mcc_mnc_oper_list.db");
+ if (!handle) {
+ dbg("fail to create database handle");
+ return;
+ }
+
+ snprintf(query, 255, "select country, mcc, mnc, oper from mcc_mnc_oper_list");
+
+ result = g_hash_table_new_full(g_str_hash, g_str_equal, NULL,
+ (GDestroyNotify) g_hash_table_destroy);
+
+ tcore_storage_read_query_database(strg, handle, query, NULL, result, 4);
+
+ g_hash_table_iter_init(&iter, result);
+ while (g_hash_table_iter_next(&iter, &key, &value) == TRUE) {
+ row = value;
+
+ noi = calloc(sizeof(struct tcore_network_operator_info), 1);
+
+ snprintf(noi->mcc, 4, "%s", (char *) g_hash_table_lookup(row, "1"));
+ snprintf(noi->mnc, 4, "%s", (char *) g_hash_table_lookup(row, "2"));
+ snprintf(noi->name, 41, "%s", (char *) g_hash_table_lookup(row, "3"));
+ snprintf(noi->country, 4, "%s", (char *) g_hash_table_lookup(row, "0"));
+
+ tcore_network_operator_info_add(o, noi);
+
+ count++;
+ }
+
+ dbg("count = %d", count);
+
+ g_hash_table_destroy(result);
+
+ tcore_storage_remove_handle(strg, handle);
+}
+
+static enum telephony_network_service_type _get_service_type(enum telephony_network_service_type prev_type,
+ int domain, int act, int cs_status, int ps_status)
+{
+ enum telephony_network_service_type ret;
+
+ ret = prev_type;
+
+ switch (act) {
+ case NETWORK_ACT_UNKNOWN:
+ ret = NETWORK_SERVICE_TYPE_UNKNOWN;
+ break;
+
+ case NETWORK_ACT_GSM:
+ if (prev_type == NETWORK_SERVICE_TYPE_2_5G_EDGE && domain == NETWORK_SERVICE_DOMAIN_CS)
+ ret = NETWORK_SERVICE_TYPE_2_5G_EDGE;
+ else
+ ret = NETWORK_SERVICE_TYPE_2G;
+ break;
+
+ case NETWORK_ACT_EGPRS:
+ return NETWORK_SERVICE_TYPE_2_5G_EDGE;
+ break;
+
+ case NETWORK_ACT_UMTS:
+ ret = NETWORK_SERVICE_TYPE_3G;
+ break;
+ }
+
+ if (cs_status == NETWORK_SERVICE_DOMAIN_STATUS_NO && ps_status == NETWORK_SERVICE_DOMAIN_STATUS_NO) {
+ ret = NETWORK_SERVICE_TYPE_NO_SERVICE;
+ } else if (cs_status == NETWORK_SERVICE_DOMAIN_STATUS_SEARCH || ps_status == NETWORK_SERVICE_DOMAIN_STATUS_SEARCH) {
+ if (cs_status == NETWORK_SERVICE_DOMAIN_STATUS_FULL || ps_status == NETWORK_SERVICE_DOMAIN_STATUS_FULL) {
+ /* no change */
+ } else {
+ ret = NETWORK_SERVICE_TYPE_SEARCH;
+ }
+ } else if (cs_status == NETWORK_SERVICE_DOMAIN_STATUS_EMERGENCY || ps_status == NETWORK_SERVICE_DOMAIN_STATUS_EMERGENCY) {
+ if (cs_status == NETWORK_SERVICE_DOMAIN_STATUS_FULL || ps_status == NETWORK_SERVICE_DOMAIN_STATUS_FULL) {
+ /* no change */
+ } else {
+ ret = NETWORK_SERVICE_TYPE_EMERGENCY;
+ }
+ }
+
+ return ret;
+}
+
+static void _ps_set(TcorePlugin *p, int status)
+{
+ GSList *co_list = NULL;
+
+ co_list = tcore_plugin_get_core_objects_bytype(p, CORE_OBJECT_TYPE_PS);
+ do {
+ CoreObject *o = NULL;
+ o = (CoreObject *) co_list->data;
+ if (!o)
+ break;
+
+ if (status == NETWORK_SERVICE_DOMAIN_STATUS_FULL) {
+ tcore_ps_set_online(o, TRUE);
+ } else {
+ tcore_ps_set_online(o, FALSE);
+ }
+ } while ((co_list = g_slist_next(co_list)));
+
+ g_slist_free(co_list);
+}
+
+
+static void on_response_set_plmn_selection_mode(TcorePending *p, int data_len, const void *data, void *user_data)
+{
+ UserRequest *ur;
+ const TcoreATResponse *atResp = data;
+ // GSList *tokens = NULL;
+ // char * line = NULL;
+ struct tresp_network_set_plmn_selection_mode resp = {0};
+
+ if (atResp->success > 0) {
+ dbg("RESPONSE OK");
+ resp.result = TCORE_RETURN_SUCCESS;
+ } else {
+ dbg("RESPONSE NOK");
+ resp.result = TCORE_RETURN_FAILURE;
+ }
+
+ ur = tcore_pending_ref_user_request(p);
+ if (ur) {
+ tcore_user_request_send_response(ur, TRESP_NETWORK_SET_PLMN_SELECTION_MODE, sizeof(struct tresp_network_set_plmn_selection_mode), &resp);
+ }
+}
+
+static void on_response_get_plmn_selection_mode(TcorePending *p, int data_len, const void *data, void *user_data)
+{
+ UserRequest *ur;
+ struct tresp_network_get_plmn_selection_mode resp = {0};
+ const TcoreATResponse *atResp = data;
+ GSList *tokens = NULL;
+ char *line = NULL;
+ int mode = 0;
+
+ resp.result = TCORE_RETURN_FAILURE;
+
+ if (atResp->success > 0) {
+ dbg("RESPONSE OK");
+ /* Format of output
+ +COPS: <mode>[,<format>,<oper>[,< AcT>]]
+ */
+
+ if (atResp->lines) {
+ line = (char *) atResp->lines->data;
+ tokens = tcore_at_tok_new(line);
+ if (g_slist_length(tokens) < 1) {
+ msg("invalid message");
+ goto OUT;
+ }
+ mode = atoi(tcore_at_tok_nth(tokens, 0));
+ dbg("mode = %d", mode);
+
+ switch (mode) {
+ case AT_COPS_MODE_AUTOMATIC:
+ resp.mode = NETWORK_SELECT_MODE_GLOBAL_AUTOMATIC;
+ break;
+
+ case AT_COPS_MODE_MANUAL:
+ case AT_COPS_MODE_MANUAL_AUTOMATIC:
+ resp.mode = NETWORK_SELECT_MODE_GSM_MANUAL;
+ break;
+
+ case AT_COPS_MODE_DEREGISTER:
+ case AT_COPS_MODE_SET_ONLY:
+ resp.result = TCORE_RETURN_FAILURE;
+ goto OUT;
+ }
+ resp.result = TCORE_RETURN_SUCCESS;
+ }
+ } else {
+ dbg("RESPONSE NOK");
+ resp.result = TCORE_RETURN_FAILURE;
+ }
+
+OUT:
+ ur = tcore_pending_ref_user_request(p);
+ if (ur) {
+ tcore_user_request_send_response(ur, TRESP_NETWORK_GET_PLMN_SELECTION_MODE, sizeof(struct tresp_network_get_plmn_selection_mode), &resp);
+ }
+
+ if (tokens != NULL)
+ tcore_at_tok_free(tokens);
+
+ return;
+}
+
+static void on_response_search_network(TcorePending *p, int data_len, const void *data, void *user_data)
+{
+ UserRequest *ur;
+ struct tresp_network_search resp;
+ int i = 0;
+ char *line = NULL;
+ const TcoreATResponse *atResp = data;
+ GSList *tokens = NULL;
+ GSList *network_token = NULL;
+ int AcT = 0;
+ char *temp_plmn_info = NULL;
+ char *pResp = NULL;
+ int num_network_avail = 0;
+
+ memset(&resp, 0, sizeof(struct tresp_network_search));
+ resp.result = TCORE_RETURN_FAILURE;
+ resp.list_count = 0;
+
+ if (atResp->success > 0) {
+ dbg("RESPONSE OK");
+ if (atResp->lines) {
+ line = (char *) atResp->lines->data;
+ tokens = tcore_at_tok_new(line);
+ num_network_avail = g_slist_length(tokens);
+ dbg(" length of tokens is %d\n", num_network_avail);
+ if (num_network_avail < 1) {
+ msg("invalid message");
+ goto OUT;
+ }
+ }
+
+ resp.result = TCORE_RETURN_SUCCESS;
+ /*
+ * +COPS: [list of supported (<stat>,long alphanumeric <oper>,short alphanumeric <oper>,numeric <oper>[,<AcT>])s]
+ * [,,(list of supported <mode>s),(list of supported <format>s)]
+ */
+
+ /* (2,"IND airtel","airtel","40445",2,),(1,"IND airtel","airtel","40445",0,),(3,"TATA DOCOMO","TATA DO","405034",2,) */
+
+ for (i = 0; ((i < num_network_avail) && (i < MAX_NETWORKS_MANUAL_SEARCH_SUPPORT)); i++) {
+ /* (2,"IND airtel","airtel","40445",2,) */
+ network_token = tcore_at_tok_new(g_slist_nth_data(tokens, i));
+
+ pResp = (tcore_at_tok_nth(network_token, 0));
+ if (pResp != NULL) {
+ dbg("status : %s", pResp);
+ resp.list[i].status = (enum telephony_network_plmn_status) atoi(pResp);
+ }
+
+ if ((pResp = tcore_at_tok_nth(network_token, 1))) { /* Long Aplha name */
+ dbg("Long Aplha name : %s", pResp);
+
+ if (strlen(pResp) > 0)
+ /* Strip off starting quote & ending quote */
+ strncpy(resp.list[i].name, pResp + 1, strlen(pResp) - 2);
+ } else if ((pResp = tcore_at_tok_nth(network_token, 2))) {
+ dbg("Short Aplha name : %s", pResp);
+ /* Short Aplha name */
+ /* Strip off starting quote & ending quote */
+ if (strlen(pResp) > 0)
+ strncpy(resp.list[i].name, pResp + 1, strlen(pResp) - 2);
+ }
+
+ /* PLMN ID */
+ pResp = tcore_at_tok_nth(network_token, 3);
+ if (pResp != NULL) {
+ dbg("PLMN ID : %s", pResp);
temp_plmn_info = util_removeQuotes(pResp);
- }\r
-\r
- memcpy(resp.list[i].plmn, temp_plmn_info, 6);\r
- if (resp.list[i].plmn[5] == '#')\r
- resp.list[i].plmn[5] = '\0';\r
-\r
- /* Parse Access Technology */\r
- if((pResp = tcore_at_tok_nth(tokens, 4)))\r
- {\r
- if(strlen(pResp) > 0){\r
- AcT = atoi(pResp);\r
- \r
- if (0 == AcT)\r
- resp.list[i].act = NETWORK_ACT_GSM;\r
- else if(2 == AcT)\r
- resp.list[i].act = NETWORK_ACT_UMTS;\r
- }\r
- }\r
-\r
- dbg("Operator [%d] :: stat = %d, Name =%s, plmnId = %s, AcT=%d\n", resp.list_count, resp.list[i].status, resp.list[i].name, resp.list[i].plmn, resp.list[i].act);\r
- resp.list_count++;\r
-\r
- tcore_at_tok_free(network_token);\r
- }\r
- }\r
- else\r
- {\r
- dbg("RESPONSE NOK");\r
- resp.result = TCORE_RETURN_FAILURE;\r
- }\r
-\r
-OUT:\r
- ur = tcore_pending_ref_user_request(p);\r
- if (ur) {\r
- tcore_user_request_send_response(ur, TRESP_NETWORK_SEARCH, sizeof(struct tresp_network_search), &resp);\r
- }\r
-
- if(tokens)
- tcore_at_tok_free(tokens);\r
-
- if(temp_plmn_info)
+ }
+
+ memcpy(resp.list[i].plmn, temp_plmn_info, 6);
+ if (resp.list[i].plmn[5] == '#')
+ resp.list[i].plmn[5] = '\0';
+
+ /* Parse Access Technology */
+ if ((pResp = tcore_at_tok_nth(tokens, 4))) {
+ if (strlen(pResp) > 0) {
+ AcT = atoi(pResp);
+
+ if (0 == AcT)
+ resp.list[i].act = NETWORK_ACT_GSM;
+ else if (2 == AcT)
+ resp.list[i].act = NETWORK_ACT_UMTS;
+ }
+ }
+
+ dbg("Operator [%d] :: stat = %d, Name =%s, plmnId = %s, AcT=%d\n", resp.list_count, resp.list[i].status, resp.list[i].name, resp.list[i].plmn, resp.list[i].act);
+ resp.list_count++;
+
+ tcore_at_tok_free(network_token);
+ }
+ } else {
+ dbg("RESPONSE NOK");
+ resp.result = TCORE_RETURN_FAILURE;
+ }
+
+OUT:
+ ur = tcore_pending_ref_user_request(p);
+ if (ur) {
+ tcore_user_request_send_response(ur, TRESP_NETWORK_SEARCH, sizeof(struct tresp_network_search), &resp);
+ }
+
+ if (tokens)
+ tcore_at_tok_free(tokens);
+
+ if (temp_plmn_info)
free(temp_plmn_info);
-
- return;\r
-}\r
-\r
-static void on_response_set_umts_band(TcorePending *p, int data_len, const void *data, void *user_data)\r
-{\r
- const TcoreATResponse *atResp = data;\r
-\r
- dbg("On Response Set UMTS Band");\r
- \r
- if(atResp->success > 0) {\r
- dbg("Response OK");\r
- }\r
- else {\r
- dbg("Response NOK");\r
- }\r
-\r
- dbg("Wait for response of XRAT before sending final band setting response to AP");\r
- return;\r
-}\r
-\r
-\r
-static void on_response_set_gsm_band(TcorePending *p, int data_len, const void *data, void *user_data)\r
-{\r
- const TcoreATResponse *atResp = data;\r
-\r
- dbg("On Response Set GSM Band");\r
- if(atResp->success > 0){\r
- dbg("Response OK");\r
- }\r
- else{\r
- dbg("Response NOK");\r
- }\r
-\r
- dbg("Wait for response of XRAT before sending final band setting response to AP");\r
- return;\r
-}\r
-\r
-static void on_response_get_umts_band(TcorePending *p, int data_len, const void *data, void *user_data)\r
-{\r
- const TcoreATResponse *atResp = data;\r
- GSList *tokens = NULL;\r
- const char *line=NULL;\r
- int total_umts_bands = 0;\r
- int i = 0;\r
- char *band_token = NULL;\r
- char umts_band[20] = {0};\r
- char umts_band_1 = 0;\r
- char umts_band_2 = 0;\r
- char umts_band_5 = 0;\r
- UserRequest *ur = NULL;\r
- struct tresp_network_get_band resp = {0};\r
- \r
- dbg("Entry on_response_get_umts_band");\r
-\r
- resp.mode = NETWORK_BAND_MODE_PREFERRED;\r
- resp.result = TCORE_RETURN_SUCCESS;\r
-\r
- if(atResp->success > 0)\r
- {\r
- dbg("RESPONSE OK");\r
- if(atResp->lines) {\r
- line = (char*)atResp->lines->data;\r
- tokens = tcore_at_tok_new(line);\r
- total_umts_bands = g_slist_length(tokens);\r
- dbg("Total UMTS bands enabled are : %d\n", total_umts_bands);\r
- if (total_umts_bands < 1) {\r
- goto OUT;\r
- }\r
- }\r
- }\r
- else\r
- {\r
- dbg("RESPONSE NOK");\r
- goto OUT;\r
- }\r
-\r
- for (i = 0; i<total_umts_bands; i++)\r
- {\r
- band_token = tcore_at_tok_nth(tokens, i);\r
-\r
- if(band_token == NULL)\r
- continue;\r
- \r
- memset(umts_band, 0x00, sizeof(umts_band));\r
-\r
- if(atoi(band_token) == 0){ /* 0 means UMTS automatic */\r
- umts_band_1 = umts_band_2 = umts_band_5 = TRUE;\r
- break;\r
- }\r
- \r
- /* Strip off starting quotes & ending quotes */\r
- strncpy(umts_band, band_token+1, strlen(band_token)-2);\r
-\r
- if (!strcmp(umts_band, "UMTS_BAND_I")) {\r
- umts_band_1 = TRUE;\r
- }\r
- else if (!strcmp(umts_band, "UMTS_BAND_II")){\r
- umts_band_2 = TRUE;\r
- }\r
- else if (!strcmp(umts_band, "UMTS_BAND_II")){\r
- umts_band_5 = TRUE;\r
- }\r
- else{\r
- /* Telephony is not interest */\r
- dbg("Telephony is not interested in %s band", umts_band);\r
- }\r
- }\r
-\r
-OUT:\r
- if((umts_band_1) && (umts_band_2) && (umts_band_5)){\r
- resp.band = NETWORK_BAND_TYPE_WCDMA;\r
- }\r
- else if (umts_band_1){\r
- resp.band = NETWORK_BAND_TYPE_WCDMA2100;\r
- }\r
- else if (umts_band_2){\r
- resp.band = NETWORK_BAND_TYPE_WCDMA1900;\r
- }\r
- else if (umts_band_5){\r
- resp.band = NETWORK_BAND_TYPE_WCDMA850;\r
- }\r
- else{\r
- resp.result = TCORE_RETURN_FAILURE;\r
- }\r
- \r
- dbg("Final resp.band sent to TS = %d", resp.band);\r
-\r
- ur = tcore_pending_ref_user_request(p);\r
- if (ur) {\r
- tcore_user_request_send_response(ur, TRESP_NETWORK_GET_BAND, sizeof(struct tresp_network_get_band), &resp);\r
- }\r
- \r
- if(tokens != NULL)\r
- tcore_at_tok_free(tokens);\r
- \r
- dbg("Exit on_response_get_umts_band");\r
- return;\r
-}\r
-\r
-static void on_response_get_gsm_band(TcorePending *p, int data_len, const void *data, void *user_data)\r
-{\r
- struct tresp_network_get_band resp = {0};\r
- const TcoreATResponse *atResp = data;\r
- GSList *tokens = NULL;\r
- int total_gsm_bands = 0;\r
- const char *line=NULL;\r
- int i = 0;\r
- char *band_token = NULL;\r
- UserRequest *ur = NULL;\r
- int gsm_850 = 0;\r
- int gsm_900 = 0;\r
- int gsm_1800 = 0;\r
- int gsm_1900 = 0;\r
- \r
- dbg("Entry on_response_get_gsm_band");\r
- \r
- resp.mode = NETWORK_BAND_MODE_PREFERRED;\r
- resp.result = TCORE_RETURN_SUCCESS;\r
- \r
- if(atResp->success > 0)\r
- {\r
- dbg("RESPONSE OK");\r
- if(atResp->lines) {\r
- line = (char*)atResp->lines->data;\r
- tokens = tcore_at_tok_new(line);\r
- total_gsm_bands = g_slist_length(tokens);\r
- dbg("Total GSM bands enabled are : %d\n", total_gsm_bands);\r
- if (total_gsm_bands < 1)\r
- goto OUT;\r
- }\r
- }\r
-\r
- for (i = 0; i<total_gsm_bands; i++)\r
- {\r
- band_token = tcore_at_tok_nth(tokens, i);\r
-\r
- if(band_token == NULL)\r
- continue;\r
-\r
- if(atoi(band_token) == 0){ /* 0 means GSM automatic */\r
- gsm_850 = gsm_900 = gsm_1800 = gsm_1900 = TRUE;\r
- break;\r
- }\r
- \r
- switch(atoi(band_token)) {\r
- case AT_GSM_XBANDSEL_850:\r
- gsm_850 = TRUE;\r
- break;\r
-\r
- case AT_GSM_XBANDSEL_900:\r
- gsm_900 = TRUE;\r
- break;\r
-\r
- case AT_GSM_XBANDSEL_1800:\r
- gsm_1800 = TRUE;\r
- break;\r
- \r
- case AT_GSM_XBANDSEL_1900:\r
- gsm_1900 = TRUE;\r
- break;\r
- \r
- default:\r
- break;\r
- }\r
- }\r
- \r
-OUT:\r
-\r
- if(gsm_850 && gsm_900 && gsm_1800 && gsm_1900) {\r
- resp.band = NETWORK_BAND_TYPE_GSM;\r
- }\r
- else if (gsm_850 && gsm_1900) {\r
- resp.band = NETWORK_BAND_TYPE_GSM_850_1900;\r
- }\r
- else if (gsm_900 && gsm_1800) {\r
- resp.band = NETWORK_BAND_TYPE_GSM_900_1800;\r
- }\r
- else if (gsm_1900) {\r
- resp.band = NETWORK_BAND_TYPE_GSM1900;\r
- }\r
- else if (gsm_850) {\r
- resp.band = NETWORK_BAND_TYPE_GSM850;\r
- }\r
- else if (gsm_1800) {\r
- resp.band = NETWORK_BAND_TYPE_GSM1800;\r
- }\r
- else if (gsm_900) {\r
- resp.band = NETWORK_BAND_TYPE_GSM900;\r
- }\r
- else{\r
- resp.result = TCORE_RETURN_FAILURE;\r
- }\r
-\r
- dbg("Final resp.band sent to TS = %d", resp.band);\r
-\r
- ur = tcore_pending_ref_user_request(p);\r
- if (ur) {\r
- tcore_user_request_send_response(ur, TRESP_NETWORK_GET_BAND, sizeof(struct tresp_network_get_band), &resp);\r
- }\r
-\r
- if(tokens != NULL)\r
- tcore_at_tok_free(tokens);\r
- \r
- dbg("Exit on_response_get_gsm_band");\r
- return;\r
-}\r
-\r
-\r
-static void on_response_get_xrat(TcorePending *p, int data_len, const void *data, void *user_data)\r
-{\r
- TcoreHal *h = NULL;\r
- UserRequest *ur = NULL;\r
-\r
- TcoreATRequest *atreq;\r
- char*cmd_str = NULL;\r
- UserRequest *dup_ur = NULL;\r
- const TcoreATResponse *atResp = data;\r
- const char *line=NULL;\r
- char *pResp = NULL;\r
- GSList *tokens = NULL;\r
- TcorePending *pending = NULL;\r
- CoreObject *o = NULL;\r
- int cp_xrat = 0;\r
- struct tresp_network_get_band resp = {0};\r
-\r
- dbg("Enter on_response_get_xrat !!");\r
-\r
- resp.mode = NETWORK_BAND_MODE_PREFERRED;\r
-\r
- ur = tcore_pending_ref_user_request(p);\r
- h = tcore_object_get_hal(tcore_pending_ref_core_object(p));\r
- o = tcore_pending_ref_core_object(p);\r
-\r
- if(atResp->success > 0)\r
- {\r
- dbg("RESPONSE OK");\r
- if(atResp->lines) {\r
- line = (char*)atResp->lines->data;\r
- tokens = tcore_at_tok_new(line);\r
- if ( g_slist_length(tokens) < 1){\r
- msg("invalid message");\r
- goto OUT;\r
- }\r
- }\r
-\r
- if((pResp = tcore_at_tok_nth(tokens, 0))){\r
- cp_xrat = atoi(pResp);\r
-\r
- if((cp_xrat == AT_XRAT_DUAL)){ /* mode is Dual, send reply to Telephony */\r
- resp.result = TCORE_RETURN_SUCCESS;\r
- resp.band = NETWORK_BAND_TYPE_ANY;\r
- \r
- ur = tcore_pending_ref_user_request(p);\r
- if (ur) {\r
- tcore_user_request_send_response(ur, TRESP_NETWORK_GET_BAND, sizeof(struct tresp_network_get_band), &resp);\r
- }\r
- goto OUT;\r
- }\r
- else if((cp_xrat == AT_XRAT_UMTS)){\r
- /* Get UMTS Band Information */\r
- dup_ur = tcore_user_request_ref(ur); /* duplicate user request for AT+XUBANDSEL */\r
- cmd_str = g_strdup_printf("AT+XUBANDSEL?");\r
- atreq = tcore_at_request_new(cmd_str, "+XUBANDSEL", TCORE_AT_SINGLELINE);\r
- pending = tcore_pending_new(o, 0);\r
- tcore_pending_set_request_data(pending, 0, atreq);\r
- tcore_pending_set_response_callback(pending, on_response_get_umts_band, NULL);\r
- tcore_pending_link_user_request(pending, ur);\r
- tcore_pending_set_send_callback(pending, on_confirmation_network_message_send, NULL);\r
- tcore_hal_send_request(h, pending);\r
+
+ return;
+}
+
+static void on_response_set_umts_band(TcorePending *p, int data_len, const void *data, void *user_data)
+{
+ const TcoreATResponse *atResp = data;
+
+ dbg("On Response Set UMTS Band");
+
+ if (atResp->success > 0) {
+ dbg("Response OK");
+ } else {
+ dbg("Response NOK");
+ }
+
+ dbg("Wait for response of XRAT before sending final band setting response to AP");
+ return;
+}
+
+
+static void on_response_set_gsm_band(TcorePending *p, int data_len, const void *data, void *user_data)
+{
+ const TcoreATResponse *atResp = data;
+
+ dbg("On Response Set GSM Band");
+ if (atResp->success > 0) {
+ dbg("Response OK");
+ } else {
+ dbg("Response NOK");
+ }
+
+ dbg("Wait for response of XRAT before sending final band setting response to AP");
+ return;
+}
+
+static void on_response_get_umts_band(TcorePending *p, int data_len, const void *data, void *user_data)
+{
+ const TcoreATResponse *atResp = data;
+ GSList *tokens = NULL;
+ const char *line = NULL;
+ int total_umts_bands = 0;
+ int i = 0;
+ char *band_token = NULL;
+ char umts_band[20] = {0};
+ char umts_band_1 = 0;
+ char umts_band_2 = 0;
+ char umts_band_5 = 0;
+ UserRequest *ur = NULL;
+ struct tresp_network_get_band resp = {0};
+
+ dbg("Entry on_response_get_umts_band");
+
+ resp.mode = NETWORK_BAND_MODE_PREFERRED;
+ resp.result = TCORE_RETURN_SUCCESS;
+
+ if (atResp->success > 0) {
+ dbg("RESPONSE OK");
+ if (atResp->lines) {
+ line = (char *) atResp->lines->data;
+ tokens = tcore_at_tok_new(line);
+ total_umts_bands = g_slist_length(tokens);
+ dbg("Total UMTS bands enabled are : %d\n", total_umts_bands);
+ if (total_umts_bands < 1) {
+ goto OUT;
+ }
+ }
+ } else {
+ dbg("RESPONSE NOK");
+ goto OUT;
+ }
+
+ for (i = 0; i < total_umts_bands; i++) {
+ band_token = tcore_at_tok_nth(tokens, i);
+
+ if (band_token == NULL)
+ continue;
+
+ memset(umts_band, 0x00, sizeof(umts_band));
+
+ if (atoi(band_token) == 0) { /* 0 means UMTS automatic */
+ umts_band_1 = umts_band_2 = umts_band_5 = TRUE;
+ break;
+ }
+
+ /* Strip off starting quotes & ending quotes */
+ strncpy(umts_band, band_token + 1, strlen(band_token) - 2);
+
+ if (!strcmp(umts_band, "UMTS_BAND_I")) {
+ umts_band_1 = TRUE;
+ } else if (!strcmp(umts_band, "UMTS_BAND_II")) {
+ umts_band_2 = TRUE;
+ } else if (!strcmp(umts_band, "UMTS_BAND_II")) {
+ umts_band_5 = TRUE;
+ } else {
+ /* Telephony is not interest */
+ dbg("Telephony is not interested in %s band", umts_band);
+ }
+ }
+
+OUT:
+ if ((umts_band_1) && (umts_band_2) && (umts_band_5)) {
+ resp.band = NETWORK_BAND_TYPE_WCDMA;
+ } else if (umts_band_1) {
+ resp.band = NETWORK_BAND_TYPE_WCDMA2100;
+ } else if (umts_band_2) {
+ resp.band = NETWORK_BAND_TYPE_WCDMA1900;
+ } else if (umts_band_5) {
+ resp.band = NETWORK_BAND_TYPE_WCDMA850;
+ } else {
+ resp.result = TCORE_RETURN_FAILURE;
+ }
+
+ dbg("Final resp.band sent to TS = %d", resp.band);
+
+ ur = tcore_pending_ref_user_request(p);
+ if (ur) {
+ tcore_user_request_send_response(ur, TRESP_NETWORK_GET_BAND, sizeof(struct tresp_network_get_band), &resp);
+ }
+
+ if (tokens != NULL)
+ tcore_at_tok_free(tokens);
+
+ dbg("Exit on_response_get_umts_band");
+ return;
+}
+
+static void on_response_get_gsm_band(TcorePending *p, int data_len, const void *data, void *user_data)
+{
+ struct tresp_network_get_band resp = {0};
+ const TcoreATResponse *atResp = data;
+ GSList *tokens = NULL;
+ int total_gsm_bands = 0;
+ const char *line = NULL;
+ int i = 0;
+ char *band_token = NULL;
+ UserRequest *ur = NULL;
+ int gsm_850 = 0;
+ int gsm_900 = 0;
+ int gsm_1800 = 0;
+ int gsm_1900 = 0;
+
+ dbg("Entry on_response_get_gsm_band");
+
+ resp.mode = NETWORK_BAND_MODE_PREFERRED;
+ resp.result = TCORE_RETURN_SUCCESS;
+
+ if (atResp->success > 0) {
+ dbg("RESPONSE OK");
+ if (atResp->lines) {
+ line = (char *) atResp->lines->data;
+ tokens = tcore_at_tok_new(line);
+ total_gsm_bands = g_slist_length(tokens);
+ dbg("Total GSM bands enabled are : %d\n", total_gsm_bands);
+ if (total_gsm_bands < 1)
+ goto OUT;
+ }
+ }
+
+ for (i = 0; i < total_gsm_bands; i++) {
+ band_token = tcore_at_tok_nth(tokens, i);
+
+ if (band_token == NULL)
+ continue;
+
+ if (atoi(band_token) == 0) { /* 0 means GSM automatic */
+ gsm_850 = gsm_900 = gsm_1800 = gsm_1900 = TRUE;
+ break;
+ }
+
+ switch (atoi(band_token)) {
+ case AT_GSM_XBANDSEL_850:
+ gsm_850 = TRUE;
+ break;
+
+ case AT_GSM_XBANDSEL_900:
+ gsm_900 = TRUE;
+ break;
+
+ case AT_GSM_XBANDSEL_1800:
+ gsm_1800 = TRUE;
+ break;
+
+ case AT_GSM_XBANDSEL_1900:
+ gsm_1900 = TRUE;
+ break;
+
+ default:
+ break;
+ }
+ }
+
+OUT:
+
+ if (gsm_850 && gsm_900 && gsm_1800 && gsm_1900) {
+ resp.band = NETWORK_BAND_TYPE_GSM;
+ } else if (gsm_850 && gsm_1900) {
+ resp.band = NETWORK_BAND_TYPE_GSM_850_1900;
+ } else if (gsm_900 && gsm_1800) {
+ resp.band = NETWORK_BAND_TYPE_GSM_900_1800;
+ } else if (gsm_1900) {
+ resp.band = NETWORK_BAND_TYPE_GSM1900;
+ } else if (gsm_850) {
+ resp.band = NETWORK_BAND_TYPE_GSM850;
+ } else if (gsm_1800) {
+ resp.band = NETWORK_BAND_TYPE_GSM1800;
+ } else if (gsm_900) {
+ resp.band = NETWORK_BAND_TYPE_GSM900;
+ } else {
+ resp.result = TCORE_RETURN_FAILURE;
+ }
+
+ dbg("Final resp.band sent to TS = %d", resp.band);
+
+ ur = tcore_pending_ref_user_request(p);
+ if (ur) {
+ tcore_user_request_send_response(ur, TRESP_NETWORK_GET_BAND, sizeof(struct tresp_network_get_band), &resp);
+ }
+
+ if (tokens != NULL)
+ tcore_at_tok_free(tokens);
+
+ dbg("Exit on_response_get_gsm_band");
+ return;
+}
+
+
+static void on_response_get_xrat(TcorePending *p, int data_len, const void *data, void *user_data)
+{
+ TcoreHal *h = NULL;
+ UserRequest *ur = NULL;
+
+ TcoreATRequest *atreq;
+ char *cmd_str = NULL;
+ UserRequest *dup_ur = NULL;
+ const TcoreATResponse *atResp = data;
+ const char *line = NULL;
+ char *pResp = NULL;
+ GSList *tokens = NULL;
+ TcorePending *pending = NULL;
+ CoreObject *o = NULL;
+ int cp_xrat = 0;
+ struct tresp_network_get_band resp = {0};
+
+ dbg("Enter on_response_get_xrat !!");
+
+ resp.mode = NETWORK_BAND_MODE_PREFERRED;
+
+ ur = tcore_pending_ref_user_request(p);
+ h = tcore_object_get_hal(tcore_pending_ref_core_object(p));
+ o = tcore_pending_ref_core_object(p);
+
+ if (atResp->success > 0) {
+ dbg("RESPONSE OK");
+ if (atResp->lines) {
+ line = (char *) atResp->lines->data;
+ tokens = tcore_at_tok_new(line);
+ if (g_slist_length(tokens) < 1) {
+ msg("invalid message");
+ goto OUT;
+ }
+ }
+
+ if ((pResp = tcore_at_tok_nth(tokens, 0))) {
+ cp_xrat = atoi(pResp);
+
+ if ((cp_xrat == AT_XRAT_DUAL)) { /* mode is Dual, send reply to Telephony */
+ resp.result = TCORE_RETURN_SUCCESS;
+ resp.band = NETWORK_BAND_TYPE_ANY;
+
+ ur = tcore_pending_ref_user_request(p);
+ if (ur) {
+ tcore_user_request_send_response(ur, TRESP_NETWORK_GET_BAND, sizeof(struct tresp_network_get_band), &resp);
+ }
+ goto OUT;
+ } else if ((cp_xrat == AT_XRAT_UMTS)) {
+ /* Get UMTS Band Information */
+ dup_ur = tcore_user_request_ref(ur); /* duplicate user request for AT+XUBANDSEL */
+ cmd_str = g_strdup_printf("AT+XUBANDSEL?");
+ atreq = tcore_at_request_new(cmd_str, "+XUBANDSEL", TCORE_AT_SINGLELINE);
+ pending = tcore_pending_new(o, 0);
+ tcore_pending_set_request_data(pending, 0, atreq);
+ tcore_pending_set_response_callback(pending, on_response_get_umts_band, NULL);
+ tcore_pending_link_user_request(pending, ur);
+ tcore_pending_set_send_callback(pending, on_confirmation_network_message_send, NULL);
+ tcore_hal_send_request(h, pending);
g_free(cmd_str);
- }\r
- else if((cp_xrat == AT_XRAT_UMTS)){\r
- /* Get GSM Band Information */\r
- dup_ur = tcore_user_request_ref(ur); /* duplicate user request for AT+XBANDSEL */\r
- cmd_str = g_strdup_printf("AT+XBANDSEL?");\r
- atreq = tcore_at_request_new(cmd_str, "+XBANDSEL", TCORE_AT_SINGLELINE);\r
- pending = tcore_pending_new(o, 0);\r
- tcore_pending_set_request_data(pending, 0, atreq);\r
- tcore_pending_set_response_callback(pending, on_response_get_gsm_band, NULL);\r
- tcore_pending_link_user_request(pending, dup_ur);\r
- tcore_pending_set_send_callback(pending, on_confirmation_network_message_send, NULL);\r
- tcore_hal_send_request(h, pending);\r
+ } else if ((cp_xrat == AT_XRAT_UMTS)) {
+ /* Get GSM Band Information */
+ dup_ur = tcore_user_request_ref(ur); /* duplicate user request for AT+XBANDSEL */
+ cmd_str = g_strdup_printf("AT+XBANDSEL?");
+ atreq = tcore_at_request_new(cmd_str, "+XBANDSEL", TCORE_AT_SINGLELINE);
+ pending = tcore_pending_new(o, 0);
+ tcore_pending_set_request_data(pending, 0, atreq);
+ tcore_pending_set_response_callback(pending, on_response_get_gsm_band, NULL);
+ tcore_pending_link_user_request(pending, dup_ur);
+ tcore_pending_set_send_callback(pending, on_confirmation_network_message_send, NULL);
+ tcore_hal_send_request(h, pending);
g_free(cmd_str);
- }\r
- }\r
- }\r
- else {\r
- dbg("RESPONSE NOK");\r
- \r
- resp.result = TCORE_RETURN_FAILURE;\r
- resp.band = NETWORK_BAND_TYPE_ANY;\r
- \r
- ur = tcore_pending_ref_user_request(p);\r
- if (ur) {\r
- tcore_user_request_send_response(ur, TRESP_NETWORK_GET_BAND, sizeof(struct tresp_network_get_band), &resp);\r
- }\r
- }\r
-OUT:\r
- \r
- if(tokens != NULL)\r
- tcore_at_tok_free(tokens);\r
- \r
- dbg("Exit on_response_get_xrat !!");\r
- \r
- return;\r
-}\r
-\r
-\r
-static void on_response_set_xrat(TcorePending *p, int data_len, const void *data, void *user_data)\r
-{\r
- UserRequest *ur = NULL;\r
- struct tresp_network_set_band resp = {0};\r
- const TcoreATResponse *atResp = data;\r
-\r
- dbg("On Response Set XRAT");\r
- \r
- if(atResp->success > 0){\r
- dbg("Response OK");\r
- resp.result = TCORE_RETURN_SUCCESS;\r
- }else{\r
- dbg("Response NOK");\r
- resp.result = TCORE_RETURN_FAILURE;\r
- }\r
-\r
- ur = tcore_pending_ref_user_request(p);\r
- if (ur) {\r
- tcore_user_request_send_response(ur, TRESP_NETWORK_SET_BAND, sizeof(struct tresp_network_set_band), &resp);\r
- }\r
-\r
- return;\r
-}\r
-\r
-static void on_response_set_preferred_plmn(TcorePending *p, int data_len, const void *data, void *user_data)\r
-{\r
- UserRequest *ur = NULL;\r
- struct tresp_network_set_preferred_plmn resp = {0};\r
- const TcoreATResponse *atResp = data;\r
-\r
- dbg("ENTER on_response_set_preferred_plmn");\r
-\r
- if(atResp->success > 0)\r
- {\r
- dbg("Response OK");\r
- resp.result = TCORE_RETURN_SUCCESS;\r
- }else\r
- {\r
- dbg("Response NOK");\r
- resp.result = TCORE_RETURN_FAILURE;\r
- }\r
- \r
- ur = tcore_pending_ref_user_request(p);\r
- if (ur) {\r
- tcore_user_request_send_response(ur, TRESP_NETWORK_SET_PREFERRED_PLMN, sizeof(struct tresp_network_set_preferred_plmn), &resp);\r
- }\r
-\r
- dbg("Exit on_response_set_preferred_plmn");\r
- return;\r
-}\r
-\r
-static void on_response_get_nitz_name(TcorePending *p, int data_len, const void *data, void *user_data)\r
-{\r
-\r
- \r
- const TcoreATResponse *atResp = data;\r
- GSList *tokens = NULL;\r
- const char *line=NULL;\r
- CoreObject *o = NULL;\r
- struct tnoti_network_identity noti;\r
- int nol = 0;\r
- int count = 0;\r
- int net_name_type = 0;\r
- char *pResp = NULL;\r
- \r
- dbg("Entry on_response_get_nitz_name (+XCOPS)");\r
- o = tcore_pending_ref_core_object(p);\r
- if(atResp->success > 0)\r
- {\r
- dbg("RESPONSE OK");\r
-\r
- if(atResp->lines) {\r
- nol = g_slist_length(atResp->lines);\r
- if(nol > 3){\r
- msg("invalid message");\r
- goto OUT;\r
- }\r
-\r
- for(count =0; count < nol; count++){\r
- //parse each line \r
- line = g_slist_nth_data(atResp->lines, count);\r
- tokens = tcore_at_tok_new(line);\r
- dbg("line %d start---------------",count);\r
-\r
- if ((pResp = tcore_at_tok_nth(tokens, 0))){\r
- net_name_type = atoi(pResp);\r
- dbg("Net name type : %d", net_name_type);\r
- \r
- switch(net_name_type)\r
- {\r
- case 0: /* plmn_id (mcc, mnc) */\r
- if ((pResp = tcore_at_tok_nth(tokens, 1))){\r
- strncpy(noti.plmn, pResp+1, strlen(pResp)-2); /* skip quotes (") while copying */\r
- }\r
- break;\r
-\r
- case 5: /* Short Nitz name*/\r
- if ((pResp = tcore_at_tok_nth(tokens, 1))){\r
- strncpy(noti.short_name, pResp+1, strlen(pResp)-2); /* skip quotes (") while copying */\r
- }\r
- break;\r
-\r
- case 6: /* Full Nitz name */\r
- if ((pResp = tcore_at_tok_nth(tokens, 1))){\r
- strncpy(noti.full_name, pResp+1, strlen(pResp)-2); /* skip quotes (") while copying */\r
- }\r
- break;\r
-\r
- default:\r
- break;\r
- }\r
- }\r
- if(tokens != NULL)\r
- tcore_at_tok_free(tokens);\r
- }\r
- \r
- tcore_server_send_notification(tcore_plugin_ref_server(tcore_object_ref_plugin(o)), o, TNOTI_NETWORK_IDENTITY,\r
- sizeof(struct tnoti_network_identity), ¬i);\r
- }\r
- }\r
- else{\r
- dbg("RESPONSE NOK");\r
- }\r
-\r
-OUT:\r
- dbg("Exit on_response_get_nitz_name");\r
-\r
-}\r
-\r
-static void on_response_get_preferred_plmn(TcorePending *p, int data_len, const void *data, void *user_data)\r
-{\r
- UserRequest *ur;\r
- int i = 0;\r
- char* line=NULL;\r
- const TcoreATResponse *atResp = data;\r
- GSList *tokens = NULL;\r
- char temp_plmn_info[17] = {0};\r
- char *pResp = NULL;\r
- int plmn_format = 0;\r
- \r
- struct tresp_network_get_preferred_plmn resp = {0};\r
- int total_lines = 0;\r
- int GSM_AcT2 = 0, GSM_Compact_AcT2= 0, UTRAN_AcT2 = 0;\r
-\r
- dbg("Entry on_response_get_preferred_plmn");\r
-\r
- if(atResp->success > 0)\r
- {\r
- dbg("RESPONSE OK");\r
- if(atResp->lines) {\r
- total_lines = g_slist_length(atResp->lines);\r
- dbg("Total number of network present in Preferred PLMN list is %d\n", total_lines);\r
-\r
- if (total_lines < 1) {\r
- msg("invalid message");\r
- goto OUT;\r
- }\r
-\r
- if (total_lines >= MAX_NETWORKS_PREF_PLMN_SUPPORT)\r
- total_lines = MAX_NETWORKS_PREF_PLMN_SUPPORT;\r
- \r
-/*\r
-+COPL: <index1>,<format>,<oper1>[,<GSM_AcT1>,<GSM_Compact_AcT1>,<UTRAN_AcT1>,<E-UTRAN_AcT1>] [<CR><LF>\r
-+CPOL: <index2>,<format>,<oper2>[,<GSM_AcT2>,<GSM_Compact_AcT2>,<UTRAN_AcT2>,<E-UTRAN_AcT2>]\r
-*/\r
-\r
- resp.result = TCORE_RETURN_SUCCESS;\r
-\r
- for (i=0; i<total_lines; i++) {\r
- /* Take each line response at a time & parse it */\r
- line = tcore_at_tok_nth(atResp->lines, i);\r
- tokens = tcore_at_tok_new(line);\r
-\r
- /* <index2>,<format>,<oper2>[,<GSM_AcT2>,<GSM_Compact_AcT2>,<UTRAN_AcT2>,<E-UTRAN_AcT2>] */\r
-\r
- /* EF Index */\r
- if ((pResp = tcore_at_tok_nth(tokens, 0)))\r
- {\r
- dbg("Index : %s",pResp); \r
- resp.list[i].ef_index = atoi(pResp);\r
- }\r
- /* Format */\r
- if((pResp = tcore_at_tok_nth(tokens, 1)))\r
- {\r
- dbg("format : %s",pResp);\r
- plmn_format = atoi(pResp);\r
- }\r
-\r
- /* Operator PLMN ID */\r
- if((pResp = tcore_at_tok_nth(tokens, 2)))\r
- {\r
- dbg("plmn ID : %s",pResp);\r
-\r
- if(strlen(pResp) > 0){\r
- strncpy(temp_plmn_info, pResp+1, (strlen(pResp))-2);\r
- \r
- //Get only PLMN ID\r
- if (plmn_format == 2)\r
- {\r
- //cp_plmn = util_hexStringToBytes(temp_plmn_info);\r
- \r
- if (strncmp((char *)temp_plmn_info, "000000", 6) == 0)\r
- continue;\r
- \r
- memcpy(resp.list[i].plmn, temp_plmn_info, 6);\r
- if (resp.list[i].plmn[5] == '#')\r
- resp.list[i].plmn[5] = '\0';\r
-\r
- //free(cp_plmn);\r
- }\r
- }\r
- }\r
-\r
- if((pResp = tcore_at_tok_nth(tokens, 3))){\r
- dbg("GSM_AcT2 : %s",pResp);\r
- GSM_AcT2 = atoi(pResp);\r
- }\r
- \r
- if((pResp = tcore_at_tok_nth(tokens, 4))){\r
- dbg("GSM_Compact AcT2 : %s",pResp);\r
- GSM_Compact_AcT2 = atoi(pResp);\r
- }\r
- \r
- if((pResp = tcore_at_tok_nth(tokens, 5))){\r
- dbg("UTRAN_AcT2 : %s",pResp);\r
- UTRAN_AcT2 = atoi(pResp);\r
- }\r
-\r
- if(UTRAN_AcT2 && (GSM_AcT2 ||GSM_Compact_AcT2))\r
- resp.list[i].act = NETWORK_ACT_GSM_UTRAN;\r
- else if (UTRAN_AcT2)\r
- resp.list[i].act = NETWORK_ACT_UMTS;\r
- else if (GSM_AcT2 || GSM_Compact_AcT2)\r
- resp.list[i].act = NETWORK_ACT_GPRS;\r
-\r
- (resp.list_count)++;\r
-\r
- tcore_at_tok_free(tokens);\r
- }\r
- }\r
- }\r
-OUT:\r
- ur = tcore_pending_ref_user_request(p);\r
- if (ur) {\r
- tcore_user_request_send_response(ur, TRESP_NETWORK_GET_PREFERRED_PLMN, sizeof(struct tresp_network_get_preferred_plmn), &resp);\r
- }\r
- dbg("Exit");\r
- return;\r
-}\r
-\r
-static void on_response_get_serving_network(TcorePending *p, int data_len, const void *data, void *user_data)\r
-{\r
- const TcoreATResponse* resp = data;\r
- UserRequest *ur;\r
- struct tresp_network_get_serving_network Tresp = {0};\r
- char plmn[7] = {0};\r
- char *long_plmn_name = NULL;\r
- char *short_plmn_name = NULL;\r
- CoreObject *o;\r
- GSList *tokens=NULL;\r
- const char *line;\r
- int network_mode = -1;\r
- int plmn_format = -1;\r
- int AcT = -1;\r
- struct tnoti_network_identity noti; \r
- char *pResp = NULL;\r
- int nol, count =0;\r
-\r
- o = tcore_pending_ref_core_object(p);\r
-\r
- if(resp->success <= 0){\r
- dbg("RESPONSE NOK");\r
-\r
- ur = tcore_pending_ref_user_request(p);\r
- if (ur) {\r
- Tresp.result = TCORE_RETURN_FAILURE; \r
- tcore_user_request_send_response(ur, TRESP_NETWORK_GET_SERVING_NETWORK, sizeof(struct tresp_network_get_serving_network), &Tresp);\r
- }\r
-\r
- return;\r
+ }
+ }
+ } else {
+ dbg("RESPONSE NOK");
+
+ resp.result = TCORE_RETURN_FAILURE;
+ resp.band = NETWORK_BAND_TYPE_ANY;
+
+ ur = tcore_pending_ref_user_request(p);
+ if (ur) {
+ tcore_user_request_send_response(ur, TRESP_NETWORK_GET_BAND, sizeof(struct tresp_network_get_band), &resp);
+ }
}
- else
- {
- dbg("RESPONSE OK");\r
- nol = g_slist_length(resp->lines);\r
- dbg("nol : %d", nol);\r
-\r
- for(count =0; count < nol; count++){\r
- //parse each line \r
- line = g_slist_nth_data(resp->lines, count);\r
- tokens = tcore_at_tok_new(line);\r
- dbg("line %d start---------------",count);\r
- //mode\r
- if((pResp = tcore_at_tok_nth(tokens, 0))){\r
- dbg("mode : %s",pResp);\r
- network_mode = atoi(pResp);\r
- }\r
-\r
- //format (optional) \r
- if((pResp = tcore_at_tok_nth(tokens, 1)))\r
- {\r
- dbg("format : %s",pResp);\r
- if(strlen(pResp)>0)\r
- plmn_format = atoi(pResp);\r
- }\r
-\r
- //plmn \r
- switch(plmn_format)\r
- {\r
- case AT_COPS_FORMAT_LONG_ALPHANUMERIC: \r
- if((pResp = tcore_at_tok_nth(tokens, 2)))\r
- { \r
- dbg("long PLMN : %s",pResp);\r
- if(strlen(pResp) > 0){\r
- long_plmn_name = util_removeQuotes(pResp);
-\r
- //set network name into po\r
- tcore_network_set_network_name(o,TCORE_NETWORK_NAME_TYPE_FULL,long_plmn_name);\r
- }\r
- }\r
- break;\r
- \r
- case AT_COPS_FORMAT_SHORT_ALPHANUMERIC:\r
- if((pResp = tcore_at_tok_nth(tokens, 2)))\r
- {\r
- dbg("short PLMN : %s",pResp);\r
- if(strlen(pResp)>0){\r
- short_plmn_name = util_removeQuotes(pResp);
- \r
- //set network name into po \r
- tcore_network_set_network_name(o,TCORE_NETWORK_NAME_TYPE_SHORT,short_plmn_name); \r
- }\r
- } \r
- break;\r
-\r
- case AT_COPS_FORMAT_NUMERIC:\r
- if((pResp = tcore_at_tok_nth(tokens, 2)))\r
- {\r
- dbg("numeric : %s", pResp);\r
- if(strlen(pResp)>0){\r
- memset(plmn, 0, 7);\r
-
- /* Strip off starting quotes & ending quotes */\r
- strncpy(plmn, pResp+1, strlen(pResp)-2); \r
- tcore_network_set_plmn(o,plmn);\r
- }\r
- }\r
- break;\r
- \r
- default:\r
- break;\r
- }\r
-\r
- //act \r
- if((pResp = tcore_at_tok_nth(tokens, 3)))\r
- { \r
- dbg("AcT : %s",pResp);\r
- if(strlen(pResp)>0){\r
- AcT = atoi(pResp);\r
- tcore_network_set_access_technology(o, lookup_tbl_access_technology[AcT]);\r
- }\r
- }\r
-\r
- tcore_at_tok_free(tokens);\r
- }\r
-\r
- memcpy(Tresp.plmn, plmn, 7);\r
- tcore_network_get_access_technology(o, &(Tresp.act)); \r
- tcore_network_get_lac(o, &(Tresp.gsm.lac)); \r
-\r
- ur = tcore_pending_ref_user_request(p);\r
- if (ur) {\r
- Tresp.result = TCORE_RETURN_SUCCESS; \r
- tcore_user_request_send_response(ur, TRESP_NETWORK_GET_SERVING_NETWORK, sizeof(struct tresp_network_get_serving_network), &Tresp);\r
- }\r
- else\r
- {\r
- /* Network change noti */\r
- struct tnoti_network_change network_change;\r
-\r
- memset(&network_change, 0, sizeof(struct tnoti_network_change));\r
- memcpy(network_change.plmn, plmn, 7);\r
- tcore_network_get_access_technology(o, &(network_change.act));\r
- tcore_network_get_lac(o, &(network_change.gsm.lac));\r
-\r
- tcore_server_send_notification(tcore_plugin_ref_server(tcore_pending_ref_plugin(p)), tcore_pending_ref_core_object(p),\r
- TNOTI_NETWORK_CHANGE, sizeof(struct tnoti_network_change), &network_change);\r
- dbg("dbg.. network_change.plmn : %s",network_change.plmn);\r
- dbg("dbg.. network_change.act : %d",network_change.act); \r
- dbg("dbg.. network_change.gsm.lac : %d",network_change.gsm.lac);\r
-\r
- if((AT_COPS_MODE_DEREGISTER !=network_mode) &&\r
- (AT_COPS_MODE_SET_ONLY != network_mode)){\r
- /*Network identity noti*/\r
- memset(¬i, 0x0, sizeof(struct tnoti_network_change));\r
- if(long_plmn_name)\r
- memcpy(noti.full_name, long_plmn_name, MIN(33, strlen(long_plmn_name)) );\r
- if(short_plmn_name)\r
- memcpy(noti.short_name, short_plmn_name, MIN(17, strlen(long_plmn_name)) );\r
- memcpy(noti.plmn, plmn,7);\r
- tcore_server_send_notification(tcore_plugin_ref_server(tcore_object_ref_plugin(o)), \r
- o, TNOTI_NETWORK_IDENTITY, sizeof(struct tnoti_network_identity), ¬i); \r
- dbg("dbg.. noti.short_name : %s",noti.short_name);\r
- dbg("dbg.. noti.full_name : %s",noti.full_name); \r
- dbg("dbg.. noti.plmn : %s",noti.plmn); \r
- }\r
- }\r
- if(long_plmn_name)\r
- free(long_plmn_name);\r
- if(short_plmn_name)\r
- free(short_plmn_name);\r
-
- }\r
- return;\r
-}\r
-\r
-static gboolean on_event_ps_network_regist(CoreObject *o, const void *data, void *user_data)\r
-{\r
- struct tnoti_network_registration_status regist_status;\r
- enum telephony_network_service_domain_status cs_status;\r
- enum telephony_network_service_domain_status ps_status;\r
- enum telephony_network_service_type service_type;\r
- enum telephony_network_access_technology act = NETWORK_ACT_UNKNOWN;\r
- struct tnoti_network_location_cellinfo net_lac_cell_info = {0};\r
- struct tnoti_ps_protocol_status noti = {0};\r
- unsigned char svc_domain = NETWORK_SERVICE_DOMAIN_PS;\r
- int stat= 0, AcT=0;\r
- unsigned int lac=0xffff, ci=0xffff;\r
- unsigned int rac = 0xffff;\r
- GSList* tokens = NULL;\r
- char* pResp;\r
- char *line = NULL;\r
- GSList *lines = NULL;\r
-\r
- lines = (GSList*)data;\r
- if (1 != g_slist_length(lines)) {\r
- dbg("unsolicited msg but multiple line");\r
- goto OUT;\r
- }\r
- line = (char*)(lines->data);\r
- dbg("+CGREG NOTI RECEIVED");\r
-\r
-/*\r
-+CREG: <stat> [[,<lac>,<ci>[AcT]]\r
-\r
-Possible values of <stat> can be\r
-0 Not registered, ME is not currently searching a new operator to register to\r
-1 Registered, home network\r
-2 Not registered, but ME is currently searching a new operator to register\r
-3 Registration denied\r
-4 Unknown\r
-5 Registered, in roaming\r
-\r
-<lac>\r
-string type; two byte location area code in hexadecimal format (e.g. �00C3�)\r
-\r
-<ci>\r
-string type; four byte cell ID in hexadecimal format (e.g. �0000A13F�)\r
-\r
-<ACT>\r
-0 GSM\r
-2 UTRAN\r
-3 GSM w/EGPRS\r
-4 UTRAN w/HSDPA\r
-5 UTRAN w/HSUPA\r
-6 UTRAN w/HSDPA and HSUPA\r
-Note: <Act> is supporting from R7 and above Protocol Stack.\r
-\r
-<rac>: is R7 and above feature, string type; one byte routing area code in hexadecimal format.\r
-*/\r
- if (line!=NULL)\r
- {\r
- tokens = tcore_at_tok_new(line);\r
- if(g_slist_length(tokens) < 1) {\r
- msg("invalid message");\r
- goto OUT;\r
- }\r
-\r
- if(!(pResp = g_slist_nth_data(tokens, 0)))\r
- {\r
- dbg("No STAT in +CGREG");\r
- goto OUT;\r
- }\r
- else\r
- {\r
- stat = atoi(pResp); \r
- if((pResp = g_slist_nth_data(tokens, 1)))\r
- lac = atoi(pResp);\r
-\r
- if((pResp = g_slist_nth_data(tokens, 2)))\r
- ci = atoi(pResp);\r
- else\r
- dbg("No ci in +CGREG");\r
- \r
- if((pResp = g_slist_nth_data(tokens, 3)))\r
- AcT = atoi(pResp);\r
- else\r
- dbg("No AcT in +CGREG");\r
- \r
- if((pResp = g_slist_nth_data(tokens, 4)))\r
- rac = atoi(pResp);\r
- else\r
- dbg("No rac in +CGREG");\r
- }\r
-\r
-\r
- dbg("stat=%d, lac=0x%lx, ci=0x%lx, Act=%d, rac = 0x%x", stat, lac, ci, AcT, rac);\r
-\r
- ps_status = lookup_tbl_net_status[stat];\r
- \r
- tcore_network_set_service_status(o, TCORE_NETWORK_SERVICE_DOMAIN_TYPE_PACKET, ps_status);\r
- _ps_set(tcore_object_ref_plugin(o), ps_status);\r
- \r
- tcore_network_get_service_status(o, TCORE_NETWORK_SERVICE_DOMAIN_TYPE_CIRCUIT, &cs_status);\r
-\r
- act = lookup_tbl_access_technology[AcT];\r
- tcore_network_set_access_technology(o, act);\r
-\r
- if (stat == AT_CREG_STAT_REG_ROAM)\r
- tcore_network_set_roaming_state(o, TRUE);\r
- else\r
- tcore_network_set_roaming_state(o, FALSE);\r
-\r
- tcore_network_get_service_type(o, &service_type);\r
- dbg("prev_service_type = 0x%x", service_type);\r
- service_type = _get_service_type(service_type, svc_domain, act, cs_status, ps_status);\r
- dbg("new_service_type = 0x%x", service_type);\r
- tcore_network_set_service_type(o, service_type);\r
-\r
- tcore_network_set_lac(o, lac);\r
- tcore_network_set_cell_id(o, ci);\r
- tcore_network_set_rac(o, rac);\r
-\r
- net_lac_cell_info.lac = lac;\r
- net_lac_cell_info.cell_id = ci;\r
-\r
- tcore_server_send_notification(tcore_plugin_ref_server(tcore_object_ref_plugin(o)), o, TNOTI_NETWORK_LOCATION_CELLINFO,\r
- sizeof(struct tnoti_network_location_cellinfo), &net_lac_cell_info);\r
-\r
- regist_status.cs_domain_status = cs_status;\r
- regist_status.ps_domain_status = ps_status;\r
- regist_status.service_type = service_type;\r
- regist_status.roaming_status = tcore_network_get_roaming_state(o);\r
-\r
- tcore_server_send_notification(tcore_plugin_ref_server(tcore_object_ref_plugin(o)), o,\r
- TNOTI_NETWORK_REGISTRATION_STATUS, sizeof(struct tnoti_network_registration_status), ®ist_status);\r
-\r
- if(service_type == NETWORK_SERVICE_TYPE_HSDPA)\r
- noti.status = TELEPHONY_HSDPA_ON;\r
- else\r
- noti.status = TELEPHONY_HSDPA_OFF;\r
- \r
- tcore_server_send_notification(tcore_plugin_ref_server(tcore_object_ref_plugin(o)), o, TNOTI_PS_PROTOCOL_STATUS,\r
- sizeof(struct tnoti_ps_protocol_status), ¬i);\r
-\r
- /* Get PLMN ID needed to application */\r
- //get_serving_network(o, NULL);\r
-\r
-\r
- }\r
- else\r
- {\r
- dbg("Response NOK");\r
- }\r
-\r
-OUT:\r
- if(NULL!=tokens)\r
- tcore_at_tok_free(tokens);\r
- return TRUE;\r
-}\r
-\r
-static gboolean on_event_cs_network_regist(CoreObject *o, const void *event_info, void *user_data)\r
-{\r
- GSList *lines = NULL;\r
- char *line = NULL;\r
- struct tnoti_network_registration_status regist_status;\r
- enum telephony_network_service_domain_status cs_status;\r
- enum telephony_network_service_domain_status ps_status;\r
- enum telephony_network_service_type service_type;\r
- enum telephony_network_access_technology act = NETWORK_ACT_UNKNOWN;\r
- struct tnoti_network_location_cellinfo net_lac_cell_info = {0};\r
-\r
- \r
- unsigned char svc_domain = NETWORK_SERVICE_DOMAIN_CS;\r
- int stat= 0, AcT=0;\r
- unsigned int lac=0xffff, ci=0xffff;\r
- GSList* tokens = NULL;\r
- char* pResp;\r
-\r
- lines = (GSList*)event_info;\r
- if (1 != g_slist_length(lines)) {\r
- dbg("unsolicited msg but multiple line");\r
- goto OUT;\r
- }\r
- line = (char*)(lines->data);\r
-\r
- dbg("+CREG NOTI RECEIVED");\r
-\r
-/*\r
-+CREG: <stat> [[,<lac>,<ci>[AcT]]\r
-\r
-Possible values of <stat> can be\r
-0 Not registered, ME is not currently searching a new operator to register to\r
-1 Registered, home network\r
-2 Not registered, but ME is currently searching a new operator to register\r
-3 Registration denied\r
-4 Unknown\r
-5 Registered, in roaming\r
-\r
-<lac>\r
-string type; two byte location area code in hexadecimal format (e.g. �00C3�)\r
-\r
-<ci>\r
-string type; four byte cell ID in hexadecimal format (e.g. �0000A13F�)\r
-\r
-<ACT>\r
-0 GSM\r
-2 UTRAN\r
-3 GSM w/EGPRS\r
-4 UTRAN w/HSDPA\r
-5 UTRAN w/HSUPA\r
-6 UTRAN w/HSDPA and HSUPA\r
-Note: <Act> is supporting from R7 and above Protocol Stack.\r
-*/\r
- if (line!=NULL)\r
- {\r
- tokens = tcore_at_tok_new(line);\r
- if(g_slist_length(tokens) < 1) {\r
- msg("invalid message");\r
- goto OUT;\r
- }\r
-\r
- if(!(pResp = g_slist_nth_data(tokens, 0)))\r
- {\r
- dbg("No STAT in +CREG");\r
- goto OUT;\r
- }\r
- else\r
- {\r
- stat = atoi(pResp); \r
- if((pResp = g_slist_nth_data(tokens, 1)))\r
- lac = atoi(pResp);\r
-\r
- if((pResp = g_slist_nth_data(tokens, 2)))\r
- ci = atoi(pResp);\r
- else\r
- dbg("No ci in +CREG");\r
- \r
- if((pResp = g_slist_nth_data(tokens, 3)))\r
- AcT = atoi(pResp);\r
- else\r
- dbg("No AcT in +CREG");\r
- }\r
-\r
-\r
- dbg("stat=%d, lac=0x%lx, ci=0x%lx, Act=%d", stat, lac, ci, AcT);\r
-\r
- cs_status = lookup_tbl_net_status[stat];\r
- tcore_network_set_service_status(o, TCORE_NETWORK_SERVICE_DOMAIN_TYPE_CIRCUIT, cs_status);\r
-\r
- // tcore_network_get_service_status(o, TCORE_NETWORK_SERVICE_DOMAIN_TYPE_CIRCUIT, &cs_status);\r
- tcore_network_get_service_status(o, TCORE_NETWORK_SERVICE_DOMAIN_TYPE_PACKET, &ps_status);\r
-\r
- act = lookup_tbl_access_technology[AcT];\r
- tcore_network_set_access_technology(o, act);\r
-\r
- if (stat == AT_CREG_STAT_REG_ROAM)\r
- tcore_network_set_roaming_state(o, TRUE);\r
- else\r
- tcore_network_set_roaming_state(o, FALSE);\r
-\r
- tcore_network_get_service_type(o, &service_type);\r
- dbg("prev_service_type = 0x%x", service_type);\r
- service_type = _get_service_type(service_type, svc_domain, act, cs_status, ps_status);\r
- dbg("new_service_type = 0x%x", service_type);\r
- tcore_network_set_service_type(o, service_type);\r
-\r
- tcore_network_set_lac(o, lac);\r
- tcore_network_set_cell_id(o, ci);\r
-\r
- net_lac_cell_info.lac = lac;\r
- net_lac_cell_info.cell_id = ci;\r
-\r
- tcore_server_send_notification(tcore_plugin_ref_server(tcore_object_ref_plugin(o)), o, TNOTI_NETWORK_LOCATION_CELLINFO,\r
- sizeof(struct tnoti_network_location_cellinfo), &net_lac_cell_info);\r
-\r
- regist_status.cs_domain_status = cs_status;\r
- regist_status.ps_domain_status = ps_status;\r
- regist_status.service_type = service_type;\r
- regist_status.roaming_status = tcore_network_get_roaming_state(o);\r
-\r
- tcore_server_send_notification(tcore_plugin_ref_server(tcore_object_ref_plugin(o)), o,\r
- TNOTI_NETWORK_REGISTRATION_STATUS, sizeof(struct tnoti_network_registration_status), ®ist_status);\r
-\r
- /* Get PLMN ID needed to application */\r
- if((NETWORK_SERVICE_DOMAIN_STATUS_FULL == cs_status )||\r
- NETWORK_SERVICE_DOMAIN_STATUS_FULL ==ps_status )\r
- get_serving_network(o, NULL);\r
- }\r
- else\r
- {\r
- dbg("Response NOK");\r
- }\r
-\r
-OUT:\r
- if(NULL!=tokens)\r
- tcore_at_tok_free(tokens);\r
- return TRUE;\r
-\r
-}\r
-\r
-static gboolean on_event_network_icon_info(CoreObject *o, const void *event_info, void *user_data)\r
-{\r
- struct tnoti_network_icon_info net_icon_info = {0};\r
- char *line = NULL;\r
- char * rssiToken = NULL;\r
- char *batteryToken = NULL;\r
- GSList* tokens = NULL;\r
- GSList *lines = NULL;\r
-\r
- lines = (GSList*)event_info;\r
- if (1 != g_slist_length(lines)) {\r
- dbg("unsolicited msg but multiple line");\r
- goto OUT;\r
- }\r
- line = (char*)(lines->data);\r
- dbg("+XCIEV Network Icon Info Noti Recieve");\r
- memset(&net_icon_info, 0, sizeof(struct tnoti_network_icon_info));\r
-\r
- if(line != NULL)\r
- {\r
- dbg("Response OK");\r
- \r
- tokens = tcore_at_tok_new(line);\r
- if (g_slist_length(tokens) != 2) {\r
- msg("invalid message");\r
- goto OUT;\r
- }\r
-\r
- rssiToken = (char *)g_slist_nth_data(tokens, 0);\r
-\r
- if (strlen(rssiToken)>0)\r
- {\r
- net_icon_info.type = NETWORK_ICON_INFO_RSSI;\r
- net_icon_info.rssi= atoi(g_slist_nth_data(tokens, 0));\r
- dbg("rssi level : %d",net_icon_info.rssi);\r
- }\r
- \r
- batteryToken = (char *)g_slist_nth_data(tokens,1);\r
- if (strlen(batteryToken)>0)\r
- {\r
- net_icon_info.type = NETWORK_ICON_INFO_BATTERY;\r
- net_icon_info.battery= atoi(g_slist_nth_data(tokens, 1));\r
- dbg("battery level : %d",net_icon_info.battery);\r
- }\r
- \r
- tcore_server_send_notification(tcore_plugin_ref_server(tcore_object_ref_plugin(o)), o, TNOTI_NETWORK_ICON_INFO,\r
- sizeof(struct tnoti_network_icon_info), &net_icon_info);\r
- }\r
- else\r
- {\r
- dbg("Response NOK"); \r
- }\r
-\r
-\r
-OUT:\r
- if(NULL!=tokens)\r
- tcore_at_tok_free(tokens);\r
- \r
- return TRUE;\r
- \r
-}\r
-\r
-static gboolean on_event_network_ctzv_time_info(CoreObject *o, const void *event_info, void *user_data)\r
-{\r
- struct tnoti_network_timeinfo net_time_info = {0};\r
- char *line = NULL;\r
- GSList* tokens = NULL;\r
- char *time= NULL;\r
- char *time_zone = NULL;\r
- GSList *lines = NULL;\r
- char ptime_param[20] = {0};\r
- UserRequest *ur = NULL;\r
- dbg("Enter : on_event_network_ctzv_time_info");\r
-\r
- lines = (GSList*)event_info;\r
- if (1 != g_slist_length(lines)) {\r
- dbg("unsolicited msg but multiple line");\r
- goto OUT;\r
- }\r
- line = (char*)(lines->data);\r
-\r
-/*\r
-+CTZV: <tz>,<time>\r
-<tz> integer value indicating the time zone (e.g. -22 or +34)\r
-<time> string type value; format is “yy/MM/dd,hh:mms”, wherein characters indicates year, month, day, hour,\r
-minutes, seconds.\r
-*/\r
- dbg("Network time info (+CTZV) recieved");\r
- \r
- if (line != NULL)\r
- {\r
- dbg("Response OK");\r
- dbg("noti line is %s", line);\r
- \r
- tokens = tcore_at_tok_new(line);\r
- \r
- if(g_slist_length(tokens) < 2) {\r
- msg("invalid message");\r
- goto OUT;\r
- }\r
-\r
- if ((time_zone = g_slist_nth_data(tokens, 0))){\r
- net_time_info.gmtoff = atoi(time_zone) * 15; /* TZ in minutes */\r
- }\r
-\r
- if (tcore_network_get_plmn(o) != NULL)\r
- strcpy(net_time_info.plmn, tcore_network_get_plmn(o));\r
- \r
- if ((time = g_slist_nth_data(tokens, 1)) && (strlen(time) >18)){\r
- strncpy(ptime_param, time+1, 2); /* skip past initial quote (") */\r
- net_time_info.year = atoi(ptime_param); \r
- \r
- strncpy(ptime_param, time+4, 2); /* skip slash (/) after year param */\r
- net_time_info.month = atoi(ptime_param);\r
- \r
- strncpy(ptime_param, time+7, 2); /* skip past slash (/) after month param */\r
- net_time_info.day = atoi(ptime_param);\r
- \r
- strncpy(ptime_param, time+10, 2); /* skip past comma (,) after day param */\r
- net_time_info.hour = atoi(ptime_param);\r
- \r
- strncpy(ptime_param, time+13, 2); /* skip past colon (:) after hour param */\r
- net_time_info.minute = atoi(ptime_param);\r
- \r
- strncpy(ptime_param, time+16, 2); /* skip past colon (:) after minute param */\r
- net_time_info.second = atoi(ptime_param);\r
- }\r
- tcore_server_send_notification(tcore_plugin_ref_server(tcore_object_ref_plugin(o)), o, TNOTI_NETWORK_TIMEINFO, sizeof(struct tnoti_network_timeinfo), &net_time_info);\r
-\r
- dbg("new pending(AT+XOPS=0/5/6 for Nitz PLMN name)");\r
-\r
- /* Get NITZ name and plmn_id via AT+XCOPS = 0/5/6 */\r
- nwk_prepare_and_send_pending_request(tcore_object_ref_plugin(o), "umts_network", "AT+XCOPS=0;+XCOPS=5;+XCOPS=6", "+XCOPS", TCORE_AT_MULTILINE, ur, on_response_get_nitz_name);\r
- }\r
- else\r
- { \r
- dbg("line is NULL");\r
- }\r
- \r
-OUT:\r
- if(NULL!=tokens)\r
- tcore_at_tok_free(tokens);\r
-\r
- dbg("Exit: on_event_network_ctzv_time_info");\r
- return TRUE;\r
-}\r
-\r
-static void on_sim_resp_hook_get_netname(UserRequest *ur, enum tcore_response_command command, unsigned int data_len,\r
- const void *data, void *user_data)\r
-{\r
- const struct tresp_sim_read *resp = data;\r
- CoreObject *o = user_data;\r
-\r
- if (command == TRESP_SIM_GET_SPN) {\r
- dbg("OK SPN GETTING!!");\r
- dbg("resp->result = 0x%x", resp->result);\r
- dbg("resp->data.spn.display_condition = 0x%x", resp->data.spn.display_condition);\r
- dbg("resp->data.spn.spn = [%s]", resp->data.spn.spn);\r
-\r
- tcore_network_set_network_name(o, TCORE_NETWORK_NAME_TYPE_SPN, (const char *)resp->data.spn.spn);\r
-\r
- /**\r
- * display condition\r
- * bit[0]: 0 = display of registered PLMN name not required when registered PLMN is either HPLMN or a PLMN in the service provider PLMN list\r
- * 1 = display of registered PLMN name required when registered PLMN is either HPLMN or a PLMN in the service provider PLMN list\r
- * bit[1]: 0 = display of the service provider name is required when registered PLMN is neither HPLMN nor a PLMN in the service provider PLMN list\r
- * 1 = display of the service provider name is not required when registered PLMN is neither HPLMN nor a PLMN in the service provider PLMN list\r
- */\r
- if (resp->data.spn.display_condition & 0x01) {\r
- tcore_network_set_network_name_priority(o, TCORE_NETWORK_NAME_PRIORITY_NETWORK);\r
- }\r
- if ((resp->data.spn.display_condition & 0x02) == 0) {\r
- tcore_network_set_network_name_priority(o, TCORE_NETWORK_NAME_PRIORITY_SPN);\r
- }\r
- if ((resp->data.spn.display_condition & 0x03) == 0x01) {\r
- tcore_network_set_network_name_priority(o, TCORE_NETWORK_NAME_PRIORITY_ANY);\r
- }\r
- }\r
-}\r
-\r
-static enum tcore_hook_return on_hook_sim_init(Server *s, CoreObject *source, enum tcore_notification_command command,\r
- unsigned int data_len, void *data, void *user_data)\r
-{\r
- const struct tnoti_sim_status *sim = data;\r
- UserRequest *ur = NULL;\r
-\r
- if (sim->sim_status == SIM_STATUS_INIT_COMPLETED) {\r
- ur = tcore_user_request_new(NULL, NULL);\r
- tcore_user_request_set_command(ur, TREQ_SIM_GET_SPN);\r
- tcore_user_request_set_response_hook(ur, on_sim_resp_hook_get_netname, user_data);\r
- tcore_object_dispatch_request(source, ur);\r
- }\r
-\r
- return TCORE_HOOK_RETURN_CONTINUE;\r
-}\r
-\r
-static TReturn search_network(CoreObject *o, UserRequest *ur)\r
-{\r
- TcoreHal *h = NULL;\r
- TcorePending *pending = NULL;\r
- TcoreATRequest *atreq = NULL;\r
-\r
- char*cmd_str = NULL;\r
- dbg("search_network - ENTER!!");\r
- \r
- if (!o || !ur)\r
- return TCORE_RETURN_EINVAL;\r
-\r
- h = tcore_object_get_hal(o);\r
- pending = tcore_pending_new(o, 0);\r
-\r
- cmd_str = g_strdup_printf("AT+COPS=?");\r
- atreq = tcore_at_request_new(cmd_str, "+COPS", TCORE_AT_SINGLELINE);\r
- \r
- tcore_pending_set_request_data(pending, 0, atreq);\r
- tcore_pending_set_priority(pending, TCORE_PENDING_PRIORITY_DEFAULT);\r
- tcore_pending_set_response_callback(pending, on_response_search_network, NULL);\r
- tcore_pending_link_user_request(pending, ur);\r
- tcore_pending_set_send_callback(pending, on_confirmation_network_message_send, NULL);\r
-\r
- tcore_hal_send_request(h, pending);\r
+OUT:
+
+ if (tokens != NULL)
+ tcore_at_tok_free(tokens);
+
+ dbg("Exit on_response_get_xrat !!");
+
+ return;
+}
+
+
+static void on_response_set_xrat(TcorePending *p, int data_len, const void *data, void *user_data)
+{
+ UserRequest *ur = NULL;
+ struct tresp_network_set_band resp = {0};
+ const TcoreATResponse *atResp = data;
+
+ dbg("On Response Set XRAT");
+
+ if (atResp->success > 0) {
+ dbg("Response OK");
+ resp.result = TCORE_RETURN_SUCCESS;
+ } else {
+ dbg("Response NOK");
+ resp.result = TCORE_RETURN_FAILURE;
+ }
+
+ ur = tcore_pending_ref_user_request(p);
+ if (ur) {
+ tcore_user_request_send_response(ur, TRESP_NETWORK_SET_BAND, sizeof(struct tresp_network_set_band), &resp);
+ }
+
+ return;
+}
+
+static void on_response_set_preferred_plmn(TcorePending *p, int data_len, const void *data, void *user_data)
+{
+ UserRequest *ur = NULL;
+ struct tresp_network_set_preferred_plmn resp = {0};
+ const TcoreATResponse *atResp = data;
+
+ dbg("ENTER on_response_set_preferred_plmn");
+
+ if (atResp->success > 0) {
+ dbg("Response OK");
+ resp.result = TCORE_RETURN_SUCCESS;
+ } else {
+ dbg("Response NOK");
+ resp.result = TCORE_RETURN_FAILURE;
+ }
+
+ ur = tcore_pending_ref_user_request(p);
+ if (ur) {
+ tcore_user_request_send_response(ur, TRESP_NETWORK_SET_PREFERRED_PLMN, sizeof(struct tresp_network_set_preferred_plmn), &resp);
+ }
+
+ dbg("Exit on_response_set_preferred_plmn");
+ return;
+}
+
+static void on_response_get_nitz_name(TcorePending *p, int data_len, const void *data, void *user_data)
+{
+ const TcoreATResponse *atResp = data;
+ GSList *tokens = NULL;
+ const char *line = NULL;
+ CoreObject *o = NULL;
+ struct tnoti_network_identity noti;
+ int nol = 0;
+ int count = 0;
+ int net_name_type = 0;
+ char *pResp = NULL;
+
+ dbg("Entry on_response_get_nitz_name (+XCOPS)");
+ o = tcore_pending_ref_core_object(p);
+ if (atResp->success > 0) {
+ dbg("RESPONSE OK");
+
+ if (atResp->lines) {
+ nol = g_slist_length(atResp->lines);
+ if (nol > 3) {
+ msg("invalid message");
+ goto OUT;
+ }
+
+ for (count = 0; count < nol; count++) {
+ // parse each line
+ line = g_slist_nth_data(atResp->lines, count);
+ tokens = tcore_at_tok_new(line);
+ dbg("line %d start---------------", count);
+
+ if ((pResp = tcore_at_tok_nth(tokens, 0))) {
+ net_name_type = atoi(pResp);
+ dbg("Net name type : %d", net_name_type);
+
+ switch (net_name_type) {
+ case 0: /* plmn_id (mcc, mnc) */
+ if ((pResp = tcore_at_tok_nth(tokens, 1))) {
+ strncpy(noti.plmn, pResp + 1, strlen(pResp) - 2); /* skip quotes (") while copying */
+ }
+ break;
+
+ case 5: /* Short Nitz name*/
+ if ((pResp = tcore_at_tok_nth(tokens, 1))) {
+ strncpy(noti.short_name, pResp + 1, strlen(pResp) - 2); /* skip quotes (") while copying */
+ }
+ break;
+
+ case 6: /* Full Nitz name */
+ if ((pResp = tcore_at_tok_nth(tokens, 1))) {
+ strncpy(noti.full_name, pResp + 1, strlen(pResp) - 2); /* skip quotes (") while copying */
+ }
+ break;
+
+ default:
+ break;
+ }
+ }
+ if (tokens != NULL)
+ tcore_at_tok_free(tokens);
+ }
+
+ tcore_server_send_notification(tcore_plugin_ref_server(tcore_object_ref_plugin(o)), o, TNOTI_NETWORK_IDENTITY,
+ sizeof(struct tnoti_network_identity), ¬i);
+ }
+ } else {
+ dbg("RESPONSE NOK");
+ }
+
+OUT:
+ dbg("Exit on_response_get_nitz_name");
+}
+
+static void on_response_get_preferred_plmn(TcorePending *p, int data_len, const void *data, void *user_data)
+{
+ UserRequest *ur;
+ int i = 0;
+ char *line = NULL;
+ const TcoreATResponse *atResp = data;
+ GSList *tokens = NULL;
+ char temp_plmn_info[17] = {0};
+ char *pResp = NULL;
+ int plmn_format = 0;
+
+ struct tresp_network_get_preferred_plmn resp = {0};
+ int total_lines = 0;
+ int GSM_AcT2 = 0, GSM_Compact_AcT2 = 0, UTRAN_AcT2 = 0;
+
+ dbg("Entry on_response_get_preferred_plmn");
+
+ if (atResp->success > 0) {
+ dbg("RESPONSE OK");
+ if (atResp->lines) {
+ total_lines = g_slist_length(atResp->lines);
+ dbg("Total number of network present in Preferred PLMN list is %d\n", total_lines);
+
+ if (total_lines < 1) {
+ msg("invalid message");
+ goto OUT;
+ }
+
+ if (total_lines >= MAX_NETWORKS_PREF_PLMN_SUPPORT)
+ total_lines = MAX_NETWORKS_PREF_PLMN_SUPPORT;
+
+/*
++COPL: <index1>,<format>,<oper1>[,<GSM_AcT1>,<GSM_Compact_AcT1>,<UTRAN_AcT1>,<E-UTRAN_AcT1>] [<CR><LF>
++CPOL: <index2>,<format>,<oper2>[,<GSM_AcT2>,<GSM_Compact_AcT2>,<UTRAN_AcT2>,<E-UTRAN_AcT2>]
+*/
+
+ resp.result = TCORE_RETURN_SUCCESS;
+
+ for (i = 0; i < total_lines; i++) {
+ /* Take each line response at a time & parse it */
+ line = tcore_at_tok_nth(atResp->lines, i);
+ tokens = tcore_at_tok_new(line);
+
+ /* <index2>,<format>,<oper2>[,<GSM_AcT2>,<GSM_Compact_AcT2>,<UTRAN_AcT2>,<E-UTRAN_AcT2>] */
+
+ /* EF Index */
+ if ((pResp = tcore_at_tok_nth(tokens, 0))) {
+ dbg("Index : %s", pResp);
+ resp.list[i].ef_index = atoi(pResp);
+ }
+ /* Format */
+ if ((pResp = tcore_at_tok_nth(tokens, 1))) {
+ dbg("format : %s", pResp);
+ plmn_format = atoi(pResp);
+ }
+
+ /* Operator PLMN ID */
+ if ((pResp = tcore_at_tok_nth(tokens, 2))) {
+ dbg("plmn ID : %s", pResp);
+
+ if (strlen(pResp) > 0) {
+ strncpy(temp_plmn_info, pResp + 1, (strlen(pResp)) - 2);
+
+ // Get only PLMN ID
+ if (plmn_format == 2) {
+ // cp_plmn = util_hexStringToBytes(temp_plmn_info);
+
+ if (strncmp((char *) temp_plmn_info, "000000", 6) == 0)
+ continue;
+
+ memcpy(resp.list[i].plmn, temp_plmn_info, 6);
+ if (resp.list[i].plmn[5] == '#')
+ resp.list[i].plmn[5] = '\0';
+
+ // free(cp_plmn);
+ }
+ }
+ }
+
+ if ((pResp = tcore_at_tok_nth(tokens, 3))) {
+ dbg("GSM_AcT2 : %s", pResp);
+ GSM_AcT2 = atoi(pResp);
+ }
+
+ if ((pResp = tcore_at_tok_nth(tokens, 4))) {
+ dbg("GSM_Compact AcT2 : %s", pResp);
+ GSM_Compact_AcT2 = atoi(pResp);
+ }
+
+ if ((pResp = tcore_at_tok_nth(tokens, 5))) {
+ dbg("UTRAN_AcT2 : %s", pResp);
+ UTRAN_AcT2 = atoi(pResp);
+ }
+
+ if (UTRAN_AcT2 && (GSM_AcT2 || GSM_Compact_AcT2))
+ resp.list[i].act = NETWORK_ACT_GSM_UTRAN;
+ else if (UTRAN_AcT2)
+ resp.list[i].act = NETWORK_ACT_UMTS;
+ else if (GSM_AcT2 || GSM_Compact_AcT2)
+ resp.list[i].act = NETWORK_ACT_GPRS;
+
+ (resp.list_count)++;
+
+ tcore_at_tok_free(tokens);
+ }
+ }
+ }
+OUT:
+ ur = tcore_pending_ref_user_request(p);
+ if (ur) {
+ tcore_user_request_send_response(ur, TRESP_NETWORK_GET_PREFERRED_PLMN, sizeof(struct tresp_network_get_preferred_plmn), &resp);
+ }
+ dbg("Exit");
+ return;
+}
+
+static void on_response_get_serving_network(TcorePending *p, int data_len, const void *data, void *user_data)
+{
+ const TcoreATResponse *resp = data;
+ UserRequest *ur;
+ struct tresp_network_get_serving_network Tresp = {0};
+ char plmn[7] = {0};
+ char *long_plmn_name = NULL;
+ char *short_plmn_name = NULL;
+ CoreObject *o;
+ GSList *tokens = NULL;
+ const char *line;
+ int network_mode = -1;
+ int plmn_format = -1;
+ int AcT = -1;
+ struct tnoti_network_identity noti;
+ char *pResp = NULL;
+ int nol, count = 0;
+
+ o = tcore_pending_ref_core_object(p);
+
+ if (resp->success <= 0) {
+ dbg("RESPONSE NOK");
+
+ ur = tcore_pending_ref_user_request(p);
+ if (ur) {
+ Tresp.result = TCORE_RETURN_FAILURE;
+ tcore_user_request_send_response(ur, TRESP_NETWORK_GET_SERVING_NETWORK, sizeof(struct tresp_network_get_serving_network), &Tresp);
+ }
+
+ return;
+ } else {
+ dbg("RESPONSE OK");
+ nol = g_slist_length(resp->lines);
+ dbg("nol : %d", nol);
+
+ for (count = 0; count < nol; count++) {
+ // parse each line
+ line = g_slist_nth_data(resp->lines, count);
+ tokens = tcore_at_tok_new(line);
+ dbg("line %d start---------------", count);
+ // mode
+ if ((pResp = tcore_at_tok_nth(tokens, 0))) {
+ dbg("mode : %s", pResp);
+ network_mode = atoi(pResp);
+ }
+
+ // format (optional)
+ if ((pResp = tcore_at_tok_nth(tokens, 1))) {
+ dbg("format : %s", pResp);
+ if (strlen(pResp) > 0)
+ plmn_format = atoi(pResp);
+ }
+
+ // plmn
+ switch (plmn_format) {
+ case AT_COPS_FORMAT_LONG_ALPHANUMERIC:
+ if ((pResp = tcore_at_tok_nth(tokens, 2))) {
+ dbg("long PLMN : %s", pResp);
+ if (strlen(pResp) > 0) {
+ long_plmn_name = util_removeQuotes(pResp);
+
+ // set network name into po
+ tcore_network_set_network_name(o, TCORE_NETWORK_NAME_TYPE_FULL, long_plmn_name);
+ }
+ }
+ break;
+
+ case AT_COPS_FORMAT_SHORT_ALPHANUMERIC:
+ if ((pResp = tcore_at_tok_nth(tokens, 2))) {
+ dbg("short PLMN : %s", pResp);
+ if (strlen(pResp) > 0) {
+ short_plmn_name = util_removeQuotes(pResp);
+
+ // set network name into po
+ tcore_network_set_network_name(o, TCORE_NETWORK_NAME_TYPE_SHORT, short_plmn_name);
+ }
+ }
+ break;
+
+ case AT_COPS_FORMAT_NUMERIC:
+ if ((pResp = tcore_at_tok_nth(tokens, 2))) {
+ dbg("numeric : %s", pResp);
+ if (strlen(pResp) > 0) {
+ memset(plmn, 0, 7);
+
+ /* Strip off starting quotes & ending quotes */
+ strncpy(plmn, pResp + 1, strlen(pResp) - 2);
+ tcore_network_set_plmn(o, plmn);
+ }
+ }
+ break;
+
+ default:
+ break;
+ }
+
+ // act
+ if ((pResp = tcore_at_tok_nth(tokens, 3))) {
+ dbg("AcT : %s", pResp);
+ if (strlen(pResp) > 0) {
+ AcT = atoi(pResp);
+ tcore_network_set_access_technology(o, lookup_tbl_access_technology[AcT]);
+ }
+ }
+
+ tcore_at_tok_free(tokens);
+ }
+
+ memcpy(Tresp.plmn, plmn, 7);
+ tcore_network_get_access_technology(o, &(Tresp.act));
+ tcore_network_get_lac(o, &(Tresp.gsm.lac));
+
+ ur = tcore_pending_ref_user_request(p);
+ if (ur) {
+ Tresp.result = TCORE_RETURN_SUCCESS;
+ tcore_user_request_send_response(ur, TRESP_NETWORK_GET_SERVING_NETWORK, sizeof(struct tresp_network_get_serving_network), &Tresp);
+ } else {
+ /* Network change noti */
+ struct tnoti_network_change network_change;
+
+ memset(&network_change, 0, sizeof(struct tnoti_network_change));
+ memcpy(network_change.plmn, plmn, 7);
+ tcore_network_get_access_technology(o, &(network_change.act));
+ tcore_network_get_lac(o, &(network_change.gsm.lac));
+
+ tcore_server_send_notification(tcore_plugin_ref_server(tcore_pending_ref_plugin(p)), tcore_pending_ref_core_object(p),
+ TNOTI_NETWORK_CHANGE, sizeof(struct tnoti_network_change), &network_change);
+ dbg("dbg.. network_change.plmn : %s", network_change.plmn);
+ dbg("dbg.. network_change.act : %d", network_change.act);
+ dbg("dbg.. network_change.gsm.lac : %d", network_change.gsm.lac);
+
+ if ((AT_COPS_MODE_DEREGISTER != network_mode) &&
+ (AT_COPS_MODE_SET_ONLY != network_mode)) {
+ /*Network identity noti*/
+ memset(¬i, 0x0, sizeof(struct tnoti_network_change));
+ if (long_plmn_name)
+ memcpy(noti.full_name, long_plmn_name, MIN(33, strlen(long_plmn_name)));
+ if (short_plmn_name)
+ memcpy(noti.short_name, short_plmn_name, MIN(17, strlen(long_plmn_name)));
+ memcpy(noti.plmn, plmn, 7);
+ tcore_server_send_notification(tcore_plugin_ref_server(tcore_object_ref_plugin(o)),
+ o, TNOTI_NETWORK_IDENTITY, sizeof(struct tnoti_network_identity), ¬i);
+ dbg("dbg.. noti.short_name : %s", noti.short_name);
+ dbg("dbg.. noti.full_name : %s", noti.full_name);
+ dbg("dbg.. noti.plmn : %s", noti.plmn);
+ }
+ }
+ if (long_plmn_name)
+ free(long_plmn_name);
+ if (short_plmn_name)
+ free(short_plmn_name);
+ }
+ return;
+}
+
+static gboolean on_event_ps_network_regist(CoreObject *o, const void *data, void *user_data)
+{
+ struct tnoti_network_registration_status regist_status;
+ enum telephony_network_service_domain_status cs_status;
+ enum telephony_network_service_domain_status ps_status;
+ enum telephony_network_service_type service_type;
+ enum telephony_network_access_technology act = NETWORK_ACT_UNKNOWN;
+ struct tnoti_network_location_cellinfo net_lac_cell_info = {0};
+ struct tnoti_ps_protocol_status noti = {0};
+ unsigned char svc_domain = NETWORK_SERVICE_DOMAIN_PS;
+ int stat = 0, AcT = 0;
+ unsigned int lac = 0xffff, ci = 0xffff;
+ unsigned int rac = 0xffff;
+ GSList *tokens = NULL;
+ char *pResp;
+ char *line = NULL;
+ GSList *lines = NULL;
+
+ lines = (GSList *) data;
+ if (1 != g_slist_length(lines)) {
+ dbg("unsolicited msg but multiple line");
+ goto OUT;
+ }
+ line = (char *) (lines->data);
+ dbg("+CGREG NOTI RECEIVED");
+
+/*
++CREG: <stat> [[,<lac>,<ci>[AcT]]
+
+Possible values of <stat> can be
+0 Not registered, ME is not currently searching a new operator to register to
+1 Registered, home network
+2 Not registered, but ME is currently searching a new operator to register
+3 Registration denied
+4 Unknown
+5 Registered, in roaming
+
+<lac>
+string type; two byte location area code in hexadecimal format (e.g. 00C3)
+
+<ci>
+string type; four byte cell ID in hexadecimal format (e.g. 0000A13F)
+
+<ACT>
+0 GSM
+2 UTRAN
+3 GSM w/EGPRS
+4 UTRAN w/HSDPA
+5 UTRAN w/HSUPA
+6 UTRAN w/HSDPA and HSUPA
+Note: <Act> is supporting from R7 and above Protocol Stack.
+
+<rac>: is R7 and above feature, string type; one byte routing area code in hexadecimal format.
+*/
+ if (line != NULL) {
+ tokens = tcore_at_tok_new(line);
+ if (g_slist_length(tokens) < 1) {
+ msg("invalid message");
+ goto OUT;
+ }
+
+ if (!(pResp = g_slist_nth_data(tokens, 0))) {
+ dbg("No STAT in +CGREG");
+ goto OUT;
+ } else {
+ stat = atoi(pResp);
+ if ((pResp = g_slist_nth_data(tokens, 1)))
+ lac = atoi(pResp);
+
+ if ((pResp = g_slist_nth_data(tokens, 2)))
+ ci = atoi(pResp);
+ else
+ dbg("No ci in +CGREG");
+
+ if ((pResp = g_slist_nth_data(tokens, 3)))
+ AcT = atoi(pResp);
+ else
+ dbg("No AcT in +CGREG");
+
+ if ((pResp = g_slist_nth_data(tokens, 4)))
+ rac = atoi(pResp);
+ else
+ dbg("No rac in +CGREG");
+ }
+
+
+ dbg("stat=%d, lac=0x%lx, ci=0x%lx, Act=%d, rac = 0x%x", stat, lac, ci, AcT, rac);
+
+ ps_status = lookup_tbl_net_status[stat];
+
+ tcore_network_set_service_status(o, TCORE_NETWORK_SERVICE_DOMAIN_TYPE_PACKET, ps_status);
+ _ps_set(tcore_object_ref_plugin(o), ps_status);
+
+ tcore_network_get_service_status(o, TCORE_NETWORK_SERVICE_DOMAIN_TYPE_CIRCUIT, &cs_status);
+
+ act = lookup_tbl_access_technology[AcT];
+ tcore_network_set_access_technology(o, act);
+
+ if (stat == AT_CREG_STAT_REG_ROAM)
+ tcore_network_set_roaming_state(o, TRUE);
+ else
+ tcore_network_set_roaming_state(o, FALSE);
+
+ tcore_network_get_service_type(o, &service_type);
+ dbg("prev_service_type = 0x%x", service_type);
+ service_type = _get_service_type(service_type, svc_domain, act, cs_status, ps_status);
+ dbg("new_service_type = 0x%x", service_type);
+ tcore_network_set_service_type(o, service_type);
+
+ tcore_network_set_lac(o, lac);
+ tcore_network_set_cell_id(o, ci);
+ tcore_network_set_rac(o, rac);
+
+ net_lac_cell_info.lac = lac;
+ net_lac_cell_info.cell_id = ci;
+
+ tcore_server_send_notification(tcore_plugin_ref_server(tcore_object_ref_plugin(o)), o, TNOTI_NETWORK_LOCATION_CELLINFO,
+ sizeof(struct tnoti_network_location_cellinfo), &net_lac_cell_info);
+
+ regist_status.cs_domain_status = cs_status;
+ regist_status.ps_domain_status = ps_status;
+ regist_status.service_type = service_type;
+ regist_status.roaming_status = tcore_network_get_roaming_state(o);
+
+ tcore_server_send_notification(tcore_plugin_ref_server(tcore_object_ref_plugin(o)), o,
+ TNOTI_NETWORK_REGISTRATION_STATUS, sizeof(struct tnoti_network_registration_status), ®ist_status);
+
+ if (service_type == NETWORK_SERVICE_TYPE_HSDPA)
+ noti.status = TELEPHONY_HSDPA_ON;
+ else
+ noti.status = TELEPHONY_HSDPA_OFF;
+
+ tcore_server_send_notification(tcore_plugin_ref_server(tcore_object_ref_plugin(o)), o, TNOTI_PS_PROTOCOL_STATUS,
+ sizeof(struct tnoti_ps_protocol_status), ¬i);
+
+ /* Get PLMN ID needed to application */
+ // get_serving_network(o, NULL);
+ } else {
+ dbg("Response NOK");
+ }
+
+OUT:
+ if (NULL != tokens)
+ tcore_at_tok_free(tokens);
+ return TRUE;
+}
+
+static gboolean on_event_cs_network_regist(CoreObject *o, const void *event_info, void *user_data)
+{
+ GSList *lines = NULL;
+ char *line = NULL;
+ struct tnoti_network_registration_status regist_status;
+ enum telephony_network_service_domain_status cs_status;
+ enum telephony_network_service_domain_status ps_status;
+ enum telephony_network_service_type service_type;
+ enum telephony_network_access_technology act = NETWORK_ACT_UNKNOWN;
+ struct tnoti_network_location_cellinfo net_lac_cell_info = {0};
+
+
+ unsigned char svc_domain = NETWORK_SERVICE_DOMAIN_CS;
+ int stat = 0, AcT = 0;
+ unsigned int lac = 0xffff, ci = 0xffff;
+ GSList *tokens = NULL;
+ char *pResp;
+
+ lines = (GSList *) event_info;
+ if (1 != g_slist_length(lines)) {
+ dbg("unsolicited msg but multiple line");
+ goto OUT;
+ }
+ line = (char *) (lines->data);
+
+ dbg("+CREG NOTI RECEIVED");
+
+/*
++CREG: <stat> [[,<lac>,<ci>[AcT]]
+
+Possible values of <stat> can be
+0 Not registered, ME is not currently searching a new operator to register to
+1 Registered, home network
+2 Not registered, but ME is currently searching a new operator to register
+3 Registration denied
+4 Unknown
+5 Registered, in roaming
+
+<lac>
+string type; two byte location area code in hexadecimal format (e.g. 00C3)
+
+<ci>
+string type; four byte cell ID in hexadecimal format (e.g. 0000A13F)
+
+<ACT>
+0 GSM
+2 UTRAN
+3 GSM w/EGPRS
+4 UTRAN w/HSDPA
+5 UTRAN w/HSUPA
+6 UTRAN w/HSDPA and HSUPA
+Note: <Act> is supporting from R7 and above Protocol Stack.
+*/
+ if (line != NULL) {
+ tokens = tcore_at_tok_new(line);
+ if (g_slist_length(tokens) < 1) {
+ msg("invalid message");
+ goto OUT;
+ }
+
+ if (!(pResp = g_slist_nth_data(tokens, 0))) {
+ dbg("No STAT in +CREG");
+ goto OUT;
+ } else {
+ stat = atoi(pResp);
+ if ((pResp = g_slist_nth_data(tokens, 1)))
+ lac = atoi(pResp);
+
+ if ((pResp = g_slist_nth_data(tokens, 2)))
+ ci = atoi(pResp);
+ else
+ dbg("No ci in +CREG");
+
+ if ((pResp = g_slist_nth_data(tokens, 3)))
+ AcT = atoi(pResp);
+ else
+ dbg("No AcT in +CREG");
+ }
+
+
+ dbg("stat=%d, lac=0x%lx, ci=0x%lx, Act=%d", stat, lac, ci, AcT);
+
+ cs_status = lookup_tbl_net_status[stat];
+ tcore_network_set_service_status(o, TCORE_NETWORK_SERVICE_DOMAIN_TYPE_CIRCUIT, cs_status);
+
+ // tcore_network_get_service_status(o, TCORE_NETWORK_SERVICE_DOMAIN_TYPE_CIRCUIT, &cs_status);
+ tcore_network_get_service_status(o, TCORE_NETWORK_SERVICE_DOMAIN_TYPE_PACKET, &ps_status);
+
+ act = lookup_tbl_access_technology[AcT];
+ tcore_network_set_access_technology(o, act);
+
+ if (stat == AT_CREG_STAT_REG_ROAM)
+ tcore_network_set_roaming_state(o, TRUE);
+ else
+ tcore_network_set_roaming_state(o, FALSE);
+
+ tcore_network_get_service_type(o, &service_type);
+ dbg("prev_service_type = 0x%x", service_type);
+ service_type = _get_service_type(service_type, svc_domain, act, cs_status, ps_status);
+ dbg("new_service_type = 0x%x", service_type);
+ tcore_network_set_service_type(o, service_type);
+
+ tcore_network_set_lac(o, lac);
+ tcore_network_set_cell_id(o, ci);
+
+ net_lac_cell_info.lac = lac;
+ net_lac_cell_info.cell_id = ci;
+
+ tcore_server_send_notification(tcore_plugin_ref_server(tcore_object_ref_plugin(o)), o, TNOTI_NETWORK_LOCATION_CELLINFO,
+ sizeof(struct tnoti_network_location_cellinfo), &net_lac_cell_info);
+
+ regist_status.cs_domain_status = cs_status;
+ regist_status.ps_domain_status = ps_status;
+ regist_status.service_type = service_type;
+ regist_status.roaming_status = tcore_network_get_roaming_state(o);
+
+ tcore_server_send_notification(tcore_plugin_ref_server(tcore_object_ref_plugin(o)), o,
+ TNOTI_NETWORK_REGISTRATION_STATUS, sizeof(struct tnoti_network_registration_status), ®ist_status);
+
+ /* Get PLMN ID needed to application */
+ if ((NETWORK_SERVICE_DOMAIN_STATUS_FULL == cs_status) ||
+ NETWORK_SERVICE_DOMAIN_STATUS_FULL == ps_status)
+ get_serving_network(o, NULL);
+ } else {
+ dbg("Response NOK");
+ }
+
+OUT:
+ if (NULL != tokens)
+ tcore_at_tok_free(tokens);
+ return TRUE;
+}
+
+static gboolean on_event_network_icon_info(CoreObject *o, const void *event_info, void *user_data)
+{
+ struct tnoti_network_icon_info net_icon_info = {0};
+ char *line = NULL;
+ char *rssiToken = NULL;
+ char *batteryToken = NULL;
+ GSList *tokens = NULL;
+ GSList *lines = NULL;
+
+ lines = (GSList *) event_info;
+ if (1 != g_slist_length(lines)) {
+ dbg("unsolicited msg but multiple line");
+ goto OUT;
+ }
+ line = (char *) (lines->data);
+ dbg("+XCIEV Network Icon Info Noti Recieve");
+ memset(&net_icon_info, 0, sizeof(struct tnoti_network_icon_info));
+
+ if (line != NULL) {
+ dbg("Response OK");
+
+ tokens = tcore_at_tok_new(line);
+ if (g_slist_length(tokens) != 2) {
+ msg("invalid message");
+ goto OUT;
+ }
+
+ rssiToken = (char *) g_slist_nth_data(tokens, 0);
+
+ if (strlen(rssiToken) > 0) {
+ net_icon_info.type = NETWORK_ICON_INFO_RSSI;
+ net_icon_info.rssi = atoi(g_slist_nth_data(tokens, 0));
+ dbg("rssi level : %d", net_icon_info.rssi);
+ }
+
+ batteryToken = (char *) g_slist_nth_data(tokens, 1);
+ if (strlen(batteryToken) > 0) {
+ net_icon_info.type = NETWORK_ICON_INFO_BATTERY;
+ net_icon_info.battery = atoi(g_slist_nth_data(tokens, 1));
+ dbg("battery level : %d", net_icon_info.battery);
+ }
+
+ tcore_server_send_notification(tcore_plugin_ref_server(tcore_object_ref_plugin(o)), o, TNOTI_NETWORK_ICON_INFO,
+ sizeof(struct tnoti_network_icon_info), &net_icon_info);
+ } else {
+ dbg("Response NOK");
+ }
+
+
+OUT:
+ if (NULL != tokens)
+ tcore_at_tok_free(tokens);
+
+ return TRUE;
+}
+
+static gboolean on_event_network_ctzv_time_info(CoreObject *o, const void *event_info, void *user_data)
+{
+ struct tnoti_network_timeinfo net_time_info = {0};
+ char *line = NULL;
+ GSList *tokens = NULL;
+ char *time = NULL;
+ char *time_zone = NULL;
+ GSList *lines = NULL;
+ char ptime_param[20] = {0};
+ UserRequest *ur = NULL;
+ dbg("Enter : on_event_network_ctzv_time_info");
+
+ lines = (GSList *) event_info;
+ if (1 != g_slist_length(lines)) {
+ dbg("unsolicited msg but multiple line");
+ goto OUT;
+ }
+ line = (char *) (lines->data);
+
+/*
++CTZV: <tz>,<time>
+<tz> integer value indicating the time zone (e.g. -22 or +34)
+<time> string type value; format is \1cyy/MM/dd,hh:mms\1d, wherein characters indicates year, month, day, hour,
+minutes, seconds.
+*/
+ dbg("Network time info (+CTZV) recieved");
+
+ if (line != NULL) {
+ dbg("Response OK");
+ dbg("noti line is %s", line);
+
+ tokens = tcore_at_tok_new(line);
+
+ if (g_slist_length(tokens) < 2) {
+ msg("invalid message");
+ goto OUT;
+ }
+
+ if ((time_zone = g_slist_nth_data(tokens, 0))) {
+ net_time_info.gmtoff = atoi(time_zone) * 15; /* TZ in minutes */
+ }
+
+ if (tcore_network_get_plmn(o) != NULL)
+ strcpy(net_time_info.plmn, tcore_network_get_plmn(o));
+
+ if ((time = g_slist_nth_data(tokens, 1)) && (strlen(time) > 18)) {
+ strncpy(ptime_param, time + 1, 2); /* skip past initial quote (") */
+ net_time_info.year = atoi(ptime_param);
+
+ strncpy(ptime_param, time + 4, 2); /* skip slash (/) after year param */
+ net_time_info.month = atoi(ptime_param);
+
+ strncpy(ptime_param, time + 7, 2); /* skip past slash (/) after month param */
+ net_time_info.day = atoi(ptime_param);
+
+ strncpy(ptime_param, time + 10, 2); /* skip past comma (,) after day param */
+ net_time_info.hour = atoi(ptime_param);
+
+ strncpy(ptime_param, time + 13, 2); /* skip past colon (:) after hour param */
+ net_time_info.minute = atoi(ptime_param);
+
+ strncpy(ptime_param, time + 16, 2); /* skip past colon (:) after minute param */
+ net_time_info.second = atoi(ptime_param);
+ }
+ tcore_server_send_notification(tcore_plugin_ref_server(tcore_object_ref_plugin(o)), o, TNOTI_NETWORK_TIMEINFO, sizeof(struct tnoti_network_timeinfo), &net_time_info);
+
+ dbg("new pending(AT+XOPS=0/5/6 for Nitz PLMN name)");
+
+ /* Get NITZ name and plmn_id via AT+XCOPS = 0/5/6 */
+ nwk_prepare_and_send_pending_request(tcore_object_ref_plugin(o), "umts_network", "AT+XCOPS=0;+XCOPS=5;+XCOPS=6", "+XCOPS", TCORE_AT_MULTILINE, ur, on_response_get_nitz_name);
+ } else {
+ dbg("line is NULL");
+ }
+
+OUT:
+ if (NULL != tokens)
+ tcore_at_tok_free(tokens);
+
+ dbg("Exit: on_event_network_ctzv_time_info");
+ return TRUE;
+}
+
+static void on_sim_resp_hook_get_netname(UserRequest *ur, enum tcore_response_command command, unsigned int data_len,
+ const void *data, void *user_data)
+{
+ const struct tresp_sim_read *resp = data;
+ CoreObject *o = user_data;
+
+ if (command == TRESP_SIM_GET_SPN) {
+ dbg("OK SPN GETTING!!");
+ dbg("resp->result = 0x%x", resp->result);
+ dbg("resp->data.spn.display_condition = 0x%x", resp->data.spn.display_condition);
+ dbg("resp->data.spn.spn = [%s]", resp->data.spn.spn);
+
+ tcore_network_set_network_name(o, TCORE_NETWORK_NAME_TYPE_SPN, (const char *) resp->data.spn.spn);
+
+ /**
+ * display condition
+ * bit[0]: 0 = display of registered PLMN name not required when registered PLMN is either HPLMN or a PLMN in the service provider PLMN list
+ * 1 = display of registered PLMN name required when registered PLMN is either HPLMN or a PLMN in the service provider PLMN list
+ * bit[1]: 0 = display of the service provider name is required when registered PLMN is neither HPLMN nor a PLMN in the service provider PLMN list
+ * 1 = display of the service provider name is not required when registered PLMN is neither HPLMN nor a PLMN in the service provider PLMN list
+ */
+ if (resp->data.spn.display_condition & 0x01) {
+ tcore_network_set_network_name_priority(o, TCORE_NETWORK_NAME_PRIORITY_NETWORK);
+ }
+ if ((resp->data.spn.display_condition & 0x02) == 0) {
+ tcore_network_set_network_name_priority(o, TCORE_NETWORK_NAME_PRIORITY_SPN);
+ }
+ if ((resp->data.spn.display_condition & 0x03) == 0x01) {
+ tcore_network_set_network_name_priority(o, TCORE_NETWORK_NAME_PRIORITY_ANY);
+ }
+ }
+}
+
+static enum tcore_hook_return on_hook_sim_init(Server *s, CoreObject *source, enum tcore_notification_command command,
+ unsigned int data_len, void *data, void *user_data)
+{
+ const struct tnoti_sim_status *sim = data;
+ UserRequest *ur = NULL;
+
+ if (sim->sim_status == SIM_STATUS_INIT_COMPLETED) {
+ ur = tcore_user_request_new(NULL, NULL);
+ tcore_user_request_set_command(ur, TREQ_SIM_GET_SPN);
+ tcore_user_request_set_response_hook(ur, on_sim_resp_hook_get_netname, user_data);
+ tcore_object_dispatch_request(source, ur);
+ }
+
+ return TCORE_HOOK_RETURN_CONTINUE;
+}
+
+static TReturn search_network(CoreObject *o, UserRequest *ur)
+{
+ TcoreHal *h = NULL;
+ TcorePending *pending = NULL;
+ TcoreATRequest *atreq = NULL;
+
+ char *cmd_str = NULL;
+ dbg("search_network - ENTER!!");
+
+ if (!o || !ur)
+ return TCORE_RETURN_EINVAL;
+
+ h = tcore_object_get_hal(o);
+ pending = tcore_pending_new(o, 0);
+
+ cmd_str = g_strdup_printf("AT+COPS=?");
+ atreq = tcore_at_request_new(cmd_str, "+COPS", TCORE_AT_SINGLELINE);
+
+ tcore_pending_set_request_data(pending, 0, atreq);
+ tcore_pending_set_priority(pending, TCORE_PENDING_PRIORITY_DEFAULT);
+ tcore_pending_set_response_callback(pending, on_response_search_network, NULL);
+ tcore_pending_link_user_request(pending, ur);
+ tcore_pending_set_send_callback(pending, on_confirmation_network_message_send, NULL);
+
+ tcore_hal_send_request(h, pending);
g_free(cmd_str);
- return TCORE_RETURN_SUCCESS;\r
-}\r
-\r
-static TReturn set_plmn_selection_mode(CoreObject *o, UserRequest *ur)\r
-{\r
- TcoreHal *h = NULL;\r
- TcorePending *pending = NULL;\r
- TcoreATRequest *atreq;\r
- char*cmd_str = NULL;\r
- int format = 0; /* default value for long alphanumeric */\r
- int mode = 0;\r
- char plmn[7] = {0};\r
- int act = 0;\r
- \r
+ return TCORE_RETURN_SUCCESS;
+}
+
+static TReturn set_plmn_selection_mode(CoreObject *o, UserRequest *ur)
+{
+ TcoreHal *h = NULL;
+ TcorePending *pending = NULL;
+ TcoreATRequest *atreq;
+ char *cmd_str = NULL;
+ int format = 0; /* default value for long alphanumeric */
+ int mode = 0;
+ char plmn[7] = {0};
+ int act = 0;
+
const struct treq_network_set_plmn_selection_mode *req_data = NULL;
-\r
-\r
- dbg("set_plmn_selection_mode - ENTER!!");\r
-\r
- if (!o || !ur)\r
- return TCORE_RETURN_EINVAL;\r
-\r
- req_data = tcore_user_request_ref_data(ur, NULL);\r
- h = tcore_object_get_hal(o);\r
- pending = tcore_pending_new(o, 0);\r
-\r
- // Command Format - AT+COPS=[<mode>[,<format>[,<oper>[,< AcT>]]]] \r
- /* oper parameter format\r
- - 0 <oper> format presentations are set to long alphanumeric. If Network name not available it displays combination of Mcc and MNC in string format.\r
- - 1 <oper> format presentation is set to short alphanumeric.\r
- - 2 <oper> format presentations set to numeric.\r
- */\r
-\r
- if((req_data->act == NETWORK_ACT_GSM ) || (req_data->act == NETWORK_ACT_EGPRS ))\r
- act = 0;\r
- else\r
- act = 2;\r
-\r
- switch(req_data->mode) {\r
- case NETWORK_SELECT_MODE_GSM_MANUAL:\r
- {\r
- mode = AT_COPS_MODE_MANUAL;\r
- format = AT_COPS_FORMAT_NUMERIC;\r
-\r
- memset(plmn, 0, 7);\r
- memcpy(plmn, req_data->plmn, 6);\r
-\r
- if (strlen(req_data->plmn) == 6) {\r
- if(plmn[5] =='#')\r
- plmn[5] = 0;\r
- }\r
-\r
- cmd_str = g_strdup_printf("AT+COPS=%d,%d,\"%s\",%d", mode, format, plmn, act);\r
- }\r
- break;\r
- \r
- case NETWORK_SELECT_MODE_GLOBAL_AUTOMATIC:\r
- default:\r
- cmd_str = g_strdup("AT+COPS=0");\r
- break;\r
- }\r
-\r
- \r
- atreq = tcore_at_request_new(cmd_str, "+COPS", TCORE_AT_NO_RESULT);\r
-\r
- tcore_pending_set_request_data(pending, 0, atreq);\r
- tcore_pending_set_response_callback(pending, on_response_set_plmn_selection_mode, NULL);\r
- tcore_pending_link_user_request(pending, ur);\r
- tcore_pending_set_send_callback(pending, on_confirmation_network_message_send, NULL);\r
-\r
- tcore_hal_send_request(h, pending);\r
+
+
+ dbg("set_plmn_selection_mode - ENTER!!");
+
+ if (!o || !ur)
+ return TCORE_RETURN_EINVAL;
+
+ req_data = tcore_user_request_ref_data(ur, NULL);
+ h = tcore_object_get_hal(o);
+ pending = tcore_pending_new(o, 0);
+
+ // Command Format - AT+COPS=[<mode>[,<format>[,<oper>[,< AcT>]]]]
+ /* oper parameter format
+ - 0 <oper> format presentations are set to long alphanumeric. If Network name not available it displays combination of Mcc and MNC in string format.
+ - 1 <oper> format presentation is set to short alphanumeric.
+ - 2 <oper> format presentations set to numeric.
+ */
+
+ if ((req_data->act == NETWORK_ACT_GSM) || (req_data->act == NETWORK_ACT_EGPRS))
+ act = 0;
+ else
+ act = 2;
+
+ switch (req_data->mode) {
+ case NETWORK_SELECT_MODE_GSM_MANUAL:
+ {
+ mode = AT_COPS_MODE_MANUAL;
+ format = AT_COPS_FORMAT_NUMERIC;
+
+ memset(plmn, 0, 7);
+ memcpy(plmn, req_data->plmn, 6);
+
+ if (strlen(req_data->plmn) == 6) {
+ if (plmn[5] == '#')
+ plmn[5] = 0;
+ }
+
+ cmd_str = g_strdup_printf("AT+COPS=%d,%d,\"%s\",%d", mode, format, plmn, act);
+ }
+ break;
+
+ case NETWORK_SELECT_MODE_GLOBAL_AUTOMATIC:
+ default:
+ cmd_str = g_strdup("AT+COPS=0");
+ break;
+ }
+
+
+ atreq = tcore_at_request_new(cmd_str, "+COPS", TCORE_AT_NO_RESULT);
+
+ tcore_pending_set_request_data(pending, 0, atreq);
+ tcore_pending_set_response_callback(pending, on_response_set_plmn_selection_mode, NULL);
+ tcore_pending_link_user_request(pending, ur);
+ tcore_pending_set_send_callback(pending, on_confirmation_network_message_send, NULL);
+
+ tcore_hal_send_request(h, pending);
g_free(cmd_str);
- return TCORE_RETURN_SUCCESS;\r
-}\r
-\r
-static TReturn get_plmn_selection_mode(CoreObject *o, UserRequest *ur)\r
-{\r
- TcoreHal *h = NULL;\r
- TcorePending *pending = NULL;\r
- TcoreATRequest *atreq;\r
- char*cmd_str = NULL;\r
-\r
- dbg("get_plmn_selection_mode - ENTER!!");\r
-\r
- if (!o || !ur)\r
- return TCORE_RETURN_EINVAL;\r
-\r
- h = tcore_object_get_hal(o);\r
- pending = tcore_pending_new(o, 0);\r
-\r
- cmd_str = g_strdup_printf("AT+COPS?");\r
- atreq = tcore_at_request_new(cmd_str, "+COPS", TCORE_AT_SINGLELINE);\r
-\r
- tcore_pending_set_request_data(pending, 0, atreq);\r
- tcore_pending_set_response_callback(pending, on_response_get_plmn_selection_mode, NULL);\r
- tcore_pending_link_user_request(pending, ur);\r
- tcore_pending_set_send_callback(pending, on_confirmation_network_message_send, NULL);\r
-\r
- tcore_hal_send_request(h, pending);\r
+ return TCORE_RETURN_SUCCESS;
+}
+
+static TReturn get_plmn_selection_mode(CoreObject *o, UserRequest *ur)
+{
+ TcoreHal *h = NULL;
+ TcorePending *pending = NULL;
+ TcoreATRequest *atreq;
+ char *cmd_str = NULL;
+
+ dbg("get_plmn_selection_mode - ENTER!!");
+
+ if (!o || !ur)
+ return TCORE_RETURN_EINVAL;
+
+ h = tcore_object_get_hal(o);
+ pending = tcore_pending_new(o, 0);
+
+ cmd_str = g_strdup_printf("AT+COPS?");
+ atreq = tcore_at_request_new(cmd_str, "+COPS", TCORE_AT_SINGLELINE);
+
+ tcore_pending_set_request_data(pending, 0, atreq);
+ tcore_pending_set_response_callback(pending, on_response_get_plmn_selection_mode, NULL);
+ tcore_pending_link_user_request(pending, ur);
+ tcore_pending_set_send_callback(pending, on_confirmation_network_message_send, NULL);
+
+ tcore_hal_send_request(h, pending);
g_free(cmd_str);
- return TCORE_RETURN_SUCCESS;\r
-}\r
-\r
-\r
-static TReturn set_band(CoreObject *o, UserRequest *ur)\r
-{\r
- TcoreHal *h = NULL;\r
- TcorePending *pending = NULL;\r
- TcorePending *pending_gsm = NULL;\r
- TcorePending *pending_umts = NULL;\r
- TcoreATRequest *atreq;\r
- char*cmd_str = NULL;\r
- const struct treq_network_set_band *req_data;\r
- gboolean set_gsm_band = 0;\r
- gboolean set_umts_band = 0;\r
- int gsm_band = 255;\r
- int gsm_band2 = 255;\r
- char *umts_band = NULL;\r
- UserRequest *dup_ur_gsm = NULL;\r
- UserRequest *dup_ur_umts = NULL;\r
- \r
- dbg("set_band - ENTER!!");\r
-\r
- if (!o || !ur)\r
- return TCORE_RETURN_EINVAL;\r
-\r
- req_data = tcore_user_request_ref_data(ur, NULL);\r
- h = tcore_object_get_hal(o);\r
-\r
- dbg("set_band - called with band = %d", req_data->band);\r
-\r
- switch (req_data->band)\r
- {\r
- case NETWORK_BAND_TYPE_GSM850:\r
- gsm_band = AT_GSM_XBANDSEL_850;\r
- set_gsm_band = TRUE;\r
- break;\r
-\r
- case NETWORK_BAND_TYPE_GSM_900_1800:\r
- gsm_band = AT_GSM_XBANDSEL_900; \r
- gsm_band2 = AT_GSM_XBANDSEL_1800;\r
- set_gsm_band = TRUE;\r
- break;\r
-\r
- case NETWORK_BAND_TYPE_GSM1900:\r
- gsm_band = AT_GSM_XBANDSEL_1900;\r
- set_gsm_band = TRUE;\r
- break;\r
- \r
- case NETWORK_BAND_TYPE_GSM1800:\r
- gsm_band = AT_GSM_XBANDSEL_1800;\r
- set_gsm_band = TRUE;\r
- break;\r
- \r
- case NETWORK_BAND_TYPE_GSM_850_1900:\r
- gsm_band = AT_GSM_XBANDSEL_850;\r
- gsm_band2 = AT_GSM_XBANDSEL_1900;\r
- set_gsm_band = TRUE;\r
- break; \r
- \r
- case NETWORK_BAND_TYPE_ANY:\r
- gsm_band = AT_GSM_XBANDSEL_AUTOMATIC;\r
- set_umts_band = TRUE;\r
- set_gsm_band = TRUE;\r
- break;\r
-\r
- case NETWORK_BAND_TYPE_WCDMA:\r
- set_umts_band = TRUE;\r
- break;\r
- \r
- case NETWORK_BAND_TYPE_WCDMA2100:\r
- umts_band = "UMTS_BAND_I";\r
- set_umts_band = TRUE;\r
- break;\r
- \r
- case NETWORK_BAND_TYPE_WCDMA1900:\r
- umts_band = "UMTS_BAND_II";\r
- set_umts_band = TRUE;\r
- break;\r
- \r
- case NETWORK_BAND_TYPE_WCDMA850:\r
- umts_band = "UMTS_BAND_V";\r
- set_umts_band = TRUE;\r
- break;\r
-\r
- default:\r
- break;\r
- }\r
-\r
- dbg("set_band > set_umts_band = %d, set_gsm_band = %d", set_umts_band, set_gsm_band);\r
-\r
- if(set_umts_band == TRUE)\r
- {\r
- if((req_data->band == NETWORK_BAND_TYPE_WCDMA) || (req_data->band == NETWORK_BAND_TYPE_ANY))\r
- cmd_str = g_strdup_printf("AT+XUBANDSEL=0");\r
- else \r
- cmd_str = g_strdup_printf("AT+XUBANDSEL=%s", umts_band);\r
- \r
- atreq = tcore_at_request_new(cmd_str, "+XUBANDSEL", TCORE_AT_NO_RESULT);\r
- pending_umts = tcore_pending_new(o, 0);\r
-\r
- tcore_pending_set_request_data(pending_umts, 0, atreq);\r
- tcore_pending_set_priority(pending_umts, TCORE_PENDING_PRIORITY_DEFAULT);\r
- tcore_pending_set_response_callback(pending_umts, on_response_set_umts_band, NULL);\r
- \r
- /* duplicate user request for UMTS Band setting AT command for same UR */\r
- dup_ur_umts = tcore_user_request_ref(ur);\r
- tcore_pending_link_user_request(pending_umts, dup_ur_umts);\r
- tcore_pending_set_send_callback(pending_umts, on_confirmation_network_message_send, NULL);\r
-\r
- tcore_hal_send_request(h, pending_umts);\r
+ return TCORE_RETURN_SUCCESS;
+}
+
+
+static TReturn set_band(CoreObject *o, UserRequest *ur)
+{
+ TcoreHal *h = NULL;
+ TcorePending *pending = NULL;
+ TcorePending *pending_gsm = NULL;
+ TcorePending *pending_umts = NULL;
+ TcoreATRequest *atreq;
+ char *cmd_str = NULL;
+ const struct treq_network_set_band *req_data;
+ gboolean set_gsm_band = 0;
+ gboolean set_umts_band = 0;
+ int gsm_band = 255;
+ int gsm_band2 = 255;
+ char *umts_band = NULL;
+ UserRequest *dup_ur_gsm = NULL;
+ UserRequest *dup_ur_umts = NULL;
+
+ dbg("set_band - ENTER!!");
+
+ if (!o || !ur)
+ return TCORE_RETURN_EINVAL;
+
+ req_data = tcore_user_request_ref_data(ur, NULL);
+ h = tcore_object_get_hal(o);
+
+ dbg("set_band - called with band = %d", req_data->band);
+
+ switch (req_data->band) {
+ case NETWORK_BAND_TYPE_GSM850:
+ gsm_band = AT_GSM_XBANDSEL_850;
+ set_gsm_band = TRUE;
+ break;
+
+ case NETWORK_BAND_TYPE_GSM_900_1800:
+ gsm_band = AT_GSM_XBANDSEL_900;
+ gsm_band2 = AT_GSM_XBANDSEL_1800;
+ set_gsm_band = TRUE;
+ break;
+
+ case NETWORK_BAND_TYPE_GSM1900:
+ gsm_band = AT_GSM_XBANDSEL_1900;
+ set_gsm_band = TRUE;
+ break;
+
+ case NETWORK_BAND_TYPE_GSM1800:
+ gsm_band = AT_GSM_XBANDSEL_1800;
+ set_gsm_band = TRUE;
+ break;
+
+ case NETWORK_BAND_TYPE_GSM_850_1900:
+ gsm_band = AT_GSM_XBANDSEL_850;
+ gsm_band2 = AT_GSM_XBANDSEL_1900;
+ set_gsm_band = TRUE;
+ break;
+
+ case NETWORK_BAND_TYPE_ANY:
+ gsm_band = AT_GSM_XBANDSEL_AUTOMATIC;
+ set_umts_band = TRUE;
+ set_gsm_band = TRUE;
+ break;
+
+ case NETWORK_BAND_TYPE_WCDMA:
+ set_umts_band = TRUE;
+ break;
+
+ case NETWORK_BAND_TYPE_WCDMA2100:
+ umts_band = "UMTS_BAND_I";
+ set_umts_band = TRUE;
+ break;
+
+ case NETWORK_BAND_TYPE_WCDMA1900:
+ umts_band = "UMTS_BAND_II";
+ set_umts_band = TRUE;
+ break;
+
+ case NETWORK_BAND_TYPE_WCDMA850:
+ umts_band = "UMTS_BAND_V";
+ set_umts_band = TRUE;
+ break;
+
+ default:
+ break;
+ }
+
+ dbg("set_band > set_umts_band = %d, set_gsm_band = %d", set_umts_band, set_gsm_band);
+
+ if (set_umts_band == TRUE) {
+ if ((req_data->band == NETWORK_BAND_TYPE_WCDMA) || (req_data->band == NETWORK_BAND_TYPE_ANY))
+ cmd_str = g_strdup_printf("AT+XUBANDSEL=0");
+ else
+ cmd_str = g_strdup_printf("AT+XUBANDSEL=%s", umts_band);
+
+ atreq = tcore_at_request_new(cmd_str, "+XUBANDSEL", TCORE_AT_NO_RESULT);
+ pending_umts = tcore_pending_new(o, 0);
+
+ tcore_pending_set_request_data(pending_umts, 0, atreq);
+ tcore_pending_set_priority(pending_umts, TCORE_PENDING_PRIORITY_DEFAULT);
+ tcore_pending_set_response_callback(pending_umts, on_response_set_umts_band, NULL);
+
+ /* duplicate user request for UMTS Band setting AT command for same UR */
+ dup_ur_umts = tcore_user_request_ref(ur);
+ tcore_pending_link_user_request(pending_umts, dup_ur_umts);
+ tcore_pending_set_send_callback(pending_umts, on_confirmation_network_message_send, NULL);
+
+ tcore_hal_send_request(h, pending_umts);
g_free(cmd_str);
- }\r
- \r
- if(set_gsm_band == TRUE)\r
- {\r
- dbg("Entered set_gsm_band");\r
- if (gsm_band2 == 255)\r
- cmd_str = g_strdup_printf("AT+XBANDSEL=%d", gsm_band);\r
- else\r
- cmd_str = g_strdup_printf("AT+XBANDSEL=%d,%d", gsm_band, gsm_band2);\r
-\r
- dbg("Command string: %s",cmd_str);\r
- atreq = tcore_at_request_new(cmd_str, "+XBANDSEL", TCORE_AT_NO_RESULT);\r
- pending_gsm = tcore_pending_new(o, 0);\r
-\r
- tcore_pending_set_request_data(pending_gsm, 0, atreq);\r
- tcore_pending_set_priority(pending_gsm, TCORE_PENDING_PRIORITY_DEFAULT);\r
- tcore_pending_set_response_callback(pending_gsm, on_response_set_gsm_band, NULL);\r
-\r
- /* duplicate user request for GSM Band setting AT command for same UR */\r
- dup_ur_gsm = tcore_user_request_ref(ur);\r
- tcore_pending_link_user_request(pending_gsm, dup_ur_gsm);\r
- tcore_pending_set_send_callback(pending_gsm, on_confirmation_network_message_send, NULL);\r
-\r
- tcore_hal_send_request(h, pending_gsm);\r
+ }
+
+ if (set_gsm_band == TRUE) {
+ dbg("Entered set_gsm_band");
+ if (gsm_band2 == 255)
+ cmd_str = g_strdup_printf("AT+XBANDSEL=%d", gsm_band);
+ else
+ cmd_str = g_strdup_printf("AT+XBANDSEL=%d,%d", gsm_band, gsm_band2);
+
+ dbg("Command string: %s", cmd_str);
+ atreq = tcore_at_request_new(cmd_str, "+XBANDSEL", TCORE_AT_NO_RESULT);
+ pending_gsm = tcore_pending_new(o, 0);
+
+ tcore_pending_set_request_data(pending_gsm, 0, atreq);
+ tcore_pending_set_priority(pending_gsm, TCORE_PENDING_PRIORITY_DEFAULT);
+ tcore_pending_set_response_callback(pending_gsm, on_response_set_gsm_band, NULL);
+
+ /* duplicate user request for GSM Band setting AT command for same UR */
+ dup_ur_gsm = tcore_user_request_ref(ur);
+ tcore_pending_link_user_request(pending_gsm, dup_ur_gsm);
+ tcore_pending_set_send_callback(pending_gsm, on_confirmation_network_message_send, NULL);
+
+ tcore_hal_send_request(h, pending_gsm);
g_free(cmd_str);
- }\r
-\r
- /* Lock device to specific RAT as requested by application */\r
-/*\r
-AT+XRAT=<Act>[,<PreferredAct>]\r
-<AcT> indicates the radio access technology and may be\r
-0 GSM single mode\r
-1 GSM / UMTS Dual mode\r
-2 UTRAN (UMTS)\r
-*/\r
- if ((set_umts_band == TRUE) && (set_gsm_band == TRUE)){\r
- cmd_str = g_strdup_printf("AT+XRAT=%d", AT_XRAT_DUAL);\r
- }\r
- else if (set_umts_band == TRUE){\r
- cmd_str = g_strdup_printf("AT+XRAT=%d", AT_XRAT_UMTS);\r
- }\r
- else{\r
- cmd_str = g_strdup_printf("AT+XRAT=%d", AT_XRAT_GSM);\r
- }\r
- atreq = tcore_at_request_new(cmd_str, "+XRAT", TCORE_AT_NO_RESULT);\r
- pending = tcore_pending_new(o, 0);\r
-\r
- tcore_pending_set_request_data(pending, 0, atreq);\r
- tcore_pending_set_priority(pending, TCORE_PENDING_PRIORITY_DEFAULT);\r
- tcore_pending_set_response_callback(pending, on_response_set_xrat, NULL);\r
- tcore_pending_link_user_request(pending, ur);\r
- tcore_pending_set_send_callback(pending, on_confirmation_network_message_send, NULL);\r
-\r
- tcore_hal_send_request(h, pending);\r
+ }
+
+ /* Lock device to specific RAT as requested by application */
+/*
+AT+XRAT=<Act>[,<PreferredAct>]
+<AcT> indicates the radio access technology and may be
+0 GSM single mode
+1 GSM / UMTS Dual mode
+2 UTRAN (UMTS)
+*/
+ if ((set_umts_band == TRUE) && (set_gsm_band == TRUE)) {
+ cmd_str = g_strdup_printf("AT+XRAT=%d", AT_XRAT_DUAL);
+ } else if (set_umts_band == TRUE) {
+ cmd_str = g_strdup_printf("AT+XRAT=%d", AT_XRAT_UMTS);
+ } else {
+ cmd_str = g_strdup_printf("AT+XRAT=%d", AT_XRAT_GSM);
+ }
+ atreq = tcore_at_request_new(cmd_str, "+XRAT", TCORE_AT_NO_RESULT);
+ pending = tcore_pending_new(o, 0);
+
+ tcore_pending_set_request_data(pending, 0, atreq);
+ tcore_pending_set_priority(pending, TCORE_PENDING_PRIORITY_DEFAULT);
+ tcore_pending_set_response_callback(pending, on_response_set_xrat, NULL);
+ tcore_pending_link_user_request(pending, ur);
+ tcore_pending_set_send_callback(pending, on_confirmation_network_message_send, NULL);
+
+ tcore_hal_send_request(h, pending);
g_free(cmd_str);
- return TCORE_RETURN_SUCCESS;\r
-}\r
-\r
-static TReturn get_band(CoreObject *o, UserRequest *ur)\r
-{\r
- TcoreHal *h = NULL;\r
- TcorePending *pending = NULL;\r
-\r
- TcoreATRequest *atreq;\r
- char*cmd_str = NULL;\r
- dbg("get_band - ENTER!!");\r
-\r
- if (!o || !ur)\r
- return TCORE_RETURN_EINVAL;\r
-\r
- h = tcore_object_get_hal(o);\r
- \r
- /* Get RAT Information Information. Based on RAT read response, we will get specific RAT bands only */\r
- cmd_str = g_strdup_printf("AT+XRAT?");\r
- atreq = tcore_at_request_new(cmd_str, "+XRAT", TCORE_AT_SINGLELINE);\r
- pending = tcore_pending_new(o, 0);\r
- tcore_pending_set_request_data(pending, 0, atreq);\r
- tcore_pending_set_response_callback(pending, on_response_get_xrat, NULL);\r
- tcore_pending_link_user_request(pending, ur);\r
- tcore_pending_set_send_callback(pending, on_confirmation_network_message_send, NULL);\r
- tcore_hal_send_request(h, pending);\r
- \r
+ return TCORE_RETURN_SUCCESS;
+}
+
+static TReturn get_band(CoreObject *o, UserRequest *ur)
+{
+ TcoreHal *h = NULL;
+ TcorePending *pending = NULL;
+
+ TcoreATRequest *atreq;
+ char *cmd_str = NULL;
+ dbg("get_band - ENTER!!");
+
+ if (!o || !ur)
+ return TCORE_RETURN_EINVAL;
+
+ h = tcore_object_get_hal(o);
+
+ /* Get RAT Information Information. Based on RAT read response, we will get specific RAT bands only */
+ cmd_str = g_strdup_printf("AT+XRAT?");
+ atreq = tcore_at_request_new(cmd_str, "+XRAT", TCORE_AT_SINGLELINE);
+ pending = tcore_pending_new(o, 0);
+ tcore_pending_set_request_data(pending, 0, atreq);
+ tcore_pending_set_response_callback(pending, on_response_get_xrat, NULL);
+ tcore_pending_link_user_request(pending, ur);
+ tcore_pending_set_send_callback(pending, on_confirmation_network_message_send, NULL);
+ tcore_hal_send_request(h, pending);
+
g_free(cmd_str);
- return TCORE_RETURN_SUCCESS;\r
-}\r
-\r
-static TReturn set_preferred_plmn(CoreObject *o, UserRequest *ur)\r
-{\r
- TcoreHal *h = NULL;\r
- TcorePlugin *p = NULL;\r
- TcorePending *pending = NULL;\r
- TcoreATRequest *atreq = NULL;\r
+ return TCORE_RETURN_SUCCESS;
+}
+
+static TReturn set_preferred_plmn(CoreObject *o, UserRequest *ur)
+{
+ TcoreHal *h = NULL;
+ TcorePlugin *p = NULL;
+ TcorePending *pending = NULL;
+ TcoreATRequest *atreq = NULL;
struct treq_network_set_preferred_plmn *req_data = NULL;
- char*cmd_str = NULL;\r
- int format = 2; /* Alway use numeric format, as application gives data in this default format */\r
- int gsm_act = 0;\r
- int gsm_compact_act = 0;\r
- int utran_act = 0;\r
-\r
- if (!o || !ur)\r
- return TCORE_RETURN_EINVAL;\r
-\r
- req_data = (struct treq_network_set_preferred_plmn*)tcore_user_request_ref_data(ur, NULL);
+ char *cmd_str = NULL;
+ int format = 2; /* Alway use numeric format, as application gives data in this default format */
+ int gsm_act = 0;
+ int gsm_compact_act = 0;
+ int utran_act = 0;
+
+ if (!o || !ur)
+ return TCORE_RETURN_EINVAL;
+
+ req_data = (struct treq_network_set_preferred_plmn *) tcore_user_request_ref_data(ur, NULL);
pending = tcore_pending_new(o, 0);
-\r
- dbg("Entry set_preferred_plmn");\r
- \r
- p = tcore_object_ref_plugin(o);\r
- h = tcore_object_get_hal(o); \r
-\r
-/*\r
-AT+CPOL=\r
-[<index>][,<format>[,<oper>[,<GSM_AcT>,\r
-<GSM_Compact_AcT>,<UTRAN_AcT>]]]\r
- */\r
- \r
- if((req_data->act == NETWORK_ACT_GSM) || (req_data->act == NETWORK_ACT_GPRS) || (req_data->act == NETWORK_ACT_EGPRS))\r
- gsm_act = TRUE;\r
- else if ((req_data->act == NETWORK_ACT_UMTS) || (req_data->act == NETWORK_ACT_UTRAN))\r
- utran_act = TRUE;\r
- else if (req_data->act == NETWORK_ACT_GSM_UTRAN)\r
- gsm_act= utran_act = TRUE;\r
- \r
+
+ dbg("Entry set_preferred_plmn");
+
+ p = tcore_object_ref_plugin(o);
+ h = tcore_object_get_hal(o);
+
+/*
+AT+CPOL=
+[<index>][,<format>[,<oper>[,<GSM_AcT>,
+<GSM_Compact_AcT>,<UTRAN_AcT>]]]
+ */
+
+ if ((req_data->act == NETWORK_ACT_GSM) || (req_data->act == NETWORK_ACT_GPRS) || (req_data->act == NETWORK_ACT_EGPRS))
+ gsm_act = TRUE;
+ else if ((req_data->act == NETWORK_ACT_UMTS) || (req_data->act == NETWORK_ACT_UTRAN))
+ utran_act = TRUE;
+ else if (req_data->act == NETWORK_ACT_GSM_UTRAN)
+ gsm_act = utran_act = TRUE;
+
if (strlen(req_data->plmn) > 6) {
- req_data->plmn[6] = '\0';
- }
- else if (strlen(req_data->plmn) == 6) {
- if(req_data->plmn[5] == '#') {
+ req_data->plmn[6] = '\0';
+ } else if (strlen(req_data->plmn) == 6) {
+ if (req_data->plmn[5] == '#') {
req_data->plmn[5] = '\0';
}
}
- cmd_str = g_strdup_printf("AT+CPOL=%d,%d,\"%s\",%d,%d,%d",req_data->ef_index+1, format, req_data->plmn, gsm_act, gsm_compact_act, utran_act);
+ cmd_str = g_strdup_printf("AT+CPOL=%d,%d,\"%s\",%d,%d,%d", req_data->ef_index + 1, format, req_data->plmn, gsm_act, gsm_compact_act, utran_act);
dbg("cmd_str - %s", cmd_str);
- atreq = tcore_at_request_new(cmd_str, "+CPOL", TCORE_AT_NO_RESULT);\r
- \r
- tcore_pending_set_request_data(pending, 0, atreq);\r
- tcore_pending_set_response_callback(pending, on_response_set_preferred_plmn, NULL);\r
- tcore_pending_link_user_request(pending, ur);\r
- tcore_pending_set_send_callback(pending, on_confirmation_network_message_send, NULL);\r
-\r
- tcore_hal_send_request(h, pending);\r
+ atreq = tcore_at_request_new(cmd_str, "+CPOL", TCORE_AT_NO_RESULT);
+
+ tcore_pending_set_request_data(pending, 0, atreq);
+ tcore_pending_set_response_callback(pending, on_response_set_preferred_plmn, NULL);
+ tcore_pending_link_user_request(pending, ur);
+ tcore_pending_set_send_callback(pending, on_confirmation_network_message_send, NULL);
+
+ tcore_hal_send_request(h, pending);
g_free(cmd_str);
-\r
- dbg("Exit set_preferred_plmn");\r
-
- return TCORE_RETURN_SUCCESS; \r
-}\r
-\r
-static TReturn get_preferred_plmn(CoreObject *o, UserRequest *ur)\r
-{\r
- \r
- TcoreHal *h = NULL;\r
- TcorePending *pending = NULL;\r
- TcoreATRequest *atreq = NULL;\r
-\r
- char*cmd_str = NULL;\r
-\r
- dbg("get_preferred_plmn - ENTER!!");\r
-\r
- if (!o || !ur)\r
- return TCORE_RETURN_EINVAL;\r
-\r
- h = tcore_object_get_hal(o);\r
- pending = tcore_pending_new(o, 0);\r
-\r
- cmd_str = g_strdup_printf("AT+CPOL?");\r
- atreq = tcore_at_request_new(cmd_str, "+CPOL", TCORE_AT_MULTILINE);\r
- \r
- tcore_pending_set_request_data(pending, 0, atreq);\r
- tcore_pending_set_response_callback(pending, on_response_get_preferred_plmn, NULL);\r
- tcore_pending_link_user_request(pending, ur);\r
- tcore_pending_set_send_callback(pending, on_confirmation_network_message_send, NULL);\r
-\r
- tcore_hal_send_request(h, pending);\r
-\r
+
+ dbg("Exit set_preferred_plmn");
+
+ return TCORE_RETURN_SUCCESS;
+}
+
+static TReturn get_preferred_plmn(CoreObject *o, UserRequest *ur)
+{
+ TcoreHal *h = NULL;
+ TcorePending *pending = NULL;
+ TcoreATRequest *atreq = NULL;
+
+ char *cmd_str = NULL;
+
+ dbg("get_preferred_plmn - ENTER!!");
+
+ if (!o || !ur)
+ return TCORE_RETURN_EINVAL;
+
+ h = tcore_object_get_hal(o);
+ pending = tcore_pending_new(o, 0);
+
+ cmd_str = g_strdup_printf("AT+CPOL?");
+ atreq = tcore_at_request_new(cmd_str, "+CPOL", TCORE_AT_MULTILINE);
+
+ tcore_pending_set_request_data(pending, 0, atreq);
+ tcore_pending_set_response_callback(pending, on_response_get_preferred_plmn, NULL);
+ tcore_pending_link_user_request(pending, ur);
+ tcore_pending_set_send_callback(pending, on_confirmation_network_message_send, NULL);
+
+ tcore_hal_send_request(h, pending);
+
g_free(cmd_str);
-
- dbg("get_preferred_plmn - EXIT!!");\r
-\r
- return TCORE_RETURN_SUCCESS;\r
-}\r
-\r
-static TReturn get_serving_network(CoreObject *o, UserRequest *ur)\r
-{\r
- dbg("get_serving_network - ENTER!!");\r
- \r
- if (!o)\r
- return TCORE_RETURN_EINVAL;\r
-\r
- dbg("new pending(AT+COPS?)");\r
-\r
- nwk_prepare_and_send_pending_request(tcore_object_ref_plugin(o), "umts_network", "AT+COPS=3,2;+COPS?;+COPS=3,0;+COPS?", "+COPS", TCORE_AT_MULTILINE, ur, on_response_get_serving_network);\r
- return TCORE_RETURN_SUCCESS;\r
-}\r
-\r
-static struct tcore_network_operations network_ops = {\r
- .search = search_network,\r
- .set_plmn_selection_mode = set_plmn_selection_mode,\r
- .get_plmn_selection_mode = get_plmn_selection_mode,\r
- .set_service_domain = NULL,\r
- .get_service_domain = NULL,\r
- .set_band = set_band,\r
- .get_band = get_band,\r
- .set_preferred_plmn = set_preferred_plmn,\r
- .get_preferred_plmn = get_preferred_plmn,\r
- .set_order = NULL,\r
- .get_order = NULL,\r
- .set_power_on_attach = NULL,\r
- .get_power_on_attach = NULL,\r
- .set_cancel_manual_search = NULL,\r
- .get_serving_network = get_serving_network,\r
-};\r
-\r
-gboolean s_network_init(TcorePlugin *p, TcoreHal *h)\r
-{\r
- CoreObject *o = NULL;\r
-\r
- o = tcore_network_new(p, "umts_network", &network_ops, h);\r
- if (!o)\r
- return FALSE;\r
-\r
- tcore_object_add_callback(o,"+CREG", on_event_cs_network_regist, NULL);\r
- tcore_object_add_callback(o,"+CGREG", on_event_ps_network_regist, NULL);\r
- tcore_object_add_callback(o, "+XCIEV", on_event_network_icon_info, NULL);\r
-\r
- /* +CTZV: <tz>,<time> */\r
- tcore_object_add_callback(o, "+CTZV", on_event_network_ctzv_time_info, NULL);\r
-\r
- tcore_server_add_notification_hook(tcore_plugin_ref_server(p), TNOTI_SIM_STATUS, on_hook_sim_init, o);\r
-\r
- _insert_mcc_mnc_oper_list(p, o);\r
-\r
- return TRUE;\r
-}\r
-\r
-void s_network_exit(TcorePlugin *p)\r
-{\r
- CoreObject *o;\r
-\r
- o = tcore_plugin_ref_core_object(p, "umts_network");\r
-\r
- tcore_network_free(o);\r
-}\r
+
+ dbg("get_preferred_plmn - EXIT!!");
+
+ return TCORE_RETURN_SUCCESS;
+}
+
+static TReturn get_serving_network(CoreObject *o, UserRequest *ur)
+{
+ dbg("get_serving_network - ENTER!!");
+
+ if (!o)
+ return TCORE_RETURN_EINVAL;
+
+ dbg("new pending(AT+COPS?)");
+
+ nwk_prepare_and_send_pending_request(tcore_object_ref_plugin(o), "umts_network", "AT+COPS=3,2;+COPS?;+COPS=3,0;+COPS?", "+COPS", TCORE_AT_MULTILINE, ur, on_response_get_serving_network);
+ return TCORE_RETURN_SUCCESS;
+}
+
+static struct tcore_network_operations network_ops = {
+ .search = search_network,
+ .set_plmn_selection_mode = set_plmn_selection_mode,
+ .get_plmn_selection_mode = get_plmn_selection_mode,
+ .set_service_domain = NULL,
+ .get_service_domain = NULL,
+ .set_band = set_band,
+ .get_band = get_band,
+ .set_preferred_plmn = set_preferred_plmn,
+ .get_preferred_plmn = get_preferred_plmn,
+ .set_order = NULL,
+ .get_order = NULL,
+ .set_power_on_attach = NULL,
+ .get_power_on_attach = NULL,
+ .set_cancel_manual_search = NULL,
+ .get_serving_network = get_serving_network,
+};
+
+gboolean s_network_init(TcorePlugin *p, TcoreHal *h)
+{
+ CoreObject *o = NULL;
+
+ o = tcore_network_new(p, "umts_network", &network_ops, h);
+ if (!o)
+ return FALSE;
+
+ tcore_object_add_callback(o, "+CREG", on_event_cs_network_regist, NULL);
+ tcore_object_add_callback(o, "+CGREG", on_event_ps_network_regist, NULL);
+ tcore_object_add_callback(o, "+XCIEV", on_event_network_icon_info, NULL);
+
+ /* +CTZV: <tz>,<time> */
+ tcore_object_add_callback(o, "+CTZV", on_event_network_ctzv_time_info, NULL);
+
+ tcore_server_add_notification_hook(tcore_plugin_ref_server(p), TNOTI_SIM_STATUS, on_hook_sim_init, o);
+
+ _insert_mcc_mnc_oper_list(p, o);
+
+ return TRUE;
+}
+
+void s_network_exit(TcorePlugin *p)
+{
+ CoreObject *o;
+
+ o = tcore_plugin_ref_core_object(p, "umts_network");
+
+ tcore_network_free(o);
+}
-/*\r
- * tel-plugin-imc\r
- *\r
- * Copyright (c) 2012 Samsung Electronics Co., Ltd. All rights reserved.\r
- *\r
- * Contact: Arun Shukla <arun.shukla@samsung.com>\r
- *\r
- * Licensed under the Apache License, Version 2.0 (the "License");\r
- * you may not use this file except in compliance with the License.\r
- * You may obtain a copy of the License at\r
- *\r
- * http://www.apache.org/licenses/LICENSE-2.0\r
- *\r
- * Unless required by applicable law or agreed to in writing, software\r
- * distributed under the License is distributed on an "AS IS" BASIS,\r
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
- * See the License for the specific language governing permissions and\r
- * limitations under the License.\r
- */\r
-\r
-#include <stdio.h>\r
-#include <stdlib.h>\r
-#include <string.h>\r
-#include <unistd.h>\r
-\r
-#include <glib.h>\r
-#include <fcntl.h>\r
-#include <sys/ioctl.h>\r
-\r
-#include <tcore.h>\r
-#include <hal.h>\r
-#include <core_object.h>\r
-#include <plugin.h>\r
-#include <queue.h>\r
-#include <co_ps.h>\r
-#include <co_context.h>\r
-#include <storage.h>\r
-#include <server.h>\r
-#include <at.h>\r
-#include <util.h>\r
-#include <type/ps.h>\r
-\r
-#include "s_common.h"\r
-#include "s_ps.h"\r
-\r
-\r
-\r
-#define VNET_CH_PATH_BOOT0 "/dev/umts_boot0"\r
-#define IOCTL_CG_DATA_SEND _IO('o', 0x37)\r
-\r
-/*Invalid Session ID*/\r
-#define PS_INVALID_CID 999 /*Need to check */\r
-\r
-/*Maximum String length Of the Command*/\r
-#define MAX_AT_CMD_STR_LEN 150\r
-\r
-/*Command for PDP activation and Deactivation*/\r
-#define AT_PDP_ACTIVATE 1\r
-#define AT_PDP_DEACTIVATE 0\r
-\r
-#define AT_XDNS_ENABLE 1\r
-#define AT_XDNS_DISABLE 0\r
-#define AT_SESSION_DOWN 0\r
-static void _ps_free(void * ptr)\r
-{\r
- dbg("Entered");\r
- if(ptr)\r
- {\r
- (void)free(ptr);\r
- ptr = NULL;\r
- }\r
- dbg("Exit");\r
- return;\r
-}\r
-static void _unable_to_get_pending(CoreObject *co_ps,CoreObject *ps_context)\r
-{\r
- struct tnoti_ps_call_status data_resp = {0};\r
- dbg("Entered");\r
- data_resp.context_id = tcore_context_get_id(ps_context);\r
- data_resp.state = AT_SESSION_DOWN;/*check value of state*/\r
- data_resp.result =0xFF;/*check error value*/\r
- tcore_server_send_notification(tcore_plugin_ref_server(tcore_object_ref_plugin(co_ps)), co_ps,\r
- TNOTI_PS_CALL_STATUS, sizeof(struct tnoti_ps_call_status), &data_resp);\r
- (void)tcore_context_set_state(ps_context, CONTEXT_STATE_DEACTIVATED);\r
- dbg("Exit");\r
-}\r
-static TReturn _pdp_device_control(unsigned int cid)\r
-{\r
- int fd = -1;\r
- int ret = -1;\r
- fd = open ( VNET_CH_PATH_BOOT0, O_RDWR );\r
- if(fd < 0)\r
- {\r
- dbg("error : open [ %s ] [ %s ]", VNET_CH_PATH_BOOT0, strerror(errno));\r
- return -1;\r
- }\r
- /*To Do for different Cids*/\r
- dbg("Send IOCTL: arg 0x05 (0101) HSIC1, cid=%d \n",cid);\r
- if(cid == 1)\r
- {\r
- ret = ioctl(fd, IOCTL_CG_DATA_SEND, 0x05);\r
- }\r
- else if(cid == 2)\r
- {\r
- ret = ioctl(fd, IOCTL_CG_DATA_SEND, 0xA);\r
- }\r
- else\r
- {\r
- dbg("More Than 2 context are not supported right Now");\r
- }\r
- close(fd);\r
- if (ret < 0)\r
- {\r
- dbg("[ error ] send IOCTL_CG_DATA_SEND (0x%x) fail!! \n",IOCTL_CG_DATA_SEND);\r
- return TCORE_RETURN_FAILURE;\r
- }\r
- else\r
- {\r
- dbg("[ ok ] send IOCTL_CG_DATA_SEND (0x%x) success!! \n",IOCTL_CG_DATA_SEND);\r
- return TCORE_RETURN_SUCCESS;\r
- }\r
-}\r
-\r
-static gboolean on_event_cgev_handle(CoreObject *co_ps, const void *data, void *user_data)\r
-{\r
-\r
- char *token = NULL;\r
- GSList *tokens= NULL;\r
- GSList *lines = NULL;\r
- const char *line = NULL;\r
- char *noti_data = NULL;\r
- int i = 0;\r
- int value = 20;\r
- int state = -1;\r
- struct tnoti_ps_call_status data_resp = {0};\r
-\r
- dbg("Entered");\r
- lines = (GSList*)data;\r
- line = (const char *)lines->data;\r
- dbg("Lines->data :-%s",line);\r
-\r
- tokens = tcore_at_tok_new(line);\r
- switch(g_slist_length(tokens))\r
- {\r
- case 0:\r
- {\r
- dbg("No token present: Ignore +CGEV Notifications ");\r
- return TRUE;\r
- }\r
- case 1:\r
- {\r
- dbg("one Token present");\r
- noti_data = g_slist_nth_data(tokens, 0);\r
- dbg("notification data :-%s",noti_data);\r
- if(0 == strcmp(noti_data,"ME CLASS B"))\r
- {\r
- dbg("ME Class B notification received");\r
- goto ignore;\r
- }\r
- if(0 == strcmp(noti_data,"NW CLASS A"))\r
- {\r
- dbg("NW Class A notification received");\r
- goto ignore;\r
- }\r
- token = strtok(noti_data, " ");\r
- while(token != NULL)\r
- {\r
- if((i == 0) && (0!= strcmp(token,"ME")))\r
- {\r
- break;\r
- }\r
- if((i == 1) && (0!= strcmp(token,"PDN")))\r
- {\r
- break;\r
- }\r
- if((i == 2) && (0 == strcmp(token,"ACT")))\r
- {\r
- state = 1;\r
- }\r
- if((i == 2) && (0 == strcmp(token,"DEACT")))\r
- {\r
- state = 0;\r
- }\r
- if(i == 3 )\r
- {\r
- value = atoi(token);\r
- break;\r
- }\r
- i++;\r
- token = strtok(NULL, " ");\r
- }\r
- dbg("value:%d ",value);\r
- i = 0;\r
- break;\r
- }\r
- case 3:\r
- {\r
- i = 0;\r
- state = 0;\r
- value = 0;\r
- dbg("Three Token present");\r
- noti_data = g_slist_nth_data(tokens, 0);\r
- dbg("notification data :-%s",noti_data);\r
- token = strtok(noti_data, " ");\r
- while(token != NULL)\r
- {\r
- if((i == 0) && (0 == strcmp(token,"ME")))\r
- {\r
- state = 1;\r
- }\r
- if((i == 1) && (0!= strcmp(token,"DEACT")))\r
- {\r
- break;\r
- }\r
- if((i == 2) && (0 == strcmp(token,"\"IP\"")) && (0 == state))\r
- {\r
- dbg("MObile Deactiavted the Context");\r
- value = 10;\r
- break;\r
- }\r
- if((i == 2) && (0 == strcmp(token,"\"IP\"")) && (1 == state))\r
- {\r
- dbg("NW Deactiavted the Context");\r
- value = 10;\r
- break;\r
- }\r
- i++;\r
- token = strtok(NULL, " ");\r
- }\r
- if(value == 10 && state == 0)\r
- {\r
- dbg("Recieved Notification for Context deactivations from network");\r
- noti_data = g_slist_nth_data(tokens, 1);\r
- dbg("PDP Address :- %s",noti_data);\r
- noti_data = g_slist_nth_data(tokens, 2);\r
- dbg("CID got deactivated :- %d",atoi(noti_data));\r
- }\r
- if(value == 10 && state == 1)\r
- {\r
- dbg("Recieved Notification for Context deactivations from Mobile");\r
- noti_data = g_slist_nth_data(tokens, 1);\r
- dbg("PDP Address :- %s",noti_data);\r
- noti_data = g_slist_nth_data(tokens, 2);\r
- dbg("CID got deactivated :- %d",atoi(noti_data));\r
- }\r
- data_resp.context_id = atoi(noti_data);\r
- data_resp.state = 3;/*check value of state*/\r
- dbg("State of the service :- %d",data_resp.state);\r
- data_resp.result =0xFF;/*check error value*/\r
- dbg("Sending the notification");\r
-
- tcore_server_send_notification(tcore_plugin_ref_server(tcore_object_ref_plugin(co_ps)), co_ps,\r
- TNOTI_PS_CALL_STATUS, sizeof(struct tnoti_ps_call_status), &data_resp);\r
-
- state = 100;\r
- value = 100;\r
-
- break;\r
- }\r
- default:\r
- {\r
- dbg("Ignore +CGEV Notifications ");\r
- }\r
- }\r
- if(state == 1)\r
- {\r
- dbg("Notification recieved for Activation of CID:-%d",value);\r
- }\r
- else if(state == 0)\r
- {\r
- dbg("Notification recieved for Deactivation of CID:-%d",value);\r
- }\r
- else\r
- {\r
- dbg("ignore");\r
- }\r
-ignore:\r
- tcore_at_tok_free(tokens);\r
- return TRUE;\r
-}\r
-\r
-static gboolean on_event_dun_call_notification(CoreObject *o, const void *data, void *user_data)\r
-{\r
- GSList *tokens=NULL;\r
- const char *line = NULL;\r
- int value = 0;\r
- GSList *lines = NULL;\r
- dbg("Entered");\r
-\r
- lines = (GSList*)data;\r
- if (1 != g_slist_length(lines))\r
- {\r
- dbg("unsolicited msg but multiple line");\r
- goto OUT;\r
- }\r
- line = (char*)(lines->data);\r
- tokens = tcore_at_tok_new(line);\r
- value = atoi(g_slist_nth_data(tokens, 0));\r
-\r
- /*\r
- <status> may be\r
- 0: DUN activation in progress\r
- 1: DUN deactivation in progress\r
- 2: DUN activated\r
- 3: DUN deactivated\r
- */\r
- switch(value)\r
- {\r
- case 0:/*Fall Through*/\r
- case 1:\r
- {\r
- break;\r
- }\r
- case 2:\r
- {\r
- /*To Do:- Fill Data structure : data*/\r
- tcore_server_send_notification(tcore_plugin_ref_server(tcore_object_ref_plugin(o)), o,\r
- TNOTI_PS_EXTERNAL_CALL, sizeof(struct tnoti_ps_external_call), &data);\r
- }\r
- case 3:\r
- {\r
- /*To Do:- Fill Data structure : data*/\r
- tcore_server_send_notification(tcore_plugin_ref_server(tcore_object_ref_plugin(o)), o,\r
- TNOTI_PS_EXTERNAL_CALL, sizeof(struct tnoti_ps_external_call), &data);\r
- }\r
- break;\r
- default:\r
- goto OUT;\r
- }\r
- OUT:\r
- if(NULL!=tokens)\r
- {\r
- tcore_at_tok_free(tokens);\r
- }\r
- return TRUE;\r
-}\r
-static void on_response_undefine_context_cmd(TcorePending *p, int data_len, const void *data, void *user_data)\r
-{\r
- CoreObject *co_ps = NULL;\r
- const TcoreATResponse *resp = data;\r
- CoreObject *ps_context = user_data;\r
- dbg("Entered");\r
- co_ps = tcore_pending_ref_core_object(p);\r
- if(resp->success)\r
- {\r
- dbg("Response Ok");\r
+/*
+ * tel-plugin-imc
+ *
+ * Copyright (c) 2012 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: Arun Shukla <arun.shukla@samsung.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+
+#include <glib.h>
+#include <fcntl.h>
+#include <sys/ioctl.h>
+
+#include <tcore.h>
+#include <hal.h>
+#include <core_object.h>
+#include <plugin.h>
+#include <queue.h>
+#include <co_ps.h>
+#include <co_context.h>
+#include <storage.h>
+#include <server.h>
+#include <at.h>
+#include <util.h>
+#include <type/ps.h>
+
+#include "s_common.h"
+#include "s_ps.h"
+
+
+
+#define VNET_CH_PATH_BOOT0 "/dev/umts_boot0"
+#define IOCTL_CG_DATA_SEND _IO('o', 0x37)
+
+/*Invalid Session ID*/
+#define PS_INVALID_CID 999 /*Need to check */
+
+/*Maximum String length Of the Command*/
+#define MAX_AT_CMD_STR_LEN 150
+
+/*Command for PDP activation and Deactivation*/
+#define AT_PDP_ACTIVATE 1
+#define AT_PDP_DEACTIVATE 0
+
+#define AT_XDNS_ENABLE 1
+#define AT_XDNS_DISABLE 0
+#define AT_SESSION_DOWN 0
+static void _ps_free(void *ptr)
+{
+ dbg("Entered");
+ if (ptr) {
+ (void) free(ptr);
+ ptr = NULL;
+ }
+ dbg("Exit");
+ return;
+}
+static void _unable_to_get_pending(CoreObject *co_ps, CoreObject *ps_context)
+{
+ struct tnoti_ps_call_status data_resp = {0};
+ dbg("Entered");
+ data_resp.context_id = tcore_context_get_id(ps_context);
+ data_resp.state = AT_SESSION_DOWN; /*check value of state*/
+ data_resp.result = 0xFF; /*check error value*/
+ tcore_server_send_notification(tcore_plugin_ref_server(tcore_object_ref_plugin(co_ps)), co_ps,
+ TNOTI_PS_CALL_STATUS, sizeof(struct tnoti_ps_call_status), &data_resp);
+ (void) tcore_context_set_state(ps_context, CONTEXT_STATE_DEACTIVATED);
+ dbg("Exit");
+}
+static TReturn _pdp_device_control(unsigned int cid)
+{
+ int fd = -1;
+ int ret = -1;
+ fd = open(VNET_CH_PATH_BOOT0, O_RDWR);
+ if (fd < 0) {
+ dbg("error : open [ %s ] [ %s ]", VNET_CH_PATH_BOOT0, strerror(errno));
+ return -1;
+ }
+ /*To Do for different Cids*/
+ dbg("Send IOCTL: arg 0x05 (0101) HSIC1, cid=%d \n", cid);
+ if (cid == 1) {
+ ret = ioctl(fd, IOCTL_CG_DATA_SEND, 0x05);
+ } else if (cid == 2) {
+ ret = ioctl(fd, IOCTL_CG_DATA_SEND, 0xA);
+ } else {
+ dbg("More Than 2 context are not supported right Now");
+ }
+ close(fd);
+ if (ret < 0) {
+ dbg("[ error ] send IOCTL_CG_DATA_SEND (0x%x) fail!! \n", IOCTL_CG_DATA_SEND);
+ return TCORE_RETURN_FAILURE;
+ } else {
+ dbg("[ ok ] send IOCTL_CG_DATA_SEND (0x%x) success!! \n", IOCTL_CG_DATA_SEND);
+ return TCORE_RETURN_SUCCESS;
+ }
+}
+
+static gboolean on_event_cgev_handle(CoreObject *co_ps, const void *data, void *user_data)
+{
+ char *token = NULL;
+ GSList *tokens = NULL;
+ GSList *lines = NULL;
+ const char *line = NULL;
+ char *noti_data = NULL;
+ int i = 0;
+ int value = 20;
+ int state = -1;
+ struct tnoti_ps_call_status data_resp = {0};
+
+ dbg("Entered");
+ lines = (GSList *) data;
+ line = (const char *) lines->data;
+ dbg("Lines->data :-%s", line);
+
+ tokens = tcore_at_tok_new(line);
+ switch (g_slist_length(tokens)) {
+ case 0:
+ {
+ dbg("No token present: Ignore +CGEV Notifications ");
+ return TRUE;
+ }
+
+ case 1:
+ {
+ dbg("one Token present");
+ noti_data = g_slist_nth_data(tokens, 0);
+ dbg("notification data :-%s", noti_data);
+ if (0 == strcmp(noti_data, "ME CLASS B")) {
+ dbg("ME Class B notification received");
+ goto ignore;
+ }
+ if (0 == strcmp(noti_data, "NW CLASS A")) {
+ dbg("NW Class A notification received");
+ goto ignore;
+ }
+ token = strtok(noti_data, " ");
+ while (token != NULL) {
+ if ((i == 0) && (0 != strcmp(token, "ME"))) {
+ break;
+ }
+ if ((i == 1) && (0 != strcmp(token, "PDN"))) {
+ break;
+ }
+ if ((i == 2) && (0 == strcmp(token, "ACT"))) {
+ state = 1;
+ }
+ if ((i == 2) && (0 == strcmp(token, "DEACT"))) {
+ state = 0;
+ }
+ if (i == 3) {
+ value = atoi(token);
+ break;
+ }
+ i++;
+ token = strtok(NULL, " ");
+ }
+ dbg("value:%d ", value);
+ i = 0;
+ break;
+ }
+
+ case 3:
+ {
+ i = 0;
+ state = 0;
+ value = 0;
+ dbg("Three Token present");
+ noti_data = g_slist_nth_data(tokens, 0);
+ dbg("notification data :-%s", noti_data);
+ token = strtok(noti_data, " ");
+ while (token != NULL) {
+ if ((i == 0) && (0 == strcmp(token, "ME"))) {
+ state = 1;
+ }
+ if ((i == 1) && (0 != strcmp(token, "DEACT"))) {
+ break;
+ }
+ if ((i == 2) && (0 == strcmp(token, "\"IP\"")) && (0 == state)) {
+ dbg("MObile Deactiavted the Context");
+ value = 10;
+ break;
+ }
+ if ((i == 2) && (0 == strcmp(token, "\"IP\"")) && (1 == state)) {
+ dbg("NW Deactiavted the Context");
+ value = 10;
+ break;
+ }
+ i++;
+ token = strtok(NULL, " ");
+ }
+ if (value == 10 && state == 0) {
+ dbg("Recieved Notification for Context deactivations from network");
+ noti_data = g_slist_nth_data(tokens, 1);
+ dbg("PDP Address :- %s", noti_data);
+ noti_data = g_slist_nth_data(tokens, 2);
+ dbg("CID got deactivated :- %d", atoi(noti_data));
+ }
+ if (value == 10 && state == 1) {
+ dbg("Recieved Notification for Context deactivations from Mobile");
+ noti_data = g_slist_nth_data(tokens, 1);
+ dbg("PDP Address :- %s", noti_data);
+ noti_data = g_slist_nth_data(tokens, 2);
+ dbg("CID got deactivated :- %d", atoi(noti_data));
+ }
+ data_resp.context_id = atoi(noti_data);
+ data_resp.state = 3; /*check value of state*/
+ dbg("State of the service :- %d", data_resp.state);
+ data_resp.result = 0xFF; /*check error value*/
+ dbg("Sending the notification");
+
+ tcore_server_send_notification(tcore_plugin_ref_server(tcore_object_ref_plugin(co_ps)), co_ps,
+ TNOTI_PS_CALL_STATUS, sizeof(struct tnoti_ps_call_status), &data_resp);
+
+ state = 100;
+ value = 100;
+
+ break;
+ }
+
+ default:
+ {
+ dbg("Ignore +CGEV Notifications ");
+ }
+ }
+ if (state == 1) {
+ dbg("Notification recieved for Activation of CID:-%d", value);
+ } else if (state == 0) {
+ dbg("Notification recieved for Deactivation of CID:-%d", value);
+ } else {
+ dbg("ignore");
+ }
+ignore:
+ tcore_at_tok_free(tokens);
+ return TRUE;
+}
+
+static gboolean on_event_dun_call_notification(CoreObject *o, const void *data, void *user_data)
+{
+ GSList *tokens = NULL;
+ const char *line = NULL;
+ int value = 0;
+ GSList *lines = NULL;
+ dbg("Entered");
+
+ lines = (GSList *) data;
+ if (1 != g_slist_length(lines)) {
+ dbg("unsolicited msg but multiple line");
+ goto OUT;
+ }
+ line = (char *) (lines->data);
+ tokens = tcore_at_tok_new(line);
+ value = atoi(g_slist_nth_data(tokens, 0));
+
+ /*
+ <status> may be
+ 0: DUN activation in progress
+ 1: DUN deactivation in progress
+ 2: DUN activated
+ 3: DUN deactivated
+ */
+ switch (value) {
+ case 0: /*Fall Through*/
+ case 1:
+ {
+ break;
+ }
+
+ case 2:
+ {
+ /*To Do:- Fill Data structure : data*/
+ tcore_server_send_notification(tcore_plugin_ref_server(tcore_object_ref_plugin(o)), o,
+ TNOTI_PS_EXTERNAL_CALL, sizeof(struct tnoti_ps_external_call), &data);
+ }
+
+ case 3:
+ {
+ /*To Do:- Fill Data structure : data*/
+ tcore_server_send_notification(tcore_plugin_ref_server(tcore_object_ref_plugin(o)), o,
+ TNOTI_PS_EXTERNAL_CALL, sizeof(struct tnoti_ps_external_call), &data);
+ }
+ break;
+
+ default:
+ goto OUT;
+ }
+OUT:
+ if (NULL != tokens) {
+ tcore_at_tok_free(tokens);
+ }
+ return TRUE;
+}
+static void on_response_undefine_context_cmd(TcorePending *p, int data_len, const void *data, void *user_data)
+{
+ CoreObject *co_ps = NULL;
+ const TcoreATResponse *resp = data;
+ CoreObject *ps_context = user_data;
+ dbg("Entered");
+ co_ps = tcore_pending_ref_core_object(p);
+ if (resp->success) {
+ dbg("Response Ok");
return;
- }\r
- dbg("Response NOk");\r
- _unable_to_get_pending(co_ps,ps_context);\r
- return;\r
-}\r
-\r
-static void send_undefine_context_cmd(CoreObject *co_ps,CoreObject *ps_context)\r
-{\r
- TcoreHal *hal = NULL;\r
- TcorePending *pending = NULL;\r
- char cmd_str[MAX_AT_CMD_STR_LEN] ;\r
- int cid = 0;\r
-\r
- dbg("Entered");\r
- memset(cmd_str,0x0,MAX_AT_CMD_STR_LEN);\r
-\r
- /* FIXME: Before MUX setup, use PHY HAL directly. */\r
- hal = tcore_object_get_hal(co_ps);\r
-\r
- /*Getting Context ID from Core Object*/\r
- cid = tcore_context_get_id(ps_context);\r
-\r
- (void)sprintf(cmd_str, "AT+CGDCONT=%d",cid);\r
- pending = tcore_at_pending_new(co_ps,cmd_str,NULL,TCORE_AT_NO_RESULT,\r
- on_response_undefine_context_cmd,ps_context );\r
- if(NULL == pending)\r
- {\r
- err("Unable to get the create a AT request ");\r
- goto error;\r
- }\r
- tcore_hal_send_request(hal, pending);\r
- dbg("Exit: Successfully");\r
- return ;\r
-error:\r
- {\r
- dbg("Exit: With error");\r
- _unable_to_get_pending(co_ps,ps_context);\r
- return;\r
- }\r
-}\r
-static void on_response_data_counter_command(TcorePending *p, int data_len, const void *data, void *user_data)\r
-{\r
- CoreObject *ps_context = user_data;\r
- const TcoreATResponse *resp = data;\r
- CoreObject *co_ps = tcore_pending_ref_core_object(p);\r
-\r
- GSList *tokens=NULL;\r
- GSList *pRespData;\r
- const char *line = NULL;\r
- int no_pdp_active =0;\r
- unsigned long long Rx;\r
- unsigned long long Tx;\r
- int cid = tcore_context_get_id(ps_context);\r
- dbg("Entered");\r
-\r
- if(resp->final_response)\r
- {\r
- dbg("Response OK");\r
- dbg(" response lines : -%s",resp->lines);\r
- if(resp->lines)\r
- {\r
- pRespData = (GSList*)resp->lines;\r
- no_pdp_active = g_slist_length(pRespData);\r
- dbg("Total Number of Active PS Context :- %d",no_pdp_active);\r
-\r
- if(no_pdp_active == 0)\r
- {\r
- return;\r
- }\r
- while(pRespData)\r
- {\r
- dbg("Entered the Loop pRespData");\r
-\r
- line = (const char*)pRespData->data;\r
- dbg("Response->lines->data :%s",line);\r
- tokens = tcore_at_tok_new(line);\r
- if(cid == atoi(g_slist_nth_data(tokens, 0)))\r
- {\r
- dbg("Found the data for our CID");\r
- Tx = (unsigned long long)g_ascii_strtoull((g_slist_nth_data(tokens,1)), NULL, 10);\r
- dbg("Tx: %d", Tx);\r
-\r
- Rx = (unsigned long long)g_ascii_strtoull((g_slist_nth_data(tokens, 2)), NULL, 10);\r
- dbg("Rx: %d", Rx);\r
-\r
- tcore_at_tok_free(tokens);\r
- tokens = NULL;\r
- dbg("Exiting the Loop pRespData");\r
- break;\r
- }\r
- tcore_at_tok_free(tokens);\r
- tokens = NULL;\r
- pRespData= pRespData->next;\r
-\r
- }\r
- dbg("Sending Data counter notifications");\r
-\r
- tcore_server_send_notification(tcore_plugin_ref_server(tcore_object_ref_plugin(co_ps)), co_ps,\r
- TNOTI_PS_CURRENT_SESSION_DATA_COUNTER, 0, NULL);\r
- return;\r
- }\r
- else\r
- {\r
- dbg("No Active PS Context");\r
- }\r
- }\r
- dbg("Response NOK");\r
-}\r
-\r
-static TReturn send_data_counter_command(CoreObject *co_ps,CoreObject *ps_context)\r
-{\r
- TcoreHal *hal = NULL;\r
- TcorePending *pending = NULL;\r
- char cmd_str[MAX_AT_CMD_STR_LEN] ;\r
-\r
- dbg("Enetered");\r
- memset(cmd_str,0x0,MAX_AT_CMD_STR_LEN);\r
-\r
- hal = tcore_object_get_hal(co_ps);\r
-\r
- (void)sprintf(cmd_str, "AT+XGCNTRD");\r
- pending = tcore_at_pending_new(co_ps,cmd_str,"+XGCNTRD",TCORE_AT_MULTILINE,\r
- on_response_data_counter_command,ps_context );\r
- if(TCORE_RETURN_SUCCESS == tcore_hal_send_request(hal,pending))\r
- {\r
- return TCORE_RETURN_SUCCESS;\r
- }\r
- _unable_to_get_pending(co_ps,ps_context);\r
- return TCORE_RETURN_FAILURE;\r
-/*Add code if unable to get the data usage*/\r
-}\r
-static void on_response_deactivate_ps_context(TcorePending *p, int data_len, const void *data, void *user_data)\r
-{\r
- CoreObject *co_ps = tcore_pending_ref_core_object(p);\r
- CoreObject *ps_context = user_data;\r
- const TcoreATResponse *resp = data;\r
- int cid ;\r
-\r
- cid = tcore_context_get_id(ps_context);\r
- if(resp->success)\r
- {\r
- dbg("Response OK");\r
- /*get the data usage and report it application*/\r
- (void)send_data_counter_command(co_ps,ps_context);\r
- /*get the HSDPA status and report it to server*/\r
- }\r
- else\r
- {\r
- dbg("Response NOK");\r
- send_undefine_context_cmd(co_ps,ps_context);\r
- }\r
- return;\r
-}\r
-\r
-static TReturn deactivate_ps_context(CoreObject *co_ps, CoreObject *ps_context, void *user_data)\r
-{\r
- TcoreHal *hal = NULL;\r
- TcorePending *pending = NULL;\r
- unsigned int cid = PS_INVALID_CID;\r
- char cmd_str[MAX_AT_CMD_STR_LEN] ;\r
-\r
- dbg("Entered");\r
- memset(cmd_str,0x0,MAX_AT_CMD_STR_LEN);\r
-\r
- /*Getting Context ID from Core Object*/\r
- cid = tcore_context_get_id(ps_context);\r
-\r
- /* FIXME: Before MUX setup, use PHY HAL directly. */\r
- hal = tcore_object_get_hal(co_ps);\r
-\r
- (void)sprintf(cmd_str, "AT+CGACT=%d,%d",AT_PDP_DEACTIVATE,cid);\r
- dbg("At commands :- %s",cmd_str);\r
-\r
- pending = tcore_at_pending_new(co_ps,cmd_str,NULL,TCORE_AT_NO_RESULT,\r
- on_response_deactivate_ps_context,ps_context );\r
- if(TCORE_RETURN_SUCCESS == tcore_hal_send_request(hal,pending))\r
- {\r
- (void)tcore_context_set_state(ps_context,CONTEXT_STATE_DEACTIVATING);\r
- return TCORE_RETURN_SUCCESS;\r
- }\r
- _unable_to_get_pending(co_ps,ps_context);\r
- return TCORE_RETURN_FAILURE;\r
-}\r
-\r
-static void on_response_get_dns_cmnd(TcorePending *p, int data_len, const void *data, void *user_data)\r
-{\r
-\r
- struct tnoti_ps_pdp_ipconfiguration noti = {0};\r
- struct tnoti_ps_call_status data_status = {0};\r
- char devname[10] = {0,};\r
+ }
+ dbg("Response NOk");
+ _unable_to_get_pending(co_ps, ps_context);
+ return;
+}
+
+static void send_undefine_context_cmd(CoreObject *co_ps, CoreObject *ps_context)
+{
+ TcoreHal *hal = NULL;
+ TcorePending *pending = NULL;
+ char cmd_str[MAX_AT_CMD_STR_LEN];
+ int cid = 0;
+
+ dbg("Entered");
+ memset(cmd_str, 0x0, MAX_AT_CMD_STR_LEN);
+
+ /* FIXME: Before MUX setup, use PHY HAL directly. */
+ hal = tcore_object_get_hal(co_ps);
+
+ /*Getting Context ID from Core Object*/
+ cid = tcore_context_get_id(ps_context);
+
+ (void) sprintf(cmd_str, "AT+CGDCONT=%d", cid);
+ pending = tcore_at_pending_new(co_ps, cmd_str, NULL, TCORE_AT_NO_RESULT,
+ on_response_undefine_context_cmd, ps_context);
+ if (NULL == pending) {
+ err("Unable to get the create a AT request ");
+ goto error;
+ }
+ tcore_hal_send_request(hal, pending);
+ dbg("Exit: Successfully");
+ return;
+error:
+ {
+ dbg("Exit: With error");
+ _unable_to_get_pending(co_ps, ps_context);
+ return;
+ }
+}
+static void on_response_data_counter_command(TcorePending *p, int data_len, const void *data, void *user_data)
+{
+ CoreObject *ps_context = user_data;
+ const TcoreATResponse *resp = data;
+ CoreObject *co_ps = tcore_pending_ref_core_object(p);
+
+ GSList *tokens = NULL;
+ GSList *pRespData;
+ const char *line = NULL;
+ int no_pdp_active = 0;
+ unsigned long long Rx;
+ unsigned long long Tx;
+ int cid = tcore_context_get_id(ps_context);
+ dbg("Entered");
+
+ if (resp->final_response) {
+ dbg("Response OK");
+ dbg(" response lines : -%s", resp->lines);
+ if (resp->lines) {
+ pRespData = (GSList *) resp->lines;
+ no_pdp_active = g_slist_length(pRespData);
+ dbg("Total Number of Active PS Context :- %d", no_pdp_active);
+
+ if (no_pdp_active == 0) {
+ return;
+ }
+ while (pRespData) {
+ dbg("Entered the Loop pRespData");
+
+ line = (const char *) pRespData->data;
+ dbg("Response->lines->data :%s", line);
+ tokens = tcore_at_tok_new(line);
+ if (cid == atoi(g_slist_nth_data(tokens, 0))) {
+ dbg("Found the data for our CID");
+ Tx = (unsigned long long) g_ascii_strtoull((g_slist_nth_data(tokens, 1)), NULL, 10);
+ dbg("Tx: %d", Tx);
+
+ Rx = (unsigned long long) g_ascii_strtoull((g_slist_nth_data(tokens, 2)), NULL, 10);
+ dbg("Rx: %d", Rx);
+
+ tcore_at_tok_free(tokens);
+ tokens = NULL;
+ dbg("Exiting the Loop pRespData");
+ break;
+ }
+ tcore_at_tok_free(tokens);
+ tokens = NULL;
+ pRespData = pRespData->next;
+ }
+ dbg("Sending Data counter notifications");
+
+ tcore_server_send_notification(tcore_plugin_ref_server(tcore_object_ref_plugin(co_ps)), co_ps,
+ TNOTI_PS_CURRENT_SESSION_DATA_COUNTER, 0, NULL);
+ return;
+ } else {
+ dbg("No Active PS Context");
+ }
+ }
+ dbg("Response NOK");
+}
+
+static TReturn send_data_counter_command(CoreObject *co_ps, CoreObject *ps_context)
+{
+ TcoreHal *hal = NULL;
+ TcorePending *pending = NULL;
+ char cmd_str[MAX_AT_CMD_STR_LEN];
+
+ dbg("Enetered");
+ memset(cmd_str, 0x0, MAX_AT_CMD_STR_LEN);
+
+ hal = tcore_object_get_hal(co_ps);
+
+ (void) sprintf(cmd_str, "AT+XGCNTRD");
+ pending = tcore_at_pending_new(co_ps, cmd_str, "+XGCNTRD", TCORE_AT_MULTILINE,
+ on_response_data_counter_command, ps_context);
+ if (TCORE_RETURN_SUCCESS == tcore_hal_send_request(hal, pending)) {
+ return TCORE_RETURN_SUCCESS;
+ }
+ _unable_to_get_pending(co_ps, ps_context);
+ return TCORE_RETURN_FAILURE;
+/*Add code if unable to get the data usage*/
+}
+static void on_response_deactivate_ps_context(TcorePending *p, int data_len, const void *data, void *user_data)
+{
+ CoreObject *co_ps = tcore_pending_ref_core_object(p);
+ CoreObject *ps_context = user_data;
+ const TcoreATResponse *resp = data;
+ int cid;
+
+ cid = tcore_context_get_id(ps_context);
+ if (resp->success) {
+ dbg("Response OK");
+ /*get the data usage and report it application*/
+ (void) send_data_counter_command(co_ps, ps_context);
+ /*get the HSDPA status and report it to server*/
+ } else {
+ dbg("Response NOK");
+ send_undefine_context_cmd(co_ps, ps_context);
+ }
+ return;
+}
+
+static TReturn deactivate_ps_context(CoreObject *co_ps, CoreObject *ps_context, void *user_data)
+{
+ TcoreHal *hal = NULL;
+ TcorePending *pending = NULL;
+ unsigned int cid = PS_INVALID_CID;
+ char cmd_str[MAX_AT_CMD_STR_LEN];
+
+ dbg("Entered");
+ memset(cmd_str, 0x0, MAX_AT_CMD_STR_LEN);
+
+ /*Getting Context ID from Core Object*/
+ cid = tcore_context_get_id(ps_context);
+
+ /* FIXME: Before MUX setup, use PHY HAL directly. */
+ hal = tcore_object_get_hal(co_ps);
+
+ (void) sprintf(cmd_str, "AT+CGACT=%d,%d", AT_PDP_DEACTIVATE, cid);
+ dbg("At commands :- %s", cmd_str);
+
+ pending = tcore_at_pending_new(co_ps, cmd_str, NULL, TCORE_AT_NO_RESULT,
+ on_response_deactivate_ps_context, ps_context);
+ if (TCORE_RETURN_SUCCESS == tcore_hal_send_request(hal, pending)) {
+ (void) tcore_context_set_state(ps_context, CONTEXT_STATE_DEACTIVATING);
+ return TCORE_RETURN_SUCCESS;
+ }
+ _unable_to_get_pending(co_ps, ps_context);
+ return TCORE_RETURN_FAILURE;
+}
+
+static void on_response_get_dns_cmnd(TcorePending *p, int data_len, const void *data, void *user_data)
+{
+ struct tnoti_ps_pdp_ipconfiguration noti = {0};
+ struct tnoti_ps_call_status data_status = {0};
+ char devname[10] = {0, };
char *dns_prim = NULL;
char *dns_sec = NULL;
char *pdp_address = NULL;
- char addr[4]= {0};\r
- GSList *tokens=NULL;\r
- GSList *pRespData;\r
- const char *line = NULL;\r
- char *token_dns = NULL;\r
- char *token_add = NULL;\r
-\r
- char *token_pdp_address = NULL;\r
- int no_pdp_active =0;\r
- int index = 0;\r
-\r
- CoreObject *ps_context = user_data;\r
- const TcoreATResponse *resp = data;\r
- CoreObject *co_ps = tcore_pending_ref_core_object(p);\r
- int cid = tcore_context_get_id(ps_context);\r
-\r
- dbg("Entered");\r
-\r
- if(resp->final_response)\r
- {\r
- dbg("Response OK");\r
- if(resp->lines)\r
- {\r
- dbg("DNS data present in the Response");\r
- pRespData = (GSList*)resp->lines;\r
- no_pdp_active = g_slist_length(pRespData);\r
- dbg("Total Number of Active PS Context :- %d",no_pdp_active);\r
- if(0 == no_pdp_active)\r
- {\r
- goto exit_fail;\r
- }\r
- while(pRespData)\r
- {\r
- dbg("traversing the DNS data for each active context");\r
- line = (const char*)pRespData->data;\r
- dbg("Response->lines->data :%s",line);\r
- tokens = tcore_at_tok_new(line);\r
- if(cid == atoi(g_slist_nth_data(tokens, 0)))\r
- {\r
- dbg("Found the DNS details for the Current context");\r
- dbg("Context Id of The Context : %d",atoi(g_slist_nth_data(tokens, 0)));\r
- break;\r
- }\r
- tcore_at_tok_free(tokens);\r
- tokens = NULL;\r
- pRespData= pRespData->next;\r
- }\r
- { /* Read primary DNS */\r
- token_dns = g_slist_nth_data(tokens,1);\r
- /* Strip off starting " and ending " from this token to read actual PDP address */\r
- dns_prim = util_removeQuotes((void *)token_dns);
- dbg("Token_dns :%s",token_dns);\r
- dbg("Primary DNS :- %s",dns_prim);
- index = 0;\r
+ char addr[4] = {0};
+ GSList *tokens = NULL;
+ GSList *pRespData;
+ const char *line = NULL;
+ char *token_dns = NULL;
+ char *token_add = NULL;
+
+ char *token_pdp_address = NULL;
+ int no_pdp_active = 0;
+ int index = 0;
+
+ CoreObject *ps_context = user_data;
+ const TcoreATResponse *resp = data;
+ CoreObject *co_ps = tcore_pending_ref_core_object(p);
+ int cid = tcore_context_get_id(ps_context);
+
+ dbg("Entered");
+
+ if (resp->final_response) {
+ dbg("Response OK");
+ if (resp->lines) {
+ dbg("DNS data present in the Response");
+ pRespData = (GSList *) resp->lines;
+ no_pdp_active = g_slist_length(pRespData);
+ dbg("Total Number of Active PS Context :- %d", no_pdp_active);
+ if (0 == no_pdp_active) {
+ goto exit_fail;
+ }
+ while (pRespData) {
+ dbg("traversing the DNS data for each active context");
+ line = (const char *) pRespData->data;
+ dbg("Response->lines->data :%s", line);
+ tokens = tcore_at_tok_new(line);
+ if (cid == atoi(g_slist_nth_data(tokens, 0))) {
+ dbg("Found the DNS details for the Current context");
+ dbg("Context Id of The Context : %d", atoi(g_slist_nth_data(tokens, 0)));
+ break;
+ }
+ tcore_at_tok_free(tokens);
+ tokens = NULL;
+ pRespData = pRespData->next;
+ }
+ { /* Read primary DNS */
+ token_dns = g_slist_nth_data(tokens, 1);
+ /* Strip off starting " and ending " from this token to read actual PDP address */
+ dns_prim = util_removeQuotes((void *) token_dns);
+ dbg("Token_dns :%s", token_dns);
+ dbg("Primary DNS :- %s", dns_prim);
+ index = 0;
token_add = strtok(dns_prim, ".");
- while(token_add != NULL)\r
- {\r
- noti.primary_dns[index++]= atoi(token_add);\r
- token_add = strtok(NULL, ".");\r
- }\r
+ while (token_add != NULL) {
+ noti.primary_dns[index++] = atoi(token_add);
+ token_add = strtok(NULL, ".");
+ }
_ps_free(dns_prim);
- }\r
- { /* Read Secondary DNS */\r
- token_add = NULL;\r
- token_dns = g_slist_nth_data(tokens,2);\r
- dns_sec = util_removeQuotes((void *)token_dns);
-\r
- dbg("Token_dns :%s",token_dns);\r
- dbg("Secondary DNS :- %s",dns_sec);
- index = 0;\r
+ }
+ { /* Read Secondary DNS */
+ token_add = NULL;
+ token_dns = g_slist_nth_data(tokens, 2);
+ dns_sec = util_removeQuotes((void *) token_dns);
+
+ dbg("Token_dns :%s", token_dns);
+ dbg("Secondary DNS :- %s", dns_sec);
+ index = 0;
token_add = strtok(dns_sec, ".");
- while(token_add != NULL)\r
- {\r
- noti.secondary_dns[index++]= atoi(token_add);\r
- token_add = strtok(NULL, ".");\r
- }\r
+ while (token_add != NULL) {
+ noti.secondary_dns[index++] = atoi(token_add);
+ token_add = strtok(NULL, ".");
+ }
_ps_free(dns_sec);
- }\r
- tcore_at_tok_free(tokens);\r
- tokens = NULL;\r
- goto exit_success;\r
- }\r
- else\r
- {\r
- dbg("No data present in the Response");\r
- }\r
-\r
- }\r
- dbg("Response NOK");\r
- exit_fail:\r
- {\r
- dbg("Adding default DNS");\r
- dbg("Adding the Primary DNS");\r
- noti.primary_dns[0] = 8;\r
- noti.primary_dns[1] = 8;\r
- noti.primary_dns[2] = 8;\r
- noti.primary_dns[3] = 8;\r
- dbg("Adding Secondary DNS");\r
- noti.secondary_dns[0] = 8;\r
- noti.secondary_dns[1] = 8;\r
- noti.secondary_dns[2] = 4;\r
- noti.secondary_dns[3] = 4;\r
- }\r
- exit_success:\r
- {\r
- dbg("Able to get the DNS from the DNS Query");\r
- token_pdp_address = tcore_context_get_address(ps_context);\r
- pdp_address = util_removeQuotes((void *)token_pdp_address);
-
- dbg("PDP address :- %s",pdp_address);\r
- /* Store IP address in char array, Telephony expected IP address in this format */\r
- token_add = strtok(pdp_address, ".");\r
- index = 0;\r
- while((token_add != NULL) && (index<4)) /* Currently only IPv4 is supported */\r
- {\r
- addr[index++]= atoi(token_add);\r
- token_add = strtok(NULL, ".");\r
- }\r
+ }
+ tcore_at_tok_free(tokens);
+ tokens = NULL;
+ goto exit_success;
+ } else {
+ dbg("No data present in the Response");
+ }
+ }
+ dbg("Response NOK");
+exit_fail:
+ {
+ dbg("Adding default DNS");
+ dbg("Adding the Primary DNS");
+ noti.primary_dns[0] = 8;
+ noti.primary_dns[1] = 8;
+ noti.primary_dns[2] = 8;
+ noti.primary_dns[3] = 8;
+ dbg("Adding Secondary DNS");
+ noti.secondary_dns[0] = 8;
+ noti.secondary_dns[1] = 8;
+ noti.secondary_dns[2] = 4;
+ noti.secondary_dns[3] = 4;
+ }
+exit_success:
+ {
+ dbg("Able to get the DNS from the DNS Query");
+ token_pdp_address = tcore_context_get_address(ps_context);
+ pdp_address = util_removeQuotes((void *) token_pdp_address);
+
+ dbg("PDP address :- %s", pdp_address);
+ /* Store IP address in char array, Telephony expected IP address in this format */
+ token_add = strtok(pdp_address, ".");
+ index = 0;
+ while ((token_add != NULL) && (index < 4)) { /* Currently only IPv4 is supported */
+ addr[index++] = atoi(token_add);
+ token_add = strtok(NULL, ".");
+ }
_ps_free(pdp_address);
- _ps_free((void *)token_pdp_address);
- noti.field_flag = (0x0001 & 0x0002 & 0x0004);\r
- noti.err = 0;\r
- noti.context_id = cid;\r
- memcpy(¬i.ip_address, &addr, 4);\r
- if (_pdp_device_control(cid) != TCORE_RETURN_SUCCESS)\r
- {\r
- dbg("_pdp_device_control() failed. errno=%d", errno);\r
- }\r
- snprintf(devname, 10, "pdp%d", cid - 1);\r
- memcpy(noti.devname, devname, 10);\r
- dbg("devname = [%s]", devname);\r
- if (tcore_util_netif_up(devname) != TCORE_RETURN_SUCCESS)\r
- {\r
- dbg("util_netif_up() failed. errno=%d", errno);\r
- }\r
-\r
- dbg("Send Notification upwards of IP address");\r
- tcore_server_send_notification(tcore_plugin_ref_server(tcore_object_ref_plugin(co_ps)), co_ps, TNOTI_PS_PDP_IPCONFIGURATION,\r
- sizeof(struct tnoti_ps_pdp_ipconfiguration), ¬i);\r
-\r
- data_status.context_id = cid;\r
- data_status.state = 1;\r
- data_status.result = 0 ;\r
-\r
- tcore_server_send_notification(tcore_plugin_ref_server(tcore_object_ref_plugin(co_ps)), co_ps,\r
- TNOTI_PS_CALL_STATUS, sizeof(struct tnoti_ps_call_status), &data_status);\r
- dbg("EXIT : Without error");\r
- return;\r
- }\r
-}\r
-\r
-static TReturn send_get_dns_cmd(CoreObject *co_ps,CoreObject *ps_context)\r
-{\r
- TcoreHal *hal = NULL;\r
- TcorePending *pending = NULL;\r
- char cmd_str[MAX_AT_CMD_STR_LEN] ;\r
- \r
- memset(cmd_str,0x0,MAX_AT_CMD_STR_LEN);\r
-\r
- dbg("Entered");\r
- hal = tcore_object_get_hal(co_ps);\r
-\r
- (void)sprintf(cmd_str, "AT+XDNS?");\r
- pending = tcore_at_pending_new(co_ps,cmd_str,"+XDNS",TCORE_AT_MULTILINE,\r
- on_response_get_dns_cmnd,ps_context );\r
- if(TCORE_RETURN_SUCCESS == tcore_hal_send_request(hal,pending))\r
- {\r
- return TCORE_RETURN_SUCCESS;\r
- }\r
- _unable_to_get_pending(co_ps,ps_context);\r
- return TCORE_RETURN_FAILURE;\r
-}\r
-\r
-static void on_response_get_pdp_address(TcorePending *p, int data_len, const void *data, void *user_data)\r
-{\r
- const TcoreATResponse *resp = data;\r
- CoreObject *co_ps = tcore_pending_ref_core_object(p);\r
- CoreObject *ps_context = user_data;\r
- GSList *tokens=NULL;\r
- const char *line;\r
- char *token_pdp_address;\r
- dbg("Enetered");\r
- if(resp->final_response)\r
- {\r
- dbg("RESPONSE OK");\r
- if(resp->lines != NULL)\r
- {\r
- dbg("resp->lines present ");\r
- line = (const char*)resp->lines->data;\r
- tokens = tcore_at_tok_new(line);\r
- if (g_slist_length(tokens) < 2)\r
- {\r
- msg("invalid message");\r
- goto error;\r
- }\r
- dbg("line:- %s",line);\r
- /* CID is already stored in ps_context, skip over & read PDP address */\r
- token_pdp_address = g_slist_nth_data(tokens, 1);\r
-\r
- dbg("token_pdp_address :- %s",token_pdp_address);\r
- /* Strip off starting " and ending " from this token to read actual PDP address */\r
- (void)tcore_context_set_address(ps_context,(const char *)token_pdp_address);\r
- }\r
-\r
- (void)send_get_dns_cmd(co_ps,ps_context);\r
- }\r
- else\r
- {\r
- dbg("Response NOK");\r
- /*without PDP address we will not be able to start packet service*/\r
- (void)deactivate_ps_context(co_ps,ps_context,NULL);\r
- }\r
- error:\r
- tcore_at_tok_free(tokens);\r
- return;\r
-}\r
-\r
-static TReturn send_get_pdp_address_cmd(CoreObject *co_ps,CoreObject *ps_context)\r
-{\r
- TcoreHal *hal = NULL;\r
- TcorePending *pending = NULL;\r
- unsigned int cid = PS_INVALID_CID;\r
- char cmd_str[MAX_AT_CMD_STR_LEN] = {0};\r
-\r
- dbg("Entered");\r
- hal = tcore_object_get_hal(co_ps);\r
-\r
- cid = tcore_context_get_id(ps_context);\r
- (void)sprintf(cmd_str, "AT+CGPADDR=%d",cid);\r
- pending = tcore_at_pending_new(co_ps,cmd_str,"+CGPADDR",TCORE_AT_SINGLELINE,\r
- on_response_get_pdp_address,ps_context );\r
- if(TCORE_RETURN_SUCCESS == tcore_hal_send_request(hal,pending))\r
- {\r
- return TCORE_RETURN_SUCCESS;\r
- }\r
- _unable_to_get_pending(co_ps,ps_context);\r
- return TCORE_RETURN_FAILURE;\r
-}\r
-\r
-static void on_response_send_pdp_activate_cmd (TcorePending *p, int data_len, const void *data, void *user_data)\r
-{\r
- CoreObject *co_ps = NULL;\r
- const TcoreATResponse *resp = data;\r
- CoreObject *ps_context = user_data;\r
-\r
- int cid;\r
- cid = tcore_context_get_id(ps_context);\r
-\r
-\r
- dbg("Entered");\r
- if(!p)\r
- {\r
- goto error;\r
- }\r
- co_ps = tcore_pending_ref_core_object(p);\r
-\r
- if(resp->success)\r
- {\r
- dbg("Response Ok");\r
- /*getting the IP address and DNS from the modem*/\r
- dbg("Getting the IP Address");\r
- (void)send_get_pdp_address_cmd(co_ps,ps_context);\r
- return;\r
- }\r
- else\r
- {\r
-\r
- dbg("Unable to actiavte PDP context for CID: %d ",cid);\r
- dbg("Undefineing the PDP context");\r
- (void)tcore_context_set_state(ps_context, CONTEXT_STATE_DEACTIVATED);\r
- send_undefine_context_cmd(co_ps,ps_context);\r
- return;\r
- }\r
-error:\r
- {\r
- _unable_to_get_pending(co_ps,ps_context);\r
- return;\r
- }\r
-}\r
-\r
-static TReturn send_pdp_activate_cmd(CoreObject *co_ps, CoreObject *ps_context)\r
-{\r
- TcoreHal *hal = NULL;\r
- TcorePending *pending = NULL;\r
- char cmd_str[MAX_AT_CMD_STR_LEN] = {0};\r
- int cid = 0;\r
- dbg("Entered");\r
- /* FIXME: Before MUX setup, use PHY HAL directly. */\r
- hal = tcore_object_get_hal(co_ps);\r
-\r
- /*Getting Context ID from Core Object*/\r
- cid = tcore_context_get_id(ps_context);\r
- (void)sprintf(cmd_str, "AT+CGACT=%d,%d",AT_PDP_ACTIVATE,cid);\r
- pending = tcore_at_pending_new(co_ps,cmd_str,NULL,TCORE_AT_NO_RESULT,\r
- on_response_send_pdp_activate_cmd,ps_context);\r
- if(TCORE_RETURN_SUCCESS == tcore_hal_send_request(hal,pending))\r
- {\r
- return TCORE_RETURN_SUCCESS;\r
- }\r
- _unable_to_get_pending(co_ps,ps_context);\r
- return TCORE_RETURN_FAILURE;\r
-}\r
-\r
-static void on_response_xdns_enable_cmd(TcorePending *p, int data_len, const void *data, void *user_data)\r
-{\r
- TcoreATResponse *resp = (TcoreATResponse *)data;\r
- CoreObject *co_ps = tcore_pending_ref_core_object(p);\r
- CoreObject *ps_context = user_data;\r
- dbg("Entered");\r
- if(resp->success)\r
- {\r
- dbg("Response OK");\r
- dbg("DNS address getting is Enabled");\r
- }\r
- else\r
- {\r
- dbg("Response NOK");\r
- /*If response to enable the DNS NOK then we will use google DNS for the PDP context*/\r
- }\r
- (void)send_pdp_activate_cmd(co_ps,ps_context);\r
- return;\r
-}\r
-\r
-static TReturn send_xdns_enable_cmd(CoreObject *co_ps,CoreObject *ps_context)\r
-{\r
- TcoreHal *hal = NULL;\r
- TcorePending *pending = NULL;\r
- int cid = -1 ;\r
- char cmd_str[MAX_AT_CMD_STR_LEN];\r
-\r
- dbg("Entered");\r
- memset(cmd_str,0x0,MAX_AT_CMD_STR_LEN);\r
-\r
- hal = tcore_object_get_hal(co_ps);\r
- cid = tcore_context_get_id(ps_context);\r
-\r
- (void)sprintf(cmd_str, "AT+XDNS=%d,%d",cid,AT_XDNS_ENABLE);\r
- pending = tcore_at_pending_new(co_ps,cmd_str, NULL, TCORE_AT_NO_RESULT,\r
- on_response_xdns_enable_cmd, ps_context);\r
- if(TCORE_RETURN_SUCCESS == tcore_hal_send_request(hal,pending))\r
- {\r
- return TCORE_RETURN_SUCCESS;\r
- }\r
- _unable_to_get_pending(co_ps,ps_context);\r
- return TCORE_RETURN_FAILURE;\r
-}\r
-\r
-static void on_response_define_pdp_context(TcorePending *p, int data_len, const void *data, void *user_data)\r
-{\r
- const TcoreATResponse *resp = data;\r
- CoreObject *ps_context = (CoreObject *)user_data;\r
- CoreObject *co_ps = tcore_pending_ref_core_object(p);\r
-\r
- dbg("Entered");\r
- if(resp->success)\r
- {\r
- dbg("Response OK");\r
- send_xdns_enable_cmd(co_ps,ps_context);\r
- }\r
- else\r
- {\r
- dbg("response NOK");\r
- _unable_to_get_pending(co_ps,ps_context);\r
- dbg("Exiting");\r
- }\r
- return;\r
- \r
-}\r
-\r
-static TReturn send_define_pdp_context_cmd(CoreObject *co_ps, CoreObject *ps_context)\r
-{\r
- TcoreHal *hal = NULL;\r
- TcorePending *pending = NULL;\r
- char *apn = NULL;\r
- char cmd_str[MAX_AT_CMD_STR_LEN] ={0} ;\r
- char pdp_type_str[10] = {0};\r
- unsigned int cid = PS_INVALID_CID;\r
- enum co_context_type pdp_type;\r
- enum co_context_d_comp d_comp;\r
- enum co_context_h_comp h_comp;\r
-\r
- dbg("Entered");\r
-\r
- cid = tcore_context_get_id(ps_context);\r
- pdp_type = tcore_context_get_type(ps_context);\r
- d_comp = tcore_context_get_data_compression(ps_context);\r
- h_comp = tcore_context_get_header_compression(ps_context);\r
- apn = tcore_context_get_apn(ps_context);\r
-\r
- hal = tcore_object_get_hal(co_ps);\r
- switch(pdp_type)\r
- {\r
- case CONTEXT_TYPE_X25:\r
- {\r
- dbg("CONTEXT_TYPE_X25");\r
- strcpy(pdp_type_str,"X.25");\r
- break;\r
- }\r
- case CONTEXT_TYPE_IP:\r
- {\r
- dbg("CONTEXT_TYPE_IP");\r
- strcpy(pdp_type_str,"IP");\r
- }\r
- break;\r
- case CONTEXT_TYPE_PPP:\r
- {\r
- dbg("CONTEXT_TYPE_PPP");\r
- strcpy(pdp_type_str,"PPP");\r
- }\r
- break;\r
- case CONTEXT_TYPE_IPV6:\r
- {\r
- dbg("CONTEXT_TYPE_IPV6");\r
- strcpy(pdp_type_str,"IPV6");\r
- break;\r
- }\r
- default :\r
- {\r
- /*PDP Type not supported supported*/\r
- dbg("Unsupported PDP type :- %d returning ",pdp_type);\r
- return TCORE_RETURN_FAILURE;\r
- }\r
- }\r
- dbg("Activating context for CID :- %d",cid);\r
- (void)sprintf(cmd_str, "AT+CGDCONT=%d,\"%s\",\"%s\",,%d,%d",cid,pdp_type_str,apn,d_comp,h_comp);\r
-
- pending = tcore_at_pending_new(co_ps,cmd_str,NULL,TCORE_AT_NO_RESULT,\r
- on_response_define_pdp_context,ps_context );\r
- if(TCORE_RETURN_SUCCESS == tcore_hal_send_request(hal,pending))\r
- {\r
- (void)tcore_context_set_state(ps_context,CONTEXT_STATE_ACTIVATING);\r
- return TCORE_RETURN_SUCCESS;\r
- }\r
- _unable_to_get_pending(co_ps,ps_context);\r
- return TCORE_RETURN_FAILURE;\r
-}\r
-\r
-static TReturn activate_ps_context(CoreObject *co_ps, CoreObject *ps_context, void *user_data)\r
-{\r
- dbg("Entered");\r
- return send_define_pdp_context_cmd(co_ps,ps_context);\r
-}\r
-\r
-\r
-static struct tcore_ps_operations ps_ops =\r
-{\r
- .activate_context = activate_ps_context,\r
- .deactivate_context = deactivate_ps_context\r
-};\r
-\r
-gboolean s_ps_init(TcorePlugin *p,TcoreHal *hal)\r
-{\r
- CoreObject *o;\r
- struct context *context_table = NULL;\r
-\r
- dbg("Entered");\r
- o = tcore_ps_new(p,"umts_ps", &ps_ops, hal);\r
-\r
- if (!o)\r
- return FALSE;\r
- tcore_object_link_user_data(o, (void *)context_table);\r
-\r
- tcore_object_add_callback(o, "+CGEV", on_event_cgev_handle,p);\r
- tcore_object_add_callback(o, "+XNOTIFYDUNSTATUS", on_event_dun_call_notification, p);\r
-\r
- dbg("Exiting");\r
- return TRUE;\r
-}\r
-\r
-void s_ps_exit(TcorePlugin *p)\r
-{\r
- CoreObject *o;\r
-\r
- dbg("Entered");\r
- o = tcore_plugin_ref_core_object(p,"umts_ps");\r
- if (!o)\r
- return;\r
-\r
- tcore_ps_free(o);\r
- dbg("Exiting");\r
-}\r
-\r
-\r
+ _ps_free((void *) token_pdp_address);
+ noti.field_flag = (0x0001 & 0x0002 & 0x0004);
+ noti.err = 0;
+ noti.context_id = cid;
+ memcpy(¬i.ip_address, &addr, 4);
+ if (_pdp_device_control(cid) != TCORE_RETURN_SUCCESS) {
+ dbg("_pdp_device_control() failed. errno=%d", errno);
+ }
+ snprintf(devname, 10, "pdp%d", cid - 1);
+ memcpy(noti.devname, devname, 10);
+ dbg("devname = [%s]", devname);
+ if (tcore_util_netif_up(devname) != TCORE_RETURN_SUCCESS) {
+ dbg("util_netif_up() failed. errno=%d", errno);
+ }
+
+ dbg("Send Notification upwards of IP address");
+ tcore_server_send_notification(tcore_plugin_ref_server(tcore_object_ref_plugin(co_ps)), co_ps, TNOTI_PS_PDP_IPCONFIGURATION,
+ sizeof(struct tnoti_ps_pdp_ipconfiguration), ¬i);
+
+ data_status.context_id = cid;
+ data_status.state = 1;
+ data_status.result = 0;
+
+ tcore_server_send_notification(tcore_plugin_ref_server(tcore_object_ref_plugin(co_ps)), co_ps,
+ TNOTI_PS_CALL_STATUS, sizeof(struct tnoti_ps_call_status), &data_status);
+ dbg("EXIT : Without error");
+ return;
+ }
+}
+
+static TReturn send_get_dns_cmd(CoreObject *co_ps, CoreObject *ps_context)
+{
+ TcoreHal *hal = NULL;
+ TcorePending *pending = NULL;
+ char cmd_str[MAX_AT_CMD_STR_LEN];
+
+ memset(cmd_str, 0x0, MAX_AT_CMD_STR_LEN);
+
+ dbg("Entered");
+ hal = tcore_object_get_hal(co_ps);
+
+ (void) sprintf(cmd_str, "AT+XDNS?");
+ pending = tcore_at_pending_new(co_ps, cmd_str, "+XDNS", TCORE_AT_MULTILINE,
+ on_response_get_dns_cmnd, ps_context);
+ if (TCORE_RETURN_SUCCESS == tcore_hal_send_request(hal, pending)) {
+ return TCORE_RETURN_SUCCESS;
+ }
+ _unable_to_get_pending(co_ps, ps_context);
+ return TCORE_RETURN_FAILURE;
+}
+
+static void on_response_get_pdp_address(TcorePending *p, int data_len, const void *data, void *user_data)
+{
+ const TcoreATResponse *resp = data;
+ CoreObject *co_ps = tcore_pending_ref_core_object(p);
+ CoreObject *ps_context = user_data;
+ GSList *tokens = NULL;
+ const char *line;
+ char *token_pdp_address;
+ dbg("Enetered");
+ if (resp->final_response) {
+ dbg("RESPONSE OK");
+ if (resp->lines != NULL) {
+ dbg("resp->lines present ");
+ line = (const char *) resp->lines->data;
+ tokens = tcore_at_tok_new(line);
+ if (g_slist_length(tokens) < 2) {
+ msg("invalid message");
+ goto error;
+ }
+ dbg("line:- %s", line);
+ /* CID is already stored in ps_context, skip over & read PDP address */
+ token_pdp_address = g_slist_nth_data(tokens, 1);
+
+ dbg("token_pdp_address :- %s", token_pdp_address);
+ /* Strip off starting " and ending " from this token to read actual PDP address */
+ (void) tcore_context_set_address(ps_context, (const char *) token_pdp_address);
+ }
+
+ (void) send_get_dns_cmd(co_ps, ps_context);
+ } else {
+ dbg("Response NOK");
+ /*without PDP address we will not be able to start packet service*/
+ (void) deactivate_ps_context(co_ps, ps_context, NULL);
+ }
+error:
+ tcore_at_tok_free(tokens);
+ return;
+}
+
+static TReturn send_get_pdp_address_cmd(CoreObject *co_ps, CoreObject *ps_context)
+{
+ TcoreHal *hal = NULL;
+ TcorePending *pending = NULL;
+ unsigned int cid = PS_INVALID_CID;
+ char cmd_str[MAX_AT_CMD_STR_LEN] = {0};
+
+ dbg("Entered");
+ hal = tcore_object_get_hal(co_ps);
+
+ cid = tcore_context_get_id(ps_context);
+ (void) sprintf(cmd_str, "AT+CGPADDR=%d", cid);
+ pending = tcore_at_pending_new(co_ps, cmd_str, "+CGPADDR", TCORE_AT_SINGLELINE,
+ on_response_get_pdp_address, ps_context);
+ if (TCORE_RETURN_SUCCESS == tcore_hal_send_request(hal, pending)) {
+ return TCORE_RETURN_SUCCESS;
+ }
+ _unable_to_get_pending(co_ps, ps_context);
+ return TCORE_RETURN_FAILURE;
+}
+
+static void on_response_send_pdp_activate_cmd(TcorePending *p, int data_len, const void *data, void *user_data)
+{
+ CoreObject *co_ps = NULL;
+ const TcoreATResponse *resp = data;
+ CoreObject *ps_context = user_data;
+
+ int cid;
+ cid = tcore_context_get_id(ps_context);
+
+
+ dbg("Entered");
+ if (!p) {
+ goto error;
+ }
+ co_ps = tcore_pending_ref_core_object(p);
+
+ if (resp->success) {
+ dbg("Response Ok");
+ /*getting the IP address and DNS from the modem*/
+ dbg("Getting the IP Address");
+ (void) send_get_pdp_address_cmd(co_ps, ps_context);
+ return;
+ } else {
+ dbg("Unable to actiavte PDP context for CID: %d ", cid);
+ dbg("Undefineing the PDP context");
+ (void) tcore_context_set_state(ps_context, CONTEXT_STATE_DEACTIVATED);
+ send_undefine_context_cmd(co_ps, ps_context);
+ return;
+ }
+error:
+ {
+ _unable_to_get_pending(co_ps, ps_context);
+ return;
+ }
+}
+
+static TReturn send_pdp_activate_cmd(CoreObject *co_ps, CoreObject *ps_context)
+{
+ TcoreHal *hal = NULL;
+ TcorePending *pending = NULL;
+ char cmd_str[MAX_AT_CMD_STR_LEN] = {0};
+ int cid = 0;
+ dbg("Entered");
+ /* FIXME: Before MUX setup, use PHY HAL directly. */
+ hal = tcore_object_get_hal(co_ps);
+
+ /*Getting Context ID from Core Object*/
+ cid = tcore_context_get_id(ps_context);
+ (void) sprintf(cmd_str, "AT+CGACT=%d,%d", AT_PDP_ACTIVATE, cid);
+ pending = tcore_at_pending_new(co_ps, cmd_str, NULL, TCORE_AT_NO_RESULT,
+ on_response_send_pdp_activate_cmd, ps_context);
+ if (TCORE_RETURN_SUCCESS == tcore_hal_send_request(hal, pending)) {
+ return TCORE_RETURN_SUCCESS;
+ }
+ _unable_to_get_pending(co_ps, ps_context);
+ return TCORE_RETURN_FAILURE;
+}
+
+static void on_response_xdns_enable_cmd(TcorePending *p, int data_len, const void *data, void *user_data)
+{
+ TcoreATResponse *resp = (TcoreATResponse *) data;
+ CoreObject *co_ps = tcore_pending_ref_core_object(p);
+ CoreObject *ps_context = user_data;
+ dbg("Entered");
+ if (resp->success) {
+ dbg("Response OK");
+ dbg("DNS address getting is Enabled");
+ } else {
+ dbg("Response NOK");
+ /*If response to enable the DNS NOK then we will use google DNS for the PDP context*/
+ }
+ (void) send_pdp_activate_cmd(co_ps, ps_context);
+ return;
+}
+
+static TReturn send_xdns_enable_cmd(CoreObject *co_ps, CoreObject *ps_context)
+{
+ TcoreHal *hal = NULL;
+ TcorePending *pending = NULL;
+ int cid = -1;
+ char cmd_str[MAX_AT_CMD_STR_LEN];
+
+ dbg("Entered");
+ memset(cmd_str, 0x0, MAX_AT_CMD_STR_LEN);
+
+ hal = tcore_object_get_hal(co_ps);
+ cid = tcore_context_get_id(ps_context);
+
+ (void) sprintf(cmd_str, "AT+XDNS=%d,%d", cid, AT_XDNS_ENABLE);
+ pending = tcore_at_pending_new(co_ps, cmd_str, NULL, TCORE_AT_NO_RESULT,
+ on_response_xdns_enable_cmd, ps_context);
+ if (TCORE_RETURN_SUCCESS == tcore_hal_send_request(hal, pending)) {
+ return TCORE_RETURN_SUCCESS;
+ }
+ _unable_to_get_pending(co_ps, ps_context);
+ return TCORE_RETURN_FAILURE;
+}
+
+static void on_response_define_pdp_context(TcorePending *p, int data_len, const void *data, void *user_data)
+{
+ const TcoreATResponse *resp = data;
+ CoreObject *ps_context = (CoreObject *) user_data;
+ CoreObject *co_ps = tcore_pending_ref_core_object(p);
+
+ dbg("Entered");
+ if (resp->success) {
+ dbg("Response OK");
+ send_xdns_enable_cmd(co_ps, ps_context);
+ } else {
+ dbg("response NOK");
+ _unable_to_get_pending(co_ps, ps_context);
+ dbg("Exiting");
+ }
+ return;
+}
+
+static TReturn send_define_pdp_context_cmd(CoreObject *co_ps, CoreObject *ps_context)
+{
+ TcoreHal *hal = NULL;
+ TcorePending *pending = NULL;
+ char *apn = NULL;
+ char cmd_str[MAX_AT_CMD_STR_LEN] = {0};
+ char pdp_type_str[10] = {0};
+ unsigned int cid = PS_INVALID_CID;
+ enum co_context_type pdp_type;
+ enum co_context_d_comp d_comp;
+ enum co_context_h_comp h_comp;
+
+ dbg("Entered");
+
+ cid = tcore_context_get_id(ps_context);
+ pdp_type = tcore_context_get_type(ps_context);
+ d_comp = tcore_context_get_data_compression(ps_context);
+ h_comp = tcore_context_get_header_compression(ps_context);
+ apn = tcore_context_get_apn(ps_context);
+
+ hal = tcore_object_get_hal(co_ps);
+ switch (pdp_type) {
+ case CONTEXT_TYPE_X25:
+ {
+ dbg("CONTEXT_TYPE_X25");
+ strcpy(pdp_type_str, "X.25");
+ break;
+ }
+
+ case CONTEXT_TYPE_IP:
+ {
+ dbg("CONTEXT_TYPE_IP");
+ strcpy(pdp_type_str, "IP");
+ }
+ break;
+
+ case CONTEXT_TYPE_PPP:
+ {
+ dbg("CONTEXT_TYPE_PPP");
+ strcpy(pdp_type_str, "PPP");
+ }
+ break;
+
+ case CONTEXT_TYPE_IPV6:
+ {
+ dbg("CONTEXT_TYPE_IPV6");
+ strcpy(pdp_type_str, "IPV6");
+ break;
+ }
+
+ default:
+ {
+ /*PDP Type not supported supported*/
+ dbg("Unsupported PDP type :- %d returning ", pdp_type);
+ return TCORE_RETURN_FAILURE;
+ }
+ }
+ dbg("Activating context for CID :- %d", cid);
+ (void) sprintf(cmd_str, "AT+CGDCONT=%d,\"%s\",\"%s\",,%d,%d", cid, pdp_type_str, apn, d_comp, h_comp);
+
+ pending = tcore_at_pending_new(co_ps, cmd_str, NULL, TCORE_AT_NO_RESULT,
+ on_response_define_pdp_context, ps_context);
+ if (TCORE_RETURN_SUCCESS == tcore_hal_send_request(hal, pending)) {
+ (void) tcore_context_set_state(ps_context, CONTEXT_STATE_ACTIVATING);
+ return TCORE_RETURN_SUCCESS;
+ }
+ _unable_to_get_pending(co_ps, ps_context);
+ return TCORE_RETURN_FAILURE;
+}
+
+static TReturn activate_ps_context(CoreObject *co_ps, CoreObject *ps_context, void *user_data)
+{
+ dbg("Entered");
+ return send_define_pdp_context_cmd(co_ps, ps_context);
+}
+
+
+static struct tcore_ps_operations ps_ops = {
+ .activate_context = activate_ps_context,
+ .deactivate_context = deactivate_ps_context
+};
+
+gboolean s_ps_init(TcorePlugin *p, TcoreHal *hal)
+{
+ CoreObject *o;
+ struct context *context_table = NULL;
+
+ dbg("Entered");
+ o = tcore_ps_new(p, "umts_ps", &ps_ops, hal);
+
+ if (!o)
+ return FALSE;
+ tcore_object_link_user_data(o, (void *) context_table);
+
+ tcore_object_add_callback(o, "+CGEV", on_event_cgev_handle, p);
+ tcore_object_add_callback(o, "+XNOTIFYDUNSTATUS", on_event_dun_call_notification, p);
+
+ dbg("Exiting");
+ return TRUE;
+}
+
+void s_ps_exit(TcorePlugin *p)
+{
+ CoreObject *o;
+
+ dbg("Entered");
+ o = tcore_plugin_ref_core_object(p, "umts_ps");
+ if (!o)
+ return;
+
+ tcore_ps_free(o);
+ dbg("Exiting");
+}
-/*\r
- * tel-plugin-imc\r
- *\r
- * Copyright (c) 2012 Samsung Electronics Co., Ltd. All rights reserved.\r
- *\r
- * Contact: Chandan Swarup Patra <chandan.sp@samsung.com>\r
- *\r
- * Licensed under the Apache License, Version 2.0 (the "License");\r
- * you may not use this file except in compliance with the License.\r
- * You may obtain a copy of the License at\r
- *\r
- * http://www.apache.org/licenses/LICENSE-2.0\r
- *\r
- * Unless required by applicable law or agreed to in writing, software\r
- * distributed under the License is distributed on an "AS IS" BASIS,\r
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
- * See the License for the specific language governing permissions and\r
- * limitations under the License.\r
- */\r
-\r
-#include <stdio.h>\r
-#include <stdlib.h>\r
-#include <string.h>\r
-#include <glib.h>\r
-#include <tcore.h>\r
-#include <hal.h>\r
-#include <core_object.h>\r
-#include <plugin.h>\r
-#include <queue.h>\r
-#include <server.h>\r
-#include <co_sat.h>\r
-#include <user_request.h>\r
-#include <at.h>\r
-\r
-#include "s_common.h"\r
-#include "s_sat.h"\r
-#define ENVELOPE_CMD_LEN 256\r
-\r
-static TReturn s_terminal_response(CoreObject *o, UserRequest *ur);\r
-static void on_confirmation_sat_message_send(TcorePending *p, gboolean result, void *user_data ); // from Kernel\r
-\r
-static void on_confirmation_sat_message_send( TcorePending *p, gboolean result, void *user_data )\r
-{\r
- dbg("on_confirmation_modem_message_send - msg out from queue.\n");\r
-\r
- if (result == FALSE)\r
- {\r
- /* Fail */\r
- dbg("SEND FAIL");\r
- }\r
- else \r
- {\r
- dbg("SEND OK");\r
- }\r
-}\r
-\r
-static gboolean on_response_terminal_response_confirm(CoreObject *o, const void *event_info, void *user_data)\r
-{\r
- dbg("Function Entry");\r
- return TRUE;\r
- dbg("Function Exit");\r
-}\r
-\r
-static gboolean on_event_sat_proactive_command(CoreObject *o, const void *event_info, void *user_data)\r
-{\r
- struct tcore_sat_proactive_command decoded_data;\r
- struct tnoti_sat_proactive_ind proactive_noti;\r
- int len_proactive_cmd = 0;\r
- GSList *lines= NULL;\r
- GSList *tokens= NULL;\r
- char *line= NULL;\r
- char *hexData= NULL;\r
- char *tmp= NULL;\r
- char *recordData= NULL;\r
-\r
- dbg("Function Entry");\r
-\r
- memset(&proactive_noti, 0x00, sizeof(struct tnoti_sat_proactive_ind));\r
- memset(&decoded_data, 0x00, sizeof(struct tcore_sat_proactive_command));\r
- lines = (GSList*)event_info;\r
- line = (char*)lines->data;\r
- tokens = tcore_at_tok_new(line);\r
- if (g_slist_length(tokens) != 1) \r
- {\r
- dbg("invalid message");\r
- tcore_at_tok_free(tokens);\r
- return FALSE;\r
- }\r
- hexData = (char*)g_slist_nth_data(tokens, 0);\r
- \r
- dbg("hexdata %s ", hexData);\r
- dbg("hexdata length %d", strlen(hexData));\r
-\r
+/*
+ * tel-plugin-imc
+ *
+ * Copyright (c) 2012 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: Chandan Swarup Patra <chandan.sp@samsung.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <glib.h>
+#include <tcore.h>
+#include <hal.h>
+#include <core_object.h>
+#include <plugin.h>
+#include <queue.h>
+#include <server.h>
+#include <co_sat.h>
+#include <user_request.h>
+#include <at.h>
+
+#include "s_common.h"
+#include "s_sat.h"
+#define ENVELOPE_CMD_LEN 256
+
+static TReturn s_terminal_response(CoreObject *o, UserRequest *ur);
+static void on_confirmation_sat_message_send(TcorePending *p, gboolean result, void *user_data); // from Kernel
+
+static void on_confirmation_sat_message_send(TcorePending *p, gboolean result, void *user_data)
+{
+ dbg("on_confirmation_modem_message_send - msg out from queue.\n");
+
+ if (result == FALSE) {
+ /* Fail */
+ dbg("SEND FAIL");
+ } else {
+ dbg("SEND OK");
+ }
+}
+
+static gboolean on_response_terminal_response_confirm(CoreObject *o, const void *event_info, void *user_data)
+{
+ dbg("Function Entry");
+ return TRUE;
+ dbg("Function Exit");
+}
+
+static gboolean on_event_sat_proactive_command(CoreObject *o, const void *event_info, void *user_data)
+{
+ struct tcore_sat_proactive_command decoded_data;
+ struct tnoti_sat_proactive_ind proactive_noti;
+ int len_proactive_cmd = 0;
+ GSList *lines = NULL;
+ GSList *tokens = NULL;
+ char *line = NULL;
+ char *hexData = NULL;
+ char *tmp = NULL;
+ char *recordData = NULL;
+
+ dbg("Function Entry");
+
+ memset(&proactive_noti, 0x00, sizeof(struct tnoti_sat_proactive_ind));
+ memset(&decoded_data, 0x00, sizeof(struct tcore_sat_proactive_command));
+ lines = (GSList *) event_info;
+ line = (char *) lines->data;
+ tokens = tcore_at_tok_new(line);
+ if (g_slist_length(tokens) != 1) {
+ dbg("invalid message");
+ tcore_at_tok_free(tokens);
+ return FALSE;
+ }
+ hexData = (char *) g_slist_nth_data(tokens, 0);
+
+ dbg("hexdata %s ", hexData);
+ dbg("hexdata length %d", strlen(hexData));
+
tmp = util_removeQuotes(hexData);
- recordData = util_hexStringToBytes(tmp);\r
- dbg("recordData: %x", recordData);\r
- free(tmp);\r
- util_hex_dump(" ", strlen(hexData)/2, recordData);\r
- len_proactive_cmd = strlen(recordData);\r
- dbg("len_proactive_cmd = %d", len_proactive_cmd);\r
- tcore_sat_decode_proactive_command((unsigned char*)recordData, (strlen(hexData)/2) - 1, &decoded_data);\r
- free(recordData);\r
-\r
- proactive_noti.cmd_number = decoded_data.cmd_num;\r
- proactive_noti.cmd_type = decoded_data.cmd_type;\r
-\r
- switch(decoded_data.cmd_type)\r
- {\r
- case SAT_PROATV_CMD_DISPLAY_TEXT:\r
- dbg("decoded command is display text!!");\r
- memcpy(&proactive_noti.proactive_ind_data.display_text, &decoded_data.data.display_text, sizeof(struct tel_sat_display_text_tlv));\r
- break;\r
- case SAT_PROATV_CMD_GET_INKEY:\r
- dbg("decoded command is get inkey!!");\r
- memcpy(&proactive_noti.proactive_ind_data.get_inkey, &decoded_data.data.get_inkey, sizeof(struct tel_sat_get_inkey_tlv));\r
- break;\r
- case SAT_PROATV_CMD_GET_INPUT:\r
- dbg("decoded command is get input!!");\r
- memcpy(&proactive_noti.proactive_ind_data.get_input, &decoded_data.data.get_input, sizeof(struct tel_sat_get_input_tlv));\r
- break;\r
- case SAT_PROATV_CMD_MORE_TIME:\r
- dbg("decoded command is more time!!");\r
- memcpy(&proactive_noti.proactive_ind_data.more_time, &decoded_data.data.more_time, sizeof(struct tel_sat_more_time_tlv));\r
- break;\r
- case SAT_PROATV_CMD_PLAY_TONE:\r
- dbg("decoded command is play tone!!");\r
- memcpy(&proactive_noti.proactive_ind_data.play_tone, &decoded_data.data.play_tone, sizeof(struct tel_sat_play_tone_tlv));\r
- break;\r
- case SAT_PROATV_CMD_SETUP_MENU:\r
- dbg("decoded command is SETUP MENU!!");\r
- memcpy(&proactive_noti.proactive_ind_data.setup_menu, &decoded_data.data.setup_menu, sizeof(struct tel_sat_setup_menu_tlv));\r
- break;\r
- case SAT_PROATV_CMD_SELECT_ITEM:\r
- dbg("decoded command is select item!!");\r
- memcpy(&proactive_noti.proactive_ind_data.select_item, &decoded_data.data.select_item, sizeof(struct tel_sat_select_item_tlv));\r
- break;\r
- case SAT_PROATV_CMD_SEND_SMS:\r
- dbg("decoded command is send sms!!");\r
- memcpy(&proactive_noti.proactive_ind_data.send_sms, &decoded_data.data.send_sms, sizeof(struct tel_sat_send_sms_tlv));\r
- break;\r
- case SAT_PROATV_CMD_SEND_SS:\r
- dbg("decoded command is send ss!!");\r
- memcpy(&proactive_noti.proactive_ind_data.send_ss, &decoded_data.data.send_ss, sizeof(struct tel_sat_send_ss_tlv));\r
- break;\r
- case SAT_PROATV_CMD_SEND_USSD:\r
- dbg("decoded command is send ussd!!");\r
- memcpy(&proactive_noti.proactive_ind_data.send_ussd, &decoded_data.data.send_ussd, sizeof(struct tel_sat_send_ussd_tlv));\r
- break;\r
- case SAT_PROATV_CMD_SETUP_CALL:\r
- dbg("decoded command is setup call!!");\r
- memcpy(&proactive_noti.proactive_ind_data.setup_call, &decoded_data.data.setup_call, sizeof(struct tel_sat_setup_call_tlv));\r
- break;\r
- case SAT_PROATV_CMD_REFRESH:\r
- dbg("decoded command is refresh");\r
- memcpy(&proactive_noti.proactive_ind_data.refresh, &decoded_data.data.refresh, sizeof(struct tel_sat_refresh_tlv));\r
- break; \r
- case SAT_PROATV_CMD_PROVIDE_LOCAL_INFO:\r
- dbg("decoded command is provide local info");\r
- memcpy(&proactive_noti.proactive_ind_data.provide_local_info, &decoded_data.data.provide_local_info, sizeof(struct tel_sat_provide_local_info_tlv));\r
- break;\r
- case SAT_PROATV_CMD_SETUP_EVENT_LIST:\r
- dbg("decoded command is setup event list!!");\r
- memcpy(&proactive_noti.proactive_ind_data.setup_event_list, &decoded_data.data.setup_event_list, sizeof(struct tel_sat_setup_event_list_tlv));\r
- //setup_event_rsp_get(o, &decoded_data.data.setup_event_list);\r
- break;\r
- case SAT_PROATV_CMD_SETUP_IDLE_MODE_TEXT:\r
- dbg("decoded command is setup idle mode text");\r
- memcpy(&proactive_noti.proactive_ind_data.setup_idle_mode_text, &decoded_data.data.setup_idle_mode_text, sizeof(struct tel_sat_setup_idle_mode_text_tlv));\r
- break;\r
- case SAT_PROATV_CMD_SEND_DTMF:\r
- dbg("decoded command is send dtmf");\r
- memcpy(&proactive_noti.proactive_ind_data.send_dtmf, &decoded_data.data.send_dtmf, sizeof(struct tel_sat_send_dtmf_tlv));\r
- break;\r
- case SAT_PROATV_CMD_LANGUAGE_NOTIFICATION:\r
- dbg("decoded command is language notification");\r
- memcpy(&proactive_noti.proactive_ind_data.language_notification, &decoded_data.data.language_notification, sizeof(struct tel_sat_language_notification_tlv));\r
- break;\r
- case SAT_PROATV_CMD_LAUNCH_BROWSER:\r
- dbg("decoded command is launch browser");\r
- memcpy(&proactive_noti.proactive_ind_data.launch_browser, &decoded_data.data.launch_browser, sizeof(struct tel_sat_launch_browser_tlv));\r
- break;\r
- case SAT_PROATV_CMD_OPEN_CHANNEL:\r
- dbg("decoded command is open channel!!");\r
- memcpy(&proactive_noti.proactive_ind_data.open_channel, &decoded_data.data.open_channel, sizeof(struct tel_sat_open_channel_tlv));\r
- break;\r
- case SAT_PROATV_CMD_CLOSE_CHANNEL:\r
- dbg("decoded command is close channel!!");\r
- memcpy(&proactive_noti.proactive_ind_data.close_channel, &decoded_data.data.close_channel, sizeof(struct tel_sat_close_channel_tlv));\r
- break;\r
- case SAT_PROATV_CMD_RECEIVE_DATA:\r
- dbg("decoded command is receive data!!");\r
- memcpy(&proactive_noti.proactive_ind_data.receive_data, &decoded_data.data.receive_data, sizeof(struct tel_sat_receive_channel_tlv));\r
- break;\r
- case SAT_PROATV_CMD_SEND_DATA:\r
- dbg("decoded command is send data!!");\r
- memcpy(&proactive_noti.proactive_ind_data.send_data, &decoded_data.data.send_data, sizeof(struct tel_sat_send_channel_tlv));\r
- break;\r
- case SAT_PROATV_CMD_GET_CHANNEL_STATUS:\r
- dbg("decoded command is get channel status!!");\r
- memcpy(&proactive_noti.proactive_ind_data.get_channel_status, &decoded_data.data.get_channel_status, sizeof(struct tel_sat_get_channel_status_tlv));\r
- break;\r
- default:\r
- dbg("wrong input");\r
- break;\r
- }\r
- if((decoded_data.cmd_type == SAT_PROATV_CMD_REFRESH) || (decoded_data.cmd_type == SAT_PROATV_CMD_SETUP_EVENT_LIST))\r
- {\r
- /*Not supported*/\r
- dbg("Not suported Proactive command");\r
- return FALSE;\r
- }\r
- tcore_server_send_notification(tcore_plugin_ref_server(tcore_object_ref_plugin(o)), o, TNOTI_SAT_PROACTIVE_CMD,\r
- sizeof(struct tnoti_sat_proactive_ind), &proactive_noti);\r
- tcore_at_tok_free(tokens);\r
- dbg("Function Exit");\r
- return TRUE;\r
-}\r
-\r
-static void on_response_envelop_cmd(TcorePending *p, int data_len, const void *data, void *user_data)\r
-{\r
- const TcoreATResponse *resp = data;\r
- UserRequest *ur = NULL;\r
- CoreObject *o = NULL;\r
- const struct treq_sat_envelop_cmd_data *req_data = NULL;\r
- GSList *tokens=NULL;\r
- struct tresp_sat_envelop_data res;\r
- const char *line = NULL;\r
- const char *env_res = NULL;\r
- int sw2 = -1;\r
- \r
- ur = tcore_pending_ref_user_request(p);\r
- req_data = tcore_user_request_ref_data(ur, NULL);\r
- o = tcore_pending_ref_core_object(p);\r
-\r
- if(!req_data){\r
- dbg("request data is NULL");\r
- return;\r
- }\r
- memset(&res, 0, sizeof(struct tresp_sat_envelop_data));\r
-\r
- res.sub_cmd = req_data->sub_cmd;\r
-\r
- if(resp->success > 0)\r
- {\r
- dbg("RESPONSE OK");\r
- if(resp->lines) \r
- {\r
- line = (const char*)resp->lines->data;\r
- tokens = tcore_at_tok_new(line);\r
- if (g_slist_length(tokens) < 1) \r
- {\r
- msg("invalid message");\r
- tcore_at_tok_free(tokens);\r
- return;\r
- }\r
- }\r
- env_res = g_slist_nth_data(tokens, 0);\r
- res.result = 0x8000;\r
- res.envelop_resp = ENVELOPE_SUCCESS;\r
- dbg("RESPONSE OK 3");\r
- if(NULL != g_slist_nth_data(tokens, 1))\r
- {\r
- sw2 = atoi(g_slist_nth_data(tokens, 1));\r
- dbg("RESPONSE OK 4");\r
- if(sw2 == 0)\r
- {\r
- dbg("RESPONSE OK 5");\r
- tcore_server_send_notification(tcore_plugin_ref_server(tcore_object_ref_plugin(o)), o, TNOTI_SAT_SESSION_END, 0, NULL);\r
- }\r
- }\r
- }\r
- else\r
- {\r
- dbg("RESPONSE NOK");\r
- res.result = -1;\r
- res.envelop_resp = ENVELOPE_FAILED;\r
- }\r
- \r
- if (ur) \r
- {\r
- tcore_user_request_send_response(ur, TRESP_SAT_REQ_ENVELOPE, sizeof(struct tresp_sat_envelop_data), &res);\r
- }\r
- tcore_at_tok_free(tokens);\r
- dbg(" Function exit");\r
-}\r
-\r
-\r
-static void on_response_terminal_response(TcorePending *p, int data_len, const void *data, void *user_data)\r
-{\r
- UserRequest *ur = NULL;\r
- CoreObject *o = NULL;\r
- const TcoreATResponse *resp = data;\r
- gpointer tmp = NULL;\r
-\r
- dbg("Function Entry");\r
-\r
- if(resp->success > 0)\r
- {\r
- dbg("RESPONSE OK");\r
- dbg(" resp->success = %d", resp->success);\r
- ur = tcore_pending_ref_user_request(p);\r
- tmp = (gpointer)tcore_user_request_ref_communicator(ur);\r
- if(!ur || !tmp )\r
- {\r
- dbg("error - current ur is NULL");\r
- return;\r
- }\r
-\r
- o = tcore_pending_ref_core_object(p);\r
- if(!o)\r
- dbg("error - current sat core is NULL");\r
- tcore_server_send_notification(tcore_plugin_ref_server(tcore_object_ref_plugin(o)), o, TNOTI_SAT_SESSION_END, 0, NULL);\r
- }\r
- dbg("Function Exit");\r
-}\r
-\r
-static TReturn s_envelope(CoreObject *o, UserRequest *ur)\r
-{\r
- TcoreHal* hal;\r
- TcoreATRequest *req = NULL;\r
- TcorePending *pending = NULL;\r
- char *cmd_str = NULL;\r
- const struct treq_sat_envelop_cmd_data *req_data = NULL;\r
- int envelope_cmd_len = 0;\r
- char envelope_cmd[ENVELOPE_CMD_LEN];\r
- int count = 0;\r
- char envelope_cmdhex[ENVELOPE_CMD_LEN*2];\r
- char *pbuffer = NULL;\r
-\r
- dbg("Function Entry");\r
- memset(&envelope_cmdhex, 0x00, sizeof(envelope_cmdhex));\r
- pbuffer = envelope_cmdhex;\r
-\r
- hal = tcore_object_get_hal(o);\r
- pending = tcore_pending_new(o, 0);\r
- req_data = tcore_user_request_ref_data(ur, NULL);\r
- dbg("new pending sub cmd(%d)", req_data->sub_cmd);\r
-\r
- envelope_cmd_len = tcore_sat_encode_envelop_cmd(req_data, (char *)envelope_cmd);\r
- \r
- dbg("envelope_cmd_len %d", envelope_cmd_len); \r
- if(envelope_cmd_len == 0)\r
- {\r
- return TCORE_RETURN_EINVAL;\r
- }\r
- for(count = 0; count < envelope_cmd_len ;count++ )\r
- {\r
- dbg("envelope_cmd %02x", envelope_cmd[count]);\r
- sprintf(pbuffer, "%02x", envelope_cmd[count]);\r
- pbuffer +=2;\r
- }\r
- dbg("pbuffer %s", envelope_cmdhex); \r
+ recordData = util_hexStringToBytes(tmp);
+ dbg("recordData: %x", recordData);
+ free(tmp);
+ util_hex_dump(" ", strlen(hexData) / 2, recordData);
+ len_proactive_cmd = strlen(recordData);
+ dbg("len_proactive_cmd = %d", len_proactive_cmd);
+ tcore_sat_decode_proactive_command((unsigned char *) recordData, (strlen(hexData) / 2) - 1, &decoded_data);
+ free(recordData);
+
+ proactive_noti.cmd_number = decoded_data.cmd_num;
+ proactive_noti.cmd_type = decoded_data.cmd_type;
+
+ switch (decoded_data.cmd_type) {
+ case SAT_PROATV_CMD_DISPLAY_TEXT:
+ dbg("decoded command is display text!!");
+ memcpy(&proactive_noti.proactive_ind_data.display_text, &decoded_data.data.display_text, sizeof(struct tel_sat_display_text_tlv));
+ break;
+
+ case SAT_PROATV_CMD_GET_INKEY:
+ dbg("decoded command is get inkey!!");
+ memcpy(&proactive_noti.proactive_ind_data.get_inkey, &decoded_data.data.get_inkey, sizeof(struct tel_sat_get_inkey_tlv));
+ break;
+
+ case SAT_PROATV_CMD_GET_INPUT:
+ dbg("decoded command is get input!!");
+ memcpy(&proactive_noti.proactive_ind_data.get_input, &decoded_data.data.get_input, sizeof(struct tel_sat_get_input_tlv));
+ break;
+
+ case SAT_PROATV_CMD_MORE_TIME:
+ dbg("decoded command is more time!!");
+ memcpy(&proactive_noti.proactive_ind_data.more_time, &decoded_data.data.more_time, sizeof(struct tel_sat_more_time_tlv));
+ break;
+
+ case SAT_PROATV_CMD_PLAY_TONE:
+ dbg("decoded command is play tone!!");
+ memcpy(&proactive_noti.proactive_ind_data.play_tone, &decoded_data.data.play_tone, sizeof(struct tel_sat_play_tone_tlv));
+ break;
+
+ case SAT_PROATV_CMD_SETUP_MENU:
+ dbg("decoded command is SETUP MENU!!");
+ memcpy(&proactive_noti.proactive_ind_data.setup_menu, &decoded_data.data.setup_menu, sizeof(struct tel_sat_setup_menu_tlv));
+ break;
+
+ case SAT_PROATV_CMD_SELECT_ITEM:
+ dbg("decoded command is select item!!");
+ memcpy(&proactive_noti.proactive_ind_data.select_item, &decoded_data.data.select_item, sizeof(struct tel_sat_select_item_tlv));
+ break;
+
+ case SAT_PROATV_CMD_SEND_SMS:
+ dbg("decoded command is send sms!!");
+ memcpy(&proactive_noti.proactive_ind_data.send_sms, &decoded_data.data.send_sms, sizeof(struct tel_sat_send_sms_tlv));
+ break;
+
+ case SAT_PROATV_CMD_SEND_SS:
+ dbg("decoded command is send ss!!");
+ memcpy(&proactive_noti.proactive_ind_data.send_ss, &decoded_data.data.send_ss, sizeof(struct tel_sat_send_ss_tlv));
+ break;
+
+ case SAT_PROATV_CMD_SEND_USSD:
+ dbg("decoded command is send ussd!!");
+ memcpy(&proactive_noti.proactive_ind_data.send_ussd, &decoded_data.data.send_ussd, sizeof(struct tel_sat_send_ussd_tlv));
+ break;
+
+ case SAT_PROATV_CMD_SETUP_CALL:
+ dbg("decoded command is setup call!!");
+ memcpy(&proactive_noti.proactive_ind_data.setup_call, &decoded_data.data.setup_call, sizeof(struct tel_sat_setup_call_tlv));
+ break;
+
+ case SAT_PROATV_CMD_REFRESH:
+ dbg("decoded command is refresh");
+ memcpy(&proactive_noti.proactive_ind_data.refresh, &decoded_data.data.refresh, sizeof(struct tel_sat_refresh_tlv));
+ break;
+
+ case SAT_PROATV_CMD_PROVIDE_LOCAL_INFO:
+ dbg("decoded command is provide local info");
+ memcpy(&proactive_noti.proactive_ind_data.provide_local_info, &decoded_data.data.provide_local_info, sizeof(struct tel_sat_provide_local_info_tlv));
+ break;
+
+ case SAT_PROATV_CMD_SETUP_EVENT_LIST:
+ dbg("decoded command is setup event list!!");
+ memcpy(&proactive_noti.proactive_ind_data.setup_event_list, &decoded_data.data.setup_event_list, sizeof(struct tel_sat_setup_event_list_tlv));
+ // setup_event_rsp_get(o, &decoded_data.data.setup_event_list);
+ break;
+
+ case SAT_PROATV_CMD_SETUP_IDLE_MODE_TEXT:
+ dbg("decoded command is setup idle mode text");
+ memcpy(&proactive_noti.proactive_ind_data.setup_idle_mode_text, &decoded_data.data.setup_idle_mode_text, sizeof(struct tel_sat_setup_idle_mode_text_tlv));
+ break;
+
+ case SAT_PROATV_CMD_SEND_DTMF:
+ dbg("decoded command is send dtmf");
+ memcpy(&proactive_noti.proactive_ind_data.send_dtmf, &decoded_data.data.send_dtmf, sizeof(struct tel_sat_send_dtmf_tlv));
+ break;
+
+ case SAT_PROATV_CMD_LANGUAGE_NOTIFICATION:
+ dbg("decoded command is language notification");
+ memcpy(&proactive_noti.proactive_ind_data.language_notification, &decoded_data.data.language_notification, sizeof(struct tel_sat_language_notification_tlv));
+ break;
+
+ case SAT_PROATV_CMD_LAUNCH_BROWSER:
+ dbg("decoded command is launch browser");
+ memcpy(&proactive_noti.proactive_ind_data.launch_browser, &decoded_data.data.launch_browser, sizeof(struct tel_sat_launch_browser_tlv));
+ break;
+
+ case SAT_PROATV_CMD_OPEN_CHANNEL:
+ dbg("decoded command is open channel!!");
+ memcpy(&proactive_noti.proactive_ind_data.open_channel, &decoded_data.data.open_channel, sizeof(struct tel_sat_open_channel_tlv));
+ break;
+
+ case SAT_PROATV_CMD_CLOSE_CHANNEL:
+ dbg("decoded command is close channel!!");
+ memcpy(&proactive_noti.proactive_ind_data.close_channel, &decoded_data.data.close_channel, sizeof(struct tel_sat_close_channel_tlv));
+ break;
+
+ case SAT_PROATV_CMD_RECEIVE_DATA:
+ dbg("decoded command is receive data!!");
+ memcpy(&proactive_noti.proactive_ind_data.receive_data, &decoded_data.data.receive_data, sizeof(struct tel_sat_receive_channel_tlv));
+ break;
+
+ case SAT_PROATV_CMD_SEND_DATA:
+ dbg("decoded command is send data!!");
+ memcpy(&proactive_noti.proactive_ind_data.send_data, &decoded_data.data.send_data, sizeof(struct tel_sat_send_channel_tlv));
+ break;
+
+ case SAT_PROATV_CMD_GET_CHANNEL_STATUS:
+ dbg("decoded command is get channel status!!");
+ memcpy(&proactive_noti.proactive_ind_data.get_channel_status, &decoded_data.data.get_channel_status, sizeof(struct tel_sat_get_channel_status_tlv));
+ break;
+
+ default:
+ dbg("wrong input");
+ break;
+ }
+ if ((decoded_data.cmd_type == SAT_PROATV_CMD_REFRESH) || (decoded_data.cmd_type == SAT_PROATV_CMD_SETUP_EVENT_LIST)) {
+ /*Not supported*/
+ dbg("Not suported Proactive command");
+ return FALSE;
+ }
+ tcore_server_send_notification(tcore_plugin_ref_server(tcore_object_ref_plugin(o)), o, TNOTI_SAT_PROACTIVE_CMD,
+ sizeof(struct tnoti_sat_proactive_ind), &proactive_noti);
+ tcore_at_tok_free(tokens);
+ dbg("Function Exit");
+ return TRUE;
+}
+
+static void on_response_envelop_cmd(TcorePending *p, int data_len, const void *data, void *user_data)
+{
+ const TcoreATResponse *resp = data;
+ UserRequest *ur = NULL;
+ CoreObject *o = NULL;
+ const struct treq_sat_envelop_cmd_data *req_data = NULL;
+ GSList *tokens = NULL;
+ struct tresp_sat_envelop_data res;
+ const char *line = NULL;
+ const char *env_res = NULL;
+ int sw2 = -1;
+
+ ur = tcore_pending_ref_user_request(p);
+ req_data = tcore_user_request_ref_data(ur, NULL);
+ o = tcore_pending_ref_core_object(p);
+
+ if (!req_data) {
+ dbg("request data is NULL");
+ return;
+ }
+ memset(&res, 0, sizeof(struct tresp_sat_envelop_data));
+
+ res.sub_cmd = req_data->sub_cmd;
+
+ if (resp->success > 0) {
+ dbg("RESPONSE OK");
+ if (resp->lines) {
+ line = (const char *) resp->lines->data;
+ tokens = tcore_at_tok_new(line);
+ if (g_slist_length(tokens) < 1) {
+ msg("invalid message");
+ tcore_at_tok_free(tokens);
+ return;
+ }
+ }
+ env_res = g_slist_nth_data(tokens, 0);
+ res.result = 0x8000;
+ res.envelop_resp = ENVELOPE_SUCCESS;
+ dbg("RESPONSE OK 3");
+ if (NULL != g_slist_nth_data(tokens, 1)) {
+ sw2 = atoi(g_slist_nth_data(tokens, 1));
+ dbg("RESPONSE OK 4");
+ if (sw2 == 0) {
+ dbg("RESPONSE OK 5");
+ tcore_server_send_notification(tcore_plugin_ref_server(tcore_object_ref_plugin(o)), o, TNOTI_SAT_SESSION_END, 0, NULL);
+ }
+ }
+ } else {
+ dbg("RESPONSE NOK");
+ res.result = -1;
+ res.envelop_resp = ENVELOPE_FAILED;
+ }
+
+ if (ur) {
+ tcore_user_request_send_response(ur, TRESP_SAT_REQ_ENVELOPE, sizeof(struct tresp_sat_envelop_data), &res);
+ }
+ tcore_at_tok_free(tokens);
+ dbg(" Function exit");
+}
+
+
+static void on_response_terminal_response(TcorePending *p, int data_len, const void *data, void *user_data)
+{
+ UserRequest *ur = NULL;
+ CoreObject *o = NULL;
+ const TcoreATResponse *resp = data;
+ gpointer tmp = NULL;
+
+ dbg("Function Entry");
+
+ if (resp->success > 0) {
+ dbg("RESPONSE OK");
+ dbg(" resp->success = %d", resp->success);
+ ur = tcore_pending_ref_user_request(p);
+ tmp = (gpointer) tcore_user_request_ref_communicator(ur);
+ if (!ur || !tmp) {
+ dbg("error - current ur is NULL");
+ return;
+ }
+
+ o = tcore_pending_ref_core_object(p);
+ if (!o)
+ dbg("error - current sat core is NULL");
+ tcore_server_send_notification(tcore_plugin_ref_server(tcore_object_ref_plugin(o)), o, TNOTI_SAT_SESSION_END, 0, NULL);
+ }
+ dbg("Function Exit");
+}
+
+static TReturn s_envelope(CoreObject *o, UserRequest *ur)
+{
+ TcoreHal *hal;
+ TcoreATRequest *req = NULL;
+ TcorePending *pending = NULL;
+ char *cmd_str = NULL;
+ const struct treq_sat_envelop_cmd_data *req_data = NULL;
+ int envelope_cmd_len = 0;
+ char envelope_cmd[ENVELOPE_CMD_LEN];
+ int count = 0;
+ char envelope_cmdhex[ENVELOPE_CMD_LEN * 2];
+ char *pbuffer = NULL;
+
+ dbg("Function Entry");
+ memset(&envelope_cmdhex, 0x00, sizeof(envelope_cmdhex));
+ pbuffer = envelope_cmdhex;
+
+ hal = tcore_object_get_hal(o);
+ pending = tcore_pending_new(o, 0);
+ req_data = tcore_user_request_ref_data(ur, NULL);
+ dbg("new pending sub cmd(%d)", req_data->sub_cmd);
+
+ envelope_cmd_len = tcore_sat_encode_envelop_cmd(req_data, (char *) envelope_cmd);
+
+ dbg("envelope_cmd_len %d", envelope_cmd_len);
+ if (envelope_cmd_len == 0) {
+ return TCORE_RETURN_EINVAL;
+ }
+ for (count = 0; count < envelope_cmd_len; count++) {
+ dbg("envelope_cmd %02x", envelope_cmd[count]);
+ sprintf(pbuffer, "%02x", envelope_cmd[count]);
+ pbuffer += 2;
+ }
+ dbg("pbuffer %s", envelope_cmdhex);
cmd_str = g_strdup_printf("AT+SATE=\"%s\"", envelope_cmdhex);
- req = tcore_at_request_new(cmd_str, "+SATE:", TCORE_AT_SINGLELINE);\r
- dbg("cmd : %s, prefix(if any) :%s, cmd_len : %d", req->cmd, req->prefix, strlen(req->cmd));\r
-\r
- tcore_pending_set_request_data(pending, 0, req);\r
- tcore_pending_set_response_callback(pending, on_response_envelop_cmd, hal);\r
- tcore_pending_link_user_request(pending, ur);\r
- tcore_pending_set_send_callback(pending, on_confirmation_sat_message_send, NULL);\r
- tcore_hal_send_request(hal, pending);\r
- \r
+ req = tcore_at_request_new(cmd_str, "+SATE:", TCORE_AT_SINGLELINE);
+ dbg("cmd : %s, prefix(if any) :%s, cmd_len : %d", req->cmd, req->prefix, strlen(req->cmd));
+
+ tcore_pending_set_request_data(pending, 0, req);
+ tcore_pending_set_response_callback(pending, on_response_envelop_cmd, hal);
+ tcore_pending_link_user_request(pending, ur);
+ tcore_pending_set_send_callback(pending, on_confirmation_sat_message_send, NULL);
+ tcore_hal_send_request(hal, pending);
+
g_free(cmd_str);
- dbg("Function Exit");\r
- return TCORE_RETURN_SUCCESS;\r
-}\r
-\r
-static TReturn s_terminal_response(CoreObject *o, UserRequest *ur)\r
-{\r
- TcoreHal *hal = NULL;\r
- TcoreATRequest *req = NULL;\r
- TcorePending *pending = NULL;\r
- char *cmd_str = NULL;\r
- const struct treq_sat_terminal_rsp_data *req_data = NULL;\r
- int proactive_resp_len = 0;\r
- char proactive_resp[ENVELOPE_CMD_LEN];\r
- char proactive_resphex[ENVELOPE_CMD_LEN*2];\r
- char *pbuffer = NULL;\r
- int i = 0;\r
- char *hexString = NULL;\r
-\r
- dbg("Function Entry");\r
- memset(&proactive_resphex, 0x00, sizeof(proactive_resphex));\r
- pbuffer = proactive_resphex;\r
- hal = tcore_object_get_hal(o);\r
- pending = tcore_pending_new(o, 0);\r
- req_data = tcore_user_request_ref_data(ur, NULL);\r
-\r
- proactive_resp_len = tcore_sat_encode_terminal_response(req_data, (char *)proactive_resp);\r
- dbg("proactive_resp %s", proactive_resp);\r
- dbg("proactive_resp length %d", strlen(proactive_resp));\r
- if(proactive_resp_len == 0)\r
- {\r
- return TCORE_RETURN_EINVAL;\r
- }\r
- hexString = calloc((proactive_resp_len*2)+1, 1);\r
-\r
- for(i=0; i<proactive_resp_len*2; i+=2) \r
- {\r
- char value = 0;\r
- value = (proactive_resp[i/2] & 0xf0) >> 4;\r
- if(value < 0xA)\r
- hexString[i] = ((proactive_resp[i/2] & 0xf0) >> 4) + '0';\r
- else \r
- hexString[i] = ((proactive_resp[i/2] & 0xf0) >> 4) + 'A' -10;\r
-\r
- value = proactive_resp[i/2] & 0x0f;\r
- if(value < 0xA)\r
- hexString[i+1] = (proactive_resp[i/2] & 0x0f) + '0';\r
- else \r
- hexString[i+1] = (proactive_resp[i/2] & 0x0f) + 'A' -10;\r
- }\r
-\r
- dbg("hexString %s", hexString);\r
+ dbg("Function Exit");
+ return TCORE_RETURN_SUCCESS;
+}
+
+static TReturn s_terminal_response(CoreObject *o, UserRequest *ur)
+{
+ TcoreHal *hal = NULL;
+ TcoreATRequest *req = NULL;
+ TcorePending *pending = NULL;
+ char *cmd_str = NULL;
+ const struct treq_sat_terminal_rsp_data *req_data = NULL;
+ int proactive_resp_len = 0;
+ char proactive_resp[ENVELOPE_CMD_LEN];
+ char proactive_resphex[ENVELOPE_CMD_LEN * 2];
+ char *pbuffer = NULL;
+ int i = 0;
+ char *hexString = NULL;
+
+ dbg("Function Entry");
+ memset(&proactive_resphex, 0x00, sizeof(proactive_resphex));
+ pbuffer = proactive_resphex;
+ hal = tcore_object_get_hal(o);
+ pending = tcore_pending_new(o, 0);
+ req_data = tcore_user_request_ref_data(ur, NULL);
+
+ proactive_resp_len = tcore_sat_encode_terminal_response(req_data, (char *) proactive_resp);
+ dbg("proactive_resp %s", proactive_resp);
+ dbg("proactive_resp length %d", strlen(proactive_resp));
+ if (proactive_resp_len == 0) {
+ return TCORE_RETURN_EINVAL;
+ }
+ hexString = calloc((proactive_resp_len * 2) + 1, 1);
+
+ for (i = 0; i < proactive_resp_len * 2; i += 2) {
+ char value = 0;
+ value = (proactive_resp[i / 2] & 0xf0) >> 4;
+ if (value < 0xA)
+ hexString[i] = ((proactive_resp[i / 2] & 0xf0) >> 4) + '0';
+ else
+ hexString[i] = ((proactive_resp[i / 2] & 0xf0) >> 4) + 'A' - 10;
+
+ value = proactive_resp[i / 2] & 0x0f;
+ if (value < 0xA)
+ hexString[i + 1] = (proactive_resp[i / 2] & 0x0f) + '0';
+ else
+ hexString[i + 1] = (proactive_resp[i / 2] & 0x0f) + 'A' - 10;
+ }
+
+ dbg("hexString %s", hexString);
cmd_str = g_strdup_printf("AT+SATR=\"%s\"", hexString);
-\r
- req = tcore_at_request_new(cmd_str, NULL , TCORE_AT_NO_RESULT);\r
- dbg("cmd : %s, prefix(if any) :%s, cmd_len : %d", req->cmd, req->prefix, strlen(req->cmd));\r
-\r
- tcore_pending_set_request_data(pending, 0, req);\r
- tcore_pending_set_response_callback(pending, on_response_terminal_response, hal);\r
- tcore_pending_link_user_request(pending, ur);\r
- tcore_pending_set_send_callback(pending, on_confirmation_sat_message_send, NULL);\r
- tcore_hal_send_request(hal, pending);\r
-\r
+
+ req = tcore_at_request_new(cmd_str, NULL, TCORE_AT_NO_RESULT);
+ dbg("cmd : %s, prefix(if any) :%s, cmd_len : %d", req->cmd, req->prefix, strlen(req->cmd));
+
+ tcore_pending_set_request_data(pending, 0, req);
+ tcore_pending_set_response_callback(pending, on_response_terminal_response, hal);
+ tcore_pending_link_user_request(pending, ur);
+ tcore_pending_set_send_callback(pending, on_confirmation_sat_message_send, NULL);
+ tcore_hal_send_request(hal, pending);
+
g_free(cmd_str);
- dbg("Function Exit");\r
- return TCORE_RETURN_SUCCESS;\r
-}\r
-\r
-static struct tcore_sat_operations sat_ops =\r
-{\r
- .envelope = s_envelope,\r
- .terminal_response = s_terminal_response,\r
-};\r
-\r
-gboolean s_sat_init(TcorePlugin *p, TcoreHal *h)\r
-{\r
- CoreObject *o = NULL;\r
-\r
- dbg("Entry");\r
- o = tcore_sat_new(p, "sat", &sat_ops,h);\r
- if (!o)\r
- {\r
- dbg("CoreObject NULL !!");\r
- return FALSE;\r
- }\r
- \r
- tcore_object_add_callback(o, "+SATI", on_event_sat_proactive_command, NULL);\r
- tcore_object_add_callback(o, "+SATN", on_event_sat_proactive_command, NULL);\r
- tcore_object_add_callback(o, "+SATF", on_response_terminal_response_confirm, NULL);\r
-\r
- dbg("Exit");\r
- return TRUE;\r
-}\r
-\r
-void s_sat_exit(TcorePlugin *p)\r
-{\r
- CoreObject *o = NULL;\r
- o = tcore_plugin_ref_core_object(p, "sat");\r
- if (!o)\r
- return;\r
- tcore_sat_free(o);\r
-}\r
+ dbg("Function Exit");
+ return TCORE_RETURN_SUCCESS;
+}
+
+static struct tcore_sat_operations sat_ops = {
+ .envelope = s_envelope,
+ .terminal_response = s_terminal_response,
+};
+
+gboolean s_sat_init(TcorePlugin *p, TcoreHal *h)
+{
+ CoreObject *o = NULL;
+
+ dbg("Entry");
+ o = tcore_sat_new(p, "sat", &sat_ops, h);
+ if (!o) {
+ dbg("CoreObject NULL !!");
+ return FALSE;
+ }
+
+ tcore_object_add_callback(o, "+SATI", on_event_sat_proactive_command, NULL);
+ tcore_object_add_callback(o, "+SATN", on_event_sat_proactive_command, NULL);
+ tcore_object_add_callback(o, "+SATF", on_response_terminal_response_confirm, NULL);
+
+ dbg("Exit");
+ return TRUE;
+}
+
+void s_sat_exit(TcorePlugin *p)
+{
+ CoreObject *o = NULL;
+ o = tcore_plugin_ref_core_object(p, "sat");
+ if (!o)
+ return;
+ tcore_sat_free(o);
+}
-/*\r
- * tel-plugin-imc\r
- *\r
- * Copyright (c) 2012 Samsung Electronics Co., Ltd. All rights reserved.\r
- *\r
- * Contact: Ankit Jogi <ankit.jogi@samsung.com>\r
- *\r
- * Licensed under the Apache License, Version 2.0 (the "License");\r
- * you may not use this file except in compliance with the License.\r
- * You may obtain a copy of the License at\r
- *\r
- * http://www.apache.org/licenses/LICENSE-2.0\r
- *\r
- * Unless required by applicable law or agreed to in writing, software\r
- * distributed under the License is distributed on an "AS IS" BASIS,\r
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
- * See the License for the specific language governing permissions and\r
- * limitations under the License.\r
- */\r
-\r
-#include <stdio.h>\r
-#include <stdlib.h>\r
-#include <string.h>\r
-#include <glib.h>\r
-#include <tcore.h>\r
-#include <hal.h>\r
-#include <core_object.h>\r
-#include <plugin.h>\r
-#include <queue.h>\r
-#include <co_sim.h>\r
-#include <storage.h>\r
-#include <user_request.h>\r
-#include <server.h>\r
-#include <at.h>\r
-\r
-#include "s_common.h"\r
-#include "s_sim.h"\r
-\r
-#define ID_RESERVED_AT 0x0229\r
-\r
-#define SWAPBYTES16(x) \\r
-{ \\r
- unsigned short int data = *(unsigned short int*)&(x); \\r
- data = ((data & 0xff00) >> 8) | \\r
- ((data & 0x00ff) << 8); \\r
- *(unsigned short int*)&(x) = data ; \\r
-}\r
-\r
-enum s_sim_file_type_e {\r
- SIM_FTYPE_DEDICATED = 0x00, /**< Dedicated */\r
- SIM_FTYPE_TRANSPARENT = 0x01, /**< Transparent -binary type*/\r
- SIM_FTYPE_LINEAR_FIXED = 0x02, /**< Linear fixed - record type*/\r
- SIM_FTYPE_CYCLIC = 0x04, /**< Cyclic - record type*/\r
- SIM_FTYPE_INVALID_TYPE = 0xFF /**< Invalid type */\r
-};\r
-\r
-enum s_sim_sec_op_e {\r
- SEC_PIN1_VERIFY,\r
- SEC_PIN2_VERIFY,\r
- SEC_PUK1_VERIFY,\r
- SEC_PUK2_VERIFY,\r
- SEC_SIM_VERIFY,\r
- SEC_ADM_VERIFY,\r
- SEC_PIN1_CHANGE,\r
- SEC_PIN2_CHANGE,\r
- SEC_PIN1_ENABLE,\r
- SEC_PIN1_DISABLE,\r
- SEC_PIN2_ENABLE,\r
- SEC_PIN2_DISABLE, //10\r
- SEC_SIM_ENABLE,\r
- SEC_SIM_DISABLE,\r
- SEC_NET_ENABLE,\r
- SEC_NET_DISABLE,\r
- SEC_NS_ENABLE,\r
- SEC_NS_DISABLE,\r
- SEC_SP_ENABLE,\r
- SEC_SP_DISABLE,\r
- SEC_CP_ENABLE,\r
- SEC_CP_DISABLE, //20\r
- SEC_FDN_ENABLE,\r
- SEC_FDN_DISABLE,\r
- SEC_PIN1_STATUS,\r
- SEC_PIN2_STATUS,\r
- SEC_FDN_STATUS,\r
- SEC_NET_STATUS,\r
- SEC_NS_STATUS,\r
- SEC_SP_STATUS,\r
- SEC_CP_STATUS,\r
- SEC_SIM_STATUS,\r
- SEC_SIM_UNKNOWN = 0xff\r
-};\r
-\r
-struct s_sim_property {\r
- gboolean b_valid; /**< Valid or not */\r
- enum tel_sim_file_id file_id; /**< File identifier */\r
- enum s_sim_file_type_e file_type; /**< File type and structure */\r
- int rec_length; /**< Length of one record in file */\r
- int rec_count; /**< Number of records in file */\r
- int data_size; /**< File size */\r
- int current_index; /**< current index to read */\r
- enum tel_sim_status first_recv_status;\r
- enum s_sim_sec_op_e current_sec_op; /**< current index to read */\r
- struct tresp_sim_read files;\r
-};\r
-\r
-static void _next_from_get_file_info(CoreObject *o, UserRequest *ur, enum tel_sim_file_id ef, enum tel_sim_access_result rt);\r
-static void _next_from_get_file_data(CoreObject *o, UserRequest *ur, enum tel_sim_access_result rt, int decode_ret);\r
-static gboolean _get_sim_type(CoreObject *o);\r
-static TReturn _get_file_info(CoreObject *o, UserRequest *ur, const enum tel_sim_file_id ef);\r
-static gboolean _get_file_data(CoreObject *o, UserRequest *ur, const enum tel_sim_file_id ef, const int offset, const int length);\r
-static gboolean _get_file_record(CoreObject *o, UserRequest *ur, const enum tel_sim_file_id ef, const int index, const int length);\r
-static void _sim_status_update(CoreObject *o, enum tel_sim_status sim_status);\r
-static void on_confirmation_sim_message_send(TcorePending *p, gboolean result, void *user_data ); // from Kernel\r
-\r
-static void on_confirmation_sim_message_send( TcorePending *p, gboolean result, void *user_data )\r
-{\r
- dbg("on_confirmation_sim_message_send - msg out from queue.\n");\r
-\r
- if (result == FALSE) {\r
- /* Fail */\r
- dbg("SEND FAIL");\r
- }\r
- else\r
- {\r
- dbg("SEND OK");\r
- }\r
-}\r
-\r
-static enum tcore_response_command _find_resp_command(UserRequest *ur)\r
-{\r
- enum tcore_request_command command;\r
- command = tcore_user_request_get_command(ur);\r
- switch(command){\r
- case TREQ_SIM_VERIFY_PINS:\r
- return TRESP_SIM_VERIFY_PINS;\r
- break;\r
- case TREQ_SIM_VERIFY_PUKS:\r
- return TRESP_SIM_VERIFY_PUKS;\r
- break;\r
- case TREQ_SIM_CHANGE_PINS:\r
- return TRESP_SIM_CHANGE_PINS;\r
- break;\r
- case TREQ_SIM_GET_FACILITY_STATUS:\r
- return TRESP_SIM_GET_FACILITY_STATUS;\r
- break;\r
- case TREQ_SIM_DISABLE_FACILITY:\r
- return TRESP_SIM_DISABLE_FACILITY;\r
- break;\r
- case TREQ_SIM_ENABLE_FACILITY:\r
- return TRESP_SIM_ENABLE_FACILITY;\r
- break;\r
- case TREQ_SIM_GET_LOCK_INFO:\r
- return TRESP_SIM_GET_LOCK_INFO;\r
- break;\r
- case TREQ_SIM_TRANSMIT_APDU:\r
- return TRESP_SIM_TRANSMIT_APDU;\r
- break;\r
- case TREQ_SIM_GET_ATR:\r
- return TRESP_SIM_GET_ATR;\r
- break;\r
- case TREQ_SIM_GET_ECC:\r
- return TRESP_SIM_GET_ECC;\r
- break;\r
- case TREQ_SIM_GET_LANGUAGE:\r
- return TRESP_SIM_GET_LANGUAGE;\r
- break;\r
- case TREQ_SIM_SET_LANGUAGE:\r
- return TRESP_SIM_SET_LANGUAGE;\r
- break;\r
- case TREQ_SIM_GET_ICCID:\r
- return TRESP_SIM_GET_ICCID;\r
- break;\r
- case TREQ_SIM_GET_MAILBOX:\r
- return TRESP_SIM_GET_MAILBOX;\r
- break;\r
- case TREQ_SIM_GET_CALLFORWARDING:\r
- return TRESP_SIM_GET_CALLFORWARDING;\r
- break;\r
- case TREQ_SIM_SET_CALLFORWARDING:\r
- return TRESP_SIM_SET_CALLFORWARDING;\r
- break;\r
- case TREQ_SIM_GET_MESSAGEWAITING:\r
- return TRESP_SIM_GET_MESSAGEWAITING;\r
- break;\r
- case TREQ_SIM_GET_CPHS_INFO:\r
- return TRESP_SIM_GET_CPHS_INFO;\r
- break;\r
- case TREQ_SIM_GET_MSISDN:\r
- return TRESP_SIM_GET_MSISDN;\r
- break;\r
- case TREQ_SIM_GET_SPN:\r
- return TRESP_SIM_GET_SPN;\r
- break;\r
- case TREQ_SIM_GET_SPDI:\r
- return TRESP_SIM_GET_SPDI;\r
- break;\r
- case TREQ_SIM_GET_OPL:\r
- return TRESP_SIM_GET_OPL;\r
- break;\r
- case TREQ_SIM_GET_PNN:\r
- return TRESP_SIM_GET_PNN;\r
- break;\r
- case TREQ_SIM_GET_CPHS_NETNAME:\r
- return TRESP_SIM_GET_CPHS_NETNAME;\r
- break;\r
- case TREQ_SIM_GET_OPLMNWACT:\r
- return TRESP_SIM_GET_OPLMNWACT;\r
- break;\r
- case TREQ_SIM_REQ_AUTHENTICATION:\r
- return TRESP_SIM_REQ_AUTHENTICATION;\r
- break;\r
- default:\r
- break;\r
- }\r
- return TRESP_UNKNOWN;\r
-}\r
-\r
-static int _sim_get_current_pin_facility(enum s_sim_sec_op_e op)\r
-{\r
- int ret_type = 0;\r
- dbg("current sec_op[%d]", op);\r
- switch(op)\r
- {\r
- case SEC_PIN1_VERIFY :\r
- case SEC_PIN1_CHANGE :\r
- ret_type = SIM_PTYPE_PIN1;\r
- break;\r
- case SEC_PIN2_VERIFY :\r
- case SEC_PIN2_CHANGE :\r
- ret_type = SIM_PTYPE_PIN2;\r
- break;\r
- case SEC_PUK1_VERIFY :\r
- ret_type = SIM_PTYPE_PUK1;\r
- break;\r
- case SEC_PUK2_VERIFY :\r
- ret_type = SIM_PTYPE_PUK2;\r
- break;\r
- case SEC_SIM_VERIFY :\r
- ret_type = SIM_PTYPE_SIM;\r
- break;\r
- case SEC_ADM_VERIFY :\r
- ret_type = SIM_PTYPE_ADM;\r
- break;\r
-\r
- case SEC_PIN1_ENABLE :\r
- case SEC_PIN1_DISABLE :\r
- case SEC_PIN1_STATUS :\r
- ret_type = SIM_FACILITY_SC;\r
- break;\r
- case SEC_SIM_ENABLE :\r
- case SEC_SIM_DISABLE :\r
- case SEC_SIM_STATUS :\r
- ret_type = SIM_FACILITY_PS;\r
- break;\r
- case SEC_NET_ENABLE :\r
- case SEC_NET_DISABLE :\r
- case SEC_NET_STATUS :\r
- ret_type = SIM_FACILITY_PN;\r
- break;\r
- case SEC_NS_ENABLE :\r
- case SEC_NS_DISABLE :\r
- case SEC_NS_STATUS :\r
- ret_type = SIM_FACILITY_PU;\r
- break;\r
- case SEC_SP_ENABLE :\r
- case SEC_SP_DISABLE :\r
- case SEC_SP_STATUS :\r
- ret_type = SIM_FACILITY_PP;\r
- break;\r
- case SEC_CP_ENABLE :\r
- case SEC_CP_DISABLE :\r
- case SEC_CP_STATUS :\r
- ret_type = SIM_FACILITY_PC;\r
- break;\r
- case SEC_FDN_ENABLE :\r
- case SEC_FDN_DISABLE :\r
- case SEC_FDN_STATUS :\r
- ret_type = SIM_FACILITY_FD;\r
- break;\r
-\r
- default:\r
- dbg("not handled current sec op[%d]",op )\r
- break;\r
- }\r
- return ret_type;\r
-}\r
-\r
-static enum tel_sim_access_result _decode_status_word(unsigned short status_word1, unsigned short status_word2)\r
-{\r
- enum tel_sim_access_result rst = SIM_ACCESS_FAILED;\r
-\r
- if (status_word1 == 0x93 && status_word2 == 0x00)\r
- {\r
- rst = SIM_ACCESS_FAILED;\r
- /*Failed SIM request command*/\r
- dbg(" error - SIM application toolkit busy [%x][%x]", status_word1, status_word2);\r
- }\r
- else if (status_word1 == 0x94 && status_word2 == 0x00)\r
- {\r
- rst = SIM_ACCESS_FAILED;\r
- /*Failed SIM request command*/\r
- dbg(" error - No EF Selected [%x][%x]", status_word1, status_word2);\r
- }\r
- else if (status_word1 == 0x94 && status_word2 == 0x02)\r
- {\r
- rst = SIM_ACCESS_FAILED;\r
- /*Failed SIM request command*/\r
- dbg("error - Out of Range - Invalid address or record number[%x][%x]",\r
- status_word1, status_word2);\r
- }\r
- else if (status_word1 == 0x94 && status_word2 == 0x04)\r
- {\r
- rst = SIM_ACCESS_FILE_NOT_FOUND;\r
- /*Failed SIM request command*/\r
- dbg(" error - File ID not found [%x][%x]", status_word1, status_word2);\r
- }\r
- else if (status_word1 == 0x94 && status_word2 == 0x08)\r
- {\r
- rst = SIM_ACCESS_FAILED; /* MOdem not support */\r
- /*Failed SIM request command*/\r
- dbg(" error - File is inconsistent with command - Modem not support or USE IPC [%x][%x]",\r
- status_word1, status_word2);\r
- }\r
- else if (status_word1 == 0x98 && status_word2 == 0x02)\r
- {\r
- rst = SIM_ACCESS_CONDITION_NOT_SATISFIED;\r
- /*Failed SIM request command*/\r
- dbg(" error - CHV not initialized [%x][%x]", status_word1, status_word2);\r
- }\r
- else if (status_word1 == 0x98 && status_word2 == 0x04)\r
- {\r
- rst = SIM_ACCESS_CONDITION_NOT_SATISFIED;\r
- /*Failed SIM request command*/\r
- dbg(" error - Access condition not fullfilled [%x][%x]", status_word1, status_word2);\r
- dbg(" error -Unsuccessful CHV verification - at least one attempt left [%x][%x]",\r
- status_word1, status_word2);\r
- dbg(" error - Unsuccessful Unblock CHV - at least one attempt left [%x][%x]",\r
- status_word1, status_word2);\r
- dbg(" error - Authentication failure [%x][%x]", status_word1, status_word2);\r
- }\r
- else if (status_word1 == 0x98 && status_word2 == 0x08)\r
- {\r
- rst = SIM_ACCESS_CONDITION_NOT_SATISFIED;\r
- /*Failed SIM request command*/\r
- dbg(" error - Contradiction with CHV status [%x][%x]", status_word1, status_word2);\r
- }\r
- else if (status_word1 == 0x98 && status_word2 == 0x10)\r
- {\r
- rst = SIM_ACCESS_CONDITION_NOT_SATISFIED;\r
- /*Failed SIM request command*/\r
- dbg(" error - Contradiction with invalidation status [%x][%x]",\r
- status_word1, status_word2);\r
- }\r
- else if (status_word1 == 0x98 && status_word2 == 0x40)\r
- {\r
- rst = SIM_ACCESS_CONDITION_NOT_SATISFIED;\r
- /*Failed SIM request command*/\r
- dbg(" error -Unsuccessful CHV verification - no attempt left [%x][%x]",\r
- status_word1, status_word2);\r
- dbg(" error - Unsuccessful Unblock CHV - no attempt left [%x][%x]",\r
- status_word1, status_word2);\r
- dbg(" error - CHV blocked [%x][%x]", status_word1, status_word2);\r
- }\r
- else if (status_word1 == 0x67 && status_word2 == 0x00)\r
- {\r
- rst = SIM_ACCESS_FAILED;\r
- dbg(" error -Incorrect Parameter 3 [%x][%x]", status_word1, status_word2);\r
- }\r
- else if (status_word1 == 0x6B && status_word2 == 0x00)\r
- {\r
- rst = SIM_ACCESS_FAILED;\r
- dbg(" error -Incorrect Parameter 1 or 2 [%x][%x]", status_word1, status_word2);\r
- }\r
- else if (status_word1 == 0x6D && status_word2 == 0x00)\r
- {\r
- rst = SIM_ACCESS_CONDITION_NOT_SATISFIED;\r
- dbg(" error -Unknown instruction given as command [%x][%x]", status_word1, status_word2);\r
- }\r
- else if (status_word1 == 0x6E && status_word2 == 0x00)\r
- {\r
- rst = SIM_ACCESS_CONDITION_NOT_SATISFIED;\r
- dbg(" error -Unknown instruction given as command [%x][%x]", status_word1, status_word2);\r
- }\r
- else if (status_word1 == 0x69 && status_word2 == 0x82)\r
- {\r
- rst = SIM_ACCESS_CONDITION_NOT_SATISFIED;\r
- dbg(" error -Access denied [%x][%x]", status_word1, status_word2);\r
- }\r
- else if (status_word1 == 0x6A && status_word2 == 0x87)\r
- {\r
- rst = SIM_ACCESS_FAILED;\r
- dbg(" error -Incorrect parameters [%x][%x]", status_word1, status_word2);\r
- }\r
- else if (status_word1 == 0x6A && status_word2 == 0x82)\r
- {\r
- rst = SIM_ACCESS_FILE_NOT_FOUND; // not sure of the SW1 and SW2 meaning here\r
- dbg(" error -File Not found [%x][%x]", status_word1, status_word2);\r
- }\r
- else if (status_word1 == 0x6A && status_word2 == 0x83)\r
- {\r
- rst = SIM_ACCESS_FILE_NOT_FOUND; // not sure of the SW1 and SW2 meaning here\r
- dbg(" error -Record Not found [%x][%x]", status_word1, status_word2);\r
- }\r
- else\r
- {\r
- rst = SIM_ACCESS_CARD_ERROR;\r
- dbg(" error -Unknown state [%x][%x]", status_word1, status_word2);\r
- }\r
- return rst;\r
-}\r
-\r
-static gboolean _sim_check_identity(CoreObject *o, struct tel_sim_imsi *imsi)\r
-{\r
- Server *s = NULL;\r
- Storage *strg = NULL;\r
- char* old_imsi = NULL;\r
- char new_imsi[15+1] = {0,};\r
-\r
- s = tcore_plugin_ref_server(tcore_object_ref_plugin(o));\r
- if(!s)\r
- {\r
- dbg("there is no valid server at this point");\r
- return FALSE;\r
- }\r
- strg = (Storage*)tcore_server_find_storage(s, "vconf");\r
- if(!strg)\r
- {\r
- dbg("there is no valid storage plugin");\r
- return FALSE;\r
- }\r
- memcpy(&new_imsi, imsi->plmn, strlen(imsi->plmn));\r
- memcpy(&new_imsi[strlen(imsi->plmn)], imsi->msin, strlen(imsi->msin));\r
- new_imsi[strlen(imsi->plmn)+strlen(imsi->msin)] = '\0';\r
-\r
- old_imsi = tcore_storage_get_string(strg, STORAGE_KEY_TELEPHONY_IMSI);\r
- dbg("old_imsi[%s],newImsi[%s]", old_imsi, new_imsi);\r
-\r
- if (old_imsi != NULL)\r
- {\r
- if (strncmp(old_imsi, new_imsi, 15) != 0)\r
- {\r
- dbg("NEW SIM");\r
- if (tcore_storage_set_string(strg, STORAGE_KEY_TELEPHONY_IMSI, (const char*) &new_imsi) == FALSE )\r
- {\r
- dbg("[FAIL] UPDATE STORAGE_KEY_TELEPHONY_IMSI");\r
- }\r
- tcore_sim_set_identification(o, TRUE);\r
- }\r
- else\r
- {\r
- dbg("SAME SIM");\r
- tcore_sim_set_identification(o, FALSE);\r
- }\r
- }\r
- else\r
- {\r
- dbg("OLD SIM VALUE IS NULL. NEW SIM");\r
- if (tcore_storage_set_string(strg, STORAGE_KEY_TELEPHONY_IMSI, (const char*) &new_imsi) == FALSE)\r
- {\r
- dbg("[FAIL] UPDATE STORAGE_KEY_TELEPHONY_IMSI");\r
- }\r
- tcore_sim_set_identification(o, TRUE);\r
- }\r
- return 1;\r
-}\r
-\r
-static void _next_from_get_file_info(CoreObject *o, UserRequest *ur, enum tel_sim_file_id ef, enum tel_sim_access_result rt )\r
-{\r
- struct tresp_sim_read resp = {0,};\r
- struct s_sim_property *file_meta = NULL;\r
- dbg("EF[0x%x] access Result[%d]", ef, rt);\r
-\r
- resp.result = rt;\r
- memset(&resp.data, 0x00, sizeof(resp.data));\r
- file_meta = (struct s_sim_property*)tcore_user_request_ref_metainfo(ur, NULL);\r
-\r
- if ((ef != SIM_EF_ELP && ef != SIM_EF_LP && ef != SIM_EF_USIM_PL && ef != SIM_EF_CPHS_CPHS_INFO )\r
- && (rt != SIM_ACCESS_SUCCESS))\r
- {\r
- tcore_user_request_send_response(ur, _find_resp_command(ur), sizeof(struct tresp_sim_read),&resp);\r
- return;\r
- }\r
-\r
- switch (ef)\r
- {\r
- case SIM_EF_ELP:\r
- if (rt == SIM_ACCESS_SUCCESS)\r
- {\r
- dbg("[SIM DATA] exist EFELP/PL(0x2F05)");\r
- /* if (po->language_file == 0x00)\r
- po->language_file = SIM_EF_ELP;*/\r
- _get_file_data(o, ur, ef, 0, file_meta->data_size);\r
- }\r
- else\r
- {\r
- if (tcore_sim_get_type(o) == SIM_TYPE_GSM)\r
- {\r
- dbg(" [SIM DATA]SIM_EF_ELP(2F05) access fail. Request SIM_EF_LP(0x6F05) info");\r
- /* The ME requests the Language Preference (EFLP) if EFELP is not available */\r
- _get_file_info(o, ur, SIM_EF_LP);\r
- }\r
- else if (tcore_sim_get_type(o) == SIM_TYPE_USIM)\r
- {\r
- dbg(\r
- " [SIM DATA]fail to get Language information in USIM(EF-LI(6F05),EF-PL(2F05)). Request SIM_EF_ECC(0x6FB7) info");\r
- /* EFELPand EFLI not present at this point. */\r
- /* po->language.lang_cnt = 0;*/\r
- tcore_user_request_send_response(ur, _find_resp_command(ur),\r
- sizeof(struct tresp_sim_read), &resp);\r
- return;\r
- }\r
- }\r
- break;\r
-\r
- case SIM_EF_LP: //same with SIM_EF_USIM_LI\r
- if (rt == SIM_ACCESS_SUCCESS)\r
- {\r
- dbg("[SIM DATA] exist EFLP/LI(0x6F05)");\r
- _get_file_data(o, ur, ef, 0, file_meta->data_size);\r
- }\r
- else\r
- {\r
- dbg("[SIM DATA]SIM_EF_LP/LI(6F05) access fail. Current CardType[%d]",\r
- tcore_sim_get_type(o));\r
- if (tcore_sim_get_type(o) == SIM_TYPE_GSM)\r
- {\r
- tcore_user_request_send_response(ur, _find_resp_command(ur),\r
- sizeof(struct tresp_sim_read), &resp);\r
- return;\r
- }\r
- /* if EFLI is not present, then the language selection shall be as defined in EFPL at the MF level */\r
- else if (tcore_sim_get_type(o) == SIM_TYPE_USIM)\r
- {\r
- dbg("[SIM DATA] try USIM EFPL(0x2F05)");\r
- _get_file_info(o, ur, SIM_EF_ELP);\r
- }\r
- }\r
- break;\r
-\r
- case SIM_EF_USIM_PL:\r
- if (rt == SIM_ACCESS_SUCCESS)\r
- {\r
- dbg("[SIM DATA] exist EFELP/PL(0x2F05)");\r
- _get_file_data(o, ur, SIM_EF_ELP, 0, file_meta->data_size);\r
- }\r
- else\r
- {\r
- /* EFELIand EFPL not present, so set language count as zero and select ECC */\r
- dbg(\r
- " [SIM DATA]SIM_EF_USIM_PL(2A05) access fail. Request SIM_EF_ECC(0x6FB7) info");\r
- tcore_user_request_send_response(ur, _find_resp_command(ur),\r
- sizeof(struct tresp_sim_read), &resp);\r
- return;\r
- }\r
- break;\r
-\r
- case SIM_EF_ECC:\r
- if (tcore_sim_get_type(o) == SIM_TYPE_GSM)\r
- {\r
- _get_file_data(o, ur, ef, 0, file_meta->data_size);\r
- }\r
- else if (tcore_sim_get_type(o) == SIM_TYPE_USIM)\r
- {\r
- if (file_meta->rec_count > SIM_ECC_RECORD_CNT_MAX)\r
- {\r
- file_meta->rec_count = SIM_ECC_RECORD_CNT_MAX;\r
- }\r
-\r
- file_meta->current_index++;\r
- _get_file_record(o, ur, ef, file_meta->current_index, file_meta->rec_length);\r
- }\r
- break;\r
-\r
- case SIM_EF_ICCID:\r
- case SIM_EF_IMSI:\r
- case SIM_EF_SST:\r
- case SIM_EF_SPN:\r
- case SIM_EF_SPDI:\r
- case SIM_EF_CPHS_CALL_FORWARD_FLAGS:\r
- case SIM_EF_CPHS_VOICE_MSG_WAITING:\r
- case SIM_EF_CPHS_OPERATOR_NAME_STRING:\r
- case SIM_EF_CPHS_OPERATOR_NAME_SHORT_FORM_STRING:\r
- case SIM_EF_CPHS_DYNAMICFLAGS:\r
- case SIM_EF_CPHS_DYNAMIC2FLAG:\r
- case SIM_EF_CPHS_CUSTOMER_SERVICE_PROFILE:\r
- case SIM_EF_CPHS_CUSTOMER_SERVICE_PROFILE_LINE2:\r
- _get_file_data(o, ur, ef, 0, file_meta->data_size);\r
- break;\r
-\r
- case SIM_EF_CPHS_CPHS_INFO:\r
- if (rt == SIM_ACCESS_SUCCESS)\r
- {\r
- tcore_sim_set_cphs_status(o, TRUE);\r
- if (!tcore_user_request_ref_communicator(ur))\r
- {\r
- dbg("internal CPHS INFO request before sim status update");\r
- _sim_status_update(o, SIM_STATUS_INIT_COMPLETED);\r
- } else\r
- {\r
- dbg("external CPHS INFO request");\r
- _get_file_data(o, ur, ef, 0, file_meta->data_size);\r
- }\r
- } else\r
- {\r
- tcore_sim_set_cphs_status(o, FALSE);\r
- if (!tcore_user_request_ref_communicator(ur))\r
- {\r
- dbg("internal CPHS INFO request before sim status update");\r
- _sim_status_update(o, SIM_STATUS_INIT_COMPLETED);\r
- } else\r
- {\r
- dbg("external CPHS INFO request");\r
- tcore_user_request_send_response(ur, _find_resp_command(ur),\r
- sizeof(struct tresp_sim_read), &resp);\r
- }\r
- }\r
- break;\r
-\r
-\r
- case SIM_EF_USIM_CFIS:\r
- if (file_meta->rec_count > SIM_CF_RECORD_CNT_MAX)\r
- {\r
- file_meta->rec_count = SIM_CF_RECORD_CNT_MAX;\r
- }\r
- file_meta->current_index++;\r
- _get_file_record(o, ur, ef, file_meta->current_index, file_meta->rec_length);\r
- break;\r
-\r
- case SIM_EF_OPL:\r
- case SIM_EF_PNN:\r
- case SIM_EF_USIM_MWIS:\r
- case SIM_EF_USIM_MBI:\r
- case SIM_EF_MBDN:\r
- case SIM_EF_CPHS_MAILBOX_NUMBERS:\r
- case SIM_EF_CPHS_INFORMATION_NUMBERS:\r
- file_meta->current_index++;\r
- _get_file_record(o, ur, ef, file_meta->current_index, file_meta->rec_length);\r
- break;\r
-\r
- default:\r
- dbg( "error - File id for get file info [0x%x]", ef);\r
- break;\r
- }\r
- return;\r
-}\r
-\r
-static void _next_from_get_file_data(CoreObject *o, UserRequest *ur, enum tel_sim_access_result rt, int decode_ret)\r
-{\r
- struct s_sim_property *file_meta = NULL;\r
- dbg("Entry");\r
-\r
- file_meta = (struct s_sim_property*)tcore_user_request_ref_metainfo(ur, NULL);\r
- dbg("[SIM]EF[0x%x] read rt[%d] Decode rt[%d]", file_meta->file_id, rt, decode_ret);\r
- switch (file_meta->file_id)\r
- {\r
- case SIM_EF_ELP:\r
- case SIM_EF_USIM_PL:\r
- case SIM_EF_LP:\r
- case SIM_EF_USIM_LI:\r
- if (decode_ret == TRUE)\r
- {\r
- if (file_meta->file_id == SIM_EF_LP || file_meta->file_id == SIM_EF_USIM_LI)\r
- {\r
-/* po->language_file = SIM_EF_LP;*/\r
- } else if (file_meta->file_id == SIM_EF_ELP || file_meta->file_id == SIM_EF_USIM_PL)\r
- {\r
-/* po->language_file = SIM_EF_ELP;*/\r
- }\r
- tcore_user_request_send_response(ur, _find_resp_command(ur), sizeof(struct tresp_sim_read), &file_meta->files);\r
- } else\r
- {\r
- /* 2G */\r
- /* The ME requests the Extended Language Preference. The ME only requests the Language Preference (EFLP) if at least one of the following conditions holds:\r
- - EFELP is not available;\r
- - EFELP does not contain an entry corresponding to a language specified in ISO 639[30];\r
- - the ME does not support any of the languages in EFELP.\r
- */\r
- /* 3G */\r
- /* The ME only requests the Language Preference (EFPL) if at least one of the following conditions holds:\r
- - if the EFLI has the value 'FFFF' in its highest priority position\r
- - if the ME does not support any of the language codes indicated in EFLI , or if EFLI is not present\r
- */\r
- if (tcore_sim_get_type(o) == SIM_TYPE_GSM)\r
- {\r
- if (file_meta->file_id == SIM_EF_LP)\r
- {\r
- tcore_user_request_send_response(ur, _find_resp_command(ur), sizeof(struct tresp_sim_read), &file_meta->files);\r
- }\r
- else\r
- {\r
- _get_file_info(o, ur, SIM_EF_LP);\r
- }\r
- } else if (tcore_sim_get_type(o) == SIM_TYPE_USIM)\r
- {\r
-\r
- if (file_meta->file_id == SIM_EF_LP || file_meta->file_id == SIM_EF_USIM_LI)\r
- {\r
- _get_file_info(o, ur, SIM_EF_ELP);\r
- }\r
- else\r
- {\r
- tcore_user_request_send_response(ur, _find_resp_command(ur), sizeof(struct tresp_sim_read), &file_meta->files);\r
- }\r
- }\r
- }\r
- break;\r
-\r
- case SIM_EF_ECC:\r
- if (tcore_sim_get_type(o) == SIM_TYPE_USIM)\r
- {\r
- if (file_meta->current_index == file_meta->rec_count)\r
- {\r
- tcore_user_request_send_response(ur, _find_resp_command(ur), sizeof(struct tresp_sim_read), &file_meta->files);\r
- } else\r
- {\r
- file_meta->current_index++;\r
- _get_file_record(o, ur, file_meta->file_id, file_meta->current_index, file_meta->rec_length );\r
- }\r
- } else if (tcore_sim_get_type(o) == SIM_TYPE_GSM)\r
- {\r
- tcore_user_request_send_response(ur, _find_resp_command(ur), sizeof(struct tresp_sim_read), &file_meta->files);\r
- } else\r
- {\r
- dbg("[SIM DATA]Invalid CardType[%d] Unable to handle", tcore_sim_get_type(o));\r
- }\r
- break;\r
-\r
- case SIM_EF_IMSI:\r
- ur = tcore_user_request_new(NULL, NULL); //this is for using ur metainfo set/ref functionality.\r
- _get_file_info(o, ur, SIM_EF_CPHS_CPHS_INFO);\r
- break;\r
-\r
- case SIM_EF_MSISDN:\r
- if (file_meta->current_index == file_meta->rec_count)\r
- {\r
- tcore_user_request_send_response(ur, _find_resp_command(ur), sizeof(struct tresp_sim_read), &file_meta->files);\r
- } else\r
- {\r
- file_meta->current_index++;\r
- _get_file_record(o, ur, file_meta->file_id, file_meta->current_index, file_meta->rec_length );\r
- }\r
- break;\r
-\r
- case SIM_EF_OPL:\r
- if (file_meta->current_index == file_meta->rec_count)\r
- {\r
- tcore_user_request_send_response(ur, _find_resp_command(ur), sizeof(struct tresp_sim_read), &file_meta->files);\r
- } else\r
- {\r
- file_meta->current_index++;\r
- _get_file_record(o, ur, file_meta->file_id, file_meta->current_index, file_meta->rec_length );\r
- }\r
- break;\r
-\r
- case SIM_EF_PNN:\r
- if (file_meta->current_index == file_meta->rec_count)\r
- {\r
- tcore_user_request_send_response(ur, _find_resp_command(ur), sizeof(struct tresp_sim_read), &file_meta->files);\r
- } else\r
- {\r
- file_meta->current_index++;\r
- _get_file_record(o, ur, file_meta->file_id, file_meta->current_index, file_meta->rec_length );\r
- }\r
- break;\r
-\r
- case SIM_EF_USIM_CFIS:\r
- case SIM_EF_USIM_MWIS:\r
- case SIM_EF_USIM_MBI:\r
- case SIM_EF_MBDN:\r
- case SIM_EF_CPHS_MAILBOX_NUMBERS:\r
- case SIM_EF_CPHS_INFORMATION_NUMBERS:\r
- if (file_meta->current_index == file_meta->rec_count)\r
- {\r
- tcore_user_request_send_response(ur, _find_resp_command(ur), sizeof(struct tresp_sim_read), &file_meta->files);\r
- } else\r
- {\r
- file_meta->current_index++;\r
- _get_file_record(o, ur, file_meta->file_id, file_meta->current_index, file_meta->rec_length );\r
- }\r
- break;\r
-\r
- case SIM_EF_CPHS_OPERATOR_NAME_STRING:\r
- file_meta->files.result = rt;\r
- if (decode_ret == TRUE && rt == SIM_ACCESS_SUCCESS)\r
- {\r
- memcpy(file_meta->files.data.cphs_net.full_name, file_meta->files.data.cphs_net.full_name, strlen((char*)file_meta->files.data.cphs_net.full_name));\r
- }\r
- _get_file_info(o, ur, SIM_EF_CPHS_OPERATOR_NAME_SHORT_FORM_STRING);\r
- break;\r
-\r
- case SIM_EF_CPHS_OPERATOR_NAME_SHORT_FORM_STRING:\r
- if (file_meta->files.result == SIM_ACCESS_SUCCESS || file_meta->files.result == SIM_ACCESS_SUCCESS)\r
- {\r
- file_meta->files.result = SIM_ACCESS_SUCCESS;\r
- }\r
- if (strlen((char*)file_meta->files.data.cphs_net.full_name))\r
- {\r
- memcpy(&file_meta->files.data.cphs_net.full_name, &file_meta->files.data.cphs_net.full_name, strlen((char*)file_meta->files.data.cphs_net.full_name));\r
- }\r
- tcore_user_request_send_response(ur, _find_resp_command(ur), sizeof(struct tresp_sim_read), &file_meta->files);\r
- break;\r
-\r
- case SIM_EF_ICCID:\r
- case SIM_EF_SST:\r
- case SIM_EF_SPN:\r
- case SIM_EF_SPDI:\r
- case SIM_EF_OPLMN_ACT:\r
- case SIM_EF_CPHS_CPHS_INFO :\r
- case SIM_EF_CPHS_CALL_FORWARD_FLAGS:\r
- case SIM_EF_CPHS_VOICE_MSG_WAITING:\r
- case SIM_EF_CPHS_DYNAMICFLAGS:\r
- case SIM_EF_CPHS_DYNAMIC2FLAG:\r
- case SIM_EF_CPHS_CUSTOMER_SERVICE_PROFILE:\r
- case SIM_EF_CPHS_CUSTOMER_SERVICE_PROFILE_LINE2:\r
- tcore_user_request_send_response(ur, _find_resp_command(ur), sizeof(struct tresp_sim_read), &file_meta->files);\r
- break;\r
-\r
- default:\r
- dbg("File id not handled [0x%x]", file_meta->file_id);\r
- break;\r
- }\r
-}\r
-\r
-static void _sim_status_update(CoreObject *o, enum tel_sim_status sim_status)\r
-{\r
- struct tnoti_sim_status noti_data = {0,};\r
-\r
- dbg("tcore_sim_set_status and send noti w/ [%d]", sim_status);\r
- tcore_sim_set_status(o, sim_status);\r
- noti_data.sim_status = sim_status;\r
- tcore_server_send_notification(tcore_plugin_ref_server(tcore_object_ref_plugin(o)), o, TNOTI_SIM_STATUS,\r
- sizeof(struct tnoti_sim_status), ¬i_data);\r
-}\r
-\r
-static void _response_get_sim_type(TcorePending *p, int data_len, const void *data, void *user_data)\r
-{\r
- const TcoreATResponse *resp = data;\r
- UserRequest *ur = NULL;\r
- CoreObject *co_sim = NULL;\r
- struct s_sim_property *sp = NULL;\r
- GSList *tokens=NULL;\r
- enum tel_sim_type sim_type = SIM_TYPE_UNKNOWN;\r
- const char *line;\r
- int state;\r
-\r
- dbg(" Function entry ");\r
-\r
- co_sim = tcore_pending_ref_core_object(p);\r
- sp = tcore_sim_ref_userdata(co_sim);\r
- ur = tcore_pending_ref_user_request(p);\r
-\r
- if(resp->success > 0)\r
- {\r
- dbg("RESPONSE OK");\r
- if(resp->lines)\r
- {\r
- line = (const char*)resp->lines->data;\r
- tokens = tcore_at_tok_new(line);\r
- if (g_slist_length(tokens) != 1)\r
- {\r
- msg("invalid message");\r
- tcore_at_tok_free(tokens);\r
- return;\r
- }\r
- }\r
- state = atoi(g_slist_nth_data(tokens, 0));\r
- dbg("SIM Type is %d", state);\r
-\r
- if(state == 0)\r
- {\r
- sim_type = SIM_TYPE_GSM;\r
- }else if(state == 1)\r
- {\r
- sim_type = SIM_TYPE_USIM;\r
- }else\r
- {\r
- sim_type = SIM_TYPE_UNKNOWN;\r
- }\r
-\r
- }\r
- else\r
- {\r
- dbg("RESPONSE NOK");\r
- sim_type = SIM_TYPE_UNKNOWN;\r
- }\r
-\r
- tcore_sim_set_type(co_sim, sim_type);\r
- _sim_status_update(co_sim, sp->first_recv_status);\r
- tcore_at_tok_free(tokens);\r
- dbg(" Function exit");\r
-}\r
-\r
-static void _response_get_file_info(TcorePending *p, int data_len, const void *data, void *user_data)\r
-{\r
- const TcoreATResponse *resp = data;\r
- UserRequest *ur = NULL;\r
- CoreObject *co_sim = NULL;\r
- struct s_sim_property *file_meta = NULL;\r
- GSList *tokens=NULL;\r
- enum tel_sim_access_result rt;\r
- const char *line = NULL;\r
- int sw1 = 0;\r
- int sw2 = 0;\r
-\r
- dbg(" Function entry ");\r
-\r
- co_sim = tcore_pending_ref_core_object(p);\r
- ur = tcore_pending_ref_user_request(p);\r
- file_meta = (struct s_sim_property*)tcore_user_request_ref_metainfo(ur, NULL);\r
-\r
- if(resp->success > 0)\r
- {\r
- dbg("RESPONSE OK");\r
- if(resp->lines)\r
- {\r
- line = (const char*)resp->lines->data;\r
- tokens = tcore_at_tok_new(line);\r
- if (g_slist_length(tokens) < 2)\r
- {\r
- err("invalid message");\r
- tcore_at_tok_free(tokens);\r
- return;\r
- }\r
- }\r
- sw1 = atoi(g_slist_nth_data(tokens, 0));\r
- sw2 = atoi(g_slist_nth_data(tokens, 1));\r
-\r
- /*1. SIM access success case*/\r
- if ((sw1 == 0x90 && sw2 == 0x00) || sw1 == 0x91) {\r
- unsigned char tag_len = 0; /* 1 or 2 bytes ??? */\r
- unsigned short record_len = 0;\r
- char num_of_records = 0;\r
- unsigned char file_id_len = 0;\r
- unsigned short file_id = 0;\r
- unsigned short file_size = 0;\r
- unsigned short file_type = 0;\r
- unsigned short arr_file_id = 0;\r
- int arr_file_id_rec_num = 0;\r
-\r
- /* handling only last 3 bits */\r
- unsigned char file_type_tag = 0x07;\r
- unsigned char *ptr_data;\r
-\r
- char *hexData;\r
- char *tmp;\r
- char *recordData = NULL;\r
- hexData = g_slist_nth_data(tokens, 2);\r
- dbg("hexData: %s", hexData);\r
- dbg("hexData: %s", hexData+1);\r
-\r
+/*
+ * tel-plugin-imc
+ *
+ * Copyright (c) 2012 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: Ankit Jogi <ankit.jogi@samsung.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <glib.h>
+#include <tcore.h>
+#include <hal.h>
+#include <core_object.h>
+#include <plugin.h>
+#include <queue.h>
+#include <co_sim.h>
+#include <storage.h>
+#include <user_request.h>
+#include <server.h>
+#include <at.h>
+
+#include "s_common.h"
+#include "s_sim.h"
+
+#define ID_RESERVED_AT 0x0229
+
+#define SWAPBYTES16(x) \
+ { \
+ unsigned short int data = *(unsigned short int *) &(x); \
+ data = ((data & 0xff00) >> 8) | \
+ ((data & 0x00ff) << 8); \
+ *(unsigned short int *) &(x) = data; \
+ }
+
+enum s_sim_file_type_e {
+ SIM_FTYPE_DEDICATED = 0x00, /**< Dedicated */
+ SIM_FTYPE_TRANSPARENT = 0x01, /**< Transparent -binary type*/
+ SIM_FTYPE_LINEAR_FIXED = 0x02, /**< Linear fixed - record type*/
+ SIM_FTYPE_CYCLIC = 0x04, /**< Cyclic - record type*/
+ SIM_FTYPE_INVALID_TYPE = 0xFF /**< Invalid type */
+};
+
+enum s_sim_sec_op_e {
+ SEC_PIN1_VERIFY,
+ SEC_PIN2_VERIFY,
+ SEC_PUK1_VERIFY,
+ SEC_PUK2_VERIFY,
+ SEC_SIM_VERIFY,
+ SEC_ADM_VERIFY,
+ SEC_PIN1_CHANGE,
+ SEC_PIN2_CHANGE,
+ SEC_PIN1_ENABLE,
+ SEC_PIN1_DISABLE,
+ SEC_PIN2_ENABLE,
+ SEC_PIN2_DISABLE, // 10
+ SEC_SIM_ENABLE,
+ SEC_SIM_DISABLE,
+ SEC_NET_ENABLE,
+ SEC_NET_DISABLE,
+ SEC_NS_ENABLE,
+ SEC_NS_DISABLE,
+ SEC_SP_ENABLE,
+ SEC_SP_DISABLE,
+ SEC_CP_ENABLE,
+ SEC_CP_DISABLE, // 20
+ SEC_FDN_ENABLE,
+ SEC_FDN_DISABLE,
+ SEC_PIN1_STATUS,
+ SEC_PIN2_STATUS,
+ SEC_FDN_STATUS,
+ SEC_NET_STATUS,
+ SEC_NS_STATUS,
+ SEC_SP_STATUS,
+ SEC_CP_STATUS,
+ SEC_SIM_STATUS,
+ SEC_SIM_UNKNOWN = 0xff
+};
+
+struct s_sim_property {
+ gboolean b_valid; /**< Valid or not */
+ enum tel_sim_file_id file_id; /**< File identifier */
+ enum s_sim_file_type_e file_type; /**< File type and structure */
+ int rec_length; /**< Length of one record in file */
+ int rec_count; /**< Number of records in file */
+ int data_size; /**< File size */
+ int current_index; /**< current index to read */
+ enum tel_sim_status first_recv_status;
+ enum s_sim_sec_op_e current_sec_op; /**< current index to read */
+ struct tresp_sim_read files;
+};
+
+static void _next_from_get_file_info(CoreObject *o, UserRequest *ur, enum tel_sim_file_id ef, enum tel_sim_access_result rt);
+static void _next_from_get_file_data(CoreObject *o, UserRequest *ur, enum tel_sim_access_result rt, int decode_ret);
+static gboolean _get_sim_type(CoreObject *o);
+static TReturn _get_file_info(CoreObject *o, UserRequest *ur, const enum tel_sim_file_id ef);
+static gboolean _get_file_data(CoreObject *o, UserRequest *ur, const enum tel_sim_file_id ef, const int offset, const int length);
+static gboolean _get_file_record(CoreObject *o, UserRequest *ur, const enum tel_sim_file_id ef, const int index, const int length);
+static void _sim_status_update(CoreObject *o, enum tel_sim_status sim_status);
+static void on_confirmation_sim_message_send(TcorePending *p, gboolean result, void *user_data); // from Kernel
+
+static void on_confirmation_sim_message_send(TcorePending *p, gboolean result, void *user_data)
+{
+ dbg("on_confirmation_sim_message_send - msg out from queue.\n");
+
+ if (result == FALSE) {
+ /* Fail */
+ dbg("SEND FAIL");
+ } else {
+ dbg("SEND OK");
+ }
+}
+
+static enum tcore_response_command _find_resp_command(UserRequest *ur)
+{
+ enum tcore_request_command command;
+ command = tcore_user_request_get_command(ur);
+ switch (command) {
+ case TREQ_SIM_VERIFY_PINS:
+ return TRESP_SIM_VERIFY_PINS;
+ break;
+
+ case TREQ_SIM_VERIFY_PUKS:
+ return TRESP_SIM_VERIFY_PUKS;
+ break;
+
+ case TREQ_SIM_CHANGE_PINS:
+ return TRESP_SIM_CHANGE_PINS;
+ break;
+
+ case TREQ_SIM_GET_FACILITY_STATUS:
+ return TRESP_SIM_GET_FACILITY_STATUS;
+ break;
+
+ case TREQ_SIM_DISABLE_FACILITY:
+ return TRESP_SIM_DISABLE_FACILITY;
+ break;
+
+ case TREQ_SIM_ENABLE_FACILITY:
+ return TRESP_SIM_ENABLE_FACILITY;
+ break;
+
+ case TREQ_SIM_GET_LOCK_INFO:
+ return TRESP_SIM_GET_LOCK_INFO;
+ break;
+
+ case TREQ_SIM_TRANSMIT_APDU:
+ return TRESP_SIM_TRANSMIT_APDU;
+ break;
+
+ case TREQ_SIM_GET_ATR:
+ return TRESP_SIM_GET_ATR;
+ break;
+
+ case TREQ_SIM_GET_ECC:
+ return TRESP_SIM_GET_ECC;
+ break;
+
+ case TREQ_SIM_GET_LANGUAGE:
+ return TRESP_SIM_GET_LANGUAGE;
+ break;
+
+ case TREQ_SIM_SET_LANGUAGE:
+ return TRESP_SIM_SET_LANGUAGE;
+ break;
+
+ case TREQ_SIM_GET_ICCID:
+ return TRESP_SIM_GET_ICCID;
+ break;
+
+ case TREQ_SIM_GET_MAILBOX:
+ return TRESP_SIM_GET_MAILBOX;
+ break;
+
+ case TREQ_SIM_GET_CALLFORWARDING:
+ return TRESP_SIM_GET_CALLFORWARDING;
+ break;
+
+ case TREQ_SIM_SET_CALLFORWARDING:
+ return TRESP_SIM_SET_CALLFORWARDING;
+ break;
+
+ case TREQ_SIM_GET_MESSAGEWAITING:
+ return TRESP_SIM_GET_MESSAGEWAITING;
+ break;
+
+ case TREQ_SIM_GET_CPHS_INFO:
+ return TRESP_SIM_GET_CPHS_INFO;
+ break;
+
+ case TREQ_SIM_GET_MSISDN:
+ return TRESP_SIM_GET_MSISDN;
+ break;
+
+ case TREQ_SIM_GET_SPN:
+ return TRESP_SIM_GET_SPN;
+ break;
+
+ case TREQ_SIM_GET_SPDI:
+ return TRESP_SIM_GET_SPDI;
+ break;
+
+ case TREQ_SIM_GET_OPL:
+ return TRESP_SIM_GET_OPL;
+ break;
+
+ case TREQ_SIM_GET_PNN:
+ return TRESP_SIM_GET_PNN;
+ break;
+
+ case TREQ_SIM_GET_CPHS_NETNAME:
+ return TRESP_SIM_GET_CPHS_NETNAME;
+ break;
+
+ case TREQ_SIM_GET_OPLMNWACT:
+ return TRESP_SIM_GET_OPLMNWACT;
+ break;
+
+ case TREQ_SIM_REQ_AUTHENTICATION:
+ return TRESP_SIM_REQ_AUTHENTICATION;
+ break;
+
+ default:
+ break;
+ }
+ return TRESP_UNKNOWN;
+}
+
+static int _sim_get_current_pin_facility(enum s_sim_sec_op_e op)
+{
+ int ret_type = 0;
+ dbg("current sec_op[%d]", op);
+ switch (op) {
+ case SEC_PIN1_VERIFY:
+ case SEC_PIN1_CHANGE:
+ ret_type = SIM_PTYPE_PIN1;
+ break;
+
+ case SEC_PIN2_VERIFY:
+ case SEC_PIN2_CHANGE:
+ ret_type = SIM_PTYPE_PIN2;
+ break;
+
+ case SEC_PUK1_VERIFY:
+ ret_type = SIM_PTYPE_PUK1;
+ break;
+
+ case SEC_PUK2_VERIFY:
+ ret_type = SIM_PTYPE_PUK2;
+ break;
+
+ case SEC_SIM_VERIFY:
+ ret_type = SIM_PTYPE_SIM;
+ break;
+
+ case SEC_ADM_VERIFY:
+ ret_type = SIM_PTYPE_ADM;
+ break;
+
+ case SEC_PIN1_ENABLE:
+ case SEC_PIN1_DISABLE:
+ case SEC_PIN1_STATUS:
+ ret_type = SIM_FACILITY_SC;
+ break;
+
+ case SEC_SIM_ENABLE:
+ case SEC_SIM_DISABLE:
+ case SEC_SIM_STATUS:
+ ret_type = SIM_FACILITY_PS;
+ break;
+
+ case SEC_NET_ENABLE:
+ case SEC_NET_DISABLE:
+ case SEC_NET_STATUS:
+ ret_type = SIM_FACILITY_PN;
+ break;
+
+ case SEC_NS_ENABLE:
+ case SEC_NS_DISABLE:
+ case SEC_NS_STATUS:
+ ret_type = SIM_FACILITY_PU;
+ break;
+
+ case SEC_SP_ENABLE:
+ case SEC_SP_DISABLE:
+ case SEC_SP_STATUS:
+ ret_type = SIM_FACILITY_PP;
+ break;
+
+ case SEC_CP_ENABLE:
+ case SEC_CP_DISABLE:
+ case SEC_CP_STATUS:
+ ret_type = SIM_FACILITY_PC;
+ break;
+
+ case SEC_FDN_ENABLE:
+ case SEC_FDN_DISABLE:
+ case SEC_FDN_STATUS:
+ ret_type = SIM_FACILITY_FD;
+ break;
+
+ default:
+ dbg("not handled current sec op[%d]", op)
+ break;
+ }
+ return ret_type;
+}
+
+static enum tel_sim_access_result _decode_status_word(unsigned short status_word1, unsigned short status_word2)
+{
+ enum tel_sim_access_result rst = SIM_ACCESS_FAILED;
+
+ if (status_word1 == 0x93 && status_word2 == 0x00) {
+ rst = SIM_ACCESS_FAILED;
+ /*Failed SIM request command*/
+ dbg(" error - SIM application toolkit busy [%x][%x]", status_word1, status_word2);
+ } else if (status_word1 == 0x94 && status_word2 == 0x00) {
+ rst = SIM_ACCESS_FAILED;
+ /*Failed SIM request command*/
+ dbg(" error - No EF Selected [%x][%x]", status_word1, status_word2);
+ } else if (status_word1 == 0x94 && status_word2 == 0x02) {
+ rst = SIM_ACCESS_FAILED;
+ /*Failed SIM request command*/
+ dbg("error - Out of Range - Invalid address or record number[%x][%x]",
+ status_word1, status_word2);
+ } else if (status_word1 == 0x94 && status_word2 == 0x04) {
+ rst = SIM_ACCESS_FILE_NOT_FOUND;
+ /*Failed SIM request command*/
+ dbg(" error - File ID not found [%x][%x]", status_word1, status_word2);
+ } else if (status_word1 == 0x94 && status_word2 == 0x08) {
+ rst = SIM_ACCESS_FAILED; /* MOdem not support */
+ /*Failed SIM request command*/
+ dbg(" error - File is inconsistent with command - Modem not support or USE IPC [%x][%x]",
+ status_word1, status_word2);
+ } else if (status_word1 == 0x98 && status_word2 == 0x02) {
+ rst = SIM_ACCESS_CONDITION_NOT_SATISFIED;
+ /*Failed SIM request command*/
+ dbg(" error - CHV not initialized [%x][%x]", status_word1, status_word2);
+ } else if (status_word1 == 0x98 && status_word2 == 0x04) {
+ rst = SIM_ACCESS_CONDITION_NOT_SATISFIED;
+ /*Failed SIM request command*/
+ dbg(" error - Access condition not fullfilled [%x][%x]", status_word1, status_word2);
+ dbg(" error -Unsuccessful CHV verification - at least one attempt left [%x][%x]",
+ status_word1, status_word2);
+ dbg(" error - Unsuccessful Unblock CHV - at least one attempt left [%x][%x]",
+ status_word1, status_word2);
+ dbg(" error - Authentication failure [%x][%x]", status_word1, status_word2);
+ } else if (status_word1 == 0x98 && status_word2 == 0x08) {
+ rst = SIM_ACCESS_CONDITION_NOT_SATISFIED;
+ /*Failed SIM request command*/
+ dbg(" error - Contradiction with CHV status [%x][%x]", status_word1, status_word2);
+ } else if (status_word1 == 0x98 && status_word2 == 0x10) {
+ rst = SIM_ACCESS_CONDITION_NOT_SATISFIED;
+ /*Failed SIM request command*/
+ dbg(" error - Contradiction with invalidation status [%x][%x]",
+ status_word1, status_word2);
+ } else if (status_word1 == 0x98 && status_word2 == 0x40) {
+ rst = SIM_ACCESS_CONDITION_NOT_SATISFIED;
+ /*Failed SIM request command*/
+ dbg(" error -Unsuccessful CHV verification - no attempt left [%x][%x]",
+ status_word1, status_word2);
+ dbg(" error - Unsuccessful Unblock CHV - no attempt left [%x][%x]",
+ status_word1, status_word2);
+ dbg(" error - CHV blocked [%x][%x]", status_word1, status_word2);
+ } else if (status_word1 == 0x67 && status_word2 == 0x00) {
+ rst = SIM_ACCESS_FAILED;
+ dbg(" error -Incorrect Parameter 3 [%x][%x]", status_word1, status_word2);
+ } else if (status_word1 == 0x6B && status_word2 == 0x00) {
+ rst = SIM_ACCESS_FAILED;
+ dbg(" error -Incorrect Parameter 1 or 2 [%x][%x]", status_word1, status_word2);
+ } else if (status_word1 == 0x6D && status_word2 == 0x00) {
+ rst = SIM_ACCESS_CONDITION_NOT_SATISFIED;
+ dbg(" error -Unknown instruction given as command [%x][%x]", status_word1, status_word2);
+ } else if (status_word1 == 0x6E && status_word2 == 0x00) {
+ rst = SIM_ACCESS_CONDITION_NOT_SATISFIED;
+ dbg(" error -Unknown instruction given as command [%x][%x]", status_word1, status_word2);
+ } else if (status_word1 == 0x69 && status_word2 == 0x82) {
+ rst = SIM_ACCESS_CONDITION_NOT_SATISFIED;
+ dbg(" error -Access denied [%x][%x]", status_word1, status_word2);
+ } else if (status_word1 == 0x6A && status_word2 == 0x87) {
+ rst = SIM_ACCESS_FAILED;
+ dbg(" error -Incorrect parameters [%x][%x]", status_word1, status_word2);
+ } else if (status_word1 == 0x6A && status_word2 == 0x82) {
+ rst = SIM_ACCESS_FILE_NOT_FOUND; // not sure of the SW1 and SW2 meaning here
+ dbg(" error -File Not found [%x][%x]", status_word1, status_word2);
+ } else if (status_word1 == 0x6A && status_word2 == 0x83) {
+ rst = SIM_ACCESS_FILE_NOT_FOUND; // not sure of the SW1 and SW2 meaning here
+ dbg(" error -Record Not found [%x][%x]", status_word1, status_word2);
+ } else {
+ rst = SIM_ACCESS_CARD_ERROR;
+ dbg(" error -Unknown state [%x][%x]", status_word1, status_word2);
+ }
+ return rst;
+}
+
+static gboolean _sim_check_identity(CoreObject *o, struct tel_sim_imsi *imsi)
+{
+ Server *s = NULL;
+ Storage *strg = NULL;
+ char *old_imsi = NULL;
+ char new_imsi[15 + 1] = {0, };
+
+ s = tcore_plugin_ref_server(tcore_object_ref_plugin(o));
+ if (!s) {
+ dbg("there is no valid server at this point");
+ return FALSE;
+ }
+ strg = (Storage *) tcore_server_find_storage(s, "vconf");
+ if (!strg) {
+ dbg("there is no valid storage plugin");
+ return FALSE;
+ }
+ memcpy(&new_imsi, imsi->plmn, strlen(imsi->plmn));
+ memcpy(&new_imsi[strlen(imsi->plmn)], imsi->msin, strlen(imsi->msin));
+ new_imsi[strlen(imsi->plmn) + strlen(imsi->msin)] = '\0';
+
+ old_imsi = tcore_storage_get_string(strg, STORAGE_KEY_TELEPHONY_IMSI);
+ dbg("old_imsi[%s],newImsi[%s]", old_imsi, new_imsi);
+
+ if (old_imsi != NULL) {
+ if (strncmp(old_imsi, new_imsi, 15) != 0) {
+ dbg("NEW SIM");
+ if (tcore_storage_set_string(strg, STORAGE_KEY_TELEPHONY_IMSI, (const char *) &new_imsi) == FALSE) {
+ dbg("[FAIL] UPDATE STORAGE_KEY_TELEPHONY_IMSI");
+ }
+ tcore_sim_set_identification(o, TRUE);
+ } else {
+ dbg("SAME SIM");
+ tcore_sim_set_identification(o, FALSE);
+ }
+ } else {
+ dbg("OLD SIM VALUE IS NULL. NEW SIM");
+ if (tcore_storage_set_string(strg, STORAGE_KEY_TELEPHONY_IMSI, (const char *) &new_imsi) == FALSE) {
+ dbg("[FAIL] UPDATE STORAGE_KEY_TELEPHONY_IMSI");
+ }
+ tcore_sim_set_identification(o, TRUE);
+ }
+ return 1;
+}
+
+static void _next_from_get_file_info(CoreObject *o, UserRequest *ur, enum tel_sim_file_id ef, enum tel_sim_access_result rt)
+{
+ struct tresp_sim_read resp = {0, };
+ struct s_sim_property *file_meta = NULL;
+ dbg("EF[0x%x] access Result[%d]", ef, rt);
+
+ resp.result = rt;
+ memset(&resp.data, 0x00, sizeof(resp.data));
+ file_meta = (struct s_sim_property *) tcore_user_request_ref_metainfo(ur, NULL);
+
+ if ((ef != SIM_EF_ELP && ef != SIM_EF_LP && ef != SIM_EF_USIM_PL && ef != SIM_EF_CPHS_CPHS_INFO)
+ && (rt != SIM_ACCESS_SUCCESS)) {
+ tcore_user_request_send_response(ur, _find_resp_command(ur), sizeof(struct tresp_sim_read), &resp);
+ return;
+ }
+
+ switch (ef) {
+ case SIM_EF_ELP:
+ if (rt == SIM_ACCESS_SUCCESS) {
+ dbg("[SIM DATA] exist EFELP/PL(0x2F05)");
+ /* if (po->language_file == 0x00)
+ po->language_file = SIM_EF_ELP;*/
+ _get_file_data(o, ur, ef, 0, file_meta->data_size);
+ } else {
+ if (tcore_sim_get_type(o) == SIM_TYPE_GSM) {
+ dbg(" [SIM DATA]SIM_EF_ELP(2F05) access fail. Request SIM_EF_LP(0x6F05) info");
+ /* The ME requests the Language Preference (EFLP) if EFELP is not available */
+ _get_file_info(o, ur, SIM_EF_LP);
+ } else if (tcore_sim_get_type(o) == SIM_TYPE_USIM) {
+ dbg(
+ " [SIM DATA]fail to get Language information in USIM(EF-LI(6F05),EF-PL(2F05)). Request SIM_EF_ECC(0x6FB7) info");
+ /* EFELPand EFLI not present at this point. */
+ /* po->language.lang_cnt = 0;*/
+ tcore_user_request_send_response(ur, _find_resp_command(ur),
+ sizeof(struct tresp_sim_read), &resp);
+ return;
+ }
+ }
+ break;
+
+ case SIM_EF_LP: // same with SIM_EF_USIM_LI
+ if (rt == SIM_ACCESS_SUCCESS) {
+ dbg("[SIM DATA] exist EFLP/LI(0x6F05)");
+ _get_file_data(o, ur, ef, 0, file_meta->data_size);
+ } else {
+ dbg("[SIM DATA]SIM_EF_LP/LI(6F05) access fail. Current CardType[%d]",
+ tcore_sim_get_type(o));
+ if (tcore_sim_get_type(o) == SIM_TYPE_GSM) {
+ tcore_user_request_send_response(ur, _find_resp_command(ur),
+ sizeof(struct tresp_sim_read), &resp);
+ return;
+ }
+ /* if EFLI is not present, then the language selection shall be as defined in EFPL at the MF level */
+ else if (tcore_sim_get_type(o) == SIM_TYPE_USIM) {
+ dbg("[SIM DATA] try USIM EFPL(0x2F05)");
+ _get_file_info(o, ur, SIM_EF_ELP);
+ }
+ }
+ break;
+
+ case SIM_EF_USIM_PL:
+ if (rt == SIM_ACCESS_SUCCESS) {
+ dbg("[SIM DATA] exist EFELP/PL(0x2F05)");
+ _get_file_data(o, ur, SIM_EF_ELP, 0, file_meta->data_size);
+ } else {
+ /* EFELIand EFPL not present, so set language count as zero and select ECC */
+ dbg(
+ " [SIM DATA]SIM_EF_USIM_PL(2A05) access fail. Request SIM_EF_ECC(0x6FB7) info");
+ tcore_user_request_send_response(ur, _find_resp_command(ur),
+ sizeof(struct tresp_sim_read), &resp);
+ return;
+ }
+ break;
+
+ case SIM_EF_ECC:
+ if (tcore_sim_get_type(o) == SIM_TYPE_GSM) {
+ _get_file_data(o, ur, ef, 0, file_meta->data_size);
+ } else if (tcore_sim_get_type(o) == SIM_TYPE_USIM) {
+ if (file_meta->rec_count > SIM_ECC_RECORD_CNT_MAX) {
+ file_meta->rec_count = SIM_ECC_RECORD_CNT_MAX;
+ }
+
+ file_meta->current_index++;
+ _get_file_record(o, ur, ef, file_meta->current_index, file_meta->rec_length);
+ }
+ break;
+
+ case SIM_EF_ICCID:
+ case SIM_EF_IMSI:
+ case SIM_EF_SST:
+ case SIM_EF_SPN:
+ case SIM_EF_SPDI:
+ case SIM_EF_CPHS_CALL_FORWARD_FLAGS:
+ case SIM_EF_CPHS_VOICE_MSG_WAITING:
+ case SIM_EF_CPHS_OPERATOR_NAME_STRING:
+ case SIM_EF_CPHS_OPERATOR_NAME_SHORT_FORM_STRING:
+ case SIM_EF_CPHS_DYNAMICFLAGS:
+ case SIM_EF_CPHS_DYNAMIC2FLAG:
+ case SIM_EF_CPHS_CUSTOMER_SERVICE_PROFILE:
+ case SIM_EF_CPHS_CUSTOMER_SERVICE_PROFILE_LINE2:
+ _get_file_data(o, ur, ef, 0, file_meta->data_size);
+ break;
+
+ case SIM_EF_CPHS_CPHS_INFO:
+ if (rt == SIM_ACCESS_SUCCESS) {
+ tcore_sim_set_cphs_status(o, TRUE);
+ if (!tcore_user_request_ref_communicator(ur)) {
+ dbg("internal CPHS INFO request before sim status update");
+ _sim_status_update(o, SIM_STATUS_INIT_COMPLETED);
+ } else {
+ dbg("external CPHS INFO request");
+ _get_file_data(o, ur, ef, 0, file_meta->data_size);
+ }
+ } else {
+ tcore_sim_set_cphs_status(o, FALSE);
+ if (!tcore_user_request_ref_communicator(ur)) {
+ dbg("internal CPHS INFO request before sim status update");
+ _sim_status_update(o, SIM_STATUS_INIT_COMPLETED);
+ } else {
+ dbg("external CPHS INFO request");
+ tcore_user_request_send_response(ur, _find_resp_command(ur),
+ sizeof(struct tresp_sim_read), &resp);
+ }
+ }
+ break;
+
+
+ case SIM_EF_USIM_CFIS:
+ if (file_meta->rec_count > SIM_CF_RECORD_CNT_MAX) {
+ file_meta->rec_count = SIM_CF_RECORD_CNT_MAX;
+ }
+ file_meta->current_index++;
+ _get_file_record(o, ur, ef, file_meta->current_index, file_meta->rec_length);
+ break;
+
+ case SIM_EF_OPL:
+ case SIM_EF_PNN:
+ case SIM_EF_USIM_MWIS:
+ case SIM_EF_USIM_MBI:
+ case SIM_EF_MBDN:
+ case SIM_EF_CPHS_MAILBOX_NUMBERS:
+ case SIM_EF_CPHS_INFORMATION_NUMBERS:
+ file_meta->current_index++;
+ _get_file_record(o, ur, ef, file_meta->current_index, file_meta->rec_length);
+ break;
+
+ default:
+ dbg("error - File id for get file info [0x%x]", ef);
+ break;
+ }
+ return;
+}
+
+static void _next_from_get_file_data(CoreObject *o, UserRequest *ur, enum tel_sim_access_result rt, int decode_ret)
+{
+ struct s_sim_property *file_meta = NULL;
+ dbg("Entry");
+
+ file_meta = (struct s_sim_property *) tcore_user_request_ref_metainfo(ur, NULL);
+ dbg("[SIM]EF[0x%x] read rt[%d] Decode rt[%d]", file_meta->file_id, rt, decode_ret);
+ switch (file_meta->file_id) {
+ case SIM_EF_ELP:
+ case SIM_EF_USIM_PL:
+ case SIM_EF_LP:
+ case SIM_EF_USIM_LI:
+ if (decode_ret == TRUE) {
+ if (file_meta->file_id == SIM_EF_LP || file_meta->file_id == SIM_EF_USIM_LI) {
+/* po->language_file = SIM_EF_LP;*/
+ } else if (file_meta->file_id == SIM_EF_ELP || file_meta->file_id == SIM_EF_USIM_PL) {
+/* po->language_file = SIM_EF_ELP;*/
+ }
+ tcore_user_request_send_response(ur, _find_resp_command(ur), sizeof(struct tresp_sim_read), &file_meta->files);
+ } else {
+ /* 2G */
+ /* The ME requests the Extended Language Preference. The ME only requests the Language Preference (EFLP) if at least one of the following conditions holds:
+ - EFELP is not available;
+ - EFELP does not contain an entry corresponding to a language specified in ISO 639[30];
+ - the ME does not support any of the languages in EFELP.
+ */
+ /* 3G */
+ /* The ME only requests the Language Preference (EFPL) if at least one of the following conditions holds:
+ - if the EFLI has the value 'FFFF' in its highest priority position
+ - if the ME does not support any of the language codes indicated in EFLI , or if EFLI is not present
+ */
+ if (tcore_sim_get_type(o) == SIM_TYPE_GSM) {
+ if (file_meta->file_id == SIM_EF_LP) {
+ tcore_user_request_send_response(ur, _find_resp_command(ur), sizeof(struct tresp_sim_read), &file_meta->files);
+ } else {
+ _get_file_info(o, ur, SIM_EF_LP);
+ }
+ } else if (tcore_sim_get_type(o) == SIM_TYPE_USIM) {
+ if (file_meta->file_id == SIM_EF_LP || file_meta->file_id == SIM_EF_USIM_LI) {
+ _get_file_info(o, ur, SIM_EF_ELP);
+ } else {
+ tcore_user_request_send_response(ur, _find_resp_command(ur), sizeof(struct tresp_sim_read), &file_meta->files);
+ }
+ }
+ }
+ break;
+
+ case SIM_EF_ECC:
+ if (tcore_sim_get_type(o) == SIM_TYPE_USIM) {
+ if (file_meta->current_index == file_meta->rec_count) {
+ tcore_user_request_send_response(ur, _find_resp_command(ur), sizeof(struct tresp_sim_read), &file_meta->files);
+ } else {
+ file_meta->current_index++;
+ _get_file_record(o, ur, file_meta->file_id, file_meta->current_index, file_meta->rec_length);
+ }
+ } else if (tcore_sim_get_type(o) == SIM_TYPE_GSM) {
+ tcore_user_request_send_response(ur, _find_resp_command(ur), sizeof(struct tresp_sim_read), &file_meta->files);
+ } else {
+ dbg("[SIM DATA]Invalid CardType[%d] Unable to handle", tcore_sim_get_type(o));
+ }
+ break;
+
+ case SIM_EF_IMSI:
+ ur = tcore_user_request_new(NULL, NULL); // this is for using ur metainfo set/ref functionality.
+ _get_file_info(o, ur, SIM_EF_CPHS_CPHS_INFO);
+ break;
+
+ case SIM_EF_MSISDN:
+ if (file_meta->current_index == file_meta->rec_count) {
+ tcore_user_request_send_response(ur, _find_resp_command(ur), sizeof(struct tresp_sim_read), &file_meta->files);
+ } else {
+ file_meta->current_index++;
+ _get_file_record(o, ur, file_meta->file_id, file_meta->current_index, file_meta->rec_length);
+ }
+ break;
+
+ case SIM_EF_OPL:
+ if (file_meta->current_index == file_meta->rec_count) {
+ tcore_user_request_send_response(ur, _find_resp_command(ur), sizeof(struct tresp_sim_read), &file_meta->files);
+ } else {
+ file_meta->current_index++;
+ _get_file_record(o, ur, file_meta->file_id, file_meta->current_index, file_meta->rec_length);
+ }
+ break;
+
+ case SIM_EF_PNN:
+ if (file_meta->current_index == file_meta->rec_count) {
+ tcore_user_request_send_response(ur, _find_resp_command(ur), sizeof(struct tresp_sim_read), &file_meta->files);
+ } else {
+ file_meta->current_index++;
+ _get_file_record(o, ur, file_meta->file_id, file_meta->current_index, file_meta->rec_length);
+ }
+ break;
+
+ case SIM_EF_USIM_CFIS:
+ case SIM_EF_USIM_MWIS:
+ case SIM_EF_USIM_MBI:
+ case SIM_EF_MBDN:
+ case SIM_EF_CPHS_MAILBOX_NUMBERS:
+ case SIM_EF_CPHS_INFORMATION_NUMBERS:
+ if (file_meta->current_index == file_meta->rec_count) {
+ tcore_user_request_send_response(ur, _find_resp_command(ur), sizeof(struct tresp_sim_read), &file_meta->files);
+ } else {
+ file_meta->current_index++;
+ _get_file_record(o, ur, file_meta->file_id, file_meta->current_index, file_meta->rec_length);
+ }
+ break;
+
+ case SIM_EF_CPHS_OPERATOR_NAME_STRING:
+ file_meta->files.result = rt;
+ if (decode_ret == TRUE && rt == SIM_ACCESS_SUCCESS) {
+ memcpy(file_meta->files.data.cphs_net.full_name, file_meta->files.data.cphs_net.full_name, strlen((char *) file_meta->files.data.cphs_net.full_name));
+ }
+ _get_file_info(o, ur, SIM_EF_CPHS_OPERATOR_NAME_SHORT_FORM_STRING);
+ break;
+
+ case SIM_EF_CPHS_OPERATOR_NAME_SHORT_FORM_STRING:
+ if (file_meta->files.result == SIM_ACCESS_SUCCESS || file_meta->files.result == SIM_ACCESS_SUCCESS) {
+ file_meta->files.result = SIM_ACCESS_SUCCESS;
+ }
+ if (strlen((char *) file_meta->files.data.cphs_net.full_name)) {
+ memcpy(&file_meta->files.data.cphs_net.full_name, &file_meta->files.data.cphs_net.full_name, strlen((char *) file_meta->files.data.cphs_net.full_name));
+ }
+ tcore_user_request_send_response(ur, _find_resp_command(ur), sizeof(struct tresp_sim_read), &file_meta->files);
+ break;
+
+ case SIM_EF_ICCID:
+ case SIM_EF_SST:
+ case SIM_EF_SPN:
+ case SIM_EF_SPDI:
+ case SIM_EF_OPLMN_ACT:
+ case SIM_EF_CPHS_CPHS_INFO:
+ case SIM_EF_CPHS_CALL_FORWARD_FLAGS:
+ case SIM_EF_CPHS_VOICE_MSG_WAITING:
+ case SIM_EF_CPHS_DYNAMICFLAGS:
+ case SIM_EF_CPHS_DYNAMIC2FLAG:
+ case SIM_EF_CPHS_CUSTOMER_SERVICE_PROFILE:
+ case SIM_EF_CPHS_CUSTOMER_SERVICE_PROFILE_LINE2:
+ tcore_user_request_send_response(ur, _find_resp_command(ur), sizeof(struct tresp_sim_read), &file_meta->files);
+ break;
+
+ default:
+ dbg("File id not handled [0x%x]", file_meta->file_id);
+ break;
+ }
+}
+
+static void _sim_status_update(CoreObject *o, enum tel_sim_status sim_status)
+{
+ struct tnoti_sim_status noti_data = {0, };
+
+ dbg("tcore_sim_set_status and send noti w/ [%d]", sim_status);
+ tcore_sim_set_status(o, sim_status);
+ noti_data.sim_status = sim_status;
+ tcore_server_send_notification(tcore_plugin_ref_server(tcore_object_ref_plugin(o)), o, TNOTI_SIM_STATUS,
+ sizeof(struct tnoti_sim_status), ¬i_data);
+}
+
+static void _response_get_sim_type(TcorePending *p, int data_len, const void *data, void *user_data)
+{
+ const TcoreATResponse *resp = data;
+ UserRequest *ur = NULL;
+ CoreObject *co_sim = NULL;
+ struct s_sim_property *sp = NULL;
+ GSList *tokens = NULL;
+ enum tel_sim_type sim_type = SIM_TYPE_UNKNOWN;
+ const char *line;
+ int state;
+
+ dbg(" Function entry ");
+
+ co_sim = tcore_pending_ref_core_object(p);
+ sp = tcore_sim_ref_userdata(co_sim);
+ ur = tcore_pending_ref_user_request(p);
+
+ if (resp->success > 0) {
+ dbg("RESPONSE OK");
+ if (resp->lines) {
+ line = (const char *) resp->lines->data;
+ tokens = tcore_at_tok_new(line);
+ if (g_slist_length(tokens) != 1) {
+ msg("invalid message");
+ tcore_at_tok_free(tokens);
+ return;
+ }
+ }
+ state = atoi(g_slist_nth_data(tokens, 0));
+ dbg("SIM Type is %d", state);
+
+ if (state == 0) {
+ sim_type = SIM_TYPE_GSM;
+ } else if (state == 1) {
+ sim_type = SIM_TYPE_USIM;
+ } else {
+ sim_type = SIM_TYPE_UNKNOWN;
+ }
+ } else {
+ dbg("RESPONSE NOK");
+ sim_type = SIM_TYPE_UNKNOWN;
+ }
+
+ tcore_sim_set_type(co_sim, sim_type);
+ _sim_status_update(co_sim, sp->first_recv_status);
+ tcore_at_tok_free(tokens);
+ dbg(" Function exit");
+}
+
+static void _response_get_file_info(TcorePending *p, int data_len, const void *data, void *user_data)
+{
+ const TcoreATResponse *resp = data;
+ UserRequest *ur = NULL;
+ CoreObject *co_sim = NULL;
+ struct s_sim_property *file_meta = NULL;
+ GSList *tokens = NULL;
+ enum tel_sim_access_result rt;
+ const char *line = NULL;
+ int sw1 = 0;
+ int sw2 = 0;
+
+ dbg(" Function entry ");
+
+ co_sim = tcore_pending_ref_core_object(p);
+ ur = tcore_pending_ref_user_request(p);
+ file_meta = (struct s_sim_property *) tcore_user_request_ref_metainfo(ur, NULL);
+
+ if (resp->success > 0) {
+ dbg("RESPONSE OK");
+ if (resp->lines) {
+ line = (const char *) resp->lines->data;
+ tokens = tcore_at_tok_new(line);
+ if (g_slist_length(tokens) < 2) {
+ err("invalid message");
+ tcore_at_tok_free(tokens);
+ return;
+ }
+ }
+ sw1 = atoi(g_slist_nth_data(tokens, 0));
+ sw2 = atoi(g_slist_nth_data(tokens, 1));
+
+ /*1. SIM access success case*/
+ if ((sw1 == 0x90 && sw2 == 0x00) || sw1 == 0x91) {
+ unsigned char tag_len = 0; /* 1 or 2 bytes ??? */
+ unsigned short record_len = 0;
+ char num_of_records = 0;
+ unsigned char file_id_len = 0;
+ unsigned short file_id = 0;
+ unsigned short file_size = 0;
+ unsigned short file_type = 0;
+ unsigned short arr_file_id = 0;
+ int arr_file_id_rec_num = 0;
+
+ /* handling only last 3 bits */
+ unsigned char file_type_tag = 0x07;
+ unsigned char *ptr_data;
+
+ char *hexData;
+ char *tmp;
+ char *recordData = NULL;
+ hexData = g_slist_nth_data(tokens, 2);
+ dbg("hexData: %s", hexData);
+ dbg("hexData: %s", hexData + 1);
+
tmp = util_removeQuotes(hexData);
- recordData = util_hexStringToBytes(tmp);\r
- util_hex_dump(" ", strlen(hexData)/2, recordData);
- free(tmp);\r
- \r
- ptr_data = (unsigned char *)recordData;\r
- if (tcore_sim_get_type(co_sim) == SIM_TYPE_USIM)\r
- {\r
- /*\r
- ETSI TS 102 221 v7.9.0\r
- - Response Data\r
- '62' FCP template tag\r
- - Response for an EF\r
- '82' M File Descriptor\r
- '83' M File Identifier\r
- 'A5' O Proprietary information\r
- '8A' M Life Cycle Status Integer\r
- '8B', '8C' or 'AB' C1 Security attributes\r
- '80' M File size\r
- '81' O Total file size\r
- '88' O Short File Identifier (SFI)\r
- */\r
-\r
- /* rsim.res_len has complete data length received */\r
-\r
- /* FCP template tag - File Control Parameters tag*/\r
- if (*ptr_data == 0x62)\r
- {\r
- /* parse complete FCP tag*/\r
- /* increment to next byte */\r
- ptr_data++;\r
- tag_len = *ptr_data++;\r
- dbg("tag_len: %02x", tag_len);\r
- /* FCP file descriptor - file type, accessibility, DF, ADF etc*/\r
- if (*ptr_data == 0x82)\r
- {\r
- /* increment to next byte */\r
- ptr_data++;\r
- /* 2 or 5 value*/\r
- ptr_data++;\r
- /* unsigned char file_desc_len = *ptr_data++;*/\r
- /* dbg("file descriptor length: [%d]", file_desc_len);*/\r
- /* TBD: currently capture only file type : ignore sharable, non sharable, working, internal etc*/\r
- /* consider only last 3 bits*/\r
- dbg("file_type_tag: %02x", file_type_tag);\r
- file_type_tag = file_type_tag & (*ptr_data);\r
- dbg("file_type_tag: %02x", file_type_tag);\r
-\r
- switch (file_type_tag)\r
- {\r
- /* increment to next byte */\r
- //ptr_data++;\r
- case 0x1:\r
- dbg("Getting FileType: [Transparent file type]");\r
- file_type = SIM_FTYPE_TRANSPARENT;\r
-\r
- /* increment to next byte */\r
- ptr_data++;\r
- /* increment to next byte */\r
- ptr_data++;\r
- break;\r
-\r
- case 0x2:\r
- dbg("Getting FileType: [Linear fixed file type]");\r
- /* increment to next byte */\r
- ptr_data++;\r
- /* data coding byte - value 21 */\r
- ptr_data++;\r
- /* 2bytes */\r
- memcpy(&record_len, ptr_data, 2);\r
- /* swap bytes */\r
- SWAPBYTES16(record_len);\r
- ptr_data = ptr_data + 2;\r
- num_of_records = *ptr_data++;\r
- /* Data lossy conversation from enum (int) to unsigned char */\r
- file_type = SIM_FTYPE_LINEAR_FIXED;\r
- break;\r
-\r
- case 0x6:\r
- dbg(" Cyclic fixed file type");\r
- /* increment to next byte */\r
- ptr_data++;\r
- /* data coding byte - value 21 */\r
- ptr_data++;\r
- /* 2bytes */\r
- memcpy(&record_len, ptr_data, 2);\r
- /* swap bytes */\r
- SWAPBYTES16(record_len);\r
- ptr_data = ptr_data + 2;\r
- num_of_records = *ptr_data++;\r
- file_type = SIM_FTYPE_CYCLIC;\r
- break;\r
-\r
- default:\r
- dbg("not handled file type [0x%x]", *ptr_data);\r
- break;\r
- }\r
- } else\r
- {\r
- dbg("INVALID FCP received - DEbug!");\r
- return;\r
- }\r
-\r
- /*File identifier - file id?? */ // 0x84,0x85,0x86 etc are currently ignored and not handled\r
- if (*ptr_data == 0x83)\r
- {\r
- /* increment to next byte */\r
- ptr_data++;\r
- file_id_len = *ptr_data++;\r
- dbg("file_id_len: %02x", file_id_len);\r
-\r
- memcpy(&file_id, ptr_data, file_id_len);\r
- dbg("file_id: %x", file_id);\r
-\r
- /* swap bytes */\r
- SWAPBYTES16(file_id);\r
- dbg("file_id: %x", file_id);\r
-\r
- ptr_data = ptr_data + 2;\r
- dbg("Getting FileID=[0x%x]", file_id);\r
- } else\r
- {\r
- dbg("INVALID FCP received - DEbug!");\r
- free(recordData);\r
- return;\r
- }\r
-\r
- /* proprietary information */\r
- if (*ptr_data == 0xA5)\r
- {\r
- unsigned short prop_len;\r
- /* increment to next byte */\r
- ptr_data++;\r
-\r
- /* length */\r
- prop_len = *ptr_data;\r
- dbg("prop_len: %02x", prop_len);\r
-\r
- /* skip data */\r
- ptr_data = ptr_data + prop_len + 1;\r
- } else\r
- {\r
- dbg("INVALID FCP received - DEbug!");\r
- }\r
-\r
- /* life cycle status integer [8A][length:0x01][status]*/\r
- /*\r
- status info b8~b1\r
- 00000000 : No information given\r
- 00000001 : creation state\r
- 00000011 : initialization state\r
- 000001-1 : operation state -activated\r
- 000001-0 : operation state -deactivated\r
- 000011-- : Termination state\r
- b8~b5 !=0, b4~b1=X : Proprietary\r
- Any other value : RFU\r
- */\r
- if (*ptr_data == 0x8A)\r
- {\r
- /* increment to next byte */\r
- ptr_data++;\r
- /* length - value 1 */\r
- ptr_data++;\r
-\r
- switch (*ptr_data) {\r
- case 0x04:\r
- case 0x06:\r
- dbg("<RX> operation state -deactivated");\r
- ptr_data++;\r
- break;\r
- case 0x05:\r
- case 0x07:\r
- dbg("<RX> operation state -activated");\r
- ptr_data++;\r
- break;\r
- default:\r
- dbg("<RX> DEBUG! LIFE CYCLE STATUS =[0x%x]",*ptr_data);\r
- ptr_data++;\r
- break;\r
- }\r
- }\r
-\r
- /* related to security attributes : currently not handled*/\r
- if (*ptr_data == 0x86 || *ptr_data == 0x8B || *ptr_data == 0x8C || *ptr_data == 0xAB)\r
- {\r
- /* increment to next byte */\r
- ptr_data++;\r
- /* if tag length is 3 */\r
- if (*ptr_data == 0x03)\r
- {\r
- /* increment to next byte */\r
- ptr_data++;\r
- /* EFARR file id */\r
- memcpy(&arr_file_id, ptr_data, 2);\r
- /* swap byes */\r
- SWAPBYTES16(arr_file_id);\r
- ptr_data = ptr_data + 2;\r
- arr_file_id_rec_num = *ptr_data++;\r
- } else\r
- {\r
- /* if tag length is not 3 */\r
- /* ignoring bytes */\r
- // ptr_data = ptr_data + 4;\r
- dbg("Useless security attributes, so jump to next tag");\r
- ptr_data = ptr_data + (*ptr_data + 1);\r
- }\r
- } else\r
- {\r
- dbg("INVALID FCP received[0x%x] - DEbug!", *ptr_data);\r
- free(recordData);\r
- return;\r
- }\r
-\r
- dbg("Current ptr_data value is [%x]", *ptr_data);\r
-\r
- /* file size excluding structural info*/\r
- if (*ptr_data == 0x80)\r
- {\r
- /* for EF file size is body of file and for Linear or cyclic it is\r
- * number of recXsizeof(one record)\r
- */\r
- /* increment to next byte */\r
- ptr_data++;\r
- /* length is 1 byte - value is 2 bytes or more */\r
- ptr_data++;\r
- memcpy(&file_size, ptr_data, 2);\r
- /* swap bytes */\r
- SWAPBYTES16(file_size);\r
- ptr_data = ptr_data + 2;\r
- } else\r
- {\r
- dbg("INVALID FCP received - DEbug!");\r
- free(recordData);\r
- return;\r
- }\r
-\r
- /* total file size including structural info*/\r
- if (*ptr_data == 0x81)\r
- {\r
- int len;\r
- /* increment to next byte */\r
- ptr_data++;\r
- /* length */\r
- len = *ptr_data;\r
- /* ignored bytes */\r
- ptr_data = ptr_data + 3;\r
- } else\r
- {\r
- dbg("INVALID FCP received - DEbug!");\r
- /* 0x81 is optional tag?? check out! so do not return -1 from here! */\r
- /* return -1; */\r
- }\r
- /*short file identifier ignored*/\r
- if (*ptr_data == 0x88)\r
- {\r
- dbg("0x88: Do Nothing");\r
- /*DO NOTHING*/\r
- }\r
- } else\r
- {\r
- dbg("INVALID FCP received - DEbug!");\r
- free(recordData);\r
- return;\r
- }\r
- } else if (tcore_sim_get_type(co_sim) == SIM_TYPE_GSM)\r
- {\r
- unsigned char gsm_specific_file_data_len = 0;\r
- /* ignore RFU byte1 and byte2 */\r
- ptr_data++;\r
- ptr_data++;\r
- /* file size */\r
- //file_size = p_info->response_len;\r
- memcpy(&file_size, ptr_data, 2);\r
- /* swap bytes */\r
- SWAPBYTES16(file_size);\r
- /* parsed file size */\r
- ptr_data = ptr_data + 2;\r
- /* file id */\r
- memcpy(&file_id, ptr_data, 2);\r
- SWAPBYTES16(file_id);\r
- dbg(" FILE id --> [%x]", file_id);\r
- ptr_data = ptr_data + 2;\r
- /* save file type - transparent, linear fixed or cyclic */\r
- file_type_tag = (*(ptr_data + 7));\r
-\r
- switch (*ptr_data)\r
- {\r
- case 0x0:\r
- /* RFU file type */\r
- dbg(" RFU file type- not handled - Debug!");\r
- break;\r
- case 0x1:\r
- /* MF file type */\r
- dbg(" MF file type - not handled - Debug!");\r
- break;\r
- case 0x2:\r
- /* DF file type */\r
- dbg(" DF file type - not handled - Debug!");\r
- break;\r
- case 0x4:\r
- /* EF file type */\r
- dbg(" EF file type [%d] ", file_type_tag);\r
- /* increment to next byte */\r
- ptr_data++;\r
-\r
- if (file_type_tag == 0x00 || file_type_tag == 0x01)\r
- {\r
- /* increament to next byte as this byte is RFU */\r
- ptr_data++;\r
- file_type =\r
- (file_type_tag == 0x00) ? SIM_FTYPE_TRANSPARENT : SIM_FTYPE_LINEAR_FIXED;\r
- } else\r
- {\r
- /* increment to next byte */\r
- ptr_data++;\r
- /* For a cyclic EF all bits except bit 7 are RFU; b7=1 indicates that */\r
- /* the INCREASE command is allowed on the selected cyclic file. */\r
- file_type = SIM_FTYPE_CYCLIC;\r
- }\r
- /* bytes 9 to 11 give SIM file access conditions */\r
- ptr_data++;\r
- /* byte 10 has one nibble that is RF U and another for INCREASE which is not used currently */\r
- ptr_data++;\r
- /* byte 11 is invalidate and rehabilate nibbles */\r
- ptr_data++;\r
- /* byte 12 - file status */\r
- ptr_data++;\r
- /* byte 13 - GSM specific data */\r
- gsm_specific_file_data_len = *ptr_data;\r
- ptr_data++;\r
- /* byte 14 - structure of EF - transparent or linear or cyclic , already saved above */\r
- ptr_data++;\r
- /* byte 15 - length of record for linear and cyclic , for transparent it is set to 0x00. */\r
- record_len = *ptr_data;\r
- dbg("record length[%d], file size[%d]", record_len, file_size);\r
-\r
- if (record_len != 0)\r
- num_of_records = (file_size / record_len);\r
-\r
- dbg("Number of records [%d]", num_of_records);\r
- break;\r
-\r
- default:\r
- dbg(" not handled file type");\r
- break;\r
- }\r
- }\r
- else\r
- {\r
- dbg(" Card Type - UNKNOWN [%d]", tcore_sim_get_type(co_sim));\r
- }\r
-\r
- dbg("req ef[0x%x] resp ef[0x%x] size[%ld] Type[0x%x] NumOfRecords[%ld] RecordLen[%ld]",\r
- file_meta->file_id, file_id, file_size, file_type, num_of_records, record_len);\r
-\r
- file_meta->file_type = file_type;\r
- file_meta->data_size = file_size;\r
- file_meta->rec_length = record_len;\r
- file_meta->rec_count = num_of_records;\r
- file_meta->current_index = 0; //reset for new record type EF\r
- rt = SIM_ACCESS_SUCCESS;\r
- free(recordData);\r
- }\r
- else\r
- {\r
- /*2. SIM access fail case*/\r
- dbg("error to get ef[0x%x]", file_meta->file_id);\r
- dbg("error to get ef[0x%x] (file_meta->file_id) ", file_meta->file_id);\r
- rt = _decode_status_word(sw1, sw2);\r
- }\r
- ur = tcore_user_request_ref(ur);\r
- \r
- dbg("Calling _next_from_get_file_info");\r
- _next_from_get_file_info(co_sim, ur, file_meta->file_id, rt);\r
- tcore_at_tok_free(tokens);\r
- }\r
- else\r
- {\r
- dbg("RESPONSE NOK");\r
- dbg("error to get ef[0x%x]", file_meta->file_id);\r
- dbg("error to get ef[0x%x] (file_meta->file_id) ", file_meta->file_id);\r
- rt = SIM_ACCESS_FAILED;\r
-\r
- ur = tcore_user_request_ref(ur);\r
- _next_from_get_file_info(co_sim, ur, file_meta->file_id, rt);\r
- }\r
- dbg(" Function exit");\r
-}\r
-\r
-static void _response_get_file_data(TcorePending *p, int data_len, const void *data, void *user_data)\r
-{\r
- const TcoreATResponse *resp = data;\r
- UserRequest *ur = NULL;\r
- CoreObject *co_sim = NULL;\r
- struct s_sim_property *file_meta = NULL;\r
- GSList *tokens=NULL;\r
- enum tel_sim_access_result rt;\r
- struct tel_sim_imsi imsi;\r
- struct tel_sim_ecc ecc;\r
- struct tel_sim_msisdn msisdn;\r
- struct tel_sim_opl opl;\r
- struct tel_sim_pnn pnn;\r
- gboolean dr = FALSE;\r
- const char *line = NULL;\r
- char *res = NULL;\r
- char *tmp = NULL;\r
- int res_len;\r
- int sw1 = 0;\r
- int sw2 = 0;\r
-\r
- dbg(" Function entry ");\r
-\r
- co_sim = tcore_pending_ref_core_object(p);\r
- ur = tcore_pending_ref_user_request(p);\r
- file_meta = (struct s_sim_property*)tcore_user_request_ref_metainfo(ur, NULL);\r
-\r
- if(resp->success > 0)\r
- {\r
- dbg("RESPONSE OK");\r
- if(resp->lines)\r
- {\r
- line = (const char*)resp->lines->data;\r
- tokens = tcore_at_tok_new(line);\r
- if (g_slist_length(tokens) != 3)\r
- {\r
- msg("invalid message");\r
- tcore_at_tok_free(tokens);\r
- return;\r
- }\r
- }\r
- sw1 = atoi(g_slist_nth_data(tokens, 0));\r
- sw2 = atoi(g_slist_nth_data(tokens, 1));\r
- res = g_slist_nth_data(tokens, 2);\r
-\r
- tmp = util_removeQuotes(res);
- res = util_hexStringToBytes(tmp);\r
- res_len = strlen((const char*)res);\r
- dbg("res: %s res_len: %d", res, res_len);\r
-\r
- if((sw1 == 0x90 && sw2 == 0x00) || sw1 == 0x91)\r
- {\r
- rt = SIM_ACCESS_SUCCESS;\r
- file_meta->files.result = rt;\r
- dbg("file_meta->file_id : %x", file_meta->file_id);\r
-\r
- switch (file_meta->file_id)\r
- {\r
- case SIM_EF_IMSI:\r
- {\r
- dbg("res: %s", res);\r
- dr = tcore_sim_decode_imsi(&imsi, (unsigned char*)res, res_len);\r
- if (dr == FALSE)\r
- {\r
- dbg("imsi decoding failed");\r
- } else\r
- {\r
- _sim_check_identity(co_sim,&imsi);\r
- tcore_sim_set_imsi(co_sim,&imsi);\r
- }\r
- break;\r
- }\r
- case SIM_EF_ICCID:\r
- dr = tcore_sim_decode_iccid(&file_meta->files.data.iccid, (unsigned char*)res, res_len);\r
- break;\r
-\r
- case SIM_EF_ELP:/* 2G EF - 2 bytes decoding*/\r
- case SIM_EF_USIM_LI: /* 3G EF - 2 bytes decoding*/\r
- case SIM_EF_USIM_PL:/* 3G EF - same as EFELP, so 2 byte decoding*/\r
- case SIM_EF_LP:/* 1 byte encoding*/\r
- if (tcore_sim_get_type(co_sim) == SIM_TYPE_GSM && file_meta->file_id == SIM_EF_LP)\r
- {\r
- /*2G LP(0x6F05) has 1 byte for each language*/\r
- dr = tcore_sim_decode_lp(&file_meta->files.data.language, (unsigned char*)res, res_len);\r
- } else\r
- {\r
- /*3G LI(0x6F05)/PL(0x2F05), 2G ELP(0x2F05) has 2 bytes for each language*/\r
- dr = tcore_sim_decode_li(file_meta->file_id, &file_meta->files.data.language, (unsigned char*)res, res_len);\r
- }\r
- break;\r
- case SIM_EF_SPN:\r
- dr = tcore_sim_decode_spn(&file_meta->files.data.spn, (unsigned char*)res, res_len);\r
- break;\r
- case SIM_EF_SPDI:\r
- dr = tcore_sim_decode_spdi(&file_meta->files.data.spdi, (unsigned char*)res, res_len);\r
- break;\r
- case SIM_EF_ECC:\r
- if(tcore_sim_get_type(co_sim) == SIM_TYPE_GSM)\r
- {\r
- dr = tcore_sim_decode_ecc(&file_meta->files.data.ecc, (unsigned char*)res, res_len);\r
- } else if(tcore_sim_get_type(co_sim) == SIM_TYPE_USIM)\r
- {\r
- dbg("decode w/ index [%d]",file_meta->current_index);\r
- memset(&ecc, 0x00, sizeof(struct tel_sim_ecc));\r
- dr = tcore_sim_decode_uecc(&ecc, (unsigned char*)res, res_len);\r
- if (dr == TRUE)\r
- {\r
- memcpy( &file_meta->files.data.ecc.ecc[file_meta->files.data.ecc.ecc_count], &ecc, sizeof(struct tel_sim_ecc) );\r
- file_meta->files.data.ecc.ecc_count++;\r
- }\r
- } else\r
- {\r
- dbg("err not handled tcore_sim_get_type(o)[%d] in here",tcore_sim_get_type(co_sim));\r
- }\r
- break;\r
- case SIM_EF_MSISDN :\r
- dbg("decode w/ index [%d]",file_meta->current_index);\r
- memset(&msisdn, 0x00, sizeof(struct tel_sim_msisdn));\r
- dr = tcore_sim_decode_msisdn(&msisdn, (unsigned char*)res, res_len);\r
- if (dr == TRUE)\r
- {\r
- memcpy( &file_meta->files.data.msisdn_list.msisdn[file_meta->files.data.msisdn_list.count], &msisdn, sizeof(struct tel_sim_msisdn) );\r
- file_meta->files.data.msisdn_list.count++;\r
- }\r
- break;\r
- case SIM_EF_OPL:\r
- dbg("decode w/ index [%d]",file_meta->current_index);\r
- memset(&opl, 0x00, sizeof(struct tel_sim_opl));\r
- dr = tcore_sim_decode_opl(&opl, (unsigned char*)res, res_len);\r
- if (dr == TRUE)\r
- {\r
- memcpy( &file_meta->files.data.opl.opl[file_meta->files.data.opl.opl_count], &opl, sizeof(struct tel_sim_opl) );\r
- file_meta->files.data.opl.opl_count++;\r
- }\r
- break;\r
- case SIM_EF_PNN:\r
- dbg("decode w/ index [%d]",file_meta->current_index);\r
- memset(&pnn, 0x00, sizeof(struct tel_sim_pnn));\r
- dr = tcore_sim_decode_pnn(&pnn, (unsigned char*)res, res_len);\r
- if (dr == TRUE)\r
- {\r
- memcpy( &file_meta->files.data.pnn.pnn[file_meta->files.data.pnn.pnn_count], &opl, sizeof(struct tel_sim_pnn) );\r
- file_meta->files.data.pnn.pnn_count++;\r
- }\r
- break;\r
- case SIM_EF_OPLMN_ACT:\r
- dr = tcore_sim_decode_oplmnwact(&file_meta->files.data.opwa, (unsigned char*)res, res_len);\r
- break;\r
- case SIM_EF_CPHS_CALL_FORWARD_FLAGS:\r
- dr = tcore_sim_decode_cff(&file_meta->files.data.cf, (unsigned char*)res, res_len);\r
- break;\r
- case SIM_EF_CPHS_VOICE_MSG_WAITING:\r
- dr = tcore_sim_decode_vmwf(&file_meta->files.data.mw.mw_data_u.cphs_mw, (unsigned char*)res, res_len);\r
- break;\r
- case SIM_EF_USIM_MWIS:\r
- dr = tcore_sim_decode_mwis(&file_meta->files.data.mw.mw_data_u.mw, (unsigned char*)res, res_len);\r
- break;\r
- case SIM_EF_USIM_CFIS:\r
- dr = tcore_sim_decode_cfis(&file_meta->files.data.cf, (unsigned char*)res, res_len);\r
- break;\r
- case SIM_EF_CPHS_SERVICE_STRING_TABLE:\r
- dbg(" not handled -SIM_EF_CPHS_SERVICE_STRING_TABLE ");\r
- break;\r
- case SIM_EF_CPHS_OPERATOR_NAME_STRING:\r
- dr = tcore_sim_decode_ons((unsigned char*)&file_meta->files.data.cphs_net.full_name, (unsigned char*)res, res_len);\r
- dbg(" file_meta->files.result[%d],file_meta->files.data.cphs_net.full_name[%s]", file_meta->files.result, file_meta->files.data.cphs_net.full_name);\r
- break;\r
- case SIM_EF_CPHS_CPHS_INFO:\r
- dr = tcore_sim_decode_cphs_info(&file_meta->files.data.cphs, (unsigned char*)res, res_len);\r
- break;\r
- case SIM_EF_CPHS_OPERATOR_NAME_SHORT_FORM_STRING:\r
- dr = tcore_sim_decode_short_ons((unsigned char*)&file_meta->files.data.cphs_net.short_name, (unsigned char*)res, res_len);\r
- break;\r
- default:\r
- dbg("File Decoding Failed - not handled File[0x%x]", file_meta->file_id);\r
- dr = 0;\r
- break;\r
- }\r
- }\r
- else\r
- {\r
- rt = _decode_status_word(sw1, sw2);\r
- file_meta->files.result = rt;\r
- }\r
- free(tmp);\r
- tcore_at_tok_free(tokens);\r
- }\r
- else\r
- {\r
- dbg("RESPONSE NOK");\r
- dbg("error to get ef[0x%x]", file_meta->file_id);\r
- rt = SIM_ACCESS_FAILED;\r
- }\r
- ur = tcore_user_request_ref(ur);\r
- \r
- dbg("Calling _next_from_get_file_data");\r
- _next_from_get_file_data(tcore_pending_ref_core_object(p), ur, rt, dr);\r
- dbg(" Function exit");\r
-}\r
-\r
-static void _on_response_get_retry_count(TcorePending *p, int data_len, const void *data, void *user_data)\r
-{\r
- const TcoreATResponse *resp = data;\r
- UserRequest *ur = NULL;\r
- CoreObject *co_sim = NULL;\r
- struct s_sim_property *sp = NULL;\r
- GSList *tokens=NULL;\r
- const char *line = NULL;\r
- struct tresp_sim_verify_pins v_pin = {0,};\r
- struct tresp_sim_verify_puks v_puk = {0,};\r
- struct tresp_sim_change_pins change_pin = {0,};\r
- struct tresp_sim_disable_facility dis_facility = {0,};\r
- struct tresp_sim_enable_facility en_facility = {0,};\r
- int lock_type = 0;\r
- int attempts_left = 0;\r
- int time_penalty = 0;\r
-\r
- dbg(" Function entry ");\r
-\r
- co_sim = tcore_pending_ref_core_object(p);\r
- sp = tcore_sim_ref_userdata(co_sim);\r
- ur = tcore_pending_ref_user_request(p);\r
-\r
- if(resp->success > 0)\r
- {\r
- dbg("RESPONSE OK");\r
- if(resp->lines)\r
- {\r
- line = (const char*)resp->lines->data;\r
- tokens = tcore_at_tok_new(line);\r
- if (g_slist_length(tokens) < 3)\r
- {\r
- msg("invalid message");\r
- tcore_at_tok_free(tokens);\r
- return;\r
- }\r
- }\r
- lock_type = atoi(g_slist_nth_data(tokens, 0));\r
- attempts_left = atoi(g_slist_nth_data(tokens, 1));\r
- time_penalty = atoi(g_slist_nth_data(tokens, 2));\r
-\r
- dbg("lock_type = %d, attempts_left = %d, time_penalty = %d",\r
- lock_type,attempts_left,time_penalty);\r
-\r
- switch (sp->current_sec_op)\r
- {\r
- case SEC_PIN1_VERIFY:\r
- case SEC_PIN2_VERIFY:\r
- case SEC_SIM_VERIFY:\r
- case SEC_ADM_VERIFY:\r
- v_pin.result = SIM_INCORRECT_PASSWORD;\r
- v_pin.pin_type = _sim_get_current_pin_facility(sp->current_sec_op);\r
- v_pin.retry_count = attempts_left;\r
- tcore_user_request_send_response(ur, _find_resp_command(ur),\r
- sizeof(struct tresp_sim_verify_pins), &v_pin);\r
- break;\r
- case SEC_PUK1_VERIFY:\r
- case SEC_PUK2_VERIFY:\r
- v_puk.result = SIM_INCORRECT_PASSWORD;\r
- v_puk.pin_type = _sim_get_current_pin_facility(sp->current_sec_op);\r
- v_puk.retry_count = attempts_left;\r
- tcore_user_request_send_response(ur, _find_resp_command(ur),\r
- sizeof(struct tresp_sim_verify_puks), &v_puk);\r
- break;\r
- case SEC_PIN1_CHANGE:\r
- case SEC_PIN2_CHANGE:\r
- change_pin.result = SIM_INCORRECT_PASSWORD;\r
- change_pin.pin_type = _sim_get_current_pin_facility(sp->current_sec_op);\r
- change_pin.retry_count = attempts_left;\r
- tcore_user_request_send_response(ur, _find_resp_command(ur),\r
- sizeof(struct tresp_sim_change_pins), &change_pin);\r
- break;\r
- case SEC_PIN1_DISABLE:\r
- case SEC_PIN2_DISABLE:\r
- case SEC_FDN_DISABLE:\r
- case SEC_SIM_DISABLE:\r
- case SEC_NET_DISABLE:\r
- case SEC_NS_DISABLE:\r
- case SEC_SP_DISABLE:\r
- case SEC_CP_DISABLE:\r
- dis_facility.result = SIM_INCORRECT_PASSWORD;\r
- dis_facility.type = _sim_get_current_pin_facility(sp->current_sec_op);\r
- dis_facility.retry_count = attempts_left;\r
- tcore_user_request_send_response(ur, _find_resp_command(ur),\r
- sizeof(struct tresp_sim_disable_facility), &dis_facility);\r
- break;\r
- case SEC_PIN1_ENABLE:\r
- case SEC_PIN2_ENABLE:\r
- case SEC_FDN_ENABLE:\r
- case SEC_SIM_ENABLE:\r
- case SEC_NET_ENABLE:\r
- case SEC_NS_ENABLE:\r
- case SEC_SP_ENABLE:\r
- case SEC_CP_ENABLE:\r
- en_facility.result = SIM_INCORRECT_PASSWORD;\r
- en_facility.type = _sim_get_current_pin_facility(sp->current_sec_op);\r
- en_facility.retry_count = attempts_left;\r
- tcore_user_request_send_response(ur, _find_resp_command(ur),\r
- sizeof(struct tresp_sim_enable_facility), &en_facility);\r
- break;\r
- default:\r
- dbg("not handled sec op[%d]", sp->current_sec_op);\r
- break;\r
- }\r
- tcore_at_tok_free(tokens);\r
- }\r
- dbg(" Function exit");\r
-}\r
-\r
-static gboolean _get_sim_type(CoreObject *o)\r
-{\r
- TcoreHal* hal= NULL;\r
- TcoreATRequest *req= NULL;\r
- TcorePending *pending = NULL;\r
- UserRequest *ur = NULL;\r
- char *cmd_str = NULL;\r
-\r
- dbg(" Function entry ");\r
-\r
- hal = tcore_object_get_hal(o);\r
- pending = tcore_pending_new(o, 0);\r
-\r
- cmd_str = g_strdup_printf("AT+XUICC?");\r
- req = tcore_at_request_new(cmd_str, "+XUICC:", TCORE_AT_SINGLELINE);\r
-\r
- dbg("cmd : %s, prefix(if any) :%s, cmd_len : %d", req->cmd, req->prefix, strlen(req->cmd));\r
-\r
- tcore_pending_set_request_data(pending, 0, req);\r
- tcore_pending_set_response_callback(pending, _response_get_sim_type, hal);\r
- tcore_pending_link_user_request(pending, ur);\r
- tcore_pending_set_send_callback(pending, on_confirmation_sim_message_send, NULL);\r
- tcore_hal_send_request(hal, pending);\r
-\r
- free(cmd_str);\r
- dbg(" Function exit");\r
- return TRUE;\r
-}\r
-\r
-static TReturn _get_file_info(CoreObject *o, UserRequest *ur, const enum tel_sim_file_id ef)\r
-{\r
- TcoreHal* hal= NULL;\r
- TcorePending *pending = NULL;\r
- struct s_sim_property file_meta={0,};\r
- char *cmd_str = NULL;\r
- int trt = 0;\r
-\r
- dbg(" Function entry ");\r
-\r
- file_meta.file_id = ef;\r
- dbg("file_meta.file_id: %d", file_meta.file_id);\r
- hal = tcore_object_get_hal(o);\r
- dbg("hal: %x", hal);\r
- pending = tcore_pending_new(o, 0);\r
-\r
- trt = tcore_user_request_set_metainfo(ur, sizeof(struct s_sim_property), &file_meta);\r
- dbg("trt[%d]",trt);\r
- cmd_str = g_strdup_printf("AT+CRSM=192, %d", ef); /*command - 192 : GET RESPONSE*/\r
- dbg("cmd_str: %x", cmd_str);\r
-\r
- pending = tcore_at_pending_new(o, cmd_str, "+CRSM:", TCORE_AT_SINGLELINE, _response_get_file_info, NULL);\r
- tcore_pending_link_user_request(pending, ur);\r
- tcore_hal_send_request(hal, pending);\r
-\r
- free(cmd_str);\r
- dbg(" Function exit");\r
- return TCORE_RETURN_SUCCESS;\r
-}\r
-\r
-static gboolean _get_file_data(CoreObject *o, UserRequest *ur, const enum tel_sim_file_id ef, const int offset, const int length)\r
-{\r
- TcoreHal* hal= NULL;\r
- TcoreATRequest *req= NULL;\r
- TcorePending *pending = NULL;\r
- char *cmd_str = NULL;\r
- int p1 = 0;\r
- int p2 = 0;\r
- int p3 = 0;\r
-\r
- dbg(" Function entry ");\r
- hal = tcore_object_get_hal(o);\r
- pending = tcore_pending_new(o, 0);\r
-\r
- dbg("file_id: %x", ef);\r
-\r
- p1 = (unsigned char)(offset & 0xFF00) >> 8;\r
- p2 = (unsigned char)offset & 0x00FF; //offset low\r
- p3 = (unsigned char)length;\r
-\r
- cmd_str = g_strdup_printf("AT+CRSM=176, %d, %d, %d, %d", ef,p1,p2,p3); /*command - 176 : READ BINARY*/\r
-\r
- req = tcore_at_request_new(cmd_str, "+CRSM:", TCORE_AT_SINGLELINE);\r
-\r
- dbg("cmd : %s, prefix(if any) :%s, cmd_len : %d", req->cmd, req->prefix, strlen(req->cmd));\r
-\r
- tcore_pending_set_request_data(pending, 0, req);\r
- tcore_pending_set_response_callback(pending, _response_get_file_data, hal);\r
- tcore_pending_link_user_request(pending, ur);\r
- tcore_pending_set_send_callback(pending, on_confirmation_sim_message_send, NULL);\r
-\r
- tcore_hal_send_request(hal, pending);\r
-\r
- free(cmd_str);\r
- dbg(" Function exit");\r
- return TRUE;\r
-}\r
-\r
-static gboolean _get_file_record(CoreObject *o, UserRequest *ur, const enum tel_sim_file_id ef, const int index, const int length)\r
-{\r
-\r
- TcoreHal* hal= NULL;\r
- TcoreATRequest *req= NULL;\r
- TcorePending *pending = NULL;\r
- char *cmd_str = NULL;\r
- int p1 = 0;\r
- int p2 = 0;\r
- int p3 = 0;\r
- dbg(" Function entry ");\r
-\r
- hal = tcore_object_get_hal(o);\r
- pending = tcore_pending_new(o, 0);\r
-\r
- p1 = (unsigned char)index;\r
- p2 = (unsigned char)0x04; /* 0x4 for absolute mode */\r
- p3 = (unsigned char)length;\r
-\r
- cmd_str = g_strdup_printf("AT+CRSM=178, %d, %d, %d, %d", ef,p1,p2,p3); /*command - 178 : READ RECORD*/\r
-\r
- req = tcore_at_request_new(cmd_str, "+CRSM:", TCORE_AT_SINGLELINE);\r
-\r
- dbg("cmd : %s, prefix(if any) :%s, cmd_len : %d", req->cmd, req->prefix, strlen(req->cmd));\r
-\r
- tcore_pending_set_request_data(pending, 0, req);\r
- tcore_pending_set_response_callback(pending, _response_get_file_data, hal);\r
- tcore_pending_link_user_request(pending, ur);\r
- tcore_pending_set_send_callback(pending, on_confirmation_sim_message_send, NULL);\r
-\r
- tcore_hal_send_request(hal, pending);\r
-\r
- free(cmd_str);\r
- dbg(" Function exit");\r
- return TRUE;\r
-}\r
-\r
-static TReturn _get_retry_count(CoreObject *o, UserRequest *ur)\r
-{\r
- TcoreHal* hal= NULL;\r
- TcoreATRequest *req= NULL;\r
- TcorePending *pending = NULL;\r
- char *cmd_str = NULL;\r
- int lock_type = 0;\r
- struct s_sim_property *sp = NULL;\r
- const struct treq_sim_get_lock_info *req_data= NULL;\r
-\r
- dbg(" Function entry ");\r
-\r
- hal = tcore_object_get_hal(o);\r
- pending = tcore_pending_new(o, 0);\r
- req_data = tcore_user_request_ref_data(ur, NULL);\r
- sp = tcore_sim_ref_userdata(o);\r
-\r
- switch (sp->current_sec_op)\r
- {\r
- case SEC_PIN1_VERIFY:\r
- case SEC_PIN1_CHANGE:\r
- case SEC_PIN1_ENABLE:\r
- case SEC_PIN1_DISABLE:\r
- lock_type = 1;\r
- break;\r
- case SEC_PIN2_VERIFY:\r
- case SEC_PIN2_CHANGE:\r
- case SEC_PIN2_ENABLE:\r
- case SEC_PIN2_DISABLE:\r
- case SEC_FDN_ENABLE:\r
- case SEC_FDN_DISABLE:\r
- lock_type = 2;\r
- break;\r
- case SEC_PUK1_VERIFY:\r
- lock_type = 3;\r
- break;\r
- case SEC_PUK2_VERIFY:\r
- lock_type = 4;\r
- break;\r
- case SEC_NET_ENABLE:\r
- case SEC_NET_DISABLE:\r
- lock_type = 5;\r
- break;\r
- case SEC_NS_ENABLE:\r
- case SEC_NS_DISABLE:\r
- lock_type = 6;\r
- break;\r
- case SEC_SP_ENABLE:\r
- case SEC_SP_DISABLE:\r
- lock_type = 7;\r
- break;\r
- case SEC_CP_ENABLE:\r
- case SEC_CP_DISABLE:\r
- lock_type = 8;\r
- break;\r
- case SEC_ADM_VERIFY:\r
- lock_type = 9;\r
- break;\r
- default:\r
- break;\r
- }\r
-\r
- cmd_str = g_strdup_printf("AT+XPINCNT=%d", lock_type);\r
- req = tcore_at_request_new(cmd_str, "+XPINCNT:", TCORE_AT_SINGLELINE);\r
- dbg("cmd : %s, prefix(if any) :%s, cmd_len : %d", req->cmd, req->prefix, strlen(req->cmd));\r
-\r
- tcore_pending_set_request_data(pending, 0, req);\r
- tcore_pending_set_response_callback(pending, _on_response_get_retry_count, hal);\r
- tcore_pending_link_user_request(pending, ur);\r
- tcore_pending_set_send_callback(pending, on_confirmation_sim_message_send, NULL);\r
- tcore_hal_send_request(hal, pending);\r
-\r
- free(cmd_str);\r
- dbg(" Function exit");\r
- return TCORE_RETURN_SUCCESS;\r
-}\r
-\r
-\r
-static gboolean on_event_facility_lock_status(CoreObject *o, const void *event_info, void *user_data)\r
-{\r
- struct s_sim_property *sp = NULL;\r
- char *line = NULL;\r
- GSList *tokens=NULL;\r
- GSList *lines = NULL;\r
-\r
- dbg("Function entry");\r
- return TRUE;\r
-\r
- sp = tcore_sim_ref_userdata(o);\r
- lines = (GSList*)event_info;\r
- if (1 != g_slist_length(lines))\r
- {\r
- dbg("unsolicited msg but multiple line");\r
- goto OUT;\r
- }\r
- line = (char*)(lines->data);\r
- tokens = tcore_at_tok_new(line);\r
- if (g_slist_length(tokens) != 1)\r
- {\r
- msg("invalid message");\r
- tcore_at_tok_free(tokens);\r
- return TRUE;\r
- }\r
-\r
-OUT:\r
- dbg(" Function exit");\r
- if(NULL!=tokens)\r
- tcore_at_tok_free(tokens);\r
- return TRUE;\r
-}\r
-\r
-\r
-static gboolean on_event_pin_status(CoreObject *o, const void *event_info, void *user_data)\r
-{\r
- UserRequest *ur = NULL;\r
- struct s_sim_property *sp = NULL;\r
- enum tel_sim_status sim_status = SIM_STATUS_INITIALIZING;\r
- GSList *tokens=NULL;\r
- GSList *lines = NULL;\r
- const char *line = NULL;\r
- int sim_state = 0;\r
-\r
- dbg(" Function entry ");\r
-\r
- sp = tcore_sim_ref_userdata(o);\r
-\r
- lines = (GSList*)event_info;\r
- if (1 != g_slist_length(lines))\r
- {\r
- dbg("unsolicited msg but multiple line");\r
- goto OUT;\r
- }\r
- line = (char*)(lines->data);\r
-\r
- tokens = tcore_at_tok_new(line);\r
- if (g_slist_length(tokens) != 1)\r
- {\r
- msg("invalid message");\r
- tcore_at_tok_free(tokens);\r
- return TRUE;\r
- }\r
- sim_state = atoi(g_slist_nth_data(tokens, 0));\r
-\r
- switch (sim_state)\r
- {\r
- case 0: //sim state = SIM not present\r
- sim_status = SIM_STATUS_CARD_NOT_PRESENT;\r
- dbg( "NO SIM");\r
- break;\r
- case 1: //sim state = PIN verification needed\r
- sim_status = SIM_STATUS_PIN_REQUIRED;\r
- dbg( " PIN required");\r
- break;\r
- case 2: //sim state = PIN verification not needed \96 Ready\r
- case 3: //sim state = PIN verified \96 Ready\r
- sim_status = SIM_STATUS_INITIALIZING;\r
- dbg(" Inside PIN disabled at BOOT UP");\r
- break;\r
- case 4: //sim state = PUK verification needed\r
- sim_status = SIM_STATUS_PUK_REQUIRED;\r
- dbg(" PUK required");\r
- break;\r
- case 5: //sim state = SIM permanently blocked\r
- sim_status = SIM_STATUS_CARD_BLOCKED;\r
- dbg(" Card permanently blocked");\r
- break;\r
- case 6: //sim state = SIM error\r
- sim_status = SIM_STATUS_CARD_ERROR;\r
- dbg( "SIM card error ");\r
- break;\r
- case 7: //sim state = ready for attach (+COPS)\r
- sim_status = SIM_STATUS_INIT_COMPLETED;\r
- dbg( "Modem init completed");\r
- break;\r
- case 8: //sim state = SIM Technical Problem\r
- sim_status = SIM_STATUS_CARD_ERROR;\r
- dbg( "SIM unavailable");\r
- break;\r
- case 9: //sim state = SIM removed\r
- sim_status = SIM_STATUS_CARD_REMOVED;\r
- dbg( "SIM removed");\r
- break;\r
- case 99: //sim state = SIM State Unknown\r
- sim_status = SIM_STATUS_UNKNOWN;\r
- dbg( "SIM State Unknown");\r
- break;\r
- case 12:\r
- dbg( "SIM Status : %d", sim_status);\r
- goto OUT;\r
- default:\r
- dbg(" not handled SEC lock type ");\r
- break;\r
- }\r
-\r
- switch (sim_status)\r
- {\r
- case SIM_STATUS_INIT_COMPLETED:\r
- ur = tcore_user_request_new(NULL, NULL); //this is for using ur metainfo set/ref functionality.\r
- _get_file_info(o, ur, SIM_EF_IMSI);\r
- break;\r
- case SIM_STATUS_INITIALIZING:\r
- case SIM_STATUS_PIN_REQUIRED:\r
- case SIM_STATUS_PUK_REQUIRED:\r
- case SIM_STATUS_CARD_BLOCKED:\r
- case SIM_STATUS_NCK_REQUIRED:\r
- case SIM_STATUS_NSCK_REQUIRED:\r
- case SIM_STATUS_SPCK_REQUIRED:\r
- case SIM_STATUS_CCK_REQUIRED:\r
- case SIM_STATUS_LOCK_REQUIRED:\r
- if( sp->first_recv_status == SIM_STATUS_UNKNOWN )\r
- {\r
- dbg("first received sim status[%d]",sim_status);\r
- sp->first_recv_status = sim_status;\r
- _get_sim_type(o);\r
- } else {\r
- dbg("second or later received lock status[%d]",sim_status);\r
- if ( tcore_sim_get_status(o) != SIM_STATUS_INIT_COMPLETED )\r
- {\r
- dbg("sim is not init complete in telephony side yet");\r
- _sim_status_update(o,sim_status);\r
- }\r
- }\r
- break;\r
- case SIM_STATUS_CARD_REMOVED:\r
- case SIM_STATUS_CARD_NOT_PRESENT:\r
- case SIM_STATUS_CARD_ERROR:\r
- if (sim_status == SIM_STATUS_CARD_NOT_PRESENT && tcore_sim_get_status(o) != SIM_STATUS_UNKNOWN)\r
- {\r
- dbg("[SIM]SIM CARD REMOVED!!");\r
- sim_status = SIM_STATUS_CARD_REMOVED;\r
- }\r
- _sim_status_update(o,sim_status);\r
- break;\r
- default:\r
- dbg("not handled status[%d]", sim_status);\r
-\r
- break;\r
- }\r
-OUT:\r
- dbg(" Function exit");\r
- if(NULL!=tokens)\r
- tcore_at_tok_free(tokens);\r
- return TRUE;\r
-}\r
-\r
-\r
-\r
-static void on_response_verify_pins(TcorePending *p, int data_len, const void *data, void *user_data)\r
-{\r
- const TcoreATResponse *resp = data;\r
- UserRequest *ur = NULL;\r
- CoreObject *co_sim = NULL;\r
- struct s_sim_property *sp = NULL;\r
- GSList *tokens=NULL;\r
- struct tresp_sim_verify_pins res;\r
- GQueue *queue= NULL;\r
- const char *line;\r
- int err;\r
-\r
- dbg(" Function entry ");\r
-\r
- co_sim = tcore_pending_ref_core_object(p);\r
- sp = tcore_sim_ref_userdata(co_sim);\r
- ur = tcore_pending_ref_user_request(p);\r
-\r
- memset(&res, 0, sizeof(struct tresp_sim_verify_pins));\r
-\r
- if(resp->success > 0)\r
- {\r
- dbg("RESPONSE OK");\r
- res.result = SIM_PIN_OPERATION_SUCCESS;\r
- res.pin_type = _sim_get_current_pin_facility(sp->current_sec_op);\r
- if (res.pin_type == SIM_PTYPE_PIN1 || res.pin_type == SIM_PTYPE_SIM)\r
- {\r
- if (tcore_sim_get_status(co_sim) != SIM_STATUS_INIT_COMPLETED)\r
- _sim_status_update(co_sim, SIM_STATUS_INITIALIZING);\r
- }\r
- tcore_user_request_send_response(ur, TRESP_SIM_VERIFY_PINS, sizeof(struct tresp_sim_verify_pins), &res);\r
- }\r
- else\r
- {\r
- dbg("RESPONSE NOK");\r
- line = (const char*)resp->final_response;\r
- tokens = tcore_at_tok_new(line);\r
- if (g_slist_length(tokens) < 1)\r
- {\r
- dbg("err cause not specified or string corrupted");\r
- res.result = TCORE_RETURN_3GPP_ERROR;\r
- }\r
- else\r
- {\r
- err = atoi(g_slist_nth_data(tokens, 0));\r
- dbg("on_response_verify_pins: err = %d", err);\r
- queue = tcore_object_ref_user_data(co_sim);\r
- ur = tcore_user_request_ref(ur);\r
- _get_retry_count(co_sim, ur);\r
- }\r
- tcore_at_tok_free(tokens);\r
- }\r
- dbg(" Function exit");\r
-}\r
-\r
-static void on_response_verify_puks(TcorePending *p, int data_len, const void *data, void *user_data)\r
-{\r
- const TcoreATResponse *resp = data;\r
- UserRequest *ur = NULL;\r
- CoreObject *co_sim = NULL;\r
- struct s_sim_property *sp = NULL;\r
- GSList *tokens=NULL;\r
- struct tresp_sim_verify_puks res;\r
- GQueue *queue= NULL;\r
- const char *line;\r
- int err;\r
-\r
- dbg(" Function entry ");\r
-\r
- co_sim = tcore_pending_ref_core_object(p);\r
- sp = tcore_sim_ref_userdata(co_sim);\r
- ur = tcore_pending_ref_user_request(p);\r
-\r
- memset(&res, 0, sizeof(struct tresp_sim_verify_pins));\r
-\r
- if(resp->success > 0)\r
- {\r
- dbg("RESPONSE OK");\r
- res.result = SIM_PIN_OPERATION_SUCCESS;\r
- res.pin_type = _sim_get_current_pin_facility(sp->current_sec_op);\r
- tcore_user_request_send_response(ur, TRESP_SIM_VERIFY_PUKS, sizeof(struct tresp_sim_verify_pins), &res);\r
- }\r
- else\r
- {\r
- dbg("RESPONSE NOK");\r
- line = (const char*)resp->final_response;\r
- tokens = tcore_at_tok_new(line);\r
-\r
- if (g_slist_length(tokens) < 1)\r
- {\r
- dbg("err cause not specified or string corrupted");\r
- res.result = TCORE_RETURN_3GPP_ERROR;\r
- }\r
- else\r
- {\r
- err = atoi(g_slist_nth_data(tokens, 0));\r
- queue = tcore_object_ref_user_data(co_sim);\r
- ur = tcore_user_request_ref(ur);\r
- _get_retry_count(co_sim, ur);\r
- }\r
- tcore_at_tok_free(tokens);\r
- }\r
- dbg(" Function exit");\r
-}\r
-\r
-static void on_response_change_pins(TcorePending *p, int data_len, const void *data, void *user_data)\r
-{\r
- const TcoreATResponse *resp = data;\r
- UserRequest *ur = NULL;\r
- CoreObject *co_sim = NULL;\r
- struct s_sim_property *sp = NULL;\r
- GSList *tokens=NULL;\r
- struct tresp_sim_change_pins res;\r
- GQueue *queue;\r
- const char *line;\r
- int err;\r
-\r
- dbg(" Function entry ");\r
-\r
- co_sim = tcore_pending_ref_core_object(p);\r
- sp = tcore_sim_ref_userdata(co_sim);\r
- ur = tcore_pending_ref_user_request(p);\r
-\r
- memset(&res, 0, sizeof(struct tresp_sim_change_pins));\r
-\r
- if(resp->success > 0)\r
- {\r
- dbg("RESPONSE OK");\r
- res.result = SIM_PIN_OPERATION_SUCCESS;\r
- res.pin_type = _sim_get_current_pin_facility(sp->current_sec_op);\r
- tcore_user_request_send_response(ur, TRESP_SIM_CHANGE_PINS,sizeof(struct tresp_sim_change_pins), &res);\r
- }\r
- else\r
- {\r
- dbg("RESPONSE NOK");\r
- line = (const char*)resp->final_response;\r
- tokens = tcore_at_tok_new(line);\r
-\r
- if (g_slist_length(tokens) < 1)\r
- {\r
- dbg("err cause not specified or string corrupted");\r
- res.result = TCORE_RETURN_3GPP_ERROR;\r
- }\r
- else\r
- {\r
- err = atoi(g_slist_nth_data(tokens, 0));\r
- queue = tcore_object_ref_user_data(co_sim);\r
- ur = tcore_user_request_ref(ur);\r
- _get_retry_count(co_sim, ur);\r
- }\r
- tcore_at_tok_free(tokens);\r
- }\r
- dbg(" Function exit");\r
-}\r
-\r
-static void on_response_get_facility_status(TcorePending *p, int data_len, const void *data, void *user_data)\r
-{\r
- const TcoreATResponse *resp = data;\r
- UserRequest *ur = NULL;\r
- CoreObject *co_sim = NULL;\r
- struct s_sim_property *sp = NULL;\r
- GSList *tokens=NULL;\r
- struct tresp_sim_get_facility_status res;\r
- const char *line;\r
-\r
- dbg(" Function entry ");\r
-\r
- co_sim = tcore_pending_ref_core_object(p);\r
- sp = tcore_sim_ref_userdata(co_sim);\r
- ur = tcore_pending_ref_user_request(p);\r
-\r
- memset(&res, 0, sizeof(struct tresp_sim_get_facility_status));\r
-\r
- res.result = SIM_PIN_OPERATION_SUCCESS;\r
- res.type = _sim_get_current_pin_facility(sp->current_sec_op);\r
-\r
- if(resp->success > 0)\r
- {\r
- dbg("RESPONSE OK");\r
- if(resp->lines) {\r
- line = (const char*)resp->lines->data;\r
- tokens = tcore_at_tok_new(line);\r
- if (g_slist_length(tokens) != 1)\r
- {\r
- msg("invalid message");\r
- tcore_at_tok_free(tokens);\r
- return;\r
- }\r
- }\r
- res.b_enable = atoi(g_slist_nth_data(tokens, 0));\r
-\r
- }\r
- else\r
- {\r
- dbg("RESPONSE NOK");\r
- res.result = SIM_INCOMPATIBLE_PIN_OPERATION;\r
- }\r
-\r
- if (ur)\r
- {\r
- tcore_user_request_send_response(ur, TRESP_SIM_GET_FACILITY_STATUS,\r
- sizeof(struct tresp_sim_get_facility_status), &res);\r
- }\r
- tcore_at_tok_free(tokens);\r
- dbg(" Function exit");\r
-}\r
-\r
-static void on_response_enable_facility(TcorePending *p, int data_len, const void *data, void *user_data)\r
-{\r
- const TcoreATResponse *resp = data;\r
- UserRequest *ur = NULL;\r
- CoreObject *co_sim = NULL;\r
- struct s_sim_property *sp = NULL;\r
- GSList *tokens=NULL;\r
- struct tresp_sim_enable_facility res;\r
- GQueue *queue;\r
- const char *line;\r
-\r
- dbg(" Function entry ");\r
-\r
- co_sim = tcore_pending_ref_core_object(p);\r
- sp = tcore_sim_ref_userdata(co_sim);\r
- ur = tcore_pending_ref_user_request(p);\r
-\r
- memset(&res, 0, sizeof(struct tresp_sim_enable_facility));\r
-\r
- res.result = SIM_PIN_OPERATION_SUCCESS;\r
- res.type = _sim_get_current_pin_facility(sp->current_sec_op);\r
-\r
- if(resp->success > 0)\r
- {\r
- dbg("RESPONSE OK");\r
- if(resp->lines)\r
- {\r
- line = (const char*)resp->lines->data;\r
- tokens = tcore_at_tok_new(line);\r
- if (g_slist_length(tokens) != 1)\r
- {\r
- msg("invalid message");\r
- tcore_at_tok_free(tokens);\r
- return;\r
- }\r
- }\r
- res.result = SIM_PIN_OPERATION_SUCCESS;\r
- if (ur)\r
- {\r
- tcore_user_request_send_response(ur, TRESP_SIM_ENABLE_FACILITY,\r
- sizeof(struct tresp_sim_enable_facility), &res);\r
- }\r
- tcore_at_tok_free(tokens);\r
- }\r
- else\r
- {\r
- dbg("RESPONSE NOK");\r
- queue = tcore_object_ref_user_data(co_sim);\r
- ur = tcore_user_request_ref(ur);\r
- _get_retry_count(co_sim, ur);\r
- }\r
- dbg(" Function exit");\r
-}\r
-\r
-static void on_response_disable_facility(TcorePending *p, int data_len, const void *data, void *user_data)\r
-{\r
- const TcoreATResponse *resp = data;\r
- UserRequest *ur = NULL;\r
- CoreObject *co_sim = NULL;\r
- struct s_sim_property *sp = NULL;\r
- GSList *tokens=NULL;\r
- struct tresp_sim_disable_facility res;\r
- GQueue *queue;\r
- const char *line;\r
-\r
- dbg(" Function entry ");\r
-\r
- co_sim = tcore_pending_ref_core_object(p);\r
- sp = tcore_sim_ref_userdata(co_sim);\r
- ur = tcore_pending_ref_user_request(p);\r
-\r
- memset(&res, 0, sizeof(struct tresp_sim_disable_facility));\r
-\r
- res.result = SIM_PIN_OPERATION_SUCCESS;\r
- res.type = _sim_get_current_pin_facility(sp->current_sec_op);\r
-\r
- if(resp->success > 0)\r
- {\r
- dbg("RESPONSE OK");\r
- if(resp->lines) {\r
- line = (const char*)resp->lines->data;\r
- tokens = tcore_at_tok_new(line);\r
- if (g_slist_length(tokens) != 1)\r
- {\r
- msg("invalid message");\r
- tcore_at_tok_free(tokens);\r
- return;\r
- }\r
- }\r
- res.result = SIM_PIN_OPERATION_SUCCESS;\r
- if (ur)\r
- {\r
- tcore_user_request_send_response(ur, TRESP_SIM_DISABLE_FACILITY,\r
- sizeof(struct tresp_sim_disable_facility), &res);\r
- }\r
- tcore_at_tok_free(tokens);\r
- }\r
- else\r
- {\r
- dbg("RESPONSE NOK");\r
- queue = tcore_object_ref_user_data(co_sim);\r
- ur = tcore_user_request_ref(ur);\r
- _get_retry_count(co_sim, ur);\r
- }\r
- dbg(" Function exit");\r
-}\r
-\r
-static void on_response_get_lock_info(TcorePending * p, int data_len, const void *data, void *user_data)\r
-{\r
- const TcoreATResponse *resp = data;\r
- UserRequest *ur = NULL;\r
- CoreObject *co_sim = NULL;\r
- struct s_sim_property *sp = NULL;\r
- GSList *tokens=NULL;\r
- const char *line;\r
- struct tresp_sim_verify_pins v_pin = {0,};\r
- struct tresp_sim_verify_puks v_puk = {0,};\r
- struct tresp_sim_change_pins change_pin = {0,};\r
- struct tresp_sim_disable_facility dis_facility = {0,};\r
- struct tresp_sim_enable_facility en_facility = {0,};\r
- int lock_type;\r
- int attempts_left = 0;\r
- int time_penalty = 0;\r
-\r
- dbg(" Function entry ");\r
-\r
- co_sim = tcore_pending_ref_core_object(p);\r
- sp = tcore_sim_ref_userdata(co_sim);\r
- ur = tcore_pending_ref_user_request(p);\r
-\r
- if(resp->success > 0)\r
- {\r
- dbg("RESPONSE OK");\r
- if(resp->lines) {\r
- line = (const char*)resp->lines->data;\r
- tokens = tcore_at_tok_new(line);\r
- if (g_slist_length(tokens) != 3)\r
- {\r
- msg("invalid message");\r
- tcore_at_tok_free(tokens);\r
- return;\r
- }\r
- }\r
- lock_type = atoi(g_slist_nth_data(tokens, 0));\r
- attempts_left = atoi(g_slist_nth_data(tokens, 1));\r
- time_penalty = atoi(g_slist_nth_data(tokens, 2));\r
-\r
- switch (sp->current_sec_op)\r
- {\r
- case SEC_PIN1_VERIFY:\r
- case SEC_PIN2_VERIFY:\r
- case SEC_SIM_VERIFY:\r
- case SEC_ADM_VERIFY:\r
- v_pin.result = SIM_INCORRECT_PASSWORD;\r
- v_pin.pin_type = _sim_get_current_pin_facility(sp->current_sec_op);\r
- v_pin.retry_count = attempts_left;\r
- tcore_user_request_send_response(ur, _find_resp_command(ur),\r
- sizeof(struct tresp_sim_verify_pins), &v_pin);\r
- break;\r
- case SEC_PUK1_VERIFY:\r
- case SEC_PUK2_VERIFY:\r
- v_puk.result = SIM_INCORRECT_PASSWORD;\r
- v_puk.pin_type = _sim_get_current_pin_facility(sp->current_sec_op);\r
- v_puk.retry_count = attempts_left;\r
- tcore_user_request_send_response(ur, _find_resp_command(ur),\r
- sizeof(struct tresp_sim_verify_puks), &v_puk);\r
- break;\r
- case SEC_PIN1_CHANGE:\r
- case SEC_PIN2_CHANGE:\r
- change_pin.result = SIM_INCORRECT_PASSWORD;\r
- change_pin.pin_type = _sim_get_current_pin_facility(sp->current_sec_op);\r
- change_pin.retry_count = attempts_left;\r
- tcore_user_request_send_response(ur, _find_resp_command(ur),\r
- sizeof(struct tresp_sim_change_pins), &change_pin);\r
- break;\r
- case SEC_PIN1_DISABLE:\r
- case SEC_PIN2_DISABLE:\r
- case SEC_FDN_DISABLE:\r
- case SEC_SIM_DISABLE:\r
- case SEC_NET_DISABLE:\r
- case SEC_NS_DISABLE:\r
- case SEC_SP_DISABLE:\r
- case SEC_CP_DISABLE:\r
- dis_facility.result = SIM_INCORRECT_PASSWORD;\r
- dis_facility.type = _sim_get_current_pin_facility(sp->current_sec_op);\r
- dis_facility.retry_count = attempts_left;\r
- tcore_user_request_send_response(ur, _find_resp_command(ur),\r
- sizeof(struct tresp_sim_disable_facility), &dis_facility);\r
- break;\r
- case SEC_PIN1_ENABLE:\r
- case SEC_PIN2_ENABLE:\r
- case SEC_FDN_ENABLE:\r
- case SEC_SIM_ENABLE:\r
- case SEC_NET_ENABLE:\r
- case SEC_NS_ENABLE:\r
- case SEC_SP_ENABLE:\r
- case SEC_CP_ENABLE:\r
- en_facility.result = SIM_INCORRECT_PASSWORD;\r
- en_facility.type = _sim_get_current_pin_facility(sp->current_sec_op);\r
- en_facility.retry_count = attempts_left;\r
- tcore_user_request_send_response(ur, _find_resp_command(ur),\r
- sizeof(struct tresp_sim_enable_facility), &en_facility);\r
- break;\r
- default:\r
- dbg("not handled sec op[%d]", sp->current_sec_op);\r
- break;\r
- }\r
- tcore_at_tok_free(tokens);\r
- }\r
- dbg(" Function exit");\r
-}\r
-\r
-static void on_response_update_file(TcorePending *p, int data_len, const void *data, void *user_data)\r
-{\r
- const TcoreATResponse *resp = data;\r
- UserRequest *ur = NULL;\r
- CoreObject *co_sim = NULL;\r
- struct tresp_sim_set_callforwarding resp_cf = {0, };\r
- struct tresp_sim_set_language resp_language ={0,};\r
- struct s_sim_property *sp = NULL;\r
- GSList *tokens=NULL;\r
- enum tel_sim_access_result result;\r
- const char *line;\r
- int sw1 = 0;\r
- int sw2 = 0;\r
-\r
- dbg(" Function entry ");\r
-\r
- co_sim = tcore_pending_ref_core_object(p);\r
- sp = tcore_sim_ref_userdata(co_sim);\r
- ur = tcore_pending_ref_user_request(p);\r
-\r
- if(resp->success > 0)\r
- {\r
- dbg("RESPONSE OK");\r
- if(resp->lines)\r
- {\r
- line = (const char*)resp->lines->data;\r
- tokens = tcore_at_tok_new(line);\r
- if (g_slist_length(tokens) != 2)\r
- {\r
- msg("invalid message");\r
- tcore_at_tok_free(tokens);\r
- return;\r
- }\r
- }\r
- sw1 = atoi(g_slist_nth_data(tokens, 0));\r
- sw2 = atoi(g_slist_nth_data(tokens, 1));\r
-\r
- if((sw1 == 0x90 && sw2 == 0x00) ||sw1 == 0x91)\r
- {\r
- result = SIM_ACCESS_SUCCESS;\r
- }else\r
- {\r
- result = _decode_status_word(sw1, sw2);\r
- }\r
- }else{\r
- dbg("RESPONSE NOK");\r
- result = SIM_ACCESS_FAILED;\r
- }\r
-\r
- switch(sp->file_id)\r
- {\r
- case SIM_EF_CPHS_CALL_FORWARD_FLAGS :\r
- case SIM_EF_USIM_CFIS :\r
- tcore_user_request_send_response(ur, _find_resp_command(ur), sizeof(struct tresp_sim_set_callforwarding), &resp_cf);\r
- break;\r
- case SIM_EF_ELP:\r
- case SIM_EF_LP:\r
- case SIM_EF_USIM_LI:\r
- case SIM_EF_USIM_PL:\r
- tcore_user_request_send_response(ur, _find_resp_command(ur), sizeof(struct tresp_sim_set_language), &resp_language);\r
- break;\r
- default:\r
- dbg("Invalid File ID - %d", sp->file_id)
- break;\r
- }\r
- tcore_at_tok_free(tokens);\r
- dbg(" Function exit");\r
-}\r
-\r
-static void on_response_transmit_apdu(TcorePending *p, int data_len, const void *data, void *user_data)\r
-{\r
- const TcoreATResponse *resp = data;\r
- UserRequest *ur = NULL;\r
- CoreObject *co_sim = NULL;\r
- struct s_sim_property *sp = NULL;\r
- GSList *tokens=NULL;\r
- struct tresp_sim_transmit_apdu res;\r
- const char *line;\r
-\r
- dbg(" Function entry ");\r
-\r
- co_sim = tcore_pending_ref_core_object(p);\r
- sp = tcore_sim_ref_userdata(co_sim);\r
- ur = tcore_pending_ref_user_request(p);\r
-\r
- memset(&res, 0, sizeof(struct tresp_sim_transmit_apdu));\r
-\r
- if(resp->success > 0)\r
- {\r
- dbg("RESPONSE OK");\r
- res.result = SIM_ACCESS_SUCCESS;\r
- if(resp->lines)\r
- {\r
- line = (const char*)resp->lines->data;\r
- tokens = tcore_at_tok_new(line);\r
- if (g_slist_length(tokens) != 2)\r
- {\r
- msg("invalid message");\r
- tcore_at_tok_free(tokens);\r
- return;\r
- }\r
- }\r
- res.apdu_resp_length = atoi(g_slist_nth_data(tokens, 0));\r
- strncpy((char *)res.apdu_resp, (const char *)g_slist_nth_data(tokens, 1), res.apdu_resp_length);\r
- }\r
- else\r
- {\r
- dbg("RESPONSE NOK");\r
- res.result = SIM_ACCESS_FAILED;\r
- }\r
- ur = tcore_pending_ref_user_request(p);\r
- if (ur)\r
- {\r
- tcore_user_request_send_response(ur, _find_resp_command(ur), sizeof(struct tresp_sim_transmit_apdu), &res);\r
- }\r
- tcore_at_tok_free(tokens);\r
- dbg(" Function exit");\r
-}\r
-\r
-static TReturn s_verify_pins(CoreObject *o, UserRequest *ur)\r
-{\r
- TcoreHal* hal= NULL;\r
- TcoreATRequest *req = NULL;\r
- TcorePending *pending = NULL;\r
- char *cmd_str = NULL;\r
- const struct treq_sim_verify_pins *req_data = NULL;\r
- struct s_sim_property *sp = NULL;\r
-\r
- dbg(" Function entry ");\r
-\r
- hal = tcore_object_get_hal(o);\r
- sp = tcore_sim_ref_userdata(o);\r
- pending = tcore_pending_new(o, 0);\r
- req_data = tcore_user_request_ref_data(ur, NULL);\r
-\r
- if (!o || !ur)\r
- return TCORE_RETURN_EINVAL;\r
-\r
- if (req_data->pin_type == SIM_PTYPE_PIN1)\r
- {\r
- sp->current_sec_op = SEC_PIN1_VERIFY;\r
- cmd_str = g_strdup_printf("AT+CPIN=\"%s\"", req_data->pin);\r
- }\r
- else if (req_data->pin_type == SIM_PTYPE_PIN2)\r
- {\r
- sp->current_sec_op = SEC_PIN2_VERIFY;\r
- cmd_str = g_strdup_printf("AT+CPIN2=\"%s\"", req_data->pin);\r
- }\r
- else if (req_data->pin_type == SIM_PTYPE_SIM)\r
- {\r
- sp->current_sec_op = SEC_SIM_VERIFY;\r
- cmd_str = g_strdup_printf("AT+CPIN=\"%s\"", req_data->pin);\r
- }\r
- else if (req_data->pin_type == SIM_PTYPE_ADM)\r
- {\r
- sp->current_sec_op = SEC_ADM_VERIFY;\r
- cmd_str = g_strdup_printf("AT+CPIN=\"%s\"", req_data->pin);\r
- }\r
- else\r
- {\r
- return TCORE_RETURN_EINVAL;\r
- }\r
-\r
- req = tcore_at_request_new(cmd_str, NULL, TCORE_AT_NO_RESULT);\r
-\r
- dbg("cmd : %s, prefix(if any) :%s, cmd_len : %d", req->cmd, req->prefix, strlen(req->cmd));\r
-\r
- tcore_pending_set_request_data(pending, 0, req);\r
- tcore_pending_set_response_callback(pending, on_response_verify_pins, hal);\r
- tcore_pending_link_user_request(pending, ur);\r
- tcore_pending_set_send_callback(pending, on_confirmation_sim_message_send, NULL);\r
- tcore_hal_send_request(hal, pending);\r
-\r
- free(cmd_str);\r
- dbg(" Function exit");\r
- return TCORE_RETURN_SUCCESS;\r
-}\r
-\r
-static TReturn s_verify_puks(CoreObject *o, UserRequest *ur)\r
-{\r
- TcoreHal* hal= NULL;\r
- TcoreATRequest *req= NULL;\r
- TcorePending *pending = NULL;\r
- char *cmd_str = NULL;\r
- const struct treq_sim_verify_puks *req_data;\r
- struct s_sim_property *sp = NULL;\r
-\r
- dbg(" Function entry ");\r
-\r
- hal = tcore_object_get_hal(o);\r
- sp = tcore_sim_ref_userdata(o);\r
- pending = tcore_pending_new(o, 0);\r
- req_data = tcore_user_request_ref_data(ur, NULL);\r
-\r
- if (!o || !ur)\r
- return TCORE_RETURN_EINVAL;\r
-\r
- if(req_data->puk_type == SIM_PTYPE_PUK1)\r
- {\r
- sp->current_sec_op = SEC_PUK1_VERIFY;\r
- cmd_str = g_strdup_printf("AT+CPIN=\"%s\", \"%s\"", req_data->puk, req_data->pin);\r
- }\r
- else if(req_data->puk_type == SIM_PTYPE_PUK2)\r
- {\r
- sp->current_sec_op = SEC_PUK2_VERIFY;\r
- cmd_str = g_strdup_printf("AT+CPIN2=\"%s\", \"%s\"", req_data->puk, req_data->pin);\r
- }\r
- else\r
- {\r
- return TCORE_RETURN_EINVAL;\r
- }\r
- req = tcore_at_request_new(cmd_str, NULL, TCORE_AT_NO_RESULT);\r
-\r
- dbg("cmd : %s, prefix(if any) :%s, cmd_len : %d", req->cmd, req->prefix, strlen(req->cmd));\r
-\r
- tcore_pending_set_request_data(pending, 0, req);\r
- tcore_pending_set_response_callback(pending, on_response_verify_puks, hal);\r
- tcore_pending_link_user_request(pending, ur);\r
- tcore_pending_set_send_callback(pending, on_confirmation_sim_message_send, NULL);\r
- tcore_hal_send_request(hal, pending);\r
-\r
- free(cmd_str);\r
- dbg(" Function exit");\r
- return TCORE_RETURN_SUCCESS;\r
-}\r
-\r
-static TReturn s_change_pins(CoreObject *o, UserRequest *ur)\r
-{\r
- TcoreHal* hal= NULL;\r
- TcoreATRequest *req= NULL;\r
- TcorePending *pending = NULL;\r
- char *cmd_str = NULL;\r
- const struct treq_sim_change_pins *req_data;\r
- struct s_sim_property *sp = NULL;\r
- char *pin1 = "SC";\r
- char *pin2 = "P2";\r
-\r
- dbg(" Function entry ");\r
-\r
- hal = tcore_object_get_hal(o);\r
- sp = tcore_sim_ref_userdata(o);\r
- pending = tcore_pending_new(o, 0);\r
- req_data = tcore_user_request_ref_data(ur, NULL);\r
-\r
- if (!o || !ur)\r
- return TCORE_RETURN_EINVAL;\r
- \r
- if(req_data->type == SIM_PTYPE_PIN1)\r
- {\r
- sp->current_sec_op = SEC_PIN1_CHANGE;\r
- cmd_str = g_strdup_printf("AT+CPWD=\"%s\",\"%s\",\"%s\"", pin1, req_data->old_pin, req_data->new_pin);\r
-\r
- }\r
- else if(req_data->type == SIM_PTYPE_PIN2)\r
- {\r
- sp->current_sec_op = SEC_PIN2_CHANGE;\r
- cmd_str = g_strdup_printf("AT+CPWD=\"%s\",\"%s\",\"%s\"", pin2, req_data->old_pin, req_data->new_pin);\r
- }\r
- else\r
- {\r
- return TCORE_RETURN_EINVAL;\r
- }\r
- req = tcore_at_request_new(cmd_str, NULL, TCORE_AT_NO_RESULT);\r
-\r
- dbg("cmd : %s, prefix(if any) :%s, cmd_len : %d", req->cmd, req->prefix, strlen(req->cmd));\r
-\r
- tcore_pending_set_request_data(pending, 0, req);\r
- tcore_pending_set_response_callback(pending, on_response_change_pins, hal);\r
- tcore_pending_link_user_request(pending, ur);\r
- tcore_pending_set_send_callback(pending, on_confirmation_sim_message_send, NULL);\r
- tcore_hal_send_request(hal, pending);\r
-\r
- free(cmd_str);\r
- dbg(" Function exit");\r
- return TCORE_RETURN_SUCCESS;\r
-}\r
-\r
-static TReturn s_get_facility_status(CoreObject *o, UserRequest *ur)\r
-{\r
- TcoreHal* hal= NULL;\r
- TcoreATRequest *req= NULL;\r
- TcorePending *pending = NULL;\r
- char *cmd_str = NULL;\r
- const struct treq_sim_get_facility_status *req_data;\r
- struct s_sim_property *sp = NULL;\r
- char *fac = "SC";\r
- int mode = 2; /* 0:unlock, 1:lock, 2:query*/\r
-\r
- dbg(" Function entry ");\r
-\r
- hal = tcore_object_get_hal(o);\r
- sp = tcore_sim_ref_userdata(o);\r
- pending = tcore_pending_new(o, 0);\r
- req_data = tcore_user_request_ref_data(ur, NULL);\r
-\r
- if (!o || !ur)\r
- return TCORE_RETURN_EINVAL;\r
-\r
- if(req_data->type == SIM_FACILITY_PS)\r
- {\r
- fac = "PS"; /*PH-SIM, Lock PHone to SIM/UICC card*/\r
- }else if(req_data->type == SIM_FACILITY_SC)\r
- {\r
- fac = "SC"; /*Lock SIM/UICC card, simply PIN1*/\r
- }else if(req_data->type == SIM_FACILITY_FD)\r
- {\r
- fac = "FD"; /*Fixed Dialing Number feature, need PIN2*/\r
- }else if(req_data->type == SIM_FACILITY_PN)\r
- {\r
- fac = "PN"; /*Network Personalization*/\r
- }else if(req_data->type == SIM_FACILITY_PU)\r
- {\r
- fac = "PU"; /*network sUbset Personalization*/\r
- }else if(req_data->type == SIM_FACILITY_PP)\r
- {\r
- fac = "PP"; /*service Provider Personalization*/\r
- }else if(req_data->type == SIM_FACILITY_PC)\r
- {\r
- fac = "PC"; /*Corporate Personalization*/\r
- }else\r
- {\r
- return TCORE_RETURN_EINVAL;\r
- }\r
- cmd_str = g_strdup_printf("AT+CLCK=\"%s\", %d", fac, mode);\r
- req = tcore_at_request_new(cmd_str, "+CLCK:", TCORE_AT_SINGLELINE);\r
-\r
- dbg("cmd : %s, prefix(if any) :%s, cmd_len : %d", req->cmd, req->prefix, strlen(req->cmd));\r
-\r
- tcore_pending_set_request_data(pending, 0, req);\r
- tcore_pending_set_response_callback(pending, on_response_get_facility_status, hal);\r
- tcore_pending_link_user_request(pending, ur);\r
- tcore_pending_set_send_callback(pending, on_confirmation_sim_message_send, NULL);\r
- tcore_hal_send_request(hal, pending);\r
-\r
- free(cmd_str);\r
- dbg(" Function exit");\r
- return TCORE_RETURN_SUCCESS;\r
-}\r
-\r
-static TReturn s_enable_facility(CoreObject *o, UserRequest *ur)\r
-{\r
- TcoreHal* hal = NULL;\r
- TcoreATRequest *req = NULL;\r
- TcorePending *pending = NULL;\r
- char *cmd_str = NULL;\r
- const struct treq_sim_enable_facility *req_data;\r
- struct s_sim_property *sp = NULL;\r
- char *fac = "SC";\r
- int mode = 1; /* 0:unlock, 1:lock, 2:query*/\r
-\r
- dbg(" Function entry ");\r
-\r
- hal = tcore_object_get_hal(o);\r
- sp = tcore_sim_ref_userdata(o);\r
- pending = tcore_pending_new(o, 0);\r
- req_data = tcore_user_request_ref_data(ur, NULL);\r
-\r
- if (!o || !ur)\r
- return TCORE_RETURN_EINVAL;\r
-\r
- if(req_data->type == SIM_FACILITY_PS)\r
- {\r
- fac = "PS"; /*PH-SIM, Lock PHone to SIM/UICC card*/\r
- sp->current_sec_op = SEC_SIM_ENABLE;\r
- }else if(req_data->type == SIM_FACILITY_SC)\r
- {\r
- fac = "SC"; /*Lock SIM/UICC card, simply PIN1*/\r
- sp->current_sec_op = SEC_PIN1_ENABLE;\r
- }else if(req_data->type == SIM_FACILITY_FD)\r
- {\r
- fac = "FD"; /*Fixed Dialing Number feature, need PIN2*/\r
- sp->current_sec_op = SEC_FDN_ENABLE;\r
- }else if(req_data->type == SIM_FACILITY_PN)\r
- {\r
- fac = "PN"; /*Network Personalization*/\r
- sp->current_sec_op = SEC_NET_ENABLE;\r
- }else if(req_data->type == SIM_FACILITY_PU)\r
- {\r
- fac = "PU"; /*network sUbset Personalization*/\r
- sp->current_sec_op = SEC_NS_ENABLE;\r
- }else if(req_data->type == SIM_FACILITY_PP)\r
- {\r
- fac = "PP"; /*service Provider Personalization*/\r
- sp->current_sec_op = SEC_SP_ENABLE;\r
- }else if(req_data->type == SIM_FACILITY_PC)\r
- {\r
- fac = "PC"; /*Corporate Personalization*/\r
- sp->current_sec_op = SEC_CP_ENABLE;\r
- }else\r
- {\r
- return TCORE_RETURN_EINVAL;\r
- }\r
- cmd_str = g_strdup_printf("AT+CLCK=\"%s\", %d, \"%s\"", fac, mode, req_data->password);\r
- req = tcore_at_request_new(cmd_str, "+CLCK:", TCORE_AT_SINGLELINE);\r
-\r
- dbg("cmd : %s, prefix(if any) :%s, cmd_len : %d", req->cmd, req->prefix, strlen(req->cmd));\r
-\r
- tcore_pending_set_request_data(pending, 0, req);\r
- tcore_pending_set_response_callback(pending, on_response_enable_facility, hal);\r
- tcore_pending_link_user_request(pending, ur);\r
- tcore_pending_set_send_callback(pending, on_confirmation_sim_message_send, NULL);\r
- tcore_hal_send_request(hal, pending);\r
-\r
- free(cmd_str);\r
- dbg(" Function exit");\r
- return TCORE_RETURN_SUCCESS;\r
-}\r
-\r
-static TReturn s_disable_facility(CoreObject *o, UserRequest *ur)\r
-{\r
- TcoreHal* hal;\r
- TcoreATRequest *req;\r
- TcorePending *pending = NULL;\r
- char *cmd_str = NULL;\r
- const struct treq_sim_enable_facility *req_data;\r
- struct s_sim_property *sp = NULL;\r
- char *fac = "SC";\r
- int mode = 0; /* 0:unlock, 1:lock, 2:query*/\r
-\r
- dbg(" Function entry ");\r
-\r
- hal = tcore_object_get_hal(o);\r
- sp = tcore_sim_ref_userdata(o);\r
- pending = tcore_pending_new(o, 0);\r
- req_data = tcore_user_request_ref_data(ur, NULL);\r
-\r
- if (!o || !ur)\r
- return TCORE_RETURN_EINVAL;\r
-\r
- if(req_data->type == SIM_FACILITY_PS)\r
- {\r
- fac = "PS"; /*PH-SIM, Lock PHone to SIM/UICC card*/\r
- sp->current_sec_op = SEC_SIM_DISABLE;\r
- }else if(req_data->type == SIM_FACILITY_SC)\r
- {\r
- fac = "SC"; /*Lock SIM/UICC card, simply PIN1*/\r
- sp->current_sec_op = SEC_PIN1_DISABLE;\r
- }else if(req_data->type == SIM_FACILITY_FD)\r
- {\r
- fac = "FD"; /*Fixed Dialing Number feature, need PIN2*/\r
- sp->current_sec_op = SEC_FDN_DISABLE;\r
- }else if(req_data->type == SIM_FACILITY_PN)\r
- {\r
- fac = "PN"; /*Network Personalization*/\r
- sp->current_sec_op = SEC_NET_DISABLE;\r
- }else if(req_data->type == SIM_FACILITY_PU)\r
- {\r
- fac = "PU"; /*network sUbset Personalization*/\r
- sp->current_sec_op = SEC_NS_DISABLE;\r
- }else if(req_data->type == SIM_FACILITY_PP)\r
- {\r
- fac = "PP"; /*service Provider Personalization*/\r
- sp->current_sec_op = SEC_SP_DISABLE;\r
- }else if(req_data->type == SIM_FACILITY_PC)\r
- {\r
- fac = "PC"; /*Corporate Personalization*/\r
- sp->current_sec_op = SEC_CP_DISABLE;\r
- }else\r
- {\r
- return TCORE_RETURN_EINVAL;\r
- }\r
- cmd_str = g_strdup_printf("AT+CLCK=\"%s\", %d, \"%s\"", fac, mode, req_data->password);\r
- req = tcore_at_request_new(cmd_str, "+CLCK:", TCORE_AT_SINGLELINE);\r
-\r
- dbg("cmd : %s, prefix(if any) :%s, cmd_len : %d", req->cmd, req->prefix, strlen(req->cmd));\r
-\r
- tcore_pending_set_request_data(pending, 0, req);\r
- tcore_pending_set_response_callback(pending, on_response_disable_facility, hal);\r
- tcore_pending_link_user_request(pending, ur);\r
- tcore_pending_set_send_callback(pending, on_confirmation_sim_message_send, NULL);\r
- tcore_hal_send_request(hal, pending);\r
-\r
- free(cmd_str);\r
- dbg(" Function exit");\r
- return TCORE_RETURN_SUCCESS;\r
-}\r
-\r
-static TReturn s_get_lock_info(CoreObject *o, UserRequest *ur)\r
-{\r
- TcoreHal* hal = NULL;\r
- TcoreATRequest *req = NULL;\r
- TcorePending *pending = NULL;\r
- char *cmd_str = NULL;\r
- char *lock_type = NULL;\r
- const struct treq_sim_get_lock_info *req_data;\r
- struct s_sim_property *sp = NULL;\r
-\r
- dbg(" Function entry ");\r
-\r
- hal = tcore_object_get_hal(o);\r
- sp = tcore_sim_ref_userdata(o);\r
- pending = tcore_pending_new(o, 0);\r
- req_data = tcore_user_request_ref_data(ur, NULL);\r
-\r
- if (!o || !ur)\r
- return TCORE_RETURN_EINVAL;\r
-\r
- switch (req_data->type)\r
- {\r
- case SIM_FACILITY_PS:\r
- lock_type = "PS";\r
- break;\r
- case SIM_FACILITY_SC:\r
- lock_type = "SC";\r
- break;\r
- case SIM_FACILITY_FD:\r
- lock_type = "FD";\r
- break;\r
- case SIM_FACILITY_PN:\r
- lock_type = "PN";\r
- break;\r
- case SIM_FACILITY_PU:\r
- lock_type = "PU";\r
- break;\r
- case SIM_FACILITY_PP:\r
- lock_type = "PP";\r
- break;\r
- case SIM_FACILITY_PC:\r
- lock_type = "PC";\r
- break;\r
- default:\r
- break;\r
- }\r
- cmd_str = g_strdup_printf("AT+XPINCNT =\"%s\"", lock_type);\r
- req = tcore_at_request_new(cmd_str, "+XPINCNT:", TCORE_AT_SINGLELINE);\r
-\r
- dbg("cmd : %s, prefix(if any) :%s, cmd_len : %d", req->cmd, req->prefix, strlen(req->cmd));\r
-\r
- tcore_pending_set_request_data(pending, 0, req);\r
- tcore_pending_set_response_callback(pending, on_response_get_lock_info, hal);\r
- tcore_pending_link_user_request(pending, ur);\r
- tcore_pending_set_send_callback(pending, on_confirmation_sim_message_send, NULL);\r
- tcore_hal_send_request(hal, pending);\r
-\r
- free(cmd_str);\r
- dbg(" Function exit");\r
- return TCORE_RETURN_SUCCESS;\r
-}\r
-\r
-static TReturn s_read_file(CoreObject *o, UserRequest *ur)\r
-{\r
- TReturn api_ret = TCORE_RETURN_SUCCESS;\r
- enum tcore_request_command command;\r
- command = tcore_user_request_get_command(ur);\r
-\r
- dbg(" Function entry ");\r
-\r
- if (!o || !ur)\r
- return TCORE_RETURN_EINVAL;\r
-\r
- switch (command)\r
- {\r
- case TREQ_SIM_GET_ECC:\r
- api_ret = _get_file_info(o, ur, SIM_EF_ECC);\r
- break;\r
- case TREQ_SIM_GET_LANGUAGE:\r
- if (tcore_sim_get_type(o) == SIM_TYPE_GSM)\r
- api_ret = _get_file_info(o, ur, SIM_EF_ELP);\r
- else if (tcore_sim_get_type(o) == SIM_TYPE_USIM)\r
- api_ret = _get_file_info(o, ur, SIM_EF_LP);\r
- else\r
- api_ret = TCORE_RETURN_ENOSYS;\r
- break;\r
- case TREQ_SIM_GET_ICCID:\r
- api_ret = _get_file_info(o, ur, SIM_EF_ICCID);\r
- break;\r
- case TREQ_SIM_GET_MAILBOX:\r
- if(tcore_sim_get_cphs_status(o))\r
- api_ret = _get_file_info(o, ur, SIM_EF_CPHS_MAILBOX_NUMBERS);\r
- else\r
- api_ret = _get_file_info(o, ur, SIM_EF_MBDN);\r
- break;\r
- case TREQ_SIM_GET_CALLFORWARDING:\r
- if(tcore_sim_get_cphs_status(o))\r
- api_ret = _get_file_info(o, ur, SIM_EF_CPHS_CALL_FORWARD_FLAGS);\r
- else\r
- api_ret = _get_file_info(o, ur, SIM_EF_USIM_CFIS);\r
- break;\r
- case TREQ_SIM_GET_MESSAGEWAITING:\r
- if(tcore_sim_get_cphs_status(o))\r
- api_ret = _get_file_info(o, ur, SIM_EF_CPHS_VOICE_MSG_WAITING);\r
- else\r
- api_ret = _get_file_info(o, ur, SIM_EF_USIM_MWIS);\r
- break;\r
- case TREQ_SIM_GET_CPHS_INFO:\r
- api_ret = _get_file_info(o, ur, SIM_EF_CPHS_CPHS_INFO);\r
- break;\r
- case TREQ_SIM_GET_MSISDN:\r
- api_ret = _get_file_info(o, ur, SIM_EF_MSISDN);\r
- break;\r
- case TREQ_SIM_GET_SPN:\r
- dbg("enter case SPN");\r
- api_ret = _get_file_info(o, ur, SIM_EF_SPN);\r
- break;\r
- case TREQ_SIM_GET_SPDI:\r
- api_ret = _get_file_info(o, ur, SIM_EF_SPDI);\r
- break;\r
- case TREQ_SIM_GET_OPL:\r
- api_ret = _get_file_info(o, ur, SIM_EF_OPL);\r
- break;\r
- case TREQ_SIM_GET_PNN:\r
- api_ret = _get_file_info(o, ur, SIM_EF_PNN);\r
- break;\r
- case TREQ_SIM_GET_CPHS_NETNAME:\r
- api_ret = _get_file_info(o, ur, SIM_EF_CPHS_OPERATOR_NAME_STRING);\r
- break;\r
- case TREQ_SIM_GET_OPLMNWACT:\r
- api_ret = _get_file_info(o, ur, SIM_EF_OPLMN_ACT);\r
- break;\r
- default:\r
- dbg("error - not handled read treq command[%d]", command);\r
- api_ret = TCORE_RETURN_EINVAL;\r
- break;\r
- }\r
- dbg(" Function exit");\r
- return api_ret;\r
-}\r
-\r
-static TReturn s_update_file(CoreObject *o, UserRequest *ur)\r
-{\r
- TcoreHal* hal;\r
- TcoreATRequest *req;\r
- TcorePending *pending = NULL;\r
- char *cmd_str = NULL;\r
- TReturn api_ret = TCORE_RETURN_SUCCESS;\r
- char *encoded_data = NULL;\r
- int encoded_len = 0;\r
- enum tcore_request_command command;\r
- enum tel_sim_file_id ef = SIM_EF_INVALID;\r
- const struct treq_sim_set_callforwarding *cf;\r
- const struct treq_sim_set_language *cl;\r
- int p1 = 0;\r
- int p2 = 0;\r
- int p3 = 0;\r
- int cmd = 0;\r
- int out_length = 0;
- struct tel_sim_language sim_language;\r
-\r
- command = tcore_user_request_get_command(ur);\r
-\r
- dbg(" Function entry ");\r
-\r
- hal = tcore_object_get_hal(o);\r
- pending = tcore_pending_new(o, 0);\r
-\r
- if (!o || !ur)\r
- {
- return TCORE_RETURN_EINVAL;\r
+ recordData = util_hexStringToBytes(tmp);
+ util_hex_dump(" ", strlen(hexData) / 2, recordData);
+ free(tmp);
+
+ ptr_data = (unsigned char *) recordData;
+ if (tcore_sim_get_type(co_sim) == SIM_TYPE_USIM) {
+ /*
+ ETSI TS 102 221 v7.9.0
+ - Response Data
+ '62' FCP template tag
+ - Response for an EF
+ '82' M File Descriptor
+ '83' M File Identifier
+ 'A5' O Proprietary information
+ '8A' M Life Cycle Status Integer
+ '8B', '8C' or 'AB' C1 Security attributes
+ '80' M File size
+ '81' O Total file size
+ '88' O Short File Identifier (SFI)
+ */
+
+ /* rsim.res_len has complete data length received */
+
+ /* FCP template tag - File Control Parameters tag*/
+ if (*ptr_data == 0x62) {
+ /* parse complete FCP tag*/
+ /* increment to next byte */
+ ptr_data++;
+ tag_len = *ptr_data++;
+ dbg("tag_len: %02x", tag_len);
+ /* FCP file descriptor - file type, accessibility, DF, ADF etc*/
+ if (*ptr_data == 0x82) {
+ /* increment to next byte */
+ ptr_data++;
+ /* 2 or 5 value*/
+ ptr_data++;
+ /* unsigned char file_desc_len = *ptr_data++;*/
+ /* dbg("file descriptor length: [%d]", file_desc_len);*/
+ /* TBD: currently capture only file type : ignore sharable, non sharable, working, internal etc*/
+ /* consider only last 3 bits*/
+ dbg("file_type_tag: %02x", file_type_tag);
+ file_type_tag = file_type_tag & (*ptr_data);
+ dbg("file_type_tag: %02x", file_type_tag);
+
+ switch (file_type_tag) {
+ /* increment to next byte */
+ // ptr_data++;
+ case 0x1:
+ dbg("Getting FileType: [Transparent file type]");
+ file_type = SIM_FTYPE_TRANSPARENT;
+
+ /* increment to next byte */
+ ptr_data++;
+ /* increment to next byte */
+ ptr_data++;
+ break;
+
+ case 0x2:
+ dbg("Getting FileType: [Linear fixed file type]");
+ /* increment to next byte */
+ ptr_data++;
+ /* data coding byte - value 21 */
+ ptr_data++;
+ /* 2bytes */
+ memcpy(&record_len, ptr_data, 2);
+ /* swap bytes */
+ SWAPBYTES16(record_len);
+ ptr_data = ptr_data + 2;
+ num_of_records = *ptr_data++;
+ /* Data lossy conversation from enum (int) to unsigned char */
+ file_type = SIM_FTYPE_LINEAR_FIXED;
+ break;
+
+ case 0x6:
+ dbg(" Cyclic fixed file type");
+ /* increment to next byte */
+ ptr_data++;
+ /* data coding byte - value 21 */
+ ptr_data++;
+ /* 2bytes */
+ memcpy(&record_len, ptr_data, 2);
+ /* swap bytes */
+ SWAPBYTES16(record_len);
+ ptr_data = ptr_data + 2;
+ num_of_records = *ptr_data++;
+ file_type = SIM_FTYPE_CYCLIC;
+ break;
+
+ default:
+ dbg("not handled file type [0x%x]", *ptr_data);
+ break;
+ }
+ } else {
+ dbg("INVALID FCP received - DEbug!");
+ return;
+ }
+
+ /*File identifier - file id?? */ // 0x84,0x85,0x86 etc are currently ignored and not handled
+ if (*ptr_data == 0x83) {
+ /* increment to next byte */
+ ptr_data++;
+ file_id_len = *ptr_data++;
+ dbg("file_id_len: %02x", file_id_len);
+
+ memcpy(&file_id, ptr_data, file_id_len);
+ dbg("file_id: %x", file_id);
+
+ /* swap bytes */
+ SWAPBYTES16(file_id);
+ dbg("file_id: %x", file_id);
+
+ ptr_data = ptr_data + 2;
+ dbg("Getting FileID=[0x%x]", file_id);
+ } else {
+ dbg("INVALID FCP received - DEbug!");
+ free(recordData);
+ return;
+ }
+
+ /* proprietary information */
+ if (*ptr_data == 0xA5) {
+ unsigned short prop_len;
+ /* increment to next byte */
+ ptr_data++;
+
+ /* length */
+ prop_len = *ptr_data;
+ dbg("prop_len: %02x", prop_len);
+
+ /* skip data */
+ ptr_data = ptr_data + prop_len + 1;
+ } else {
+ dbg("INVALID FCP received - DEbug!");
+ }
+
+ /* life cycle status integer [8A][length:0x01][status]*/
+ /*
+ status info b8~b1
+ 00000000 : No information given
+ 00000001 : creation state
+ 00000011 : initialization state
+ 000001-1 : operation state -activated
+ 000001-0 : operation state -deactivated
+ 000011-- : Termination state
+ b8~b5 !=0, b4~b1=X : Proprietary
+ Any other value : RFU
+ */
+ if (*ptr_data == 0x8A) {
+ /* increment to next byte */
+ ptr_data++;
+ /* length - value 1 */
+ ptr_data++;
+
+ switch (*ptr_data) {
+ case 0x04:
+ case 0x06:
+ dbg("<RX> operation state -deactivated");
+ ptr_data++;
+ break;
+
+ case 0x05:
+ case 0x07:
+ dbg("<RX> operation state -activated");
+ ptr_data++;
+ break;
+
+ default:
+ dbg("<RX> DEBUG! LIFE CYCLE STATUS =[0x%x]", *ptr_data);
+ ptr_data++;
+ break;
+ }
+ }
+
+ /* related to security attributes : currently not handled*/
+ if (*ptr_data == 0x86 || *ptr_data == 0x8B || *ptr_data == 0x8C || *ptr_data == 0xAB) {
+ /* increment to next byte */
+ ptr_data++;
+ /* if tag length is 3 */
+ if (*ptr_data == 0x03) {
+ /* increment to next byte */
+ ptr_data++;
+ /* EFARR file id */
+ memcpy(&arr_file_id, ptr_data, 2);
+ /* swap byes */
+ SWAPBYTES16(arr_file_id);
+ ptr_data = ptr_data + 2;
+ arr_file_id_rec_num = *ptr_data++;
+ } else {
+ /* if tag length is not 3 */
+ /* ignoring bytes */
+ // ptr_data = ptr_data + 4;
+ dbg("Useless security attributes, so jump to next tag");
+ ptr_data = ptr_data + (*ptr_data + 1);
+ }
+ } else {
+ dbg("INVALID FCP received[0x%x] - DEbug!", *ptr_data);
+ free(recordData);
+ return;
+ }
+
+ dbg("Current ptr_data value is [%x]", *ptr_data);
+
+ /* file size excluding structural info*/
+ if (*ptr_data == 0x80) {
+ /* for EF file size is body of file and for Linear or cyclic it is
+ * number of recXsizeof(one record)
+ */
+ /* increment to next byte */
+ ptr_data++;
+ /* length is 1 byte - value is 2 bytes or more */
+ ptr_data++;
+ memcpy(&file_size, ptr_data, 2);
+ /* swap bytes */
+ SWAPBYTES16(file_size);
+ ptr_data = ptr_data + 2;
+ } else {
+ dbg("INVALID FCP received - DEbug!");
+ free(recordData);
+ return;
+ }
+
+ /* total file size including structural info*/
+ if (*ptr_data == 0x81) {
+ int len;
+ /* increment to next byte */
+ ptr_data++;
+ /* length */
+ len = *ptr_data;
+ /* ignored bytes */
+ ptr_data = ptr_data + 3;
+ } else {
+ dbg("INVALID FCP received - DEbug!");
+ /* 0x81 is optional tag?? check out! so do not return -1 from here! */
+ /* return -1; */
+ }
+ /*short file identifier ignored*/
+ if (*ptr_data == 0x88) {
+ dbg("0x88: Do Nothing");
+ /*DO NOTHING*/
+ }
+ } else {
+ dbg("INVALID FCP received - DEbug!");
+ free(recordData);
+ return;
+ }
+ } else if (tcore_sim_get_type(co_sim) == SIM_TYPE_GSM) {
+ unsigned char gsm_specific_file_data_len = 0;
+ /* ignore RFU byte1 and byte2 */
+ ptr_data++;
+ ptr_data++;
+ /* file size */
+ // file_size = p_info->response_len;
+ memcpy(&file_size, ptr_data, 2);
+ /* swap bytes */
+ SWAPBYTES16(file_size);
+ /* parsed file size */
+ ptr_data = ptr_data + 2;
+ /* file id */
+ memcpy(&file_id, ptr_data, 2);
+ SWAPBYTES16(file_id);
+ dbg(" FILE id --> [%x]", file_id);
+ ptr_data = ptr_data + 2;
+ /* save file type - transparent, linear fixed or cyclic */
+ file_type_tag = (*(ptr_data + 7));
+
+ switch (*ptr_data) {
+ case 0x0:
+ /* RFU file type */
+ dbg(" RFU file type- not handled - Debug!");
+ break;
+
+ case 0x1:
+ /* MF file type */
+ dbg(" MF file type - not handled - Debug!");
+ break;
+
+ case 0x2:
+ /* DF file type */
+ dbg(" DF file type - not handled - Debug!");
+ break;
+
+ case 0x4:
+ /* EF file type */
+ dbg(" EF file type [%d] ", file_type_tag);
+ /* increment to next byte */
+ ptr_data++;
+
+ if (file_type_tag == 0x00 || file_type_tag == 0x01) {
+ /* increament to next byte as this byte is RFU */
+ ptr_data++;
+ file_type =
+ (file_type_tag == 0x00) ? SIM_FTYPE_TRANSPARENT : SIM_FTYPE_LINEAR_FIXED;
+ } else {
+ /* increment to next byte */
+ ptr_data++;
+ /* For a cyclic EF all bits except bit 7 are RFU; b7=1 indicates that */
+ /* the INCREASE command is allowed on the selected cyclic file. */
+ file_type = SIM_FTYPE_CYCLIC;
+ }
+ /* bytes 9 to 11 give SIM file access conditions */
+ ptr_data++;
+ /* byte 10 has one nibble that is RF U and another for INCREASE which is not used currently */
+ ptr_data++;
+ /* byte 11 is invalidate and rehabilate nibbles */
+ ptr_data++;
+ /* byte 12 - file status */
+ ptr_data++;
+ /* byte 13 - GSM specific data */
+ gsm_specific_file_data_len = *ptr_data;
+ ptr_data++;
+ /* byte 14 - structure of EF - transparent or linear or cyclic , already saved above */
+ ptr_data++;
+ /* byte 15 - length of record for linear and cyclic , for transparent it is set to 0x00. */
+ record_len = *ptr_data;
+ dbg("record length[%d], file size[%d]", record_len, file_size);
+
+ if (record_len != 0)
+ num_of_records = (file_size / record_len);
+
+ dbg("Number of records [%d]", num_of_records);
+ break;
+
+ default:
+ dbg(" not handled file type");
+ break;
+ }
+ } else {
+ dbg(" Card Type - UNKNOWN [%d]", tcore_sim_get_type(co_sim));
+ }
+
+ dbg("req ef[0x%x] resp ef[0x%x] size[%ld] Type[0x%x] NumOfRecords[%ld] RecordLen[%ld]",
+ file_meta->file_id, file_id, file_size, file_type, num_of_records, record_len);
+
+ file_meta->file_type = file_type;
+ file_meta->data_size = file_size;
+ file_meta->rec_length = record_len;
+ file_meta->rec_count = num_of_records;
+ file_meta->current_index = 0; // reset for new record type EF
+ rt = SIM_ACCESS_SUCCESS;
+ free(recordData);
+ } else {
+ /*2. SIM access fail case*/
+ dbg("error to get ef[0x%x]", file_meta->file_id);
+ dbg("error to get ef[0x%x] (file_meta->file_id) ", file_meta->file_id);
+ rt = _decode_status_word(sw1, sw2);
+ }
+ ur = tcore_user_request_ref(ur);
+
+ dbg("Calling _next_from_get_file_info");
+ _next_from_get_file_info(co_sim, ur, file_meta->file_id, rt);
+ tcore_at_tok_free(tokens);
+ } else {
+ dbg("RESPONSE NOK");
+ dbg("error to get ef[0x%x]", file_meta->file_id);
+ dbg("error to get ef[0x%x] (file_meta->file_id) ", file_meta->file_id);
+ rt = SIM_ACCESS_FAILED;
+
+ ur = tcore_user_request_ref(ur);
+ _next_from_get_file_info(co_sim, ur, file_meta->file_id, rt);
}
-\r
- switch (command)
- {
- case TREQ_SIM_SET_LANGUAGE:\r
- cl = tcore_user_request_ref_data(ur, NULL);\r
- memset(&sim_language, 0x00, sizeof(struct tel_sim_language));\r
- cmd = 214;\r
-
- sim_language.language_count = 1;\r
- sim_language.language[0] = cl->language;\r
- dbg("language %d", cl->language);
-
- if (tcore_sim_get_type(o) == SIM_TYPE_GSM)\r
- {\r
- int i;
- dbg("2G");\r
- ef = SIM_EF_ELP;\r
- encoded_data = tcore_sim_encode_li(&out_length, &sim_language);
- p1 = 0;
- p2 = 0;
- p3 = out_length;
- for(i=0; i<out_length; i++)
- {
- dbg("encoded_data - %d ---", encoded_data[i]);
+ dbg(" Function exit");
+}
+
+static void _response_get_file_data(TcorePending *p, int data_len, const void *data, void *user_data)
+{
+ const TcoreATResponse *resp = data;
+ UserRequest *ur = NULL;
+ CoreObject *co_sim = NULL;
+ struct s_sim_property *file_meta = NULL;
+ GSList *tokens = NULL;
+ enum tel_sim_access_result rt;
+ struct tel_sim_imsi imsi;
+ struct tel_sim_ecc ecc;
+ struct tel_sim_msisdn msisdn;
+ struct tel_sim_opl opl;
+ struct tel_sim_pnn pnn;
+ gboolean dr = FALSE;
+ const char *line = NULL;
+ char *res = NULL;
+ char *tmp = NULL;
+ int res_len;
+ int sw1 = 0;
+ int sw2 = 0;
+
+ dbg(" Function entry ");
+
+ co_sim = tcore_pending_ref_core_object(p);
+ ur = tcore_pending_ref_user_request(p);
+ file_meta = (struct s_sim_property *) tcore_user_request_ref_metainfo(ur, NULL);
+
+ if (resp->success > 0) {
+ dbg("RESPONSE OK");
+ if (resp->lines) {
+ line = (const char *) resp->lines->data;
+ tokens = tcore_at_tok_new(line);
+ if (g_slist_length(tokens) != 3) {
+ msg("invalid message");
+ tcore_at_tok_free(tokens);
+ return;
+ }
+ }
+ sw1 = atoi(g_slist_nth_data(tokens, 0));
+ sw2 = atoi(g_slist_nth_data(tokens, 1));
+ res = g_slist_nth_data(tokens, 2);
+
+ tmp = util_removeQuotes(res);
+ res = util_hexStringToBytes(tmp);
+ res_len = strlen((const char *) res);
+ dbg("res: %s res_len: %d", res, res_len);
+
+ if ((sw1 == 0x90 && sw2 == 0x00) || sw1 == 0x91) {
+ rt = SIM_ACCESS_SUCCESS;
+ file_meta->files.result = rt;
+ dbg("file_meta->file_id : %x", file_meta->file_id);
+
+ switch (file_meta->file_id) {
+ case SIM_EF_IMSI:
+ {
+ dbg("res: %s", res);
+ dr = tcore_sim_decode_imsi(&imsi, (unsigned char *) res, res_len);
+ if (dr == FALSE) {
+ dbg("imsi decoding failed");
+ } else {
+ _sim_check_identity(co_sim, &imsi);
+ tcore_sim_set_imsi(co_sim, &imsi);
+ }
+ break;
+ }
+
+ case SIM_EF_ICCID:
+ dr = tcore_sim_decode_iccid(&file_meta->files.data.iccid, (unsigned char *) res, res_len);
+ break;
+
+ case SIM_EF_ELP: /* 2G EF - 2 bytes decoding*/
+ case SIM_EF_USIM_LI: /* 3G EF - 2 bytes decoding*/
+ case SIM_EF_USIM_PL: /* 3G EF - same as EFELP, so 2 byte decoding*/
+ case SIM_EF_LP: /* 1 byte encoding*/
+ if (tcore_sim_get_type(co_sim) == SIM_TYPE_GSM && file_meta->file_id == SIM_EF_LP) {
+ /*2G LP(0x6F05) has 1 byte for each language*/
+ dr = tcore_sim_decode_lp(&file_meta->files.data.language, (unsigned char *) res, res_len);
+ } else {
+ /*3G LI(0x6F05)/PL(0x2F05), 2G ELP(0x2F05) has 2 bytes for each language*/
+ dr = tcore_sim_decode_li(file_meta->file_id, &file_meta->files.data.language, (unsigned char *) res, res_len);
+ }
+ break;
+
+ case SIM_EF_SPN:
+ dr = tcore_sim_decode_spn(&file_meta->files.data.spn, (unsigned char *) res, res_len);
+ break;
+
+ case SIM_EF_SPDI:
+ dr = tcore_sim_decode_spdi(&file_meta->files.data.spdi, (unsigned char *) res, res_len);
+ break;
+
+ case SIM_EF_ECC:
+ if (tcore_sim_get_type(co_sim) == SIM_TYPE_GSM) {
+ dr = tcore_sim_decode_ecc(&file_meta->files.data.ecc, (unsigned char *) res, res_len);
+ } else if (tcore_sim_get_type(co_sim) == SIM_TYPE_USIM) {
+ dbg("decode w/ index [%d]", file_meta->current_index);
+ memset(&ecc, 0x00, sizeof(struct tel_sim_ecc));
+ dr = tcore_sim_decode_uecc(&ecc, (unsigned char *) res, res_len);
+ if (dr == TRUE) {
+ memcpy(&file_meta->files.data.ecc.ecc[file_meta->files.data.ecc.ecc_count], &ecc, sizeof(struct tel_sim_ecc));
+ file_meta->files.data.ecc.ecc_count++;
+ }
+ } else {
+ dbg("err not handled tcore_sim_get_type(o)[%d] in here", tcore_sim_get_type(co_sim));
+ }
+ break;
+
+ case SIM_EF_MSISDN:
+ dbg("decode w/ index [%d]", file_meta->current_index);
+ memset(&msisdn, 0x00, sizeof(struct tel_sim_msisdn));
+ dr = tcore_sim_decode_msisdn(&msisdn, (unsigned char *) res, res_len);
+ if (dr == TRUE) {
+ memcpy(&file_meta->files.data.msisdn_list.msisdn[file_meta->files.data.msisdn_list.count], &msisdn, sizeof(struct tel_sim_msisdn));
+ file_meta->files.data.msisdn_list.count++;
+ }
+ break;
+
+ case SIM_EF_OPL:
+ dbg("decode w/ index [%d]", file_meta->current_index);
+ memset(&opl, 0x00, sizeof(struct tel_sim_opl));
+ dr = tcore_sim_decode_opl(&opl, (unsigned char *) res, res_len);
+ if (dr == TRUE) {
+ memcpy(&file_meta->files.data.opl.opl[file_meta->files.data.opl.opl_count], &opl, sizeof(struct tel_sim_opl));
+ file_meta->files.data.opl.opl_count++;
}
- dbg("encoded_data - %s ---", encoded_data);
- dbg("out_length - %d ---", out_length);
- }\r
- else if (tcore_sim_get_type(o) == SIM_TYPE_USIM)\r
- {\r
- int i;
- dbg("3G");\r
- ef = SIM_EF_LP;\r
- encoded_data = tcore_sim_encode_li(&out_length, &sim_language);
- p1 = 0;
- p2 = 0;
- p3 = out_length;
- for(i=0; i<out_length; i++)
- {
- dbg("encoded_data - %d ---", encoded_data[i]);
+ break;
+
+ case SIM_EF_PNN:
+ dbg("decode w/ index [%d]", file_meta->current_index);
+ memset(&pnn, 0x00, sizeof(struct tel_sim_pnn));
+ dr = tcore_sim_decode_pnn(&pnn, (unsigned char *) res, res_len);
+ if (dr == TRUE) {
+ memcpy(&file_meta->files.data.pnn.pnn[file_meta->files.data.pnn.pnn_count], &opl, sizeof(struct tel_sim_pnn));
+ file_meta->files.data.pnn.pnn_count++;
}
- dbg("out_length - %d ---", out_length);
- }\r
- else\r
- {\r
- api_ret = TCORE_RETURN_ENOSYS;\r
- }\r
- break;\r
-\r
- case TREQ_SIM_SET_CALLFORWARDING:\r
- cf = tcore_user_request_ref_data(ur, NULL);\r
- if(tcore_sim_get_cphs_status(o))\r
- {\r
- encoded_data = tcore_sim_encode_cff((const struct tel_sim_callforwarding*)cf);\r
- ef = SIM_EF_CPHS_CALL_FORWARD_FLAGS;\r
- p1 = 0;\r
- p2 = 0;\r
- p3 = strlen(encoded_data);\r
- cmd = 214; /*command - 214 : UPDATE BINARY*/\r
- } else\r
- {\r
- encoded_data = tcore_sim_encode_cfis(&encoded_len, (const struct tel_sim_callforwarding*)cf);\r
- ef = SIM_EF_USIM_CFIS;\r
- p1 = 1;\r
- p2 = 0x04;\r
- p3 = encoded_len;\r
- cmd = 220; /*command - 220 : UPDATE RECORD*/\r
- }\r
- break;\r
-\r
- default:\r
- dbg("error - not handled update treq command[%d]", command);\r
- api_ret = TCORE_RETURN_EINVAL;\r
- break;\r
- }\r
- cmd_str = g_strdup_printf("AT+CRSM=%d,%d,%d,%d,%d,\"%s\"", cmd,ef,p1,p2,p3, encoded_data);\r
- req = tcore_at_request_new(cmd_str, "+CRSM:", TCORE_AT_SINGLELINE);\r
-\r
- dbg("cmd : %s, prefix(if any) :%s, cmd_len : %d", req->cmd, req->prefix, strlen(req->cmd));\r
-\r
- tcore_pending_set_request_data(pending, 0, req);\r
- tcore_pending_set_response_callback(pending, on_response_update_file, hal);\r
- tcore_pending_link_user_request(pending, ur);\r
- tcore_pending_set_send_callback(pending, on_confirmation_sim_message_send, NULL);\r
-\r
- tcore_hal_send_request(hal, pending);\r
- if(NULL != encoded_data){\r
- g_free(encoded_data);\r
- }\r
- free(cmd_str);\r
- dbg(" Function exit");\r
- return TCORE_RETURN_SUCCESS;\r
-}\r
-\r
-static TReturn s_transmit_apdu(CoreObject *o, UserRequest *ur)\r
-{\r
- TcoreHal* hal= NULL;\r
- TcoreATRequest *req= NULL;\r
- TcorePending *pending = NULL;\r
- char *cmd_str = NULL;\r
- const struct treq_sim_transmit_apdu *req_data;\r
- dbg(" Function entry ");\r
-\r
- hal = tcore_object_get_hal(o);\r
- pending = tcore_pending_new(o, 0);\r
- req_data = tcore_user_request_ref_data(ur, NULL);\r
-\r
- if (!o || !ur)\r
- return TCORE_RETURN_EINVAL;\r
-\r
- cmd_str = g_strdup_printf("AT+CSIM=%d,\"%s\"", req_data->apdu_length, req_data->apdu);\r
-\r
- req = tcore_at_request_new(cmd_str, "+CSIM:", TCORE_AT_SINGLELINE);\r
-\r
- dbg("cmd : %s, prefix(if any) :%s, cmd_len : %d", req->cmd, req->prefix, strlen(req->cmd));\r
-\r
- tcore_pending_set_request_data(pending, 0, req);\r
- tcore_pending_set_response_callback(pending, on_response_transmit_apdu, hal);\r
- tcore_pending_link_user_request(pending, ur);\r
- tcore_pending_set_send_callback(pending, on_confirmation_sim_message_send, NULL);\r
- tcore_hal_send_request(hal, pending);\r
-\r
- free(cmd_str);\r
- dbg(" Function exit");\r
- return TCORE_RETURN_SUCCESS;\r
-}\r
-\r
-static struct tcore_sim_operations sim_ops =\r
-{\r
- .verify_pins = s_verify_pins,\r
- .verify_puks = s_verify_puks,\r
- .change_pins = s_change_pins,\r
- .get_facility_status = s_get_facility_status,\r
- .enable_facility = s_enable_facility,\r
- .disable_facility = s_disable_facility,\r
- .get_lock_info = s_get_lock_info,\r
- .read_file = s_read_file,\r
- .update_file = s_update_file,\r
- .transmit_apdu = s_transmit_apdu,\r
- /*ToDo - Need to be implemented in Phase-2*/\r
- /*.get_atr = s_get_atr,\r
- .req_authentication = s_req_authentication*/\r
-};\r
-\r
-gboolean s_sim_init(TcorePlugin *p, TcoreHal *h)\r
-{\r
- CoreObject *o;\r
- struct s_sim_property *file_meta = NULL;\r
- GQueue *work_queue;\r
-\r
- dbg("entry");\r
-\r
- o = tcore_sim_new(p, "sim", &sim_ops, h);\r
-\r
- if (!o)\r
- return FALSE;\r
-\r
- file_meta = calloc(sizeof(struct s_sim_property),1);\r
- if (!file_meta)\r
- return FALSE;\r
-\r
- work_queue = g_queue_new();\r
- tcore_object_link_user_data(o, work_queue);\r
-\r
- file_meta->first_recv_status = SIM_STATUS_UNKNOWN;\r
- tcore_sim_link_userdata(o, file_meta);\r
- \r
- tcore_object_add_callback(o, "+XLOCK", on_event_facility_lock_status, NULL);\r
- tcore_object_add_callback(o, "+XSIM", on_event_pin_status, NULL);\r
-\r
- dbg("exit");\r
- return TRUE;\r
-}\r
-\r
-void s_sim_exit(TcorePlugin *p)\r
-{\r
- CoreObject *o;\r
-\r
- o = tcore_plugin_ref_core_object(p, "sim");\r
- if (!o)\r
- return;\r
- tcore_sim_free(o);\r
+ break;
+
+ case SIM_EF_OPLMN_ACT:
+ dr = tcore_sim_decode_oplmnwact(&file_meta->files.data.opwa, (unsigned char *) res, res_len);
+ break;
+
+ case SIM_EF_CPHS_CALL_FORWARD_FLAGS:
+ dr = tcore_sim_decode_cff(&file_meta->files.data.cf, (unsigned char *) res, res_len);
+ break;
+
+ case SIM_EF_CPHS_VOICE_MSG_WAITING:
+ dr = tcore_sim_decode_vmwf(&file_meta->files.data.mw.mw_data_u.cphs_mw, (unsigned char *) res, res_len);
+ break;
+
+ case SIM_EF_USIM_MWIS:
+ dr = tcore_sim_decode_mwis(&file_meta->files.data.mw.mw_data_u.mw, (unsigned char *) res, res_len);
+ break;
+
+ case SIM_EF_USIM_CFIS:
+ dr = tcore_sim_decode_cfis(&file_meta->files.data.cf, (unsigned char *) res, res_len);
+ break;
+
+ case SIM_EF_CPHS_SERVICE_STRING_TABLE:
+ dbg(" not handled -SIM_EF_CPHS_SERVICE_STRING_TABLE ");
+ break;
+
+ case SIM_EF_CPHS_OPERATOR_NAME_STRING:
+ dr = tcore_sim_decode_ons((unsigned char *) &file_meta->files.data.cphs_net.full_name, (unsigned char *) res, res_len);
+ dbg(" file_meta->files.result[%d],file_meta->files.data.cphs_net.full_name[%s]", file_meta->files.result, file_meta->files.data.cphs_net.full_name);
+ break;
+
+ case SIM_EF_CPHS_CPHS_INFO:
+ dr = tcore_sim_decode_cphs_info(&file_meta->files.data.cphs, (unsigned char *) res, res_len);
+ break;
+
+ case SIM_EF_CPHS_OPERATOR_NAME_SHORT_FORM_STRING:
+ dr = tcore_sim_decode_short_ons((unsigned char *) &file_meta->files.data.cphs_net.short_name, (unsigned char *) res, res_len);
+ break;
+
+ default:
+ dbg("File Decoding Failed - not handled File[0x%x]", file_meta->file_id);
+ dr = 0;
+ break;
+ }
+ } else {
+ rt = _decode_status_word(sw1, sw2);
+ file_meta->files.result = rt;
+ }
+ free(tmp);
+ tcore_at_tok_free(tokens);
+ } else {
+ dbg("RESPONSE NOK");
+ dbg("error to get ef[0x%x]", file_meta->file_id);
+ rt = SIM_ACCESS_FAILED;
+ }
+ ur = tcore_user_request_ref(ur);
+
+ dbg("Calling _next_from_get_file_data");
+ _next_from_get_file_data(tcore_pending_ref_core_object(p), ur, rt, dr);
+ dbg(" Function exit");
+}
+
+static void _on_response_get_retry_count(TcorePending *p, int data_len, const void *data, void *user_data)
+{
+ const TcoreATResponse *resp = data;
+ UserRequest *ur = NULL;
+ CoreObject *co_sim = NULL;
+ struct s_sim_property *sp = NULL;
+ GSList *tokens = NULL;
+ const char *line = NULL;
+ struct tresp_sim_verify_pins v_pin = {0, };
+ struct tresp_sim_verify_puks v_puk = {0, };
+ struct tresp_sim_change_pins change_pin = {0, };
+ struct tresp_sim_disable_facility dis_facility = {0, };
+ struct tresp_sim_enable_facility en_facility = {0, };
+ int lock_type = 0;
+ int attempts_left = 0;
+ int time_penalty = 0;
+
+ dbg(" Function entry ");
+
+ co_sim = tcore_pending_ref_core_object(p);
+ sp = tcore_sim_ref_userdata(co_sim);
+ ur = tcore_pending_ref_user_request(p);
+
+ if (resp->success > 0) {
+ dbg("RESPONSE OK");
+ if (resp->lines) {
+ line = (const char *) resp->lines->data;
+ tokens = tcore_at_tok_new(line);
+ if (g_slist_length(tokens) < 3) {
+ msg("invalid message");
+ tcore_at_tok_free(tokens);
+ return;
+ }
+ }
+ lock_type = atoi(g_slist_nth_data(tokens, 0));
+ attempts_left = atoi(g_slist_nth_data(tokens, 1));
+ time_penalty = atoi(g_slist_nth_data(tokens, 2));
+
+ dbg("lock_type = %d, attempts_left = %d, time_penalty = %d",
+ lock_type, attempts_left, time_penalty);
+
+ switch (sp->current_sec_op) {
+ case SEC_PIN1_VERIFY:
+ case SEC_PIN2_VERIFY:
+ case SEC_SIM_VERIFY:
+ case SEC_ADM_VERIFY:
+ v_pin.result = SIM_INCORRECT_PASSWORD;
+ v_pin.pin_type = _sim_get_current_pin_facility(sp->current_sec_op);
+ v_pin.retry_count = attempts_left;
+ tcore_user_request_send_response(ur, _find_resp_command(ur),
+ sizeof(struct tresp_sim_verify_pins), &v_pin);
+ break;
+
+ case SEC_PUK1_VERIFY:
+ case SEC_PUK2_VERIFY:
+ v_puk.result = SIM_INCORRECT_PASSWORD;
+ v_puk.pin_type = _sim_get_current_pin_facility(sp->current_sec_op);
+ v_puk.retry_count = attempts_left;
+ tcore_user_request_send_response(ur, _find_resp_command(ur),
+ sizeof(struct tresp_sim_verify_puks), &v_puk);
+ break;
+
+ case SEC_PIN1_CHANGE:
+ case SEC_PIN2_CHANGE:
+ change_pin.result = SIM_INCORRECT_PASSWORD;
+ change_pin.pin_type = _sim_get_current_pin_facility(sp->current_sec_op);
+ change_pin.retry_count = attempts_left;
+ tcore_user_request_send_response(ur, _find_resp_command(ur),
+ sizeof(struct tresp_sim_change_pins), &change_pin);
+ break;
+
+ case SEC_PIN1_DISABLE:
+ case SEC_PIN2_DISABLE:
+ case SEC_FDN_DISABLE:
+ case SEC_SIM_DISABLE:
+ case SEC_NET_DISABLE:
+ case SEC_NS_DISABLE:
+ case SEC_SP_DISABLE:
+ case SEC_CP_DISABLE:
+ dis_facility.result = SIM_INCORRECT_PASSWORD;
+ dis_facility.type = _sim_get_current_pin_facility(sp->current_sec_op);
+ dis_facility.retry_count = attempts_left;
+ tcore_user_request_send_response(ur, _find_resp_command(ur),
+ sizeof(struct tresp_sim_disable_facility), &dis_facility);
+ break;
+
+ case SEC_PIN1_ENABLE:
+ case SEC_PIN2_ENABLE:
+ case SEC_FDN_ENABLE:
+ case SEC_SIM_ENABLE:
+ case SEC_NET_ENABLE:
+ case SEC_NS_ENABLE:
+ case SEC_SP_ENABLE:
+ case SEC_CP_ENABLE:
+ en_facility.result = SIM_INCORRECT_PASSWORD;
+ en_facility.type = _sim_get_current_pin_facility(sp->current_sec_op);
+ en_facility.retry_count = attempts_left;
+ tcore_user_request_send_response(ur, _find_resp_command(ur),
+ sizeof(struct tresp_sim_enable_facility), &en_facility);
+ break;
+
+ default:
+ dbg("not handled sec op[%d]", sp->current_sec_op);
+ break;
+ }
+ tcore_at_tok_free(tokens);
+ }
+ dbg(" Function exit");
+}
+
+static gboolean _get_sim_type(CoreObject *o)
+{
+ TcoreHal *hal = NULL;
+ TcoreATRequest *req = NULL;
+ TcorePending *pending = NULL;
+ UserRequest *ur = NULL;
+ char *cmd_str = NULL;
+
+ dbg(" Function entry ");
+
+ hal = tcore_object_get_hal(o);
+ pending = tcore_pending_new(o, 0);
+
+ cmd_str = g_strdup_printf("AT+XUICC?");
+ req = tcore_at_request_new(cmd_str, "+XUICC:", TCORE_AT_SINGLELINE);
+
+ dbg("cmd : %s, prefix(if any) :%s, cmd_len : %d", req->cmd, req->prefix, strlen(req->cmd));
+
+ tcore_pending_set_request_data(pending, 0, req);
+ tcore_pending_set_response_callback(pending, _response_get_sim_type, hal);
+ tcore_pending_link_user_request(pending, ur);
+ tcore_pending_set_send_callback(pending, on_confirmation_sim_message_send, NULL);
+ tcore_hal_send_request(hal, pending);
+
+ free(cmd_str);
+ dbg(" Function exit");
+ return TRUE;
+}
+
+static TReturn _get_file_info(CoreObject *o, UserRequest *ur, const enum tel_sim_file_id ef)
+{
+ TcoreHal *hal = NULL;
+ TcorePending *pending = NULL;
+ struct s_sim_property file_meta = {0, };
+ char *cmd_str = NULL;
+ int trt = 0;
+
+ dbg(" Function entry ");
+
+ file_meta.file_id = ef;
+ dbg("file_meta.file_id: %d", file_meta.file_id);
+ hal = tcore_object_get_hal(o);
+ dbg("hal: %x", hal);
+ pending = tcore_pending_new(o, 0);
+
+ trt = tcore_user_request_set_metainfo(ur, sizeof(struct s_sim_property), &file_meta);
+ dbg("trt[%d]", trt);
+ cmd_str = g_strdup_printf("AT+CRSM=192, %d", ef); /*command - 192 : GET RESPONSE*/
+ dbg("cmd_str: %x", cmd_str);
+
+ pending = tcore_at_pending_new(o, cmd_str, "+CRSM:", TCORE_AT_SINGLELINE, _response_get_file_info, NULL);
+ tcore_pending_link_user_request(pending, ur);
+ tcore_hal_send_request(hal, pending);
+
+ free(cmd_str);
+ dbg(" Function exit");
+ return TCORE_RETURN_SUCCESS;
+}
+
+static gboolean _get_file_data(CoreObject *o, UserRequest *ur, const enum tel_sim_file_id ef, const int offset, const int length)
+{
+ TcoreHal *hal = NULL;
+ TcoreATRequest *req = NULL;
+ TcorePending *pending = NULL;
+ char *cmd_str = NULL;
+ int p1 = 0;
+ int p2 = 0;
+ int p3 = 0;
+
+ dbg(" Function entry ");
+ hal = tcore_object_get_hal(o);
+ pending = tcore_pending_new(o, 0);
+
+ dbg("file_id: %x", ef);
+
+ p1 = (unsigned char) (offset & 0xFF00) >> 8;
+ p2 = (unsigned char) offset & 0x00FF; // offset low
+ p3 = (unsigned char) length;
+
+ cmd_str = g_strdup_printf("AT+CRSM=176, %d, %d, %d, %d", ef, p1, p2, p3); /*command - 176 : READ BINARY*/
+
+ req = tcore_at_request_new(cmd_str, "+CRSM:", TCORE_AT_SINGLELINE);
+
+ dbg("cmd : %s, prefix(if any) :%s, cmd_len : %d", req->cmd, req->prefix, strlen(req->cmd));
+
+ tcore_pending_set_request_data(pending, 0, req);
+ tcore_pending_set_response_callback(pending, _response_get_file_data, hal);
+ tcore_pending_link_user_request(pending, ur);
+ tcore_pending_set_send_callback(pending, on_confirmation_sim_message_send, NULL);
+
+ tcore_hal_send_request(hal, pending);
+
+ free(cmd_str);
+ dbg(" Function exit");
+ return TRUE;
+}
+
+static gboolean _get_file_record(CoreObject *o, UserRequest *ur, const enum tel_sim_file_id ef, const int index, const int length)
+{
+ TcoreHal *hal = NULL;
+ TcoreATRequest *req = NULL;
+ TcorePending *pending = NULL;
+ char *cmd_str = NULL;
+ int p1 = 0;
+ int p2 = 0;
+ int p3 = 0;
+ dbg(" Function entry ");
+
+ hal = tcore_object_get_hal(o);
+ pending = tcore_pending_new(o, 0);
+
+ p1 = (unsigned char) index;
+ p2 = (unsigned char) 0x04; /* 0x4 for absolute mode */
+ p3 = (unsigned char) length;
+
+ cmd_str = g_strdup_printf("AT+CRSM=178, %d, %d, %d, %d", ef, p1, p2, p3); /*command - 178 : READ RECORD*/
+
+ req = tcore_at_request_new(cmd_str, "+CRSM:", TCORE_AT_SINGLELINE);
+
+ dbg("cmd : %s, prefix(if any) :%s, cmd_len : %d", req->cmd, req->prefix, strlen(req->cmd));
+
+ tcore_pending_set_request_data(pending, 0, req);
+ tcore_pending_set_response_callback(pending, _response_get_file_data, hal);
+ tcore_pending_link_user_request(pending, ur);
+ tcore_pending_set_send_callback(pending, on_confirmation_sim_message_send, NULL);
+
+ tcore_hal_send_request(hal, pending);
+
+ free(cmd_str);
+ dbg(" Function exit");
+ return TRUE;
+}
+
+static TReturn _get_retry_count(CoreObject *o, UserRequest *ur)
+{
+ TcoreHal *hal = NULL;
+ TcoreATRequest *req = NULL;
+ TcorePending *pending = NULL;
+ char *cmd_str = NULL;
+ int lock_type = 0;
+ struct s_sim_property *sp = NULL;
+ const struct treq_sim_get_lock_info *req_data = NULL;
+
+ dbg(" Function entry ");
+
+ hal = tcore_object_get_hal(o);
+ pending = tcore_pending_new(o, 0);
+ req_data = tcore_user_request_ref_data(ur, NULL);
+ sp = tcore_sim_ref_userdata(o);
+
+ switch (sp->current_sec_op) {
+ case SEC_PIN1_VERIFY:
+ case SEC_PIN1_CHANGE:
+ case SEC_PIN1_ENABLE:
+ case SEC_PIN1_DISABLE:
+ lock_type = 1;
+ break;
+
+ case SEC_PIN2_VERIFY:
+ case SEC_PIN2_CHANGE:
+ case SEC_PIN2_ENABLE:
+ case SEC_PIN2_DISABLE:
+ case SEC_FDN_ENABLE:
+ case SEC_FDN_DISABLE:
+ lock_type = 2;
+ break;
+
+ case SEC_PUK1_VERIFY:
+ lock_type = 3;
+ break;
+
+ case SEC_PUK2_VERIFY:
+ lock_type = 4;
+ break;
+
+ case SEC_NET_ENABLE:
+ case SEC_NET_DISABLE:
+ lock_type = 5;
+ break;
+
+ case SEC_NS_ENABLE:
+ case SEC_NS_DISABLE:
+ lock_type = 6;
+ break;
+
+ case SEC_SP_ENABLE:
+ case SEC_SP_DISABLE:
+ lock_type = 7;
+ break;
+
+ case SEC_CP_ENABLE:
+ case SEC_CP_DISABLE:
+ lock_type = 8;
+ break;
+
+ case SEC_ADM_VERIFY:
+ lock_type = 9;
+ break;
+
+ default:
+ break;
+ }
+
+ cmd_str = g_strdup_printf("AT+XPINCNT=%d", lock_type);
+ req = tcore_at_request_new(cmd_str, "+XPINCNT:", TCORE_AT_SINGLELINE);
+ dbg("cmd : %s, prefix(if any) :%s, cmd_len : %d", req->cmd, req->prefix, strlen(req->cmd));
+
+ tcore_pending_set_request_data(pending, 0, req);
+ tcore_pending_set_response_callback(pending, _on_response_get_retry_count, hal);
+ tcore_pending_link_user_request(pending, ur);
+ tcore_pending_set_send_callback(pending, on_confirmation_sim_message_send, NULL);
+ tcore_hal_send_request(hal, pending);
+
+ free(cmd_str);
+ dbg(" Function exit");
+ return TCORE_RETURN_SUCCESS;
+}
+
+
+static gboolean on_event_facility_lock_status(CoreObject *o, const void *event_info, void *user_data)
+{
+ struct s_sim_property *sp = NULL;
+ char *line = NULL;
+ GSList *tokens = NULL;
+ GSList *lines = NULL;
+
+ dbg("Function entry");
+ return TRUE;
+
+ sp = tcore_sim_ref_userdata(o);
+ lines = (GSList *) event_info;
+ if (1 != g_slist_length(lines)) {
+ dbg("unsolicited msg but multiple line");
+ goto OUT;
+ }
+ line = (char *) (lines->data);
+ tokens = tcore_at_tok_new(line);
+ if (g_slist_length(tokens) != 1) {
+ msg("invalid message");
+ tcore_at_tok_free(tokens);
+ return TRUE;
+ }
+
+OUT:
+ dbg(" Function exit");
+ if (NULL != tokens)
+ tcore_at_tok_free(tokens);
+ return TRUE;
+}
+
+
+static gboolean on_event_pin_status(CoreObject *o, const void *event_info, void *user_data)
+{
+ UserRequest *ur = NULL;
+ struct s_sim_property *sp = NULL;
+ enum tel_sim_status sim_status = SIM_STATUS_INITIALIZING;
+ GSList *tokens = NULL;
+ GSList *lines = NULL;
+ const char *line = NULL;
+ int sim_state = 0;
+
+ dbg(" Function entry ");
+
+ sp = tcore_sim_ref_userdata(o);
+
+ lines = (GSList *) event_info;
+ if (1 != g_slist_length(lines)) {
+ dbg("unsolicited msg but multiple line");
+ goto OUT;
+ }
+ line = (char *) (lines->data);
+
+ tokens = tcore_at_tok_new(line);
+ if (g_slist_length(tokens) != 1) {
+ msg("invalid message");
+ tcore_at_tok_free(tokens);
+ return TRUE;
+ }
+ sim_state = atoi(g_slist_nth_data(tokens, 0));
+
+ switch (sim_state) {
+ case 0: // sim state = SIM not present
+ sim_status = SIM_STATUS_CARD_NOT_PRESENT;
+ dbg("NO SIM");
+ break;
+
+ case 1: // sim state = PIN verification needed
+ sim_status = SIM_STATUS_PIN_REQUIRED;
+ dbg(" PIN required");
+ break;
+
+ case 2: // sim state = PIN verification not needed \96 Ready
+ case 3: // sim state = PIN verified \96 Ready
+ sim_status = SIM_STATUS_INITIALIZING;
+ dbg(" Inside PIN disabled at BOOT UP");
+ break;
+
+ case 4: // sim state = PUK verification needed
+ sim_status = SIM_STATUS_PUK_REQUIRED;
+ dbg(" PUK required");
+ break;
+
+ case 5: // sim state = SIM permanently blocked
+ sim_status = SIM_STATUS_CARD_BLOCKED;
+ dbg(" Card permanently blocked");
+ break;
+
+ case 6: // sim state = SIM error
+ sim_status = SIM_STATUS_CARD_ERROR;
+ dbg("SIM card error ");
+ break;
+
+ case 7: // sim state = ready for attach (+COPS)
+ sim_status = SIM_STATUS_INIT_COMPLETED;
+ dbg("Modem init completed");
+ break;
+
+ case 8: // sim state = SIM Technical Problem
+ sim_status = SIM_STATUS_CARD_ERROR;
+ dbg("SIM unavailable");
+ break;
+
+ case 9: // sim state = SIM removed
+ sim_status = SIM_STATUS_CARD_REMOVED;
+ dbg("SIM removed");
+ break;
+
+ case 99: // sim state = SIM State Unknown
+ sim_status = SIM_STATUS_UNKNOWN;
+ dbg("SIM State Unknown");
+ break;
+
+ case 12:
+ dbg("SIM Status : %d", sim_status);
+ goto OUT;
+
+ default:
+ dbg(" not handled SEC lock type ");
+ break;
+ }
+
+ switch (sim_status) {
+ case SIM_STATUS_INIT_COMPLETED:
+ ur = tcore_user_request_new(NULL, NULL); // this is for using ur metainfo set/ref functionality.
+ _get_file_info(o, ur, SIM_EF_IMSI);
+ break;
+
+ case SIM_STATUS_INITIALIZING:
+ case SIM_STATUS_PIN_REQUIRED:
+ case SIM_STATUS_PUK_REQUIRED:
+ case SIM_STATUS_CARD_BLOCKED:
+ case SIM_STATUS_NCK_REQUIRED:
+ case SIM_STATUS_NSCK_REQUIRED:
+ case SIM_STATUS_SPCK_REQUIRED:
+ case SIM_STATUS_CCK_REQUIRED:
+ case SIM_STATUS_LOCK_REQUIRED:
+ if (sp->first_recv_status == SIM_STATUS_UNKNOWN) {
+ dbg("first received sim status[%d]", sim_status);
+ sp->first_recv_status = sim_status;
+ _get_sim_type(o);
+ } else {
+ dbg("second or later received lock status[%d]", sim_status);
+ if (tcore_sim_get_status(o) != SIM_STATUS_INIT_COMPLETED) {
+ dbg("sim is not init complete in telephony side yet");
+ _sim_status_update(o, sim_status);
+ }
+ }
+ break;
+
+ case SIM_STATUS_CARD_REMOVED:
+ case SIM_STATUS_CARD_NOT_PRESENT:
+ case SIM_STATUS_CARD_ERROR:
+ if (sim_status == SIM_STATUS_CARD_NOT_PRESENT && tcore_sim_get_status(o) != SIM_STATUS_UNKNOWN) {
+ dbg("[SIM]SIM CARD REMOVED!!");
+ sim_status = SIM_STATUS_CARD_REMOVED;
+ }
+ _sim_status_update(o, sim_status);
+ break;
+
+ default:
+ dbg("not handled status[%d]", sim_status);
+
+ break;
+ }
+OUT:
+ dbg(" Function exit");
+ if (NULL != tokens)
+ tcore_at_tok_free(tokens);
+ return TRUE;
+}
+
+
+
+static void on_response_verify_pins(TcorePending *p, int data_len, const void *data, void *user_data)
+{
+ const TcoreATResponse *resp = data;
+ UserRequest *ur = NULL;
+ CoreObject *co_sim = NULL;
+ struct s_sim_property *sp = NULL;
+ GSList *tokens = NULL;
+ struct tresp_sim_verify_pins res;
+ GQueue *queue = NULL;
+ const char *line;
+ int err;
+
+ dbg(" Function entry ");
+
+ co_sim = tcore_pending_ref_core_object(p);
+ sp = tcore_sim_ref_userdata(co_sim);
+ ur = tcore_pending_ref_user_request(p);
+
+ memset(&res, 0, sizeof(struct tresp_sim_verify_pins));
+
+ if (resp->success > 0) {
+ dbg("RESPONSE OK");
+ res.result = SIM_PIN_OPERATION_SUCCESS;
+ res.pin_type = _sim_get_current_pin_facility(sp->current_sec_op);
+ if (res.pin_type == SIM_PTYPE_PIN1 || res.pin_type == SIM_PTYPE_SIM) {
+ if (tcore_sim_get_status(co_sim) != SIM_STATUS_INIT_COMPLETED)
+ _sim_status_update(co_sim, SIM_STATUS_INITIALIZING);
+ }
+ tcore_user_request_send_response(ur, TRESP_SIM_VERIFY_PINS, sizeof(struct tresp_sim_verify_pins), &res);
+ } else {
+ dbg("RESPONSE NOK");
+ line = (const char *) resp->final_response;
+ tokens = tcore_at_tok_new(line);
+ if (g_slist_length(tokens) < 1) {
+ dbg("err cause not specified or string corrupted");
+ res.result = TCORE_RETURN_3GPP_ERROR;
+ } else {
+ err = atoi(g_slist_nth_data(tokens, 0));
+ dbg("on_response_verify_pins: err = %d", err);
+ queue = tcore_object_ref_user_data(co_sim);
+ ur = tcore_user_request_ref(ur);
+ _get_retry_count(co_sim, ur);
+ }
+ tcore_at_tok_free(tokens);
+ }
+ dbg(" Function exit");
+}
+
+static void on_response_verify_puks(TcorePending *p, int data_len, const void *data, void *user_data)
+{
+ const TcoreATResponse *resp = data;
+ UserRequest *ur = NULL;
+ CoreObject *co_sim = NULL;
+ struct s_sim_property *sp = NULL;
+ GSList *tokens = NULL;
+ struct tresp_sim_verify_puks res;
+ GQueue *queue = NULL;
+ const char *line;
+ int err;
+
+ dbg(" Function entry ");
+
+ co_sim = tcore_pending_ref_core_object(p);
+ sp = tcore_sim_ref_userdata(co_sim);
+ ur = tcore_pending_ref_user_request(p);
+
+ memset(&res, 0, sizeof(struct tresp_sim_verify_pins));
+
+ if (resp->success > 0) {
+ dbg("RESPONSE OK");
+ res.result = SIM_PIN_OPERATION_SUCCESS;
+ res.pin_type = _sim_get_current_pin_facility(sp->current_sec_op);
+ tcore_user_request_send_response(ur, TRESP_SIM_VERIFY_PUKS, sizeof(struct tresp_sim_verify_pins), &res);
+ } else {
+ dbg("RESPONSE NOK");
+ line = (const char *) resp->final_response;
+ tokens = tcore_at_tok_new(line);
+
+ if (g_slist_length(tokens) < 1) {
+ dbg("err cause not specified or string corrupted");
+ res.result = TCORE_RETURN_3GPP_ERROR;
+ } else {
+ err = atoi(g_slist_nth_data(tokens, 0));
+ queue = tcore_object_ref_user_data(co_sim);
+ ur = tcore_user_request_ref(ur);
+ _get_retry_count(co_sim, ur);
+ }
+ tcore_at_tok_free(tokens);
+ }
+ dbg(" Function exit");
+}
+
+static void on_response_change_pins(TcorePending *p, int data_len, const void *data, void *user_data)
+{
+ const TcoreATResponse *resp = data;
+ UserRequest *ur = NULL;
+ CoreObject *co_sim = NULL;
+ struct s_sim_property *sp = NULL;
+ GSList *tokens = NULL;
+ struct tresp_sim_change_pins res;
+ GQueue *queue;
+ const char *line;
+ int err;
+
+ dbg(" Function entry ");
+
+ co_sim = tcore_pending_ref_core_object(p);
+ sp = tcore_sim_ref_userdata(co_sim);
+ ur = tcore_pending_ref_user_request(p);
+
+ memset(&res, 0, sizeof(struct tresp_sim_change_pins));
+
+ if (resp->success > 0) {
+ dbg("RESPONSE OK");
+ res.result = SIM_PIN_OPERATION_SUCCESS;
+ res.pin_type = _sim_get_current_pin_facility(sp->current_sec_op);
+ tcore_user_request_send_response(ur, TRESP_SIM_CHANGE_PINS, sizeof(struct tresp_sim_change_pins), &res);
+ } else {
+ dbg("RESPONSE NOK");
+ line = (const char *) resp->final_response;
+ tokens = tcore_at_tok_new(line);
+
+ if (g_slist_length(tokens) < 1) {
+ dbg("err cause not specified or string corrupted");
+ res.result = TCORE_RETURN_3GPP_ERROR;
+ } else {
+ err = atoi(g_slist_nth_data(tokens, 0));
+ queue = tcore_object_ref_user_data(co_sim);
+ ur = tcore_user_request_ref(ur);
+ _get_retry_count(co_sim, ur);
+ }
+ tcore_at_tok_free(tokens);
+ }
+ dbg(" Function exit");
+}
+
+static void on_response_get_facility_status(TcorePending *p, int data_len, const void *data, void *user_data)
+{
+ const TcoreATResponse *resp = data;
+ UserRequest *ur = NULL;
+ CoreObject *co_sim = NULL;
+ struct s_sim_property *sp = NULL;
+ GSList *tokens = NULL;
+ struct tresp_sim_get_facility_status res;
+ const char *line;
+
+ dbg(" Function entry ");
+
+ co_sim = tcore_pending_ref_core_object(p);
+ sp = tcore_sim_ref_userdata(co_sim);
+ ur = tcore_pending_ref_user_request(p);
+
+ memset(&res, 0, sizeof(struct tresp_sim_get_facility_status));
+
+ res.result = SIM_PIN_OPERATION_SUCCESS;
+ res.type = _sim_get_current_pin_facility(sp->current_sec_op);
+
+ if (resp->success > 0) {
+ dbg("RESPONSE OK");
+ if (resp->lines) {
+ line = (const char *) resp->lines->data;
+ tokens = tcore_at_tok_new(line);
+ if (g_slist_length(tokens) != 1) {
+ msg("invalid message");
+ tcore_at_tok_free(tokens);
+ return;
+ }
+ }
+ res.b_enable = atoi(g_slist_nth_data(tokens, 0));
+ } else {
+ dbg("RESPONSE NOK");
+ res.result = SIM_INCOMPATIBLE_PIN_OPERATION;
+ }
+
+ if (ur) {
+ tcore_user_request_send_response(ur, TRESP_SIM_GET_FACILITY_STATUS,
+ sizeof(struct tresp_sim_get_facility_status), &res);
+ }
+ tcore_at_tok_free(tokens);
+ dbg(" Function exit");
+}
+
+static void on_response_enable_facility(TcorePending *p, int data_len, const void *data, void *user_data)
+{
+ const TcoreATResponse *resp = data;
+ UserRequest *ur = NULL;
+ CoreObject *co_sim = NULL;
+ struct s_sim_property *sp = NULL;
+ GSList *tokens = NULL;
+ struct tresp_sim_enable_facility res;
+ GQueue *queue;
+ const char *line;
+
+ dbg(" Function entry ");
+
+ co_sim = tcore_pending_ref_core_object(p);
+ sp = tcore_sim_ref_userdata(co_sim);
+ ur = tcore_pending_ref_user_request(p);
+
+ memset(&res, 0, sizeof(struct tresp_sim_enable_facility));
+
+ res.result = SIM_PIN_OPERATION_SUCCESS;
+ res.type = _sim_get_current_pin_facility(sp->current_sec_op);
+
+ if (resp->success > 0) {
+ dbg("RESPONSE OK");
+ if (resp->lines) {
+ line = (const char *) resp->lines->data;
+ tokens = tcore_at_tok_new(line);
+ if (g_slist_length(tokens) != 1) {
+ msg("invalid message");
+ tcore_at_tok_free(tokens);
+ return;
+ }
+ }
+ res.result = SIM_PIN_OPERATION_SUCCESS;
+ if (ur) {
+ tcore_user_request_send_response(ur, TRESP_SIM_ENABLE_FACILITY,
+ sizeof(struct tresp_sim_enable_facility), &res);
+ }
+ tcore_at_tok_free(tokens);
+ } else {
+ dbg("RESPONSE NOK");
+ queue = tcore_object_ref_user_data(co_sim);
+ ur = tcore_user_request_ref(ur);
+ _get_retry_count(co_sim, ur);
+ }
+ dbg(" Function exit");
+}
+
+static void on_response_disable_facility(TcorePending *p, int data_len, const void *data, void *user_data)
+{
+ const TcoreATResponse *resp = data;
+ UserRequest *ur = NULL;
+ CoreObject *co_sim = NULL;
+ struct s_sim_property *sp = NULL;
+ GSList *tokens = NULL;
+ struct tresp_sim_disable_facility res;
+ GQueue *queue;
+ const char *line;
+
+ dbg(" Function entry ");
+
+ co_sim = tcore_pending_ref_core_object(p);
+ sp = tcore_sim_ref_userdata(co_sim);
+ ur = tcore_pending_ref_user_request(p);
+
+ memset(&res, 0, sizeof(struct tresp_sim_disable_facility));
+
+ res.result = SIM_PIN_OPERATION_SUCCESS;
+ res.type = _sim_get_current_pin_facility(sp->current_sec_op);
+
+ if (resp->success > 0) {
+ dbg("RESPONSE OK");
+ if (resp->lines) {
+ line = (const char *) resp->lines->data;
+ tokens = tcore_at_tok_new(line);
+ if (g_slist_length(tokens) != 1) {
+ msg("invalid message");
+ tcore_at_tok_free(tokens);
+ return;
+ }
+ }
+ res.result = SIM_PIN_OPERATION_SUCCESS;
+ if (ur) {
+ tcore_user_request_send_response(ur, TRESP_SIM_DISABLE_FACILITY,
+ sizeof(struct tresp_sim_disable_facility), &res);
+ }
+ tcore_at_tok_free(tokens);
+ } else {
+ dbg("RESPONSE NOK");
+ queue = tcore_object_ref_user_data(co_sim);
+ ur = tcore_user_request_ref(ur);
+ _get_retry_count(co_sim, ur);
+ }
+ dbg(" Function exit");
+}
+
+static void on_response_get_lock_info(TcorePending *p, int data_len, const void *data, void *user_data)
+{
+ const TcoreATResponse *resp = data;
+ UserRequest *ur = NULL;
+ CoreObject *co_sim = NULL;
+ struct s_sim_property *sp = NULL;
+ GSList *tokens = NULL;
+ const char *line;
+ struct tresp_sim_verify_pins v_pin = {0, };
+ struct tresp_sim_verify_puks v_puk = {0, };
+ struct tresp_sim_change_pins change_pin = {0, };
+ struct tresp_sim_disable_facility dis_facility = {0, };
+ struct tresp_sim_enable_facility en_facility = {0, };
+ int lock_type;
+ int attempts_left = 0;
+ int time_penalty = 0;
+
+ dbg(" Function entry ");
+
+ co_sim = tcore_pending_ref_core_object(p);
+ sp = tcore_sim_ref_userdata(co_sim);
+ ur = tcore_pending_ref_user_request(p);
+
+ if (resp->success > 0) {
+ dbg("RESPONSE OK");
+ if (resp->lines) {
+ line = (const char *) resp->lines->data;
+ tokens = tcore_at_tok_new(line);
+ if (g_slist_length(tokens) != 3) {
+ msg("invalid message");
+ tcore_at_tok_free(tokens);
+ return;
+ }
+ }
+ lock_type = atoi(g_slist_nth_data(tokens, 0));
+ attempts_left = atoi(g_slist_nth_data(tokens, 1));
+ time_penalty = atoi(g_slist_nth_data(tokens, 2));
+
+ switch (sp->current_sec_op) {
+ case SEC_PIN1_VERIFY:
+ case SEC_PIN2_VERIFY:
+ case SEC_SIM_VERIFY:
+ case SEC_ADM_VERIFY:
+ v_pin.result = SIM_INCORRECT_PASSWORD;
+ v_pin.pin_type = _sim_get_current_pin_facility(sp->current_sec_op);
+ v_pin.retry_count = attempts_left;
+ tcore_user_request_send_response(ur, _find_resp_command(ur),
+ sizeof(struct tresp_sim_verify_pins), &v_pin);
+ break;
+
+ case SEC_PUK1_VERIFY:
+ case SEC_PUK2_VERIFY:
+ v_puk.result = SIM_INCORRECT_PASSWORD;
+ v_puk.pin_type = _sim_get_current_pin_facility(sp->current_sec_op);
+ v_puk.retry_count = attempts_left;
+ tcore_user_request_send_response(ur, _find_resp_command(ur),
+ sizeof(struct tresp_sim_verify_puks), &v_puk);
+ break;
+
+ case SEC_PIN1_CHANGE:
+ case SEC_PIN2_CHANGE:
+ change_pin.result = SIM_INCORRECT_PASSWORD;
+ change_pin.pin_type = _sim_get_current_pin_facility(sp->current_sec_op);
+ change_pin.retry_count = attempts_left;
+ tcore_user_request_send_response(ur, _find_resp_command(ur),
+ sizeof(struct tresp_sim_change_pins), &change_pin);
+ break;
+
+ case SEC_PIN1_DISABLE:
+ case SEC_PIN2_DISABLE:
+ case SEC_FDN_DISABLE:
+ case SEC_SIM_DISABLE:
+ case SEC_NET_DISABLE:
+ case SEC_NS_DISABLE:
+ case SEC_SP_DISABLE:
+ case SEC_CP_DISABLE:
+ dis_facility.result = SIM_INCORRECT_PASSWORD;
+ dis_facility.type = _sim_get_current_pin_facility(sp->current_sec_op);
+ dis_facility.retry_count = attempts_left;
+ tcore_user_request_send_response(ur, _find_resp_command(ur),
+ sizeof(struct tresp_sim_disable_facility), &dis_facility);
+ break;
+
+ case SEC_PIN1_ENABLE:
+ case SEC_PIN2_ENABLE:
+ case SEC_FDN_ENABLE:
+ case SEC_SIM_ENABLE:
+ case SEC_NET_ENABLE:
+ case SEC_NS_ENABLE:
+ case SEC_SP_ENABLE:
+ case SEC_CP_ENABLE:
+ en_facility.result = SIM_INCORRECT_PASSWORD;
+ en_facility.type = _sim_get_current_pin_facility(sp->current_sec_op);
+ en_facility.retry_count = attempts_left;
+ tcore_user_request_send_response(ur, _find_resp_command(ur),
+ sizeof(struct tresp_sim_enable_facility), &en_facility);
+ break;
+
+ default:
+ dbg("not handled sec op[%d]", sp->current_sec_op);
+ break;
+ }
+ tcore_at_tok_free(tokens);
+ }
+ dbg(" Function exit");
+}
+
+static void on_response_update_file(TcorePending *p, int data_len, const void *data, void *user_data)
+{
+ const TcoreATResponse *resp = data;
+ UserRequest *ur = NULL;
+ CoreObject *co_sim = NULL;
+ struct tresp_sim_set_callforwarding resp_cf = {0, };
+ struct tresp_sim_set_language resp_language = {0, };
+ struct s_sim_property *sp = NULL;
+ GSList *tokens = NULL;
+ enum tel_sim_access_result result;
+ const char *line;
+ int sw1 = 0;
+ int sw2 = 0;
+
+ dbg(" Function entry ");
+
+ co_sim = tcore_pending_ref_core_object(p);
+ sp = tcore_sim_ref_userdata(co_sim);
+ ur = tcore_pending_ref_user_request(p);
+
+ if (resp->success > 0) {
+ dbg("RESPONSE OK");
+ if (resp->lines) {
+ line = (const char *) resp->lines->data;
+ tokens = tcore_at_tok_new(line);
+ if (g_slist_length(tokens) != 2) {
+ msg("invalid message");
+ tcore_at_tok_free(tokens);
+ return;
+ }
+ }
+ sw1 = atoi(g_slist_nth_data(tokens, 0));
+ sw2 = atoi(g_slist_nth_data(tokens, 1));
+
+ if ((sw1 == 0x90 && sw2 == 0x00) || sw1 == 0x91) {
+ result = SIM_ACCESS_SUCCESS;
+ } else {
+ result = _decode_status_word(sw1, sw2);
+ }
+ } else {
+ dbg("RESPONSE NOK");
+ result = SIM_ACCESS_FAILED;
+ }
+
+ switch (sp->file_id) {
+ case SIM_EF_CPHS_CALL_FORWARD_FLAGS:
+ case SIM_EF_USIM_CFIS:
+ tcore_user_request_send_response(ur, _find_resp_command(ur), sizeof(struct tresp_sim_set_callforwarding), &resp_cf);
+ break;
+
+ case SIM_EF_ELP:
+ case SIM_EF_LP:
+ case SIM_EF_USIM_LI:
+ case SIM_EF_USIM_PL:
+ tcore_user_request_send_response(ur, _find_resp_command(ur), sizeof(struct tresp_sim_set_language), &resp_language);
+ break;
+
+ default:
+ dbg("Invalid File ID - %d", sp->file_id)
+ break;
+ }
+ tcore_at_tok_free(tokens);
+ dbg(" Function exit");
+}
+
+static void on_response_transmit_apdu(TcorePending *p, int data_len, const void *data, void *user_data)
+{
+ const TcoreATResponse *resp = data;
+ UserRequest *ur = NULL;
+ CoreObject *co_sim = NULL;
+ struct s_sim_property *sp = NULL;
+ GSList *tokens = NULL;
+ struct tresp_sim_transmit_apdu res;
+ const char *line;
+
+ dbg(" Function entry ");
+
+ co_sim = tcore_pending_ref_core_object(p);
+ sp = tcore_sim_ref_userdata(co_sim);
+ ur = tcore_pending_ref_user_request(p);
+
+ memset(&res, 0, sizeof(struct tresp_sim_transmit_apdu));
+
+ if (resp->success > 0) {
+ dbg("RESPONSE OK");
+ res.result = SIM_ACCESS_SUCCESS;
+ if (resp->lines) {
+ line = (const char *) resp->lines->data;
+ tokens = tcore_at_tok_new(line);
+ if (g_slist_length(tokens) != 2) {
+ msg("invalid message");
+ tcore_at_tok_free(tokens);
+ return;
+ }
+ }
+ res.apdu_resp_length = atoi(g_slist_nth_data(tokens, 0));
+ strncpy((char *) res.apdu_resp, (const char *) g_slist_nth_data(tokens, 1), res.apdu_resp_length);
+ } else {
+ dbg("RESPONSE NOK");
+ res.result = SIM_ACCESS_FAILED;
+ }
+ ur = tcore_pending_ref_user_request(p);
+ if (ur) {
+ tcore_user_request_send_response(ur, _find_resp_command(ur), sizeof(struct tresp_sim_transmit_apdu), &res);
+ }
+ tcore_at_tok_free(tokens);
+ dbg(" Function exit");
+}
+
+static TReturn s_verify_pins(CoreObject *o, UserRequest *ur)
+{
+ TcoreHal *hal = NULL;
+ TcoreATRequest *req = NULL;
+ TcorePending *pending = NULL;
+ char *cmd_str = NULL;
+ const struct treq_sim_verify_pins *req_data = NULL;
+ struct s_sim_property *sp = NULL;
+
+ dbg(" Function entry ");
+
+ hal = tcore_object_get_hal(o);
+ sp = tcore_sim_ref_userdata(o);
+ pending = tcore_pending_new(o, 0);
+ req_data = tcore_user_request_ref_data(ur, NULL);
+
+ if (!o || !ur)
+ return TCORE_RETURN_EINVAL;
+
+ if (req_data->pin_type == SIM_PTYPE_PIN1) {
+ sp->current_sec_op = SEC_PIN1_VERIFY;
+ cmd_str = g_strdup_printf("AT+CPIN=\"%s\"", req_data->pin);
+ } else if (req_data->pin_type == SIM_PTYPE_PIN2) {
+ sp->current_sec_op = SEC_PIN2_VERIFY;
+ cmd_str = g_strdup_printf("AT+CPIN2=\"%s\"", req_data->pin);
+ } else if (req_data->pin_type == SIM_PTYPE_SIM) {
+ sp->current_sec_op = SEC_SIM_VERIFY;
+ cmd_str = g_strdup_printf("AT+CPIN=\"%s\"", req_data->pin);
+ } else if (req_data->pin_type == SIM_PTYPE_ADM) {
+ sp->current_sec_op = SEC_ADM_VERIFY;
+ cmd_str = g_strdup_printf("AT+CPIN=\"%s\"", req_data->pin);
+ } else {
+ return TCORE_RETURN_EINVAL;
+ }
+
+ req = tcore_at_request_new(cmd_str, NULL, TCORE_AT_NO_RESULT);
+
+ dbg("cmd : %s, prefix(if any) :%s, cmd_len : %d", req->cmd, req->prefix, strlen(req->cmd));
+
+ tcore_pending_set_request_data(pending, 0, req);
+ tcore_pending_set_response_callback(pending, on_response_verify_pins, hal);
+ tcore_pending_link_user_request(pending, ur);
+ tcore_pending_set_send_callback(pending, on_confirmation_sim_message_send, NULL);
+ tcore_hal_send_request(hal, pending);
+
+ free(cmd_str);
+ dbg(" Function exit");
+ return TCORE_RETURN_SUCCESS;
+}
+
+static TReturn s_verify_puks(CoreObject *o, UserRequest *ur)
+{
+ TcoreHal *hal = NULL;
+ TcoreATRequest *req = NULL;
+ TcorePending *pending = NULL;
+ char *cmd_str = NULL;
+ const struct treq_sim_verify_puks *req_data;
+ struct s_sim_property *sp = NULL;
+
+ dbg(" Function entry ");
+
+ hal = tcore_object_get_hal(o);
+ sp = tcore_sim_ref_userdata(o);
+ pending = tcore_pending_new(o, 0);
+ req_data = tcore_user_request_ref_data(ur, NULL);
+
+ if (!o || !ur)
+ return TCORE_RETURN_EINVAL;
+
+ if (req_data->puk_type == SIM_PTYPE_PUK1) {
+ sp->current_sec_op = SEC_PUK1_VERIFY;
+ cmd_str = g_strdup_printf("AT+CPIN=\"%s\", \"%s\"", req_data->puk, req_data->pin);
+ } else if (req_data->puk_type == SIM_PTYPE_PUK2) {
+ sp->current_sec_op = SEC_PUK2_VERIFY;
+ cmd_str = g_strdup_printf("AT+CPIN2=\"%s\", \"%s\"", req_data->puk, req_data->pin);
+ } else {
+ return TCORE_RETURN_EINVAL;
+ }
+ req = tcore_at_request_new(cmd_str, NULL, TCORE_AT_NO_RESULT);
+
+ dbg("cmd : %s, prefix(if any) :%s, cmd_len : %d", req->cmd, req->prefix, strlen(req->cmd));
+
+ tcore_pending_set_request_data(pending, 0, req);
+ tcore_pending_set_response_callback(pending, on_response_verify_puks, hal);
+ tcore_pending_link_user_request(pending, ur);
+ tcore_pending_set_send_callback(pending, on_confirmation_sim_message_send, NULL);
+ tcore_hal_send_request(hal, pending);
+
+ free(cmd_str);
+ dbg(" Function exit");
+ return TCORE_RETURN_SUCCESS;
+}
+
+static TReturn s_change_pins(CoreObject *o, UserRequest *ur)
+{
+ TcoreHal *hal = NULL;
+ TcoreATRequest *req = NULL;
+ TcorePending *pending = NULL;
+ char *cmd_str = NULL;
+ const struct treq_sim_change_pins *req_data;
+ struct s_sim_property *sp = NULL;
+ char *pin1 = "SC";
+ char *pin2 = "P2";
+
+ dbg(" Function entry ");
+
+ hal = tcore_object_get_hal(o);
+ sp = tcore_sim_ref_userdata(o);
+ pending = tcore_pending_new(o, 0);
+ req_data = tcore_user_request_ref_data(ur, NULL);
+
+ if (!o || !ur)
+ return TCORE_RETURN_EINVAL;
+
+ if (req_data->type == SIM_PTYPE_PIN1) {
+ sp->current_sec_op = SEC_PIN1_CHANGE;
+ cmd_str = g_strdup_printf("AT+CPWD=\"%s\",\"%s\",\"%s\"", pin1, req_data->old_pin, req_data->new_pin);
+ } else if (req_data->type == SIM_PTYPE_PIN2) {
+ sp->current_sec_op = SEC_PIN2_CHANGE;
+ cmd_str = g_strdup_printf("AT+CPWD=\"%s\",\"%s\",\"%s\"", pin2, req_data->old_pin, req_data->new_pin);
+ } else {
+ return TCORE_RETURN_EINVAL;
+ }
+ req = tcore_at_request_new(cmd_str, NULL, TCORE_AT_NO_RESULT);
+
+ dbg("cmd : %s, prefix(if any) :%s, cmd_len : %d", req->cmd, req->prefix, strlen(req->cmd));
+
+ tcore_pending_set_request_data(pending, 0, req);
+ tcore_pending_set_response_callback(pending, on_response_change_pins, hal);
+ tcore_pending_link_user_request(pending, ur);
+ tcore_pending_set_send_callback(pending, on_confirmation_sim_message_send, NULL);
+ tcore_hal_send_request(hal, pending);
+
+ free(cmd_str);
+ dbg(" Function exit");
+ return TCORE_RETURN_SUCCESS;
+}
+
+static TReturn s_get_facility_status(CoreObject *o, UserRequest *ur)
+{
+ TcoreHal *hal = NULL;
+ TcoreATRequest *req = NULL;
+ TcorePending *pending = NULL;
+ char *cmd_str = NULL;
+ const struct treq_sim_get_facility_status *req_data;
+ struct s_sim_property *sp = NULL;
+ char *fac = "SC";
+ int mode = 2; /* 0:unlock, 1:lock, 2:query*/
+
+ dbg(" Function entry ");
+
+ hal = tcore_object_get_hal(o);
+ sp = tcore_sim_ref_userdata(o);
+ pending = tcore_pending_new(o, 0);
+ req_data = tcore_user_request_ref_data(ur, NULL);
+
+ if (!o || !ur)
+ return TCORE_RETURN_EINVAL;
+
+ if (req_data->type == SIM_FACILITY_PS) {
+ fac = "PS"; /*PH-SIM, Lock PHone to SIM/UICC card*/
+ } else if (req_data->type == SIM_FACILITY_SC) {
+ fac = "SC"; /*Lock SIM/UICC card, simply PIN1*/
+ } else if (req_data->type == SIM_FACILITY_FD) {
+ fac = "FD"; /*Fixed Dialing Number feature, need PIN2*/
+ } else if (req_data->type == SIM_FACILITY_PN) {
+ fac = "PN"; /*Network Personalization*/
+ } else if (req_data->type == SIM_FACILITY_PU) {
+ fac = "PU"; /*network sUbset Personalization*/
+ } else if (req_data->type == SIM_FACILITY_PP) {
+ fac = "PP"; /*service Provider Personalization*/
+ } else if (req_data->type == SIM_FACILITY_PC) {
+ fac = "PC"; /*Corporate Personalization*/
+ } else {
+ return TCORE_RETURN_EINVAL;
+ }
+ cmd_str = g_strdup_printf("AT+CLCK=\"%s\", %d", fac, mode);
+ req = tcore_at_request_new(cmd_str, "+CLCK:", TCORE_AT_SINGLELINE);
+
+ dbg("cmd : %s, prefix(if any) :%s, cmd_len : %d", req->cmd, req->prefix, strlen(req->cmd));
+
+ tcore_pending_set_request_data(pending, 0, req);
+ tcore_pending_set_response_callback(pending, on_response_get_facility_status, hal);
+ tcore_pending_link_user_request(pending, ur);
+ tcore_pending_set_send_callback(pending, on_confirmation_sim_message_send, NULL);
+ tcore_hal_send_request(hal, pending);
+
+ free(cmd_str);
+ dbg(" Function exit");
+ return TCORE_RETURN_SUCCESS;
+}
+
+static TReturn s_enable_facility(CoreObject *o, UserRequest *ur)
+{
+ TcoreHal *hal = NULL;
+ TcoreATRequest *req = NULL;
+ TcorePending *pending = NULL;
+ char *cmd_str = NULL;
+ const struct treq_sim_enable_facility *req_data;
+ struct s_sim_property *sp = NULL;
+ char *fac = "SC";
+ int mode = 1; /* 0:unlock, 1:lock, 2:query*/
+
+ dbg(" Function entry ");
+
+ hal = tcore_object_get_hal(o);
+ sp = tcore_sim_ref_userdata(o);
+ pending = tcore_pending_new(o, 0);
+ req_data = tcore_user_request_ref_data(ur, NULL);
+
+ if (!o || !ur)
+ return TCORE_RETURN_EINVAL;
+
+ if (req_data->type == SIM_FACILITY_PS) {
+ fac = "PS"; /*PH-SIM, Lock PHone to SIM/UICC card*/
+ sp->current_sec_op = SEC_SIM_ENABLE;
+ } else if (req_data->type == SIM_FACILITY_SC) {
+ fac = "SC"; /*Lock SIM/UICC card, simply PIN1*/
+ sp->current_sec_op = SEC_PIN1_ENABLE;
+ } else if (req_data->type == SIM_FACILITY_FD) {
+ fac = "FD"; /*Fixed Dialing Number feature, need PIN2*/
+ sp->current_sec_op = SEC_FDN_ENABLE;
+ } else if (req_data->type == SIM_FACILITY_PN) {
+ fac = "PN"; /*Network Personalization*/
+ sp->current_sec_op = SEC_NET_ENABLE;
+ } else if (req_data->type == SIM_FACILITY_PU) {
+ fac = "PU"; /*network sUbset Personalization*/
+ sp->current_sec_op = SEC_NS_ENABLE;
+ } else if (req_data->type == SIM_FACILITY_PP) {
+ fac = "PP"; /*service Provider Personalization*/
+ sp->current_sec_op = SEC_SP_ENABLE;
+ } else if (req_data->type == SIM_FACILITY_PC) {
+ fac = "PC"; /*Corporate Personalization*/
+ sp->current_sec_op = SEC_CP_ENABLE;
+ } else {
+ return TCORE_RETURN_EINVAL;
+ }
+ cmd_str = g_strdup_printf("AT+CLCK=\"%s\", %d, \"%s\"", fac, mode, req_data->password);
+ req = tcore_at_request_new(cmd_str, "+CLCK:", TCORE_AT_SINGLELINE);
+
+ dbg("cmd : %s, prefix(if any) :%s, cmd_len : %d", req->cmd, req->prefix, strlen(req->cmd));
+
+ tcore_pending_set_request_data(pending, 0, req);
+ tcore_pending_set_response_callback(pending, on_response_enable_facility, hal);
+ tcore_pending_link_user_request(pending, ur);
+ tcore_pending_set_send_callback(pending, on_confirmation_sim_message_send, NULL);
+ tcore_hal_send_request(hal, pending);
+
+ free(cmd_str);
+ dbg(" Function exit");
+ return TCORE_RETURN_SUCCESS;
+}
+
+static TReturn s_disable_facility(CoreObject *o, UserRequest *ur)
+{
+ TcoreHal *hal;
+ TcoreATRequest *req;
+ TcorePending *pending = NULL;
+ char *cmd_str = NULL;
+ const struct treq_sim_enable_facility *req_data;
+ struct s_sim_property *sp = NULL;
+ char *fac = "SC";
+ int mode = 0; /* 0:unlock, 1:lock, 2:query*/
+
+ dbg(" Function entry ");
+
+ hal = tcore_object_get_hal(o);
+ sp = tcore_sim_ref_userdata(o);
+ pending = tcore_pending_new(o, 0);
+ req_data = tcore_user_request_ref_data(ur, NULL);
+
+ if (!o || !ur)
+ return TCORE_RETURN_EINVAL;
+
+ if (req_data->type == SIM_FACILITY_PS) {
+ fac = "PS"; /*PH-SIM, Lock PHone to SIM/UICC card*/
+ sp->current_sec_op = SEC_SIM_DISABLE;
+ } else if (req_data->type == SIM_FACILITY_SC) {
+ fac = "SC"; /*Lock SIM/UICC card, simply PIN1*/
+ sp->current_sec_op = SEC_PIN1_DISABLE;
+ } else if (req_data->type == SIM_FACILITY_FD) {
+ fac = "FD"; /*Fixed Dialing Number feature, need PIN2*/
+ sp->current_sec_op = SEC_FDN_DISABLE;
+ } else if (req_data->type == SIM_FACILITY_PN) {
+ fac = "PN"; /*Network Personalization*/
+ sp->current_sec_op = SEC_NET_DISABLE;
+ } else if (req_data->type == SIM_FACILITY_PU) {
+ fac = "PU"; /*network sUbset Personalization*/
+ sp->current_sec_op = SEC_NS_DISABLE;
+ } else if (req_data->type == SIM_FACILITY_PP) {
+ fac = "PP"; /*service Provider Personalization*/
+ sp->current_sec_op = SEC_SP_DISABLE;
+ } else if (req_data->type == SIM_FACILITY_PC) {
+ fac = "PC"; /*Corporate Personalization*/
+ sp->current_sec_op = SEC_CP_DISABLE;
+ } else {
+ return TCORE_RETURN_EINVAL;
+ }
+ cmd_str = g_strdup_printf("AT+CLCK=\"%s\", %d, \"%s\"", fac, mode, req_data->password);
+ req = tcore_at_request_new(cmd_str, "+CLCK:", TCORE_AT_SINGLELINE);
+
+ dbg("cmd : %s, prefix(if any) :%s, cmd_len : %d", req->cmd, req->prefix, strlen(req->cmd));
+
+ tcore_pending_set_request_data(pending, 0, req);
+ tcore_pending_set_response_callback(pending, on_response_disable_facility, hal);
+ tcore_pending_link_user_request(pending, ur);
+ tcore_pending_set_send_callback(pending, on_confirmation_sim_message_send, NULL);
+ tcore_hal_send_request(hal, pending);
+
+ free(cmd_str);
+ dbg(" Function exit");
+ return TCORE_RETURN_SUCCESS;
+}
+
+static TReturn s_get_lock_info(CoreObject *o, UserRequest *ur)
+{
+ TcoreHal *hal = NULL;
+ TcoreATRequest *req = NULL;
+ TcorePending *pending = NULL;
+ char *cmd_str = NULL;
+ char *lock_type = NULL;
+ const struct treq_sim_get_lock_info *req_data;
+ struct s_sim_property *sp = NULL;
+
+ dbg(" Function entry ");
+
+ hal = tcore_object_get_hal(o);
+ sp = tcore_sim_ref_userdata(o);
+ pending = tcore_pending_new(o, 0);
+ req_data = tcore_user_request_ref_data(ur, NULL);
+
+ if (!o || !ur)
+ return TCORE_RETURN_EINVAL;
+
+ switch (req_data->type) {
+ case SIM_FACILITY_PS:
+ lock_type = "PS";
+ break;
+
+ case SIM_FACILITY_SC:
+ lock_type = "SC";
+ break;
+
+ case SIM_FACILITY_FD:
+ lock_type = "FD";
+ break;
+
+ case SIM_FACILITY_PN:
+ lock_type = "PN";
+ break;
+
+ case SIM_FACILITY_PU:
+ lock_type = "PU";
+ break;
+
+ case SIM_FACILITY_PP:
+ lock_type = "PP";
+ break;
+
+ case SIM_FACILITY_PC:
+ lock_type = "PC";
+ break;
+
+ default:
+ break;
+ }
+ cmd_str = g_strdup_printf("AT+XPINCNT =\"%s\"", lock_type);
+ req = tcore_at_request_new(cmd_str, "+XPINCNT:", TCORE_AT_SINGLELINE);
+
+ dbg("cmd : %s, prefix(if any) :%s, cmd_len : %d", req->cmd, req->prefix, strlen(req->cmd));
+
+ tcore_pending_set_request_data(pending, 0, req);
+ tcore_pending_set_response_callback(pending, on_response_get_lock_info, hal);
+ tcore_pending_link_user_request(pending, ur);
+ tcore_pending_set_send_callback(pending, on_confirmation_sim_message_send, NULL);
+ tcore_hal_send_request(hal, pending);
+
+ free(cmd_str);
+ dbg(" Function exit");
+ return TCORE_RETURN_SUCCESS;
+}
+
+static TReturn s_read_file(CoreObject *o, UserRequest *ur)
+{
+ TReturn api_ret = TCORE_RETURN_SUCCESS;
+ enum tcore_request_command command;
+ command = tcore_user_request_get_command(ur);
+
+ dbg(" Function entry ");
+
+ if (!o || !ur)
+ return TCORE_RETURN_EINVAL;
+
+ switch (command) {
+ case TREQ_SIM_GET_ECC:
+ api_ret = _get_file_info(o, ur, SIM_EF_ECC);
+ break;
+
+ case TREQ_SIM_GET_LANGUAGE:
+ if (tcore_sim_get_type(o) == SIM_TYPE_GSM)
+ api_ret = _get_file_info(o, ur, SIM_EF_ELP);
+ else if (tcore_sim_get_type(o) == SIM_TYPE_USIM)
+ api_ret = _get_file_info(o, ur, SIM_EF_LP);
+ else
+ api_ret = TCORE_RETURN_ENOSYS;
+ break;
+
+ case TREQ_SIM_GET_ICCID:
+ api_ret = _get_file_info(o, ur, SIM_EF_ICCID);
+ break;
+
+ case TREQ_SIM_GET_MAILBOX:
+ if (tcore_sim_get_cphs_status(o))
+ api_ret = _get_file_info(o, ur, SIM_EF_CPHS_MAILBOX_NUMBERS);
+ else
+ api_ret = _get_file_info(o, ur, SIM_EF_MBDN);
+ break;
+
+ case TREQ_SIM_GET_CALLFORWARDING:
+ if (tcore_sim_get_cphs_status(o))
+ api_ret = _get_file_info(o, ur, SIM_EF_CPHS_CALL_FORWARD_FLAGS);
+ else
+ api_ret = _get_file_info(o, ur, SIM_EF_USIM_CFIS);
+ break;
+
+ case TREQ_SIM_GET_MESSAGEWAITING:
+ if (tcore_sim_get_cphs_status(o))
+ api_ret = _get_file_info(o, ur, SIM_EF_CPHS_VOICE_MSG_WAITING);
+ else
+ api_ret = _get_file_info(o, ur, SIM_EF_USIM_MWIS);
+ break;
+
+ case TREQ_SIM_GET_CPHS_INFO:
+ api_ret = _get_file_info(o, ur, SIM_EF_CPHS_CPHS_INFO);
+ break;
+
+ case TREQ_SIM_GET_MSISDN:
+ api_ret = _get_file_info(o, ur, SIM_EF_MSISDN);
+ break;
+
+ case TREQ_SIM_GET_SPN:
+ dbg("enter case SPN");
+ api_ret = _get_file_info(o, ur, SIM_EF_SPN);
+ break;
+
+ case TREQ_SIM_GET_SPDI:
+ api_ret = _get_file_info(o, ur, SIM_EF_SPDI);
+ break;
+
+ case TREQ_SIM_GET_OPL:
+ api_ret = _get_file_info(o, ur, SIM_EF_OPL);
+ break;
+
+ case TREQ_SIM_GET_PNN:
+ api_ret = _get_file_info(o, ur, SIM_EF_PNN);
+ break;
+
+ case TREQ_SIM_GET_CPHS_NETNAME:
+ api_ret = _get_file_info(o, ur, SIM_EF_CPHS_OPERATOR_NAME_STRING);
+ break;
+
+ case TREQ_SIM_GET_OPLMNWACT:
+ api_ret = _get_file_info(o, ur, SIM_EF_OPLMN_ACT);
+ break;
+
+ default:
+ dbg("error - not handled read treq command[%d]", command);
+ api_ret = TCORE_RETURN_EINVAL;
+ break;
+ }
+ dbg(" Function exit");
+ return api_ret;
+}
+
+static TReturn s_update_file(CoreObject *o, UserRequest *ur)
+{
+ TcoreHal *hal;
+ TcoreATRequest *req;
+ TcorePending *pending = NULL;
+ char *cmd_str = NULL;
+ TReturn api_ret = TCORE_RETURN_SUCCESS;
+ char *encoded_data = NULL;
+ int encoded_len = 0;
+ enum tcore_request_command command;
+ enum tel_sim_file_id ef = SIM_EF_INVALID;
+ const struct treq_sim_set_callforwarding *cf;
+ const struct treq_sim_set_language *cl;
+ int p1 = 0;
+ int p2 = 0;
+ int p3 = 0;
+ int cmd = 0;
+ int out_length = 0;
+ struct tel_sim_language sim_language;
+
+ command = tcore_user_request_get_command(ur);
+
+ dbg(" Function entry ");
+
+ hal = tcore_object_get_hal(o);
+ pending = tcore_pending_new(o, 0);
+
+ if (!o || !ur) {
+ return TCORE_RETURN_EINVAL;
+ }
+
+ switch (command) {
+ case TREQ_SIM_SET_LANGUAGE:
+ cl = tcore_user_request_ref_data(ur, NULL);
+ memset(&sim_language, 0x00, sizeof(struct tel_sim_language));
+ cmd = 214;
+
+ sim_language.language_count = 1;
+ sim_language.language[0] = cl->language;
+ dbg("language %d", cl->language);
+
+ if (tcore_sim_get_type(o) == SIM_TYPE_GSM) {
+ int i;
+ dbg("2G");
+ ef = SIM_EF_ELP;
+ encoded_data = tcore_sim_encode_li(&out_length, &sim_language);
+ p1 = 0;
+ p2 = 0;
+ p3 = out_length;
+ for (i = 0; i < out_length; i++) {
+ dbg("encoded_data - %d ---", encoded_data[i]);
+ }
+ dbg("encoded_data - %s ---", encoded_data);
+ dbg("out_length - %d ---", out_length);
+ } else if (tcore_sim_get_type(o) == SIM_TYPE_USIM) {
+ int i;
+ dbg("3G");
+ ef = SIM_EF_LP;
+ encoded_data = tcore_sim_encode_li(&out_length, &sim_language);
+ p1 = 0;
+ p2 = 0;
+ p3 = out_length;
+ for (i = 0; i < out_length; i++) {
+ dbg("encoded_data - %d ---", encoded_data[i]);
+ }
+ dbg("out_length - %d ---", out_length);
+ } else {
+ api_ret = TCORE_RETURN_ENOSYS;
+ }
+ break;
+
+ case TREQ_SIM_SET_CALLFORWARDING:
+ cf = tcore_user_request_ref_data(ur, NULL);
+ if (tcore_sim_get_cphs_status(o)) {
+ encoded_data = tcore_sim_encode_cff((const struct tel_sim_callforwarding *) cf);
+ ef = SIM_EF_CPHS_CALL_FORWARD_FLAGS;
+ p1 = 0;
+ p2 = 0;
+ p3 = strlen(encoded_data);
+ cmd = 214; /*command - 214 : UPDATE BINARY*/
+ } else {
+ encoded_data = tcore_sim_encode_cfis(&encoded_len, (const struct tel_sim_callforwarding *) cf);
+ ef = SIM_EF_USIM_CFIS;
+ p1 = 1;
+ p2 = 0x04;
+ p3 = encoded_len;
+ cmd = 220; /*command - 220 : UPDATE RECORD*/
+ }
+ break;
+
+ default:
+ dbg("error - not handled update treq command[%d]", command);
+ api_ret = TCORE_RETURN_EINVAL;
+ break;
+ }
+ cmd_str = g_strdup_printf("AT+CRSM=%d,%d,%d,%d,%d,\"%s\"", cmd, ef, p1, p2, p3, encoded_data);
+ req = tcore_at_request_new(cmd_str, "+CRSM:", TCORE_AT_SINGLELINE);
+
+ dbg("cmd : %s, prefix(if any) :%s, cmd_len : %d", req->cmd, req->prefix, strlen(req->cmd));
+
+ tcore_pending_set_request_data(pending, 0, req);
+ tcore_pending_set_response_callback(pending, on_response_update_file, hal);
+ tcore_pending_link_user_request(pending, ur);
+ tcore_pending_set_send_callback(pending, on_confirmation_sim_message_send, NULL);
+
+ tcore_hal_send_request(hal, pending);
+ if (NULL != encoded_data) {
+ g_free(encoded_data);
+ }
+ free(cmd_str);
+ dbg(" Function exit");
+ return TCORE_RETURN_SUCCESS;
+}
+
+static TReturn s_transmit_apdu(CoreObject *o, UserRequest *ur)
+{
+ TcoreHal *hal = NULL;
+ TcoreATRequest *req = NULL;
+ TcorePending *pending = NULL;
+ char *cmd_str = NULL;
+ const struct treq_sim_transmit_apdu *req_data;
+ dbg(" Function entry ");
+
+ hal = tcore_object_get_hal(o);
+ pending = tcore_pending_new(o, 0);
+ req_data = tcore_user_request_ref_data(ur, NULL);
+
+ if (!o || !ur)
+ return TCORE_RETURN_EINVAL;
+
+ cmd_str = g_strdup_printf("AT+CSIM=%d,\"%s\"", req_data->apdu_length, req_data->apdu);
+
+ req = tcore_at_request_new(cmd_str, "+CSIM:", TCORE_AT_SINGLELINE);
+
+ dbg("cmd : %s, prefix(if any) :%s, cmd_len : %d", req->cmd, req->prefix, strlen(req->cmd));
+
+ tcore_pending_set_request_data(pending, 0, req);
+ tcore_pending_set_response_callback(pending, on_response_transmit_apdu, hal);
+ tcore_pending_link_user_request(pending, ur);
+ tcore_pending_set_send_callback(pending, on_confirmation_sim_message_send, NULL);
+ tcore_hal_send_request(hal, pending);
+
+ free(cmd_str);
+ dbg(" Function exit");
+ return TCORE_RETURN_SUCCESS;
+}
+
+static struct tcore_sim_operations sim_ops = {
+ .verify_pins = s_verify_pins,
+ .verify_puks = s_verify_puks,
+ .change_pins = s_change_pins,
+ .get_facility_status = s_get_facility_status,
+ .enable_facility = s_enable_facility,
+ .disable_facility = s_disable_facility,
+ .get_lock_info = s_get_lock_info,
+ .read_file = s_read_file,
+ .update_file = s_update_file,
+ .transmit_apdu = s_transmit_apdu,
+ /*ToDo - Need to be implemented in Phase-2*/
+ /*.get_atr = s_get_atr,
+ .req_authentication = s_req_authentication*/
+};
+
+gboolean s_sim_init(TcorePlugin *p, TcoreHal *h)
+{
+ CoreObject *o;
+ struct s_sim_property *file_meta = NULL;
+ GQueue *work_queue;
+
+ dbg("entry");
+
+ o = tcore_sim_new(p, "sim", &sim_ops, h);
+
+ if (!o)
+ return FALSE;
+
+ file_meta = calloc(sizeof(struct s_sim_property), 1);
+ if (!file_meta)
+ return FALSE;
+
+ work_queue = g_queue_new();
+ tcore_object_link_user_data(o, work_queue);
+
+ file_meta->first_recv_status = SIM_STATUS_UNKNOWN;
+ tcore_sim_link_userdata(o, file_meta);
+
+ tcore_object_add_callback(o, "+XLOCK", on_event_facility_lock_status, NULL);
+ tcore_object_add_callback(o, "+XSIM", on_event_pin_status, NULL);
+
+ dbg("exit");
+ return TRUE;
+}
+
+void s_sim_exit(TcorePlugin *p)
+{
+ CoreObject *o;
+
+ o = tcore_plugin_ref_core_object(p, "sim");
+ if (!o)
+ return;
+ tcore_sim_free(o);
}
#include "s_sms.h"
/*=============================================================
- GSM-SMS Size
+ GSM-SMS Size
==============================================================*/
-#define MAX_GSM_SMS_TPDU_SIZE 244
-#define MAX_GSM_SMS_MSG_NUM 255
-#define MAX_GSM_SMS_SERVICE_CENTER_ADDR 12 /* Maximum number of bytes of service center address */
-#define MAX_GSM_SMS_CBMI_LIST_SIZE 100 /* Maximum number of CBMI list size for CBS 30*2=60 */
-#define MAX_GSM_SMS_PARAM_RECORD_SIZE 156 /* Maximum number of bytes SMSP Record size (Y + 28), y : 0 ~ 128 */
-#define MAX_GSM_SMS_STATUS_FILE_SIZE 2 /* Last Used TP-MR + SMS "Memory Cap. Exceeded" Noti Flag */
-#define TAPI_SIM_SMSP_ADDRESS_LEN 20
+#define MAX_GSM_SMS_TPDU_SIZE 244
+#define MAX_GSM_SMS_MSG_NUM 255
+#define MAX_GSM_SMS_SERVICE_CENTER_ADDR 12 /* Maximum number of bytes of service center address */
+#define MAX_GSM_SMS_CBMI_LIST_SIZE 100 /* Maximum number of CBMI list size for CBS 30*2=60 */
+#define MAX_GSM_SMS_PARAM_RECORD_SIZE 156 /* Maximum number of bytes SMSP Record size (Y + 28), y : 0 ~ 128 */
+#define MAX_GSM_SMS_STATUS_FILE_SIZE 2 /* Last Used TP-MR + SMS "Memory Cap. Exceeded" Noti Flag */
+#define TAPI_SIM_SMSP_ADDRESS_LEN 20
/*=============================================================
- Device Ready
+ Device Ready
==============================================================*/
-#define AT_SMS_DEVICE_READY 12 /* AT device ready */
-#define SMS_DEVICE_READY 1 /* Telephony device ready */
-#define SMS_DEVICE_NOT_READY 0 /* Telephony device not ready */
+#define AT_SMS_DEVICE_READY 12 /* AT device ready */
+#define SMS_DEVICE_READY 1 /* Telephony device ready */
+#define SMS_DEVICE_NOT_READY 0 /* Telephony device not ready */
/*=============================================================
- CBMI Selection
+ CBMI Selection
==============================================================*/
-#define SMS_CBMI_SELECTED_SOME 0x02 /* Some CBMIs are selected */
-#define SMS_CBMI_SELECTED_ALL 0x01 /* All CBMIs are selected */
+#define SMS_CBMI_SELECTED_SOME 0x02 /* Some CBMIs are selected */
+#define SMS_CBMI_SELECTED_ALL 0x01 /* All CBMIs are selected */
/*=============================================================
- Message Status
+ Message Status
==============================================================*/
-#define AT_REC_UNREAD 0 /* Received and Unread */
-#define AT_REC_READ 1 /* Received and Read */
-#define AT_STO_UNSENT 2 /* Unsent */
-#define AT_STO_SENT 3 /* Sent */
-#define AT_ALL 4 /* Unknown */
+#define AT_REC_UNREAD 0 /* Received and Unread */
+#define AT_REC_READ 1 /* Received and Read */
+#define AT_STO_UNSENT 2 /* Unsent */
+#define AT_STO_SENT 3 /* Sent */
+#define AT_ALL 4 /* Unknown */
/*=============================================================
- Memory Status
+ Memory Status
==============================================================*/
-#define AT_MEMORY_AVAILABLE 0 /* Memory Available */
-#define AT_MEMORY_FULL 1 /* Memory Full */
+#define AT_MEMORY_AVAILABLE 0 /* Memory Available */
+#define AT_MEMORY_FULL 1 /* Memory Full */
/*=============================================================
- SIM CRSM SW1 and Sw2 Error definitions */
+ SIM CRSM SW1 and Sw2 Error definitions */
#define AT_SW1_SUCCESS 0x90
#define AT_SW2_SUCCESS 0
/*=========================================================
- Security
+ Security
==============================================================*/
-#define MAX_SEC_PIN_LEN 8
-#define MAX_SEC_PUK_LEN 8
-#define MAX_SEC_PHONE_LOCK_PW_LEN 39 /* Maximum Phone Locking Password Length */
-#define MAX_SEC_SIM_DATA_STRING 256 /* Maximum Length of the DATA or RESPONSE. Restricted SIM Access, Generic SIM Access Message */
-#define MAX_SEC_NUM_LOCK_TYPE 8 /* Maximum number of Lock Type used in Lock Information Message */
-#define MAX_SEC_IMS_AUTH_LEN 512 /* Maximum Length of IMS Authentication Message */
+#define MAX_SEC_PIN_LEN 8
+#define MAX_SEC_PUK_LEN 8
+#define MAX_SEC_PHONE_LOCK_PW_LEN 39 /* Maximum Phone Locking Password Length */
+#define MAX_SEC_SIM_DATA_STRING 256 /* Maximum Length of the DATA or RESPONSE. Restricted SIM Access, Generic SIM Access Message */
+#define MAX_SEC_NUM_LOCK_TYPE 8 /* Maximum number of Lock Type used in Lock Information Message */
+#define MAX_SEC_IMS_AUTH_LEN 512 /* Maximum Length of IMS Authentication Message */
/*=============================================================
- String Preprocessor
+ String Preprocessor
==============================================================*/
-#define CR '\r' /* Carriage Return */
+#define CR '\r' /* Carriage Return */
/*=============================================================
- Developer
+ Developer
==============================================================*/
#define SMS_SWAPBYTES16(x) (((x) & 0xffff0000) | (((x) & 0x0000ff00) >> 8) | (((x) & 0x000000ff) << 8))
/* gaurav.kalra: For test */
void print_glib_list_elem(gpointer data, gpointer user_data)
{
- char *item = (char *)data;
+ char *item = (char *) data;
dbg("item: [%s]", item);
}
/*=============================================================
- Send Callback
+ Send Callback
==============================================================*/
static void on_confirmation_sms_message_send(TcorePending *p, gboolean result, void *user_data)
{
dbg("result: [%02x]", result);
dbg("user_data: [%p]", user_data);
- if(result == TRUE)
- {
+ if (result == TRUE) {
dbg("SEND OK");
- }
- else /* Failed */
- {
+ } else { /* Failed */
dbg("SEND NOK");
}
}
/*=============================================================
- Utilities
+ Utilities
==============================================================*/
static void util_sms_free_memory(void *sms_ptr)
{
dbg("Entry");
- if(NULL != sms_ptr)
- {
+ if (NULL != sms_ptr) {
dbg("Freeing memory location: [%p]", sms_ptr);
free(sms_ptr);
sms_ptr = NULL;
- }
- else
- {
+ } else {
err("Invalid memory location. Nothing to do.");
}
dbg("Exit");
}
-
+
static int util_sms_decode_smsParameters(unsigned char *incoming, unsigned int length, struct telephony_sms_Params *params)
{
int alpha_id_len = 0;
dbg(" RecordLen = %d", length);
- if(incoming == NULL || params == NULL)
+ if (incoming == NULL || params == NULL)
return FALSE;
- alpha_id_len = length -SMS_SMSP_PARAMS_MAX_LEN;
+ alpha_id_len = length - SMS_SMSP_PARAMS_MAX_LEN;
- if (alpha_id_len > 0)
- {
- if(alpha_id_len > SMS_SMSP_ALPHA_ID_LEN_MAX)
- {
+ if (alpha_id_len > 0) {
+ if (alpha_id_len > SMS_SMSP_ALPHA_ID_LEN_MAX) {
alpha_id_len = SMS_SMSP_ALPHA_ID_LEN_MAX;
}
- for(i=0 ; i < alpha_id_len ; i++)
- {
- if(0xff == incoming[i])
- {
+ for (i = 0; i < alpha_id_len; i++) {
+ if (0xff == incoming[i]) {
dbg(" found");
break;
}
params->alphaIdLen = i;
dbg(" Alpha id length = %d", i);
-
- }
- else
- {
+ } else {
params->alphaIdLen = 0;
dbg(" Alpha id length is zero");
}
- //dongil01.park - start parse from here.
+ // dongil01.park - start parse from here.
params->paramIndicator = incoming[alpha_id_len];
dbg(" Param Indicator = %02x", params->paramIndicator);
- //dongil01.park(2008/12/26) - DestAddr
- if((params->paramIndicator & SMSPValidDestAddr) == 0)
- {
+ // dongil01.park(2008/12/26) - DestAddr
+ if ((params->paramIndicator & SMSPValidDestAddr) == 0) {
nOffset = nDestAddrOffset;
- if(0x00 == incoming[alpha_id_len + nOffset] || 0xff == incoming[alpha_id_len + nOffset])
- {
+ if (0x00 == incoming[alpha_id_len + nOffset] || 0xff == incoming[alpha_id_len + nOffset]) {
params->tpDestAddr.dialNumLen = 0;
dbg("DestAddr Length is 0");
- }
- else
- {
- if (0 < (int)incoming[alpha_id_len + nOffset])
- {
- params->tpDestAddr.dialNumLen = (int)(incoming[alpha_id_len + nOffset] - 1);
-
- if(params->tpDestAddr.dialNumLen > SMS_SMSP_ADDRESS_LEN)
- params->tpDestAddr.dialNumLen = SMS_SMSP_ADDRESS_LEN;
- }
- else
- {
+ } else {
+ if (0 < (int) incoming[alpha_id_len + nOffset]) {
+ params->tpDestAddr.dialNumLen = (int) (incoming[alpha_id_len + nOffset] - 1);
+
+ if (params->tpDestAddr.dialNumLen > SMS_SMSP_ADDRESS_LEN)
+ params->tpDestAddr.dialNumLen = SMS_SMSP_ADDRESS_LEN;
+ } else {
params->tpDestAddr.dialNumLen = 0;
}
- params->tpDestAddr.numPlanId= incoming[alpha_id_len + (++nOffset)] & 0x0f ;
- params->tpDestAddr.typeOfNum= (incoming[alpha_id_len + nOffset] & 0x70)>>4 ;
-
- memcpy(params->tpDestAddr.diallingNum, &incoming[alpha_id_len + (++nOffset)], (params->tpDestAddr.dialNumLen)) ;
+ params->tpDestAddr.numPlanId = incoming[alpha_id_len + (++nOffset)] & 0x0f;
+ params->tpDestAddr.typeOfNum = (incoming[alpha_id_len + nOffset] & 0x70) >> 4;
- dbg("Dest TON is %d",params->tpDestAddr.typeOfNum);
- dbg("Dest NPI is %d",params->tpDestAddr.numPlanId);
- dbg("Dest Length = %d",params->tpDestAddr.dialNumLen);
- dbg("Dest Addr = %s",params->tpDestAddr.diallingNum);
+ memcpy(params->tpDestAddr.diallingNum, &incoming[alpha_id_len + (++nOffset)], (params->tpDestAddr.dialNumLen));
+ dbg("Dest TON is %d", params->tpDestAddr.typeOfNum);
+ dbg("Dest NPI is %d", params->tpDestAddr.numPlanId);
+ dbg("Dest Length = %d", params->tpDestAddr.dialNumLen);
+ dbg("Dest Addr = %s", params->tpDestAddr.diallingNum);
}
}
- //dongil01.park(2008/12/26) - SvcAddr
- if((params->paramIndicator & SMSPValidSvcAddr) == 0)
- {
+ // dongil01.park(2008/12/26) - SvcAddr
+ if ((params->paramIndicator & SMSPValidSvcAddr) == 0) {
nOffset = nSCAAddrOffset;
- if(0x00 == (int)incoming[alpha_id_len + nOffset] || 0xff == (int)incoming[alpha_id_len + nOffset])
- {
+ if (0x00 == (int) incoming[alpha_id_len + nOffset] || 0xff == (int) incoming[alpha_id_len + nOffset]) {
params->tpSvcCntrAddr.dialNumLen = 0;
dbg(" SCAddr Length is 0");
- }
- else
- {
- if (0 < (int)incoming[alpha_id_len + nOffset] )
- {
- params->tpSvcCntrAddr.dialNumLen = (int)(incoming[alpha_id_len + nOffset] - 1);
+ } else {
+ if (0 < (int) incoming[alpha_id_len + nOffset]) {
+ params->tpSvcCntrAddr.dialNumLen = (int) (incoming[alpha_id_len + nOffset] - 1);
- if(params->tpSvcCntrAddr.dialNumLen > SMS_SMSP_ADDRESS_LEN)
- params->tpSvcCntrAddr.dialNumLen = SMS_SMSP_ADDRESS_LEN;
+ if (params->tpSvcCntrAddr.dialNumLen > SMS_SMSP_ADDRESS_LEN)
+ params->tpSvcCntrAddr.dialNumLen = SMS_SMSP_ADDRESS_LEN;
- params->tpSvcCntrAddr.numPlanId= incoming[alpha_id_len + (++nOffset)] & 0x0f ;
- params->tpSvcCntrAddr.typeOfNum= (incoming[alpha_id_len + nOffset] & 0x70) >>4 ;
+ params->tpSvcCntrAddr.numPlanId = incoming[alpha_id_len + (++nOffset)] & 0x0f;
+ params->tpSvcCntrAddr.typeOfNum = (incoming[alpha_id_len + nOffset] & 0x70) >> 4;
memcpy(params->tpSvcCntrAddr.diallingNum, &incoming[alpha_id_len + (++nOffset)], (params->tpSvcCntrAddr.dialNumLen));
- dbg("SCAddr Length = %d ",params->tpSvcCntrAddr.dialNumLen);
- dbg("SCAddr TON is %d",params->tpSvcCntrAddr.typeOfNum);
- dbg("SCAddr NPI is %d",params->tpSvcCntrAddr.numPlanId);
+ dbg("SCAddr Length = %d ", params->tpSvcCntrAddr.dialNumLen);
+ dbg("SCAddr TON is %d", params->tpSvcCntrAddr.typeOfNum);
+ dbg("SCAddr NPI is %d", params->tpSvcCntrAddr.numPlanId);
- for(i = 0 ; i < (int)params->tpSvcCntrAddr.dialNumLen ; i ++)
- dbg("SCAddr = %d [%02x]",i,params->tpSvcCntrAddr.diallingNum[i]);
- }
- else
- {
+ for (i = 0; i < (int) params->tpSvcCntrAddr.dialNumLen; i++)
+ dbg("SCAddr = %d [%02x]", i, params->tpSvcCntrAddr.diallingNum[i]);
+ } else {
params->tpSvcCntrAddr.dialNumLen = 0;
}
}
- }
- else if ((0x00 < (int)incoming[alpha_id_len +nSCAAddrOffset] && (int)incoming[alpha_id_len +nSCAAddrOffset] <= 12)
- || 0xff != (int)incoming[alpha_id_len +nSCAAddrOffset])
- {
+ } else if ((0x00 < (int) incoming[alpha_id_len + nSCAAddrOffset] && (int) incoming[alpha_id_len + nSCAAddrOffset] <= 12)
+ || 0xff != (int) incoming[alpha_id_len + nSCAAddrOffset]) {
nOffset = nSCAAddrOffset;
- if(0x00 == (int)incoming[alpha_id_len + nOffset] || 0xff == (int)incoming[alpha_id_len + nOffset])
- {
+ if (0x00 == (int) incoming[alpha_id_len + nOffset] || 0xff == (int) incoming[alpha_id_len + nOffset]) {
params->tpSvcCntrAddr.dialNumLen = 0;
dbg("SCAddr Length is 0");
- }
- else
- {
+ } else {
+ if (0 < (int) incoming[alpha_id_len + nOffset]) {
+ params->tpSvcCntrAddr.dialNumLen = (int) (incoming[alpha_id_len + nOffset] - 1);
- if (0 < (int)incoming[alpha_id_len + nOffset] )
- {
- params->tpSvcCntrAddr.dialNumLen = (int)(incoming[alpha_id_len + nOffset] - 1);
+ params->tpSvcCntrAddr.dialNumLen = incoming[alpha_id_len + nOffset] - 1;
- params->tpSvcCntrAddr.dialNumLen = incoming[alpha_id_len + nOffset] -1;
+ if (params->tpSvcCntrAddr.dialNumLen > SMS_SMSP_ADDRESS_LEN)
+ params->tpSvcCntrAddr.dialNumLen = SMS_SMSP_ADDRESS_LEN;
- if(params->tpSvcCntrAddr.dialNumLen > SMS_SMSP_ADDRESS_LEN)
- params->tpSvcCntrAddr.dialNumLen = SMS_SMSP_ADDRESS_LEN;
-
- params->tpSvcCntrAddr.numPlanId= incoming[alpha_id_len + (++nOffset)] & 0x0f ;
- params->tpSvcCntrAddr.typeOfNum= (incoming[alpha_id_len + nOffset] & 0x70) >>4 ;
+ params->tpSvcCntrAddr.numPlanId = incoming[alpha_id_len + (++nOffset)] & 0x0f;
+ params->tpSvcCntrAddr.typeOfNum = (incoming[alpha_id_len + nOffset] & 0x70) >> 4;
memcpy(params->tpSvcCntrAddr.diallingNum, &incoming[alpha_id_len + (++nOffset)],
- (params->tpSvcCntrAddr.dialNumLen)) ;
+ (params->tpSvcCntrAddr.dialNumLen));
- dbg("SCAddr Length = %d ",params->tpSvcCntrAddr.dialNumLen);
- dbg("SCAddr TON is %d",params->tpSvcCntrAddr.typeOfNum);
- dbg("SCAddr NPI is %d",params->tpSvcCntrAddr.numPlanId);
+ dbg("SCAddr Length = %d ", params->tpSvcCntrAddr.dialNumLen);
+ dbg("SCAddr TON is %d", params->tpSvcCntrAddr.typeOfNum);
+ dbg("SCAddr NPI is %d", params->tpSvcCntrAddr.numPlanId);
- for(i = 0 ; i < (int)params->tpSvcCntrAddr.dialNumLen ; i ++)
- dbg("SCAddr = %d [%02x]",i,params->tpSvcCntrAddr.diallingNum[i]);
- }
- else
- {
+ for (i = 0; i < (int) params->tpSvcCntrAddr.dialNumLen; i++)
+ dbg("SCAddr = %d [%02x]", i, params->tpSvcCntrAddr.diallingNum[i]);
+ } else {
params->tpSvcCntrAddr.dialNumLen = 0;
}
}
-
}
- if((params->paramIndicator & SMSPValidPID) == 0 && (alpha_id_len + nPIDOffset) < MAX_GSM_SMS_PARAM_RECORD_SIZE)
- {
+ if ((params->paramIndicator & SMSPValidPID) == 0 && (alpha_id_len + nPIDOffset) < MAX_GSM_SMS_PARAM_RECORD_SIZE) {
params->tpProtocolId = incoming[alpha_id_len + nPIDOffset];
}
- if((params->paramIndicator & SMSPValidDCS) == 0 && (alpha_id_len + nDCSOffset) < MAX_GSM_SMS_PARAM_RECORD_SIZE)
- {
+ if ((params->paramIndicator & SMSPValidDCS) == 0 && (alpha_id_len + nDCSOffset) < MAX_GSM_SMS_PARAM_RECORD_SIZE) {
params->tpDataCodingScheme = incoming[alpha_id_len + nDCSOffset];
}
- if((params->paramIndicator & SMSPValidVP) == 0 && (alpha_id_len + nVPOffset) < MAX_GSM_SMS_PARAM_RECORD_SIZE)
- {
+ if ((params->paramIndicator & SMSPValidVP) == 0 && (alpha_id_len + nVPOffset) < MAX_GSM_SMS_PARAM_RECORD_SIZE) {
params->tpValidityPeriod = incoming[alpha_id_len + nVPOffset];
}
- dbg(" Alpha Id(Len) = %d",(int)params->alphaIdLen);
+ dbg(" Alpha Id(Len) = %d", (int) params->alphaIdLen);
- for (i=0; i< (int)params->alphaIdLen ; i++)
- {
- dbg(" Alpha Id = [%d] [%c]",i,params->szAlphaId[i]);
+ for (i = 0; i < (int) params->alphaIdLen; i++) {
+ dbg(" Alpha Id = [%d] [%c]", i, params->szAlphaId[i]);
}
- dbg(" PID = %d",params->tpProtocolId);
- dbg(" DCS = %d",params->tpDataCodingScheme);
- dbg(" VP = %d",params->tpValidityPeriod);
+ dbg(" PID = %d", params->tpProtocolId);
+ dbg(" DCS = %d", params->tpDataCodingScheme);
+ dbg(" VP = %d", params->tpValidityPeriod);
return TRUE;
}
/*=============================================================
- Notifications
+ Notifications
==============================================================*/
static gboolean on_event_sms_ready_status(CoreObject *o, const void *event_info, void *user_data)
{
- struct tnoti_sms_ready_status readyStatusInfo = {0,};
+ struct tnoti_sms_ready_status readyStatusInfo = {0, };
char *line = NULL;
- GSList* tokens = NULL;
- GSList* lines = NULL;
+ GSList *tokens = NULL;
+ GSList *lines = NULL;
char *pResp = NULL;
- //CoreObject *o = NULL;
+ // CoreObject *o = NULL;
- int rtn = -1 , status = 0;
+ int rtn = -1, status = 0;
dbg(" Func Entrance");
- lines = (GSList *)event_info;
- if (1 != g_slist_length(lines))
- {
+ lines = (GSList *) event_info;
+ if (1 != g_slist_length(lines)) {
dbg("unsolicited msg but multiple line");
goto OUT;
}
- line = (char *)(lines->data);
+ line = (char *) (lines->data);
dbg(" Func Entrance");
- if(line!=NULL)
- {
+ if (line != NULL) {
dbg("Response OK");
- dbg("noti line is %s", line);
- tokens = tcore_at_tok_new(line);
- pResp = g_slist_nth_data(tokens, 0);
- if (pResp !=NULL)
- status = atoi(pResp);
-
- }
- else
- {
+ dbg("noti line is %s", line);
+ tokens = tcore_at_tok_new(line);
+ pResp = g_slist_nth_data(tokens, 0);
+ if (pResp != NULL)
+ status = atoi(pResp);
+ } else {
dbg("Response NOK");
}
- if (status == AT_SMS_DEVICE_READY)
- {
+ if (status == AT_SMS_DEVICE_READY) {
readyStatusInfo.status = SMS_DEVICE_READY;
tcore_sms_set_ready_status(o, readyStatusInfo.status);
dbg("SMS Ready status = [%s]", readyStatusInfo.status ? "TRUE" : "FALSE");
rtn = tcore_server_send_notification(tcore_plugin_ref_server(tcore_object_ref_plugin(o)), o, TNOTI_SMS_DEVICE_READY, sizeof(struct tnoti_sms_ready_status), &readyStatusInfo);
- dbg(" Return value [%d]",rtn);
- }
- else
- {
+ dbg(" Return value [%d]", rtn);
+ } else {
readyStatusInfo.status = SMS_DEVICE_NOT_READY;
}
OUT:
- if(NULL!=tokens)
+ if (NULL != tokens)
tcore_at_tok_free(tokens);
return TRUE;
}
static gboolean on_event_class2_sms_incom_msg(CoreObject *obj, const void *event_info, void *user_data)
{
- //+CMTI: <mem>,<index>
-
- GSList *tokens = NULL , *lines = NULL;
+ // +CMTI: <mem>,<index>
+
+ GSList *tokens = NULL, *lines = NULL;
char *line = NULL, *cmd_str = NULL;
int index = 0, mem_type = 0;
TcoreHal *hal = NULL;
dbg("Entered Function");
- lines = (GSList *)event_info;
- line = (char *)g_slist_nth_data(lines, 0); /* Fetch Line 1 */
+ lines = (GSList *) event_info;
+ line = (char *) g_slist_nth_data(lines, 0); /* Fetch Line 1 */
dbg("Line 1: [%s]", line);
- if (!line)
- {
+ if (!line) {
err("Line 1 is invalid");
return FALSE;
}
tokens = tcore_at_tok_new(line); /* Split Line 1 into tokens */
- mem_type = atoi(g_slist_nth_data(tokens, 0)); //Type of Memory stored
- index = atoi((char *)g_slist_nth_data(tokens, 1));
+ mem_type = atoi(g_slist_nth_data(tokens, 0)); // Type of Memory stored
+ index = atoi((char *) g_slist_nth_data(tokens, 1));
hal = tcore_object_get_hal(obj);
- if (NULL == hal)
- {
+ if (NULL == hal) {
err("NULL input. Unable to proceed");
dbg("readMsg: hal: [%p]", hal);
dbg("index: [%d]", index);
- cmd_str = g_strdup_printf("AT+CMGR=%d", index);
- atreq = tcore_at_request_new((const char *)cmd_str, "+CMGR", TCORE_AT_PDU);
+ cmd_str = g_strdup_printf("AT+CMGR=%d", index);
+ atreq = tcore_at_request_new((const char *) cmd_str, "+CMGR", TCORE_AT_PDU);
pending = tcore_pending_new(obj, 0);
- if(NULL == cmd_str || NULL == atreq || NULL == pending)
- {
+ if (NULL == cmd_str || NULL == atreq || NULL == pending) {
err("Out of memory. Unable to proceed");
dbg("cmd_str: [%p], atreq: [%p], pending: [%p]", cmd_str, atreq, pending);
- //free memory we own
+ // free memory we own
g_free(cmd_str);
util_sms_free_memory(atreq);
util_sms_free_memory(pending);
return TCORE_RETURN_ENOMEM;
}
- util_hex_dump(" ", strlen(cmd_str), (void *)cmd_str);
+ util_hex_dump(" ", strlen(cmd_str), (void *) cmd_str);
tcore_pending_set_request_data(pending, 0, atreq);
- tcore_pending_set_response_callback(pending, on_response_class2_read_msg, (void *)(uintptr_t)index); //storing index as user data for response
+ tcore_pending_set_response_callback(pending, on_response_class2_read_msg, (void *) (uintptr_t) index); // storing index as user data for response
tcore_pending_link_user_request(pending, NULL);
tcore_pending_set_send_callback(pending, on_confirmation_sms_message_send, NULL);
tcore_hal_send_request(hal, pending);
static gboolean on_event_sms_incom_msg(CoreObject *o, const void *event_info, void *user_data)
{
- //+CMT: [<alpha>],<length><CR><LF><pdu> (PDU mode enabled);
-
+ // +CMT: [<alpha>],<length><CR><LF><pdu> (PDU mode enabled);
+
int rtn = -1;
GSList *tokens = NULL;
GSList *lines = NULL;
dbg("Entered Function");
- lines = (GSList *)event_info;
+ lines = (GSList *) event_info;
memset(&gsmMsgInfo, 0x00, sizeof(struct tnoti_sms_umts_msg));
- if(2 != g_slist_length(lines))
- {
+ if (2 != g_slist_length(lines)) {
err("Invalid number of lines for +CMT. Must be 2");
return FALSE;
}
- line = (char *)g_slist_nth_data(lines, 0); /* Fetch Line 1 */
+ line = (char *) g_slist_nth_data(lines, 0); /* Fetch Line 1 */
dbg("Line 1: [%s]", line);
- if (!line)
- {
+ if (!line) {
err("Line 1 is invalid");
return FALSE;
}
no_of_tokens = g_slist_length(tokens);
- if (no_of_tokens == 2) // in case of incoming SMS +CMT
- {
- dbg("Alpha ID: [%02x]", g_slist_nth_data(tokens, 0)); /* 0: Alpha ID */
- length = atoi((char *)g_slist_nth_data(tokens, 1));
- dbg("Length: [%d]", length); /* 1: PDU Length */
- }
- else if (no_of_tokens == 1) // in case of incoming status report +CDS
- {
- length = atoi((char *)g_slist_nth_data(tokens, 0));
- dbg("Length: [%d]", length); /* 1: PDU Length */
+ if (no_of_tokens == 2) { // in case of incoming SMS +CMT
+ dbg("Alpha ID: [%02x]", g_slist_nth_data(tokens, 0)); /* 0: Alpha ID */
+ length = atoi((char *) g_slist_nth_data(tokens, 1));
+ dbg("Length: [%d]", length); /* 1: PDU Length */
+ } else if (no_of_tokens == 1) { // in case of incoming status report +CDS
+ length = atoi((char *) g_slist_nth_data(tokens, 0));
+ dbg("Length: [%d]", length); /* 1: PDU Length */
}
gsmMsgInfo.msgInfo.msgLength = length;
- line = (char *)g_slist_nth_data(lines, 1); /* Fetch Line 2 */
+ line = (char *) g_slist_nth_data(lines, 1); /* Fetch Line 2 */
dbg("Line 2: [%s]", line);
- if (!line)
- {
+ if (!line) {
err("Line 2 is invalid");
return FALSE;
}
/* Convert to Bytes */
- bytePDU = (unsigned char *)util_hexStringToBytes(line);
+ bytePDU = (unsigned char *) util_hexStringToBytes(line);
- if(NULL == bytePDU)
- {
+ if (NULL == bytePDU) {
err("bytePDU is NULL");
return FALSE;
}
- memcpy(gsmMsgInfo.msgInfo.sca, bytePDU, (strlen(line)/2 - length));
- memcpy(gsmMsgInfo.msgInfo.tpduData, &bytePDU[(strlen(line)/2 - length)], length);
+ memcpy(gsmMsgInfo.msgInfo.sca, bytePDU, (strlen(line) / 2 - length));
+ memcpy(gsmMsgInfo.msgInfo.tpduData, &bytePDU[(strlen(line) / 2 - length)], length);
- util_hex_dump(" ", strlen(line)/2, bytePDU);
- util_hex_dump(" ", (strlen(line)/2 - length), gsmMsgInfo.msgInfo.sca);
+ util_hex_dump(" ", strlen(line) / 2, bytePDU);
+ util_hex_dump(" ", (strlen(line) / 2 - length), gsmMsgInfo.msgInfo.sca);
util_hex_dump(" ", length, gsmMsgInfo.msgInfo.tpduData);
rtn = tcore_server_send_notification(tcore_plugin_ref_server(tcore_object_ref_plugin(o)), o, TNOTI_SMS_INCOM_MSG, sizeof(struct tnoti_sms_umts_msg), &gsmMsgInfo);
static gboolean on_event_sms_memory_status(CoreObject *o, const void *event_info, void *user_data)
{
- struct tnoti_sms_memory_status memStatusInfo = {0,};
+ struct tnoti_sms_memory_status memStatusInfo = {0, };
- int rtn = -1 ,memoryStatus = -1;
- GSList *tokens=NULL;
- GSList *lines=NULL;
- char *line = NULL , *pResp = NULL;
+ int rtn = -1, memoryStatus = -1;
+ GSList *tokens = NULL;
+ GSList *lines = NULL;
+ char *line = NULL, *pResp = NULL;
- lines = (GSList *)event_info;
- if (1 != g_slist_length(lines))
- {
- dbg("unsolicited msg but multiple line");
- }
+ lines = (GSList *) event_info;
+ if (1 != g_slist_length(lines)) {
+ dbg("unsolicited msg but multiple line");
+ }
- line = (char*)(lines->data);
+ line = (char *) (lines->data);
dbg(" Func Entrance");
- if (line)
- {
+ if (line) {
dbg("Response OK");
tokens = tcore_at_tok_new(line);
pResp = g_slist_nth_data(tokens, 0);
- if(pResp)
- {
+ if (pResp) {
memoryStatus = atoi(pResp);
- dbg("memoryStatus is %d",memoryStatus);
+ dbg("memoryStatus is %d", memoryStatus);
}
-
- }else
- {
+ } else {
dbg("Response NOK");
-
}
- if (memoryStatus == 0) //SIM Full condition
- {
+ if (memoryStatus == 0) { // SIM Full condition
memStatusInfo.status = SMS_PHONE_MEMORY_STATUS_FULL;
}
- dbg("memory status - %d",memStatusInfo.status);
+ dbg("memory status - %d", memStatusInfo.status);
rtn = tcore_server_send_notification(tcore_plugin_ref_server(tcore_object_ref_plugin(o)), o, TNOTI_SMS_MEMORY_STATUS, sizeof(struct tnoti_sms_memory_status), &memStatusInfo);
- dbg(" Return value [%d]",rtn);
+ dbg(" Return value [%d]", rtn);
return TRUE;
-
}
static gboolean on_event_sms_cb_incom_msg(CoreObject *o, const void *event_info, void *user_data)
{
- //+CBM: <length><CR><LF><pdu>
+ // +CBM: <length><CR><LF><pdu>
struct tnoti_sms_cellBroadcast_msg cbMsgInfo;
- int rtn = -1 , length = 0;
- char * line = NULL, *pdu = NULL, *pResp = NULL;
+ int rtn = -1, length = 0;
+ char *line = NULL, *pdu = NULL, *pResp = NULL;
GSList *tokens = NULL;
GSList *lines = NULL;
dbg(" Func Entrance");
- lines = (GSList *)event_info;
+ lines = (GSList *) event_info;
memset(&cbMsgInfo, 0, sizeof(struct tnoti_sms_cellBroadcast_msg));
- line = (char *)(lines->data);
+ line = (char *) (lines->data);
- if (line != NULL)
- {
- dbg("Response OK");
- dbg("Noti line is %s",line);
- tokens = tcore_at_tok_new(line); /* Split Line 1 into tokens */
+ if (line != NULL) {
+ dbg("Response OK");
+ dbg("Noti line is %s", line);
+ tokens = tcore_at_tok_new(line); /* Split Line 1 into tokens */
- pResp = g_slist_nth_data(tokens, 0);
- if (pResp) {
- length = atoi(pResp);
- }else {
- dbg("token 0 is null");
- }
-
- pdu = g_slist_nth_data(lines, 1);
- if (pdu != NULL)
- {
- cbMsgInfo.cbMsg.length = length/2;
- cbMsgInfo.cbMsg.cbMsgType = SMS_CB_MSG_CBS ; //TODO - Need to check for other CB types
-
- dbg("CB Msg LENGTH [%2x]", length);
-
- if (cbMsgInfo.cbMsg.length >0)// && (SMS_CB_PAGE_SIZE_MAX >= cbMsgInfo.cbMsg.length))
- {
- unsigned char *byte_pdu = NULL;
-
- byte_pdu = (unsigned char *)util_hexStringToBytes(pdu);
-
- memcpy(cbMsgInfo.cbMsg.msgData, (char*)byte_pdu, cbMsgInfo.cbMsg.length);
- rtn = tcore_server_send_notification(tcore_plugin_ref_server(tcore_object_ref_plugin(o)), o, TNOTI_SMS_CB_INCOM_MSG, sizeof(struct tnoti_sms_cellBroadcast_msg), &cbMsgInfo);
- free(byte_pdu);
- }
- else
- {
- dbg("Invalid Message Length");
- }
- }
- else
- {
- dbg("Recieved NULL pdu");
+ pResp = g_slist_nth_data(tokens, 0);
+ if (pResp) {
+ length = atoi(pResp);
+ } else {
+ dbg("token 0 is null");
+ }
+
+ pdu = g_slist_nth_data(lines, 1);
+ if (pdu != NULL) {
+ cbMsgInfo.cbMsg.length = length / 2;
+ cbMsgInfo.cbMsg.cbMsgType = SMS_CB_MSG_CBS; // TODO - Need to check for other CB types
+
+ dbg("CB Msg LENGTH [%2x]", length);
+
+ if (cbMsgInfo.cbMsg.length > 0) { // && (SMS_CB_PAGE_SIZE_MAX >= cbMsgInfo.cbMsg.length))
+ unsigned char *byte_pdu = NULL;
+
+ byte_pdu = (unsigned char *) util_hexStringToBytes(pdu);
+
+ memcpy(cbMsgInfo.cbMsg.msgData, (char *) byte_pdu, cbMsgInfo.cbMsg.length);
+ rtn = tcore_server_send_notification(tcore_plugin_ref_server(tcore_object_ref_plugin(o)), o, TNOTI_SMS_CB_INCOM_MSG, sizeof(struct tnoti_sms_cellBroadcast_msg), &cbMsgInfo);
+ free(byte_pdu);
+ } else {
+ dbg("Invalid Message Length");
}
- }
- else
- {
- dbg("Response NOK");
+ } else {
+ dbg("Recieved NULL pdu");
+ }
+ } else {
+ dbg("Response NOK");
}
- dbg(" Return value [%d]",rtn);
+ dbg(" Return value [%d]", rtn);
return TRUE;
}
/*=============================================================
- Responses
+ Responses
==============================================================*/
static void on_response_sms_delete_msg(TcorePending *p, int data_len, const void *data, void *user_data)
{
- struct tresp_sms_delete_msg delMsgInfo = {0,};
+ struct tresp_sms_delete_msg delMsgInfo = {0, };
UserRequest *ur = NULL;
const TcoreATResponse *atResp = data;
int rtn = -1;
- int *index = (int *)user_data;
+ int *index = (int *) user_data;
dbg(" Func Entrance");
ur = tcore_pending_ref_user_request(p);
- if (atResp->success)
- {
+ if (atResp->success) {
dbg("Response OK");
delMsgInfo.index = *index;
delMsgInfo.result = SMS_SENDSMS_SUCCESS;
-
- }
- else
- {
+ } else {
dbg("Response NOK");
delMsgInfo.index = *index;
delMsgInfo.result = SMS_DEVICE_FAILURE;
-
}
rtn = tcore_user_request_send_response(ur, TRESP_SMS_DELETE_MSG, sizeof(struct tresp_sms_delete_msg), &delMsgInfo);
static void on_response_sms_save_msg(TcorePending *p, int data_len, const void *data, void *user_data)
{
- struct tresp_sms_save_msg saveMsgInfo = {0,};
+ struct tresp_sms_save_msg saveMsgInfo = {0, };
UserRequest *ur = NULL;
const TcoreATResponse *atResp = data;
GSList *tokens = NULL;
int rtn = -1;
ur = tcore_pending_ref_user_request(p);
- if (atResp->success)
- {
+ if (atResp->success) {
dbg("Response OK");
- if(atResp->lines)
- {
- line = (char *)atResp->lines->data;
+ if (atResp->lines) {
+ line = (char *) atResp->lines->data;
tokens = tcore_at_tok_new(line);
pResp = g_slist_nth_data(tokens, 0);
- if (pResp)
- {
+ if (pResp) {
dbg("0: %s", pResp);
- saveMsgInfo.index = (atoi(pResp) - 1); /* IMC index starts from 1 */
+ saveMsgInfo.index = (atoi(pResp) - 1); /* IMC index starts from 1 */
saveMsgInfo.result = SMS_SENDSMS_SUCCESS;
- }
- else
- {
+ } else {
dbg("No Tokens");
saveMsgInfo.index = -1;
saveMsgInfo.result = SMS_DEVICE_FAILURE;
}
-
}
- }
- else
- {
+ } else {
dbg("Response NOK");
saveMsgInfo.index = -1;
saveMsgInfo.result = SMS_DEVICE_FAILURE;
user_req = tcore_pending_ref_user_request(pending);
- if(NULL == user_req)
- {
+ if (NULL == user_req) {
err("No user request");
dbg("Exit");
memset(&resp_umts, 0x00, sizeof(resp_umts));
resp_umts.result = SMS_DEVICE_FAILURE;
- if(at_response->success > 0) //success
- {
+ if (at_response->success > 0) { // success
dbg("Response OK");
- if(at_response->lines) //lines present in at_response
- {
- gslist_line = (char *)at_response->lines->data;
+ if (at_response->lines) { // lines present in at_response
+ gslist_line = (char *) at_response->lines->data;
dbg("gslist_line: [%s]", gslist_line);
- tokens = tcore_at_tok_new(gslist_line); //extract tokens
+ tokens = tcore_at_tok_new(gslist_line); // extract tokens
line_token = g_slist_nth_data(tokens, 0);
- if (line_token != NULL)
- {
+ if (line_token != NULL) {
msg_ref = atoi(line_token);
dbg("Message Reference: [%d]", msg_ref);
resp_umts.result = SMS_SENDSMS_SUCCESS;
- }
- else
- {
+ } else {
dbg("No Message Reference received");
}
- }
- else //no lines in at_response
- {
+ } else { // no lines in at_response
dbg("No lines");
}
- }
- else //failure
- {
+ } else { // failure
dbg("Response NOK");
}
static void on_response_class2_read_msg(TcorePending *pending, int data_len, const void *data, void *user_data)
{
const TcoreATResponse *at_response = data;
- GSList *tokens=NULL;
+ GSList *tokens = NULL;
char *gslist_line = NULL, *line_token = NULL, *hex_pdu = NULL;
- int pdu_len = 0, rtn = 0;
+ int pdu_len = 0, rtn = 0;
unsigned char *bytePDU = NULL;
struct tnoti_sms_umts_msg gsmMsgInfo;
dbg("Entry");
dbg("lines: [%p]", at_response->lines);
- g_slist_foreach(at_response->lines, print_glib_list_elem, NULL); //for debug log
+ g_slist_foreach(at_response->lines, print_glib_list_elem, NULL); // for debug log
- if (at_response->success > 0)
- {
+ if (at_response->success > 0) {
dbg("Response OK");
- if (at_response->lines)
- {
- //fetch first line
- gslist_line = (char *)at_response->lines->data;
+ if (at_response->lines) {
+ // fetch first line
+ gslist_line = (char *) at_response->lines->data;
dbg("gslist_line: [%s]", gslist_line);
tokens = tcore_at_tok_new(gslist_line);
dbg("Number of tokens: [%d]", g_slist_length(tokens));
- g_slist_foreach(tokens, print_glib_list_elem, NULL); //for debug log
+ g_slist_foreach(tokens, print_glib_list_elem, NULL); // for debug log
- line_token = g_slist_nth_data(tokens, 2); //Third Token: Length
- if (line_token != NULL)
- {
+ line_token = g_slist_nth_data(tokens, 2); // Third Token: Length
+ if (line_token != NULL) {
pdu_len = atoi(line_token);
dbg("Length: [%d]", pdu_len);
}
- //fetch second line
- gslist_line = (char *)at_response->lines->next->data;
+ // fetch second line
+ gslist_line = (char *) at_response->lines->next->data;
dbg("gslist_line: [%s]", gslist_line);
tokens = tcore_at_tok_new(gslist_line);
dbg("Number of tokens: [%d]", g_slist_length(tokens));
- g_slist_foreach(tokens, print_glib_list_elem, NULL); //for debug log
+ g_slist_foreach(tokens, print_glib_list_elem, NULL); // for debug log
- hex_pdu = g_slist_nth_data(tokens, 0); //Fetch SMS PDU
-
- }
- else
- {
+ hex_pdu = g_slist_nth_data(tokens, 0); // Fetch SMS PDU
+ } else {
dbg("No lines");
}
- }
- else
- {
+ } else {
err("Response NOK");
}
gsmMsgInfo.msgInfo.msgLength = pdu_len;
-
+
/* Convert to Bytes */
- bytePDU = (unsigned char *)util_hexStringToBytes(hex_pdu);
+ bytePDU = (unsigned char *) util_hexStringToBytes(hex_pdu);
- if(NULL == bytePDU)
- {
+ if (NULL == bytePDU) {
err("bytePDU is NULL");
- return ;
+ return;
}
- memcpy(gsmMsgInfo.msgInfo.sca, bytePDU, (strlen(hex_pdu)/2 - pdu_len));
- memcpy(gsmMsgInfo.msgInfo.tpduData, &bytePDU[(strlen(hex_pdu)/2 - pdu_len)], pdu_len);
+ memcpy(gsmMsgInfo.msgInfo.sca, bytePDU, (strlen(hex_pdu) / 2 - pdu_len));
+ memcpy(gsmMsgInfo.msgInfo.tpduData, &bytePDU[(strlen(hex_pdu) / 2 - pdu_len)], pdu_len);
- util_hex_dump(" ", strlen(hex_pdu)/2, bytePDU);
- util_hex_dump(" ", (strlen(hex_pdu)/2 - pdu_len), gsmMsgInfo.msgInfo.sca);
+ util_hex_dump(" ", strlen(hex_pdu) / 2, bytePDU);
+ util_hex_dump(" ", (strlen(hex_pdu) / 2 - pdu_len), gsmMsgInfo.msgInfo.sca);
util_hex_dump(" ", pdu_len, gsmMsgInfo.msgInfo.tpduData);
rtn = tcore_server_send_notification(tcore_plugin_ref_server(tcore_object_ref_plugin(tcore_pending_ref_core_object(pending))), tcore_pending_ref_core_object(pending), TNOTI_SMS_INCOM_MSG, sizeof(struct tnoti_sms_umts_msg), &gsmMsgInfo);
struct tresp_sms_read_msg resp_read_msg;
UserRequest *user_req = NULL;
- GSList *tokens=NULL;
+ GSList *tokens = NULL;
char *gslist_line = NULL, *line_token = NULL, *byte_pdu = NULL, *hex_pdu = NULL;
int sca_length = 0;
int msg_status = 0, alpha_id = 0, pdu_len = 0;
- int index = (int)(uintptr_t)user_data;
+ int index = (int) (uintptr_t) user_data;
dbg("Entry");
dbg("index: [%d]", index);
dbg("lines: [%p]", at_response->lines);
- g_slist_foreach(at_response->lines, print_glib_list_elem, NULL); //for debug log
+ g_slist_foreach(at_response->lines, print_glib_list_elem, NULL); // for debug log
user_req = tcore_pending_ref_user_request(pending);
- if (NULL == user_req)
- {
+ if (NULL == user_req) {
err("No user request");
dbg("Exit");
memset(&resp_read_msg, 0x00, sizeof(resp_read_msg));
resp_read_msg.result = SMS_PHONE_FAILURE;
- if (at_response->success > 0)
- {
+ if (at_response->success > 0) {
dbg("Response OK");
- if (at_response->lines)
- {
- //fetch first line
- gslist_line = (char *)at_response->lines->data;
+ if (at_response->lines) {
+ // fetch first line
+ gslist_line = (char *) at_response->lines->data;
dbg("gslist_line: [%s]", gslist_line);
tokens = tcore_at_tok_new(gslist_line);
dbg("Number of tokens: [%d]", g_slist_length(tokens));
- g_slist_foreach(tokens, print_glib_list_elem, NULL); //for debug log
+ g_slist_foreach(tokens, print_glib_list_elem, NULL); // for debug log
- line_token = g_slist_nth_data(tokens, 0); //First Token: Message Status
- if (line_token != NULL)
- {
+ line_token = g_slist_nth_data(tokens, 0); // First Token: Message Status
+ if (line_token != NULL) {
msg_status = atoi(line_token);
- dbg("msg_status is %d",msg_status);
- switch (msg_status)
- {
- case AT_REC_UNREAD:
- resp_read_msg.dataInfo.msgStatus = SMS_STATUS_UNREAD;
- break;
-
- case AT_REC_READ:
- resp_read_msg.dataInfo.msgStatus = SMS_STATUS_READ;
- break;
-
- case AT_STO_UNSENT:
- resp_read_msg.dataInfo.msgStatus = SMS_STATUS_UNSENT;
- break;
-
- case AT_STO_SENT:
- resp_read_msg.dataInfo.msgStatus = SMS_STATUS_SENT;
- break;
-
- case AT_ALL: //Fall Through
- default: //Fall Through
- resp_read_msg.dataInfo.msgStatus = SMS_STATUS_RESERVED;
- break;
+ dbg("msg_status is %d", msg_status);
+ switch (msg_status) {
+ case AT_REC_UNREAD:
+ resp_read_msg.dataInfo.msgStatus = SMS_STATUS_UNREAD;
+ break;
+
+ case AT_REC_READ:
+ resp_read_msg.dataInfo.msgStatus = SMS_STATUS_READ;
+ break;
+
+ case AT_STO_UNSENT:
+ resp_read_msg.dataInfo.msgStatus = SMS_STATUS_UNSENT;
+ break;
+
+ case AT_STO_SENT:
+ resp_read_msg.dataInfo.msgStatus = SMS_STATUS_SENT;
+ break;
+
+ case AT_ALL: // Fall Through
+ default: // Fall Through
+ resp_read_msg.dataInfo.msgStatus = SMS_STATUS_RESERVED;
+ break;
}
}
- line_token = g_slist_nth_data(tokens, 1); //Second Token: AlphaID
- if (line_token != NULL)
- {
+ line_token = g_slist_nth_data(tokens, 1); // Second Token: AlphaID
+ if (line_token != NULL) {
alpha_id = atoi(line_token);
dbg("AlphaID: [%d]", alpha_id);
}
- line_token = g_slist_nth_data(tokens, 2); //Third Token: Length
- if (line_token != NULL)
- {
+ line_token = g_slist_nth_data(tokens, 2); // Third Token: Length
+ if (line_token != NULL) {
pdu_len = atoi(line_token);
dbg("Length: [%d]", pdu_len);
}
- //fetch second line
- gslist_line = (char *)at_response->lines->next->data;
+ // fetch second line
+ gslist_line = (char *) at_response->lines->next->data;
dbg("gslist_line: [%s]", gslist_line);
tokens = tcore_at_tok_new(gslist_line);
dbg("Number of tokens: [%d]", g_slist_length(tokens));
- g_slist_foreach(tokens, print_glib_list_elem, NULL); //for debug log
+ g_slist_foreach(tokens, print_glib_list_elem, NULL); // for debug log
- hex_pdu = g_slist_nth_data(tokens, 0); //Fetch SMS PDU
- if (NULL != hex_pdu)
- {
- util_hex_dump(" ", sizeof(hex_pdu), (void *)hex_pdu);
+ hex_pdu = g_slist_nth_data(tokens, 0); // Fetch SMS PDU
+ if (NULL != hex_pdu) {
+ util_hex_dump(" ", sizeof(hex_pdu), (void *) hex_pdu);
byte_pdu = util_hexStringToBytes(hex_pdu);
- sca_length = (int)byte_pdu[0];
+ sca_length = (int) byte_pdu[0];
- resp_read_msg.dataInfo.simIndex = index; //Retrieving index stored as user_data
+ resp_read_msg.dataInfo.simIndex = index; // Retrieving index stored as user_data
- if(0 == sca_length)
- {
+ if (0 == sca_length) {
dbg("SCA Length is 0");
- resp_read_msg.dataInfo.smsData.msgLength = pdu_len - (sca_length+1);
+ resp_read_msg.dataInfo.smsData.msgLength = pdu_len - (sca_length + 1);
dbg("msgLength: [%d]", resp_read_msg.dataInfo.smsData.msgLength);
if ((resp_read_msg.dataInfo.smsData.msgLength > 0)
- && (resp_read_msg.dataInfo.smsData.msgLength <= 0xff))
- {
+ && (resp_read_msg.dataInfo.smsData.msgLength <= 0xff)) {
memset(resp_read_msg.dataInfo.smsData.sca, 0, TAPI_SIM_SMSP_ADDRESS_LEN);
memcpy(resp_read_msg.dataInfo.smsData.tpduData, &byte_pdu[2], resp_read_msg.dataInfo.smsData.msgLength);
resp_read_msg.result = SMS_SUCCESS;
- }
- else
- {
+ } else {
err("Invalid Message Length");
resp_read_msg.result = SMS_INVALID_PARAMETER_FORMAT;
}
- }
- else
- {
+ } else {
dbg("SCA Length : %d", sca_length);
- resp_read_msg.dataInfo.smsData.msgLength = (pdu_len - (sca_length+1));
+ resp_read_msg.dataInfo.smsData.msgLength = (pdu_len - (sca_length + 1));
dbg("msgLength: [%d]", resp_read_msg.dataInfo.smsData.msgLength);
if ((resp_read_msg.dataInfo.smsData.msgLength > 0)
- && (resp_read_msg.dataInfo.smsData.msgLength <= 0xff))
- {
- memcpy(resp_read_msg.dataInfo.smsData.sca, (char *)byte_pdu, (sca_length+1));
- memcpy(resp_read_msg.dataInfo.smsData.tpduData, &byte_pdu[sca_length+1], resp_read_msg.dataInfo.smsData.msgLength);
+ && (resp_read_msg.dataInfo.smsData.msgLength <= 0xff)) {
+ memcpy(resp_read_msg.dataInfo.smsData.sca, (char *) byte_pdu, (sca_length + 1));
+ memcpy(resp_read_msg.dataInfo.smsData.tpduData, &byte_pdu[sca_length + 1], resp_read_msg.dataInfo.smsData.msgLength);
- util_hex_dump(" ", SMS_SMSP_ADDRESS_LEN, (void *)resp_read_msg.dataInfo.smsData.sca);
- util_hex_dump(" ", (SMS_SMDATA_SIZE_MAX + 1), (void *)resp_read_msg.dataInfo.smsData.tpduData);
- util_hex_dump(" ", sizeof(byte_pdu), (void *)byte_pdu);
+ util_hex_dump(" ", SMS_SMSP_ADDRESS_LEN, (void *) resp_read_msg.dataInfo.smsData.sca);
+ util_hex_dump(" ", (SMS_SMDATA_SIZE_MAX + 1), (void *) resp_read_msg.dataInfo.smsData.tpduData);
+ util_hex_dump(" ", sizeof(byte_pdu), (void *) byte_pdu);
resp_read_msg.result = SMS_SUCCESS;
- }
- else
- {
+ } else {
err("Invalid Message Length");
resp_read_msg.result = SMS_INVALID_PARAMETER_FORMAT;
}
}
- }
- else
- {
+ } else {
dbg("NULL PDU");
}
- }
- else
- {
+ } else {
dbg("No lines");
}
- }
- else
- {
+ } else {
err("Response NOK");
}
dbg("Entry");
- resp_stored_msg_cnt_prev = (struct tresp_sms_get_storedMsgCnt *)user_data;
+ resp_stored_msg_cnt_prev = (struct tresp_sms_get_storedMsgCnt *) user_data;
user_req = tcore_pending_ref_user_request(pending);
memset(&resp_stored_msg_cnt, 0x00, sizeof(resp_stored_msg_cnt));
resp_stored_msg_cnt.result = SMS_DEVICE_FAILURE;
- if (at_response->success)
- {
+ if (at_response->success) {
dbg("Response OK");
- if(at_response->lines)
- {
+ if (at_response->lines) {
gslist_line_count = g_slist_length(at_response->lines);
if (gslist_line_count > SMS_GSM_SMS_MSG_NUM_MAX)
gslist_line_count = SMS_GSM_SMS_MSG_NUM_MAX;
dbg("Number of lines: [%d]", gslist_line_count);
- g_slist_foreach(at_response->lines, print_glib_list_elem, NULL); //for debug log
+ g_slist_foreach(at_response->lines, print_glib_list_elem, NULL); // for debug log
- for (ctr_loop = 0; ctr_loop < gslist_line_count ; ctr_loop++)
- {
- gslist_line = (char *)g_slist_nth_data(at_response->lines, ctr_loop); /* Fetch Line i */
+ for (ctr_loop = 0; ctr_loop < gslist_line_count; ctr_loop++) {
+ gslist_line = (char *) g_slist_nth_data(at_response->lines, ctr_loop); /* Fetch Line i */
dbg("gslist_line [%d] is [%s]", ctr_loop, gslist_line);
- if (NULL != gslist_line)
- {
+ if (NULL != gslist_line) {
tokens = tcore_at_tok_new(gslist_line);
- g_slist_foreach(tokens, print_glib_list_elem, NULL); //for debug log
+ g_slist_foreach(tokens, print_glib_list_elem, NULL); // for debug log
line_token = g_slist_nth_data(tokens, 0);
- if (NULL != line_token)
- {
+ if (NULL != line_token) {
resp_stored_msg_cnt.storedMsgCnt.indexList[ctr_loop] = atoi(line_token);
resp_stored_msg_cnt.result = SMS_SENDSMS_SUCCESS;
- }
- else
- {
+ } else {
dbg("line_token of gslist_line [%d] is NULL", ctr_loop);
continue;
}
tcore_at_tok_free(tokens);
- }
- else
- {
+ } else {
dbg("gslist_line [%d] is NULL", ctr_loop);
continue;
}
- }
- }
- else
- {
+ }
+ } else {
dbg("No lines.");
- if(resp_stored_msg_cnt_prev->storedMsgCnt.usedCount == 0) //Check if used count is zero
- {
+ if (resp_stored_msg_cnt_prev->storedMsgCnt.usedCount == 0) { // Check if used count is zero
resp_stored_msg_cnt.result = SMS_SENDSMS_SUCCESS;
}
}
- }
- else
- {
+ } else {
dbg("Respnose NOK");
}
util_sms_free_memory(resp_stored_msg_cnt_prev);
dbg("total: [%d], used: [%d], result: [%d]", resp_stored_msg_cnt.storedMsgCnt.totalCount, resp_stored_msg_cnt.storedMsgCnt.usedCount, resp_stored_msg_cnt.result);
- for(ctr_loop = 0; ctr_loop < gslist_line_count; ctr_loop++)
- {
+ for (ctr_loop = 0; ctr_loop < gslist_line_count; ctr_loop++) {
dbg("index: [%d]", resp_stored_msg_cnt.storedMsgCnt.indexList[ctr_loop]);
}
UserRequest *ur = NULL, *ur_dup = NULL;
struct tresp_sms_get_storedMsgCnt *respStoredMsgCnt = NULL;
const TcoreATResponse *atResp = data;
- GSList *tokens=NULL;
- char *line = NULL , *pResp = NULL , *cmd_str = NULL;
+ GSList *tokens = NULL;
+ char *line = NULL, *pResp = NULL, *cmd_str = NULL;
TcoreATRequest *atReq = NULL;
int usedCnt = 0, totalCnt = 0, result = 0;
ur_dup = tcore_user_request_ref(ur);
o = tcore_pending_ref_core_object(pending);
- if (atResp->success > 0)
- {
+ if (atResp->success > 0) {
dbg("Response OK");
- if(NULL != atResp->lines)
- {
- line = (char *)atResp->lines->data;
- dbg("line is %s",line);
+ if (NULL != atResp->lines) {
+ line = (char *) atResp->lines->data;
+ dbg("line is %s", line);
tokens = tcore_at_tok_new(line);
pResp = g_slist_nth_data(tokens, 0);
- if (pResp)
- {
- usedCnt =atoi(pResp);
- dbg("used cnt is %d",usedCnt);
+ if (pResp) {
+ usedCnt = atoi(pResp);
+ dbg("used cnt is %d", usedCnt);
}
pResp = g_slist_nth_data(tokens, 1);
- if (pResp)
- {
- totalCnt =atoi(pResp);
+ if (pResp) {
+ totalCnt = atoi(pResp);
result = SMS_SENDSMS_SUCCESS;
respStoredMsgCnt->storedMsgCnt.usedCount = usedCnt;
respStoredMsgCnt->storedMsgCnt.totalCount = totalCnt;
respStoredMsgCnt->result = result;
- dbg("used %d, total %d, result %d",usedCnt, totalCnt,result);
+ dbg("used %d, total %d, result %d", usedCnt, totalCnt, result);
pending_new = tcore_pending_new(o, 0);
- //Get all messages information
+ // Get all messages information
cmd_str = g_strdup_printf("AT+CMGL=4");
- atReq = tcore_at_request_new((const char *)cmd_str, "+CMGL", TCORE_AT_MULTILINE);
+ atReq = tcore_at_request_new((const char *) cmd_str, "+CMGL", TCORE_AT_MULTILINE);
- dbg("cmd str is %s",cmd_str);
+ dbg("cmd str is %s", cmd_str);
- tcore_pending_set_request_data(pending_new, 0,atReq);
- tcore_pending_set_response_callback(pending_new, on_response_get_msg_indices, (void *)respStoredMsgCnt);
+ tcore_pending_set_request_data(pending_new, 0, atReq);
+ tcore_pending_set_response_callback(pending_new, on_response_get_msg_indices, (void *) respStoredMsgCnt);
tcore_pending_link_user_request(pending_new, ur_dup);
tcore_pending_set_send_callback(pending_new, on_confirmation_sms_message_send, NULL);
tcore_hal_send_request(tcore_object_get_hal(o), pending_new);
-
+
g_free(cmd_str);
dbg("Exit");
return;
-
}
- }else
- {
+ } else {
dbg("No data");
result = SMS_DEVICE_FAILURE;
}
user_req = tcore_pending_ref_user_request(pending);
- if (at_response->success)
- {
+ if (at_response->success) {
dbg("Response OK");
- if(at_response->lines)
- {
- gslist_line = (char *)at_response->lines->data;
+ if (at_response->lines) {
+ gslist_line = (char *) at_response->lines->data;
tokens = tcore_at_tok_new(gslist_line);
sca_addr = g_slist_nth_data(tokens, 0);
sca_toa = g_slist_nth_data(tokens, 1);
if ((NULL != sca_addr)
- && (NULL != sca_toa))
- {
+ && (NULL != sca_toa)) {
dbg("sca_addr: [%s]. sca_toa: [%s]", sca_addr, sca_toa);
respGetSca.scaAddress.dialNumLen = strlen(sca_addr);
- if(145 == atoi(sca_toa))
- {
+ if (145 == atoi(sca_toa)) {
respGetSca.scaAddress.typeOfNum = SIM_TON_INTERNATIONAL;
- }
- else
- {
+ } else {
respGetSca.scaAddress.typeOfNum = SIM_TON_NATIONAL;
}
dbg("len [%d], sca_addr [%s], TON [%d], NPI [%d]", respGetSca.scaAddress.dialNumLen, respGetSca.scaAddress.diallingNum, respGetSca.scaAddress.typeOfNum, respGetSca.scaAddress.numPlanId);
respGetSca.result = SMS_SENDSMS_SUCCESS;
- }
- else
- {
+ } else {
err("sca_addr OR sca_toa NULL");
}
- }
- else
- {
+ } else {
dbg("NO Lines");
}
- }
- else
- {
+ } else {
dbg("Response NOK");
}
/*
Response is expected in this format
OK
- or
+ or
+CMS ERROR: <err>
*/
- //CoreObject *obj = user_data;
+ // CoreObject *obj = user_data;
UserRequest *ur;
- //copies the AT response data to resp
+ // copies the AT response data to resp
const TcoreATResponse *atResp = data;
struct tresp_sms_set_sca respSetSca;
memset(&respSetSca, 0, sizeof(struct tresp_sms_set_sca));
ur = tcore_pending_ref_user_request(pending);
- if (!ur)
- {
+ if (!ur) {
dbg("no user_request");
return;
}
- if (atResp->success >0)
- {
+ if (atResp->success > 0) {
dbg("RESPONSE OK");
respSetSca.result = SMS_SUCCESS;
- }
- else
- {
+ } else {
dbg("RESPONSE NOK");
respSetSca.result = SMS_DEVICE_FAILURE;
}
UserRequest *ur;
struct tresp_sms_get_cb_config respGetCbConfig;
const TcoreATResponse *atResp = data;
- GSList *tokens=NULL;
+ GSList *tokens = NULL;
- int i = 0, mode =0;
+ int i = 0, mode = 0;
char *mid = NULL, *pResp = NULL, *line = NULL, *res = NULL;
char delim[] = ",";
memset(&respGetCbConfig, 0, sizeof(struct tresp_sms_get_cb_config));
respGetCbConfig.result = SMS_DEVICE_FAILURE;
-
+
ur = tcore_pending_ref_user_request(p);
- if (!ur)
- {
+ if (!ur) {
dbg("no user_request");
return;
}
- if (atResp->success)
- {
+ if (atResp->success) {
dbg("Response OK");
- if(atResp->lines)
- {
- line = (char*)atResp->lines->data;
- if (line != NULL)
- {
- dbg("line is %s",line);
+ if (atResp->lines) {
+ line = (char *) atResp->lines->data;
+ if (line != NULL) {
+ dbg("line is %s", line);
tokens = tcore_at_tok_new(line);
pResp = g_slist_nth_data(tokens, 0);
- if (pResp)
- {
+ if (pResp) {
mode = atoi(pResp);
respGetCbConfig.cbConfig.bCBEnabled = mode;
respGetCbConfig.result = SMS_SENDSMS_SUCCESS;
pResp = g_slist_nth_data(tokens, 1);
- if (pResp)
- {
- mid = strtok(pResp, delim); i = 0;
- while( res != NULL )
- {
- res = strtok( NULL, delim );
- dbg("mid is %s%s\n", mid,res);
- if (res != NULL)
- {
- if (strlen(res) >0)
- {
- respGetCbConfig.cbConfig.msgIDs[i] = atoi(res);
- i++;
- }
+ if (pResp) {
+ mid = strtok(pResp, delim);
+ i = 0;
+ while (res != NULL) {
+ res = strtok(NULL, delim);
+ dbg("mid is %s%s\n", mid, res);
+ if (res != NULL) {
+ if (strlen(res) > 0) {
+ respGetCbConfig.cbConfig.msgIDs[i] = atoi(res);
+ i++;
}
}
+ }
}
respGetCbConfig.cbConfig.msgIdCount = i;
}
- //dcs = g_slist_nth_data(tokens, 2); DCS not needed by telephony
- }
- else
- {
+ // dcs = g_slist_nth_data(tokens, 2); DCS not needed by telephony
+ } else {
dbg("line is NULL");
}
+ } else {
+ dbg("atresp->lines is NULL");
}
- else
- {
- dbg("atresp->lines is NULL");
- }
- }
- else
- {
- dbg("RESPONSE NOK");
+ } else {
+ dbg("RESPONSE NOK");
}
tcore_user_request_send_response(ur, TRESP_SMS_GET_CB_CONFIG, sizeof(struct tresp_sms_get_cb_config), &respGetCbConfig);
/*
Response is expected in this format
OK
- or
+ or
+CMS ERROR: <err>
*/
const TcoreATResponse *resp = data;
int response = 0;
const char *line = NULL;
- GSList *tokens=NULL;
+ GSList *tokens = NULL;
- struct tresp_sms_set_cb_config respSetCbConfig = {0,};
+ struct tresp_sms_set_cb_config respSetCbConfig = {0, };
memset(&respSetCbConfig, 0, sizeof(struct tresp_sms_set_cb_config));
ur = tcore_pending_ref_user_request(pending);
respSetCbConfig.result = SMS_SENDSMS_SUCCESS;
-
- if(resp->success > 0)
- {
- dbg("RESPONSE OK");
- }
- else
- {
+ if (resp->success > 0) {
+ dbg("RESPONSE OK");
+ } else {
dbg("RESPONSE NOK");
- line = (const char*)resp->final_response;
+ line = (const char *) resp->final_response;
tokens = tcore_at_tok_new(line);
if (g_slist_length(tokens) < 1) {
- dbg("err cause not specified or string corrupted");
- respSetCbConfig.result = SMS_DEVICE_FAILURE;
- }
- else
- {
+ dbg("err cause not specified or string corrupted");
+ respSetCbConfig.result = SMS_DEVICE_FAILURE;
+ } else {
response = atoi(g_slist_nth_data(tokens, 0));
/* TODO: CMEE error mapping is required. */
- respSetCbConfig.result = SMS_DEVICE_FAILURE;
+ respSetCbConfig.result = SMS_DEVICE_FAILURE;
}
}
- if (!ur)
- {
+ if (!ur) {
dbg("no user_request");
return;
}
static void on_response_set_mem_status(TcorePending *p, int data_len, const void *data, void *user_data)
{
UserRequest *ur;
- struct tresp_sms_set_mem_status respSetMemStatus = {0,};
+ struct tresp_sms_set_mem_status respSetMemStatus = {0, };
const TcoreATResponse *resp = data;
memset(&respSetMemStatus, 0, sizeof(struct tresp_sms_set_mem_status));
- if(resp->success > 0)
- {
+ if (resp->success > 0) {
dbg("RESPONSE OK");
respSetMemStatus.result = SMS_SENDSMS_SUCCESS;
-
- }
- else
- {
+ } else {
dbg("RESPONSE NOK");
respSetMemStatus.result = SMS_DEVICE_FAILURE;
}
ur = tcore_pending_ref_user_request(p);
- if (!ur)
- {
+ if (!ur) {
dbg("no user_request");
return;
}
static void on_response_set_msg_status(TcorePending *pending, int data_len, const void *data, void *user_data)
{
UserRequest *ur;
- struct tresp_sms_set_msg_status respMsgStatus = {0,};
+ struct tresp_sms_set_msg_status respMsgStatus = {0, };
const TcoreATResponse *atResp = data;
- int response = 0, sw1 =0 , sw2 = 0;
- const char *line = NULL;
- char *pResp = NULL;
- GSList *tokens=NULL;
+ int response = 0, sw1 = 0, sw2 = 0;
+ const char *line = NULL;
+ char *pResp = NULL;
+ GSList *tokens = NULL;
dbg("Entry");
memset(&respMsgStatus, 0, sizeof(struct tresp_sms_set_msg_status));
respMsgStatus.result = SMS_DEVICE_FAILURE;
-
+
ur = tcore_pending_ref_user_request(pending);
- if(atResp->success > 0)
- {
- dbg("RESPONSE OK");
-
- if(atResp->lines)
- {
- line = (const char*)atResp->lines->data;
- tokens = tcore_at_tok_new(line);
- pResp = g_slist_nth_data(tokens, 0);
- if (pResp != NULL)
- {
+ if (atResp->success > 0) {
+ dbg("RESPONSE OK");
+
+ if (atResp->lines) {
+ line = (const char *) atResp->lines->data;
+ tokens = tcore_at_tok_new(line);
+ pResp = g_slist_nth_data(tokens, 0);
+ if (pResp != NULL) {
sw1 = atoi(pResp);
- }
- else
- {
+ } else {
dbg("sw1 is NULL");
- }
- pResp = g_slist_nth_data(tokens, 1);
- if (pResp != NULL)
- {
+ }
+ pResp = g_slist_nth_data(tokens, 1);
+ if (pResp != NULL) {
sw2 = atoi(pResp);
- if ((sw1 == AT_SW1_SUCCESS) && (sw2 == 0))
- {
+ if ((sw1 == AT_SW1_SUCCESS) && (sw2 == 0)) {
respMsgStatus.result = SMS_SENDSMS_SUCCESS;
}
- }
- else
- {
+ } else {
dbg("sw2 is NULL");
}
pResp = g_slist_nth_data(tokens, 3);
- if (pResp != NULL)
- {
+ if (pResp != NULL) {
response = atoi(pResp);
dbg("response is %s", response);
}
-
- }
- else
- {
+ } else {
dbg("No lines");
}
- }
- else
- {
+ } else {
dbg("RESPONSE NOK");
}
- tcore_user_request_send_response(ur, TRESP_SMS_SET_MSG_STATUS , sizeof(struct tresp_sms_set_msg_status), &respMsgStatus);
+ tcore_user_request_send_response(ur, TRESP_SMS_SET_MSG_STATUS, sizeof(struct tresp_sms_set_msg_status), &respMsgStatus);
- if(tokens)
+ if (tokens)
tcore_at_tok_free(tokens);
-
+
dbg("Exit");
return;
}
UserRequest *ur;
struct tresp_sms_get_params respGetParams;
const TcoreATResponse *atResp = data;
- int sw1 =0 , sw2 = 0;
+ int sw1 = 0, sw2 = 0;
const char *line = NULL;
char *pResp = NULL;
- GSList *tokens=NULL;
- char *hexData = NULL;
- char *recordData = NULL;
- int i = 0;
+ GSList *tokens = NULL;
+ char *hexData = NULL;
+ char *recordData = NULL;
+ int i = 0;
memset(&respGetParams, 0, sizeof(struct tresp_sms_set_params));
respGetParams.result = SMS_DEVICE_FAILURE;
ur = tcore_pending_ref_user_request(pending);
- if(atResp->success > 0)
- {
+ if (atResp->success > 0) {
dbg("RESPONSE OK");
- if(atResp->lines)
- {
- line = (const char*)atResp->lines->data;
+ if (atResp->lines) {
+ line = (const char *) atResp->lines->data;
tokens = tcore_at_tok_new(line);
pResp = g_slist_nth_data(tokens, 0);
- if (pResp != NULL)
- {
+ if (pResp != NULL) {
sw1 = atoi(pResp);
- dbg("sw1 is %d",sw1);
- }
- else
- {
+ dbg("sw1 is %d", sw1);
+ } else {
dbg("sw1 is NULL");
}
pResp = g_slist_nth_data(tokens, 1);
- if (pResp != NULL)
- {
+ if (pResp != NULL) {
sw2 = atoi(pResp);
- dbg("sw2 is %d",sw2);
- if ((sw1 == 0x90 && sw2 == 0x00) || sw1 == 0x91)
- {
+ dbg("sw2 is %d", sw2);
+ if ((sw1 == 0x90 && sw2 == 0x00) || sw1 == 0x91) {
respGetParams.result = SMS_SENDSMS_SUCCESS;
}
- }
- else
- {
+ } else {
dbg("sw2 is NULL");
}
pResp = g_slist_nth_data(tokens, 2);
- if (pResp != NULL)
- {
- hexData = util_removeQuotes(pResp);
-
- recordData = util_hexStringToBytes(hexData);
- util_hex_dump(" ", strlen(hexData)/2, recordData);
+ if (pResp != NULL) {
+ hexData = util_removeQuotes(pResp);
- respGetParams.paramsInfo.recordLen = strlen(hexData)/2;
+ recordData = util_hexStringToBytes(hexData);
+ util_hex_dump(" ", strlen(hexData) / 2, recordData);
- util_sms_decode_smsParameters((unsigned char *)recordData , strlen(hexData)/2 , &(respGetParams.paramsInfo));
- respGetParams.result = SMS_SENDSMS_SUCCESS;
+ respGetParams.paramsInfo.recordLen = strlen(hexData) / 2;
- for(i = 0 ; i < (int)respGetParams.paramsInfo.tpSvcCntrAddr.dialNumLen ; i ++)
- dbg("SCAddr = %d [%02x]",i,respGetParams.paramsInfo.tpSvcCntrAddr.diallingNum[i]);
+ util_sms_decode_smsParameters((unsigned char *) recordData, strlen(hexData) / 2, &(respGetParams.paramsInfo));
+ respGetParams.result = SMS_SENDSMS_SUCCESS;
- free(recordData);
- free(hexData);
- }
- else
- {
+ for (i = 0; i < (int) respGetParams.paramsInfo.tpSvcCntrAddr.dialNumLen; i++)
+ dbg("SCAddr = %d [%02x]", i, respGetParams.paramsInfo.tpSvcCntrAddr.diallingNum[i]);
+
+ free(recordData);
+ free(hexData);
+ } else {
dbg("No response");
}
tcore_at_tok_free(tokens);
}
- }
- else
- {
+ } else {
dbg("RESPONSE NOK");
}
static void on_response_set_sms_params(TcorePending *pending, int data_len, const void *data, void *user_data)
{
UserRequest *ur;
- struct tresp_sms_set_params respSetParams = {0,};
+ struct tresp_sms_set_params respSetParams = {0, };
const TcoreATResponse *atResp = data;
- int sw1 =0 , sw2 = 0;
+ int sw1 = 0, sw2 = 0;
const char *line = NULL;
char *pResp = NULL;
- GSList *tokens=NULL;
+ GSList *tokens = NULL;
memset(&respSetParams, 0, sizeof(struct tresp_sms_set_params));
respSetParams.result = SMS_DEVICE_FAILURE;
- if(atResp->success > 0)
- {
+ if (atResp->success > 0) {
dbg("RESPONSE OK");
- if(atResp->lines)
- {
- line = (const char*)atResp->lines->data;
+ if (atResp->lines) {
+ line = (const char *) atResp->lines->data;
tokens = tcore_at_tok_new(line);
pResp = g_slist_nth_data(tokens, 0);
if (pResp != NULL) {
sw1 = atoi(pResp);
- }
- else {
+ } else {
dbg("sw1 is NULL");
}
-
+
pResp = g_slist_nth_data(tokens, 1);
- if (pResp != NULL)
- {
+ if (pResp != NULL) {
sw2 = atoi(pResp);
- if (((sw1 == AT_SW1_SUCCESS) && (sw2 == AT_SW2_SUCCESS)) || (sw1 == 0x91)){
+ if (((sw1 == AT_SW1_SUCCESS) && (sw2 == AT_SW2_SUCCESS)) || (sw1 == 0x91)) {
respSetParams.result = SMS_SENDSMS_SUCCESS;
}
- }
- else
- {
+ } else {
dbg("sw2 is NULL");
}
- }
- else
- {
+ } else {
dbg("No lines");
}
- }
- else
- {
+ } else {
dbg("RESPONSE NOK");
}
- tcore_user_request_send_response(ur, TRESP_SMS_SET_PARAMS , sizeof(struct tresp_sms_set_params), &respSetParams);
+ tcore_user_request_send_response(ur, TRESP_SMS_SET_PARAMS, sizeof(struct tresp_sms_set_params), &respSetParams);
- if(tokens)
+ if (tokens)
tcore_at_tok_free(tokens);
-
+
dbg("Exit");
return;
}
static void on_response_get_paramcnt(TcorePending *p, int data_len, const void *data, void *user_data)
{
-
UserRequest *ur = NULL;
- struct tresp_sms_get_paramcnt respGetParamCnt = {0,};
+ struct tresp_sms_get_paramcnt respGetParamCnt = {0, };
const TcoreATResponse *atResp = data;
- char *line = NULL , *pResp = NULL;
- int sw1 = 0 , sw2 = 0, *smsp_record_len = NULL;
+ char *line = NULL, *pResp = NULL;
+ int sw1 = 0, sw2 = 0, *smsp_record_len = NULL;
int sim_type = 0;
- GSList *tokens=NULL;
- CoreObject *co_sim = NULL; //need this to get the sim type GSM/USIM
+ GSList *tokens = NULL;
+ CoreObject *co_sim = NULL; // need this to get the sim type GSM/USIM
TcorePlugin *plugin = NULL;
dbg("Entry");
ur = tcore_pending_ref_user_request(p);
respGetParamCnt.result = SMS_DEVICE_FAILURE;
- if(atResp->success > 0)
- {
+ if (atResp->success > 0) {
dbg("RESPONSE OK");
- if(atResp->lines)
- {
- line = (char*)atResp->lines->data;
+ if (atResp->lines) {
+ line = (char *) atResp->lines->data;
- dbg("line is %s",line);
+ dbg("line is %s", line);
tokens = tcore_at_tok_new(line);
pResp = g_slist_nth_data(tokens, 0);
- if (pResp != NULL)
- {
+ if (pResp != NULL) {
sw1 = atoi(pResp);
- }
- else
- {
+ } else {
dbg("sw1 is NULL");
}
pResp = g_slist_nth_data(tokens, 1);
- if (pResp != NULL)
- {
+ if (pResp != NULL) {
sw2 = atoi(pResp);
- if ((sw1 == 144) && (sw2 == 0))
- {
+ if ((sw1 == 144) && (sw2 == 0)) {
respGetParamCnt.result = SMS_SENDSMS_SUCCESS;
}
- }
- else
- {
+ } else {
dbg("sw2 is NULL");
}
pResp = g_slist_nth_data(tokens, 2);
- if (pResp != NULL)
- {
+ if (pResp != NULL) {
char *hexData = NULL;
char *recordData = NULL;
hexData = util_removeQuotes(pResp);
/*1. SIM access success case*/
- if ((sw1 == 0x90 && sw2 == 0x00) || sw1 == 0x91)
- {
+ if ((sw1 == 0x90 && sw2 == 0x00) || sw1 == 0x91) {
unsigned char tag_len = 0; /* 1 or 2 bytes ??? */
int record_len = 0;
char num_of_records = 0;
unsigned char *ptr_data;
recordData = util_hexStringToBytes(hexData);
- util_hex_dump(" ", strlen(hexData)/2, recordData);
+ util_hex_dump(" ", strlen(hexData) / 2, recordData);
- ptr_data = (unsigned char *)recordData;
+ ptr_data = (unsigned char *) recordData;
co_sim = tcore_plugin_ref_core_object(tcore_pending_ref_plugin(p), "sim");
sim_type = tcore_sim_get_type(co_sim);
- dbg("sim type is %d",sim_type);
+ dbg("sim type is %d", sim_type);
- if (sim_type == SIM_TYPE_USIM) {
+ if (sim_type == SIM_TYPE_USIM) {
/*
ETSI TS 102 221 v7.9.0
- - Response Data
- '62' FCP template tag
- - Response for an EF
- '82' M File Descriptor
- '83' M File Identifier
- 'A5' O Proprietary information
- '8A' M Life Cycle Status Integer
- '8B', '8C' or 'AB' C1 Security attributes
- '80' M File size
- '81' O Total file size
- '88' O Short File Identifier (SFI)
- */
+ - Response Data
+ '62' FCP template tag
+ - Response for an EF
+ '82' M File Descriptor
+ '83' M File Identifier
+ 'A5' O Proprietary information
+ '8A' M Life Cycle Status Integer
+ '8B', '8C' or 'AB' C1 Security attributes
+ '80' M File size
+ '81' O Total file size
+ '88' O Short File Identifier (SFI)
+ */
/* rsim.res_len has complete data length received */
tag_len = *ptr_data++;
/* FCP file descriptor - file type, accessibility, DF, ADF etc*/
if (*ptr_data == 0x82) {
+ /* increment to next byte */
+ ptr_data++;
+ /*2 or 5 value*/
+ ptr_data++;
+ /* unsigned char file_desc_len = *ptr_data++;*/
+ /* dbg("file descriptor length: [%d]", file_desc_len);*/
+ /* TBD: currently capture only file type : ignore sharable, non sharable, working, internal etc*/
+ /* consider only last 3 bits*/
+ file_type_tag = file_type_tag & (*ptr_data);
+
+ switch (file_type_tag) {
/* increment to next byte */
ptr_data++;
- /*2 or 5 value*/
- ptr_data++;
- /* unsigned char file_desc_len = *ptr_data++;*/
- /* dbg("file descriptor length: [%d]", file_desc_len);*/
- /* TBD: currently capture only file type : ignore sharable, non sharable, working, internal etc*/
- /* consider only last 3 bits*/
- file_type_tag = file_type_tag & (*ptr_data);
- switch (file_type_tag) {
- /* increment to next byte */
- ptr_data++;
case 0x1:
dbg("Getting FileType: [Transparent file type]");
/* increment to next byte */
ptr_data++;
- file_type = 0x01; //SIM_FTYPE_TRANSPARENT
+ file_type = 0x01; // SIM_FTYPE_TRANSPARENT
/* data coding byte - value 21 */
ptr_data++;
break;
ptr_data = ptr_data + 2;
num_of_records = *ptr_data++;
/* Data lossy conversation from enum (int) to unsigned char */
- file_type = 0x02; // SIM_FTYPE_LINEAR_FIXED
+ file_type = 0x02; // SIM_FTYPE_LINEAR_FIXED
break;
case 0x6:
record_len = SMS_SWAPBYTES16(record_len);
ptr_data = ptr_data + 2;
num_of_records = *ptr_data++;
- file_type = 0x04; //SIM_FTYPE_CYCLIC
+ file_type = 0x04; // SIM_FTYPE_CYCLIC
break;
default:
dbg("not handled file type [0x%x]", *ptr_data);
break;
}
- }
- else
- {
+ } else {
dbg("INVALID FCP received - DEbug!");
return;
}
dbg("INVALID FCP received - DEbug!");
free(hexData);
free(recordData);
- //ReleaseResponse();
+ // ReleaseResponse();
return;
}
ptr_data++;
switch (*ptr_data) {
- case 0x04:
- case 0x06:
- dbg("<IPC_RX> operation state -deactivated");
- ptr_data++;
- break;
- case 0x05:
- case 0x07:
- dbg("<IPC_RX> operation state -activated");
- ptr_data++;
- break;
- default:
- dbg("<IPC_RX> DEBUG! LIFE CYCLE STATUS =[0x%x]",*ptr_data);
- ptr_data++;
- break;
+ case 0x04:
+ case 0x06:
+ dbg("<IPC_RX> operation state -deactivated");
+ ptr_data++;
+ break;
+
+ case 0x05:
+ case 0x07:
+ dbg("<IPC_RX> operation state -activated");
+ ptr_data++;
+ break;
+
+ default:
+ dbg("<IPC_RX> DEBUG! LIFE CYCLE STATUS =[0x%x]", *ptr_data);
+ ptr_data++;
+ break;
}
}
} else {
/* if tag length is not 3 */
/* ignoring bytes */
- // ptr_data = ptr_data + 4;
+ // ptr_data = ptr_data + 4;
dbg("Useless security attributes, so jump to next tag");
ptr_data = ptr_data + (*ptr_data + 1);
}
free(recordData);
return;
}
- }
- else if (sim_type == SIM_TYPE_GSM)
- {
+ } else if (sim_type == SIM_TYPE_GSM) {
unsigned char gsm_specific_file_data_len = 0;
/* ignore RFU byte1 and byte2 */
ptr_data++;
ptr_data++;
/* file size */
- //file_size = p_info->response_len;
+ // file_size = p_info->response_len;
memcpy(&file_size, ptr_data, 2);
/* swap bytes */
file_size = SMS_SWAPBYTES16(file_size);
file_type_tag = (*(ptr_data + 7));
switch (*ptr_data) {
- case 0x0:
- /* RFU file type */
- dbg(" RFU file type- not handled - Debug!");
- break;
- case 0x1:
- /* MF file type */
- dbg(" MF file type - not handled - Debug!");
- break;
- case 0x2:
- /* DF file type */
- dbg(" DF file type - not handled - Debug!");
- break;
- case 0x4:
- /* EF file type */
- dbg(" EF file type [%d] ", file_type_tag);
- /* increment to next byte */
- ptr_data++;
+ case 0x0:
+ /* RFU file type */
+ dbg(" RFU file type- not handled - Debug!");
+ break;
+
+ case 0x1:
+ /* MF file type */
+ dbg(" MF file type - not handled - Debug!");
+ break;
+
+ case 0x2:
+ /* DF file type */
+ dbg(" DF file type - not handled - Debug!");
+ break;
+
+ case 0x4:
+ /* EF file type */
+ dbg(" EF file type [%d] ", file_type_tag);
+ /* increment to next byte */
+ ptr_data++;
- if (file_type_tag == 0x00 || file_type_tag == 0x01) {
- /* increament to next byte as this byte is RFU */
- ptr_data++;
- file_type =
- (file_type_tag == 0x00) ? 0x01 : 0x02; // SIM_FTYPE_TRANSPARENT:SIM_FTYPE_LINEAR_FIXED;
- } else {
- /* increment to next byte */
- ptr_data++;
- /* For a cyclic EF all bits except bit 7 are RFU; b7=1 indicates that */
- /* the INCREASE command is allowed on the selected cyclic file. */
- file_type = 0x04; // SIM_FTYPE_CYCLIC;
- }
- /* bytes 9 to 11 give SIM file access conditions */
- ptr_data++;
- /* byte 10 has one nibble that is RF U and another for INCREASE which is not used currently */
- ptr_data++;
- /* byte 11 is invalidate and rehabilate nibbles */
- ptr_data++;
- /* byte 12 - file status */
+ if (file_type_tag == 0x00 || file_type_tag == 0x01) {
+ /* increament to next byte as this byte is RFU */
ptr_data++;
- /* byte 13 - GSM specific data */
- gsm_specific_file_data_len = *ptr_data;
- ptr_data++;
- /* byte 14 - structure of EF - transparent or linear or cyclic , already saved above */
+ file_type =
+ (file_type_tag == 0x00) ? 0x01 : 0x02; // SIM_FTYPE_TRANSPARENT:SIM_FTYPE_LINEAR_FIXED;
+ } else {
+ /* increment to next byte */
ptr_data++;
- /* byte 15 - length of record for linear and cyclic , for transparent it is set to 0x00. */
- record_len = *ptr_data;
- dbg("record length[%d], file size[%d]", record_len, file_size);
+ /* For a cyclic EF all bits except bit 7 are RFU; b7=1 indicates that */
+ /* the INCREASE command is allowed on the selected cyclic file. */
+ file_type = 0x04; // SIM_FTYPE_CYCLIC;
+ }
+ /* bytes 9 to 11 give SIM file access conditions */
+ ptr_data++;
+ /* byte 10 has one nibble that is RF U and another for INCREASE which is not used currently */
+ ptr_data++;
+ /* byte 11 is invalidate and rehabilate nibbles */
+ ptr_data++;
+ /* byte 12 - file status */
+ ptr_data++;
+ /* byte 13 - GSM specific data */
+ gsm_specific_file_data_len = *ptr_data;
+ ptr_data++;
+ /* byte 14 - structure of EF - transparent or linear or cyclic , already saved above */
+ ptr_data++;
+ /* byte 15 - length of record for linear and cyclic , for transparent it is set to 0x00. */
+ record_len = *ptr_data;
+ dbg("record length[%d], file size[%d]", record_len, file_size);
- if (record_len != 0)
- num_of_records = (file_size / record_len);
+ if (record_len != 0)
+ num_of_records = (file_size / record_len);
- dbg("Number of records [%d]", num_of_records);
- break;
+ dbg("Number of records [%d]", num_of_records);
+ break;
- default:
- dbg(" not handled file type");
- break;
+ default:
+ dbg(" not handled file type");
+ break;
}
- }
- else
- {
+ } else {
dbg(" Card Type - UNKNOWN [%d]", sim_type);
}
respGetParamCnt.recordCount = num_of_records;
respGetParamCnt.result = SMS_SUCCESS;
- //TO Store smsp record length in the property
+ // TO Store smsp record length in the property
plugin = tcore_pending_ref_plugin(p);
smsp_record_len = tcore_plugin_ref_property(plugin, "SMSPRECORDLEN");
memcpy(smsp_record_len, &record_len, sizeof(int));
free(recordData);
free(hexData);
- }
- else
- {
+ } else {
/*2. SIM access fail case*/
dbg("SIM access fail");
respGetParamCnt.result = SMS_UNKNOWN;
}
- }
- else
- {
+ } else {
dbg("presp is NULL");
}
-
- }else
- {
+ } else {
dbg("line is blank");
}
- }
- else
- {
+ } else {
dbg("RESPONSE NOK");
}
{
UserRequest *ur = NULL;
UserRequest *dup_ur = NULL;
- struct tresp_sms_set_msg_status resp_msg_status = {0,};
- const struct treq_sms_set_msg_status *req_msg_status = NULL ;
+ struct tresp_sms_set_msg_status resp_msg_status = {0, };
+ const struct treq_sms_set_msg_status *req_msg_status = NULL;
const TcoreATResponse *resp = data;
char *encoded_data = NULL;
char msg_status = 0;
- char *pResp = NULL;
- GSList *tokens=NULL;
+ char *pResp = NULL;
+ GSList *tokens = NULL;
const char *line = NULL;
int sw1 = 0;
int sw2 = 0;
-
+
TcoreHal *hal = NULL;
TcoreATRequest *atreq = NULL;
TcorePending *pending = NULL;
req_msg_status = tcore_user_request_ref_data(ur, NULL);
resp_msg_status.result = SMS_DEVICE_FAILURE;
-
+
hal = tcore_object_get_hal(tcore_pending_ref_core_object(pending));
dbg("msgStatus: [%x], index [%x]", req_msg_status->msgStatus, req_msg_status->index);
- if(resp->success <= 0)
- {
+ if (resp->success <= 0) {
goto OUT;
}
-
+
{
dbg("RESPONSE OK");
- if(resp->lines)
- {
- line = (const char*)resp->lines->data;
+ if (resp->lines) {
+ line = (const char *) resp->lines->data;
tokens = tcore_at_tok_new(line);
- if (g_slist_length(tokens) != 3)
- {
+ if (g_slist_length(tokens) != 3) {
msg("invalid message");
goto OUT;
}
}
sw1 = atoi(g_slist_nth_data(tokens, 0));
sw2 = atoi(g_slist_nth_data(tokens, 1));
- pResp = g_slist_nth_data(tokens, 2);
-
- if((sw1 == 0x90 && sw2 == 0x00) || sw1 == 0x91)
- {
- switch (req_msg_status->msgStatus)
- {
- case SMS_STATUS_READ:
- msg_status = 0x01;
- break;
+ pResp = g_slist_nth_data(tokens, 2);
- case SMS_STATUS_UNREAD:
- msg_status = 0x03;
- break;
+ if ((sw1 == 0x90 && sw2 == 0x00) || sw1 == 0x91) {
+ switch (req_msg_status->msgStatus) {
+ case SMS_STATUS_READ:
+ msg_status = 0x01;
+ break;
- case SMS_STATUS_UNSENT:
- msg_status = 0x07;
- break;
+ case SMS_STATUS_UNREAD:
+ msg_status = 0x03;
+ break;
- case SMS_STATUS_SENT:
- msg_status = 0x05;
- break;
+ case SMS_STATUS_UNSENT:
+ msg_status = 0x07;
+ break;
- case SMS_STATUS_DELIVERED:
- msg_status = 0x1D;
- break;
+ case SMS_STATUS_SENT:
+ msg_status = 0x05;
+ break;
- case SMS_STATUS_DELIVERY_UNCONFIRMED:
- msg_status = 0xD;
- break;
+ case SMS_STATUS_DELIVERED:
+ msg_status = 0x1D;
+ break;
- case SMS_STATUS_MESSAGE_REPLACED:
- case SMS_STATUS_RESERVED:
- default:
- msg_status = 0x03;
- break;
+ case SMS_STATUS_DELIVERY_UNCONFIRMED:
+ msg_status = 0xD;
+ break;
+
+ case SMS_STATUS_MESSAGE_REPLACED:
+ case SMS_STATUS_RESERVED:
+ default:
+ msg_status = 0x03;
+ break;
}
encoded_data = util_removeQuotes(pResp);
- //overwrite Status byte information
- util_byte_to_hex((const char *)&msg_status, (char *)encoded_data, 1);
+ // overwrite Status byte information
+ util_byte_to_hex((const char *) &msg_status, (char *) encoded_data, 1);
- //Update EF-SMS with just status byte overwritten, rest 175 bytes are same as received in read information
- cmd_str = g_strdup_printf("AT+CRSM=220,28476,%d, 4, %d, \"%s\"", (req_msg_status->index+1), AT_EF_SMS_RECORD_LEN, encoded_data);
- atreq = tcore_at_request_new((const char *)cmd_str, "+CRSM", TCORE_AT_SINGLELINE);
+ // Update EF-SMS with just status byte overwritten, rest 175 bytes are same as received in read information
+ cmd_str = g_strdup_printf("AT+CRSM=220,28476,%d, 4, %d, \"%s\"", (req_msg_status->index + 1), AT_EF_SMS_RECORD_LEN, encoded_data);
+ atreq = tcore_at_request_new((const char *) cmd_str, "+CRSM", TCORE_AT_SINGLELINE);
pending = tcore_pending_new(tcore_pending_ref_core_object(pending), 0);
- if(NULL == cmd_str || NULL == atreq || NULL == pending)
- {
+ if (NULL == cmd_str || NULL == atreq || NULL == pending) {
err("Out of memory. Unable to proceed");
dbg("cmd_str: [%p], atreq: [%p], pending: [%p]", cmd_str, atreq, pending);
- //free memory we own
+ // free memory we own
g_free(cmd_str);
free(encoded_data);
util_sms_free_memory(atreq);
goto OUT;
}
- util_hex_dump(" ", strlen(cmd_str), (void *)cmd_str);
+ util_hex_dump(" ", strlen(cmd_str), (void *) cmd_str);
dup_ur = tcore_user_request_ref(ur);
}
OUT:
- if(tokens)
+ if (tokens)
tcore_at_tok_free(tokens);
-
- tcore_user_request_send_response(ur, TRESP_SMS_SET_MSG_STATUS , sizeof(struct tresp_sms_set_msg_status), &msg_status);
+
+ tcore_user_request_send_response(ur, TRESP_SMS_SET_MSG_STATUS, sizeof(struct tresp_sms_set_msg_status), &msg_status);
dbg("Exit");
}
/*=============================================================
- Requests
+ Requests
==============================================================*/
static TReturn send_umts_msg(CoreObject *obj, UserRequest *ur)
{
TcoreATRequest *atreq = NULL;
TcorePending *pending = NULL;
const struct treq_sms_send_umts_msg *sendUmtsMsg = NULL;
- char buf[2*(SMS_SMSP_ADDRESS_LEN+SMS_SMDATA_SIZE_MAX)+1] = {0};
+ char buf[2 * (SMS_SMSP_ADDRESS_LEN + SMS_SMDATA_SIZE_MAX) + 1] = {0};
int ScLength = 0;
int pdu_len = 0;
dbg("Entry");
sendUmtsMsg = tcore_user_request_ref_data(ur, NULL);
- hal = tcore_object_get_hal(obj);
- if(NULL == sendUmtsMsg || NULL == hal)
- {
+ hal = tcore_object_get_hal(obj);
+ if (NULL == sendUmtsMsg || NULL == hal) {
err("NULL input. Unable to proceed");
dbg("sendUmtsMsg: [%p], hal: [%p]", sendUmtsMsg, hal);
}
dbg("msgLength: [%d]", sendUmtsMsg->msgDataPackage.msgLength);
- util_hex_dump(" ", (SMS_SMDATA_SIZE_MAX+1), (void *)sendUmtsMsg->msgDataPackage.tpduData);
- util_hex_dump(" ", SMS_SMSP_ADDRESS_LEN, (void *)sendUmtsMsg->msgDataPackage.sca);
+ util_hex_dump(" ", (SMS_SMDATA_SIZE_MAX + 1), (void *) sendUmtsMsg->msgDataPackage.tpduData);
+ util_hex_dump(" ", SMS_SMSP_ADDRESS_LEN, (void *) sendUmtsMsg->msgDataPackage.sca);
- ScLength = (int)sendUmtsMsg->msgDataPackage.sca[0];
+ ScLength = (int) sendUmtsMsg->msgDataPackage.sca[0];
dbg("ScLength: [%d]", ScLength);
if ((sendUmtsMsg->msgDataPackage.msgLength > 0)
&& (sendUmtsMsg->msgDataPackage.msgLength <= SMS_SMDATA_SIZE_MAX)
- && (ScLength <= SMS_MAX_SMS_SERVICE_CENTER_ADDR))
- {
- if(ScLength == 0) //ScAddress not specified
- {
+ && (ScLength <= SMS_MAX_SMS_SERVICE_CENTER_ADDR)) {
+ if (ScLength == 0) { // ScAddress not specified
buf[0] = '0';
buf[1] = '0';
pdu_len = 2;
- }
- else
- {
+ } else {
dbg("Specifying SCA in TPDU is currently not supported");
buf[0] = '0';
pdu_len = 2;
}
- util_byte_to_hex((const char *)sendUmtsMsg->msgDataPackage.tpduData, (char *)&buf[pdu_len], sendUmtsMsg->msgDataPackage.msgLength);
+ util_byte_to_hex((const char *) sendUmtsMsg->msgDataPackage.tpduData, (char *) &buf[pdu_len], sendUmtsMsg->msgDataPackage.msgLength);
- pdu_len = pdu_len + 2*sendUmtsMsg->msgDataPackage.msgLength;
+ pdu_len = pdu_len + 2 * sendUmtsMsg->msgDataPackage.msgLength;
- buf[pdu_len] = '\0'; //Ensure termination
+ buf[pdu_len] = '\0'; // Ensure termination
dbg("pdu_len: [%d]", pdu_len);
- util_hex_dump(" ", sizeof(buf), (void *)buf);
+ util_hex_dump(" ", sizeof(buf), (void *) buf);
- //AT+CMGS=<length><CR>PDU is given<ctrl-Z/ESC>
- cmd_str = g_strdup_printf("AT+CMGS=%d%s%s\x1A", sendUmtsMsg->msgDataPackage.msgLength,"\r",buf);
- atreq = tcore_at_request_new((const char *)cmd_str, "+CMGS", TCORE_AT_SINGLELINE);
+ // AT+CMGS=<length><CR>PDU is given<ctrl-Z/ESC>
+ cmd_str = g_strdup_printf("AT+CMGS=%d%s%s\x1A", sendUmtsMsg->msgDataPackage.msgLength, "\r", buf);
+ atreq = tcore_at_request_new((const char *) cmd_str, "+CMGS", TCORE_AT_SINGLELINE);
pending = tcore_pending_new(obj, 0);
- if(NULL == cmd_str || NULL == atreq || NULL == pending)
- {
+ if (NULL == cmd_str || NULL == atreq || NULL == pending) {
err("Out of memory. Unable to proceed");
dbg("cmd_str: [%p], atreq: [%p], pending: [%p]", cmd_str, atreq, pending);
- //free memory we own
+ // free memory we own
g_free(cmd_str);
util_sms_free_memory(atreq);
util_sms_free_memory(pending);
return TCORE_RETURN_ENOMEM;
}
- util_hex_dump(" ", strlen(cmd_str), (void *)cmd_str);
+ util_hex_dump(" ", strlen(cmd_str), (void *) cmd_str);
tcore_pending_set_request_data(pending, 0, atreq);
tcore_pending_set_response_callback(pending, on_response_send_umts_msg, NULL);
readMsg = tcore_user_request_ref_data(ur, NULL);
hal = tcore_object_get_hal(obj);
- if(NULL == readMsg || NULL == hal)
- {
+ if (NULL == readMsg || NULL == hal) {
err("NULL input. Unable to proceed");
dbg("readMsg: [%p], hal: [%p]", readMsg, hal);
dbg("index: [%d]", readMsg->index);
- cmd_str = g_strdup_printf("AT+CMGR=%d", (readMsg->index + 1)); //IMC index is one ahead of TAPI
- atreq = tcore_at_request_new((const char *)cmd_str, "+CMGR", TCORE_AT_PDU);
+ cmd_str = g_strdup_printf("AT+CMGR=%d", (readMsg->index + 1)); // IMC index is one ahead of TAPI
+ atreq = tcore_at_request_new((const char *) cmd_str, "+CMGR", TCORE_AT_PDU);
pending = tcore_pending_new(obj, 0);
- if(NULL == cmd_str || NULL == atreq || NULL == pending)
- {
+ if (NULL == cmd_str || NULL == atreq || NULL == pending) {
err("Out of memory. Unable to proceed");
dbg("cmd_str: [%p], atreq: [%p], pending: [%p]", cmd_str, atreq, pending);
- //free memory we own
+ // free memory we own
g_free(cmd_str);
util_sms_free_memory(atreq);
util_sms_free_memory(pending);
return TCORE_RETURN_ENOMEM;
}
- util_hex_dump(" ", strlen(cmd_str), (void *)cmd_str);
+ util_hex_dump(" ", strlen(cmd_str), (void *) cmd_str);
tcore_pending_set_request_data(pending, 0, atreq);
- tcore_pending_set_response_callback(pending, on_response_read_msg, (void *)(uintptr_t)(readMsg->index)); //storing index as user data for response
+ tcore_pending_set_response_callback(pending, on_response_read_msg, (void *) (uintptr_t) (readMsg->index)); // storing index as user data for response
tcore_pending_link_user_request(pending, ur);
tcore_pending_set_send_callback(pending, on_confirmation_sms_message_send, NULL);
tcore_hal_send_request(hal, pending);
TcorePending *pending = NULL;
const struct treq_sms_save_msg *saveMsg = NULL;
int ScLength = 0, pdu_len = 0, stat = 0;
- char buf[2*(SMS_SMSP_ADDRESS_LEN+SMS_SMDATA_SIZE_MAX)+1] = {0};
+ char buf[2 * (SMS_SMSP_ADDRESS_LEN + SMS_SMDATA_SIZE_MAX) + 1] = {0};
dbg("Entry");
saveMsg = tcore_user_request_ref_data(ur, NULL);
hal = tcore_object_get_hal(obj);
- if(NULL == saveMsg || NULL == hal)
- {
+ if (NULL == saveMsg || NULL == hal) {
err("NULL input. Unable to proceed");
dbg("saveMsg: [%p], hal: [%p]", saveMsg, hal);
}
dbg("msgStatus: %x, msgLength: [%d]", saveMsg->msgStatus, saveMsg->msgDataPackage.msgLength);
- util_hex_dump(" ", (SMS_SMDATA_SIZE_MAX+1), (void *)saveMsg->msgDataPackage.tpduData);
- util_hex_dump(" ", SMS_SMSP_ADDRESS_LEN, (void *)saveMsg->msgDataPackage.sca);
+ util_hex_dump(" ", (SMS_SMDATA_SIZE_MAX + 1), (void *) saveMsg->msgDataPackage.tpduData);
+ util_hex_dump(" ", SMS_SMSP_ADDRESS_LEN, (void *) saveMsg->msgDataPackage.sca);
switch (saveMsg->msgStatus) {
- case SMS_STATUS_READ:
- stat = AT_REC_READ;
- break;
+ case SMS_STATUS_READ:
+ stat = AT_REC_READ;
+ break;
- case SMS_STATUS_UNREAD:
- stat = AT_REC_UNREAD;
- break;
+ case SMS_STATUS_UNREAD:
+ stat = AT_REC_UNREAD;
+ break;
- case SMS_STATUS_SENT:
- stat = AT_STO_SENT;
- break;
+ case SMS_STATUS_SENT:
+ stat = AT_STO_SENT;
+ break;
- case SMS_STATUS_UNSENT:
- stat = AT_STO_UNSENT;
- break;
+ case SMS_STATUS_UNSENT:
+ stat = AT_STO_UNSENT;
+ break;
- default:
- err("Invalid msgStatus");
- dbg("Exit");
- return TCORE_RETURN_EINVAL;
+ default:
+ err("Invalid msgStatus");
+ dbg("Exit");
+ return TCORE_RETURN_EINVAL;
}
if ((saveMsg->msgDataPackage.msgLength > 0)
- && (saveMsg->msgDataPackage.msgLength <= SMS_SMDATA_SIZE_MAX))
- {
- ScLength = (int)saveMsg->msgDataPackage.sca[0];
+ && (saveMsg->msgDataPackage.msgLength <= SMS_SMDATA_SIZE_MAX)) {
+ ScLength = (int) saveMsg->msgDataPackage.sca[0];
- if(ScLength == 0)
- {
+ if (ScLength == 0) {
dbg("ScLength is zero");
buf[0] = '0';
buf[1] = '0';
pdu_len = 2;
- }
- else {
+ } else {
dbg("Specifying SCA is currently not supported");
buf[0] = '0';
buf[1] = '0';
pdu_len = 2;
}
- util_byte_to_hex((const char *)saveMsg->msgDataPackage.tpduData, (char *)&(buf[pdu_len]), saveMsg->msgDataPackage.msgLength);
+ util_byte_to_hex((const char *) saveMsg->msgDataPackage.tpduData, (char *) &(buf[pdu_len]), saveMsg->msgDataPackage.msgLength);
- pdu_len = pdu_len + 2*saveMsg->msgDataPackage.msgLength;
+ pdu_len = pdu_len + 2 * saveMsg->msgDataPackage.msgLength;
- buf[pdu_len] = '\0'; //Ensure termination
+ buf[pdu_len] = '\0'; // Ensure termination
dbg("pdu_len: [%d]", pdu_len);
- util_hex_dump(" ", sizeof(buf), (void *)buf);
+ util_hex_dump(" ", sizeof(buf), (void *) buf);
- //AT+CMGW=<length>[,<stat>]<CR>PDU is given<ctrl-Z/ESC>
+ // AT+CMGW=<length>[,<stat>]<CR>PDU is given<ctrl-Z/ESC>
cmd_str = g_strdup_printf("AT+CMGW=%d,%d%s%s\x1A", saveMsg->msgDataPackage.msgLength, stat, "\r", buf);
pending = tcore_pending_new(obj, 0);
- atreq = tcore_at_request_new((const char *)cmd_str, "+CMGW", TCORE_AT_SINGLELINE);
+ atreq = tcore_at_request_new((const char *) cmd_str, "+CMGW", TCORE_AT_SINGLELINE);
- if(NULL == cmd_str || NULL == atreq || NULL == pending)
- {
+ if (NULL == cmd_str || NULL == atreq || NULL == pending) {
err("Out of memory. Unable to proceed");
dbg("cmd_str: [%p], atreq: [%p], pending: [%p]", cmd_str, atreq, pending);
- //free memory we own
+ // free memory we own
g_free(cmd_str);
util_sms_free_memory(atreq);
util_sms_free_memory(pending);
return TCORE_RETURN_ENOMEM;
}
- util_hex_dump(" ", strlen(cmd_str), (void *)cmd_str);
+ util_hex_dump(" ", strlen(cmd_str), (void *) cmd_str);
tcore_pending_set_request_data(pending, 0, atreq);
tcore_pending_set_response_callback(pending, on_response_sms_save_msg, NULL);
deleteMsg = tcore_user_request_ref_data(ur, NULL);
hal = tcore_object_get_hal(obj);
- if(NULL == deleteMsg || NULL == hal)
- {
+ if (NULL == deleteMsg || NULL == hal) {
err("NULL input. Unable to proceed");
dbg("deleteMsg: [%p], hal: [%p]", deleteMsg, hal);
dbg("index: %d", deleteMsg->index);
- cmd_str =g_strdup_printf("AT+CMGD=%d,0", deleteMsg->index+1);
+ cmd_str = g_strdup_printf("AT+CMGD=%d,0", deleteMsg->index + 1);
pending = tcore_pending_new(obj, 0);
- atreq = tcore_at_request_new((const char *)cmd_str, NULL, TCORE_AT_NO_RESULT);
- if(NULL == cmd_str || NULL == atreq || NULL == pending)
- {
+ atreq = tcore_at_request_new((const char *) cmd_str, NULL, TCORE_AT_NO_RESULT);
+ if (NULL == cmd_str || NULL == atreq || NULL == pending) {
err("Out of memory. Unable to proceed");
dbg("cmd_str: [%p], atreq: [%p], pending: [%p]", cmd_str, atreq, pending);
- //free memory we own
+ // free memory we own
g_free(cmd_str);
util_sms_free_memory(atreq);
util_sms_free_memory(pending);
return TCORE_RETURN_ENOMEM;
}
- util_hex_dump(" ", strlen(cmd_str), (void *)cmd_str);
+ util_hex_dump(" ", strlen(cmd_str), (void *) cmd_str);
tcore_pending_set_request_data(pending, 0, atreq);
- tcore_pending_set_response_callback(pending, on_response_sms_delete_msg, (void *)(uintptr_t)(deleteMsg->index)); //storing index as user data for response
+ tcore_pending_set_response_callback(pending, on_response_sms_delete_msg, (void *) (uintptr_t) (deleteMsg->index)); // storing index as user data for response
tcore_pending_link_user_request(pending, ur);
tcore_pending_set_send_callback(pending, on_confirmation_sms_message_send, NULL);
tcore_hal_send_request(hal, pending);
dbg("Entry");
hal = tcore_object_get_hal(obj);
- if(NULL == hal)
- {
+ if (NULL == hal) {
err("NULL HAL. Unable to proceed");
dbg("Exit");
cmd_str = g_strdup_printf("AT+CPMS=\"SM\"");
pending = tcore_pending_new(obj, 0);
- atreq = tcore_at_request_new((const char *)cmd_str, "+CPMS", TCORE_AT_SINGLELINE);
+ atreq = tcore_at_request_new((const char *) cmd_str, "+CPMS", TCORE_AT_SINGLELINE);
- if(NULL == cmd_str || NULL == atreq || NULL == pending)
- {
+ if (NULL == cmd_str || NULL == atreq || NULL == pending) {
err("Out of memory. Unable to proceed");
dbg("cmd_str: [%p], atreq: [%p], pending: [%p]", cmd_str, atreq, pending);
- //free memory we own
+ // free memory we own
g_free(cmd_str);
util_sms_free_memory(atreq);
util_sms_free_memory(pending);
return TCORE_RETURN_ENOMEM;
}
- util_hex_dump(" ", strlen(cmd_str), (void *)cmd_str);
+ util_hex_dump(" ", strlen(cmd_str), (void *) cmd_str);
tcore_pending_set_request_data(pending, 0, atreq);
tcore_pending_set_response_callback(pending, on_response_get_stored_msg_cnt, NULL);
static TReturn get_sca(CoreObject *obj, UserRequest *ur)
{
- gchar * cmd_str = NULL;
+ gchar *cmd_str = NULL;
TcoreHal *hal = NULL;
TcoreATRequest *atreq = NULL;
TcorePending *pending = NULL;
-
+
dbg("Entry");
hal = tcore_object_get_hal(obj);
- if(NULL == hal)
- {
+ if (NULL == hal) {
err("HAL NULL. Unable to proceed");
dbg("Exit");
cmd_str = g_strdup_printf("AT+CSCA?");
pending = tcore_pending_new(obj, 0);
- atreq = tcore_at_request_new((const char *)cmd_str, "+CSCA", TCORE_AT_SINGLELINE);
+ atreq = tcore_at_request_new((const char *) cmd_str, "+CSCA", TCORE_AT_SINGLELINE);
- if(NULL == cmd_str || NULL == atreq || NULL == pending)
- {
+ if (NULL == cmd_str || NULL == atreq || NULL == pending) {
err("Out of memory. Unable to proceed");
dbg("cmd_str: [%p], atreq: [%p], pending: [%p]", cmd_str, atreq, pending);
- //free memory we own
+ // free memory we own
g_free(cmd_str);
util_sms_free_memory(atreq);
util_sms_free_memory(pending);
return TCORE_RETURN_ENOMEM;
}
- util_hex_dump(" ", strlen(cmd_str), (void *)cmd_str);
+ util_hex_dump(" ", strlen(cmd_str), (void *) cmd_str);
tcore_pending_set_request_data(pending, 0, atreq);
tcore_pending_set_response_callback(pending, on_response_get_sca, NULL);
setSca = tcore_user_request_ref_data(ur, NULL);
hal = tcore_object_get_hal(obj);
- if(NULL == setSca || NULL == hal)
- {
+ if (NULL == setSca || NULL == hal) {
err("NULL input. Unable to proceed");
dbg("setSca: [%p], hal: [%p]", setSca, hal);
dbg("dialNumLen: %u, typeOfNum: %d, numPlanId: %d, ", setSca->scaInfo.dialNumLen, setSca->scaInfo.typeOfNum, setSca->scaInfo.numPlanId);
- util_hex_dump(" ", (SMS_SMSP_ADDRESS_LEN+1), (void *)setSca->scaInfo.diallingNum);
+ util_hex_dump(" ", (SMS_SMSP_ADDRESS_LEN + 1), (void *) setSca->scaInfo.diallingNum);
addrType = ((setSca->scaInfo.typeOfNum << 4) | setSca->scaInfo.numPlanId) | 0x80;
cmd_str = g_strdup_printf("AT+CSCA=\"%s\",%d", setSca->scaInfo.diallingNum, addrType);
pending = tcore_pending_new(obj, 0);
- atreq = tcore_at_request_new((const char *)cmd_str, NULL, TCORE_AT_NO_RESULT);
+ atreq = tcore_at_request_new((const char *) cmd_str, NULL, TCORE_AT_NO_RESULT);
- if(NULL == cmd_str || NULL == atreq || NULL == pending)
- {
+ if (NULL == cmd_str || NULL == atreq || NULL == pending) {
err("Out of memory. Unable to proceed");
dbg("cmd_str: [%p], atreq: [%p], pending: [%p]", cmd_str, atreq, pending);
- //free memory we own
+ // free memory we own
g_free(cmd_str);
util_sms_free_memory(atreq);
util_sms_free_memory(pending);
return TCORE_RETURN_ENOMEM;
}
- util_hex_dump(" ", strlen(cmd_str), (void *)cmd_str);
+ util_hex_dump(" ", strlen(cmd_str), (void *) cmd_str);
tcore_pending_set_request_data(pending, 0, atreq);
tcore_pending_set_response_callback(pending, on_response_set_sca, NULL);
dbg("Entry");
hal = tcore_object_get_hal(obj);
- if(NULL == hal)
- {
+ if (NULL == hal) {
err("NULL HAL. Unable to proceed");
dbg("Exit");
cmd_str = g_strdup_printf("AT+CSCB?");
pending = tcore_pending_new(obj, 0);
- atreq = tcore_at_request_new((const char *)cmd_str, "+CSCB", TCORE_AT_SINGLELINE);
- if(NULL == cmd_str || NULL == atreq || NULL == pending)
- {
+ atreq = tcore_at_request_new((const char *) cmd_str, "+CSCB", TCORE_AT_SINGLELINE);
+ if (NULL == cmd_str || NULL == atreq || NULL == pending) {
err("Out of memory. Unable to proceed");
dbg("cmd_str: [%p], atreq: [%p], pending: [%p]", cmd_str, atreq, pending);
- //free memory we own
+ // free memory we own
g_free(cmd_str);
util_sms_free_memory(atreq);
util_sms_free_memory(pending);
return TCORE_RETURN_ENOMEM;
}
- util_hex_dump(" ", strlen(cmd_str), (void *)cmd_str);
+ util_hex_dump(" ", strlen(cmd_str), (void *) cmd_str);
tcore_pending_set_request_data(pending, 0, atreq);
tcore_pending_set_response_callback(pending, on_response_get_cb_config, NULL);
setCbConfig = tcore_user_request_ref_data(ur, NULL);
hal = tcore_object_get_hal(obj);
- if(NULL == setCbConfig || NULL == hal)
- {
+ if (NULL == setCbConfig || NULL == hal) {
err("NULL input. Unable to proceed");
dbg("setCbConfig: [%p], hal: [%p]", setCbConfig, hal);
}
dbg("bCBEnabled: %d, selectedId: %x, msgIdMaxCount: %x, msgIdCount: %d", setCbConfig->bCBEnabled, setCbConfig->selectedId, setCbConfig->msgIdMaxCount, setCbConfig->msgIdCount);
- util_hex_dump(" ", SMS_GSM_SMS_CBMI_LIST_SIZE_MAX, (void *)setCbConfig->msgIDs);
+ util_hex_dump(" ", SMS_GSM_SMS_CBMI_LIST_SIZE_MAX, (void *) setCbConfig->msgIDs);
- if (setCbConfig->bCBEnabled == FALSE) //AT+CSCB=0: Disable CBS
- {
+ if (setCbConfig->bCBEnabled == FALSE) { // AT+CSCB=0: Disable CBS
cmd_str = g_strdup_printf("AT+CSCB=0");
- }
- else
- {
- if(setCbConfig->selectedId == SMS_CBMI_SELECTED_SOME) //AT+CSCB=0,<mids>,<dcss>: Enable CBS for specified <mids> and <dcss>
- {
+ } else {
+ if (setCbConfig->selectedId == SMS_CBMI_SELECTED_SOME) { // AT+CSCB=0,<mids>,<dcss>: Enable CBS for specified <mids> and <dcss>
dbg("Enabling specified CBMIs");
mids_GString = g_string_new(g_strdup_printf("%d", setCbConfig->msgIDs[0]));
- for(loop_ctr=1; loop_ctr <setCbConfig->msgIdCount; loop_ctr++)
- {
+ for (loop_ctr = 1; loop_ctr < setCbConfig->msgIdCount; loop_ctr++) {
mids_GString = g_string_append(mids_GString, ",");
mids_GString = g_string_append(mids_GString, g_strdup_printf("%d", setCbConfig->msgIDs[loop_ctr]));
}
cmd_str = g_strdup_printf("AT+CSCB=0,\"%s\"", mids_str);
g_free(mids_str);
- }
- else if (setCbConfig->selectedId == SMS_CBMI_SELECTED_ALL) //AT+CSCB=1: Enable CBS for all <mids> and <dcss>
- {
+ } else if (setCbConfig->selectedId == SMS_CBMI_SELECTED_ALL) { // AT+CSCB=1: Enable CBS for all <mids> and <dcss>
dbg("Enabling all CBMIs");
cmd_str = g_strdup_printf("AT+CSCB=1");
}
}
pending = tcore_pending_new(obj, 0);
- atreq = tcore_at_request_new((const char *)cmd_str, NULL, TCORE_AT_NO_RESULT);
- if(NULL == cmd_str || NULL == atreq || NULL == pending)
- {
+ atreq = tcore_at_request_new((const char *) cmd_str, NULL, TCORE_AT_NO_RESULT);
+ if (NULL == cmd_str || NULL == atreq || NULL == pending) {
err("Out of memory. Unable to proceed");
dbg("cmd_str: [%p], atreq: [%p], pending: [%p]", cmd_str, atreq, pending);
- //free memory we own
+ // free memory we own
g_free(cmd_str);
util_sms_free_memory(atreq);
util_sms_free_memory(pending);
return TCORE_RETURN_ENOMEM;
}
- util_hex_dump(" ", strlen(cmd_str), (void *)cmd_str);
+ util_hex_dump(" ", strlen(cmd_str), (void *) cmd_str);
tcore_pending_set_request_data(pending, 0, atreq);
tcore_pending_set_response_callback(pending, on_response_set_cb_config, NULL);
setMemStatus = tcore_user_request_ref_data(ur, NULL);
hal = tcore_object_get_hal(obj);
- if(NULL == setMemStatus || NULL == hal)
- {
+ if (NULL == setMemStatus || NULL == hal) {
err("NULL input. Unable to proceed");
dbg("setMemStatus: [%p], hal: [%p]", setMemStatus, hal);
dbg("memory_status: %d", setMemStatus->memory_status);
- if(setMemStatus->memory_status < SMS_PDA_MEMORY_STATUS_AVAILABLE
- || setMemStatus->memory_status > SMS_PDA_MEMORY_STATUS_FULL)
- {
+ if (setMemStatus->memory_status < SMS_PDA_MEMORY_STATUS_AVAILABLE
+ || setMemStatus->memory_status > SMS_PDA_MEMORY_STATUS_FULL) {
err("Invalid memory_status");
dbg("Exit");
return TCORE_RETURN_EINVAL;
}
- switch (setMemStatus->memory_status)
- {
- case SMS_PDA_MEMORY_STATUS_AVAILABLE:
- memoryStatus = AT_MEMORY_AVAILABLE;
- break;
+ switch (setMemStatus->memory_status) {
+ case SMS_PDA_MEMORY_STATUS_AVAILABLE:
+ memoryStatus = AT_MEMORY_AVAILABLE;
+ break;
- case SMS_PDA_MEMORY_STATUS_FULL:
- memoryStatus = AT_MEMORY_FULL;
- break;
+ case SMS_PDA_MEMORY_STATUS_FULL:
+ memoryStatus = AT_MEMORY_FULL;
+ break;
- default:
- err("Invalid memory_status");
- dbg("Exit");
- return TCORE_RETURN_EINVAL;
+ default:
+ err("Invalid memory_status");
+ dbg("Exit");
+ return TCORE_RETURN_EINVAL;
}
cmd_str = g_strdup_printf("AT+XTESM=%d", memoryStatus);
pending = tcore_pending_new(obj, 0);
- atreq = tcore_at_request_new((const char *)cmd_str, NULL, TCORE_AT_NO_RESULT);
+ atreq = tcore_at_request_new((const char *) cmd_str, NULL, TCORE_AT_NO_RESULT);
- if(NULL == cmd_str || NULL == atreq || NULL == pending)
- {
+ if (NULL == cmd_str || NULL == atreq || NULL == pending) {
err("Out of memory. Unable to proceed");
dbg("cmd_str: [%p], atreq: [%p], pending: [%p]", cmd_str, atreq, pending);
- //free memory we own
+ // free memory we own
g_free(cmd_str);
util_sms_free_memory(atreq);
util_sms_free_memory(pending);
return TCORE_RETURN_ENOMEM;
}
- util_hex_dump(" ", strlen(cmd_str), (void *)cmd_str);
+ util_hex_dump(" ", strlen(cmd_str), (void *) cmd_str);
tcore_pending_set_request_data(pending, 0, atreq);
tcore_pending_set_response_callback(pending, on_response_set_mem_status, NULL);
static TReturn set_delivery_report(CoreObject *obj, UserRequest *ur)
{
- struct tresp_sms_set_delivery_report respSetDeliveryReport = {0,};
+ struct tresp_sms_set_delivery_report respSetDeliveryReport = {0, };
respSetDeliveryReport.result = SMS_SUCCESS;
dbg("Entry");
-
+
dbg("CP takes care of sending SMS ack to network for all classes of SMS. Sending default success.");
tcore_user_request_send_response(ur, TRESP_SMS_SET_DELIVERY_REPORT, sizeof(struct tresp_sms_set_delivery_report), &respSetDeliveryReport);
-
+
dbg("Exit");
return TCORE_RETURN_SUCCESS;
}
msg_status = tcore_user_request_ref_data(ur, NULL);
- cmd_str = g_strdup_printf("AT+CRSM=178,28476,%d,4,%d", (msg_status->index+1), AT_EF_SMS_RECORD_LEN);
- atreq = tcore_at_request_new((const char *)cmd_str, "+CRSM", TCORE_AT_SINGLELINE);
+ cmd_str = g_strdup_printf("AT+CRSM=178,28476,%d,4,%d", (msg_status->index + 1), AT_EF_SMS_RECORD_LEN);
+ atreq = tcore_at_request_new((const char *) cmd_str, "+CRSM", TCORE_AT_SINGLELINE);
pending = tcore_pending_new(obj, 0);
- if(NULL == cmd_str || NULL == atreq || NULL == pending)
- {
+ if (NULL == cmd_str || NULL == atreq || NULL == pending) {
err("Out of memory. Unable to proceed");
dbg("cmd_str: [%p], atreq: [%p], pending: [%p]", cmd_str, atreq, pending);
- //free memory we own
+ // free memory we own
g_free(cmd_str);
util_sms_free_memory(atreq);
util_sms_free_memory(pending);
return TCORE_RETURN_ENOMEM;
}
- util_hex_dump(" ", strlen(cmd_str), (void *)cmd_str);
+ util_hex_dump(" ", strlen(cmd_str), (void *) cmd_str);
tcore_pending_set_request_data(pending, 0, atreq);
tcore_pending_set_response_callback(pending, _response_get_efsms_data, NULL);
TcoreATRequest *atreq = NULL;
TcorePending *pending = NULL;
const struct treq_sms_get_params *getSmsParams = NULL;
- int record_len = 0 , *smsp_record_len = NULL;
+ int record_len = 0, *smsp_record_len = NULL;
dbg("Entry");
getSmsParams = tcore_user_request_ref_data(ur, NULL);
hal = tcore_object_get_hal(obj);
- if(NULL == getSmsParams || NULL == hal)
- {
+ if (NULL == getSmsParams || NULL == hal) {
err("NULL input. Unable to proceed");
dbg("getSmsParams: [%p], hal: [%p]", getSmsParams, hal);
record_len = *smsp_record_len;
dbg("record len from property %d", record_len);
- //AT+CRSM=command>[,<fileid>[,<P1>,<P2>,<P3>[,<data>[,<pathid>]]]]
+ // AT+CRSM=command>[,<fileid>[,<P1>,<P2>,<P3>[,<data>[,<pathid>]]]]
cmd_str = g_strdup_printf("AT+CRSM=178,28482,%d,4,%d", (getSmsParams->index + 1), record_len);
- dbg("cmd_str is %s",cmd_str);
+ dbg("cmd_str is %s", cmd_str);
- atreq = tcore_at_request_new((const char *)cmd_str, "+CRSM", TCORE_AT_SINGLELINE);
+ atreq = tcore_at_request_new((const char *) cmd_str, "+CRSM", TCORE_AT_SINGLELINE);
pending = tcore_pending_new(obj, 0);
- if(NULL == cmd_str || NULL == atreq || NULL == pending)
- {
+ if (NULL == cmd_str || NULL == atreq || NULL == pending) {
err("Out of memory. Unable to proceed");
dbg("cmd_str: [%p], atreq: [%p], pending: [%p]", cmd_str, atreq, pending);
- //free memory we own
+ // free memory we own
g_free(cmd_str);
util_sms_free_memory(atreq);
util_sms_free_memory(pending);
return TCORE_RETURN_ENOMEM;
}
- util_hex_dump(" ", strlen(cmd_str), (void *)cmd_str);
+ util_hex_dump(" ", strlen(cmd_str), (void *) cmd_str);
tcore_pending_set_request_data(pending, 0, atreq);
tcore_pending_set_response_callback(pending, on_response_get_sms_params, NULL);
setSmsParams = tcore_user_request_ref_data(ur, NULL);
hal = tcore_object_get_hal(obj);
- if(NULL == setSmsParams || NULL == hal)
- {
+ if (NULL == setSmsParams || NULL == hal) {
err("NULL input. Unable to proceed");
dbg("setSmsParams: [%p], hal: [%p]", setSmsParams, hal);
return FALSE;
}
- //EFsmsp file size is 28 +Y bytes (Y is alpha id size)
+ // EFsmsp file size is 28 +Y bytes (Y is alpha id size)
SMSPRecordLen = 28 + setSmsParams->params.alphaIdLen;
- temp_data = calloc(SMSPRecordLen,1);
- encoded_data = calloc(SMSPRecordLen*2 + 1,1);
-
+ temp_data = calloc(SMSPRecordLen, 1);
+ encoded_data = calloc(SMSPRecordLen * 2 + 1, 1);
+
_tcore_util_sms_encode_smsParameters(&(setSmsParams->params), temp_data, SMSPRecordLen);
- util_byte_to_hex((const char *)temp_data, (char *)encoded_data,SMSPRecordLen);
-
+ util_byte_to_hex((const char *) temp_data, (char *) encoded_data, SMSPRecordLen);
+
encoded_data_len = ((SMSPRecordLen) * 2);
hal = tcore_object_get_hal(obj);
pending = tcore_pending_new(obj, 0);
- dbg("alpha id len %d encoded data %s. Encoded data len %d",setSmsParams->params.alphaIdLen,encoded_data, encoded_data_len);
- cmd_str = g_strdup_printf("AT+CRSM=220,28482,%d,4,%d,\"%s\"",(setSmsParams->params.recordIndex+1),SMSPRecordLen,encoded_data);
+ dbg("alpha id len %d encoded data %s. Encoded data len %d", setSmsParams->params.alphaIdLen, encoded_data, encoded_data_len);
+ cmd_str = g_strdup_printf("AT+CRSM=220,28482,%d,4,%d,\"%s\"", (setSmsParams->params.recordIndex + 1), SMSPRecordLen, encoded_data);
- dbg("cmd str is %s",cmd_str);
- atreq = tcore_at_request_new(cmd_str, "+CRSM:", TCORE_AT_SINGLELINE);
+ dbg("cmd str is %s", cmd_str);
+ atreq = tcore_at_request_new(cmd_str, "+CRSM:", TCORE_AT_SINGLELINE);
- if(NULL == cmd_str || NULL == atreq || NULL == pending)
- {
+ if (NULL == cmd_str || NULL == atreq || NULL == pending) {
err("Out of memory. Unable to proceed");
dbg("cmd_str: [%p], atreq: [%p], pending: [%p]", cmd_str, atreq, pending);
- //free memory we own
+ // free memory we own
g_free(cmd_str);
util_sms_free_memory(atreq);
util_sms_free_memory(pending);
return TCORE_RETURN_ENOMEM;
}
- util_hex_dump(" ", strlen(cmd_str), (void *)cmd_str);
+ util_hex_dump(" ", strlen(cmd_str), (void *) cmd_str);
- tcore_pending_set_request_data(pending, 0,atreq);
+ tcore_pending_set_request_data(pending, 0, atreq);
tcore_pending_set_response_callback(pending, on_response_set_sms_params, NULL);
tcore_pending_link_user_request(pending, ur);
tcore_pending_set_send_callback(pending, on_confirmation_sms_message_send, NULL);
dbg("Entry");
hal = tcore_object_get_hal(obj);
- if(NULL == hal)
- {
+ if (NULL == hal) {
err("NULL HAL. Unable to proceed");
dbg("Exit");
return TCORE_RETURN_EINVAL;
}
- //AT+CRSM=command>[,<fileid>[,<P1>,<P2>,<P3>[,<data>[,<pathid>]]]]
+ // AT+CRSM=command>[,<fileid>[,<P1>,<P2>,<P3>[,<data>[,<pathid>]]]]
cmd_str = g_strdup_printf("AT+CRSM=192,28482");
- atreq = tcore_at_request_new((const char *)cmd_str, "+CRSM", TCORE_AT_SINGLELINE);
+ atreq = tcore_at_request_new((const char *) cmd_str, "+CRSM", TCORE_AT_SINGLELINE);
pending = tcore_pending_new(obj, 0);
- if (NULL == cmd_str || NULL == atreq || NULL == pending)
- {
+ if (NULL == cmd_str || NULL == atreq || NULL == pending) {
err("NULL pointer. Unable to proceed");
dbg("cmd_str: [%p], atreq: [%p], pending: [%p]", cmd_str, atreq, pending);
- //free memory we own
+ // free memory we own
g_free(cmd_str);
util_sms_free_memory(atreq);
util_sms_free_memory(pending);
return TCORE_RETURN_FAILURE;
}
- util_hex_dump(" ", strlen(cmd_str), (void *)cmd_str);
+ util_hex_dump(" ", strlen(cmd_str), (void *) cmd_str);
tcore_pending_set_request_data(pending, 0, atreq);
tcore_pending_set_response_callback(pending, on_response_get_paramcnt, NULL);
return TCORE_RETURN_SUCCESS;
}
-static struct tcore_sms_operations sms_ops =
-{
+static struct tcore_sms_operations sms_ops = {
.send_umts_msg = send_umts_msg,
.read_msg = read_msg,
.save_msg = save_msg,
data = calloc(sizeof(struct property_sms_info), 1);
- if (NULL == obj || NULL == data)
- {
+ if (NULL == obj || NULL == data) {
err("Unable to initialize. Exiting");
s_sms_exit(plugin);
work_queue = g_queue_new();
tcore_object_link_user_data(obj, work_queue);
- //Registering for SMS notifications
+ // Registering for SMS notifications
tcore_object_add_callback(obj, "\e+CMTI", on_event_class2_sms_incom_msg, NULL);
tcore_object_add_callback(obj, "\e+CMT", on_event_sms_incom_msg, NULL);
tcore_plugin_link_property(plugin, "SMS", data);
- //storing smsp record length
+ // storing smsp record length
smsp_record_len = calloc(sizeof(int), 1);
tcore_plugin_link_property(plugin, "SMSPRECORDLEN", smsp_record_len);
dbg("plugin: [%p]", plugin);
obj = tcore_plugin_ref_core_object(plugin, "umts_sms");
- if (NULL == obj)
- {
+ if (NULL == obj) {
err("NULL core object. Nothing to do.");
return;
}
-/*\r
- * tel-plugin-imc\r
- *\r
- * Copyright (c) 2012 Samsung Electronics Co., Ltd. All rights reserved.\r
- *\r
- * Contact: sharanayya mathapati <sharan.m@samsung.com>\r
- *\r
- * Licensed under the Apache License, Version 2.0 (the "License");\r
- * you may not use this file except in compliance with the License.\r
- * You may obtain a copy of the License at\r
- *\r
- * http://www.apache.org/licenses/LICENSE-2.0\r
- *\r
- * Unless required by applicable law or agreed to in writing, software\r
- * distributed under the License is distributed on an "AS IS" BASIS,\r
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
- * See the License for the specific language governing permissions and\r
- * limitations under the License.\r
- */\r
-\r
-\r
-#include <stdio.h>\r
-#include <stdlib.h>\r
-#include <string.h>\r
-#include <glib.h>\r
-\r
-#include <tcore.h>\r
-#include <hal.h>\r
-#include <core_object.h>\r
-#include <plugin.h>\r
-#include <queue.h>\r
-#include <co_call.h>\r
-#include <co_ss.h>\r
-#include <user_request.h>\r
-#include <util.h>\r
-#include <server.h>\r
-#include <at.h>\r
-\r
-#include "s_common.h"\r
-#include "s_ss.h"\r
-\r
-#define NUM_TYPE_INTERNATIONAL 0x01\r
-#define NUM_PLAN_ISDN 0x01\r
-\r
-//To avoid sending multiple response to application\r
-static gboolean UssdResp = FALSE;\r
-\r
-enum telephony_ss_opcode\r
-{\r
- SS_OPCO_REG=0x01, /* 0x01 : Registration */\r
- SS_OPCO_DEREG, /* 0x02 : De-registration(erase) */\r
- SS_OPCO_ACTIVATE, /* 0x03 : Activation */\r
- SS_OPCO_DEACTIVATE, /* 0x04 : De-activation */\r
- SS_OPCO_MAX\r
-};\r
-\r
-struct ss_confirm_info\r
-{\r
- enum telephony_ss_class class;\r
- int flavor_type;\r
- enum tcore_response_command resp;\r
- void *data;\r
- int data_len;\r
-};\r
-\r
-static gboolean _ss_request_message(TcorePending *pending,\r
- CoreObject *o,\r
- UserRequest *ur,\r
- void* on_resp,\r
- void* user_data);\r
-\r
-static TReturn _ss_barring_get(CoreObject *o,\r
- UserRequest *ur,\r
- enum telephony_ss_class class,\r
- enum telephony_ss_barring_mode type,\r
- enum tcore_response_command resp);\r
-\r
-static TReturn _ss_forwarding_get(CoreObject *o,\r
- UserRequest *ur,\r
- enum telephony_ss_class class,\r
- enum telephony_ss_forwarding_mode type,\r
- enum tcore_response_command resp);\r
-\r
-static TReturn _ss_waiting_get(CoreObject *o,\r
- UserRequest *ur,\r
- enum telephony_ss_class class,\r
- enum tcore_response_command resp);\r
-\r
-static TReturn s_ss_barring_activate(CoreObject *o, UserRequest *ur);\r
-static TReturn s_ss_barring_deactivate(CoreObject *o, UserRequest *ur);\r
-static TReturn s_ss_barring_change_password(CoreObject *o, UserRequest *ur);\r
-static TReturn s_ss_barring_get_status(CoreObject *o, UserRequest *ur);\r
-\r
-static TReturn s_ss_forwarding_activate(CoreObject *o, UserRequest *ur);\r
-static TReturn s_ss_forwarding_deactivate(CoreObject *o, UserRequest *ur);\r
-static TReturn s_ss_forwarding_register(CoreObject *o, UserRequest *ur);\r
-static TReturn s_ss_forwarding_deregister(CoreObject *o, UserRequest *ur);\r
-static TReturn s_ss_forwarding_get_status(CoreObject *o, UserRequest *ur);\r
-\r
-static TReturn s_ss_waiting_activate(CoreObject *o, UserRequest *ur);\r
-static TReturn s_ss_waiting_deactivate(CoreObject *o, UserRequest *ur);\r
-static TReturn s_ss_waiting_get_status(CoreObject *o, UserRequest *ur);\r
-\r
-static TReturn s_ss_cli_activate(CoreObject *o, UserRequest *ur);\r
-static TReturn s_ss_cli_deactivate(CoreObject *o, UserRequest *ur);\r
-static TReturn s_ss_cli_get_status(CoreObject *o, UserRequest *ur);\r
-\r
-static TReturn s_ss_send_ussd(CoreObject *o, UserRequest *ur);\r
-\r
-static TReturn s_ss_set_aoc(CoreObject *o, UserRequest *ur);\r
-static TReturn s_ss_get_aoc(CoreObject *o, UserRequest *ur);\r
-\r
-static TReturn s_ss_manage_call_0_send(CoreObject* o, UserRequest* ur, ConfirmCallback cb, void* user_data);\r
-static TReturn s_ss_manage_call_1_send(CoreObject* o, UserRequest* ur, ConfirmCallback cb, void* user_data);\r
-static TReturn s_ss_manage_call_1x_send(CoreObject* o, UserRequest* ur, const int id, ConfirmCallback cb, void* user_data);\r
-static TReturn s_ss_manage_call_2_send(CoreObject* o, UserRequest* ur, ConfirmCallback cb, void* user_data);\r
-static TReturn s_ss_manage_call_2x_send(CoreObject* o, UserRequest* ur, const int id, ConfirmCallback cb, void* user_data);\r
-static TReturn s_ss_manage_call_3_send(CoreObject* o, UserRequest* ur, ConfirmCallback cb, void* user_data);\r
-static TReturn s_ss_manage_call_4_send(CoreObject* o, UserRequest* ur, ConfirmCallback cb, void* user_data);\r
-static TReturn s_ss_manage_call_4dn_send(CoreObject* o, UserRequest* ur, const char* number, ConfirmCallback cb, void* user_data);\r
-\r
-static void on_confirmation_ss_message_send(TcorePending *p, gboolean result, void *user_data);\r
-\r
-static void _ss_ussd_response(UserRequest *ur, const char* ussd_str, enum telephony_ss_ussd_type type, enum telephony_ss_ussd_status status);\r
-static void _ss_ussd_notification(TcorePlugin *p, const char* ussd_str, enum telephony_ss_ussd_status status);\r
-\r
-static gboolean on_notification_ss_info(CoreObject *o, const void *data, void *user_data);\r
-static gboolean on_notification_ss_ussd(CoreObject *o, const void *data, void *user_data);\r
-\r
-\r
-static gboolean _ss_request_message(TcorePending *pending,\r
- CoreObject *o,\r
- UserRequest *ur,\r
- void* on_resp,\r
- void* user_data)\r
-{\r
- TcoreHal *hal = NULL;\r
- TReturn ret;\r
- dbg("Entry");\r
-\r
- if (on_resp) {\r
- tcore_pending_set_response_callback(pending, on_resp, user_data);\r
- }\r
- tcore_pending_set_send_callback(pending, on_confirmation_ss_message_send, NULL);\r
- if (ur) {\r
- tcore_pending_link_user_request(pending, ur);\r
- }\r
- else {\r
- err("User Request is NULL, is this internal request??");\r
- }\r
- // HAL\r
- hal = tcore_object_get_hal(o);\r
-\r
- // Send request to HAL\r
- ret = tcore_hal_send_request(hal, pending);\r
- if(TCORE_RETURN_SUCCESS != ret) {\r
- err("Request send failed");\r
- return FALSE;\r
- }\r
-\r
- dbg("Exit");\r
- return TRUE;\r
-}\r
-\r
-static void _ss_ussd_response(UserRequest *ur, const char* ussd_str, enum telephony_ss_ussd_type type, enum telephony_ss_ussd_status status)\r
-{\r
- struct tresp_ss_ussd resp;\r
- dbg("Entry");\r
-\r
- if (ur) {\r
- memset (&resp, 0x0, sizeof(struct tresp_ss_ussd));\r
- resp.type = type;\r
- resp.status = status;\r
- resp.err = FALSE;\r
- dbg("ussd_str = %s resp.type - %d resp.status - %d",ussd_str ,resp.type,resp.status);\r
-\r
- if (ussd_str) {\r
- int len = strlen(ussd_str);\r
- if (len < MAX_SS_USSD_LEN) {\r
- memcpy(resp.str, ussd_str, len);\r
- resp.str[len] = '\0';\r
- }\r
- else {\r
- memcpy(resp.str, ussd_str, MAX_SS_USSD_LEN);\r
- resp.str[MAX_SS_USSD_LEN - 1] = '\0';\r
- }\r
- dbg("Response string: %s", resp.str);\r
- }\r
- else {\r
- dbg("USSD string is not present");\r
- memset(resp.str, '\0', MAX_SS_USSD_LEN);\r
- }\r
- UssdResp = TRUE;\r
- // Send response to TAPI\r
- tcore_user_request_send_response(ur, TRESP_SS_SEND_USSD, sizeof(struct tresp_ss_ussd), &resp);\r
- }\r
- else {\r
- err("User request is NULL");\r
- }\r
-\r
- dbg("Exit");\r
- return;\r
-}\r
-\r
-static void _ss_ussd_notification(TcorePlugin *p, const char* ussd_str, enum telephony_ss_ussd_status status)\r
-{\r
- CoreObject *core_obj = 0;\r
- struct tnoti_ss_ussd noti;\r
-\r
- dbg("function enter");\r
- if (!p) {\r
- dbg("[ error ] p : (NULL)");\r
- return ;\r
- }\r
- noti.status = status;\r
- if (ussd_str) {\r
-\r
- int len = strlen(ussd_str);\r
- if (len < MAX_SS_USSD_LEN) {\r
- memcpy(noti.str, ussd_str, len);\r
- noti.str[ len ] = '\0';\r
- }\r
- else {\r
- memcpy(noti.str, ussd_str, MAX_SS_USSD_LEN);\r
- noti.str[ MAX_SS_USSD_LEN - 1 ] = '\0';\r
- }\r
-\r
- }\r
- else {\r
- memset(noti.str, '\0', MAX_SS_USSD_LEN);\r
- }\r
- dbg("noti.str - %s", noti.str);\r
-\r
- core_obj = tcore_plugin_ref_core_object(p, "ss");\r
- tcore_server_send_notification(tcore_plugin_ref_server(p),\r
- core_obj,\r
- TNOTI_SS_USSD,\r
- sizeof(struct tnoti_ss_ussd),\r
- (void*)¬i);\r
-\r
-}\r
-\r
-static gboolean on_notification_ss_ussd(CoreObject *o, const void *data, void *user_data)\r
-{\r
- enum telephony_ss_ussd_status status;\r
- UssdSession *ussd_session = 0;\r
- char *ussd_str = 0, *cmd = 0;\r
- TcorePlugin *plugin = 0;\r
- int m = -1, dcs = 0;\r
- char *ussdnoti= NULL, *str = NULL, *dcs_str = NULL;\r
- GSList *tokens = NULL;\r
- GSList *lines = NULL;\r
- char *ussd_string = NULL;\r
- unsigned int len;\r
-\r
- plugin = tcore_object_ref_plugin(o);\r
- ussd_session = tcore_ss_ussd_get_session(o);\r
-\r
- dbg("function enter");\r
- lines = (GSList*)data;\r
- if (1 != g_slist_length(lines)) {\r
- dbg("unsolicited msg but multiple line");\r
- goto OUT;\r
- }\r
- cmd = (char*)(lines->data);\r
- // parse ussd status\r
- tokens = tcore_at_tok_new(cmd);\r
-\r
- // parse <m>\r
- ussdnoti = g_slist_nth_data(tokens, 0);\r
- if(!ussdnoti) {\r
- dbg("+CUSD<m> is missing from %CUSD Notification");\r
-\r
- }\r
- else {\r
-\r
- m = atoi(ussdnoti);\r
- dbg("USSD status %d",m);\r
- //parse [ <str>, <dcs>]\r
- ussd_string = g_slist_nth_data(tokens, 1);\r
- if(ussd_string) {\r
-\r
- /* Strike off starting & ending quotes. 1 extra character for NULL termination */\r
- str = malloc(strlen(ussd_string) - 1);\r
- dbg("length of Ussd Stirng - %d", strlen(ussd_string));\r
- if(str) {\r
- memset(str, 0x00, strlen(ussd_string) - 1);\r
- }\r
- else {\r
- dbg("malloc failed")\r
- return FALSE;\r
- }\r
- len = strlen(ussd_string)-1;\r
- ++ussd_string;\r
- strncpy(str, ussd_string, len);\r
-\r
- dbg("USSD String - %s len = %d",str,strlen(str));\r
- }\r
- if((dcs_str = g_slist_nth_data(tokens, 2))) {\r
- dcs = atoi(dcs_str);\r
- dbg("USSD dcs %d",dcs);\r
- }\r
- }\r
-\r
- switch(m) {\r
-\r
- case 0:\r
- status = SS_USSD_NO_ACTION_REQUIRE;\r
- break;\r
-\r
- case 1:\r
- status = SS_USSD_ACTION_REQUIRE;\r
- break;\r
-\r
- case 2:\r
- status = SS_USSD_TERMINATED_BY_NET;\r
- break;\r
-\r
- case 3:\r
- status = SS_USSD_OTHER_CLIENT;\r
- break;\r
-\r
- case 4:\r
- status = SS_USSD_NOT_SUPPORT;\r
- break;\r
-\r
- case 5:\r
- status = SS_USSD_TIME_OUT;\r
- break;\r
-\r
- default:\r
- dbg("unsupported m : %d", m);\r
- status = SS_USSD_MAX;\r
- break;\r
- }\r
-\r
- switch (tcore_util_get_cbs_coding_scheme(dcs)) {\r
-\r
- case TCORE_DCS_TYPE_7_BIT:\r
- case TCORE_DCS_TYPE_UNSPECIFIED:\r
- //ussd_str = tcore_util_unpack_gsm7bit(str, strlen(str));\r
- //break;\r
-\r
- case TCORE_DCS_TYPE_UCS2:\r
- case TCORE_DCS_TYPE_8_BIT:\r
- if ( (str != NULL ) && (strlen(str) > 0))\r
- {\r
- ussd_str = g_new0(char, strlen(str) + 1);\r
- if(ussd_str != NULL){\r
- memcpy(ussd_str,str, strlen(str));\r
- ussd_str[ strlen(str) ] = '\0';\r
- }\r
- }\r
- break;\r
- default:\r
- dbg("[ error ] unknown dcs type. ussd_session : %x", ussd_session);\r
- if (ussd_session) {\r
-\r
- UserRequest *ur = 0;\r
- enum telephony_ss_ussd_type type;\r
-\r
- tcore_ss_ussd_get_session_data(ussd_session, (void**)&ur);\r
- if (!ur) {\r
-\r
- dbg("[ error ] ur : (0)");\r
- return FALSE;\r
- }\r
-\r
- type = (enum telephony_ss_ussd_type)tcore_ss_ussd_get_session_type(ussd_session);\r
- dbg("ussd type - %d", type);\r
-\r
- _ss_ussd_response(ur, ussd_str, type, status);\r
- }\r
- return FALSE;\r
- }\r
-\r
- switch (status) {\r
-\r
- case SS_USSD_NO_ACTION_REQUIRE:\r
- case SS_USSD_ACTION_REQUIRE:\r
- case SS_USSD_OTHER_CLIENT:\r
- case SS_USSD_NOT_SUPPORT:\r
- case SS_USSD_TIME_OUT:\r
- {\r
- if (ussd_session) {\r
-\r
- UserRequest *ur = 0;\r
- enum telephony_ss_ussd_type type;\r
-\r
- tcore_ss_ussd_get_session_data(ussd_session, (void**)&ur);\r
- if (!ur) {\r
- dbg("[ error ] ur : (0)");\r
- return FALSE;\r
- }\r
- type = (enum telephony_ss_ussd_type)tcore_ss_ussd_get_session_type(ussd_session);\r
- dbg("ussd type - %d", type);\r
- _ss_ussd_response(ur, (const char*)ussd_str, type, status);\r
- if(ussd_str)\r
- g_free(ussd_str);\r
- }\r
- else {\r
- tcore_ss_ussd_create_session(o, TCORE_SS_USSD_TYPE_NETWORK_INITIATED, 0, 0);\r
- _ss_ussd_notification(plugin, (const char*)ussd_str, status);\r
-\r
- if(ussd_str)\r
- g_free(ussd_str);\r
- }\r
- }\r
- break;\r
- case SS_USSD_TERMINATED_BY_NET:\r
- {\r
- if (ussd_session){\r
- UserRequest *ur = 0;\r
- tcore_ss_ussd_get_session_data(ussd_session, (void**)&ur);\r
- if (ur) {\r
- tcore_user_request_unref(ur);\r
- }\r
- tcore_ss_ussd_destroy_session(ussd_session);\r
- }\r
- }\r
- break;\r
-\r
- default:\r
- break;\r
- }\r
-\r
-OUT:\r
- if(NULL!=tokens)\r
- tcore_at_tok_free(tokens);\r
-\r
- if(NULL != str)\r
- free(str);\r
- dbg("Exit");\r
- return TRUE;\r
-\r
-}\r
-static gboolean on_notification_ss_info(CoreObject *o, const void *data, void *user_data)\r
-{\r
- TcorePlugin *plugin = 0;\r
- CoreObject *co = 0;\r
- char* cmd = 0, *number = 0, *pos;\r
- int code1 = -1, code2 = -1, index = 0, ton = 0;\r
- char *str_code1, *str_code2, *str_ton ,*str_index;\r
- GSList *tokens = NULL;\r
- char *buf;\r
- gboolean cssu = FALSE,cssi = FALSE;\r
- GSList *lines = NULL;\r
+/*
+ * tel-plugin-imc
+ *
+ * Copyright (c) 2012 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: sharanayya mathapati <sharan.m@samsung.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <glib.h>
+
+#include <tcore.h>
+#include <hal.h>
+#include <core_object.h>
+#include <plugin.h>
+#include <queue.h>
+#include <co_call.h>
+#include <co_ss.h>
+#include <user_request.h>
+#include <util.h>
+#include <server.h>
+#include <at.h>
+
+#include "s_common.h"
+#include "s_ss.h"
+
+#define NUM_TYPE_INTERNATIONAL 0x01
+#define NUM_PLAN_ISDN 0x01
+
+// To avoid sending multiple response to application
+static gboolean UssdResp = FALSE;
+
+enum telephony_ss_opcode {
+ SS_OPCO_REG = 0x01, /* 0x01 : Registration */
+ SS_OPCO_DEREG, /* 0x02 : De-registration(erase) */
+ SS_OPCO_ACTIVATE, /* 0x03 : Activation */
+ SS_OPCO_DEACTIVATE, /* 0x04 : De-activation */
+ SS_OPCO_MAX
+};
+
+struct ss_confirm_info {
+ enum telephony_ss_class class;
+ int flavor_type;
+ enum tcore_response_command resp;
+ void *data;
+ int data_len;
+};
+
+static gboolean _ss_request_message(TcorePending *pending, CoreObject *o, UserRequest *ur, void *on_resp, void *user_data);
+
+static TReturn _ss_barring_get(CoreObject *o, UserRequest *ur, enum telephony_ss_class class, enum telephony_ss_barring_mode type, enum tcore_response_command resp);
+
+static TReturn _ss_forwarding_get(CoreObject *o, UserRequest *ur, enum telephony_ss_class class, enum telephony_ss_forwarding_mode type, enum tcore_response_command resp);
+
+static TReturn _ss_waiting_get(CoreObject *o, UserRequest *ur, enum telephony_ss_class class, enum tcore_response_command resp);
+
+static TReturn s_ss_barring_activate(CoreObject *o, UserRequest *ur);
+static TReturn s_ss_barring_deactivate(CoreObject *o, UserRequest *ur);
+static TReturn s_ss_barring_change_password(CoreObject *o, UserRequest *ur);
+static TReturn s_ss_barring_get_status(CoreObject *o, UserRequest *ur);
+
+static TReturn s_ss_forwarding_activate(CoreObject *o, UserRequest *ur);
+static TReturn s_ss_forwarding_deactivate(CoreObject *o, UserRequest *ur);
+static TReturn s_ss_forwarding_register(CoreObject *o, UserRequest *ur);
+static TReturn s_ss_forwarding_deregister(CoreObject *o, UserRequest *ur);
+static TReturn s_ss_forwarding_get_status(CoreObject *o, UserRequest *ur);
+
+static TReturn s_ss_waiting_activate(CoreObject *o, UserRequest *ur);
+static TReturn s_ss_waiting_deactivate(CoreObject *o, UserRequest *ur);
+static TReturn s_ss_waiting_get_status(CoreObject *o, UserRequest *ur);
+
+static TReturn s_ss_cli_activate(CoreObject *o, UserRequest *ur);
+static TReturn s_ss_cli_deactivate(CoreObject *o, UserRequest *ur);
+static TReturn s_ss_cli_get_status(CoreObject *o, UserRequest *ur);
+
+static TReturn s_ss_send_ussd(CoreObject *o, UserRequest *ur);
+
+static TReturn s_ss_set_aoc(CoreObject *o, UserRequest *ur);
+static TReturn s_ss_get_aoc(CoreObject *o, UserRequest *ur);
+
+static TReturn s_ss_manage_call_0_send(CoreObject *o, UserRequest *ur, ConfirmCallback cb, void *user_data);
+static TReturn s_ss_manage_call_1_send(CoreObject *o, UserRequest *ur, ConfirmCallback cb, void *user_data);
+static TReturn s_ss_manage_call_1x_send(CoreObject *o, UserRequest *ur, const int id, ConfirmCallback cb, void *user_data);
+static TReturn s_ss_manage_call_2_send(CoreObject *o, UserRequest *ur, ConfirmCallback cb, void *user_data);
+static TReturn s_ss_manage_call_2x_send(CoreObject *o, UserRequest *ur, const int id, ConfirmCallback cb, void *user_data);
+static TReturn s_ss_manage_call_3_send(CoreObject *o, UserRequest *ur, ConfirmCallback cb, void *user_data);
+static TReturn s_ss_manage_call_4_send(CoreObject *o, UserRequest *ur, ConfirmCallback cb, void *user_data);
+static TReturn s_ss_manage_call_4dn_send(CoreObject *o, UserRequest *ur, const char *number, ConfirmCallback cb, void *user_data);
+
+static void on_confirmation_ss_message_send(TcorePending *p, gboolean result, void *user_data);
+
+static void _ss_ussd_response(UserRequest *ur, const char *ussd_str, enum telephony_ss_ussd_type type, enum telephony_ss_ussd_status status);
+static void _ss_ussd_notification(TcorePlugin *p, const char *ussd_str, enum telephony_ss_ussd_status status);
+
+static gboolean on_notification_ss_info(CoreObject *o, const void *data, void *user_data);
+static gboolean on_notification_ss_ussd(CoreObject *o, const void *data, void *user_data);
+
+
+static gboolean _ss_request_message(TcorePending *pending,
+ CoreObject *o,
+ UserRequest *ur,
+ void *on_resp,
+ void *user_data)
+{
+ TcoreHal *hal = NULL;
+ TReturn ret;
+ dbg("Entry");
+
+ if (on_resp) {
+ tcore_pending_set_response_callback(pending, on_resp, user_data);
+ }
+ tcore_pending_set_send_callback(pending, on_confirmation_ss_message_send, NULL);
+ if (ur) {
+ tcore_pending_link_user_request(pending, ur);
+ } else {
+ err("User Request is NULL, is this internal request??");
+ }
+ // HAL
+ hal = tcore_object_get_hal(o);
+
+ // Send request to HAL
+ ret = tcore_hal_send_request(hal, pending);
+ if (TCORE_RETURN_SUCCESS != ret) {
+ err("Request send failed");
+ return FALSE;
+ }
+
+ dbg("Exit");
+ return TRUE;
+}
+
+static void _ss_ussd_response(UserRequest *ur, const char *ussd_str, enum telephony_ss_ussd_type type, enum telephony_ss_ussd_status status)
+{
+ struct tresp_ss_ussd resp;
+ dbg("Entry");
+
+ if (ur) {
+ memset(&resp, 0x0, sizeof(struct tresp_ss_ussd));
+ resp.type = type;
+ resp.status = status;
+ resp.err = FALSE;
+ dbg("ussd_str = %s resp.type - %d resp.status - %d", ussd_str, resp.type, resp.status);
+
+ if (ussd_str) {
+ int len = strlen(ussd_str);
+ if (len < MAX_SS_USSD_LEN) {
+ memcpy(resp.str, ussd_str, len);
+ resp.str[len] = '\0';
+ } else {
+ memcpy(resp.str, ussd_str, MAX_SS_USSD_LEN);
+ resp.str[MAX_SS_USSD_LEN - 1] = '\0';
+ }
+ dbg("Response string: %s", resp.str);
+ } else {
+ dbg("USSD string is not present");
+ memset(resp.str, '\0', MAX_SS_USSD_LEN);
+ }
+ UssdResp = TRUE;
+ // Send response to TAPI
+ tcore_user_request_send_response(ur, TRESP_SS_SEND_USSD, sizeof(struct tresp_ss_ussd), &resp);
+ } else {
+ err("User request is NULL");
+ }
+
+ dbg("Exit");
+ return;
+}
+
+static void _ss_ussd_notification(TcorePlugin *p, const char *ussd_str, enum telephony_ss_ussd_status status)
+{
+ CoreObject *core_obj = 0;
+ struct tnoti_ss_ussd noti;
+
+ dbg("function enter");
+ if (!p) {
+ dbg("[ error ] p : (NULL)");
+ return;
+ }
+ noti.status = status;
+ if (ussd_str) {
+ int len = strlen(ussd_str);
+ if (len < MAX_SS_USSD_LEN) {
+ memcpy(noti.str, ussd_str, len);
+ noti.str[len] = '\0';
+ } else {
+ memcpy(noti.str, ussd_str, MAX_SS_USSD_LEN);
+ noti.str[MAX_SS_USSD_LEN - 1] = '\0';
+ }
+ } else {
+ memset(noti.str, '\0', MAX_SS_USSD_LEN);
+ }
+ dbg("noti.str - %s", noti.str);
+
+ core_obj = tcore_plugin_ref_core_object(p, "ss");
+ tcore_server_send_notification(tcore_plugin_ref_server(p),
+ core_obj,
+ TNOTI_SS_USSD,
+ sizeof(struct tnoti_ss_ussd),
+ (void *) ¬i);
+}
+
+static gboolean on_notification_ss_ussd(CoreObject *o, const void *data, void *user_data)
+{
+ enum telephony_ss_ussd_status status;
+ UssdSession *ussd_session = 0;
+ char *ussd_str = 0, *cmd = 0;
+ TcorePlugin *plugin = 0;
+ int m = -1, dcs = 0;
+ char *ussdnoti = NULL, *str = NULL, *dcs_str = NULL;
+ GSList *tokens = NULL;
+ GSList *lines = NULL;
+ char *ussd_string = NULL;
+ unsigned int len;
+
+ plugin = tcore_object_ref_plugin(o);
+ ussd_session = tcore_ss_ussd_get_session(o);
+
+ dbg("function enter");
+ lines = (GSList *) data;
+ if (1 != g_slist_length(lines)) {
+ dbg("unsolicited msg but multiple line");
+ goto OUT;
+ }
+ cmd = (char *) (lines->data);
+ // parse ussd status
+ tokens = tcore_at_tok_new(cmd);
+
+ // parse <m>
+ ussdnoti = g_slist_nth_data(tokens, 0);
+ if (!ussdnoti) {
+ dbg("+CUSD<m> is missing from %CUSD Notification");
+ } else {
+ m = atoi(ussdnoti);
+ dbg("USSD status %d", m);
+ // parse [ <str>, <dcs>]
+ ussd_string = g_slist_nth_data(tokens, 1);
+ if (ussd_string) {
+ /* Strike off starting & ending quotes. 1 extra character for NULL termination */
+ str = malloc(strlen(ussd_string) - 1);
+ dbg("length of Ussd Stirng - %d", strlen(ussd_string));
+ if (str) {
+ memset(str, 0x00, strlen(ussd_string) - 1);
+ } else {
+ dbg("malloc failed")
+ return FALSE;
+ }
+ len = strlen(ussd_string) - 1;
+ ++ussd_string;
+ strncpy(str, ussd_string, len);
+
+ dbg("USSD String - %s len = %d", str, strlen(str));
+ }
+ if ((dcs_str = g_slist_nth_data(tokens, 2))) {
+ dcs = atoi(dcs_str);
+ dbg("USSD dcs %d", dcs);
+ }
+ }
+
+ switch (m) {
+ case 0:
+ status = SS_USSD_NO_ACTION_REQUIRE;
+ break;
+
+ case 1:
+ status = SS_USSD_ACTION_REQUIRE;
+ break;
+
+ case 2:
+ status = SS_USSD_TERMINATED_BY_NET;
+ break;
+
+ case 3:
+ status = SS_USSD_OTHER_CLIENT;
+ break;
+
+ case 4:
+ status = SS_USSD_NOT_SUPPORT;
+ break;
+
+ case 5:
+ status = SS_USSD_TIME_OUT;
+ break;
+
+ default:
+ dbg("unsupported m : %d", m);
+ status = SS_USSD_MAX;
+ break;
+ }
+
+ switch (tcore_util_get_cbs_coding_scheme(dcs)) {
+ case TCORE_DCS_TYPE_7_BIT:
+ case TCORE_DCS_TYPE_UNSPECIFIED:
+ // ussd_str = tcore_util_unpack_gsm7bit(str, strlen(str));
+ // break;
+
+ case TCORE_DCS_TYPE_UCS2:
+ case TCORE_DCS_TYPE_8_BIT:
+ if ((str != NULL) && (strlen(str) > 0)) {
+ ussd_str = g_new0(char, strlen(str) + 1);
+ if (ussd_str != NULL) {
+ memcpy(ussd_str, str, strlen(str));
+ ussd_str[strlen(str)] = '\0';
+ }
+ }
+ break;
+
+ default:
+ dbg("[ error ] unknown dcs type. ussd_session : %x", ussd_session);
+ if (ussd_session) {
+ UserRequest *ur = 0;
+ enum telephony_ss_ussd_type type;
+
+ tcore_ss_ussd_get_session_data(ussd_session, (void **) &ur);
+ if (!ur) {
+ dbg("[ error ] ur : (0)");
+ return FALSE;
+ }
+
+ type = (enum telephony_ss_ussd_type) tcore_ss_ussd_get_session_type(ussd_session);
+ dbg("ussd type - %d", type);
+
+ _ss_ussd_response(ur, ussd_str, type, status);
+ }
+ return FALSE;
+ }
+
+ switch (status) {
+ case SS_USSD_NO_ACTION_REQUIRE:
+ case SS_USSD_ACTION_REQUIRE:
+ case SS_USSD_OTHER_CLIENT:
+ case SS_USSD_NOT_SUPPORT:
+ case SS_USSD_TIME_OUT:
+ {
+ if (ussd_session) {
+ UserRequest *ur = 0;
+ enum telephony_ss_ussd_type type;
+
+ tcore_ss_ussd_get_session_data(ussd_session, (void **) &ur);
+ if (!ur) {
+ dbg("[ error ] ur : (0)");
+ return FALSE;
+ }
+ type = (enum telephony_ss_ussd_type) tcore_ss_ussd_get_session_type(ussd_session);
+ dbg("ussd type - %d", type);
+ _ss_ussd_response(ur, (const char *) ussd_str, type, status);
+ if (ussd_str)
+ g_free(ussd_str);
+ } else {
+ tcore_ss_ussd_create_session(o, TCORE_SS_USSD_TYPE_NETWORK_INITIATED, 0, 0);
+ _ss_ussd_notification(plugin, (const char *) ussd_str, status);
+
+ if (ussd_str)
+ g_free(ussd_str);
+ }
+ }
+ break;
+
+ case SS_USSD_TERMINATED_BY_NET:
+ {
+ if (ussd_session) {
+ UserRequest *ur = 0;
+ tcore_ss_ussd_get_session_data(ussd_session, (void **) &ur);
+ if (ur) {
+ tcore_user_request_unref(ur);
+ }
+ tcore_ss_ussd_destroy_session(ussd_session);
+ }
+ }
+ break;
+
+ default:
+ break;
+ }
+
+OUT:
+ if (NULL != tokens)
+ tcore_at_tok_free(tokens);
+
+ if (NULL != str)
+ free(str);
+ dbg("Exit");
+ return TRUE;
+}
+static gboolean on_notification_ss_info(CoreObject *o, const void *data, void *user_data)
+{
+ TcorePlugin *plugin = 0;
+ CoreObject *co = 0;
+ char *cmd = 0, *number = 0, *pos;
+ int code1 = -1, code2 = -1, index = 0, ton = 0;
+ char *str_code1, *str_code2, *str_ton, *str_index;
+ GSList *tokens = NULL;
+ char *buf;
+ gboolean cssu = FALSE, cssi = FALSE;
+ GSList *lines = NULL;
char *resp = NULL;
- dbg("function enter");\r
-\r
- plugin = tcore_object_ref_plugin(o);\r
- co = tcore_plugin_ref_core_object(plugin, "call");\r
- if (!co) {\r
-\r
- dbg("[ error ] plugin_ref_core_object : call");\r
- return FALSE;\r
- }\r
-\r
- lines = (GSList*)data;\r
- if (1 != g_slist_length(lines)) {\r
- dbg("unsolicited msg but multiple line");\r
- goto OUT;\r
- }\r
-\r
- cmd = (char*)(lines->data);\r
- pos = strchr(cmd, ':');\r
- if(!pos){\r
- dbg("[ error ] not valid SS- notification ");\r
- return TRUE;\r
- }\r
- buf = calloc(pos - cmd + 2, 1);\r
- memcpy(buf, cmd, pos - cmd);\r
- dbg("buf is %s", buf);\r
-\r
- if(!strcmp(buf,"+CSSU")){\r
-\r
- dbg("SS - +CSSU indication");\r
- cssu = TRUE;\r
- }\r
- else if(!strcmp(buf,"+CSSI")) {\r
-\r
- dbg("SS - +CSSI indication");\r
- cssi = TRUE;\r
- }\r
- free(buf);\r
-\r
- //handle %CSSU notification\r
- if(cssu){\r
-\r
- tokens = tcore_at_tok_new(cmd);\r
- // parse <code2>\r
- str_code2 = g_slist_nth_data(tokens, 0);\r
- if(!str_code2) {\r
- dbg("Code2 is missing from %CSSU indiaction");\r
- }\r
- else {\r
-\r
- code2 = atoi(str_code2);\r
- //parse [ <index>, <number> <type>]\r
- if ((str_index = g_slist_nth_data(tokens, 1))) {\r
- index = atoi(str_index);\r
- }\r
-
- if ((resp = g_slist_nth_data(tokens, 2))) {
+ dbg("function enter");
+
+ plugin = tcore_object_ref_plugin(o);
+ co = tcore_plugin_ref_core_object(plugin, "call");
+ if (!co) {
+ dbg("[ error ] plugin_ref_core_object : call");
+ return FALSE;
+ }
+
+ lines = (GSList *) data;
+ if (1 != g_slist_length(lines)) {
+ dbg("unsolicited msg but multiple line");
+ goto OUT;
+ }
+
+ cmd = (char *) (lines->data);
+ pos = strchr(cmd, ':');
+ if (!pos) {
+ dbg("[ error ] not valid SS- notification ");
+ return TRUE;
+ }
+ buf = calloc(pos - cmd + 2, 1);
+ memcpy(buf, cmd, pos - cmd);
+ dbg("buf is %s", buf);
+
+ if (!strcmp(buf, "+CSSU")) {
+ dbg("SS - +CSSU indication");
+ cssu = TRUE;
+ } else if (!strcmp(buf, "+CSSI")) {
+ dbg("SS - +CSSI indication");
+ cssi = TRUE;
+ }
+ free(buf);
+
+ // handle %CSSU notification
+ if (cssu) {
+ tokens = tcore_at_tok_new(cmd);
+ // parse <code2>
+ str_code2 = g_slist_nth_data(tokens, 0);
+ if (!str_code2) {
+ dbg("Code2 is missing from %CSSU indiaction");
+ } else {
+ code2 = atoi(str_code2);
+ // parse [ <index>, <number> <type>]
+ if ((str_index = g_slist_nth_data(tokens, 1))) {
+ index = atoi(str_index);
+ }
+
+ if ((resp = g_slist_nth_data(tokens, 2))) {
// Strike off double quotes
number = util_removeQuotes(resp);
- str_ton = g_slist_nth_data(tokens, 3);\r
-\r
- if(str_ton) {\r
- ton = atoi(str_ton);\r
- }\r
- }\r
- }\r
-\r
- dbg("CSSU - code2 = %d index = %d number = %s type = %d", code2, index, number, ton);\r
- switch(code2) {\r
-\r
- case 0: //this is a forwarded call (MT call setup)\r
- tcore_call_information_mt_forwarded_call(co, number);\r
- break;\r
-\r
- case 2: //call has been put on hold (during a voice call)\r
- tcore_call_information_held(co, number);\r
- break;\r
-\r
- case 3: //call has been retrieved (during a voice call)\r
- tcore_call_information_active(co, number);\r
- break;\r
-\r
- case 4: //multiparty call entered (during a voice call)\r
- tcore_call_information_joined(co, number);\r
- break;\r
-\r
- case 5: //call on hold has been released\r
- tcore_call_information_released_on_hold(co, number);\r
- break;\r
-\r
- case 6: //forward check SS message received (can be received whenever)\r
- tcore_call_information_cf_check_ss_message(co, number);\r
- break;\r
-\r
- case 7: //call is being connected (alerting) with the remote party in alerting state in explicit call transfer operation (during a voice call)\r
- tcore_call_information_transfer_alert(co, number);\r
- break;\r
-\r
- case 8: //call has been connected with the other remote party in explicit call transfer operation (also number and subaddress parameters may be present) (during a voice call or MT call setup)\r
- tcore_call_information_transfered(co, number);\r
- break;\r
-\r
- case 9: //this is a deflected call (MT call setup):\r
- tcore_call_information_mt_deflected_call(co, number);\r
- break;\r
-\r
- default:\r
- dbg("CSSU - unsupported code2 : %d",code2);\r
- break;\r
- }\r
- }\r
- //handle %CSSI notification\r
-\r
- if(cssi) {\r
-\r
- tokens = tcore_at_tok_new(cmd);\r
- // parse <code1>\r
- str_code1 = g_slist_nth_data(tokens, 0);\r
- if(!str_code1){\r
- dbg("Code1 is missing from %CSSI indiaction");\r
- }\r
- else {\r
- code1 = atoi(str_code1);\r
- //parse [ <index> ]\r
- if ((str_index = g_slist_nth_data(tokens, 1))) {\r
- index = atoi(str_index);\r
- }\r
-\r
- }\r
-\r
- dbg("CSSI - code1 - %d index - %d ", code1, index);\r
-\r
- switch(code1) {\r
-\r
- case 0: //Unconditional CF is active\r
- tcore_call_information_mo_cfu(co);\r
- break;\r
-\r
- case 1: //some of the conditional call forwarding are active\r
- tcore_call_information_mo_cfc(co);\r
- break;\r
-\r
- case 2: // outgoing call is forwarded\r
- tcore_call_information_mo_forwarded(co);\r
- break;\r
-\r
- case 3: // this call is waiting\r
- tcore_call_information_mo_waiting(co);\r
- break;\r
-\r
- case 5: // outgoing call is barred\r
- tcore_call_information_mo_barred_outgoing(co);\r
- break;\r
-\r
- case 6: // incoming call is barred\r
- tcore_call_information_mo_barred_incoming(co);\r
- break;\r
-\r
- case 7: // CLIR suppression rejected\r
- tcore_call_information_mo_clir_suppression_reject(co);\r
- break;\r
-\r
- case 8: // outgoing call is deflected\r
- tcore_call_information_mo_deflected(co);\r
- break;\r
-\r
- default:\r
- dbg("unsupported cmd : %d",code1);\r
- break;\r
- }\r
- }\r
-OUT:\r
- if(NULL!=tokens)\r
- tcore_at_tok_free(tokens);\r
- if(NULL!=number)
- g_free(number);
- return TRUE;\r
-}\r
-\r
-static void on_confirmation_ss_message_send(TcorePending *p, gboolean result, void *user_data)\r
-{\r
- dbg("");\r
-\r
- if (result == FALSE) {\r
- // Fail\r
- dbg("FAIL");\r
- }\r
- else {\r
- dbg("SEND OK");\r
- }\r
-}\r
-\r
-static void on_response_ss_barring_set(TcorePending *p, int data_len, const void *data, void *user_data)\r
-{\r
-\r
- struct ss_confirm_info *info = 0;\r
- enum telephony_ss_class class;\r
- CoreObject* o = 0;\r
- UserRequest *ur;\r
- struct tresp_ss_general resp;\r
- UserRequest *ur_dup=0;\r
- GSList *tokens=NULL;\r
- const char *line;\r
- int err;\r
- const TcoreATResponse* response;\r
-\r
- dbg("function enter");\r
- response = data;\r
- o = tcore_pending_ref_core_object(p);\r
- ur = tcore_pending_ref_user_request(p);\r
-\r
- info = (struct ss_confirm_info*)user_data;\r
- class = info->class;\r
-\r
- if (response->success > 0){\r
- dbg("RESPONSE OK");\r
- resp.err = TCORE_RETURN_SUCCESS;\r
- }\r
- else {\r
-\r
- dbg("RESPONSE NOT OK");\r
- line = (const char*)response->final_response;\r
- tokens = tcore_at_tok_new(line);\r
-\r
- if (g_slist_length(tokens) < 1) {\r
-\r
- dbg("err cause not specified or string corrupted");\r
- resp.err = TCORE_RETURN_3GPP_ERROR;\r
- }\r
- else {\r
- err = atoi(g_slist_nth_data(tokens, 0));\r
- // TODO: CMEE error mapping is required.\r
- resp.err = TCORE_RETURN_3GPP_ERROR;\r
- }\r
- tcore_at_tok_free(tokens);\r
- }\r
-\r
- dbg("on_response_ss_barring_set - rsp.err : %d, ur : %x flavor_type = %d", resp.err, ur , info->flavor_type);\r
- dbg("[ check ] class : 0x%x", info->class);\r
-\r
- if (response->success > 0) {\r
-\r
- if (info->class == SS_CLASS_VOICE) {\r
-\r
- class = SS_CLASS_ALL_TELE_BEARER;\r
- }\r
-\r
- ur_dup = tcore_user_request_ref(ur);\r
-\r
- if (info->flavor_type == SS_BARR_MODE_AB || info->flavor_type == SS_BARR_MODE_AOB) {\r
- _ss_barring_get(o, ur_dup, class, SS_BARR_MODE_BAOC, info->resp);\r
- }\r
- else if (info->flavor_type == SS_BARR_MODE_AIB) {\r
- _ss_barring_get(o, ur_dup, class, SS_BARR_MODE_BAIC, info->resp);\r
- }\r
- else {\r
- _ss_barring_get(o, ur_dup, class, info->flavor_type, info->resp);\r
- }\r
- }\r
- else {\r
- if (ur) {\r
- tcore_user_request_send_response(ur, info->resp, sizeof(struct tresp_ss_general), &resp);\r
- }\r
- else {\r
- dbg("[ error ] ur is 0");\r
- }\r
- }\r
-}\r
-\r
-static void on_response_ss_barring_change_pwd(TcorePending *p, int data_len, const void *data, void *user_data)\r
-{\r
- const TcoreATResponse* response = data;\r
- struct ss_confirm_info *info = 0;\r
- UserRequest *ur;\r
- struct tresp_ss_general resp;\r
- int err;\r
- GSList *tokens=NULL;\r
- const char *line;\r
-\r
- dbg("function enter");\r
- ur = tcore_pending_ref_user_request(p);\r
- info = (struct ss_confirm_info*)user_data;\r
-\r
- if (response->success > 0){\r
- dbg("RESPONSE OK");\r
- resp.err = TCORE_RETURN_SUCCESS;\r
- }\r
- else {\r
- dbg("RESPONSE NOT OK");\r
-\r
- line = (const char*)response->final_response;\r
- tokens = tcore_at_tok_new(line);\r
-\r
- if (g_slist_length(tokens) < 1) {\r
-\r
- dbg("err cause not specified or string corrupted");\r
- resp.err = TCORE_RETURN_3GPP_ERROR;\r
- }\r
- else {\r
-\r
- err = atoi(g_slist_nth_data(tokens, 0));\r
- // TODO: CMEE error mapping is required.\r
- resp.err = TCORE_RETURN_3GPP_ERROR;\r
- }\r
- tcore_at_tok_free(tokens);\r
- }\r
-\r
- dbg("on_response_ss_barring_change_pwd: rsp.err : %d, usr : %x", resp.err, ur);\r
- if (ur) {\r
- tcore_user_request_send_response(ur, info->resp, sizeof(struct tresp_ss_general), &resp);\r
- }\r
- else {\r
- dbg("[ error ] ur is 0");\r
- }\r
-\r
- g_free(user_data);\r
-}\r
-\r
-static void on_response_ss_forwarding_set(TcorePending *p, int data_len, const void *data, void *user_data)\r
-{\r
- CoreObject* o = 0;\r
- UserRequest* ur = 0, *dup_ur=0;\r
- struct ss_confirm_info *info = 0;\r
- struct tresp_ss_general resp;\r
- GSList *tokens=NULL;\r
- const char *line;\r
- int err;\r
- const TcoreATResponse* response;\r
-\r
- dbg("function enter");\r
-\r
- response = data;\r
- o = tcore_pending_ref_core_object(p);\r
- ur = tcore_pending_ref_user_request(p);\r
-\r
- info = (struct ss_confirm_info*)user_data;\r
-\r
- if (response->success > 0) {\r
-\r
- dbg("RESPONSE OK");\r
- resp.err = TCORE_RETURN_SUCCESS;\r
- }\r
- else {\r
-\r
- dbg("RESPONSE NOT OK");\r
-\r
- line = (const char*)response->final_response;\r
- tokens = tcore_at_tok_new(line);\r
-\r
- if (g_slist_length(tokens) < 1) {\r
- dbg("err cause not specified or string corrupted");\r
- resp.err = TCORE_RETURN_3GPP_ERROR;\r
- }\r
- else {\r
- err = atoi(g_slist_nth_data(tokens, 0));\r
- /// TODO: CMEE error mapping is required.\r
- resp.err = TCORE_RETURN_3GPP_ERROR;\r
- }\r
-\r
- tcore_at_tok_free(tokens);\r
- }\r
-\r
- dbg("[ check ] class : 0x%x", info->class);\r
- dbg("[ check ] flavor_type : 0x%x", info->flavor_type);\r
-\r
- dbg("on_response_ss_forwarding_set - rsp.err : %d, ur : %x", resp.err, ur);\r
-\r
- if (response->success > 0) {\r
-\r
- if (info->flavor_type == SS_CF_MODE_CF_ALL ||\r
- info->flavor_type == SS_CF_MODE_CFC) {\r
-\r
- if (ur) {\r
-\r
- tcore_user_request_send_response(ur, info->resp, sizeof(struct tresp_ss_general), &resp);\r
- }\r
- else {\r
-\r
- dbg("[ error ] ur is 0");\r
- }\r
- }\r
- else {\r
- dup_ur = tcore_user_request_ref(ur);\r
- _ss_forwarding_get(o, dup_ur, info->class, info->flavor_type, info->resp);\r
- }\r
- }\r
- else {\r
-\r
- if(ur) {\r
- tcore_user_request_send_response(ur, info->resp, sizeof(struct tresp_ss_general), &resp);\r
- }\r
- else {\r
- dbg("[ error ] ur is 0");\r
- }\r
- }\r
- g_free(user_data);\r
-\r
-}\r
-\r
-static void on_response_ss_waiting_set(TcorePending *p, int data_len, const void *data, void *user_data)\r
-{\r
- CoreObject* core_obj = 0;\r
- UserRequest* ur = 0;\r
- UserRequest* ur_dup = 0;\r
- struct ss_confirm_info *info = 0;\r
- struct tresp_ss_general resp;\r
- GSList *tokens = NULL;\r
- const char *line;\r
- int err;\r
- const TcoreATResponse* response;\r
-\r
- dbg("function enter");\r
- response = data;\r
- core_obj = tcore_pending_ref_core_object(p);\r
- ur = tcore_pending_ref_user_request(p);\r
-\r
- info = (struct ss_confirm_info*)user_data;\r
-\r
- if(response->success > 0){\r
- dbg("RESPONSE OK");\r
- resp.err = TCORE_RETURN_SUCCESS;\r
- }\r
- else {\r
-\r
- dbg("RESPONSE NOT OK");\r
-\r
- line = (const char*)response->final_response;\r
- tokens = tcore_at_tok_new(line);\r
-\r
- if (g_slist_length(tokens) < 1) {\r
-\r
- dbg("err cause not specified or string corrupted");\r
- resp.err = TCORE_RETURN_3GPP_ERROR;\r
- }\r
- else {\r
-\r
- err = atoi(g_slist_nth_data(tokens, 0));\r
- /// TODO: CMEE error mapping is required.\r
- resp.err = TCORE_RETURN_3GPP_ERROR;\r
- }\r
- tcore_at_tok_free(tokens);\r
- }\r
-\r
- dbg("on_response_ss_waiting_set - rsp.err : %d, ur : %x, class : %d", resp.err, ur, info->class);\r
-\r
- if(resp.err == TCORE_RETURN_SUCCESS) {\r
-\r
- ur_dup = tcore_user_request_ref(ur);\r
- dbg("Get waiting call status");\r
- _ss_waiting_get(core_obj, ur_dup, info->class, info->resp);\r
- }\r
- else {\r
-\r
- if (ur) {\r
-\r
- tcore_user_request_send_response(ur, info->resp, sizeof(struct tresp_ss_general), &resp);\r
- }\r
- else {\r
-\r
- dbg("[ error ] ur is 0");\r
- }\r
- }\r
- g_free(user_data);\r
-}\r
-\r
-\r
-static void on_confirmation_ss_ussd(TcorePending *p, int data_len, const void *data, void *user_data)\r
-{\r
- CoreObject* core_obj = 0;\r
- struct ss_confirm_info *info = 0;\r
- struct tresp_ss_ussd resp;\r
- UserRequest* ur = NULL , *ussd_ur= NULL;\r
- GSList *tokens = NULL;\r
- const char *line;\r
- int err;\r
- UssdSession *ussd_s = NULL;\r
- enum tcore_ss_ussd_type type = TCORE_SS_USSD_TYPE_MAX;\r
- const TcoreATResponse* response;\r
-\r
- dbg("function enter");\r
- response = data;\r
- ur = tcore_pending_ref_user_request(p);\r
- info = (struct ss_confirm_info*)user_data;\r
-\r
- memset(resp.str, 0x00, MAX_SS_USSD_LEN);\r
-\r
- core_obj = tcore_pending_ref_core_object(p);\r
- ussd_s = tcore_ss_ussd_get_session(core_obj);\r
-\r
- if(ussd_s)\r
- type = tcore_ss_ussd_get_session_type(ussd_s);\r
- else\r
- dbg("[ error ] ussd_s : (0)");\r
-\r
- resp.type = (enum telephony_ss_ussd_type)type;\r
- resp.status = SS_USSD_MAX; //hardcoded value.\r
-\r
- if(response->success > 0) {\r
-\r
- dbg("RESPONSE OK");\r
- resp.err = TCORE_RETURN_SUCCESS;\r
- }\r
- else {\r
-\r
- dbg("RESPONSE NOT OK");\r
-\r
- line = (const char*)response->final_response;\r
- tokens = tcore_at_tok_new(line);\r
-\r
- if (g_slist_length(tokens) < 1) {\r
-\r
- dbg("err cause not specified or string corrupted");\r
- resp.err = TCORE_RETURN_3GPP_ERROR;\r
- }\r
- else {\r
-\r
- err = atoi(g_slist_nth_data(tokens, 0));\r
- // TODO: CMEE error mapping is required.\r
- resp.err = TCORE_RETURN_3GPP_ERROR;\r
- }\r
- tcore_at_tok_free(tokens);\r
- }\r
-\r
- dbg("on_confirmation_ss_ussd - rsp.err : %d, ur : %x", resp.err, ur);\r
-\r
- if(response->success > 0) {\r
-\r
- if(type == TCORE_SS_USSD_TYPE_USER_INITIATED) {\r
- dbg("ussd type %d",resp.type);\r
-\r
- if(ussd_s) {\r
- tcore_ss_ussd_get_session_data(ussd_s, (void**)&ussd_ur);\r
- if(ussd_ur)\r
- tcore_user_request_free(ussd_ur);\r
- }\r
- }\r
- }\r
-\r
- if(ussd_s)\r
- tcore_ss_ussd_destroy_session(ussd_s);\r
-\r
- if(ur) {\r
-\r
- if(UssdResp == FALSE){ // to avoid sending multiple response to application.\r
- tcore_user_request_send_response(ur, info->resp, sizeof(struct tresp_ss_ussd), &resp);\r
- }\r
- UssdResp = FALSE;\r
- }\r
- else\r
- dbg("[ error ] ur : (0)");\r
-\r
- g_free(user_data);\r
-\r
-}\r
-\r
-static void on_response_ss_barring_get(TcorePending *p, int data_len, const void *data, void *user_data)\r
-{\r
-\r
- UserRequest* ur = 0;\r
- int status = 0, classx = 0, err = 0;\r
- GSList *respdata;\r
- struct ss_confirm_info* info = 0;\r
- struct tresp_ss_barring resp;\r
- int countRecords = 0, countValidRecords = 0;\r
- GSList *tokens = NULL;\r
- const char *line;\r
- char *classx_str;\r
- char *stat = NULL;\r
- const TcoreATResponse *response;\r
-\r
- dbg("function enter");\r
-\r
- response = data;\r
- ur = tcore_pending_ref_user_request(p);\r
- info = (struct ss_confirm_info*)user_data;\r
-\r
- if(response->lines) {\r
- respdata = (GSList *)response->lines;\r
- countRecords = g_slist_length(respdata);\r
- dbg("total records : %d",countRecords);\r
-\r
- }\r
- else {\r
-\r
- countRecords = 0;\r
- dbg("no active status - return to user")\r
- }\r
- resp.record_num = countRecords;\r
-\r
- if(resp.record_num > 0) {\r
-\r
- resp.record = g_new0(struct barring_info, resp.record_num);\r
- for (countValidRecords = 0; respdata != NULL ; respdata = respdata->next) {\r
-\r
- line = (const char*)(respdata->data);\r
- tokens = tcore_at_tok_new(line);\r
-\r
- // parse <status>\r
- stat = g_slist_nth_data(tokens, 0);\r
- if(!stat) {\r
-\r
- dbg("Stat is missing");\r
- goto error;\r
- }\r
-\r
- status = atoi(stat);\r
- if(status == 1) {\r
-\r
- resp.record[countValidRecords].status = SS_STATUS_ACTIVATE;\r
- }\r
- else {\r
-\r
- resp.record[countValidRecords].status = SS_STATUS_DEACTIVATE;\r
- }\r
- dbg("call barring status - %d",status);\r
-\r
- //Parse <class>\r
- classx_str = g_slist_nth_data(tokens, 1);\r
-\r
- if (!classx_str) {\r
-\r
- dbg("class error. classx not exist - set to requested one : %d", info->class);\r
- switch(info->class) {\r
-\r
- case SS_CLASS_ALL_TELE:\r
- classx = 7;\r
- break;\r
- case SS_CLASS_VOICE:\r
- classx = 1;\r
- break;\r
- case SS_CLASS_ALL_DATA_TELE:\r
- classx =2;\r
- break;\r
- case SS_CLASS_FAX:\r
- classx = 4;\r
- break;\r
- case SS_CLASS_SMS:\r
- classx = 8;\r
- break;\r
- case SS_CLASS_ALL_CS_SYNC:\r
- classx = 16;\r
- break;\r
-\r
- default:\r
- classx =7;\r
- dbg("unsupported class %d. set to default : 7", info->class);\r
- break;\r
- }\r
- }\r
- else {\r
- classx = atoi(classx_str);\r
- dbg("call barring classx - %d",classx);\r
- }\r
-\r
- switch(classx) {\r
-\r
- case 1:\r
- resp.record[countValidRecords].class = SS_CLASS_VOICE;\r
- break;\r
- case 2:\r
- resp.record[countValidRecords].class = SS_CLASS_ALL_DATA_TELE;\r
- break;\r
- case 4:\r
- resp.record[countValidRecords].class = SS_CLASS_FAX;\r
- break;\r
- case 7:\r
- resp.record[countValidRecords].class = SS_CLASS_ALL_TELE;\r
- break;\r
- case 8:\r
- resp.record[countValidRecords].class = SS_CLASS_SMS;\r
- break;\r
- case 16:\r
- resp.record[countValidRecords].class = SS_CLASS_ALL_CS_SYNC;\r
- break;\r
- case 32:\r
- resp.record[countValidRecords].class = SS_CLASS_ALL_CS_ASYNC;\r
- break;\r
- default:\r
- dbg("unspoorted class : [%d]\n", classx);\r
- goto error;\r
- break;\r
- }\r
- resp.record[countValidRecords].mode = (enum telephony_ss_barring_mode)(info->flavor_type);\r
- countValidRecords++;\r
- tcore_at_tok_free(tokens);\r
- continue;\r
-\r
- error:\r
- dbg("invalid field found. coutinue");\r
- tcore_at_tok_free(tokens);\r
- continue;\r
- }\r
-\r
- dbg("valid count :%d",countValidRecords);\r
- resp.record_num = countValidRecords;\r
- resp.err = TCORE_RETURN_SUCCESS;\r
- }\r
- else {\r
-\r
- dbg("no active status - return to user")\r
- }\r
-\r
- if(response->success > 0) {\r
-\r
- dbg("RESPONSE OK");\r
- resp.err = TCORE_RETURN_SUCCESS;\r
- }\r
- else {\r
-\r
- dbg("RESPONSE NOT OK");\r
- resp.err = TCORE_RETURN_FAILURE;\r
-\r
- line = (const char*)response->final_response;\r
- tokens = tcore_at_tok_new(line);\r
-\r
- if (g_slist_length(tokens) < 1) {\r
-\r
- dbg("err cause not specified or string corrupted");\r
- resp.err = TCORE_RETURN_3GPP_ERROR;\r
- }\r
- else {\r
-\r
- err = atoi(g_slist_nth_data(tokens, 0));\r
- // TODO: CMEE error mapping is required.\r
- resp.err = TCORE_RETURN_3GPP_ERROR;\r
- }\r
- tcore_at_tok_free(tokens);\r
- }\r
-\r
- dbg("on_response_ss_barring_get- rsp.err : %d, ur : %x", resp.err, ur);\r
-\r
- if (ur)\r
- tcore_user_request_send_response(ur, info->resp, sizeof(struct tresp_ss_barring), &resp);\r
- else\r
- dbg("[ error ] ur is 0");\r
-\r
- if (resp.record) {\r
-\r
- g_free(resp.record);\r
- resp.record = NULL;\r
- }\r
-\r
- g_free(user_data);\r
-\r
-}\r
-\r
-static void on_response_ss_forwarding_get(TcorePending *p, int data_len, const void *data, void *user_data)\r
-{\r
- UserRequest* ur = 0;\r
- int classx = 0, err = 0, time = 0;\r
- char* num;\r
- struct ss_confirm_info* info = 0;\r
- struct tresp_ss_forwarding resp;\r
- int countRecords = 0, countValidRecords = 0;\r
-\r
- GSList *respdata = NULL ,*tokens = NULL ;\r
- const char *line;\r
- char *classx_str ,*status, *ton, *time_str;\r
- const TcoreATResponse *response;\r
-\r
- dbg("function enter");\r
- response = data;\r
-\r
- ur = tcore_pending_ref_user_request(p);\r
- info = (struct ss_confirm_info*)user_data;\r
- if(response->lines) {\r
-\r
- respdata = (GSList*)response->lines;\r
- countRecords = g_slist_length(respdata);\r
- dbg("total records : %d",countRecords);\r
-\r
- }\r
- else {\r
- countRecords = 0;\r
- dbg("no active status - return to user")\r
- }\r
- resp.record_num = countRecords;\r
-\r
- if (resp.record_num > 0) {\r
-\r
- resp.record = g_new0(struct forwarding_info, resp.record_num);\r
-\r
- for (countValidRecords = 0; respdata != NULL ; respdata = respdata->next) {\r
-\r
- line = (const char*)(respdata->data);\r
- tokens = tcore_at_tok_new(line);\r
-\r
- // parse <status>\r
- status = g_slist_nth_data(tokens, 0);\r
- if(!status) {\r
-\r
- dbg("start line error. skip this line");\r
- goto error;\r
- }\r
- else {\r
-\r
- if(atoi(status)== 1) {\r
- resp.record[countValidRecords].status = SS_STATUS_ACTIVATE;\r
- }\r
- else {\r
- resp.record[countValidRecords].status = SS_STATUS_DEACTIVATE;\r
- }\r
- }\r
-\r
- //Parse <class>\r
- classx_str = g_slist_nth_data(tokens, 1);\r
- if (!classx_str) {\r
- dbg("class error. skip this line");\r
- goto error;\r
- }\r
- else {\r
-\r
- switch(atoi(classx_str)) {\r
- case 1:\r
- resp.record[countValidRecords].class = SS_CLASS_VOICE;\r
- break;\r
- case 2:\r
- resp.record[countValidRecords].class = SS_CLASS_ALL_DATA_TELE;\r
- break;\r
- case 4:\r
- resp.record[countValidRecords].class = SS_CLASS_FAX;\r
- break;\r
- case 7:\r
- resp.record[countValidRecords].class = SS_CLASS_ALL_TELE;\r
- break;\r
- case 8:\r
- resp.record[countValidRecords].class = SS_CLASS_SMS;\r
- break;\r
- case 16:\r
- resp.record[countValidRecords].class = SS_CLASS_ALL_CS_SYNC;\r
- break;\r
- case 32:\r
- resp.record[countValidRecords].class = SS_CLASS_ALL_CS_ASYNC;\r
- break;\r
- default:\r
- dbg("unspoorted class : [%d]\n", classx);\r
- goto error;\r
- break;\r
- }\r
- }\r
-\r
- //parse <numer> <type>\r
- num = g_slist_nth_data(tokens, 2);\r
- if (num) {\r
-\r
- dbg("number - %s", num);\r
- memcpy((resp.record[countValidRecords].number), num, strlen(num));\r
- resp.record[countValidRecords].number_present = TRUE;\r
-\r
- ton = g_slist_nth_data(tokens, 3);\r
- if(ton) {\r
- resp.record[countValidRecords].number_type = atoi(ton);\r
- dbg("number type - %d", resp.record[countValidRecords].number_type);\r
- }\r
- }\r
-\r
- //skip <subaddr> <satype>\r
- //parse <time>\r
- time_str = g_slist_nth_data(tokens, 6);\r
- if(time_str) {\r
-\r
- time = atoi(time_str);\r
- resp.record[countValidRecords].time = (enum telephony_ss_forwarding_no_reply_time)time;\r
- dbg("time - %d", time);\r
- }\r
-\r
- resp.record[countValidRecords].mode = (enum telephony_ss_forwarding_mode)(info->flavor_type);\r
- dbg("flavor_type - %d", (enum telephony_ss_forwarding_mode)(info->flavor_type));\r
-\r
- countValidRecords++;\r
- tcore_at_tok_free(tokens);\r
- continue;\r
- error:\r
- dbg("invalid field found. coutinue");\r
- tcore_at_tok_free(tokens);\r
- continue;\r
- }\r
- dbg("valid count :%d",countValidRecords);\r
- resp.record_num = countValidRecords;\r
- resp.err = TCORE_RETURN_SUCCESS;\r
- }\r
- else {\r
-\r
- dbg("no active status - return to user")\r
- }\r
-\r
- if(response->success > 0) {\r
-\r
- dbg("RESPONSE OK");\r
- resp.err = TCORE_RETURN_SUCCESS;\r
- }\r
- else {\r
-\r
- dbg("RESPONSE NOT OK");\r
- line = (const char*)response->final_response;\r
- tokens = tcore_at_tok_new(line);\r
-\r
- if (g_slist_length(tokens) < 1) {\r
-\r
- dbg("err cause not specified or string corrupted");\r
- resp.err = TCORE_RETURN_3GPP_ERROR;\r
- }\r
- else {\r
-\r
- err = atoi(g_slist_nth_data(tokens, 0));\r
- /* TODO: CMEE error mapping is required. */\r
- resp.err = TCORE_RETURN_3GPP_ERROR;\r
- }\r
- tcore_at_tok_free(tokens);\r
- }\r
-\r
- dbg("on_response_ss_forwarding_get- rsp.err : %d, ur : %x", resp.err, ur);\r
- if (ur)\r
- tcore_user_request_send_response(ur, info->resp, sizeof(struct tresp_ss_forwarding), &resp);\r
- else\r
- dbg("[ error ] ur is 0");\r
-\r
- if (resp.record) {\r
- g_free(resp.record);\r
- resp.record = NULL;\r
- }\r
- g_free(user_data);\r
-\r
-}\r
-\r
-static void on_response_ss_waiting_get(TcorePending *p, int data_len, const void *data, void *user_data)\r
-{\r
-\r
- UserRequest* ur = 0;\r
- GSList *respdata, *tokens = NULL;\r
- int classx = 0, err = 0;\r
- struct ss_confirm_info* info = 0;\r
- struct tresp_ss_waiting resp;\r
- int countRecords = 0, countValidRecords = 0;\r
- const char *line;\r
- char *classx_str ,*status;\r
- const TcoreATResponse *response;\r
-\r
- dbg("function enter")\r
- response = data;\r
- ur = tcore_pending_ref_user_request(p);\r
- info = (struct ss_confirm_info*)user_data;\r
-\r
- if(response->lines) {\r
-\r
- respdata = (GSList*)response->lines;\r
- countRecords = g_slist_length(respdata);\r
- dbg("total records : %d",countRecords);\r
-\r
- }\r
- else {\r
- countRecords = 0;\r
- dbg("no active status - return to user")\r
- }\r
- resp.record_num = countRecords;\r
-\r
- if (resp.record_num > 0) {\r
-\r
- resp.record = g_new0(struct waiting_info, resp.record_num);\r
-\r
- for (countValidRecords = 0; respdata != NULL ; respdata = respdata->next) {\r
-\r
- line = (const char*)(respdata->data);\r
- tokens = tcore_at_tok_new(line);\r
-\r
- // parse <status>\r
- status = g_slist_nth_data(tokens, 0);\r
- if(!status) {\r
- dbg("Missing stat in responce ");\r
- goto error;\r
- }\r
- else {\r
-\r
- if(atoi(status) == 1) {\r
- resp.record[countValidRecords].status = SS_STATUS_ACTIVATE;\r
- }\r
- else {\r
- resp.record[countValidRecords].status = SS_STATUS_DEACTIVATE;\r
- }\r
- }\r
- dbg("status = %d", resp.record[countValidRecords].status);\r
-\r
- //Parse <class>\r
- classx_str = g_slist_nth_data(tokens, 1);\r
- if (!classx_str) {\r
- dbg("error - class is missing");\r
- goto error;\r
- }\r
- else\r
- {\r
- switch(atoi(classx_str)) {\r
- case 1:\r
- resp.record[countValidRecords].class = SS_CLASS_VOICE;\r
- break;\r
- case 2:\r
- resp.record[countValidRecords].class = SS_CLASS_ALL_DATA_TELE;\r
- break;\r
- case 4:\r
- resp.record[countValidRecords].class = SS_CLASS_FAX;\r
- break;\r
- case 7:\r
- resp.record[countValidRecords].class = SS_CLASS_ALL_TELE;\r
- break;\r
- case 8:\r
- resp.record[countValidRecords].class = SS_CLASS_SMS;\r
- break;\r
- case 16:\r
- resp.record[countValidRecords].class = SS_CLASS_ALL_CS_SYNC;\r
- break;\r
- case 32:\r
- resp.record[countValidRecords].class = SS_CLASS_ALL_CS_ASYNC;\r
- break;\r
- default:\r
- dbg("unspoorted class : [%d]\n", classx);\r
- goto error;\r
- break;\r
- }\r
- dbg("class info %d",resp.record[countValidRecords].class);\r
- }\r
-\r
- countValidRecords++;\r
- tcore_at_tok_free(tokens);\r
- continue;\r
- error:\r
- dbg("invalid field found. coutinue");\r
- tcore_at_tok_free(tokens);\r
- continue;\r
- }\r
-\r
- dbg("valid count :%d",countValidRecords);\r
- resp.record_num = countValidRecords;\r
- resp.err = TCORE_RETURN_SUCCESS;\r
- }\r
- else {\r
- dbg("no active status - return to user")\r
- }\r
-\r
- if(response->success > 0) {\r
- dbg("RESPONSE OK");\r
- resp.err = TCORE_RETURN_SUCCESS;\r
- }\r
- else {\r
-\r
- dbg("RESPONSE NOT OK");\r
- line = (const char*)response->final_response;\r
- tokens = tcore_at_tok_new(line);\r
-\r
- if (g_slist_length(tokens) < 1) {\r
-\r
- dbg("err cause not specified or string corrupted");\r
- resp.err = TCORE_RETURN_3GPP_ERROR;\r
- }\r
- else {\r
-\r
- err = atoi(g_slist_nth_data(tokens, 0));\r
- // TODO: CMEE error mapping is required.\r
- resp.err = TCORE_RETURN_3GPP_ERROR;\r
- }\r
- tcore_at_tok_free(tokens);\r
- }\r
-\r
- dbg("on_response_ss_waiting_get - rsp.err : %d, ur : %x", resp.err, ur);\r
- if (ur)\r
- tcore_user_request_send_response(ur, info->resp, sizeof(struct tresp_ss_waiting), &resp);\r
- else\r
- dbg("[ error ] ur is 0");\r
-\r
- if (resp.record) {\r
- g_free(resp.record);\r
- resp.record = NULL;\r
- }\r
- g_free(user_data);\r
-}\r
-\r
-\r
-static void on_response_ss_cli_get(TcorePending *p, int data_len, const void *data, void *user_data)\r
-{\r
- UserRequest* ur = 0;\r
- struct tresp_ss_cli resp;\r
- enum telephony_ss_cli_type *p_type = NULL;\r
- char *line = NULL, *status;\r
- int err = FALSE;\r
- int cli_adj,stat ;\r
- GSList *tokens = NULL ;\r
- const TcoreATResponse *response;\r
-\r
- dbg("function enter")\r
- response = data;\r
- ur = tcore_pending_ref_user_request(p);\r
- p_type = (enum telephony_ss_cli_type*)(user_data);\r
-\r
- if (response->success > 0) {\r
-\r
- line = (char*) (((GSList*)response->lines)->data);\r
- tokens = tcore_at_tok_new(line);\r
-\r
- if(*p_type == SS_CLI_TYPE_CLIR){\r
-\r
- //+CLIR: <n> <m>\r
- dbg("CLI type is CLIR")\r
- //parse <n>\r
- status = g_slist_nth_data(tokens, 0);\r
-\r
- if(!status) {\r
- dbg("Call line identification adjustment missing <n>");\r
- }\r
- else {\r
-\r
- cli_adj = atoi(status);\r
- dbg("CLIR response value of <n> - %d",cli_adj);\r
-\r
- if(cli_adj == 0) {\r
-\r
- //parse <m>\r
- status = g_slist_nth_data(tokens, 1);\r
- if(!status) {\r
- dbg("status is missing<m>");\r
- }\r
- stat = atoi(status);\r
- dbg("CLIR response value of <m> - %d",stat);\r
-\r
- if(stat == 1 || stat == 3) {\r
- resp.status = TRUE;\r
- }\r
- else {\r
- resp.status = FALSE;\r
- }\r
- }\r
- else if (cli_adj == 1) {\r
- resp.status = TRUE;\r
- }\r
- else {\r
- resp.status = FALSE;\r
- }\r
- dbg("resp.status - %d",resp.status);\r
- }\r
- tcore_at_tok_free(tokens);\r
- }\r
- else {\r
- //parse <n>\r
- status = g_slist_nth_data(tokens, 0);\r
- if(!status) {\r
- dbg("Stat is missing");\r
- }\r
- else {\r
- stat = atoi(status);\r
- if(stat == 1)\r
- resp.status = TRUE;\r
- else\r
- resp.status = FALSE ;\r
-\r
- dbg("resp.status - %d",resp.status);\r
- }\r
- tcore_at_tok_free(tokens);\r
- }\r
- }\r
-\r
- if (response->success > 0) {\r
- dbg("RESPONSE OK");\r
- resp.err = TCORE_RETURN_SUCCESS;\r
- }\r
-\r
- else {\r
- dbg("RESPONSE NOT OK");\r
-\r
- line = (char*)response->final_response;\r
- tokens = tcore_at_tok_new(line);\r
-\r
- if (g_slist_length(tokens) < 1) {\r
- dbg("err cause not specified or string corrupted");\r
- resp.err = TCORE_RETURN_3GPP_ERROR;\r
- }\r
- else {\r
- err = atoi(g_slist_nth_data(tokens, 0));\r
- // TODO: CMEE error mapping is required.\r
- resp.err = TCORE_RETURN_3GPP_ERROR;\r
- }\r
- tcore_at_tok_free(tokens);\r
- }\r
-\r
- resp.type = *p_type;\r
- dbg("check - resp.type = %d ", resp.type);\r
- if (ur)\r
- tcore_user_request_send_response(ur, TRESP_SS_CLI_GET_STATUS, sizeof(struct tresp_ss_cli), &resp);\r
- else\r
- dbg("[ error ] ur : (0)");\r
-\r
- g_free(user_data);\r
-}\r
-\r
-static struct tcore_ss_operations ss_ops = {\r
- .barring_activate = s_ss_barring_activate,\r
- .barring_deactivate = s_ss_barring_deactivate,\r
- .barring_change_password= s_ss_barring_change_password,\r
- .barring_get_status = s_ss_barring_get_status,\r
- .forwarding_activate = s_ss_forwarding_activate,\r
- .forwarding_deactivate = s_ss_forwarding_deactivate,\r
- .forwarding_register = s_ss_forwarding_register,\r
- .forwarding_deregister = s_ss_forwarding_deregister,\r
- .forwarding_get_status = s_ss_forwarding_get_status,\r
- .waiting_activate = s_ss_waiting_activate,\r
- .waiting_deactivate = s_ss_waiting_deactivate,\r
- .waiting_get_status = s_ss_waiting_get_status,\r
- .cli_activate = s_ss_cli_activate,\r
- .cli_deactivate = s_ss_cli_deactivate,\r
- .cli_get_status = s_ss_cli_get_status,\r
- .send_ussd = s_ss_send_ussd,\r
- .set_aoc = s_ss_set_aoc,\r
- .get_aoc = s_ss_get_aoc,\r
-};\r
-\r
-\r
-static TReturn _ss_barring_set(CoreObject *o, UserRequest *ur, enum telephony_ss_opcode op)\r
-{\r
- struct treq_ss_barring *barring = 0;\r
- struct ss_confirm_info *user_data = 0;\r
- char *cmd_str = NULL;\r
- TcoreHal* hal;\r
- TcorePending *pending = NULL;\r
- TcoreATRequest *req;\r
- char passwd[MAX_SS_BARRING_PASSWORD_LEN+1];\r
- int opco;\r
- int classx;\r
- char* facility = NULL;\r
- gboolean ret = FALSE;\r
-\r
- dbg("function enter");\r
- barring = (struct treq_ss_barring*)tcore_user_request_ref_data(ur, 0);\r
-\r
- switch(op) {\r
- case SS_OPCO_ACTIVATE:\r
- opco = 1;\r
- break;\r
- case SS_OPCO_DEACTIVATE:\r
- opco = 0;\r
- break;\r
- default:\r
- dbg("unsupported opco : %d", op);\r
- return TCORE_RETURN_FAILURE;\r
- }\r
- dbg("opco - %d",opco);\r
-\r
- switch(barring->mode){\r
- case SS_BARR_MODE_BAOC:\r
- facility = "AO";\r
- break;\r
- case SS_BARR_MODE_BOIC:\r
- facility = "OI";\r
- break;\r
- case SS_BARR_MODE_BOIC_NOT_HC:\r
- facility = "OX";\r
- break;\r
- case SS_BARR_MODE_BAIC:\r
- facility = "AI";\r
- break;\r
- case SS_BARR_MODE_BIC_ROAM:\r
- facility = "IR";\r
- break;\r
- case SS_BARR_MODE_AB:\r
- facility = "AB";\r
- break;\r
- case SS_BARR_MODE_AOB:\r
- facility = "AG";\r
- break;\r
- case SS_BARR_MODE_AIB:\r
- facility = "AC";\r
- break;\r
- case SS_BARR_MODE_BIC_NOT_SIM:\r
- // facility = "NS";\r
- default:\r
- dbg("unspported mode %d", barring->mode);\r
- return TCORE_RETURN_FAILURE;\r
- }\r
-\r
- dbg("facility - %s",facility);\r
-\r
- switch(barring->class) {\r
- case SS_CLASS_ALL_TELE:\r
- classx =7;\r
- break;\r
- case SS_CLASS_VOICE:\r
- classx =1;\r
- break;\r
- case SS_CLASS_ALL_DATA_TELE:\r
- classx =2;\r
- break;\r
- case SS_CLASS_FAX:\r
- classx =4;\r
- break;\r
- case SS_CLASS_SMS:\r
- classx = 8;\r
- break;\r
- case SS_CLASS_ALL_CS_SYNC:\r
- classx = 16;\r
- break;\r
-\r
- default:\r
- classx =7;\r
- dbg("unsupported class %d. set to default : 7", barring->class);\r
- break;\r
- }\r
-\r
- dbg("classx - %d",classx);\r
-\r
- // null-ended pwd handling added - unexpected 0x11 value observed in req string\r
- memcpy(passwd, barring->password, MAX_SS_BARRING_PASSWORD_LEN);\r
- passwd[MAX_SS_BARRING_PASSWORD_LEN]='\0';\r
- dbg("passwd - %s",passwd);\r
-\r
- hal = tcore_object_get_hal(o);\r
- pending = tcore_pending_new(o, 0);\r
-\r
- cmd_str = g_strdup_printf("AT+CLCK=\"%s\",%d,\"%s\",%d", facility, opco, passwd, classx);\r
- dbg("request command : %s", cmd_str);\r
-\r
- req = tcore_at_request_new(cmd_str, NULL, TCORE_AT_NO_RESULT);\r
- dbg("cmd : %s, prefix(if any) :%s, cmd_len : %d", req->cmd, req->prefix, strlen(req->cmd));\r
-\r
- tcore_pending_set_request_data(pending, 0, req);\r
-\r
- user_data = g_new0(struct ss_confirm_info, 1);\r
- if (op == SS_OPCO_ACTIVATE) {\r
- user_data->resp = TRESP_SS_BARRING_ACTIVATE;\r
-\r
- }\r
- else if (op == SS_OPCO_DEACTIVATE){\r
- user_data->resp = TRESP_SS_BARRING_DEACTIVATE;\r
-\r
- }\r
- else {\r
- dbg("[ error ] wrong ss opco (0x%x)", op);\r
- return TCORE_RETURN_FAILURE;\r
- }\r
- user_data->flavor_type = (int)(barring->mode);\r
- user_data->class = barring->class;\r
-\r
- ret = _ss_request_message(pending, o, ur, on_response_ss_barring_set, user_data);\r
- g_free(cmd_str);\r
-\r
- if (!ret) {\r
-\r
- dbg("AT request sent failed ")\r
- return TCORE_RETURN_FAILURE;\r
- }\r
- return TCORE_RETURN_SUCCESS;\r
-}\r
-\r
-static TReturn _ss_barring_get(CoreObject *o,\r
- UserRequest *ur,\r
- enum telephony_ss_class class,\r
- enum telephony_ss_barring_mode mode,\r
- enum tcore_response_command resp)\r
-\r
-{\r
- struct ss_confirm_info *user_data = 0;\r
- gboolean ret = FALSE;\r
- char* cmd_str = NULL;\r
- int opco, classx;\r
- char* facility = NULL;\r
- TcoreHal* hal;\r
- TcorePending *pending = NULL;\r
- TcoreATRequest *req;\r
-\r
- dbg("function enter");\r
-\r
- //query status - opco is fixed to 2\r
- opco = 2;\r
- //barring mode\r
- switch(mode){\r
-\r
- case SS_BARR_MODE_BAOC:\r
- facility = "AO";\r
- break;\r
- case SS_BARR_MODE_BOIC:\r
- facility = "OI";\r
- break;\r
- case SS_BARR_MODE_BOIC_NOT_HC:\r
- facility = "OX";\r
- break;\r
- case SS_BARR_MODE_BAIC:\r
- facility = "AI";\r
- break;\r
- case SS_BARR_MODE_BIC_ROAM:\r
- facility = "IR";\r
- break;\r
- case SS_BARR_MODE_AB:\r
- facility = "AB";\r
- break;\r
- case SS_BARR_MODE_AOB:\r
- facility = "AG";\r
- break;\r
- case SS_BARR_MODE_AIB:\r
- facility = "AC";\r
- break;\r
- case SS_BARR_MODE_BIC_NOT_SIM:\r
- default:\r
- dbg("unspported mode %d", mode);\r
- return TCORE_RETURN_FAILURE;\r
- }\r
-\r
- dbg("facility - %s", facility);\r
-\r
- switch(class) {\r
-\r
- case SS_CLASS_ALL_TELE:\r
- classx =7;\r
- break;\r
- case SS_CLASS_VOICE:\r
- classx =1;\r
- break;\r
- case SS_CLASS_ALL_DATA_TELE:\r
- classx =2;\r
- break;\r
- case SS_CLASS_FAX:\r
- classx =4;\r
- break;\r
- case SS_CLASS_SMS:\r
- classx = 8;\r
- break;\r
- case SS_CLASS_ALL_CS_SYNC:\r
- classx = 16;\r
- break;\r
-\r
- default:\r
- classx =7;\r
- dbg("unsupported class %d. set to default : 7", class);\r
- break;\r
- }\r
- dbg("class - %d", classx);\r
-\r
- if(classx ==7)\r
- cmd_str = g_strdup_printf("AT+CLCK=\"%s\",%d", facility, opco);\r
- else\r
- cmd_str = g_strdup_printf("AT+CLCK=\"%s\",%d,,%d", facility, opco,classx);\r
-\r
- dbg("request command : %s", cmd_str);\r
-\r
- hal = tcore_object_get_hal(o);\r
- pending = tcore_pending_new(o, 0);\r
- req = tcore_at_request_new(cmd_str, "+CLCK", TCORE_AT_MULTILINE);\r
- dbg("cmd : %s, prefix(if any) :%s, cmd_len : %d", req->cmd, req->prefix, strlen(req->cmd));\r
-\r
- tcore_pending_set_request_data(pending, 0, req);\r
-\r
- user_data = g_new0(struct ss_confirm_info, 1);\r
- user_data->resp = resp;\r
- user_data->flavor_type = (int)(mode);\r
- user_data->class = class;\r
-\r
- ret = _ss_request_message(pending, o, ur, on_response_ss_barring_get, user_data);\r
- g_free(cmd_str);\r
-\r
- if (!ret) {\r
- dbg("AT request sent failed ")\r
- return TCORE_RETURN_FAILURE;\r
- }\r
-\r
- return TCORE_RETURN_SUCCESS;\r
-}\r
-\r
-static TReturn s_ss_barring_activate(CoreObject *o, UserRequest *ur)\r
-{\r
- return _ss_barring_set(o, ur, SS_OPCO_ACTIVATE);\r
-}\r
-\r
-static TReturn s_ss_barring_deactivate(CoreObject *o, UserRequest *ur)\r
-{\r
- return _ss_barring_set(o, ur, SS_OPCO_DEACTIVATE);\r
-}\r
-\r
-static TReturn s_ss_barring_change_password(CoreObject *o, UserRequest *ur)\r
-{\r
- TcoreHal* hal;\r
- TcorePending *pending = NULL;\r
- TcoreATRequest *req;\r
- struct treq_ss_barring_change_password *barring = 0;\r
- struct ss_confirm_info *user_data = 0;\r
- char* cmd_str = NULL;\r
- gboolean ret = FALSE;\r
-\r
- dbg("function enter");\r
- barring = (struct treq_ss_barring_change_password*)tcore_user_request_ref_data(ur, 0);\r
-\r
- cmd_str = g_strdup_printf("AT+CPWD=\"%s\",\"%s\",\"%s\"", "AB", barring->password_old, barring->password_new);\r
- dbg("request command : %s", cmd_str);\r
-\r
- hal = tcore_object_get_hal(o);\r
- pending = tcore_pending_new(o, 0);\r
- req = tcore_at_request_new(cmd_str, NULL, TCORE_AT_NO_RESULT);\r
- dbg("cmd : %s, prefix(if any) :%s, cmd_len : %d", req->cmd, req->prefix, strlen(req->cmd));\r
-\r
- tcore_pending_set_request_data(pending, 0, req);\r
-\r
- user_data = g_new0(struct ss_confirm_info, 1);\r
- user_data->resp = TRESP_SS_BARRING_CHANGE_PASSWORD;\r
-\r
- ret = _ss_request_message(pending, o, ur, on_response_ss_barring_change_pwd, user_data);\r
- g_free(cmd_str);\r
- if (!ret) {\r
- dbg("AT request sent failed ")\r
- return TCORE_RETURN_FAILURE;\r
- }\r
- return TCORE_RETURN_SUCCESS;\r
-}\r
-\r
-static TReturn s_ss_barring_get_status(CoreObject *o, UserRequest *ur)\r
-{\r
- struct treq_ss_barring *barring = 0;\r
- barring = (struct treq_ss_barring*)tcore_user_request_ref_data(ur, 0);\r
-\r
- return _ss_barring_get(o, ur, barring->class, barring->mode, TRESP_SS_BARRING_GET_STATUS);\r
-}\r
-\r
-static TReturn _ss_forwarding_set(CoreObject *o, UserRequest *ur, enum telephony_ss_opcode op)\r
-{\r
- struct treq_ss_forwarding *forwarding = 0;\r
- struct ss_confirm_info *user_data = 0;\r
- gboolean ret = FALSE;\r
- int len = 0;\r
- char* cmd_str = NULL;\r
- char* tmp_str = NULL;\r
- int reason=0, mode = 0, num_type = 0, classx = 0,time = 0;\r
- gboolean valid_num = FALSE;\r
- TcoreHal* hal;\r
- TcorePending *pending = NULL;\r
- TcoreATRequest *req;\r
-\r
- dbg("_ss_forwarding_set with opco %d ", op);\r
-\r
- forwarding = (struct treq_ss_forwarding*) tcore_user_request_ref_data(ur, 0);\r
- switch(forwarding->mode) {\r
-\r
- case SS_CF_MODE_CFU:\r
- reason = 0;\r
- break;\r
- case SS_CF_MODE_CFB:\r
- reason = 1;\r
- break;\r
- case SS_CF_MODE_CFNRy:\r
- reason = 2;\r
- break;\r
- case SS_CF_MODE_CFNRc:\r
- reason = 3;\r
- break;\r
- case SS_CF_MODE_CF_ALL:\r
- reason = 4;\r
- break;\r
- case SS_CF_MODE_CFC:\r
- reason = 5;\r
- break;\r
-\r
- default:\r
- dbg("unsupported reason : %d");\r
- return TCORE_RETURN_FAILURE;\r
- break;\r
- }\r
-\r
- dbg("reason = %d", reason);\r
- switch(op){\r
- case SS_OPCO_DEACTIVATE:\r
- mode = 0;\r
- break;\r
- case SS_OPCO_ACTIVATE:\r
- mode = 1;\r
- break;\r
- case SS_OPCO_REG:\r
- mode = 3;\r
- break;\r
- case SS_OPCO_DEREG:\r
- mode = 4;\r
- break;\r
-\r
- default:\r
- dbg("unsupported opco : %d", op);\r
- return TCORE_RETURN_FAILURE;\r
- }\r
-\r
- dbg("mode = %d", mode);\r
-\r
- // class\r
- switch(forwarding->class) {\r
- case SS_CLASS_ALL_TELE:\r
- classx =7;\r
- break;\r
- case SS_CLASS_VOICE:\r
- classx =1;\r
- break;\r
- case SS_CLASS_ALL_DATA_TELE:\r
- classx =2;\r
- break;\r
- case SS_CLASS_FAX:\r
- classx =4;\r
- break;\r
- case SS_CLASS_SMS:\r
- classx = 8;\r
- break;\r
- case SS_CLASS_ALL_CS_SYNC:\r
- classx = 16;\r
- break;\r
-\r
- default:\r
- classx =7;\r
- dbg("unsupported class %d. set to default : 7", forwarding->class);\r
- break;\r
- }\r
- dbg("classx = %d", classx);\r
-\r
- //number\r
- len = strlen(forwarding->number);\r
- if (len > 0){\r
- valid_num = TRUE;\r
- if (forwarding->number[0] == '+')\r
- num_type = ((NUM_TYPE_INTERNATIONAL << 4)| NUM_PLAN_ISDN);\r
- else\r
- num_type = 0;\r
- }\r
- dbg("number = %s", forwarding->number);\r
-\r
- user_data = g_new0(struct ss_confirm_info, 1);\r
-\r
- switch (op) {\r
- case SS_OPCO_REG:\r
- user_data->resp = TRESP_SS_FORWARDING_REGISTER;\r
- break;\r
- case SS_OPCO_DEREG:\r
- user_data->resp = TRESP_SS_FORWARDING_DEREGISTER;\r
- break;\r
- case SS_OPCO_ACTIVATE:\r
- user_data->resp = TRESP_SS_FORWARDING_ACTIVATE;\r
- break;\r
- case SS_OPCO_DEACTIVATE:\r
- user_data->resp = TRESP_SS_FORWARDING_DEACTIVATE;\r
- break;\r
- default:\r
- dbg("[ error ] unknown op (0x%x)", op);\r
- break;\r
- }\r
-\r
- if(forwarding->number[0] == '+')\r
- num_type = 145;\r
- else\r
- num_type = 129;\r
-\r
- if(op == SS_OPCO_REG)\r
- tmp_str = g_strdup_printf("AT+CCFC=%d,%d,\"%s\",%d,%d", reason, mode, forwarding->number, num_type, classx);\r
- else// other opcode does not need num field\r
- tmp_str = g_strdup_printf("AT+CCFC=%d,%d,,,%d", reason, mode, classx);\r
-\r
- if(forwarding->mode == SS_CF_MODE_CFNRy) {\r
- //add time info to 'no reply' case\r
- time = (int)(forwarding->time);\r
- cmd_str = g_strdup_printf("%s,,,%d", tmp_str,time);\r
- }\r
- else {\r
- cmd_str = g_strdup_printf("%s", tmp_str);\r
- }\r
-\r
- dbg("request command : %s", cmd_str);\r
- hal = tcore_object_get_hal(o);\r
- pending = tcore_pending_new(o, 0);\r
- req = tcore_at_request_new(cmd_str, NULL, TCORE_AT_NO_RESULT);\r
- dbg("cmd : %s, prefix(if any) :%s, cmd_len : %d", req->cmd, req->prefix, strlen(req->cmd));\r
-\r
- tcore_pending_set_request_data(pending, 0, req);\r
-\r
- user_data->flavor_type = forwarding->mode;\r
- user_data->class = forwarding->class;\r
-\r
- ret = _ss_request_message(pending, o, ur, on_response_ss_forwarding_set, user_data);\r
-\r
- g_free(tmp_str);\r
- g_free(cmd_str);\r
-\r
- if (!ret) {\r
- dbg("AT request sent failed ")\r
- return TCORE_RETURN_FAILURE;\r
- }\r
-\r
- return TCORE_RETURN_SUCCESS;\r
-}\r
-\r
-static TReturn _ss_forwarding_get(CoreObject *o,\r
- UserRequest *ur,\r
- enum telephony_ss_class class,\r
- enum telephony_ss_forwarding_mode type,\r
- enum tcore_response_command resp)\r
-{\r
-\r
- struct ss_confirm_info *user_data = 0;\r
- gboolean ret = FALSE;\r
- char* cmd_str = NULL;\r
- int reason = 0, mode = 0, classx = 0;\r
- TcoreHal* hal;\r
- TcorePending *pending = NULL;\r
- TcoreATRequest *req;\r
-\r
- dbg("function enter");\r
-\r
- switch(type) {\r
- case SS_CF_MODE_CFU:\r
- reason = 0;\r
- break;\r
- case SS_CF_MODE_CFB:\r
- reason = 1;\r
- break;\r
- case SS_CF_MODE_CFNRy:\r
- reason = 2;\r
- break;\r
- case SS_CF_MODE_CFNRc:\r
- reason = 3;\r
- break;\r
- case SS_CF_MODE_CF_ALL:\r
- reason = 4;\r
- break;\r
- case SS_CF_MODE_CFC:\r
- reason = 5;\r
- break;\r
-\r
- default:\r
- dbg("unsupported reason : %d");\r
- break;\r
- }\r
- dbg("reason = %d", reason);\r
-\r
- switch(class) {\r
- case SS_CLASS_ALL_TELE:\r
- classx =7;\r
- break;\r
- case SS_CLASS_VOICE:\r
- classx =1;\r
- break;\r
- case SS_CLASS_ALL_DATA_TELE:\r
- classx =2;\r
- break;\r
- case SS_CLASS_FAX:\r
- classx =4;\r
- break;\r
- case SS_CLASS_SMS:\r
- classx = 8;\r
- break;\r
- case SS_CLASS_ALL_CS_SYNC:\r
- classx = 16;\r
- break;\r
- default:\r
- classx =7;\r
- dbg("unsupported class %d. set to default : 7", class);\r
- break;\r
- }\r
-\r
- dbg("classx = %d", classx);\r
-\r
- //query status - mode set to 2\r
- mode = 2;\r
- user_data = g_new0(struct ss_confirm_info, 1);\r
- user_data->resp = resp;\r
- user_data->class = class;\r
- user_data->flavor_type = type;\r
-\r
- if(classx ==7)\r
- cmd_str = g_strdup_printf("AT+CCFC=%d,%d", reason, mode);\r
- else\r
- cmd_str = g_strdup_printf("AT+CCFC=%d,%d,,,%d", reason, mode,classx);\r
-\r
- dbg("request command : %s", cmd_str);\r
-\r
- hal = tcore_object_get_hal(o);\r
- pending = tcore_pending_new(o, 0);\r
- req = tcore_at_request_new(cmd_str, "+CCFC", TCORE_AT_MULTILINE);\r
- dbg("cmd : %s, prefix(if any) :%s, cmd_len : %d", req->cmd, req->prefix, strlen(req->cmd));\r
-\r
- tcore_pending_set_request_data(pending, 0, req);\r
-\r
- ret = _ss_request_message(pending, o, ur, on_response_ss_forwarding_get, user_data);\r
- g_free(cmd_str);\r
-\r
- if (!ret) {\r
- dbg("AT request sent failed ")\r
- return TCORE_RETURN_FAILURE;\r
- }\r
-\r
- return TCORE_RETURN_SUCCESS;\r
-}\r
-\r
-static TReturn s_ss_forwarding_activate(CoreObject *o, UserRequest *ur)\r
-{\r
- return _ss_forwarding_set(o, ur, SS_OPCO_ACTIVATE);\r
-}\r
-\r
-static TReturn s_ss_forwarding_deactivate(CoreObject *o, UserRequest *ur)\r
-{\r
- return _ss_forwarding_set(o, ur, SS_OPCO_DEACTIVATE);\r
-}\r
-\r
-static TReturn s_ss_forwarding_register(CoreObject *o, UserRequest *ur)\r
-{\r
- return _ss_forwarding_set(o, ur, SS_OPCO_REG);\r
-}\r
-\r
-static TReturn s_ss_forwarding_deregister(CoreObject *o, UserRequest *ur)\r
-{\r
- return _ss_forwarding_set(o, ur, SS_OPCO_DEREG);\r
-}\r
-\r
-static TReturn s_ss_forwarding_get_status(CoreObject *o, UserRequest *ur)\r
-{\r
- struct treq_ss_forwarding *forwarding = 0;\r
- forwarding = (struct treq_ss_forwarding*)tcore_user_request_ref_data(ur, 0);\r
-\r
- return _ss_forwarding_get(o, ur, forwarding->class, forwarding->mode, TRESP_SS_FORWARDING_GET_STATUS);\r
-}\r
-\r
-\r
-static TReturn _ss_waiting_set(CoreObject *o, UserRequest *ur, enum telephony_ss_opcode opco)\r
-{\r
- struct treq_ss_waiting *waiting = 0;\r
- struct ss_confirm_info *user_data = 0;\r
- gboolean ret = FALSE;\r
- int mode = 0, classx = 0;\r
- char* cmd_str;\r
- TcoreHal* hal;\r
- TcorePending *pending = NULL;\r
- TcoreATRequest *req;\r
-\r
- dbg("function enter ");\r
- waiting = (struct treq_ss_waiting*) tcore_user_request_ref_data(ur, 0);\r
- user_data = g_new0(struct ss_confirm_info, 1);\r
-\r
- if(opco == SS_OPCO_ACTIVATE) {\r
- user_data->resp = TRESP_SS_WAITING_ACTIVATE;\r
- mode = 1;//enable\r
- }\r
- else if (opco == SS_OPCO_DEACTIVATE) {\r
- user_data->resp = TRESP_SS_WAITING_DEACTIVATE;\r
- mode =0; //disable\r
- }\r
- else\r
- dbg("[ error ] unknown ss mode (0x%x)", opco);\r
-\r
- switch(waiting->class) {\r
- case SS_CLASS_ALL_TELE:\r
- classx =7;\r
- break;\r
- case SS_CLASS_VOICE:\r
- classx =1;\r
- break;\r
- case SS_CLASS_ALL_DATA_TELE:\r
- classx =2;\r
- break;\r
- case SS_CLASS_FAX:\r
- classx =4;\r
- break;\r
- case SS_CLASS_SMS:\r
- classx = 8;\r
- break;\r
-\r
- default:\r
- classx =1;\r
- dbg("unsupported class %d. set to default : 1", waiting->class);\r
- break;\r
- }\r
- dbg("mode = %d classxx- %d", mode , classx);\r
-\r
- user_data->class = waiting->class;\r
- user_data->flavor_type = (int)opco;\r
-\r
- cmd_str = g_strdup_printf("AT+CCWA=1,%d,%d", mode, classx); //always enable +CCWA: unsolicited cmd\r
- dbg("request command : %s",cmd_str);\r
-\r
- hal = tcore_object_get_hal(o);\r
- pending = tcore_pending_new(o, 0);\r
- req = tcore_at_request_new(cmd_str, NULL, TCORE_AT_NO_RESULT);\r
- dbg("cmd : %s, prefix(if any) :%s, cmd_len : %d", req->cmd, req->prefix, strlen(req->cmd));\r
-\r
- tcore_pending_set_request_data(pending, 0, req);\r
-\r
- ret = _ss_request_message(pending, o, ur, on_response_ss_waiting_set, user_data);\r
- g_free(cmd_str);\r
- if (!ret) {\r
- dbg("AT request sent failed ")\r
- return TCORE_RETURN_FAILURE;\r
- }\r
- return TCORE_RETURN_SUCCESS;\r
-}\r
-\r
-static TReturn _ss_waiting_get(CoreObject *o,\r
- UserRequest *ur,\r
- enum telephony_ss_class class,\r
- enum tcore_response_command resp)\r
-\r
-{\r
-\r
- struct ss_confirm_info *user_data = 0;\r
- gboolean ret = FALSE;\r
- int classx; //mode,\r
- char* cmd_str;\r
- TcoreHal* hal;\r
- TcorePending *pending = NULL;\r
- TcoreATRequest *req;\r
-\r
- dbg("function enter")\r
- switch(class) {\r
- case SS_CLASS_ALL_TELE:\r
- classx = 7;\r
- break;\r
- case SS_CLASS_VOICE:\r
- classx = 1;\r
- break;\r
- case SS_CLASS_ALL_DATA_TELE:\r
- classx = 2;\r
- break;\r
- case SS_CLASS_FAX:\r
- classx = 4;\r
- break;\r
- case SS_CLASS_SMS:\r
- classx = 8;\r
- break;\r
-\r
- default:\r
- classx =7;\r
- dbg("unsupported class %d. set to default : 7", class);\r
- break;\r
- }\r
- dbg("classx - %d", classx);\r
-\r
- dbg("allocating user data");\r
- user_data = g_new0(struct ss_confirm_info, 1);\r
- user_data->resp = resp;\r
- user_data->class = class;\r
-\r
- cmd_str = g_strdup_printf("AT+CCWA=1,2,%d", classx); //always enable +CCWA: unsolicited cmd , mode is fixed to 2(query status)\r
- dbg("request cmd : %s", cmd_str);\r
-\r
- hal = tcore_object_get_hal(o);\r
- pending = tcore_pending_new(o, 0);\r
- req = tcore_at_request_new(cmd_str, "+CCWA", TCORE_AT_MULTILINE);\r
- dbg("cmd : %s, prefix(if any) :%s, cmd_len : %d", req->cmd, req->prefix, strlen(req->cmd));\r
-\r
- tcore_pending_set_request_data(pending, 0, req);\r
-\r
- ret = _ss_request_message(pending, o, ur, on_response_ss_waiting_get, user_data);\r
- g_free(cmd_str);\r
- if (!ret) {\r
- dbg("AT request sent failed ")\r
- return TCORE_RETURN_FAILURE;\r
- }\r
- return TCORE_RETURN_SUCCESS;\r
-}\r
-\r
-static TReturn s_ss_waiting_activate(CoreObject *o, UserRequest *ur)\r
-{\r
- return _ss_waiting_set(o, ur, SS_OPCO_ACTIVATE);\r
-}\r
-\r
-static TReturn s_ss_waiting_deactivate(CoreObject *o, UserRequest *ur)\r
-{\r
- return _ss_waiting_set(o, ur, SS_OPCO_DEACTIVATE);\r
-}\r
-\r
-static TReturn s_ss_waiting_get_status(CoreObject *o, UserRequest *ur)\r
-{\r
- struct treq_ss_waiting *waiting = 0;\r
- waiting = (struct treq_ss_waiting*)tcore_user_request_ref_data(ur, 0);\r
-\r
- return _ss_waiting_get(o, ur, waiting->class, TRESP_SS_WAITING_GET_STATUS);\r
-}\r
-\r
-static TReturn s_ss_cli_activate(CoreObject *o, UserRequest *ur)\r
-{\r
- return TCORE_RETURN_SUCCESS;\r
-}\r
-\r
-static TReturn s_ss_cli_deactivate(CoreObject *o, UserRequest *ur)\r
-{\r
- return TCORE_RETURN_SUCCESS;\r
-}\r
-\r
-static TReturn s_ss_cli_get_status(CoreObject *o, UserRequest *ur)\r
-{\r
-\r
- struct treq_ss_cli *cli = 0;\r
- gboolean ret = FALSE;\r
- char *cmd_prefix = NULL, *rsp_prefix = NULL, *cmd_str = NULL;\r
- enum telephony_ss_cli_type *user_data = 0;\r
- TcoreHal* hal;\r
- TcorePending *pending = NULL;\r
- TcoreATRequest *req;\r
-\r
- cli = (struct treq_ss_cli*)tcore_user_request_ref_data(ur, 0);\r
- switch(cli->type) {\r
- case SS_CLI_TYPE_CLIP:\r
- cmd_prefix = "+CLIP";\r
- rsp_prefix = "+CLIP";\r
- break;\r
-\r
- case SS_CLI_TYPE_CLIR:\r
- cmd_prefix = "+CLIR";\r
- rsp_prefix = "+CLIR";\r
- break;\r
-\r
- case SS_CLI_TYPE_COLP:\r
- cmd_prefix = "+COLP";\r
- rsp_prefix = "+COLP";\r
- break;\r
-\r
- case SS_CLI_TYPE_COLR:\r
- cmd_prefix = "+COLR";\r
- rsp_prefix = "+COLR";\r
- break;\r
-\r
- case SS_CLI_TYPE_CNAP:\r
- cmd_prefix = "+CNAP";\r
- rsp_prefix = "+CNAP";\r
- break;\r
-\r
- case SS_CLI_TYPE_CDIP:\r
- default:\r
- dbg("unsupported cli_type : %d", cli->type);\r
- return TCORE_RETURN_FAILURE;\r
- break;\r
- }\r
- dbg("cmd_prefix : %s",cmd_prefix);\r
-\r
- cmd_str = g_strdup_printf("AT%s?", cmd_prefix);\r
- dbg("request cmd : %s", cmd_str);\r
-\r
- user_data = g_new0(enum telephony_ss_cli_type, 1);\r
- *user_data = cli->type;\r
-\r
- hal = tcore_object_get_hal(o);\r
- pending = tcore_pending_new(o, 0);\r
-\r
- req = tcore_at_request_new(cmd_str, rsp_prefix, TCORE_AT_SINGLELINE);\r
- dbg("cmd : %s, prefix(if any) :%s, cmd_len : %d", req->cmd, req->prefix, strlen(req->cmd));\r
- tcore_pending_set_request_data(pending, 0, req);\r
-\r
- ret = _ss_request_message(pending, o, ur, on_response_ss_cli_get, user_data);\r
- g_free(cmd_str);\r
- if (!ret) {\r
- dbg("AT request sent failed ")\r
- return TCORE_RETURN_FAILURE;\r
- }\r
- return TCORE_RETURN_SUCCESS;\r
-}\r
-\r
-static TReturn s_ss_send_ussd(CoreObject *o, UserRequest *ur)\r
-{\r
- UssdSession *ussd_s = 0;\r
- struct treq_ss_ussd *ussd = 0;\r
- struct ss_confirm_info *user_data = 0;\r
- gboolean ret = FALSE;\r
- char* cmd_str;\r
- TcoreHal* hal;\r
- TcorePending *pending = NULL;\r
- TcoreATRequest *req;\r
-\r
- dbg("function enter");\r
- ussd = (struct treq_ss_ussd*)tcore_user_request_ref_data(ur, 0);\r
- cmd_str = g_strdup_printf("AT+CUSD=1,\"%s\",%d", ussd->str, 0x0f); //always enable +CUSD: unsolicited cmd. set to dcs to 0x0f. only supports HEX type\r
- dbg("request command : %s",cmd_str);\r
-\r
- user_data = g_new0(struct ss_confirm_info, 1);\r
- user_data->resp = TRESP_SS_SEND_USSD;\r
- ussd_s = tcore_ss_ussd_get_session(o);\r
- if(!ussd_s) {\r
- dbg("USSD session does not exist");\r
- tcore_ss_ussd_create_session(o, (enum tcore_ss_ussd_type)ussd->type, (void*)tcore_user_request_ref(ur), 0);\r
- }\r
- else {\r
-\r
- if(ussd->type == SS_USSD_TYPE_USER_INITIATED) {\r
-\r
- dbg("[ error ] ussd session is already exist");\r
- g_free(user_data);\r
- return TCORE_RETURN_FAILURE;\r
- }\r
-\r
- tcore_ss_ussd_set_session_type(ussd_s, (enum tcore_ss_ussd_type)ussd->type);\r
- }\r
-\r
- hal = tcore_object_get_hal(o);\r
- pending = tcore_pending_new(o, 0);\r
- req = tcore_at_request_new(cmd_str, NULL, TCORE_AT_NO_RESULT);\r
- dbg("cmd : %s, prefix(if any) :%s, cmd_len : %d", req->cmd, req->prefix, strlen(req->cmd));\r
-\r
- tcore_pending_set_request_data(pending, 0, req);\r
-\r
- ret = _ss_request_message(pending, o, ur, on_confirmation_ss_ussd, user_data);\r
- g_free(cmd_str);\r
-\r
- if (!ret) {\r
-\r
- dbg("AT request sent failed ")\r
- return TCORE_RETURN_FAILURE;\r
- }\r
- return TCORE_RETURN_SUCCESS;\r
-}\r
-\r
-static TReturn s_ss_set_aoc(CoreObject *o, UserRequest *ur)\r
-{\r
- dbg("[ error ] unsupported function");\r
- return TCORE_RETURN_SUCCESS;\r
-}\r
-\r
-static TReturn s_ss_get_aoc(CoreObject *o, UserRequest *ur)\r
-{\r
- dbg("[ error ] unsupported function");\r
- return TCORE_RETURN_SUCCESS;\r
-}\r
-\r
-\r
-static struct tcore_call_control_operations call_ops = {\r
- .answer_hold_and_accept = s_ss_manage_call_2_send,\r
- .answer_replace = s_ss_manage_call_1_send,\r
- .answer_reject = s_ss_manage_call_0_send,\r
- .end_specific = s_ss_manage_call_1x_send,\r
- .end_all_active = s_ss_manage_call_1_send,\r
- .end_all_held = s_ss_manage_call_0_send,\r
- .active = s_ss_manage_call_2_send,\r
- .hold = s_ss_manage_call_2_send,\r
- .swap = s_ss_manage_call_2_send,\r
- .join = s_ss_manage_call_3_send,\r
- .split = s_ss_manage_call_2x_send,\r
- .transfer = s_ss_manage_call_4_send,\r
- .deflect = s_ss_manage_call_4dn_send,\r
-};\r
-\r
-static TReturn s_ss_manage_call_send(CoreObject* o, UserRequest* ur, const char* cmd, ConfirmCallback cb, void* user_data)\r
-{\r
- TcorePending *pending = NULL;\r
- TcoreATRequest *req;\r
- gboolean ret = FALSE;\r
-\r
- pending = tcore_pending_new(o, 0);\r
- req = tcore_at_request_new(cmd, NULL, TCORE_AT_NO_RESULT);\r
- dbg("cmd : %s, prefix(if any) :%s, cmd_len : %d", req->cmd, req->prefix, strlen(req->cmd));\r
- tcore_pending_set_request_data(pending, 0, req);\r
-\r
- ret = _ss_request_message(pending, o, ur, (TcorePendingResponseCallback)cb, user_data);\r
- if (!ret) {\r
- dbg("AT request sent failed ")\r
- return TCORE_RETURN_FAILURE;\r
- }\r
- return TCORE_RETURN_SUCCESS;\r
-}\r
-\r
-static TReturn s_ss_manage_call_0_send(CoreObject* o, UserRequest* ur, ConfirmCallback cb, void* user_data)\r
-{\r
- char* cmd_str = NULL;\r
- gboolean ret = FALSE;\r
-\r
- dbg("function enter");\r
- cmd_str = g_strdup_printf("%s", "AT+CHLD=0");\r
- dbg("cmd : %s, prefix(if any) : %s, cmd_len : %d",cmd_str, "N/A", strlen(cmd_str));\r
-\r
- ret = s_ss_manage_call_send(o, ur, cmd_str, cb, user_data);\r
- g_free(cmd_str);\r
- return ret;\r
-}\r
-\r
-static TReturn s_ss_manage_call_1_send(CoreObject* o, UserRequest* ur, ConfirmCallback cb, void* user_data)\r
-{\r
- char* cmd_str = NULL;\r
- gboolean ret = FALSE;\r
-\r
- dbg("function enter");\r
- cmd_str = g_strdup_printf("%s", "AT+CHLD=1");\r
- dbg("cmd : %s, prefix(if any) : %s, cmd_len : %d",cmd_str, "N/A", strlen(cmd_str));\r
-\r
- ret = s_ss_manage_call_send(o, ur, cmd_str, cb, user_data);\r
- g_free(cmd_str);\r
- return ret;\r
-}\r
-\r
-static TReturn s_ss_manage_call_1x_send(CoreObject* o, UserRequest* ur, const int id, ConfirmCallback cb, void* user_data)\r
-{\r
- char* cmd_str = NULL;\r
- gboolean ret = FALSE;\r
-\r
- dbg("function enter");\r
- cmd_str = g_strdup_printf("%s%d", "AT+CHLD=1", id);\r
- dbg("cmd : %s, prefix(if any) : %s, cmd_len : %d",cmd_str, "N/A", strlen(cmd_str));\r
-\r
- ret = s_ss_manage_call_send(o, ur, cmd_str, cb, user_data);\r
- g_free(cmd_str);\r
- return ret;\r
-}\r
-\r
-static TReturn s_ss_manage_call_2_send(CoreObject* o, UserRequest* ur, ConfirmCallback cb, void* user_data)\r
-{\r
- char* cmd_str = NULL;\r
- gboolean ret = FALSE;\r
-\r
- dbg("function enter");\r
- cmd_str = g_strdup_printf("%s", "AT+CHLD=2");\r
- dbg("cmd : %s, prefix(if any) : %s, cmd_len : %d",cmd_str, "N/A", strlen(cmd_str));\r
-\r
- ret = s_ss_manage_call_send(o, ur, cmd_str, cb, user_data);\r
- g_free(cmd_str);\r
- return ret;\r
-\r
-}\r
-\r
-static TReturn s_ss_manage_call_2x_send(CoreObject* o, UserRequest* ur, const int id, ConfirmCallback cb, void* user_data)\r
-{\r
- char* cmd_str = NULL;\r
- gboolean ret = FALSE;\r
-\r
- dbg("function enter");\r
- cmd_str = g_strdup_printf("%s%d", "AT+CHLD=2", id);\r
- dbg("cmd : %s, prefix(if any) : %s, cmd_len : %d",cmd_str, "N/A", strlen(cmd_str));\r
-\r
- ret = s_ss_manage_call_send(o, ur, cmd_str, cb, user_data);\r
- g_free(cmd_str);\r
- return ret;\r
-}\r
-\r
-static TReturn s_ss_manage_call_3_send(CoreObject* o, UserRequest* ur, ConfirmCallback cb, void* user_data)\r
-{\r
- char* cmd_str = NULL;\r
- gboolean ret = FALSE;\r
-\r
- dbg("function enter");\r
- cmd_str = g_strdup_printf("%s", "AT+CHLD=3");\r
-\r
- ret = s_ss_manage_call_send(o, ur, cmd_str, cb, user_data);\r
- g_free(cmd_str);\r
- return ret;\r
-}\r
-\r
-\r
-static TReturn s_ss_manage_call_4_send(CoreObject* o, UserRequest* ur, ConfirmCallback cb, void* user_data)\r
-{\r
- char* cmd_str = NULL;\r
- gboolean ret = FALSE;\r
-\r
- dbg("function enter");\r
- cmd_str = g_strdup_printf("%s", "AT+CHLD=4");\r
-\r
- ret = s_ss_manage_call_send(o, ur, cmd_str, cb, user_data);\r
- g_free(cmd_str);\r
- return ret;\r
-}\r
-\r
-static TReturn s_ss_manage_call_4dn_send(CoreObject* o, UserRequest* ur, const char* number, ConfirmCallback cb, void* user_data)\r
-{\r
-\r
- char* cmd_str = NULL;\r
- gboolean ret = FALSE;\r
-\r
- dbg("function enter");\r
- cmd_str = g_strdup_printf("%s%s", "AT+CHLD=4", number);\r
-\r
- ret = s_ss_manage_call_send(o, ur, cmd_str, cb, user_data);\r
- g_free(cmd_str);\r
-\r
- return ret;\r
-}\r
-\r
-gboolean s_ss_init(TcorePlugin *p, TcoreHal *h)\r
-{\r
- CoreObject *so = 0, *co = 0;\r
- struct property_call_info *data = 0;\r
-\r
- so = tcore_ss_new(p, "ss", &ss_ops, h);\r
- if (!so) {\r
- dbg("[ error ] ss_new()");\r
- return FALSE;\r
- }\r
-\r
- co = tcore_plugin_ref_core_object(p, "call");\r
- if (!co) {\r
- dbg("[ error ] plugin_ref_core_object");\r
- return FALSE;\r
- }\r
-\r
- tcore_call_control_set_operations(co, &call_ops);\r
-\r
- tcore_object_add_callback(so, "+CSSU", on_notification_ss_info, 0);\r
- tcore_object_add_callback(so, "+CSSI", on_notification_ss_info, 0);\r
- tcore_object_add_callback(so, "+CUSD", on_notification_ss_ussd, 0);\r
-\r
- data = calloc(sizeof(struct property_call_info *), 1);\r
- tcore_plugin_link_property(p, "SS", data);\r
-\r
- return TRUE;\r
-}\r
-\r
-void s_ss_exit(TcorePlugin *p)\r
-{\r
- CoreObject *o;\r
- struct property_network_info *data;\r
-\r
- o = tcore_plugin_ref_core_object(p, "ss");\r
-\r
- data = tcore_plugin_ref_property(p, "SS");\r
- if (data)\r
- free(data);\r
-\r
- tcore_ss_free(o);\r
-}\r
+ str_ton = g_slist_nth_data(tokens, 3);
+
+ if (str_ton) {
+ ton = atoi(str_ton);
+ }
+ }
+ }
+
+ dbg("CSSU - code2 = %d index = %d number = %s type = %d", code2, index, number, ton);
+ switch (code2) {
+ case 0: // this is a forwarded call (MT call setup)
+ tcore_call_information_mt_forwarded_call(co, number);
+ break;
+
+ case 2: // call has been put on hold (during a voice call)
+ tcore_call_information_held(co, number);
+ break;
+
+ case 3: // call has been retrieved (during a voice call)
+ tcore_call_information_active(co, number);
+ break;
+
+ case 4: // multiparty call entered (during a voice call)
+ tcore_call_information_joined(co, number);
+ break;
+
+ case 5: // call on hold has been released
+ tcore_call_information_released_on_hold(co, number);
+ break;
+
+ case 6: // forward check SS message received (can be received whenever)
+ tcore_call_information_cf_check_ss_message(co, number);
+ break;
+
+ case 7: // call is being connected (alerting) with the remote party in alerting state in explicit call transfer operation (during a voice call)
+ tcore_call_information_transfer_alert(co, number);
+ break;
+
+ case 8: // call has been connected with the other remote party in explicit call transfer operation (also number and subaddress parameters may be present) (during a voice call or MT call setup)
+ tcore_call_information_transfered(co, number);
+ break;
+
+ case 9: // this is a deflected call (MT call setup):
+ tcore_call_information_mt_deflected_call(co, number);
+ break;
+
+ default:
+ dbg("CSSU - unsupported code2 : %d", code2);
+ break;
+ }
+ }
+ // handle %CSSI notification
+
+ if (cssi) {
+ tokens = tcore_at_tok_new(cmd);
+ // parse <code1>
+ str_code1 = g_slist_nth_data(tokens, 0);
+ if (!str_code1) {
+ dbg("Code1 is missing from %CSSI indiaction");
+ } else {
+ code1 = atoi(str_code1);
+ // parse [ <index> ]
+ if ((str_index = g_slist_nth_data(tokens, 1))) {
+ index = atoi(str_index);
+ }
+ }
+
+ dbg("CSSI - code1 - %d index - %d ", code1, index);
+
+ switch (code1) {
+ case 0: // Unconditional CF is active
+ tcore_call_information_mo_cfu(co);
+ break;
+
+ case 1: // some of the conditional call forwarding are active
+ tcore_call_information_mo_cfc(co);
+ break;
+
+ case 2: // outgoing call is forwarded
+ tcore_call_information_mo_forwarded(co);
+ break;
+
+ case 3: // this call is waiting
+ tcore_call_information_mo_waiting(co);
+ break;
+
+ case 5: // outgoing call is barred
+ tcore_call_information_mo_barred_outgoing(co);
+ break;
+
+ case 6: // incoming call is barred
+ tcore_call_information_mo_barred_incoming(co);
+ break;
+
+ case 7: // CLIR suppression rejected
+ tcore_call_information_mo_clir_suppression_reject(co);
+ break;
+
+ case 8: // outgoing call is deflected
+ tcore_call_information_mo_deflected(co);
+ break;
+
+ default:
+ dbg("unsupported cmd : %d", code1);
+ break;
+ }
+ }
+OUT:
+ if (NULL != tokens)
+ tcore_at_tok_free(tokens);
+ if (NULL != number)
+ g_free(number);
+ return TRUE;
+}
+
+static void on_confirmation_ss_message_send(TcorePending *p, gboolean result, void *user_data)
+{
+ dbg("");
+
+ if (result == FALSE) {
+ // Fail
+ dbg("FAIL");
+ } else {
+ dbg("SEND OK");
+ }
+}
+
+static void on_response_ss_barring_set(TcorePending *p, int data_len, const void *data, void *user_data)
+{
+ struct ss_confirm_info *info = 0;
+ enum telephony_ss_class class;
+ CoreObject *o = 0;
+ UserRequest *ur;
+ struct tresp_ss_general resp;
+ UserRequest *ur_dup = 0;
+ GSList *tokens = NULL;
+ const char *line;
+ int err;
+ const TcoreATResponse *response;
+
+ dbg("function enter");
+ response = data;
+ o = tcore_pending_ref_core_object(p);
+ ur = tcore_pending_ref_user_request(p);
+
+ info = (struct ss_confirm_info *) user_data;
+ class = info->class;
+
+ if (response->success > 0) {
+ dbg("RESPONSE OK");
+ resp.err = TCORE_RETURN_SUCCESS;
+ } else {
+ dbg("RESPONSE NOT OK");
+ line = (const char *) response->final_response;
+ tokens = tcore_at_tok_new(line);
+
+ if (g_slist_length(tokens) < 1) {
+ dbg("err cause not specified or string corrupted");
+ resp.err = TCORE_RETURN_3GPP_ERROR;
+ } else {
+ err = atoi(g_slist_nth_data(tokens, 0));
+ // TODO: CMEE error mapping is required.
+ resp.err = TCORE_RETURN_3GPP_ERROR;
+ }
+ tcore_at_tok_free(tokens);
+ }
+
+ dbg("on_response_ss_barring_set - rsp.err : %d, ur : %x flavor_type = %d", resp.err, ur, info->flavor_type);
+ dbg("[ check ] class : 0x%x", info->class);
+
+ if (response->success > 0) {
+ if (info->class == SS_CLASS_VOICE) {
+ class = SS_CLASS_ALL_TELE_BEARER;
+ }
+
+ ur_dup = tcore_user_request_ref(ur);
+
+ if (info->flavor_type == SS_BARR_MODE_AB || info->flavor_type == SS_BARR_MODE_AOB) {
+ _ss_barring_get(o, ur_dup, class, SS_BARR_MODE_BAOC, info->resp);
+ } else if (info->flavor_type == SS_BARR_MODE_AIB) {
+ _ss_barring_get(o, ur_dup, class, SS_BARR_MODE_BAIC, info->resp);
+ } else {
+ _ss_barring_get(o, ur_dup, class, info->flavor_type, info->resp);
+ }
+ } else {
+ if (ur) {
+ tcore_user_request_send_response(ur, info->resp, sizeof(struct tresp_ss_general), &resp);
+ } else {
+ dbg("[ error ] ur is 0");
+ }
+ }
+}
+
+static void on_response_ss_barring_change_pwd(TcorePending *p, int data_len, const void *data, void *user_data)
+{
+ const TcoreATResponse *response = data;
+ struct ss_confirm_info *info = 0;
+ UserRequest *ur;
+ struct tresp_ss_general resp;
+ int err;
+ GSList *tokens = NULL;
+ const char *line;
+
+ dbg("function enter");
+ ur = tcore_pending_ref_user_request(p);
+ info = (struct ss_confirm_info *) user_data;
+
+ if (response->success > 0) {
+ dbg("RESPONSE OK");
+ resp.err = TCORE_RETURN_SUCCESS;
+ } else {
+ dbg("RESPONSE NOT OK");
+
+ line = (const char *) response->final_response;
+ tokens = tcore_at_tok_new(line);
+
+ if (g_slist_length(tokens) < 1) {
+ dbg("err cause not specified or string corrupted");
+ resp.err = TCORE_RETURN_3GPP_ERROR;
+ } else {
+ err = atoi(g_slist_nth_data(tokens, 0));
+ // TODO: CMEE error mapping is required.
+ resp.err = TCORE_RETURN_3GPP_ERROR;
+ }
+ tcore_at_tok_free(tokens);
+ }
+
+ dbg("on_response_ss_barring_change_pwd: rsp.err : %d, usr : %x", resp.err, ur);
+ if (ur) {
+ tcore_user_request_send_response(ur, info->resp, sizeof(struct tresp_ss_general), &resp);
+ } else {
+ dbg("[ error ] ur is 0");
+ }
+
+ g_free(user_data);
+}
+
+static void on_response_ss_forwarding_set(TcorePending *p, int data_len, const void *data, void *user_data)
+{
+ CoreObject *o = 0;
+ UserRequest *ur = 0, *dup_ur = 0;
+ struct ss_confirm_info *info = 0;
+ struct tresp_ss_general resp;
+ GSList *tokens = NULL;
+ const char *line;
+ int err;
+ const TcoreATResponse *response;
+
+ dbg("function enter");
+
+ response = data;
+ o = tcore_pending_ref_core_object(p);
+ ur = tcore_pending_ref_user_request(p);
+
+ info = (struct ss_confirm_info *) user_data;
+
+ if (response->success > 0) {
+ dbg("RESPONSE OK");
+ resp.err = TCORE_RETURN_SUCCESS;
+ } else {
+ dbg("RESPONSE NOT OK");
+
+ line = (const char *) response->final_response;
+ tokens = tcore_at_tok_new(line);
+
+ if (g_slist_length(tokens) < 1) {
+ dbg("err cause not specified or string corrupted");
+ resp.err = TCORE_RETURN_3GPP_ERROR;
+ } else {
+ err = atoi(g_slist_nth_data(tokens, 0));
+ // / TODO: CMEE error mapping is required.
+ resp.err = TCORE_RETURN_3GPP_ERROR;
+ }
+
+ tcore_at_tok_free(tokens);
+ }
+
+ dbg("[ check ] class : 0x%x", info->class);
+ dbg("[ check ] flavor_type : 0x%x", info->flavor_type);
+
+ dbg("on_response_ss_forwarding_set - rsp.err : %d, ur : %x", resp.err, ur);
+
+ if (response->success > 0) {
+ if (info->flavor_type == SS_CF_MODE_CF_ALL ||
+ info->flavor_type == SS_CF_MODE_CFC) {
+ if (ur) {
+ tcore_user_request_send_response(ur, info->resp, sizeof(struct tresp_ss_general), &resp);
+ } else {
+ dbg("[ error ] ur is 0");
+ }
+ } else {
+ dup_ur = tcore_user_request_ref(ur);
+ _ss_forwarding_get(o, dup_ur, info->class, info->flavor_type, info->resp);
+ }
+ } else {
+ if (ur) {
+ tcore_user_request_send_response(ur, info->resp, sizeof(struct tresp_ss_general), &resp);
+ } else {
+ dbg("[ error ] ur is 0");
+ }
+ }
+ g_free(user_data);
+}
+
+static void on_response_ss_waiting_set(TcorePending *p, int data_len, const void *data, void *user_data)
+{
+ CoreObject *core_obj = 0;
+ UserRequest *ur = 0;
+ UserRequest *ur_dup = 0;
+ struct ss_confirm_info *info = 0;
+ struct tresp_ss_general resp;
+ GSList *tokens = NULL;
+ const char *line;
+ int err;
+ const TcoreATResponse *response;
+
+ dbg("function enter");
+ response = data;
+ core_obj = tcore_pending_ref_core_object(p);
+ ur = tcore_pending_ref_user_request(p);
+
+ info = (struct ss_confirm_info *) user_data;
+
+ if (response->success > 0) {
+ dbg("RESPONSE OK");
+ resp.err = TCORE_RETURN_SUCCESS;
+ } else {
+ dbg("RESPONSE NOT OK");
+
+ line = (const char *) response->final_response;
+ tokens = tcore_at_tok_new(line);
+
+ if (g_slist_length(tokens) < 1) {
+ dbg("err cause not specified or string corrupted");
+ resp.err = TCORE_RETURN_3GPP_ERROR;
+ } else {
+ err = atoi(g_slist_nth_data(tokens, 0));
+ // / TODO: CMEE error mapping is required.
+ resp.err = TCORE_RETURN_3GPP_ERROR;
+ }
+ tcore_at_tok_free(tokens);
+ }
+
+ dbg("on_response_ss_waiting_set - rsp.err : %d, ur : %x, class : %d", resp.err, ur, info->class);
+
+ if (resp.err == TCORE_RETURN_SUCCESS) {
+ ur_dup = tcore_user_request_ref(ur);
+ dbg("Get waiting call status");
+ _ss_waiting_get(core_obj, ur_dup, info->class, info->resp);
+ } else {
+ if (ur) {
+ tcore_user_request_send_response(ur, info->resp, sizeof(struct tresp_ss_general), &resp);
+ } else {
+ dbg("[ error ] ur is 0");
+ }
+ }
+ g_free(user_data);
+}
+
+
+static void on_confirmation_ss_ussd(TcorePending *p, int data_len, const void *data, void *user_data)
+{
+ CoreObject *core_obj = 0;
+ struct ss_confirm_info *info = 0;
+ struct tresp_ss_ussd resp;
+ UserRequest *ur = NULL, *ussd_ur = NULL;
+ GSList *tokens = NULL;
+ const char *line;
+ int err;
+ UssdSession *ussd_s = NULL;
+ enum tcore_ss_ussd_type type = TCORE_SS_USSD_TYPE_MAX;
+ const TcoreATResponse *response;
+
+ dbg("function enter");
+ response = data;
+ ur = tcore_pending_ref_user_request(p);
+ info = (struct ss_confirm_info *) user_data;
+
+ memset(resp.str, 0x00, MAX_SS_USSD_LEN);
+
+ core_obj = tcore_pending_ref_core_object(p);
+ ussd_s = tcore_ss_ussd_get_session(core_obj);
+
+ if (ussd_s)
+ type = tcore_ss_ussd_get_session_type(ussd_s);
+ else
+ dbg("[ error ] ussd_s : (0)");
+
+ resp.type = (enum telephony_ss_ussd_type) type;
+ resp.status = SS_USSD_MAX; // hardcoded value.
+
+ if (response->success > 0) {
+ dbg("RESPONSE OK");
+ resp.err = TCORE_RETURN_SUCCESS;
+ } else {
+ dbg("RESPONSE NOT OK");
+
+ line = (const char *) response->final_response;
+ tokens = tcore_at_tok_new(line);
+
+ if (g_slist_length(tokens) < 1) {
+ dbg("err cause not specified or string corrupted");
+ resp.err = TCORE_RETURN_3GPP_ERROR;
+ } else {
+ err = atoi(g_slist_nth_data(tokens, 0));
+ // TODO: CMEE error mapping is required.
+ resp.err = TCORE_RETURN_3GPP_ERROR;
+ }
+ tcore_at_tok_free(tokens);
+ }
+
+ dbg("on_confirmation_ss_ussd - rsp.err : %d, ur : %x", resp.err, ur);
+
+ if (response->success > 0) {
+ if (type == TCORE_SS_USSD_TYPE_USER_INITIATED) {
+ dbg("ussd type %d", resp.type);
+
+ if (ussd_s) {
+ tcore_ss_ussd_get_session_data(ussd_s, (void **) &ussd_ur);
+ if (ussd_ur)
+ tcore_user_request_free(ussd_ur);
+ }
+ }
+ }
+
+ if (ussd_s)
+ tcore_ss_ussd_destroy_session(ussd_s);
+
+ if (ur) {
+ if (UssdResp == FALSE) { // to avoid sending multiple response to application.
+ tcore_user_request_send_response(ur, info->resp, sizeof(struct tresp_ss_ussd), &resp);
+ }
+ UssdResp = FALSE;
+ } else
+ dbg("[ error ] ur : (0)");
+
+ g_free(user_data);
+}
+
+static void on_response_ss_barring_get(TcorePending *p, int data_len, const void *data, void *user_data)
+{
+ UserRequest *ur = 0;
+ int status = 0, classx = 0, err = 0;
+ GSList *respdata;
+ struct ss_confirm_info *info = 0;
+ struct tresp_ss_barring resp;
+ int countRecords = 0, countValidRecords = 0;
+ GSList *tokens = NULL;
+ const char *line;
+ char *classx_str;
+ char *stat = NULL;
+ const TcoreATResponse *response;
+
+ dbg("function enter");
+
+ response = data;
+ ur = tcore_pending_ref_user_request(p);
+ info = (struct ss_confirm_info *) user_data;
+
+ if (response->lines) {
+ respdata = (GSList *) response->lines;
+ countRecords = g_slist_length(respdata);
+ dbg("total records : %d", countRecords);
+ } else {
+ countRecords = 0;
+ dbg("no active status - return to user")
+ }
+ resp.record_num = countRecords;
+
+ if (resp.record_num > 0) {
+ resp.record = g_new0(struct barring_info, resp.record_num);
+ for (countValidRecords = 0; respdata != NULL; respdata = respdata->next) {
+ line = (const char *) (respdata->data);
+ tokens = tcore_at_tok_new(line);
+
+ // parse <status>
+ stat = g_slist_nth_data(tokens, 0);
+ if (!stat) {
+ dbg("Stat is missing");
+ goto error;
+ }
+
+ status = atoi(stat);
+ if (status == 1) {
+ resp.record[countValidRecords].status = SS_STATUS_ACTIVATE;
+ } else {
+ resp.record[countValidRecords].status = SS_STATUS_DEACTIVATE;
+ }
+ dbg("call barring status - %d", status);
+
+ // Parse <class>
+ classx_str = g_slist_nth_data(tokens, 1);
+
+ if (!classx_str) {
+ dbg("class error. classx not exist - set to requested one : %d", info->class);
+ switch (info->class) {
+ case SS_CLASS_ALL_TELE:
+ classx = 7;
+ break;
+
+ case SS_CLASS_VOICE:
+ classx = 1;
+ break;
+
+ case SS_CLASS_ALL_DATA_TELE:
+ classx = 2;
+ break;
+
+ case SS_CLASS_FAX:
+ classx = 4;
+ break;
+
+ case SS_CLASS_SMS:
+ classx = 8;
+ break;
+
+ case SS_CLASS_ALL_CS_SYNC:
+ classx = 16;
+ break;
+
+ default:
+ classx = 7;
+ dbg("unsupported class %d. set to default : 7", info->class);
+ break;
+ }
+ } else {
+ classx = atoi(classx_str);
+ dbg("call barring classx - %d", classx);
+ }
+
+ switch (classx) {
+ case 1:
+ resp.record[countValidRecords].class = SS_CLASS_VOICE;
+ break;
+
+ case 2:
+ resp.record[countValidRecords].class = SS_CLASS_ALL_DATA_TELE;
+ break;
+
+ case 4:
+ resp.record[countValidRecords].class = SS_CLASS_FAX;
+ break;
+
+ case 7:
+ resp.record[countValidRecords].class = SS_CLASS_ALL_TELE;
+ break;
+
+ case 8:
+ resp.record[countValidRecords].class = SS_CLASS_SMS;
+ break;
+
+ case 16:
+ resp.record[countValidRecords].class = SS_CLASS_ALL_CS_SYNC;
+ break;
+
+ case 32:
+ resp.record[countValidRecords].class = SS_CLASS_ALL_CS_ASYNC;
+ break;
+
+ default:
+ dbg("unspoorted class : [%d]\n", classx);
+ goto error;
+ break;
+ }
+ resp.record[countValidRecords].mode = (enum telephony_ss_barring_mode) (info->flavor_type);
+ countValidRecords++;
+ tcore_at_tok_free(tokens);
+ continue;
+
+error:
+ dbg("invalid field found. coutinue");
+ tcore_at_tok_free(tokens);
+ continue;
+ }
+
+ dbg("valid count :%d", countValidRecords);
+ resp.record_num = countValidRecords;
+ resp.err = TCORE_RETURN_SUCCESS;
+ } else {
+ dbg("no active status - return to user")
+ }
+
+ if (response->success > 0) {
+ dbg("RESPONSE OK");
+ resp.err = TCORE_RETURN_SUCCESS;
+ } else {
+ dbg("RESPONSE NOT OK");
+ resp.err = TCORE_RETURN_FAILURE;
+
+ line = (const char *) response->final_response;
+ tokens = tcore_at_tok_new(line);
+
+ if (g_slist_length(tokens) < 1) {
+ dbg("err cause not specified or string corrupted");
+ resp.err = TCORE_RETURN_3GPP_ERROR;
+ } else {
+ err = atoi(g_slist_nth_data(tokens, 0));
+ // TODO: CMEE error mapping is required.
+ resp.err = TCORE_RETURN_3GPP_ERROR;
+ }
+ tcore_at_tok_free(tokens);
+ }
+
+ dbg("on_response_ss_barring_get- rsp.err : %d, ur : %x", resp.err, ur);
+
+ if (ur)
+ tcore_user_request_send_response(ur, info->resp, sizeof(struct tresp_ss_barring), &resp);
+ else
+ dbg("[ error ] ur is 0");
+
+ if (resp.record) {
+ g_free(resp.record);
+ resp.record = NULL;
+ }
+
+ g_free(user_data);
+}
+
+static void on_response_ss_forwarding_get(TcorePending *p, int data_len, const void *data, void *user_data)
+{
+ UserRequest *ur = 0;
+ int classx = 0, err = 0, time = 0;
+ char *num;
+ struct ss_confirm_info *info = 0;
+ struct tresp_ss_forwarding resp;
+ int countRecords = 0, countValidRecords = 0;
+
+ GSList *respdata = NULL, *tokens = NULL;
+ const char *line;
+ char *classx_str, *status, *ton, *time_str;
+ const TcoreATResponse *response;
+
+ dbg("function enter");
+ response = data;
+
+ ur = tcore_pending_ref_user_request(p);
+ info = (struct ss_confirm_info *) user_data;
+ if (response->lines) {
+ respdata = (GSList *) response->lines;
+ countRecords = g_slist_length(respdata);
+ dbg("total records : %d", countRecords);
+ } else {
+ countRecords = 0;
+ dbg("no active status - return to user")
+ }
+ resp.record_num = countRecords;
+
+ if (resp.record_num > 0) {
+ resp.record = g_new0(struct forwarding_info, resp.record_num);
+
+ for (countValidRecords = 0; respdata != NULL; respdata = respdata->next) {
+ line = (const char *) (respdata->data);
+ tokens = tcore_at_tok_new(line);
+
+ // parse <status>
+ status = g_slist_nth_data(tokens, 0);
+ if (!status) {
+ dbg("start line error. skip this line");
+ goto error;
+ } else {
+ if (atoi(status) == 1) {
+ resp.record[countValidRecords].status = SS_STATUS_ACTIVATE;
+ } else {
+ resp.record[countValidRecords].status = SS_STATUS_DEACTIVATE;
+ }
+ }
+
+ // Parse <class>
+ classx_str = g_slist_nth_data(tokens, 1);
+ if (!classx_str) {
+ dbg("class error. skip this line");
+ goto error;
+ } else {
+ switch (atoi(classx_str)) {
+ case 1:
+ resp.record[countValidRecords].class = SS_CLASS_VOICE;
+ break;
+
+ case 2:
+ resp.record[countValidRecords].class = SS_CLASS_ALL_DATA_TELE;
+ break;
+
+ case 4:
+ resp.record[countValidRecords].class = SS_CLASS_FAX;
+ break;
+
+ case 7:
+ resp.record[countValidRecords].class = SS_CLASS_ALL_TELE;
+ break;
+
+ case 8:
+ resp.record[countValidRecords].class = SS_CLASS_SMS;
+ break;
+
+ case 16:
+ resp.record[countValidRecords].class = SS_CLASS_ALL_CS_SYNC;
+ break;
+
+ case 32:
+ resp.record[countValidRecords].class = SS_CLASS_ALL_CS_ASYNC;
+ break;
+
+ default:
+ dbg("unspoorted class : [%d]\n", classx);
+ goto error;
+ break;
+ }
+ }
+
+ // parse <numer> <type>
+ num = g_slist_nth_data(tokens, 2);
+ if (num) {
+ dbg("number - %s", num);
+ memcpy((resp.record[countValidRecords].number), num, strlen(num));
+ resp.record[countValidRecords].number_present = TRUE;
+
+ ton = g_slist_nth_data(tokens, 3);
+ if (ton) {
+ resp.record[countValidRecords].number_type = atoi(ton);
+ dbg("number type - %d", resp.record[countValidRecords].number_type);
+ }
+ }
+
+ // skip <subaddr> <satype>
+ // parse <time>
+ time_str = g_slist_nth_data(tokens, 6);
+ if (time_str) {
+ time = atoi(time_str);
+ resp.record[countValidRecords].time = (enum telephony_ss_forwarding_no_reply_time) time;
+ dbg("time - %d", time);
+ }
+
+ resp.record[countValidRecords].mode = (enum telephony_ss_forwarding_mode) (info->flavor_type);
+ dbg("flavor_type - %d", (enum telephony_ss_forwarding_mode) (info->flavor_type));
+
+ countValidRecords++;
+ tcore_at_tok_free(tokens);
+ continue;
+error:
+ dbg("invalid field found. coutinue");
+ tcore_at_tok_free(tokens);
+ continue;
+ }
+ dbg("valid count :%d", countValidRecords);
+ resp.record_num = countValidRecords;
+ resp.err = TCORE_RETURN_SUCCESS;
+ } else {
+ dbg("no active status - return to user")
+ }
+
+ if (response->success > 0) {
+ dbg("RESPONSE OK");
+ resp.err = TCORE_RETURN_SUCCESS;
+ } else {
+ dbg("RESPONSE NOT OK");
+ line = (const char *) response->final_response;
+ tokens = tcore_at_tok_new(line);
+
+ if (g_slist_length(tokens) < 1) {
+ dbg("err cause not specified or string corrupted");
+ resp.err = TCORE_RETURN_3GPP_ERROR;
+ } else {
+ err = atoi(g_slist_nth_data(tokens, 0));
+ /* TODO: CMEE error mapping is required. */
+ resp.err = TCORE_RETURN_3GPP_ERROR;
+ }
+ tcore_at_tok_free(tokens);
+ }
+
+ dbg("on_response_ss_forwarding_get- rsp.err : %d, ur : %x", resp.err, ur);
+ if (ur)
+ tcore_user_request_send_response(ur, info->resp, sizeof(struct tresp_ss_forwarding), &resp);
+ else
+ dbg("[ error ] ur is 0");
+
+ if (resp.record) {
+ g_free(resp.record);
+ resp.record = NULL;
+ }
+ g_free(user_data);
+}
+
+static void on_response_ss_waiting_get(TcorePending *p, int data_len, const void *data, void *user_data)
+{
+ UserRequest *ur = 0;
+ GSList *respdata, *tokens = NULL;
+ int classx = 0, err = 0;
+ struct ss_confirm_info *info = 0;
+ struct tresp_ss_waiting resp;
+ int countRecords = 0, countValidRecords = 0;
+ const char *line;
+ char *classx_str, *status;
+ const TcoreATResponse *response;
+
+ dbg("function enter")
+ response = data;
+ ur = tcore_pending_ref_user_request(p);
+ info = (struct ss_confirm_info *) user_data;
+
+ if (response->lines) {
+ respdata = (GSList *) response->lines;
+ countRecords = g_slist_length(respdata);
+ dbg("total records : %d", countRecords);
+ } else {
+ countRecords = 0;
+ dbg("no active status - return to user")
+ }
+ resp.record_num = countRecords;
+
+ if (resp.record_num > 0) {
+ resp.record = g_new0(struct waiting_info, resp.record_num);
+
+ for (countValidRecords = 0; respdata != NULL; respdata = respdata->next) {
+ line = (const char *) (respdata->data);
+ tokens = tcore_at_tok_new(line);
+
+ // parse <status>
+ status = g_slist_nth_data(tokens, 0);
+ if (!status) {
+ dbg("Missing stat in responce ");
+ goto error;
+ } else {
+ if (atoi(status) == 1) {
+ resp.record[countValidRecords].status = SS_STATUS_ACTIVATE;
+ } else {
+ resp.record[countValidRecords].status = SS_STATUS_DEACTIVATE;
+ }
+ }
+ dbg("status = %d", resp.record[countValidRecords].status);
+
+ // Parse <class>
+ classx_str = g_slist_nth_data(tokens, 1);
+ if (!classx_str) {
+ dbg("error - class is missing");
+ goto error;
+ } else {
+ switch (atoi(classx_str)) {
+ case 1:
+ resp.record[countValidRecords].class = SS_CLASS_VOICE;
+ break;
+
+ case 2:
+ resp.record[countValidRecords].class = SS_CLASS_ALL_DATA_TELE;
+ break;
+
+ case 4:
+ resp.record[countValidRecords].class = SS_CLASS_FAX;
+ break;
+
+ case 7:
+ resp.record[countValidRecords].class = SS_CLASS_ALL_TELE;
+ break;
+
+ case 8:
+ resp.record[countValidRecords].class = SS_CLASS_SMS;
+ break;
+
+ case 16:
+ resp.record[countValidRecords].class = SS_CLASS_ALL_CS_SYNC;
+ break;
+
+ case 32:
+ resp.record[countValidRecords].class = SS_CLASS_ALL_CS_ASYNC;
+ break;
+
+ default:
+ dbg("unspoorted class : [%d]\n", classx);
+ goto error;
+ break;
+ }
+ dbg("class info %d", resp.record[countValidRecords].class);
+ }
+
+ countValidRecords++;
+ tcore_at_tok_free(tokens);
+ continue;
+error:
+ dbg("invalid field found. coutinue");
+ tcore_at_tok_free(tokens);
+ continue;
+ }
+
+ dbg("valid count :%d", countValidRecords);
+ resp.record_num = countValidRecords;
+ resp.err = TCORE_RETURN_SUCCESS;
+ } else {
+ dbg("no active status - return to user")
+ }
+
+ if (response->success > 0) {
+ dbg("RESPONSE OK");
+ resp.err = TCORE_RETURN_SUCCESS;
+ } else {
+ dbg("RESPONSE NOT OK");
+ line = (const char *) response->final_response;
+ tokens = tcore_at_tok_new(line);
+
+ if (g_slist_length(tokens) < 1) {
+ dbg("err cause not specified or string corrupted");
+ resp.err = TCORE_RETURN_3GPP_ERROR;
+ } else {
+ err = atoi(g_slist_nth_data(tokens, 0));
+ // TODO: CMEE error mapping is required.
+ resp.err = TCORE_RETURN_3GPP_ERROR;
+ }
+ tcore_at_tok_free(tokens);
+ }
+
+ dbg("on_response_ss_waiting_get - rsp.err : %d, ur : %x", resp.err, ur);
+ if (ur)
+ tcore_user_request_send_response(ur, info->resp, sizeof(struct tresp_ss_waiting), &resp);
+ else
+ dbg("[ error ] ur is 0");
+
+ if (resp.record) {
+ g_free(resp.record);
+ resp.record = NULL;
+ }
+ g_free(user_data);
+}
+
+
+static void on_response_ss_cli_get(TcorePending *p, int data_len, const void *data, void *user_data)
+{
+ UserRequest *ur = 0;
+ struct tresp_ss_cli resp;
+ enum telephony_ss_cli_type *p_type = NULL;
+ char *line = NULL, *status;
+ int err = FALSE;
+ int cli_adj, stat;
+ GSList *tokens = NULL;
+ const TcoreATResponse *response;
+
+ dbg("function enter")
+ response = data;
+ ur = tcore_pending_ref_user_request(p);
+ p_type = (enum telephony_ss_cli_type *) (user_data);
+
+ if (response->success > 0) {
+ line = (char *) (((GSList *) response->lines)->data);
+ tokens = tcore_at_tok_new(line);
+
+ if (*p_type == SS_CLI_TYPE_CLIR) {
+ // +CLIR: <n> <m>
+ dbg("CLI type is CLIR")
+ // parse <n>
+ status = g_slist_nth_data(tokens, 0);
+
+ if (!status) {
+ dbg("Call line identification adjustment missing <n>");
+ } else {
+ cli_adj = atoi(status);
+ dbg("CLIR response value of <n> - %d", cli_adj);
+
+ if (cli_adj == 0) {
+ // parse <m>
+ status = g_slist_nth_data(tokens, 1);
+ if (!status) {
+ dbg("status is missing<m>");
+ }
+ stat = atoi(status);
+ dbg("CLIR response value of <m> - %d", stat);
+
+ if (stat == 1 || stat == 3) {
+ resp.status = TRUE;
+ } else {
+ resp.status = FALSE;
+ }
+ } else if (cli_adj == 1) {
+ resp.status = TRUE;
+ } else {
+ resp.status = FALSE;
+ }
+ dbg("resp.status - %d", resp.status);
+ }
+ tcore_at_tok_free(tokens);
+ } else {
+ // parse <n>
+ status = g_slist_nth_data(tokens, 0);
+ if (!status) {
+ dbg("Stat is missing");
+ } else {
+ stat = atoi(status);
+ if (stat == 1)
+ resp.status = TRUE;
+ else
+ resp.status = FALSE;
+
+ dbg("resp.status - %d", resp.status);
+ }
+ tcore_at_tok_free(tokens);
+ }
+ }
+
+ if (response->success > 0) {
+ dbg("RESPONSE OK");
+ resp.err = TCORE_RETURN_SUCCESS;
+ } else {
+ dbg("RESPONSE NOT OK");
+
+ line = (char *) response->final_response;
+ tokens = tcore_at_tok_new(line);
+
+ if (g_slist_length(tokens) < 1) {
+ dbg("err cause not specified or string corrupted");
+ resp.err = TCORE_RETURN_3GPP_ERROR;
+ } else {
+ err = atoi(g_slist_nth_data(tokens, 0));
+ // TODO: CMEE error mapping is required.
+ resp.err = TCORE_RETURN_3GPP_ERROR;
+ }
+ tcore_at_tok_free(tokens);
+ }
+
+ resp.type = *p_type;
+ dbg("check - resp.type = %d ", resp.type);
+ if (ur)
+ tcore_user_request_send_response(ur, TRESP_SS_CLI_GET_STATUS, sizeof(struct tresp_ss_cli), &resp);
+ else
+ dbg("[ error ] ur : (0)");
+
+ g_free(user_data);
+}
+
+static struct tcore_ss_operations ss_ops = {
+ .barring_activate = s_ss_barring_activate,
+ .barring_deactivate = s_ss_barring_deactivate,
+ .barring_change_password = s_ss_barring_change_password,
+ .barring_get_status = s_ss_barring_get_status,
+ .forwarding_activate = s_ss_forwarding_activate,
+ .forwarding_deactivate = s_ss_forwarding_deactivate,
+ .forwarding_register = s_ss_forwarding_register,
+ .forwarding_deregister = s_ss_forwarding_deregister,
+ .forwarding_get_status = s_ss_forwarding_get_status,
+ .waiting_activate = s_ss_waiting_activate,
+ .waiting_deactivate = s_ss_waiting_deactivate,
+ .waiting_get_status = s_ss_waiting_get_status,
+ .cli_activate = s_ss_cli_activate,
+ .cli_deactivate = s_ss_cli_deactivate,
+ .cli_get_status = s_ss_cli_get_status,
+ .send_ussd = s_ss_send_ussd,
+ .set_aoc = s_ss_set_aoc,
+ .get_aoc = s_ss_get_aoc,
+};
+
+
+static TReturn _ss_barring_set(CoreObject *o, UserRequest *ur, enum telephony_ss_opcode op)
+{
+ struct treq_ss_barring *barring = 0;
+ struct ss_confirm_info *user_data = 0;
+ char *cmd_str = NULL;
+ TcoreHal *hal;
+ TcorePending *pending = NULL;
+ TcoreATRequest *req;
+ char passwd[MAX_SS_BARRING_PASSWORD_LEN + 1];
+ int opco;
+ int classx;
+ char *facility = NULL;
+ gboolean ret = FALSE;
+
+ dbg("function enter");
+ barring = (struct treq_ss_barring *) tcore_user_request_ref_data(ur, 0);
+
+ switch (op) {
+ case SS_OPCO_ACTIVATE:
+ opco = 1;
+ break;
+
+ case SS_OPCO_DEACTIVATE:
+ opco = 0;
+ break;
+
+ default:
+ dbg("unsupported opco : %d", op);
+ return TCORE_RETURN_FAILURE;
+ }
+ dbg("opco - %d", opco);
+
+ switch (barring->mode) {
+ case SS_BARR_MODE_BAOC:
+ facility = "AO";
+ break;
+
+ case SS_BARR_MODE_BOIC:
+ facility = "OI";
+ break;
+
+ case SS_BARR_MODE_BOIC_NOT_HC:
+ facility = "OX";
+ break;
+
+ case SS_BARR_MODE_BAIC:
+ facility = "AI";
+ break;
+
+ case SS_BARR_MODE_BIC_ROAM:
+ facility = "IR";
+ break;
+
+ case SS_BARR_MODE_AB:
+ facility = "AB";
+ break;
+
+ case SS_BARR_MODE_AOB:
+ facility = "AG";
+ break;
+
+ case SS_BARR_MODE_AIB:
+ facility = "AC";
+ break;
+
+ case SS_BARR_MODE_BIC_NOT_SIM:
+ // facility = "NS";
+ default:
+ dbg("unspported mode %d", barring->mode);
+ return TCORE_RETURN_FAILURE;
+ }
+
+ dbg("facility - %s", facility);
+
+ switch (barring->class) {
+ case SS_CLASS_ALL_TELE:
+ classx = 7;
+ break;
+
+ case SS_CLASS_VOICE:
+ classx = 1;
+ break;
+
+ case SS_CLASS_ALL_DATA_TELE:
+ classx = 2;
+ break;
+
+ case SS_CLASS_FAX:
+ classx = 4;
+ break;
+
+ case SS_CLASS_SMS:
+ classx = 8;
+ break;
+
+ case SS_CLASS_ALL_CS_SYNC:
+ classx = 16;
+ break;
+
+ default:
+ classx = 7;
+ dbg("unsupported class %d. set to default : 7", barring->class);
+ break;
+ }
+
+ dbg("classx - %d", classx);
+
+ // null-ended pwd handling added - unexpected 0x11 value observed in req string
+ memcpy(passwd, barring->password, MAX_SS_BARRING_PASSWORD_LEN);
+ passwd[MAX_SS_BARRING_PASSWORD_LEN] = '\0';
+ dbg("passwd - %s", passwd);
+
+ hal = tcore_object_get_hal(o);
+ pending = tcore_pending_new(o, 0);
+
+ cmd_str = g_strdup_printf("AT+CLCK=\"%s\",%d,\"%s\",%d", facility, opco, passwd, classx);
+ dbg("request command : %s", cmd_str);
+
+ req = tcore_at_request_new(cmd_str, NULL, TCORE_AT_NO_RESULT);
+ dbg("cmd : %s, prefix(if any) :%s, cmd_len : %d", req->cmd, req->prefix, strlen(req->cmd));
+
+ tcore_pending_set_request_data(pending, 0, req);
+
+ user_data = g_new0(struct ss_confirm_info, 1);
+ if (op == SS_OPCO_ACTIVATE) {
+ user_data->resp = TRESP_SS_BARRING_ACTIVATE;
+ } else if (op == SS_OPCO_DEACTIVATE) {
+ user_data->resp = TRESP_SS_BARRING_DEACTIVATE;
+ } else {
+ dbg("[ error ] wrong ss opco (0x%x)", op);
+ return TCORE_RETURN_FAILURE;
+ }
+ user_data->flavor_type = (int) (barring->mode);
+ user_data->class = barring->class;
+
+ ret = _ss_request_message(pending, o, ur, on_response_ss_barring_set, user_data);
+ g_free(cmd_str);
+
+ if (!ret) {
+ dbg("AT request sent failed ")
+ return TCORE_RETURN_FAILURE;
+ }
+ return TCORE_RETURN_SUCCESS;
+}
+
+static TReturn _ss_barring_get(CoreObject *o,
+ UserRequest *ur,
+ enum telephony_ss_class class,
+ enum telephony_ss_barring_mode mode,
+ enum tcore_response_command resp)
+{
+ struct ss_confirm_info *user_data = 0;
+ gboolean ret = FALSE;
+ char *cmd_str = NULL;
+ int opco, classx;
+ char *facility = NULL;
+ TcoreHal *hal;
+ TcorePending *pending = NULL;
+ TcoreATRequest *req;
+
+ dbg("function enter");
+
+ // query status - opco is fixed to 2
+ opco = 2;
+ // barring mode
+ switch (mode) {
+ case SS_BARR_MODE_BAOC:
+ facility = "AO";
+ break;
+
+ case SS_BARR_MODE_BOIC:
+ facility = "OI";
+ break;
+
+ case SS_BARR_MODE_BOIC_NOT_HC:
+ facility = "OX";
+ break;
+
+ case SS_BARR_MODE_BAIC:
+ facility = "AI";
+ break;
+
+ case SS_BARR_MODE_BIC_ROAM:
+ facility = "IR";
+ break;
+
+ case SS_BARR_MODE_AB:
+ facility = "AB";
+ break;
+
+ case SS_BARR_MODE_AOB:
+ facility = "AG";
+ break;
+
+ case SS_BARR_MODE_AIB:
+ facility = "AC";
+ break;
+
+ case SS_BARR_MODE_BIC_NOT_SIM:
+ default:
+ dbg("unspported mode %d", mode);
+ return TCORE_RETURN_FAILURE;
+ }
+
+ dbg("facility - %s", facility);
+
+ switch (class) {
+ case SS_CLASS_ALL_TELE:
+ classx = 7;
+ break;
+
+ case SS_CLASS_VOICE:
+ classx = 1;
+ break;
+
+ case SS_CLASS_ALL_DATA_TELE:
+ classx = 2;
+ break;
+
+ case SS_CLASS_FAX:
+ classx = 4;
+ break;
+
+ case SS_CLASS_SMS:
+ classx = 8;
+ break;
+
+ case SS_CLASS_ALL_CS_SYNC:
+ classx = 16;
+ break;
+
+ default:
+ classx = 7;
+ dbg("unsupported class %d. set to default : 7", class);
+ break;
+ }
+ dbg("class - %d", classx);
+
+ if (classx == 7)
+ cmd_str = g_strdup_printf("AT+CLCK=\"%s\",%d", facility, opco);
+ else
+ cmd_str = g_strdup_printf("AT+CLCK=\"%s\",%d,,%d", facility, opco, classx);
+
+ dbg("request command : %s", cmd_str);
+
+ hal = tcore_object_get_hal(o);
+ pending = tcore_pending_new(o, 0);
+ req = tcore_at_request_new(cmd_str, "+CLCK", TCORE_AT_MULTILINE);
+ dbg("cmd : %s, prefix(if any) :%s, cmd_len : %d", req->cmd, req->prefix, strlen(req->cmd));
+
+ tcore_pending_set_request_data(pending, 0, req);
+
+ user_data = g_new0(struct ss_confirm_info, 1);
+ user_data->resp = resp;
+ user_data->flavor_type = (int) (mode);
+ user_data->class = class;
+
+ ret = _ss_request_message(pending, o, ur, on_response_ss_barring_get, user_data);
+ g_free(cmd_str);
+
+ if (!ret) {
+ dbg("AT request sent failed ")
+ return TCORE_RETURN_FAILURE;
+ }
+
+ return TCORE_RETURN_SUCCESS;
+}
+
+static TReturn s_ss_barring_activate(CoreObject *o, UserRequest *ur)
+{
+ return _ss_barring_set(o, ur, SS_OPCO_ACTIVATE);
+}
+
+static TReturn s_ss_barring_deactivate(CoreObject *o, UserRequest *ur)
+{
+ return _ss_barring_set(o, ur, SS_OPCO_DEACTIVATE);
+}
+
+static TReturn s_ss_barring_change_password(CoreObject *o, UserRequest *ur)
+{
+ TcoreHal *hal;
+ TcorePending *pending = NULL;
+ TcoreATRequest *req;
+ struct treq_ss_barring_change_password *barring = 0;
+ struct ss_confirm_info *user_data = 0;
+ char *cmd_str = NULL;
+ gboolean ret = FALSE;
+
+ dbg("function enter");
+ barring = (struct treq_ss_barring_change_password *) tcore_user_request_ref_data(ur, 0);
+
+ cmd_str = g_strdup_printf("AT+CPWD=\"%s\",\"%s\",\"%s\"", "AB", barring->password_old, barring->password_new);
+ dbg("request command : %s", cmd_str);
+
+ hal = tcore_object_get_hal(o);
+ pending = tcore_pending_new(o, 0);
+ req = tcore_at_request_new(cmd_str, NULL, TCORE_AT_NO_RESULT);
+ dbg("cmd : %s, prefix(if any) :%s, cmd_len : %d", req->cmd, req->prefix, strlen(req->cmd));
+
+ tcore_pending_set_request_data(pending, 0, req);
+
+ user_data = g_new0(struct ss_confirm_info, 1);
+ user_data->resp = TRESP_SS_BARRING_CHANGE_PASSWORD;
+
+ ret = _ss_request_message(pending, o, ur, on_response_ss_barring_change_pwd, user_data);
+ g_free(cmd_str);
+ if (!ret) {
+ dbg("AT request sent failed ")
+ return TCORE_RETURN_FAILURE;
+ }
+ return TCORE_RETURN_SUCCESS;
+}
+
+static TReturn s_ss_barring_get_status(CoreObject *o, UserRequest *ur)
+{
+ struct treq_ss_barring *barring = 0;
+ barring = (struct treq_ss_barring *) tcore_user_request_ref_data(ur, 0);
+
+ return _ss_barring_get(o, ur, barring->class, barring->mode, TRESP_SS_BARRING_GET_STATUS);
+}
+
+static TReturn _ss_forwarding_set(CoreObject *o, UserRequest *ur, enum telephony_ss_opcode op)
+{
+ struct treq_ss_forwarding *forwarding = 0;
+ struct ss_confirm_info *user_data = 0;
+ gboolean ret = FALSE;
+ int len = 0;
+ char *cmd_str = NULL;
+ char *tmp_str = NULL;
+ int reason = 0, mode = 0, num_type = 0, classx = 0, time = 0;
+ gboolean valid_num = FALSE;
+ TcoreHal *hal;
+ TcorePending *pending = NULL;
+ TcoreATRequest *req;
+
+ dbg("_ss_forwarding_set with opco %d ", op);
+
+ forwarding = (struct treq_ss_forwarding *) tcore_user_request_ref_data(ur, 0);
+ switch (forwarding->mode) {
+ case SS_CF_MODE_CFU:
+ reason = 0;
+ break;
+
+ case SS_CF_MODE_CFB:
+ reason = 1;
+ break;
+
+ case SS_CF_MODE_CFNRy:
+ reason = 2;
+ break;
+
+ case SS_CF_MODE_CFNRc:
+ reason = 3;
+ break;
+
+ case SS_CF_MODE_CF_ALL:
+ reason = 4;
+ break;
+
+ case SS_CF_MODE_CFC:
+ reason = 5;
+ break;
+
+ default:
+ dbg("unsupported reason : %d");
+ return TCORE_RETURN_FAILURE;
+ break;
+ }
+
+ dbg("reason = %d", reason);
+ switch (op) {
+ case SS_OPCO_DEACTIVATE:
+ mode = 0;
+ break;
+
+ case SS_OPCO_ACTIVATE:
+ mode = 1;
+ break;
+
+ case SS_OPCO_REG:
+ mode = 3;
+ break;
+
+ case SS_OPCO_DEREG:
+ mode = 4;
+ break;
+
+ default:
+ dbg("unsupported opco : %d", op);
+ return TCORE_RETURN_FAILURE;
+ }
+
+ dbg("mode = %d", mode);
+
+ // class
+ switch (forwarding->class) {
+ case SS_CLASS_ALL_TELE:
+ classx = 7;
+ break;
+
+ case SS_CLASS_VOICE:
+ classx = 1;
+ break;
+
+ case SS_CLASS_ALL_DATA_TELE:
+ classx = 2;
+ break;
+
+ case SS_CLASS_FAX:
+ classx = 4;
+ break;
+
+ case SS_CLASS_SMS:
+ classx = 8;
+ break;
+
+ case SS_CLASS_ALL_CS_SYNC:
+ classx = 16;
+ break;
+
+ default:
+ classx = 7;
+ dbg("unsupported class %d. set to default : 7", forwarding->class);
+ break;
+ }
+ dbg("classx = %d", classx);
+
+ // number
+ len = strlen(forwarding->number);
+ if (len > 0) {
+ valid_num = TRUE;
+ if (forwarding->number[0] == '+')
+ num_type = ((NUM_TYPE_INTERNATIONAL << 4) | NUM_PLAN_ISDN);
+ else
+ num_type = 0;
+ }
+ dbg("number = %s", forwarding->number);
+
+ user_data = g_new0(struct ss_confirm_info, 1);
+
+ switch (op) {
+ case SS_OPCO_REG:
+ user_data->resp = TRESP_SS_FORWARDING_REGISTER;
+ break;
+
+ case SS_OPCO_DEREG:
+ user_data->resp = TRESP_SS_FORWARDING_DEREGISTER;
+ break;
+
+ case SS_OPCO_ACTIVATE:
+ user_data->resp = TRESP_SS_FORWARDING_ACTIVATE;
+ break;
+
+ case SS_OPCO_DEACTIVATE:
+ user_data->resp = TRESP_SS_FORWARDING_DEACTIVATE;
+ break;
+
+ default:
+ dbg("[ error ] unknown op (0x%x)", op);
+ break;
+ }
+
+ if (forwarding->number[0] == '+')
+ num_type = 145;
+ else
+ num_type = 129;
+
+ if (op == SS_OPCO_REG)
+ tmp_str = g_strdup_printf("AT+CCFC=%d,%d,\"%s\",%d,%d", reason, mode, forwarding->number, num_type, classx);
+ else // other opcode does not need num field
+ tmp_str = g_strdup_printf("AT+CCFC=%d,%d,,,%d", reason, mode, classx);
+
+ if (forwarding->mode == SS_CF_MODE_CFNRy) {
+ // add time info to 'no reply' case
+ time = (int) (forwarding->time);
+ cmd_str = g_strdup_printf("%s,,,%d", tmp_str, time);
+ } else {
+ cmd_str = g_strdup_printf("%s", tmp_str);
+ }
+
+ dbg("request command : %s", cmd_str);
+ hal = tcore_object_get_hal(o);
+ pending = tcore_pending_new(o, 0);
+ req = tcore_at_request_new(cmd_str, NULL, TCORE_AT_NO_RESULT);
+ dbg("cmd : %s, prefix(if any) :%s, cmd_len : %d", req->cmd, req->prefix, strlen(req->cmd));
+
+ tcore_pending_set_request_data(pending, 0, req);
+
+ user_data->flavor_type = forwarding->mode;
+ user_data->class = forwarding->class;
+
+ ret = _ss_request_message(pending, o, ur, on_response_ss_forwarding_set, user_data);
+
+ g_free(tmp_str);
+ g_free(cmd_str);
+
+ if (!ret) {
+ dbg("AT request sent failed ")
+ return TCORE_RETURN_FAILURE;
+ }
+
+ return TCORE_RETURN_SUCCESS;
+}
+
+static TReturn _ss_forwarding_get(CoreObject *o,
+ UserRequest *ur,
+ enum telephony_ss_class class,
+ enum telephony_ss_forwarding_mode type,
+ enum tcore_response_command resp)
+{
+ struct ss_confirm_info *user_data = 0;
+ gboolean ret = FALSE;
+ char *cmd_str = NULL;
+ int reason = 0, mode = 0, classx = 0;
+ TcoreHal *hal;
+ TcorePending *pending = NULL;
+ TcoreATRequest *req;
+
+ dbg("function enter");
+
+ switch (type) {
+ case SS_CF_MODE_CFU:
+ reason = 0;
+ break;
+
+ case SS_CF_MODE_CFB:
+ reason = 1;
+ break;
+
+ case SS_CF_MODE_CFNRy:
+ reason = 2;
+ break;
+
+ case SS_CF_MODE_CFNRc:
+ reason = 3;
+ break;
+
+ case SS_CF_MODE_CF_ALL:
+ reason = 4;
+ break;
+
+ case SS_CF_MODE_CFC:
+ reason = 5;
+ break;
+
+ default:
+ dbg("unsupported reason : %d");
+ break;
+ }
+ dbg("reason = %d", reason);
+
+ switch (class) {
+ case SS_CLASS_ALL_TELE:
+ classx = 7;
+ break;
+
+ case SS_CLASS_VOICE:
+ classx = 1;
+ break;
+
+ case SS_CLASS_ALL_DATA_TELE:
+ classx = 2;
+ break;
+
+ case SS_CLASS_FAX:
+ classx = 4;
+ break;
+
+ case SS_CLASS_SMS:
+ classx = 8;
+ break;
+
+ case SS_CLASS_ALL_CS_SYNC:
+ classx = 16;
+ break;
+
+ default:
+ classx = 7;
+ dbg("unsupported class %d. set to default : 7", class);
+ break;
+ }
+
+ dbg("classx = %d", classx);
+
+ // query status - mode set to 2
+ mode = 2;
+ user_data = g_new0(struct ss_confirm_info, 1);
+ user_data->resp = resp;
+ user_data->class = class;
+ user_data->flavor_type = type;
+
+ if (classx == 7)
+ cmd_str = g_strdup_printf("AT+CCFC=%d,%d", reason, mode);
+ else
+ cmd_str = g_strdup_printf("AT+CCFC=%d,%d,,,%d", reason, mode, classx);
+
+ dbg("request command : %s", cmd_str);
+
+ hal = tcore_object_get_hal(o);
+ pending = tcore_pending_new(o, 0);
+ req = tcore_at_request_new(cmd_str, "+CCFC", TCORE_AT_MULTILINE);
+ dbg("cmd : %s, prefix(if any) :%s, cmd_len : %d", req->cmd, req->prefix, strlen(req->cmd));
+
+ tcore_pending_set_request_data(pending, 0, req);
+
+ ret = _ss_request_message(pending, o, ur, on_response_ss_forwarding_get, user_data);
+ g_free(cmd_str);
+
+ if (!ret) {
+ dbg("AT request sent failed ")
+ return TCORE_RETURN_FAILURE;
+ }
+
+ return TCORE_RETURN_SUCCESS;
+}
+
+static TReturn s_ss_forwarding_activate(CoreObject *o, UserRequest *ur)
+{
+ return _ss_forwarding_set(o, ur, SS_OPCO_ACTIVATE);
+}
+
+static TReturn s_ss_forwarding_deactivate(CoreObject *o, UserRequest *ur)
+{
+ return _ss_forwarding_set(o, ur, SS_OPCO_DEACTIVATE);
+}
+
+static TReturn s_ss_forwarding_register(CoreObject *o, UserRequest *ur)
+{
+ return _ss_forwarding_set(o, ur, SS_OPCO_REG);
+}
+
+static TReturn s_ss_forwarding_deregister(CoreObject *o, UserRequest *ur)
+{
+ return _ss_forwarding_set(o, ur, SS_OPCO_DEREG);
+}
+
+static TReturn s_ss_forwarding_get_status(CoreObject *o, UserRequest *ur)
+{
+ struct treq_ss_forwarding *forwarding = 0;
+ forwarding = (struct treq_ss_forwarding *) tcore_user_request_ref_data(ur, 0);
+
+ return _ss_forwarding_get(o, ur, forwarding->class, forwarding->mode, TRESP_SS_FORWARDING_GET_STATUS);
+}
+
+
+static TReturn _ss_waiting_set(CoreObject *o, UserRequest *ur, enum telephony_ss_opcode opco)
+{
+ struct treq_ss_waiting *waiting = 0;
+ struct ss_confirm_info *user_data = 0;
+ gboolean ret = FALSE;
+ int mode = 0, classx = 0;
+ char *cmd_str;
+ TcoreHal *hal;
+ TcorePending *pending = NULL;
+ TcoreATRequest *req;
+
+ dbg("function enter ");
+ waiting = (struct treq_ss_waiting *) tcore_user_request_ref_data(ur, 0);
+ user_data = g_new0(struct ss_confirm_info, 1);
+
+ if (opco == SS_OPCO_ACTIVATE) {
+ user_data->resp = TRESP_SS_WAITING_ACTIVATE;
+ mode = 1; // enable
+ } else if (opco == SS_OPCO_DEACTIVATE) {
+ user_data->resp = TRESP_SS_WAITING_DEACTIVATE;
+ mode = 0; // disable
+ } else
+ dbg("[ error ] unknown ss mode (0x%x)", opco);
+
+ switch (waiting->class) {
+ case SS_CLASS_ALL_TELE:
+ classx = 7;
+ break;
+
+ case SS_CLASS_VOICE:
+ classx = 1;
+ break;
+
+ case SS_CLASS_ALL_DATA_TELE:
+ classx = 2;
+ break;
+
+ case SS_CLASS_FAX:
+ classx = 4;
+ break;
+
+ case SS_CLASS_SMS:
+ classx = 8;
+ break;
+
+ default:
+ classx = 1;
+ dbg("unsupported class %d. set to default : 1", waiting->class);
+ break;
+ }
+ dbg("mode = %d classxx- %d", mode, classx);
+
+ user_data->class = waiting->class;
+ user_data->flavor_type = (int) opco;
+
+ cmd_str = g_strdup_printf("AT+CCWA=1,%d,%d", mode, classx); // always enable +CCWA: unsolicited cmd
+ dbg("request command : %s", cmd_str);
+
+ hal = tcore_object_get_hal(o);
+ pending = tcore_pending_new(o, 0);
+ req = tcore_at_request_new(cmd_str, NULL, TCORE_AT_NO_RESULT);
+ dbg("cmd : %s, prefix(if any) :%s, cmd_len : %d", req->cmd, req->prefix, strlen(req->cmd));
+
+ tcore_pending_set_request_data(pending, 0, req);
+
+ ret = _ss_request_message(pending, o, ur, on_response_ss_waiting_set, user_data);
+ g_free(cmd_str);
+ if (!ret) {
+ dbg("AT request sent failed ")
+ return TCORE_RETURN_FAILURE;
+ }
+ return TCORE_RETURN_SUCCESS;
+}
+
+static TReturn _ss_waiting_get(CoreObject *o,
+ UserRequest *ur,
+ enum telephony_ss_class class,
+ enum tcore_response_command resp)
+{
+ struct ss_confirm_info *user_data = 0;
+ gboolean ret = FALSE;
+ int classx; // mode,
+ char *cmd_str;
+ TcoreHal *hal;
+ TcorePending *pending = NULL;
+ TcoreATRequest *req;
+
+ dbg("function enter")
+ switch (class) {
+ case SS_CLASS_ALL_TELE:
+ classx = 7;
+ break;
+
+ case SS_CLASS_VOICE:
+ classx = 1;
+ break;
+
+ case SS_CLASS_ALL_DATA_TELE:
+ classx = 2;
+ break;
+
+ case SS_CLASS_FAX:
+ classx = 4;
+ break;
+
+ case SS_CLASS_SMS:
+ classx = 8;
+ break;
+
+ default:
+ classx = 7;
+ dbg("unsupported class %d. set to default : 7", class);
+ break;
+ }
+ dbg("classx - %d", classx);
+
+ dbg("allocating user data");
+ user_data = g_new0(struct ss_confirm_info, 1);
+ user_data->resp = resp;
+ user_data->class = class;
+
+ cmd_str = g_strdup_printf("AT+CCWA=1,2,%d", classx); // always enable +CCWA: unsolicited cmd , mode is fixed to 2(query status)
+ dbg("request cmd : %s", cmd_str);
+
+ hal = tcore_object_get_hal(o);
+ pending = tcore_pending_new(o, 0);
+ req = tcore_at_request_new(cmd_str, "+CCWA", TCORE_AT_MULTILINE);
+ dbg("cmd : %s, prefix(if any) :%s, cmd_len : %d", req->cmd, req->prefix, strlen(req->cmd));
+
+ tcore_pending_set_request_data(pending, 0, req);
+
+ ret = _ss_request_message(pending, o, ur, on_response_ss_waiting_get, user_data);
+ g_free(cmd_str);
+ if (!ret) {
+ dbg("AT request sent failed ")
+ return TCORE_RETURN_FAILURE;
+ }
+ return TCORE_RETURN_SUCCESS;
+}
+
+static TReturn s_ss_waiting_activate(CoreObject *o, UserRequest *ur)
+{
+ return _ss_waiting_set(o, ur, SS_OPCO_ACTIVATE);
+}
+
+static TReturn s_ss_waiting_deactivate(CoreObject *o, UserRequest *ur)
+{
+ return _ss_waiting_set(o, ur, SS_OPCO_DEACTIVATE);
+}
+
+static TReturn s_ss_waiting_get_status(CoreObject *o, UserRequest *ur)
+{
+ struct treq_ss_waiting *waiting = 0;
+ waiting = (struct treq_ss_waiting *) tcore_user_request_ref_data(ur, 0);
+
+ return _ss_waiting_get(o, ur, waiting->class, TRESP_SS_WAITING_GET_STATUS);
+}
+
+static TReturn s_ss_cli_activate(CoreObject *o, UserRequest *ur)
+{
+ return TCORE_RETURN_SUCCESS;
+}
+
+static TReturn s_ss_cli_deactivate(CoreObject *o, UserRequest *ur)
+{
+ return TCORE_RETURN_SUCCESS;
+}
+
+static TReturn s_ss_cli_get_status(CoreObject *o, UserRequest *ur)
+{
+ struct treq_ss_cli *cli = 0;
+ gboolean ret = FALSE;
+ char *cmd_prefix = NULL, *rsp_prefix = NULL, *cmd_str = NULL;
+ enum telephony_ss_cli_type *user_data = 0;
+ TcoreHal *hal;
+ TcorePending *pending = NULL;
+ TcoreATRequest *req;
+
+ cli = (struct treq_ss_cli *) tcore_user_request_ref_data(ur, 0);
+ switch (cli->type) {
+ case SS_CLI_TYPE_CLIP:
+ cmd_prefix = "+CLIP";
+ rsp_prefix = "+CLIP";
+ break;
+
+ case SS_CLI_TYPE_CLIR:
+ cmd_prefix = "+CLIR";
+ rsp_prefix = "+CLIR";
+ break;
+
+ case SS_CLI_TYPE_COLP:
+ cmd_prefix = "+COLP";
+ rsp_prefix = "+COLP";
+ break;
+
+ case SS_CLI_TYPE_COLR:
+ cmd_prefix = "+COLR";
+ rsp_prefix = "+COLR";
+ break;
+
+ case SS_CLI_TYPE_CNAP:
+ cmd_prefix = "+CNAP";
+ rsp_prefix = "+CNAP";
+ break;
+
+ case SS_CLI_TYPE_CDIP:
+ default:
+ dbg("unsupported cli_type : %d", cli->type);
+ return TCORE_RETURN_FAILURE;
+ break;
+ }
+ dbg("cmd_prefix : %s", cmd_prefix);
+
+ cmd_str = g_strdup_printf("AT%s?", cmd_prefix);
+ dbg("request cmd : %s", cmd_str);
+
+ user_data = g_new0(enum telephony_ss_cli_type, 1);
+ *user_data = cli->type;
+
+ hal = tcore_object_get_hal(o);
+ pending = tcore_pending_new(o, 0);
+
+ req = tcore_at_request_new(cmd_str, rsp_prefix, TCORE_AT_SINGLELINE);
+ dbg("cmd : %s, prefix(if any) :%s, cmd_len : %d", req->cmd, req->prefix, strlen(req->cmd));
+ tcore_pending_set_request_data(pending, 0, req);
+
+ ret = _ss_request_message(pending, o, ur, on_response_ss_cli_get, user_data);
+ g_free(cmd_str);
+ if (!ret) {
+ dbg("AT request sent failed ")
+ return TCORE_RETURN_FAILURE;
+ }
+ return TCORE_RETURN_SUCCESS;
+}
+
+static TReturn s_ss_send_ussd(CoreObject *o, UserRequest *ur)
+{
+ UssdSession *ussd_s = 0;
+ struct treq_ss_ussd *ussd = 0;
+ struct ss_confirm_info *user_data = 0;
+ gboolean ret = FALSE;
+ char *cmd_str;
+ TcoreHal *hal;
+ TcorePending *pending = NULL;
+ TcoreATRequest *req;
+
+ dbg("function enter");
+ ussd = (struct treq_ss_ussd *) tcore_user_request_ref_data(ur, 0);
+ cmd_str = g_strdup_printf("AT+CUSD=1,\"%s\",%d", ussd->str, 0x0f); // always enable +CUSD: unsolicited cmd. set to dcs to 0x0f. only supports HEX type
+ dbg("request command : %s", cmd_str);
+
+ user_data = g_new0(struct ss_confirm_info, 1);
+ user_data->resp = TRESP_SS_SEND_USSD;
+ ussd_s = tcore_ss_ussd_get_session(o);
+ if (!ussd_s) {
+ dbg("USSD session does not exist");
+ tcore_ss_ussd_create_session(o, (enum tcore_ss_ussd_type) ussd->type, (void *) tcore_user_request_ref(ur), 0);
+ } else {
+ if (ussd->type == SS_USSD_TYPE_USER_INITIATED) {
+ dbg("[ error ] ussd session is already exist");
+ g_free(user_data);
+ return TCORE_RETURN_FAILURE;
+ }
+
+ tcore_ss_ussd_set_session_type(ussd_s, (enum tcore_ss_ussd_type) ussd->type);
+ }
+
+ hal = tcore_object_get_hal(o);
+ pending = tcore_pending_new(o, 0);
+ req = tcore_at_request_new(cmd_str, NULL, TCORE_AT_NO_RESULT);
+ dbg("cmd : %s, prefix(if any) :%s, cmd_len : %d", req->cmd, req->prefix, strlen(req->cmd));
+
+ tcore_pending_set_request_data(pending, 0, req);
+
+ ret = _ss_request_message(pending, o, ur, on_confirmation_ss_ussd, user_data);
+ g_free(cmd_str);
+
+ if (!ret) {
+ dbg("AT request sent failed ")
+ return TCORE_RETURN_FAILURE;
+ }
+ return TCORE_RETURN_SUCCESS;
+}
+
+static TReturn s_ss_set_aoc(CoreObject *o, UserRequest *ur)
+{
+ dbg("[ error ] unsupported function");
+ return TCORE_RETURN_SUCCESS;
+}
+
+static TReturn s_ss_get_aoc(CoreObject *o, UserRequest *ur)
+{
+ dbg("[ error ] unsupported function");
+ return TCORE_RETURN_SUCCESS;
+}
+
+
+static struct tcore_call_control_operations call_ops = {
+ .answer_hold_and_accept = s_ss_manage_call_2_send,
+ .answer_replace = s_ss_manage_call_1_send,
+ .answer_reject = s_ss_manage_call_0_send,
+ .end_specific = s_ss_manage_call_1x_send,
+ .end_all_active = s_ss_manage_call_1_send,
+ .end_all_held = s_ss_manage_call_0_send,
+ .active = s_ss_manage_call_2_send,
+ .hold = s_ss_manage_call_2_send,
+ .swap = s_ss_manage_call_2_send,
+ .join = s_ss_manage_call_3_send,
+ .split = s_ss_manage_call_2x_send,
+ .transfer = s_ss_manage_call_4_send,
+ .deflect = s_ss_manage_call_4dn_send,
+};
+
+static TReturn s_ss_manage_call_send(CoreObject *o, UserRequest *ur, const char *cmd, ConfirmCallback cb, void *user_data)
+{
+ TcorePending *pending = NULL;
+ TcoreATRequest *req;
+ gboolean ret = FALSE;
+
+ pending = tcore_pending_new(o, 0);
+ req = tcore_at_request_new(cmd, NULL, TCORE_AT_NO_RESULT);
+ dbg("cmd : %s, prefix(if any) :%s, cmd_len : %d", req->cmd, req->prefix, strlen(req->cmd));
+ tcore_pending_set_request_data(pending, 0, req);
+
+ ret = _ss_request_message(pending, o, ur, (TcorePendingResponseCallback) cb, user_data);
+ if (!ret) {
+ dbg("AT request sent failed ")
+ return TCORE_RETURN_FAILURE;
+ }
+ return TCORE_RETURN_SUCCESS;
+}
+
+static TReturn s_ss_manage_call_0_send(CoreObject *o, UserRequest *ur, ConfirmCallback cb, void *user_data)
+{
+ char *cmd_str = NULL;
+ gboolean ret = FALSE;
+
+ dbg("function enter");
+ cmd_str = g_strdup_printf("%s", "AT+CHLD=0");
+ dbg("cmd : %s, prefix(if any) : %s, cmd_len : %d", cmd_str, "N/A", strlen(cmd_str));
+
+ ret = s_ss_manage_call_send(o, ur, cmd_str, cb, user_data);
+ g_free(cmd_str);
+ return ret;
+}
+
+static TReturn s_ss_manage_call_1_send(CoreObject *o, UserRequest *ur, ConfirmCallback cb, void *user_data)
+{
+ char *cmd_str = NULL;
+ gboolean ret = FALSE;
+
+ dbg("function enter");
+ cmd_str = g_strdup_printf("%s", "AT+CHLD=1");
+ dbg("cmd : %s, prefix(if any) : %s, cmd_len : %d", cmd_str, "N/A", strlen(cmd_str));
+
+ ret = s_ss_manage_call_send(o, ur, cmd_str, cb, user_data);
+ g_free(cmd_str);
+ return ret;
+}
+
+static TReturn s_ss_manage_call_1x_send(CoreObject *o, UserRequest *ur, const int id, ConfirmCallback cb, void *user_data)
+{
+ char *cmd_str = NULL;
+ gboolean ret = FALSE;
+
+ dbg("function enter");
+ cmd_str = g_strdup_printf("%s%d", "AT+CHLD=1", id);
+ dbg("cmd : %s, prefix(if any) : %s, cmd_len : %d", cmd_str, "N/A", strlen(cmd_str));
+
+ ret = s_ss_manage_call_send(o, ur, cmd_str, cb, user_data);
+ g_free(cmd_str);
+ return ret;
+}
+
+static TReturn s_ss_manage_call_2_send(CoreObject *o, UserRequest *ur, ConfirmCallback cb, void *user_data)
+{
+ char *cmd_str = NULL;
+ gboolean ret = FALSE;
+
+ dbg("function enter");
+ cmd_str = g_strdup_printf("%s", "AT+CHLD=2");
+ dbg("cmd : %s, prefix(if any) : %s, cmd_len : %d", cmd_str, "N/A", strlen(cmd_str));
+
+ ret = s_ss_manage_call_send(o, ur, cmd_str, cb, user_data);
+ g_free(cmd_str);
+ return ret;
+}
+
+static TReturn s_ss_manage_call_2x_send(CoreObject *o, UserRequest *ur, const int id, ConfirmCallback cb, void *user_data)
+{
+ char *cmd_str = NULL;
+ gboolean ret = FALSE;
+
+ dbg("function enter");
+ cmd_str = g_strdup_printf("%s%d", "AT+CHLD=2", id);
+ dbg("cmd : %s, prefix(if any) : %s, cmd_len : %d", cmd_str, "N/A", strlen(cmd_str));
+
+ ret = s_ss_manage_call_send(o, ur, cmd_str, cb, user_data);
+ g_free(cmd_str);
+ return ret;
+}
+
+static TReturn s_ss_manage_call_3_send(CoreObject *o, UserRequest *ur, ConfirmCallback cb, void *user_data)
+{
+ char *cmd_str = NULL;
+ gboolean ret = FALSE;
+
+ dbg("function enter");
+ cmd_str = g_strdup_printf("%s", "AT+CHLD=3");
+
+ ret = s_ss_manage_call_send(o, ur, cmd_str, cb, user_data);
+ g_free(cmd_str);
+ return ret;
+}
+
+
+static TReturn s_ss_manage_call_4_send(CoreObject *o, UserRequest *ur, ConfirmCallback cb, void *user_data)
+{
+ char *cmd_str = NULL;
+ gboolean ret = FALSE;
+
+ dbg("function enter");
+ cmd_str = g_strdup_printf("%s", "AT+CHLD=4");
+
+ ret = s_ss_manage_call_send(o, ur, cmd_str, cb, user_data);
+ g_free(cmd_str);
+ return ret;
+}
+
+static TReturn s_ss_manage_call_4dn_send(CoreObject *o, UserRequest *ur, const char *number, ConfirmCallback cb, void *user_data)
+{
+ char *cmd_str = NULL;
+ gboolean ret = FALSE;
+
+ dbg("function enter");
+ cmd_str = g_strdup_printf("%s%s", "AT+CHLD=4", number);
+
+ ret = s_ss_manage_call_send(o, ur, cmd_str, cb, user_data);
+ g_free(cmd_str);
+
+ return ret;
+}
+
+gboolean s_ss_init(TcorePlugin *p, TcoreHal *h)
+{
+ CoreObject *so = 0, *co = 0;
+ struct property_call_info *data = 0;
+
+ so = tcore_ss_new(p, "ss", &ss_ops, h);
+ if (!so) {
+ dbg("[ error ] ss_new()");
+ return FALSE;
+ }
+
+ co = tcore_plugin_ref_core_object(p, "call");
+ if (!co) {
+ dbg("[ error ] plugin_ref_core_object");
+ return FALSE;
+ }
+
+ tcore_call_control_set_operations(co, &call_ops);
+
+ tcore_object_add_callback(so, "+CSSU", on_notification_ss_info, 0);
+ tcore_object_add_callback(so, "+CSSI", on_notification_ss_info, 0);
+ tcore_object_add_callback(so, "+CUSD", on_notification_ss_ussd, 0);
+
+ data = calloc(sizeof(struct property_call_info *), 1);
+ tcore_plugin_link_property(p, "SS", data);
+
+ return TRUE;
+}
+
+void s_ss_exit(TcorePlugin *p)
+{
+ CoreObject *o;
+ struct property_network_info *data;
+
+ o = tcore_plugin_ref_core_object(p, "ss");
+
+ data = tcore_plugin_ref_property(p, "SS");
+ if (data)
+ free(data);
+
+ tcore_ss_free(o);
+}