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)",
44 cstatus->context_id, cstatus->state);
46 //send activation event / deactivation event
47 if (cstatus->state == PS_DATA_CALL_CTX_DEFINED) {/* 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 == PS_DATA_CALL_CONNECTED) {/* CONNECTED */
53 dbg("service is activated");
54 _ps_service_set_connected(service, cstatus->context_id, TRUE);
56 else if (cstatus->state == PS_DATA_CALL_NOT_CONNECTED) { /* 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 gboolean sim_init = FALSE, modem_powered = FALSE, flight_mode = FALSE;
221 struct tel_sim_imsi *sim_imsi = NULL;
223 g_return_val_if_fail(modem != NULL, FALSE);
225 co_modem = _ps_modem_ref_co_modem(modem);
229 plg = tcore_object_ref_plugin(co_modem);
233 co_sim = tcore_plugin_ref_core_object(plg, CORE_OBJECT_TYPE_SIM);
237 sim_status = tcore_sim_get_status(co_sim);
238 if(sim_status == SIM_STATUS_INIT_COMPLETED)
241 sim_imsi = tcore_sim_get_imsi(co_sim);
242 modem_powered = tcore_modem_get_powered(co_modem);
243 flight_mode = tcore_modem_get_flight_mode_state(co_modem);
245 _ps_modem_processing_flight_mode(modem, flight_mode);
246 _ps_modem_processing_power_enable(modem, modem_powered);
247 _ps_modem_processing_sim_complete(modem, sim_init, (gchar *)sim_imsi->plmn);
253 gboolean _ps_hook_co_network_event(gpointer service)
258 g_return_val_if_fail(service != NULL, FALSE);
260 p = _ps_service_ref_plugin(service);
261 s = tcore_plugin_ref_server(p);
263 tcore_server_add_notification_hook(s, TNOTI_NETWORK_REGISTRATION_STATUS, __on_hook_net_register, service);
264 tcore_server_add_notification_hook(s, TNOTI_NETWORK_CHANGE, __on_hook_net_change, service);
269 gboolean _ps_get_co_network_values(gpointer service)
271 CoreObject *co_network = NULL;
272 gboolean ps_attached = FALSE;
274 enum telephony_network_service_domain_status ps_status;
275 enum telephony_network_access_technology act;
277 g_return_val_if_fail(service != NULL, FALSE);
279 co_network = _ps_service_ref_co_network(service);
281 tcore_network_get_service_status(co_network, TCORE_NETWORK_SERVICE_DOMAIN_TYPE_PACKET, &ps_status);
282 tcore_network_get_access_technology(co_network, &act);
284 if (ps_status == NETWORK_SERVICE_DOMAIN_STATUS_FULL)
287 _ps_service_set_roaming(service, tcore_network_get_roaming_state(co_network));
288 _ps_service_set_ps_attached(service, ps_attached);
289 _ps_service_set_access_technology(service, act);
294 gboolean _ps_hook_co_ps_event(gpointer service)
298 g_return_val_if_fail(service != NULL, FALSE);
300 p = _ps_service_ref_plugin(service);
301 s = tcore_plugin_ref_server(p);
303 tcore_server_add_notification_hook(s, TNOTI_PS_CALL_STATUS, __on_hook_call_status, service);
304 tcore_server_add_notification_hook(s, TNOTI_PS_CURRENT_SESSION_DATA_COUNTER, __on_hook_session_data_counter, service);
305 tcore_server_add_notification_hook(s, TNOTI_PS_PDP_IPCONFIGURATION, __on_hook_ipconfiguration, service);
310 gboolean _ps_free_co_ps_event(gpointer service)
314 g_return_val_if_fail(service != NULL, FALSE);
316 p = _ps_service_ref_plugin(service);
317 s = tcore_plugin_ref_server(p);
319 tcore_server_remove_notification_hook(s, __on_hook_call_status);
320 tcore_server_remove_notification_hook(s, __on_hook_session_data_counter);
321 tcore_server_remove_notification_hook(s, __on_hook_ipconfiguration);
326 gboolean _ps_free_co_network_event(gpointer service)
330 g_return_val_if_fail(service != NULL, FALSE);
332 p = _ps_service_ref_plugin(service);
333 s = tcore_plugin_ref_server(p);
335 tcore_server_remove_notification_hook(s, __on_hook_net_register);
336 tcore_server_remove_notification_hook(s, __on_hook_net_change);
341 gboolean _ps_update_cellular_state_key(gpointer service)
344 gpointer handle = NULL;
345 static Storage *strg;
348 s = tcore_plugin_ref_server( (TcorePlugin *)_ps_service_ref_plugin(service) );
349 strg = tcore_server_find_storage(s, "vconf");
350 handle = tcore_storage_create_handle(strg, "vconf");
352 err("fail to create vconf handle");
356 err_reason = _ps_service_check_cellular_state(service);
357 tcore_storage_set_int(strg,STORAGE_KEY_CELLULAR_STATE, err_reason);