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.
37 #include <communicator.h>
40 #include <user_request.h>
45 #include "generated-code.h"
48 struct ciss_data_type {
52 char data[MAX_SS_USSD_LEN];
55 struct ciss_information {
60 static void _launch_ciss_information(const struct tnoti_ss_information *info)
63 struct ciss_information ciss_inform;
67 memset(&ciss_inform, 0, sizeof(struct ciss_information));
68 ciss_inform.err = info->err;
69 ciss_inform.ss_type = info->ss_type;
71 dbg("Explicit launch ciss application by appsvc");
75 warn("bundle_create() failed");
79 appsvc_set_pkgname(kb, "org.tizen.ciss");
81 encoded_data = g_base64_encode((guchar *)&ciss_inform, sizeof(struct ciss_information));
83 appsvc_add_data(kb, "CISS_LAUNCHING_MODE", "RESP");
84 appsvc_add_data(kb, "KEY_EVENT_TYPE", "200");
85 appsvc_add_data(kb, "KEY_ENCODED_DATA", encoded_data);
87 dbg("ciss appsvc run");
88 appsvc_run_service(kb, 0, NULL, NULL);
97 static void _launch_ciss(const struct tnoti_ss_ussd *ussd, enum dbus_tapi_sim_slot_id slot_id)
100 struct ciss_data_type ciss_data;
101 char slot_info[2] = {0,};
105 memset(&ciss_data, 0, sizeof(struct ciss_data_type));
106 ciss_data.status = ussd->dcs;
107 ciss_data.status = ussd->status;
108 ciss_data.length = ussd->len;
109 memcpy(ciss_data.data, ussd->str, ciss_data.length);
111 snprintf(slot_info, 2, "%d", slot_id);
112 dbg("slot_id : [%s]", slot_info);
114 dbg("Explicit launch ciss application by appsvc");
116 kb = bundle_create();
118 warn("bundle_create() failed");
123 appsvc_set_pkgname(kb, "org.tizen.ciss");
125 encoded_data = g_base64_encode((guchar *)&ciss_data, sizeof(struct ciss_data_type));
127 appsvc_add_data(kb, "CISS_LAUNCHING_MODE", "RESP");
128 appsvc_add_data(kb, "KEY_EVENT_TYPE", "100");
129 appsvc_add_data(kb, "KEY_ENCODED_DATA", encoded_data);
130 appsvc_add_data(kb, "KEY_SLOT_ID", slot_info);
132 dbg("ciss appsvc run");
133 appsvc_run_service(kb, 0, NULL, NULL);
136 g_free(encoded_data);
142 on_ss_activate_barring (TelephonySs *ss,
143 GDBusMethodInvocation *invocation,
146 const gchar *barring_password,
150 struct treq_ss_barring req;
151 struct custom_data *ctx = user_data;
152 UserRequest *ur = NULL;
155 memset(&req, 0, sizeof(struct treq_ss_barring));
157 req.class = ss_class;
158 req.mode = barring_mode;
160 memcpy(req.password, barring_password, MAX_SS_BARRING_PASSWORD_LEN);
161 memcpy(buf, barring_password, MAX_SS_BARRING_PASSWORD_LEN);
164 dbg("req.password = [%s]", buf);
166 dbg("class = %d, mode = %d", req.class, req.mode);
168 ur = MAKE_UR(ctx, ss, invocation);
170 tcore_user_request_set_data(ur, sizeof(struct treq_ss_barring), &req);
171 tcore_user_request_set_command(ur, TREQ_SS_BARRING_ACTIVATE);
172 ret = tcore_communicator_dispatch_request(ctx->comm, ur);
173 if (ret != TCORE_RETURN_SUCCESS ) {
174 FAIL_RESPONSE (invocation, DEFAULT_MSG_REQ_FAILED);
175 dbg("[ error ] tcore_communicator_dispatch_request() : (0x%x)", ret);
176 tcore_user_request_unref(ur);
183 on_ss_deactivate_barring (TelephonySs *ss,
184 GDBusMethodInvocation *invocation,
187 const gchar *barring_password,
191 struct treq_ss_barring req;
192 struct custom_data *ctx = user_data;
193 UserRequest *ur = NULL;
196 memset(&req, 0, sizeof(struct treq_ss_barring));
198 req.class = ss_class;
199 req.mode = barring_mode;
201 memcpy(req.password, barring_password, MAX_SS_BARRING_PASSWORD_LEN);
202 memcpy(buf, barring_password, MAX_SS_BARRING_PASSWORD_LEN);
205 dbg("req.password = [%s]", buf);
206 dbg("class = %d, mode = %d", req.class, req.mode);
208 ur = MAKE_UR(ctx, ss, invocation);
210 tcore_user_request_set_data(ur, sizeof(struct treq_ss_barring), &req);
211 tcore_user_request_set_command(ur, TREQ_SS_BARRING_DEACTIVATE);
212 ret = tcore_communicator_dispatch_request(ctx->comm, ur);
213 if (ret != TCORE_RETURN_SUCCESS ) {
214 FAIL_RESPONSE (invocation, DEFAULT_MSG_REQ_FAILED);
215 dbg("[ error ] tcore_communicator_dispatch_request() : (0x%x)", ret);
216 tcore_user_request_unref(ur);
223 on_ss_change_barring_password (TelephonySs *ss,
224 GDBusMethodInvocation *invocation,
225 const gchar *barring_password,
226 const gchar *barring_password_new,
227 const gchar *barring_password_confirm,
231 struct treq_ss_barring_change_password req;
232 struct custom_data *ctx = user_data;
233 UserRequest *ur = NULL;
236 memset(&req, 0, sizeof(struct treq_ss_barring_change_password));
238 memcpy(req.password_old, barring_password, MAX_SS_BARRING_PASSWORD_LEN);
239 memcpy(req.password_new, barring_password_new, MAX_SS_BARRING_PASSWORD_LEN);
240 memcpy(req.password_confirm, barring_password_confirm, MAX_SS_BARRING_PASSWORD_LEN);
242 memcpy(buf, barring_password, MAX_SS_BARRING_PASSWORD_LEN);
245 memcpy(buf, barring_password_new, MAX_SS_BARRING_PASSWORD_LEN);
247 memcpy(buf, barring_password_confirm, MAX_SS_BARRING_PASSWORD_LEN);
249 ur = MAKE_UR(ctx, ss, invocation);
251 tcore_user_request_set_data(ur, sizeof(struct treq_ss_barring_change_password), &req);
252 tcore_user_request_set_command(ur, TREQ_SS_BARRING_CHANGE_PASSWORD);
253 ret = tcore_communicator_dispatch_request(ctx->comm, ur);
254 if (ret != TCORE_RETURN_SUCCESS ) {
255 FAIL_RESPONSE (invocation, DEFAULT_MSG_REQ_FAILED);
256 dbg("[ error ] tcore_communicator_dispatch_request() : (0x%x)", ret);
257 tcore_user_request_unref(ur);
264 on_ss_get_barring_status (TelephonySs *ss,
265 GDBusMethodInvocation *invocation,
270 struct treq_ss_barring req;
271 struct custom_data *ctx = user_data;
272 UserRequest *ur = NULL;
275 memset(&req, 0, sizeof(struct treq_ss_barring));
277 req.class = ss_class;
278 req.mode = barring_mode;
280 dbg("class = %d, mode = %d", req.class, req.mode);
282 ur = MAKE_UR(ctx, ss, invocation);
284 tcore_user_request_set_data(ur, sizeof(struct treq_ss_barring), &req);
285 tcore_user_request_set_command(ur, TREQ_SS_BARRING_GET_STATUS);
286 ret = tcore_communicator_dispatch_request(ctx->comm, ur);
287 if (ret != TCORE_RETURN_SUCCESS ) {
288 FAIL_RESPONSE (invocation, DEFAULT_MSG_REQ_FAILED);
289 dbg("[ error ] tcore_communicator_dispatch_request() : (0x%x)", ret);
290 tcore_user_request_unref(ur);
297 on_ss_register_forwarding (TelephonySs *ss,
298 GDBusMethodInvocation *invocation,
301 gint forward_no_reply_time,
304 const gchar *forward_number,
307 struct treq_ss_forwarding req;
308 struct custom_data *ctx = user_data;
309 UserRequest *ur = NULL;
312 if (!check_access_control (invocation, AC_SS, "w")) {
313 GVariant *result = 0;
316 g_variant_builder_init(&b, G_VARIANT_TYPE("aa{sv}"));
317 result = g_variant_builder_end(&b);
319 telephony_ss_complete_register_forwarding(ss, invocation, result, ret);
324 memset(&req, 0, sizeof(struct treq_ss_forwarding));
326 req.class = ss_class;
327 req.mode = forward_mode;
328 req.time = forward_no_reply_time;
329 req.ton = forward_ton;
330 req.npi = forward_npi;
331 snprintf(req.number, MAX_SS_FORWARDING_NUMBER_LEN, "%s", forward_number);
333 dbg("class = %d, mode = %d, time = %d, number = %s",
334 req.class, req.mode, req.time, req.number);
336 ur = MAKE_UR(ctx, ss, invocation);
338 tcore_user_request_set_data(ur, sizeof(struct treq_ss_forwarding), &req);
339 tcore_user_request_set_command(ur, TREQ_SS_FORWARDING_REGISTER);
340 ret = tcore_communicator_dispatch_request(ctx->comm, ur);
341 if (ret != TCORE_RETURN_SUCCESS ) {
342 FAIL_RESPONSE (invocation, DEFAULT_MSG_REQ_FAILED);
343 dbg("[ error ] tcore_communicator_dispatch_request() : (0x%x)", ret);
344 tcore_user_request_unref(ur);
351 on_ss_deregister_forwarding (TelephonySs *ss,
352 GDBusMethodInvocation *invocation,
355 gint forward_no_reply_time,
358 const gchar *forward_number,
361 struct treq_ss_forwarding req;
362 struct custom_data *ctx = user_data;
363 UserRequest *ur = NULL;
366 if (!check_access_control (invocation, AC_SS, "w")) {
367 FAIL_RESPONSE (invocation, DEFAULT_MSG_REQ_FAILED);
368 dbg("[ error ] tcore_communicator_dispatch_request() : (0x%x)", ret);
369 tcore_user_request_unref(ur);
372 memset(&req, 0, sizeof(struct treq_ss_forwarding));
374 req.class = ss_class;
375 req.mode = forward_mode;
376 req.time = forward_no_reply_time;
377 req.ton = forward_ton;
378 req.npi = forward_npi;
379 snprintf(req.number, MAX_SS_FORWARDING_NUMBER_LEN, "%s", forward_number);
381 dbg("class = %d, mode = %d, time = %d, number = %s",
382 req.class, req.mode, req.time, req.number);
384 ur = MAKE_UR(ctx, ss, invocation);
386 tcore_user_request_set_data(ur, sizeof(struct treq_ss_forwarding), &req);
387 tcore_user_request_set_command(ur, TREQ_SS_FORWARDING_DEREGISTER);
388 ret = tcore_communicator_dispatch_request(ctx->comm, ur);
389 if (ret != TCORE_RETURN_SUCCESS ) {
390 FAIL_RESPONSE (invocation, DEFAULT_MSG_REQ_FAILED);
391 dbg("[ error ] tcore_communicator_dispatch_request() : (0x%x)", ret);
392 tcore_user_request_unref(ur);
399 on_ss_activate_forwarding (TelephonySs *ss,
400 GDBusMethodInvocation *invocation,
403 gint forward_no_reply_time,
406 const gchar *forward_number,
409 struct treq_ss_forwarding req;
410 struct custom_data *ctx = user_data;
411 UserRequest *ur = NULL;
414 if (!check_access_control (invocation, AC_SS, "w")) {
415 GVariant *result = 0;
418 g_variant_builder_init(&b, G_VARIANT_TYPE("aa{sv}"));
419 result = g_variant_builder_end(&b);
421 telephony_ss_complete_activate_forwarding(ss, invocation, result, ret);
426 memset(&req, 0, sizeof(struct treq_ss_forwarding));
428 req.class = ss_class;
429 req.mode = forward_mode;
430 req.time = forward_no_reply_time;
431 req.ton = forward_ton;
432 req.npi = forward_npi;
433 snprintf(req.number, MAX_SS_FORWARDING_NUMBER_LEN, "%s", forward_number);
435 dbg("class = %d, mode = %d, time = %d, number = %s",
436 req.class, req.mode, req.time, req.number);
438 ur = MAKE_UR(ctx, ss, invocation);
440 tcore_user_request_set_data(ur, sizeof(struct treq_ss_forwarding), &req);
441 tcore_user_request_set_command(ur, TREQ_SS_FORWARDING_ACTIVATE);
442 ret = tcore_communicator_dispatch_request(ctx->comm, ur);
443 if (ret != TCORE_RETURN_SUCCESS ) {
444 FAIL_RESPONSE (invocation, DEFAULT_MSG_REQ_FAILED);
445 dbg("[ error ] tcore_communicator_dispatch_request() : (0x%x)", ret);
446 tcore_user_request_unref(ur);
453 on_ss_deactivate_forwarding (TelephonySs *ss,
454 GDBusMethodInvocation *invocation,
457 gint forward_no_reply_time,
460 const gchar *forward_number,
463 struct treq_ss_forwarding req;
464 struct custom_data *ctx = user_data;
465 UserRequest *ur = NULL;
468 if (!check_access_control (invocation, AC_SS, "w")) {
469 GVariant *result = 0;
472 g_variant_builder_init(&b, G_VARIANT_TYPE("aa{sv}"));
473 result = g_variant_builder_end(&b);
475 telephony_ss_complete_deactivate_forwarding(ss, invocation, result, ret);
480 memset(&req, 0, sizeof(struct treq_ss_forwarding));
482 req.class = ss_class;
483 req.mode = forward_mode;
484 req.time = forward_no_reply_time;
485 req.ton = forward_ton;
486 req.npi = forward_npi;
487 snprintf(req.number, MAX_SS_FORWARDING_NUMBER_LEN, "%s", forward_number);
489 dbg("class = %d, mode = %d, time = %d, number = %s",
490 req.class, req.mode, req.time, req.number);
492 ur = MAKE_UR(ctx, ss, invocation);
494 tcore_user_request_set_data(ur, sizeof(struct treq_ss_forwarding), &req);
495 tcore_user_request_set_command(ur, TREQ_SS_FORWARDING_DEACTIVATE);
496 ret = tcore_communicator_dispatch_request(ctx->comm, ur);
497 if (ret != TCORE_RETURN_SUCCESS ) {
498 FAIL_RESPONSE (invocation, DEFAULT_MSG_REQ_FAILED);
499 dbg("[ error ] tcore_communicator_dispatch_request() : (0x%x)", ret);
500 tcore_user_request_unref(ur);
507 on_ss_get_forwarding_status (TelephonySs *ss,
508 GDBusMethodInvocation *invocation,
513 struct treq_ss_forwarding req;
514 struct custom_data *ctx = user_data;
515 UserRequest *ur = NULL;
518 if (!check_access_control (invocation, AC_SS, "r")) {
519 GVariant *result = 0;
522 g_variant_builder_init(&b, G_VARIANT_TYPE("aa{sv}"));
523 result = g_variant_builder_end(&b);
525 telephony_ss_complete_get_forwarding_status(ss, invocation, result, ret);
530 memset(&req, 0, sizeof(struct treq_ss_forwarding));
532 req.class = ss_class;
533 req.mode = forward_mode;
535 dbg("class = %d, mode = %d, time = %d, number = %s",
536 req.class, req.mode, req.time, req.number);
538 ur = MAKE_UR(ctx, ss, invocation);
540 tcore_user_request_set_data(ur, sizeof(struct treq_ss_forwarding), &req);
541 tcore_user_request_set_command(ur, TREQ_SS_FORWARDING_GET_STATUS);
542 ret = tcore_communicator_dispatch_request(ctx->comm, ur);
543 if (ret != TCORE_RETURN_SUCCESS ) {
544 FAIL_RESPONSE (invocation, DEFAULT_MSG_REQ_FAILED);
545 dbg("[ error ] tcore_communicator_dispatch_request() : (0x%x)", ret);
546 tcore_user_request_unref(ur);
553 on_ss_activate_waiting (TelephonySs *ss,
554 GDBusMethodInvocation *invocation,
558 struct treq_ss_waiting req;
559 struct custom_data *ctx = user_data;
560 UserRequest *ur = NULL;
563 memset(&req, 0, sizeof(struct treq_ss_waiting));
565 req.class = ss_class;
567 dbg("class = %d", req.class);
569 ur = MAKE_UR(ctx, ss, invocation);
571 tcore_user_request_set_data(ur, sizeof(struct treq_ss_waiting), &req);
572 tcore_user_request_set_command(ur, TREQ_SS_WAITING_ACTIVATE);
573 ret = tcore_communicator_dispatch_request(ctx->comm, ur);
574 if (ret != TCORE_RETURN_SUCCESS ) {
575 FAIL_RESPONSE (invocation, DEFAULT_MSG_REQ_FAILED);
576 dbg("[ error ] tcore_communicator_dispatch_request() : (0x%x)", ret);
577 tcore_user_request_unref(ur);
584 on_ss_deactivate_waiting (TelephonySs *ss,
585 GDBusMethodInvocation *invocation,
589 struct treq_ss_waiting req;
590 struct custom_data *ctx = user_data;
591 UserRequest *ur = NULL;
594 memset(&req, 0, sizeof(struct treq_ss_waiting));
596 req.class = ss_class;
598 dbg("class = %d", req.class);
600 ur = MAKE_UR(ctx, ss, invocation);
602 tcore_user_request_set_data(ur, sizeof(struct treq_ss_waiting), &req);
603 tcore_user_request_set_command(ur, TREQ_SS_WAITING_DEACTIVATE);
604 ret = tcore_communicator_dispatch_request(ctx->comm, ur);
605 if (ret != TCORE_RETURN_SUCCESS ) {
606 FAIL_RESPONSE (invocation, DEFAULT_MSG_REQ_FAILED);
607 dbg("[ error ] tcore_communicator_dispatch_request() : (0x%x)", ret);
608 tcore_user_request_unref(ur);
615 on_ss_get_waiting_status (TelephonySs *ss,
616 GDBusMethodInvocation *invocation,
620 struct treq_ss_waiting req;
621 struct custom_data *ctx = user_data;
622 UserRequest *ur = NULL;
625 memset(&req, 0, sizeof(struct treq_ss_waiting));
627 req.class = ss_class;
629 dbg("class = %d", req.class);
631 ur = MAKE_UR(ctx, ss, invocation);
633 tcore_user_request_set_data(ur, sizeof(struct treq_ss_waiting), &req);
634 tcore_user_request_set_command(ur, TREQ_SS_WAITING_GET_STATUS);
635 ret = tcore_communicator_dispatch_request(ctx->comm, ur);
636 if (ret != TCORE_RETURN_SUCCESS ) {
637 FAIL_RESPONSE (invocation, DEFAULT_MSG_REQ_FAILED);
638 dbg("[ error ] tcore_communicator_dispatch_request() : (0x%x)", ret);
639 tcore_user_request_unref(ur);
646 on_ss_set_cli_status (TelephonySs *ss,
647 GDBusMethodInvocation *invocation,
652 struct treq_ss_set_cli req;
653 struct custom_data *ctx = user_data;
654 UserRequest *ur = NULL;
657 memset(&req, 0, sizeof(struct treq_ss_set_cli));
660 req.status = cli_status;
662 dbg("type = %d, status = %d", req.type, req.status);
664 ur = MAKE_UR(ctx, ss, invocation);
666 tcore_user_request_set_data(ur, sizeof(struct treq_ss_set_cli), &req);
667 tcore_user_request_set_command(ur, TREQ_SS_CLI_SET_STATUS);
668 ret = tcore_communicator_dispatch_request(ctx->comm, ur);
669 if (ret != TCORE_RETURN_SUCCESS ) {
670 FAIL_RESPONSE (invocation, DEFAULT_MSG_REQ_FAILED);
671 dbg("[ error ] tcore_communicator_dispatch_request() : (0x%x)", ret);
672 tcore_user_request_unref(ur);
680 on_ss_get_cli_status (TelephonySs *ss,
681 GDBusMethodInvocation *invocation,
685 struct treq_ss_cli req;
686 struct custom_data *ctx = user_data;
687 UserRequest *ur = NULL;
690 memset(&req, 0, sizeof(struct treq_ss_cli));
694 dbg("type = %d", req.type);
696 ur = MAKE_UR(ctx, ss, invocation);
698 tcore_user_request_set_data(ur, sizeof(struct treq_ss_cli), &req);
699 tcore_user_request_set_command(ur, TREQ_SS_CLI_GET_STATUS);
700 ret = tcore_communicator_dispatch_request(ctx->comm, ur);
701 if (ret != TCORE_RETURN_SUCCESS ) {
702 FAIL_RESPONSE (invocation, DEFAULT_MSG_REQ_FAILED);
703 dbg("[ error ] tcore_communicator_dispatch_request() : (0x%x)", ret);
704 tcore_user_request_unref(ur);
711 on_ss_send_ussd (TelephonySs *ss,
712 GDBusMethodInvocation *invocation,
716 const gchar *ussd_string,
719 struct treq_ss_ussd req;
720 struct custom_data *ctx = user_data;
721 UserRequest *ur = NULL;
724 memset(&req, 0, sizeof(struct treq_ss_ussd));
726 req.type = ussd_type;
727 req.dcs = (unsigned char)ussd_dcs;
728 req.len = (unsigned short)ussd_len;
730 snprintf((char*)req.str, MAX_SS_USSD_LEN, "%s", ussd_string);
732 dbg("[ check ] type = %d, dcs = %d, len = %d, string = %s", req.type, req.dcs, req.len, req.str);
734 ur = MAKE_UR(ctx, ss, invocation);
736 tcore_user_request_set_data(ur, sizeof(struct treq_ss_ussd), &req);
737 tcore_user_request_set_command(ur, TREQ_SS_SEND_USSD);
738 ret = tcore_communicator_dispatch_request(ctx->comm, ur);
739 if (ret != TCORE_RETURN_SUCCESS ) {
740 FAIL_RESPONSE (invocation, DEFAULT_MSG_REQ_FAILED);
741 dbg("[ error ] tcore_communicator_dispatch_request() : (0x%x)", ret);
742 tcore_user_request_unref(ur);
748 gboolean dbus_plugin_setup_ss_interface(TelephonyObjectSkeleton *object, struct custom_data *ctx)
752 ss = telephony_ss_skeleton_new();
753 telephony_object_skeleton_set_ss(object, ss);
756 g_signal_connect (ss,
757 "handle-activate-barring",
758 G_CALLBACK (on_ss_activate_barring),
761 g_signal_connect (ss,
762 "handle-deactivate-barring",
763 G_CALLBACK (on_ss_deactivate_barring),
766 g_signal_connect (ss,
767 "handle-change-barring-password",
768 G_CALLBACK (on_ss_change_barring_password),
771 g_signal_connect (ss,
772 "handle-get-barring-status",
773 G_CALLBACK (on_ss_get_barring_status),
776 g_signal_connect (ss,
777 "handle-register-forwarding",
778 G_CALLBACK (on_ss_register_forwarding),
781 g_signal_connect (ss,
782 "handle-deregister-forwarding",
783 G_CALLBACK (on_ss_deregister_forwarding),
786 g_signal_connect (ss,
787 "handle-activate-forwarding",
788 G_CALLBACK (on_ss_activate_forwarding),
791 g_signal_connect (ss,
792 "handle-deactivate-forwarding",
793 G_CALLBACK (on_ss_deactivate_forwarding),
796 g_signal_connect (ss,
797 "handle-get-forwarding-status",
798 G_CALLBACK (on_ss_get_forwarding_status),
801 g_signal_connect (ss,
802 "handle-activate-waiting",
803 G_CALLBACK (on_ss_activate_waiting),
806 g_signal_connect (ss,
807 "handle-deactivate-waiting",
808 G_CALLBACK (on_ss_deactivate_waiting),
811 g_signal_connect (ss,
812 "handle-get-waiting-status",
813 G_CALLBACK (on_ss_get_waiting_status),
816 g_signal_connect (ss,
817 "handle-set-clistatus",
818 G_CALLBACK (on_ss_set_cli_status),
821 g_signal_connect (ss,
822 "handle-get-clistatus",
823 G_CALLBACK (on_ss_get_cli_status),
826 g_signal_connect (ss,
828 G_CALLBACK (on_ss_send_ussd),
834 gboolean dbus_plugin_ss_response(struct custom_data *ctx, UserRequest *ur, struct dbus_request_info *dbus_info, enum tcore_response_command command, unsigned int data_len, const void *data)
836 GVariant *result = 0;
841 err("response data : 0");
846 case TRESP_SS_BARRING_ACTIVATE: {
848 const struct tresp_ss_barring *resp = data;
850 dbg("receive TRESP_SS_BARRING_ACTIVATE (err[%d])", resp->err);
852 g_variant_builder_init(&b, G_VARIANT_TYPE("aa{sv}"));
854 for (i=0; i<resp->record_num; i++) {
855 g_variant_builder_open(&b, G_VARIANT_TYPE("a{sv}"));
856 g_variant_builder_add(&b, "{sv}", "ss_class", g_variant_new_int32( resp->record[i].class ));
857 g_variant_builder_add(&b, "{sv}", "ss_status", g_variant_new_int32( resp->record[i].status ));
858 g_variant_builder_add(&b, "{sv}", "barring_mode", g_variant_new_int32( resp->record[i].mode ));
859 g_variant_builder_close(&b);
862 result = g_variant_builder_end(&b);
864 telephony_ss_complete_activate_barring(dbus_info->interface_object, dbus_info->invocation, result, resp->err);
868 case TRESP_SS_BARRING_DEACTIVATE: {
870 const struct tresp_ss_barring *resp = data;
872 dbg("receive TRESP_SS_BARRING_DEACTIVATE (err[%d])", resp->err);
874 g_variant_builder_init(&b, G_VARIANT_TYPE("aa{sv}"));
876 for (i=0; i<resp->record_num; i++) {
877 g_variant_builder_open(&b, G_VARIANT_TYPE("a{sv}"));
878 g_variant_builder_add(&b, "{sv}", "ss_class", g_variant_new_int32( resp->record[i].class ));
879 g_variant_builder_add(&b, "{sv}", "ss_status", g_variant_new_int32( resp->record[i].status ));
880 g_variant_builder_add(&b, "{sv}", "barring_mode", g_variant_new_int32( resp->record[i].mode ));
881 g_variant_builder_close(&b);
884 result = g_variant_builder_end(&b);
886 telephony_ss_complete_deactivate_barring(dbus_info->interface_object, dbus_info->invocation, result, resp->err);
890 case TRESP_SS_BARRING_CHANGE_PASSWORD: {
892 const struct tresp_ss_general *resp = data;
894 dbg("receive TRESP_SS_BARRING_CHANGE_PASSWORD (err[%d])", resp->err);
896 telephony_ss_complete_change_barring_password(dbus_info->interface_object, dbus_info->invocation, resp->err);
900 case TRESP_SS_BARRING_GET_STATUS: {
902 const struct tresp_ss_barring *resp = data;
904 dbg("receive TRESP_SS_BARRING_GET_STATUS (err[%d])", resp->err);
906 g_variant_builder_init(&b, G_VARIANT_TYPE("aa{sv}"));
908 for (i=0; i<resp->record_num; i++) {
909 g_variant_builder_open(&b, G_VARIANT_TYPE("a{sv}"));
910 g_variant_builder_add(&b, "{sv}", "ss_class", g_variant_new_int32( resp->record[i].class ));
911 g_variant_builder_add(&b, "{sv}", "ss_status", g_variant_new_int32( resp->record[i].status ));
912 g_variant_builder_add(&b, "{sv}", "barring_mode", g_variant_new_int32( resp->record[i].mode ));
913 g_variant_builder_close(&b);
916 result = g_variant_builder_end(&b);
918 telephony_ss_complete_get_barring_status(dbus_info->interface_object, dbus_info->invocation, result, resp->err);
922 case TRESP_SS_FORWARDING_ACTIVATE: {
923 const struct tresp_ss_forwarding *resp = data;
925 dbg("receive TRESP_SS_FORWARDING_ACTIVATE (err[%d])", resp->err);
927 g_variant_builder_init(&b, G_VARIANT_TYPE("aa{sv}"));
929 for (i=0; i<resp->record_num; i++) {
930 g_variant_builder_open(&b, G_VARIANT_TYPE("a{sv}"));
931 g_variant_builder_add(&b, "{sv}", "ss_class", g_variant_new_int32( resp->record[i].class ));
932 g_variant_builder_add(&b, "{sv}", "ss_status", g_variant_new_int32( resp->record[i].status ));
933 g_variant_builder_add(&b, "{sv}", "forwarding_mode", g_variant_new_int32( resp->record[i].mode ));
934 g_variant_builder_add(&b, "{sv}", "number_present", g_variant_new_int32( resp->record[i].number_present ));
935 g_variant_builder_add(&b, "{sv}", "no_reply_time", g_variant_new_int32( resp->record[i].time ));
936 g_variant_builder_add(&b, "{sv}", "type_of_number", g_variant_new_int32( resp->record[i].ton ));
937 g_variant_builder_add(&b, "{sv}", "numbering_plan_identity", g_variant_new_int32( resp->record[i].npi ));
938 g_variant_builder_add(&b, "{sv}", "forwarding_number", g_variant_new_string( resp->record[i].number ));
939 g_variant_builder_close(&b);
942 result = g_variant_builder_end(&b);
944 telephony_ss_complete_activate_forwarding(dbus_info->interface_object, dbus_info->invocation, result, resp->err);
948 case TRESP_SS_FORWARDING_DEACTIVATE: {
950 const struct tresp_ss_forwarding *resp = data;
952 dbg("receive TRESP_SS_FORWARDING_DEACTIVATE (err[%d])", resp->err);
954 g_variant_builder_init(&b, G_VARIANT_TYPE("aa{sv}"));
956 for (i=0; i<resp->record_num; i++) {
957 g_variant_builder_open(&b, G_VARIANT_TYPE("a{sv}"));
958 g_variant_builder_add(&b, "{sv}", "ss_class", g_variant_new_int32( resp->record[i].class ));
959 g_variant_builder_add(&b, "{sv}", "ss_status", g_variant_new_int32( resp->record[i].status ));
960 g_variant_builder_add(&b, "{sv}", "forwarding_mode", g_variant_new_int32( resp->record[i].mode ));
961 g_variant_builder_add(&b, "{sv}", "number_present", g_variant_new_int32( resp->record[i].number_present ));
962 g_variant_builder_add(&b, "{sv}", "no_reply_time", g_variant_new_int32( resp->record[i].time ));
963 g_variant_builder_add(&b, "{sv}", "type_of_number", g_variant_new_int32( resp->record[i].ton ));
964 g_variant_builder_add(&b, "{sv}", "numbering_plan_identity", g_variant_new_int32( resp->record[i].npi ));
965 g_variant_builder_add(&b, "{sv}", "forwarding_number", g_variant_new_string( resp->record[i].number ));
966 g_variant_builder_close(&b);
969 result = g_variant_builder_end(&b);
971 telephony_ss_complete_deactivate_forwarding(dbus_info->interface_object, dbus_info->invocation, result, resp->err);
975 case TRESP_SS_FORWARDING_REGISTER: {
977 const struct tresp_ss_forwarding *resp = data;
979 dbg("receive TRESP_SS_FORWARDING_REGISTER (err[%d])", resp->err);
981 g_variant_builder_init(&b, G_VARIANT_TYPE("aa{sv}"));
983 for (i=0; i<resp->record_num; i++) {
984 g_variant_builder_open(&b, G_VARIANT_TYPE("a{sv}"));
985 g_variant_builder_add(&b, "{sv}", "ss_class", g_variant_new_int32( resp->record[i].class ));
986 g_variant_builder_add(&b, "{sv}", "ss_status", g_variant_new_int32( resp->record[i].status ));
987 g_variant_builder_add(&b, "{sv}", "forwarding_mode", g_variant_new_int32( resp->record[i].mode ));
988 g_variant_builder_add(&b, "{sv}", "number_present", g_variant_new_int32( resp->record[i].number_present ));
989 g_variant_builder_add(&b, "{sv}", "no_reply_time", g_variant_new_int32( resp->record[i].time ));
990 g_variant_builder_add(&b, "{sv}", "type_of_number", g_variant_new_int32( resp->record[i].ton ));
991 g_variant_builder_add(&b, "{sv}", "numbering_plan_identity", g_variant_new_int32( resp->record[i].npi ));
992 g_variant_builder_add(&b, "{sv}", "forwarding_number", g_variant_new_string( resp->record[i].number ));
993 g_variant_builder_close(&b);
996 result = g_variant_builder_end(&b);
998 telephony_ss_complete_register_forwarding(dbus_info->interface_object, dbus_info->invocation, result, resp->err);
1002 case TRESP_SS_FORWARDING_DEREGISTER: {
1004 const struct tresp_ss_forwarding *resp = data;
1006 dbg("receive TRESP_SS_FORWARDING_DEREGISTER (err[%d])", resp->err);
1008 g_variant_builder_init(&b, G_VARIANT_TYPE("aa{sv}"));
1010 for (i=0; i<resp->record_num; i++) {
1011 g_variant_builder_open(&b, G_VARIANT_TYPE("a{sv}"));
1012 g_variant_builder_add(&b, "{sv}", "ss_class", g_variant_new_int32( resp->record[i].class ));
1013 g_variant_builder_add(&b, "{sv}", "ss_status", g_variant_new_int32( resp->record[i].status ));
1014 g_variant_builder_add(&b, "{sv}", "forwarding_mode", g_variant_new_int32( resp->record[i].mode ));
1015 g_variant_builder_add(&b, "{sv}", "number_present", g_variant_new_int32( resp->record[i].number_present ));
1016 g_variant_builder_add(&b, "{sv}", "no_reply_time", g_variant_new_int32( resp->record[i].time ));
1017 g_variant_builder_add(&b, "{sv}", "type_of_number", g_variant_new_int32( resp->record[i].ton ));
1018 g_variant_builder_add(&b, "{sv}", "numbering_plan_identity", g_variant_new_int32( resp->record[i].npi ));
1019 g_variant_builder_add(&b, "{sv}", "forwarding_number", g_variant_new_string( resp->record[i].number ));
1020 g_variant_builder_close(&b);
1023 result = g_variant_builder_end(&b);
1025 telephony_ss_complete_deregister_forwarding(dbus_info->interface_object, dbus_info->invocation, result, resp->err);
1029 case TRESP_SS_FORWARDING_GET_STATUS: {
1031 const struct tresp_ss_forwarding *resp = data;
1033 dbg("receive TRESP_SS_FORWARDING_GET_STATUS (err[%d])", resp->err);
1035 g_variant_builder_init(&b, G_VARIANT_TYPE("aa{sv}"));
1037 for (i=0; i<resp->record_num; i++) {
1038 g_variant_builder_open(&b, G_VARIANT_TYPE("a{sv}"));
1039 g_variant_builder_add(&b, "{sv}", "ss_class", g_variant_new_int32( resp->record[i].class ));
1040 g_variant_builder_add(&b, "{sv}", "ss_status", g_variant_new_int32( resp->record[i].status ));
1041 g_variant_builder_add(&b, "{sv}", "forwarding_mode", g_variant_new_int32( resp->record[i].mode ));
1042 g_variant_builder_add(&b, "{sv}", "number_present", g_variant_new_int32( resp->record[i].number_present ));
1043 g_variant_builder_add(&b, "{sv}", "no_reply_time", g_variant_new_int32( resp->record[i].time ));
1044 g_variant_builder_add(&b, "{sv}", "type_of_number", g_variant_new_int32( resp->record[i].ton ));
1045 g_variant_builder_add(&b, "{sv}", "numbering_plan_identity", g_variant_new_int32( resp->record[i].npi ));
1046 g_variant_builder_add(&b, "{sv}", "forwarding_number", g_variant_new_string( resp->record[i].number ));
1047 g_variant_builder_close(&b);
1050 result = g_variant_builder_end(&b);
1052 telephony_ss_complete_get_forwarding_status(dbus_info->interface_object, dbus_info->invocation, result, resp->err);
1056 case TRESP_SS_WAITING_ACTIVATE: {
1058 const struct tresp_ss_waiting *resp = data;
1060 dbg("receive TRESP_SS_WAITING_ACTIVATE (err[%d])", resp->err);
1062 g_variant_builder_init(&b, G_VARIANT_TYPE("aa{sv}"));
1064 for (i=0; i<resp->record_num; i++) {
1065 g_variant_builder_open(&b, G_VARIANT_TYPE("a{sv}"));
1066 g_variant_builder_add(&b, "{sv}", "ss_class", g_variant_new_int32( resp->record[i].class ));
1067 g_variant_builder_add(&b, "{sv}", "ss_status", g_variant_new_int32( resp->record[i].status ));
1068 g_variant_builder_close(&b);
1071 result = g_variant_builder_end(&b);
1073 telephony_ss_complete_activate_waiting(dbus_info->interface_object, dbus_info->invocation, result, resp->err);
1077 case TRESP_SS_WAITING_DEACTIVATE: {
1079 const struct tresp_ss_waiting *resp = data;
1081 dbg("receive TRESP_SS_WAITING_DEACTIVATE (err[%d])", resp->err);
1083 g_variant_builder_init(&b, G_VARIANT_TYPE("aa{sv}"));
1085 for (i=0; i<resp->record_num; i++) {
1086 g_variant_builder_open(&b, G_VARIANT_TYPE("a{sv}"));
1087 g_variant_builder_add(&b, "{sv}", "ss_class", g_variant_new_int32( resp->record[i].class ));
1088 g_variant_builder_add(&b, "{sv}", "ss_status", g_variant_new_int32( resp->record[i].status ));
1089 g_variant_builder_close(&b);
1092 result = g_variant_builder_end(&b);
1094 telephony_ss_complete_deactivate_waiting(dbus_info->interface_object, dbus_info->invocation, result, resp->err);
1098 case TRESP_SS_WAITING_GET_STATUS: {
1100 const struct tresp_ss_waiting *resp = data;
1102 dbg("receive TRESP_SS_WAITING_GET_STATUS (err[%d])", resp->err);
1104 g_variant_builder_init(&b, G_VARIANT_TYPE("aa{sv}"));
1106 for (i=0; i<resp->record_num; i++) {
1107 g_variant_builder_open(&b, G_VARIANT_TYPE("a{sv}"));
1108 g_variant_builder_add(&b, "{sv}", "ss_class", g_variant_new_int32( resp->record[i].class ));
1109 g_variant_builder_add(&b, "{sv}", "ss_status", g_variant_new_int32( resp->record[i].status ));
1110 g_variant_builder_close(&b);
1113 result = g_variant_builder_end(&b);
1115 telephony_ss_complete_get_waiting_status(dbus_info->interface_object, dbus_info->invocation, result, resp->err);
1119 case TRESP_SS_CLI_SET_STATUS: {
1121 const struct tresp_ss_set_cli *resp = data;
1123 dbg("receive TRESP_SS_CLI_SET_STATUS (err[%d])", resp->err);
1125 telephony_ss_complete_set_clistatus(dbus_info->interface_object, dbus_info->invocation, resp->err);
1129 case TRESP_SS_CLI_GET_STATUS: {
1131 const struct tresp_ss_cli *resp = data;
1133 dbg("receive TRESP_SS_CLI_GET_STATUS (err[%d])", resp->err);
1135 telephony_ss_complete_get_clistatus(dbus_info->interface_object, dbus_info->invocation, resp->err, resp->type, resp->status);
1139 case TRESP_SS_SEND_USSD: {
1141 const struct tresp_ss_ussd *resp = data;
1143 dbg("receive TRESP_SS_SEND_USSD (err[%d])", resp->err);
1144 dbg("USSD : %s (len : %d, type : 0x%x, status : 0x%x, dcs : 0x%x)", resp->str, resp->len, resp->type, resp->status, resp->dcs);
1145 telephony_ss_complete_send_ussd(dbus_info->interface_object, dbus_info->invocation, resp->err, resp->type, resp->status, resp->dcs, resp->len, (char*)resp->str);
1150 dbg("not handled command[%d]", command);
1157 gboolean dbus_plugin_ss_notification(struct custom_data *ctx, CoreObject *source, TelephonyObjectSkeleton *object, enum tcore_notification_command command, unsigned int data_len, const void *data)
1159 TelephonySs *ss = 0;
1160 GVariant *result = 0;
1163 char *cp_name= NULL;
1166 dbg("object is NULL");
1169 cp_name = (char*)tcore_server_get_cp_name_by_plugin(tcore_object_ref_plugin(source));
1171 ss = telephony_object_peek_ss(TELEPHONY_OBJECT(object));
1174 case TNOTI_SS_USSD: {
1175 const struct tnoti_ss_ussd *ussd = data;
1176 enum dbus_tapi_sim_slot_id slot_id;
1178 slot_id = get_sim_slot_id_by_cp_name(cp_name);
1179 dbg("slot_id: [%d]", slot_id);
1181 telephony_ss_emit_notify_ussd(ss,
1186 _launch_ciss(ussd, slot_id);
1189 case TNOTI_SS_FORWARDING_STATUS: {
1190 const struct tnoti_ss_forwarding_status *fwrd = data;
1192 g_variant_builder_init(&b, G_VARIANT_TYPE("aa{sv}"));
1194 for (i=0; i<fwrd->record_num; i++) {
1195 g_variant_builder_open(&b, G_VARIANT_TYPE("a{sv}"));
1196 g_variant_builder_add(&b, "{sv}", "ss_class", g_variant_new_int32( fwrd->record[i].class ));
1197 g_variant_builder_add(&b, "{sv}", "ss_status", g_variant_new_int32( fwrd->record[i].status ));
1198 g_variant_builder_add(&b, "{sv}", "forwarding_mode", g_variant_new_int32( fwrd->record[i].mode ));
1199 g_variant_builder_add(&b, "{sv}", "number_present", g_variant_new_int32( fwrd->record[i].number_present ));
1200 g_variant_builder_add(&b, "{sv}", "no_reply_time", g_variant_new_int32( fwrd->record[i].time ));
1201 g_variant_builder_add(&b, "{sv}", "type_of_number", g_variant_new_int32( fwrd->record[i].ton ));
1202 g_variant_builder_add(&b, "{sv}", "numbering_plan_identity", g_variant_new_int32( fwrd->record[i].npi ));
1203 g_variant_builder_add(&b, "{sv}", "forwarding_number", g_variant_new_string( fwrd->record[i].number ));
1204 g_variant_builder_close(&b);
1207 result = g_variant_builder_end(&b);
1208 telephony_ss_emit_notify_forwarding(ss, result);
1212 case TNOTI_SS_BARRING_STATUS: {
1214 const struct tnoti_ss_barring_status *barr = data;
1216 g_variant_builder_init(&b, G_VARIANT_TYPE("aa{sv}"));
1218 for (i=0; i<barr->record_num; i++) {
1219 g_variant_builder_open(&b, G_VARIANT_TYPE("a{sv}"));
1220 g_variant_builder_add(&b, "{sv}", "ss_class", g_variant_new_int32( barr->record[i].class ));
1221 g_variant_builder_add(&b, "{sv}", "ss_status", g_variant_new_int32( barr->record[i].status ));
1222 g_variant_builder_add(&b, "{sv}", "barring_mode", g_variant_new_int32( barr->record[i].mode ));
1223 g_variant_builder_close(&b);
1226 result = g_variant_builder_end(&b);
1227 telephony_ss_emit_notify_barring(ss, result);
1231 case TNOTI_SS_WAITING_STATUS: {
1232 const struct tnoti_ss_waiting_status *wait = data;
1234 g_variant_builder_init(&b, G_VARIANT_TYPE("aa{sv}"));
1236 for (i=0; i<wait->record_num; i++) {
1237 g_variant_builder_open(&b, G_VARIANT_TYPE("a{sv}"));
1238 g_variant_builder_add(&b, "{sv}", "ss_class", g_variant_new_int32( wait->record[i].class ));
1239 g_variant_builder_add(&b, "{sv}", "ss_status", g_variant_new_int32( wait->record[i].status ));
1240 g_variant_builder_close(&b);
1243 result = g_variant_builder_end(&b);
1244 telephony_ss_emit_notify_waiting(ss, result);
1248 case TNOTI_SS_RELEASE_COMPLETE: {
1250 GVariantBuilder builder;
1251 GVariant *msg_data = 0, *packet = NULL;
1252 const struct tnoti_ss_release_complete *msg = data;
1254 g_variant_builder_init(&builder, G_VARIANT_TYPE ("ay"));
1255 for (i = 0; i < msg->data_len; i++) {
1256 g_variant_builder_add(&builder, "y", msg->data[i]);
1258 msg_data = g_variant_builder_end(&builder);
1259 packet = g_variant_new("v", msg_data);
1261 dbg("type_format(%s)", g_variant_get_type_string(packet));
1262 telephony_ss_emit_release_complete(ss, msg->data_len, packet );
1264 dbg("No data is passed in USSD release notification");
1265 g_variant_builder_init(&builder, G_VARIANT_TYPE ("ay"));
1266 g_variant_builder_add(&builder, "y", '\0');
1267 msg_data = g_variant_builder_end(&builder);
1268 packet = g_variant_new("v", msg_data);
1269 dbg("type_format(%s)", g_variant_get_type_string(packet));
1270 telephony_ss_emit_release_complete(ss, 1, packet);
1273 case TNOTI_SS_INFO: {
1274 const struct tnoti_ss_information *ss_info = data;
1275 telephony_ss_emit_notify_ss_info(ss,
1278 _launch_ciss_information(ss_info);
1279 /* Launch CISS application
1280 _launch_ciss(ss_info);
1284 dbg("not handled command[%d]", command);