[sr-dev] git:master: sdpops: added functions to print sdp and check media type

Daniel-Constantin Mierla miconda at gmail.com
Mon Mar 14 00:29:19 CET 2011


Module: sip-router
Branch: master
Commit: c889ca572607e4715132b2f3911f795e2bb43bbc
URL:    http://git.sip-router.org/cgi-bin/gitweb.cgi/sip-router/?a=commit;h=c889ca572607e4715132b2f3911f795e2bb43bbc

Author: Daniel-Constantin Mierla <miconda at gmail.com>
Committer: Daniel-Constantin Mierla <miconda at gmail.com>
Date:   Sun Mar 13 23:04:18 2011 +0100

sdpops: added functions to print sdp and check media type

- sdp_print(level) - print the parsed sdp structure to the debug 'level'
  (integer representation of log levels). Good for debug purposes
- sdp_with_media(type) - return true if the sdp has 'media=type'

---

 modules/sdpops/sdpops_mod.c |  103 +++++++++++++++++++++++++++++++++++++++---
 1 files changed, 95 insertions(+), 8 deletions(-)

diff --git a/modules/sdpops/sdpops_mod.c b/modules/sdpops/sdpops_mod.c
index bc118ca..e49c968 100644
--- a/modules/sdpops/sdpops_mod.c
+++ b/modules/sdpops/sdpops_mod.c
@@ -38,13 +38,18 @@
 MODULE_VERSION
 
 static int w_sdp_remove_codecs_by_id(sip_msg_t* msg, char* codecs, char *bar);
-static int fixup_sdp_remove_codecs_by_id(void** param, int param_no);
+static int w_sdp_with_media(sip_msg_t* msg, char* media, char *bar);
+static int w_sdp_print(sip_msg_t* msg, char* level, char *bar);
 
 static int mod_init(void);
 
 static cmd_export_t cmds[] = {
 	{"sdp_remove_codecs_by_id",    (cmd_function)w_sdp_remove_codecs_by_id,
-		1, fixup_sdp_remove_codecs_by_id,  0, ANY_ROUTE},
+		1, fixup_spve_null,  0, ANY_ROUTE},
+	{"sdp_with_media",             (cmd_function)w_sdp_with_media,
+		1, fixup_spve_null,  0, ANY_ROUTE},
+	{"sdp_print",                  (cmd_function)w_sdp_print,
+		1, fixup_igp_null,  0, ANY_ROUTE},
 	{0, 0, 0, 0, 0}
 };
 
@@ -183,8 +188,6 @@ int sdp_remove_codecs_by_id(sip_msg_t* msg, str* codecs)
 
 	sdp = (sdp_info_t*)msg->body;
 
-	print_sdp(sdp, L_DBG);
-
 	sdp_session_num = 0;
 	for(;;)
 	{
@@ -246,12 +249,96 @@ static int w_sdp_remove_codecs_by_id(sip_msg_t* msg, char* codecs, char* bar)
 
 
 /** 
- * 
+ * @brief check 'media' matches the value of any 'm=value ...' lines
+ * @return -1 - error; 0 - not found; 1 - found
  */
-static int fixup_sdp_remove_codecs_by_id(void** param, int param_no)
+static int sdp_with_media(sip_msg_t *msg, str *media)
 {
-	if (param_no == 1) {
-	    return fixup_spve_null(param, 1);
+	sdp_info_t *sdp = NULL;
+	int sdp_session_num;
+	int sdp_stream_num;
+	sdp_session_cell_t* sdp_session;
+	sdp_stream_cell_t* sdp_stream;
+
+	if(parse_sdp(msg) < 0) {
+		LM_ERR("Unable to parse sdp\n");
+		return -1;
+	}
+
+	LM_ERR("attempting to search for media type: [%.*s]\n",
+			media->len, media->s);
+
+	sdp = (sdp_info_t*)msg->body;
+
+	sdp_session_num = 0;
+	for(;;)
+	{
+		sdp_session = get_sdp_session(msg, sdp_session_num);
+		if(!sdp_session) break;
+		sdp_stream_num = 0;
+		for(;;)
+		{
+			sdp_stream = get_sdp_stream(msg, sdp_session_num, sdp_stream_num);
+			if(!sdp_stream) break;
+
+			LM_DBG("stream %d of %d - media [%.*s]\n",
+				sdp_stream_num, sdp_session_num,
+				sdp_stream->media.len, sdp_stream->media.s);
+			if(media->len==sdp_stream->media.len
+					&& strncasecmp(sdp_stream->media.s, media->s,
+							media->len)==0)
+				return 1;
+			sdp_stream_num++;
+		}
+		sdp_session_num++;
 	}
+
 	return 0;
 }
+
+/**
+ *
+ */
+static int w_sdp_with_media(sip_msg_t* msg, char* media, char *bar)
+{
+	str lmedia = {0, 0};
+
+	if(media==0)
+	{
+		LM_ERR("invalid parameters\n");
+		return -1;
+	}
+
+	if(fixup_get_svalue(msg, (gparam_p)media, &lmedia)!=0)
+	{
+		LM_ERR("unable to get the media value\n");
+		return -1;
+	}
+
+	if(sdp_with_media(msg, &lmedia)<=0)
+		return -1;
+	return 1;
+}
+
+
+static int w_sdp_print(sip_msg_t* msg, char* level, char *bar)
+{
+	sdp_info_t *sdp = NULL;
+	int llevel = L_DBG;
+
+	if(parse_sdp(msg) < 0) {
+		LM_ERR("Unable to parse sdp\n");
+		return -1;
+	}
+
+	if(fixup_get_ivalue(msg, (gparam_p)level, &llevel)!=0)
+	{
+		LM_ERR("unable to get the debug level value\n");
+		return -1;
+	}
+
+	sdp = (sdp_info_t*)msg->body;
+
+	print_sdp(sdp, llevel);
+	return 1;
+}




More information about the sr-dev mailing list