]> sjero.net Git - linphone/blobdiff - coreapi/proxy.c
Aac-eld add missing header according to RFC3640 3.3.6
[linphone] / coreapi / proxy.c
index ff046f92edb8a4fc1dffb08d1976f92c300d9730..42c21f01b29a36000a9f0ed4b7ef882613c545f2 100644 (file)
@@ -263,15 +263,30 @@ static char *guess_contact_for_register(LinphoneProxyConfig *obj){
        if (proxy==NULL) return NULL;
        host=linphone_address_get_domain (proxy);
        if (host!=NULL){
-               char localip[LINPHONE_IPADDR_SIZE];
+               int localport = -1;
+               char localip_tmp[LINPHONE_IPADDR_SIZE] = {'\0'};
+               const char *localip = NULL;
                char *tmp;
                LCSipTransports tr;
                LinphoneAddress *contact;
                
-               linphone_core_get_public_ip(obj->lc,host,localip);
                contact=linphone_address_new(obj->reg_identity);
-               linphone_address_set_domain (contact,localip);
-               linphone_address_set_port_int(contact,linphone_core_get_sip_port(obj->lc));
+#ifdef BUILD_UPNP
+               if (obj->lc->upnp != NULL && linphone_core_get_firewall_policy(obj->lc)==LinphonePolicyUseUpnp &&
+                       linphone_upnp_context_get_state(obj->lc->upnp) == LinphoneUpnpStateOk) {
+                       localip = linphone_upnp_context_get_external_ipaddress(obj->lc->upnp);
+                       localport = linphone_upnp_context_get_external_port(obj->lc->upnp);
+               }
+#endif //BUILD_UPNP            
+               if(localip == NULL) {
+                       localip = localip_tmp;
+                       linphone_core_get_local_ip(obj->lc,host,localip_tmp);
+               }
+               if(localport == -1) {
+                       localport = linphone_core_get_sip_port(obj->lc);
+               }
+               linphone_address_set_port_int(contact,localport);
+               linphone_address_set_domain(contact,localip);
                linphone_address_set_display_name(contact,NULL);
                
                linphone_core_get_sip_transports(obj->lc,&tr);
@@ -625,7 +640,7 @@ int linphone_dial_plan_lookup_ccc_from_e164(const char* e164) {
                                found++;
                        }
                }
-       } while (found>1 || found==0);
+       } while ((found>1 || found==0) && i < sizeof(dial_plan->ccc));
        if (found==1) {
                return atoi(elected_dial_plan->ccc);
        } else {
@@ -777,6 +792,7 @@ int linphone_proxy_config_send_publish(LinphoneProxyConfig *proxy,
                               LinphoneOnlineStatus presence_mode){
        int err;
        SalOp *op=sal_op_new(proxy->lc->sal);
+       sal_op_set_route(op,proxy->reg_proxy);
        err=sal_publish(op,linphone_proxy_config_get_identity(proxy),
            linphone_proxy_config_get_identity(proxy),linphone_online_status_to_sal(presence_mode));
        if (proxy->publish_op!=NULL)
@@ -981,7 +997,7 @@ void linphone_proxy_config_write_to_config_file(LpConfig *config, LinphoneProxyC
                lp_config_set_string(config,key,"reg_identity",obj->reg_identity);
        }
        if (obj->contact_params!=NULL){
-               lp_config_set_string(config,key,"contact_params",obj->contact_params);
+               lp_config_set_string(config,key,"contact_parameters",obj->contact_params);
        }
        lp_config_set_int(config,key,"reg_expires",obj->expires);
        lp_config_set_int(config,key,"reg_sendregister",obj->reg_sendregister);
@@ -1082,8 +1098,19 @@ void linphone_proxy_config_update(LinphoneProxyConfig *cfg){
                if (cfg->type && cfg->ssctx==NULL){
                        linphone_proxy_config_activate_sip_setup(cfg);
                }
-               if (!lc->sip_conf.register_only_when_network_is_up || lc->network_reachable)
-                       linphone_proxy_config_register(cfg);
+               switch(linphone_core_get_firewall_policy(lc)) {
+                       case LinphonePolicyUseUpnp:
+#ifdef BUILD_UPNP
+                       if(lc->sip_conf.register_only_when_upnp_is_ok && 
+                          (lc->upnp == NULL || !linphone_upnp_context_is_ready_for_register(lc->upnp))) {
+                               break;
+                       }
+#endif //BUILD_UPNP
+                       default:
+                       if ((!lc->sip_conf.register_only_when_network_is_up || lc->network_reachable)) {
+                               linphone_proxy_config_register(cfg);
+                       }
+               }       
                if (cfg->publish && cfg->publish_op==NULL){
                        linphone_proxy_config_send_publish(cfg,lc->presence_mode);
                }