mirror of https://github.com/sipwise/kamailio.git
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
85 lines
1.7 KiB
85 lines
1.7 KiB
#include <stdio.h>
|
|
#include "../../str.h"
|
|
#include "../../dprint.h"
|
|
#include "../../mem/mem.h"
|
|
#include "dlist.h"
|
|
#include "presentity.h"
|
|
#include "watcher.h"
|
|
#include "pdomain.h"
|
|
#include "pa_mod.h"
|
|
|
|
#include <libxml/parser.h>
|
|
#include <libxml/xpath.h>
|
|
|
|
#include <presence/pidf.h>
|
|
#include <cds/logger.h>
|
|
|
|
/* Helper functions */
|
|
|
|
presence_tuple_t *find_online_tuple(presentity_t *p,
|
|
presence_tuple_t *search_from)
|
|
{
|
|
presence_tuple_t *t = NULL;
|
|
|
|
if (!p) return t;
|
|
if (search_from) t = search_from;
|
|
else t = get_first_tuple(p);
|
|
|
|
while (t) {
|
|
switch (t->data.status.basic) {
|
|
case presence_tuple_open: return t;
|
|
/* TODO: what about other state values? */
|
|
default: break;
|
|
}
|
|
t = get_next_tuple(t);
|
|
}
|
|
|
|
return NULL;
|
|
}
|
|
|
|
/* Handler functions */
|
|
|
|
int target_online(struct sip_msg* _m, char* _domain, char* _s2)
|
|
{
|
|
struct pdomain* d;
|
|
struct presentity *p;
|
|
str uid = STR_NULL;
|
|
int res = -1;
|
|
presence_tuple_t *t;
|
|
|
|
d = (struct pdomain*)_domain;
|
|
|
|
if (get_presentity_uid(&uid, _m) < 0) {
|
|
ERR("Error while extracting presentity UID\n");
|
|
return 0; /* ??? impossible to return -1 or 1 */
|
|
}
|
|
|
|
/* TRACE_LOG("is \'%.*s\' online ?\n", FMT_STR(uid)); */
|
|
|
|
lock_pdomain(d);
|
|
|
|
if (find_presentity_uid(d, &uid, &p) == 0) {
|
|
/* presentity found */
|
|
t = find_online_tuple(p, NULL);
|
|
if (t) res = 1; /* online tuple found */
|
|
}
|
|
|
|
unlock_pdomain(d);
|
|
|
|
return res;
|
|
}
|
|
|
|
/* check watcher status for given value */
|
|
int test_watcher_status(struct sip_msg* _m, char* _domain, char* _status)
|
|
{
|
|
/* returns watcher's authorization status (only existing watchers - should
|
|
* be called after processing SUBSCRIBE request) */
|
|
|
|
/* find presentity, not found => -1*/
|
|
/* find watcher, not found => -1 */
|
|
/* test if auth == watcher status => -1/1 */
|
|
|
|
return -1;
|
|
}
|
|
|