瀏覽代碼

msrp: functions exported to kemi framework

Daniel-Constantin Mierla 7 年之前
父節點
當前提交
c15249cd9a
共有 1 個文件被更改,包括 176 次插入51 次删除
  1. 176 51
      src/modules/msrp/msrp_mod.c

+ 176 - 51
src/modules/msrp/msrp_mod.c

@@ -35,6 +35,7 @@
 #include "../../core/tcp_conn.h"
 #include "../../core/pvar.h"
 #include "../../core/timer_proc.h" /* register_sync_timer */
+#include "../../core/kemi.h"
 
 #include "msrp_parser.h"
 #include "msrp_netio.h"
@@ -211,15 +212,33 @@ static void mod_destroy(void)
 /**
  *
  */
-int mod_register(char *path, int *dlflags, void *p1, void *p2)
+static int ki_msrp_relay(sip_msg_t* msg)
 {
-	return register_trans_mod(path, mod_trans);
+	msrp_frame_t *mf;
+	int ret;
+
+	mf = msrp_get_current_frame();
+	if(mf==NULL)
+		return -1;
+
+	ret = msrp_relay(mf);
+	if(ret==0) ret = 1;
+	return ret;
 }
 
 /**
  *
  */
 static int w_msrp_relay(sip_msg_t* msg, char* str1, char* str2)
+{
+	return ki_msrp_relay(msg);
+}
+
+/**
+ *
+ */
+static int ki_msrp_reply(sip_msg_t* msg, str* rcode, str* rtext,
+		str *rhdrs)
 {
 	msrp_frame_t *mf;
 	int ret;
@@ -228,49 +247,36 @@ static int w_msrp_relay(sip_msg_t* msg, char* str1, char* str2)
 	if(mf==NULL)
 		return -1;
 
-	ret = msrp_relay(mf);
+	ret = msrp_reply(mf, rcode, rtext,
+			(rhdrs!=NULL && rhdrs->len>0)?rhdrs:NULL);
 	if(ret==0) ret = 1;
 	return ret;
 }
 
-
 /**
  *
  */
-static int w_msrp_reply(struct sip_msg* msg, char* code, char* text,
-		char *hdrs)
+static int w_msrp_reply(sip_msg_t *msg, char *code, char *text, char *hdrs)
 {
-	str rcode;
-	str rtext;
-	str rhdrs;
-	msrp_frame_t *mf;
-	int ret;
+	str rcode = STR_NULL;
+	str rtext = STR_NULL;
+	str rhdrs = STR_NULL;
 
-	if(fixup_get_svalue(msg, (gparam_t*)code, &rcode)!=0)
-	{
+	if(fixup_get_svalue(msg, (gparam_t *)code, &rcode) != 0) {
 		LM_ERR("no reply status code\n");
 		return -1;
 	}
 
-	if(fixup_get_svalue(msg, (gparam_t*)text, &rtext)!=0)
-	{
+	if(fixup_get_svalue(msg, (gparam_t *)text, &rtext) != 0) {
 		LM_ERR("no reply status phrase\n");
 		return -1;
 	}
 
-	if(hdrs!=NULL && fixup_get_svalue(msg, (gparam_t*)hdrs, &rhdrs)!=0)
-	{
+	if(hdrs != NULL && fixup_get_svalue(msg, (gparam_t *)hdrs, &rhdrs) != 0) {
 		LM_ERR("invalid extra headers\n");
 		return -1;
 	}
-
-	mf = msrp_get_current_frame();
-	if(mf==NULL)
-		return -1;
-
-	ret = msrp_reply(mf, &rcode, &rtext, (hdrs!=NULL)?&rhdrs:NULL);
-	if(ret==0) ret = 1;
-	return ret;
+	return ki_msrp_reply(msg, &rcode, &rtext, (hdrs!=NULL)?&rhdrs:NULL);
 }
 
 /**
@@ -293,9 +299,10 @@ static int w_msrp_reply3(sip_msg_t* msg, char* code, char* text,
 /**
  *
  */
-static int w_msrp_is_request(sip_msg_t* msg, char* str1, char* str2)
+static int ki_msrp_is_request(sip_msg_t* msg)
 {
 	msrp_frame_t *mf;
+
 	mf = msrp_get_current_frame();
 	if(mf==NULL)
 		return -1;
@@ -307,9 +314,18 @@ static int w_msrp_is_request(sip_msg_t* msg, char* str1, char* str2)
 /**
  *
  */
-static int w_msrp_is_reply(sip_msg_t* msg, char* str1, char* str2)
+static int w_msrp_is_request(sip_msg_t* msg, char* str1, char* str2)
+{
+	return ki_msrp_is_request(msg);
+}
+
+/**
+ *
+ */
+static int ki_msrp_is_reply(sip_msg_t* msg)
 {
 	msrp_frame_t *mf;
+
 	mf = msrp_get_current_frame();
 	if(mf==NULL)
 		return -1;
@@ -318,6 +334,31 @@ static int w_msrp_is_reply(sip_msg_t* msg, char* str1, char* str2)
 	return -1;
 }
 
+/**
+ *
+ */
+static int w_msrp_is_reply(sip_msg_t* msg, char* str1, char* str2)
+{
+	return ki_msrp_is_reply(msg);
+}
+
+/**
+ *
+ */
+static int ki_msrp_set_dst(sip_msg_t* msg, str* rtaddr, str* rfsock)
+{
+	msrp_frame_t *mf;
+	int ret;
+
+	mf = msrp_get_current_frame();
+	if(mf==NULL)
+		return -1;
+
+	ret = msrp_env_set_dstinfo(mf, rtaddr, rfsock, 0);
+	if(ret==0) ret = 1;
+	return ret;
+}
+
 /**
  *
  */
@@ -325,8 +366,6 @@ static int w_msrp_set_dst(sip_msg_t* msg, char* taddr, char* fsock)
 {
 	str rtaddr  = {0};
 	str rfsock = {0};
-	msrp_frame_t *mf;
-	int ret;
 
 	if(fixup_get_svalue(msg, (gparam_t*)taddr, &rtaddr)!=0)
 	{
@@ -339,13 +378,22 @@ static int w_msrp_set_dst(sip_msg_t* msg, char* taddr, char* fsock)
 		LM_ERR("invalid local socket parameter\n");
 		return -1;
 	}
+	return ki_msrp_set_dst(msg, &rtaddr, &rfsock);
+}
 
+/**
+ *
+ */
+static int ki_msrp_relay_flags(sip_msg_t* msg, int rtflags)
+{
+	msrp_frame_t *mf;
+	int ret;
 
 	mf = msrp_get_current_frame();
 	if(mf==NULL)
 		return -1;
 
-	ret = msrp_env_set_dstinfo(mf, &rtaddr, &rfsock, 0);
+	ret = msrp_env_set_sndflags(mf, rtflags);
 	if(ret==0) ret = 1;
 	return ret;
 }
@@ -356,36 +404,22 @@ static int w_msrp_set_dst(sip_msg_t* msg, char* taddr, char* fsock)
 static int w_msrp_relay_flags(sip_msg_t* msg, char *tflags, char* str2)
 {
 	int rtflags = 0;
-	msrp_frame_t *mf;
-	int ret;
-	if(fixup_get_ivalue(msg, (gparam_t*)tflags, &rtflags)!=0)
-	{
+
+	if(fixup_get_ivalue(msg, (gparam_t *)tflags, &rtflags) != 0) {
 		LM_ERR("invalid send flags parameter\n");
 		return -1;
 	}
 
-	mf = msrp_get_current_frame();
-	if(mf==NULL)
-		return -1;
-
-	ret = msrp_env_set_sndflags(mf, rtflags);
-	if(ret==0) ret = 1;
-	return ret;
+	return ki_msrp_relay_flags(msg, rtflags);
 }
 
 /**
  *
  */
-static int w_msrp_reply_flags(sip_msg_t* msg, char *tflags, char* str2)
+static int ki_msrp_reply_flags(sip_msg_t *msg, int rtflags)
 {
-	int rtflags = 0;
 	msrp_frame_t *mf;
 	int ret;
-	if(fixup_get_ivalue(msg, (gparam_t*)tflags, &rtflags)!=0)
-	{
-		LM_ERR("invalid send flags parameter\n");
-		return -1;
-	}
 
 	mf = msrp_get_current_frame();
 	if(mf==NULL)
@@ -396,11 +430,24 @@ static int w_msrp_reply_flags(sip_msg_t* msg, char *tflags, char* str2)
 	return ret;
 }
 
+/**
+ *
+ */
+static int w_msrp_reply_flags(sip_msg_t *msg, char *tflags, char *str2)
+{
+	int rtflags = 0;
+
+	if(fixup_get_ivalue(msg, (gparam_t *)tflags, &rtflags) != 0) {
+		LM_ERR("invalid send flags parameter\n");
+		return -1;
+	}
+	return ki_msrp_reply_flags(msg, rtflags);
+}
 
 /**
  *
  */
-static int w_msrp_cmap_save(sip_msg_t* msg, char* str1, char* str2)
+static int ki_msrp_cmap_save(sip_msg_t* msg)
 {
 	msrp_frame_t *mf;
 	int ret;
@@ -414,11 +461,18 @@ static int w_msrp_cmap_save(sip_msg_t* msg, char* str1, char* str2)
 	return ret;
 }
 
+/**
+ *
+ */
+static int w_msrp_cmap_save(sip_msg_t* msg, char* str1, char* str2)
+{
+	return ki_msrp_cmap_save(msg);
+}
 
 /**
  *
  */
-static int w_msrp_cmap_lookup(sip_msg_t* msg, char* str1, char* str2)
+static int ki_msrp_cmap_lookup(sip_msg_t* msg)
 {
 	msrp_frame_t *mf;
 	int ret;
@@ -432,6 +486,14 @@ static int w_msrp_cmap_lookup(sip_msg_t* msg, char* str1, char* str2)
 	return ret;
 }
 
+/**
+ *
+ */
+static int w_msrp_cmap_lookup(sip_msg_t* msg, char* str1, char* str2)
+{
+	return ki_msrp_cmap_lookup(msg);
+}
+
 /**
  *
  */
@@ -443,7 +505,6 @@ static int msrp_frame_received(sr_event_param_t *evp)
 	struct run_act_ctx ctx;
 	int rtb, rt;
 
-
 	tev = (tcp_event_info_t*)evp->data;
 
 	if(tev==NULL || tev->buf==NULL || tev->len<=0)
@@ -493,3 +554,67 @@ static void msrp_local_timer(unsigned int ticks, void* param)
 {
 	msrp_cmap_clean();
 }
+
+/**
+ *
+ */
+/* clang-format off */
+static sr_kemi_t sr_kemi_msrp_exports[] = {
+	{ str_init("msrp"), str_init("relay"),
+		SR_KEMIP_INT, ki_msrp_relay,
+		{ SR_KEMIP_NONE, SR_KEMIP_NONE, SR_KEMIP_NONE,
+			SR_KEMIP_NONE, SR_KEMIP_NONE, SR_KEMIP_NONE }
+	},
+	{ str_init("msrp"), str_init("reply"),
+		SR_KEMIP_INT, ki_msrp_reply,
+		{ SR_KEMIP_STR, SR_KEMIP_STR, SR_KEMIP_STR,
+			SR_KEMIP_NONE, SR_KEMIP_NONE, SR_KEMIP_NONE }
+	},
+	{ str_init("msrp"), str_init("is_request"),
+		SR_KEMIP_INT, ki_msrp_is_request,
+		{ SR_KEMIP_NONE, SR_KEMIP_NONE, SR_KEMIP_NONE,
+			SR_KEMIP_NONE, SR_KEMIP_NONE, SR_KEMIP_NONE }
+	},
+	{ str_init("msrp"), str_init("is_reply"),
+		SR_KEMIP_INT, ki_msrp_is_reply,
+		{ SR_KEMIP_NONE, SR_KEMIP_NONE, SR_KEMIP_NONE,
+			SR_KEMIP_NONE, SR_KEMIP_NONE, SR_KEMIP_NONE }
+	},
+	{ str_init("msrp"), str_init("set_dst"),
+		SR_KEMIP_INT, ki_msrp_set_dst,
+		{ SR_KEMIP_STR, SR_KEMIP_STR, SR_KEMIP_NONE,
+			SR_KEMIP_NONE, SR_KEMIP_NONE, SR_KEMIP_NONE }
+	},
+	{ str_init("msrp"), str_init("relay_flags"),
+		SR_KEMIP_INT, ki_msrp_relay_flags,
+		{ SR_KEMIP_INT, SR_KEMIP_NONE, SR_KEMIP_NONE,
+			SR_KEMIP_NONE, SR_KEMIP_NONE, SR_KEMIP_NONE }
+	},
+	{ str_init("msrp"), str_init("reply_flags"),
+		SR_KEMIP_INT, ki_msrp_reply_flags,
+		{ SR_KEMIP_INT, SR_KEMIP_NONE, SR_KEMIP_NONE,
+			SR_KEMIP_NONE, SR_KEMIP_NONE, SR_KEMIP_NONE }
+	},
+	{ str_init("msrp"), str_init("cmap_save"),
+		SR_KEMIP_INT, ki_msrp_cmap_save,
+		{ SR_KEMIP_NONE, SR_KEMIP_NONE, SR_KEMIP_NONE,
+			SR_KEMIP_NONE, SR_KEMIP_NONE, SR_KEMIP_NONE }
+	},
+	{ str_init("msrp"), str_init("cmap_lookup"),
+		SR_KEMIP_INT, ki_msrp_cmap_lookup,
+		{ SR_KEMIP_NONE, SR_KEMIP_NONE, SR_KEMIP_NONE,
+			SR_KEMIP_NONE, SR_KEMIP_NONE, SR_KEMIP_NONE }
+	},
+
+	{ {0, 0}, {0, 0}, 0, NULL, { 0, 0, 0, 0, 0, 0 } }
+};
+/* clang-format on */
+
+/**
+ *
+ */
+int mod_register(char *path, int *dlflags, void *p1, void *p2)
+{
+	sr_kemi_modules_add(sr_kemi_msrp_exports);
+	return register_trans_mod(path, mod_trans);
+}