[sr-dev] git:pd/crocodile: modules_k/rls: Added a new exported function: rls_update_subs()

Carsten Bock carsten at ng-voice.com
Thu Jul 28 14:19:47 CEST 2011


Hi Peter,

cool! Absolutely great!

Thanks,
Carsten

2011/7/28 Peter Dunkley <peter.dunkley at crocodile-rcs.com>:
> Module: sip-router
> Branch: pd/crocodile
> Commit: 4a09b0f8c57f632de5c26c6bc34f5ac32dbe86c2
> URL:    http://git.sip-router.org/cgi-bin/gitweb.cgi/sip-router/?a=commit;h=4a09b0f8c57f632de5c26c6bc34f5ac32dbe86c2
>
> Author: pd <peter.dunkley at crocodile-rcs.com>
> Committer: pd <peter.dunkley at crocodile-rcs.com>
> Date:   Thu Jul 28 12:41:07 2011 +0100
>
> modules_k/rls: Added a new exported function: rls_update_subs()
>
> - This new function can be called from the Kamailio configuration file
>  to force the RLS module to refresh its back-end subscriptions.
>
>  This is particularly useful when the resource list has changed (for
>  example, a new contact has been added) as it will create a new back-
>  end subscriptions when required.
>
>  This means that when you add a new contact in a client the uses RLS
>  the added contact can be immediately subscribed to and will get an
>  authorisation request.
> - Sample usage:
>
>  case "PUT":
>    xcaps_put("$var(uri)", "$var(doc_uri)", "$rb");
>    if($xcapuri(u=>auid)=~"pres-rules") {
>      pres_update_watchers("$var(uri)", "presence");
>      pres_refresh_watchers("$var(uri)", "presence", 1);
>    } else if ($xcapuri(u=>auid)=~"resource-lists"
>               || $xcapuri(u=>auid)=~"rls-services") {
>      rls_update_subs("$var(uri)", "presence");
>    }
>    exit;
>  break;
>
> ---
>
>  modules_k/rls/README            |   22 ++++++
>  modules_k/rls/doc/rls_admin.xml |   34 ++++++++++
>  modules_k/rls/rls.c             |    4 +
>  modules_k/rls/subscribe.c       |  136 +++++++++++++++++++++++++++++++++++++++
>  4 files changed, 196 insertions(+), 0 deletions(-)
>
> diff --git a/modules_k/rls/README b/modules_k/rls/README
> index 41588ef..b23953f 100644
> --- a/modules_k/rls/README
> +++ b/modules_k/rls/README
> @@ -42,6 +42,7 @@ Anca-Maria Vamanu
>
>               4.1. rls_handle_subscribe()
>               4.2. rls_handle_notify()
> +              4.3. rls_update_subs(uri, event)
>
>         5. Installation
>
> @@ -65,6 +66,7 @@ Anca-Maria Vamanu
>    1.14. Set server_address parameter
>    1.15. rls_handle_subscribe usage
>    1.16. rls_handle_notify usage
> +   1.17. rls_update_subs usage
>
>  Chapter 1. Admin Guide
>
> @@ -97,6 +99,7 @@ Chapter 1. Admin Guide
>
>         4.1. rls_handle_subscribe()
>         4.2. rls_handle_notify()
> +        4.3. rls_update_subs(uri, event)
>
>    5. Installation
>
> @@ -339,6 +342,7 @@ modparam("rls", "server_address", "sip:rls at ip.address.ofyour.proxy:5060")
>
>    4.1. rls_handle_subscribe()
>    4.2. rls_handle_notify()
> +   4.3. rls_update_subs(uri, event)
>
>  4.1.  rls_handle_subscribe()
>
> @@ -383,6 +387,24 @@ if(method=="NOTIFY")
>     rls_handle_notify();
>  ...
>
> +4.3.  rls_update_subs(uri, event)
> +
> +   This function can be used in configuration to trigger updates to
> +   resource list subscriptions (for example, after the contents of a
> +   resource list has changes).
> +
> +   Parameters:
> +     * uri - the uri of the user who made the change and whose resource
> +       list subscriptions should be updated
> +     * event - the event package (e.g. presence).
> +
> +   This function can be used from ANY_ROUTE.
> +
> +   Example 1.17. rls_update_subs usage
> +...
> +rls_update_subs("sip:test at kamailio.org", "presence");
> +...
> +
>  5. Installation
>
>    The module requires 2 tables in Kamailio database: rls_presentity and
> diff --git a/modules_k/rls/doc/rls_admin.xml b/modules_k/rls/doc/rls_admin.xml
> index 351deb6..bba428c 100644
> --- a/modules_k/rls/doc/rls_admin.xml
> +++ b/modules_k/rls/doc/rls_admin.xml
> @@ -444,6 +444,40 @@ if(method=="NOTIFY")
>  </programlisting>
>                </example>
>        </section>
> +
> +       <section>
> +               <title>
> +               <function moreinfo="none">rls_update_subs(uri, event)</function>
> +               </title>
> +               <para>
> +               This function can be used in configuration to trigger updates to
> +               resource list subscriptions (for example, after the contents of a
> +               resource list has changes).
> +               </para>
> +               <para>Parameters:</para>
> +               <itemizedlist>
> +                       <listitem>
> +                               <para>uri - the uri of the user who made the change
> +                               and whose resource list subscriptions should be
> +                               updated</para>
> +                       </listitem>
> +                       <listitem>
> +                               <para>event - the event package (e.g. presence).
> +                               </para>
> +                       </listitem>
> +               </itemizedlist>
> +               <para>
> +               This function can be used from ANY_ROUTE.
> +               </para>
> +               <example>
> +               <title><function>rls_update_subs</function> usage</title>
> +               <programlisting format="linespecific">
> +...
> +rls_update_subs("sip:test at kamailio.org", "presence");
> +...
> +</programlisting>
> +               </example>
> +       </section>
>  </section>
>
>  <section>
> diff --git a/modules_k/rls/rls.c b/modules_k/rls/rls.c
> index 368f815..b69cea7 100644
> --- a/modules_k/rls/rls.c
> +++ b/modules_k/rls/rls.c
> @@ -164,6 +164,8 @@ static void destroy(void);
>  int rlsubs_table_restore();
>  void rlsubs_table_update(unsigned int ticks,void *param);
>  int add_rls_event(modparam_t type, void* val);
> +int rls_update_subs(struct sip_msg *msg, char *puri, char *pevent);
> +int fixup_update_subs(void** param, int param_no);
>
>  static cmd_export_t cmds[]=
>  {
> @@ -171,6 +173,8 @@ static cmd_export_t cmds[]=
>                        0, 0, REQUEST_ROUTE},
>        {"rls_handle_notify",     (cmd_function)rls_handle_notify,      0,
>                        0, 0, REQUEST_ROUTE},
> +       {"rls_update_subs",       (cmd_function)rls_update_subs,        2,
> +                       fixup_update_subs, 0, ANY_ROUTE},
>        {0, 0, 0, 0, 0, 0 }
>  };
>
> diff --git a/modules_k/rls/subscribe.c b/modules_k/rls/subscribe.c
> index 205ecb5..ed6366b 100644
> --- a/modules_k/rls/subscribe.c
> +++ b/modules_k/rls/subscribe.c
> @@ -50,6 +50,7 @@
>  #include "subscribe.h"
>  #include "notify.h"
>  #include "rls.h"
> +#include "../../mod_fix.h"
>
>  int counter= 0;
>
> @@ -876,3 +877,138 @@ error:
>
>  }
>
> +int fixup_update_subs(void** param, int param_no)
> +{
> +       if (param_no == 1) {
> +               return fixup_spve_null(param, 1);
> +       } else if (param_no == 2) {
> +               return fixup_spve_null(param, 1);
> +       }
> +       return 0;
> +}
> +
> +int rls_update_subs(struct sip_msg *msg, char *puri, char *pevent)
> +{
> +       str uri;
> +       str event;
> +       struct sip_uri parsed_uri;
> +       event_t e;
> +       int i;
> +
> +       if (fixup_get_svalue(msg, (gparam_p)puri, &uri) != 0)
> +       {
> +               LM_ERR("invalid uri parameter\n");
> +               return -1;
> +       }
> +
> +       if (fixup_get_svalue(msg, (gparam_p)pevent, &event) != 0)
> +       {
> +               LM_ERR("invalid event parameter\n");
> +               return -1;
> +       }
> +
> +       if (event_parser(event.s, event.len, &e) < 0)
> +       {
> +               LM_ERR("while parsing event: %.*s\n", event.len, event.s);
> +               return -1;
> +       }
> +
> +       if (e.type & EVENT_OTHER)
> +       {
> +               LM_ERR("unrecognised event: %.*s\n", event.len, event.s);
> +               return -1;
> +       }
> +
> +       if (!(e.type & rls_events))
> +       {
> +               LM_ERR("event not supported by RLS: %.*s\n", event.len,
> +                       event.s);
> +               return -1;
> +       }
> +
> +       if (parse_uri(uri.s, uri.len, &parsed_uri) < 0)
> +       {
> +               LM_ERR("bad uri: %.*s\n", uri.len, uri.s);
> +               return -1;
> +       }
> +
> +       LM_DBG("watcher username: %.*s, watcher domain: %.*s\n",
> +               parsed_uri.user.len, parsed_uri.user.s,
> +               parsed_uri.host.len, parsed_uri.host.s);
> +
> +       if (rls_table == NULL)
> +       {
> +               LM_ERR("rls_table is NULL\n");
> +               return -1;
> +       }
> +
> +       /* Search through the entire subscription table for matches... */
> +       for (i = 0; i < hash_size; i++)
> +       {
> +               subs_t *subs;
> +
> +               lock_get(&rls_table[i].lock);
> +
> +               subs = rls_table[i].entries->next;
> +
> +               while (subs != NULL)
> +               {
> +                       if (subs->from_user.len == parsed_uri.user.len &&
> +                               strncmp(subs->from_user.s, parsed_uri.user.s, parsed_uri.user.len) == 0 &&
> +                           subs->from_domain.len == parsed_uri.host.len &&
> +                               strncmp(subs->from_domain.s, parsed_uri.host.s, parsed_uri.host.len) == 0 &&
> +                               subs->event->evp->type == e.type)
> +                       {
> +                               subs_t *subs_copy = NULL;
> +                               xmlDocPtr doc = NULL;
> +                               xmlNodePtr service_node = NULL;
> +
> +                               LM_DBG("found matching RLS subscription for: %.*s\n",
> +                                       subs->pres_uri.len, subs->pres_uri.s);
> +
> +                               if ((subs_copy = pres_copy_subs(subs, PKG_MEM_TYPE)) == NULL)
> +                               {
> +                                       LM_ERR("subs_t copy failed\n");
> +                                       lock_release(&rls_table[i].lock);
> +                                       return -1;
> +                               }
> +
> +                               if ((subs_copy->expires -= (int)time(NULL)) <= 0)
> +                               {
> +                                       LM_WARN("found expired subscription for: %.*s\n",
> +                                               subs_copy->pres_uri.len, subs_copy->pres_uri.s);
> +                                       goto loop_done;
> +                               }
> +
> +                               if(rls_get_service_list(&subs_copy->pres_uri, &subs_copy->from_user,
> +                                                       &subs_copy->from_domain, &service_node, &doc)<0)
> +                               {
> +                                       LM_ERR("failed getting resource list for: %.*s\n",
> +                                               subs_copy->pres_uri.len, subs_copy->pres_uri.s);
> +                                       goto loop_done;
> +                               }
> +                               if(doc==NULL)
> +                               {
> +                                       LM_WARN("no document returned for: %.*s\n",
> +                                               subs_copy->pres_uri.len, subs_copy->pres_uri.s);
> +                                       goto loop_done;
> +                               }
> +
> +                               if(resource_subscriptions(subs_copy, service_node)< 0)
> +                               {
> +                                       LM_ERR("failed sending subscribe requests to resources in list\n");
> +                                       goto loop_done;
> +                               }
> +
> +loop_done:
> +                               if (doc != NULL)
> +                                       xmlFreeDoc(doc);
> +                               pkg_free(subs_copy);
> +                       }
> +                       subs = subs->next;
> +               }
> +               lock_release(&rls_table[i].lock);
> +       }
> +
> +       return 1;
> +}
>
>
> _______________________________________________
> sr-dev mailing list
> sr-dev at lists.sip-router.org
> http://lists.sip-router.org/cgi-bin/mailman/listinfo/sr-dev
>



-- 
Carsten Bock
http://www.ng-voice.com
mailto:carsten at ng-voice.com

Schomburgstr. 80
22767 Hamburg
Germany

Mobile +49 179 2021244
Office +49 40 34927219
Fax +49 40 34927220

~~~~~~~~~~~~~~~~~~~~
Upcoming Events: "10 years of SER" in Berlin on September 2nd, 2011 (@
Fraunhofer Institute, Berlin):
http://sip-router.org/10-years-ser/



More information about the sr-dev mailing list