release tizen_2.0
[framework/api/sim.git] / src / sim.c
index fb24a09..1bc52df 100644 (file)
--- a/src/sim.c
+++ b/src/sim.c
  * limitations under the License.
  */
 
-
 #include <sim.h>
-#include <TapiCommon.h>
+#include <tapi_common.h>
+#include <TapiUtility.h>
 #include <ITapiSim.h>
-#include <vconf.h>
-#include <vconf-keys.h>
+
 #include <string.h>
 #include <stdlib.h>
 #include <stdio.h>
 #include <dlog.h>
+
 #include <glib.h>
+#include <glib-object.h>
+#include <gio/gio.h>
 
 #ifdef LOG_TAG
 #undef LOG_TAG
 #endif
 #define LOG_TAG "TIZEN_N_SIM"
 
-typedef struct sim_cb_data
-{
+struct tapi_handle {
+       gpointer dbus_connection;
+       char *path;
+       char *cp_name;
+       GHashTable *evt_list;
+       char cookie[20];
+};
+
+typedef struct sim_cb_data {
        sim_state_e previous_state;
-       const void* cb;
+       struct tapi_handle *th;
+       void* cb;
        void* user_data;
 } sim_cb_data;
 
-// Whether vconf_notifiy_key_chnaged is registered or not
-static bool init_is_registered = false;
-static bool chv_is_registered = false;
-static bool slot_is_registered = false;
-
-// Callback function data
-static sim_cb_data sim_state_cb = {SIM_STATE_UNKNOWN, NULL, NULL};
-
-// Callback function adapter
-static void __sim_state_changed_cb_adapter(keynode_t *node, void* user_data);
+static struct tapi_handle *ghandle = NULL;
 
 // Internal Macros
 #define SIM_CHECK_INPUT_PARAMETER(arg) \
@@ -57,281 +58,298 @@ static void __sim_state_changed_cb_adapter(keynode_t *node, void* user_data);
                return SIM_ERROR_INVALID_PARAMETER; \
        }
 
-#define SIM_INIT() \
-       if( tel_init() != TAPI_API_SUCCESS ) \
-       { \
+#define SIM_INIT(th) \
+       th = tel_init(NULL); \
+       if (!th) { \
                LOGE("[%s] OPERATION_FAILED(0x%08x)", __FUNCTION__, SIM_ERROR_OPERATION_FAILED); \
                return SIM_ERROR_OPERATION_FAILED; \
        }
 
+#define SIM_MAKE_CB(ccb,th,callback,user_data)  \
+       ccb = (sim_cb_data*) calloc(sizeof(sim_cb_data), 1);\
+       ccb->th = th; \
+       ccb->cb = (void*) callback;\
+       ccb->user_data = user_data
+
+static sim_error_e _convert_access_rt_to_sim_error(TelSimAccessResult_t access_rt)
+{
+       sim_error_e error = SIM_ERROR_NONE;
+       switch (access_rt) {
+               case TAPI_SIM_ACCESS_SUCCESS:
+                       error = SIM_ERROR_NONE;
+                       break;
+               case TAPI_SIM_ACCESS_FILE_NOT_FOUND:
+               case TAPI_SIM_ACCESS_ACCESS_CONDITION_NOT_SATISFIED:
+                       error = SIM_ERROR_NOT_AVAILABLE;
+                       break;
+               case TAPI_SIM_ACCESS_CARD_ERROR:
+               case TAPI_SIM_ACCESS_FAILED:
+               default:
+                       error = SIM_ERROR_OPERATION_FAILED;
+                       break;
+       }
+       return error;
+}
 
 int sim_get_icc_id(char** icc_id)
 {
-       TelSimIccIdInfo_t icc_data;
        int error_code = SIM_ERROR_NONE;
        int card_changed = 0;
        TelSimCardStatus_t sim_card_state = 0x00;
+       struct tapi_handle *th = NULL;
+       GError *gerr = NULL;
+       GVariant *sync_gv = NULL;
+       gchar *iccid = NULL;
+       TelSimAccessResult_t result = TAPI_SIM_ACCESS_SUCCESS;
 
        SIM_CHECK_INPUT_PARAMETER(icc_id);
-       SIM_INIT();
-       
-       if( tel_get_sim_init_info(&sim_card_state, &card_changed) != 0 
-               || sim_card_state != TAPI_SIM_STATUS_SIM_INIT_COMPLETED )
-       {
-               LOGE("[%s] NOT_AVAILABLE(0x%08x)", __FUNCTION__, SIM_ERROR_NOT_AVAILABLE);              
-               error_code = SIM_ERROR_NOT_AVAILABLE;   
-       }
-       
-       else
-       {
-               if( tel_get_sim_iccid(&icc_data) != 0 )
-               {
-                       LOGE("[%s] OPERATION_FAILED(0x%08x)", __FUNCTION__, SIM_ERROR_OPERATION_FAILED);                
-                       error_code = SIM_ERROR_OPERATION_FAILED;        
-               }
-               else
-               {
-                       *icc_id = strndup(icc_data.icc_num, icc_data.icc_length);
-                       if( *icc_id == NULL )
-                       {
-                               LOGE("[%s] OUT_OF_MEMORY(0x%08x)", __FUNCTION__, SIM_ERROR_OUT_OF_MEMORY);
-                               error_code = SIM_ERROR_OUT_OF_MEMORY; 
-                       }                       
+       SIM_INIT(th);
+
+       if (tel_get_sim_init_info(th, &sim_card_state, &card_changed) != 0 || sim_card_state != TAPI_SIM_STATUS_SIM_INIT_COMPLETED) {
+               LOGE("[%s] NOT_AVAILABLE(0x%08x)", __FUNCTION__, SIM_ERROR_NOT_AVAILABLE);
+               error_code = SIM_ERROR_NOT_AVAILABLE;
+       } else {
+               sync_gv = g_dbus_connection_call_sync(th->dbus_connection, DBUS_TELEPHONY_SERVICE, th->path,
+                               DBUS_TELEPHONY_SIM_INTERFACE, "GetICCID", NULL, NULL, G_DBUS_CALL_FLAGS_NONE, -1,
+                               NULL, &gerr);
+
+               if (sync_gv) {
+                       g_variant_get(sync_gv, "(is)", &result, &iccid);
+                       if (result == TAPI_SIM_ACCESS_SUCCESS) {
+                               if (iccid != NULL && strlen(iccid) != 0) {
+                                       *icc_id = (char*) malloc(strlen(iccid) + 1);
+                                       if (*icc_id == NULL) {
+                                               LOGE("[%s] OUT_OF_MEMORY(0x%08x)", __FUNCTION__, SIM_ERROR_OUT_OF_MEMORY);
+                                               error_code = SIM_ERROR_OUT_OF_MEMORY;
+                                       } else {
+                                               snprintf(*icc_id, strlen(iccid) + 1, "%s", iccid);
+                                       }
+                               } else {
+                                       *icc_id = NULL;
+                               }
+                       } else {
+                               error_code = _convert_access_rt_to_sim_error(result);
+                       }
+               } else {
+                       LOGE("g_dbus_conn failed. error (%s)", gerr->message);
+                       g_error_free(gerr);
+                       error_code = SIM_ERROR_OPERATION_FAILED;
                }
        }
-
-       tel_deinit();
+       tel_deinit(th);
        return error_code;
 }
 
-
 int sim_get_mcc(char** mcc)
 {
        TelSimImsiInfo_t sim_imsi_info;
        int error_code = SIM_ERROR_NONE;
        int card_changed = 0;
        TelSimCardStatus_t sim_card_state = 0x00;
+       struct tapi_handle *th = NULL;
 
        SIM_CHECK_INPUT_PARAMETER(mcc);
-       SIM_INIT();
-       
-       if( tel_get_sim_init_info(&sim_card_state, &card_changed) != 0 
-               || sim_card_state != TAPI_SIM_STATUS_SIM_INIT_COMPLETED )
-       {
-               LOGE("[%s] NOT_AVAILABLE(0x%08x)", __FUNCTION__, SIM_ERROR_NOT_AVAILABLE);              
-               error_code = SIM_ERROR_NOT_AVAILABLE;   
-       }
-       else
-       {
-               if( tel_get_sim_imsi(&sim_imsi_info) != 0 )
-               {
-                       LOGE("[%s] OPERATION_FAILED(0x%08x)", __FUNCTION__, SIM_ERROR_OPERATION_FAILED);                
-                       error_code = SIM_ERROR_OPERATION_FAILED;        
-               }
-               else
-               {
-                       *mcc = (char*)malloc(sizeof(char) * (TAPI_SIM_MCC_CODE_LEN+1));
-                       if( *mcc == NULL )
-                       {
+       SIM_INIT(th);
+
+       if (tel_get_sim_init_info(th, &sim_card_state, &card_changed) != 0 || sim_card_state != TAPI_SIM_STATUS_SIM_INIT_COMPLETED) {
+               LOGE("[%s] NOT_AVAILABLE(0x%08x)", __FUNCTION__, SIM_ERROR_NOT_AVAILABLE);
+               error_code = SIM_ERROR_NOT_AVAILABLE;
+       } else {
+               if (tel_get_sim_imsi(th, &sim_imsi_info) != 0) {
+                       LOGE("[%s] OPERATION_FAILED(0x%08x)", __FUNCTION__, SIM_ERROR_OPERATION_FAILED);
+                       error_code = SIM_ERROR_OPERATION_FAILED;
+               } else {
+                       *mcc = (char*) malloc(sizeof(char) * (3 + 1));
+                       if (*mcc == NULL) {
                                LOGE("[%s] OUT_OF_MEMORY(0x%08x)", __FUNCTION__, SIM_ERROR_OUT_OF_MEMORY);
-                               error_code = SIM_ERROR_OUT_OF_MEMORY;                                                        
-                       }
-                       else
-                       {
-                               strncpy(*mcc, sim_imsi_info.szMcc, TAPI_SIM_MCC_CODE_LEN+1);                            
+                               error_code = SIM_ERROR_OUT_OF_MEMORY;
+                       } else {
+                               snprintf(*mcc, strlen(sim_imsi_info.szMcc) + 1, "%s", sim_imsi_info.szMcc);
                        }
                }
        }
-
-       tel_deinit();
+       tel_deinit(th);
        return error_code;
 }
 
-
 int sim_get_mnc(char** mnc)
 {
        TelSimImsiInfo_t sim_imsi_info;
        int error_code = SIM_ERROR_NONE;
        int card_changed = 0;
-       TelSimCardStatus_t sim_card_state = 0x00;       
+       TelSimCardStatus_t sim_card_state = 0x00;
+       struct tapi_handle *th = NULL;
 
        SIM_CHECK_INPUT_PARAMETER(mnc);
-       SIM_INIT();
+       SIM_INIT(th);
 
-       if( tel_get_sim_init_info(&sim_card_state, &card_changed) != 0 
-               || sim_card_state != TAPI_SIM_STATUS_SIM_INIT_COMPLETED )
-       {
-               LOGE("[%s] NOT_AVAILABLE(0x%08x)", __FUNCTION__, SIM_ERROR_NOT_AVAILABLE);              
-               error_code = SIM_ERROR_NOT_AVAILABLE;   
-       }
-       else
-       {
-               if( tel_get_sim_imsi(&sim_imsi_info) != 0 )
-               {
-                       LOGE("[%s] OPERATION_FAILED(0x%08x)", __FUNCTION__, SIM_ERROR_OPERATION_FAILED);                
-                       error_code = SIM_ERROR_OPERATION_FAILED;        
-               }
-               else
-               {
-                       *mnc = (char*)malloc(sizeof(char) * (TAPI_SIM_MNC_CODE_LEN+1));
-                       if( *mnc == NULL )
-                       {
+       if (tel_get_sim_init_info(th, &sim_card_state, &card_changed) != 0
+                       || sim_card_state != TAPI_SIM_STATUS_SIM_INIT_COMPLETED) {
+               LOGE("[%s] NOT_AVAILABLE(0x%08x)", __FUNCTION__, SIM_ERROR_NOT_AVAILABLE);
+               error_code = SIM_ERROR_NOT_AVAILABLE;
+       } else {
+               if (tel_get_sim_imsi(th, &sim_imsi_info) != 0) {
+                       LOGE("[%s] OPERATION_FAILED(0x%08x)", __FUNCTION__, SIM_ERROR_OPERATION_FAILED);
+                       error_code = SIM_ERROR_OPERATION_FAILED;
+               } else {
+                       *mnc = (char*) malloc(sizeof(char) * (3 + 1));
+                       if (*mnc == NULL) {
                                LOGE("[%s] OUT_OF_MEMORY(0x%08x)", __FUNCTION__, SIM_ERROR_OUT_OF_MEMORY);
                                error_code = SIM_ERROR_OUT_OF_MEMORY;
-                       }
-                       else
-                       {
-                               strncpy(*mnc, sim_imsi_info.szMnc, TAPI_SIM_MNC_CODE_LEN+1);
+                       } else {
+                               snprintf(*mnc, strlen(sim_imsi_info.szMnc) + 1, "%s", sim_imsi_info.szMnc);
                        }
                }
        }
 
-       tel_deinit();
+       tel_deinit(th);
        return SIM_ERROR_NONE;
 }
 
-
 int sim_get_msin(char** msin)
 {
        TelSimImsiInfo_t sim_imsi_info;
        int error_code = SIM_ERROR_NONE;
        int card_changed = 0;
        TelSimCardStatus_t sim_card_state = 0x00;
+       struct tapi_handle *th = NULL;
 
        SIM_CHECK_INPUT_PARAMETER(msin);
-       SIM_INIT();
+       SIM_INIT(th);
 
-       if( tel_get_sim_init_info(&sim_card_state, &card_changed) != 0
-               || sim_card_state != TAPI_SIM_STATUS_SIM_INIT_COMPLETED )
-       {
+       if (tel_get_sim_init_info(th, &sim_card_state, &card_changed) != 0 || sim_card_state != TAPI_SIM_STATUS_SIM_INIT_COMPLETED) {
                LOGE("[%s] NOT_AVAILABLE(0x%08x)", __FUNCTION__, SIM_ERROR_NOT_AVAILABLE);
                error_code = SIM_ERROR_NOT_AVAILABLE;
-       }
-       else
-       {
-               if( tel_get_sim_imsi(&sim_imsi_info) != 0 )
-               {
+       } else {
+               if (tel_get_sim_imsi(th, &sim_imsi_info) != 0) {
                        LOGE("[%s] OPERATION_FAILED(0x%08x)", __FUNCTION__, SIM_ERROR_OPERATION_FAILED);
                        error_code = SIM_ERROR_OPERATION_FAILED;
-               }
-               else
-               {
-                       *msin = (char*)malloc(sizeof(char) * (TAPI_SIM_MSIN_CODE_LEN+1));
-                       if( *msin == NULL )
-                       {
+               } else {
+                       *msin = (char*) malloc(sizeof(char) * (10 + 1));
+                       if (*msin == NULL) {
                                LOGE("[%s] OUT_OF_MEMORY(0x%08x)", __FUNCTION__, SIM_ERROR_OUT_OF_MEMORY);
                                error_code = SIM_ERROR_OUT_OF_MEMORY;
-                       }
-                       else
-                       {
-                               strncpy(*msin, sim_imsi_info.szMsin, TAPI_SIM_MSIN_CODE_LEN+1);
+                       } else {
+                               snprintf(*msin, strlen(sim_imsi_info.szMsin) + 1, "%s", sim_imsi_info.szMsin);
                        }
                }
        }
-
-       tel_deinit();
+       tel_deinit(th);
        return error_code;
 }
 
-
 int sim_get_spn(char** spn)
 {
        int error_code = SIM_ERROR_NONE;
        int card_changed = 0;
-       TelSimCardStatus_t sim_card_state = 0x00;       
-       char* service_provider_name = NULL;
+       TelSimCardStatus_t sim_card_state = 0x00;
+       struct tapi_handle *th = NULL;
+       GError *gerr = NULL;
+       GVariant *sync_gv = NULL;
+       TelSimAccessResult_t result = TAPI_SIM_ACCESS_SUCCESS;
+       gchar *spn_str = NULL;
+       guchar dc = 0;
 
        SIM_CHECK_INPUT_PARAMETER(spn);
-       SIM_INIT();
+       SIM_INIT(th);
 
-       error_code = tel_get_sim_init_info(&sim_card_state, &card_changed);
-       if( error_code != 0 || sim_card_state != TAPI_SIM_STATUS_SIM_INIT_COMPLETED )
-       {
-               LOGE("[%s] NOT_AVAILABLE(0x%08x)", __FUNCTION__, SIM_ERROR_NOT_AVAILABLE);              
-               error_code = SIM_ERROR_NOT_AVAILABLE;   
-       }
-       else
-       {
-               service_provider_name = vconf_get_str(VCONFKEY_TELEPHONY_SPN_NAME);
-               if( service_provider_name == NULL )
-               {
-                       LOGE("[%s] OPERATION_FAILED(0x%08x)", __FUNCTION__, SIM_ERROR_OPERATION_FAILED);
+       if (tel_get_sim_init_info(th, &sim_card_state, &card_changed) != 0
+                       || sim_card_state != TAPI_SIM_STATUS_SIM_INIT_COMPLETED) {
+               LOGE("[%s] NOT_AVAILABLE(0x%08x)", __FUNCTION__, SIM_ERROR_NOT_AVAILABLE);
+               error_code = SIM_ERROR_NOT_AVAILABLE;
+       } else {
+               sync_gv = g_dbus_connection_call_sync(th->dbus_connection, DBUS_TELEPHONY_SERVICE, th->path,
+                               DBUS_TELEPHONY_SIM_INTERFACE, "GetSpn", NULL, NULL, G_DBUS_CALL_FLAGS_NONE, -1,
+                               NULL, &gerr);
+
+               if (sync_gv) {
+                       g_variant_get(sync_gv, "(iys)", &result, &dc, &spn_str);
+                       if (result == TAPI_SIM_ACCESS_SUCCESS) {
+                               if (spn_str != NULL && strlen(spn_str) != 0) {
+                                       *spn = (char*) malloc(strlen(spn_str) + 1);
+                                       if (*spn == NULL) {
+                                               LOGE("[%s] OUT_OF_MEMORY(0x%08x)", __FUNCTION__, SIM_ERROR_OUT_OF_MEMORY);
+                                               error_code = SIM_ERROR_OUT_OF_MEMORY;
+                                       } else {
+                                               snprintf(*spn, strlen(spn_str) + 1, "%s", spn_str);
+                                       }
+                               } else {
+                                       *spn = NULL;
+                               }
+                       } else {
+                               error_code = _convert_access_rt_to_sim_error(result);
+                       }
+               } else {
+                       LOGE("g_dbus_conn failed. error (%s)", gerr->message);
+                       g_error_free(gerr);
                        error_code = SIM_ERROR_OPERATION_FAILED;
                }
-               else if( strlen(service_provider_name) == 0 )
-               {
-                       LOGI("[%s] spn has no value", __FUNCTION__);
-                       free(service_provider_name);
-                       *spn = NULL;
-               }
-               else
-               {
-                       *spn = service_provider_name;
-               }
        }
-
-       tel_deinit();
+       tel_deinit(th);
        return error_code;
 }
 
-
 int sim_get_cphs_operator_name(char** full_name, char** short_name)
 {
-       TelSimCphsLocalInfo_t cphs_info;
        int error_code = SIM_ERROR_NONE;
        int card_changed = 0;
        TelSimCardStatus_t sim_card_state = 0x00;
+       struct tapi_handle *th = NULL;
+       GError *gerr = NULL;
+       GVariant *sync_gv = NULL;
+       TelSimAccessResult_t result = TAPI_SIM_ACCESS_SUCCESS;
+       gchar *full_str = NULL;
+       gchar *short_str = NULL;
 
        SIM_CHECK_INPUT_PARAMETER(full_name);
        SIM_CHECK_INPUT_PARAMETER(short_name);
-       SIM_INIT();
+       SIM_INIT(th);
 
-       if( tel_get_sim_init_info(&sim_card_state, &card_changed) != 0
-               || sim_card_state != TAPI_SIM_STATUS_SIM_INIT_COMPLETED )
-       {
+       if (tel_get_sim_init_info(th, &sim_card_state, &card_changed) != 0
+                       || sim_card_state != TAPI_SIM_STATUS_SIM_INIT_COMPLETED) {
                LOGE("[%s] NOT_AVAILABLE(0x%08x)", __FUNCTION__, SIM_ERROR_NOT_AVAILABLE);
                error_code = SIM_ERROR_NOT_AVAILABLE;
-       }
-       else
-       {
-               if( tel_get_sim_cphs_info(&cphs_info) != 0 )
-               {
-                       LOGE("[%s] OPERATION_FAILED(0x%08x)", __FUNCTION__, SIM_ERROR_OPERATION_FAILED);
-                       error_code = SIM_ERROR_OPERATION_FAILED;
-               }
-               else
-               {
-                       if(cphs_info.opname.NameLength)
-                       {
-                               *full_name = strndup((const char*)cphs_info.opname.OperatorName, cphs_info.opname.NameLength);
-                               if(*full_name == NULL)
-                               {
-                                       LOGE("[%s] OUT_OF_MEMORY(0x%08x)", __FUNCTION__, SIM_ERROR_OUT_OF_MEMORY);
-                                       error_code = SIM_ERROR_OUT_OF_MEMORY;
+       } else {
+               sync_gv = g_dbus_connection_call_sync(th->dbus_connection, DBUS_TELEPHONY_SERVICE, th->path,
+                               DBUS_TELEPHONY_SIM_INTERFACE, "GetCphsNetName", NULL, NULL, G_DBUS_CALL_FLAGS_NONE,
+                               -1, NULL, &gerr);
+
+               if (sync_gv) {
+                       g_variant_get(sync_gv, "(iss)", &result, &full_str, &short_str);
+                       if (result == TAPI_SIM_ACCESS_SUCCESS) {
+                               if (full_str != NULL && strlen(full_str) != 0) {
+                                       *full_name = (char*) malloc(strlen(full_str) + 1);
+                                       if (*full_name == NULL) {
+                                               LOGE("[%s] OUT_OF_MEMORY(0x%08x)", __FUNCTION__, SIM_ERROR_OUT_OF_MEMORY);
+                                               error_code = SIM_ERROR_OUT_OF_MEMORY;
+                                       } else {
+                                               snprintf(*full_name, strlen(full_str) + 1, "%s", full_str);
+                                       }
+                               } else {
+                                       *full_name = NULL;
                                }
-                       }
-                       else
-                       {
-                               *full_name = NULL;
-                       }
 
-                       if(cphs_info.opshortform.ShortNameLength)
-                       {
-                               *short_name = strndup((const char*)cphs_info.opshortform.OperatorShortName, cphs_info.opshortform.ShortNameLength);
-                               if(*short_name == NULL)
-                               {
-                                       LOGE("[%s] OUT_OF_MEMORY(0x%08x)", __FUNCTION__, SIM_ERROR_OUT_OF_MEMORY);
-                                       error_code = SIM_ERROR_OUT_OF_MEMORY;
+                               if (short_str != NULL && strlen(short_str) != 0) {
+                                       *short_name = (char*) malloc(strlen(short_str) + 1);
+                                       if (*short_name == NULL) {
+                                               LOGE("[%s] OUT_OF_MEMORY(0x%08x)", __FUNCTION__, SIM_ERROR_OUT_OF_MEMORY);
+                                               error_code = SIM_ERROR_OUT_OF_MEMORY;
+                                       } else {
+                                               snprintf(*short_name, strlen(short_str) + 1, "%s", short_str);
+                                       }
+                               } else {
+                                       *short_name = NULL;
                                }
+                       } else {
+                               error_code = _convert_access_rt_to_sim_error(result);
                        }
-                       else
-                       {
-                               *short_name = NULL;
-                       }
+               } else {
+                       LOGE("g_dbus_conn failed. error (%s)", gerr->message);
+                       g_error_free(gerr);
+                       error_code = SIM_ERROR_OPERATION_FAILED;
                }
        }
-
-       tel_deinit();
+       tel_deinit(th);
        return error_code;
 }
 
@@ -340,19 +358,16 @@ int sim_get_state(sim_state_e* sim_state)
        int card_changed = 0;
        TelSimCardStatus_t sim_card_state = 0x00;
        int error_code = SIM_ERROR_NONE;
+       struct tapi_handle *th = NULL;
 
        SIM_CHECK_INPUT_PARAMETER(sim_state);
-       SIM_INIT();
+       SIM_INIT(th);
 
-       if( tel_get_sim_init_info(&sim_card_state, &card_changed) != 0 )
-       {
-               LOGE("[%s] OPERATION_FAILED(0x%08x)", __FUNCTION__, SIM_ERROR_OPERATION_FAILED);                
+       if (tel_get_sim_init_info(th, &sim_card_state, &card_changed) != 0) {
+               LOGE("[%s] OPERATION_FAILED(0x%08x)", __FUNCTION__, SIM_ERROR_OPERATION_FAILED);
                error_code = SIM_ERROR_OPERATION_FAILED;
-       }
-       else
-       {
-               switch(sim_card_state)
-               {
+       } else {
+               switch (sim_card_state) {
                        case TAPI_SIM_STATUS_CARD_ERROR:
                                *sim_state = SIM_STATE_UNAVAILABLE;
                                break;
@@ -370,193 +385,213 @@ int sim_get_state(sim_state_e* sim_state)
                                break;
                        case TAPI_SIM_STATUS_SIM_PUK_REQUIRED:
                                *sim_state = SIM_STATE_LOCKED;
-                               break;                          
+                               break;
                        case TAPI_SIM_STATUS_CARD_BLOCKED:
                                *sim_state = SIM_STATE_UNAVAILABLE;
-                               break;                          
+                               break;
                        case TAPI_SIM_STATUS_SIM_NCK_REQUIRED:
                                *sim_state = SIM_STATE_LOCKED;
-                               break;                          
+                               break;
                        case TAPI_SIM_STATUS_SIM_NSCK_REQUIRED:
                                *sim_state = SIM_STATE_LOCKED;
-                               break;                          
+                               break;
                        case TAPI_SIM_STATUS_SIM_SPCK_REQUIRED:
                                *sim_state = SIM_STATE_LOCKED;
-                               break;                          
+                               break;
                        case TAPI_SIM_STATUS_SIM_CCK_REQUIRED:
                                *sim_state = SIM_STATE_LOCKED;
-                               break;                          
+                               break;
                        case TAPI_SIM_STATUS_CARD_REMOVED:
                                *sim_state = SIM_STATE_UNAVAILABLE;
-                               break;                  
+                               break;
                        case TAPI_SIM_STATUS_SIM_LOCK_REQUIRED:
                                *sim_state = SIM_STATE_LOCKED;
                                break;
                        default:
                                *sim_state = SIM_STATE_UNAVAILABLE;
-                               break;                  
+                               break;
                }
        }
 
-       tel_deinit();
+       tel_deinit(th);
        return error_code;
 }
 
-
 int sim_get_subscriber_number(char** subscriber_number)
 {
        int error_code = SIM_ERROR_NONE;
        int card_changed = 0;
-       TelSimCardStatus_t sim_card_state = 0x00;       
-       char* subscriber_number_p = NULL;
+       TelSimCardStatus_t sim_card_state = 0x00;
+       struct tapi_handle *th = NULL;
+       GError *gerr = NULL;
+       GVariant *sync_gv = NULL;
+       GVariant *value = NULL;
+       GVariantIter *iter = NULL;
+       GVariantIter *iter_row = NULL;
+       const gchar *key = NULL;
+       const gchar *str_value = NULL;
+       TelSimAccessResult_t result = TAPI_SIM_ACCESS_SUCCESS;
+       TelSimMsisdnList_t list;
+       int i = 0;
 
        SIM_CHECK_INPUT_PARAMETER(subscriber_number);
-       SIM_INIT();
+       SIM_INIT(th);
 
-       error_code = tel_get_sim_init_info(&sim_card_state, &card_changed);
-       if( error_code != 0 || sim_card_state != TAPI_SIM_STATUS_SIM_INIT_COMPLETED )
-       {
-               LOGE("[%s] NOT_AVAILABLE(0x%08x)", __FUNCTION__, SIM_ERROR_NOT_AVAILABLE);              
-               error_code = SIM_ERROR_NOT_AVAILABLE;   
-       }
-       else
-       {
-               subscriber_number_p = vconf_get_str(VCONFKEY_TELEPHONY_SUBSCRIBER_NUMBER);
-               if( subscriber_number_p == NULL )
-               {
-                       LOGE("[%s] OPERATION_FAILED(0x%08x)", __FUNCTION__, SIM_ERROR_OPERATION_FAILED);
+       if (tel_get_sim_init_info(th, &sim_card_state, &card_changed) != 0 || sim_card_state != TAPI_SIM_STATUS_SIM_INIT_COMPLETED) {
+               LOGE("[%s] NOT_AVAILABLE(0x%08x)", __FUNCTION__, SIM_ERROR_NOT_AVAILABLE);
+               error_code = SIM_ERROR_NOT_AVAILABLE;
+       } else {
+               sync_gv = g_dbus_connection_call_sync(th->dbus_connection, DBUS_TELEPHONY_SERVICE, th->path,
+                               DBUS_TELEPHONY_SIM_INTERFACE, "GetMSISDN", NULL, NULL, G_DBUS_CALL_FLAGS_NONE, -1,
+                               NULL, &gerr);
+
+               if (sync_gv) {
+                       memset(&list, 0, sizeof(TelSimMsisdnList_t));
+                       g_variant_get(sync_gv, "(iaa{sv})", &result, &iter);
+                       list.count = g_variant_iter_n_children(iter);
+
+                       if (result == TAPI_SIM_ACCESS_SUCCESS) {
+                               i = 0;
+                               while (g_variant_iter_next(iter, "a{sv}", &iter_row)) {
+                                       while (g_variant_iter_loop(iter_row, "{sv}", &key, &value)) {
+                                               if (!g_strcmp0(key, "name")) {
+                                                       str_value = g_variant_get_string(value, NULL);
+                                                       snprintf(list.list[i].name, strlen(str_value) + 1, "%s", str_value);
+                                               }
+                                               if (!g_strcmp0(key, "number")) {
+                                                       str_value = g_variant_get_string(value, NULL);
+                                                       snprintf(list.list[i].num, strlen(str_value) + 1, "%s", str_value);
+                                               }
+                                       }
+                                       i++;
+                                       g_variant_iter_free(iter_row);
+                               }
+                               g_variant_iter_free(iter);
+
+                               if (list.list[0].num != NULL && strlen(list.list[0].num) != 0) {
+                                       *subscriber_number = (char*) malloc(strlen(list.list[0].num) + 1);
+                                       if (*subscriber_number == NULL) {
+                                               LOGE("[%s] OUT_OF_MEMORY(0x%08x)", __FUNCTION__, SIM_ERROR_OUT_OF_MEMORY);
+                                               error_code = SIM_ERROR_OUT_OF_MEMORY;
+                                       } else {
+                                               snprintf(*subscriber_number, strlen(list.list[0].num) + 1, "%s",
+                                                               list.list[0].num);
+                                       }
+                               } else {
+                                       *subscriber_number = NULL;
+                               }
+
+                       } else {
+                               error_code = _convert_access_rt_to_sim_error(result);
+                       }
+               } else {
+                       LOGE("g_dbus_conn failed. error (%s)", gerr->message);
+                       g_error_free(gerr);
                        error_code = SIM_ERROR_OPERATION_FAILED;
                }
-               else if( strlen(subscriber_number_p) == 0 )     
-               {
-                       LOGI("[%s] subscriber number has no value", __FUNCTION__);
-                       free(subscriber_number_p);
-                       *subscriber_number = NULL;
-               }
-               else
-               {
-                       *subscriber_number = subscriber_number_p;
-               }
        }
-
-       tel_deinit();
+       tel_deinit(th);
        return error_code;
 }
 
-int sim_set_state_changed_cb(sim_state_changed_cb sim_cb, void* user_data)
+static void on_noti_sim_status(struct tapi_handle *handle, const char *noti_id, void *data,
+               void *user_data)
 {
+       TelSimCardStatus_t *status = data;
+       sim_cb_data *ccb = user_data;
        sim_state_e state = SIM_STATE_UNKNOWN;
-
-       SIM_CHECK_INPUT_PARAMETER(sim_cb);
-
-       if( sim_get_state(&state) != SIM_ERROR_NONE )
-       {
-               LOGE("[%s] OPERATION_FAILED(0x%08x) : fail to get current state of SIM", __FUNCTION__, SIM_ERROR_OPERATION_FAILED);
-               return SIM_ERROR_OPERATION_FAILED;
+       sim_state_changed_cb cb;
+       LOGE("event(%s) receive with status[%d]", TAPI_NOTI_SIM_STATUS, *status);
+
+       switch (*status) {
+               case TAPI_SIM_STATUS_CARD_ERROR:
+                       state = SIM_STATE_UNAVAILABLE;
+                       break;
+               case TAPI_SIM_STATUS_CARD_NOT_PRESENT:
+                       state = SIM_STATE_UNAVAILABLE;
+                       break;
+               case TAPI_SIM_STATUS_SIM_INITIALIZING:
+                       state = SIM_STATE_UNKNOWN;
+                       break;
+               case TAPI_SIM_STATUS_SIM_INIT_COMPLETED:
+                       state = SIM_STATE_AVAILABLE;
+                       break;
+               case TAPI_SIM_STATUS_SIM_PIN_REQUIRED:
+                       state = SIM_STATE_LOCKED;
+                       break;
+               case TAPI_SIM_STATUS_SIM_PUK_REQUIRED:
+                       state = SIM_STATE_LOCKED;
+                       break;
+               case TAPI_SIM_STATUS_CARD_BLOCKED:
+                       state = SIM_STATE_UNAVAILABLE;
+                       break;
+               case TAPI_SIM_STATUS_SIM_NCK_REQUIRED:
+                       state = SIM_STATE_LOCKED;
+                       break;
+               case TAPI_SIM_STATUS_SIM_NSCK_REQUIRED:
+                       state = SIM_STATE_LOCKED;
+                       break;
+               case TAPI_SIM_STATUS_SIM_SPCK_REQUIRED:
+                       state = SIM_STATE_LOCKED;
+                       break;
+               case TAPI_SIM_STATUS_SIM_CCK_REQUIRED:
+                       state = SIM_STATE_LOCKED;
+                       break;
+               case TAPI_SIM_STATUS_CARD_REMOVED:
+                       state = SIM_STATE_UNAVAILABLE;
+                       break;
+               case TAPI_SIM_STATUS_SIM_LOCK_REQUIRED:
+                       state = SIM_STATE_LOCKED;
+                       break;
+               default:
+                       state = SIM_STATE_UNAVAILABLE;
+                       break;
        }
-
-       if( init_is_registered == false) 
-       {               
-               if( vconf_notify_key_changed(VCONFKEY_TELEPHONY_SIM_INIT, (vconf_callback_fn)__sim_state_changed_cb_adapter, NULL) != 0 )
-               {
-                       LOGE("[%s] OPERATION_FAILED(0x%08x) : fail to register callback of sim initialization", 
-                                       __FUNCTION__, SIM_ERROR_OPERATION_FAILED);
-                       return SIM_ERROR_OPERATION_FAILED;
-               }
-               init_is_registered = true;
-       }
-
-       if( chv_is_registered == false )
-       {
-               if( vconf_notify_key_changed(VCONFKEY_TELEPHONY_SIM_CHV, (vconf_callback_fn)__sim_state_changed_cb_adapter, NULL) != 0)
-               {
-                       LOGE("[%s] OPERATION_FAILED(0x%08x) : fail to register callback of several lock verification", 
-                                       __FUNCTION__, SIM_ERROR_OPERATION_FAILED);
-                       return SIM_ERROR_OPERATION_FAILED;
-               }
-               chv_is_registered = true;               
-       }
-
-       if( slot_is_registered == false )
-       {
-               if(vconf_notify_key_changed(VCONFKEY_TELEPHONY_SIM_SLOT, (vconf_callback_fn)__sim_state_changed_cb_adapter, NULL) != 0)
-               {
-                       LOGE("[%s] OPERATION_FAILED(0x%08x) : fail to register callback of sim slot", 
-                                       __FUNCTION__, SIM_ERROR_OPERATION_FAILED);
-                       return SIM_ERROR_OPERATION_FAILED;
-               }
-               slot_is_registered = true;
+       if (!ccb->cb) {
+               LOGE("[%s] callback is null", __FUNCTION__);
+               return;
        }
-
-       sim_state_cb.previous_state = state;
-       sim_state_cb.cb = sim_cb;
-       sim_state_cb.user_data = user_data;
-
-       return SIM_ERROR_NONE;
+       cb = ccb->cb;
+       cb(state, ccb->user_data);
 }
 
-int sim_unset_state_changed_cb()
+int sim_set_state_changed_cb(sim_state_changed_cb sim_cb, void* user_data)
 {
-       if( init_is_registered == true) 
-       {               
-               if( vconf_ignore_key_changed(VCONFKEY_TELEPHONY_SIM_INIT, (vconf_callback_fn)__sim_state_changed_cb_adapter) != 0 )
-               {
-                       LOGE("[%s] OPERATION_FAILED(0x%08x) : fail to unregister callback of sim initialization", 
-                                       __FUNCTION__, SIM_ERROR_OPERATION_FAILED);
-                       return SIM_ERROR_OPERATION_FAILED;
-               }
-               init_is_registered = false;
-       }
+       int error_code = SIM_ERROR_NONE;
+       int ret;
+       sim_cb_data *ccb = NULL;
 
-       if( chv_is_registered == true )
-       {
-               if( vconf_ignore_key_changed(VCONFKEY_TELEPHONY_SIM_CHV, (vconf_callback_fn)__sim_state_changed_cb_adapter) != 0)
-               {
-                       LOGE("[%s] OPERATION_FAILED(0x%08x) : fail to unregister callback of several lock verification", 
-                                       __FUNCTION__, SIM_ERROR_OPERATION_FAILED);
-                       return SIM_ERROR_OPERATION_FAILED;
-               }
-               chv_is_registered = false;              
-       }
+       SIM_CHECK_INPUT_PARAMETER(sim_cb);
 
-       if( slot_is_registered == true )
-       {
-               if( vconf_ignore_key_changed(VCONFKEY_TELEPHONY_SIM_SLOT, (vconf_callback_fn)__sim_state_changed_cb_adapter) != 0)
-               {
-                       LOGE("[%s] OPERATION_FAILED(0x%08x) : fail to unregister callback of sim slot", 
-                                       __FUNCTION__, SIM_ERROR_OPERATION_FAILED);
-                       return SIM_ERROR_OPERATION_FAILED;
-               }
-               slot_is_registered = false;
+       ghandle = tel_init(NULL);
+       if (!ghandle) {
+               LOGE("[%s] OPERATION_FAILED(0x%08x)", __FUNCTION__, SIM_ERROR_OPERATION_FAILED);
+               return SIM_ERROR_OPERATION_FAILED;
        }
 
-       sim_state_cb.previous_state = SIM_STATE_UNKNOWN;
-       sim_state_cb.cb = NULL;
-       sim_state_cb.user_data = NULL;
+       ccb = (sim_cb_data*) calloc(sizeof(sim_cb_data), 1);
+       ccb->th = ghandle;
+       ccb->cb = (void*) sim_cb;
+       ccb->user_data = user_data;
 
-       return SIM_ERROR_NONE;
+       ret = tel_register_noti_event(ghandle, TAPI_NOTI_SIM_STATUS, on_noti_sim_status, ccb);
+       if (ret != TAPI_API_SUCCESS) error_code = SIM_ERROR_OPERATION_FAILED;
+       return error_code;
 }
 
-static void __sim_state_changed_cb_adapter(keynode_t *node, void* user_data) 
+int sim_unset_state_changed_cb()
 {
-       sim_state_e sim_state = SIM_STATE_UNKNOWN;
-
-       if( sim_state_cb.cb == NULL )
-       {
-               return;
-       }
+       int error_code = SIM_ERROR_NONE;
+       int ret;
 
-       if( sim_get_state(&sim_state) == SIM_ERROR_NONE )
-       {
-               if( sim_state != sim_state_cb.previous_state )
-               {
-                       ((sim_state_changed_cb)(sim_state_cb.cb))(sim_state, sim_state_cb.user_data);
-                       sim_state_cb.previous_state = sim_state;
+       if (ghandle == NULL) {
+               ghandle = tel_init(NULL);
+               if (!ghandle) {
+                       LOGE("[%s] OPERATION_FAILED(0x%08x)", __FUNCTION__, SIM_ERROR_OPERATION_FAILED);
+                       return SIM_ERROR_OPERATION_FAILED;
                }
        }
+       ret = tel_deregister_noti_event(ghandle, TAPI_NOTI_SIM_STATUS);
+       if (ret != TAPI_API_SUCCESS) error_code = SIM_ERROR_OPERATION_FAILED;
+       return error_code;
 }
-
-
-
-
-