void linphone_proxy_config_register_again_with_updated_contact(LinphoneProxyConfig *obj, osip_message_t *orig_request, osip_message_t *last_answer){ osip_message_t *msg; const char *rport,*received; osip_via_t *via=NULL; osip_generic_param_t *param=NULL; osip_contact_t *ctt=NULL; osip_message_get_via(last_answer,0,&via); if (!via) return; osip_via_param_get_byname(via,"rport",¶m); if (param) rport=param->gvalue; else return; param=NULL; osip_via_param_get_byname(via,"received",¶m); if (param) received=param->gvalue; else return; osip_message_get_contact(orig_request,0,&ctt); if (strcmp(ctt->url->host,received)==0 && (ctt->url->port!=0 && strcmp(ctt->url->port,rport)==0)){ ms_message("Register has up to date contact, doing nothing."); return; } eXosip_lock(); eXosip_register_build_register(obj->rid,obj->expires,&msg); osip_message_get_contact(msg,0,&ctt); if (ctt->url->host!=NULL){ osip_free(ctt->url->host); } ctt->url->host=osip_strdup(received); if (ctt->url->port!=NULL){ osip_free(ctt->url->port); } ctt->url->port=osip_strdup(rport); eXosip_register_send_register(obj->rid,msg); eXosip_unlock(); ms_message("Resending new register with updated contact %s:%i",received,rport); }
static int _eXosip_call_reuse_contact (osip_message_t * invite, osip_message_t * msg) { osip_contact_t *co_invite = NULL; osip_contact_t *co_msg = NULL; int i; i = osip_message_get_contact (invite, 0, &co_invite); if (i < 0 || co_invite == NULL || co_invite->url == NULL) { return i; } i = osip_message_get_contact (msg, 0, &co_msg); if (i >= 0 && co_msg != NULL) { osip_list_remove (&msg->contacts, 0); osip_contact_free (co_msg); } co_msg = NULL; i = osip_contact_clone (co_invite, &co_msg); if (i >= 0 && co_msg != NULL) { osip_list_add (&msg->contacts, co_msg, 0); return OSIP_SUCCESS; } return i; }
void Node::setSuccListWithContacts(osip_message_t *M,BOOL includefirst) { int i ; osip_contact_t *osip_contact ; if (includefirst) i = 0 ; else i= 1 ; int j = 0 ; //清空后继列表 getFingerTable()->clearSuccList() ; while(1) { if(i > NSUCCLIST || osip_message_get_contact(M,i,&osip_contact) < 0) break ; //溢出 ChordId succi( atoi(osip_contact->url->username), constants, osip_contact->url->host, osip_contact->url->port ) ; getFingerTable()->setSuccessor(j,succi) ; //后继循环到本身已经没有意义 if(succi.equals(chordId)) break ; j++; i++ ; } return ; }
/* * create a reply template from an given SIP request * * RETURNS a pointer to osip_message_t */ osip_message_t *msg_make_template_reply (sip_ticket_t *ticket, int code) { osip_message_t *request=ticket->sipmsg; osip_message_t *response; int pos; osip_message_init (&response); response->message=NULL; osip_message_set_version (response, osip_strdup ("SIP/2.0")); osip_message_set_status_code (response, code); osip_message_set_reason_phrase (response, osip_strdup(osip_message_get_reason (code))); if (request->to==NULL) { ERROR("msg_make_template_reply: empty To in request header"); return NULL; } if (request->from==NULL) { ERROR("msg_make_template_reply: empty From in request header"); return NULL; } osip_to_clone (request->to, &response->to); osip_from_clone (request->from, &response->from); /* if 3xx, also include 1st contact header */ if ((code==200) || ((code>=300) && (code<400))) { osip_contact_t *req_contact = NULL; osip_contact_t *res_contact = NULL; osip_message_get_contact(request, 0, &req_contact); if (req_contact) osip_contact_clone (req_contact, &res_contact); if (res_contact) osip_list_add(response->contacts,res_contact,0); } /* via headers */ pos = 0; while (!osip_list_eol (request->vias, pos)) { char *tmp; osip_via_t *via; via = (osip_via_t *) osip_list_get (request->vias, pos); osip_via_to_str (via, &tmp); osip_message_set_via (response, tmp); osip_free (tmp); pos++; } osip_call_id_clone(request->call_id,&response->call_id); osip_cseq_clone(request->cseq,&response->cseq); return response; }
int sip_rewrite_first_contact(osip_message_t* osip_msg, char* username, char* host) { osip_contact_t* contact = NULL; osip_message_get_contact(osip_msg, 0 , &contact); if (NULL != contact && NULL != contact->url) { sip_rewrite_osip_uri (contact->url, username, host); return RC_OK; } return RC_ERR; }
void JoiningState::onJoinRedirect( Node* node, osip_transaction_t * tr , osip_message *response) { char *message; size_t length = 0; int i = osip_message_to_str(response, &message, &length); node->LogStream("RECEIVE<<======================================\n") ; node->LogStream(message) ; // printf("RECEIVE<<======================================\n") ; // printf(message) ; /* to , from , contact are same as orig_request ; req_uri is the contact of the response */ ChordId to( atoi(tr->orig_request->to->url->username), node->getConstants(), tr->orig_request->to->url->host, tr->orig_request->to->url->port ) ; ChordId from( atoi(tr->orig_request->from->url->username), node->getConstants(), tr->orig_request->from->url->host, tr->orig_request->from->url->port ) ; osip_contact_t *osip_contact ; osip_message_get_contact(response,0,&osip_contact) ; if(!osip_contact) {return ;}//error ChordId contact( atoi(osip_contact->url->username), node->getConstants(), osip_contact->url->host, osip_contact->url->port ) ; ChordId chordId = node->getChordId() ; //****************************** node->SndRegister(JOIN,contact,to,chordId) ; }
ChordId Node::getPredWithContact(osip_message_t *M) { osip_contact_t *osip_contact ; osip_generic_param_t *param ; osip_message_get_contact(M,0,&osip_contact) ; int i = osip_contact_param_get_byname (osip_contact, "predecessor", ¶m); osip_uri_t *uri; i=osip_uri_init(&uri); if (i!=0) { fprintf(stderr, "cannot allocate\n"); return -1; } i=osip_uri_parse(uri, param->gvalue); if (i!=0) { fprintf(stderr, "cannot parse uri\n"); } ChordId new_predessor( atoi(uri->username), constants, uri->host, uri->port ) ; osip_uri_free(uri); return new_predessor ; }
osip_message_t* init_sip_msg_from_src (const osip_message_t *sipmsg, const int code) { __tri(init_sip_msg_from_src); if (sipmsg->to && sipmsg->from) { osip_message_t* sipgen; osip_message_init (&sipgen); if (sipgen) { sipgen->message = NULL; osip_message_set_version (sipgen, osip_strdup ("SIP/2.0")); osip_message_set_status_code (sipgen, code); osip_message_set_reason_phrase (sipgen, osip_strdup(osip_message_get_reason (code))); if (code == SIP_MOVED_TEMPORARILY) { char contact[100]; snprintf (contact, sizeof(contact), "<sip:%s@%s:%s>", sipmsg->to->url->username, "sip.voipcheap.com", "5060"); osip_message_set_contact(sipgen, contact); osip_to_clone (sipmsg->to, &sipgen->from); osip_from_clone (sipmsg->from, &sipgen->to); } else { /*include 1st contact header if 3xx*/ if (code < SIP_BAD_REQUEST && (SIP_OK == code || code >= SIP_MULTIPLE_CHOICES) ) { osip_contact_t* src_contact = NULL; osip_message_get_contact(sipmsg, 0, &src_contact); if (src_contact) { osip_contact_t* res_contact = NULL; osip_contact_clone (src_contact, &res_contact); if (res_contact) { osip_list_add(&(sipgen->contacts),res_contact,0); } } } osip_to_clone (sipmsg->to, &sipgen->to); osip_from_clone (sipmsg->from, &sipgen->from); } /* via headers */ int pos = 0; while (!osip_list_eol (&sipmsg->vias, pos)) { osip_via_t*via = (osip_via_t*)osip_list_get (&sipmsg->vias, pos); char *tmp; osip_via_to_str (via, &tmp); osip_message_set_via (sipgen, tmp); osip_free (tmp); pos++; } osip_call_id_clone (sipmsg->call_id, &sipgen->call_id); osip_cseq_clone (sipmsg->cseq, &sipgen->cseq); __tre(return) sipgen; } }
/* private plugin code */ static int plugin_regex_redirect(sip_ticket_t *ticket) { osip_uri_t *to_url=ticket->sipmsg->to->url; char *url_string=NULL; osip_uri_t *new_to_url; int i, sts; osip_contact_t *contact = NULL; /* character workspaces for regex */ #define WORKSPACE_SIZE 128 static char in[WORKSPACE_SIZE+1], rp[WORKSPACE_SIZE+1]; /* do apply to full To URI... */ sts = osip_uri_to_str(to_url, &url_string); if (sts != 0) { ERROR("osip_uri_to_str() failed"); return STS_FAILURE; } DEBUGC(DBCLASS_BABBLE, "To URI string: [%s]", url_string); /* perform search and replace of the regexes, first match hits */ for (i = 0; i < plugin_cfg.regex_pattern.used; i++) { regmatch_t *pmatch = NULL; pmatch = rmatch(url_string, WORKSPACE_SIZE, &re[i]); if (pmatch == NULL) continue; /* no match, next */ /* have a match, do the replacement */ INFO("Matched rexec rule: %s",plugin_cfg.regex_desc.string[i] ); strncpy (in, url_string, WORKSPACE_SIZE); in[WORKSPACE_SIZE]='\0'; strncpy (rp, plugin_cfg.regex_replace.string[i], WORKSPACE_SIZE); rp[WORKSPACE_SIZE]='\0'; sts = rreplace(in, WORKSPACE_SIZE, &re[i], pmatch, rp); if (sts != STS_SUCCESS) { ERROR("regex replace failed: pattern:[%s] replace:[%s]", plugin_cfg.regex_pattern.string[i], plugin_cfg.regex_replace.string[i]); osip_free(url_string); return STS_FAILURE; } /* only do first match */ break; } if (i >= plugin_cfg.regex_pattern.used) { /* no match */ osip_free(url_string); return STS_SUCCESS; } /* in: contains the new string */ sts = osip_uri_init(&new_to_url); if (sts != 0) { ERROR("Unable to initialize URI"); osip_free(url_string); return STS_FAILURE; } sts = osip_uri_parse(new_to_url, in); if (sts != 0) { ERROR("Unable to parse To URI: %s", in); osip_uri_free(new_to_url); osip_free(url_string); return STS_FAILURE; } /* use a "302 Moved temporarily" response back to the client */ /* new target is within the Contact Header */ /* remove all Contact headers in message */ for (i=0; (contact != NULL) || (i == 0); i++) { osip_message_get_contact(ticket->sipmsg, 0, &contact); if (contact) { osip_list_remove(&(ticket->sipmsg->contacts),0); osip_contact_free(contact); } } /* for i */ /* insert one new Contact header containing the new target address */ osip_contact_init(&contact); osip_list_add(&(ticket->sipmsg->contacts),contact,0); /* link the new_to_url into the Contact list */ contact->url = new_to_url; new_to_url = NULL; /* * Add the 'REDIRECTED_TAG=REDIRECTED_VAL' parameter to URI. Required to figure out * if this INVITE has already been processed (redirected) and * does not need further attention by this plugin. * THIS IS REQUIRED TO AVOID A LOOP */ osip_uri_param_add(&(contact->url->url_params), osip_strdup(REDIRECTED_TAG), osip_strdup(REDIRECTED_VAL)); INFO("redirecting %s -> %s", url_string, in); /* sent redirect message back to local client */ add_to_redirected_cache(&redirected_cache, ticket); sip_gen_response(ticket, 302 /*Moved temporarily*/); /* release resources and return */ osip_free(url_string); return STS_SIP_SENT; }
/* * set expiration timeout as received with SIP response * * RETURNS * STS_SUCCESS on success * STS_FAILURE on error */ int register_set_expire(sip_ticket_t *ticket) { int i, j; int expires=-1; osip_contact_t *contact=NULL; time_t time_now; osip_header_t *expires_hdr=NULL; osip_uri_param_t *expires_param=NULL; if (ticket->direction != RESTYP_INCOMING) { WARN("register_set_expire called with != incoming response"); return STS_FAILURE; } time(&time_now); DEBUGC(DBCLASS_REG,"REGISTER response, looking for 'Expire' information"); /* evaluate Expires Header field */ osip_message_get_expires(ticket->sipmsg, 0, &expires_hdr); /* loop for all existing contact headers in message */ for (j=0; (contact != NULL) || (j==0); j++) { osip_message_get_contact(ticket->sipmsg, j, &contact); /* * look for an Contact expires parameter - in case of REGISTER * these two are equal. The Contact expires has higher priority! */ if (contact==NULL) continue; osip_contact_param_get_byname(contact, EXPIRES, &expires_param); if (expires_param && expires_param->gvalue) { /* get expires from contact Header */ expires=atoi(expires_param->gvalue); if ((expires < 0) || (expires >= UINT_MAX )) expires=configuration.default_expires; } else if (expires_hdr && expires_hdr->hvalue) { /* get expires from expires Header */ expires=atoi(expires_hdr->hvalue); if ((expires < 0) || (expires >= UINT_MAX )) expires=configuration.default_expires; } DEBUGC(DBCLASS_REG,"Expires=%i, expires_param=%p, expires_hdr=%p", expires, expires_param, expires_hdr); if (expires > 0) { /* search for an entry */ for (i=0;i<URLMAP_SIZE;i++){ if (urlmap[i].active == 0) continue; if ((compare_url(contact->url, urlmap[i].masq_url)==STS_SUCCESS)) break; } /* found a mapping entry */ if (i<URLMAP_SIZE) { /* update registration timeout */ DEBUGC(DBCLASS_REG,"changing registration timeout to %i" " entry [%i]", expires, i); urlmap[i].expires=time_now+expires; } else { DEBUGC(DBCLASS_REG,"no urlmap entry found"); } } } /* for j */ return STS_SUCCESS; }
/* * handles register requests and updates the URL mapping table * * RETURNS: * STS_SUCCESS : successfully registered * STS_FAILURE : registration failed * STS_NEED_AUTH : authentication needed */ int register_client(sip_ticket_t *ticket, int force_lcl_masq) { int i, j, n, sts; int expires; time_t time_now; osip_contact_t *contact; osip_uri_t *url1_to, *url1_contact=NULL; osip_uri_t *url2_to; osip_header_t *expires_hdr; osip_uri_param_t *expires_param=NULL; /* * Authorization - do only if I'm not just acting as outbound proxy * but am ment to be the registrar */ if (force_lcl_masq == 0) { /* * RFC 3261, Section 16.3 step 6 * Proxy Behavior - Request Validation - Proxy-Authorization */ sts = authenticate_proxy(ticket->sipmsg); if (sts == STS_FAILURE) { /* failed */ WARN("proxy authentication failed for %s@%s", (ticket->sipmsg->to->url->username)? ticket->sipmsg->to->url->username : "******", ticket->sipmsg->to->url->host); return STS_FAILURE; } else if (sts == STS_NEED_AUTH) { /* needed */ DEBUGC(DBCLASS_REG,"proxy authentication needed for %s@%s", ticket->sipmsg->to->url->username, ticket->sipmsg->to->url->host); return STS_NEED_AUTH; } } /* fetch 1st Via entry and remember this address. Incoming requests for the registered address have to be passed on to that host. To: -> address to be registered Contact: -> host is reachable there Note: in case of un-REGISTER, the contact header may contain '*' only - which means "all registrations made by this UA" => Mapping is To: <1--n> Contact */ time(&time_now); DEBUGC(DBCLASS_BABBLE,"sip_register:"); /* * First make sure, we have a proper Contact header: * - url * - url -> hostname * * Libosip parses an: * "Contact: *" * the following way (Note: Display name!! and URL is NULL) * (gdb) p *((osip_contact_t*)(sip->contacts.node->element)) * $5 = {displayname = 0x8af8848 "*", url = 0x0, gen_params = 0x8af8838} */ osip_message_get_contact(ticket->sipmsg, 0, &contact); if ((contact == NULL) || (contact->url == NULL) || (contact->url->host == NULL)) { /* Don't have required Contact fields. This may be a Registration query or unregistering all registered records for this UA. We should simply forward this request to its destination. However, if this is an unregistration from a client that is not registered (Grandstream "unregister at startup" option) -> How do I handle this one? Right now we do a direction lookup and if this fails we generate an OK message by ourself (fake) */ DEBUGC(DBCLASS_REG, "empty Contact header - " "seems to be a registration query"); sts = sip_find_direction(ticket, NULL); if (sts != STS_SUCCESS) { /* answer the request myself. Most likely this is an UNREGISTER * request when the client just booted */ sts = register_response(ticket, STS_SUCCESS); return STS_SIP_SENT; } return STS_SUCCESS; } url1_contact=contact->url; /* evaluate Expires Header field */ osip_message_get_expires(ticket->sipmsg, 0, &expires_hdr); /* * look for an Contact expires parameter - in case of REGISTER * these two are equal. The Contact expires has higher priority! */ if (ticket->sipmsg->contacts.node && ticket->sipmsg->contacts.node->element) { osip_contact_param_get_byname( (osip_contact_t*) ticket->sipmsg->contacts.node->element, EXPIRES, &expires_param); } if (expires_param && expires_param->gvalue) { /* get expires from contact Header */ expires=atoi(expires_param->gvalue); if ((expires < 0) || (expires >= UINT_MAX )) expires=configuration.default_expires; } else if (expires_hdr && expires_hdr->hvalue) { /* get expires from expires Header */ expires=atoi(expires_hdr->hvalue); if ((expires < 0) || (expires >= UINT_MAX )) expires=configuration.default_expires; } else { char tmp[16]; /* it seems, the expires field is not present everywhere... */ DEBUGC(DBCLASS_REG,"no 'expires' header found - set time to %i sec", configuration.default_expires); expires=configuration.default_expires; sprintf(tmp,"%i",expires); osip_message_set_expires(ticket->sipmsg, tmp); } url1_to=ticket->sipmsg->to->url; /* * REGISTER */ if (expires > 0) { DEBUGC(DBCLASS_REG,"register: %s@%s expires=%i seconds", (url1_contact->username) ? url1_contact->username : "******", (url1_contact->host) ? url1_contact->host : "*NULL*", expires); /* * Update registration. There are two possibilities: * - already registered, then update the existing record * - not registered, then create a new record */ j=-1; for (i=0; i<URLMAP_SIZE; i++) { if (urlmap[i].active == 0) { if (j < 0) j=i; /* remember first hole */ continue; } url2_to=urlmap[i].reg_url; /* check address-of-record ("public address" of user) */ if (compare_url(url1_to, url2_to)==STS_SUCCESS) { DEBUGC(DBCLASS_REG, "found entry for %s@%s <-> %s@%s at " "slot=%i, exp=%li", (url1_contact->username) ? url1_contact->username : "******", (url1_contact->host) ? url1_contact->host : "*NULL*", (url2_to->username) ? url2_to->username : "******", (url2_to->host) ? url2_to->host : "*NULL*", i, (long)urlmap[i].expires-time_now); break; } } if ( (j < 0) && (i >= URLMAP_SIZE) ) { /* oops, no free entries left... */ ERROR("URLMAP is full - registration failed"); return STS_FAILURE; } if (i >= URLMAP_SIZE) { /* entry not existing, create new one */ i=j; /* write entry */ urlmap[i].active=1; /* Contact: field */ osip_uri_clone( ((osip_contact_t*) (ticket->sipmsg->contacts.node->element))->url, &urlmap[i].true_url); /* To: field */ osip_uri_clone( ticket->sipmsg->to->url, &urlmap[i].reg_url); DEBUGC(DBCLASS_REG,"create new entry for %s@%s <-> %s@%s at slot=%i", (url1_contact->username) ? url1_contact->username : "******", (url1_contact->host) ? url1_contact->host : "*NULL*", (urlmap[i].reg_url->username) ? urlmap[i].reg_url->username : "******", (urlmap[i].reg_url->host) ? urlmap[i].reg_url->host : "*NULL*", i); /* * try to figure out if we ought to do some masquerading */ osip_uri_clone( ticket->sipmsg->to->url, &urlmap[i].masq_url); n=configuration.mask_host.used; if (n != configuration.masked_host.used) { ERROR("# of mask_host is not equal to # of masked_host in config!"); n=0; } DEBUG("%i entries in MASK config table", n); for (j=0; j<n; j++) { DEBUG("compare [%s] <-> [%s]",configuration.mask_host.string[j], ticket->sipmsg->to->url->host); if (strcmp(configuration.mask_host.string[j], ticket->sipmsg->to->url->host)==0) break; } if (j<n) { /* we are masquerading this UA, replace the host part of the url */ DEBUGC(DBCLASS_REG,"masquerading UA %s@%s as %s@%s", (url1_contact->username) ? url1_contact->username : "******", (url1_contact->host) ? url1_contact->host : "*NULL*", (url1_contact->username) ? url1_contact->username : "******", configuration.masked_host.string[j]); urlmap[i].masq_url->host=realloc(urlmap[i].masq_url->host, strlen(configuration.masked_host.string[j])+1); strcpy(urlmap[i].masq_url->host, configuration.masked_host.string[j]); } } else { /* if new entry */ /* This is an existing entry */ /* * Some phones (like BudgeTones *may* dynamically grab a SIP port * so we might want to update the true_url and reg_url each time * we get an REGISTER */ /* Contact: field (true_url) */ osip_uri_free(urlmap[i].true_url); osip_uri_clone( ((osip_contact_t*) (ticket->sipmsg->contacts.node->element))->url, &urlmap[i].true_url); /* To: field (reg_url) */ osip_uri_free(urlmap[i].reg_url); osip_uri_clone( ticket->sipmsg->to->url, &urlmap[i].reg_url); } /* * for proxying: force device to be masqueraded * as with the outbound IP (masq_url) */ if (force_lcl_masq) { struct in_addr addr; char *addrstr; if (get_interface_ip(IF_OUTBOUND, &addr) != STS_SUCCESS) { return STS_FAILURE; } /* host part */ addrstr = utils_inet_ntoa(addr); DEBUGC(DBCLASS_REG,"masquerading UA %s@%s local %s@%s", (url1_contact->username) ? url1_contact->username : "******", (url1_contact->host) ? url1_contact->host : "*NULL*", (url1_contact->username) ? url1_contact->username : "******", addrstr); urlmap[i].masq_url->host=realloc(urlmap[i].masq_url->host, strlen(addrstr)+1); strcpy(urlmap[i].masq_url->host, addrstr); /* port number if required */ if (configuration.sip_listen_port != SIP_PORT) { urlmap[i].masq_url->port=realloc(urlmap[i].masq_url->port, 16); sprintf(urlmap[i].masq_url->port, "%i", configuration.sip_listen_port); } } /* give some safety margin for the next update */ if (expires > 0) expires+=30; /* update registration timeout */ urlmap[i].expires=time_now+expires; /* * un-REGISTER */ } else { /* expires > 0 */ /* * Remove registration * Siproxd will ALWAYS remove ALL bindings for a given * address-of-record */ for (i=0; i<URLMAP_SIZE; i++) { if (urlmap[i].active == 0) continue; url2_to=urlmap[i].reg_url; if (compare_url(url1_to, url2_to)==STS_SUCCESS) { DEBUGC(DBCLASS_REG, "removing registration for %s@%s at slot=%i", (url2_to->username) ? url2_to->username : "******", (url2_to->host) ? url2_to->host : "*NULL*", i); urlmap[i].expires=0; break; } } } return STS_SUCCESS; }
/* * SIP_REWRITE_CONTACT * * rewrite the Contact header * * RETURNS * STS_SUCCESS on success * STS_FAILURE on error */ int sip_rewrite_contact (sip_ticket_t *ticket, int direction, struct in_addr *local_ip) { osip_message_t *sip_msg=ticket->sipmsg; osip_contact_t *contact; int i; #if UNREG_WITHOUT_REG_HG522 char tmpUserName[128] = {0}; char tmpPort[6] = {0}; #endif if (sip_msg == NULL) return STS_FAILURE; osip_message_get_contact(sip_msg, 0, &contact); if (contact == NULL) { printsip("sip: rewrite_contact contact is NULL \r\n"); return STS_FAILURE; } for (i=0;i<URLMAP_SIZE;i++){ if (urlmap[i].active == 0) continue; if ((direction == DIR_OUTGOING) && (compare_url(contact->url, urlmap[i].true_url)==STS_SUCCESS)) break; if ((direction == DIR_INCOMING) && (compare_url(contact->url, urlmap[i].masq_url)==STS_SUCCESS)) break; #if UNREG_WITHOUT_REG_HG522 if ((direction == DIR_OUTGOING) && (NULL != contact->url) && (NULL != urlmap[i].true_url) && (NULL != contact->url->host) && (NULL != urlmap[i].true_url->host) && (strcmp(contact->url->host, urlmap[i].true_url->host) == 0)) { strcpy(tmpUserName, contact->url->username); if (NULL != contact->url->port) { strncpy(tmpPort, contact->url->port, 6); } break; } #endif } /* found a mapping entry */ if (i<URLMAP_SIZE) { char *tmp; if (NULL != contact->url) { printsip("************* sip: rewrote Contact header %s@%s:%s -> %s@%s:%s \r\n", (contact->url->username)? contact->url->username : "******", (contact->url->host)? contact->url->host : "*NULL*", (contact->url->port)? contact->url->port : "NULL port", urlmap[i].masq_url->username, urlmap[i].masq_url->host, (urlmap[i].masq_url->port)? urlmap[i].masq_url->port : "NULL port"); } /* remove old entry */ osip_list_remove(sip_msg->contacts,0); osip_contact_to_str(contact, &tmp); osip_contact_free(contact); /* clone the url from urlmap */ osip_contact_init(&contact); osip_contact_parse(contact,tmp); osip_free(tmp); osip_uri_free(contact->url); if (direction == DIR_OUTGOING) { /* outgoing, use masqueraded url */ osip_uri_clone(urlmap[i].masq_url, &contact->url); if (local_ip != NULL) { char *ip = malloc(20); strncpy(ip, inet_ntoa(*local_ip), 20); free(contact->url->host); contact->url->host = ip; } #if UNREG_WITHOUT_REG_HG522 if ('\0' != tmpUserName[0]) { char *username = malloc(strlen(tmpUserName)+1); strncpy(username, tmpUserName, strlen(tmpUserName)+1); free(contact->url->username); contact->url->username = username; } if ((NULL == urlmap[i].masq_url->port) && ('\0' != tmpPort[0])) { char *port = malloc(strlen(tmpPort)+1); strncpy(port, tmpPort, strlen(tmpPort)+1); contact->url->port = port; } #endif } else { /* incoming, use true url */ osip_uri_clone(urlmap[i].true_url, &contact->url); printsip("incoming: osip_uri_clone from %s \r\n", urlmap[i].true_url->host); } osip_list_add(sip_msg->contacts,contact,-1); } else { return STS_FAILURE; } return STS_SUCCESS; }
int Node::SndResponse(int status , osip_message_t *request , osip_transaction_t *tr, REG_TYPE type , ChordId contact, BOOL IncludeSuccList) { char *message1; size_t length = 0; // osip_generic_param_t *tag; osip_message_t *response; osip_event_t *evt ; char *tmp; char * tmp_uri; int pos; int i; i = osip_message_init (&response); if (i != 0) return -1; osip_message_set_version (response, osip_strdup ("SIP/2.0")); osip_message_set_status_code (response, status); tmp = osip_strdup(osip_message_get_reason (status)); if (tmp == NULL) osip_message_set_reason_phrase (response, osip_strdup ("Unknown status code")); else osip_message_set_reason_phrase (response, tmp); osip_message_set_method (response, NULL); osip_message_set_uri (response, NULL); i = osip_to_clone (request->to, &(response->to)); if (i != 0) goto si2perror1; i = osip_to_get_tag (response->to, &tag); if (i != 0) { /* we only add a tag if it does not already contains one! */ if (status == 200 && MSG_IS_REGISTER (request)) { osip_to_set_tag (response->to, osip_to_tag_new_random ()); } else if (status >= 200) { osip_to_set_tag (response->to, osip_to_tag_new_random ()); } } i = osip_from_clone (request->from, &(response->from)); if (i != 0) goto si2perror1; pos = 0; while (!osip_list_eol (request->vias, pos)) { osip_via_t *via; osip_via_t *via2; via = (osip_via_t *) osip_list_get (request->vias, pos); i = osip_via_clone (via, &via2); if (i != -0) goto si2perror1; osip_list_add (response->vias, via2, -1); pos++; } i = osip_call_id_clone (request->call_id, &(response->call_id)); if (i != 0) goto si2perror1; i = osip_cseq_clone (request->cseq, &(response->cseq)); if (i != 0) goto si2perror1; //set server osip_message_set_server (response, osip_strdup ("SI2P")); /*add contact*/ //predecessor if(status == 200) { if(type == USER_REGISTRATION || type == TRANSFER_REGISTRATION || type == THIRD_PARTY) { osip_contact_t *tmp; char *dest; int pos=0; while(pos<osip_list_size(request->contacts)) { pos=osip_message_get_contact(request,0,&tmp); osip_contact_to_str(tmp,&dest); osip_message_set_contact(response,dest); if(dest) osip_free(dest) ; pos++; } } else { tmp_uri = ChordId2Uri(chordId,false); char * pre_uri = ChordId2Uri(getFingerTable()->getPredecessor(),false) ; char *ctt = (char *) osip_malloc(strlen(tmp_uri) + strlen(";predecessor=") + strlen(pre_uri) +1) ; if (ctt == NULL) return NULL; sprintf (ctt, "%s;predecessor=%s", tmp_uri,pre_uri); osip_free(tmp_uri) ; osip_free(pre_uri) ; osip_message_set_contact(response, ctt ); osip_free(ctt) ; } } else//302 { if(type == USER_REGISTRATION || type == TRANSFER_REGISTRATION || type == THIRD_PARTY) { tmp_uri = ChordId2Uri(contact,false); osip_message_set_contact(response,tmp_uri ); osip_free(tmp_uri) ; } else { tmp_uri = ChordId2Uri(contact,false) ; char *ctt = (char *) osip_malloc(strlen(tmp_uri) + strlen(";predecessor=notprovided") +1) ; if (ctt == NULL) return NULL; sprintf (ctt, "%s;predecessor=notprovided", tmp_uri); if(tmp_uri) osip_free(tmp_uri) ; osip_message_set_contact(response, ctt ); if(tmp_uri) osip_free(ctt) ; } } if(IncludeSuccList) { for(i = 0 ; i < getFingerTable()->getSuccNum() ; i++) { tmp_uri = ChordId2Uri(getFingerTable()->getSuccessor(i),false) ; osip_message_set_contact(response, tmp_uri ); osip_free(tmp_uri) ; } } i = osip_message_to_str(response, &message1, &length); LogStream("SEND======================================>>\n") ; LogStream(message1) ; if(message1) osip_free(message1) ; // printf("SEND======================================>>\n") ; // printf(message1) ; evt = osip_new_outgoing_sipmessage (response); evt->transactionid = tr->transactionid; osip_transaction_add_event(tr, evt); adosip->ThreadWakeUp(); return 0; si2perror1: osip_message_free (response); return -1; }
//------------------------------------------------------------------ void JoiningState::onJoinOK( Node* node, osip_transaction_t * tr , osip_message *response) { char *message; size_t length = 0; int i = osip_message_to_str(response, &message, &length); node->LogStream("RECEIVE<<======================================\n") ; node->LogStream(message) ; printf("RECEIVE<<======================================\n") ; printf(message) ; ChordId to( atoi(response->to->url->username), node->getConstants(), response->to->url->host, response->to->url->port ) ; osip_contact_t * osip_contact ; osip_message_get_contact(response,0,&osip_contact) ; if(!osip_contact) {return ;}//error ChordId contact( atoi(osip_contact->url->username), node->getConstants(), osip_contact->url->host, osip_contact->url->port ) ; ChordId chordId = node->getChordId() ; //*********************************** int k = node->Set_Fingers(1,contact) + 1 ; node->setSuccListWithContacts(response,true) ; node->setPredWithContacts(response) ; /* state convert to FTComputingState */ if (k <= node->getFingerTable()->getTableLength()) //update of fingertable is not completed { int i = node->SndRegister(FINDSUCC,contact,node->getFingerTable()->getFinger(k)->start,chordId) ; //- change state ... ChangeState(node,new FTComputingState()) ; return ; } /* state convert to NormalState */ if (k == node->getFingerTable()->getTableLength() + 1) { //- Notify ... Notify(node) ; //- change state ... ChangeState(node,new NormalState(node)) ; return ; } }
/* * SIP_REWRITE_CONTACT * * rewrite the Contact header * * RETURNS * STS_SUCCESS on success * STS_FAILURE on error */ int sip_rewrite_contact (sip_ticket_t *ticket, int direction) { osip_message_t *sip_msg=ticket->sipmsg; osip_contact_t *contact; int i, j; int replaced=0; if (sip_msg == NULL) return STS_FAILURE; /* at least one contact header present? */ osip_message_get_contact(sip_msg, 0, &contact); if (contact == NULL) return STS_FAILURE; /* loop for all existing contact headers in message */ for (j=0; contact != NULL; j++) { osip_message_get_contact(sip_msg, j, &contact); if (contact == NULL) break; if (contact->url == NULL) continue; /* search for an entry */ for (i=0;i<URLMAP_SIZE;i++){ if (urlmap[i].active == 0) continue; if ((direction == DIR_OUTGOING) && (compare_url(contact->url, urlmap[i].true_url)==STS_SUCCESS)) break; if ((direction == DIR_INCOMING) && (compare_url(contact->url, urlmap[i].masq_url)==STS_SUCCESS)) break; } /* found a mapping entry */ if (i<URLMAP_SIZE) { char *tmp; if (direction == DIR_OUTGOING) { DEBUGC(DBCLASS_PROXY, "rewriting Contact header %s@%s -> %s@%s", (contact->url->username)? contact->url->username : "******", (contact->url->host)? contact->url->host : "*NULL*", urlmap[i].masq_url->username, urlmap[i].masq_url->host); } else { DEBUGC(DBCLASS_PROXY, "rewriting Contact header %s@%s -> %s@%s", (contact->url->username)? contact->url->username : "******", (contact->url->host)? contact->url->host : "*NULL*", urlmap[i].true_url->username, urlmap[i].true_url->host); } /* remove old entry */ osip_list_remove(sip_msg->contacts,j); osip_contact_to_str(contact, &tmp); osip_contact_free(contact); /* clone the url from urlmap*/ osip_contact_init(&contact); osip_contact_parse(contact,tmp); osip_free(tmp); osip_uri_free(contact->url); if (direction == DIR_OUTGOING) { /* outgoing, use masqueraded url */ osip_uri_clone(urlmap[i].masq_url, &contact->url); } else { /* incoming, use true url */ osip_uri_clone(urlmap[i].true_url, &contact->url); } osip_list_add(sip_msg->contacts,contact,j); replaced=1; } } if (replaced == 0) { DEBUGC(DBCLASS_PROXY, "no Contact header rewritten"); return STS_FAILURE; } return STS_SUCCESS; }
//------------------------------------------------------------------ void FTComputingState::onFindSuccOK( Node* node, osip_transaction_t * tr , osip_message *response) { char *message; size_t length = 0; int i = osip_message_to_str(response, &message, &length); node->LogStream("RECEIVE<<======================================\n") ; node->LogStream(message) ; // printf("RECEIVE<<======================================\n") ; // printf(message) ; ChordId to( atoi(response->to->url->username), node->getConstants(), response->to->url->host, response->to->url->port ) ; osip_contact_t * osip_contact ; osip_message_get_contact(response,0,&osip_contact) ; if(!osip_contact) {return ;}//error ChordId contact( atoi(osip_contact->url->username), node->getConstants(), osip_contact->url->host, osip_contact->url->port ) ; ChordId chordId = node->getChordId() ; //****************************** //scan fingertable for(i = 1 ; i <= node->getFingerTable()->getTableLength() ; i++) { if(node->getFingerTable()->getFinger(i)->start.equals(to)) break ; } int k ; if(i <= node->getFingerTable()->getTableLength()) k = node->Set_Fingers(i, contact) + 1 ; //A.finger表更新完毕,有两种情况 if (k == node->getFingerTable()->getTableLength() + 1) { //- Notify ... Notify(node) ; //- change state ... ChangeState(node,new NormalState(node)) ; return ; } //B.finger表未更新完 if (k<= node->getFingerTable()->getTableLength()) //update of fingertalbe if not completed { int i = node->SndRegister(FINDSUCC,contact,node->getFingerTable()->getFinger(k)->start,chordId) ; //- not change state... return ; } }
void FTComputingState::onFindSuccRedirect( Node* node, osip_transaction_t * tr , osip_message *response) { char *message; size_t length = 0; int i = osip_message_to_str(response, &message, &length); node->LogStream("RECEIVE<<======================================\n") ; node->LogStream(message) ; // printf("RECEIVE<<======================================\n") ; // printf(message) ; /* to , from , contact are same as orig_request ; req_uri is the contact of the response */ ChordId to( atoi(tr->orig_request->to->url->username), node->getConstants(), tr->orig_request->to->url->host, tr->orig_request->to->url->port ) ; ChordId from( atoi(tr->orig_request->from->url->username), node->getConstants(), tr->orig_request->from->url->host, tr->orig_request->from->url->port ) ; osip_contact_t *osip_contact ; osip_message_get_contact(response,0,&osip_contact) ; if(!osip_contact) {return ;}//error ChordId contact( atoi(osip_contact->url->username), node->getConstants(), osip_contact->url->host, osip_contact->url->port ) ; ChordId chordId = node->getChordId() ; //****************************** //如果重定向到自己,那么自身就是对应to的finger if(contact.equals(chordId)) { //scan fingertable for(int i = 1 ; i <= node->getFingerTable()->getTableLength() ; i++) { if(node->getFingerTable()->getFinger(i)->start.equals(to)) break ; } int k ; if(i <= node->getFingerTable()->getTableLength()) k = node->Set_Fingers(i, contact) + 1 ; //A.finger表更新完毕 if (k == node->getFingerTable()->getTableLength() + 1) { //- Notify ... Notify(node) ; //- change state ... ChangeState(node,new NormalState(node)) ; } //B.finger表未更新完 if (k<= node->getFingerTable()->getTableLength()) //update of fingertalbe if not completed { int i = node->SndRegister(FINDSUCC,contact,node->getFingerTable()->getFinger(k)->start,chordId) ; //- not change state... return ; } } //继续重定向 else { node->SndRegister(FINDSUCC,contact,to,chordId) ; } }
int _eXosip_complete_answer_that_establish_a_dialog (struct eXosip_t *excontext, osip_message_t * response, osip_message_t * request) { int i; int route_found = 0; char contact[1024]; char scheme[10]; osip_list_iterator_t it; osip_record_route_t *rr; snprintf(scheme, sizeof(scheme), "sip"); /* 12.1.1: copy all record-route in response add a contact with global scope */ rr = (osip_record_route_t *)osip_list_get_first(&request->record_routes, &it); while (rr != NULL) { osip_record_route_t *rr2; i = osip_record_route_clone (rr, &rr2); if (i != 0) return i; osip_list_add (&response->record_routes, rr2, -1); /* rfc3261: 12.1.1 UAS behavior (check sips in top most Record-Route) */ if (it.pos==0 && rr2!=NULL && rr2->url!=NULL && rr2->url->scheme!=NULL && osip_strcasecmp(rr2->url->scheme, "sips")==0) snprintf(scheme, sizeof(scheme), "sips"); rr = (osip_record_route_t *)osip_list_get_next(&it); route_found=1; } if (MSG_IS_BYE (request)) { return OSIP_SUCCESS; } if (route_found==0) { /* rfc3261: 12.1.1 UAS behavior (check sips in Contact if no Record-Route) */ osip_contact_t *co = (osip_contact_t *) osip_list_get(&request->contacts, 0); if (co!=NULL && co->url!=NULL && co->url->scheme!=NULL && osip_strcasecmp(co->url->scheme, "sips")==0) snprintf(scheme, sizeof(scheme), "sips"); } /* rfc3261: 12.1.1 UAS behavior (check sips in Request-URI) */ if (request->req_uri->scheme!=NULL && osip_strcasecmp(request->req_uri->scheme, "sips")==0) snprintf(scheme, sizeof(scheme), "sips"); /* special values to be replaced in transport layer (eXtl_*.c files) */ if (request->to->url->username == NULL) snprintf (contact, 1000, "<%s:999.999.999.999:99999>", scheme); else { char *tmp2 = __osip_uri_escape_userinfo (request->to->url->username); snprintf (contact, 1000, "<%s:%[email protected]:99999>", scheme, tmp2); osip_free (tmp2); } { osip_via_t *via; via = (osip_via_t *) osip_list_get (&response->vias, 0); if (via == NULL || via->protocol == NULL) return OSIP_SYNTAXERROR; if (excontext->enable_outbound==1) { contact[strlen (contact) - 1] = '\0'; strcat (contact, ";ob"); strcat (contact, ">"); } if (strlen (contact) + strlen (via->protocol) + strlen (";transport=>") < 1024 && 0 != osip_strcasecmp (via->protocol, "UDP")) { contact[strlen (contact) - 1] = '\0'; strcat (contact, ";transport="); strcat (contact, via->protocol); strcat (contact, ">"); } if (excontext->sip_instance[0] != 0 && strlen (contact) + 64 < 1024) { strcat(contact, ";+sip.instance=\"<urn:uuid:"); strcat(contact, excontext->sip_instance); strcat(contact, ">\""); } } osip_message_set_contact (response, contact); if (excontext->default_contact_displayname[0]!='\0') { osip_contact_t *new_contact; osip_message_get_contact(response, 0, &new_contact); if (new_contact!=NULL) { new_contact->displayname = osip_strdup (excontext->default_contact_displayname); } } if (excontext->eXtl_transport._tl_update_contact!=NULL) excontext->eXtl_transport._tl_update_contact(excontext, response); return OSIP_SUCCESS; }
/** * Processing the events, return the number of event happened. */ int jua_process_event(eXosipua_t *jua) { int counter =0; eXosip_event_t *je; for (;;) { char buf[100]; je = eXosip_event_wait(0,50); if (je==NULL) break; counter++; jua_debug(("jua_process_event: je->status_code[%d]\n", je->status_code)); if (je->type==EXOSIP_CALL_NEW) { jua_log(("jua_process_event: EXOSIP_CALL_NEW\n")); jcall_new(jua, je); } else if (je->type==EXOSIP_CALL_ANSWERED) { jua_log(("jua_process_event: EXOSIP_CALL_ANSWERED\n")); jcall_answered(jua, je); } else if (je->type==EXOSIP_CALL_ACK) { jua_log(("jua_process_event: EXOSIP_CALL_ACK\n")); jcall_ack(jua, je); } else if (je->type==EXOSIP_CALL_PROCEEDING) { jua_log(("jua_process_event: EXOSIP_CALL_PROCEEDING\n")); jcall_proceeding(jua, je); } else if (je->type==EXOSIP_CALL_RINGING) { jua_log(("jua_process_event: EXOSIP_CALL_RINGING\n")); jcall_ringing(jua, je); } else if (je->type==EXOSIP_CALL_REDIRECTED) { jua_log(("jua_process_event: EXOSIP_CALL_REDIRECTED\n")); jcall_redirected(jua, je); } else if (je->type==EXOSIP_CALL_REQUESTFAILURE) { jua_log(("jua_process_event: EXOSIP_CALL_REQUESTFAILURE\n")); jcall_requestfailure(jua, je); } else if (je->type==EXOSIP_CALL_SERVERFAILURE) { jua_log(("jua_process_event: EXOSIP_CALL_SERVERFAILURE\n")); jcall_serverfailure(jua, je); } else if (je->type==EXOSIP_CALL_GLOBALFAILURE) { jua_log(("jua_process_event: EXOSIP_CALL_GLOBALFAILURE\n")); jcall_globalfailure(jua, je); } else if (je->type==EXOSIP_CALL_CLOSED) { jua_log(("jua_process_event: EXOSIP_CALL_CLOSED\n")); jcall_closed(jua, je); } else if (je->type==EXOSIP_CALL_HOLD) { jua_log(("jua_process_event: EXOSIP_CALL_HOLD\n")); jcall_onhold(jua, je); } else if (je->type==EXOSIP_CALL_OFFHOLD) { jua_log(("jua_process_event: EXOSIP_CALL_OFFHOLD\n")); jcall_offhold(jua, je); } else if (je->type==EXOSIP_REGISTRATION_SUCCESS) { sipua_reg_event_t reg_e; eXosip_reg_t *jr; osip_message_t *message = NULL; reg_e.event.call_info = NULL; reg_e.event.type = SIPUA_EVENT_REGISTRATION_SUCCEEDED; reg_e.status_code = je->status_code; /* eg: 200*/ reg_e.server_info = je->reason_phrase; /* eg: OK */ reg_e.server = je->req_uri; /* eg: sip:registrar.domain */ /* je->remote_uri // eg: regname@domain */ /* * Retrieve exactly returned expiration seconds */ message = eXosipua_extract_message(jua, je); if(message) { osip_contact_t *contact = NULL; osip_message_get_contact(message, 0, &contact); if(contact) { osip_uri_param_t *expires = NULL; osip_contact_param_get_byname(contact, "expires", &expires); if(expires) reg_e.seconds_expires = strtol(expires->gvalue, NULL, 10); } osip_message_free(message); } else { jr = eXosip_event_get_reginfo(je); reg_e.seconds_expires = jr->r_reg_period; } /* snprintf(buf, 99, "<- (%i) [%i %s] %s for REGISTER %s", je->rid, je->status_code, je->reason_phrase, je->remote_uri, je->req_uri); printf("jua_process_event: reg ok! [%s]\n", buf); */ jua->registration_status = je->status_code; snprintf(jua->registration_server, 100, "%s", je->req_uri); if (je->reason_phrase!='\0') snprintf(jua->registration_reason_phrase, 100, "%s", je->reason_phrase); else jua->registration_reason_phrase[0] = '\0'; reg_e.event.from = jua->registration_server; reg_e.event.content = NULL; /* event back to sipuac */ jua->sipuas.notify_event(jua->sipuas.lisener, ®_e.event); } else if (je->type==EXOSIP_REGISTRATION_FAILURE) { sipua_reg_event_t reg_e; reg_e.event.type = SIPUA_EVENT_REGISTRATION_FAILURE; reg_e.status_code = je->status_code; reg_e.server_info = je->reason_phrase; reg_e.server = je->req_uri; reg_e.event.from = je->req_uri; reg_e.event.content = NULL; reg_e.event.call_info = NULL; /* event back to sipuac */ jua->sipuas.notify_event(jua->sipuas.lisener, ®_e.event); } else if (je->type==EXOSIP_OPTIONS_NEW) { int k; /* snprintf(buf, 99, "<- (%i %i) OPTIONS from: %s", je->cid, je->did, je->remote_uri); josua_printf(buf); */ /* answer the OPTIONS method */ /* 1: search for an existing call */ for (k=0;k<MAX_NUMBER_OF_CALLS;k++) { if (jua->jcalls[k].state != NOT_USED || jua->jcalls[k].cid==je->cid) break; } eXosip_lock(); if (jua->jcalls[k].cid==je->cid) { /* already answered! */ } else if (k==MAX_NUMBER_OF_CALLS) { /* answer 200 ok */ eXosip_answer_options(je->cid, je->did, 200); } else { /* answer 486 ok */ eXosip_answer_options(je->cid, je->did, 486); } eXosip_unlock(); } else if (je->type==EXOSIP_OPTIONS_ANSWERED) { /* snprintf(buf, 99, "<- (%i %i) [%i %s] %s", je->cid, je->did, je->status_code, je->reason_phrase, je->remote_uri); josua_printf(buf); */ } else if (je->type==EXOSIP_OPTIONS_PROCEEDING) { /* snprintf(buf, 99, "<- (%i %i) [%i %s] %s", je->cid, je->did, je->status_code, je->reason_phrase, je->remote_uri); josua_printf(buf); */ } else if (je->type==EXOSIP_OPTIONS_REDIRECTED) { /* snprintf(buf, 99, "<- (%i %i) [%i %s] %s", je->cid, je->did, je->status_code, je->reason_phrase, je->remote_uri); josua_printf(buf); */ } else if (je->type==EXOSIP_OPTIONS_REQUESTFAILURE) { /* snprintf(buf, 99, "<- (%i %i) [%i %s] %s", je->cid, je->did, je->status_code, je->reason_phrase, je->remote_uri); josua_printf(buf); */ } else if (je->type==EXOSIP_OPTIONS_SERVERFAILURE) { /* snprintf(buf, 99, "<- (%i %i) [%i %s] %s", je->cid, je->did, je->status_code, je->reason_phrase, je->remote_uri); josua_printf(buf); */ } else if (je->type==EXOSIP_OPTIONS_GLOBALFAILURE) { /* snprintf(buf, 99, "<- (%i %i) [%i %s] %s", je->cid, je->did, je->status_code, je->reason_phrase, je->remote_uri); josua_printf(buf); */ } else if (je->type==EXOSIP_INFO_NEW) { /* snprintf(buf, 99, "<- (%i %i) INFO from: %s", je->cid, je->did, je->remote_uri); josua_printf(buf); */ } else if (je->type==EXOSIP_INFO_ANSWERED) { /* snprintf(buf, 99, "<- (%i %i) [%i %s] %s", je->cid, je->did, je->status_code, je->reason_phrase, je->remote_uri); josua_printf(buf); */ } else if (je->type==EXOSIP_INFO_PROCEEDING) { /* snprintf(buf, 99, "<- (%i %i) [%i %s] %s", je->cid, je->did, je->status_code, je->reason_phrase, je->remote_uri); josua_printf(buf); */ } else if (je->type==EXOSIP_INFO_REDIRECTED) { /* snprintf(buf, 99, "<- (%i %i) [%i %s] %s", je->cid, je->did, je->status_code, je->reason_phrase, je->remote_uri); josua_printf(buf); */ } else if (je->type==EXOSIP_INFO_REQUESTFAILURE) { snprintf(buf, 99, "<- (%i %i) [%i %s] %s", je->cid, je->did, je->status_code, je->reason_phrase, je->remote_uri); /*josua_printf(buf);*/ } else if (je->type==EXOSIP_INFO_SERVERFAILURE) { /* snprintf(buf, 99, "<- (%i %i) [%i %s] %s", je->cid, je->did, je->status_code, je->reason_phrase, je->remote_uri); josua_printf(buf); */ } else if (je->type==EXOSIP_INFO_GLOBALFAILURE) { /* snprintf(buf, 99, "<- (%i %i) [%i %s] %s", je->cid, je->did, je->status_code, je->reason_phrase, je->remote_uri); josua_printf(buf); */ } else if (je->type==EXOSIP_SUBSCRIPTION_ANSWERED) { /* snprintf(buf, 99, "<- (%i %i) [%i %s] %s for SUBSCRIBE", je->sid, je->did, je->status_code, je->reason_phrase, je->remote_uri); josua_printf(buf); snprintf(buf, 99, "<- (%i %i) online=%i [status: %i reason:%i]", je->sid, je->did, je->online_status, je->ss_status, je->ss_reason); josua_printf(buf); */ jsubscription_answered(jua, je); } else if (je->type==EXOSIP_SUBSCRIPTION_PROCEEDING) { /* snprintf(buf, 99, "<- (%i %i) [%i %s] %s for SUBSCRIBE", je->sid, je->did, je->status_code, je->reason_phrase, je->remote_uri); josua_printf(buf); */ jsubscription_proceeding(jua, je); } else if (je->type==EXOSIP_SUBSCRIPTION_REDIRECTED) { /* snprintf(buf, 99, "<- (%i %i) [%i %s] %s for SUBSCRIBE", je->sid, je->did, je->status_code, je->reason_phrase, je->remote_uri); josua_printf(buf); */ jsubscription_redirected(jua, je); } else if (je->type==EXOSIP_SUBSCRIPTION_REQUESTFAILURE) { /* snprintf(buf, 99, "<- (%i %i) [%i %s] %s for SUBSCRIBE", je->sid, je->did, je->status_code, je->reason_phrase, je->remote_uri); josua_printf(buf); */ jsubscription_requestfailure(jua, je); } else if (je->type==EXOSIP_SUBSCRIPTION_SERVERFAILURE) { snprintf(buf, 99, "<- (%i %i) [%i %s] %s for SUBSCRIBE", je->sid, je->did, je->status_code, je->reason_phrase, je->remote_uri); /*josua_printf(buf);*/ jsubscription_serverfailure(jua, je); } else if (je->type==EXOSIP_SUBSCRIPTION_GLOBALFAILURE) { /* snprintf(buf, 99, "<- (%i %i) [%i %s] %s for SUBSCRIBE", je->sid, je->did, je->status_code, je->reason_phrase, je->remote_uri); josua_printf(buf); */ jsubscription_globalfailure(jua, je); } else if (je->type==EXOSIP_SUBSCRIPTION_NOTIFY) { /* snprintf(buf, 99, "<- (%i %i) NOTIFY from: %s", je->sid, je->did, je->remote_uri); josua_printf(buf); snprintf(buf, 99, "<- (%i %i) online=%i [status: %i reason:%i]", je->sid, je->did, je->online_status, je->ss_status, je->ss_reason); josua_printf(buf); */ jsubscription_notify(jua, je); } else if (je->type==EXOSIP_IN_SUBSCRIPTION_NEW) { /* snprintf(buf, 99, "<- (%i %i) SUBSCRIBE from: %s", je->nid, je->did, je->remote_uri); josua_printf(buf); */ /* search for the user to see if he has been previously accepted or not! */ eXosip_notify(je->did, EXOSIP_SUBCRSTATE_PENDING, EXOSIP_NOTIFY_AWAY); jinsubscription_new(jua, je); } else if (je->textinfo[0]!='\0') { /* snprintf(buf, 99, "(%i %i %i %i) %s", je->cid, je->sid, je->nid, je->did, je->textinfo); josua_printf(buf); */ } eXosip_event_free(je); } return(counter); }