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 gboolean netif_updown = FALSE;
41 CoreObject *co_context;
43 dbg("call status event");
44 g_return_val_if_fail(service != NULL, TCORE_HOOK_RETURN_STOP_PROPAGATION);
46 cstatus = (struct tnoti_ps_call_status *) data;
47 dbg("call status event cid(%d) state(%d)",
48 cstatus->context_id, cstatus->state);
50 if (cstatus->state == PS_DATA_CALL_CTX_DEFINED)
52 else if (cstatus->state == PS_DATA_CALL_CONNECTED)
54 else if (cstatus->state == PS_DATA_CALL_NOT_CONNECTED)
57 contexts = tcore_ps_ref_context_by_id(source, cstatus->context_id);
58 for (; contexts != NULL; contexts = g_slist_next(contexts)) {
59 co_context = contexts->data;
60 ifname = tcore_context_get_ipv4_devname(co_context);
65 if (tcore_util_netif(ifname, netif_updown)
66 != TCORE_RETURN_SUCCESS) {
67 g_slist_free(contexts);
69 dbg("tcore_util_netif() failed.");
74 //send activation event / deactivation event
75 if (cstatus->state == PS_DATA_CALL_CTX_DEFINED) {/* OK: PDP define is complete. */
76 dbg("service is ready to activate");
77 _ps_service_set_ps_defined(service, TRUE, cstatus->context_id);
78 //_ps_service_connect_default_context(service);
80 else if (cstatus->state == PS_DATA_CALL_CONNECTED) {/* CONNECTED */
81 dbg("service is activated");
82 _ps_service_set_connected(service, cstatus->context_id, TRUE);
84 else if (cstatus->state == PS_DATA_CALL_NOT_CONNECTED) { /* NO CARRIER */
85 dbg("service is deactivated");
86 _ps_service_set_ps_defined(service, FALSE, cstatus->context_id);
87 _ps_service_set_connected(service, cstatus->context_id, FALSE);
90 return TCORE_HOOK_RETURN_CONTINUE;
93 static enum tcore_hook_return __on_hook_session_data_counter(Server *s, CoreObject *source,
94 enum tcore_notification_command command, unsigned int data_len, void *data,
97 g_return_val_if_fail(user_data != NULL, TCORE_HOOK_RETURN_STOP_PROPAGATION);
99 dbg("session data counter event");
101 return TCORE_HOOK_RETURN_CONTINUE;
104 static enum tcore_hook_return __on_hook_ipconfiguration(Server *s, CoreObject *source,
105 enum tcore_notification_command command, unsigned int data_len, void *data,
108 gpointer service = user_data;
109 CoreObject *co_ps = NULL;
110 struct tnoti_ps_pdp_ipconfiguration *devinfo = NULL;
112 g_return_val_if_fail(service != NULL, TCORE_HOOK_RETURN_STOP_PROPAGATION);
114 devinfo = (struct tnoti_ps_pdp_ipconfiguration *) data;
115 co_ps = (CoreObject *) _ps_service_ref_co_ps(service);
117 if (co_ps != source) {
118 dbg("ps object is different");
119 return TCORE_HOOK_RETURN_CONTINUE;
122 dbg("ip configuration event");
123 _ps_service_set_context_info(service, devinfo);
125 return TCORE_HOOK_RETURN_CONTINUE;
128 static enum tcore_hook_return __on_hook_powered(Server *s, CoreObject *source,
129 enum tcore_notification_command command, unsigned int data_len, void *data, void *user_data)
131 gpointer modem = user_data;
132 struct tnoti_modem_power *modem_power = NULL;
134 gboolean power = FALSE;
136 dbg("powered event called");
138 g_return_val_if_fail(modem != NULL, TCORE_HOOK_RETURN_STOP_PROPAGATION);
140 modem_power = (struct tnoti_modem_power *)data;
142 if ( modem_power->state == MODEM_STATE_ONLINE )
147 _ps_modem_processing_power_enable(modem, power);
149 return TCORE_HOOK_RETURN_CONTINUE;
152 static enum tcore_hook_return __on_hook_flight(Server *s, CoreObject *source,
153 enum tcore_notification_command command, unsigned int data_len, void *data, void *user_data)
155 gpointer modem = user_data;
156 struct tnoti_modem_flight_mode *modem_flight = NULL;
157 dbg("flight event called");
159 g_return_val_if_fail(modem != NULL, TCORE_HOOK_RETURN_STOP_PROPAGATION);
161 modem_flight = (struct tnoti_modem_flight_mode *)data;
162 _ps_modem_processing_flight_mode(modem, modem_flight->enable);
164 return TCORE_HOOK_RETURN_CONTINUE;
167 static enum tcore_hook_return __on_hook_net_register(Server *s, CoreObject *source,
168 enum tcore_notification_command command, unsigned int data_len, void *data,
171 gpointer service = user_data;
172 gboolean ps_attached = FALSE;
173 struct tnoti_network_registration_status *regist_status;
175 dbg("network register event called");
176 g_return_val_if_fail(service != NULL, TCORE_HOOK_RETURN_STOP_PROPAGATION);
178 regist_status = (struct tnoti_network_registration_status *) data;
179 if (regist_status->ps_domain_status == NETWORK_SERVICE_DOMAIN_STATUS_FULL)
182 _ps_service_processing_network_event(service, ps_attached, regist_status->roaming_status);
184 return TCORE_HOOK_RETURN_CONTINUE;
187 static enum tcore_hook_return __on_hook_net_change(Server *s, CoreObject *source,
188 enum tcore_notification_command command, unsigned int data_len, void *data,
191 gpointer service = user_data;
192 struct tnoti_network_change *network_change;
194 dbg("network change event called");
195 g_return_val_if_fail(service != NULL, TCORE_HOOK_RETURN_STOP_PROPAGATION);
197 network_change = (struct tnoti_network_change *) data;
198 dbg("plmn(%s) act(%d)", network_change->plmn, network_change->act);
199 _ps_service_set_access_technology(service, network_change->act);
201 return TCORE_HOOK_RETURN_CONTINUE;
204 static enum tcore_hook_return __on_hook_sim_init(Server *s, CoreObject *source,
205 enum tcore_notification_command command, unsigned int data_len, void *data, void *user_data)
207 struct tnoti_sim_status *sim_data;
209 dbg("sim init event called");
210 g_return_val_if_fail(user_data != NULL, TCORE_HOOK_RETURN_STOP_PROPAGATION);
212 sim_data = (struct tnoti_sim_status *)data;
213 dbg("sim status is (%d)", sim_data->sim_status);
215 if( sim_data->sim_status == SIM_STATUS_INIT_COMPLETED){
216 struct tel_sim_imsi *sim_imsi = NULL;
217 sim_imsi = tcore_sim_get_imsi(source);
218 _ps_modem_processing_sim_complete( (gpointer)user_data, TRUE, (gchar *)sim_imsi->plmn);
222 return TCORE_HOOK_RETURN_CONTINUE;
225 gboolean _ps_hook_co_modem_event(gpointer modem)
229 g_return_val_if_fail(modem != NULL, FALSE);
231 p = _ps_modem_ref_plugin(modem);
232 s = tcore_plugin_ref_server(p);
234 tcore_server_add_notification_hook(s, TNOTI_MODEM_POWER, __on_hook_powered, modem);
235 tcore_server_add_notification_hook(s, TNOTI_MODEM_FLIGHT_MODE, __on_hook_flight, modem);
236 tcore_server_add_notification_hook(s, TNOTI_SIM_STATUS, __on_hook_sim_init, modem);
241 gboolean _ps_get_co_modem_values(gpointer modem)
244 CoreObject *co_modem = NULL;
245 CoreObject *co_sim = NULL;
247 gboolean sim_init = FALSE, modem_powered = FALSE, flight_mode = FALSE;
249 struct tel_sim_imsi *sim_imsi = NULL;
251 g_return_val_if_fail(modem != NULL, FALSE);
253 co_modem = _ps_modem_ref_co_modem(modem);
257 plg = tcore_object_ref_plugin(co_modem);
261 co_sim = tcore_plugin_ref_core_object(plg, CORE_OBJECT_TYPE_SIM);
265 sim_status = tcore_sim_get_status(co_sim);
266 if(sim_status == SIM_STATUS_INIT_COMPLETED)
269 sim_imsi = tcore_sim_get_imsi(co_sim);
270 modem_powered = tcore_modem_get_powered(co_modem);
271 flight_mode = tcore_modem_get_flight_mode_state(co_modem);
273 _ps_modem_processing_flight_mode(modem, flight_mode);
274 _ps_modem_processing_power_enable(modem, modem_powered);
275 _ps_modem_processing_sim_complete(modem, sim_init, (gchar *)sim_imsi->plmn);
281 gboolean _ps_hook_co_network_event(gpointer service)
286 g_return_val_if_fail(service != NULL, FALSE);
288 p = _ps_service_ref_plugin(service);
289 s = tcore_plugin_ref_server(p);
291 tcore_server_add_notification_hook(s, TNOTI_NETWORK_REGISTRATION_STATUS, __on_hook_net_register, service);
292 tcore_server_add_notification_hook(s, TNOTI_NETWORK_CHANGE, __on_hook_net_change, service);
297 gboolean _ps_get_co_network_values(gpointer service)
299 CoreObject *co_network = NULL;
300 gboolean ps_attached = FALSE;
302 enum telephony_network_service_domain_status ps_status;
303 enum telephony_network_access_technology act;
305 g_return_val_if_fail(service != NULL, FALSE);
307 co_network = _ps_service_ref_co_network(service);
309 tcore_network_get_service_status(co_network, TCORE_NETWORK_SERVICE_DOMAIN_TYPE_PACKET, &ps_status);
310 tcore_network_get_access_technology(co_network, &act);
312 if (ps_status == NETWORK_SERVICE_DOMAIN_STATUS_FULL)
315 _ps_service_set_roaming(service, tcore_network_get_roaming_state(co_network));
316 _ps_service_set_ps_attached(service, ps_attached);
317 _ps_service_set_access_technology(service, act);
322 gboolean _ps_hook_co_ps_event(gpointer service)
326 g_return_val_if_fail(service != NULL, FALSE);
328 p = _ps_service_ref_plugin(service);
329 s = tcore_plugin_ref_server(p);
331 tcore_server_add_notification_hook(s, TNOTI_PS_CALL_STATUS, __on_hook_call_status, service);
332 tcore_server_add_notification_hook(s, TNOTI_PS_CURRENT_SESSION_DATA_COUNTER, __on_hook_session_data_counter, service);
333 tcore_server_add_notification_hook(s, TNOTI_PS_PDP_IPCONFIGURATION, __on_hook_ipconfiguration, service);
338 gboolean _ps_free_co_ps_event(gpointer service)
342 g_return_val_if_fail(service != NULL, FALSE);
344 p = _ps_service_ref_plugin(service);
345 s = tcore_plugin_ref_server(p);
347 tcore_server_remove_notification_hook(s, __on_hook_call_status);
348 tcore_server_remove_notification_hook(s, __on_hook_session_data_counter);
349 tcore_server_remove_notification_hook(s, __on_hook_ipconfiguration);
354 gboolean _ps_free_co_network_event(gpointer service)
358 g_return_val_if_fail(service != NULL, FALSE);
360 p = _ps_service_ref_plugin(service);
361 s = tcore_plugin_ref_server(p);
363 tcore_server_remove_notification_hook(s, __on_hook_net_register);
364 tcore_server_remove_notification_hook(s, __on_hook_net_change);
369 gboolean _ps_update_cellular_state_key(gpointer service)
372 gpointer handle = NULL;
373 static Storage *strg;
376 s = tcore_plugin_ref_server( (TcorePlugin *)_ps_service_ref_plugin(service) );
377 strg = tcore_server_find_storage(s, "vconf");
378 handle = tcore_storage_create_handle(strg, "vconf");
380 err("fail to create vconf handle");
384 err_reason = _ps_service_check_cellular_state(service);
385 tcore_storage_set_int(strg,STORAGE_KEY_CELLULAR_STATE, err_reason);