void pres_Xmpp2Sip(char *msg, int type, void *param) { xmlDocPtr doc= NULL; xmlNodePtr pres_node= NULL; char* pres_type= NULL; doc= xmlParseMemory(msg, strlen(msg)); if(doc == NULL) { LM_ERR("while parsing xml memory\n"); return; } pres_node= XMLDocGetNodeByName(doc, "presence", NULL); if(pres_node == NULL) { LM_ERR("while getting node\n"); goto error; } pres_type= XMLNodeGetAttrContentByName(pres_node, "type" ); if(pres_type== NULL ) { LM_DBG("type attribut not present\n"); build_publish(pres_node, -1); if(presence_subscribe(pres_node, 3600, XMPP_SUBSCRIBE)< 0) { LM_ERR("when sending subscribe for presence"); xmlFree(pres_type); goto error; } /* send subscribe after publish because in xmpp subscribe message * comes only when a new contact is inserted in buddy list */ } else if(strcmp(pres_type, "unavailable")== 0) { build_publish(pres_node, 0); if(presence_subscribe(pres_node, 3600, XMPP_SUBSCRIBE)< 0) /* else subscribe for one hour*/ { LM_ERR("when unsubscribing for presence"); xmlFree(pres_type); goto error; } } else if((strcmp(pres_type, "subscribe")==0)|| ( strcmp(pres_type, "unsubscribe")== 0)|| (strcmp(pres_type, "probe")== 0)) { if(strcmp(pres_type, "subscribe")==0 || strcmp(pres_type, "probe")== 0) { LM_DBG("send Subscribe message (no time limit)\n"); if(presence_subscribe(pres_node, -1, XMPP_INITIAL_SUBS)< 0) { LM_ERR("when sending subscribe for presence"); xmlFree(pres_type); goto error; } } if(strcmp(pres_type, "unsubscribe")== 0) { if(presence_subscribe(pres_node, 0, XMPP_INITIAL_SUBS)< 0) { LM_ERR("when unsubscribing for presence"); xmlFree(pres_type); goto error; } } } xmlFree(pres_type); // else // send_reply_message(pres_node); xmlFreeDoc(doc); xmlCleanupParser(); xmlMemoryDump(); return ; error: if(doc) xmlFreeDoc(doc); xmlCleanupParser(); xmlMemoryDump(); return ; }
int jabber_presence(struct stream_s *stream,xmlnode tag){ char *type; char *from; char *to; xmlnode prio_n; xmlnode show_n; xmlnode status_n; char *show,*status; int priority; char *tmp; User *u; type=xmlnode_get_attrib(tag,"type"); from=xmlnode_get_attrib(tag,"from"); to=xmlnode_get_attrib(tag,"to"); if (from) u=user_get_by_jid(from); else u=NULL; user_load_locale(u); if (!acl_is_allowed(from,tag)){ if (type && !strcmp(type,"error")){ debug("Ignoring forbidden presence error"); return -1; } if (!from) return -1; presence_send_error(stream,to,from,405,_("Not allowed")); return -1; } show_n=xmlnode_get_tag(tag,"show"); if (show_n) show=xmlnode_get_data(show_n); else show=NULL; status_n=xmlnode_get_tag(tag,"status"); if (status_n) status=xmlnode_get_data(status_n); else status=NULL; prio_n=xmlnode_get_tag(tag,"priority"); if (prio_n){ tmp=xmlnode_get_data(prio_n); if (tmp) priority=atoi(tmp); else priority=-1; } else priority=-1; if (!type) type="available"; if (!from || !to){ if (strcmp(type,"error")) presence_send_error(stream,to,from,406,_("Not Acceptable")); g_warning(N_("Bad <presence/>: %s"),xmlnode2str(tag)); return -1; } if (!jid_is_my(to)){ if (strcmp(type,"error")) presence_send_error(stream,to,from,406,_("Not Acceptable")); g_warning(N_("Wrong 'to' in %s"),xmlnode2str(tag)); return -1; } if (!strcmp(type,"available")){ if (jid_has_uin(to)) return presence_direct_available(stream,from,to); else return presence(stream,from,to,1,show,status,priority); } else if (!strcmp(type,"unavailable")){ if (jid_has_uin(to)) return presence_direct_unavailable(stream,from,to); else return presence(stream,from,to,0,show,status,priority); } if (!strcmp(type,"invisible")){ if (jid_has_uin(to)) return presence_direct_unavailable(stream,from,to); else return presence(stream,from,to,-1,show,status,priority); } else if (!strcmp(type,"subscribe")) return presence_subscribe(stream,from,to); else if (!strcmp(type,"unsubscribe")) return presence_unsubscribe(stream,from,to); else if (!strcmp(type,"subscribed")) return presence_subscribed(stream,from,to); else if (!strcmp(type,"unsubscribed")) return presence_unsubscribed(stream,from,to); else if (!strcmp(type,"probe")) return presence_probe(stream,from,to); else if (!strcmp(type,"error")){ g_warning(N_("Error presence received: %s"),xmlnode2str(tag)); return 0; } g_warning(N_("Unsupported type in %s"),xmlnode2str(tag)); presence_send_error(stream,to,from,501,_("Not Implemented")); return -1; }