]> sjero.net Git - linphone/blobdiff - coreapi/sal_eXosip2_presence.c
fix publish request, whose request uri must identify the resources for which the...
[linphone] / coreapi / sal_eXosip2_presence.c
index 154c8d07eae3b3e4b0a8ab9369f760eeb5477f51..c8191098649343f2bb6ebf8689d06e881efd557f 100644 (file)
@@ -39,6 +39,7 @@ SalOp * sal_find_out_subscribe(Sal *sal, int sid){
                op=(SalOp*)elem->data;
                if (op->sid==sid) return op;
        }
+       ms_message("No op for sid %i",sid);
        return NULL;
 }
 
@@ -50,7 +51,7 @@ void sal_remove_out_subscribe(Sal *sal, SalOp *op){
        sal->out_subscribes=ms_list_remove(sal->out_subscribes,op);
 }
 
-static SalOp * sal_find_in_subscribe(Sal *sal, int nid){
+SalOp * sal_find_in_subscribe(Sal *sal, int nid){
        const MSList *elem;
        SalOp *op;
        for(elem=sal->in_subscribes;elem!=NULL;elem=elem->next){
@@ -80,7 +81,27 @@ void sal_remove_in_subscribe(Sal *sal, SalOp *op){
        sal->in_subscribes=ms_list_remove(sal->in_subscribes,op);
 }
 
-int sal_text_send(SalOp *op, const char *from, const char *to, const char *msg){
+static const char *days[]={"Sun","Mon","Tue","Wed","Thu","Fri","Sat"};
+static const char *months[]={"Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"};
+
+static void msg_add_current_date(osip_message_t *msg){
+        char tmp[64]={0};
+        time_t curtime=time(NULL);
+        struct tm *ret;
+#ifndef WIN32
+        struct tm gmt;
+        ret=gmtime_r(&curtime,&gmt);
+#else
+        ret=gmtime(&curtime);
+#endif
+        /*cannot use strftime because it is locale dependant*/
+        snprintf(tmp,sizeof(tmp)-1,"%s, %i %s %i %02i:%02i:%02i GMT",
+                 days[ret->tm_wday],ret->tm_mday,months[ret->tm_mon],1900+ret->tm_year,ret->tm_hour,ret->tm_min,ret->tm_sec);
+        osip_message_replace_header(msg,"Date",tmp);
+}
+
+
+int sal_message_send(SalOp *op, const char *from, const char *to, const char* content_type, const char *msg){
        osip_message_t *sip=NULL;
 
        if(op->cid == -1)
@@ -91,12 +112,15 @@ int sal_text_send(SalOp *op, const char *from, const char *to, const char *msg){
                if (to)
                        sal_op_set_to(op,to);
 
+               sal_exosip_fix_route(op);
                eXosip_lock();
                eXosip_message_build_request(&sip,"MESSAGE",sal_op_get_to(op),
                        sal_op_get_from(op),sal_op_get_route(op));
                if (sip!=NULL){
-                       osip_message_set_content_type(sip,"text/plain");
-                       osip_message_set_body(sip,msg,strlen(msg));
+                       sal_exosip_add_custom_headers(sip,op->base.custom_headers);
+                       msg_add_current_date(sip);
+                       osip_message_set_content_type(sip,content_type);
+                       if (msg) osip_message_set_body(sip,msg,strlen(msg));
                        sal_add_other(op->base.root,op,sip);
                        eXosip_message_send_request(sip);
                }else{
@@ -116,17 +140,22 @@ int sal_text_send(SalOp *op, const char *from, const char *to, const char *msg){
                        eXosip_unlock();
                        return -1;
                }
-               osip_message_set_content_type(sip,"text/plain");
-               osip_message_set_body(sip,msg,strlen(msg));
+               sal_exosip_add_custom_headers(sip,op->base.custom_headers);
+               msg_add_current_date(sip);
+               osip_message_set_content_type(sip,content_type);
+               if (msg) osip_message_set_body(sip,msg,strlen(msg));
                eXosip_call_send_request(op->did,sip);
                eXosip_unlock();
        }
        return 0;
 }
 
+int sal_text_send(SalOp *op, const char *from, const char *to, const char *msg) {
+       return sal_message_send(op,from,to,"text/plain",msg);
+}
 /*presence Subscribe/notify*/
 int sal_subscribe_presence(SalOp *op, const char *from, const char *to){
-       osip_message_t *msg;
+       osip_message_t *msg=NULL;
        if (from)
                sal_op_set_from(op,from);
        if (to)
@@ -135,6 +164,11 @@ int sal_subscribe_presence(SalOp *op, const char *from, const char *to){
        eXosip_lock();
        eXosip_subscribe_build_initial_request(&msg,sal_op_get_to(op),sal_op_get_from(op),
                sal_op_get_route(op),"presence",600);
+       if (msg==NULL){
+               ms_error("Could not build subscribe request to %s",to);
+               eXosip_unlock();
+               return -1;
+       }
        if (op->base.contact){
                _osip_list_set_empty(&msg->contacts,(void (*)(void*))osip_contact_free);
                osip_message_set_contact(msg,op->base.contact);
@@ -167,9 +201,14 @@ int sal_unsubscribe(SalOp *op){
 }
 
 int sal_subscribe_accept(SalOp *op){
-       osip_message_t *msg;
+       osip_message_t *msg=NULL;
        eXosip_lock();
        eXosip_insubscription_build_answer(op->tid,202,&msg);
+       if (msg==NULL){
+               ms_error("Fail to build answer to subscribe.");
+               eXosip_unlock();
+               return -1;
+       }
        if (op->base.contact){
                _osip_list_set_empty(&msg->contacts,(void (*)(void*))osip_contact_free);
                osip_message_set_contact(msg,op->base.contact);
@@ -195,108 +234,108 @@ static void mk_presence_body (const SalPresenceStatus online_status, const char
 
          if (online_status==SalPresenceOnline)
          {
-                 snprintf(buf, buflen, "<?xml version=\"1.0\"?>\n\
-<!DOCTYPE presence PUBLIC \"-//IETF//DTD RFCxxxx XPIDF 1.0//EN\" \"xpidf.dtd\">\n\
-<presence>\n\
-<presentity uri=\"%s;method=SUBSCRIBE\" />\n\
-<atom id=\"%i\">\n\
-<address uri=\"%s\" priority=\"0.800000\">\n\
-<status status=\"open\" />\n\
-<msnsubstatus substatus=\"online\" />\n\
-</address>\n\
-</atom>\n\
-</presence>", contact_info, atom_id, contact_info);
+                 snprintf(buf, buflen, "<?xml version=\"1.0\"?>\n"
+"<!DOCTYPE presence PUBLIC \"-//IETF//DTD RFCxxxx XPIDF 1.0//EN\" \"xpidf.dtd\">\n"
+"<presence>\n"
+"<presentity uri=\"%s;method=SUBSCRIBE\" />\n"
+"<atom id=\"%i\">\n"
+"<address uri=\"%s\" priority=\"0.800000\">\n"
+"<status status=\"open\" />\n"
+"<msnsubstatus substatus=\"online\" />\n"
+"</address>\n"
+"</atom>\n"
+"</presence>", contact_info, atom_id, contact_info);
 
          }
          else if (online_status == SalPresenceBusy ||
                          online_status == SalPresenceDonotdisturb)
          {
-                 snprintf(buf, buflen, "<?xml version=\"1.0\"?>\n\
-<!DOCTYPE presence PUBLIC \"-//IETF//DTD RFCxxxx XPIDF 1.0//EN\" \"xpidf.dtd\">\n\
-<presence>\n\
-<presentity uri=\"%s;method=SUBSCRIBE\" />\n\
-<atom id=\"%i\">\n\
-<address uri=\"%s\" priority=\"0.800000\">\n\
-<status status=\"inuse\" />\n\
-<msnsubstatus substatus=\"busy\" />\n\
-</address>\n\
-</atom>\n</presence>", contact_info, atom_id, contact_info);
+                 snprintf(buf, buflen, "<?xml version=\"1.0\"?>\n"
+"<!DOCTYPE presence PUBLIC \"-//IETF//DTD RFCxxxx XPIDF 1.0//EN\" \"xpidf.dtd\">\n"
+"<presence>\n"
+"<presentity uri=\"%s;method=SUBSCRIBE\" />\n"
+"<atom id=\"%i\">\n"
+"<address uri=\"%s\" priority=\"0.800000\">\n"
+"<status status=\"inuse\" />\n"
+"<msnsubstatus substatus=\"busy\" />\n"
+"</address>\n"
+"</atom>\n</presence>", contact_info, atom_id, contact_info);
 
          }
          else if (online_status==SalPresenceBerightback)
          {
-                 snprintf(buf, buflen, "<?xml version=\"1.0\"?>\n\
-<!DOCTYPE presence PUBLIC \"-//IETF//DTD RFCxxxx XPIDF 1.0//EN\" \"xpidf.dtd\">\n\
-<presence>\n\
-<presentity uri=\"%s;method=SUBSCRIBE\" />\n\
-<atom id=\"%i\">\n\
-<address uri=\"%s\" priority=\"0.800000\">\n\
-<status status=\"open\" />\n\
-<msnsubstatus substatus=\"berightback\" />\n\
-</address>\n\
-</atom>\n\
-</presence>", contact_info, atom_id, contact_info);
+                 snprintf(buf, buflen, "<?xml version=\"1.0\"?>\n"
+"<!DOCTYPE presence PUBLIC \"-//IETF//DTD RFCxxxx XPIDF 1.0//EN\" \"xpidf.dtd\">\n"
+"<presence>\n"
+"<presentity uri=\"%s;method=SUBSCRIBE\" />\n"
+"<atom id=\"%i\">\n"
+"<address uri=\"%s\" priority=\"0.800000\">\n"
+"<status status=\"open\" />\n"
+"<msnsubstatus substatus=\"berightback\" />\n"
+"</address>\n"
+"</atom>\n"
+"</presence>", contact_info, atom_id, contact_info);
 
          }
          else if (online_status == SalPresenceAway ||
                          online_status == SalPresenceMoved)
          {
-                 snprintf(buf, buflen, "<?xml version=\"1.0\"?>\n\
-<!DOCTYPE presence PUBLIC \"-//IETF//DTD RFCxxxx XPIDF 1.0//EN\" \"xpidf.dtd\">\n\
-<presence>\n\
-<presentity uri=\"%s;method=SUBSCRIBE\" />\n\
-<atom id=\"%i\">\n\
-<address uri=\"%s\" priority=\"0.800000\">\n\
-<status status=\"open\" />\n\
-<msnsubstatus substatus=\"away\" />\n\
-</address>\n\
-</atom>\n\
-</presence>", contact_info, atom_id, contact_info);
+                 snprintf(buf, buflen, "<?xml version=\"1.0\"?>\n"
+"<!DOCTYPE presence PUBLIC \"-//IETF//DTD RFCxxxx XPIDF 1.0//EN\" \"xpidf.dtd\">\n"
+"<presence>\n"
+"<presentity uri=\"%s;method=SUBSCRIBE\" />\n"
+"<atom id=\"%i\">\n"
+"<address uri=\"%s\" priority=\"0.800000\">\n"
+"<status status=\"open\" />\n"
+"<msnsubstatus substatus=\"away\" />\n"
+"</address>\n"
+"</atom>\n"
+"</presence>", contact_info, atom_id, contact_info);
 
          }
          else if (online_status==SalPresenceOnthephone)
          {
-                 snprintf(buf, buflen, "<?xml version=\"1.0\"?>\n\
-<!DOCTYPE presence PUBLIC \"-//IETF//DTD RFCxxxx XPIDF 1.0//EN\" \"xpidf.dtd\">\n\
-<presence>\n\
-<presentity uri=\"%s;method=SUBSCRIBE\" />\n\
-<atom id=\"%i\">\n\
-<address uri=\"%s\" priority=\"0.800000\">\n\
-<status status=\"inuse\" />\n\
-<msnsubstatus substatus=\"onthephone\" />\n\
-</address>\n\
-</atom>\n\
-</presence>", contact_info, atom_id, contact_info);
+                 snprintf(buf, buflen, "<?xml version=\"1.0\"?>\n"
+"<!DOCTYPE presence PUBLIC \"-//IETF//DTD RFCxxxx XPIDF 1.0//EN\" \"xpidf.dtd\">\n"
+"<presence>\n"
+"<presentity uri=\"%s;method=SUBSCRIBE\" />\n"
+"<atom id=\"%i\">\n"
+"<address uri=\"%s\" priority=\"0.800000\">\n"
+"<status status=\"inuse\" />\n"
+"<msnsubstatus substatus=\"onthephone\" />\n"
+"</address>\n"
+"</atom>\n"
+"</presence>", contact_info, atom_id, contact_info);
 
          }
          else if (online_status==SalPresenceOuttolunch)
          {
-                 snprintf(buf, buflen, "<?xml version=\"1.0\"?>\n\
-<!DOCTYPE presence PUBLIC \"-//IETF//DTD RFCxxxx XPIDF 1.0//EN\" \"xpidf.dtd\">\n\
-<presence>\n\
-<presentity uri=\"%s;method=SUBSCRIBE\" />\n\
-<atom id=\"%i\">\n\
-<address uri=\"%s\" priority=\"0.800000\">\n\
-<status status=\"open\" />\n\
-<msnsubstatus substatus=\"outtolunch\" />\n\
-</address>\n\
-</atom>\n\
-</presence>", contact_info, atom_id, contact_info);
+                 snprintf(buf, buflen, "<?xml version=\"1.0\"?>\n"
+"<!DOCTYPE presence PUBLIC \"-//IETF//DTD RFCxxxx XPIDF 1.0//EN\" \"xpidf.dtd\">\n"
+"<presence>\n"
+"<presentity uri=\"%s;method=SUBSCRIBE\" />\n"
+"<atom id=\"%i\">\n"
+"<address uri=\"%s\" priority=\"0.800000\">\n"
+"<status status=\"open\" />\n"
+"<msnsubstatus substatus=\"outtolunch\" />\n"
+"</address>\n"
+"</atom>\n"
+"</presence>", contact_info, atom_id, contact_info);
 
          }
          else
          {
-                 snprintf(buf, buflen, "<?xml version=\"1.0\"?>\n\
-<!DOCTYPE presence PUBLIC \"-//IETF//DTD RFCxxxx XPIDF 1.0//EN\" \"xpidf.dtd\">\n\
-<presence>\n\
-<presentity uri=\"%s;method=SUBSCRIBE\" />\n\
-<atom id=\"%i\">\n\
-<address uri=\"%s\" priority=\"0.800000\">\n\
-<status status=\"closed\" />\n\
-<msnsubstatus substatus=\"away\" />\n\
-</address>\n\
-</atom>\n\
-</presence>", contact_info, atom_id, contact_info);
+                 snprintf(buf, buflen, "<?xml version=\"1.0\"?>\n"
+"<!DOCTYPE presence PUBLIC \"-//IETF//DTD RFCxxxx XPIDF 1.0//EN\" \"xpidf.dtd\">\n"
+"<presence>\n"
+"<presentity uri=\"%s;method=SUBSCRIBE\" />\n"
+"<atom id=\"%i\">\n"
+"<address uri=\"%s\" priority=\"0.800000\">\n"
+"<status status=\"closed\" />\n"
+"<msnsubstatus substatus=\"away\" />\n"
+"</address>\n"
+"</atom>\n"
+"</presence>", contact_info, atom_id, contact_info);
          }
          break;
     } 
@@ -309,108 +348,108 @@ static void mk_presence_body (const SalPresenceStatus online_status, const char
 
          if (online_status==SalPresenceOnline)
          {
-                 snprintf(buf, buflen, "<?xml version=\"1.0\"?>\n\
-<!DOCTYPE presence SYSTEM \"http://schemas.microsoft.com/2002/09/sip/presence\">\n\
-<presence>\n\
-<presentity uri=\"%s;method=SUBSCRIBE\" />\n\
-<atom id=\"%i\">\n\
-<address uri=\"%s\">\n\
-<status status=\"open\" />\n\
-<msnsubstatus substatus=\"online\" />\n\
-</address>\n\
-</atom>\n\
-</presence>", contact_info, atom_id, contact_info);
+                 snprintf(buf, buflen, "<?xml version=\"1.0\"?>\n"
+"<!DOCTYPE presence SYSTEM \"http://schemas.microsoft.com/2002/09/sip/presence\">\n"
+"<presence>\n"
+"<presentity uri=\"%s;method=SUBSCRIBE\" />\n"
+"<atom id=\"%i\">\n"
+"<address uri=\"%s\">\n"
+"<status status=\"open\" />\n"
+"<msnsubstatus substatus=\"online\" />\n"
+"</address>\n"
+"</atom>\n"
+"</presence>", contact_info, atom_id, contact_info);
 
          }
          else if (online_status == SalPresenceBusy ||
                          online_status == SalPresenceDonotdisturb)
          {
-                 snprintf(buf, buflen, "<?xml version=\"1.0\"?>\n\
-<!DOCTYPE presence SYSTEM \"http://schemas.microsoft.com/2002/09/sip/presence\">\n\
-<presence>\n\
-<presentity uri=\"%s;method=SUBSCRIBE\" />\n\
-<atom id=\"%i\">\n\
-<address uri=\"%s\">\n\
-<status status=\"inuse\" />\n\
-<msnsubstatus substatus=\"busy\" />\n\
-</address>\n\
-</atom>\n</presence>", contact_info, atom_id, contact_info);
+                 snprintf(buf, buflen, "<?xml version=\"1.0\"?>\n"
+"<!DOCTYPE presence SYSTEM \"http://schemas.microsoft.com/2002/09/sip/presence\">\n"
+"<presence>\n"
+"<presentity uri=\"%s;method=SUBSCRIBE\" />\n"
+"<atom id=\"%i\">\n"
+"<address uri=\"%s\">\n"
+"<status status=\"inuse\" />\n"
+"<msnsubstatus substatus=\"busy\" />\n"
+"</address>\n"
+"</atom>\n</presence>", contact_info, atom_id, contact_info);
 
          }
          else if (online_status==SalPresenceBerightback)
          {
-                 snprintf(buf, buflen, "<?xml version=\"1.0\"?>\n\
-<!DOCTYPE presence SYSTEM \"http://schemas.microsoft.com/2002/09/sip/presence\">\n\
-<presence>\n\
-<presentity uri=\"%s;method=SUBSCRIBE\" />\n\
-<atom id=\"%i\">\n\
-<address uri=\"%s\">\n\
-<status status=\"inactive\" />\n\
-<msnsubstatus substatus=\"berightback\" />\n\
-</address>\n\
-</atom>\n\
-</presence>", contact_info, atom_id, contact_info);
+                 snprintf(buf, buflen, "<?xml version=\"1.0\"?>\n"
+"<!DOCTYPE presence SYSTEM \"http://schemas.microsoft.com/2002/09/sip/presence\">\n"
+"<presence>\n"
+"<presentity uri=\"%s;method=SUBSCRIBE\" />\n"
+"<atom id=\"%i\">\n"
+"<address uri=\"%s\">\n"
+"<status status=\"inactive\" />\n"
+"<msnsubstatus substatus=\"berightback\" />\n"
+"</address>\n"
+"</atom>\n"
+"</presence>", contact_info, atom_id, contact_info);
 
          }
          else if (online_status == SalPresenceAway ||
                          online_status == SalPresenceMoved)
          {
-                 snprintf(buf, buflen, "<?xml version=\"1.0\"?>\n\
-<!DOCTYPE presence SYSTEM \"http://schemas.microsoft.com/2002/09/sip/presence\">\n\
-<presence>\n\
-<presentity uri=\"%s;method=SUBSCRIBE\" />\n\
-<atom id=\"%i\">\n\
-<address uri=\"%s\">\n\
-<status status=\"inactive\" />\n\
-<msnsubstatus substatus=\"idle\" />\n\
-</address>\n\
-</atom>\n\
-</presence>", contact_info, atom_id, contact_info);
+                 snprintf(buf, buflen, "<?xml version=\"1.0\"?>\n"
+"<!DOCTYPE presence SYSTEM \"http://schemas.microsoft.com/2002/09/sip/presence\">\n"
+"<presence>\n"
+"<presentity uri=\"%s;method=SUBSCRIBE\" />\n"
+"<atom id=\"%i\">\n"
+"<address uri=\"%s\">\n"
+"<status status=\"inactive\" />\n"
+"<msnsubstatus substatus=\"idle\" />\n"
+"</address>\n"
+"</atom>\n"
+"</presence>", contact_info, atom_id, contact_info);
 
          }
          else if (online_status==SalPresenceOnthephone)
          {
-                 snprintf(buf, buflen, "<?xml version=\"1.0\"?>\n\
-<!DOCTYPE presence SYSTEM \"http://schemas.microsoft.com/2002/09/sip/presence\">\n\
-<presence>\n\
-<presentity uri=\"%s;method=SUBSCRIBE\" />\n\
-<atom id=\"%i\">\n\
-<address uri=\"%s\">\n\
-<status status=\"inuse\" />\n\
-<msnsubstatus substatus=\"onthephone\" />\n\
-</address>\n\
-</atom>\n\
-</presence>", contact_info, atom_id, contact_info);
+                 snprintf(buf, buflen, "<?xml version=\"1.0\"?>\n"
+"<!DOCTYPE presence SYSTEM \"http://schemas.microsoft.com/2002/09/sip/presence\">\n"
+"<presence>\n"
+"<presentity uri=\"%s;method=SUBSCRIBE\" />\n"
+"<atom id=\"%i\">\n"
+"<address uri=\"%s\">\n"
+"<status status=\"inuse\" />\n"
+"<msnsubstatus substatus=\"onthephone\" />\n"
+"</address>\n"
+"</atom>\n"
+"</presence>", contact_info, atom_id, contact_info);
 
          }
          else if (online_status==SalPresenceOuttolunch)
          {
-                 snprintf(buf, buflen, "<?xml version=\"1.0\"?>\n\
-<!DOCTYPE presence SYSTEM \"http://schemas.microsoft.com/2002/09/sip/presence\">\n\
-<presence>\n\
-<presentity uri=\"%s;method=SUBSCRIBE\" />\n\
-<atom id=\"%i\">\n\
-<address uri=\"%s\">\n\
-<status status=\"inactive\" />\n\
-<msnsubstatus substatus=\"outtolunch\" />\n\
-</address>\n\
-</atom>\n\
-</presence>", contact_info, atom_id, contact_info);
+                 snprintf(buf, buflen, "<?xml version=\"1.0\"?>\n"
+"<!DOCTYPE presence SYSTEM \"http://schemas.microsoft.com/2002/09/sip/presence\">\n"
+"<presence>\n"
+"<presentity uri=\"%s;method=SUBSCRIBE\" />\n"
+"<atom id=\"%i\">\n"
+"<address uri=\"%s\">\n"
+"<status status=\"inactive\" />\n"
+"<msnsubstatus substatus=\"outtolunch\" />\n"
+"</address>\n"
+"</atom>\n"
+"</presence>", contact_info, atom_id, contact_info);
 
          }
          else
          {
-                 snprintf(buf, buflen, "<?xml version=\"1.0\"?>\n\
-<!DOCTYPE presence SYSTEM \"http://schemas.microsoft.com/2002/09/sip/presence\">\n\
-<presence>\n\
-<presentity uri=\"%s;method=SUBSCRIBE\" />\n\
-<atom id=\"%i\">\n\
-<address uri=\"%s\">\n\
-<status status=\"closed\" />\n\
-<msnsubstatus substatus=\"offline\" />\n\
-</address>\n\
-</atom>\n\
-</presence>", contact_info, atom_id, contact_info);
+                 snprintf(buf, buflen, "<?xml version=\"1.0\"?>\n"
+"<!DOCTYPE presence SYSTEM \"http://schemas.microsoft.com/2002/09/sip/presence\">\n"
+"<presence>\n"
+"<presentity uri=\"%s;method=SUBSCRIBE\" />\n"
+"<atom id=\"%i\">\n"
+"<address uri=\"%s\">\n"
+"<status status=\"closed\" />\n"
+"<msnsubstatus substatus=\"offline\" />\n"
+"</address>\n"
+"</atom>\n"
+"</presence>", contact_info, atom_id, contact_info);
          }
        break;
        }
@@ -418,118 +457,118 @@ static void mk_presence_body (const SalPresenceStatus online_status, const char
 
        if (online_status==SalPresenceOnline)
        {
-               snprintf(buf, buflen, "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n\
-<presence xmlns=\"urn:ietf:params:xml:ns:pidf\" \
-xmlns:dm=\"urn:ietf:params:xml:ns:pidf:data-model\" \
-xmlns:rpid=\"urn:ietf:params:xml:ns:pidf:rpid\" \
-entity=\"%s\">\n\
-<tuple id=\"sg89ae\">\n\
-<status><basic>open</basic></status>\n\
-<contact priority=\"0.8\">%s</contact>\n\
-</tuple>\n\
-</presence>",
+               snprintf(buf, buflen, "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
+"<presence xmlns=\"urn:ietf:params:xml:ns:pidf\" "
+"xmlns:dm=\"urn:ietf:params:xml:ns:pidf:data-model\" "
+"xmlns:rpid=\"urn:ietf:params:xml:ns:pidf:rpid\" "
+"entity=\"%s\">\n"
+"<tuple id=\"sg89ae\">\n"
+"<status><basic>open</basic></status>\n"
+"<contact priority=\"0.8\">%s</contact>\n"
+"</tuple>\n"
+"</presence>",
 contact_info, contact_info);
        }
        else if (online_status == SalPresenceBusy ||
                        online_status == SalPresenceDonotdisturb)
        {
-               snprintf(buf, buflen, "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n\
-<presence xmlns=\"urn:ietf:params:xml:ns:pidf\" \
-xmlns:dm=\"urn:ietf:params:xml:ns:pidf:data-model\" \
-xmlns:rpid=\"urn:ietf:params:xml:ns:pidf:rpid\" \
-entity=\"%s\">\n\
-<tuple id=\"sg89ae\">\n\
-<status><basic>open</basic></status>\n\
-<contact priority=\"0.8\">%s</contact>\n\
-</tuple>\n\
-<dm:person id=\"sg89aep\">\n\
-<rpid:activities><rpid:busy/></rpid:activities>\n\
-</dm:person>\n\
-</presence>",
+               snprintf(buf, buflen, "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
+"<presence xmlns=\"urn:ietf:params:xml:ns:pidf\" "
+"xmlns:dm=\"urn:ietf:params:xml:ns:pidf:data-model\" "
+"xmlns:rpid=\"urn:ietf:params:xml:ns:pidf:rpid\" "
+"entity=\"%s\">\n"
+"<tuple id=\"sg89ae\">\n"
+"<status><basic>open</basic></status>\n"
+"<contact priority=\"0.8\">%s</contact>\n"
+"</tuple>\n"
+"<dm:person id=\"sg89aep\">\n"
+"<rpid:activities><rpid:busy/></rpid:activities>\n"
+"</dm:person>\n"
+"</presence>",
 contact_info, contact_info);
        }
        else if (online_status==SalPresenceBerightback)
        {
-               snprintf(buf, buflen, "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n\
-<presence xmlns=\"urn:ietf:params:xml:ns:pidf\" \
-xmlns:dm=\"urn:ietf:params:xml:ns:pidf:data-model\" \
-xmlns:rpid=\"urn:ietf:params:xml:ns:pidf:rpid\" \
-entity=\"%s\">\n\
-<tuple id=\"sg89ae\">\n\
-<status><basic>open</basic></status>\n\
-<contact priority=\"0.8\">%s</contact>\n\
-</tuple>\n\
-<dm:person id=\"sg89aep\">\n\
-<rpid:activities><rpid:in-transit/></rpid:activities>\n\
-</dm:person>\n\
-</presence>",
+               snprintf(buf, buflen, "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
+"<presence xmlns=\"urn:ietf:params:xml:ns:pidf\" "
+"xmlns:dm=\"urn:ietf:params:xml:ns:pidf:data-model\" "
+"xmlns:rpid=\"urn:ietf:params:xml:ns:pidf:rpid\" "
+"entity=\"%s\">\n"
+"<tuple id=\"sg89ae\">\n"
+"<status><basic>open</basic></status>\n"
+"<contact priority=\"0.8\">%s</contact>\n"
+"</tuple>\n"
+"<dm:person id=\"sg89aep\">\n"
+"<rpid:activities><rpid:in-transit/></rpid:activities>\n"
+"</dm:person>\n"
+"</presence>",
 contact_info, contact_info);
        }
        else if (online_status == SalPresenceAway ||
                        online_status == SalPresenceMoved)
        {
-               snprintf(buf, buflen, "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n\
-<presence xmlns=\"urn:ietf:params:xml:ns:pidf\" \
-xmlns:dm=\"urn:ietf:params:xml:ns:pidf:data-model\" \
-xmlns:rpid=\"urn:ietf:params:xml:ns:pidf:rpid\" \
-entity=\"%s\">\n\
-<tuple id=\"sg89ae\">\n\
-<status><basic>open</basic></status>\n\
-<contact priority=\"0.8\">%s</contact>\n\
-</tuple>\n\
-<dm:person id=\"sg89aep\">\n\
-<rpid:activities><rpid:away/></rpid:activities>\n\
-</dm:person>\n\
-</presence>",
+               snprintf(buf, buflen, "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
+"<presence xmlns=\"urn:ietf:params:xml:ns:pidf\" "
+"xmlns:dm=\"urn:ietf:params:xml:ns:pidf:data-model\" "
+"xmlns:rpid=\"urn:ietf:params:xml:ns:pidf:rpid\" "
+"entity=\"%s\">\n"
+"<tuple id=\"sg89ae\">\n"
+"<status><basic>open</basic></status>\n"
+"<contact priority=\"0.8\">%s</contact>\n"
+"</tuple>\n"
+"<dm:person id=\"sg89aep\">\n"
+"<rpid:activities><rpid:away/></rpid:activities>\n"
+"</dm:person>\n"
+"</presence>",
 contact_info, contact_info);
        }
        else if (online_status==SalPresenceOnthephone)
        {
-               snprintf(buf, buflen, "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n\
-<presence xmlns=\"urn:ietf:params:xml:ns:pidf\" \
-xmlns:dm=\"urn:ietf:params:xml:ns:pidf:data-model\" \
-xmlns:rpid=\"urn:ietf:params:xml:ns:pidf:rpid\" \
-entity=\"%s\">\n\
-<tuple id=\"sg89ae\">\n\
-<status><basic>open</basic></status>\n\
-<contact priority=\"0.8\">%s</contact>\n\
-</tuple>\n\
-<dm:person id=\"sg89aep\">\n\
-<rpid:activities><rpid:on-the-phone/></rpid:activities>\n\
-</dm:person>\n\
-</presence>",
+               snprintf(buf, buflen, "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
+"<presence xmlns=\"urn:ietf:params:xml:ns:pidf\" "
+"xmlns:dm=\"urn:ietf:params:xml:ns:pidf:data-model\" "
+"xmlns:rpid=\"urn:ietf:params:xml:ns:pidf:rpid\" "
+"entity=\"%s\">\n"
+"<tuple id=\"sg89ae\">\n"
+"<status><basic>open</basic></status>\n"
+"<contact priority=\"0.8\">%s</contact>\n"
+"</tuple>\n"
+"<dm:person id=\"sg89aep\">\n"
+"<rpid:activities><rpid:on-the-phone/></rpid:activities>\n"
+"</dm:person>\n"
+"</presence>",
 contact_info, contact_info);
        }
        else if (online_status==SalPresenceOuttolunch)
        {
-               snprintf(buf, buflen, "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n\
-<presence xmlns=\"urn:ietf:params:xml:ns:pidf\" \
-xmlns:dm=\"urn:ietf:params:xml:ns:pidf:data-model\" \
-xmlns:rpid=\"urn:ietf:params:xml:ns:pidf:rpid\" \
-entity=\"%s\">\n\
-<tuple id=\"7777\">\n\
-<status><basic>open</basic></status>\n\
-<contact priority=\"0.8\">%s</contact>\n\
-</tuple>\n\
-<dm:person id=\"78787878\">\n\
-<rpid:activities><rpid:meal/></rpid:activities>\n\
-<rpid:note>Out to lunch</rpid:note> \n\
-</dm:person>\n\
-</presence>",
+               snprintf(buf, buflen, "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
+"<presence xmlns=\"urn:ietf:params:xml:ns:pidf\" "
+"xmlns:dm=\"urn:ietf:params:xml:ns:pidf:data-model\" "
+"xmlns:rpid=\"urn:ietf:params:xml:ns:pidf:rpid\" "
+"entity=\"%s\">\n"
+"<tuple id=\"7777\">\n"
+"<status><basic>open</basic></status>\n"
+"<contact priority=\"0.8\">%s</contact>\n"
+"</tuple>\n"
+"<dm:person id=\"78787878\">\n"
+"<rpid:activities><rpid:meal/></rpid:activities>\n"
+"<rpid:note>Out to lunch</rpid:note> \n"
+"</dm:person>\n"
+"</presence>",
 contact_info, contact_info);
        }
        else
        {
-               snprintf(buf, buflen, "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n\
-<presence xmlns=\"urn:ietf:params:xml:ns:pidf\" \
-xmlns:dm=\"urn:ietf:params:xml:ns:pidf:data-model\" \
-xmlns:rpid=\"urn:ietf:params:xml:ns:pidf:rpid\" \
-entity=\"%s\">\n\
-<tuple id=\"sg89ae\">\n\
-<status><basic>closed</basic></status>\n\
-<contact priority=\"0.8\">%s</contact>\n\
-</tuple>\n\
-</presence>\n", contact_info, contact_info);
+               snprintf(buf, buflen, "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
+"<presence xmlns=\"urn:ietf:params:xml:ns:pidf\" "
+"xmlns:dm=\"urn:ietf:params:xml:ns:pidf:data-model\" "
+"xmlns:rpid=\"urn:ietf:params:xml:ns:pidf:rpid\" "
+"entity=\"%s\">\n"
+"<tuple id=\"sg89ae\">\n"
+"<status><basic>closed</basic></status>\n"
+"<contact priority=\"0.8\">%s</contact>\n"
+"</tuple>\n"
+"</presence>\n", contact_info, contact_info);
        }
        break;
     }
@@ -557,7 +596,7 @@ static void add_presence_body(osip_message_t *notify, SalPresenceStatus online_s
 
 
 int sal_notify_presence(SalOp *op, SalPresenceStatus status, const char *status_message){
-       osip_message_t *msg;
+       osip_message_t *msg=NULL;
        eXosip_ss_t ss=EXOSIP_SUBCRSTATE_ACTIVE;
        if (op->nid==-1){
                ms_warning("Cannot notify, subscription was closed.");
@@ -569,6 +608,7 @@ int sal_notify_presence(SalOp *op, SalPresenceStatus status, const char *status_
        if (msg!=NULL){
                const char *identity=sal_op_get_contact(op);
                if (identity==NULL) identity=sal_op_get_to(op);
+               _osip_list_set_empty(&msg->contacts,(void (*)(void*))osip_contact_free);
                osip_message_set_contact(msg,identity);
                add_presence_body(msg,status);
                eXosip_insubscription_send_request(op->did,msg);
@@ -597,23 +637,26 @@ int sal_publish(SalOp *op, const char *from, const char *to, SalPresenceStatus p
        osip_message_t *pub;
        int i;
        char buf[1024];
+       const char *route=sal_op_get_route(op);
 
        mk_presence_body (presence_mode, from, buf, sizeof (buf), presence_style);
 
-       i = eXosip_build_publish(&pub,from, to, NULL, "presence", "300", 
+       i = eXosip_build_publish(&pub,to, from, NULL, "presence", "600", 
                presence_style ? "application/xpidf+xml" : "application/pidf+xml", buf);
        if (i<0){
                ms_warning("Failed to build publish request.");
                return -1;
        }
-
+       if (route)
+               sal_message_add_route(pub,route);
+       
        eXosip_lock();
        i = eXosip_publish(pub, to); /* should update the sip-if-match parameter
                                    from sip-etag  from last 200ok of PUBLISH */
        eXosip_unlock();
        if (i<0){
-         ms_message("Failed to send publish request.");
-         return -1;
+               ms_message("Failed to send publish request.");
+               return -1;
        }
        sal_add_other(sal_op_get_sal(op),op,pub);
        return 0;