瀏覽代碼

pv: kemi functions to get xavp value from root and child lists

Daniel-Constantin Mierla 6 年之前
父節點
當前提交
a1264685bc
共有 1 個文件被更改,包括 142 次插入0 次删除
  1. 142 0
      src/modules/pv/pv.c

+ 142 - 0
src/modules/pv/pv.c

@@ -1061,6 +1061,138 @@ static int w_xavp_rm_child(sip_msg_t *msg, char *prname, char *pcname)
 	return ki_xavp_rm_child(msg, &rname, &cname);
 }
 
+/**
+ *
+ */
+static sr_kemi_xval_t _sr_kemi_pv_xval = {0};
+
+/**
+ *
+ */
+static sr_kemi_xval_t* ki_xavp_get_xval(sr_xavp_t *xavp, int rmode)
+{
+	static char _pv_ki_xavp_buf[128];
+
+	switch(xavp->val.type) {
+		case SR_XTYPE_NULL:
+			sr_kemi_xval_null(&_sr_kemi_pv_xval, rmode);
+			return &_sr_kemi_pv_xval;
+		break;
+		case SR_XTYPE_INT:
+			_sr_kemi_pv_xval.vtype = SR_KEMIP_INT;
+			_sr_kemi_pv_xval.v.n = xavp->val.v.i;
+			return &_sr_kemi_pv_xval;
+		break;
+		case SR_XTYPE_STR:
+			_sr_kemi_pv_xval.vtype = SR_KEMIP_STR;
+			_sr_kemi_pv_xval.v.s = xavp->val.v.s;
+			return &_sr_kemi_pv_xval;
+		break;
+		case SR_XTYPE_TIME:
+			if(snprintf(_pv_ki_xavp_buf, 128, "%lu", (long unsigned)xavp->val.v.t)<0) {
+				sr_kemi_xval_null(&_sr_kemi_pv_xval, rmode);
+				return &_sr_kemi_pv_xval;
+			}
+		break;
+		case SR_XTYPE_LONG:
+			if(snprintf(_pv_ki_xavp_buf, 128, "%ld", (long unsigned)xavp->val.v.l)<0) {
+				sr_kemi_xval_null(&_sr_kemi_pv_xval, rmode);
+				return &_sr_kemi_pv_xval;
+			}
+		break;
+		case SR_XTYPE_LLONG:
+			if(snprintf(_pv_ki_xavp_buf, 128, "%lld", xavp->val.v.ll)<0) {
+				sr_kemi_xval_null(&_sr_kemi_pv_xval, rmode);
+				return &_sr_kemi_pv_xval;
+			}
+		break;
+		case SR_XTYPE_XAVP:
+			if(snprintf(_pv_ki_xavp_buf, 128, "<<xavp:%p>>", xavp->val.v.xavp)<0) {
+				sr_kemi_xval_null(&_sr_kemi_pv_xval, rmode);
+				return &_sr_kemi_pv_xval;
+			}
+		break;
+		case SR_XTYPE_DATA:
+			if(snprintf(_pv_ki_xavp_buf, 128, "<<data:%p>>", xavp->val.v.data)<0) {
+				sr_kemi_xval_null(&_sr_kemi_pv_xval, rmode);
+				return &_sr_kemi_pv_xval;
+			}
+		break;
+		default:
+			sr_kemi_xval_null(&_sr_kemi_pv_xval, rmode);
+			return &_sr_kemi_pv_xval;
+	}
+
+	_sr_kemi_pv_xval.vtype = SR_KEMIP_STR;
+	_sr_kemi_pv_xval.v.s.s = _pv_ki_xavp_buf;
+	_sr_kemi_pv_xval.v.s.len = strlen(_pv_ki_xavp_buf);
+	return &_sr_kemi_pv_xval;
+}
+
+/**
+ *
+ */
+static sr_kemi_xval_t* ki_xavp_get_mode(sip_msg_t *msg, str *rname, int rmode)
+{
+	sr_xavp_t *xavp=NULL;
+
+	memset(&_sr_kemi_pv_xval, 0, sizeof(sr_kemi_xval_t));
+
+	xavp = xavp_get_by_index(rname, 0, NULL);
+	if(xavp==NULL) {
+		sr_kemi_xval_null(&_sr_kemi_pv_xval, rmode);
+		return &_sr_kemi_pv_xval;
+	}
+
+	return ki_xavp_get_xval(xavp, rmode);
+}
+
+/**
+ *
+ */
+static sr_kemi_xval_t* ki_xavp_get(sip_msg_t *msg, str *rname)
+{
+	return ki_xavp_get_mode(msg, rname, SR_KEMI_XVAL_NULL_NONE);
+}
+
+/**
+ *
+ */
+static sr_kemi_xval_t* ki_xavp_get_child_mode(sip_msg_t *msg, str *rname,
+		str *cname, int rmode)
+{
+	sr_xavp_t *xavp=NULL;
+
+	memset(&_sr_kemi_pv_xval, 0, sizeof(sr_kemi_xval_t));
+
+	xavp = xavp_get_by_index(rname, 0, NULL);
+	if(xavp==NULL) {
+		sr_kemi_xval_null(&_sr_kemi_pv_xval, rmode);
+		return &_sr_kemi_pv_xval;
+	}
+
+	if(xavp->val.type != SR_XTYPE_XAVP) {
+		sr_kemi_xval_null(&_sr_kemi_pv_xval, rmode);
+		return &_sr_kemi_pv_xval;
+	}
+
+	xavp = xavp_get_by_index(cname, 0, &xavp->val.v.xavp);
+	if(xavp==NULL) {
+		sr_kemi_xval_null(&_sr_kemi_pv_xval, rmode);
+		return &_sr_kemi_pv_xval;
+	}
+
+	return ki_xavp_get_xval(xavp, rmode);
+}
+
+/**
+ *
+ */
+static sr_kemi_xval_t* ki_xavp_get_child(sip_msg_t *msg, str *rname, str *cname)
+{
+	return ki_xavp_get_child_mode(msg, rname, cname, SR_KEMI_XVAL_NULL_NONE);
+}
+
 /**
  *
  */
@@ -1328,6 +1460,16 @@ static sr_kemi_t sr_kemi_pvx_exports[] = {
 		{ SR_KEMIP_STR, SR_KEMIP_STR, SR_KEMIP_NONE,
 			SR_KEMIP_NONE, SR_KEMIP_NONE, SR_KEMIP_NONE }
 	},
+	{ str_init("pvx"), str_init("xavp_get"),
+		SR_KEMIP_XVAL, ki_xavp_get,
+		{ SR_KEMIP_STR, SR_KEMIP_NONE, SR_KEMIP_NONE,
+			SR_KEMIP_NONE, SR_KEMIP_NONE, SR_KEMIP_NONE }
+	},
+	{ str_init("pvx"), str_init("xavp_get_child"),
+		SR_KEMIP_XVAL, ki_xavp_get_child,
+		{ SR_KEMIP_STR, SR_KEMIP_STR, SR_KEMIP_NONE,
+			SR_KEMIP_NONE, SR_KEMIP_NONE, SR_KEMIP_NONE }
+	},
 	{ str_init("pvx"), str_init("evalx"),
 		SR_KEMIP_INT, ki_pv_evalx,
 		{ SR_KEMIP_STR, SR_KEMIP_STR, SR_KEMIP_NONE,