diff --git a/sflphone-common/src/audio/audiortp/AudioRtpFactory.cpp b/sflphone-common/src/audio/audiortp/AudioRtpFactory.cpp index 09756c4adff42163459b71e15d7f3cec7fc80c21..f7ef1ffe5d2c18935f83d50c6daf637885ec9b5c 100644 --- a/sflphone-common/src/audio/audiortp/AudioRtpFactory.cpp +++ b/sflphone-common/src/audio/audiortp/AudioRtpFactory.cpp @@ -167,8 +167,8 @@ void AudioRtpFactory::stop (void) switch (_rtpSessionType) { case Sdes: - delete static_cast<AudioSrtpSession *> (_rtpSession); - break; + delete static_cast<AudioSrtpSession *> (_rtpSession); + break; case Symmetric: delete static_cast<AudioSymmetricRtpSession *> (_rtpSession); diff --git a/sflphone-common/src/audio/audiortp/AudioRtpSession.h b/sflphone-common/src/audio/audiortp/AudioRtpSession.h index d2497d5a4386b02df54792fe718cdc8c8edbb538..bfb5a72c22d12b08c04e4ec292704504bb047ca5 100644 --- a/sflphone-common/src/audio/audiortp/AudioRtpSession.h +++ b/sflphone-common/src/audio/audiortp/AudioRtpSession.h @@ -267,6 +267,10 @@ namespace sfl { delete [] _spkrDataConverted; delete _time; delete _converter; + + if (_audiocodec) { + delete _audiocodec; _audiocodec = NULL; + } } template <typename D> @@ -615,7 +619,7 @@ namespace sfl { _debug("RTP: Starting main thread"); setSessionTimeouts(); setSessionMedia(audiocodec); - initBuffers(); + initBuffers(); return start(_mainloopSemaphore); } diff --git a/sflphone-common/src/audio/codecs/codecDescriptor.cpp b/sflphone-common/src/audio/codecs/codecDescriptor.cpp index 29355764f1f8a5e96a13fc8ee2b6c8a1d6dbba62..0ca263763ecca44841f9d5f174e74df7aa5f2fc7 100644 --- a/sflphone-common/src/audio/codecs/codecDescriptor.cpp +++ b/sflphone-common/src/audio/codecs/codecDescriptor.cpp @@ -31,17 +31,19 @@ CodecDescriptor::CodecDescriptor() : _CodecsMap(), _defaultCodecOrder(), _Cache( CodecDescriptor::~CodecDescriptor() { + } void CodecDescriptor::deleteHandlePointer (void) { - int i; + _debug("CodecDesccriptor: Delete codec handle pointers"); - for (i = 0 ; (unsigned int) i < _CodecInMemory.size() ; i++) { + for (int i = 0 ; (unsigned int) i < _CodecInMemory.size() ; i++) { unloadCodec (_CodecInMemory[i]); } + _CodecInMemory.clear(); } void @@ -51,7 +53,7 @@ CodecDescriptor::init() _nbCodecs = CodecDynamicList.size(); if (_nbCodecs <= 0) { - _debug (" Error - No codecs available in directory %s" , CODECS_DIR); + _error ("CodecDescriptro: Error - No codecs available in directory %s" , CODECS_DIR); } int i; @@ -97,7 +99,7 @@ CodecDescriptor::getCodec (AudioCodecType payload) return (iter->second); } - _debug ("Error cannont found codec %i in _CodecsMap from codec descriptor", payload); + _error ("CodecDescriptor: Error cannont found codec %i in _CodecsMap from codec descriptor", payload); return NULL; } @@ -167,7 +169,7 @@ std::vector<AudioCodec*> CodecDescriptor::scanCodecDirectory (void) { for (i = 0 ; (unsigned int) i < dirToScan.size() ; i++) { std::string dirStr = dirToScan[i]; - _debug ("Scanning %s to find audio codecs....", dirStr.c_str()); + _debug ("CodecDescriptor: Scanning %s to find audio codecs....", dirStr.c_str()); DIR *dir = opendir (dirStr.c_str()); AudioCodec* audioCodec; @@ -248,15 +250,15 @@ AudioCodec* CodecDescriptor::instantiateCodec (AudioCodecType payload) { AudioCodec* a = createCodec(); return a; - } - iter++; } return NULL; } + + AudioCodec* CodecDescriptor::getFirstCodecAvailable (void) { CodecsMap::iterator iter = _CodecsMap.begin(); @@ -349,7 +351,7 @@ bool CodecDescriptor::isCodecLoaded (int payload) { std::vector <std::string> CodecDescriptor::getCodecSpecifications (const int32_t& payload) { - _warn ("Gathering codec specifications for payload %i", payload); + _debug ("CodecDescriptor: Gathering codec specifications for payload %i", payload); std::vector<std::string> v; std::stringstream ss; diff --git a/sflphone-common/src/audio/codecs/speexcodec_nb.cpp b/sflphone-common/src/audio/codecs/speexcodec_nb.cpp index 9099dca71fbc7a69d71982394794c59f1d95492e..f06f5e43f899246f358b6129a981b95874126001 100644 --- a/sflphone-common/src/audio/codecs/speexcodec_nb.cpp +++ b/sflphone-common/src/audio/codecs/speexcodec_nb.cpp @@ -107,6 +107,9 @@ class Speex : public AudioCodec speex_bits_destroy (&_speex_enc_bits); speex_encoder_destroy (_speex_enc_state); _speex_enc_state = 0; + + speex_preprocess_state_destroy( _preprocess_state); + _preprocess_state = NULL; } virtual int codecDecode (short *dst, unsigned char *src, unsigned int size) { diff --git a/sflphone-common/src/audio/codecs/speexcodec_ub.cpp b/sflphone-common/src/audio/codecs/speexcodec_ub.cpp index 4a9fec31c88b8ac3197a148b368eeb3e460d7dcc..01fb49b242f37fd94fff738ba27f0080348039be 100644 --- a/sflphone-common/src/audio/codecs/speexcodec_ub.cpp +++ b/sflphone-common/src/audio/codecs/speexcodec_ub.cpp @@ -106,6 +106,9 @@ class Speex : public AudioCodec speex_bits_destroy (&_speex_enc_bits); speex_encoder_destroy (_speex_enc_state); _speex_enc_state = 0; + + speex_preprocess_state_destroy( _preprocess_state); + _preprocess_state = NULL; } virtual int codecDecode (short *dst, unsigned char *src, unsigned int size) { diff --git a/sflphone-common/src/audio/codecs/speexcodec_wb.cpp b/sflphone-common/src/audio/codecs/speexcodec_wb.cpp index 28e099791f511dd838fdedc5c37dd4e4f20d4265..f3ff803ff0a7e4dc4dc766567adc9a07eafaa6e0 100644 --- a/sflphone-common/src/audio/codecs/speexcodec_wb.cpp +++ b/sflphone-common/src/audio/codecs/speexcodec_wb.cpp @@ -105,6 +105,9 @@ class Speex : public AudioCodec speex_bits_destroy (&_speex_enc_bits); speex_encoder_destroy (_speex_enc_state); _speex_enc_state = 0; + + speex_preprocess_state_destroy( _preprocess_state); + _preprocess_state = NULL; } virtual int codecDecode (short *dst, unsigned char *src, unsigned int size) { diff --git a/sflphone-common/src/audio/mainbuffer.cpp b/sflphone-common/src/audio/mainbuffer.cpp index f0da142792d6a6e428a5f7d3d0659af570765c1f..bad0b7a3b9aacff1a28f574978bb8f50df1fba36 100644 --- a/sflphone-common/src/audio/mainbuffer.cpp +++ b/sflphone-common/src/audio/mainbuffer.cpp @@ -65,7 +65,6 @@ bool MainBuffer::createCallIDSet (CallID set_id) CallIDSet* newCallIDSet = new CallIDSet; _callIDMap.insert (pair<CallID, CallIDSet*> (set_id, newCallIDSet)); - // _callIDMap[set_id] = new CallIDSet; return true; @@ -79,6 +78,7 @@ bool MainBuffer::removeCallIDSet (CallID set_id) if (callid_set != NULL) { if (_callIDMap.erase (set_id) != 0) { + delete callid_set; callid_set = NULL; return true; } else { _debug ("removeCallIDSet error while removing callid set %s!", set_id.c_str()); @@ -146,13 +146,14 @@ bool MainBuffer::removeRingBuffer (CallID call_id) if (ring_buffer != NULL) { if (_ringBufferMap.erase (call_id) != 0) { + delete ring_buffer; return true; } else { - _debug ("removeRingBuffer error while deleting ringbuffer %s!", call_id.c_str()); + _error ("BufferManager: Error: Fail to delete ringbuffer %s!", call_id.c_str()); return false; } } else { - _debug ("removeRingBuffer error ringbuffer %s does not exist!", call_id.c_str()); + _debug ("BufferManager: Error: Ringbuffer %s does not exist!", call_id.c_str()); return true; } } diff --git a/sflphone-common/src/dbus/callmanager.h b/sflphone-common/src/dbus/callmanager.h index c49f9c9c284fdbd33ce19ff253b19bffb106ddc4..8232b765a9def8e0cd10c5c0a93ff804573b3470 100644 --- a/sflphone-common/src/dbus/callmanager.h +++ b/sflphone-common/src/dbus/callmanager.h @@ -51,9 +51,9 @@ class CallManager * you will have to implement them in your ObjectAdaptor */ - /* Call related methods */ + /* Call related methods */ void placeCall( const std::string& accountID, const std::string& callID, const std::string& to ); - void placeCallFirstAccount( const std::string& callID, const std::string& to ); + void placeCallFirstAccount( const std::string& callID, const std::string& to ); void refuse( const std::string& callID ); void accept( const std::string& callID ); @@ -61,12 +61,12 @@ class CallManager void hold( const std::string& callID ); void unhold( const std::string& callID ); void transfert( const std::string& callID, const std::string& to ); - std::map< std::string, std::string > getCallDetails( const std::string& callID ); + std::map< std::string, std::string > getCallDetails( const std::string& callID ); std::vector< std::string > getCallList (void); - std::string getCurrentCallID( ); + std::string getCurrentCallID( ); - /* Conference related methods */ - void joinParticipant( const std::string& sel_callID, const std::string& drag_callID ); + /* Conference related methods */ + void joinParticipant( const std::string& sel_callID, const std::string& drag_callID ); void addParticipant( const std::string& callID, const std::string& confID ); void addMainParticipant( const std::string& confID ); void detachParticipant( const std::string& callID ); diff --git a/sflphone-common/src/dbus/configurationmanager-introspec.xml b/sflphone-common/src/dbus/configurationmanager-introspec.xml index df9c94f3ebc13d5dfc41377f70c4e3be17a326e5..481dfe6934968da6ae7b934963b4ff9fab64877e 100644 --- a/sflphone-common/src/dbus/configurationmanager-introspec.xml +++ b/sflphone-common/src/dbus/configurationmanager-introspec.xml @@ -423,9 +423,13 @@ <method name="getCodecDetails" tp:name-for-bindings="getCodecDetails"> <tp:docstring> + Get specification details provided + codec's RTP payload. </tp:docstring> <arg type="i" name="payload" direction="in"> <tp:docstring> + A list of codec specification details: + Name, Samplerate, Bit rate, Bandwidth. </tp:docstring> </arg> <annotation name="com.trolltech.QtDBus.QtTypeName.Out0" value="VectorString"/> @@ -441,10 +445,14 @@ <annotation name="com.trolltech.QtDBus.QtTypeName.Out0" value="VectorString"/> <arg type="s" name="accountID" direction="in"> <tp:docstring> + Currently activated codec listed as there + preference. This is the list used for + codec negotiation. </tp:docstring> </arg> <arg type="as" name="list" direction="out"> <tp:docstring> + A list of codecs, identified by their RTP payload, delimited by '/' </tp:docstring> </arg> </method> @@ -455,23 +463,25 @@ <annotation name="com.trolltech.QtDBus.QtTypeName.In0" value="VectorString"/> <arg type="as" name="list" direction="in"> <tp:docstring> + Set the active codec list used for codec negotiation. </tp:docstring> </arg> <arg type="s" name="accountID" direction="in"> <tp:docstring> + A list of codecs, identified by their RTP payload, delimited by '/' </tp:docstring> </arg> </method> <!-- Audio devices methods --> - <method name="getInputAudioPluginList" tp:name-for-bindings="getInputAudioPluginList"> <tp:docstring> </tp:docstring> <annotation name="com.trolltech.QtDBus.QtTypeName.Out0" value="VectorString"/> <arg type="as" name="list" direction="out"> <tp:docstring> + </tp:docstring> </arg> </method> diff --git a/sflphone-common/src/dbus/configurationmanager.cpp b/sflphone-common/src/dbus/configurationmanager.cpp index b243157e772af3b07b793a7a13138b17dc846f51..a9a36eb8995bb69bdef2238cd19cf6b919aa20bf 100644 --- a/sflphone-common/src/dbus/configurationmanager.cpp +++ b/sflphone-common/src/dbus/configurationmanager.cpp @@ -493,7 +493,7 @@ std::vector<std::string> ConfigurationManager::getActiveCodecList( void ConfigurationManager::setActiveCodecList( const std::vector<std::string>& list, const std::string& accountID) { - _debug ("ConfigurationManager::setActiveCodecList received"); + _debug ("ConfigurationManager: Active codec list received"); Account *acc; @@ -504,9 +504,12 @@ void ConfigurationManager::setActiveCodecList( } } + // Audio devices related methods std::vector<std::string> ConfigurationManager::getInputAudioPluginList() { + _debug("ConfigurationManager: Active codec list received"); + std::vector<std::string> v; v.push_back("default"); @@ -516,6 +519,8 @@ std::vector<std::string> ConfigurationManager::getInputAudioPluginList() { return v; } + + std::vector<std::string> ConfigurationManager::getOutputAudioPluginList() { std::vector<std::string> v; @@ -526,6 +531,7 @@ std::vector<std::string> ConfigurationManager::getOutputAudioPluginList() { return v; } + void ConfigurationManager::setInputAudioPlugin(const std::string& audioPlugin) { return Manager::instance().setInputAudioPlugin(audioPlugin); } diff --git a/sflphone-common/src/dbus/dbusmanagerimpl.cpp b/sflphone-common/src/dbus/dbusmanagerimpl.cpp index bfcc237ca369d02225fefb68023f0a62bc2877cc..ef0b342aac91584610dbc9fcb5710517dbc290a4 100644 --- a/sflphone-common/src/dbus/dbusmanagerimpl.cpp +++ b/sflphone-common/src/dbus/dbusmanagerimpl.cpp @@ -60,5 +60,13 @@ DBusManagerImpl::exit() _dispatcher.leave(); + delete _callManager; + delete _configurationManager; + delete _instanceManager; + +#ifdef USE_NETWORKMANAGER + delete _networkManager; +#endif + } diff --git a/sflphone-common/src/history/historymanager.cpp b/sflphone-common/src/history/historymanager.cpp index 1fb5b991547caf37acb6bafa18753e2789090cdb..ac5188c30b6e876ca35acc8ee7d788df204c7e60 100644 --- a/sflphone-common/src/history/historymanager.cpp +++ b/sflphone-common/src/history/historymanager.cpp @@ -32,9 +32,18 @@ HistoryManager::HistoryManager () HistoryManager::~HistoryManager () { + HistoryItemMap::iterator iter = _history_items.begin(); + + HistoryItem * item; + while(iter != _history_items.end()){ + item = iter->second; + delete item; + iter++; + } // Clear the history map _history_items.clear (); + } int HistoryManager::load_history (int limit, std::string path) diff --git a/sflphone-common/src/managerimpl.cpp b/sflphone-common/src/managerimpl.cpp index f0ba7bd4516d46e9cebcb028b27178fb9db4df81..9b28e568e16ed6f97a26417a017e5d47a1b97bc6 100644 --- a/sflphone-common/src/managerimpl.cpp +++ b/sflphone-common/src/managerimpl.cpp @@ -91,9 +91,10 @@ ManagerImpl::ManagerImpl (void) : // never call if we use only the singleton... ManagerImpl::~ManagerImpl (void) { // terminate(); - delete _cleaner; - _cleaner = 0; - _debug ("%s stop correctly.", PROGNAME); + delete _cleaner; _cleaner = NULL; + delete _history; _history = NULL; + + _debug ("Manager: %s stop correctly.", PROGNAME); } void ManagerImpl::init () { @@ -104,7 +105,7 @@ void ManagerImpl::init () { initVolume(); if (_exist == 0) { - _debug ("Cannot create config file in your home directory"); + _warn ("Manager: Cannot create config file in your home directory"); } initAudioDriver(); @@ -119,11 +120,11 @@ void ManagerImpl::init () { if (audiolayer != 0) { unsigned int sampleRate = audiolayer->getSampleRate(); - _debugInit ("Load Telephone Tone"); + _debugInit ("Manager: Load telephone tone"); std::string country = getConfigString(PREFERENCES, ZONE_TONE); _telephoneTone = new TelephoneTone(country, sampleRate); - _debugInit ("Loading DTMF key"); + _debugInit ("Manager: Loading DTMF key"); _dtmfKey = new DTMF(sampleRate); } @@ -135,23 +136,25 @@ void ManagerImpl::init () { } void ManagerImpl::terminate () { - _debug ("ManagerImpl::terminate "); + + _debug ("Manager: Terminate "); saveConfig(); unloadAccountMap(); - _debug ("Unload DTMF Key "); + _debug ("Manager: Unload DTMF key"); delete _dtmfKey; - _debug ("Unload Audio Driver "); - delete _audiodriver; - _audiodriver = NULL; + _debug("Manager: Unload telephone tone"); + delete _telephoneTone; _telephoneTone = NULL; + + _debug ("Manager: Unload audio driver"); + delete _audiodriver; _audiodriver = NULL; - _debug ("Unload Telephone Tone "); - delete _telephoneTone; - _telephoneTone = NULL; + _debug ("Manager: Unload telephone tone"); + delete _telephoneTone; _telephoneTone = NULL; - _debug ("Unload Audio Codecs "); + _debug ("Manager: Unload audio codecs "); _codecDescriptorMap.deleteHandlePointer(); } @@ -179,38 +182,6 @@ void ManagerImpl::switchCall (const CallID& id) { ost::MutexLock m(_currentCallMutex); _debug ("----- Switch current call id to %s -----", id.c_str()); _currentCallId2 = id; - - /* - AudioLayer *al = getAudioDriver(); - - if (id != "") { - - if(isConference(id)) { - - Conference *conf; - - ConferenceMap::iterator iter = _conferencemap.find(id); - if(iter != _conferencemap.end()) - { - _debug(" set call recordable in audio layer"); - conf = iter->second; - al->setRecorderInstance((Recordable*)conf); - } - } - else { - - // set the recordable instance in audiolayer - AccountID account_id = getAccountFromCall(id); - - - Call *call = NULL; - call = getAccountLink (account_id)->getCall(id); - - _debug(" set call recordable in audio layer"); - al->setRecorderInstance((Recordable*)call); - } - } - */ } /////////////////////////////////////////////////////////////////////////////// @@ -220,11 +191,12 @@ void ManagerImpl::switchCall (const CallID& id) { bool ManagerImpl::outgoingCall (const std::string& account_id, const CallID& call_id, const std::string& to) { + std::string pattern, to_cleaned; Call::CallConfiguration callConfig; SIPVoIPLink *siplink; - _debug ("ManagerImpl::outgoingCall(%s)", call_id.c_str()); + _debug ("Manager: New outgoing call %s", call_id.c_str()); CallID current_call_id = getCurrentCallId(); @@ -258,7 +230,7 @@ bool ManagerImpl::outgoingCall (const std::string& account_id, } if (callConfig == Call::IPtoIP) { - _debug (" outgoingCall: Start IP to IP call"); + _debug ("Manager: Start IP to IP call"); /* We need to retrieve the sip voiplink instance */ siplink = SIPVoIPLink::instance(""); @@ -273,16 +245,16 @@ bool ManagerImpl::outgoingCall (const std::string& account_id, } if (!accountExists(account_id)) { - _debug ("! Manager Error: Outgoing Call: account doesn't exist"); + _error ("Manager: Error: Account doesn't exist in new outgoing call"); return false; } if (getAccountFromCall(call_id) != AccountNULL) { - _debug ("! Manager Error: Outgoing Call: call id already exists"); + _error ("Manager: Error: Call id already exists in outgoing call"); return false; } - _debug ("- Manager Action: Adding Outgoing Call %s on account %s", call_id.data(), account_id.data()); + _debug ("Manager: Action: Adding Outgoing Call %s on account %s", call_id.data(), account_id.data()); associateCallToAccount(call_id, account_id); @@ -291,7 +263,7 @@ bool ManagerImpl::outgoingCall (const std::string& account_id, return true; } else { callFailure(call_id); - _debug ("! Manager Error: An error occur, the call was not created"); + _debug ("Manager: Error: An error occur, the call was not created"); } return false; @@ -419,12 +391,11 @@ bool ManagerImpl::hangupCall (const CallID& call_id) { else { account_id = getAccountFromCall(call_id); + // Account may be NULL if call have not been sent yet if (account_id == AccountNULL) { - _error ("Manager: Error: account id is NULL in hangup"); returnValue = false; } else { - returnValue = getAccountLink(account_id)->hangup(call_id); removeCallAccount(call_id); } @@ -1066,11 +1037,26 @@ void ManagerImpl::joinParticipant (const CallID& call_id1, const CallID& call_id _debug ("Manager: Join participants %s, %s", call_id1.c_str(), call_id2.c_str()); + + std::map<std::string, std::string> call1_details = getCallDetails(call_id1); std::map<std::string, std::string> call2_details = getCallDetails(call_id2); std::map<std::string, std::string>::iterator iter_details; + // Test if we have valid call ids + iter_details = call1_details.find("PEER_NUMBER"); + if(iter_details->second == "Unknown") { + _error("Manager: Error: Id %s is not a valid call", call_id1.c_str()); + return; + } + + iter_details = call2_details.find("PEER_NUMBER"); + if(iter_details->second == "Unknown") { + _error("Manager: Error: Id %s is not a valid call", call_id2.c_str()); + return; + } + AccountID currentAccountId; Call* call = NULL; @@ -1206,7 +1192,7 @@ void ManagerImpl::detachParticipant (const CallID& call_id, } void ManagerImpl::removeParticipant (const CallID& call_id) { - _debug ("ManagerImpl::removeParticipant(%s)", call_id.c_str()); + _debug ("Manager: Remove participant %s", call_id.c_str()); // TODO: add conference_id as a second parameter Conference* conf; @@ -1295,7 +1281,7 @@ void ManagerImpl::processRemainingParticipant (CallID current_call_id, void ManagerImpl::joinConference (const CallID& conf_id1, const CallID& conf_id2) { - _debug ("ManagerImpl::joinConference(%s, %s)", conf_id1.c_str(), conf_id2.c_str()); + _debug ("Manager: Join conference %s, %s", conf_id1.c_str(), conf_id2.c_str()); ConferenceMap::iterator iter; @@ -1304,13 +1290,23 @@ void ManagerImpl::joinConference (const CallID& conf_id1, iter = _conferencemap.find(conf_id1); - if (iter != _conferencemap.end()) + if (iter != _conferencemap.end()) { conf1 = iter->second; + } + else { + _error("Manager: Error: Not a valid conference ID"); + return; + } iter = _conferencemap.find(conf_id2); - if (iter != _conferencemap.end()) + if (iter != _conferencemap.end()) { conf2 = iter->second; + } + else { + _error("Manager: Error: Not a valid conference ID"); + return; + } ParticipantSet participants = conf1->getParticipantList(); @@ -1769,12 +1765,11 @@ void ManagerImpl::connectionStatusNotification () { * Multi Thread */ bool ManagerImpl::playATone (Tone::TONEID toneId) { + bool hasToPlayTone; - // AudioLoop *audioloop; AudioLayer *audiolayer; - // unsigned int nbSamples; - _debug ("ManagerImpl::playATone"); + // _debug ("Manager: Play tone %d", toneId); hasToPlayTone = getConfigBool(SIGNALISATION, PLAY_TONES); @@ -1793,17 +1788,6 @@ bool ManagerImpl::playATone (Tone::TONEID toneId) { _toneMutex.enterMutex(); _telephoneTone->setCurrentTone(toneId); _toneMutex.leaveMutex(); - /* - audioloop = getTelephoneTone(); - nbSamples = audioloop->getSize(); - SFLDataFormat buf[nbSamples]; - - - if (audiolayer) { - audiolayer->putUrgent (buf, nbSamples); - } else - return false; - */ } return true; @@ -1826,10 +1810,6 @@ void ManagerImpl::stopTone () { _telephoneTone->setCurrentTone(Tone::TONE_NULL); } - _toneMutex.leaveMutex(); - - // for ringing tone.. - _toneMutex.enterMutex(); _audiofile.stop(); _toneMutex.leaveMutex(); } @@ -1861,8 +1841,6 @@ void ManagerImpl::congestion () { * Multi Thread */ void ManagerImpl::ringback () { - _debug ("ManagerImpl::ringback"); - playATone(Tone::TONE_RINGTONE); } @@ -1870,14 +1848,14 @@ void ManagerImpl::ringback () { * Multi Thread */ void ManagerImpl::ringtone () { - - _debug ("Manager: Start ringtone"); std::string ringchoice; AudioLayer *audiolayer; AudioCodec *codecForTone; int layer, samplerate; bool loadFile; + _debug("Manager: Ringtone"); + if (isRingtoneEnabled()) { _debug ("Manager: Tone is enabled"); @@ -2342,7 +2320,7 @@ void ManagerImpl::setOutputAudioPlugin (const std::string& audioPlugin) { int res; - _debug ("Set output audio plugin"); + _debug ("Manager: Set output audio plugin"); _audiodriver -> setErrorMessage(-1); res = _audiodriver -> openDevice(_audiodriver -> getIndexIn(), _audiodriver -> getIndexOut(), _audiodriver -> getSampleRate(), @@ -2360,7 +2338,7 @@ void ManagerImpl::setOutputAudioPlugin (const std::string& audioPlugin) { * Get list of supported audio output device */ std::vector<std::string> ManagerImpl::getAudioOutputDeviceList (void) { - _debug ("Get audio output device list"); + _debug ("Manager: Get audio output device list"); AlsaLayer *layer; std::vector<std::string> devices; @@ -3208,7 +3186,7 @@ std::map<std::string, std::string> ManagerImpl::getAccountDetails ( a.insert(std::pair<std::string, std::string>(ACCOUNT_DTMF_TYPE, getConfigString( accountID, ACCOUNT_DTMF_TYPE))); - RegistrationState state; + RegistrationState state = Unregistered; std::string registrationStateCode; std::string registrationStateDescription; @@ -3225,8 +3203,6 @@ std::map<std::string, std::string> ManagerImpl::getAccountDetails ( registrationStateDescription = account->getRegistrationStateDetailed().second; } - } else { - state = Unregistered; } (accountID == IP2IP_PROFILE) ? a.insert( diff --git a/sflphone-common/src/sip/sdp.cpp b/sflphone-common/src/sip/sdp.cpp index 5b3066212a5cb1696816960df034e126ab5b7ac4..c71ee5ab4095f5e85bccdc324d2f1a052554fe6e 100644 --- a/sflphone-common/src/sip/sdp.cpp +++ b/sflphone-common/src/sip/sdp.cpp @@ -50,7 +50,11 @@ Sdp::Sdp (pj_pool_t *pool) _pool = pool; } -Sdp::~Sdp() { } +Sdp::~Sdp() +{ + clean_session_media(); + clean_local_media_capabilities(); +} void Sdp::set_media_descriptor_line (sdpMedia *media, pjmedia_sdp_media** p_med) { @@ -457,7 +461,39 @@ std::string Sdp::media_to_string (void) void Sdp::clean_session_media() { - _session_media.clear(); + _info("SDP: Clean session media"); + + if(_session_media.size() > 0) { + + std::vector<sdpMedia *>::iterator iter = _session_media.begin(); + sdpMedia *media; + + while(iter != _session_media.end()) { + media = *iter; + delete media; + iter++; + } + _session_media.clear(); + } +} + + +void Sdp::clean_local_media_capabilities() +{ + _info("SDP: Clean local media capabilities"); + + if(_local_media_cap.size() > 0) { + + std::vector<sdpMedia *>::iterator iter = _local_media_cap.begin(); + sdpMedia *media; + + while(iter != _local_media_cap.end()) { + media = *iter; + delete media; + iter++; + } + _local_media_cap.clear(); + } } void Sdp::set_negotiated_sdp (const pjmedia_sdp_session *sdp) @@ -518,7 +554,7 @@ AudioCodec* Sdp::get_session_media (void) AudioCodec *codec = NULL; std::vector<sdpMedia*> media_list; - _debug ("Executing sdp line %d - get_session_media ()", __LINE__); + _debug ("SDP: Executing sdp line %d - get_session_media()", __LINE__); media_list = get_session_media_list (); nb_media = media_list.size(); @@ -596,7 +632,7 @@ void Sdp::set_local_media_capabilities (CodecOrder selectedCodecs) { // Clean it first _local_media_cap.clear(); - _debug ("Fetch local media capabilities. Local extern audio port: %i" , get_local_extern_audio_port()); + _debug ("SDP: Fetch local media capabilities. Local extern audio port: %i" , get_local_extern_audio_port()); /* Only one audio media used right now */ audio = new sdpMedia (MIME_TYPE_AUDIO); @@ -612,7 +648,7 @@ void Sdp::set_local_media_capabilities (CodecOrder selectedCodecs) { audio->add_codec (iter->second); } else { - _warn ("Couldn't find audio codec"); + _warn ("SDP: Couldn't find audio codec"); } } diff --git a/sflphone-common/src/sip/sdp.h b/sflphone-common/src/sip/sdp.h index 8c81168adfd7d4ad76befbf5b10450b58f8e9459..b823609f4522457aaadbbab8a5763d42b530a1e3 100644 --- a/sflphone-common/src/sip/sdp.h +++ b/sflphone-common/src/sip/sdp.h @@ -135,10 +135,15 @@ class Sdp { pj_status_t check_sdp_answer(pjsip_inv_session *inv, pjsip_rx_data *rdata); - /* + /** * Remove all media in the session media vector. */ - void clean_session_media(); + void clean_session_media(void); + + /** + * Remove all media in local media capability vector + */ + void clean_local_media_capabilities(void); /* * Return a string description of the media added to the session, diff --git a/sflphone-common/src/sip/sdpmedia.cpp b/sflphone-common/src/sip/sdpmedia.cpp index 4cd5a8b99c7f9b3e99a3134ab3f0b470f660b9e4..eaed9dfda3ee80ca55912baa958bfe9b3d294ce4 100644 --- a/sflphone-common/src/sip/sdpmedia.cpp +++ b/sflphone-common/src/sip/sdpmedia.cpp @@ -75,10 +75,7 @@ sdpMedia::sdpMedia (std::string type, int port, std::string dir) sdpMedia::~sdpMedia() { - int i; - - for (i=0; i< (int) _codec_list.size(); i++) - delete _codec_list[i]; + clear_codec_list(); } @@ -99,7 +96,6 @@ std::string sdpMedia::get_media_type_str (void) void sdpMedia::add_codec (AudioCodec* codec) { - _codec_list.push_back (codec); } diff --git a/sflphone-common/src/sip/sipvoiplink.cpp b/sflphone-common/src/sip/sipvoiplink.cpp index c1e298a957663f82796b51941d7f47d0bb641a90..069e26cb419498f537802eb58534c9311b33c79c 100644 --- a/sflphone-common/src/sip/sipvoiplink.cpp +++ b/sflphone-common/src/sip/sipvoiplink.cpp @@ -289,8 +289,8 @@ void SIPVoIPLink::decrementClients (void) if (_clients == 0) { _debug("UserAgent: No SIP account anymore, terminate SIPVoIPLink"); - terminate(); - SIPVoIPLink::_instance=NULL; + // terminate(); + delete SIPVoIPLink::_instance; } } @@ -321,8 +321,7 @@ SIPVoIPLink::terminate() if (_evThread) { _debug ("UserAgent: Deleting sip eventThread"); - delete _evThread; - _evThread = NULL; + delete _evThread; _evThread = NULL; } @@ -420,6 +419,8 @@ std::string SIPVoIPLink::getInterfaceAddrFromName(std::string ifaceName) { std::string addr(pj_inet_ntoa(*((pj_in_addr*)addr_in))); + close(fd); + return addr; } @@ -2975,7 +2976,6 @@ void call_on_state_changed (pjsip_inv_session *inv, pjsip_event *e) _debug ("UserAgent: Call state changed to %s", invitationStateMap[inv->state]); pjsip_rx_data *rdata; - pj_status_t status = PJ_SUCCESS; /* Retrieve the call information */ SIPCall * call = NULL; @@ -3274,14 +3274,14 @@ void call_on_media_update (pjsip_inv_session *inv, pj_status_t status) AudioCodec* audiocodec = Manager::instance().getCodecDescriptorMap().instantiateCodec(pl); if (audiocodec == NULL) - _error ("SIP: No audiocodec found"); + _error ("UserAgent: No audiocodec found"); try { call->setAudioStart (true); call->getAudioRtp()->start(audiocodec); } catch (exception& rtpException) { - _debug ("%s", rtpException.what()); + _error ("UserAgent: Error: %s", rtpException.what()); } } diff --git a/sippxml/ip2ip_uas_recv_peer_hungup.xml b/sippxml/ip2ip_uas_recv_peer_hungup.xml index 9f2721f5dc71742819d4d39003fc1279b0cd18db..04a964cd1c6900b66af0e563f95054df66b0aff8 100644 --- a/sippxml/ip2ip_uas_recv_peer_hungup.xml +++ b/sippxml/ip2ip_uas_recv_peer_hungup.xml @@ -49,6 +49,9 @@ <recv request="ACK" optional="true" rtd="true" crlf="true"> </recv> + <recv request="INVITE" optional="true"> + </recv> + <recv request="BYE"> </recv> @@ -67,8 +70,6 @@ ]]> </send> - <pause milliseconds="4000"/> - <ResponseTimeRepartition value="10, 20, 30, 40, 50, 100, 150, 200"/> diff --git a/sippxml/testsuiteuac.sh b/sippxml/testsuiteuac.sh index fb6359edf83a3be5a71492adc86d351abd02fdcc..93975593688f3d7d2242bdf7dfe0abb732abe7a5 100644 --- a/sippxml/testsuiteuac.sh +++ b/sippxml/testsuiteuac.sh @@ -251,6 +251,52 @@ function test_ip2ip_send_refused { } +# SCENARIO 6 Test 1 +function test_mult_ip2ip_send_hangup { + + # start sflphoned + # /usr/lib/sflphone/sflphoned& + + # start sipp server to receive calls from sflphone + sipp -sf ip2ip_uac_send_hangup.xml 127.0.0.1:5060 -i 127.0.0.1 -p 5062 -l 1 -m 10 + sipp -sf ip2ip_uac_send_hangup.xml 127.0.0.1:5060 -i 127.0.0.1 -p 5064 -l 1 -m 10 + sipp -sf ip2ip_uac_send_hangup.xml 127.0.0.1:5060 -i 127.0.0.1 -p 5066 -l 1 -m 10 + # sipp -sf ip2ip_uac_send_hangup.xml ${REMOTEADDR_lo} -i ${LOCALIP_lo} -p ${LOCALPORT} -l 1 -m 10 + + # wait some time to make sure sflphoned is started + # sleep 1; + + # run python client and script to make calls + # python ../tools/pysflphone/pysflphone_testdbus.py & + + # kill every one + # bashtrap +} + + +# SCENARIO 6 Test 2 +function test_mult_ip2ip_recv_peer_hangup { + + # start sflphoned + # /usr/lib/sflphone/sflphoned& + + # start sipp server to receive calls from sflphone + sipp -sf ip2ip_uac_send_hangup.xml 127.0.0.1 -i 127.0.0.1:5060 -p 5062 + sipp -sf ip2ip_uac_send_hangup.xml 127.0.0.1 -i 127.0.0.1:5060 -p 5064 + sipp -sf ip2ip_uac_send_hangup.xml 127.0.0.1 -i 127.0.0.1:5060 -p 5066 + # sipp -sf ip2ip_uas_recv_peer_hungup.xml ${REMOTEADDR_lo} -i ${LOCALIP_lo} -p ${LOCALPORT} + + # wait some time to make sure sflphoned is started + # sleep 1; + + # run python client and script to make calls + # python ../tools/pysflphone/pysflphone_testdbus.py & + + # kill every one + # bashtrap +} + + # function called if CTRL-C detected bashtrap() { @@ -267,7 +313,7 @@ bashtrap() # Test 1: - Send an IP2IP call # - Hangup -# test_ip2ip_send_hangup +test_ip2ip_send_hangup # Test 2: - Send an IP2IP call # - Peer Hangup @@ -299,7 +345,7 @@ bashtrap() # Test 4: - Receive an ACCOUNT call # - Peer Hangup -test_account_recv_peer_hungup +# test_account_recv_peer_hungup @@ -313,7 +359,7 @@ test_account_recv_peer_hungup -# SCENARIO 4: Transfer calls (Account) +# SCENARIO 4: Transfer calls (Account) # Test 1: - Send an IP2IP call # - Transfer this call to another sipp instance @@ -325,4 +371,13 @@ test_account_recv_peer_hungup # Test 1: - Receive a call # - Refuse (hangup without answer) -# test_ip2ip_send_refused \ No newline at end of file +# test_ip2ip_send_refused + + +#SCENARIO 6: Multiple simultaneous Call + +# Test 1: - +# test_mult_ip2ip_send_hangup + +# Test 2: - +# test_mult_ip2ip_recv_peer_hangup \ No newline at end of file diff --git a/tools/pysflphone/pysflphone_testdbus.py b/tools/pysflphone/pysflphone_testdbus.py index 035b20a27fbe71639aabe999fe4abf59f00eea8f..991435e1ad484cb436c6c42d7bdc40ecae20a5eb 100644 --- a/tools/pysflphone/pysflphone_testdbus.py +++ b/tools/pysflphone/pysflphone_testdbus.py @@ -15,6 +15,8 @@ from sflphonectrlsimple import SflPhoneCtrlSimple # Define remote IP address constant REMOTEADDR_lo="127.0.0.1:5062" +REMOTEADDR_lo2="127.0.0.1:5064" +REMOTEADDR_lo3="127.0.0.1:5066" # Defines phone numbers PHONE1="27182" @@ -95,7 +97,7 @@ class SflPhoneTests(): def test_ip2ip_send_hangup(self): """Make a call to a server (sipp) on port 5062""" i = 0 - while(i < 10): + while(i < 200): callid = self.sflphone.Call("sip:test@" + REMOTEADDR_lo) time.sleep(0.5) @@ -105,6 +107,7 @@ class SflPhoneTests(): i = i+1 + self.sflphone.unregister() del self.sflphone @@ -249,6 +252,48 @@ class SflPhoneTests(): self.sflphone.start() + # SCENARIO 6 Test 1 + def test_mult_ip2ip_send_hangup(self): + """Make a first call to a sipp server (5062) and a second to sipp server (5064)""" + i = 0 + while(i < 500): + + callid1 = self.sflphone.Call("sip:test@" + REMOTEADDR_lo) + time.sleep(0.1) + + callid2 = self.sflphone.Call("sip:test@" + REMOTEADDR_lo2) + time.sleep(0.1) + + callid3 = self.sflphone.Call("sip:test@" + REMOTEADDR_lo3) + time.sleep(0.1) + + self.sflphone.HangUp(callid1) + time.sleep(0.1) + + self.sflphone.HangUp(callid2) + time.sleep(0.1) + + self.sflphone.HangUp(callid3) + time.sleep(0.1) + + i = i+1 + + del self.sflphone + + + # SCENARIO 6 Test 2 + def test_mult_ip2ip_send_hangup(self): + """Receive multiple calls peer hangup""" + + # Add callback for this test + self.sflphone.onIncomingCall_cb = acceptOnIncomingCall + + # Start Glib mainloop + self.sflphone.start() + + del self.sflphone + + # Open sflphone and connect to sflphoned through dbus sflphone = SflPhoneCtrlSimple(True) @@ -268,7 +313,7 @@ sflphone.setFirstRegisteredAccount(); # Test 1: - Send an IP2IP call # - Hangup -# testsuite.test_ip2ip_send_hangup() +testsuite.test_ip2ip_send_hangup() # Test 2: - Send an IP2IP call # - Peer Hangup @@ -300,7 +345,7 @@ sflphone.setFirstRegisteredAccount(); # Test 4: - Receive an ACCOUNT call # - Peer Hangup -testsuite.test_account_recv_peer_hungup() +# testsuite.test_account_recv_peer_hungup() @@ -328,3 +373,15 @@ testsuite.test_account_recv_peer_hungup() # Test 1: - Receive an incoming call # - Hangup without answer # testsuite.test_ip2ip_recv_refuse() + + + +# SCENARIO 6: Multiple simultaneous calls + +# Test 1: - Send multiple simultaneous IP2IP call +# - Hangup +# testsuite.test_mult_ip2ip_send_hangup() + +# Test 2: - Receive simultaneous IP2IP call +# - Hangup +# testsuite.test_mult_ip2ip_send_hangup() diff --git a/tools/pysflphone/sflphonectrlsimple.py b/tools/pysflphone/sflphonectrlsimple.py index 491e105e8256fb6314c80b95b081fb0d5c7f75fc..fdf6772e3ff010258eee72dd7f2ac3200ef60fbd 100755 --- a/tools/pysflphone/sflphonectrlsimple.py +++ b/tools/pysflphone/sflphonectrlsimple.py @@ -136,6 +136,8 @@ class SflPhoneCtrlSimple(Thread): def unregister(self): + print "Unregister" + if not self.registered: return #raise SflPhoneError("Not registered !")