2
0
Эх сурвалжийг харах

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
lazedo 10 жил өмнө
parent
commit
ff492b443c

+ 22 - 6
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");

+ 18 - 0
modules/presence_xml/doc/presence_xml_admin.xml

@@ -315,6 +315,24 @@ modparam("presence_xml", "xcapauth_userdel_reason", "rejected")
 </programlisting>
 		</example>
 	</section>
+    <section>
+        <title><varname>force_dummy_presence</varname>(int)</title>
+        <para>
+        Set this parameter to enable simple body notify with status 'open' when presentity info is not available.
+        </para>
+        <para>
+        <emphasis>Default value: <quote>0</quote>.
+        </emphasis>
+        </para>
+        <example>
+        <title>Set <varname>force_dummy_presence</varname> parameter</title>
+        <programlisting format="linespecific">
+...
+modparam("presence_xml", "force_dummy_presence", 1)
+...
+</programlisting>
+        </example>
+    </section>
 </section>
 
 

+ 50 - 1
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 "<presence> \
+<tuple id=\"615293b33c62dec073e05d9421e9f48b\">\
+<status>\
+<basic>open</basic>\
+</status>\
+</tuple>\
+<note xmlns=\"urn:ietf:params:xml:ns:pidf\">Available</note>\
+</presence>"
+
+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];

+ 2 - 0
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}
 };