int Sipreply2Xmpp(ua_pres_t* hentity, struct sip_msg * msg) { /* named according to the direction of the message in xmpp*/ str from_uri; str to_uri; xmlDocPtr doc= NULL; xmlNodePtr root_node= NULL, node = NULL; xmlAttrPtr attr= NULL; str xmpp_msg; int code; str reason; char* err_reason= NULL; xmlBufferPtr buffer= NULL; char buf_to[256]; LM_DBG("*** Entered the callback\n"); URI_ADD_NULL_TERM(to_uri, buf_to, hentity->watcher_uri); from_uri.s = xmpp_uri_sip2xmpp(hentity->pres_uri); if(from_uri.s == NULL) { LM_ERR("Failed to traslate sip uri to xmpp uri\n"); return -1; } from_uri.len= strlen(from_uri.s); doc= xmlNewDoc(BAD_CAST "1.0"); if(doc==0) goto error; root_node = xmlNewNode(NULL, BAD_CAST "presence"); if(root_node==0) goto error; xmlDocSetRootElement(doc, root_node); attr= xmlNewProp(root_node, BAD_CAST "to", BAD_CAST to_uri.s); if(attr== NULL) { LM_ERR("while adding attribute to\n"); goto error; } attr= xmlNewProp(root_node, BAD_CAST "from", BAD_CAST from_uri.s); if(attr== NULL) { LM_ERR("while adding attribute from\n"); goto error; } if(msg== FAKED_REPLY) { code = 408; reason.s= "Request Timeout"; reason.len= strlen(reason.s)- 1; } else { code= msg->first_line.u.reply.statuscode; reason= msg->first_line.u.reply.reason; } LM_DBG("SIP reply code=%d ; to_uri= %s ; from_uri= %s\n", code, to_uri.s, from_uri.s); if(code>=300) { err_reason= get_error_reason(code, &reason); if(err_reason== NULL) { LM_ERR("couldn't get response phrase\n"); goto error; } attr= xmlNewProp(root_node, BAD_CAST "type", BAD_CAST "error"); if(attr== NULL) { LM_ERR("while adding new attribute\n"); goto error; } node= xmlNewChild(root_node, 0, BAD_CAST "error", 0 ); if(node== NULL) { LM_ERR("while adding new node\n"); goto error; } node= xmlNewChild(node, 0, BAD_CAST err_reason, 0 ); if(node== NULL) { LM_ERR("while adding new node\n"); goto error; } attr= xmlNewProp(node, BAD_CAST "xmlns", BAD_CAST "urn:ietf:params:xml:ns:xmpp-stanzas"); if(attr== NULL) { LM_ERR("while adding new attribute\n"); goto error; } } else { if(code>=200 ) { attr= xmlNewProp(root_node, BAD_CAST "type", BAD_CAST "subscribed"); if(attr== NULL) { LM_ERR("while adding new attribute\n"); goto error; } } } buffer= xmlBufferCreate(); if(buffer== NULL) { LM_ERR("while adding creating new buffer\n"); goto error; } xmpp_msg.len= xmlNodeDump(buffer, doc, root_node, 1,1); if(xmpp_msg.len== -1) { LM_ERR("while dumping node\n"); goto error; } xmpp_msg.s= (char*)xmlBufferContent( buffer); if(xmpp_msg.s== NULL) { LM_ERR("while extracting buffer content\n"); goto error; } LM_DBG("xmpp_msg: %.*s\n",xmpp_msg.len, xmpp_msg.s); if(xmpp_packet(&from_uri, &to_uri, &xmpp_msg, &hentity->to_tag)< 0) { LM_ERR("while sending xmpp_reply_to_subscribe\n"); goto error; } if(err_reason) pkg_free(err_reason); xmlFreeDoc(doc); return 0; error: if(doc) xmlFreeDoc(doc); if(err_reason) pkg_free(err_reason); return -1; }
int Sipreply2Xmpp(ua_pres_t* hentity, struct sip_msg * msg) { char* uri; /* named according to the direction of the message in xmpp*/ str from_uri; str to_uri; xmlDocPtr doc= NULL; xmlNodePtr root_node= NULL, node = NULL; xmlAttrPtr attr= NULL; str xmpp_msg; int code; str reason; char* err_reason= NULL; xmlBufferPtr buffer= NULL; LM_DBG("start..\n"); uri=(char*)pkg_malloc(sizeof(char)*( hentity->watcher_uri->len+1)); if(uri== NULL) { LM_ERR("no more memory\n"); goto error; } memcpy(uri, hentity->watcher_uri->s, hentity->watcher_uri->len); uri[hentity->watcher_uri->len]= '\0'; to_uri.s= duri_sip_xmpp(uri); if(to_uri.s== NULL) { LM_ERR("whil decoding sip uri in xmpp\n"); pkg_free(uri); goto error; } to_uri.len= strlen(to_uri.s); pkg_free(uri); uri=(char*)pkg_malloc(sizeof(char)*( hentity->pres_uri->len+1)); if(uri== NULL) { LM_ERR("no more memory\n"); goto error; } memcpy(uri, hentity->pres_uri->s, hentity->pres_uri->len); uri[hentity->pres_uri->len]= '\0'; from_uri.s= euri_sip_xmpp(uri); if(from_uri.s== NULL) { LM_ERR("while encoding sip uri in xmpp\n"); pkg_free(uri); goto error; } from_uri.len= strlen(from_uri.s); pkg_free(uri); doc= xmlNewDoc(BAD_CAST "1.0"); if(doc==0) goto error; root_node = xmlNewNode(NULL, BAD_CAST "presence"); if(root_node==0) goto error; xmlDocSetRootElement(doc, root_node); attr= xmlNewProp(root_node, BAD_CAST "to", BAD_CAST to_uri.s); if(attr== NULL) { LM_ERR("while adding attribute to\n"); goto error; } attr= xmlNewProp(root_node, BAD_CAST "from", BAD_CAST from_uri.s); if(attr== NULL) { LM_ERR("while adding attribute from\n"); goto error; } if(msg== FAKED_REPLY) { code = 408; reason.s= "Request Timeout"; reason.len= strlen(reason.s)- 1; } else { code= msg->first_line.u.reply.statuscode; reason= msg->first_line.u.reply.reason; } LM_DBG(" to_uri= %s\n\t from_uri= %s\n", to_uri.s, from_uri.s); if(code>=300) { LM_DBG(" error code(>= 300)\n"); err_reason= get_error_reason(code, &reason); if(err_reason== NULL) { LM_ERR("couldn't get response phrase\n"); goto error; } attr= xmlNewProp(root_node, BAD_CAST "type", BAD_CAST "error"); if(attr== NULL) { LM_ERR("while adding new attribute\n"); goto error; } node= xmlNewChild(root_node, 0, BAD_CAST "error", 0 ); if(node== NULL) { LM_ERR("while adding new node\n"); goto error; } node= xmlNewChild(node, 0, BAD_CAST err_reason, 0 ); if(node== NULL) { LM_ERR("while adding new node\n"); goto error; } attr= xmlNewProp(node, BAD_CAST "xmlns", BAD_CAST "urn:ietf:params:xml:ns:xmpp-stanzas"); if(attr== NULL) { LM_ERR("while adding new attribute\n"); goto error; } } else { if(code>=200 ) { LM_DBG(" 2xx code\n"); attr= xmlNewProp(root_node, BAD_CAST "type", BAD_CAST "subscribed"); if(attr== NULL) { LM_ERR("while adding new attribute\n"); goto error; } } } buffer= xmlBufferCreate(); if(buffer== NULL) { LM_ERR("while adding creating new buffer\n"); goto error; } xmpp_msg.len= xmlNodeDump(buffer, doc, root_node, 1,1); if(xmpp_msg.len== -1) { LM_ERR("while dumping node\n"); goto error; } xmpp_msg.s= (char*)xmlBufferContent( buffer); if(xmpp_msg.s== NULL) { LM_ERR("while extracting buffer content\n"); goto error; } LM_DBG("xmpp_msg: %.*s\n",xmpp_msg.len, xmpp_msg.s); if(xmpp_packet(&from_uri, &to_uri, &xmpp_msg, &hentity->to_tag)< 0) { LM_ERR("while sending xmpp_reply_to_subscribe\n"); goto error; } if(err_reason) pkg_free(err_reason); xmlFreeDoc(doc); return 0; error: if(doc) xmlFreeDoc(doc); if(err_reason) pkg_free(err_reason); return -1; }