fixed bchannel create
[lcr.git] / chan_lcr.c
index ab9c76a..ab5886c 100644 (file)
@@ -342,6 +342,9 @@ void apply_opt(struct chan_call *call, char *data)
        char string[1024], *p = string, *opt, *key;
        int gain, i, newmode = 0;
 
+       if (!data[0])
+               return; // no opts
+
        strncpy(string, data, sizeof(string)-1);
        string[sizeof(string)-1] = '\0';
 
@@ -508,7 +511,7 @@ static void send_setup_to_lcr(struct chan_call *call)
        if (!call->ast || !call->ref)
                return;
 
-       CDEBUG(call, call->ast, "Sending setup to LCR. (interface=%s dialstring=%s)\n", call->interface, call->dialstring);
+       CDEBUG(call, call->ast, "Sending setup to LCR. (interface=%s dialstring=%s, cid=%s)\n", call->interface, call->dialstring, call->cid_num);
 
        /* send setup message to LCR */
        memset(&newparam, 0, sizeof(union parameter));
@@ -520,13 +523,13 @@ static void send_setup_to_lcr(struct chan_call *call)
                newparam.setup.callerinfo.ntype = INFO_NTYPE_UNKNOWN;
        strncpy(newparam.setup.callerinfo.display, call->display, sizeof(newparam.setup.callerinfo.display)-1);
        call->display[0] = '\0';
-       if (ast->cid.cid_num) if (ast->cid.cid_num[0])
-               strncpy(newparam.setup.callerinfo.id, ast->cid.cid_num, sizeof(newparam.setup.callerinfo.id)-1);
-       if (ast->cid.cid_name) if (ast->cid.cid_name[0])
-               strncpy(newparam.setup.callerinfo.name, ast->cid.cid_name, sizeof(newparam.setup.callerinfo.name)-1);
-       if (ast->cid.cid_rdnis) if (ast->cid.cid_rdnis[0])
+       if (call->cid_num[0])
+               strncpy(newparam.setup.callerinfo.id, call->cid_num, sizeof(newparam.setup.callerinfo.id)-1);
+       if (call->cid_name[0])
+               strncpy(newparam.setup.callerinfo.name, call->cid_name, sizeof(newparam.setup.callerinfo.name)-1);
+       if (call->cid_rdnis[0])
        {
-               strncpy(newparam.setup.redirinfo.id, ast->cid.cid_rdnis, sizeof(newparam.setup.redirinfo.id)-1);
+               strncpy(newparam.setup.redirinfo.id, call->cid_rdnis, sizeof(newparam.setup.redirinfo.id)-1);
                        newparam.setup.redirinfo.itype = INFO_ITYPE_CHAN;       
                newparam.setup.redirinfo.ntype = INFO_NTYPE_UNKNOWN;    
        }
@@ -1111,9 +1114,10 @@ int receive_message(int message_type, unsigned int ref, union parameter *param)
                                        CDEBUG(call, call->ast, "Join bchannel, because call is already bridged.\n");
                                        bchannel_join(bchannel, call->bridge_id);
                                }
+                               /* create only, if call exists, othewhise it bchannel is freed below... */
+                               if (bchannel_create(bchannel, ((call->transparent)?1:0) + ((call->hdlc)?2:0)))
+                                       bchannel_activate(bchannel, 1);
                        }
-                       if (bchannel_create(bchannel, ((call->transparent)?1:0) + ((call->hdlc)?2:0)))
-                               bchannel_activate(bchannel, 1);
                        /* acknowledge */
                        newparam.bchannel.type = BCHANNEL_ASSIGN_ACK;
                        newparam.bchannel.handle = param->bchannel.handle;
@@ -1651,11 +1655,32 @@ static int lcr_call(struct ast_channel *ast, char *dest, int timeout)
         && ast->transfercapability != INFO_BC_VIDEO)
                ast->transfercapability = INFO_BC_DATAUNRESTRICTED;
 
+       call->cid_num[0] = 0;
+       call->cid_name[0] = 0;
+       call->cid_rdnis[0] = 0;
+
+       if (ast->cid.cid_num) if (ast->cid.cid_num[0])
+               strncpy(call->cid_num, ast->cid.cid_num,
+                       sizeof(call->cid_num)-1);
+
+       if (ast->cid.cid_name) if (ast->cid.cid_name[0])
+               strncpy(call->cid_name, ast->cid.cid_name, 
+                       sizeof(call->cid_name)-1);
+       if (ast->cid.cid_rdnis) if (ast->cid.cid_rdnis[0])
+               strncpy(call->cid_rdnis, ast->cid.cid_rdnis, 
+                       sizeof(call->cid_rdnis)-1);
+
        ast_mutex_unlock(&chan_lock);
        return 0; 
 }
 
-static int lcr_digit(struct ast_channel *ast, char digit)
+static int lcr_digit_begin(struct ast_channel *ast, char digit)
+{
+       printf("DIGT BEGIN %c\n", digit);
+       return (0);
+}
+
+static int lcr_digit_end(struct ast_channel *ast, char digit, unsigned int duration)
 {
         struct chan_call *call;
        union parameter newparam;
@@ -2117,7 +2142,8 @@ static struct ast_channel_tech lcr_tech = {
        .type="LCR",
        .description="Channel driver for connecting to Linux-Call-Router",
        .requester=lcr_request,
-       .send_digit_begin=lcr_digit,
+       .send_digit_begin=lcr_digit_begin,
+       .send_digit_end=lcr_digit_end,
        .call=lcr_call,
        .bridge=lcr_bridge, 
        .hangup=lcr_hangup,