2 * tel-plugin-socket-communicator
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.
26 #include <glib-object.h>
33 #include <communicator.h>
34 #include <core_object.h>
36 #include <user_request.h>
40 #include "generated-code.h"
43 #define g_variant_iter_free0( iter ) \
45 g_variant_iter_free( iter );\
49 static gboolean dbus_sim_data_request(struct custom_data *ctx, enum tel_sim_status sim_status )
51 UserRequest *ur = NULL;
52 TcorePlugin *plugin = NULL;
55 case SIM_STATUS_INITIALIZING :
56 case SIM_STATUS_PIN_REQUIRED :
57 case SIM_STATUS_PUK_REQUIRED :
58 case SIM_STATUS_CARD_BLOCKED :
59 case SIM_STATUS_NCK_REQUIRED :
60 case SIM_STATUS_NSCK_REQUIRED :
61 case SIM_STATUS_SPCK_REQUIRED :
62 case SIM_STATUS_CCK_REQUIRED :
63 case SIM_STATUS_LOCK_REQUIRED :
64 if(ctx->sim_recv_first_status == FALSE){
65 dbg("received sim status at first time");
66 plugin = tcore_server_find_plugin(ctx->server, TCORE_PLUGIN_DEFAULT);
68 dbg("req - TREQ_SIM_GET_ECC ");
69 ur = tcore_user_request_new(ctx->comm, tcore_plugin_get_description(plugin)->name);
70 tcore_user_request_set_command(ur, TREQ_SIM_GET_ECC);
71 tcore_communicator_dispatch_request(ctx->comm, ur);
72 ctx->sim_recv_first_status = TRUE;
82 static gboolean on_sim_get_init_status(TelephonySim *sim, GDBusMethodInvocation *invocation,
85 struct custom_data *ctx = user_data;
86 gint tmp_cardstatus = 0xff;
87 gboolean b_changed = FALSE;
88 GSList *co_list = NULL;
89 CoreObject *co_sim = NULL;
90 TcorePlugin *plugin = NULL;
94 plugin = tcore_server_find_plugin(ctx->server, TCORE_PLUGIN_DEFAULT);
95 co_list = tcore_plugin_get_core_objects_bytype(plugin, CORE_OBJECT_TYPE_SIM);
97 dbg("error- co_list is NULL");
99 co_sim = (CoreObject *)co_list->data;
100 g_slist_free(co_list);
103 dbg("error- co_sim is NULL");
106 tmp_cardstatus = tcore_sim_get_status(co_sim);
107 b_changed = tcore_sim_get_identification(co_sim);
108 dbg("sim init info - cardstatus[%d],changed[%d]", tmp_cardstatus, b_changed);
110 telephony_sim_complete_get_init_status(sim, invocation, tmp_cardstatus, b_changed);
115 static gboolean on_sim_get_card_type(TelephonySim *sim, GDBusMethodInvocation *invocation,
118 struct custom_data *ctx = user_data;
119 enum tel_sim_type type = SIM_TYPE_UNKNOWN;
120 GSList *co_list = NULL;
121 CoreObject *co_sim = NULL;
122 TcorePlugin *plugin = NULL;
124 dbg("Func Entrance");
126 plugin = tcore_server_find_plugin(ctx->server, TCORE_PLUGIN_DEFAULT);
127 co_list = tcore_plugin_get_core_objects_bytype(plugin, CORE_OBJECT_TYPE_SIM);
129 dbg("error- co_list is NULL");
131 co_sim = (CoreObject *)co_list->data;
132 g_slist_free(co_list);
135 dbg("error- co_sim is NULL");
138 type = tcore_sim_get_type(co_sim);
140 telephony_sim_complete_get_card_type(sim, invocation, type);
145 static gboolean on_sim_get_imsi(TelephonySim *sim, GDBusMethodInvocation *invocation,
148 struct custom_data *ctx = user_data;
149 struct tel_sim_imsi *n_imsi;
150 GSList *co_list = NULL;
151 CoreObject *co_sim = NULL;
152 TcorePlugin *plugin = NULL;
154 dbg("Func Entrance");
155 plugin = tcore_server_find_plugin(ctx->server, TCORE_PLUGIN_DEFAULT);
156 co_list = tcore_plugin_get_core_objects_bytype(plugin, CORE_OBJECT_TYPE_SIM);
158 dbg("error- co_list is NULL");
160 co_sim = (CoreObject *)co_list->data;
161 g_slist_free(co_list);
164 dbg("error- co_sim is NULL");
167 n_imsi = tcore_sim_get_imsi(co_sim);
168 dbg("n_imsi->plmn[%s]", n_imsi->plmn);
169 dbg("n_imsi->msin[%s]", n_imsi->msin);
170 telephony_sim_complete_get_imsi(sim, invocation, n_imsi->plmn, n_imsi->msin);
174 static gboolean on_sim_get_ecc(TelephonySim *sim, GDBusMethodInvocation *invocation,
177 struct custom_data *ctx = user_data;
182 dbg("Func Entrance");
184 g_variant_builder_init(&b, G_VARIANT_TYPE("aa{sv}"));
186 for (i = 0; i < ctx->cached_sim_ecc.ecc_count; i++) {
187 g_variant_builder_open(&b, G_VARIANT_TYPE("a{sv}"));
188 g_variant_builder_add(&b, "{sv}", "name", g_variant_new_string(ctx->cached_sim_ecc.ecc[i].ecc_string));
189 g_variant_builder_add(&b, "{sv}", "number", g_variant_new_string(ctx->cached_sim_ecc.ecc[i].ecc_num));
190 g_variant_builder_add(&b, "{sv}", "category", g_variant_new_int32(ctx->cached_sim_ecc.ecc[i].ecc_category));
191 g_variant_builder_close(&b);
193 gv = g_variant_builder_end(&b);
196 dbg("error - ecc gv is NULL");
198 telephony_sim_complete_get_ecc(sim, invocation, gv);
203 static gboolean on_sim_get_iccid(TelephonySim *sim, GDBusMethodInvocation *invocation,
206 struct custom_data *ctx = user_data;
207 UserRequest *ur = NULL;
209 dbg("Func Entrance");
210 ur = MAKE_UR(ctx, sim, invocation);
212 tcore_user_request_set_command(ur, TREQ_SIM_GET_ICCID);
213 tcore_communicator_dispatch_request(ctx->comm, ur);
218 static gboolean on_sim_get_language(TelephonySim *sim, GDBusMethodInvocation *invocation,
221 struct custom_data *ctx = user_data;
222 UserRequest *ur = NULL;
224 ur = MAKE_UR(ctx, sim, invocation);
226 tcore_user_request_set_command(ur, TREQ_SIM_GET_LANGUAGE);
227 tcore_communicator_dispatch_request(ctx->comm, ur);
232 static gboolean on_sim_set_language(TelephonySim *sim, GDBusMethodInvocation *invocation,
233 gint arg_language, gpointer user_data)
235 struct custom_data *ctx = user_data;
236 UserRequest *ur = NULL;
238 struct treq_sim_set_language set_language;
239 memset(&set_language, 0, sizeof(struct treq_sim_set_language));
240 set_language.language = arg_language;
242 dbg("set_language.language[%d]", set_language.language);
243 ur = MAKE_UR(ctx, sim, invocation);
245 tcore_user_request_set_data(ur, sizeof(struct treq_sim_set_language), &set_language);
246 tcore_user_request_set_command(ur, TREQ_SIM_SET_LANGUAGE);
247 tcore_communicator_dispatch_request(ctx->comm, ur);
252 static gboolean on_sim_get_callforwarding(TelephonySim *sim, GDBusMethodInvocation *invocation,
255 struct custom_data *ctx = user_data;
256 UserRequest *ur = NULL;
258 ur = MAKE_UR(ctx, sim, invocation);
260 tcore_user_request_set_command(ur, TREQ_SIM_GET_CALLFORWARDING);
261 tcore_communicator_dispatch_request(ctx->comm, ur);
266 static gboolean on_sim_get_message_waiting(TelephonySim *sim, GDBusMethodInvocation *invocation,
269 struct custom_data *ctx = user_data;
270 UserRequest *ur = NULL;
272 ur = MAKE_UR(ctx, sim, invocation);
274 tcore_user_request_set_command(ur, TREQ_SIM_GET_MESSAGEWAITING);
275 tcore_communicator_dispatch_request(ctx->comm, ur);
280 static gboolean on_sim_get_mailbox(TelephonySim *sim, GDBusMethodInvocation *invocation,
283 struct custom_data *ctx = user_data;
284 UserRequest *ur = NULL;
286 ur = MAKE_UR(ctx, sim, invocation);
288 tcore_user_request_set_command(ur, TREQ_SIM_GET_MAILBOX);
289 tcore_communicator_dispatch_request(ctx->comm, ur);
295 static gboolean on_sim_get_cphsinfo(TelephonySim *sim, GDBusMethodInvocation *invocation,
298 struct custom_data *ctx = user_data;
299 UserRequest *ur = NULL;
301 ur = MAKE_UR(ctx, sim, invocation);
303 tcore_user_request_set_command(ur, TREQ_SIM_GET_CPHS_INFO);
304 tcore_communicator_dispatch_request(ctx->comm, ur);
309 static gboolean on_sim_get_msisdn(TelephonySim *sim, GDBusMethodInvocation *invocation,
312 struct custom_data *ctx = user_data;
313 UserRequest *ur = NULL;
315 ur = MAKE_UR(ctx, sim, invocation);
317 tcore_user_request_set_command(ur, TREQ_SIM_GET_MSISDN);
318 tcore_communicator_dispatch_request(ctx->comm, ur);
323 static gboolean on_sim_get_oplmnwact(TelephonySim *sim, GDBusMethodInvocation *invocation,
326 struct custom_data *ctx = user_data;
327 UserRequest *ur = NULL;
329 ur = MAKE_UR(ctx, sim, invocation);
331 tcore_user_request_set_command(ur, TREQ_SIM_GET_OPLMNWACT);
332 tcore_communicator_dispatch_request(ctx->comm, ur);
338 static gboolean on_sim_get_spn(TelephonySim *sim, GDBusMethodInvocation *invocation,
341 struct custom_data *ctx = user_data;
342 UserRequest *ur = NULL;
344 ur = MAKE_UR(ctx, sim, invocation);
346 tcore_user_request_set_command(ur, TREQ_SIM_GET_SPN);
347 tcore_communicator_dispatch_request(ctx->comm, ur);
352 static gboolean on_sim_get_cphs_netname(TelephonySim *sim, GDBusMethodInvocation *invocation,
355 struct custom_data *ctx = user_data;
356 UserRequest *ur = NULL;
358 ur = MAKE_UR(ctx, sim, invocation);
360 tcore_user_request_set_command(ur, TREQ_SIM_GET_CPHS_NETNAME);
361 tcore_communicator_dispatch_request(ctx->comm, ur);
366 static gboolean on_sim_authentication(TelephonySim *sim, GDBusMethodInvocation *invocation,
372 struct custom_data *ctx = user_data;
373 UserRequest *ur = NULL;
374 GVariantIter *iter = NULL;
375 GVariant *rand_gv = NULL;
376 GVariant *autn_gv = NULL;
380 struct treq_sim_req_authentication req_auth;
381 memset(&req_auth, 0, sizeof(struct treq_sim_req_authentication));
383 req_auth.auth_type = arg_type;
385 rand_gv = g_variant_get_variant(arg_rand);
386 g_variant_get(rand_gv, "ay", &iter);
387 while ( g_variant_iter_loop (iter, "y", &rt_i)) {
388 req_auth.rand_data[i] = rt_i;
391 req_auth.rand_length = (unsigned int)i;
394 autn_gv = g_variant_get_variant(arg_autn);
395 g_variant_get(autn_gv, "ay", &iter);
396 while ( g_variant_iter_loop (iter, "y", &rt_i)) {
397 req_auth.autn_data[i] = rt_i;
400 req_auth.autn_length = (unsigned int)i;
402 ur = MAKE_UR(ctx, sim, invocation);
403 tcore_user_request_set_data(ur, sizeof(struct treq_sim_req_authentication), &req_auth);
404 tcore_user_request_set_command(ur, TREQ_SIM_REQ_AUTHENTICATION);
405 tcore_communicator_dispatch_request(ctx->comm, ur);
410 static gboolean on_sim_verify_sec(TelephonySim *sim, GDBusMethodInvocation *invocation,
412 const gchar *arg_password,
415 struct custom_data *ctx = user_data;
416 UserRequest *ur = NULL;
418 struct treq_sim_verify_pins verify_pins;
419 memset(&verify_pins, 0, sizeof(struct treq_sim_verify_pins));
421 verify_pins.pin_type = arg_type;
422 verify_pins.pin_length = strlen(arg_password);
423 memcpy(verify_pins.pin, arg_password, verify_pins.pin_length);
425 ur = MAKE_UR(ctx, sim, invocation);
426 tcore_user_request_set_data(ur, sizeof(struct treq_sim_verify_pins), &verify_pins);
427 tcore_user_request_set_command(ur, TREQ_SIM_VERIFY_PINS);
428 tcore_communicator_dispatch_request(ctx->comm, ur);
433 static gboolean on_sim_verify_puk(TelephonySim *sim, GDBusMethodInvocation *invocation,
435 const gchar *arg_puk,
436 const gchar *arg_new_pin,
439 struct custom_data *ctx = user_data;
440 UserRequest *ur = NULL;
442 struct treq_sim_verify_puks verify_puks;
443 memset(&verify_puks, 0, sizeof(struct treq_sim_verify_puks));
445 verify_puks.puk_type = arg_type;
446 verify_puks.puk_length = strlen(arg_puk);
447 memcpy(verify_puks.puk, arg_puk, verify_puks.puk_length);
448 verify_puks.pin_length = strlen(arg_new_pin);
449 memcpy(verify_puks.pin, arg_new_pin, verify_puks.pin_length);
451 ur = MAKE_UR(ctx, sim, invocation);
452 tcore_user_request_set_data(ur, sizeof(struct treq_sim_verify_puks), &verify_puks);
453 tcore_user_request_set_command(ur, TREQ_SIM_VERIFY_PUKS);
454 tcore_communicator_dispatch_request(ctx->comm, ur);
459 static gboolean on_sim_change_pin(TelephonySim *sim, GDBusMethodInvocation *invocation,
461 const gchar *arg_old_password,
462 const gchar *arg_new_password,
465 struct custom_data *ctx = user_data;
466 UserRequest *ur = NULL;
468 struct treq_sim_change_pins change_pins;
469 memset(&change_pins, 0, sizeof(struct treq_sim_change_pins));
471 change_pins.type = arg_type;
472 change_pins.old_pin_length = strlen(arg_old_password);
473 memcpy(change_pins.old_pin, arg_old_password, change_pins.old_pin_length);
474 change_pins.new_pin_length = strlen(arg_new_password);
475 memcpy(change_pins.new_pin, arg_new_password, change_pins.new_pin_length);
477 ur = MAKE_UR(ctx, sim, invocation);
478 tcore_user_request_set_data(ur, sizeof(struct treq_sim_change_pins), &change_pins);
479 tcore_user_request_set_command(ur, TREQ_SIM_CHANGE_PINS);
480 tcore_communicator_dispatch_request(ctx->comm, ur);
485 static gboolean on_sim_disable_facility(TelephonySim *sim, GDBusMethodInvocation *invocation,
487 const gchar *arg_password,
490 struct custom_data *ctx = user_data;
491 UserRequest *ur = NULL;
493 struct treq_sim_disable_facility dis_facility;
494 memset(&dis_facility, 0, sizeof(struct treq_sim_disable_facility));
496 dbg("arg_type[%d]", arg_type);
499 dis_facility.type = SIM_FACILITY_PS;
502 dis_facility.type = SIM_FACILITY_SC;
505 dis_facility.type = SIM_FACILITY_FD;
508 dis_facility.type = SIM_FACILITY_PN;
511 dis_facility.type = SIM_FACILITY_PU;
514 dis_facility.type = SIM_FACILITY_PP;
517 dis_facility.type = SIM_FACILITY_PC;
520 dbg("error - not handled type[%d]", arg_type);
523 dis_facility.password_length = strlen(arg_password);
524 memcpy(dis_facility.password, arg_password, dis_facility.password_length);
526 ur = MAKE_UR(ctx, sim, invocation);
527 tcore_user_request_set_data(ur, sizeof(struct treq_sim_disable_facility), &dis_facility);
528 tcore_user_request_set_command(ur, TREQ_SIM_DISABLE_FACILITY);
529 tcore_communicator_dispatch_request(ctx->comm, ur);
534 static gboolean on_sim_enable_facility(TelephonySim *sim, GDBusMethodInvocation *invocation,
536 const gchar *arg_password,
539 struct custom_data *ctx = user_data;
540 UserRequest *ur = NULL;
542 struct treq_sim_enable_facility en_facility;
543 memset(&en_facility, 0, sizeof(struct treq_sim_enable_facility));
545 dbg("arg_type[%d]", arg_type);
548 en_facility.type = SIM_FACILITY_PS;
551 en_facility.type = SIM_FACILITY_SC;
554 en_facility.type = SIM_FACILITY_FD;
557 en_facility.type = SIM_FACILITY_PN;
560 en_facility.type = SIM_FACILITY_PU;
563 en_facility.type = SIM_FACILITY_PP;
566 en_facility.type = SIM_FACILITY_PC;
569 dbg("error - not handled type[%d]", arg_type);
572 en_facility.password_length = strlen(arg_password);
573 memcpy(en_facility.password, arg_password, en_facility.password_length);
575 ur = MAKE_UR(ctx, sim, invocation);
576 tcore_user_request_set_data(ur, sizeof(struct treq_sim_enable_facility), &en_facility);
577 tcore_user_request_set_command(ur, TREQ_SIM_ENABLE_FACILITY);
578 tcore_communicator_dispatch_request(ctx->comm, ur);
583 static gboolean on_sim_get_facility(TelephonySim *sim, GDBusMethodInvocation *invocation,
587 struct custom_data *ctx = user_data;
588 UserRequest *ur = NULL;
590 struct treq_sim_get_facility_status facility;
591 memset(&facility, 0, sizeof(struct treq_sim_get_facility_status));
593 dbg("arg_type[%d]", arg_type);
596 facility.type = SIM_FACILITY_PS;
599 facility.type = SIM_FACILITY_SC;
602 facility.type = SIM_FACILITY_FD;
605 facility.type = SIM_FACILITY_PN;
608 facility.type = SIM_FACILITY_PU;
611 facility.type = SIM_FACILITY_PP;
614 facility.type = SIM_FACILITY_PC;
617 dbg("error - not handled type[%d]", arg_type);
621 ur = MAKE_UR(ctx, sim, invocation);
622 tcore_user_request_set_data(ur, sizeof(struct treq_sim_get_facility_status), &facility);
623 tcore_user_request_set_command(ur, TREQ_SIM_GET_FACILITY_STATUS);
624 tcore_communicator_dispatch_request(ctx->comm, ur);
629 static gboolean on_sim_get_lock_info(TelephonySim *sim, GDBusMethodInvocation *invocation,
633 struct custom_data *ctx = user_data;
634 UserRequest *ur = NULL;
636 struct treq_sim_get_lock_info lock_info;
637 memset(&lock_info, 0, sizeof(struct treq_sim_get_lock_info));
639 dbg("arg_type[%d]", arg_type);
642 lock_info.type = SIM_FACILITY_PS;
645 lock_info.type = SIM_FACILITY_SC;
648 lock_info.type = SIM_FACILITY_FD;
651 lock_info.type = SIM_FACILITY_PN;
654 lock_info.type = SIM_FACILITY_PU;
657 lock_info.type = SIM_FACILITY_PP;
660 lock_info.type = SIM_FACILITY_PC;
663 dbg("error - not handled type[%d]", arg_type);
667 ur = MAKE_UR(ctx, sim, invocation);
668 tcore_user_request_set_data(ur, sizeof(struct treq_sim_get_lock_info), &lock_info);
669 tcore_user_request_set_command(ur, TREQ_SIM_GET_LOCK_INFO);
670 tcore_communicator_dispatch_request(ctx->comm, ur);
675 static gboolean on_sim_transfer_apdu(TelephonySim *sim, GDBusMethodInvocation *invocation,
679 struct custom_data *ctx = user_data;
680 UserRequest *ur = NULL;
681 struct treq_sim_transmit_apdu send_apdu;
683 GVariantIter *iter = NULL;
684 GVariant *inner_gv = NULL;
688 dbg("Func Entrance");
689 memset(&send_apdu, 0, sizeof(struct treq_sim_transmit_apdu));
691 inner_gv = g_variant_get_variant(arg_apdu);
693 g_variant_get(inner_gv, "ay", &iter);
694 while ( g_variant_iter_loop (iter, "y", &rt_i)) {
695 send_apdu.apdu[i] = rt_i;
698 send_apdu.apdu_length = (unsigned int)i;
699 g_variant_iter_free0(iter);
700 g_variant_unref(inner_gv);
701 g_variant_unref(arg_apdu);
703 for(i=0; i < (int)send_apdu.apdu_length; i++)
704 dbg("apdu[%d][0x%02x]",i, send_apdu.apdu[i]);
706 ur = MAKE_UR(ctx, sim, invocation);
707 tcore_user_request_set_data(ur, sizeof(struct treq_sim_transmit_apdu), &send_apdu);
708 tcore_user_request_set_command(ur, TREQ_SIM_TRANSMIT_APDU);
709 tcore_communicator_dispatch_request(ctx->comm, ur);
714 static gboolean on_sim_get_atr(TelephonySim *sim, GDBusMethodInvocation *invocation,
717 struct custom_data *ctx = user_data;
718 UserRequest *ur = NULL;
720 ur = MAKE_UR(ctx, sim, invocation);
722 tcore_user_request_set_command(ur, TREQ_SIM_GET_ATR);
723 tcore_communicator_dispatch_request(ctx->comm, ur);
728 gboolean dbus_plugin_setup_sim_interface(TelephonyObjectSkeleton *object, struct custom_data *ctx)
732 sim = telephony_sim_skeleton_new();
733 telephony_object_skeleton_set_sim(object, sim);
736 dbg("sim = %p", sim);
738 g_signal_connect (sim,
739 "handle-get-init-status",
740 G_CALLBACK (on_sim_get_init_status),
743 g_signal_connect (sim,
744 "handle-get-card-type",
745 G_CALLBACK (on_sim_get_card_type),
748 g_signal_connect (sim,
750 G_CALLBACK (on_sim_get_imsi),
753 g_signal_connect (sim,
755 G_CALLBACK (on_sim_get_ecc),
758 g_signal_connect (sim,
760 G_CALLBACK (on_sim_get_iccid),
763 g_signal_connect (sim,
764 "handle-get-language",
765 G_CALLBACK (on_sim_get_language),
768 g_signal_connect (sim,
769 "handle-set-language",
770 G_CALLBACK (on_sim_set_language),
773 g_signal_connect (sim,
774 "handle-get-callforwarding",
775 G_CALLBACK (on_sim_get_callforwarding),
778 g_signal_connect (sim,
779 "handle-get-message-waiting",
780 G_CALLBACK (on_sim_get_message_waiting),
783 g_signal_connect (sim,
784 "handle-get-mailbox",
785 G_CALLBACK (on_sim_get_mailbox),
788 g_signal_connect (sim,
789 "handle-get-cphsinfo",
790 G_CALLBACK (on_sim_get_cphsinfo),
793 g_signal_connect (sim,
795 G_CALLBACK (on_sim_get_msisdn),
798 g_signal_connect (sim,
799 "handle-get-oplmnwact",
800 G_CALLBACK (on_sim_get_oplmnwact),
803 g_signal_connect (sim,
805 G_CALLBACK (on_sim_get_spn),
808 g_signal_connect (sim,
809 "handle-get-cphs-net-name",
810 G_CALLBACK (on_sim_get_cphs_netname),
813 g_signal_connect (sim,
814 "handle-authentication",
815 G_CALLBACK (on_sim_authentication),
818 g_signal_connect (sim,
820 G_CALLBACK (on_sim_verify_sec),
823 g_signal_connect (sim,
825 G_CALLBACK (on_sim_verify_puk),
828 g_signal_connect (sim,
830 G_CALLBACK (on_sim_change_pin),
833 g_signal_connect (sim,
834 "handle-disable-facility",
835 G_CALLBACK (on_sim_disable_facility),
838 g_signal_connect (sim,
839 "handle-enable-facility",
840 G_CALLBACK (on_sim_enable_facility),
843 g_signal_connect (sim,
844 "handle-get-facility",
845 G_CALLBACK (on_sim_get_facility),
848 g_signal_connect (sim,
849 "handle-get-lock-info",
850 G_CALLBACK (on_sim_get_lock_info),
853 g_signal_connect (sim,
854 "handle-transfer-apdu",
855 G_CALLBACK (on_sim_transfer_apdu),
858 g_signal_connect (sim,
860 G_CALLBACK (on_sim_get_atr),
866 gboolean dbus_plugin_sim_response(struct custom_data *ctx, UserRequest *ur,
867 struct dbus_request_info *dbus_info, enum tcore_response_command command,
868 unsigned int data_len, const void *data)
870 const struct tresp_sim_verify_pins *resp_verify_pins = data;
871 const struct tresp_sim_verify_puks *resp_verify_puks = data;
872 const struct tresp_sim_change_pins *resp_change_pins = data;
873 const struct tresp_sim_get_facility_status *resp_get_facility = data;
874 const struct tresp_sim_disable_facility *resp_dis_facility = data;
875 const struct tresp_sim_enable_facility *resp_en_facility = data;
876 const struct tresp_sim_transmit_apdu *resp_apdu = data;
877 const struct tresp_sim_get_atr *resp_get_atr = data;
878 const struct tresp_sim_read *resp_read = data;
879 const struct tresp_sim_req_authentication *resp_auth = data;
880 const struct tresp_sim_set_language *resp_set_language = data;
881 const struct tresp_sim_get_lock_info *resp_lock = data;
884 dbg("Command = [0x%x], data_len = %d", command, data_len);
887 case TRESP_SIM_GET_ECC: {
888 dbg("resp comm - TRESP_SIM_GET_ECC");
889 /* GVariant *gv = NULL;
891 g_variant_builder_init(&b, G_VARIANT_TYPE("aa{sv}"));
893 for (i = 0; i < resp_read->data.ecc.ecc_count; i++) {
894 g_variant_builder_open(&b, G_VARIANT_TYPE("a{sv}"));
895 g_variant_builder_add(&b, "{sv}", "name", g_variant_new_string(resp_read->data.ecc.ecc[i].ecc_string));
896 g_variant_builder_add(&b, "{sv}", "number", g_variant_new_string(resp_read->data.ecc.ecc[i].ecc_num));
897 g_variant_builder_add(&b, "{sv}", "category", g_variant_new_int32(resp_read->data.ecc.ecc[i].ecc_category));
898 g_variant_builder_close(&b);
900 gv = g_variant_builder_end(&b);
901 ctx->cached_sim_ecc = gv;*/
902 memcpy((void*)&ctx->cached_sim_ecc, (const void*)&resp_read->data.ecc, sizeof(struct tel_sim_ecc_list));
906 case TRESP_SIM_GET_ICCID:
907 dbg("resp comm - TRESP_SIM_GET_ICCID");
908 dbg("dbus_info->interface_object[%p], dbus_info->invocation[%p],dbus_info->interface_object, dbus_info->invocation");
909 dbg("result[%d], iccid[%s]", resp_read->result, resp_read->data.iccid.iccid);
910 telephony_sim_complete_get_iccid(dbus_info->interface_object, dbus_info->invocation,
912 resp_read->data.iccid.iccid);
915 case TRESP_SIM_GET_LANGUAGE:
916 dbg("resp comm - TRESP_SIM_GET_LANGUAGE");
917 telephony_sim_complete_get_language(dbus_info->interface_object, dbus_info->invocation,
919 resp_read->data.language.language[0]);
922 case TRESP_SIM_SET_LANGUAGE:
923 dbg("resp comm - TRESP_SIM_SET_LANGUAGE");
924 telephony_sim_complete_set_language(dbus_info->interface_object, dbus_info->invocation,
925 resp_set_language->result);
928 case TRESP_SIM_GET_CALLFORWARDING:
929 dbg("resp comm - TRESP_SIM_GET_CALLFORWARDING");
930 telephony_sim_complete_get_callforwarding (dbus_info->interface_object, dbus_info->invocation,
932 resp_read->data.cf.voice1,
933 resp_read->data.cf.voice2);
936 case TRESP_SIM_GET_MESSAGEWAITING:
937 dbg("resp comm - TRESP_SIM_GET_MESSAGEWAITING");
938 if (resp_read->data.mw.b_cphs) {
939 telephony_sim_complete_get_message_waiting(dbus_info->interface_object, dbus_info->invocation,
941 resp_read->data.mw.mw_data_u.cphs_mw.b_voice1,
942 resp_read->data.mw.mw_data_u.cphs_mw.b_voice2,
943 resp_read->data.mw.mw_data_u.cphs_mw.b_fax,
944 resp_read->data.mw.mw_data_u.cphs_mw.b_data);
946 telephony_sim_complete_get_message_waiting(dbus_info->interface_object, dbus_info->invocation,
948 resp_read->data.mw.mw_data_u.mw.voice_count,
950 resp_read->data.mw.mw_data_u.mw.fax_count,
951 resp_read->data.mw.mw_data_u.mw.video_count);
955 case TRESP_SIM_GET_MAILBOX: {
958 dbg("resp comm - TRESP_SIM_GET_MAILBOX");
960 g_variant_builder_init(&b, G_VARIANT_TYPE("aa{sv}"));
962 if(resp_read->data.mailbox.voice1.DiallingnumLength){
963 g_variant_builder_open(&b, G_VARIANT_TYPE("a{sv}"));
964 g_variant_builder_add(&b, "{sv}", "type", g_variant_new_string("voice1"));
965 g_variant_builder_add(&b, "{sv}", "name", g_variant_new_string(resp_read->data.mailbox.voice1.AlphaId));
966 g_variant_builder_add(&b, "{sv}", "number", g_variant_new_string(resp_read->data.mailbox.voice1.DiallingNum));
967 g_variant_builder_add(&b, "{sv}", "ton", g_variant_new_int32(resp_read->data.mailbox.voice1.TypeOfNumber));
968 g_variant_builder_close(&b);
971 if(resp_read->data.mailbox.voice2.DiallingnumLength){
972 g_variant_builder_open(&b, G_VARIANT_TYPE("a{sv}"));
973 g_variant_builder_add(&b, "{sv}", "type", g_variant_new_string("voice2"));
974 g_variant_builder_add(&b, "{sv}", "name", g_variant_new_string(resp_read->data.mailbox.voice2.AlphaId));
975 g_variant_builder_add(&b, "{sv}", "number", g_variant_new_string(resp_read->data.mailbox.voice2.DiallingNum));
976 g_variant_builder_add(&b, "{sv}", "ton", g_variant_new_int32(resp_read->data.mailbox.voice2.TypeOfNumber));
977 g_variant_builder_close(&b);
980 if(resp_read->data.mailbox.fax.DiallingnumLength){
981 g_variant_builder_open(&b, G_VARIANT_TYPE("a{sv}"));
982 g_variant_builder_add(&b, "{sv}", "type", g_variant_new_string("fax"));
983 g_variant_builder_add(&b, "{sv}", "name", g_variant_new_string(resp_read->data.mailbox.fax.AlphaId));
984 g_variant_builder_add(&b, "{sv}", "number", g_variant_new_string(resp_read->data.mailbox.fax.DiallingNum));
985 g_variant_builder_add(&b, "{sv}", "ton", g_variant_new_int32(resp_read->data.mailbox.fax.TypeOfNumber));
986 g_variant_builder_close(&b);
989 if(resp_read->data.mailbox.video.DiallingnumLength){
990 g_variant_builder_open(&b, G_VARIANT_TYPE("a{sv}"));
991 g_variant_builder_add(&b, "{sv}", "type", g_variant_new_string("video"));
992 g_variant_builder_add(&b, "{sv}", "name", g_variant_new_string(resp_read->data.mailbox.video.AlphaId));
993 g_variant_builder_add(&b, "{sv}", "number", g_variant_new_string(resp_read->data.mailbox.video.DiallingNum));
994 g_variant_builder_add(&b, "{sv}", "ton", g_variant_new_int32(resp_read->data.mailbox.video.TypeOfNumber));
995 g_variant_builder_close(&b);
997 gv = g_variant_builder_end(&b);
998 telephony_sim_complete_get_mailbox (dbus_info->interface_object, dbus_info->invocation,
1001 g_variant_unref(gv);
1005 case TRESP_SIM_GET_CPHS_INFO:
1006 dbg("resp comm - TRESP_SIM_GET_CPHS_INFO");
1007 telephony_sim_complete_get_cphsinfo (dbus_info->interface_object, dbus_info->invocation,
1009 resp_read->data.cphs.CphsPhase,
1010 resp_read->data.cphs.CphsServiceTable.bOperatorNameShortForm,
1011 resp_read->data.cphs.CphsServiceTable.bMailBoxNumbers,
1012 resp_read->data.cphs.CphsServiceTable.bServiceStringTable,
1013 resp_read->data.cphs.CphsServiceTable.bCustomerServiceProfile,
1014 resp_read->data.cphs.CphsServiceTable.bInformationNumbers);
1017 case TRESP_SIM_GET_SPN:
1018 dbg("resp comm - TRESP_SIM_GET_SPN");
1019 telephony_sim_complete_get_spn (dbus_info->interface_object, dbus_info->invocation,
1021 resp_read->data.spn.display_condition, (const gchar *)resp_read->data.spn.spn);
1024 case TRESP_SIM_GET_CPHS_NETNAME:
1025 dbg("resp comm - TRESP_SIM_GET_CPHS_NETNAME");
1026 telephony_sim_complete_get_cphs_net_name (dbus_info->interface_object, dbus_info->invocation,
1028 (const gchar *)resp_read->data.cphs_net.full_name, (const gchar *)resp_read->data.cphs_net.short_name);
1031 case TRESP_SIM_GET_MSISDN:{
1032 GVariant *gv = NULL;
1034 dbg("resp comm - TRESP_SIM_GET_MSISDN");
1035 g_variant_builder_init(&b, G_VARIANT_TYPE("aa{sv}"));
1037 for(i=0;i < resp_read->data.msisdn_list.count; i++){
1038 g_variant_builder_open(&b,G_VARIANT_TYPE("a{sv}"));
1039 g_variant_builder_add(&b, "{sv}", "name", g_variant_new_string((const gchar *)resp_read->data.msisdn_list.msisdn[i].name));
1040 g_variant_builder_add(&b, "{sv}", "number", g_variant_new_string((const gchar *)resp_read->data.msisdn_list.msisdn[i].num));
1041 g_variant_builder_close(&b);
1043 gv = g_variant_builder_end(&b);
1045 telephony_sim_complete_get_msisdn (dbus_info->interface_object, dbus_info->invocation,
1048 g_variant_unref(gv);
1052 case TRESP_SIM_GET_OPLMNWACT:{
1053 GVariant *gv = NULL;
1055 dbg("resp comm - TRESP_SIM_GET_OPLMNWACT");
1056 g_variant_builder_init(&b, G_VARIANT_TYPE("aa{sv}"));
1058 for(i=0;i < resp_read->data.opwa.opwa_count; i++){
1059 g_variant_builder_open(&b,G_VARIANT_TYPE("a{sv}"));
1060 g_variant_builder_add(&b, "{sv}", "plmn", g_variant_new_string((const gchar *)resp_read->data.opwa.opwa[i].plmn));
1061 g_variant_builder_add(&b, "{sv}", "b_umts", g_variant_new_boolean(resp_read->data.opwa.opwa[i].b_umts));
1062 g_variant_builder_add(&b, "{sv}", "b_gsm", g_variant_new_boolean(resp_read->data.opwa.opwa[i].b_gsm));
1063 g_variant_builder_close(&b);
1065 gv = g_variant_builder_end(&b);
1067 telephony_sim_complete_get_oplmnwact (dbus_info->interface_object, dbus_info->invocation,
1070 g_variant_unref(gv);
1074 case TRESP_SIM_REQ_AUTHENTICATION: {
1075 GVariantBuilder *builder = NULL;
1076 GVariant *ak = NULL;
1077 GVariant *cp = NULL;
1078 GVariant *it = NULL;
1079 GVariant *resp = NULL;
1080 GVariant *ak_gv = NULL;
1081 GVariant *cp_gv = NULL;
1082 GVariant *it_gv = NULL;
1083 GVariant *resp_gv = NULL;
1086 dbg("resp comm - TRESP_SIM_REQ_AUTHENTICATION");
1088 builder = g_variant_builder_new (G_VARIANT_TYPE ("ay"));
1089 for(i = 0; i < (int)resp_auth->authentication_key_length; i++) {
1090 dbg("resp_auth->authentication_key[%d][0x%02x]", i,resp_auth->authentication_key[i]);
1091 g_variant_builder_add (builder, "y", resp_auth->authentication_key[i]);
1093 ak = g_variant_builder_end(builder);
1094 ak_gv = g_variant_new("v", ak);
1096 builder = g_variant_builder_new (G_VARIANT_TYPE ("ay"));
1097 for(i = 0; i < (int)resp_auth->cipher_length; i++) {
1098 dbg("resp_auth->cipher_data[%d][0x%02x]", i,resp_auth->cipher_data[i]);
1099 g_variant_builder_add (builder, "y", resp_auth->cipher_data[i]);
1101 cp = g_variant_builder_end(builder);
1102 cp_gv = g_variant_new("v", cp);
1104 builder = g_variant_builder_new (G_VARIANT_TYPE ("ay"));
1105 for(i = 0; i < (int)resp_auth->integrity_length; i++) {
1106 dbg("resp_auth->integrity_data[%d][0x%02x]", i,resp_auth->integrity_data[i]);
1107 g_variant_builder_add (builder, "y", resp_auth->integrity_data[i]);
1109 it = g_variant_builder_end(builder);
1110 it_gv = g_variant_new("v", it);
1112 builder = g_variant_builder_new (G_VARIANT_TYPE ("ay"));
1113 for(i = 0; i < (int)resp_auth->resp_length; i++) {
1114 dbg("resp_auth->resp_data[%d][0x%02x]", i,resp_auth->resp_data[i]);
1115 g_variant_builder_add (builder, "y", resp_auth->resp_data[i]);
1117 resp = g_variant_builder_end(builder);
1118 resp_gv = g_variant_new("v", resp);
1120 telephony_sim_complete_authentication (dbus_info->interface_object, dbus_info->invocation,
1122 resp_auth->auth_type,
1123 resp_auth->auth_result,
1131 case TRESP_SIM_VERIFY_PINS:
1132 dbg("resp comm - TRESP_SIM_VERIFY_PINS");
1133 telephony_sim_complete_verify_sec(dbus_info->interface_object, dbus_info->invocation,
1134 resp_verify_pins->result,
1135 resp_verify_pins->pin_type,
1136 resp_verify_pins->retry_count);
1139 case TRESP_SIM_VERIFY_PUKS:
1140 dbg("resp comm - TRESP_SIM_VERIFY_PUKS");
1141 telephony_sim_complete_verify_puk (dbus_info->interface_object, dbus_info->invocation,
1142 resp_verify_puks->result,
1143 resp_verify_puks->pin_type,
1144 resp_verify_puks->retry_count);
1147 case TRESP_SIM_CHANGE_PINS:
1148 dbg("resp comm - TRESP_SIM_CHANGE_PINS");
1149 telephony_sim_complete_change_pin(dbus_info->interface_object, dbus_info->invocation,
1150 resp_change_pins->result,
1151 resp_change_pins->pin_type,
1152 resp_change_pins->retry_count);
1155 case TRESP_SIM_DISABLE_FACILITY:
1156 dbg("resp comm - TRESP_SIM_DISABLE_FACILITY");
1157 dbg("resp_dis_facility->type[%d]", resp_dis_facility->type);
1158 switch (resp_dis_facility->type) {
1159 case SIM_FACILITY_PS:
1162 case SIM_FACILITY_SC:
1165 case SIM_FACILITY_FD:
1168 case SIM_FACILITY_PN:
1171 case SIM_FACILITY_PU:
1174 case SIM_FACILITY_PP:
1177 case SIM_FACILITY_PC:
1181 dbg("error - not handled type[%d]", resp_dis_facility->type);
1184 telephony_sim_complete_disable_facility(dbus_info->interface_object, dbus_info->invocation,
1185 resp_dis_facility->result,
1187 resp_dis_facility->retry_count);
1190 case TRESP_SIM_ENABLE_FACILITY:
1191 dbg("resp comm - TRESP_SIM_ENABLE_FACILITY");
1192 dbg("resp_en_facility->type[%d]", resp_en_facility->type);
1193 switch (resp_en_facility->type) {
1194 case SIM_FACILITY_PS:
1197 case SIM_FACILITY_SC:
1200 case SIM_FACILITY_FD:
1203 case SIM_FACILITY_PN:
1206 case SIM_FACILITY_PU:
1209 case SIM_FACILITY_PP:
1212 case SIM_FACILITY_PC:
1216 dbg("error - not handled type[%d]", resp_en_facility->type);
1219 telephony_sim_complete_enable_facility(dbus_info->interface_object, dbus_info->invocation,
1220 resp_en_facility->result,
1222 resp_en_facility->retry_count);
1225 case TRESP_SIM_GET_FACILITY_STATUS:
1226 dbg("resp comm - TRESP_SIM_GET_FACILITY_STATUS");
1227 dbg("resp_get_facility->type[%d]", resp_get_facility->type);
1228 switch (resp_get_facility->type) {
1229 case SIM_FACILITY_PS:
1232 case SIM_FACILITY_SC:
1235 case SIM_FACILITY_FD:
1238 case SIM_FACILITY_PN:
1241 case SIM_FACILITY_PU:
1244 case SIM_FACILITY_PP:
1247 case SIM_FACILITY_PC:
1251 dbg("error - not handled type[%d]", resp_get_facility->type);
1254 telephony_sim_complete_get_facility(dbus_info->interface_object, dbus_info->invocation,
1255 resp_get_facility->result,
1257 resp_get_facility->b_enable);
1260 case TRESP_SIM_GET_LOCK_INFO:
1261 dbg("resp comm - TRESP_SIM_GET_LOCK_INFO");
1262 dbg("resp_lock->type[%d]", resp_lock->type);
1263 switch (resp_lock->type) {
1264 case SIM_FACILITY_PS:
1267 case SIM_FACILITY_SC:
1270 case SIM_FACILITY_FD:
1273 case SIM_FACILITY_PN:
1276 case SIM_FACILITY_PU:
1279 case SIM_FACILITY_PP:
1282 case SIM_FACILITY_PC:
1286 dbg("error - not handled type[%d]", resp_lock->type);
1289 telephony_sim_complete_get_lock_info(dbus_info->interface_object, dbus_info->invocation,
1292 resp_lock->lock_status,
1293 resp_lock->retry_count);
1296 case TRESP_SIM_TRANSMIT_APDU: {
1297 GVariantBuilder *builder = NULL;
1298 GVariant * apdu_gv = NULL;
1299 GVariant *inner_gv = NULL;
1302 dbg("resp comm - TRESP_SIM_TRANSMIT_APDU");
1303 builder = g_variant_builder_new (G_VARIANT_TYPE ("ay"));
1304 for(i = 0; i < (int)resp_apdu->apdu_resp_length; i++) {
1305 dbg("resp_apdu->apdu_resp[%d][0x%02x]", i,resp_apdu->apdu_resp[i]);
1306 g_variant_builder_add (builder, "y", resp_apdu->apdu_resp[i]);
1308 inner_gv = g_variant_builder_end(builder);
1309 /* g_variant_builder_unref (builder);*/
1310 apdu_gv = g_variant_new("v", inner_gv);
1312 telephony_sim_complete_transfer_apdu(dbus_info->interface_object, dbus_info->invocation,
1318 case TRESP_SIM_GET_ATR:{
1319 GVariantBuilder *builder = NULL;
1320 GVariant * atr_gv = NULL;
1321 GVariant *inner_gv = NULL;
1324 dbg("resp comm - TRESP_SIM_GET_ATR");
1325 builder = g_variant_builder_new (G_VARIANT_TYPE ("ay"));
1326 for(i = 0; i < (int)resp_get_atr->atr_length; i++) {
1327 dbg("resp_apdu->apdu_resp[%d][0x%02x]", i,resp_get_atr->atr[i]);
1328 g_variant_builder_add (builder, "y", resp_get_atr->atr[i]);
1330 inner_gv = g_variant_builder_end(builder);
1331 /* g_variant_builder_unref (builder);*/
1332 atr_gv = g_variant_new("v", inner_gv);
1334 telephony_sim_complete_get_atr(dbus_info->interface_object, dbus_info->invocation,
1335 resp_get_atr->result,
1341 dbg("not handled TRESP type[%d]", command);
1347 gboolean dbus_plugin_sim_notification(struct custom_data *ctx, const char *plugin_name,
1348 TelephonyObjectSkeleton *object, enum tcore_notification_command command,
1349 unsigned int data_len, const void *data)
1352 const struct tnoti_sim_status *n_sim_status = data;
1355 dbg("object is NULL");
1359 sim = telephony_object_peek_sim(TELEPHONY_OBJECT(object));
1360 dbg("sim = %p", sim);
1362 dbg("notification !!! (command = 0x%x, data_len = %d)", command, data_len);
1365 case TNOTI_SIM_STATUS:
1366 dbg("notified sim_status[%d]", n_sim_status->sim_status);
1367 dbus_sim_data_request(ctx, n_sim_status->sim_status);
1368 telephony_sim_emit_status (sim, n_sim_status->sim_status);
1372 dbg("not handled command[%d]", command);