#define SOFT_RELOAD 1
/* END: Changes heres */
+char *interface_status[] = { /* should match SKYPIAX_STATE_xxx in skypiax.h */
+ "IDLE",
+ "DOWN",
+ "RING",
+ "DIALING",
+ "BUSY",
+ "UP",
+ "RINGING",
+ "PRERING",
+ "DOUBLE",
+ "SELECTD",
+ "HANG_RQ",
+ "PREANSW"
+};
+char *skype_callflow[] = { /* should match CALLFLOW_XXX in skypiax.h */
+"CALL_IDLE",
+"CALL_DOWN",
+"INCOMING_RNG",
+"CALL_DIALING",
+"CALL_LINEBUSY",
+"CALL_ACTIVE",
+"INCOMING_HNG",
+"CALL_RLEASD",
+"CALL_NOCARR",
+"CALL_INFLUX",
+"CALL_INCOMING",
+"CALL_FAILED",
+"CALL_NOSRVC",
+"CALL_OUTRESTR",
+"CALL_SECFAIL",
+"CALL_NOANSWER",
+"STATUS_FNSHED",
+"STATUS_CANCLED",
+"STATUS_FAILED",
+"STATUS_REFUSED",
+"STATUS_RINGING",
+"STATUS_INPROGRS",
+"STATUS_UNPLACD",
+"STATUS_ROUTING",
+"STATUS_EARLYMD",
+"INCOMING_CLID",
+"STATUS_RMTEHOLD"
+};
+
+
static struct {
int debug;
char *ip;
static switch_status_t channel_on_destroy(switch_core_session_t *session);
static switch_status_t channel_on_routing(switch_core_session_t *session);
static switch_status_t channel_on_exchange_media(switch_core_session_t *session);
+static switch_status_t channel_on_consume_media(switch_core_session_t *session);
static switch_status_t channel_on_soft_execute(switch_core_session_t *session);
static switch_call_cause_t channel_outgoing_channel(switch_core_session_t *session,
switch_event_t *var_event,
channel = switch_core_session_get_channel(session);
switch_assert(channel != NULL);
- DEBUGA_SKYPE("%s CHANNEL INIT\n", SKYPIAX_P_LOG, switch_channel_get_name(channel));
+ //ERRORA("%s CHANNEL INIT\n", SKYPIAX_P_LOG, tech_pvt->name);
switch_set_flag(tech_pvt, TFLAG_IO);
/* Move channel's state machine to ROUTING. This means the call is trying
globals.calls++;
switch_mutex_unlock(globals.mutex);
+ DEBUGA_SKYPE("%s CHANNEL INIT %s\n", SKYPIAX_P_LOG, tech_pvt->name, switch_core_session_get_uuid(session));
return SWITCH_STATUS_SUCCESS;
}
tech_pvt = switch_core_session_get_private(session);
+
if (tech_pvt) {
+ DEBUGA_SKYPE("%s CHANNEL DESTROY %s\n", SKYPIAX_P_LOG, tech_pvt->name, switch_core_session_get_uuid(session));
+
if (switch_core_codec_ready(&tech_pvt->read_codec)) {
switch_core_codec_destroy(&tech_pvt->read_codec);
}
switch_core_codec_destroy(&tech_pvt->write_codec);
}
*tech_pvt->session_uuid_str = '\0';
+ tech_pvt->interface_state = SKYPIAX_STATE_IDLE;
+ if(tech_pvt->skype_callflow == CALLFLOW_STATUS_FINISHED){
+ tech_pvt->skype_callflow = CALLFLOW_CALL_IDLE;
+ }
switch_core_session_set_private(session, NULL);
+ } else {
+ DEBUGA_SKYPE("!!!!!!NO tech_pvt!!!! CHANNEL DESTROY %s\n", SKYPIAX_P_LOG, switch_core_session_get_uuid(session));
}
return SWITCH_STATUS_SUCCESS;
tech_pvt = switch_core_session_get_private(session);
switch_assert(tech_pvt != NULL);
+ if (!switch_channel_test_flag(channel, CF_ANSWERED)) {
+ if (switch_channel_direction(channel) == SWITCH_CALL_DIRECTION_OUTBOUND) {
+ tech_pvt->ob_failed_calls++;
+ } else {
+ tech_pvt->ib_failed_calls++;
+ }
+ }
+
switch_clear_flag(tech_pvt, TFLAG_IO);
switch_clear_flag(tech_pvt, TFLAG_VOICE);
//switch_set_flag(tech_pvt, TFLAG_HANGUP);
}
//memset(tech_pvt->session_uuid_str, '\0', sizeof(tech_pvt->session_uuid_str));
//*tech_pvt->session_uuid_str = '\0';
- DEBUGA_SKYPE("%s CHANNEL HANGUP\n", SKYPIAX_P_LOG, switch_channel_get_name(channel));
+ DEBUGA_SKYPE("%s CHANNEL HANGUP\n", SKYPIAX_P_LOG, tech_pvt->name);
switch_mutex_lock(globals.mutex);
globals.calls--;
if (globals.calls < 0) {
globals.calls = 0;
}
+
+ tech_pvt->interface_state = SKYPIAX_STATE_IDLE;
+ if(tech_pvt->skype_callflow == CALLFLOW_STATUS_FINISHED){
+ tech_pvt->skype_callflow = CALLFLOW_CALL_IDLE;
+ }
switch_mutex_unlock(globals.mutex);
return SWITCH_STATUS_SUCCESS;
tech_pvt = switch_core_session_get_private(session);
switch_assert(tech_pvt != NULL);
- DEBUGA_SKYPE("%s CHANNEL ROUTING\n", SKYPIAX_P_LOG, switch_channel_get_name(channel));
+ DEBUGA_SKYPE("%s CHANNEL ROUTING\n", SKYPIAX_P_LOG, tech_pvt->name);
return SWITCH_STATUS_SUCCESS;
}
tech_pvt = switch_core_session_get_private(session);
switch_assert(tech_pvt != NULL);
- DEBUGA_SKYPE("%s CHANNEL EXECUTE\n", SKYPIAX_P_LOG, switch_channel_get_name(channel));
+ DEBUGA_SKYPE("%s CHANNEL EXECUTE\n", SKYPIAX_P_LOG, tech_pvt->name);
return SWITCH_STATUS_SUCCESS;
}
tech_pvt = switch_core_session_get_private(session);
switch_assert(tech_pvt != NULL);
+ DEBUGA_SKYPE("%s CHANNEL KILL_CHANNEL\n", SKYPIAX_P_LOG, tech_pvt->name);
switch (sig) {
case SWITCH_SIG_KILL:
DEBUGA_SKYPE("%s CHANNEL got SWITCH_SIG_KILL\n", SKYPIAX_P_LOG, switch_channel_get_name(channel));
return SWITCH_STATUS_SUCCESS;
}
+static switch_status_t channel_on_consume_media(switch_core_session_t *session)
+{
+ private_t *tech_pvt = NULL;
+
+ tech_pvt = switch_core_session_get_private(session);
+
+ DEBUGA_SKYPE("%s CHANNEL CONSUME_MEDIA\n", SKYPIAX_P_LOG, tech_pvt->name);
+ return SWITCH_STATUS_SUCCESS;
+}
+
static switch_status_t channel_on_exchange_media(switch_core_session_t *session)
{
private_t *tech_pvt = NULL;
- DEBUGA_SKYPE("CHANNEL LOOPBACK\n", SKYPIAX_P_LOG);
+ tech_pvt = switch_core_session_get_private(session);
+ DEBUGA_SKYPE("%s CHANNEL EXCHANGE_MEDIA\n", SKYPIAX_P_LOG, tech_pvt->name);
return SWITCH_STATUS_SUCCESS;
}
static switch_status_t channel_on_soft_execute(switch_core_session_t *session)
{
private_t *tech_pvt = NULL;
- DEBUGA_SKYPE("CHANNEL TRANSMIT\n", SKYPIAX_P_LOG);
+ tech_pvt = switch_core_session_get_private(session);
+ DEBUGA_SKYPE("%s CHANNEL SOFT_EXECUTE\n", SKYPIAX_P_LOG, tech_pvt->name);
return SWITCH_STATUS_SUCCESS;
}
private_t *tech_pvt = switch_core_session_get_private(session);
switch_assert(tech_pvt != NULL);
+ DEBUGA_SKYPE("%s CHANNEL SEND_DTMF\n", SKYPIAX_P_LOG, tech_pvt->name);
DEBUGA_SKYPE("DTMF: %c\n", SKYPIAX_P_LOG, dtmf->digit);
skypiax_senddigit(tech_pvt, dtmf->digit);
/*.on_hangup */ channel_on_hangup,
/*.on_exchange_media */ channel_on_exchange_media,
/*.on_soft_execute */ channel_on_soft_execute,
- /*.on_consume_media */ NULL,
+ /*.on_consume_media */ channel_on_consume_media,
/*.on_hibernate */ NULL,
/*.on_reset */ NULL,
/*.on_park */ NULL,
int found = 0;
char interface_name[256];
+ DEBUGA_SKYPE("1 SESSION_REQUEST %s\n", SKYPIAX_P_LOG, switch_core_session_get_uuid(*new_session));
switch_core_session_add_stream(*new_session, NULL);
DEBUGA_SKYPE
("globals.SKYPIAX_INTERFACES[%d].name=|||%s||| session_uuid_str=|||%s||| is BUSY\n",
SKYPIAX_P_LOG, i, globals.SKYPIAX_INTERFACES[i].name, globals.SKYPIAX_INTERFACES[i].session_uuid_str);
+ DEBUGA_SKYPE("1 SESSION_DESTROY %s\n", SKYPIAX_P_LOG, switch_core_session_get_uuid(*new_session));
switch_core_session_destroy(new_session);
switch_mutex_unlock(globals.mutex);
return SWITCH_CAUSE_DESTINATION_OUT_OF_ORDER;
if (!found) {
DEBUGA_SKYPE("Doh! no available interface for |||%s|||?\n", SKYPIAX_P_LOG, interface_name);
+ DEBUGA_SKYPE("2 SESSION_DESTROY %s\n", SKYPIAX_P_LOG, switch_core_session_get_uuid(*new_session));
switch_core_session_destroy(new_session);
switch_mutex_unlock(globals.mutex);
//return SWITCH_CAUSE_DESTINATION_OUT_OF_ORDER;
switch_mutex_unlock(globals.mutex);
return SWITCH_CAUSE_DESTINATION_OUT_OF_ORDER;
}
+
+ tech_pvt->ob_calls++;
rdest = strchr(caller_profile->destination_number, '/');
*rdest++ = '\0';
} else {
DEBUGA_SKYPE("no session\n", SKYPIAX_P_LOG);
}
+ switch_mutex_lock(globals.mutex);
tech_pvt->interface_state = SKYPIAX_STATE_DOWN;
*tech_pvt->session_uuid_str = '\0';
*tech_pvt->skype_call_id = '\0';
+ switch_mutex_unlock(globals.mutex);
//ERRORA("LET'S WAIT\n", SKYPIAX_P_LOG);
switch_sleep(300000); //0.3 sec
//ERRORA("WAIT'S OVER\n", SKYPIAX_P_LOG);
- tech_pvt->skype_callflow = CALLFLOW_STATUS_FINISHED;
+ //tech_pvt->skype_callflow = CALLFLOW_STATUS_FINISHED;
+ //usleep(30000); //0.03 sec
+ switch_mutex_lock(globals.mutex);
+ tech_pvt->skype_callflow = CALLFLOW_CALL_IDLE;
+ tech_pvt->interface_state = SKYPIAX_STATE_IDLE;
+ switch_mutex_unlock(globals.mutex);
} else {
ERRORA("no tech_pvt?\n", SKYPIAX_P_LOG);
}
switch_channel_t *channel = NULL;
if ((session = switch_core_session_request(skypiax_endpoint_interface, SWITCH_CALL_DIRECTION_INBOUND, NULL)) != 0) {
+ DEBUGA_SKYPE("2 SESSION_REQUEST %s\n", SKYPIAX_P_LOG, switch_core_session_get_uuid(session));
switch_core_session_add_stream(session, NULL);
channel = switch_core_session_get_channel(session);
if (!channel) {
int i;
char next_flag_char = ' ';
+ stream->write_function(stream, "F ID\t Name \tIB (F/T) OB (F/T)\tState\tCallFlw\t\tUUID\n");
+ stream->write_function(stream, "= ====\t ======== \t======= =======\t======\t============\t======\n");
+
for (i = 0; i < SKYPIAX_MAX_INTERFACES; i++) {
next_flag_char = i == globals.next_interface ? '*' : ' ';
if (strlen(globals.SKYPIAX_INTERFACES[i].name)) {
- if (strlen(globals.SKYPIAX_INTERFACES[i].session_uuid_str)) {
- stream->write_function(stream,
- "%c\t%d\t[%s]\tBUSY, session_uuid_str=|||%s|||\n",
- next_flag_char, i, globals.SKYPIAX_INTERFACES[i].name, globals.SKYPIAX_INTERFACES[i].session_uuid_str);
- } else {
- stream->write_function(stream, "%c\t%d\t[%s]\tIDLE\n", next_flag_char, i, globals.SKYPIAX_INTERFACES[i].name);
- }
- } else if (argc > 1 && !strcasecmp(argv[1], "full")) {
+ stream->write_function(stream,
+ "%c %d\t[%s]\t%3ld/%ld\t%6ld/%ld\t%s\t%s\t%s\n",
+ next_flag_char,
+ i, globals.SKYPIAX_INTERFACES[i].name,
+ globals.SKYPIAX_INTERFACES[i].ib_failed_calls,
+ globals.SKYPIAX_INTERFACES[i].ib_calls,
+ globals.SKYPIAX_INTERFACES[i].ob_failed_calls,
+ globals.SKYPIAX_INTERFACES[i].ob_calls,
+ interface_status[globals.SKYPIAX_INTERFACES[i].interface_state],
+ skype_callflow[globals.SKYPIAX_INTERFACES[i].skype_callflow],
+ globals.SKYPIAX_INTERFACES[i].session_uuid_str);
+ } else if(argc > 1 && !strcasecmp(argv[1], "full")) {
stream->write_function(stream, "%c\t%d\n", next_flag_char, i);
- }
+ }
}
stream->write_function(stream, "\nTotal: %d\n", globals.real_interfaces - 1);
if (tech_pvt && tech_pvt->skype_call_id && !strlen(tech_pvt->skype_call_id)) {
/* we are not inside an active call */
+ tech_pvt->ib_calls++;
+
sprintf(msg_to_skype, "GET CALL %s PARTNER_DISPNAME", id);
skypiax_signaling_write(tech_pvt, msg_to_skype);
switch_sleep(10000);
+ tech_pvt->interface_state = SKYPIAX_STATE_PREANSWER;
sprintf(msg_to_skype, "ALTER CALL %s ANSWER", id);
skypiax_signaling_write(tech_pvt, msg_to_skype);
DEBUGA_SKYPE("We answered a Skype RING on skype_call %s\n", SKYPIAX_P_LOG, id);
if (!tech_pvt || !tech_pvt->skype_call_id || !strlen(tech_pvt->skype_call_id)) {
/* we are not inside an active call */
- ERRORA("We're NO MORE in a call now %s\n", SKYPIAX_P_LOG, (tech_pvt && tech_pvt->skype_call_id) ? tech_pvt->skype_call_id : "");
+ DEBUGA_SKYPE("We're NO MORE in a call now %s\n", SKYPIAX_P_LOG, (tech_pvt && tech_pvt->skype_call_id) ? tech_pvt->skype_call_id : "");
switch_mutex_unlock(globals.mutex);
} else {
DEBUGA_SKYPE
("Let's transfer the skype_call %s to %s interface (with skype_user: %s), because we are already in a skypiax call(%s)\n",
SKYPIAX_P_LOG, tech_pvt->skype_call_id, available_skypiax_interface->name, available_skypiax_interface->skype_user, id);
+
+ //FIXME why this? the inbound call will come, eventually, on that other interface
+ //available_skypiax_interface->ib_calls++;
+
sprintf(msg_to_skype, "ALTER CALL %s TRANSFER %s", id, available_skypiax_interface->skype_user);
skypiax_signaling_write(tech_pvt, msg_to_skype);
+ if(tech_pvt->interface_state == SKYPIAX_STATE_SELECTED) {
+ tech_pvt->interface_state = SKYPIAX_STATE_IDLE; //we marked it SKYPIAX_STATE_SELECTED just in case it has to make an outbound call
+ }
} else {
/* no skypiax interfaces idle, do nothing */
DEBUGA_SKYPE
#define SKYPIAX_CONTROL_ANSWER 2
/*********************************/
-#define SKYPIAX_STATE_DOWN 1
-#define SKYPIAX_STATE_RING 2
-#define SKYPIAX_STATE_DIALING 3
-#define SKYPIAX_STATE_BUSY 4
-#define SKYPIAX_STATE_UP 5
-#define SKYPIAX_STATE_RINGING 6
-#define SKYPIAX_STATE_PRERING 7
-#define SKYPIAX_STATE_ERROR_DOUBLE_CALL 8
-#define SKYPIAX_STATE_SELECTED 9
+#define SKYPIAX_STATE_IDLE 0
+#define SKYPIAX_STATE_DOWN 1
+#define SKYPIAX_STATE_RING 2
+#define SKYPIAX_STATE_DIALING 3
+#define SKYPIAX_STATE_BUSY 4
+#define SKYPIAX_STATE_UP 5
+#define SKYPIAX_STATE_RINGING 6
+#define SKYPIAX_STATE_PRERING 7
+#define SKYPIAX_STATE_ERROR_DOUBLE_CALL 8
+#define SKYPIAX_STATE_SELECTED 9
+#define SKYPIAX_STATE_HANGUP_REQUESTED 10
+#define SKYPIAX_STATE_PREANSWER 11
/*********************************/
/* call flow from the device */
-#define CALLFLOW_CALL_IDLE SKYPIAX_STATE_DOWN
-#define CALLFLOW_INCOMING_RING SKYPIAX_STATE_RING
-#define CALLFLOW_CALL_DIALING SKYPIAX_STATE_DIALING
-#define CALLFLOW_CALL_LINEBUSY SKYPIAX_STATE_BUSY
-#define CALLFLOW_CALL_ACTIVE 300
-#define CALLFLOW_INCOMING_HANGUP 100
-#define CALLFLOW_CALL_RELEASED 101
-#define CALLFLOW_CALL_NOCARRIER 102
-#define CALLFLOW_CALL_INFLUX 103
-#define CALLFLOW_CALL_INCOMING 104
-#define CALLFLOW_CALL_FAILED 105
-#define CALLFLOW_CALL_NOSERVICE 106
-#define CALLFLOW_CALL_OUTGOINGRESTRICTED 107
-#define CALLFLOW_CALL_SECURITYFAIL 108
-#define CALLFLOW_CALL_NOANSWER 109
-#define CALLFLOW_STATUS_FINISHED 110
-#define CALLFLOW_STATUS_CANCELLED 111
-#define CALLFLOW_STATUS_FAILED 112
-#define CALLFLOW_STATUS_REFUSED 113
-#define CALLFLOW_STATUS_RINGING 114
-#define CALLFLOW_STATUS_INPROGRESS 115
-#define CALLFLOW_STATUS_UNPLACED 116
-#define CALLFLOW_STATUS_ROUTING 117
-#define CALLFLOW_STATUS_EARLYMEDIA 118
-#define SKYPIAX_STATE_HANGUP_REQUESTED 200
- //FIXME CALLFLOW_INCOMING_CALLID to be removed
-#define CALLFLOW_INCOMING_CALLID 1019
-#define CALLFLOW_STATUS_REMOTEHOLD 201
+#define CALLFLOW_CALL_IDLE 0
+#define CALLFLOW_CALL_DOWN 1
+#define CALLFLOW_INCOMING_RING 2
+#define CALLFLOW_CALL_DIALING 3
+#define CALLFLOW_CALL_LINEBUSY 4
+#define CALLFLOW_CALL_ACTIVE 5
+#define CALLFLOW_INCOMING_HANGUP 6
+#define CALLFLOW_CALL_RELEASED 7
+#define CALLFLOW_CALL_NOCARRIER 8
+#define CALLFLOW_CALL_INFLUX 9
+#define CALLFLOW_CALL_INCOMING 10
+#define CALLFLOW_CALL_FAILED 11
+#define CALLFLOW_CALL_NOSERVICE 12
+#define CALLFLOW_CALL_OUTGOINGRESTRICTED 13
+#define CALLFLOW_CALL_SECURITYFAIL 14
+#define CALLFLOW_CALL_NOANSWER 15
+#define CALLFLOW_STATUS_FINISHED 16
+#define CALLFLOW_STATUS_CANCELLED 17
+#define CALLFLOW_STATUS_FAILED 18
+#define CALLFLOW_STATUS_REFUSED 19
+#define CALLFLOW_STATUS_RINGING 20
+#define CALLFLOW_STATUS_INPROGRESS 21
+#define CALLFLOW_STATUS_UNPLACED 22
+#define CALLFLOW_STATUS_ROUTING 23
+#define CALLFLOW_STATUS_EARLYMEDIA 24
+#define CALLFLOW_INCOMING_CALLID 25
+#define CALLFLOW_STATUS_REMOTEHOLD 26
/*********************************/
char transfer_callid_number[50];
char skype_transfer_call_id[512];
int running;
+ unsigned long ib_calls;
+ unsigned long ob_calls;
+ unsigned long ib_failed_calls;
+ unsigned long ob_failed_calls;
};
typedef struct private_object private_t;
tech_pvt->tcp_cli_port, tech_pvt->tcp_srv_port);
return -1;
}
- //usleep(100);
}
DEBUGA_SKYPE("SUCCESS! *which_port=%d, tech_pvt->tcp_cli_port=%d, tech_pvt->tcp_srv_port=%d\n", SKYPIAX_P_LOG, *which_port, tech_pvt->tcp_cli_port,
//SKYPIAX_P_LOG, message, obj, id, prop, value, where ? where : "NULL");
if (!strcasecmp(prop, "PARTNER_HANDLE")) {
- if (!strlen(tech_pvt->skype_call_id) || !strlen(tech_pvt->session_uuid_str)) {
+ if (tech_pvt->interface_state != SKYPIAX_STATE_SELECTED && (!strlen(tech_pvt->skype_call_id) || !strlen(tech_pvt->session_uuid_str)) ) {
//if (!strlen(tech_pvt->skype_call_id)) {
/* we are NOT inside an active call */
DEBUGA_SKYPE("Call %s TRY ANSWER\n", SKYPIAX_P_LOG, id);
}
if (!strcasecmp(prop, "CONF_ID") && !strcasecmp(value, "0")) {
//DEBUGA_SKYPE("the skype_call %s is NOT a conference call\n", SKYPIAX_P_LOG, id);
- if (tech_pvt->interface_state == SKYPIAX_STATE_DOWN)
- tech_pvt->interface_state = SKYPIAX_STATE_PRERING;
+ //if (tech_pvt->interface_state == SKYPIAX_STATE_DOWN)
+ //tech_pvt->interface_state = SKYPIAX_STATE_PRERING;
}
if (!strcasecmp(prop, "CONF_ID") && strcasecmp(value, "0")) {
DEBUGA_SKYPE("the skype_call %s is a conference call\n", SKYPIAX_P_LOG, id);
- if (tech_pvt->interface_state == SKYPIAX_STATE_DOWN)
- tech_pvt->interface_state = SKYPIAX_STATE_PRERING;
+ //if (tech_pvt->interface_state == SKYPIAX_STATE_DOWN)
+ //tech_pvt->interface_state = SKYPIAX_STATE_PRERING;
}
if (!strcasecmp(prop, "DTMF")) {
DEBUGA_SKYPE("Call %s received a DTMF: %s\n", SKYPIAX_P_LOG, id, value);
DEBUGA_SKYPE("We missed skype_call %s\n", SKYPIAX_P_LOG, id);
} else if (!strcasecmp(value, "FINISHED")) {
//DEBUGA_SKYPE("skype_call %s now is DOWN\n", SKYPIAX_P_LOG, id);
- //usleep(150000);//150msec, let's give the TCP sockets time to timeout
if (!strcasecmp(tech_pvt->skype_call_id, id)) {
//tech_pvt->skype_callflow = CALLFLOW_STATUS_FINISHED;
DEBUGA_SKYPE("skype_call %s is MY call, now I'm going DOWN\n", SKYPIAX_P_LOG, id);
DEBUGA_SKYPE("New Inbound Channel!\n\n\n\n", SKYPIAX_P_LOG);
new_inbound_channel(tech_pvt);
} else {
- DEBUGA_SKYPE("Outbound Channel Answered!\n", SKYPIAX_P_LOG);
+ DEBUGA_SKYPE("Outbound Channel Answered! session_uuid_str=%s\n", SKYPIAX_P_LOG, tech_pvt->session_uuid_str);
outbound_channel_answered(tech_pvt);
}
} else {