Fix build error and do Boiler Plate.
[framework/telephony/tel-plugin-imc.git] / src / s_network.c
index 93abe01..29ddf30 100755 (executable)
-/*
- * 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 <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_XBANDSEL_0 0 
-#define AT_XBANDSEL_1800 1800
-#define AT_XBANDSEL_1900 1900
-#define AT_XBANDSEL_850 850
-#define AT_XBANDSEL_450 450
-#define AT_XBANDSEL_480 480
-#define AT_XBANDSEL_750 750
-#define AT_XBANDSEL_380 380
-#define AT_XBANDSEL_410 410
-
-#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, 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_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_timeout_search_network(TcorePending *p, void *user_data)
-{
-       UserRequest *ur;
-       struct tresp_network_search resp;
-
-       dbg("TIMEOUT !!!!! pending=%p", p);
-
-       memset(&resp, 0, sizeof(struct tresp_network_search));
-
-       resp.list_count = 0;
-
-       ur = tcore_pending_ref_user_request(p);
-       if (ur) {
-               tcore_user_request_send_response(ur, TRESP_NETWORK_SEARCH, sizeof(struct tresp_network_search), &resp);
-       }
-}
-
-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, ctr =0;
-       char* line=NULL;
-       const TcoreATResponse *atResp = data;
-       GSList *tokens = NULL;
-       GSList *network_token = NULL;
-       int AcT=0 , stat = 0;
-       char* cp_plmn =NULL;
-       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);
-                               if(strlen(pResp) > 0){
-                                       temp_plmn_info = malloc((strlen(pResp) - 2)+1); /* 1 extra character for NULL storage */
-                                       memset(temp_plmn_info, 0x00, strlen(pResp) -2+1);
-                                       
-                                       /* Strip off starting quotes & ending quotes */
-                                       strncpy(temp_plmn_info, pResp+1, strlen(pResp)-2);
-                               }
-                       }
-
-                       /* Decode PLMN ID from Hexa String to Hexa bytes */
-                       //cp_plmn = util_hexStringToBytes(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, AcT);
-                       resp.list_count++;
-
-                       tcore_at_tok_free(network_token);
-                       free(temp_plmn_info);
-                       //free(cp_plmn);
-               }
-       }
-       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);
-       }
-       tcore_at_tok_free(tokens);
-       return;
-}
-
-static void on_response_set_service_domain(TcorePending *p, int data_len, const void *data, void *user_data)
-{
-       dbg("Entry");
-
-       dbg("Exit");
-       return;
-}
-
-static void on_response_get_service_domain(TcorePending *p, int data_len, const void *data, void *user_data)
-{
-       dbg("Entry");
-
-       dbg("Exit");
-       return;
-}
-
-static void on_response_set_band(TcorePending *p, int data_len, const void *data, void *user_data)
-{
-       UserRequest *ur;
-       struct tresp_network_set_band resp;
-
-       char* line=NULL;
-       const TcoreATResponse *atResp = data;
-
-       dbg("On Response Set Band");
-       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);
-       }
-}
-
-static void on_response_get_band(TcorePending *p, int data_len, const void *data, void *user_data)
-{
-       dbg("Entry");
-
-       dbg("Exit");
-       return;
-}
-
-static void on_response_set_preferred_plmn(TcorePending *p, int data_len, const void *data, void *user_data)
-{
-       dbg("Entry");
-
-       dbg("Exit");
-       return;
-}
-
-static void on_response_get_preferred_plmn(TcorePending *p, int data_len, const void *data, void *user_data)
-{
-       UserRequest *ur;
-       int i = 0, ctr =0;
-       char* line=NULL;
-       const TcoreATResponse *atResp = data;
-       GSList *tokens = NULL;
-       char* cp_plmn =NULL;
-       char temp_plmn_info[17] = {0};
-       char *pResp = NULL;
-       int num_network_avail = 0;
-       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");
-
-       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){
-                                               strncmp(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_set_order(TcorePending *p, int data_len, const void *data, void *user_data)
-{
-       dbg("Entry");
-
-       dbg("Exit");
-       return;
-}
-
-static void on_response_get_order(TcorePending *p, int data_len, const void *data, void *user_data)
-{
-       dbg("Entry");
-
-       dbg("Exit");
-       return;
-}
-
-static void on_response_set_power_on_attach(TcorePending *p, int data_len, const void *data, void *user_data)
-{
-       dbg("Entry");
-
-       dbg("Exit");
-       return;
-}
-
-static void on_response_get_power_on_attach(TcorePending *p, int data_len, const void *data, void *user_data)
-{
-       dbg("Entry");
-
-       dbg("Exit");
-       return;
-}
-
-static void on_response_set_cancel_manual_search(TcorePending *p, int data_len, const void *data, void *user_data)
-{
-       dbg("Entry");
-
-       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, *short_plmn_name = NULL;
-       CoreObject *o;
-       GSList *tokens=NULL;
-       const char *line;
-       int network_mode = -1;
-       int plmn_format = -1;
-       enum telephony_network_access_technology AcT = NETWORK_ACT_UNKNOWN;
-       struct tnoti_network_identity noti ={0};
-       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 = malloc((strlen(pResp) - 2)+1); /* 1 extra character for NULL storage */
-                                               memset(long_plmn_name, 0x00, strlen(pResp) -2+1);
-                                               /* Strip off starting quotes & ending quotes */
-                                               strncpy(long_plmn_name, pResp+1, strlen(pResp)-2);
-
-                                               //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 = malloc((strlen(pResp) - 2)+1); /* 1 extra character for NULL storage */
-                                                       memset(short_plmn_name, 0x00, strlen(pResp) -2+1);
-                                                       /* Strip off starting quotes & ending quotes */
-                                                       strncpy(short_plmn_name, pResp+1, strlen(pResp)-2);
-                                                       
-                                                       //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))
-                       {               
-                               if(strlen(pResp)>0){
-                                       dbg("act  : %s",pResp);                                         
-                                        AcT = lookup_tbl_access_technology[atoi(pResp)];
-                                       dbg("AcT  : %d",AcT);   
-
-                                       tcore_network_set_access_technology(o, 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(&noti, 0, 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), &noti);          
-
-                               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};
-       int ret;
-       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), &regist_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), &noti);
-
-               /* 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};
-
-       int ret;
-       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), &regist_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;
-       
-       int rssi = 0, battery = 0;
-       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);
-               }
-               else
-               {
-                       dbg("No rssi value");
-               }
-               
-               batteryToken = (char *)g_slist_nth_data(tokens,1);
-               if (strlen(batteryToken)>0)
-               {
-                       net_icon_info.type = NETWORK_ICON_INFO_BATTERY;
-                       net_icon_info.battery= 1 + atoi(g_slist_nth_data(tokens, 1)); // 1 level added for proper battery indication
-                       dbg("battery level : %d",net_icon_info.battery);
-               }
-               else
-               {
-                       dbg("No battery level recieved");
-               }
-               
-               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_time_info(CoreObject *o, const void *event_info, void *user_data)
-{
-       struct tnoti_network_timeinfo net_time_info = {0};
-       int gmtoff;
-       char *line = NULL;
-       GSList* tokens = NULL;
-       char *time= NULL, *time_zone_variance = NULL;
-       GSList *lines = NULL;
-
-       dbg("Network Time Info Noti Recieved");
-       memset(&net_time_info, 0, sizeof(struct tnoti_network_icon_info));
-
-       lines = (GSList*)event_info;
-       if (1 != g_slist_length(lines)) {
-               dbg("unsolicited msg but multiple line");
-           goto OUT;
-       }
-       line  = (char*)(lines->data);
-
-       /*
-       <time> string type value; format is \93yy/MM/dd,hh:mms\94, wherein characters indicates year, month, day, hour, minutes, seconds.
-       <timzone_variance> is a string \93GMT+HH:MM\94 or \93GMT-HH:MM\94 e.g. \93GMT+5:30\94
-       */
-       dbg("Network time info noti recieved");
-       
-       if (line != NULL)
-       {       
-               dbg("Response OK");
-                       dbg("noti line is %s", line);
-                       
-                       tokens = tcore_at_tok_new(line);
-                       strcpy(time, g_slist_nth_data(tokens, 0));
-                       strcpy(time_zone_variance , g_slist_nth_data(tokens, 1));
-
-                       strncpy(net_time_info.hour,time ,2);
-                       strncpy(net_time_info.month, time+3, 2);        
-                       strncpy(net_time_info.day, time+6, 2);
-                       strncpy(net_time_info.hour, time+9 ,2);
-                       strncpy(net_time_info.minute, time+12,3);
-               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);
-       }
-       else
-       {       
-               dbg("line is  NULL");
-       }
-OUT:
-       if(NULL!=tokens)
-               tcore_at_tok_free(tokens);
-       return TRUE;
-}
-
-static gboolean on_event_network_identity(CoreObject *o, const void *event_info, void *user_data)
-{
-       struct tnoti_network_identity noti;
-       char plmn[7] = { 0, };
-       int type = 0;
-       char *tmp;
-       GSList *lines = NULL;
-       char *line = NULL;
-       GSList* tokens = NULL;
-
-       dbg("NOTI RECEIVED");
-       lines = (GSList*)event_info;
-
-       if (1 != g_slist_length(lines)) {
-               dbg("unsolicited msg but multiple line");
-           goto OUT;
-       }
-
-       line  = (char*)(lines->data);
-
-       memset(&noti, 0, sizeof(struct tnoti_network_identity));
-       dbg("Network identity noti recieved");
-
-       if(line!=NULL)
-       {
-               dbg("Response OK");
-                       dbg("noti line is %s", line);
-                       tokens = tcore_at_tok_new(line);
-                       //noti.type = 0;
-                       strcpy(noti.plmn, g_slist_nth_data(tokens, 0));
-                       tcore_server_send_notification(tcore_plugin_ref_server(tcore_object_ref_plugin(o)), o, TNOTI_NETWORK_IDENTITY,  sizeof(struct tnoti_network_identity), &noti);                  
-       }
-       else
-       {
-               dbg("Response NOK");            
-       }
-
-OUT:
-       if(NULL!=tokens)
-               tcore_at_tok_free(tokens);
-       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)
-{
-       TcorePlugin *p = NULL;
-       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=?\r");
-       atreq = tcore_at_request_new(cmd_str, "+COPS", TCORE_AT_SINGLELINE);
-       
-       tcore_pending_set_request_data(pending, 0, atreq);
-       //tcore_pending_set_timeout(pending, 60);
-       //tcore_pending_set_priority(pending, TCORE_PENDING_PRIORITY_DEFAULT);
-       tcore_pending_set_response_callback(pending, on_response_search_network, NULL);
-       //tcore_pending_set_timeout_callback(pending, on_timeout_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);
-
-       return TCORE_RETURN_SUCCESS;
-}
-
-static TReturn set_plmn_selection_mode(CoreObject *o, UserRequest *ur)
-{
-       TcorePlugin *p = NULL;
-       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];
-       
-       const struct treq_network_set_plmn_selection_mode *req_data;
-
-
-       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.
-       */
-       
-       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) == 5) {
-                               plmn[5] = '#';
-                       }               
-
-                       cmd_str = g_strdup_printf("AT+COPS=%d,%d,%s\r", mode, format, plmn);
-               }
-               break;
-               
-               case NETWORK_SELECT_MODE_GLOBAL_AUTOMATIC:
-               default:
-                       cmd_str = g_strdup("AT+COPS=0\r");
-                       break;
-       }
-
-       
-       atreq = tcore_at_request_new(cmd_str, NULL, 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);
-
-       return TCORE_RETURN_SUCCESS;
-}
-
-static TReturn get_plmn_selection_mode(CoreObject *o, UserRequest *ur)
-{
-       TcorePlugin *p = NULL;
-       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?\r");
-       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);
-
-       return TCORE_RETURN_SUCCESS;
-}
-
-
-static TReturn set_band(CoreObject *o, UserRequest *ur)
-{
-       TcorePlugin *p = NULL;
-       TcoreHal *h = NULL;
-       TcorePending *pending = NULL;
-       TcoreATRequest *atreq;
-       char*cmd_str = NULL;
-       const struct treq_network_set_band *req_data;
-       int band = 0;
-       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);
-       pending = tcore_pending_new(o, 0);
-
-       switch (req_data->band)
-       {
-               case NETWORK_BAND_TYPE_GSM850:
-                       band = AT_XBANDSEL_850;
-                       break;
-
-               case NETWORK_BAND_TYPE_GSM_900_1800:
-                       band = AT_XBANDSEL_1800; //summerize 900 + 1800
-                       break;
-
-               case NETWORK_BAND_TYPE_GSM1900:
-                       band = AT_XBANDSEL_1900;
-                       break;
-               case NETWORK_BAND_TYPE_GSM1800:
-                       band = AT_XBANDSEL_1800;
-                       break;
-               case NETWORK_BAND_TYPE_GSM_850_1900:
-                       band = AT_XBANDSEL_1900; //summerize 850 + 1900
-                       break; 
-               default:
-                       break;
-       }
-       pending = tcore_pending_new(o, 0);
-
-       //TODO - Done only for UMTS case, need to do for GSM seperately?
-       cmd_str = g_strdup_printf("AT+XUBANDSEL=%d", req_data->band);
-       atreq = tcore_at_request_new(cmd_str, NULL, TCORE_AT_NO_RESULT);
-
-       tcore_pending_set_request_data(pending, 0, atreq);
-       tcore_pending_set_timeout(pending, 0);
-       tcore_pending_set_priority(pending, TCORE_PENDING_PRIORITY_DEFAULT);
-       tcore_pending_set_response_callback(pending, on_response_set_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);
-
-       return TCORE_RETURN_SUCCESS;
-}
-
-static TReturn get_band(CoreObject *o, UserRequest *ur)
-{
-       TcorePlugin *p = NULL;
-       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);
-       pending = tcore_pending_new(o, 0);
-
-       cmd_str = g_strdup_printf("AT+XUBANDSEL?\r");
-       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_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);
-
-
-
-       return TCORE_RETURN_SUCCESS;
-}
-
-static TReturn set_preferred_plmn(CoreObject *o, UserRequest *ur)
-{
-       dbg("Entry");
-
-       dbg("Exit");
-       return TCORE_RETURN_SUCCESS; 
-}
-
-static TReturn get_preferred_plmn(CoreObject *o, UserRequest *ur)
-{
-       TcorePlugin *p = NULL;
-       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?\r");
-       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);
-
-       return TCORE_RETURN_SUCCESS;
-}
-
-
-static TReturn set_cancel_manual_search(CoreObject *o, UserRequest *ur)
-{
-       dbg("Entry");
-
-       dbg("Exit");
-       return TCORE_RETURN_SUCCESS;
-}
-
-static TReturn get_serving_network(CoreObject *o, UserRequest *ur)
-{
-       TcorePlugin *p = NULL;
-       TcoreHal *h = NULL;
-       TcorePending *pending = NULL;
-       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?\r", "+COPS", TCORE_AT_MULTILINE,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       = set_cancel_manual_search,
-               .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);
-
-       //XNITZINFO is for <time><timezone variance>
-       //CTZDST is for <dst>
-       tcore_object_add_callback(o, "+XNITZINFO", on_event_network_time_info, NULL);
-       tcore_object_add_callback(o, "+CTZDST", on_event_network_time_info, NULL);
-
-       //tcore_object_add_callback(o, "+XCOPS", on_event_network_identity, NULL);
-
-       //need to check whether the following is needed
-
-       //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: 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
+static void on_timeout_search_network(TcorePending *p, void *user_data)\r
+{\r
+       UserRequest *ur;\r
+       struct tresp_network_search resp;\r
+\r
+       dbg("TIMEOUT !!!!! pending=%p", p);\r
+\r
+       memset(&resp, 0, sizeof(struct tresp_network_search));\r
+\r
+       resp.list_count = 0;\r
+\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
+}\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
+                               if(strlen(pResp) > 0){\r
+                                       temp_plmn_info = malloc((strlen(pResp) - 2)+1); /* 1 extra character for NULL storage */\r
+                                       memset(temp_plmn_info, 0x00, strlen(pResp) -2+1);\r
+                                       \r
+                                       /* Strip off starting quotes & ending quotes */\r
+                                       strncpy(temp_plmn_info, pResp+1, strlen(pResp)-2);\r
+                               }\r
+                       }\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
+                       free(temp_plmn_info);\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
+       tcore_at_tok_free(tokens);\r
+       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
+                       }\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
+                       }\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), &noti);\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{\r
+       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 = malloc((strlen(pResp) - 2)+1); /* 1 extra character for NULL storage */\r
+                                               memset(long_plmn_name, 0x00, strlen(pResp) -2+1);\r
+                                               /* Strip off starting quotes & ending quotes */\r
+                                               strncpy(long_plmn_name, pResp+1, strlen(pResp)-2);\r
+\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 = malloc((strlen(pResp) - 2)+1); /* 1 extra character for NULL storage */\r
+                                                       memset(short_plmn_name, 0x00, strlen(pResp) -2+1);\r
+                                                       /* Strip off starting quotes & ending quotes */\r
+                                                       strncpy(short_plmn_name, pResp+1, strlen(pResp)-2);\r
+                                                       \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(&noti, 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), &noti);                  \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
+\r
+               if(long_plmn_name)\r
+                       free(long_plmn_name);\r
+               if(short_plmn_name)\r
+                       free(short_plmn_name);\r
+       }\r
+\r
+       return;\r
+\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), &regist_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), &noti);\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), &regist_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_ds_time_info(CoreObject *o, const void *event_info, void *user_data)\r
+{\r
+/*\r
++CTZDST<dst>\r
+<dst> daylight savings time value:\r
+0 No adjustment for Daylight Saving Time\r
+1 +1 hour adjustment for Daylight Saving Time\r
+2 +2 hours adjustment for Daylight Saving Time\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_timeout(pending, 60);\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_set_timeout_callback(pending, on_timeout_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
+\r
+       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
+       const struct treq_network_set_plmn_selection_mode *req_data;\r
+\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
+\r
+       tcore_hal_send_request(h, pending);\r
+\r
+       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
+\r
+       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_timeout(pending_umts, 0);\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
+       }\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_timeout(pending_gsm, 0);\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
+       }\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_timeout(pending, 0);\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
+\r
+       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;\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
+       const struct treq_network_set_preferred_plmn *req_data = NULL;\r
+       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 = tcore_user_request_ref_data(ur, NULL);\r
+\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
+       cmd_str = g_strdup_printf("AT+CPOL=%d,%d,\"%s\",%d, %d,%d",req_data->ef_index, format, req_data->plmn, gsm_act, gsm_compact_act, utran_act);\r
+       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
+\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("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
+       /* +CTZDST: <dst> */ \r
+       tcore_object_add_callback(o, "+CTZDST", on_event_network_ds_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