From ff492b443c7ae51d6cd246d3e3cea787d6769c61 Mon Sep 17 00:00:00 2001 From: lazedo Date: Wed, 28 Oct 2015 17:30:54 +0000 Subject: [PATCH] presence_xml: add optional param force_dummy_presence - added module parameter to send empty presence notify body when there isn't any record in presentity --- modules/presence_xml/README | 28 +++++++--- .../presence_xml/doc/presence_xml_admin.xml | 18 +++++++ modules/presence_xml/notify_body.c | 51 ++++++++++++++++++- modules/presence_xml/presence_xml.c | 2 + 4 files changed, 92 insertions(+), 7 deletions(-) diff --git a/modules/presence_xml/README b/modules/presence_xml/README index 55e4b801533..3844f034214 100644 --- a/modules/presence_xml/README +++ b/modules/presence_xml/README @@ -33,6 +33,7 @@ Anca-Maria Vamanu 3.8. xcap_server (str) 3.9. passive_mode(int) 3.10. xcapauth_userdel_reason(str) + 3.11. force_dummy_presence(int) 4. Functions @@ -56,8 +57,9 @@ Anca-Maria Vamanu 1.8. Set xcap_server parameter 1.9. Set passive_mode parameter 1.10. Set xcapauth_userdel_reason parameter - 1.11. pres_check_basic usage - 1.12. pres_check_activities usage + 1.11. Set force_dummy_presence parameter + 1.12. pres_check_basic usage + 1.13. pres_check_activities usage Chapter 1. Admin Guide @@ -81,6 +83,7 @@ Chapter 1. Admin Guide 3.8. xcap_server (str) 3.9. passive_mode(int) 3.10. xcapauth_userdel_reason(str) + 3.11. force_dummy_presence(int) 4. Functions @@ -139,6 +142,7 @@ Chapter 1. Admin Guide 3.8. xcap_server (str) 3.9. passive_mode(int) 3.10. xcapauth_userdel_reason(str) + 3.11. force_dummy_presence(int) 3.1. db_url(str) @@ -284,12 +288,24 @@ modparam("presence_xml", "xcapauth_userdel_reason", "probation;retry-after=30") modparam("presence_xml", "xcapauth_userdel_reason", "rejected") ... +3.11. force_dummy_presence(int) + + Set this parameter to enable simple body notify with status 'open' when + presentity info is not available. + + Default value: "0". + + Example 1.11. Set force_dummy_presence parameter +... +modparam("presence_xml", "force_dummy_presence", 1) +... + 4. Functions 4.1. pres_check_basic(presentity_uri, status) 4.2. pres_check_activities(presentity_uri, activity) -4.1. pres_check_basic(presentity_uri, status) +4.1. pres_check_basic(presentity_uri, status) Checks the /presence/tuple/status/basic nodes in the presentity for presentity_uri against the value in status. @@ -300,7 +316,7 @@ modparam("presence_xml", "xcapauth_userdel_reason", "rejected") * 1 - if a match is found. * -1 - if a match is not found. - Example 1.11. pres_check_basic usage + Example 1.12. pres_check_basic usage ... if (pres_check_basic("$ru", "open")) { ... @@ -312,7 +328,7 @@ modparam("presence_xml", "xcapauth_userdel_reason", "rejected") } ... -4.2. pres_check_activities(presentity_uri, activity) +4.2. pres_check_activities(presentity_uri, activity) Checks whether a /presence/person/activities/activity node exists in the presentity for presentity_uri. @@ -324,7 +340,7 @@ modparam("presence_xml", "xcapauth_userdel_reason", "rejected") * -1 - if a match is not found. * -2 - if /presence/person or /presence/person/activity do not exist. - Example 1.12. pres_check_activities usage + Example 1.13. pres_check_activities usage ... if (pres_check_basic("$ru", "open")) { pres_check_activities("$ru", "unknown"); diff --git a/modules/presence_xml/doc/presence_xml_admin.xml b/modules/presence_xml/doc/presence_xml_admin.xml index 840628ebd5f..c5565a72345 100644 --- a/modules/presence_xml/doc/presence_xml_admin.xml +++ b/modules/presence_xml/doc/presence_xml_admin.xml @@ -315,6 +315,24 @@ modparam("presence_xml", "xcapauth_userdel_reason", "rejected") +
+ <varname>force_dummy_presence</varname>(int) + + Set this parameter to enable simple body notify with status 'open' when presentity info is not available. + + + Default value: 0. + + + + Set <varname>force_dummy_presence</varname> parameter + +... +modparam("presence_xml", "force_dummy_presence", 1) +... + + +
diff --git a/modules/presence_xml/notify_body.c b/modules/presence_xml/notify_body.c index 22ed066d543..2730038ae89 100644 --- a/modules/presence_xml/notify_body.c +++ b/modules/presence_xml/notify_body.c @@ -43,6 +43,8 @@ #include "notify_body.h" #include "presence_xml.h" +extern int force_dummy_presence; + str* offline_nbody(str* body); str* agregate_xmls(str* pres_user, str* pres_domain, str** body_array, int n); str* get_final_notify_body( subs_t *subs, str* notify_body, xmlNodePtr rule_node); @@ -56,15 +58,62 @@ void free_xml_body(char* body) body= NULL; } +#define PRESENCE_EMPTY_BODY_SIZE 512 + +#define PRESENCE_EMPTY_BODY " \ +\ +\ +open\ +\ +\ +Available\ +" + +str* pres_agg_nbody_empty(str* pres_user, str* pres_domain) +{ + str* n_body= NULL; + + LM_DBG("creating empty presence for [pres_user]=%.*s [pres_domain]= %.*s\n", + pres_user->len, pres_user->s, pres_domain->len, pres_domain->s); + + str* body_array = (str*)pkg_malloc(sizeof(str)); + char* body = (char*)pkg_malloc(PRESENCE_EMPTY_BODY_SIZE); + sprintf(body, PRESENCE_EMPTY_BODY); + body_array->s = body; + body_array->len = strlen(body); + + + n_body= agregate_xmls(pres_user, pres_domain, &body_array, 1); + LM_DBG("[n_body]=%p\n", n_body); + if(n_body) { + LM_DBG("[*n_body]=%.*s\n",n_body->len, n_body->s); + } + if(n_body== NULL) + { + LM_ERR("while aggregating body\n"); + } + + pkg_free(body); + pkg_free(body_array); + + + xmlCleanupParser(); + xmlMemoryDump(); + + return n_body; +} str* pres_agg_nbody(str* pres_user, str* pres_domain, str** body_array, int n, int off_index) { str* n_body= NULL; str* body= NULL; - if(body_array== NULL) + if(body_array== NULL && (!force_dummy_presence)) return NULL; + if(body_array== NULL) + return pres_agg_nbody_empty(pres_user, pres_domain); + if(off_index>= 0) { body= body_array[off_index]; diff --git a/modules/presence_xml/presence_xml.c b/modules/presence_xml/presence_xml.c index f8781efc545..cfecb99bcd6 100644 --- a/modules/presence_xml/presence_xml.c +++ b/modules/presence_xml/presence_xml.c @@ -88,6 +88,7 @@ pres_get_sphere_t pres_get_sphere; str xcap_table= str_init("xcap"); str db_url = str_init(DEFAULT_DB_URL); int force_active= 0; +int force_dummy_presence = 0; int integrated_xcap_server= 0; xcap_serv_t* xs_list= NULL; int disable_presence = 0; @@ -130,6 +131,7 @@ static param_export_t params[]={ { "disable_xcapdiff", INT_PARAM, &disable_xcapdiff }, { "passive_mode", INT_PARAM, &passive_mode }, { "xcapauth_userdel_reason", PARAM_STR, &xcapauth_userdel_reason}, + { "force_dummy_presence", INT_PARAM, &force_dummy_presence }, { 0, 0, 0} };