From 64037017cc3804d9921bd9780570685871df8f0b Mon Sep 17 00:00:00 2001 From: mannol Date: Tue, 12 May 2015 22:16:00 +0200 Subject: Fix bug --- toxav/msi.c | 6 ++++++ toxav/toxav.c | 19 +++++++++++++++---- toxav/toxav.h | 4 ++-- 3 files changed, 23 insertions(+), 6 deletions(-) diff --git a/toxav/msi.c b/toxav/msi.c index d68e4a9c..65b6c4e4 100644 --- a/toxav/msi.c +++ b/toxav/msi.c @@ -205,6 +205,12 @@ int msi_hangup ( MSICall* call ) MSISession* session = call->session; pthread_mutex_lock(session->mutex); + if ( call->state == msi_CallInactive ) { + LOGGER_ERROR("Call is in invalid state!"); + pthread_mutex_unlock(session->mutex); + return -1; + } + MSIMessage msg; msg_init(&msg, requ_pop); diff --git a/toxav/toxav.c b/toxav/toxav.c index 31629c29..5e32f196 100644 --- a/toxav/toxav.c +++ b/toxav/toxav.c @@ -113,7 +113,7 @@ int callback_capabilites(void* toxav_inst, MSICall* call); bool audio_bit_rate_invalid(uint32_t bit_rate); bool video_bit_rate_invalid(uint32_t bit_rate); -void invoke_call_state(ToxAV* av, uint32_t friend_number, uint32_t state); +bool invoke_call_state(ToxAV* av, uint32_t friend_number, uint32_t state); ToxAVCall* call_new(ToxAV* av, uint32_t friend_number, TOXAV_ERR_CALL* error); ToxAVCall* call_get(ToxAV* av, uint32_t friend_number); ToxAVCall* call_remove(ToxAVCall* call); @@ -998,6 +998,11 @@ int callback_invite(void* toxav_inst, MSICall* call) if (toxav->ccb.first) toxav->ccb.first(toxav, call->friend_number, call->peer_capabilities & msi_CapSAudio, call->peer_capabilities & msi_CapSVideo, toxav->ccb.second); + else { + /* No handler to capture the call request, send failure */ + pthread_mutex_unlock(toxav->mutex); + return -1; + } pthread_mutex_unlock(toxav->mutex); return 0; @@ -1018,12 +1023,15 @@ int callback_start(void* toxav_inst, MSICall* call) if (!call_prepare_transmission(av_call)) { callback_error(toxav_inst, call); - call_remove(av_call); pthread_mutex_unlock(toxav->mutex); return -1; } - invoke_call_state(toxav, call->friend_number, call->peer_capabilities); + if (!invoke_call_state(toxav, call->friend_number, call->peer_capabilities)) { + callback_error(toxav_inst, call); + pthread_mutex_unlock(toxav->mutex); + return -1; + } pthread_mutex_unlock(toxav->mutex); return 0; @@ -1083,10 +1091,13 @@ bool video_bit_rate_invalid(uint32_t bit_rate) return false; } -void invoke_call_state(ToxAV* av, uint32_t friend_number, uint32_t state) +bool invoke_call_state(ToxAV* av, uint32_t friend_number, uint32_t state) { if (av->scb.first) av->scb.first(av, friend_number, state, av->scb.second); + else + return false; + return true; } ToxAVCall* call_new(ToxAV* av, uint32_t friend_number, TOXAV_ERR_CALL* error) diff --git a/toxav/toxav.h b/toxav/toxav.h index 994b3009..b0e7e37d 100644 --- a/toxav/toxav.h +++ b/toxav/toxav.h @@ -190,7 +190,7 @@ bool toxav_answer(ToxAV *av, uint32_t friend_number, uint32_t audio_bit_rate, ui * :: Call state graph * ******************************************************************************/ -typedef enum TOXAV_CALL_STATE { +enum TOXAV_CALL_STATE { /** * The flag that marks that friend is sending audio. */ @@ -218,7 +218,7 @@ typedef enum TOXAV_CALL_STATE { * state will never be triggered in combination with other call states. */ TOXAV_CALL_STATE_ERROR = 32768 -} TOXAV_CALL_STATE; +}; /** * The function type for the `call_state` callback. * -- cgit v1.2.3