/* @return: * 0 - backup * 1 - active * -1 - error * -2 - dlg val not found */ int get_shtag_state(struct dlg_cell *dlg) { str tag_name; struct dlg_sharing_tag *tag; int rc; rc = fetch_dlg_value(dlg, &shtag_dlg_val, &tag_name, 0); if (rc == -1) { LM_ERR("Unable to fetch dlg value for sharing tag\n"); return -1; } else if (rc == -2) { LM_DBG("dlg value for sharing tag not found\n"); return -2; } if ((tag = get_shtag(&tag_name, 0)) == NULL) { LM_ERR("Unable to fetch sharing tag\n"); return -1; } rc = tag->state; lock_stop_sw_read(shtags_lock); return rc; }
int w_fetch_dlg_value(struct sip_msg *msg, char *name, char *result) { struct dlg_cell *dlg; str val; pv_spec_t *sp_dest; int_str res; int avp_name; unsigned short avp_type; script_var_t * sc_var; sp_dest = (pv_spec_t *)result; if ( (dlg=get_current_dialog())==NULL ) return -1; if (fetch_dlg_value( dlg, (str*)name, &val, 0) ) { LM_DBG("failed to fetch dialog value <%.*s>\n", ((str*)name)->len, ((str*)name)->s); return -1; } switch (sp_dest->type) { case PVT_AVP: if (pv_get_avp_name( msg, &(sp_dest->pvp), &avp_name, &avp_type)!=0){ LM_CRIT("BUG in getting AVP name\n"); return -1; } res.s = val; if (add_avp(avp_type|AVP_VAL_STR, avp_name, res)<0){ LM_ERR("cannot add AVP\n"); return -1; } break; case PVT_SCRIPTVAR: if(sp_dest->pvp.pvn.u.dname == 0){ LM_ERR("cannot find svar name\n"); return -1; } res.s = val; sc_var = (script_var_t *)sp_dest->pvp.pvn.u.dname; if(!set_var_value(sc_var, &res, VAR_VAL_STR)){ LM_ERR("cannot set svar\n"); return -1; } break; default: LM_CRIT("BUG: invalid pvar type\n"); return -1; } return 1; }
int pv_get_dlg_val(struct sip_msg *msg, pv_param_t *param, pv_value_t *res) { struct dlg_cell *dlg; if (param==NULL || param->pvn.type!=PV_NAME_INTSTR || param->pvn.u.isname.type!=AVP_NAME_STR || param->pvn.u.isname.name.s.s==NULL ) { LM_CRIT("BUG - bad parameters\n"); return -1; } if ( (dlg=get_current_dialog())==NULL ) return pv_get_null(msg, param, res); if (fetch_dlg_value( dlg, ¶m->pvn.u.isname.name.s, ¶m->pvv, 1)!=0) return pv_get_null(msg, param, res); res->flags = PV_VAL_STR; res->rs = param->pvv; return 0; }
static int w_get_dlg_info(struct sip_msg *msg, char *attr, char *attr_val, char *key, char *key_val) { struct dlg_cell *dlg; pv_elem_t *pve = (pv_elem_t *)key_val; pv_spec_t *dst = (pv_spec_t *)attr_val; pv_value_t val; str val_s; int n; if ( pve==NULL || pv_printf_s(msg, pve, &val_s)!=0 || val_s.len == 0 || val_s.s == NULL) { LM_WARN("cannot get string for value\n"); return -1; } dlg = get_dlg_by_val( (str*)key, &val_s); if (dlg==NULL) { /* nothing found */ LM_DBG("no dialog found\n"); return -1; } /* dlg found - NOTE you have a ref! */ LM_DBG("dialog found, fetching variable\n"); if (fetch_dlg_value( dlg, (str*)attr, &val.rs, 0) ) { LM_DBG("failed to fetch dialog value <%.*s>\n", ((str*)attr)->len, ((str*)attr)->s); n = -1 ; } else { val.flags = PV_VAL_STR; n = (dst->setf( msg, &dst->pvp, 0, &val )==0)?1:-1; } unref_dlg(dlg, 1); return n; }