/** * wrapper for update_watchers_status to use via kemi */ static int ki_pres_update_watchers(struct sip_msg *msg, str *pres_uri, str *event) { pres_ev_t* ev; struct sip_uri uri; str* rules_doc = NULL; int ret; ev = contains_event(event, NULL); if(ev==NULL) { LM_ERR("event %.*s is not registered\n", event->len, event->s); return -1; } if(ev->get_rules_doc==NULL) { LM_DBG("event %.*s does not provide rules doc API\n", event->len, event->s); return -1; } if(parse_uri(pres_uri->s, pres_uri->len, &uri)<0) { LM_ERR("failed to parse presentity uri [%.*s]\n", pres_uri->len, pres_uri->s); return -1; } ret = ev->get_rules_doc(&uri.user, &uri.host, &rules_doc); if((ret < 0) || (rules_doc==NULL) || (rules_doc->s==NULL)) { LM_DBG("no xcap rules doc found for presentity uri [%.*s]\n", pres_uri->len, pres_uri->s); if(rules_doc != NULL) pkg_free(rules_doc); return -1; } ret = 1; if(update_watchers_status(*pres_uri, ev, rules_doc)<0) { LM_ERR("updating watchers in presence\n"); ret = -1; } pkg_free(rules_doc->s); pkg_free(rules_doc); return ret; }
int pres_refresh_watchers(str *pres, str *event, int type, str *file_uri, str *filename) { pres_ev_t *ev; struct sip_uri uri; str *rules_doc= NULL; int result; ev= contains_event(event, NULL); if(ev==NULL) { LM_ERR("wrong event parameter\n"); return -1; } if(type==0) { /* if a request to refresh watchers authorization */ if(ev->get_rules_doc==NULL) { LM_ERR("wrong request for a refresh watchers authorization status" "for an event that does not require authorization\n"); goto error; } if(parse_uri(pres->s, pres->len, &uri)<0) { LM_ERR("parsing uri [%.*s]\n", pres->len, pres->s); goto error; } result= ev->get_rules_doc(&uri.user, &uri.host, &rules_doc); if(result<0 || rules_doc==NULL || rules_doc->s==NULL) { LM_ERR("no rules doc found for the user\n"); goto error; } if(update_watchers_status(*pres, ev, rules_doc)<0) { LM_ERR("failed to update watchers\n"); goto error; } pkg_free(rules_doc->s); pkg_free(rules_doc); rules_doc = NULL; } else { if (type == 2) { if (update_hard_presentity(pres, ev, file_uri, filename) < 0) { LM_ERR("updating hard presentity\n"); goto error; } } /* if a request to refresh notified info */ if(query_db_notify(pres, ev, NULL)< 0) { LM_ERR("sending Notify requests\n"); goto error; } } return 0; error: if(rules_doc) { if(rules_doc->s) pkg_free(rules_doc->s); pkg_free(rules_doc); } return -1; }
/** * wrapper for update_watchers_status to use in config */ static int w_pres_update_watchers(struct sip_msg *msg, char *puri, char *pevent) { str pres_uri; str event; pres_ev_t* ev; struct sip_uri uri; str* rules_doc = NULL; int ret; if(fixup_get_svalue(msg, (gparam_p)puri, &pres_uri)!=0) { LM_ERR("invalid uri parameter"); return -1; } if(fixup_get_svalue(msg, (gparam_p)pevent, &event)!=0) { LM_ERR("invalid uri parameter"); return -1; } ev = contains_event(&event, NULL); if(ev==NULL) { LM_ERR("event %.*s is not registered\n", event.len, event.s); return -1; } if(ev->get_rules_doc==NULL) { LM_DBG("event %.*s does not provide rules doc API\n", event.len, event.s); return -1; } if(parse_uri(pres_uri.s, pres_uri.len, &uri)<0) { LM_ERR("failed to parse presentity uri [%.*s]\n", pres_uri.len, pres_uri.s); return -1; } ret = ev->get_rules_doc(&uri.user, &uri.host, &rules_doc); if((ret < 0) || (rules_doc==NULL) || (rules_doc->s==NULL)) { LM_DBG("no xcap rules doc found for presentity uri [%.*s]\n", pres_uri.len, pres_uri.s); if(rules_doc != NULL) pkg_free(rules_doc); return -1; } ret = 1; if(update_watchers_status(pres_uri, ev, rules_doc)<0) { LM_ERR("updating watchers in presence\n"); ret = -1; } pkg_free(rules_doc->s); pkg_free(rules_doc); return ret; }
int update_phtable(presentity_t* presentity, str pres_uri, str body) { char* sphere= NULL; unsigned int hash_code; pres_entry_t* p; int ret= 0; str* xcap_doc= NULL; /* get new sphere */ sphere= extract_sphere(body); if(sphere==NULL) { LM_DBG("no sphere defined in new body\n"); return 0; } /* search for record in hash table */ hash_code= core_hash(&pres_uri, NULL, phtable_size); lock_get(&pres_htable[hash_code].lock); p= search_phtable(&pres_uri, presentity->event->evp->parsed, hash_code); if(p== NULL) { lock_release(&pres_htable[hash_code].lock); goto done; } if(p->sphere) { if(strcmp(p->sphere, sphere)!= 0) { /* new sphere definition */ shm_free(p->sphere); } else { /* no change in sphere definition */ lock_release(&pres_htable[hash_code].lock); pkg_free(sphere); return 0; } } p->sphere= (char*)shm_malloc(strlen(sphere)+ 1); if(p->sphere== NULL) { lock_release(&pres_htable[hash_code].lock); ret= -1; goto done; } strcpy(p->sphere, sphere); lock_release(&pres_htable[hash_code].lock); /* call for watchers status update */ if(presentity->event->get_rules_doc(&presentity->user, &presentity->domain, &xcap_doc)< 0) { LM_ERR("failed to retreive xcap document\n"); ret= -1; goto done; } update_watchers_status(pres_uri, presentity->event, xcap_doc); done: if(xcap_doc) { if(xcap_doc->s) pkg_free(xcap_doc->s); pkg_free(xcap_doc); } if(sphere) pkg_free(sphere); return ret; }