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.
21 #ifndef __PS_COMMON_H__
22 #define __PS_COMMON_H__
24 #define PS_DBUS_SERVICE "com.tcore.ps"
37 #include <core_object.h>
40 #include <cynara-client.h>
42 #include "generated-code.h"
45 #define FAIL_RESPONSE(ivc,msg) g_dbus_method_invocation_return_error(ivc, \
46 G_DBUS_ERROR, G_DBUS_ERROR_FAILED, msg);
49 #define PS_NO_PENDING_REQUEST 0x00
51 #define PS_NETWORK_SEARCH_PENDING 0x01
52 #define PS_RESET_NETWORK_SEARCH_FLAG 0x0E
54 #define PS_NETWORK_SELECTION_PENDING 0x02
55 #define PS_NETWORK_RESET_SELECTION_FLAG 0x0D
57 #define PS_NETWORK_SELECT_MODE 0x04
58 #define PS_NETWORK_RESET_SELECT_MODE_FLAG 0x0B
60 #define PS_NETWORK_GET_MODE 0x08
61 #define PS_NETWORK_RESET_GET_MODE_FLAG 0x07
63 #define PS_NETWORK_SET_FLIGHT_MODE 0x10
64 #define PS_NETWORK_RESET_SET_FLIGHT_MODE_FLAG 0xEF
66 #define PS_NETWORK_SET_POWER_OFF 0x20
67 #define PS_NETWORK_RESET_SET_POWER_OFF_FLAG 0xDF
69 #define PS_NETWORK_SET_POWER_LOW 0x40
70 #define PS_NETWORK_RESET_SET_POWER_LOW_FLAG 0xBF
72 #define PS_NETWORK_SET_DEFAULT_DATA_SUBS 0x80
73 #define PS_NETWORK_RESET_SET_DEFAULT_DATA_SUBS 0x7F
75 #define PS_SIM_SET_POWER_STATE 0x08
76 #define PS_SIM_SET_POWER_STATE_FLAG 0x07
80 #define KEY_3G_ENABLE STORAGE_KEY_3G_ENABLE
81 #define KEY_DATA_ROAMING_SETTING STORAGE_KEY_SETAPPL_STATE_DATA_ROAMING_BOOL
82 #define KEY_POWER_SAVING_MODE STORAGE_KEY_POWER_SAVING_MODE
83 #define KEY_PM_STATE STORAGE_KEY_PM_STATE
84 #define KEY_NETWORK_RESTRICT_MODE STORAGE_KEY_SETAPPL_NETWORK_RESTRICT_MODE
85 #ifdef POWER_SAVING_FEATURE_WEARABLE
86 #define KEY_WECONN_ALL_CONNECTED STORAGE_KEY_WECONN_ALL_CONNECTED
88 #define KEY_SAP_CONNECTION_TYPE STORAGE_KEY_SAP_CONNECTION_TYPE
89 #define KEY_WIFI_STATE STORAGE_KEY_WIFI_STATE_INT
91 #define PS_ERR_INTERNAL "Internal Error"
92 #define PS_ERR_NO_SERVICE "NO service"
93 #define PS_ERR_TRASPORT "No Transport"
94 #define PS_ERR_NO_PROFILE "No Profile"
95 #define PS_ERR_WRONG_PROFILE "Wrong Profile"
96 #define PS_ERR_MAX "Unknown Error"
98 #define AC_PS_PUBLIC "telephony_framework::api_ps_public"
99 #define AC_PS_PRIVATE "telephony_framework::api_ps_private"
100 #define AC_PS_PROFILE "telephony_framework::api_ps_profile"
102 #define BOOL2STRING(a) ((a == TRUE) ? ("TRUE") : ("FALSE"))
103 #define CHAR2STRING(a) g_strdup_printf("%c", a)
104 #define INT2STRING(a) g_strdup_printf("%d", a)
106 /* Tizen Power saving mode */
107 #define POWER_SAVING_MODE_NORMAL 0x00
108 #define POWER_SAVING_MODE_POWERFUL 0x01
109 #define POWER_SAVING_MODE_EMERGENCY 0x02
110 #define POWER_SAVING_MODE_WEARABLE 0x03
111 #define POWER_SAVING_MODE_FMM 0x10
113 /*Tizen CDMA dummy Profile Index*/
114 #define PS_CDMA_DUMMY_PROFILE_IDX 0
115 #define PS_CDMA_DUMMY_PROFILE_PLMN "00000"
118 * PS plugin Private information
121 GDBusConnection *conn; /* DBUS connection */
122 guint bus_id; /* Packet service BUS ID */
127 /* List of masters */
139 enum ps_modem_state {
140 PS_MODEM_STATE_UNKNOWN = -1,
141 PS_MODEM_STATE_OFFLINE = 0x00,
142 PS_MODEM_STATE_ONLINE = 0x01,
143 PS_MODEM_STATE_LOW = 0x02,
146 enum ps_pdp_permanet_reject {
147 /*3GPP spec defined Call End reasons*/
148 PS_PDP_PERMANENT_REJECT_OPERATOR_DETERMINED_BARRING = 8,
149 PS_PDP_PERMANENT_REJECT_LLC_SNDCP_FAILURE = 25,
150 PS_PDP_PERMANENT_REJECT_INSUFFICIENT_RESOURCES = 26,
151 PS_PDP_PERMANENT_REJECT_UNKNOWN_APN = 27,
152 PS_PDP_PERMANENT_REJECT_UNKNOWN_PDP = 28,
153 PS_PDP_PERMANENT_REJECT_AUTH_FAILED = 29,
154 PS_PDP_PERMANENT_REJECT_GGSN_REJECT = 30,
155 PS_PDP_PERMANENT_REJECT_ACTIVATION_REJECT = 31,
156 PS_PDP_PERMANENT_REJECT_OPTION_NOT_SUPPORTED = 32,
157 PS_PDP_PERMANENT_REJECT_OPTION_UNSUBSCRIBED = 33,
158 PS_PDP_PERMANENT_REJECT_OPTION_TEMP_OOO = 34,
159 PS_PDP_PERMANENT_REJECT_NSAPI_ALREADY_USED = 35,
160 PS_PDP_PERMANENT_REJECT_IP_V4_ONLY_ALLOWED = 50,
161 PS_PDP_PERMANENT_REJECT_IP_V6_ONLY_ALLOWED = 51,
162 PS_PDP_PERMANENT_REJECT_SINGLE_ADDR_BEARER_ONLY = 52,
163 PS_PDP_PERMANENT_REJECT_MESSAGE_INCORRECT_SEMANTIC = 95,
164 PS_PDP_PERMANENT_REJECT_INVALID_MANDATORY_INFO = 96,
165 PS_PDP_PERMANENT_REJECT_MESSAGE_TYPE_UNSUPPORTED = 97,
166 PS_PDP_PERMANENT_REJECT_MSG_TYPE_NONCOMPATIBLE_STATE = 98,
167 PS_PDP_PERMANENT_REJECT_UNKNOWN_INFO_ELEMENT = 99,
168 PS_PDP_PERMANENT_REJECT_CONDITIONAL_IE_ERROR = 100,
169 PS_PDP_PERMANENT_REJECT_MSG_AND_PROTOCOL_STATE_UNCOMPATIBLE = 101,
170 PS_PDP_PERMANENT_REJECT_PROTOCOL_ERROR = 111,
171 PS_PDP_PERMANENT_REJECT_APN_TYPE_CONFLICT = 112,
176 PS_WIFI_STATE_OFF = 0,
177 PS_WIFI_STATE_DICONNECTED = 1,
178 PS_WIFI_STATE_CONNECTED = 2
181 typedef struct packet_service_master {
184 GDBusConnection *conn;
185 PacketServiceMaster *if_obj;
189 typedef struct packet_service_modem {
193 CoreObject *co_modem;
194 GDBusConnection *conn;
195 PacketServiceModem *if_obj;
197 /* Temp DBus value */
198 GDBusMethodInvocation *invocation;
201 /* Value from modem */
205 gboolean reset_profile;
206 gboolean flight_mode;
207 gboolean flight_mode_ups; /*CP state right before UPS*/
209 gboolean roaming_allowed;
211 gboolean roaming_apn_support;
213 gboolean data_allowed;
215 unsigned char hook_flag;
216 gboolean mode_pref_changed;
219 GHashTable *services;
221 GSource *reset_profile_gsource;
224 typedef struct packet_service_service {
227 GDBusConnection *conn;
228 PacketServiceService *if_obj;
231 CoreObject *co_network;
234 gboolean ps_attached;
237 gboolean initial_pdp_conn; // If FALSE, PDP never been connected.
238 gboolean wifi_connected_checked; // If TRUE, We already checked wifi-connected state.
239 gboolean attach_apn_complete; // set TRUE, initial define is complete for attach APN.
240 enum telephony_network_access_technology act;
242 alarm_id_t timer_src;
243 guint connection_timeout;
248 typedef struct packet_service_context {
251 GDBusConnection *conn;
252 PacketServiceContext *if_obj;
256 #ifdef PREPAID_SIM_APN_SUPPORT
257 gboolean prepaid_alwayson;
262 gboolean profile_enable;
266 gboolean b_notify; // for exception handling in UPS mode.
267 gboolean b_routing_only; // for Ultra Power Saving mode.
270 CoreObject *co_context;
272 gpointer async_context;
274 gboolean deact_required;
279 void __remove_master(gpointer master, gpointer user_data);
280 gpointer _ps_master_create_master(GDBusConnection *conn, TcorePlugin *p);
281 gboolean _ps_master_create_modems(gpointer master,TcorePlugin *p);
282 gboolean _ps_master_destroy_modem(gpointer object, TcorePlugin *plugin);
283 gboolean _ps_master_get_storage_value_bool(gpointer master, enum tcore_storage_key key);
284 gboolean _ps_master_get_storage_value_int(gpointer master, enum tcore_storage_key key);
285 gboolean _ps_master_set_storage_value_bool(gpointer master, enum tcore_storage_key key, gboolean value);
286 gboolean _ps_master_set_storage_value_int(gpointer master, enum tcore_storage_key key, gint value);
289 void __remove_modem_handler(gpointer modem);
290 gpointer _ps_modem_create_modem(GDBusConnection *conn, TcorePlugin *p, gpointer master,
291 gchar* modem_name, gpointer co_modem, gchar *cp_name);
292 void _ps_modem_destroy_modem(GDBusConnection *conn, gpointer object);
293 gboolean _ps_modem_send_filght_mode_request(gpointer value, void *data);
294 gboolean _ps_modem_processing_flight_mode(gpointer object, gboolean enable);
295 gboolean _ps_modem_processing_power_enable(gpointer modem, int enable);
296 gboolean _ps_modem_processing_sim_complete(gpointer modem, gboolean complete, gchar *operator);
297 gboolean _ps_modem_set_reset_profile(gpointer object, gboolean value);
298 gboolean _ps_modem_get_reset_profile(gpointer object);
299 GSource * _ps_modem_get_profile_reset_gsource(gpointer object);
300 gboolean _ps_modem_set_profile_reset_gsource(gpointer object, GSource * source);
301 gboolean _ps_modem_remove_profile_reset_gsource(gpointer object);
302 gboolean _ps_modem_set_sim_enabled(gpointer object, gboolean value);
303 gboolean _ps_modem_set_data_allowed(gpointer modem, gboolean value);
304 gboolean _ps_modem_get_data_allowed(gpointer modem);
305 gboolean _ps_modem_set_data_roaming_allowed(gpointer modem, gboolean value);
306 gboolean _ps_modem_get_data_roaming_allowed(gpointer modem);
307 gboolean _ps_modem_get_roaming(gpointer object);
308 void _ps_modem_set_roaming(gpointer object, gboolean value);
309 gboolean _ps_modem_set_psmode(gpointer modem, gint value);
310 gint _ps_modem_get_psmode(gpointer modem);
311 gint _ps_modem_get_roaming_apn_support(gpointer object);
312 void _ps_modem_set_roaming_apn_support(gpointer object, gboolean value);
313 guchar _ps_modem_get_hook_flag(gpointer modem);
314 gboolean _ps_modem_get_flght_mode(gpointer object);
315 void _ps_modem_set_flght_mode_ups(gpointer object, gboolean value);
316 gboolean _ps_modem_get_flght_mode_ups(gpointer object);
317 gboolean _ps_modem_get_sim_init(gpointer object);
318 int _ps_modem_get_power(gpointer object);
319 gchar* _ps_modem_ref_operator(gpointer object);
320 gboolean _ps_modem_get_properties_handler(gpointer object, GVariantBuilder * properties);
321 GVariant* _ps_modem_get_properties(gpointer object, GVariantBuilder *properties);
322 GHashTable* _ps_modem_ref_services(gpointer modem);
323 gchar* _ps_modem_ref_path(gpointer modem);
324 gpointer _ps_modem_ref_plugin(gpointer modem);
325 gpointer _ps_modem_ref_dbusconn(gpointer modem);
326 gpointer _ps_modem_ref_co_modem(gpointer modem);
327 gpointer _ps_modem_ref_work_queue(gpointer modem);
328 gchar* _ps_modem_ref_cp_name(gpointer modem);
329 gpointer _ps_modem_ref_contexts(gpointer modem);
330 ps_subs_type _ps_modem_get_subs_type(gpointer modem);
331 gboolean _ps_modem_initiate_reset_profile(gpointer modem);
334 void __remove_service_handler(gpointer service);
335 gpointer _ps_service_create_service(GDBusConnection *conn, TcorePlugin *p,
336 gpointer modem, CoreObject *co_network, CoreObject *co_ps, gchar* path);
337 gboolean _ps_service_ref_context(gpointer object, gpointer context);
338 gboolean _ps_service_ref_contexts(gpointer service, GSList *contexts, gchar *operator);
339 gboolean _ps_service_unref_context(gpointer object, gpointer context);
340 gboolean _ps_service_get_properties_handler(gpointer object, GVariantBuilder *properties);
341 GVariant* _ps_service_get_properties(gpointer object, GVariantBuilder *properties);
342 gchar* _ps_service_ref_path(gpointer service);
343 gpointer _ps_service_ref_plugin(gpointer service);
344 gpointer _ps_service_ref_co_network(gpointer service);
345 gpointer _ps_service_ref_co_ps(gpointer service);
346 gpointer _ps_service_ref_modem(gpointer object);
347 gboolean _ps_service_set_context_devinfo(gpointer service, struct tnoti_ps_pdp_ipconfiguration *devinfo);
348 gboolean _ps_service_set_context_bearerinfo(gpointer object, struct tnoti_ps_dedicated_bearer_info *bearer_info);
349 int _ps_service_define_context(gpointer object, gpointer context);
350 int _ps_service_activate_context(gpointer service, gpointer context);
351 gboolean _ps_service_deactivate_context(gpointer service, gpointer context);
352 void _ps_service_set_retry_timeout_value(gpointer service, int value);
353 void _ps_service_connection_timer(gpointer service, gpointer context);
354 void _ps_service_reset_connection_timer(gpointer context);
355 int _ps_service_connect_default_context(gpointer service);
356 #ifdef PREPAID_SIM_APN_SUPPORT
357 gboolean _ps_service_connect_last_connected_context(gpointer object);
358 int _ps_service_connect_default_prepaid_context(gpointer object);
359 gboolean _ps_service_connect_last_connected_context_ex(gpointer service, gpointer object, gboolean *defined, gchar *operator);
360 gpointer _ps_service_return_context_by_cid(gpointer object, int context_id);
362 void _ps_service_remove_contexts(gpointer object);
363 void _ps_service_disconnect_contexts(gpointer service);
364 void _ps_service_disconnect_internet_mms_contexts(gpointer object);
365 gboolean _ps_service_processing_network_event(gpointer service, gboolean ps_attached, gboolean roaming);
366 gpointer _ps_service_return_default_context(gpointer object, int svc_cat_id);
367 gboolean _ps_service_set_connected(gpointer service, gpointer cstatus, gboolean enabled);
368 void _ps_service_set_ps_defined(gpointer *object, gboolean value, int cid);
369 gboolean _ps_service_set_ps_attached(gpointer service, gboolean value);
370 gboolean _ps_service_set_number_of_pdn_cnt(gpointer object, gchar *operator);
371 gboolean _ps_service_set_roaming(gpointer service, gboolean value);
372 gboolean _ps_service_get_roaming(gpointer object);
373 gboolean _ps_service_set_restricted(gpointer object, gboolean value);
374 gboolean _ps_service_get_restricted(gpointer object);
375 gboolean _ps_service_set_access_technology(gpointer service,
376 enum telephony_network_access_technology value);
377 enum telephony_ps_state
378 _ps_service_check_cellular_state(gpointer object);
379 int _ps_service_update_roaming_apn(gpointer object);
380 void _ps_service_set_attach_apn(ps_service_t *service);
383 void __remove_context_handler(gpointer context);
384 gboolean _ps_context_initialize(gpointer plugin);
385 gboolean _ps_context_reset_profile_table(gchar *cp_name);
386 gboolean _ps_context_fill_profile_table_from_ini_file(gchar *cp_name);
387 gboolean _ps_context_reset_hashtable(gpointer modem);
388 GSList* _ps_context_create_hashtable(gpointer modem, gboolean roaming);
389 gboolean _ps_context_add_context(gpointer modem, gchar *operator, GHashTable *property);
390 gboolean _ps_context_get_properties_handler(gpointer context, GVariantBuilder *properties);
391 GVariant* _ps_context_get_properties(gpointer context, GVariantBuilder *properties);
392 gboolean _ps_context_set_service(gpointer context, gpointer service);
393 gpointer _ps_context_ref_service(gpointer object);
394 gboolean _ps_context_get_alwayson_enable(gpointer object);
395 #ifdef PREPAID_SIM_APN_SUPPORT
396 gboolean _ps_context_get_prepaid_alwayson_enable(gpointer object);
397 int _ps_context_get_profile_id(gpointer object);
399 gchar* _ps_context_ref_path(gpointer context);
400 gpointer _ps_context_ref_co_context(gpointer context);
401 gboolean _ps_context_set_connected(gpointer context, gboolean enabled);
402 gboolean _ps_context_set_profile_enable(gpointer object, gboolean value);
403 gboolean _ps_context_get_profile_enable(gpointer object);
404 gboolean _ps_context_set_ps_defined(gpointer object, gboolean value);
405 gboolean _ps_context_get_ps_defined(gpointer object);
406 gboolean _ps_context_set_alwayson_enable(gpointer object, gboolean enabled);
407 gboolean _ps_context_get_default_context(gpointer object, int svc_cat_id);
408 gboolean _ps_context_remove_context(gpointer context);
409 gboolean _ps_context_reset_user_data(gpointer object);
410 gboolean _ps_context_create_cdma_profile(gchar* mccmnc, gchar* cp_name);
411 gpointer _ps_context_get_user_data(gpointer object);
412 TReturn _ps_connection_hdlr(gpointer object);
413 void _ps_default_connection_hdlr(gpointer object);
414 gint _ps_context_get_number_of_pdn(gchar *operator, gchar *cp_name);
415 gboolean _ps_context_handle_ifaceup(gpointer user_data);
416 gboolean _ps_context_handle_ifacedown(gpointer user_data);
417 gboolean _ps_context_set_bearer_info(gpointer object, struct tnoti_ps_dedicated_bearer_info *bearer_info);
418 gboolean _ps_context_check_is_roaming_apn_support(gchar* mccmnc, gchar* cp_name);
421 void _ps_get_network_mode(gpointer data);
422 gboolean _ps_hook_co_modem_event(gpointer modem);
423 gboolean _ps_free_co_modem_event(gpointer modem);
424 gboolean _ps_get_co_modem_values(gpointer modem);
425 gboolean _ps_hook_co_network_event(gpointer service);
426 gboolean _ps_free_co_network_event(gpointer service);
427 gboolean _ps_get_co_network_values(gpointer service);
428 gboolean _ps_hook_co_ps_event(gpointer service);
429 gboolean _ps_free_modem_event(gpointer modem);
430 gboolean _ps_free_co_ps_event(gpointer service);
431 gboolean _ps_free_co_modem_event(gpointer modem);
432 gboolean _ps_update_cellular_state_key(gpointer service);
435 void __ps_hook_response_cb(UserRequest *ur, enum tcore_response_command command, unsigned int data_len, const void *data, void *user_data);
436 void __ps_modem_cp_reset_send_pending_request_response(gpointer data);
437 enum tcore_hook_return ps_handle_dds(Server *s, UserRequest *ur, void *user_data);
438 enum tcore_hook_return ps_handle_hook(Server *s, UserRequest *ur, void *user_data);
439 void __ps_send_pending_user_request(gpointer data);
440 #ifdef POWER_SAVING_FEATURE_WEARABLE
443 ON_NON_CALL_NOTI_HOOK,
445 }__ps_call_flow_type;
447 void __ps_check_handle_modem_off_request(gpointer data, __ps_call_flow_type type,enum tcore_notification_command command);
449 #endif /* #ifdef POWER_SAVING_FEATURE_WEARABLE */
451 enum tcore_hook_return __on_hook_modem_added(Server *s, CoreObject *source, enum tcore_notification_command command, unsigned int data_len, void *data, void *user_data);
452 enum tcore_hook_return __on_hook_modem_removed(Server *s, CoreObject *source, enum tcore_notification_command command, unsigned int data_len, void *data, void *user_data);
455 gboolean ps_util_check_access_control (cynara *p_cynara, GDBusMethodInvocation *invoc, const char *label, const char *perm);
456 GSource * ps_util_gsource_dispatch(GMainContext *main_context, gint priority, GSourceFunc cb, gpointer data);
457 gboolean ps_util_thread_dispatch(GMainContext *main_context, gint priority, GSourceFunc cb, gpointer data);
458 int ps_util_system_command(char * command);
459 void ps_util_load_xml_file(const char *docname, const char *groupname, void **i_doc, void **i_root_node);
460 void ps_util_unload_xml_file(void **i_doc, void **i_root_node);
462 #endif /* __PS_COMMON_H__ */