]> git.ipfire.org Git - thirdparty/freeswitch.git/commitdiff
update
authorAnthony Minessale <anthony.minessale@gmail.com>
Tue, 26 Jun 2007 00:47:05 +0000 (00:47 +0000)
committerAnthony Minessale <anthony.minessale@gmail.com>
Tue, 26 Jun 2007 00:47:05 +0000 (00:47 +0000)
git-svn-id: http://svn.openzap.org/svn/openzap/trunk@293 a93c3328-9c30-0410-af19-c9cd2b2d52af

libs/freetdm/src/include/zap_types.h
libs/freetdm/src/zap_io.c
libs/freetdm/src/zap_isdn.c

index 818fed2af80b37717c5b301abfaecf92c0fd5f3d..4055b0c93181e56898685b183bd532fecd1f0719 100644 (file)
@@ -277,6 +277,7 @@ typedef enum {
        ZAP_CHANNEL_STATE_DOWN,
        ZAP_CHANNEL_STATE_HANGUP,
        ZAP_CHANNEL_STATE_HOLD,
+       ZAP_CHANNEL_STATE_SUSPENDED,
        ZAP_CHANNEL_STATE_DIALTONE,
        ZAP_CHANNEL_STATE_COLLECT,
        ZAP_CHANNEL_STATE_RING,
@@ -294,7 +295,7 @@ typedef enum {
        ZAP_CHANNEL_STATE_UP,
        ZAP_CHANNEL_STATE_INVALID
 } zap_channel_state_t;
-#define CHANNEL_STATE_STRINGS "DOWN", "HANGUP", "HOLD", "DIALTONE", "COLLECT", \
+#define CHANNEL_STATE_STRINGS "DOWN", "HANGUP", "HOLD", "SUSPENDED", "DIALTONE", "COLLECT", \
                "RING", "BUSY", "ATTN", "GENRING", "DIALING", "GET_CALLERID", "CALLWAITING", \
                "TERMINATING", "RESTART", "PROGRESS_MEDIA", "PROGRESS", "IDLE", "UP", "INVALID"
 ZAP_STR2ENUM_P(zap_str2zap_channel_state, zap_channel_state2str, zap_channel_state_t)
index 77bd0ecc17aef52d3f43a14aec915a1c1d418862..477bc8f04f1abcbf07cecf22da7654f657c33066 100644 (file)
@@ -710,7 +710,7 @@ zap_status_t zap_channel_open_any(uint32_t span_id, zap_direction_t direction, z
                        
                        check = &span->channels[i];
                        
-                       if (zap_test_flag(check, ZAP_CHANNEL_READY) && !zap_test_flag(check, ZAP_CHANNEL_INUSE)) {
+                       if (zap_test_flag(check, ZAP_CHANNEL_READY) && !zap_test_flag(check, ZAP_CHANNEL_INUSE) && !zap_test_flag(check, ZAP_CHANNEL_SUSPENDED)) {
 
                                status = check->zio->open(check);
                                
@@ -787,6 +787,10 @@ zap_status_t zap_channel_open_chan(zap_channel_t *zchan)
 
        assert(zchan != NULL);
 
+       if (zap_test_flag(zchan, ZAP_CHANNEL_SUSPENDED)) {
+               return ZAP_FAIL;
+       }
+
        if (!zap_test_flag(zchan, ZAP_CHANNEL_READY) || (status = zap_mutex_trylock(zchan->mutex)) != ZAP_SUCCESS) {
                return status;
        }
@@ -815,7 +819,8 @@ zap_status_t zap_channel_open(uint32_t span_id, uint32_t chan_id, zap_channel_t
 
                check = &globals.spans[span_id].channels[chan_id];
 
-               if (!zap_test_flag(check, ZAP_CHANNEL_READY) || (status = zap_mutex_trylock(check->mutex)) != ZAP_SUCCESS) {
+               if (zap_test_flag(check, ZAP_CHANNEL_SUSPENDED) || 
+                       !zap_test_flag(check, ZAP_CHANNEL_READY) || (status = zap_mutex_trylock(check->mutex)) != ZAP_SUCCESS) {
                        goto done;
                }
                
index 8a3a14dd3d98c99047f08c8942797d2360a3a8d8..af4f89d41f0d169babe7793f70bb87d1b6675c66 100644 (file)
@@ -85,17 +85,29 @@ static L3INT zap_isdn_931_34(void *pvt, L2UCHAR *msg, L2INT mlen)
                case Q931mes_SERVICE:
                        {
                                Q931ie_ChangeStatus *changestatus = Q931GetIEPtr(gen->ChangeStatus, gen->buf);
-                               /* TODO: Handle this properly */
                                if (zchan) {
                                        switch (changestatus->NewStatus) {
                                        case 0: /* change status to "in service" */
-                                               //zap_set_state_locked(zchan, ZAP_CHANNEL_STATE_RESTART);
-                                               break;
+                                               zap_clear_flag_locked(zchan, ZAP_CHANNEL_SUSPENDED);
+                                               zap_log(ZAP_LOG_DEBUG, "Channel %d:%d in service\n", zchan->span_id, zchan->chan_id);
+                                               switch(zchan->state) {
+                                               case ZAP_CHANNEL_STATE_UP:
+                                               case ZAP_CHANNEL_STATE_IDLE:
+                                                       zap_set_state_locked(zchan, ZAP_CHANNEL_STATE_TERMINATING);
+                                                       break;
+                                               case ZAP_CHANNEL_STATE_DOWN:
+                                                       break;
+                                               default:
+                                                       zap_set_state_locked(zchan, ZAP_CHANNEL_STATE_DOWN);
+                                                       break;
+                                               }
                                        case 1: /* change status to "maintenance" */
-                                               //zap_set_state_locked(zchan, ZAP_CHANNEL_STATE_RESTART);
+                                               zap_set_flag_locked(zchan, ZAP_CHANNEL_SUSPENDED);
+                                               zap_set_state_locked(zchan, ZAP_CHANNEL_STATE_SUSPENDED);
                                                break;
                                        case 2: /* change status to "out of service" */
-                                               //zap_set_state_locked(zchan, ZAP_CHANNEL_STATE_RESTART);
+                                               zap_set_flag_locked(zchan, ZAP_CHANNEL_SUSPENDED);
+                                               zap_set_state_locked(zchan, ZAP_CHANNEL_STATE_SUSPENDED);
                                                break;
                                        default: /* unknown */
                                                break;