4 * Copyright (c) 2012 Samsung Electronics Co., Ltd. All rights reserved.
6 * Contact: Ja-young Gu <jygu@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 #include "generated-code.h"
33 #include "dtapi_common.h"
36 * Application used properties
38 #define NET_PROP_NONE 0x0000
39 #define NET_PROP_SVC_TYPE 0x0001
40 #define NET_PROP_ROAM 0x0002
41 #define NET_PROP_PLMN 0x0004
42 #define NET_PROP_NAME_OPTION 0x0100
43 #define NET_PROP_SPN 0x0200
44 #define NET_PROP_NWNAME 0x0400
45 #define NET_PROP_EMIT 0x0FFF
50 #define NET_PROP_CS 0x1000
51 #define NET_PROP_PS 0x2000
52 #define NET_PROP_ACT 0x4000
53 #define NET_PROP_ALL 0xFFFF
67 } NetworkPropertyInfo;
69 static int __convert_act_to_systemtype(enum telephony_network_access_technology act)
72 case NETWORK_ACT_UNKNOWN:
78 case NETWORK_ACT_GPRS:
81 case NETWORK_ACT_EGPRS:
84 case NETWORK_ACT_UMTS:
87 case NETWORK_ACT_GSM_UTRAN:
90 case NETWORK_ACT_IS95A:
93 case NETWORK_ACT_IS95B:
96 case NETWORK_ACT_CDMA_1X:
99 case NETWORK_ACT_EVDO_REV0:
102 case NETWORK_ACT_CDMA_1X_EVDO_REV0:
105 case NETWORK_ACT_EVDO_REVA:
108 case NETWORK_ACT_CDMA_1X_EVDO_REVA:
111 case NETWORK_ACT_EVDO_REVB:
114 case NETWORK_ACT_CDMA_1X_EVDO_REVB:
117 case NETWORK_ACT_EVDV:
120 case NETWORK_ACT_EHRPD:
123 case NETWORK_ACT_LTE:
133 static int __convert_name_priority_to_option(enum tcore_network_name_priority priority)
136 case TCORE_NETWORK_NAME_PRIORITY_SPN:
137 return 1; /* NETWORK_NAME_OPTION_SPN */
139 case TCORE_NETWORK_NAME_PRIORITY_NETWORK:
140 return 2; /* NETWORK_NAME_OPTION_OPERATOR */
142 case TCORE_NETWORK_NAME_PRIORITY_ANY:
143 return 3; /* NETWORK_NAME_OPTION_ANY */
149 return 0; /* NETWORK_NAME_OPTION_NONE */
152 static void __get_current_network_status(CoreObject *o,
153 NetworkPropertyInfo *current, int req_type)
158 if (req_type & NET_PROP_SVC_TYPE) {
159 enum telephony_network_service_type svc_type;
161 tcore_network_get_service_type(o, &svc_type);
162 current->svc_type = svc_type;
165 if (req_type & NET_PROP_ROAM)
166 current->roaming = tcore_network_get_roaming_state(o);
168 if (req_type & NET_PROP_PLMN)
169 current->plmn = tcore_network_get_plmn(o);
171 if (req_type & NET_PROP_NAME_OPTION) {
172 enum tcore_network_name_priority priority = TCORE_NETWORK_NAME_PRIORITY_UNKNOWN;
174 tcore_network_get_network_name_priority(o, &priority);
175 current->name_option = __convert_name_priority_to_option(priority);
178 if (req_type & NET_PROP_SPN)
179 current->spn = tcore_network_get_network_name(o, TCORE_NETWORK_NAME_TYPE_SPN);
181 if (req_type & NET_PROP_NWNAME) {
182 char *nwname = tcore_network_get_network_name(o, TCORE_NETWORK_NAME_TYPE_FULL);
184 if (!nwname || strlen(nwname) == 0)
185 nwname = tcore_network_get_network_name(o, TCORE_NETWORK_NAME_TYPE_SHORT);
186 current->nwname = nwname;
189 if (req_type & NET_PROP_CS) {
190 enum telephony_network_service_domain_status cs;
191 tcore_network_get_service_status(o, TCORE_NETWORK_SERVICE_DOMAIN_TYPE_CIRCUIT, &cs);
196 if (req_type & NET_PROP_PS) {
197 enum telephony_network_service_domain_status ps;
199 tcore_network_get_service_status(o, TCORE_NETWORK_SERVICE_DOMAIN_TYPE_PACKET, &ps);
203 if (req_type & NET_PROP_ACT) {
204 enum telephony_network_access_technology act = NETWORK_ACT_UNKNOWN;
206 tcore_network_get_access_technology(o, &act);
207 current->act = __convert_act_to_systemtype(act);
211 static int __check_property_change(TelephonyNetwork *network, CoreObject *o,
212 NetworkPropertyInfo *current, int req_type)
214 int changed_type = NET_PROP_NONE;
217 return NET_PROP_NONE;
219 __get_current_network_status(o, current, req_type);
221 if (req_type & NET_PROP_SVC_TYPE)
222 if (telephony_network_get_service_type(network) != current->svc_type)
223 changed_type |= NET_PROP_SVC_TYPE;
225 if (req_type & NET_PROP_ROAM)
226 if (telephony_network_get_roaming_status(network) != current->roaming)
227 changed_type |= NET_PROP_ROAM;
229 if (req_type & NET_PROP_PLMN) {
231 const gchar *prev_plmn = telephony_network_get_plmn(network);
233 if (!prev_plmn || strcmp(prev_plmn, current->plmn) != 0)
234 changed_type |= NET_PROP_PLMN;
238 if (req_type & NET_PROP_NAME_OPTION)
239 if (telephony_network_get_name_option(network) != current->name_option)
240 changed_type |= NET_PROP_NAME_OPTION;
242 if (req_type & NET_PROP_SPN) {
244 const gchar *prev_spn = telephony_network_get_spn_name(network);
246 if (!prev_spn || strcmp(prev_spn, current->spn) != 0)
247 changed_type |= NET_PROP_SPN;
251 if (req_type & NET_PROP_NWNAME) {
252 if (current->nwname) {
253 const gchar *prev_nwname = telephony_network_get_network_name(network);
255 if (!prev_nwname || strcmp(prev_nwname, current->nwname) != 0)
256 changed_type |= NET_PROP_NWNAME;
260 if (req_type & NET_PROP_CS)
261 if (telephony_network_get_circuit_status(network) != current->cs)
262 changed_type |= NET_PROP_CS;
264 if (req_type & NET_PROP_PS)
265 if (telephony_network_get_packet_status(network) != current->ps)
266 changed_type |= NET_PROP_PS;
268 if (req_type & NET_PROP_ACT)
269 if (telephony_network_get_access_technology(network) != current->act)
270 changed_type |= NET_PROP_ACT;
275 static void __update_network_properties(TelephonyNetwork *network,
276 const char *cp_name, NetworkPropertyInfo *current, int update_type)
281 if (update_type & NET_PROP_SVC_TYPE) {
282 telephony_network_set_service_type(network, current->svc_type);
284 if (current->svc_type != NETWORK_SERVICE_TYPE_3G)
285 telephony_network_set_ps_type(network, TELEPHONY_HSDPA_OFF);
288 if (update_type & NET_PROP_ROAM)
289 telephony_network_set_roaming_status(network, current->roaming);
291 if (update_type & NET_PROP_PLMN)
292 telephony_network_set_plmn(network, current->plmn);
294 if (update_type & NET_PROP_NAME_OPTION)
295 telephony_network_set_name_option(network, current->name_option);
297 if (update_type & NET_PROP_SPN)
298 telephony_network_set_spn_name(network, current->spn);
300 if (update_type & NET_PROP_NWNAME)
301 telephony_network_set_network_name(network, current->nwname);
303 if (update_type & NET_PROP_CS)
304 telephony_network_set_circuit_status(network, current->cs);
306 if (update_type & NET_PROP_PS)
307 telephony_network_set_packet_status(network, current->ps);
309 if (update_type & NET_PROP_ACT)
310 telephony_network_set_access_technology(network, current->act);
313 static int __add_default_property_type(TelephonyNetwork *network, CoreObject *o, int req_type)
316 * If SVC_TYPE was changed,
317 * other properties (ACT, OPTION, SPN, NWNAME) may also be changed together
319 if (req_type & NET_PROP_SVC_TYPE) {
320 NetworkPropertyInfo current = {0, -1, -1, 0, -1, -1, -1, -1, NULL, NULL, NULL};
322 if (__check_property_change(network, o, ¤t, NET_PROP_SVC_TYPE)) {
324 * If SVC_TYPE was really changed,
325 * we should add others to default checking value
327 req_type |= (NET_PROP_ACT | NET_PROP_NAME_OPTION | NET_PROP_SPN | NET_PROP_NWNAME);
332 * If PLMN was changed,
333 * other properties (ROAM,OPTION,SPN,NWNAME) may also be changed together
335 if (req_type & NET_PROP_PLMN) {
336 NetworkPropertyInfo current = {0, -1, -1, 0, -1, -1, -1, -1, NULL, NULL, NULL};
338 if (__check_property_change(network, o, ¤t, NET_PROP_PLMN)) {
340 * If PLMN was really changed,
341 * we should add anothers to default checking value
343 req_type |= (NET_PROP_ROAM | NET_PROP_NAME_OPTION | NET_PROP_SPN | NET_PROP_NWNAME);
345 g_free(current.plmn);
351 static void __check_network_properties(TelephonyNetwork *network, CoreObject *o,
352 const char *cp_name, int req_type)
354 int changed_type = NET_PROP_NONE;
355 int emit_type = NET_PROP_NONE;
356 NetworkPropertyInfo current = {0, -1, -1, 0, -1, -1, -1, -1, NULL, NULL, NULL};
358 req_type = __add_default_property_type(network, o, req_type);
359 changed_type = __check_property_change(network, o, ¤t, req_type);
362 __update_network_properties(network, cp_name, ¤t, changed_type);
364 emit_type = (changed_type & NET_PROP_EMIT);
366 info("[%s] PROPTYPE: [%04x] svc: [%d] roam: [%s] plmn: [%s] prio: [%d] spn: [%s] nwname: [%s]",
367 cp_name, emit_type, current.svc_type,
368 (current.roaming ? "YES" : "NO"), current.plmn,
369 current.name_option, current.spn, current.nwname);
371 telephony_network_emit_property_info(network, emit_type,
372 current.svc_type, current.roaming, current.name_option,
373 current.plmn, current.spn, current.nwname);
376 g_free(current.plmn);
378 g_free(current.nwname);
381 static enum tcore_hook_return on_hook_ps_protocol_status(Server *s,
382 CoreObject *source, enum tcore_notification_command command,
383 unsigned int data_len, void *data, void *user_data)
385 const struct tnoti_ps_protocol_status *protocol_status = data;
387 TelephonyObjectSkeleton *object;
388 TelephonyNetwork *network = NULL;
389 struct custom_data *ctx = user_data;
393 enum telephony_ps_protocol_status ps_protocol_status = TELEPHONY_HSDPA_OFF;
395 cp_name = tcore_server_get_cp_name_by_plugin(tcore_object_ref_plugin(source));
396 if (cp_name == NULL) {
397 err("CP name is NULL");
398 return TCORE_HOOK_RETURN_CONTINUE;
401 info("[%s] PS_PROTOCOL_STATUS - Status: [%d]", cp_name, protocol_status->status);
403 path = g_strdup_printf("%s/%s", MY_DBUS_PATH, cp_name);
405 /* Look-up Hash table for Object */
406 object = g_hash_table_lookup(ctx->objects, path);
408 if (object == NULL) {
409 err("Object is NOT defined!!!");
410 return TCORE_HOOK_RETURN_CONTINUE;
413 network = telephony_object_peek_network(TELEPHONY_OBJECT(object));
414 if (network == NULL) {
415 err("Network object is NULL!!!");
416 return TCORE_HOOK_RETURN_CONTINUE;
420 * Do not check service_type.
421 * In case of +CGREG is invoked before +CREG(Z1 device),
422 * ps_type is not set because service_type is unknown yet.
424 if (telephony_network_get_service_type (network) < NETWORK_SERVICE_TYPE_2G) {
425 telephony_network_set_ps_type(network, TELEPHONY_HSDPA_OFF);
426 return TCORE_HOOK_RETURN_CONTINUE;
430 switch (protocol_status->status) {
431 case TELEPHONY_HSDPA_OFF:
432 ps_protocol_status = TELEPHONY_HSDPA_OFF;
435 case TELEPHONY_HSDPA_ON:
436 ps_protocol_status = TELEPHONY_HSDPA_ON;
439 case TELEPHONY_HSUPA_ON:
440 ps_protocol_status = TELEPHONY_HSUPA_ON;
443 case TELEPHONY_HSPA_ON:
444 ps_protocol_status = TELEPHONY_HSPA_ON;
447 case TELEPHONY_HSPAP_ON:
448 ps_protocol_status = TELEPHONY_HSPAP_ON;
452 err("Unhandled protocol status!");
456 telephony_network_set_ps_type(network, ps_protocol_status);
458 return TCORE_HOOK_RETURN_CONTINUE;
461 static gboolean on_network_search(TelephonyNetwork *network,
462 GDBusMethodInvocation *invocation, gpointer user_data)
464 struct custom_data *ctx = user_data;
466 /* Dispatch request */
467 dtapi_dispatch_request(ctx, network, invocation,
474 static gboolean on_network_search_cancel(TelephonyNetwork *network,
475 GDBusMethodInvocation *invocation, gpointer user_data)
477 struct custom_data *ctx = user_data;
479 /* Dispatch request */
480 dtapi_dispatch_request(ctx, network, invocation,
481 TREQ_NETWORK_SET_CANCEL_MANUAL_SEARCH,
487 static gboolean on_network_get_selection_mode(TelephonyNetwork *network,
488 GDBusMethodInvocation *invocation, gpointer user_data)
490 struct custom_data *ctx = user_data;
492 /* Dispatch request */
493 dtapi_dispatch_request(ctx, network, invocation,
494 TREQ_NETWORK_GET_PLMN_SELECTION_MODE,
500 static gboolean on_network_set_selection_mode(TelephonyNetwork *network,
501 GDBusMethodInvocation *invocation,
502 gint mode, const gchar *plmn, gint act, gpointer user_data)
504 struct treq_network_set_plmn_selection_mode req;
505 struct custom_data *ctx = user_data;
507 memset(&req, 0x0, sizeof(struct treq_network_set_plmn_selection_mode));
509 if (mode == 0) { /* Automatic */
510 req.mode = NETWORK_SELECT_MODE_AUTOMATIC;
511 } else if (mode == 1) { /* Manual */
512 req.mode = NETWORK_SELECT_MODE_MANUAL;
513 snprintf(req.plmn, 7, "%s", plmn);
516 FAIL_RESPONSE(invocation, DEFAULT_MSG_REQ_FAILED);
519 dbg("Mode: [%d] PLMN: [%s] AcT: [%d]", req.mode, req.plmn, req.act);
521 /* Dispatch request */
522 dtapi_dispatch_request(ctx, network, invocation,
523 TREQ_NETWORK_SET_PLMN_SELECTION_MODE,
524 &req, sizeof(struct treq_network_set_plmn_selection_mode));
530 static gboolean on_network_set_service_domain(TelephonyNetwork *network,
531 GDBusMethodInvocation *invocation, gint domain, gpointer user_data)
533 struct treq_network_set_service_domain req;
534 struct custom_data *ctx = user_data;
538 /* Dispatch request */
539 dtapi_dispatch_request(ctx, network, invocation,
540 TREQ_NETWORK_SET_SERVICE_DOMAIN,
541 &req, sizeof(struct treq_network_set_service_domain));
546 static gboolean on_network_get_service_domain(TelephonyNetwork *network,
547 GDBusMethodInvocation *invocation, gpointer user_data)
549 struct custom_data *ctx = user_data;
551 /* Dispatch request */
552 dtapi_dispatch_request(ctx, network, invocation,
553 TREQ_NETWORK_GET_SERVICE_DOMAIN,
559 static gboolean on_network_set_band(TelephonyNetwork *network,
560 GDBusMethodInvocation *invocation,
561 gint band, gint mode, gpointer user_data)
563 struct treq_network_set_band req;
564 struct custom_data *ctx = user_data;
569 /* Dispatch request */
570 dtapi_dispatch_request(ctx, network, invocation,
571 TREQ_NETWORK_SET_BAND,
572 &req, sizeof(struct treq_network_set_band));
577 static gboolean on_network_get_band(TelephonyNetwork *network,
578 GDBusMethodInvocation *invocation, gpointer user_data)
580 struct custom_data *ctx = user_data;
582 /* Dispatch request */
583 dtapi_dispatch_request(ctx, network, invocation,
584 TREQ_NETWORK_GET_BAND,
590 static gboolean on_network_set_mode(TelephonyNetwork *network,
591 GDBusMethodInvocation *invocation, gint mode, gpointer user_data)
593 struct treq_network_set_mode req;
594 struct custom_data *ctx = user_data;
598 /* Dispatch request */
599 dtapi_dispatch_request(ctx, network, invocation,
600 TREQ_NETWORK_SET_MODE,
601 &req, sizeof(struct treq_network_set_mode));
606 static gboolean on_network_get_mode(TelephonyNetwork *network,
607 GDBusMethodInvocation *invocation, gpointer user_data)
609 struct custom_data *ctx = user_data;
611 /* Dispatch request */
612 dtapi_dispatch_request(ctx, network, invocation,
613 TREQ_NETWORK_GET_MODE,
619 static gboolean on_network_set_preferred_plmn(TelephonyNetwork *network,
620 GDBusMethodInvocation *invocation,
621 gint mode, gint ef_index, gint act, const gchar *plmn, gpointer user_data)
623 struct treq_network_set_preferred_plmn req;
624 struct custom_data *ctx = user_data;
626 req.operation = mode;
627 req.ef_index = ef_index;
630 memcpy(req.plmn, plmn, 6);
632 if (strlen(plmn) <= 5)
635 /* Dispatch request */
636 dtapi_dispatch_request(ctx, network, invocation,
637 TREQ_NETWORK_SET_PREFERRED_PLMN,
638 &req, sizeof(struct treq_network_set_preferred_plmn));
643 static gboolean on_network_get_preferred_plmn(TelephonyNetwork *network,
644 GDBusMethodInvocation *invocation, gpointer user_data)
646 struct custom_data *ctx = user_data;
648 /* Dispatch request */
649 dtapi_dispatch_request(ctx, network, invocation,
650 TREQ_NETWORK_GET_PREFERRED_PLMN,
656 static gboolean on_network_get_serving_network(TelephonyNetwork *network,
657 GDBusMethodInvocation *invocation, gpointer user_data)
659 struct custom_data *ctx = user_data;
661 /* Dispatch request */
662 dtapi_dispatch_request(ctx, network, invocation,
663 TREQ_NETWORK_GET_SERVING_NETWORK,
669 static gboolean on_network_get_neighboring_cell_info(TelephonyNetwork *network,
670 GDBusMethodInvocation *invocation, gpointer user_data)
672 struct custom_data *ctx = user_data;
674 /* Dispatch request */
675 dtapi_dispatch_request(ctx, network, invocation,
676 TREQ_NETWORK_GET_NEIGHBORING_CELL_INFO,
682 static gboolean on_network_set_default_data_subscription(TelephonyNetwork *network,
683 GDBusMethodInvocation *invocation, gpointer user_data)
685 struct custom_data *ctx = user_data;
687 /* Dispatch request */
688 dtapi_dispatch_request(ctx, network, invocation,
689 TREQ_NETWORK_SET_DEFAULT_DATA_SUBSCRIPTION,
695 static gboolean on_network_get_default_data_subscription(TelephonyNetwork *network,
696 GDBusMethodInvocation *invocation, gpointer user_data)
698 struct custom_data *ctx = user_data;
700 /* Dispatch request */
701 dtapi_dispatch_request(ctx, network, invocation,
702 TREQ_NETWORK_GET_DEFAULT_DATA_SUBSCRIPTION,
708 static gboolean on_network_set_default_subs(TelephonyNetwork *network,
709 GDBusMethodInvocation *invocation, gpointer user_data)
711 struct custom_data *ctx = user_data;
713 /* Dispatch request */
714 dtapi_dispatch_request(ctx, network, invocation,
715 TREQ_NETWORK_SET_DEFAULT_SUBSCRIPTION,
721 static gboolean on_network_get_default_subs(TelephonyNetwork *network,
722 GDBusMethodInvocation *invocation, gpointer user_data)
724 struct custom_data *ctx = user_data;
726 /* Dispatch request */
727 dtapi_dispatch_request(ctx, network, invocation,
728 TREQ_NETWORK_GET_DEFAULT_SUBSCRIPTION,
734 static gboolean on_network_set_emergency_callback_mode(TelephonyNetwork *network,
735 GDBusMethodInvocation *invocation, gint mode, gpointer user_data)
737 struct treq_network_set_emergency_callback_mode req;
738 struct custom_data *ctx = user_data;
742 /* Dispatch request */
743 dtapi_dispatch_request(ctx, network, invocation,
744 TREQ_NETWORK_SET_EMERGENCY_CALLBACK_MODE,
745 &req, sizeof(struct treq_network_set_emergency_callback_mode));
750 static gboolean on_network_set_roaming_preference(TelephonyNetwork *network,
751 GDBusMethodInvocation *invocation, gint roam_pref, gpointer user_data)
753 struct treq_network_set_roaming_preference req;
754 struct custom_data *ctx = user_data;
756 req.roam_pref = roam_pref;
758 /* Dispatch request */
759 dtapi_dispatch_request(ctx, network, invocation,
760 TREQ_NETWORK_SET_ROAMING_PREFERENCE,
761 &req, sizeof(struct treq_network_set_roaming_preference));
766 static gboolean on_network_get_roaming_preference(TelephonyNetwork *network,
767 GDBusMethodInvocation *invocation, gpointer user_data)
769 struct custom_data *ctx = user_data;
771 /* Dispatch request */
772 dtapi_dispatch_request(ctx, network, invocation,
773 TREQ_NETWORK_GET_ROAMING_PREFERENCE,
779 gboolean dbus_plugin_setup_network_interface(TelephonyObjectSkeleton *object,
780 struct custom_data *ctx)
782 TelephonyNetwork *network;
784 network = telephony_network_skeleton_new();
785 telephony_object_skeleton_set_network(object, network);
786 g_object_unref(network);
788 dbg("network = %p", network);
791 * Register signal handlers for Network interface
793 g_signal_connect(network,
795 G_CALLBACK(on_network_search), ctx);
797 g_signal_connect(network,
798 "handle-search-cancel",
799 G_CALLBACK(on_network_search_cancel), ctx);
801 g_signal_connect(network,
802 "handle-set-selection-mode",
803 G_CALLBACK(on_network_set_selection_mode), ctx);
805 g_signal_connect(network,
806 "handle-get-selection-mode",
807 G_CALLBACK(on_network_get_selection_mode), ctx);
809 g_signal_connect(network,
810 "handle-set-service-domain",
811 G_CALLBACK(on_network_set_service_domain), ctx);
813 g_signal_connect(network,
814 "handle-get-service-domain",
815 G_CALLBACK(on_network_get_service_domain), ctx);
817 g_signal_connect(network,
819 G_CALLBACK(on_network_set_band), ctx);
821 g_signal_connect(network,
823 G_CALLBACK(on_network_get_band), ctx);
825 g_signal_connect(network,
827 G_CALLBACK(on_network_set_mode), ctx);
829 g_signal_connect(network,
831 G_CALLBACK(on_network_get_mode), ctx);
833 g_signal_connect(network,
834 "handle-set-preferred-plmn",
835 G_CALLBACK(on_network_set_preferred_plmn), ctx);
837 g_signal_connect(network,
838 "handle-get-preferred-plmn",
839 G_CALLBACK(on_network_get_preferred_plmn), ctx);
841 g_signal_connect(network,
842 "handle-get-serving-network",
843 G_CALLBACK(on_network_get_serving_network), ctx);
845 g_signal_connect(network,
846 "handle-get-ngbr-cell-info",
847 G_CALLBACK(on_network_get_neighboring_cell_info), ctx);
849 g_signal_connect(network,
850 "handle-set-default-data-subscription",
851 G_CALLBACK(on_network_set_default_data_subscription), ctx);
853 g_signal_connect(network,
854 "handle-get-default-data-subscription",
855 G_CALLBACK(on_network_get_default_data_subscription), ctx);
857 g_signal_connect(network,
858 "handle-set-default-subscription",
859 G_CALLBACK(on_network_set_default_subs), ctx);
861 g_signal_connect(network,
862 "handle-get-default-subscription",
863 G_CALLBACK(on_network_get_default_subs), ctx);
865 g_signal_connect(network,
866 "handle-set-emergency-callback-mode",
867 G_CALLBACK(on_network_set_emergency_callback_mode), ctx);
869 g_signal_connect(network,
870 "handle-set-roaming-preference",
871 G_CALLBACK(on_network_set_roaming_preference), ctx);
873 g_signal_connect(network,
874 "handle-get-roaming-preference",
875 G_CALLBACK(on_network_get_roaming_preference), ctx);
878 * Initialize DBUS properties
880 telephony_network_set_access_technology(network, NETWORK_ACT_UNKNOWN);
881 telephony_network_set_cell_id(network, 0);
882 telephony_network_set_ims_voice_status(network, NETWORK_IMS_VOICE_UNKNOWN);
883 telephony_network_set_volte_enable(network, FALSE);
884 telephony_network_set_circuit_status(network, NETWORK_SERVICE_DOMAIN_STATUS_NO);
885 telephony_network_set_lac(network, 0);
886 telephony_network_set_tac(network, 0);
887 telephony_network_set_name_option(network, NETWORK_NAME_OPTION_NONE);
888 telephony_network_set_packet_status(network, NETWORK_SERVICE_DOMAIN_STATUS_NO);
889 telephony_network_set_sig_dbm(network, 0);
890 telephony_network_set_roaming_status(network, FALSE);
891 telephony_network_set_ps_type(network, TELEPHONY_HSDPA_OFF);
892 telephony_network_set_service_type(network, NETWORK_SERVICE_TYPE_UNKNOWN);
893 telephony_network_set_sig_level(network, 0);
894 telephony_network_set_plmn(network, NULL);
895 telephony_network_set_spn_name(network, NULL);
896 telephony_network_set_network_name(network, NULL);
898 tcore_server_remove_notification_hook(ctx->server, on_hook_ps_protocol_status);
899 tcore_server_add_notification_hook(ctx->server,
900 TNOTI_PS_PROTOCOL_STATUS, on_hook_ps_protocol_status, ctx);
905 gboolean dbus_plugin_network_response(struct custom_data *ctx,
906 UserRequest *ur, struct dbus_request_info *dbus_info,
907 enum tcore_response_command command, unsigned int data_len, const void *data)
909 char *cpname = GET_CP_NAME(dbus_info->invocation);
912 case TRESP_NETWORK_SEARCH: {
913 const struct tresp_network_search *resp_network_search = data;
914 GVariant *network_search_result = NULL;
918 info("[%s] NETWORK_SEARCH - [%s] Count: [%d]",
919 cpname, (resp_network_search->result == TCORE_RETURN_SUCCESS ? "Success" : "Fail"),
920 resp_network_search->list_count);
922 g_variant_builder_init(&b, G_VARIANT_TYPE("aa{sv}"));
923 for (i = 0; i < resp_network_search->list_count; i++) {
924 g_variant_builder_open(&b, G_VARIANT_TYPE("a{sv}"));
926 g_variant_builder_add(&b, "{sv}", "plmn", g_variant_new_string(resp_network_search->list[i].plmn));
927 g_variant_builder_add(&b, "{sv}", "act", g_variant_new_int32(resp_network_search->list[i].act));
928 g_variant_builder_add(&b, "{sv}", "type", g_variant_new_int32(resp_network_search->list[i].status));
929 g_variant_builder_add(&b, "{sv}", "name", g_variant_new_string(resp_network_search->list[i].name));
931 g_variant_builder_close(&b);
933 network_search_result = g_variant_builder_end(&b);
935 telephony_network_complete_search(dbus_info->interface_object,
936 dbus_info->invocation,
937 network_search_result, resp_network_search->result);
941 case TRESP_NETWORK_SET_PLMN_SELECTION_MODE: {
942 const struct tresp_network_set_plmn_selection_mode *resp_set_plmn_selection_mode = data;
944 info("[%s] NETWORK_SET_PLMN_SELECTION_MODE - [%s]", cpname,
945 (resp_set_plmn_selection_mode->result == TCORE_RETURN_SUCCESS ? "Success" : "Fail"));
947 telephony_network_complete_set_selection_mode(dbus_info->interface_object,
948 dbus_info->invocation, resp_set_plmn_selection_mode->result);
952 case TRESP_NETWORK_GET_PLMN_SELECTION_MODE: {
953 const struct tresp_network_get_plmn_selection_mode *resp_get_plmn_selection_mode = data;
955 info("[%s] NETWORK_GET_PLMN_SELECTION_MODE - [%s] Mode: [%s]", cpname,
956 (resp_get_plmn_selection_mode->result == TCORE_RETURN_SUCCESS ? "Success" : "Fail"),
957 (resp_get_plmn_selection_mode->mode == NETWORK_SELECT_MODE_AUTOMATIC ? "AUTO" :
958 (resp_get_plmn_selection_mode->mode == NETWORK_SELECT_MODE_MANUAL ? "MANUAL" :
961 switch (resp_get_plmn_selection_mode->mode) {
962 case NETWORK_SELECT_MODE_AUTOMATIC:
963 telephony_network_complete_get_selection_mode(dbus_info->interface_object,
964 dbus_info->invocation, 0, resp_get_plmn_selection_mode->result);
967 case NETWORK_SELECT_MODE_MANUAL:
968 telephony_network_complete_get_selection_mode(dbus_info->interface_object,
969 dbus_info->invocation, 1, resp_get_plmn_selection_mode->result);
973 telephony_network_complete_get_selection_mode(dbus_info->interface_object,
974 dbus_info->invocation, -1, resp_get_plmn_selection_mode->result);
980 case TRESP_NETWORK_SET_SERVICE_DOMAIN: {
981 const struct tresp_network_set_service_domain *resp_set_service_domain = data;
983 dbg("[%s] NETWORK_SET_SERVICE_DOMAIN - [%s]", cpname,
984 (resp_set_service_domain->result == TCORE_RETURN_SUCCESS ? "Success" : "Fail"));
986 telephony_network_complete_set_service_domain(dbus_info->interface_object,
987 dbus_info->invocation, resp_set_service_domain->result);
991 case TRESP_NETWORK_GET_SERVICE_DOMAIN: {
992 const struct tresp_network_get_service_domain *resp_get_service_domain = data;
994 dbg("[%s] NETWORK_GET_SERVICE_DOMAIN - [%s] Domain: [%d]", cpname,
995 (resp_get_service_domain->result == TCORE_RETURN_SUCCESS ? "Success" : "Fail"),
996 resp_get_service_domain->domain);
998 telephony_network_complete_get_service_domain(dbus_info->interface_object,
999 dbus_info->invocation,
1000 resp_get_service_domain->domain, resp_get_service_domain->result);
1004 case TRESP_NETWORK_SET_BAND: {
1005 const struct tresp_network_set_band *resp_set_band = data;
1007 dbg("[%s] NETWORK_SET_BAND - [%s]", cpname,
1008 (resp_set_band->result == TCORE_RETURN_SUCCESS ? "Success" : "Fail"));
1010 telephony_network_complete_set_band(dbus_info->interface_object,
1011 dbus_info->invocation, resp_set_band->result);
1015 case TRESP_NETWORK_GET_BAND: {
1016 const struct tresp_network_get_band *resp_get_band = data;
1018 dbg("[%s] NETWORK_GET_BAND - [%s] Mode: [%s] Band: [%d]", cpname,
1019 (resp_get_band->result == TCORE_RETURN_SUCCESS ? "Success" : "Fail"),
1020 (resp_get_band->mode == NETWORK_BAND_MODE_PREFERRED ? "PREFERRED" :
1021 (resp_get_band->mode == NETWORK_BAND_MODE_ONLY ? "ONLY" :
1022 "UNKNOWN")), resp_get_band->band);
1024 telephony_network_complete_get_band(dbus_info->interface_object,
1025 dbus_info->invocation,
1026 resp_get_band->band, resp_get_band->mode, resp_get_band->result);
1030 case TRESP_NETWORK_SET_MODE: {
1031 const struct tresp_network_set_mode *resp_set_mode = data;
1033 dbg("[%s] NETWORK_SET_MODE - [%s]", cpname,
1034 (resp_set_mode->result == TCORE_RETURN_SUCCESS ? "Success" : "Fail"));
1036 telephony_network_complete_set_mode(dbus_info->interface_object,
1037 dbus_info->invocation, resp_set_mode->result);
1041 case TRESP_NETWORK_GET_MODE: {
1042 const struct tresp_network_get_mode *resp_get_mode = data;
1044 dbg("[%s] NETWORK_GET_MODE - [%s] Mode: [%d]", cpname,
1045 (resp_get_mode->result == TCORE_RETURN_SUCCESS ? "Success" : "Fail"),
1046 resp_get_mode->mode);
1048 telephony_network_complete_get_mode(dbus_info->interface_object,
1049 dbus_info->invocation,
1050 resp_get_mode->mode, resp_get_mode->result);
1054 case TRESP_NETWORK_GET_NEIGHBORING_CELL_INFO: {
1055 const struct tresp_network_get_neighboring_cell_info *resp_get_ngbr_cell_info = data;
1056 GVariant *neighboring_cell_info_result = NULL;
1057 GVariant *value = NULL;
1059 enum telephony_network_access_technology act;
1062 dbg("[%s] NETWORK_GET_NEIGHBORING_CELL_INFO - [%s]", cpname,
1063 (resp_get_ngbr_cell_info->result == TCORE_RETURN_SUCCESS ? "Success" : "Fail"));
1065 act = resp_get_ngbr_cell_info->info.serving.act;
1067 g_variant_builder_init(&b, G_VARIANT_TYPE("aa{sv}"));
1070 * Fill Serving cell parameter
1072 value = g_variant_new("(iii)",
1073 resp_get_ngbr_cell_info->info.serving.act,
1074 resp_get_ngbr_cell_info->info.serving.mcc,
1075 resp_get_ngbr_cell_info->info.serving.mnc);
1076 g_variant_builder_open(&b, G_VARIANT_TYPE("a{sv}"));
1077 g_variant_builder_add(&b, "{sv}", "serving", value);
1078 g_variant_builder_close(&b);
1080 if (act >= NETWORK_ACT_GSM && act <= NETWORK_ACT_EGPRS) {
1081 value = g_variant_new("(iiiii)",
1082 resp_get_ngbr_cell_info->info.serving.cell.geran.cell_id,
1083 resp_get_ngbr_cell_info->info.serving.cell.geran.lac,
1084 resp_get_ngbr_cell_info->info.serving.cell.geran.bcch,
1085 resp_get_ngbr_cell_info->info.serving.cell.geran.bsic,
1086 resp_get_ngbr_cell_info->info.serving.cell.geran.rxlev);
1087 g_variant_builder_open(&b, G_VARIANT_TYPE("a{sv}"));
1088 g_variant_builder_add(&b, "{sv}", "g_serving", value);
1089 g_variant_builder_close(&b);
1090 } else if (act >= NETWORK_ACT_UMTS && act <= NETWORK_ACT_GSM_UTRAN) {
1091 value = g_variant_new("(iiiii)",
1092 resp_get_ngbr_cell_info->info.serving.cell.umts.cell_id,
1093 resp_get_ngbr_cell_info->info.serving.cell.umts.lac,
1094 resp_get_ngbr_cell_info->info.serving.cell.umts.arfcn,
1095 resp_get_ngbr_cell_info->info.serving.cell.umts.psc,
1096 resp_get_ngbr_cell_info->info.serving.cell.umts.rscp);
1097 g_variant_builder_open(&b, G_VARIANT_TYPE("a{sv}"));
1098 g_variant_builder_add(&b, "{sv}", "u_serving", value);
1099 g_variant_builder_close(&b);
1100 } else if (act == NETWORK_ACT_LTE) {
1101 value = g_variant_new("(iiiii)",
1102 resp_get_ngbr_cell_info->info.serving.cell.lte.cell_id,
1103 resp_get_ngbr_cell_info->info.serving.cell.lte.lac,
1104 resp_get_ngbr_cell_info->info.serving.cell.lte.earfcn,
1105 resp_get_ngbr_cell_info->info.serving.cell.lte.tac,
1106 resp_get_ngbr_cell_info->info.serving.cell.lte.rssi);
1107 g_variant_builder_open(&b, G_VARIANT_TYPE("a{sv}"));
1108 g_variant_builder_add(&b, "{sv}", "l_serving", value);
1109 g_variant_builder_close(&b);
1110 } else if (act >= NETWORK_ACT_IS95A && act <= NETWORK_ACT_EHRPD) {
1111 value = g_variant_new("(uuuuii)",
1112 resp_get_ngbr_cell_info->info.serving.cell.cdma.sid,
1113 resp_get_ngbr_cell_info->info.serving.cell.cdma.nid,
1114 resp_get_ngbr_cell_info->info.serving.cell.cdma.base_id,
1115 resp_get_ngbr_cell_info->info.serving.cell.cdma.refpn,
1116 resp_get_ngbr_cell_info->info.serving.cell.cdma.base_lat,
1117 resp_get_ngbr_cell_info->info.serving.cell.cdma.base_long);
1118 g_variant_builder_open(&b, G_VARIANT_TYPE("a{sv}"));
1119 g_variant_builder_add(&b, "{sv}", "c_serving", value);
1120 g_variant_builder_close(&b);
1124 * Fill GERAN neighbor cell parameter
1126 for (i = 0; i < resp_get_ngbr_cell_info->info.geran_list_count; i++) {
1127 value = g_variant_new("(iiiii)",
1128 resp_get_ngbr_cell_info->info.geran_list[i].cell_id,
1129 resp_get_ngbr_cell_info->info.geran_list[i].lac,
1130 resp_get_ngbr_cell_info->info.geran_list[i].bcch,
1131 resp_get_ngbr_cell_info->info.geran_list[i].bsic,
1132 resp_get_ngbr_cell_info->info.geran_list[i].rxlev);
1133 g_variant_builder_open(&b, G_VARIANT_TYPE("a{sv}"));
1134 g_variant_builder_add(&b, "{sv}", "geran", value);
1135 g_variant_builder_close(&b);
1139 * Fill UMTS neighbor cell parameter
1141 for (i = 0; i < resp_get_ngbr_cell_info->info.umts_list_count; i++) {
1142 value = g_variant_new("(iiiii)",
1143 resp_get_ngbr_cell_info->info.umts_list[i].cell_id,
1144 resp_get_ngbr_cell_info->info.umts_list[i].lac,
1145 resp_get_ngbr_cell_info->info.umts_list[i].arfcn,
1146 resp_get_ngbr_cell_info->info.umts_list[i].psc,
1147 resp_get_ngbr_cell_info->info.umts_list[i].rscp);
1148 g_variant_builder_open(&b, G_VARIANT_TYPE("a{sv}"));
1149 g_variant_builder_add(&b, "{sv}", "umts", value);
1150 g_variant_builder_close(&b);
1152 neighboring_cell_info_result = g_variant_builder_end(&b);
1154 telephony_network_complete_get_ngbr_cell_info(dbus_info->interface_object,
1155 dbus_info->invocation,
1156 neighboring_cell_info_result, resp_get_ngbr_cell_info->result);
1160 case TRESP_NETWORK_SET_PREFERRED_PLMN: {
1161 const struct tresp_network_set_preferred_plmn *resp_set_preferred_plmn = data;
1163 dbg("[%s] NETWORK_SET_PREFERRED_PLMN - [%s]", cpname,
1164 (resp_set_preferred_plmn->result == TCORE_RETURN_SUCCESS ? "Success" : "Fail"));
1166 telephony_network_complete_set_preferred_plmn(dbus_info->interface_object,
1167 dbus_info->invocation, resp_set_preferred_plmn->result);
1171 case TRESP_NETWORK_GET_PREFERRED_PLMN: {
1172 const struct tresp_network_get_preferred_plmn *resp_get_preferred_plmn = data;
1173 GVariant *preferred_plmn_result = NULL;
1177 dbg("[%s] NETWORK_GET_PREFERRED_PLMN - [%s] Count: [%d]", cpname,
1178 (resp_get_preferred_plmn->result == TCORE_RETURN_SUCCESS ? "Success" : "Fail"),
1179 resp_get_preferred_plmn->list_count);
1181 g_variant_builder_init(&b, G_VARIANT_TYPE("aa{sv}"));
1182 for (i = 0; i < resp_get_preferred_plmn->list_count; i++) {
1183 g_variant_builder_open(&b, G_VARIANT_TYPE("a{sv}"));
1185 g_variant_builder_add(&b, "{sv}", "plmn",
1186 g_variant_new_string(resp_get_preferred_plmn->list[i].plmn));
1187 g_variant_builder_add(&b, "{sv}", "act",
1188 g_variant_new_int32(resp_get_preferred_plmn->list[i].act));
1189 g_variant_builder_add(&b, "{sv}", "index",
1190 g_variant_new_int32(resp_get_preferred_plmn->list[i].ef_index));
1191 g_variant_builder_add(&b, "{sv}", "name",
1192 g_variant_new_string(resp_get_preferred_plmn->list[i].name));
1194 g_variant_builder_close(&b);
1196 preferred_plmn_result = g_variant_builder_end(&b);
1198 telephony_network_complete_get_preferred_plmn(dbus_info->interface_object,
1199 dbus_info->invocation,
1200 preferred_plmn_result, resp_get_preferred_plmn->result);
1204 case TRESP_NETWORK_SET_CANCEL_MANUAL_SEARCH: {
1205 const struct tresp_network_set_cancel_manual_search *resp_set_cancel_manual_search = data;
1207 info("[%s] NETWORK_SET_CANCEL_MANUAL_SEARCH - [%s]", cpname,
1208 (resp_set_cancel_manual_search->result == TCORE_RETURN_SUCCESS ? "Success" : "Fail"));
1210 telephony_network_complete_search_cancel(dbus_info->interface_object,
1211 dbus_info->invocation, resp_set_cancel_manual_search->result);
1215 case TRESP_NETWORK_GET_SERVING_NETWORK: {
1216 const struct tresp_network_get_serving_network *resp_get_serving_network = data;
1217 GVariant *serving_network = NULL;
1218 GVariant *value = NULL;
1221 enum telephony_network_access_technology act;
1223 dbg("[%s] NETWORK_GET_SERVING_NETWORK - [%s] AcT: [%d] PLMN: [%s] LAC: [%d]", cpname,
1224 (resp_get_serving_network->result == TCORE_RETURN_SUCCESS ? "Success" : "Fail"),
1225 resp_get_serving_network->act, resp_get_serving_network->plmn,
1226 resp_get_serving_network->gsm.lac);
1228 act = resp_get_serving_network->act;
1229 g_variant_builder_init(&b, G_VARIANT_TYPE("a{sv}"));
1232 * Fill Serving cell parameter
1234 value = g_variant_new("(is)",
1235 resp_get_serving_network->act,
1236 resp_get_serving_network->plmn);
1238 g_variant_builder_add(&b, "{sv}", "serving", value);
1239 if ((act >= NETWORK_ACT_GSM
1240 && act <= NETWORK_ACT_GSM_UTRAN)
1241 || act == NETWORK_ACT_LTE) {
1242 dbg("lac: [%d]", resp_get_serving_network->gsm.lac);
1244 value = g_variant_new("(i)",
1245 resp_get_serving_network->gsm.lac);
1246 g_variant_builder_add(&b, "{sv}", "g_serving", value);
1247 } else if (act >= NETWORK_ACT_IS95A
1248 && act <= NETWORK_ACT_EHRPD) {
1249 dbg("carrier: [%d] sid: [%d] nid: [%d] bs_id: [%d] " \
1250 "bs_lat: [%d] bs_long: [%d] reg_zone: [%d] pilot_pn: [%d]",
1251 resp_get_serving_network->cdma.carrier,
1252 resp_get_serving_network->cdma.sid,
1253 resp_get_serving_network->cdma.nid,
1254 resp_get_serving_network->cdma.bs_id,
1255 resp_get_serving_network->cdma.bs_lat,
1256 resp_get_serving_network->cdma.bs_long,
1257 resp_get_serving_network->cdma.reg_zone,
1258 resp_get_serving_network->cdma.pilot_pn);
1260 value = g_variant_new("(iuuuiiuu)",
1261 resp_get_serving_network->cdma.carrier,
1262 resp_get_serving_network->cdma.sid,
1263 resp_get_serving_network->cdma.nid,
1264 resp_get_serving_network->cdma.bs_id,
1265 resp_get_serving_network->cdma.bs_lat,
1266 resp_get_serving_network->cdma.bs_long,
1267 resp_get_serving_network->cdma.reg_zone,
1268 resp_get_serving_network->cdma.pilot_pn);
1269 g_variant_builder_add(&b, "{sv}", "c_serving", value);
1271 serving_network = g_variant_builder_end(&b);
1273 telephony_network_complete_get_serving_network(dbus_info->interface_object,
1274 dbus_info->invocation,
1275 serving_network, resp_get_serving_network->result);
1279 case TRESP_NETWORK_SET_DEFAULT_DATA_SUBSCRIPTION: {
1280 const struct tresp_network_set_default_data_subscription *resp_set_default_data_subs = data;
1282 info("[%s] NETWORK_SET_DEFAULT_DATA_SUBSCRIPTION - [%s]", cpname,
1283 (resp_set_default_data_subs->result == TCORE_RETURN_SUCCESS ? "Success" : "Fail"));
1285 telephony_network_complete_set_default_data_subscription(dbus_info->interface_object,
1286 dbus_info->invocation, resp_set_default_data_subs->result);
1290 case TRESP_NETWORK_GET_DEFAULT_DATA_SUBSCRIPTION: {
1291 const struct tresp_network_get_default_data_subs *resp_get_default_data_subs = data;
1293 dbg("[%s] NETWORK_GET_DEFAULT_DATA_SUBSCRIPTION - [%s] 'default' Data subscription: [%s]", cpname,
1294 (resp_get_default_data_subs->result == TCORE_RETURN_SUCCESS ? "Success" : "Fail"),
1295 (resp_get_default_data_subs->default_subs == NETWORK_DEFAULT_DATA_SUBS_SIM1 ? "SIM 1" :
1296 (resp_get_default_data_subs->default_subs == NETWORK_DEFAULT_DATA_SUBS_SIM2 ? "SIM 2" :
1299 telephony_network_complete_get_default_data_subscription(dbus_info->interface_object, dbus_info->invocation,
1300 resp_get_default_data_subs->default_subs, resp_get_default_data_subs->result);
1304 case TRESP_NETWORK_SET_DEFAULT_SUBSCRIPTION: {
1305 const struct tresp_network_set_default_subs *resp_set_default_subs = data;
1307 info("[%s] NETWORK_SET_DEFAULT_SUBSCRIPTION - [%s]", cpname,
1308 (resp_set_default_subs->result == TCORE_RETURN_SUCCESS ? "Success" : "Fail"));
1310 telephony_network_complete_set_default_subscription(dbus_info->interface_object,
1311 dbus_info->invocation, resp_set_default_subs->result);
1315 case TRESP_NETWORK_GET_DEFAULT_SUBSCRIPTION: {
1316 const struct tresp_network_get_default_subs *resp_get_default_subs = data;
1318 dbg("[%s] NETWORK_GET_DEFAULT_SUBSCRIPTION - [%s] 'default' subscription: [%s]", cpname,
1319 (resp_get_default_subs->result == TCORE_RETURN_SUCCESS ? "Success" : "Fail"),
1320 (resp_get_default_subs->default_subs == NETWORK_DEFAULT_SUBS_SIM1 ? "SIM 1" :
1321 (resp_get_default_subs->default_subs == NETWORK_DEFAULT_SUBS_SIM2 ? "SIM 2" :
1324 telephony_network_complete_get_default_subscription(dbus_info->interface_object,
1325 dbus_info->invocation,
1326 resp_get_default_subs->default_subs, resp_get_default_subs->result);
1330 case TRESP_NETWORK_SET_EMERGENCY_CALLBACK_MODE: {
1331 const struct tresp_network_set_emergency_callback_mode *resp_set_emergency_callback_mode = data;
1333 info("[%s] NETWORK_SET_EMERGENCY_CALLBACK_MODE - [%s]", cpname,
1334 (resp_set_emergency_callback_mode->result == TCORE_RETURN_SUCCESS ? "Success" : "Fail"));
1336 telephony_network_complete_set_emergency_callback_mode(dbus_info->interface_object,
1337 dbus_info->invocation, resp_set_emergency_callback_mode->result);
1341 case TRESP_NETWORK_SET_ROAMING_PREFERENCE: {
1342 const struct tresp_network_set_roaming_preference *resp_set_roam_pref = data;
1344 info("[%s] NETWORK_SET_ROAMING_PREFERENCE - [%s]", cpname,
1345 (resp_set_roam_pref->result == TCORE_RETURN_SUCCESS ? "Success" : "Fail"));
1347 telephony_network_complete_set_roaming_preference(dbus_info->interface_object,
1348 dbus_info->invocation, resp_set_roam_pref->result);
1352 case TRESP_NETWORK_GET_ROAMING_PREFERENCE: {
1353 const struct tresp_network_get_roaming_preference *resp_get_roam_pref = data;
1355 dbg("[%s] NETWORK_GET_ROAMING_PREFERENCE - [%s] roam_pref: [%d]", cpname,
1356 (resp_get_roam_pref->result == TCORE_RETURN_SUCCESS ? "Success" : "Fail"),
1357 resp_get_roam_pref->roam_pref);
1359 telephony_network_complete_get_roaming_preference(dbus_info->interface_object,
1360 dbus_info->invocation,
1361 resp_get_roam_pref->roam_pref, resp_get_roam_pref->result);
1366 err("Unhandled/Unknown Response: [0x%x]", command);
1373 gboolean dbus_plugin_network_notification(struct custom_data *ctx,
1374 CoreObject *source, TelephonyObjectSkeleton *object,
1375 enum tcore_notification_command command, unsigned int data_len, const void *data)
1377 TelephonyNetwork *network;
1378 const char *cp_name;
1381 err("object is NULL");
1386 err("data is NULL");
1390 cp_name = tcore_server_get_cp_name_by_plugin(tcore_object_ref_plugin(source));
1391 network = telephony_object_peek_network(TELEPHONY_OBJECT(object));
1392 if (network == NULL) {
1393 err("Network object is NULL!!!");
1398 case TNOTI_NETWORK_REGISTRATION_STATUS: {
1399 const struct tnoti_network_registration_status *reg = data;
1401 info("[%s] NET_REGI_STATUS - CS: [%d] PS: [%d] SVC: [%d] Roam: [%d]", cp_name,
1402 reg->cs_domain_status, reg->ps_domain_status,
1403 reg->service_type, reg->roaming_status);
1405 #ifdef ENABLE_KPI_LOGS
1406 /* We ignore No SIM present case for KPI */
1407 if (reg->cs_domain_status == NETWORK_SERVICE_DOMAIN_STATUS_FULL
1408 && telephony_network_get_circuit_status(network) != NETWORK_SERVICE_DOMAIN_STATUS_FULL)
1409 TIME_CHECK("[%s] CS Network Full", cp_name);
1411 if (reg->ps_domain_status == NETWORK_SERVICE_DOMAIN_STATUS_FULL
1412 && telephony_network_get_packet_status(network) != NETWORK_SERVICE_DOMAIN_STATUS_FULL)
1413 TIME_CHECK("[%s] PS Network Full", cp_name);
1415 __check_network_properties(network, source, cp_name,
1416 (NET_PROP_CS|NET_PROP_PS|NET_PROP_SVC_TYPE|NET_PROP_ROAM));
1419 telephony_network_emit_registration_status(network,
1420 reg->cs_domain_status, reg->ps_domain_status,
1421 reg->service_type, reg->roaming_status);
1425 case TNOTI_NETWORK_CHANGE: {
1426 const struct tnoti_network_change *change = data;
1428 info("[%s] NET_CHANGE - plmn: [%s] lac: [%d]", cp_name,
1429 change->plmn, change->gsm.lac);
1431 __check_network_properties(network, source, cp_name, NET_PROP_PLMN);
1434 telephony_network_emit_change(network,
1435 change->act, change->plmn);
1439 case TNOTI_NETWORK_TIMEINFO: {
1440 const struct tnoti_network_timeinfo *time_info = data;
1442 info("[%s] NET_TIMEINFO - [%04d-%02d-%02d] [%02d:%02d:%02d]", cp_name,
1443 time_info->year, time_info->month, time_info->day,
1444 time_info->hour, time_info->minute, time_info->second);
1447 telephony_network_emit_time_info(network,
1448 time_info->year, time_info->month, time_info->day,
1449 time_info->hour, time_info->minute, time_info->second,
1451 time_info->gmtoff, time_info->dstoff,
1457 case TNOTI_NETWORK_ICON_INFO: {
1458 const struct tnoti_network_icon_info *icon_info = data;
1460 /* Update property */
1461 if (icon_info->type & NETWORK_ICON_INFO_RSSI) {
1462 info("[%s] NET_ICON_INFO - RSSI: [%d]", cp_name, icon_info->rssi);
1465 telephony_network_set_sig_level(network, icon_info->rssi);
1470 case TNOTI_NETWORK_IDENTITY: {
1471 const struct tnoti_network_identity *identity = data;
1473 info("[%s] NET_IDENTITY - long name: [%s] short name: [%s] PLMN: [%s]", cp_name,
1474 identity->full_name, identity->short_name, identity->plmn);
1476 __check_network_properties(network, source, cp_name,
1477 (NET_PROP_NAME_OPTION | NET_PROP_SPN | NET_PROP_NWNAME));
1480 telephony_network_emit_identity(network,
1481 identity->plmn, identity->short_name, identity->full_name);
1485 case TNOTI_NETWORK_LOCATION_CELLINFO: {
1486 const struct tnoti_network_location_cellinfo *location = data;
1487 enum telephony_network_service_type network_service_type = NETWORK_SERVICE_TYPE_UNKNOWN;
1489 info("[%s] NET_LOCATION_CELLINFO - LAC: [0x%x] Cell ID: [0x%x]", cp_name,
1490 location->lac, location->cell_id);
1492 /* Update properties */
1493 tcore_network_get_service_type(source, &network_service_type);
1494 if (NETWORK_SERVICE_TYPE_LTE == network_service_type) {
1495 telephony_network_set_lac(network, 0);
1496 telephony_network_set_tac(network, location->lac);
1498 telephony_network_set_lac(network, location->lac);
1499 telephony_network_set_tac(network, 0);
1502 telephony_network_set_cell_id(network, location->cell_id);
1505 telephony_network_emit_cell_info(network,
1506 location->lac, location->cell_id);
1510 case TNOTI_NETWORK_SIGNAL_STRENGTH: {
1511 const struct tnoti_network_signal_strength *signal_strength = data;
1513 info("[%s] NET_SIGNAL_STRENGTH - DBM: [%d]", cp_name,
1514 signal_strength->dbm);
1516 /* Update properties */
1517 telephony_network_set_sig_dbm(network, signal_strength->dbm);
1520 telephony_network_emit_signal_strength(network,
1521 signal_strength->dbm);
1525 case TNOTI_NETWORK_DEFAULT_DATA_SUBSCRIPTION: {
1526 const struct tnoti_network_default_data_subs *default_data_subs_info = data;
1528 info("[%s] NET_DEFAULT_DATA_SUBSCRIPTION - 'default' DDS: [%s]", cp_name,
1529 (default_data_subs_info->default_subs == NETWORK_DEFAULT_DATA_SUBS_SIM1 ? "SIM 1" :
1530 (default_data_subs_info->default_subs == NETWORK_DEFAULT_DATA_SUBS_SIM2 ? "SIM 2" :
1534 telephony_network_emit_default_data_subscription(network,
1535 default_data_subs_info->default_subs);
1539 case TNOTI_NETWORK_DEFAULT_SUBSCRIPTION: {
1540 const struct tnoti_network_default_subs *default_subs_info = data;
1542 info("[%s] NET_DEFAULT_SUBSCRIPTION - 'default' subscription: [%s]", cp_name,
1543 (default_subs_info->default_subs == NETWORK_DEFAULT_SUBS_SIM1 ? "SIM 1" :
1544 (default_subs_info->default_subs == NETWORK_DEFAULT_SUBS_SIM2 ? "SIM 2" :
1548 telephony_network_emit_default_subscription(network,
1549 default_subs_info->default_subs);
1553 case TNOTI_NETWORK_IMS_VOICE_SUPPORT_STATUS: {
1554 const struct tnoti_network_ims_voice_status *status = data;
1556 dbg("[%s] NET_IMS_VOICE_SUPPORT_STATUS - Status: [%s]", cp_name,
1557 (status->status == NETWORK_IMS_VOICE_SUPPORT ? "SUPPORTED" :
1558 (status->status == NETWORK_IMS_VOICE_NOT_SUPPORT ? "NOT SUPPORTED" :
1561 /* Update properties */
1562 telephony_network_set_ims_voice_status(network,
1567 case TNOTI_NETWORK_EMERGENCY_CALLBACK_MODE: {
1568 const struct tnoti_network_emergency_callback_mode *emergency_callback_mode = data;
1570 dbg("[%s] NET_EMERGENCY_CALLBACK_MODE - Mode: [%s]", cp_name,
1571 (emergency_callback_mode->mode == NETWORK_EMERGENCY_CALLBACK_MODE_ENTER ? "ENTER" :
1572 (emergency_callback_mode->mode == NETWORK_EMERGENCY_CALLBACK_MODE_EXIT? "EXIT" :
1576 telephony_network_emit_emergency_callback_mode(network,
1577 emergency_callback_mode->mode);
1581 case TNOTI_NETWORK_IMS_REGISTRATION_STATUS: {
1582 const struct tnoti_network_ims_registration_info *ims_reg_info = data;
1584 dbg("TNOTI_NETWORK_IMS_REGISTRATION_STATUS");
1586 if (ims_reg_info->is_registered
1587 && (ims_reg_info->feature_mask & NETWORK_IMS_REG_FEATURE_TYPE_VOLTE)) {
1588 telephony_network_set_volte_enable(network, TRUE);
1590 telephony_network_set_volte_enable(network, FALSE);
1596 err("Unhandled/Unknown Notification: [0x%x]", command);