<div class="gmail_quote">În data de 31.05.2014 11:36, "Juha Heinanen" <<a href="mailto:jh@tutpro.com">jh@tutpro.com</a>> a scris:<br type="attribution"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
Module: sip-router<br>
Branch: master<br>
Commit: 7f136429e5b676077c4f71c5cc178dd0c125951b<br>
URL:    <a href="http://git.sip-router.org/cgi-bin/gitweb.cgi/sip-router/?a=commit;h=7f136429e5b676077c4f71c5cc178dd0c125951b" target="_blank">http://git.sip-router.org/cgi-bin/gitweb.cgi/sip-router/?a=commit;h=7f136429e5b676077c4f71c5cc178dd0c125951b</a><br>

<br>
Author: Juha Heinanen <<a href="mailto:jh@tutpro.com">jh@tutpro.com</a>><br>
Committer: Juha Heinanen <<a href="mailto:jh@tutpro.com">jh@tutpro.com</a>><br>
Date:   Sat May 31 10:34:19 2014 +0300<br>
<br>
modules/acc: added reason_from_reason_hf module paramater<br>
<br>
- in schema, increased size of sip_reason field to 128 chars<br>
<br>
---<br>
<br>
 lib/srdb1/schema/acc.xml          |    2 +-<br>
 lib/srdb1/schema/entities.xml     |    2 +-<br>
 lib/srdb1/schema/missed_calls.xml |    2 +-<br>
 modules/acc/README                |   33 +++++++++++++++++++++++++--------<br>
 modules/acc/acc_logic.c           |   21 ++++++++++++++++++++-<br>
 modules/acc/acc_mod.c             |    2 ++<br>
 modules/acc/acc_mod.h             |    1 +<br>
 modules/acc/doc/acc_admin.xml     |   20 ++++++++++++++++++++<br>
 8 files changed, 71 insertions(+), 12 deletions(-)<br>
<br>
diff --git a/lib/srdb1/schema/acc.xml b/lib/srdb1/schema/acc.xml<br>
index 719298e..2d8d66b 100644<br>
--- a/lib/srdb1/schema/acc.xml<br>
+++ b/lib/srdb1/schema/acc.xml<br>
@@ -9,7 +9,7 @@<br>
<br>
 <table id="acc" xmlns:db="<a href="http://docbook.org/ns/docbook" target="_blank">http://docbook.org/ns/docbook</a>"><br>
     <name>acc</name><br>
-    <version>4</version><br>
+    <version>5</version><br>
     <type db="mysql">&MYSQL_TABLE_TYPE;</type><br>
     <description><br>
         <db:para>This table is used by the ACC module to report on transactions - accounted calls. More information is available at: &KAMAILIO_MOD_DOC;acc.html<br>
diff --git a/lib/srdb1/schema/entities.xml b/lib/srdb1/schema/entities.xml<br>
index 526ac55..bb3ddf3 100644<br>
--- a/lib/srdb1/schema/entities.xml<br>
+++ b/lib/srdb1/schema/entities.xml<br>
@@ -13,7 +13,7 @@<br>
 <!ENTITY avp_val_len "128"><br>
 <!ENTITY ip_add_len "50"><br>
 <!ENTITY sip_code_len "3"><br>
-<!ENTITY sip_reason_len "32"><br>
+<!ENTITY sip_reason_len "128"><br>
 <!ENTITY cseq_len "11"><br>
 <!ENTITY callid_len "255"><br>
 <!ENTITY expires_len "11"><br>
diff --git a/lib/srdb1/schema/missed_calls.xml b/lib/srdb1/schema/missed_calls.xml<br>
index 7a66440..8c824ab 100644<br>
--- a/lib/srdb1/schema/missed_calls.xml<br>
+++ b/lib/srdb1/schema/missed_calls.xml<br>
@@ -9,7 +9,7 @@<br>
<br>
 <table id="missed_calls" xmlns:db="<a href="http://docbook.org/ns/docbook" target="_blank">http://docbook.org/ns/docbook</a>"><br>
     <name>missed_calls</name><br>
-    <version>3</version><br>
+    <version>4</version><br>
     <type db="mysql">&MYSQL_TABLE_TYPE;</type><br>
     <description><br>
         <db:para>This table is used by the ACC module for keeping track of missed calls. This table is similar to the 'acc' table. More information is available at: &KAMAILIO_MOD_DOC;acc.html</db:para><br>

diff --git a/modules/acc/README b/modules/acc/README<br>
index ea72fd6..8316b52 100644<br>
--- a/modules/acc/README<br>
+++ b/modules/acc/README<br>
@@ -131,6 +131,7 @@ Sven Knoblich<br>
               6.48. time_attr (str)<br>
               6.49. time_exten (str)<br>
               6.50. time_format (str)<br>
+              6.51. reason_from_reason_hf (int)<br>
<br>
         7. Functions<br>
<br>
@@ -193,10 +194,11 @@ Sven Knoblich<br>
    1.48. time_attr example<br>
    1.49. time_exten example<br>
    1.50. time_format example<br>
-   1.51. acc_log_request usage<br>
-   1.52. acc_db_request usage<br>
-   1.53. acc_rad_request usage<br>
-   1.54. acc_diam_request usage<br>
+   1.51. reason_from_reason_hf<br>
+   1.52. acc_log_request usage<br>
+   1.53. acc_db_request usage<br>
+   1.54. acc_rad_request usage<br>
+   1.55. acc_diam_request usage<br>
<br>
 Chapter 1. Admin Guide<br>
<br>
@@ -291,6 +293,7 @@ Chapter 1. Admin Guide<br>
         6.48. time_attr (str)<br>
         6.49. time_exten (str)<br>
         6.50. time_format (str)<br>
+        6.51. reason_from_reason_hf (int)<br>
<br>
    7. Functions<br>
<br>
@@ -705,6 +708,7 @@ $dlg_var(callee) = $avp(callee); #callee='C'<br>
    6.48. time_attr (str)<br>
    6.49. time_exten (str)<br>
    6.50. time_format (str)<br>
+   6.51. reason_from_reason_hf (int)<br>
<br>
 6.1. early_media (integer)<br>
<br>
@@ -1350,6 +1354,19 @@ modparam("acc", "time_exten", "micorsecs")<br>
 modparam("acc", "time_format", "%Y/%m/%d %H:%M:%S")<br>
 ...<br>
<br>
+6.51. reason_from_reason_hf (int)<br>
+<br>
+   Tells where to take sip_reason from. If value is 0, sip_reason is taken<br>
+   from status line. Otherwise, sip_reason is taken from Reason header<br>
+   field(s) if present. Currently only the first Reason header is used.<br>
+<br>
+   Default value is 0.<br>
+<br>
+   Example 1.51. reason_from_reason_hf<br>
+...<br>
+modparam("acc", "reason_from_reason_hf", 1)<br>
+...<br>
+<br>
 7. Functions<br>
<br>
    7.1. acc_log_request(comment)<br>
@@ -1370,7 +1387,7 @@ modparam("acc", "time_format", "%Y/%m/%d %H:%M:%S")<br>
<br>
    This function can be used from ANY_ROUTE.<br>
<br>
-   Example 1.51. acc_log_request usage<br>
+   Example 1.52. acc_log_request usage<br>
 ...<br>
 acc_log_request("Some comment");<br>
 $var(code) = 404;<br>
@@ -1392,7 +1409,7 @@ acc_log_request("$var(code) Error: $avp(reason)");<br>
<br>
    This function can be used from ANY_ROUTE.<br>
<br>
-   Example 1.52. acc_db_request usage<br>
+   Example 1.53. acc_db_request usage<br>
 ...<br>
 acc_db_request("Some comment", "SomeTable");<br>
 acc_db_request("Some comment", "acc_$time(year)_$time(mon)");<br>
@@ -1410,7 +1427,7 @@ acc_db_request("$var(code) Error: $avp(reason)", "SomeTable");<br>
<br>
    This function can be used from ANY_ROUTE.<br>
<br>
-   Example 1.53. acc_rad_request usage<br>
+   Example 1.54. acc_rad_request usage<br>
 ...<br>
 acc_rad_request("Some comment");<br>
 acc_rad_request("$var(code) Error: $avp(reason)");<br>
@@ -1427,7 +1444,7 @@ acc_rad_request("$var(code) Error: $avp(reason)");<br>
<br>
    This function can be used from ANY_ROUTE.<br>
<br>
-   Example 1.54. acc_diam_request usage<br>
+   Example 1.55. acc_diam_request usage<br>
 ...<br>
 acc_diam_request("Some comment");<br>
 acc_diam_request("$var(code) Error: $avp(reason)");<br>
diff --git a/modules/acc/acc_logic.c b/modules/acc/acc_logic.c<br>
index 0641388..452e171 100644<br>
--- a/modules/acc/acc_logic.c<br>
+++ b/modules/acc/acc_logic.c<br>
@@ -42,6 +42,7 @@<br>
 #include "../../sr_module.h"<br>
 #include "../../parser/parse_from.h"<br>
 #include "../../parser/parse_content.h"<br>
+#include "../../lib/kcore/cmpapi.h"<br>
 #include "../../modules/tm/tm_load.h"<br>
 #include "../rr/api.h"<br>
 #include "../../flags.h"<br>
@@ -132,6 +133,8 @@ static inline void env_set_text(char *p, int len)<br>
 static inline void env_set_code_status( int code, struct sip_msg *reply)<br>
 {<br>
        static char code_buf[INT2STR_MAX_LEN];<br>
+       str reason = {"Reason", 6};<br>
+       struct hdr_field *hf;<br>
<br>
        acc_env.code = code;<br>
        if (reply==FAKED_REPLY || reply==NULL) {<br>
@@ -143,7 +146,23 @@ static inline void env_set_code_status( int code, struct sip_msg *reply)<br>
                acc_env.reason.len = strlen(acc_env.reason.s);<br>
        } else {<br>
                acc_env.code_s = reply->first_line.u.reply.status;<br>
-               acc_env.reason = reply->first_line.u.reply.reason;<br>
+               hf = NULL;<br>
+               if (reason_from_reason_hf) {<br>
+                       /* TODO: take reason from all Reason headers */<br>
+                       if(parse_headers(reply, HDR_EOH_F, 0) < 0) {<br>
+                               LM_ERR("error parsing headers\n");<br>
+                       } else {<br>
+                               for (hf=reply->headers; hf; hf=hf->next) {<br>
+                                       if (cmp_hdrname_str(&hf->name, &reason)==0)<br>
+                                               break;<br>
+                               }<br>
+                       }<br>
+               }<br>
+               if (hf == NULL) {<br>
+                       acc_env.reason = reply->first_line.u.reply.reason;<br>
+               } else {<br>
+                       acc_env.reason = hf->body;<br>
+               }<br>
        }<br>
 }<br>
<br>
diff --git a/modules/acc/acc_mod.c b/modules/acc/acc_mod.c<br>
index ff94baa..347e054 100644<br>
--- a/modules/acc/acc_mod.c<br>
+++ b/modules/acc/acc_mod.c<br>
@@ -110,6 +110,7 @@ static char* leg_info_str = 0;      /*!< multi call-leg support */<br>
 struct acc_extra *leg_info = 0;<br>
 int acc_prepare_flag = -1; /*!< should the request be prepared for later acc */<br>
 char *acc_time_format = "%Y-%m-%d %H:%M:%S";<br>
+int reason_from_reason_hf = 0; /*!< assign reason from reason hf if present */<br>
<br>
 /* ----- time mode variables ------- */<br>
 /*! \name AccTimeModeVariables  Time Mode Variables */<br>
@@ -258,6 +259,7 @@ static param_export_t params[] = {<br>
        {"multi_leg_info",          STR_PARAM, &leg_info_str            },<br>
        {"detect_direction",        INT_PARAM, &detect_direction        },<br>
        {"acc_prepare_flag",        INT_PARAM, &acc_prepare_flag        },<br>
+       {"reason_from_reason_hf",   INT_PARAM, &reason_from_reason_hf   },<br>
        /* syslog specific */<br>
        {"log_flag",             INT_PARAM, &log_flag             },<br>
        {"log_missed_flag",      INT_PARAM, &log_missed_flag      },<br>
diff --git a/modules/acc/acc_mod.h b/modules/acc/acc_mod.h<br>
index 98cef33..68911dc 100644<br>
--- a/modules/acc/acc_mod.h<br>
+++ b/modules/acc/acc_mod.h<br>
@@ -50,6 +50,7 @@ extern int failed_transaction_flag;<br>
 extern unsigned short failed_filter[];<br>
 extern int detect_direction;<br>
 extern int acc_prepare_flag;<br>
+extern int reason_from_reason_hf;<br>
<br>
 extern int log_facility;<br>
 extern int log_level;<br>
diff --git a/modules/acc/doc/acc_admin.xml b/modules/acc/doc/acc_admin.xml<br>
index 54b9517..b0a1217 100644<br>
--- a/modules/acc/doc/acc_admin.xml<br>
+++ b/modules/acc/doc/acc_admin.xml<br>
@@ -1479,6 +1479,26 @@ modparam("acc", "time_format", "%Y/%m/%d %H:%M:%S")<br>
 </programlisting><br>
                </example><br>
        </section><br>
+       <section id="acc.p.reason_from_reason_hf"><br>
+               <title><varname>reason_from_reason_hf</varname> (int)</title><br>
+               <para><br>
+               Tells where to take sip_reason from.  If value is 0,<br>
+               sip_reason is taken from status line.  Otherwise, sip_reason<br>
+               is taken from Reason header field(s) if present.<br>
+               Currently only the first Reason header is used.<br>
+               </para><br>
+               <para><br>
+               Default value is 0.<br>
+               </para><br>
+               <example><br>
+               <title>reason_from_reason_hf</title><br>
+               <programlisting format="linespecific"><br>
+...<br>
+modparam("acc", "reason_from_reason_hf", 1)<br>
+...<br>
+</programlisting><br>
+               </example><br>
+       </section><br>
        </section><br>
<br>
        <section><br>
<br>
<br>
_______________________________________________<br>
sr-dev mailing list<br>
<a href="mailto:sr-dev@lists.sip-router.org">sr-dev@lists.sip-router.org</a><br>
<a href="http://lists.sip-router.org/cgi-bin/mailman/listinfo/sr-dev" target="_blank">http://lists.sip-router.org/cgi-bin/mailman/listinfo/sr-dev</a><br>
</blockquote></div>