4 * Copyright (c) 2012 Samsung Electronics Co., Ltd. All rights reserved.
6 * Contact: Hayoon Ko <hayoon.ko@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>
41 #include "atchannel.h"
44 extern struct ATResponse *sp_response;
45 extern char *s_responsePrefix;
46 extern enum ATCommandType s_type;
51 enum telephony_ss_opcode {
52 TIZEN_SS_OPCO_REG=0x01, /* 0x01 : Registration */
53 TIZEN_SS_OPCO_DEREG, /* 0x02 : De-registration( erase ) */
54 TIZEN_SS_OPCO_ACTIVATE, /* 0x03 : Activation */
55 TIZEN_SS_OPCO_DEACTIVATE, /* 0x04 : De-activation */
60 struct ss_confirm_info {
61 enum telephony_ss_class class;
63 enum tcore_response_command resp;
68 #define TIZEN_NUM_TYPE_INTERNATIONAL 0x01
69 #define TIZEN_NUM_PLAN_ISDN 0x01
72 static gboolean _ss_request_message( CoreObject *o,
79 static TReturn _ss_general_response_result(const int result);
82 static TReturn _ss_barring_get( CoreObject *o,
84 enum telephony_ss_class class,
85 enum telephony_ss_barring_mode type,
86 enum tcore_response_command resp );
88 static TReturn _ss_forwarding_get( CoreObject *o,
90 enum telephony_ss_class class,
91 enum telephony_ss_forwarding_mode type,
92 enum tcore_response_command resp );
94 static TReturn _ss_waiting_get( CoreObject *o,
96 enum telephony_ss_class class,
97 enum tcore_response_command resp );
100 static TReturn s_ss_barring_activate( CoreObject *o, UserRequest *ur );
101 static TReturn s_ss_barring_deactivate( CoreObject *o, UserRequest *ur );
102 static TReturn s_ss_barring_change_password( CoreObject *o, UserRequest *ur );
103 static TReturn s_ss_barring_get_status( CoreObject *o, UserRequest *ur );
105 static TReturn s_ss_forwarding_activate( CoreObject *o, UserRequest *ur );
106 static TReturn s_ss_forwarding_deactivate( CoreObject *o, UserRequest *ur );
107 static TReturn s_ss_forwarding_register( CoreObject *o, UserRequest *ur );
108 static TReturn s_ss_forwarding_deregister( CoreObject *o, UserRequest *ur );
109 static TReturn s_ss_forwarding_get_status( CoreObject *o, UserRequest *ur );
111 static TReturn s_ss_waiting_activate( CoreObject *o, UserRequest *ur );
112 static TReturn s_ss_waiting_deactivate( CoreObject *o, UserRequest *ur );
113 static TReturn s_ss_waiting_get_status( CoreObject *o, UserRequest *ur );
115 static TReturn s_ss_cli_activate( CoreObject *o, UserRequest *ur );
116 static TReturn s_ss_cli_deactivate( CoreObject *o, UserRequest *ur );
117 static TReturn s_ss_cli_get_status( CoreObject *o, UserRequest *ur );
119 static TReturn s_ss_send_ussd( CoreObject *o, UserRequest *ur );
121 static TReturn s_ss_set_aoc( CoreObject *o, UserRequest *ur );
122 static TReturn s_ss_get_aoc( CoreObject *o, UserRequest *ur );
124 static TReturn s_ss_manage_call_0_send( CoreObject* o, UserRequest* ur, ConfirmCallback cb, void* user_data );
125 static TReturn s_ss_manage_call_1_send( CoreObject* o, UserRequest* ur, ConfirmCallback cb, void* user_data );
126 static TReturn s_ss_manage_call_1x_send( CoreObject* o, UserRequest* ur, const int id, ConfirmCallback cb, void* user_data );
127 static TReturn s_ss_manage_call_2_send( CoreObject* o, UserRequest* ur, ConfirmCallback cb, void* user_data );
128 static TReturn s_ss_manage_call_2x_send( CoreObject* o, UserRequest* ur, const int id, ConfirmCallback cb, void* user_data );
129 static TReturn s_ss_manage_call_3_send( CoreObject* o, UserRequest* ur, ConfirmCallback cb, void* user_data );
130 static TReturn s_ss_manage_call_4_send( CoreObject* o, UserRequest* ur, ConfirmCallback cb, void* user_data );
131 static TReturn s_ss_manage_call_4dn_send( CoreObject* o, UserRequest* ur, const char* number, ConfirmCallback cb, void* user_data );
133 static TReturn s_ss_manage_call_5_send( CoreObject* o, UserRequest* ur, ConfirmCallback cb, void* user_data );
134 static TReturn s_ss_manage_call_6_send( CoreObject* o, UserRequest* ur, ConfirmCallback cb, void* user_data );
137 static void on_confirmation_call_control_ss_message_send( TcorePending *p, gboolean result, void *user_data );
139 static void on_confirmation_ss_message_send( TcorePending *p, gboolean result, void *user_data );
142 static gboolean on_notification_ss_info( CoreObject *o, const void *data, void *user_data );
144 static void _ss_ussd_response( UserRequest *ur, const char* ussd_str, enum telephony_ss_ussd_type type, enum telephony_ss_ussd_status status );
145 static void _ss_ussd_notification( TcorePlugin *p, const char* ussd_str, enum telephony_ss_ussd_status status );
146 static gboolean on_notification_ss_ussd( CoreObject *o, const void *data, void *user_data );
149 static gboolean _ss_request_message( CoreObject *o,
152 unsigned int cmd_len,
156 TcorePending *pending = 0;
159 UserRequest *ur2 = 0;
161 ur2 = tcore_user_request_ref( ur );
163 pending = tcore_pending_new(o, ID_RESERVED_AT);
164 tcore_pending_set_request_data(pending, cmd_len, cmd);
165 tcore_pending_set_timeout(pending, 0);
168 tcore_pending_set_response_callback(pending, on_resp, user_data);
170 tcore_pending_set_send_callback(pending, on_confirmation_ss_message_send, 0);
173 dbg("[ check ] ur is 0, is this internal request??");
175 tcore_pending_link_user_request(pending, ur2);
178 p = tcore_object_ref_plugin(o);
179 h = tcore_object_get_hal(o);
180 tcore_hal_send_request(h, pending);
186 static TReturn _ss_general_response_result(const int ret)
188 if (ret == 0x8000 || ret == 0x8100) {
189 return TCORE_RETURN_SUCCESS;
192 return TCORE_RETURN_3GPP_ERROR + ret;
196 static void _ss_ussd_response( UserRequest *ur, const char* ussd_str, enum telephony_ss_ussd_type type, enum telephony_ss_ussd_status status )
198 struct tresp_ss_ussd resp;
201 dbg("[ error ] ur : (NULL)");
206 resp.status = status;
211 int len = strlen( ussd_str );
213 if ( len < MAX_SS_USSD_LEN ) {
214 memcpy( resp.str, ussd_str, len );
215 resp.str[ len ] = '\0';
217 memcpy( resp.str, ussd_str, MAX_SS_USSD_LEN );
218 resp.str[ MAX_SS_USSD_LEN - 1 ] = '\0';
221 dbg("resp.str : %s", resp.str);
225 memset( resp.str, '\0', MAX_SS_USSD_LEN );
229 tcore_user_request_send_response(ur, TRESP_SS_SEND_USSD, sizeof(struct tresp_ss_ussd), &resp);
232 static void _ss_ussd_notification( TcorePlugin *p, const char* ussd_str, enum telephony_ss_ussd_status status )
235 struct tnoti_ss_ussd noti;
238 dbg("[ error ] p : (NULL)");
242 noti.status = status;
246 int len = strlen( ussd_str );
248 if ( len < MAX_SS_USSD_LEN ) {
249 memcpy( noti.str, ussd_str, len );
250 noti.str[ len ] = '\0';
252 memcpy( noti.str, ussd_str, MAX_SS_USSD_LEN );
253 noti.str[ MAX_SS_USSD_LEN - 1 ] = '\0';
258 memset( noti.str, '\0', MAX_SS_USSD_LEN );
262 o = tcore_plugin_ref_core_object(p, "ss");
264 tcore_server_send_notification( tcore_plugin_ref_server(p),
267 sizeof(struct tnoti_ss_ussd),
272 static gboolean on_notification_ss_ussd( CoreObject *o, const void *data, void *user_data )
274 enum telephony_ss_ussd_status status;
275 UssdSession *ussd_session = 0;
276 char *ussd_str = 0, *cmd = 0, *tmp_str=0;
278 int err =0, m=0, dcs=0;
280 p = tcore_object_ref_plugin(o);
282 ussd_session = tcore_ss_ussd_get_session(o);
288 err = at_tok_nextint(&cmd, &m);
293 status = SS_USSD_NO_ACTION_REQUIRE;
297 status = SS_USSD_ACTION_REQUIRE;
301 status = SS_USSD_TERMINATED_BY_NET;
305 status = SS_USSD_OTHER_CLIENT;
309 status = SS_USSD_NOT_SUPPORT;
313 status = SS_USSD_TIME_OUT;
317 dbg("unsupported m : %d", m);
318 status = SS_USSD_MAX;
322 if(at_tok_hasmore(&cmd))
324 err = at_tok_nextstr(&cmd, &tmp_str);
325 err = at_tok_nextint(&cmd, &dcs);
327 dbg("ussdstr: %s, dcs :%d", tmp_str, dcs);
330 switch ( tcore_util_get_cbs_coding_scheme(dcs) ) {
331 case TCORE_DCS_TYPE_7_BIT:
332 case TCORE_DCS_TYPE_UNSPECIFIED: {
333 ussd_str = (char *)tcore_util_unpack_gsm7bit((const unsigned char *)tmp_str, strlen(tmp_str));
336 case TCORE_DCS_TYPE_UCS2:
337 case TCORE_DCS_TYPE_8_BIT: {
338 if ( strlen(tmp_str) > 0 ) {
339 ussd_str = g_new0( char, strlen(tmp_str) + 1);
340 memcpy( ussd_str,tmp_str, strlen(tmp_str) );
341 ussd_str[ strlen(tmp_str) ] = '\0';
345 dbg("[ error ] unknown dcs type. ussd_session : %x", ussd_session);
346 if ( ussd_session ) {
349 enum telephony_ss_ussd_type type;
351 tcore_ss_ussd_get_session_data( ussd_session, (void**)&ur );
353 dbg("[ error ] ur : (0)");
357 type = (enum telephony_ss_ussd_type)tcore_ss_ussd_get_session_type( ussd_session );
359 _ss_ussd_response( ur, ussd_str, type, status );
366 case SS_USSD_NO_ACTION_REQUIRE:
367 case SS_USSD_ACTION_REQUIRE:
368 case SS_USSD_OTHER_CLIENT:
369 case SS_USSD_NOT_SUPPORT:
370 case SS_USSD_TIME_OUT: {
372 // UserRequest *ur = 0;
374 if ( ussd_session ) {
377 enum telephony_ss_ussd_type type;
379 tcore_ss_ussd_get_session_data( ussd_session, (void**)&ur );
381 dbg("[ error ] ur : (0)");
385 type = (enum telephony_ss_ussd_type)tcore_ss_ussd_get_session_type( ussd_session );
387 _ss_ussd_response( ur, (const char*)ussd_str, type, status );
393 tcore_ss_ussd_create_session( o, TCORE_SS_USSD_TYPE_NETWORK_INITIATED, 0, 0 );
395 _ss_ussd_notification( p, (const char*)ussd_str, status );
401 case SS_USSD_TERMINATED_BY_NET: {
403 if ( ussd_session ) {
406 tcore_ss_ussd_get_session_data( ussd_session, (void**)&ur );
409 tcore_user_request_unref( ur );
411 tcore_ss_ussd_destroy_session( ussd_session );
422 static gboolean on_notification_ss_info( CoreObject *o, const void *data, void *user_data )
426 char* cmd = 0, *number = 0;
427 int code2 =0, err=0, index=0, ton=0;
430 p = tcore_object_ref_plugin( o );
431 co = tcore_plugin_ref_core_object( p, "call" );
433 dbg("[ error ] plugin_ref_core_object : call");
440 err = at_tok_nextint(&cmd, &code2);
441 dbg("code2 : %d",code2);
443 if(at_tok_hasmore(&cmd))
444 err = at_tok_nextint(&cmd, &index); //cug index - skip
445 if(at_tok_hasmore(&cmd)){
446 err = at_tok_nextstr(&cmd, &number);
447 dbg("number : %s",number);
448 err = at_tok_nextint(&cmd, &ton);
452 case 0: //this is a forwarded call (MT call setup)
453 tcore_call_information_mt_forwarded_call( co, number );
456 case 2: //call has been put on hold (during a voice call)
457 tcore_call_information_held( co, number );
460 case 3: //call has been retrieved (during a voice call)
461 tcore_call_information_active( co, number );
464 case 4: //multiparty call entered (during a voice call)
465 tcore_call_information_joined( co, number );
468 case 5: //call on hold has been released
469 tcore_call_information_released_on_hold( co, number );
472 case 6: //forward check SS message received (can be received whenever)
473 tcore_call_information_cf_check_ss_message( co, number );
476 case 7: //call is being connected (alerting) with the remote party in alerting state in explicit call transfer operation (during a voice call)
477 tcore_call_information_transfer_alert( co, number );
480 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)
481 tcore_call_information_transfered( co, number );
484 case 9: //this is a deflected call (MT call setup):
485 tcore_call_information_mt_deflected_call( co, number );
489 dbg("unsupported cmd2 : %d",code2);
496 static void on_confirmation_ss_message_send( TcorePending *p, gboolean result, void *user_data )
498 UserRequest* ur = NULL;
499 struct ATReqMetaInfo* metainfo = NULL;
500 unsigned int info_len =0;
501 dbg("on_confirmation_ss_message_send - msg out from queue. alloc ATRsp buffer & write rspPrefix if needed\n");
503 ReleaseResponse(); // release leftover
504 //alloc new sp_response
505 sp_response = at_response_new();
508 ur = tcore_pending_ref_user_request(p);
509 metainfo = (struct ATReqMetaInfo*)tcore_user_request_ref_metainfo(ur,&info_len);
511 if((metainfo->type == SINGLELINE)||
512 (metainfo->type == MULTILINE))
515 s_responsePrefix = strdup(metainfo->responsePrefix);
516 dbg("duplicating responsePrefix : %s\n", s_responsePrefix);
520 s_responsePrefix = NULL;
523 //set atcmd type into s_type
524 s_type = metainfo->type;
527 static void on_confirmation_call_control_ss_message_send( TcorePending *p, gboolean result, void *user_data )
529 UserRequest* ur = NULL;
530 struct ATReqMetaInfo* metainfo = NULL;
531 unsigned int info_len =0;
532 dbg("on_confirmation_call_control_ss_message_send - msg out from queue. alloc ATRsp buffer & write rspPrefix if needed\n");
534 ReleaseResponse(); // release leftover
535 //alloc new sp_response
536 sp_response = at_response_new();
539 ur = tcore_pending_ref_user_request(p);
540 metainfo = (struct ATReqMetaInfo*)tcore_user_request_ref_metainfo(ur,&info_len);
542 if((metainfo->type == SINGLELINE)||
543 (metainfo->type == MULTILINE))
546 s_responsePrefix = strdup(metainfo->responsePrefix);
547 dbg("duplicating responsePrefix : %s\n", s_responsePrefix);
551 s_responsePrefix = NULL;
554 //set atcmd type into s_type
555 s_type = metainfo->type;
558 static void on_response_ss_barring_set( TcorePending *p, int data_len, const void *data, void *user_data )
560 struct ss_confirm_info *info = 0;
561 enum telephony_ss_class class;
565 struct tresp_ss_general resp;
566 UserRequest *ur_dup=0;
568 o = tcore_pending_ref_core_object(p);
569 ur = tcore_pending_ref_user_request(p);
573 info = (struct ss_confirm_info*)user_data;
577 if(sp_response->success > 0){
578 resp.err = TCORE_RETURN_SUCCESS;
581 resp.err = TCORE_RETURN_FAILURE;
584 dbg("on_response_ss_barring_set - rsp.err : %d, ur : %x", resp.err, ur);
587 if(sp_response->success > 0)
591 if ( info->class == SS_CLASS_VOICE )
592 class = SS_CLASS_ALL_TELE_BEARER;
594 ur_dup = tcore_user_request_ref(ur);
596 if ( info->flavor_type == SS_BARR_MODE_AB ||
597 info->flavor_type == SS_BARR_MODE_AOB )
598 _ss_barring_get( o, ur_dup, class, SS_BARR_MODE_BAOC, info->resp );
599 else if ( info->flavor_type == SS_BARR_MODE_AIB )
600 _ss_barring_get( o, ur_dup, class, SS_BARR_MODE_BAIC, info->resp );
602 _ss_barring_get( o, ur_dup, class, info->flavor_type, info->resp );
610 tcore_user_request_send_response(ur, info->resp, sizeof(struct tresp_ss_general), &resp);
612 dbg("[ error ] ur is 0");
621 static void on_response_ss_barring_change_pwd( TcorePending *p, int data_len, const void *data, void *user_data )
623 struct ss_confirm_info *info = 0;
625 struct tresp_ss_general resp;
627 ur = tcore_pending_ref_user_request(p);
629 info = (struct ss_confirm_info*)user_data;
633 if(sp_response->success > 0){
634 resp.err = TCORE_RETURN_SUCCESS;
637 resp.err = TCORE_RETURN_FAILURE;
642 dbg("on_response_ss_barring_change_pwd: rsp.err : %d, usr : %x", resp.err, ur);
645 tcore_user_request_send_response(ur, info->resp, sizeof(struct tresp_ss_general), &resp);
647 dbg("[ error ] ur is 0");
653 static void on_response_ss_barring_get( TcorePending *p, int data_len, const void *data, void *user_data )
657 struct ATLine *p_cur;
658 int status=0, classx =0, err=0;
660 struct ss_confirm_info* info = 0;
661 struct tresp_ss_barring resp;
662 int countRecords=0, countValidRecords =0;
664 o = tcore_pending_ref_core_object(p);
665 ur = tcore_pending_ref_user_request(p);
669 info = (struct ss_confirm_info*)user_data;
671 /* count the calls */
672 for (countRecords = 0, p_cur = sp_response->p_intermediates
674 ; p_cur = p_cur->p_next
678 dbg("total records : %d",countRecords);
681 resp.record_num = countRecords;
683 if ( resp.record_num > 0 ) {
686 resp.record = g_new0( struct barring_info, resp.record_num );
688 for (countValidRecords = 0, p_cur = sp_response->p_intermediates
690 ; p_cur = p_cur->p_next)
692 err = at_tok_start(&(p_cur->line));
694 dbg("start line error. skip this line");
697 err = at_tok_nextint(&(p_cur->line), &status);// status
699 dbg("status error. skip this line");
704 resp.record[countValidRecords].status = SS_STATUS_ACTIVATE;
707 resp.record[countValidRecords].status = SS_STATUS_DEACTIVATE;
710 err = at_tok_nextint(&(p_cur->line), &classx); //class
712 dbg("class error. classx not exist - set to requested one : %d", info->class);
714 case SS_CLASS_ALL_TELE:
720 case SS_CLASS_ALL_DATA_TELE:
729 case SS_CLASS_ALL_CS_SYNC:
735 dbg("unsupported class %d. set to default : 7", info->class);
742 resp.record[countValidRecords].class = SS_CLASS_VOICE;
745 resp.record[countValidRecords].class = SS_CLASS_ALL_DATA_TELE;
748 resp.record[countValidRecords].class = SS_CLASS_FAX;
751 resp.record[countValidRecords].class = SS_CLASS_ALL_TELE;
754 resp.record[countValidRecords].class = SS_CLASS_SMS;
757 resp.record[countValidRecords].class = SS_CLASS_ALL_CS_SYNC;
760 resp.record[countValidRecords].class = SS_CLASS_ALL_CS_ASYNC;
763 dbg("unspoorted class : [%d]\n", classx );
768 resp.record[countValidRecords].mode = (enum telephony_ss_barring_mode)(info->flavor_type);
773 dbg("invalid field found. coutinue");
777 dbg("valid count :%d",countValidRecords);
778 resp.record_num = countValidRecords;
779 resp.err = TCORE_RETURN_SUCCESS;
784 dbg("no active status - return to user")
787 if(sp_response->success > 0){
788 resp.err = TCORE_RETURN_SUCCESS;
791 resp.err = TCORE_RETURN_FAILURE;
794 dbg("on_response_ss_barring_get- rsp.err : %d, ur : %x", resp.err, ur);
799 tcore_user_request_send_response(ur, info->resp, sizeof(struct tresp_ss_barring), &resp);
801 dbg("[ error ] ur is 0");
807 static void on_response_ss_forwarding_set( TcorePending *p, int data_len, const void *data, void *user_data )
810 UserRequest* ur = 0, *dup_ur=0;
811 struct ss_confirm_info *info = 0;
812 struct tresp_ss_general resp;
814 o = tcore_pending_ref_core_object(p);
815 ur = tcore_pending_ref_user_request(p);
817 info = (struct ss_confirm_info*)user_data;
821 if(sp_response->success > 0){
822 resp.err = TCORE_RETURN_SUCCESS;
824 resp.err = TCORE_RETURN_FAILURE;
827 dbg("[ check ] class : 0x%x", info->class );
828 dbg("[ check ] flavor_type : 0x%x", info->flavor_type );
830 dbg("on_response_ss_forwarding_set - rsp.err : %d, ur : %x", resp.err, ur);
832 if ( sp_response->success > 0) {
836 if ( info->flavor_type == SS_CF_MODE_CF_ALL ||
837 info->flavor_type == SS_CF_MODE_CFC ) {
840 tcore_user_request_send_response(ur, info->resp, sizeof(struct tresp_ss_general), &resp);
842 dbg("[ error ] ur is 0");
845 dup_ur = tcore_user_request_ref(ur);
846 _ss_forwarding_get( o, dup_ur, info->class, info->flavor_type, info->resp );
853 tcore_user_request_send_response(ur, info->resp, sizeof(struct tresp_ss_general), &resp);
855 dbg("[ error ] ur is 0");
861 static void on_response_ss_forwarding_get( TcorePending *p, int data_len, const void *data, void *user_data )
865 struct ATLine *p_cur;
866 int status=0, classx =0, err=0, ton =0, time=0;
869 struct ss_confirm_info* info = 0;
870 struct tresp_ss_forwarding resp;
871 int countRecords=0, countValidRecords =0;
873 o = tcore_pending_ref_core_object(p);
874 ur = tcore_pending_ref_user_request(p);
878 info = (struct ss_confirm_info*)user_data;
880 /* count the calls */
881 for (countRecords = 0, p_cur = sp_response->p_intermediates
883 ; p_cur = p_cur->p_next
887 dbg("total records : %d",countRecords);
890 resp.record_num = countRecords;
892 if ( resp.record_num > 0 ) {
895 resp.record = g_new0( struct forwarding_info, resp.record_num );
897 for (countValidRecords = 0, p_cur = sp_response->p_intermediates
899 ; p_cur = p_cur->p_next)
901 err = at_tok_start(&(p_cur->line));
903 dbg("start line error. skip this line");
906 err = at_tok_nextint(&(p_cur->line), &status);// status
908 dbg("status error. skip this line");
913 resp.record[countValidRecords].status = SS_STATUS_ACTIVATE;
916 resp.record[countValidRecords].status = SS_STATUS_DEACTIVATE;
919 err = at_tok_nextint(&(p_cur->line), &classx); //class
921 dbg("class error. skip this line");
927 resp.record[countValidRecords].class = SS_CLASS_VOICE;
930 resp.record[countValidRecords].class = SS_CLASS_ALL_DATA_TELE;
933 resp.record[countValidRecords].class = SS_CLASS_FAX;
936 resp.record[countValidRecords].class = SS_CLASS_ALL_TELE;
939 resp.record[countValidRecords].class = SS_CLASS_SMS;
942 resp.record[countValidRecords].class = SS_CLASS_ALL_CS_SYNC;
945 resp.record[countValidRecords].class = SS_CLASS_ALL_CS_ASYNC;
948 dbg("unspoorted class : [%d]\n", classx );
953 if(at_tok_hasmore(&(p_cur->line)) ==1){ //more data present
954 err = at_tok_nextstr(&(p_cur->line), &num); //number
955 memcpy((resp.record[countValidRecords].number), num, strlen(num));
956 resp.record[countValidRecords].number_present = TRUE;
958 err = at_tok_nextint(&(p_cur->line), &ton); // type of number - skip
959 resp.record[countValidRecords].number_type = ton;
961 if(at_tok_hasmore(&(p_cur->line)) ==1){
962 err = at_tok_nextstr(&(p_cur->line), &subaddr); //subaddr - skip
963 err =at_tok_nextint(&(p_cur->line), &ton); //ton of subaddr - skip
965 if(at_tok_hasmore(&(p_cur->line)) ==1){
966 err = at_tok_nextint(&(p_cur->line), &time); //time
967 resp.record[countValidRecords].time = (enum telephony_ss_forwarding_no_reply_time)time;
974 resp.record[countValidRecords].mode = (enum telephony_ss_barring_mode)(info->flavor_type);
979 dbg("invalid field found. coutinue");
983 dbg("valid count :%d",countValidRecords);
984 resp.record_num = countValidRecords;
985 resp.err = TCORE_RETURN_SUCCESS;
990 dbg("no active status - return to user")
993 if(sp_response->success > 0){
994 resp.err = TCORE_RETURN_SUCCESS;
997 resp.err = TCORE_RETURN_FAILURE;
1001 dbg("on_response_ss_forwarding_get - rsp.err : %d, ur : %x", resp.err, ur);
1004 tcore_user_request_send_response(ur, info->resp, sizeof(struct tresp_ss_forwarding), &resp);
1006 dbg("[ error ] ur is 0");
1008 g_free( user_data );
1012 static void on_response_ss_waiting_set( TcorePending *p, int data_len, const void *data, void *user_data )
1015 UserRequest* ur = 0;
1016 struct ss_confirm_info *info = 0;
1017 struct tresp_ss_general resp;
1019 o = tcore_pending_ref_core_object(p);
1020 ur = tcore_pending_ref_user_request(p);
1022 info = (struct ss_confirm_info*)user_data;
1024 if(sp_response->success > 0){
1025 resp.err = TCORE_RETURN_SUCCESS;
1027 resp.err = TCORE_RETURN_FAILURE;
1032 dbg("on_response_ss_waiting_set - rsp.err : %d, ur : %x, class : %d", resp.err, ur, info->class );
1034 if ( resp.err == TCORE_RETURN_SUCCESS ) {
1036 _ss_waiting_get( o, ur, info->class, info->resp );
1041 tcore_user_request_send_response(ur, info->resp, sizeof(struct tresp_ss_general), &resp);
1043 dbg("[ error ] ur is 0");
1046 g_free( user_data );
1049 static void on_response_ss_waiting_get( TcorePending *p, int data_len, const void *data, void *user_data )
1052 UserRequest* ur = 0;
1053 struct ATLine *p_cur;
1054 int status=0, classx =0, err=0;
1056 struct ss_confirm_info* info = 0;
1057 struct tresp_ss_waiting resp;
1058 int countRecords=0, countValidRecords =0;
1060 o = tcore_pending_ref_core_object(p);
1061 ur = tcore_pending_ref_user_request(p);
1065 info = (struct ss_confirm_info*)user_data;
1067 /* count the calls */
1068 for (countRecords = 0, p_cur = sp_response->p_intermediates
1070 ; p_cur = p_cur->p_next
1074 dbg("total records : %d",countRecords);
1077 resp.record_num = countRecords;
1079 if ( resp.record_num > 0 ) {
1082 resp.record = g_new0( struct waiting_info, resp.record_num );
1084 for (countValidRecords = 0, p_cur = sp_response->p_intermediates
1086 ; p_cur = p_cur->p_next)
1088 err = at_tok_start(&(p_cur->line));
1090 dbg("start line error. skip this line");
1094 err = at_tok_nextint(&(p_cur->line), &status);// status
1096 dbg("status error. skip this line");
1101 resp.record[countValidRecords].status = SS_STATUS_ACTIVATE;
1104 resp.record[countValidRecords].status = SS_STATUS_DEACTIVATE;
1107 err = at_tok_nextint(&(p_cur->line), &classx); //class
1109 dbg("class error. skip this line");
1115 resp.record[countValidRecords].class = SS_CLASS_VOICE;
1118 resp.record[countValidRecords].class = SS_CLASS_ALL_DATA_TELE;
1121 resp.record[countValidRecords].class = SS_CLASS_FAX;
1124 resp.record[countValidRecords].class = SS_CLASS_ALL_TELE;
1127 resp.record[countValidRecords].class = SS_CLASS_SMS;
1130 resp.record[countValidRecords].class = SS_CLASS_ALL_CS_SYNC;
1133 resp.record[countValidRecords].class = SS_CLASS_ALL_CS_ASYNC;
1136 dbg("unspoorted class : [%d]\n", classx );
1141 countValidRecords++;
1144 dbg("invalid field found. coutinue");
1148 dbg("valid count :%d",countValidRecords);
1149 resp.record_num = countValidRecords;
1150 resp.err = TCORE_RETURN_SUCCESS;
1154 dbg("no active status - return to user")
1157 if(sp_response->success > 0){
1158 resp.err = TCORE_RETURN_SUCCESS;
1161 resp.err = TCORE_RETURN_FAILURE;
1164 dbg("on_response_ss_waiting_get - rsp.err : %d, ur : %x", resp.err, ur);
1169 tcore_user_request_send_response(ur, info->resp, sizeof(struct tresp_ss_waiting), &resp);
1171 dbg("[ error ] ur is 0");
1173 g_free( user_data );
1177 static void on_confirmation_ss_ussd( TcorePending *p, int data_len, const void *data, void *user_data )
1179 struct ss_confirm_info *info = 0;
1181 struct tresp_ss_ussd resp;
1183 UserRequest* ur = 0;
1185 o = tcore_pending_ref_core_object(p);
1186 ur = tcore_pending_ref_user_request(p);
1191 info = (struct ss_confirm_info*)user_data;
1193 if(sp_response->success > 0){
1194 resp.err = TCORE_RETURN_SUCCESS;
1197 resp.err = TCORE_RETURN_FAILURE;
1200 dbg("on_confirmation_ss_ussd - rsp.err : %d, ur : %x", resp.err, ur);
1203 if (sp_response->success > 0) {
1205 UssdSession *ussd_s = 0;
1206 enum tcore_ss_ussd_type type = 0;
1208 ussd_s = tcore_ss_ussd_get_session( o );
1211 type = tcore_ss_ussd_get_session_type( ussd_s );
1213 dbg("[ error ] ussd_s : (0)");
1215 resp.type = (enum telephony_ss_ussd_type)type;
1217 if ( type == TCORE_SS_USSD_TYPE_USER_INITIATED ) {
1218 UserRequest *ur2 = 0;
1220 tcore_ss_ussd_get_session_data( ussd_s, (void**)&ur2 );
1222 tcore_user_request_unref( ur2 );
1224 tcore_ss_ussd_destroy_session( ussd_s );
1228 tcore_user_request_send_response(ur, info->resp, sizeof(struct tresp_ss_ussd), &resp);
1230 dbg("[ error ] ur : (0)");
1235 g_free( user_data );
1240 static struct tcore_ss_operations ss_ops = {
1241 .barring_activate = s_ss_barring_activate,
1242 .barring_deactivate = s_ss_barring_deactivate,
1243 .barring_change_password= s_ss_barring_change_password,
1244 .barring_get_status = s_ss_barring_get_status,
1245 .forwarding_activate = s_ss_forwarding_activate,
1246 .forwarding_deactivate = s_ss_forwarding_deactivate,
1247 .forwarding_register = s_ss_forwarding_register,
1248 .forwarding_deregister = s_ss_forwarding_deregister,
1249 .forwarding_get_status = s_ss_forwarding_get_status,
1250 .waiting_activate = s_ss_waiting_activate,
1251 .waiting_deactivate = s_ss_waiting_deactivate,
1252 .waiting_get_status = s_ss_waiting_get_status,
1253 .cli_activate = s_ss_cli_activate,
1254 .cli_deactivate = s_ss_cli_deactivate,
1255 .cli_get_status = s_ss_cli_get_status,
1256 .send_ussd = s_ss_send_ussd,
1257 .set_aoc = s_ss_set_aoc,
1258 .get_aoc = s_ss_get_aoc,
1262 static TReturn _ss_barring_set( CoreObject *o, UserRequest *ur, enum telephony_ss_opcode op )
1264 struct treq_ss_barring *barring = 0;
1266 struct ss_confirm_info *user_data = 0;
1267 gboolean ret = FALSE;
1268 char passwd[MAX_SS_BARRING_PASSWORD_LEN+1];
1270 struct ATReqMetaInfo metainfo;
1272 char* cmd_str = NULL;
1275 char* facility = NULL;
1278 barring = (struct treq_ss_barring*)tcore_user_request_ref_data( ur, 0 );
1279 p = tcore_object_ref_plugin( o );
1281 memset(&metainfo, 0, sizeof(struct ATReqMetaInfo));
1282 metainfo.type = NO_RESULT;
1283 metainfo.responsePrefix[0] ='\0';
1284 info_len = sizeof(struct ATReqMetaInfo);
1286 tcore_user_request_set_metainfo(ur, info_len, &metainfo);
1290 case TIZEN_SS_OPCO_ACTIVATE:
1293 case TIZEN_SS_OPCO_DEACTIVATE:
1297 dbg("unsupported opco : %d", op);
1298 return TCORE_RETURN_FAILURE;
1302 switch(barring->mode){
1303 case SS_BARR_MODE_BAOC:
1306 case SS_BARR_MODE_BOIC:
1309 case SS_BARR_MODE_BOIC_NOT_HC:
1312 case SS_BARR_MODE_BAIC:
1315 case SS_BARR_MODE_BIC_ROAM:
1318 case SS_BARR_MODE_AB:
1321 case SS_BARR_MODE_AOB:
1324 case SS_BARR_MODE_AIB:
1327 case SS_BARR_MODE_BIC_NOT_SIM:
1331 dbg("unspported mode %d", barring->mode);
1332 return TCORE_RETURN_FAILURE;
1335 switch(barring->class)
1337 case SS_CLASS_ALL_TELE:
1340 case SS_CLASS_VOICE:
1343 case SS_CLASS_ALL_DATA_TELE:
1352 case SS_CLASS_ALL_CS_SYNC:
1358 dbg("unsupported class %d. set to default : 7", barring->class);
1362 // null-ended pwd handling added - unexpected 0x11 value observed in req string
1363 memcpy(passwd, barring->password, MAX_SS_BARRING_PASSWORD_LEN);
1364 passwd[MAX_SS_BARRING_PASSWORD_LEN]='\0';
1367 cmd_str = g_strdup_printf("AT+CLCK=\"%s\",%d,\"%s\",%d%s", facility, opco, passwd, classx,"\r");
1368 dbg("request command : %s", cmd_str);
1370 user_data = g_new0( struct ss_confirm_info, 1 );
1372 if ( op == TIZEN_SS_OPCO_ACTIVATE) {
1373 user_data->resp = TRESP_SS_BARRING_ACTIVATE;
1375 } else if ( op == TIZEN_SS_OPCO_DEACTIVATE) {
1376 user_data->resp = TRESP_SS_BARRING_DEACTIVATE;
1379 dbg("[ error ] wrong ss opco ( 0x%x )", op );
1380 return TCORE_RETURN_FAILURE;
1383 user_data->flavor_type = (int)(barring->mode);
1384 user_data->class = barring->class;
1386 ret = _ss_request_message( o, ur, cmd_str, strlen(cmd_str), on_response_ss_barring_set, user_data );
1391 return TCORE_RETURN_FAILURE;
1393 return TCORE_RETURN_SUCCESS;
1396 static TReturn _ss_barring_get( CoreObject *o,
1398 enum telephony_ss_class class,
1399 enum telephony_ss_barring_mode mode,
1400 enum tcore_response_command resp )
1403 struct ss_confirm_info *user_data = 0;
1404 gboolean ret = FALSE;
1406 struct ATReqMetaInfo metainfo;
1408 char* cmd_str = NULL;
1410 char* facility = NULL;
1412 p = tcore_object_ref_plugin( o );
1414 memset(&metainfo, 0, sizeof(struct ATReqMetaInfo));
1415 metainfo.type = MULTILINE;
1416 memcpy(metainfo.responsePrefix,"+CLCK:",strlen("+CLCK:"));
1417 info_len = sizeof(struct ATReqMetaInfo);
1419 tcore_user_request_set_metainfo(ur, info_len, &metainfo);
1421 //query status - opco is fixed to 2
1426 case SS_BARR_MODE_BAOC:
1429 case SS_BARR_MODE_BOIC:
1432 case SS_BARR_MODE_BOIC_NOT_HC:
1435 case SS_BARR_MODE_BAIC:
1438 case SS_BARR_MODE_BIC_ROAM:
1441 case SS_BARR_MODE_AB:
1444 case SS_BARR_MODE_AOB:
1447 case SS_BARR_MODE_AIB:
1450 case SS_BARR_MODE_BIC_NOT_SIM:
1454 dbg("unspported mode %d", mode);
1455 return TCORE_RETURN_FAILURE;
1460 case SS_CLASS_ALL_TELE:
1463 case SS_CLASS_VOICE:
1466 case SS_CLASS_ALL_DATA_TELE:
1475 case SS_CLASS_ALL_CS_SYNC:
1481 dbg("unsupported class %d. set to default : 7", class);
1487 cmd_str = g_strdup_printf("AT+CLCK=\"%s\",%d%s", facility, opco,"\r");
1489 cmd_str = g_strdup_printf("AT+CLCK=\"%s\",%d,,%d%s", facility, opco,classx,"\r");
1491 dbg("request command : %s", cmd_str);
1493 user_data = g_new0( struct ss_confirm_info, 1 );
1494 user_data->resp = resp;
1496 user_data->flavor_type = (int)(mode);
1497 user_data->class = class;
1499 ret = _ss_request_message( o, ur, cmd_str, strlen(cmd_str), on_response_ss_barring_get, user_data );
1504 return TCORE_RETURN_FAILURE;
1506 return TCORE_RETURN_SUCCESS;
1509 static TReturn s_ss_barring_activate( CoreObject *o, UserRequest *ur )
1511 return _ss_barring_set( o, ur, TIZEN_SS_OPCO_ACTIVATE );
1514 static TReturn s_ss_barring_deactivate( CoreObject *o, UserRequest *ur )
1516 return _ss_barring_set( o, ur, TIZEN_SS_OPCO_DEACTIVATE );
1519 static TReturn s_ss_barring_change_password( CoreObject *o, UserRequest *ur )
1522 struct treq_ss_barring_change_password *barring = 0;
1524 struct ss_confirm_info *user_data = 0;
1526 gboolean ret = FALSE;
1528 // struct ATReqMetaInfo metainfo;
1530 char* cmd_str = NULL;
1532 p = tcore_object_ref_plugin( o );
1533 barring = (struct treq_ss_barring_change_password*)tcore_user_request_ref_data( ur, 0 );
1536 cmd_str = g_strdup_printf("AT+CPWD=\"%s\",\"%s\",\"%s\"%s", "AB", barring->password_old, barring->password_new,"\r");
1537 dbg("request command : %s", cmd_str);
1540 user_data = g_new0( struct ss_confirm_info, 1 );
1541 user_data->resp = TRESP_SS_BARRING_CHANGE_PASSWORD;
1543 ret = _ss_request_message( o, ur, cmd_str, strlen(cmd_str), on_response_ss_barring_change_pwd, user_data );
1547 return TCORE_RETURN_FAILURE;
1549 return TCORE_RETURN_SUCCESS;
1552 static TReturn s_ss_barring_get_status( CoreObject *o, UserRequest *ur )
1554 struct treq_ss_barring *barring = 0;
1555 barring = (struct treq_ss_barring*)tcore_user_request_ref_data( ur, 0 );
1557 return _ss_barring_get( o, ur, barring->class, barring->mode, TRESP_SS_BARRING_GET_STATUS );
1560 static TReturn _ss_forwarding_set( CoreObject *o, UserRequest *ur, enum telephony_ss_opcode op )
1563 struct treq_ss_forwarding *forwarding = 0;
1565 struct ss_confirm_info *user_data = 0;
1567 gboolean ret = FALSE;
1570 struct ATReqMetaInfo metainfo;
1572 char* cmd_str = NULL;
1573 char* tmp_str = NULL;
1574 int reason=0,mode=0,num_type=0, classx=0,time=0;
1575 gboolean valid_num = FALSE;
1577 dbg("_ss_forwarding_set with opco %d ", op);
1580 forwarding = (struct treq_ss_forwarding*) tcore_user_request_ref_data( ur, 0 );
1581 p = tcore_object_ref_plugin( o );
1583 memset(&metainfo, 0, sizeof(struct ATReqMetaInfo));
1584 metainfo.type = NO_RESULT;
1585 metainfo.responsePrefix[0] ='\0';
1586 info_len = sizeof(struct ATReqMetaInfo);
1588 tcore_user_request_set_metainfo(ur, info_len, &metainfo);
1590 switch(forwarding->mode)
1592 case SS_CF_MODE_CFU:
1595 case SS_CF_MODE_CFB:
1598 case SS_CF_MODE_CFNRy:
1601 case SS_CF_MODE_CFNRc:
1604 case SS_CF_MODE_CF_ALL:
1607 case SS_CF_MODE_CFC:
1612 dbg("unsupported reason : %d");
1617 case TIZEN_SS_OPCO_DEACTIVATE:
1620 case TIZEN_SS_OPCO_ACTIVATE:
1623 case TIZEN_SS_OPCO_REG:
1626 case TIZEN_SS_OPCO_DEREG:
1631 dbg("unsupported opco : %d", op);
1632 return TCORE_RETURN_FAILURE;
1637 switch(forwarding->class)
1639 case SS_CLASS_ALL_TELE:
1642 case SS_CLASS_VOICE:
1645 case SS_CLASS_ALL_DATA_TELE:
1654 case SS_CLASS_ALL_CS_SYNC:
1660 dbg("unsupported class %d. set to default : 7", forwarding->class);
1665 len = strlen(forwarding->number);
1668 if ( forwarding->number[0] == '+' )
1669 num_type = ((TIZEN_NUM_TYPE_INTERNATIONAL << 4)|TIZEN_NUM_PLAN_ISDN);
1673 user_data = g_new0( struct ss_confirm_info, 1 );
1676 case TIZEN_SS_OPCO_REG:
1677 user_data->resp = TRESP_SS_FORWARDING_REGISTER;
1679 case TIZEN_SS_OPCO_DEREG:
1680 user_data->resp = TRESP_SS_FORWARDING_DEREGISTER;
1682 case TIZEN_SS_OPCO_ACTIVATE:
1683 user_data->resp = TRESP_SS_FORWARDING_ACTIVATE;
1685 case TIZEN_SS_OPCO_DEACTIVATE:
1686 user_data->resp = TRESP_SS_FORWARDING_DEACTIVATE;
1689 dbg("[ error ] unknown op ( 0x%x )", op );
1693 if(op == TIZEN_SS_OPCO_REG)
1694 tmp_str = g_strdup_printf("AT+CCFC=%d,%d,\"%s\",%d,%d", reason, mode, forwarding->number, num_type, classx);
1695 else// other opcode does not need num field
1696 tmp_str = g_strdup_printf("AT+CCFC=%d,%d,,,%d", reason, mode, classx);
1698 if(forwarding->mode == SS_CF_MODE_CFNRy){
1699 //add time info to 'no reply' case
1700 time = (int)(forwarding->time);
1701 cmd_str = g_strdup_printf("%s,,,%d%s", tmp_str,time,"\r");
1704 cmd_str = g_strdup_printf("%s%s", tmp_str,"\r");
1707 dbg("request command : %s", cmd_str);
1709 user_data->flavor_type = forwarding->mode;
1710 user_data->class = forwarding->class;
1712 ret = _ss_request_message( o, ur, cmd_str, strlen(cmd_str), on_response_ss_forwarding_set, user_data );
1717 return TCORE_RETURN_FAILURE;
1719 return TCORE_RETURN_SUCCESS;
1722 static TReturn _ss_forwarding_get( CoreObject *o,
1724 enum telephony_ss_class class,
1725 enum telephony_ss_forwarding_mode type,
1726 enum tcore_response_command resp )
1729 struct ss_confirm_info *user_data = 0;
1731 gboolean ret = FALSE;
1734 struct ATReqMetaInfo metainfo;
1735 int info_len=0, reason=0, mode=0, classx =0;
1736 char* cmd_str = NULL;
1738 p = tcore_object_ref_plugin( o );
1740 memset(&metainfo, 0, sizeof(struct ATReqMetaInfo));
1741 metainfo.type = MULTILINE;
1742 memcpy(metainfo.responsePrefix,"+CCFC:",strlen("+CCFC:"));
1743 info_len = sizeof(struct ATReqMetaInfo);
1745 tcore_user_request_set_metainfo(ur, info_len, &metainfo);
1749 case SS_CF_MODE_CFU:
1752 case SS_CF_MODE_CFB:
1755 case SS_CF_MODE_CFNRy:
1758 case SS_CF_MODE_CFNRc:
1761 case SS_CF_MODE_CF_ALL:
1764 case SS_CF_MODE_CFC:
1769 dbg("unsupported reason : %d");
1775 case SS_CLASS_ALL_TELE:
1778 case SS_CLASS_VOICE:
1781 case SS_CLASS_ALL_DATA_TELE:
1790 case SS_CLASS_ALL_CS_SYNC:
1795 dbg("unsupported class %d. set to default : 7", class);
1799 //query status - mode set to 2
1802 user_data = g_new0( struct ss_confirm_info, 1 );
1803 user_data->resp = resp;
1805 user_data->class = class;
1806 user_data->flavor_type = type;
1809 cmd_str = g_strdup_printf("AT+CCFC=%d,%d%s", reason, mode,"\r");
1811 cmd_str = g_strdup_printf("AT+CCFC=%d,%d,,,%d%s", reason, mode,classx,"\r");
1813 dbg("request command : %s", cmd_str);
1814 ret = _ss_request_message( o, ur, cmd_str, strlen(cmd_str), on_response_ss_forwarding_get, user_data );
1818 return TCORE_RETURN_FAILURE;
1820 return TCORE_RETURN_SUCCESS;
1823 static TReturn s_ss_forwarding_activate( CoreObject *o, UserRequest *ur )
1825 return _ss_forwarding_set( o, ur, TIZEN_SS_OPCO_ACTIVATE );
1828 static TReturn s_ss_forwarding_deactivate( CoreObject *o, UserRequest *ur )
1830 return _ss_forwarding_set( o, ur, TIZEN_SS_OPCO_DEACTIVATE );
1833 static TReturn s_ss_forwarding_register( CoreObject *o, UserRequest *ur )
1835 return _ss_forwarding_set( o, ur, TIZEN_SS_OPCO_REG );
1838 static TReturn s_ss_forwarding_deregister( CoreObject *o, UserRequest *ur )
1840 return _ss_forwarding_set( o, ur, TIZEN_SS_OPCO_DEREG );
1843 static TReturn s_ss_forwarding_get_status( CoreObject *o, UserRequest *ur )
1845 struct treq_ss_forwarding *forwarding = 0;
1846 forwarding = (struct treq_ss_forwarding*)tcore_user_request_ref_data( ur, 0 );
1848 return _ss_forwarding_get( o, ur, forwarding->class, forwarding->mode, TRESP_SS_FORWARDING_GET_STATUS );
1851 static TReturn _ss_waiting_set( CoreObject *o, UserRequest *ur, enum telephony_ss_opcode opco )
1854 struct treq_ss_waiting *waiting = 0;
1856 struct ss_confirm_info *user_data = 0;
1858 gboolean ret = FALSE;
1859 int mode=0, classx=0;
1861 struct ATReqMetaInfo metainfo;
1864 memset(&metainfo, 0, sizeof(struct ATReqMetaInfo));
1865 metainfo.type = NO_RESULT;
1866 metainfo.responsePrefix[0] ='\0';
1868 tcore_user_request_set_metainfo(ur, sizeof(struct ATReqMetaInfo), &metainfo);
1870 p = tcore_object_ref_plugin( o );
1872 waiting = (struct treq_ss_waiting*) tcore_user_request_ref_data( ur, 0 );
1874 user_data = g_new0( struct ss_confirm_info, 1 );
1876 if ( opco == TIZEN_SS_OPCO_ACTIVATE ){
1877 user_data->resp = TRESP_SS_WAITING_ACTIVATE;
1880 else if ( opco == TIZEN_SS_OPCO_DEACTIVATE ){
1881 user_data->resp = TRESP_SS_WAITING_DEACTIVATE;
1885 dbg("[ error ] unknown ss mode (0x%x)", opco);
1887 switch(waiting->class)
1889 case SS_CLASS_ALL_TELE:
1892 case SS_CLASS_VOICE:
1895 case SS_CLASS_ALL_DATA_TELE:
1907 dbg("unsupported class %d. set to default : 7", waiting->class);
1912 user_data->class = waiting->class;
1913 user_data->flavor_type = (int)opco;
1915 cmd_str = g_strdup_printf("AT+CCWA=1,%d,%d%s", mode, classx,"\r"); //always enable +CCWA: unsolicited cmd
1916 dbg("request command : %s",cmd_str);
1918 ret = _ss_request_message( o, ur, cmd_str, strlen(cmd_str), on_response_ss_waiting_set, user_data );
1922 return TCORE_RETURN_FAILURE;
1924 return TCORE_RETURN_SUCCESS;
1927 static TReturn _ss_waiting_get( CoreObject *o,
1929 enum telephony_ss_class class,
1930 enum tcore_response_command resp )
1934 struct ss_confirm_info *user_data = 0;
1936 gboolean ret = FALSE;
1937 int classx, info_len=0;//mode,
1939 struct ATReqMetaInfo metainfo;
1942 memset(&metainfo, 0, sizeof(struct ATReqMetaInfo));
1943 metainfo.type = MULTILINE;
1944 memcpy(metainfo.responsePrefix,"+CCWA:",strlen("+CCWA:"));
1945 info_len = sizeof(struct ATReqMetaInfo);
1947 tcore_user_request_set_metainfo(ur, sizeof(struct ATReqMetaInfo), &metainfo);
1949 p = tcore_object_ref_plugin( o );
1953 case SS_CLASS_ALL_TELE:
1956 case SS_CLASS_VOICE:
1959 case SS_CLASS_ALL_DATA_TELE:
1971 dbg("unsupported class %d. set to default : 7", class);
1975 dbg("allocating user data");
1976 user_data = g_new0( struct ss_confirm_info, 1 );
1977 user_data->resp = resp;
1978 user_data->class = class;
1980 cmd_str = g_strdup_printf("AT+CCWA=1,2,%d%s", classx,"\r"); //always enable +CCWA: unsolicited cmd , mode is fixed to 2(query status)
1981 dbg("request cmd : %s", cmd_str);
1983 ret = _ss_request_message( o, ur, cmd_str, strlen(cmd_str), on_response_ss_waiting_get, user_data );
1988 return TCORE_RETURN_FAILURE;
1990 return TCORE_RETURN_SUCCESS;
1993 static TReturn s_ss_waiting_activate( CoreObject *o, UserRequest *ur )
1995 return _ss_waiting_set( o, ur, TIZEN_SS_OPCO_ACTIVATE );
1998 static TReturn s_ss_waiting_deactivate( CoreObject *o, UserRequest *ur )
2000 return _ss_waiting_set( o, ur, TIZEN_SS_OPCO_DEACTIVATE );
2003 static TReturn s_ss_waiting_get_status( CoreObject *o, UserRequest *ur )
2005 struct treq_ss_waiting *waiting = 0;
2006 waiting = (struct treq_ss_waiting*)tcore_user_request_ref_data( ur, 0 );
2008 return _ss_waiting_get( o, ur, waiting->class, TRESP_SS_WAITING_GET_STATUS );
2011 static TReturn s_ss_cli_activate( CoreObject *o, UserRequest *ur )
2013 return TCORE_RETURN_SUCCESS;
2016 static TReturn s_ss_cli_deactivate( CoreObject *o, UserRequest *ur )
2018 return TCORE_RETURN_SUCCESS;
2021 static TReturn s_ss_cli_get_status( CoreObject *o, UserRequest *ur )
2025 struct treq_ss_cli *cli = 0;
2026 gboolean ret = FALSE;
2027 char *cmd_prefix = NULL, *rsp_prefix = NULL, *cmd_str = NULL;
2028 struct ATReqMetaInfo metainfo;
2029 enum telephony_ss_cli_type *user_data = 0;
2033 p = tcore_object_ref_plugin(o);
2035 cli = (struct treq_ss_cli*)tcore_user_request_ref_data( ur, 0 );
2038 case SS_CLI_TYPE_CLIP:
2039 cmd_prefix = "+CLIP";
2040 rsp_prefix = "+CLIP:";
2043 case SS_CLI_TYPE_CLIR:
2044 cmd_prefix = "+CLIR";
2045 rsp_prefix = "+CLIR:";
2048 case SS_CLI_TYPE_COLP:
2049 cmd_prefix = "+COLP";
2050 rsp_prefix = "+COLP:";
2053 case SS_CLI_TYPE_CDIP:
2054 cmd_prefix = "+CDIP";
2055 rsp_prefix = "+CDIP:";
2059 dbg("unsupported cli_type : %d", cli->type);
2060 return TCORE_RETURN_FAILURE;
2064 dbg("cmd_prefix : %s",cmd_prefix);
2067 memset(&metainfo, 0, sizeof(struct ATReqMetaInfo));
2068 metainfo.type = SINGLELINE;
2069 memcpy(metainfo.responsePrefix,rsp_prefix,strlen(rsp_prefix));
2070 info_len = sizeof(struct ATReqMetaInfo);
2072 tcore_user_request_set_metainfo(ur, sizeof(struct ATReqMetaInfo), &metainfo);
2076 cmd_str = g_strdup_printf("AT%s?%s", cmd_prefix, "\r");
2077 dbg("request cmd : %s", cmd_str);
2079 // make userinfo for callback
2080 user_data = g_new0( enum telephony_ss_cli_type, 1 );
2081 *user_data = cli->type;
2083 ret = _ss_request_message( o, ur, cmd_str, strlen(cmd_str), on_response_ss_waiting_get, user_data );
2088 return TCORE_RETURN_FAILURE;
2090 return TCORE_RETURN_SUCCESS;
2093 static TReturn s_ss_send_ussd( CoreObject *o, UserRequest *ur )
2096 UssdSession *ussd_s = 0;
2098 struct treq_ss_ussd *ussd = 0;
2099 struct ss_confirm_info *user_data = 0;
2101 gboolean ret = FALSE;
2103 struct ATReqMetaInfo metainfo;
2106 memset(&metainfo, 0, sizeof(struct ATReqMetaInfo));
2107 metainfo.type = NO_RESULT;
2108 metainfo.responsePrefix[0] ='\0';
2109 tcore_user_request_set_metainfo(ur, sizeof(struct ATReqMetaInfo), &metainfo);
2111 p = tcore_object_ref_plugin(o);
2112 ussd = (struct treq_ss_ussd*)tcore_user_request_ref_data( ur, 0 );
2114 cmd_str = g_strdup_printf("AT+CUSD=1,\"%s\",%d%s", ussd->str, 0x0f,"\r"); //always enable +CUSD: unsolicited cmd. set to dcs to 0x0f. only supports HEX type
2115 dbg("request command : %s",cmd_str);
2118 user_data = g_new0( struct ss_confirm_info, 1 );
2119 user_data->resp = TRESP_SS_SEND_USSD;
2121 ussd_s = tcore_ss_ussd_get_session( o );
2123 tcore_ss_ussd_create_session( o, (enum tcore_ss_ussd_type)ussd->type, (void*)tcore_user_request_ref(ur), 0 );
2126 if ( ussd->type == SS_USSD_TYPE_USER_INITIATED ) {
2127 dbg("[ error ] ussd session is already exist");
2129 g_free( user_data );
2130 return TCORE_RETURN_FAILURE;
2133 tcore_ss_ussd_set_session_type( ussd_s, (enum tcore_ss_ussd_type)ussd->type);
2136 ret = _ss_request_message( o, ur, cmd_str, strlen(cmd_str), on_confirmation_ss_ussd, user_data );
2139 return TCORE_RETURN_FAILURE;
2142 return TCORE_RETURN_SUCCESS;
2145 static TReturn s_ss_set_aoc( CoreObject *o, UserRequest *ur )
2147 dbg("[ error ] unsupported function");
2148 return TCORE_RETURN_SUCCESS;
2151 static TReturn s_ss_get_aoc( CoreObject *o, UserRequest *ur )
2153 dbg("[ error ] unsupported function");
2154 return TCORE_RETURN_SUCCESS;
2157 static struct tcore_call_control_operations call_ops = {
2158 .answer_hold_and_accept = s_ss_manage_call_2_send,
2159 .answer_replace = s_ss_manage_call_1_send,
2160 .answer_reject = s_ss_manage_call_0_send,
2161 .end_specific = s_ss_manage_call_1x_send,
2162 .end_all_active = s_ss_manage_call_1_send,
2163 .end_all_held = s_ss_manage_call_0_send,
2164 .active = s_ss_manage_call_2_send,
2165 .hold = s_ss_manage_call_2_send,
2166 .swap = s_ss_manage_call_2_send,
2167 .join = s_ss_manage_call_3_send,
2168 .split = s_ss_manage_call_2x_send,
2169 .transfer = s_ss_manage_call_4_send,
2170 .deflect = s_ss_manage_call_4dn_send,
2173 static TReturn s_ss_manage_call_0_send( CoreObject* o, UserRequest* ur, ConfirmCallback cb, void* user_data )
2175 TcorePlugin *p = NULL;
2177 TcorePending *pending = NULL;
2178 char* cmd_str = NULL;
2179 struct ATReqMetaInfo metainfo;
2182 p = tcore_object_ref_plugin(o);
2183 h = tcore_object_get_hal(o);
2185 memset(&metainfo, 0, sizeof(struct ATReqMetaInfo));
2186 metainfo.type = NO_RESULT;
2187 metainfo.responsePrefix[0] ='\0';
2188 info_len = sizeof(struct ATReqMetaInfo);
2190 tcore_user_request_set_metainfo(ur, info_len, &metainfo);
2192 cmd_str = g_strdup_printf("%s%s", "AT+CHLD=0", "\r");
2193 dbg("cmd : %s, prefix(if any) : %s, cmd_len : %d",cmd_str, "N/A", strlen(cmd_str));
2195 pending = tcore_pending_new(o, ID_RESERVED_AT);
2196 tcore_pending_set_request_data(pending, strlen(cmd_str), cmd_str);
2198 tcore_pending_set_timeout(pending, 0);
2199 tcore_pending_set_response_callback(pending, (TcorePendingResponseCallback)cb, user_data);
2200 tcore_pending_link_user_request(pending, ur);
2201 tcore_pending_set_priority(pending, TCORE_PENDING_PRIORITY_DEFAULT);
2203 tcore_pending_set_send_callback(pending, on_confirmation_call_control_ss_message_send, NULL);
2206 tcore_hal_send_request(h, pending);
2208 return TCORE_RETURN_SUCCESS;
2211 static TReturn s_ss_manage_call_1_send( CoreObject* o, UserRequest* ur, ConfirmCallback cb, void* user_data )
2213 TcorePlugin *p = NULL;
2215 TcorePending *pending = NULL;
2216 char* cmd_str = NULL;
2217 struct ATReqMetaInfo metainfo;
2220 p = tcore_object_ref_plugin(o);
2221 h = tcore_object_get_hal(o);
2223 memset(&metainfo, 0, sizeof(struct ATReqMetaInfo));
2224 metainfo.type = NO_RESULT;
2225 metainfo.responsePrefix[0] ='\0';
2226 info_len = sizeof(struct ATReqMetaInfo);
2228 tcore_user_request_set_metainfo(ur, info_len, &metainfo);
2230 cmd_str = g_strdup_printf("%s%s", "AT+CHLD=1", "\r");
2231 dbg("cmd : %s, prefix(if any) : %s, cmd_len : %d",cmd_str, "N/A", strlen(cmd_str));
2233 pending = tcore_pending_new(o, ID_RESERVED_AT);
2234 tcore_pending_set_request_data(pending, strlen(cmd_str), cmd_str);
2236 tcore_pending_set_timeout(pending, 0);
2237 tcore_pending_set_response_callback(pending, (TcorePendingResponseCallback)cb, user_data);
2238 tcore_pending_link_user_request(pending, ur);
2239 tcore_pending_set_priority(pending, TCORE_PENDING_PRIORITY_DEFAULT);
2241 tcore_pending_set_send_callback(pending, on_confirmation_call_control_ss_message_send, NULL);
2244 tcore_hal_send_request(h, pending);
2246 return TCORE_RETURN_SUCCESS;
2249 static TReturn s_ss_manage_call_1x_send( CoreObject* o, UserRequest* ur, const int id, ConfirmCallback cb, void* user_data )
2251 TcorePlugin *p = NULL;
2253 TcorePending *pending = NULL;
2254 char* cmd_str = NULL;
2255 struct ATReqMetaInfo metainfo;
2258 p = tcore_object_ref_plugin(o);
2259 h = tcore_object_get_hal(o);
2261 memset(&metainfo, 0, sizeof(struct ATReqMetaInfo));
2262 metainfo.type = NO_RESULT;
2263 metainfo.responsePrefix[0] ='\0';
2264 info_len = sizeof(struct ATReqMetaInfo);
2266 tcore_user_request_set_metainfo(ur, info_len, &metainfo);
2268 cmd_str = g_strdup_printf("%s%d%s", "AT+CHLD=1", id,"\r");
2269 dbg("cmd : %s, prefix(if any) : %s, cmd_len : %d",cmd_str, "N/A", strlen(cmd_str));
2271 pending = tcore_pending_new(o, ID_RESERVED_AT);
2272 tcore_pending_set_request_data(pending, strlen(cmd_str), cmd_str);
2274 tcore_pending_set_timeout(pending, 0);
2275 tcore_pending_set_response_callback(pending, (TcorePendingResponseCallback)cb, user_data);
2276 tcore_pending_link_user_request(pending, ur);
2277 tcore_pending_set_priority(pending, TCORE_PENDING_PRIORITY_DEFAULT);
2279 tcore_pending_set_send_callback(pending, on_confirmation_call_control_ss_message_send, NULL);
2282 tcore_hal_send_request(h, pending);
2284 return TCORE_RETURN_SUCCESS;
2287 static TReturn s_ss_manage_call_2_send( CoreObject* o, UserRequest* ur, ConfirmCallback cb, void* user_data )
2289 TcorePlugin *p = NULL;
2291 TcorePending *pending = NULL;
2292 char* cmd_str = NULL;
2293 struct ATReqMetaInfo metainfo;
2296 p = tcore_object_ref_plugin(o);
2297 h = tcore_object_get_hal(o);
2299 memset(&metainfo, 0, sizeof(struct ATReqMetaInfo));
2300 metainfo.type = NO_RESULT;
2301 metainfo.responsePrefix[0] ='\0';
2302 info_len = sizeof(struct ATReqMetaInfo);
2304 tcore_user_request_set_metainfo(ur, info_len, &metainfo);
2306 cmd_str = g_strdup_printf("%s%s", "AT+CHLD=2", "\r");
2307 dbg("cmd : %s, prefix(if any) : %s, cmd_len : %d",cmd_str, "N/A", strlen(cmd_str));
2309 pending = tcore_pending_new(o, ID_RESERVED_AT);
2310 tcore_pending_set_request_data(pending, strlen(cmd_str), cmd_str);
2312 tcore_pending_set_timeout(pending, 0);
2313 tcore_pending_set_response_callback(pending, (TcorePendingResponseCallback)cb, user_data);
2314 tcore_pending_link_user_request(pending, ur);
2315 tcore_pending_set_priority(pending, TCORE_PENDING_PRIORITY_DEFAULT);
2317 tcore_pending_set_send_callback(pending, on_confirmation_call_control_ss_message_send, NULL);
2320 tcore_hal_send_request(h, pending);
2322 return TCORE_RETURN_SUCCESS;
2325 static TReturn s_ss_manage_call_2x_send( CoreObject* o, UserRequest* ur, const int id, ConfirmCallback cb, void* user_data )
2327 TcorePlugin *p = NULL;
2329 TcorePending *pending = NULL;
2330 char* cmd_str = NULL;
2331 struct ATReqMetaInfo metainfo;
2334 p = tcore_object_ref_plugin(o);
2335 h = tcore_object_get_hal(o);
2337 memset(&metainfo, 0, sizeof(struct ATReqMetaInfo));
2338 metainfo.type = NO_RESULT;
2339 metainfo.responsePrefix[0] ='\0';
2340 info_len = sizeof(struct ATReqMetaInfo);
2342 tcore_user_request_set_metainfo(ur, info_len, &metainfo);
2344 cmd_str = g_strdup_printf("%s%d%s", "AT+CHLD=2", id,"\r");
2345 dbg("cmd : %s, prefix(if any) : %s, cmd_len : %d",cmd_str, "N/A", strlen(cmd_str));
2347 pending = tcore_pending_new(o, ID_RESERVED_AT);
2348 tcore_pending_set_request_data(pending, strlen(cmd_str), cmd_str);
2350 tcore_pending_set_timeout(pending, 0);
2351 tcore_pending_set_response_callback(pending, (TcorePendingResponseCallback)cb, user_data);
2352 tcore_pending_link_user_request(pending, ur);
2353 tcore_pending_set_priority(pending, TCORE_PENDING_PRIORITY_DEFAULT);
2355 tcore_pending_set_send_callback(pending, on_confirmation_call_control_ss_message_send, NULL);
2358 tcore_hal_send_request(h, pending);
2360 return TCORE_RETURN_SUCCESS;
2363 static TReturn s_ss_manage_call_3_send( CoreObject* o, UserRequest* ur, ConfirmCallback cb, void* user_data )
2365 // gboolean ret = FALSE;
2366 TcorePlugin *p = NULL;
2368 TcorePending *pending = NULL;
2369 char* cmd_str = NULL;
2370 struct ATReqMetaInfo metainfo;
2377 l = tcore_call_object_find_by_status( o, CALL_STATUS_ACTIVE );
2378 if ( !l || !l->data ) {
2379 dbg("[ error ] there is no call status [ call_active ]");
2380 return TCORE_RETURN_FAILURE;
2384 id = tcore_call_object_get_id( co );
2385 dbg("active call id : [ %d ]");
2387 p = tcore_object_ref_plugin(o);
2388 h = tcore_object_get_hal(o);
2390 memset(&metainfo, 0, sizeof(struct ATReqMetaInfo));
2391 metainfo.type = NO_RESULT;
2392 metainfo.responsePrefix[0] ='\0';
2393 info_len = sizeof(struct ATReqMetaInfo);
2395 tcore_user_request_set_metainfo(ur, info_len, &metainfo);
2397 cmd_str = g_strdup_printf("%s%s", "AT+CHLD=3","\r");
2399 dbg("cmd : %s, prefix(if any) : %s, cmd_len : %d",cmd_str, "N/A", strlen(cmd_str));
2401 pending = tcore_pending_new(o, ID_RESERVED_AT);
2402 tcore_pending_set_request_data(pending, strlen(cmd_str), cmd_str);
2404 tcore_pending_set_timeout(pending, 0);
2405 tcore_pending_set_response_callback(pending, (TcorePendingResponseCallback)cb, user_data);
2406 tcore_pending_link_user_request(pending, ur);
2407 tcore_pending_set_priority(pending, TCORE_PENDING_PRIORITY_DEFAULT);
2409 tcore_pending_set_send_callback(pending, on_confirmation_call_control_ss_message_send, NULL);
2412 tcore_hal_send_request(h, pending);
2414 return TCORE_RETURN_SUCCESS;
2417 static TReturn s_ss_manage_call_4_send( CoreObject* o, UserRequest* ur, ConfirmCallback cb, void* user_data )
2419 TcorePlugin *p = NULL;
2421 TcorePending *pending = NULL;
2422 char* cmd_str = NULL;
2423 struct ATReqMetaInfo metainfo;
2426 p = tcore_object_ref_plugin(o);
2427 h = tcore_object_get_hal(o);
2429 memset(&metainfo, 0, sizeof(struct ATReqMetaInfo));
2430 metainfo.type = NO_RESULT;
2431 metainfo.responsePrefix[0] ='\0';
2432 info_len = sizeof(struct ATReqMetaInfo);
2434 tcore_user_request_set_metainfo(ur, info_len, &metainfo);
2437 cmd_str = g_strdup_printf("%s%s", "AT+CHLD=4", "\r");
2439 dbg("cmd : %s, prefix(if any) : %s, cmd_len : %d",cmd_str, "N/A", strlen(cmd_str));
2441 pending = tcore_pending_new(o, ID_RESERVED_AT);
2442 tcore_pending_set_request_data(pending, strlen(cmd_str), cmd_str);
2444 tcore_pending_set_timeout(pending, 0);
2445 tcore_pending_set_response_callback(pending, (TcorePendingResponseCallback)cb, user_data);
2446 tcore_pending_link_user_request(pending, ur);
2447 tcore_pending_set_priority(pending, TCORE_PENDING_PRIORITY_DEFAULT);
2449 tcore_pending_set_send_callback(pending, on_confirmation_call_control_ss_message_send, NULL);
2452 tcore_hal_send_request(h, pending);
2454 return TCORE_RETURN_SUCCESS;
2457 static TReturn s_ss_manage_call_4dn_send( CoreObject* o, UserRequest* ur, const char* number, ConfirmCallback cb, void* user_data )
2459 TcorePlugin *p = NULL;
2461 TcorePending *pending = NULL;
2462 char* cmd_str = NULL;
2463 struct ATReqMetaInfo metainfo;
2466 p = tcore_object_ref_plugin(o);
2467 h = tcore_object_get_hal(o);
2469 memset(&metainfo, 0, sizeof(struct ATReqMetaInfo));
2470 metainfo.type = NO_RESULT;
2471 metainfo.responsePrefix[0] ='\0';
2472 info_len = sizeof(struct ATReqMetaInfo);
2474 tcore_user_request_set_metainfo(ur, info_len, &metainfo);
2477 cmd_str = g_strdup_printf("%s%s%s", "AT+CHLD=4", number,"\r");
2479 dbg("cmd : %s, prefix(if any) : %s, cmd_len : %d",cmd_str, "N/A", strlen(cmd_str));
2481 pending = tcore_pending_new(o, ID_RESERVED_AT);
2482 tcore_pending_set_request_data(pending, strlen(cmd_str), cmd_str);
2484 tcore_pending_set_timeout(pending, 0);
2485 tcore_pending_set_response_callback(pending, (TcorePendingResponseCallback)cb, user_data);
2486 tcore_pending_link_user_request(pending, ur);
2487 tcore_pending_set_priority(pending, TCORE_PENDING_PRIORITY_DEFAULT);
2489 tcore_pending_set_send_callback(pending, on_confirmation_call_control_ss_message_send, NULL);
2492 tcore_hal_send_request(h, pending);
2494 return TCORE_RETURN_SUCCESS;
2498 static TReturn s_ss_manage_call_5_send( CoreObject* o, UserRequest* ur, ConfirmCallback cb, void* user_data )
2500 TcorePlugin *p = NULL;
2502 TcorePending *pending = NULL;
2503 char* cmd_str = NULL;
2504 struct ATReqMetaInfo metainfo;
2507 p = tcore_object_ref_plugin(o);
2508 h = tcore_object_get_hal(o);
2510 memset(&metainfo, 0, sizeof(struct ATReqMetaInfo));
2511 metainfo.type = NO_RESULT;
2512 metainfo.responsePrefix[0] ='\0';
2513 info_len = sizeof(struct ATReqMetaInfo);
2515 tcore_user_request_set_metainfo(ur, info_len, &metainfo);
2518 cmd_str = g_strdup_printf("%s%s", "AT+CHLD=5", "\r");
2520 dbg("cmd : %s, prefix(if any) : %s, cmd_len : %d",cmd_str, "N/A", strlen(cmd_str));
2522 pending = tcore_pending_new(o, ID_RESERVED_AT);
2523 tcore_pending_set_request_data(pending, strlen(cmd_str), cmd_str);
2525 tcore_pending_set_timeout(pending, 0);
2526 tcore_pending_set_response_callback(pending, (TcorePendingResponseCallback)cb, user_data);
2527 tcore_pending_link_user_request(pending, ur);
2528 tcore_pending_set_priority(pending, TCORE_PENDING_PRIORITY_DEFAULT);
2530 tcore_pending_set_send_callback(pending, on_confirmation_call_control_ss_message_send, NULL);
2533 tcore_hal_send_request(h, pending);
2535 return TCORE_RETURN_SUCCESS;
2538 static TReturn s_ss_manage_call_6_send( CoreObject* o, UserRequest* ur, ConfirmCallback cb, void* user_data )
2540 TcorePlugin *p = NULL;
2542 TcorePending *pending = NULL;
2543 char* cmd_str = NULL;
2544 struct ATReqMetaInfo metainfo;
2547 p = tcore_object_ref_plugin(o);
2548 h = tcore_object_get_hal(o);
2550 memset(&metainfo, 0, sizeof(struct ATReqMetaInfo));
2551 metainfo.type = NO_RESULT;
2552 metainfo.responsePrefix[0] ='\0';
2553 info_len = sizeof(struct ATReqMetaInfo);
2555 tcore_user_request_set_metainfo(ur, info_len, &metainfo);
2558 cmd_str= g_strdup_printf("%s%s", "AT+CHLD=6", "\r");
2560 dbg("cmd : %s, prefix(if any) : %s, cmd_len : %d",cmd_str, "N/A", strlen(cmd_str));
2562 pending = tcore_pending_new(o, ID_RESERVED_AT);
2563 tcore_pending_set_request_data(pending, strlen(cmd_str), cmd_str);
2565 tcore_pending_set_timeout(pending, 0);
2566 tcore_pending_set_response_callback(pending, (TcorePendingResponseCallback)cb, user_data);
2567 tcore_pending_link_user_request(pending, ur);
2568 tcore_pending_set_priority(pending, TCORE_PENDING_PRIORITY_DEFAULT);
2570 tcore_pending_set_send_callback(pending, on_confirmation_call_control_ss_message_send, NULL);
2573 tcore_hal_send_request(h, pending);
2575 return TCORE_RETURN_SUCCESS;
2580 gboolean s_ss_init(TcorePlugin *p, TcoreHal *h)
2582 CoreObject *so = 0, *co = 0;
2583 struct property_call_info *data = 0;
2587 so = tcore_ss_new(p, "ss", &ss_ops, h);
2589 dbg("[ error ] ss_new()");
2593 co = tcore_plugin_ref_core_object(p, "call");
2595 dbg("[ error ] plugin_ref_core_object");
2599 tcore_call_control_set_operations( co, &call_ops );
2601 tcore_object_add_callback( so, EVENT_SS_INFO, on_notification_ss_info, 0 );
2602 tcore_object_add_callback( so, EVENT_SS_USSD, on_notification_ss_ussd, 0 );
2604 data = calloc( sizeof(struct property_call_info *), 1);
2605 tcore_plugin_link_property(p, "SS", data);
2610 void s_ss_exit( TcorePlugin *p )
2614 struct property_network_info *data;
2616 o = tcore_plugin_ref_core_object(p, "ss");
2618 data = tcore_plugin_ref_property(p, "SS");