4 * Copyright (c) 2012 Samsung Electronics Co., Ltd. All rights reserved.
6 * Contact: sharanayya mathapati <sharan.m@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.
29 #include <core_object.h>
34 #include <user_request.h>
42 #define NUM_TYPE_INTERNATIONAL 0x01
43 #define NUM_PLAN_ISDN 0x01
45 // To avoid sending multiple response to application
46 static gboolean UssdResp = FALSE;
48 enum telephony_ss_opcode {
49 SS_OPCO_REG = 0x01, /* 0x01 : Registration */
50 SS_OPCO_DEREG, /* 0x02 : De-registration(erase) */
51 SS_OPCO_ACTIVATE, /* 0x03 : Activation */
52 SS_OPCO_DEACTIVATE, /* 0x04 : De-activation */
56 struct ss_confirm_info {
57 enum telephony_ss_class class;
59 enum tcore_response_command resp;
64 static gboolean _ss_request_message(TcorePending *pending, CoreObject *o, UserRequest *ur, void *on_resp, void *user_data);
66 static TReturn _ss_barring_get(CoreObject *o, UserRequest *ur, enum telephony_ss_class class, enum telephony_ss_barring_mode type, enum tcore_response_command resp);
68 static TReturn _ss_forwarding_get(CoreObject *o, UserRequest *ur, enum telephony_ss_class class, enum telephony_ss_forwarding_mode type, enum tcore_response_command resp);
70 static TReturn _ss_waiting_get(CoreObject *o, UserRequest *ur, enum telephony_ss_class class, enum tcore_response_command resp);
72 static TReturn s_ss_barring_activate(CoreObject *o, UserRequest *ur);
73 static TReturn s_ss_barring_deactivate(CoreObject *o, UserRequest *ur);
74 static TReturn s_ss_barring_change_password(CoreObject *o, UserRequest *ur);
75 static TReturn s_ss_barring_get_status(CoreObject *o, UserRequest *ur);
77 static TReturn s_ss_forwarding_activate(CoreObject *o, UserRequest *ur);
78 static TReturn s_ss_forwarding_deactivate(CoreObject *o, UserRequest *ur);
79 static TReturn s_ss_forwarding_register(CoreObject *o, UserRequest *ur);
80 static TReturn s_ss_forwarding_deregister(CoreObject *o, UserRequest *ur);
81 static TReturn s_ss_forwarding_get_status(CoreObject *o, UserRequest *ur);
83 static TReturn s_ss_waiting_activate(CoreObject *o, UserRequest *ur);
84 static TReturn s_ss_waiting_deactivate(CoreObject *o, UserRequest *ur);
85 static TReturn s_ss_waiting_get_status(CoreObject *o, UserRequest *ur);
87 static TReturn s_ss_cli_activate(CoreObject *o, UserRequest *ur);
88 static TReturn s_ss_cli_deactivate(CoreObject *o, UserRequest *ur);
89 static TReturn s_ss_cli_get_status(CoreObject *o, UserRequest *ur);
91 static TReturn s_ss_send_ussd(CoreObject *o, UserRequest *ur);
93 static TReturn s_ss_set_aoc(CoreObject *o, UserRequest *ur);
94 static TReturn s_ss_get_aoc(CoreObject *o, UserRequest *ur);
96 static TReturn s_ss_manage_call_0_send(CoreObject *o, UserRequest *ur, ConfirmCallback cb, void *user_data);
97 static TReturn s_ss_manage_call_1_send(CoreObject *o, UserRequest *ur, ConfirmCallback cb, void *user_data);
98 static TReturn s_ss_manage_call_1x_send(CoreObject *o, UserRequest *ur, const int id, ConfirmCallback cb, void *user_data);
99 static TReturn s_ss_manage_call_2_send(CoreObject *o, UserRequest *ur, ConfirmCallback cb, void *user_data);
100 static TReturn s_ss_manage_call_2x_send(CoreObject *o, UserRequest *ur, const int id, ConfirmCallback cb, void *user_data);
101 static TReturn s_ss_manage_call_3_send(CoreObject *o, UserRequest *ur, ConfirmCallback cb, void *user_data);
102 static TReturn s_ss_manage_call_4_send(CoreObject *o, UserRequest *ur, ConfirmCallback cb, void *user_data);
103 static TReturn s_ss_manage_call_4dn_send(CoreObject *o, UserRequest *ur, const char *number, ConfirmCallback cb, void *user_data);
105 static void on_confirmation_ss_message_send(TcorePending *p, gboolean result, void *user_data);
107 static void _ss_ussd_response(UserRequest *ur, const char *ussd_str, enum telephony_ss_ussd_type type, enum telephony_ss_ussd_status status);
108 static void _ss_ussd_notification(TcorePlugin *p, const char *ussd_str, enum telephony_ss_ussd_status status);
110 static gboolean on_notification_ss_info(CoreObject *o, const void *data, void *user_data);
111 static gboolean on_notification_ss_ussd(CoreObject *o, const void *data, void *user_data);
114 static gboolean _ss_request_message(TcorePending *pending,
120 TcoreHal *hal = NULL;
125 tcore_pending_set_response_callback(pending, on_resp, user_data);
127 tcore_pending_set_send_callback(pending, on_confirmation_ss_message_send, NULL);
129 tcore_pending_link_user_request(pending, ur);
131 err("User Request is NULL, is this internal request??");
134 hal = tcore_object_get_hal(o);
136 // Send request to HAL
137 ret = tcore_hal_send_request(hal, pending);
138 if (TCORE_RETURN_SUCCESS != ret) {
139 err("Request send failed");
147 static void _ss_ussd_response(UserRequest *ur, const char *ussd_str, enum telephony_ss_ussd_type type, enum telephony_ss_ussd_status status)
149 struct tresp_ss_ussd resp;
153 memset(&resp, 0x0, sizeof(struct tresp_ss_ussd));
155 resp.status = status;
156 resp.err = SS_ERROR_NONE;
157 dbg("ussd_str = %s resp.type - %d resp.status - %d", ussd_str, resp.type, resp.status);
160 int len = strlen(ussd_str);
161 if (len < MAX_SS_USSD_LEN) {
162 memcpy(resp.str, ussd_str, len);
163 resp.str[len] = '\0';
165 memcpy(resp.str, ussd_str, MAX_SS_USSD_LEN);
166 resp.str[MAX_SS_USSD_LEN - 1] = '\0';
168 dbg("Response string: %s", resp.str);
170 dbg("USSD string is not present");
171 memset(resp.str, '\0', MAX_SS_USSD_LEN);
174 // Send response to TAPI
175 tcore_user_request_send_response(ur, TRESP_SS_SEND_USSD, sizeof(struct tresp_ss_ussd), &resp);
177 err("User request is NULL");
184 static void _ss_ussd_notification(TcorePlugin *p, const char *ussd_str, enum telephony_ss_ussd_status status)
186 CoreObject *core_obj = 0;
187 struct tnoti_ss_ussd noti;
189 dbg("function enter");
191 dbg("[ error ] p : (NULL)");
194 noti.status = status;
196 int len = strlen(ussd_str);
197 if (len < MAX_SS_USSD_LEN) {
198 memcpy(noti.str, ussd_str, len);
199 noti.str[len] = '\0';
201 memcpy(noti.str, ussd_str, MAX_SS_USSD_LEN);
202 noti.str[MAX_SS_USSD_LEN - 1] = '\0';
205 memset(noti.str, '\0', MAX_SS_USSD_LEN);
207 dbg("noti.str - %s", noti.str);
209 core_obj = tcore_plugin_ref_core_object(p, CORE_OBJECT_TYPE_SS);
210 tcore_server_send_notification(tcore_plugin_ref_server(p),
213 sizeof(struct tnoti_ss_ussd),
217 static gboolean on_notification_ss_ussd(CoreObject *o, const void *data, void *user_data)
219 enum telephony_ss_ussd_status status;
220 UssdSession *ussd_session = 0;
221 char *ussd_str = 0, *cmd = 0;
222 TcorePlugin *plugin = 0;
224 char *ussdnoti = NULL, *str = NULL, *dcs_str = NULL;
225 GSList *tokens = NULL;
226 GSList *lines = NULL;
227 char *ussd_string = NULL;
230 plugin = tcore_object_ref_plugin(o);
231 ussd_session = tcore_ss_ussd_get_session(o);
233 dbg("function enter");
234 lines = (GSList *) data;
235 if (1 != g_slist_length(lines)) {
236 dbg("unsolicited msg but multiple line");
239 cmd = (char *) (lines->data);
241 tokens = tcore_at_tok_new(cmd);
244 ussdnoti = g_slist_nth_data(tokens, 0);
246 dbg("+CUSD<m> is missing from %CUSD Notification");
249 dbg("USSD status %d", m);
250 // parse [ <str>, <dcs>]
251 ussd_string = g_slist_nth_data(tokens, 1);
253 /* Strike off starting & ending quotes. 1 extra character for NULL termination */
254 str = malloc(strlen(ussd_string) - 1);
255 dbg("length of Ussd Stirng - %d", strlen(ussd_string));
257 memset(str, 0x00, strlen(ussd_string) - 1);
259 dbg("malloc failed");
260 if (NULL != tokens) {
261 tcore_at_tok_free(tokens);
265 len = strlen(ussd_string) - 1;
267 strncpy(str, ussd_string, len);
269 dbg("USSD String - %s len = %d", str, strlen(str));
271 if ((dcs_str = g_slist_nth_data(tokens, 2))) {
273 dbg("USSD dcs %d", dcs);
279 status = SS_USSD_NO_ACTION_REQUIRE;
283 status = SS_USSD_ACTION_REQUIRE;
287 status = SS_USSD_TERMINATED_BY_NET;
291 status = SS_USSD_OTHER_CLIENT;
295 status = SS_USSD_NOT_SUPPORT;
299 status = SS_USSD_TIME_OUT;
303 dbg("unsupported m : %d", m);
304 status = SS_USSD_MAX;
308 switch (tcore_util_get_cbs_coding_scheme(dcs)) {
309 case TCORE_DCS_TYPE_7_BIT:
310 case TCORE_DCS_TYPE_UNSPECIFIED:
311 // ussd_str = tcore_util_unpack_gsm7bit(str, strlen(str));
314 case TCORE_DCS_TYPE_UCS2:
315 case TCORE_DCS_TYPE_8_BIT:
316 if ((str != NULL) && (strlen(str) > 0)) {
317 ussd_str = g_new0(char, strlen(str) + 1);
318 if (ussd_str != NULL) {
319 memcpy(ussd_str, str, strlen(str));
320 ussd_str[strlen(str)] = '\0';
326 dbg("[ error ] unknown dcs type. ussd_session : %x", ussd_session);
329 enum telephony_ss_ussd_type type;
331 tcore_ss_ussd_get_session_data(ussd_session, (void **) &ur);
333 dbg("[ error ] ur : (0)");
337 type = (enum telephony_ss_ussd_type) tcore_ss_ussd_get_session_type(ussd_session);
338 dbg("ussd type - %d", type);
340 _ss_ussd_response(ur, ussd_str, type, status);
344 if (NULL != tokens) {
345 tcore_at_tok_free(tokens);
355 case SS_USSD_NO_ACTION_REQUIRE:
356 case SS_USSD_ACTION_REQUIRE:
357 case SS_USSD_OTHER_CLIENT:
358 case SS_USSD_NOT_SUPPORT:
359 case SS_USSD_TIME_OUT:
363 enum telephony_ss_ussd_type type;
365 tcore_ss_ussd_get_session_data(ussd_session, (void **) &ur);
367 dbg("[ error ] ur : (0)");
368 if (NULL != tokens) {
369 tcore_at_tok_free(tokens);
381 type = (enum telephony_ss_ussd_type) tcore_ss_ussd_get_session_type(ussd_session);
382 dbg("ussd type - %d", type);
383 _ss_ussd_response(ur, (const char *) ussd_str, type, status);
387 tcore_ss_ussd_create_session(o, TCORE_SS_USSD_TYPE_NETWORK_INITIATED, 0, 0);
388 _ss_ussd_notification(plugin, (const char *) ussd_str, status);
396 case SS_USSD_TERMINATED_BY_NET:
400 tcore_ss_ussd_get_session_data(ussd_session, (void **) &ur);
402 tcore_user_request_unref(ur);
404 tcore_ss_ussd_destroy_session(ussd_session);
413 if (NULL != tokens) {
414 tcore_at_tok_free(tokens);
425 static gboolean on_notification_ss_info(CoreObject *o, const void *data, void *user_data)
427 TcorePlugin *plugin = 0;
429 char *cmd = 0, *number = 0, *pos;
430 int code1 = -1, code2 = -1, index = 0, ton = 0;
431 char *str_code1, *str_code2, *str_ton, *str_index;
432 GSList *tokens = NULL;
434 gboolean cssu = FALSE, cssi = FALSE;
435 GSList *lines = NULL;
437 dbg("function enter");
439 plugin = tcore_object_ref_plugin(o);
440 co = tcore_plugin_ref_core_object(plugin, CORE_OBJECT_TYPE_CALL);
442 dbg("[ error ] plugin_ref_core_object : call");
446 lines = (GSList *) data;
447 if (1 != g_slist_length(lines)) {
448 dbg("unsolicited msg but multiple line");
452 cmd = (char *) (lines->data);
453 pos = strchr(cmd, ':');
455 dbg("[ error ] not valid SS- notification ");
458 buf = calloc(pos - cmd + 2, 1);
459 memcpy(buf, cmd, pos - cmd);
460 dbg("buf is %s", buf);
462 if (!strcmp(buf, "+CSSU")) {
463 dbg("SS - +CSSU indication");
465 } else if (!strcmp(buf, "+CSSI")) {
466 dbg("SS - +CSSI indication");
471 // handle %CSSU notification
473 tokens = tcore_at_tok_new(cmd);
475 str_code2 = g_slist_nth_data(tokens, 0);
477 dbg("Code2 is missing from %CSSU indiaction");
479 code2 = atoi(str_code2);
480 // parse [ <index>, <number> <type>]
481 if ((str_index = g_slist_nth_data(tokens, 1))) {
482 index = atoi(str_index);
485 if ((resp = g_slist_nth_data(tokens, 2))) {
486 // Strike off double quotes
487 number = util_removeQuotes(resp);
488 str_ton = g_slist_nth_data(tokens, 3);
496 dbg("CSSU - code2 = %d index = %d number = %s type = %d", code2, index, number, ton);
498 case 0: // this is a forwarded call (MT call setup)
499 tcore_call_information_mt_forwarded_call(co, number);
502 case 2: // call has been put on hold (during a voice call)
503 tcore_call_information_held(co, number);
506 case 3: // call has been retrieved (during a voice call)
507 tcore_call_information_active(co, number);
510 case 4: // multiparty call entered (during a voice call)
511 tcore_call_information_joined(co, number);
514 case 5: // call on hold has been released
515 tcore_call_information_released_on_hold(co, number);
518 case 6: // forward check SS message received (can be received whenever)
519 tcore_call_information_cf_check_ss_message(co, number);
522 case 7: // call is being connected (alerting) with the remote party in alerting state in explicit call transfer operation (during a voice call)
523 tcore_call_information_transfer_alert(co, number);
526 case 8: // call has been connected with the other remote party in explicit call transfer operation (also number and subaddress parameters may be present) (during a voice call or MT call setup)
527 tcore_call_information_transfered(co, number);
530 case 9: // this is a deflected call (MT call setup):
531 tcore_call_information_mt_deflected_call(co, number);
535 dbg("CSSU - unsupported code2 : %d", code2);
539 // handle %CSSI notification
542 tokens = tcore_at_tok_new(cmd);
544 str_code1 = g_slist_nth_data(tokens, 0);
546 dbg("Code1 is missing from %CSSI indiaction");
548 code1 = atoi(str_code1);
550 if ((str_index = g_slist_nth_data(tokens, 1))) {
551 index = atoi(str_index);
555 dbg("CSSI - code1 - %d index - %d ", code1, index);
558 case 0: // Unconditional CF is active
559 tcore_call_information_mo_cfu(co);
562 case 1: // some of the conditional call forwarding are active
563 tcore_call_information_mo_cfc(co);
566 case 2: // outgoing call is forwarded
567 tcore_call_information_mo_forwarded(co);
570 case 3: // this call is waiting
571 tcore_call_information_mo_waiting(co);
574 case 5: // outgoing call is barred
575 tcore_call_information_mo_barred_outgoing(co);
578 case 6: // incoming call is barred
579 tcore_call_information_mo_barred_incoming(co);
582 case 7: // CLIR suppression rejected
583 tcore_call_information_mo_clir_suppression_reject(co);
586 case 8: // outgoing call is deflected
587 tcore_call_information_mo_deflected(co);
591 dbg("unsupported cmd : %d", code1);
596 if (NULL != tokens) {
597 tcore_at_tok_free(tokens);
600 if (NULL != number) {
606 static void on_confirmation_ss_message_send(TcorePending *p, gboolean result, void *user_data)
610 if (result == FALSE) {
618 static void on_response_ss_barring_set(TcorePending *p, int data_len, const void *data, void *user_data)
620 struct ss_confirm_info *info = 0;
621 enum telephony_ss_class class;
624 struct tresp_ss_barring resp;
625 UserRequest *ur_dup = 0;
626 GSList *tokens = NULL;
629 const TcoreATResponse *response;
631 dbg("function enter");
633 o = tcore_pending_ref_core_object(p);
634 ur = tcore_pending_ref_user_request(p);
636 info = (struct ss_confirm_info *) user_data;
639 if (response->success > 0) {
641 resp.err = SS_ERROR_NONE;
644 dbg("RESPONSE NOT OK");
646 line = (const char *) response->final_response;
647 tokens = tcore_at_tok_new(line);
649 if (g_slist_length(tokens) < 1) {
650 dbg("err cause not specified or string corrupted");
651 resp.err = SS_ERROR_SYSTEMFAILURE;
653 err = atoi(g_slist_nth_data(tokens, 0));
654 // TODO: CMEE error mapping is required.
655 resp.err = SS_ERROR_SYSTEMFAILURE;
657 tcore_at_tok_free(tokens);
660 dbg("on_response_ss_barring_set - rsp.err : %d, ur : %x flavor_type = %d", resp.err, ur, info->flavor_type);
661 dbg("[ check ] class : 0x%x", info->class);
663 if (response->success > 0) {
664 if (info->class == SS_CLASS_VOICE) {
665 class = SS_CLASS_ALL_TELE_BEARER;
668 ur_dup = tcore_user_request_ref(ur);
670 if (info->flavor_type == SS_BARR_MODE_AB || info->flavor_type == SS_BARR_MODE_AOB) {
671 _ss_barring_get(o, ur_dup, class, SS_BARR_MODE_BAOC, info->resp);
672 } else if (info->flavor_type == SS_BARR_MODE_AIB) {
673 _ss_barring_get(o, ur_dup, class, SS_BARR_MODE_BAIC, info->resp);
675 _ss_barring_get(o, ur_dup, class, info->flavor_type, info->resp);
679 tcore_user_request_send_response(ur, info->resp, sizeof(struct tresp_ss_barring), &resp);
681 dbg("[ error ] ur is 0");
687 static void on_response_ss_barring_change_pwd(TcorePending *p, int data_len, const void *data, void *user_data)
689 const TcoreATResponse *response = data;
690 struct ss_confirm_info *info = 0;
692 struct tresp_ss_barring resp;
694 GSList *tokens = NULL;
697 dbg("function enter");
698 ur = tcore_pending_ref_user_request(p);
699 info = (struct ss_confirm_info *) user_data;
701 if (response->success > 0) {
703 resp.err = SS_ERROR_NONE;
705 dbg("RESPONSE NOT OK");
707 line = (const char *) response->final_response;
708 tokens = tcore_at_tok_new(line);
710 if (g_slist_length(tokens) < 1) {
711 dbg("err cause not specified or string corrupted");
712 resp.err = SS_ERROR_SYSTEMFAILURE;
714 err = atoi(g_slist_nth_data(tokens, 0));
715 // TODO: CMEE error mapping is required.
716 resp.err = SS_ERROR_SYSTEMFAILURE;
718 tcore_at_tok_free(tokens);
721 dbg("on_response_ss_barring_change_pwd: rsp.err : %d, usr : %x", resp.err, ur);
723 tcore_user_request_send_response(ur, info->resp, sizeof(struct tresp_ss_barring), &resp);
725 dbg("[ error ] ur is 0");
731 static void on_response_ss_forwarding_set(TcorePending *p, int data_len, const void *data, void *user_data)
734 UserRequest *ur = 0, *dup_ur = 0;
735 struct ss_confirm_info *info = 0;
736 struct tresp_ss_forwarding resp = {0,};
737 GSList *tokens = NULL;
740 const TcoreATResponse *response;
742 dbg("function enter");
745 o = tcore_pending_ref_core_object(p);
746 ur = tcore_pending_ref_user_request(p);
748 info = (struct ss_confirm_info *) user_data;
750 if (response->success > 0) {
752 resp.err = SS_ERROR_NONE;
754 dbg("RESPONSE NOT OK");
757 line = (const char *) response->final_response;
758 tokens = tcore_at_tok_new(line);
760 if (g_slist_length(tokens) < 1) {
761 dbg("Error cause not specified or string corrupted");
762 resp.err = SS_ERROR_SYSTEMFAILURE;
764 error = atoi(g_slist_nth_data(tokens, 0));
765 err("Error: [%d]", error);
766 // / TODO: CMEE error mapping is required.
767 resp.err = SS_ERROR_SYSTEMFAILURE;
770 tcore_at_tok_free(tokens);
773 dbg("[ check ] class : 0x%x", info->class);
774 dbg("[ check ] flavor_type : 0x%x", info->flavor_type);
776 dbg("on_response_ss_forwarding_set - rsp.err : %d, ur : %x", resp.err, ur);
778 if (response->success > 0) {
779 if (info->flavor_type == SS_CF_MODE_CF_ALL ||
780 info->flavor_type == SS_CF_MODE_CFC) {
782 tcore_user_request_send_response(ur, info->resp, sizeof(struct tresp_ss_forwarding), &resp);
784 dbg("[ error ] ur is 0");
787 dup_ur = tcore_user_request_ref(ur);
788 _ss_forwarding_get(o, dup_ur, info->class, info->flavor_type, info->resp);
792 tcore_user_request_send_response(ur, info->resp, sizeof(struct tresp_ss_forwarding), &resp);
794 dbg("[ error ] ur is 0");
800 static void on_response_ss_waiting_set(TcorePending *p, int data_len, const void *data, void *user_data)
802 CoreObject *core_obj = 0;
804 UserRequest *ur_dup = 0;
805 struct ss_confirm_info *info = 0;
806 struct tresp_ss_waiting resp;
807 GSList *tokens = NULL;
810 const TcoreATResponse *response;
812 dbg("function enter");
814 core_obj = tcore_pending_ref_core_object(p);
815 ur = tcore_pending_ref_user_request(p);
817 info = (struct ss_confirm_info *) user_data;
819 if (response->success > 0) {
821 resp.err = SS_ERROR_NONE;
824 dbg("RESPONSE NOT OK");
826 line = (const char *) response->final_response;
827 tokens = tcore_at_tok_new(line);
829 if (g_slist_length(tokens) < 1) {
830 dbg("err cause not specified or string corrupted");
831 resp.err = SS_ERROR_SYSTEMFAILURE;
833 err = atoi(g_slist_nth_data(tokens, 0));
834 // / TODO: CMEE error mapping is required.
835 resp.err = SS_ERROR_SYSTEMFAILURE;
837 tcore_at_tok_free(tokens);
840 dbg("on_response_ss_waiting_set - rsp.err : %d, ur : %x, class : %d", resp.err, ur, info->class);
842 if (resp.err == SS_ERROR_NONE) {
843 ur_dup = tcore_user_request_ref(ur);
844 dbg("Get waiting call status");
845 _ss_waiting_get(core_obj, ur_dup, info->class, info->resp);
848 tcore_user_request_send_response(ur, info->resp, sizeof(struct tresp_ss_waiting), &resp);
850 dbg("[ error ] ur is 0");
857 static void on_confirmation_ss_ussd(TcorePending *p, int data_len, const void *data, void *user_data)
859 CoreObject *core_obj = 0;
860 struct ss_confirm_info *info = 0;
861 struct tresp_ss_ussd resp;
862 UserRequest *ur = NULL, *ussd_ur = NULL;
863 GSList *tokens = NULL;
866 UssdSession *ussd_s = NULL;
867 enum tcore_ss_ussd_type type = TCORE_SS_USSD_TYPE_MAX;
868 const TcoreATResponse *response;
870 dbg("function enter");
872 ur = tcore_pending_ref_user_request(p);
873 info = (struct ss_confirm_info *) user_data;
875 memset(resp.str, 0x00, MAX_SS_USSD_LEN);
877 core_obj = tcore_pending_ref_core_object(p);
878 ussd_s = tcore_ss_ussd_get_session(core_obj);
881 type = tcore_ss_ussd_get_session_type(ussd_s);
883 dbg("[ error ] ussd_s : (0)");
885 resp.type = (enum telephony_ss_ussd_type) type;
886 resp.status = SS_USSD_MAX; // hardcoded value.
888 if (response->success > 0) {
890 resp.err = SS_ERROR_NONE;
892 dbg("RESPONSE NOT OK");
894 line = (const char *) response->final_response;
895 tokens = tcore_at_tok_new(line);
897 if (g_slist_length(tokens) < 1) {
898 dbg("err cause not specified or string corrupted");
899 resp.err = SS_ERROR_SYSTEMFAILURE;
901 err = atoi(g_slist_nth_data(tokens, 0));
902 // TODO: CMEE error mapping is required.
903 resp.err = SS_ERROR_SYSTEMFAILURE;
905 tcore_at_tok_free(tokens);
908 dbg("on_confirmation_ss_ussd - rsp.err : %d, ur : %x", resp.err, ur);
910 if (response->success > 0) {
911 if (type == TCORE_SS_USSD_TYPE_USER_INITIATED) {
912 dbg("ussd type %d", resp.type);
915 tcore_ss_ussd_get_session_data(ussd_s, (void **) &ussd_ur);
917 tcore_user_request_free(ussd_ur);
923 tcore_ss_ussd_destroy_session(ussd_s);
926 if (UssdResp == FALSE) { // to avoid sending multiple response to application.
927 tcore_user_request_send_response(ur, info->resp, sizeof(struct tresp_ss_ussd), &resp);
931 dbg("[ error ] ur : (0)");
936 static void on_response_ss_barring_get(TcorePending *p, int data_len, const void *data, void *user_data)
939 int status = 0, classx = 0, err = 0;
941 struct ss_confirm_info *info = 0;
942 struct tresp_ss_barring resp;
943 int countRecords = 0, countValidRecords = 0;
944 GSList *tokens = NULL;
948 const TcoreATResponse *response;
950 dbg("function enter");
953 ur = tcore_pending_ref_user_request(p);
954 info = (struct ss_confirm_info *) user_data;
956 if (response->lines) {
957 respdata = (GSList *) response->lines;
958 countRecords = g_slist_length(respdata);
959 dbg("total records : %d", countRecords);
962 dbg("no active status - return to user");
964 resp.record_num = countRecords;
966 if (resp.record_num > 0) {
967 resp.record = g_new0(struct barring_info, resp.record_num);
968 for (countValidRecords = 0; respdata != NULL; respdata = respdata->next) {
969 line = (const char *) (respdata->data);
970 tokens = tcore_at_tok_new(line);
973 stat = g_slist_nth_data(tokens, 0);
975 dbg("Stat is missing");
981 resp.record[countValidRecords].status = SS_STATUS_ACTIVATE;
983 resp.record[countValidRecords].status = SS_STATUS_DEACTIVATE;
985 dbg("call barring status - %d", status);
988 classx_str = g_slist_nth_data(tokens, 1);
991 dbg("class error. classx not exist - set to requested one : %d", info->class);
992 switch (info->class) {
993 case SS_CLASS_ALL_TELE:
1001 case SS_CLASS_ALL_DATA_TELE:
1013 case SS_CLASS_ALL_CS_SYNC:
1019 dbg("unsupported class %d. set to default : 7", info->class);
1023 classx = atoi(classx_str);
1024 dbg("call barring classx - %d", classx);
1029 resp.record[countValidRecords].class = SS_CLASS_VOICE;
1033 resp.record[countValidRecords].class = SS_CLASS_ALL_DATA_TELE;
1037 resp.record[countValidRecords].class = SS_CLASS_FAX;
1041 resp.record[countValidRecords].class = SS_CLASS_ALL_TELE;
1045 resp.record[countValidRecords].class = SS_CLASS_SMS;
1049 resp.record[countValidRecords].class = SS_CLASS_ALL_CS_SYNC;
1053 resp.record[countValidRecords].class = SS_CLASS_ALL_CS_ASYNC;
1057 dbg("unspoorted class : [%d]\n", classx);
1061 resp.record[countValidRecords].mode = (enum telephony_ss_barring_mode) (info->flavor_type);
1062 countValidRecords++;
1063 tcore_at_tok_free(tokens);
1067 dbg("invalid field found. coutinue");
1068 tcore_at_tok_free(tokens);
1072 dbg("valid count :%d", countValidRecords);
1073 resp.record_num = countValidRecords;
1074 resp.err = SS_ERROR_NONE;
1076 dbg("no active status - return to user");
1079 if (response->success > 0) {
1081 resp.err = SS_ERROR_NONE;
1083 dbg("RESPONSE NOT OK");
1084 resp.err = TCORE_RETURN_FAILURE;
1086 resp.record_num = 0;
1088 line = (const char *) response->final_response;
1089 tokens = tcore_at_tok_new(line);
1091 if (g_slist_length(tokens) < 1) {
1092 dbg("err cause not specified or string corrupted");
1093 resp.err = SS_ERROR_SYSTEMFAILURE;
1095 err = atoi(g_slist_nth_data(tokens, 0));
1096 // TODO: CMEE error mapping is required.
1097 resp.err = SS_ERROR_SYSTEMFAILURE;
1099 tcore_at_tok_free(tokens);
1102 dbg("on_response_ss_barring_get- rsp.err : %d, ur : %x", resp.err, ur);
1105 tcore_user_request_send_response(ur, info->resp, sizeof(struct tresp_ss_barring), &resp);
1107 dbg("[ error ] ur is 0");
1110 g_free(resp.record);
1117 static void on_response_ss_forwarding_get(TcorePending *p, int data_len, const void *data, void *user_data)
1119 UserRequest *ur = 0;
1120 int classx = 0, err = 0, time = 0;
1122 struct ss_confirm_info *info = 0;
1123 struct tresp_ss_forwarding resp;
1124 int countRecords = 0, countValidRecords = 0;
1126 GSList *respdata = NULL, *tokens = NULL;
1128 char *classx_str, *status, *ton, *time_str;
1129 const TcoreATResponse *response;
1131 dbg("function enter");
1134 ur = tcore_pending_ref_user_request(p);
1135 info = (struct ss_confirm_info *) user_data;
1136 if (response->lines) {
1137 respdata = (GSList *) response->lines;
1138 countRecords = g_slist_length(respdata);
1139 dbg("total records : %d", countRecords);
1142 dbg("no active status - return to user");
1144 resp.record_num = countRecords;
1146 if (resp.record_num > 0) {
1147 resp.record = g_new0(struct forwarding_info, resp.record_num);
1149 for (countValidRecords = 0; respdata != NULL; respdata = respdata->next) {
1150 line = (const char *) (respdata->data);
1151 tokens = tcore_at_tok_new(line);
1154 status = g_slist_nth_data(tokens, 0);
1156 dbg("start line error. skip this line");
1159 if (atoi(status) == 1) {
1160 resp.record[countValidRecords].status = SS_STATUS_ACTIVATE;
1162 resp.record[countValidRecords].status = SS_STATUS_DEACTIVATE;
1167 classx_str = g_slist_nth_data(tokens, 1);
1169 dbg("class error. skip this line");
1172 switch (atoi(classx_str)) {
1174 resp.record[countValidRecords].class = SS_CLASS_VOICE;
1178 resp.record[countValidRecords].class = SS_CLASS_ALL_DATA_TELE;
1182 resp.record[countValidRecords].class = SS_CLASS_FAX;
1186 resp.record[countValidRecords].class = SS_CLASS_ALL_TELE;
1190 resp.record[countValidRecords].class = SS_CLASS_SMS;
1194 resp.record[countValidRecords].class = SS_CLASS_ALL_CS_SYNC;
1198 resp.record[countValidRecords].class = SS_CLASS_ALL_CS_ASYNC;
1202 dbg("unspoorted class : [%d]\n", classx);
1208 // parse <numer> <type>
1209 num = g_slist_nth_data(tokens, 2);
1211 dbg("number - %s", num);
1212 memcpy((resp.record[countValidRecords].number), num, strlen(num));
1213 resp.record[countValidRecords].number_present = TRUE;
1215 ton = g_slist_nth_data(tokens, 3);
1217 resp.record[countValidRecords].number_type = atoi(ton);
1218 dbg("number type - %d", resp.record[countValidRecords].number_type);
1222 // skip <subaddr> <satype>
1224 time_str = g_slist_nth_data(tokens, 6);
1226 time = atoi(time_str);
1227 resp.record[countValidRecords].time = (enum telephony_ss_forwarding_no_reply_time) time;
1228 dbg("time - %d", time);
1231 resp.record[countValidRecords].mode = (enum telephony_ss_forwarding_mode) (info->flavor_type);
1232 dbg("flavor_type - %d", (enum telephony_ss_forwarding_mode) (info->flavor_type));
1234 countValidRecords++;
1235 tcore_at_tok_free(tokens);
1238 dbg("invalid field found. coutinue");
1239 tcore_at_tok_free(tokens);
1242 dbg("valid count :%d", countValidRecords);
1243 resp.record_num = countValidRecords;
1244 resp.err = SS_ERROR_NONE;
1246 dbg("no active status - return to user");
1249 if (response->success > 0) {
1251 resp.err = SS_ERROR_NONE;
1253 dbg("RESPONSE NOT OK");
1255 resp.record_num = 0;
1256 line = (const char *) response->final_response;
1257 tokens = tcore_at_tok_new(line);
1259 if (g_slist_length(tokens) < 1) {
1260 dbg("err cause not specified or string corrupted");
1261 resp.err = SS_ERROR_SYSTEMFAILURE;
1263 err = atoi(g_slist_nth_data(tokens, 0));
1264 /* TODO: CMEE error mapping is required. */
1265 resp.err = SS_ERROR_SYSTEMFAILURE;
1267 tcore_at_tok_free(tokens);
1270 dbg("on_response_ss_forwarding_get- rsp.err : %d, ur : %x", resp.err, ur);
1272 tcore_user_request_send_response(ur, info->resp, sizeof(struct tresp_ss_forwarding), &resp);
1274 dbg("[ error ] ur is 0");
1277 g_free(resp.record);
1283 static void on_response_ss_waiting_get(TcorePending *p, int data_len, const void *data, void *user_data)
1285 UserRequest *ur = 0;
1286 GSList *respdata, *tokens = NULL;
1287 int classx = 0, err = 0;
1288 struct ss_confirm_info *info = 0;
1289 struct tresp_ss_waiting resp;
1290 int countRecords = 0, countValidRecords = 0;
1292 char *classx_str, *status;
1293 const TcoreATResponse *response;
1295 dbg("function enter");
1297 ur = tcore_pending_ref_user_request(p);
1298 info = (struct ss_confirm_info *) user_data;
1300 if (response->lines) {
1301 respdata = (GSList *) response->lines;
1302 countRecords = g_slist_length(respdata);
1303 dbg("total records : %d", countRecords);
1306 dbg("no active status - return to user");
1308 resp.record_num = countRecords;
1311 if (resp.record_num > 0) {
1312 resp.record = g_new0(struct waiting_info, resp.record_num);
1314 for (countValidRecords = 0; respdata != NULL; respdata = respdata->next) {
1315 line = (const char *) (respdata->data);
1316 tokens = tcore_at_tok_new(line);
1319 status = g_slist_nth_data(tokens, 0);
1321 dbg("Missing stat in responce ");
1324 if (atoi(status) == 1) {
1325 resp.record[countValidRecords].status = SS_STATUS_ACTIVATE;
1327 resp.record[countValidRecords].status = SS_STATUS_DEACTIVATE;
1330 dbg("status = %d", resp.record[countValidRecords].status);
1333 classx_str = g_slist_nth_data(tokens, 1);
1335 dbg("error - class is missing");
1338 switch (atoi(classx_str)) {
1340 resp.record[countValidRecords].class = SS_CLASS_VOICE;
1344 resp.record[countValidRecords].class = SS_CLASS_ALL_DATA_TELE;
1348 resp.record[countValidRecords].class = SS_CLASS_FAX;
1352 resp.record[countValidRecords].class = SS_CLASS_ALL_TELE;
1356 resp.record[countValidRecords].class = SS_CLASS_SMS;
1360 resp.record[countValidRecords].class = SS_CLASS_ALL_CS_SYNC;
1364 resp.record[countValidRecords].class = SS_CLASS_ALL_CS_ASYNC;
1368 dbg("unspoorted class : [%d]\n", classx);
1372 dbg("class info %d", resp.record[countValidRecords].class);
1375 countValidRecords++;
1376 tcore_at_tok_free(tokens);
1379 dbg("invalid field found. coutinue");
1380 tcore_at_tok_free(tokens);
1384 dbg("valid count :%d", countValidRecords);
1385 resp.record_num = countValidRecords;
1386 resp.err = SS_ERROR_NONE;
1388 dbg("no active status - return to user");
1391 if (response->success > 0) {
1393 resp.err = SS_ERROR_NONE;
1395 dbg("RESPONSE NOT OK");
1397 resp.record_num = 0;
1398 line = (const char *) response->final_response;
1399 tokens = tcore_at_tok_new(line);
1401 if (g_slist_length(tokens) < 1) {
1402 dbg("err cause not specified or string corrupted");
1403 resp.err = SS_ERROR_SYSTEMFAILURE;
1405 err = atoi(g_slist_nth_data(tokens, 0));
1406 // TODO: CMEE error mapping is required.
1407 resp.err = SS_ERROR_SYSTEMFAILURE;
1409 tcore_at_tok_free(tokens);
1412 dbg("on_response_ss_waiting_get - rsp.err : %d, ur : %x", resp.err, ur);
1414 tcore_user_request_send_response(ur, info->resp, sizeof(struct tresp_ss_waiting), &resp);
1416 dbg("[ error ] ur is 0");
1419 g_free(resp.record);
1426 static void on_response_ss_cli_get(TcorePending *p, int data_len, const void *data, void *user_data)
1428 UserRequest *ur = 0;
1429 struct tresp_ss_cli resp;
1430 enum telephony_ss_cli_type *p_type = NULL;
1431 char *line = NULL, *status;
1434 GSList *tokens = NULL;
1435 const TcoreATResponse *response;
1437 dbg("function enter");
1439 ur = tcore_pending_ref_user_request(p);
1440 p_type = (enum telephony_ss_cli_type *) (user_data);
1442 if (response->success > 0) {
1443 line = (char *) (((GSList *) response->lines)->data);
1444 tokens = tcore_at_tok_new(line);
1446 if (*p_type == SS_CLI_TYPE_CLIR) {
1448 dbg("CLI type is CLIR");
1450 status = g_slist_nth_data(tokens, 0);
1453 dbg("Call line identification adjustment missing <n>");
1455 cli_adj = atoi(status);
1456 dbg("CLIR response value of <n> - %d", cli_adj);
1460 status = g_slist_nth_data(tokens, 1);
1462 dbg("status is missing<m>");
1464 stat = atoi(status);
1465 dbg("CLIR response value of <m> - %d", stat);
1467 if (stat == 1 || stat == 3) {
1470 resp.status = FALSE;
1472 } else if (cli_adj == 1) {
1475 resp.status = FALSE;
1477 dbg("resp.status - %d", resp.status);
1479 tcore_at_tok_free(tokens);
1482 status = g_slist_nth_data(tokens, 0);
1484 dbg("Stat is missing");
1486 stat = atoi(status);
1490 resp.status = FALSE;
1492 dbg("resp.status - %d", resp.status);
1494 tcore_at_tok_free(tokens);
1498 if (response->success > 0) {
1500 resp.err = SS_ERROR_NONE;
1502 dbg("RESPONSE NOT OK");
1504 line = (char *) response->final_response;
1505 tokens = tcore_at_tok_new(line);
1507 if (g_slist_length(tokens) < 1) {
1508 dbg("err cause not specified or string corrupted");
1509 resp.err = SS_ERROR_SYSTEMFAILURE;
1511 err = atoi(g_slist_nth_data(tokens, 0));
1512 // TODO: CMEE error mapping is required.
1513 resp.err = SS_ERROR_SYSTEMFAILURE;
1515 tcore_at_tok_free(tokens);
1518 resp.type = *p_type;
1519 dbg("check - resp.type = %d ", resp.type);
1521 tcore_user_request_send_response(ur, TRESP_SS_CLI_GET_STATUS, sizeof(struct tresp_ss_cli), &resp);
1523 dbg("[ error ] ur : (0)");
1528 static struct tcore_ss_operations ss_ops = {
1529 .barring_activate = s_ss_barring_activate,
1530 .barring_deactivate = s_ss_barring_deactivate,
1531 .barring_change_password = s_ss_barring_change_password,
1532 .barring_get_status = s_ss_barring_get_status,
1533 .forwarding_activate = s_ss_forwarding_activate,
1534 .forwarding_deactivate = s_ss_forwarding_deactivate,
1535 .forwarding_register = s_ss_forwarding_register,
1536 .forwarding_deregister = s_ss_forwarding_deregister,
1537 .forwarding_get_status = s_ss_forwarding_get_status,
1538 .waiting_activate = s_ss_waiting_activate,
1539 .waiting_deactivate = s_ss_waiting_deactivate,
1540 .waiting_get_status = s_ss_waiting_get_status,
1541 .cli_activate = s_ss_cli_activate,
1542 .cli_deactivate = s_ss_cli_deactivate,
1543 .cli_get_status = s_ss_cli_get_status,
1544 .send_ussd = s_ss_send_ussd,
1545 .set_aoc = s_ss_set_aoc,
1546 .get_aoc = s_ss_get_aoc,
1550 static TReturn _ss_barring_set(CoreObject *o, UserRequest *ur, enum telephony_ss_opcode op)
1552 struct treq_ss_barring *barring = 0;
1553 struct ss_confirm_info *user_data = 0;
1554 char *cmd_str = NULL;
1556 TcorePending *pending = NULL;
1557 TcoreATRequest *req;
1558 char passwd[MAX_SS_BARRING_PASSWORD_LEN + 1];
1561 char *facility = NULL;
1562 gboolean ret = FALSE;
1564 dbg("function enter");
1565 barring = (struct treq_ss_barring *) tcore_user_request_ref_data(ur, 0);
1568 case SS_OPCO_ACTIVATE:
1572 case SS_OPCO_DEACTIVATE:
1577 dbg("unsupported opco : %d", op);
1578 return TCORE_RETURN_FAILURE;
1580 dbg("opco - %d", opco);
1582 switch (barring->mode) {
1583 case SS_BARR_MODE_BAOC:
1587 case SS_BARR_MODE_BOIC:
1591 case SS_BARR_MODE_BOIC_NOT_HC:
1595 case SS_BARR_MODE_BAIC:
1599 case SS_BARR_MODE_BIC_ROAM:
1603 case SS_BARR_MODE_AB:
1607 case SS_BARR_MODE_AOB:
1611 case SS_BARR_MODE_AIB:
1615 case SS_BARR_MODE_BIC_NOT_SIM:
1618 dbg("unspported mode %d", barring->mode);
1619 return TCORE_RETURN_FAILURE;
1622 dbg("facility - %s", facility);
1624 switch (barring->class) {
1625 case SS_CLASS_ALL_TELE:
1629 case SS_CLASS_VOICE:
1633 case SS_CLASS_ALL_DATA_TELE:
1645 case SS_CLASS_ALL_CS_SYNC:
1651 dbg("unsupported class %d. set to default : 7", barring->class);
1655 dbg("classx - %d", classx);
1657 // null-ended pwd handling added - unexpected 0x11 value observed in req string
1658 memcpy(passwd, barring->password, MAX_SS_BARRING_PASSWORD_LEN);
1659 passwd[MAX_SS_BARRING_PASSWORD_LEN] = '\0';
1660 dbg("passwd - %s", passwd);
1662 hal = tcore_object_get_hal(o);
1663 pending = tcore_pending_new(o, 0);
1665 cmd_str = g_strdup_printf("AT+CLCK=\"%s\",%d,\"%s\",%d", facility, opco, passwd, classx);
1666 dbg("request command : %s", cmd_str);
1668 req = tcore_at_request_new(cmd_str, NULL, TCORE_AT_NO_RESULT);
1669 dbg("cmd : %s, prefix(if any) :%s, cmd_len : %d", req->cmd, req->prefix, strlen(req->cmd));
1671 tcore_pending_set_request_data(pending, 0, req);
1673 user_data = g_new0(struct ss_confirm_info, 1);
1674 if (op == SS_OPCO_ACTIVATE) {
1675 user_data->resp = TRESP_SS_BARRING_ACTIVATE;
1676 } else if (op == SS_OPCO_DEACTIVATE) {
1677 user_data->resp = TRESP_SS_BARRING_DEACTIVATE;
1679 dbg("[ error ] wrong ss opco (0x%x)", op);
1680 if (user_data != NULL) {
1684 return TCORE_RETURN_FAILURE;
1686 user_data->flavor_type = (int) (barring->mode);
1687 user_data->class = barring->class;
1689 ret = _ss_request_message(pending, o, ur, on_response_ss_barring_set, user_data);
1693 dbg("AT request sent failed ");
1694 if (user_data != NULL) {
1697 return TCORE_RETURN_FAILURE;
1699 return TCORE_RETURN_SUCCESS;
1702 static TReturn _ss_barring_get(CoreObject *o,
1704 enum telephony_ss_class class,
1705 enum telephony_ss_barring_mode mode,
1706 enum tcore_response_command resp)
1708 struct ss_confirm_info *user_data = 0;
1709 gboolean ret = FALSE;
1710 char *cmd_str = NULL;
1712 char *facility = NULL;
1714 TcorePending *pending = NULL;
1715 TcoreATRequest *req;
1717 dbg("function enter");
1719 // query status - opco is fixed to 2
1723 case SS_BARR_MODE_BAOC:
1727 case SS_BARR_MODE_BOIC:
1731 case SS_BARR_MODE_BOIC_NOT_HC:
1735 case SS_BARR_MODE_BAIC:
1739 case SS_BARR_MODE_BIC_ROAM:
1743 case SS_BARR_MODE_AB:
1744 case SS_BARR_MODE_AOB:
1745 case SS_BARR_MODE_AIB:
1746 case SS_BARR_MODE_BIC_NOT_SIM:
1748 dbg("unsupported mode %d", mode);
1749 return TCORE_RETURN_FAILURE;
1752 dbg("facility - %s", facility);
1755 case SS_CLASS_ALL_TELE:
1759 case SS_CLASS_VOICE:
1763 case SS_CLASS_ALL_DATA_TELE:
1775 case SS_CLASS_ALL_CS_SYNC:
1781 dbg("unsupported class %d. set to default : 7", class);
1784 dbg("class - %d", classx);
1787 cmd_str = g_strdup_printf("AT+CLCK=\"%s\",%d", facility, opco);
1789 cmd_str = g_strdup_printf("AT+CLCK=\"%s\",%d,,%d", facility, opco, classx);
1791 dbg("request command : %s", cmd_str);
1793 hal = tcore_object_get_hal(o);
1794 pending = tcore_pending_new(o, 0);
1795 req = tcore_at_request_new(cmd_str, "+CLCK", TCORE_AT_MULTILINE);
1796 dbg("cmd : %s, prefix(if any) :%s, cmd_len : %d", req->cmd, req->prefix, strlen(req->cmd));
1798 tcore_pending_set_request_data(pending, 0, req);
1800 user_data = g_new0(struct ss_confirm_info, 1);
1801 user_data->resp = resp;
1802 user_data->flavor_type = (int) (mode);
1803 user_data->class = class;
1805 ret = _ss_request_message(pending, o, ur, on_response_ss_barring_get, user_data);
1809 dbg("AT request sent failed ");
1810 if (user_data != NULL) {
1813 return TCORE_RETURN_FAILURE;
1816 return TCORE_RETURN_SUCCESS;
1819 static TReturn s_ss_barring_activate(CoreObject *o, UserRequest *ur)
1821 if(FALSE == tcore_hal_get_power_state(tcore_object_get_hal(o))){
1822 dbg("cp not ready/n");
1823 return TCORE_RETURN_ENOSYS;
1825 return _ss_barring_set(o, ur, SS_OPCO_ACTIVATE);
1828 static TReturn s_ss_barring_deactivate(CoreObject *o, UserRequest *ur)
1830 if(FALSE == tcore_hal_get_power_state(tcore_object_get_hal(o))){
1831 dbg("cp not ready/n");
1832 return TCORE_RETURN_ENOSYS;
1834 return _ss_barring_set(o, ur, SS_OPCO_DEACTIVATE);
1837 static TReturn s_ss_barring_change_password(CoreObject *o, UserRequest *ur)
1840 TcorePending *pending = NULL;
1841 TcoreATRequest *req;
1842 struct treq_ss_barring_change_password *barring = 0;
1843 struct ss_confirm_info *user_data = 0;
1844 char *cmd_str = NULL;
1845 gboolean ret = FALSE;
1846 char old_password[MAX_SS_BARRING_PASSWORD_LEN + 1];
1847 char new_password[MAX_SS_BARRING_PASSWORD_LEN + 1];
1849 dbg("function enter");
1851 if(FALSE == tcore_hal_get_power_state(tcore_object_get_hal(o))){
1852 dbg("cp not ready/n");
1853 return TCORE_RETURN_ENOSYS;
1856 barring = (struct treq_ss_barring_change_password *) tcore_user_request_ref_data(ur, 0);
1858 if (barring->password_old == NULL || barring->password_new == NULL) {
1859 dbg("[error]password is null");
1860 return TCORE_RETURN_FAILURE;
1862 memcpy(old_password, barring->password_old, MAX_SS_BARRING_PASSWORD_LEN);
1863 old_password[MAX_SS_BARRING_PASSWORD_LEN] = '\0';
1864 memcpy(new_password, barring->password_new, MAX_SS_BARRING_PASSWORD_LEN);
1865 new_password[MAX_SS_BARRING_PASSWORD_LEN] = '\0';
1867 dbg("old passwd - %s new passwd- %s", old_password, new_password);
1868 cmd_str = g_strdup_printf("AT+CPWD=\"%s\",\"%s\",\"%s\"", "AB", old_password, new_password);
1869 dbg("request command : %s", cmd_str);
1871 hal = tcore_object_get_hal(o);
1872 pending = tcore_pending_new(o, 0);
1873 req = tcore_at_request_new(cmd_str, NULL, TCORE_AT_NO_RESULT);
1874 dbg("cmd : %s, prefix(if any) :%s, cmd_len : %d", req->cmd, req->prefix, strlen(req->cmd));
1876 tcore_pending_set_request_data(pending, 0, req);
1878 user_data = g_new0(struct ss_confirm_info, 1);
1879 user_data->resp = TRESP_SS_BARRING_CHANGE_PASSWORD;
1881 ret = _ss_request_message(pending, o, ur, on_response_ss_barring_change_pwd, user_data);
1884 dbg("AT request sent failed ");
1885 if (user_data != NULL) {
1888 return TCORE_RETURN_FAILURE;
1890 return TCORE_RETURN_SUCCESS;
1893 static TReturn s_ss_barring_get_status(CoreObject *o, UserRequest *ur)
1895 struct treq_ss_barring *barring = 0;
1897 if(FALSE == tcore_hal_get_power_state(tcore_object_get_hal(o))){
1898 dbg("cp not ready/n");
1899 return TCORE_RETURN_ENOSYS;
1901 barring = (struct treq_ss_barring *) tcore_user_request_ref_data(ur, 0);
1903 return _ss_barring_get(o, ur, barring->class, barring->mode, TRESP_SS_BARRING_GET_STATUS);
1906 static TReturn _ss_forwarding_set(CoreObject *o, UserRequest *ur, enum telephony_ss_opcode op)
1908 struct treq_ss_forwarding *forwarding = 0;
1909 struct ss_confirm_info *user_data = 0;
1910 gboolean ret = FALSE;
1912 char *cmd_str = NULL;
1913 char *tmp_str = NULL;
1914 int reason = 0, mode = 0, num_type = 0, classx = 0, time = 0;
1915 gboolean valid_num = FALSE;
1917 TcorePending *pending = NULL;
1918 TcoreATRequest *req;
1920 dbg("_ss_forwarding_set with opco %d ", op);
1922 forwarding = (struct treq_ss_forwarding *) tcore_user_request_ref_data(ur, 0);
1923 switch (forwarding->mode) {
1924 case SS_CF_MODE_CFU:
1928 case SS_CF_MODE_CFB:
1932 case SS_CF_MODE_CFNRy:
1936 case SS_CF_MODE_CFNRc:
1940 case SS_CF_MODE_CF_ALL:
1944 case SS_CF_MODE_CFC:
1949 dbg("unsupported reason : %d");
1950 return TCORE_RETURN_FAILURE;
1954 dbg("reason = %d", reason);
1956 case SS_OPCO_DEACTIVATE:
1960 case SS_OPCO_ACTIVATE:
1973 dbg("unsupported opco : %d", op);
1974 return TCORE_RETURN_FAILURE;
1977 dbg("mode = %d", mode);
1980 switch (forwarding->class) {
1981 case SS_CLASS_ALL_TELE:
1985 case SS_CLASS_VOICE:
1989 case SS_CLASS_ALL_DATA_TELE:
2001 case SS_CLASS_ALL_CS_SYNC:
2007 dbg("unsupported class %d. set to default : 7", forwarding->class);
2010 dbg("classx = %d", classx);
2013 len = strlen(forwarding->number);
2016 if (forwarding->number[0] == '+')
2017 num_type = ((NUM_TYPE_INTERNATIONAL << 4) | NUM_PLAN_ISDN);
2021 dbg("number = %s", forwarding->number);
2023 user_data = g_new0(struct ss_confirm_info, 1);
2027 user_data->resp = TRESP_SS_FORWARDING_REGISTER;
2031 user_data->resp = TRESP_SS_FORWARDING_DEREGISTER;
2034 case SS_OPCO_ACTIVATE:
2035 user_data->resp = TRESP_SS_FORWARDING_ACTIVATE;
2038 case SS_OPCO_DEACTIVATE:
2039 user_data->resp = TRESP_SS_FORWARDING_DEACTIVATE;
2043 dbg("[ error ] unknown op (0x%x)", op);
2047 if (forwarding->number[0] == '+')
2052 if (op == SS_OPCO_REG)
2053 tmp_str = g_strdup_printf("AT+CCFC=%d,%d,\"%s\",%d,%d", reason, mode, forwarding->number, num_type, classx);
2054 else // other opcode does not need num field
2055 tmp_str = g_strdup_printf("AT+CCFC=%d,%d,,,%d", reason, mode, classx);
2057 if (forwarding->mode == SS_CF_MODE_CFNRy) {
2058 // add time info to 'no reply' case
2059 time = (int) (forwarding->time);
2060 cmd_str = g_strdup_printf("%s,,,%d", tmp_str, time);
2062 cmd_str = g_strdup_printf("%s", tmp_str);
2065 dbg("request command : %s", cmd_str);
2066 hal = tcore_object_get_hal(o);
2067 pending = tcore_pending_new(o, 0);
2068 req = tcore_at_request_new(cmd_str, NULL, TCORE_AT_NO_RESULT);
2069 dbg("cmd : %s, prefix(if any) :%s, cmd_len : %d", req->cmd, req->prefix, strlen(req->cmd));
2071 tcore_pending_set_request_data(pending, 0, req);
2073 user_data->flavor_type = forwarding->mode;
2074 user_data->class = forwarding->class;
2076 ret = _ss_request_message(pending, o, ur, on_response_ss_forwarding_set, user_data);
2082 dbg("AT request sent failed ");
2083 if (user_data != NULL) {
2086 return TCORE_RETURN_FAILURE;
2089 return TCORE_RETURN_SUCCESS;
2092 static TReturn _ss_forwarding_get(CoreObject *o,
2094 enum telephony_ss_class class,
2095 enum telephony_ss_forwarding_mode type,
2096 enum tcore_response_command resp)
2098 struct ss_confirm_info *user_data = 0;
2099 gboolean ret = FALSE;
2100 char *cmd_str = NULL;
2101 int reason = 0, mode = 0, classx = 0;
2103 TcorePending *pending = NULL;
2104 TcoreATRequest *req;
2106 dbg("function enter");
2109 case SS_CF_MODE_CFU:
2113 case SS_CF_MODE_CFB:
2117 case SS_CF_MODE_CFNRy:
2121 case SS_CF_MODE_CFNRc:
2125 case SS_CF_MODE_CF_ALL:
2129 case SS_CF_MODE_CFC:
2134 dbg("unsupported reason : %d");
2137 dbg("reason = %d", reason);
2140 case SS_CLASS_ALL_TELE:
2144 case SS_CLASS_VOICE:
2148 case SS_CLASS_ALL_DATA_TELE:
2160 case SS_CLASS_ALL_CS_SYNC:
2166 dbg("unsupported class %d. set to default : 7", class);
2170 dbg("classx = %d", classx);
2172 // query status - mode set to 2
2174 user_data = g_new0(struct ss_confirm_info, 1);
2175 user_data->resp = resp;
2176 user_data->class = class;
2177 user_data->flavor_type = type;
2180 cmd_str = g_strdup_printf("AT+CCFC=%d,%d", reason, mode);
2182 cmd_str = g_strdup_printf("AT+CCFC=%d,%d,,,%d", reason, mode, classx);
2184 dbg("request command : %s", cmd_str);
2186 hal = tcore_object_get_hal(o);
2187 pending = tcore_pending_new(o, 0);
2188 req = tcore_at_request_new(cmd_str, "+CCFC", TCORE_AT_MULTILINE);
2189 dbg("cmd : %s, prefix(if any) :%s, cmd_len : %d", req->cmd, req->prefix, strlen(req->cmd));
2191 tcore_pending_set_request_data(pending, 0, req);
2193 ret = _ss_request_message(pending, o, ur, on_response_ss_forwarding_get, user_data);
2197 dbg("AT request sent failed ");
2198 if (user_data != NULL) {
2201 return TCORE_RETURN_FAILURE;
2204 return TCORE_RETURN_SUCCESS;
2207 static TReturn s_ss_forwarding_activate(CoreObject *o, UserRequest *ur)
2209 if(FALSE == tcore_hal_get_power_state(tcore_object_get_hal(o))){
2210 dbg("cp not ready/n");
2211 return TCORE_RETURN_ENOSYS;
2213 return _ss_forwarding_set(o, ur, SS_OPCO_ACTIVATE);
2216 static TReturn s_ss_forwarding_deactivate(CoreObject *o, UserRequest *ur)
2218 if(FALSE == tcore_hal_get_power_state(tcore_object_get_hal(o))){
2219 dbg("cp not ready/n");
2220 return TCORE_RETURN_ENOSYS;
2222 return _ss_forwarding_set(o, ur, SS_OPCO_DEACTIVATE);
2225 static TReturn s_ss_forwarding_register(CoreObject *o, UserRequest *ur)
2227 if(FALSE == tcore_hal_get_power_state(tcore_object_get_hal(o))){
2228 dbg("cp not ready/n");
2229 return TCORE_RETURN_ENOSYS;
2231 return _ss_forwarding_set(o, ur, SS_OPCO_REG);
2234 static TReturn s_ss_forwarding_deregister(CoreObject *o, UserRequest *ur)
2236 if(FALSE == tcore_hal_get_power_state(tcore_object_get_hal(o))){
2237 dbg("cp not ready/n");
2238 return TCORE_RETURN_ENOSYS;
2240 return _ss_forwarding_set(o, ur, SS_OPCO_DEREG);
2243 static TReturn s_ss_forwarding_get_status(CoreObject *o, UserRequest *ur)
2245 struct treq_ss_forwarding *forwarding = 0;
2247 if(FALSE == tcore_hal_get_power_state(tcore_object_get_hal(o))){
2248 dbg("cp not ready/n");
2249 return TCORE_RETURN_ENOSYS;
2252 forwarding = (struct treq_ss_forwarding *) tcore_user_request_ref_data(ur, 0);
2254 return _ss_forwarding_get(o, ur, forwarding->class, forwarding->mode, TRESP_SS_FORWARDING_GET_STATUS);
2258 static TReturn _ss_waiting_set(CoreObject *o, UserRequest *ur, enum telephony_ss_opcode opco)
2260 struct treq_ss_waiting *waiting = 0;
2261 struct ss_confirm_info *user_data = 0;
2262 gboolean ret = FALSE;
2263 int mode = 0, classx = 0;
2266 TcorePending *pending = NULL;
2267 TcoreATRequest *req;
2269 dbg("function enter ");
2270 waiting = (struct treq_ss_waiting *) tcore_user_request_ref_data(ur, 0);
2271 user_data = g_new0(struct ss_confirm_info, 1);
2273 if (opco == SS_OPCO_ACTIVATE) {
2274 user_data->resp = TRESP_SS_WAITING_ACTIVATE;
2276 } else if (opco == SS_OPCO_DEACTIVATE) {
2277 user_data->resp = TRESP_SS_WAITING_DEACTIVATE;
2278 mode = 0; // disable
2280 dbg("[ error ] unknown ss mode (0x%x)", opco);
2282 switch (waiting->class) {
2283 case SS_CLASS_ALL_TELE:
2287 case SS_CLASS_VOICE:
2291 case SS_CLASS_ALL_DATA_TELE:
2305 dbg("unsupported class %d. set to default : 1", waiting->class);
2308 dbg("mode = %d classxx- %d", mode, classx);
2310 user_data->class = waiting->class;
2311 user_data->flavor_type = (int) opco;
2313 cmd_str = g_strdup_printf("AT+CCWA=1,%d,%d", mode, classx); // always enable +CCWA: unsolicited cmd
2314 dbg("request command : %s", cmd_str);
2316 hal = tcore_object_get_hal(o);
2317 pending = tcore_pending_new(o, 0);
2318 req = tcore_at_request_new(cmd_str, NULL, TCORE_AT_NO_RESULT);
2319 dbg("cmd : %s, prefix(if any) :%s, cmd_len : %d", req->cmd, req->prefix, strlen(req->cmd));
2321 tcore_pending_set_request_data(pending, 0, req);
2323 ret = _ss_request_message(pending, o, ur, on_response_ss_waiting_set, user_data);
2326 dbg("AT request sent failed ");
2327 if (user_data != NULL) {
2330 return TCORE_RETURN_FAILURE;
2332 return TCORE_RETURN_SUCCESS;
2335 static TReturn _ss_waiting_get(CoreObject *o,
2337 enum telephony_ss_class class,
2338 enum tcore_response_command resp)
2340 struct ss_confirm_info *user_data = 0;
2341 gboolean ret = FALSE;
2342 int classx; // mode,
2345 TcorePending *pending = NULL;
2346 TcoreATRequest *req;
2348 dbg("function enter");
2350 case SS_CLASS_ALL_TELE:
2354 case SS_CLASS_VOICE:
2358 case SS_CLASS_ALL_DATA_TELE:
2372 dbg("unsupported class %d. set to default : 7", class);
2375 dbg("classx - %d", classx);
2377 dbg("allocating user data");
2378 user_data = g_new0(struct ss_confirm_info, 1);
2379 user_data->resp = resp;
2380 user_data->class = class;
2382 cmd_str = g_strdup_printf("AT+CCWA=1,2,%d", classx); // always enable +CCWA: unsolicited cmd , mode is fixed to 2(query status)
2383 dbg("request cmd : %s", cmd_str);
2385 hal = tcore_object_get_hal(o);
2386 pending = tcore_pending_new(o, 0);
2387 req = tcore_at_request_new(cmd_str, "+CCWA", TCORE_AT_MULTILINE);
2388 dbg("cmd : %s, prefix(if any) :%s, cmd_len : %d", req->cmd, req->prefix, strlen(req->cmd));
2390 tcore_pending_set_request_data(pending, 0, req);
2392 ret = _ss_request_message(pending, o, ur, on_response_ss_waiting_get, user_data);
2395 dbg("AT request sent failed ");
2396 if (user_data != NULL) {
2399 return TCORE_RETURN_FAILURE;
2401 return TCORE_RETURN_SUCCESS;
2404 static TReturn s_ss_waiting_activate(CoreObject *o, UserRequest *ur)
2406 if(FALSE == tcore_hal_get_power_state(tcore_object_get_hal(o))){
2407 dbg("cp not ready/n");
2408 return TCORE_RETURN_ENOSYS;
2410 return _ss_waiting_set(o, ur, SS_OPCO_ACTIVATE);
2413 static TReturn s_ss_waiting_deactivate(CoreObject *o, UserRequest *ur)
2415 if(FALSE == tcore_hal_get_power_state(tcore_object_get_hal(o))){
2416 dbg("cp not ready/n");
2417 return TCORE_RETURN_ENOSYS;
2419 return _ss_waiting_set(o, ur, SS_OPCO_DEACTIVATE);
2422 static TReturn s_ss_waiting_get_status(CoreObject *o, UserRequest *ur)
2424 struct treq_ss_waiting *waiting = 0;
2426 if(FALSE == tcore_hal_get_power_state(tcore_object_get_hal(o))){
2427 dbg("cp not ready/n");
2428 return TCORE_RETURN_ENOSYS;
2430 waiting = (struct treq_ss_waiting *) tcore_user_request_ref_data(ur, 0);
2432 return _ss_waiting_get(o, ur, waiting->class, TRESP_SS_WAITING_GET_STATUS);
2435 static TReturn s_ss_cli_activate(CoreObject *o, UserRequest *ur)
2437 if(FALSE == tcore_hal_get_power_state(tcore_object_get_hal(o))){
2438 dbg("cp not ready/n");
2439 return TCORE_RETURN_ENOSYS;
2441 return TCORE_RETURN_SUCCESS;
2444 static TReturn s_ss_cli_deactivate(CoreObject *o, UserRequest *ur)
2446 if(FALSE == tcore_hal_get_power_state(tcore_object_get_hal(o))){
2447 dbg("cp not ready/n");
2448 return TCORE_RETURN_ENOSYS;
2450 return TCORE_RETURN_SUCCESS;
2453 static TReturn s_ss_cli_get_status(CoreObject *o, UserRequest *ur)
2455 struct treq_ss_cli *cli = 0;
2456 gboolean ret = FALSE;
2457 char *cmd_prefix = NULL, *rsp_prefix = NULL, *cmd_str = NULL;
2458 enum telephony_ss_cli_type *user_data = 0;
2460 TcorePending *pending = NULL;
2461 TcoreATRequest *req;
2463 if(FALSE == tcore_hal_get_power_state(tcore_object_get_hal(o))){
2464 dbg("cp not ready/n");
2465 return TCORE_RETURN_ENOSYS;
2468 cli = (struct treq_ss_cli *) tcore_user_request_ref_data(ur, 0);
2469 switch (cli->type) {
2470 case SS_CLI_TYPE_CLIP:
2471 cmd_prefix = "+CLIP";
2472 rsp_prefix = "+CLIP";
2475 case SS_CLI_TYPE_CLIR:
2476 cmd_prefix = "+CLIR";
2477 rsp_prefix = "+CLIR";
2480 case SS_CLI_TYPE_COLP:
2481 cmd_prefix = "+COLP";
2482 rsp_prefix = "+COLP";
2485 case SS_CLI_TYPE_COLR:
2486 cmd_prefix = "+COLR";
2487 rsp_prefix = "+COLR";
2490 case SS_CLI_TYPE_CNAP:
2491 cmd_prefix = "+CNAP";
2492 rsp_prefix = "+CNAP";
2495 case SS_CLI_TYPE_CDIP:
2497 dbg("unsupported cli_type : %d", cli->type);
2498 return TCORE_RETURN_FAILURE;
2501 dbg("cmd_prefix : %s", cmd_prefix);
2503 cmd_str = g_strdup_printf("AT%s?", cmd_prefix);
2504 dbg("request cmd : %s", cmd_str);
2506 user_data = g_new0(enum telephony_ss_cli_type, 1);
2507 *user_data = cli->type;
2509 hal = tcore_object_get_hal(o);
2510 pending = tcore_pending_new(o, 0);
2512 req = tcore_at_request_new(cmd_str, rsp_prefix, TCORE_AT_SINGLELINE);
2513 dbg("cmd : %s, prefix(if any) :%s, cmd_len : %d", req->cmd, req->prefix, strlen(req->cmd));
2514 tcore_pending_set_request_data(pending, 0, req);
2516 ret = _ss_request_message(pending, o, ur, on_response_ss_cli_get, user_data);
2519 dbg("AT request sent failed ");
2520 if (user_data != NULL) {
2523 return TCORE_RETURN_FAILURE;
2525 return TCORE_RETURN_SUCCESS;
2528 static TReturn s_ss_send_ussd(CoreObject *o, UserRequest *ur)
2530 UssdSession *ussd_s = 0;
2531 struct treq_ss_ussd *ussd = 0;
2532 struct ss_confirm_info *user_data = 0;
2533 gboolean ret = FALSE;
2536 TcorePending *pending = NULL;
2537 TcoreATRequest *req;
2539 dbg("function enter");
2541 if(FALSE == tcore_hal_get_power_state(tcore_object_get_hal(o))){
2542 dbg("cp not ready/n");
2543 return TCORE_RETURN_ENOSYS;
2546 ussd = (struct treq_ss_ussd *) tcore_user_request_ref_data(ur, 0);
2547 cmd_str = g_strdup_printf("AT+CUSD=1,\"%s\",%d", ussd->str, 0x0f); // always enable +CUSD: unsolicited cmd. set to dcs to 0x0f. only supports HEX type
2548 dbg("request command : %s", cmd_str);
2550 user_data = g_new0(struct ss_confirm_info, 1);
2551 user_data->resp = TRESP_SS_SEND_USSD;
2552 ussd_s = tcore_ss_ussd_get_session(o);
2554 dbg("USSD session does not exist");
2555 tcore_ss_ussd_create_session(o, (enum tcore_ss_ussd_type) ussd->type, (void *) tcore_user_request_ref(ur), 0);
2557 if (ussd->type == SS_USSD_TYPE_USER_INITIATED) {
2558 dbg("[ error ] ussd session is already exist");
2560 return TCORE_RETURN_FAILURE;
2563 tcore_ss_ussd_set_session_type(ussd_s, (enum tcore_ss_ussd_type) ussd->type);
2566 hal = tcore_object_get_hal(o);
2567 pending = tcore_pending_new(o, 0);
2568 req = tcore_at_request_new(cmd_str, NULL, TCORE_AT_NO_RESULT);
2569 dbg("cmd : %s, prefix(if any) :%s, cmd_len : %d", req->cmd, req->prefix, strlen(req->cmd));
2571 tcore_pending_set_request_data(pending, 0, req);
2573 ret = _ss_request_message(pending, o, ur, on_confirmation_ss_ussd, user_data);
2577 dbg("AT request sent failed ");
2578 if (user_data != NULL) {
2581 return TCORE_RETURN_FAILURE;
2583 return TCORE_RETURN_SUCCESS;
2586 static TReturn s_ss_set_aoc(CoreObject *o, UserRequest *ur)
2588 if(FALSE == tcore_hal_get_power_state(tcore_object_get_hal(o))){
2589 dbg("cp not ready/n");
2590 return TCORE_RETURN_ENOSYS;
2593 dbg("[ error ] unsupported function");
2594 return TCORE_RETURN_SUCCESS;
2597 static TReturn s_ss_get_aoc(CoreObject *o, UserRequest *ur)
2599 if(FALSE == tcore_hal_get_power_state(tcore_object_get_hal(o))){
2600 dbg("cp not ready/n");
2601 return TCORE_RETURN_ENOSYS;
2604 dbg("[ error ] unsupported function");
2605 return TCORE_RETURN_SUCCESS;
2609 static struct tcore_call_control_operations call_ops = {
2610 .answer_hold_and_accept = s_ss_manage_call_2_send,
2611 .answer_replace = s_ss_manage_call_1_send,
2612 .answer_reject = s_ss_manage_call_0_send,
2613 .end_specific = s_ss_manage_call_1x_send,
2614 .end_all_active = s_ss_manage_call_1_send,
2615 .end_all_held = s_ss_manage_call_0_send,
2616 .active = s_ss_manage_call_2_send,
2617 .hold = s_ss_manage_call_2_send,
2618 .swap = s_ss_manage_call_2_send,
2619 .join = s_ss_manage_call_3_send,
2620 .split = s_ss_manage_call_2x_send,
2621 .transfer = s_ss_manage_call_4_send,
2622 .deflect = s_ss_manage_call_4dn_send,
2625 static TReturn s_ss_manage_call_send(CoreObject *o, UserRequest *ur, const char *cmd, ConfirmCallback cb, void *user_data)
2627 TcorePending *pending = NULL;
2628 TcoreATRequest *req;
2629 gboolean ret = FALSE;
2631 pending = tcore_pending_new(o, 0);
2632 req = tcore_at_request_new(cmd, NULL, TCORE_AT_NO_RESULT);
2633 dbg("cmd : %s, prefix(if any) :%s, cmd_len : %d", req->cmd, req->prefix, strlen(req->cmd));
2634 tcore_pending_set_request_data(pending, 0, req);
2636 ret = _ss_request_message(pending, o, ur, (TcorePendingResponseCallback) cb, user_data);
2638 dbg("AT request sent failed ");
2639 return TCORE_RETURN_FAILURE;
2641 return TCORE_RETURN_SUCCESS;
2644 static TReturn s_ss_manage_call_0_send(CoreObject *o, UserRequest *ur, ConfirmCallback cb, void *user_data)
2646 char *cmd_str = NULL;
2647 gboolean ret = FALSE;
2649 dbg("function enter");
2650 cmd_str = g_strdup_printf("%s", "AT+CHLD=0");
2651 dbg("cmd : %s, prefix(if any) : %s, cmd_len : %d", cmd_str, "N/A", strlen(cmd_str));
2653 ret = s_ss_manage_call_send(o, ur, cmd_str, cb, user_data);
2658 static TReturn s_ss_manage_call_1_send(CoreObject *o, UserRequest *ur, ConfirmCallback cb, void *user_data)
2660 char *cmd_str = NULL;
2661 gboolean ret = FALSE;
2663 dbg("function enter");
2664 cmd_str = g_strdup_printf("%s", "AT+CHLD=1");
2665 dbg("cmd : %s, prefix(if any) : %s, cmd_len : %d", cmd_str, "N/A", strlen(cmd_str));
2667 ret = s_ss_manage_call_send(o, ur, cmd_str, cb, user_data);
2672 static TReturn s_ss_manage_call_1x_send(CoreObject *o, UserRequest *ur, const int id, ConfirmCallback cb, void *user_data)
2674 char *cmd_str = NULL;
2675 gboolean ret = FALSE;
2677 dbg("function enter");
2678 cmd_str = g_strdup_printf("%s%d", "AT+CHLD=1", id);
2679 dbg("cmd : %s, prefix(if any) : %s, cmd_len : %d", cmd_str, "N/A", strlen(cmd_str));
2681 ret = s_ss_manage_call_send(o, ur, cmd_str, cb, user_data);
2686 static TReturn s_ss_manage_call_2_send(CoreObject *o, UserRequest *ur, ConfirmCallback cb, void *user_data)
2688 char *cmd_str = NULL;
2689 gboolean ret = FALSE;
2691 dbg("function enter");
2692 cmd_str = g_strdup_printf("%s", "AT+CHLD=2");
2693 dbg("cmd : %s, prefix(if any) : %s, cmd_len : %d", cmd_str, "N/A", strlen(cmd_str));
2695 ret = s_ss_manage_call_send(o, ur, cmd_str, cb, user_data);
2700 static TReturn s_ss_manage_call_2x_send(CoreObject *o, UserRequest *ur, const int id, ConfirmCallback cb, void *user_data)
2702 char *cmd_str = NULL;
2703 gboolean ret = FALSE;
2705 dbg("function enter");
2706 cmd_str = g_strdup_printf("%s%d", "AT+CHLD=2", id);
2707 dbg("cmd : %s, prefix(if any) : %s, cmd_len : %d", cmd_str, "N/A", strlen(cmd_str));
2709 ret = s_ss_manage_call_send(o, ur, cmd_str, cb, user_data);
2714 static TReturn s_ss_manage_call_3_send(CoreObject *o, UserRequest *ur, ConfirmCallback cb, void *user_data)
2716 char *cmd_str = NULL;
2717 gboolean ret = FALSE;
2719 dbg("function enter");
2720 cmd_str = g_strdup_printf("%s", "AT+CHLD=3");
2722 ret = s_ss_manage_call_send(o, ur, cmd_str, cb, user_data);
2728 static TReturn s_ss_manage_call_4_send(CoreObject *o, UserRequest *ur, ConfirmCallback cb, void *user_data)
2730 char *cmd_str = NULL;
2731 gboolean ret = FALSE;
2733 dbg("function enter");
2734 cmd_str = g_strdup_printf("%s", "AT+CHLD=4");
2736 ret = s_ss_manage_call_send(o, ur, cmd_str, cb, user_data);
2741 static TReturn s_ss_manage_call_4dn_send(CoreObject *o, UserRequest *ur, const char *number, ConfirmCallback cb, void *user_data)
2743 char *cmd_str = NULL;
2744 gboolean ret = FALSE;
2746 dbg("function enter");
2747 cmd_str = g_strdup_printf("%s%s", "AT+CHLD=4", number);
2749 ret = s_ss_manage_call_send(o, ur, cmd_str, cb, user_data);
2755 gboolean s_ss_init(TcorePlugin *cp, CoreObject *co_ss)
2757 CoreObject *co_call = NULL;
2759 tcore_ss_override_ops(co_ss, &ss_ops);
2762 co_call = tcore_plugin_ref_core_object(cp,
2763 CORE_OBJECT_TYPE_CALL);
2764 if (co_call == NULL) {
2765 err("Can't find CALL core object");
2769 tcore_call_override_ops(co_call, NULL, &call_ops);
2771 tcore_object_override_callback(co_ss, "+CSSU", on_notification_ss_info, NULL);
2772 tcore_object_override_callback(co_ss, "+CSSI", on_notification_ss_info, NULL);
2773 tcore_object_override_callback(co_ss, "+CUSD", on_notification_ss_ussd, NULL);
2778 void s_ss_exit(TcorePlugin *cp, CoreObject *co_ss)