Adding negotiation of speech codecs between GSM and SIP when using rtp-bridge
[lcr.git] / socket_server.c
index 1420268..ba4ff08 100644 (file)
@@ -13,6 +13,9 @@
 #include <sys/socket.h>
 #include <sys/un.h>
 #include <curses.h>
+#ifdef PACKAGE_VERSION
+#undef PACKAGE_VERSION
+#endif
 #include "config.h"
 
 
@@ -79,13 +82,15 @@ void free_connection(struct admin_list *admin)
 {
        struct admin_queue *response;
        void *temp;
+#ifdef WITH_MISDN
        union parameter param;
        class Join *join, *joinnext;
        struct mISDNport *mISDNport;
        int i, ii;
-       struct admin_list **adminp;
        class Port *port, *portnext;
        class Premote *remote;
+#endif
+       struct admin_list **adminp;
 
        /* free remote joins */
        if (admin->remote_name[0]) {
@@ -99,6 +104,7 @@ void free_connection(struct admin_list *admin)
                        "REMOTE APP release");
                add_trace("app", "name", "%s", admin->remote_name);
                end_trace();
+#ifdef WITH_MISDN
                /* release all exported channels */
                mISDNport = mISDNport_first;
                while(mISDNport) {
@@ -115,6 +121,8 @@ void free_connection(struct admin_list *admin)
                        }
                        mISDNport = mISDNport->next;
                }
+#endif
+#ifdef WITH_MISDN
                /* release join */
                join = join_first;
                while(join) {
@@ -144,6 +152,7 @@ void free_connection(struct admin_list *admin)
                        }
                        port = portnext;
                }
+#endif
        }
 
        if (admin->sock >= 0) {
@@ -433,6 +442,7 @@ int admin_block(struct admin_queue **responsep, int portnum, int block)
                goto out;
        }
 
+#ifdef WITH_MISDN
        /* no interface */
        if (!ifport->mISDNport) {
                /* not loaded anyway */
@@ -443,7 +453,7 @@ int admin_block(struct admin_queue **responsep, int portnum, int block)
 
                /* try loading interface */
                ifport->block = block;
-               load_port(ifport);
+               load_mISDN_port(ifport);
 
                /* port cannot load */
                if (ifport->block >= 2) {
@@ -465,6 +475,7 @@ int admin_block(struct admin_queue **responsep, int portnum, int block)
                ifport->block = 2;
                goto out;
        }
+#endif
        
        /* port new blocking state */
        ifport->block = response->am[0].u.x.block = block;
@@ -527,7 +538,7 @@ int admin_call(struct admin_list *admin, struct admin_message *msg)
 
        if (!(epoint = new Endpoint(0, 0)))
                FATAL("No memory for Endpoint instance\n");
-       if (!(epoint->ep_app = apppbx = new DEFAULT_ENDPOINT_APP(epoint, 1))) // outgoing
+       if (!(epoint->ep_app = apppbx = new EndpointAppPBX(epoint, 1))) // outgoing
                FATAL("No memory for Endpoint Application instance\n");
        apppbx->e_adminid = admin->sockserial;
        admin->epointid = epoint->ep_serial;
@@ -606,11 +617,13 @@ void admin_call_response(int adminid, int message, const char *connected, int ca
  */
 int admin_message_to_lcr(struct admin_msg *msg, struct admin_list *admin)
 {
+#ifdef WITH_MISDN
        struct mISDNport                *mISDNport;
-       class Join                      *join;
-       class JoinRemote                *joinremote = NULL; /* make GCC happy */
        class Port                      *port;
        class Premote                   *remote = NULL; /* make GCC happy */
+       class Join                      *join;
+       class JoinRemote                *joinremote = NULL; /* make GCC happy */
+#endif
        struct admin_list               *temp;
 
        /* hello message */
@@ -651,6 +664,7 @@ int admin_message_to_lcr(struct admin_msg *msg, struct admin_list *admin)
                return(-1);
        }
 
+#ifdef WITH_MISDN
        /* new join. the reply (NEWREF assignment) is sent from constructor */
        if (msg->type == MESSAGE_NEWREF) {
                if (msg->param.newref.mode) {
@@ -692,18 +706,20 @@ int admin_message_to_lcr(struct admin_msg *msg, struct admin_list *admin)
                }
                return(0);
        }
+#endif
 
+#ifdef WITH_MISDN
        /* bchannel message
         * no ref given for *_ack */
        if (msg->type == MESSAGE_BCHANNEL)
        if (msg->param.bchannel.type == BCHANNEL_ASSIGN_ACK
         || msg->param.bchannel.type == BCHANNEL_REMOVE_ACK
         || msg->param.bchannel.type == BCHANNEL_RELEASE) {
-#warning TODO: depending on the mode (join / remoteport) forward message
                /* no ref, but address */
                message_bchannel_from_remote(NULL, msg->param.bchannel.type, msg->param.bchannel.handle);
                return(0);
        }
+#endif
        
        /* check for ref */
        if (!msg->ref) {
@@ -711,6 +727,7 @@ int admin_message_to_lcr(struct admin_msg *msg, struct admin_list *admin)
                return(-1);
        }
 
+#ifdef WITH_MISDN
        /* find join instance */
        join = join_first;
        while(join) {
@@ -753,6 +770,7 @@ int admin_message_to_lcr(struct admin_msg *msg, struct admin_list *admin)
 
                return(0);
        }
+#endif
 
        PDEBUG(DEBUG_LOG, "No remote instance found with ref %d. (May have been already released.)\n", msg->ref);
        return(0);
@@ -810,14 +828,16 @@ int admin_state(struct admin_queue **responsep)
        class Port              *port;
        class EndpointAppPBX    *apppbx;
        class Join              *join;
+#ifdef WITH_MISDN
        class Pdss1             *pdss1;
-       struct interface        *interface;
-       struct interface_port   *ifport;
        struct mISDNport        *mISDNport;
        struct select_channel   *selchannel;
+       int                     anybusy;
+#endif
+       struct interface        *interface;
+       struct interface_port   *ifport;
        int                     i;
        int                     num;
-       int                     anybusy;
        struct admin_queue      *response;
        struct admin_list       *admin;
        struct tm               *now_tm;
@@ -842,6 +862,8 @@ int admin_state(struct admin_queue **responsep)
        interface = interface_first;
        while(interface) {
                ifport = interface->ifport;
+               if (!ifport)
+                       i++;
                while(ifport) {
                        i++;
                        ifport = ifport->next;
@@ -903,6 +925,18 @@ int admin_state(struct admin_queue **responsep)
        num = 0;
        while(interface) {
                ifport = interface->ifport;
+               if (!ifport) {
+                       /* message */
+                       response->am[num].message = ADMIN_RESPONSE_S_INTERFACE;
+                       /* interface */
+                       SCPY(response->am[num].u.i.interface_name, interface->name);
+                       /* portnum */
+                       response->am[num].u.i.portnum = -100; /* indicate: no ifport */
+                       /* iftype */
+                       response->am[num].u.i.extension = interface->extension;
+                       /* block */
+                       num++;
+               }
                while(ifport) {
                        /* message */
                        response->am[num].message = ADMIN_RESPONSE_S_INTERFACE;
@@ -916,6 +950,7 @@ int admin_state(struct admin_queue **responsep)
                        response->am[num].u.i.extension = interface->extension;
                        /* block */
                        response->am[num].u.i.block = ifport->block;
+#ifdef WITH_MISDN
                        if (ifport->mISDNport) {
                                mISDNport = ifport->mISDNport;
 
@@ -991,6 +1026,7 @@ int admin_state(struct admin_queue **responsep)
                                        i++;
                                }
                        }
+#endif
                        num++;
 
                        ifport = ifport->next;
@@ -1097,9 +1133,11 @@ int admin_state(struct admin_queue **responsep)
                if (apppbx->ea_endpoint->ep_park && apppbx->ea_endpoint->ep_park_len && apppbx->ea_endpoint->ep_park_len<=(int)sizeof(response->am[num].u.e.park_callid))
                        memcpy(response->am[num].u.e.park_callid, apppbx->ea_endpoint->ep_park_callid, apppbx->ea_endpoint->ep_park_len);
                response->am[num].u.e.park_len = apppbx->ea_endpoint->ep_park_len;
+#ifdef WITH_CRYPT
                /* crypt */
                if (apppbx->e_crypt == CRYPT_ON)
                        response->am[num].u.e.crypt = 1;
+#endif
                /* */
                apppbx = apppbx->next;
                num++;
@@ -1157,6 +1195,7 @@ int admin_state(struct admin_queue **responsep)
                        default:
                        response->am[num].u.p.state = ADMIN_STATE_IDLE;
                }
+#ifdef WITH_MISDN
                /* isdn */
                if ((port->p_type & PORT_CLASS_mISDN_MASK) == PORT_CLASS_DSS1) {
                        response->am[num].u.p.isdn = 1;
@@ -1165,6 +1204,7 @@ int admin_state(struct admin_queue **responsep)
                        response->am[num].u.p.isdn_hold = pdss1->p_m_hold;
                        response->am[num].u.p.isdn_ces = pdss1->p_m_d_ces;
                }
+#endif
                /* */
                port = port->next;
                num++;
@@ -1230,8 +1270,8 @@ int admin_handle_con(struct lcr_fd *fd, unsigned int what, void *instance, int i
                        /*release endpoint if exists */
                        if (admin->epointid) {
                                epoint = find_epoint_id(admin->epointid);
-                               if (epoint) {
-                                       ((class DEFAULT_ENDPOINT_APP *)epoint->ep_app)->
+                               if (epoint && epoint->ep_app_type == EAPP_TYPE_PBX) {
+                                       ((class EndpointAppPBX *)epoint->ep_app)->
                                                release(RELEASE_ALL, LOCATION_PRIVATE_LOCAL, CAUSE_NORMAL, LOCATION_PRIVATE_LOCAL, CAUSE_NORMAL, 0);
                                }
                        }