From 48c24139712efd72a405db1ff8871ac9e26a099b Mon Sep 17 00:00:00 2001
From: Alexandre Savard <asavard@asavard.(none)>
Date: Fri, 27 May 2011 17:01:03 -0400
Subject: [PATCH] #5954: Clean up getSessionMedia methods

---
 sflphone-common/src/sip/sdp.cpp         | 43 ++++++++++++++++++-------
 sflphone-common/src/sip/sdp.h           |  7 +++-
 sflphone-common/src/sip/sipvoiplink.cpp | 19 ++++++++---
 3 files changed, 53 insertions(+), 16 deletions(-)

diff --git a/sflphone-common/src/sip/sdp.cpp b/sflphone-common/src/sip/sdp.cpp
index 32ebd088cb..fe99ba7a5e 100644
--- a/sflphone-common/src/sip/sdp.cpp
+++ b/sflphone-common/src/sip/sdp.cpp
@@ -136,27 +136,48 @@ void Sdp::setActiveRemoteSdpSession (const pjmedia_sdp_session *sdp)
     getRemoteSdpTelephoneEventFromOffer(sdp);
 }
 
-AudioCodec* Sdp::getSessionMedia (void)
+bool Sdp::hasSessionMedia(void) 
 {
+    std::vector<sdpMedia *> mediaList = getSessionMediaList();
+    bool listNotEmpty;
 
-    int nb_media;
-    int nb_codec;
+    if(mediaList.size() > 0) {
+	listNotEmpty = true;
+    }
+    else {
+        listNotEmpty = false;
+    }
+
+    return listNotEmpty;
+}
+
+AudioCodec* Sdp::getSessionMedia (void) throw(SdpException)
+{
+
+    int nbMedia;
+    int nbCodec;
     sfl::Codec *codec = NULL;
-    std::vector<sdpMedia*> media_list;
+    std::vector<sdpMedia *> mediaList;
 
     _debug ("SDP: Get session media");
 
-    media_list = getSessionMediaList ();
-    nb_media = media_list.size();
+    mediaList = getSessionMediaList ();
+    nbMedia = mediaList.size();
 
-    if (nb_media > 0) {
-        nb_codec = media_list[0]->get_media_codec_list().size();
+    if(nbMedia <= 0) {
+	_error("SDP: Error: No media in session description");
+	throw SdpException("No media description for this SDP");
+    }
 
-        if (nb_codec > 0) {
-            codec = media_list[0]->get_media_codec_list() [0];
-        }
+    nbCodec = mediaList[0]->get_media_codec_list().size();
+
+    if (nbCodec <= 0) {
+	_error("SDP: Error: No codec description for this media");
+    	throw SdpException("No codec description for this media");
     }
 
+    codec = mediaList[0]->get_media_codec_list() [0];
+
     return static_cast<AudioCodec *>(codec);
 }
 
diff --git a/sflphone-common/src/sip/sdp.h b/sflphone-common/src/sip/sdp.h
index 16675c77f2..250a7c7088 100644
--- a/sflphone-common/src/sip/sdp.h
+++ b/sflphone-common/src/sip/sdp.h
@@ -149,10 +149,15 @@ class Sdp
         }
 
 
+        /**
+	 * Return wether or not the media have been determined for this sdp session
+	 */
+        bool hasSessionMedia(void);
+
         /**
          * Return the codec of the first media after negociation
          */
-        AudioCodec* getSessionMedia (void);
+        AudioCodec* getSessionMedia (void) throw(SdpException);
 
         /*
          * On building an invite outside a dialog, build the local offer and create the
diff --git a/sflphone-common/src/sip/sipvoiplink.cpp b/sflphone-common/src/sip/sipvoiplink.cpp
index c421387615..f5766adec2 100644
--- a/sflphone-common/src/sip/sipvoiplink.cpp
+++ b/sflphone-common/src/sip/sipvoiplink.cpp
@@ -1347,20 +1347,31 @@ std::string
 SIPVoIPLink::getCurrentCodecName()
 {
 
-    SIPCall *call;
+    SIPCall *call = NULL;
     sfl::Codec *ac = NULL;
     std::string name = "";
 
     call = getSIPCall (Manager::instance().getCurrentCallId());
+    if(call == NULL) {
+        _error("UserAgent: Error: No current call");
+	// return empty string
+        return name;
+    }
+    
 
-    if (call) {
+    if(call->getLocalSDP()->hasSessionMedia()) {
         ac = call->getLocalSDP()->getSessionMedia();
     }
+    else {
+	return name;
+    }
 
-    if (ac) {
-        name = ac->getMimeSubtype();
+    if (ac == NULL) {
+	_error("UserAgent: Error: No codec initialized for this session");
     }
 
+    name = ac->getMimeSubtype();
+
     return name;
 }
 
-- 
GitLab