static unsigned long glob_channel=0;
+static void update_name(struct ast_channel *tmp, int port, int c)
+{
+ if (c<=0) {
+ c=glob_channel++;
+ ast_string_field_build(tmp, name, "%s/%d-u%d",
+ misdn_type, port, c);
+ } else {
+ ast_string_field_build(tmp, name, "%s/%d-%d",
+ misdn_type, port, c);
+ }
+
+ chan_misdn_log(3,port," --> updating channel name to [%s]\n",tmp->name);
+
+}
+
static struct ast_channel *misdn_new(struct chan_list *chlist, int state, char *exten, char *callerid, int format, int port, int c)
{
struct ast_channel *tmp;
if (tmp) {
chan_misdn_log(2, 0, " --> * NEW CHANNEL dad:%s oad:%s\n",exten,callerid);
-
- if (c<=0) {
- c=glob_channel++;
- ast_string_field_build(tmp, name, "%s/%d-u%d",
- misdn_type, port, c);
- } else {
- ast_string_field_build(tmp, name, "%s/%d-%d",
- misdn_type, port, c);
- }
-
+ update_name(tmp,port,c);
+
tmp->nativeformats = prefformat;
tmp->readformat = format;
switch (event) {
-
+
case EVENT_BCHAN_ACTIVATED:
break;
+ case EVENT_NEW_CHANNEL:
+ update_name(ch->ast,bc->port,bc->channel);
+ break;
case EVENT_NEW_L3ID:
ch->l3id=bc->l3_id;
case EVENT_SETUP_ACKNOWLEDGE:
{
ch->state = MISDN_CALLING_ACKNOWLEDGE;
+
+ if (bc->channel)
+ update_name(ch->ast,bc->port,bc->channel);
+
if (!ast_strlen_zero(bc->infos_pending)) {
/* TX Pending Infos */
-static int find_free_chan_in_stack(struct misdn_stack *stack, int channel)
+static int find_free_chan_in_stack(struct misdn_stack *stack, struct misdn_bchannel *bc, int channel)
{
int i;
if (!stack->channels[i]) {
cb_log (4, stack->port, " --> found chan%s: %d\n", channel>=0?" (preselected)":"", i+1);
stack->channels[i] = 1;
+ bc->channel=i+1;
+ cb_event(EVENT_NEW_CHANNEL, bc, NULL);
return i+1;
}
}
int free_chan;
if (stack->nt) {
- free_chan = find_free_chan_in_stack(stack, bc->channel_preselected?bc->channel:0);
+ free_chan = find_free_chan_in_stack(stack, bc, bc->channel_preselected?bc->channel:0);
if (!free_chan) return -1;
- bc->channel=free_chan;
+ /*bc->channel=free_chan;*/
cb_log(4,stack->port, " --> found channel: %d\n",free_chan);
} else {
if (stack->ptp || bc->te_choose_channel) {
/* we know exactly which channels are in use */
- free_chan = find_free_chan_in_stack(stack, bc->channel_preselected?bc->channel:0);
+ free_chan = find_free_chan_in_stack(stack, bc, bc->channel_preselected?bc->channel:0);
if (!free_chan) return -1;
- bc->channel=free_chan;
+ /*bc->channel=free_chan;*/
cb_log(0,stack->port, " --> found channel: %d\n",free_chan);
} else {
/* other phones could have made a call also on this port (ptmp) */
{
if (bc->channel == 0xff) {
- bc->channel=find_free_chan_in_stack(stack, 0);
+ bc->channel=find_free_chan_in_stack(stack, bc, 0);
if (!bc->channel) {
cb_log(-1, stack->port, "Any Channel Requested, but we have no more!!\n");
break;
case EVENT_RETRIEVE_ACKNOWLEDGE:
if (stack->nt) {
if (bc->channel <=0 ) { /* else we have the channel already */
- bc->channel = find_free_chan_in_stack(stack, 0);
+ bc->channel = find_free_chan_in_stack(stack, bc, 0);
if (!bc->channel) {
cb_log(-1, stack->port, " No free channel at the moment\n");
EVENT_DTMF_TONE,
EVENT_NEW_L3ID,
EVENT_NEW_BC,
+ EVENT_NEW_CHANNEL,
EVENT_UNKNOWN
};
cb_log(0,bc->port,"We already have a channel (%d)\n", bc->channel);
} else {
bc->channel = channel;
+ cb_event(EVENT_NEW_CHANNEL,bc,NULL);
}
}
- if (channel > 0 && !bc->nt )
+ if (channel > 0 && !bc->nt ) {
bc->channel = channel;
+ cb_event(EVENT_NEW_CHANNEL,bc,NULL);
+ }
}
void parse_proceeding (struct isdn_msg msgs[], msg_t *msg, struct misdn_bchannel *bc, int nt)
char EVENT_DTMF_TONE_INFO[] = "DTMF_TONE";
char EVENT_NEW_L3ID_INFO[] = "NEW_L3ID";
char EVENT_NEW_BC_INFO[] = "NEW_BC";
+char EVENT_NEW_CHANNEL_INFO[] = "NEW_CHANNEL";
char EVENT_BCHAN_DATA_INFO[] = "BCHAN_DATA";
char EVENT_BCHAN_ACTIVATED_INFO[] = "BCHAN_ACTIVATED";
char EVENT_TONE_GENERATE_INFO[] = "TONE_GENERATE";
if (event == EVENT_DTMF_TONE) return EVENT_DTMF_TONE_INFO;
if (event == EVENT_NEW_L3ID) return EVENT_NEW_L3ID_INFO;
if (event == EVENT_NEW_BC) return EVENT_NEW_BC_INFO;
+ if (event == EVENT_NEW_CHANNEL) return EVENT_NEW_CHANNEL_INFO;
if (event == EVENT_BCHAN_DATA) return EVENT_BCHAN_DATA_INFO;
if (event == EVENT_BCHAN_ACTIVATED) return EVENT_BCHAN_ACTIVATED_INFO;
if (event == EVENT_TONE_GENERATE) return EVENT_TONE_GENERATE_INFO;