]> git.ipfire.org Git - thirdparty/freeswitch.git/commitdiff
adding MG_FAX_NOTIFIED flag to notify only one fax event(ced or cng) per call to mgc
authorKapil Gupta <kgupta@sangoma.com>
Thu, 6 Sep 2012 21:14:42 +0000 (17:14 -0400)
committerKapil Gupta <kgupta@sangoma.com>
Thu, 6 Sep 2012 21:14:42 +0000 (17:14 -0400)
src/mod/endpoints/mod_media_gateway/media_gateway.c
src/mod/endpoints/mod_media_gateway/media_gateway_xml.c
src/mod/endpoints/mod_media_gateway/mod_media_gateway.c
src/mod/endpoints/mod_media_gateway/mod_media_gateway.h

index eaf33cdcc28fcf4401e921e3658eb9bba9fe6f98..ee96bc319d528b8b09ef8937823862787be3b184 100644 (file)
@@ -172,54 +172,30 @@ switch_status_t megaco_activate_termination(mg_termination_t *term)
         term->uuid = NULL;
     }
     
-    if (zstr(term->uuid)) {    
-        switch_channel_t *channel;
-        if (switch_ivr_originate(NULL, &session, &cause, dialstring, 0, NULL, NULL, NULL, NULL, var_event, 0, NULL) != SWITCH_STATUS_SUCCESS) {
-            switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Failed to instanciate termination [%s]: %s\n", term->name, switch_channel_cause2str(cause));   
-            status = SWITCH_STATUS_FALSE;
-            goto done;
-        }
-        
-        term->uuid = switch_core_strdup(term->pool, switch_core_session_get_uuid(session));
-        switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "Termination [%s] successfully instanciated as [%s] [%s]\n", term->name, dialstring, switch_core_session_get_uuid(session));   
-        channel = switch_core_session_get_channel(session);
-        switch_channel_set_private(channel, PVT_MG_TERM, term);
+       if (zstr(term->uuid)) {    
+               switch_channel_t *channel;
+               if (switch_ivr_originate(NULL, &session, &cause, dialstring, 0, NULL, NULL, NULL, NULL, var_event, 0, NULL) != SWITCH_STATUS_SUCCESS) {
+                       switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Failed to instanciate termination [%s]: %s\n", term->name, switch_channel_cause2str(cause));   
+                       status = SWITCH_STATUS_FALSE;
+                       goto done;
+               }
 
-        if (term->type == MG_TERM_RTP && term->u.rtp.t38_options) {
-            switch_channel_set_private(channel, "t38_options", term->u.rtp.t38_options);
-        }
-        
-        switch_core_event_hook_add_recv_dtmf(session, mg_on_dtmf);
-               
-               if ((term->type == MG_TERM_TDM) && (term->profile)){
-                               switch(term->profile->fax_detect_evt_type){
-                                       case MG_FAX_DETECT_EVENT_TYPE_CED:
-                                               { 
-                                                       switch_core_session_execute_application_async(session, "spandsp_start_fax_detect", "mg_notify ced 120 ced");
-                                                       break;
-                                               }
-                                       case MG_FAX_DETECT_EVENT_TYPE_CNG:
-                                               { 
-                                                       switch_core_session_execute_application_async(session, "spandsp_start_fax_detect", "mg_notify cng 120 cng");
-                                                       break;
-                                               }
-                                       case MG_FAX_DETECT_EVENT_TYPE_CNG_CED:
-                                               { 
-                                                       switch_core_session_execute_application_async(session, "spandsp_start_fax_detect", "mg_notify cng 120 cng");
-                                                       switch_core_session_execute_application_async(session, "spandsp_start_fax_detect", "mg_notify ced 120 ced");
-                                                       break;
-                                               }
-                                       case MG_FAX_DETECT_EVENT_TYPE_DISABLE:
-                                               {
-                                                       switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "FAX detection Disable\n");
-                                                       break;
-                                               }
-                                       default:
-                                               switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Invalid FAX detection Event[%d]\n",term->profile->fax_detect_evt_type);
-                                               break;
-                               }
-                       }
-    }
+               term->uuid = switch_core_strdup(term->pool, switch_core_session_get_uuid(session));
+               switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "Termination [%s] successfully instanciated as [%s] [%s]\n", term->name, dialstring, switch_core_session_get_uuid(session));   
+               channel = switch_core_session_get_channel(session);
+               switch_channel_set_private(channel, PVT_MG_TERM, term);
+
+               if (term->type == MG_TERM_RTP && term->u.rtp.t38_options) {
+                       switch_channel_set_private(channel, "t38_options", term->u.rtp.t38_options);
+               }
+
+               switch_core_event_hook_add_recv_dtmf(session, mg_on_dtmf);
+               if (term->type == MG_TERM_TDM){
+                       switch_core_session_execute_application_async(session, "spandsp_start_fax_detect", "mg_notify ced 120 ced");
+                       switch_core_session_execute_application_async(session, "spandsp_start_fax_detect", "mg_notify cng 120 cng");
+               }
+
+       }
     
     switch_set_flag(term, MGT_ACTIVE);
     
@@ -419,6 +395,7 @@ void megaco_termination_destroy(mg_termination_t *term)
 
     switch_clear_flag(term, MGT_ALLOCATED);
     switch_clear_flag(term, MGT_ACTIVE);
+    switch_clear_flag(term, MG_FAX_NOTIFIED);
     
     if (term->type == MG_TERM_RTP) {
         switch_core_hash_delete_wrlock(term->profile->terminations, term->name, term->profile->terminations_rwlock);
@@ -757,8 +734,9 @@ switch_status_t mgco_init_ins_service_change(SuId suId)
     for (hi = switch_hash_first(NULL,  profile->terminations); hi; hi = switch_hash_next(hi)) {
         switch_hash_this(hi, &key, &keylen, &val);
         term = (mg_termination_t *) val;
-       if(!term) continue;
-       megaco_check_tdm_termination(term);
+               if(!term) continue;
+               if(MG_TERM_RTP == term->type) continue;
+               megaco_check_tdm_termination(term);
     }
 
     return SWITCH_STATUS_SUCCESS;
index 4568030371f80184f31444ba5acd43141447a947..3bfe075c80e7cfe5c57a631c214ca551d34c78c7 100644 (file)
@@ -71,7 +71,8 @@ switch_status_t config_profile(megaco_profile_t *profile, switch_bool_t reload)
                }
 
                switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG,"rtp_ipaddr[%s], local ip[%s]\n", profile->rtp_ipaddr, profile->my_ipaddr);
-               switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG,"fax_detect_evt_type[%s]\n", mg_fax_detect_evt_type2str(profile->fax_detect_evt_type));
+               switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG,"t38_fax_notify[%s]\n",
+               (MG_T38_FAX_NOTIFY_YES == profile->t38_fax_notify)?"ENABLE":"DISABLE");
 
                if(SWITCH_STATUS_FALSE == (status = modify_mg_profile_mid(profile, &profile->mid))){
                        goto done;
@@ -252,6 +253,7 @@ void mg_create_tdm_term(megaco_profile_t *profile, const char *tech, const char
        term->u.tdm.channel = tdm_chan_num;
        term->u.tdm.span_name = switch_core_strdup(pool, channel_prefix);
        switch_set_flag(term, MG_OUT_OF_SERVICE);
+    switch_clear_flag(term, MG_FAX_NOTIFIED);
 
        switch_core_hash_insert_wrlock(profile->terminations, term->name, term, profile->terminations_rwlock);
        term->next = profile->physical_terminations;
@@ -337,13 +339,19 @@ static switch_xml_config_item_t *get_instructions(megaco_profile_t *profile) {
                {  "G.723.1",  MEGACO_CODEC_G723_1},
                {  "ILBC", MEGACO_CODEC_ILBC },
        };
-#endif
+
        static switch_xml_config_enum_item_t opt_fax_detect_type_enum[] = {
                {  "CED",  MG_FAX_DETECT_EVENT_TYPE_CED},
                {  "CNG",  MG_FAX_DETECT_EVENT_TYPE_CNG},
                {  "CED_CNG",  MG_FAX_DETECT_EVENT_TYPE_CNG_CED},
                {  "DISABLE",  MG_FAX_DETECT_EVENT_TYPE_DISABLE},
        };
+#endif
+       static switch_xml_config_enum_item_t opt_t38_fax_notify[] = {
+               {  "ENABLE",  MG_T38_FAX_NOTIFY_YES},
+               {  "DISABLE",  MG_T38_FAX_NOTIFY_NO},
+       };
+
 
 
        switch_xml_config_item_t instructions[] = {
@@ -363,7 +371,8 @@ static switch_xml_config_item_t *get_instructions(megaco_profile_t *profile) {
                SWITCH_CONFIG_ITEM("codec-prefs", SWITCH_CONFIG_STRING, 0, &profile->codec_prefs, "", &switch_config_string_strdup, "", "codec preferences, coma-separated"),
                SWITCH_CONFIG_ITEM("license", SWITCH_CONFIG_STRING, 0, &profile->license, "/usr/local/nsg/conf/license.txt", &switch_config_string_strdup, "", "License file"),
                SWITCH_CONFIG_ITEM("rtp-ip", SWITCH_CONFIG_STRING, CONFIG_RELOADABLE, &profile->rtp_ipaddr, "" , &switch_config_string_strdup, "", "rtp ip"),
-               SWITCH_CONFIG_ITEM("fax-detect-event-type", SWITCH_CONFIG_ENUM, CONFIG_RELOADABLE, &profile->fax_detect_evt_type, MG_FAX_DETECT_EVENT_TYPE_CNG_CED , &opt_fax_detect_type_enum, "", "fax-detect-event-type"),
+               //SWITCH_CONFIG_ITEM("fax-detect-event-type", SWITCH_CONFIG_ENUM, CONFIG_RELOADABLE, &profile->fax_detect_evt_type, MG_FAX_DETECT_EVENT_TYPE_CNG_CED , &opt_fax_detect_type_enum, "", "fax-detect-event-type"),
+               SWITCH_CONFIG_ITEM("t38-fax-notify", SWITCH_CONFIG_ENUM, CONFIG_RELOADABLE, &profile->t38_fax_notify, MG_T38_FAX_NOTIFY_YES , &opt_t38_fax_notify, "", "t38_fax_notify"),
                SWITCH_CONFIG_ITEM_END()
        };
        
index 1306d658bab29e39b75d05c3d6530e5716f5a615..45f240901d487be8f7bf0cbcf149e2d0bacf00cf 100644 (file)
@@ -36,17 +36,42 @@ SWITCH_STANDARD_APP(mg_notify_function)
         return;
     }
 
-    if (!strcmp(data, "cng")) {
-        mg_send_t38_cng_notify(term->profile, term->name);
-        switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_DEBUG, "Sent CNG notify\n");
-       /* Disable echo cancellation */
-       mg_term_set_ec(term, 0);
-    } else if (!strcmp(data, "ced")) {
-       mg_send_t38_ans_notify(term->profile, term->name);
-       switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_DEBUG, "Sent CED notify\n");
-       /* Disable echo cancellation */
-       mg_term_set_ec(term, 0);
-    }
+       if (!strcmp(data, "cng")) {
+               if((term->profile) && 
+                  (term->profile->t38_fax_notify == MG_T38_FAX_NOTIFY_YES) && 
+                       !switch_test_flag(term, MG_FAX_NOTIFIED)){
+                       switch_set_flag(term, MG_FAX_NOTIFIED);
+                       mg_send_t38_cng_notify(term->profile, term->name);
+                       switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_DEBUG, "Sent CNG notify\n");
+               }else{
+                       switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_DEBUG, "Not reporting CNG tone "
+                       "FAX Notify[%s] MG_FAX_NOTIFIED flag [%s]\n",
+                       (MG_T38_FAX_NOTIFY_YES == term->profile->t38_fax_notify)?"ENABLE":"DISABLE",
+                       (switch_test_flag(term, MG_FAX_NOTIFIED))?"TRUE":"FALSE");
+               }
+               /* Disable echo cancellation */
+               if(MG_TERM_TDM == term->type){
+                       mg_term_set_ec(term, 0);
+               }
+       } else if (!strcmp(data, "ced")) {
+               if((term->profile) && 
+                  (term->profile->t38_fax_notify == MG_T38_FAX_NOTIFY_YES) && 
+                       !switch_test_flag(term, MG_FAX_NOTIFIED)){
+                       switch_set_flag(term, MG_FAX_NOTIFIED);
+                  mg_send_t38_ans_notify(term->profile, term->name);
+                  switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_DEBUG, "Sent CED notify\n");
+               }else{
+                       switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_DEBUG, "Not reporting CED tone "
+                       "FAX Notify[%s] MG_FAX_NOTIFIED flag [%s]\n",
+                       (MG_T38_FAX_NOTIFY_YES == term->profile->t38_fax_notify)?"ENABLE":"DISABLE",
+                       (switch_test_flag(term, MG_FAX_NOTIFIED))?"TRUE":"FALSE");
+               }
+
+               if(MG_TERM_TDM == term->type){
+                       mg_term_set_ec(term, 0);
+               }
+       }
+
 }
 
 static switch_status_t console_complete_hashtable(switch_hash_t *hash, const char *line, const char *cursor, switch_console_callback_match_t **matches)
index dfd1edb58e496a3bb6bf3bb7013a5475a6eca474..b30c7d41b16ab8e0a494e2301c5145060d56b2b1 100644 (file)
@@ -119,10 +119,19 @@ enum {
     MGT_ACTIVE         = (1 << 1),
     MG_IN_SERVICE      = (1 << 2),
     MG_OUT_OF_SERVICE  = (1 << 3),
+    MG_FAX_NOTIFIED    = (1 << 4),
     
 } mg_termination_flags;
 
 
+typedef enum {
+    MG_T38_FAX_NOTIFY_NONE,
+    MG_T38_FAX_NOTIFY_YES,
+    MG_T38_FAX_NOTIFY_NO,
+    MG_T38_FAX_NOTIFY_INVALID,
+} mg_t38_fax_notify_t;
+
+
 typedef enum {
     MGM_AUDIO = 0,
     MGM_IMAGE,
@@ -257,7 +266,7 @@ struct megaco_profile_s {
        int                                             inact_tmr;                   /* inactivity timer value */
        int                                             peer_active;                   /* inactivity timer value */
     uint32_t                inact_tmr_task_id;                 /* FS timer scheduler task-id */
-    mg_fax_detect_event_type_t fax_detect_evt_type;
+    mg_t38_fax_notify_t            t38_fax_notify;
     
     switch_thread_rwlock_t  *contexts_rwlock;
     uint32_t next_context_id;