]> git.ipfire.org Git - thirdparty/freeswitch.git/commitdiff
MODENDP-219
authorMichael Jerris <mike@jerris.com>
Fri, 15 May 2009 17:07:07 +0000 (17:07 +0000)
committerMichael Jerris <mike@jerris.com>
Fri, 15 May 2009 17:07:07 +0000 (17:07 +0000)
git-svn-id: http://svn.freeswitch.org/svn/freeswitch/trunk@13357 d0543943-73ff-0310-b7d9-9358b9ac24b2

src/mod/endpoints/mod_sofia/mod_sofia.c

index 861cc2e3ae6800d0f5818583abb879b9153305e7..ddf4c30dc9b5be024d1f9dd61829d6ae5f666040 100644 (file)
@@ -557,6 +557,7 @@ static switch_status_t sofia_answer_channel(switch_core_session_t *session)
                                        TAG_IF(sticky, NUTAG_PROXY(tech_pvt->record_route)),
                                        NUTAG_SESSION_TIMER(session_timeout),
                                        SIPTAG_CONTACT_STR(tech_pvt->reply_contact),
+                                       SIPTAG_CALL_INFO_STR(switch_channel_get_variable(tech_pvt->channel, SOFIA_SIP_HEADER_PREFIX "call_info")),
                                        SOATAG_USER_SDP_STR(tech_pvt->local_sdp_str),
                                        SOATAG_REUSE_REJECTED(1), SOATAG_ORDERED_USER(1), SOATAG_AUDIO_AUX("cn telephone-event"), NUTAG_INCLUDE_EXTRA_SDP(1), TAG_END());
                sofia_set_flag_locked(tech_pvt, TFLAG_ANS);
@@ -2994,6 +2995,7 @@ static void general_event_handler(switch_event_t *event)
                        const char *from_uri = switch_event_get_header(event, "from-uri");
                        const char *call_info = switch_event_get_header(event, "call-info");
                        const char *alert_info = switch_event_get_header(event, "alert-info");
+                       const char *call_id = switch_event_get_header(event, "call-id");
                        const char *body = switch_event_get_body(event);
                        sofia_profile_t *profile = NULL;
                        nua_handle_t *nh;
@@ -3007,12 +3009,12 @@ static void general_event_handler(switch_event_t *event)
                 goto done;
             }
 
-            if (!to_uri && !local_user_full) {
+            if (!call_id && !to_uri && !local_user_full) {
                 switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Missing To-URI header\n");
                 goto done;
             }
 
-            if (!from_uri) {
+            if (!call_id && !from_uri) {
                 switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Missing From-URI header\n");
                 goto done;
             }
@@ -3023,37 +3025,47 @@ static void general_event_handler(switch_event_t *event)
                 goto done;
             }
 
+                       if (call_id) {
+                               nh = nua_handle_by_call_id(profile->nua, call_id);
 
-                       if (local_user_full) {
-                               local_dup = strdup(local_user_full);
-                               local_user = local_dup;
-                               if ((local_host = strchr(local_user, '@'))) {
-                                       *local_host++ = '\0';
-                               }
-
-                               if (!local_user || !local_host || !sofia_reg_find_reg_url(profile, local_user, local_host, buf, sizeof(buf))) {
-                                       switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Can't find local user\n");
+                               if (!nh) {
+                                       switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Invalid Call-ID %s\n", call_id);
                                        goto done;
                                }
+                       }
 
-                               to_uri = sofia_glue_get_url_from_contact(buf, 0);
-                               
-                               if ((p = strstr(to_uri, ";fs_"))) {
-                                       *p = '\0';
-                               }
+                       else {
+                               if (local_user_full) {
+                                       local_dup = strdup(local_user_full);
+                                       local_user = local_dup;
+                                       if ((local_host = strchr(local_user, '@'))) {
+                                               *local_host++ = '\0';
+                                       }
 
-                       }
+                                       if (!local_user || !local_host || !sofia_reg_find_reg_url(profile, local_user, local_host, buf, sizeof(buf))) {
+                                               switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Can't find local user\n");
+                                               goto done;
+                                       }
 
+                                       to_uri = sofia_glue_get_url_from_contact(buf, 0);
+                                       
+                                       if ((p = strstr(to_uri, ";fs_"))) {
+                                               *p = '\0';
+                                       }
 
-                       nh = nua_handle(profile->nua, 
-                                                       NULL, 
-                                                       NUTAG_URL(to_uri), 
-                                                       SIPTAG_FROM_STR(from_uri), 
-                                                       SIPTAG_TO_STR(to_uri), 
-                                                       SIPTAG_CONTACT_STR(profile->url), 
-                                                       TAG_END());
-                       
-                       nua_handle_bind(nh, &mod_sofia_globals.destroy_private);
+                               }
+
+
+                               nh = nua_handle(profile->nua, 
+                                                               NULL, 
+                                                               NUTAG_URL(to_uri), 
+                                                               SIPTAG_FROM_STR(from_uri), 
+                                                               SIPTAG_TO_STR(to_uri), 
+                                                               SIPTAG_CONTACT_STR(profile->url), 
+                                                               TAG_END());
+                               
+                               nua_handle_bind(nh, &mod_sofia_globals.destroy_private);
+                       }
 
                        nua_info(nh,
                                         NUTAG_WITH_THIS(profile->nua),
@@ -3063,6 +3075,9 @@ static void general_event_handler(switch_event_t *event)
                                         TAG_IF(!switch_strlen_zero(body), SIPTAG_PAYLOAD_STR(body)),
                                         TAG_END());
 
+                       if (call_id && nh) {
+                               nua_handle_unref(nh);
+                       }
 
                        if (profile) {
                                sofia_glue_release_profile(profile);