2 * tel-plugin-packetservice
4 * Copyright (c) 2012 Samsung Electronics Co., Ltd. All rights reserved.
6 * Contact: DongHoo Park <donghoo.park@samsung.com>
8 * Licensed under the Apache License, Version 2.0 (the "License");
9 * you may not use this file except in compliance with the License.
10 * You may obtain a copy of the License at
12 * http://www.apache.org/licenses/LICENSE-2.0
14 * Unless required by applicable law or agreed to in writing, software
15 * distributed under the License is distributed on an "AS IS" BASIS,
16 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
17 * See the License for the specific language governing permissions and
18 * limitations under the License.
30 #include <co_network.h>
32 static enum tcore_hook_return __on_hook_call_status(Server *s, CoreObject *source,
33 enum tcore_notification_command command, unsigned int data_len, void *data,
36 gpointer service = user_data;
37 struct tnoti_ps_call_status *cstatus = NULL;
39 dbg("call status event");
40 g_return_val_if_fail(service != NULL, TCORE_HOOK_RETURN_STOP_PROPAGATION);
42 cstatus = (struct tnoti_ps_call_status *) data;
43 dbg("call status event cid(%d) state(%d) reason(%d)",
44 cstatus->context_id, cstatus->state, cstatus->result);
46 //send activation event / deactivation event
47 if (cstatus->state == 0) {/* OK: PDP define is complete. */
48 dbg("service is ready to activate");
49 _ps_service_set_ps_defined(service, TRUE, cstatus->context_id);
50 //_ps_service_connect_default_context(service);
52 else if (cstatus->state == 1) {/* CONNECTED */
53 dbg("service is activated");
54 _ps_service_set_connected(service, cstatus->context_id, TRUE);
56 else if (cstatus->state == 3) { /* NO CARRIER */
57 dbg("service is deactivated");
58 _ps_service_set_ps_defined(service, FALSE, cstatus->context_id);
59 _ps_service_set_connected(service, cstatus->context_id, FALSE);
62 return TCORE_HOOK_RETURN_CONTINUE;
65 static enum tcore_hook_return __on_hook_session_data_counter(Server *s, CoreObject *source,
66 enum tcore_notification_command command, unsigned int data_len, void *data,
69 g_return_val_if_fail(user_data != NULL, TCORE_HOOK_RETURN_STOP_PROPAGATION);
71 dbg("session data counter event");
73 return TCORE_HOOK_RETURN_CONTINUE;
76 static enum tcore_hook_return __on_hook_ipconfiguration(Server *s, CoreObject *source,
77 enum tcore_notification_command command, unsigned int data_len, void *data,
80 gpointer service = user_data;
81 CoreObject *co_ps = NULL;
82 struct tnoti_ps_pdp_ipconfiguration *devinfo = NULL;
84 g_return_val_if_fail(service != NULL, TCORE_HOOK_RETURN_STOP_PROPAGATION);
86 devinfo = (struct tnoti_ps_pdp_ipconfiguration *) data;
87 co_ps = (CoreObject *) _ps_service_ref_co_ps(service);
89 if (co_ps != source) {
90 dbg("ps object is different");
91 return TCORE_HOOK_RETURN_CONTINUE;
94 dbg("ip configuration event");
95 _ps_service_set_context_info(service, devinfo);
97 return TCORE_HOOK_RETURN_CONTINUE;
100 static enum tcore_hook_return __on_hook_powered(Server *s, CoreObject *source,
101 enum tcore_notification_command command, unsigned int data_len, void *data, void *user_data)
103 gpointer modem = user_data;
104 struct tnoti_modem_power *modem_power = NULL;
106 gboolean power = FALSE;
108 dbg("powered event called");
110 g_return_val_if_fail(modem != NULL, TCORE_HOOK_RETURN_STOP_PROPAGATION);
112 modem_power = (struct tnoti_modem_power *)data;
114 if ( modem_power->state == MODEM_STATE_ONLINE )
119 _ps_modem_processing_power_enable(modem, power);
121 return TCORE_HOOK_RETURN_CONTINUE;
124 static enum tcore_hook_return __on_hook_flight(Server *s, CoreObject *source,
125 enum tcore_notification_command command, unsigned int data_len, void *data, void *user_data)
127 gpointer modem = user_data;
128 struct tnoti_modem_flight_mode *modem_flight = NULL;
129 dbg("flight event called");
131 g_return_val_if_fail(modem != NULL, TCORE_HOOK_RETURN_STOP_PROPAGATION);
133 modem_flight = (struct tnoti_modem_flight_mode *)data;
134 _ps_modem_processing_flight_mode(modem, modem_flight->enable);
136 return TCORE_HOOK_RETURN_CONTINUE;
139 static enum tcore_hook_return __on_hook_net_register(Server *s, CoreObject *source,
140 enum tcore_notification_command command, unsigned int data_len, void *data,
143 gpointer service = user_data;
144 gboolean ps_attached = FALSE;
145 struct tnoti_network_registration_status *regist_status;
147 dbg("network register event called");
148 g_return_val_if_fail(service != NULL, TCORE_HOOK_RETURN_STOP_PROPAGATION);
150 regist_status = (struct tnoti_network_registration_status *) data;
151 if (regist_status->ps_domain_status == NETWORK_SERVICE_DOMAIN_STATUS_FULL)
154 _ps_service_processing_network_event(service, ps_attached, regist_status->roaming_status);
156 return TCORE_HOOK_RETURN_CONTINUE;
159 static enum tcore_hook_return __on_hook_net_change(Server *s, CoreObject *source,
160 enum tcore_notification_command command, unsigned int data_len, void *data,
163 gpointer service = user_data;
164 struct tnoti_network_change *network_change;
166 dbg("network change event called");
167 g_return_val_if_fail(service != NULL, TCORE_HOOK_RETURN_STOP_PROPAGATION);
169 network_change = (struct tnoti_network_change *) data;
170 dbg("plmn(%s) act(%d)", network_change->plmn, network_change->act);
171 _ps_service_set_access_technology(service, network_change->act);
173 return TCORE_HOOK_RETURN_CONTINUE;
176 static enum tcore_hook_return __on_hook_sim_init(Server *s, CoreObject *source,
177 enum tcore_notification_command command, unsigned int data_len, void *data, void *user_data)
179 struct tnoti_sim_status *sim_data;
181 dbg("sim init event called");
182 g_return_val_if_fail(user_data != NULL, TCORE_HOOK_RETURN_STOP_PROPAGATION);
184 sim_data = (struct tnoti_sim_status *)data;
185 dbg("sim status is (%d)", sim_data->sim_status);
187 if( sim_data->sim_status == SIM_STATUS_INIT_COMPLETED){
188 struct tel_sim_imsi *sim_imsi = NULL;
189 sim_imsi = tcore_sim_get_imsi(source);
190 _ps_modem_processing_sim_complete( (gpointer)user_data, TRUE, (gchar *)sim_imsi->plmn);
194 return TCORE_HOOK_RETURN_CONTINUE;
197 gboolean _ps_hook_co_modem_event(gpointer modem)
201 g_return_val_if_fail(modem != NULL, FALSE);
203 p = _ps_modem_ref_plugin(modem);
204 s = tcore_plugin_ref_server(p);
206 tcore_server_add_notification_hook(s, TNOTI_MODEM_POWER, __on_hook_powered, modem);
207 tcore_server_add_notification_hook(s, TNOTI_MODEM_FLIGHT_MODE, __on_hook_flight, modem);
208 tcore_server_add_notification_hook(s, TNOTI_SIM_STATUS, __on_hook_sim_init, modem);
213 gboolean _ps_get_co_modem_values(gpointer modem)
216 CoreObject *co_modem = NULL;
217 CoreObject *co_sim = NULL;
219 GSList *co_lists = NULL;
220 gboolean sim_init = FALSE, modem_powered = FALSE, flight_mode = FALSE;
222 struct tel_sim_imsi *sim_imsi = NULL;
224 g_return_val_if_fail(modem != NULL, FALSE);
226 co_modem = _ps_modem_ref_co_modem(modem);
230 plg = tcore_object_ref_plugin(co_modem);
234 co_lists = tcore_plugin_get_core_objects_bytype(plg, CORE_OBJECT_TYPE_SIM);
238 co_sim = co_lists->data;
239 g_slist_free(co_lists);
241 sim_status = tcore_sim_get_status(co_sim);
242 if(sim_status == SIM_STATUS_INIT_COMPLETED)
245 sim_imsi = tcore_sim_get_imsi(co_sim);
246 modem_powered = tcore_modem_get_powered(co_modem);
247 flight_mode = tcore_modem_get_flight_mode_state(co_modem);
249 _ps_modem_processing_flight_mode(modem, flight_mode);
250 _ps_modem_processing_power_enable(modem, modem_powered);
251 _ps_modem_processing_sim_complete(modem, sim_init, (gchar *)sim_imsi->plmn);
257 gboolean _ps_hook_co_network_event(gpointer service)
262 g_return_val_if_fail(service != NULL, FALSE);
264 p = _ps_service_ref_plugin(service);
265 s = tcore_plugin_ref_server(p);
267 tcore_server_add_notification_hook(s, TNOTI_NETWORK_REGISTRATION_STATUS, __on_hook_net_register, service);
268 tcore_server_add_notification_hook(s, TNOTI_NETWORK_CHANGE, __on_hook_net_change, service);
273 gboolean _ps_get_co_network_values(gpointer service)
275 CoreObject *co_network = NULL;
276 gboolean ps_attached = FALSE;
278 enum telephony_network_service_domain_status ps_status;
279 enum telephony_network_access_technology act;
281 g_return_val_if_fail(service != NULL, FALSE);
283 co_network = _ps_service_ref_co_network(service);
285 tcore_network_get_service_status(co_network, TCORE_NETWORK_SERVICE_DOMAIN_TYPE_PACKET, &ps_status);
286 tcore_network_get_access_technology(co_network, &act);
288 if (ps_status == NETWORK_SERVICE_DOMAIN_STATUS_FULL)
291 _ps_service_set_roaming(service, tcore_network_get_roaming_state(co_network));
292 _ps_service_set_ps_attached(service, ps_attached);
293 _ps_service_set_access_technology(service, act);
298 gboolean _ps_hook_co_ps_event(gpointer service)
302 g_return_val_if_fail(service != NULL, FALSE);
304 p = _ps_service_ref_plugin(service);
305 s = tcore_plugin_ref_server(p);
307 tcore_server_add_notification_hook(s, TNOTI_PS_CALL_STATUS, __on_hook_call_status, service);
308 tcore_server_add_notification_hook(s, TNOTI_PS_CURRENT_SESSION_DATA_COUNTER, __on_hook_session_data_counter, service);
309 tcore_server_add_notification_hook(s, TNOTI_PS_PDP_IPCONFIGURATION, __on_hook_ipconfiguration, service);
314 gboolean _ps_free_co_ps_event(gpointer service)
318 g_return_val_if_fail(service != NULL, FALSE);
320 p = _ps_service_ref_plugin(service);
321 s = tcore_plugin_ref_server(p);
323 tcore_server_remove_notification_hook(s, __on_hook_call_status);
324 tcore_server_remove_notification_hook(s, __on_hook_session_data_counter);
325 tcore_server_remove_notification_hook(s, __on_hook_ipconfiguration);
330 gboolean _ps_free_co_network_event(gpointer service)
334 g_return_val_if_fail(service != NULL, FALSE);
336 p = _ps_service_ref_plugin(service);
337 s = tcore_plugin_ref_server(p);
339 tcore_server_remove_notification_hook(s, __on_hook_net_register);
340 tcore_server_remove_notification_hook(s, __on_hook_net_change);
345 gboolean _ps_update_cellular_state_key(gpointer service)
348 gpointer handle = NULL;
349 static Storage *strg;
352 s = tcore_plugin_ref_server( (TcorePlugin *)_ps_service_ref_plugin(service) );
353 strg = tcore_server_find_storage(s, "vconf");
354 handle = tcore_storage_create_handle(strg, "vconf");
356 err("fail to create vconf handle");
360 err_reason = _ps_service_check_cellular_state(service);
361 tcore_storage_set_int(strg,STORAGE_KEY_CELLULAR_STATE, err_reason);