Hi Daniel,
nice, new module!
But here is something from my wishlist:
Apart from removing codecs, it would be great to have a function to
remove all codecs but some wanted ones, e.g.:
sdp_limit_codecs("0,8,101");
which would remove all codecs except those with type 0,8 and 101 (if
offered). A function like this should return false, if the codecs are
not present. And, of course, it would be great, if one could limit the
media-types to certain ones: e.g. allow only m=audio, not m=video (or
others)....
That would be my wishlist for this module... (otherwise we/i can add
this later, if i really require this)
Carsten
2011/3/14 Daniel-Constantin Mierla<miconda(a)gmail.com>om>:
Module: sip-router
Branch: master
Commit: c889ca572607e4715132b2f3911f795e2bb43bbc
URL:
http://git.sip-router.org/cgi-bin/gitweb.cgi/sip-router/?a=commit;h=c889ca5…
Author: Daniel-Constantin Mierla<miconda(a)gmail.com>
Committer: Daniel-Constantin Mierla<miconda(a)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;
+}
_______________________________________________
sr-dev mailing list
sr-dev(a)lists.sip-router.org
http://lists.sip-router.org/cgi-bin/mailman/listinfo/sr-dev