... | ... |
@@ -197,6 +197,9 @@ static int w_dlg_db_load_extra(sip_msg_t *msg, char *p1, char *p2); |
197 | 197 |
static int fixup_dlg_get_var(void** param, int param_no); |
198 | 198 |
static int fixup_dlg_get_var_free(void** param, int param_no); |
199 | 199 |
static int w_dlg_get_var(struct sip_msg*, char*, char*, char*, char*, char*); |
200 |
+static int fixup_dlg_set_var(void** param, int param_no); |
|
201 |
+static int fixup_dlg_set_var_free(void** param, int param_no); |
|
202 |
+static int w_dlg_set_var(struct sip_msg*, char*, char*, char*, char*, char*); |
|
200 | 203 |
static int w_dlg_remote_profile(sip_msg_t *msg, char *cmd, char *pname, |
201 | 204 |
char *pval, char *puid, char *expires); |
202 | 205 |
static int fixup_dlg_remote_profile(void** param, int param_no); |
... | ... |
@@ -260,6 +263,8 @@ static cmd_export_t cmds[]={ |
260 | 263 |
0, ANY_ROUTE }, |
261 | 264 |
{"dlg_get_var",(cmd_function)w_dlg_get_var, 5, fixup_dlg_get_var, |
262 | 265 |
fixup_dlg_get_var_free, ANY_ROUTE }, |
266 |
+ {"dlg_set_var",(cmd_function)w_dlg_set_var, 5, fixup_dlg_set_var, |
|
267 |
+ fixup_dlg_set_var_free, ANY_ROUTE }, |
|
263 | 268 |
|
264 | 269 |
{"load_dlg", (cmd_function)load_dlg, 0, 0, 0, 0}, |
265 | 270 |
{0,0,0,0,0,0} |
... | ... |
@@ -1608,6 +1613,96 @@ static int fixup_dlg_get_var_free(void** param, int param_no) |
1608 | 1613 |
return -1; |
1609 | 1614 |
} |
1610 | 1615 |
|
1616 |
+static int ki_dlg_set_var(sip_msg_t *msg, str *sc, str *sf, str *st, str *key, str *val) |
|
1617 |
+{ |
|
1618 |
+ dlg_cell_t *dlg = NULL; |
|
1619 |
+ unsigned int dir = 0; |
|
1620 |
+ int ret = 1; |
|
1621 |
+ |
|
1622 |
+ if(sc==NULL || sc->s==NULL || sc->len == 0) { |
|
1623 |
+ LM_ERR("invalid Call-ID parameter\n"); |
|
1624 |
+ return -1; |
|
1625 |
+ } |
|
1626 |
+ if(sf==NULL || sf->s==NULL || sf->len == 0) { |
|
1627 |
+ LM_ERR("invalid From tag parameter\n"); |
|
1628 |
+ return -1; |
|
1629 |
+ } |
|
1630 |
+ if(st==NULL || st->s==NULL || st->len == 0) { |
|
1631 |
+ LM_ERR("invalid To tag parameter\n"); |
|
1632 |
+ return -1; |
|
1633 |
+ } |
|
1634 |
+ |
|
1635 |
+ dlg = get_dlg(sc, sf, st, &dir); |
|
1636 |
+ if(dlg==NULL) |
|
1637 |
+ return -1; |
|
1638 |
+ if(set_dlg_variable(dlg, key, val) != 0) ret = -1; |
|
1639 |
+ dlg_release(dlg); |
|
1640 |
+ return ret; |
|
1641 |
+} |
|
1642 |
+ |
|
1643 |
+static int w_dlg_set_var(struct sip_msg *msg, char *ci, char *ft, char *tt, char *key, char *val) |
|
1644 |
+{ |
|
1645 |
+ str sc = STR_NULL; |
|
1646 |
+ str sf = STR_NULL; |
|
1647 |
+ str st = STR_NULL; |
|
1648 |
+ str k = STR_NULL; |
|
1649 |
+ str v = STR_NULL; |
|
1650 |
+ |
|
1651 |
+ if(ci==0 || ft==0 || tt==0) |
|
1652 |
+ { |
|
1653 |
+ LM_ERR("invalid parameters\n"); |
|
1654 |
+ return -1; |
|
1655 |
+ } |
|
1656 |
+ |
|
1657 |
+ if(fixup_get_svalue(msg, (gparam_p)ci, &sc)!=0) |
|
1658 |
+ { |
|
1659 |
+ LM_ERR("unable to get Call-ID\n"); |
|
1660 |
+ return -1; |
|
1661 |
+ } |
|
1662 |
+ |
|
1663 |
+ if(fixup_get_svalue(msg, (gparam_p)ft, &sf)!=0) |
|
1664 |
+ { |
|
1665 |
+ LM_ERR("unable to get From tag\n"); |
|
1666 |
+ return -1; |
|
1667 |
+ } |
|
1668 |
+ |
|
1669 |
+ if(fixup_get_svalue(msg, (gparam_p)tt, &st)!=0) |
|
1670 |
+ { |
|
1671 |
+ LM_ERR("unable to get To Tag\n"); |
|
1672 |
+ return -1; |
|
1673 |
+ } |
|
1674 |
+ if(st.s==NULL || st.len == 0) |
|
1675 |
+ { |
|
1676 |
+ LM_ERR("invalid To tag parameter\n"); |
|
1677 |
+ return -1; |
|
1678 |
+ } |
|
1679 |
+ if(fixup_get_svalue(msg, (gparam_p)key, &k)!=0) |
|
1680 |
+ { |
|
1681 |
+ LM_ERR("unable to get key name\n"); |
|
1682 |
+ return -1; |
|
1683 |
+ } |
|
1684 |
+ if(fixup_get_svalue(msg, (gparam_p)val, &v)!=0) |
|
1685 |
+ { |
|
1686 |
+ LM_ERR("unable to get value\n"); |
|
1687 |
+ return -1; |
|
1688 |
+ } |
|
1689 |
+ return ki_dlg_set_var(msg, &sc, &sf, &st, &k, &v); |
|
1690 |
+} |
|
1691 |
+ |
|
1692 |
+static int fixup_dlg_set_var(void** param, int param_no) |
|
1693 |
+{ |
|
1694 |
+ if(param_no>=1 && param_no<=5) |
|
1695 |
+ return fixup_spve_null(param, 1); |
|
1696 |
+ return 0; |
|
1697 |
+} |
|
1698 |
+ |
|
1699 |
+static int fixup_dlg_set_var_free(void** param, int param_no) |
|
1700 |
+{ |
|
1701 |
+ if (param_no <= 5) |
|
1702 |
+ return fixup_free_spve_null(param, 1); |
|
1703 |
+ return -1; |
|
1704 |
+} |
|
1705 |
+ |
|
1611 | 1706 |
static int ki_dlg_get(sip_msg_t *msg, str *sc, str *sf, str *st) |
1612 | 1707 |
{ |
1613 | 1708 |
dlg_cell_t *dlg = NULL; |
... | ... |
@@ -2198,6 +2293,11 @@ static sr_kemi_t sr_kemi_dialog_exports[] = { |
2198 | 2293 |
{ SR_KEMIP_STR, SR_KEMIP_STR, SR_KEMIP_STR, |
2199 | 2294 |
SR_KEMIP_STR, SR_KEMIP_NONE, SR_KEMIP_NONE } |
2200 | 2295 |
}, |
2296 |
+ { str_init("dialog"), str_init("dlg_set_var"), |
|
2297 |
+ SR_KEMIP_INT, ki_dlg_set_var, |
|
2298 |
+ { SR_KEMIP_STR, SR_KEMIP_STR, SR_KEMIP_STR, |
|
2299 |
+ SR_KEMIP_STR, SR_KEMIP_STR, SR_KEMIP_NONE } |
|
2300 |
+ }, |
|
2201 | 2301 |
{ str_init("dialog"), str_init("set_dlg_profile_static"), |
2202 | 2302 |
SR_KEMIP_INT, ki_set_dlg_profile_static, |
2203 | 2303 |
{ SR_KEMIP_STR, SR_KEMIP_NONE, SR_KEMIP_NONE, |
... | ... |
@@ -2151,6 +2151,54 @@ if(dlg_get_var("$var(ci)", "$var(ft)", "456", "test", "$var(tmp)")) |
2151 | 2151 |
</example> |
2152 | 2152 |
</section> |
2153 | 2153 |
|
2154 |
+ <section id="dialog.f.dlg_set_var"> |
|
2155 |
+ <title> |
|
2156 |
+ <function moreinfo="none">dlg_set_var(callid, ftag, ttag, name, value)</function> |
|
2157 |
+ </title> |
|
2158 |
+ <para> |
|
2159 |
+ Set dlg_var of another dialog value based on Call-ID, From-Tag and To-Tag |
|
2160 |
+ parameters. |
|
2161 |
+ </para> |
|
2162 |
+ <para>Meaning of the parameters is as follows:</para> |
|
2163 |
+ <itemizedlist> |
|
2164 |
+ <listitem> |
|
2165 |
+ <para><emphasis>callid</emphasis> - SIP call-id. |
|
2166 |
+ </para> |
|
2167 |
+ </listitem> |
|
2168 |
+ <listitem> |
|
2169 |
+ <para><emphasis>ftag</emphasis> - SIP From tag. |
|
2170 |
+ </para> |
|
2171 |
+ </listitem> |
|
2172 |
+ <listitem> |
|
2173 |
+ <para><emphasis>ttag</emphasis> - SIP To tag. |
|
2174 |
+ </para> |
|
2175 |
+ </listitem> |
|
2176 |
+ <listitem> |
|
2177 |
+ <para><emphasis>name</emphasis> - key name of the $dlg_var. |
|
2178 |
+ </para> |
|
2179 |
+ </listitem> |
|
2180 |
+ <listitem> |
|
2181 |
+ <para><emphasis>value</emphasis> - string value to store at $dlg_var(name). |
|
2182 |
+ </para> |
|
2183 |
+ </listitem> |
|
2184 |
+ </itemizedlist> |
|
2185 |
+ <para> |
|
2186 |
+ This function can be used from BRANCH_ROUTE, |
|
2187 |
+ REQUEST_ROUTE, ONREPLY_ROUTE and FAILURE_ROUTE. |
|
2188 |
+ </para> |
|
2189 |
+ <example> |
|
2190 |
+ <title><function>dlg_set_var</function> usage</title> |
|
2191 |
+ <programlisting format="linespecific"> |
|
2192 |
+... |
|
2193 |
+if(dlg_set_var("$var(ci)", "$var(ft)", "456", "test", "$var(tmp)")) |
|
2194 |
+{ |
|
2195 |
+ xdbg("set $$dlg_var(test):$var(tmp)\n"); |
|
2196 |
+} |
|
2197 |
+... |
|
2198 |
+</programlisting> |
|
2199 |
+ </example> |
|
2200 |
+ </section> |
|
2201 |
+ |
|
2154 | 2202 |
<section id="dialog.f.is_known_dlg"> |
2155 | 2203 |
<title> |
2156 | 2204 |
<function moreinfo="none">is_known_dlg()</function> |