diff options
Diffstat (limited to 'tinySIP/src/sigcomp/tsip_sigcomp.c')
-rwxr-xr-x | tinySIP/src/sigcomp/tsip_sigcomp.c | 652 |
1 files changed, 324 insertions, 328 deletions
diff --git a/tinySIP/src/sigcomp/tsip_sigcomp.c b/tinySIP/src/sigcomp/tsip_sigcomp.c index 8935cb9..ec1a771 100755 --- a/tinySIP/src/sigcomp/tsip_sigcomp.c +++ b/tinySIP/src/sigcomp/tsip_sigcomp.c @@ -2,19 +2,19 @@ * Copyright (C) 2010-2011 Mamadou Diop. * * Contact: Mamadou Diop <diopmamadou(at)doubango[dot]org> -* +* * This file is part of Open Source Doubango Framework. * * DOUBANGO is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. -* +* * DOUBANGO is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. -* +* * You should have received a copy of the GNU General Public License * along with DOUBANGO. * @@ -29,7 +29,7 @@ */ #include "tinysip/sigcomp/tsip_sigcomp.h" -#include "tcomp_manager.h" +#include "tcomp_manager.h" #include "tsk_safeobj.h" #include "tsk_memory.h" @@ -40,31 +40,29 @@ #include <string.h> /* used by tsk_string.h macros */ /** SigComp compartment */ -typedef struct tsip_sigcomp_compartment_s -{ - TSK_DECLARE_OBJECT; - - char* id; - uint64_t stream_id; - tcomp_result_t *decomp_result; - - /* tinySigComp library is thread-safe but I prefer to add this - * tcomp_manager_provideCompartmentId() is unsafe */ - TSK_DECLARE_SAFEOBJ; +typedef struct tsip_sigcomp_compartment_s { + TSK_DECLARE_OBJECT; + + char* id; + uint64_t stream_id; + tcomp_result_t *decomp_result; + + /* tinySigComp library is thread-safe but I prefer to add this + * tcomp_manager_provideCompartmentId() is unsafe */ + TSK_DECLARE_SAFEOBJ; } tsip_sigcomp_compartment_t; const tsk_object_def_t *tsip_sigcomp_compartment_def_t; typedef tsk_list_t tsip_sigcomp_compartments_L_t; /** SigComp handler */ -typedef struct tsip_sigcomp_s -{ - TSK_DECLARE_OBJECT; +typedef struct tsip_sigcomp_s { + TSK_DECLARE_OBJECT; - tcomp_manager_handle_t *manager; - tsip_sigcomp_compartments_L_t* compartments; + tcomp_manager_handle_t *manager; + tsip_sigcomp_compartments_L_t* compartments; - TSK_DECLARE_SAFEOBJ; + TSK_DECLARE_SAFEOBJ; } tsip_sigcomp_t; const tsk_object_def_t *tsip_sigcomp_def_t; @@ -72,11 +70,11 @@ const tsk_object_def_t *tsip_sigcomp_def_t; /*== Predicate function to find a compartment by id */ static int pred_find_compartment_by_id(const tsk_list_item_t *item, const void *id) { - if(item && item->data){ - tsip_sigcomp_compartment_t *compartment = item->data; - return tsk_strcmp(compartment->id, (const char*)id); - } - return -1; + if(item && item->data) { + tsip_sigcomp_compartment_t *compartment = item->data; + return tsk_strcmp(compartment->id, (const char*)id); + } + return -1; } /** Creates new SigComp handler @@ -87,26 +85,26 @@ static int pred_find_compartment_by_id(const tsk_list_item_t *item, const void * */ tsip_sigcomp_handle_t* tsip_sigcomp_handler_create(uint8_t cpb, uint32_t dms, uint32_t sms) { - tsip_sigcomp_t* sigcomp = tsk_object_new(tsip_sigcomp_def_t); - - /* create SigComp handler */ - if(!sigcomp){ - TSK_DEBUG_ERROR("Failed to create new SigComp handler"); - return tsk_null; - } - - /* create SigComp manager */ - if(!(sigcomp->manager = tcomp_manager_create()) || !(sigcomp->compartments = tsk_list_create())){ - TSK_DEBUG_ERROR("Failed to create new SigComp manager"); - TSK_OBJECT_SAFE_FREE(sigcomp); - return tsk_null; - } - - tcomp_manager_setCycles_Per_Bit(sigcomp->manager, cpb); - tcomp_manager_setDecompression_Memory_Size(sigcomp->manager, dms); - tcomp_manager_setState_Memory_Size(sigcomp->manager, sms); - - return sigcomp; + tsip_sigcomp_t* sigcomp = tsk_object_new(tsip_sigcomp_def_t); + + /* create SigComp handler */ + if(!sigcomp) { + TSK_DEBUG_ERROR("Failed to create new SigComp handler"); + return tsk_null; + } + + /* create SigComp manager */ + if(!(sigcomp->manager = tcomp_manager_create()) || !(sigcomp->compartments = tsk_list_create())) { + TSK_DEBUG_ERROR("Failed to create new SigComp manager"); + TSK_OBJECT_SAFE_FREE(sigcomp); + return tsk_null; + } + + tcomp_manager_setCycles_Per_Bit(sigcomp->manager, cpb); + tcomp_manager_setDecompression_Memory_Size(sigcomp->manager, dms); + tcomp_manager_setState_Memory_Size(sigcomp->manager, sms); + + return sigcomp; } /** Creates new SigComp handler * Adds/Removes dictionaries. These dictionaries will be used both for compression and decompression. @@ -119,36 +117,36 @@ tsip_sigcomp_handle_t* tsip_sigcomp_handler_create(uint8_t cpb, uint32_t dms, ui */ int tsip_sigcomp_handler_set_dicts(tsip_sigcomp_handle_t* self, tsk_bool_t sip_n_sdp, tsk_bool_t pres) { - tsip_sigcomp_t* sigcomp = self; - - if(!sigcomp || !sigcomp->manager){ - TSK_DEBUG_ERROR("Invalid parameter"); - return -1; - } - - tsk_safeobj_lock(sigcomp); - - /* SIP/SDP (RFC 3485) */ - if(sip_n_sdp){ - tcomp_manager_addSipSdpDictionary(sigcomp->manager); - } - else{ - // FIXME: To be implemented in tinySigComp - /* tcomp_manager_removeSipSdpDictionary(sigcomp->manager); */ - } - - /* SIP/SDP (RFC 5112) */ - if(pres){ - tcomp_manager_addPresenceDictionary(sigcomp->manager); - } - else{ - // FIXME: To be implemented in tinySigComp - /* tcomp_manager_removePresenceDictionary(sigcomp->manager); */ - } - - tsk_safeobj_unlock(sigcomp); - - return 0; + tsip_sigcomp_t* sigcomp = self; + + if(!sigcomp || !sigcomp->manager) { + TSK_DEBUG_ERROR("Invalid parameter"); + return -1; + } + + tsk_safeobj_lock(sigcomp); + + /* SIP/SDP (RFC 3485) */ + if(sip_n_sdp) { + tcomp_manager_addSipSdpDictionary(sigcomp->manager); + } + else { + // FIXME: To be implemented in tinySigComp + /* tcomp_manager_removeSipSdpDictionary(sigcomp->manager); */ + } + + /* SIP/SDP (RFC 5112) */ + if(pres) { + tcomp_manager_addPresenceDictionary(sigcomp->manager); + } + else { + // FIXME: To be implemented in tinySigComp + /* tcomp_manager_removePresenceDictionary(sigcomp->manager); */ + } + + tsk_safeobj_unlock(sigcomp); + + return 0; } /** Adds new SigComp compartement to the handler @@ -158,42 +156,42 @@ int tsip_sigcomp_handler_set_dicts(tsip_sigcomp_handle_t* self, tsk_bool_t sip_n */ int tsip_sigcomp_handler_add_compartment(tsip_sigcomp_handle_t* self, const char* comp_id) { - tsip_sigcomp_compartment_t* compartment; - tsip_sigcomp_t* sigcomp = self; - int ret = -1; - - if(!sigcomp || !comp_id){ - TSK_DEBUG_ERROR("Invalid parameter"); - return -1; - } - - tsk_safeobj_lock(sigcomp); - - /* check if we already have a compartment with the same id */ - if(tsk_list_find_object_by_pred(sigcomp->compartments, pred_find_compartment_by_id, comp_id)){ - TSK_DEBUG_ERROR("Failed to add new SigComp compartment. %s already exist.", comp_id); - ret = -2; - goto bail; - } - - if((compartment = tsk_object_new(tsip_sigcomp_compartment_def_t))){ - compartment->id = tsk_strdup(comp_id); - tcomp_result_setCompartmentId(compartment->decomp_result, compartment->id, tsk_strlen(compartment->id)); - - tsk_list_push_back_data(sigcomp->compartments, (void**)&compartment); - ret = 0; - goto bail; - } - else{ - TSK_DEBUG_ERROR("Failed to create new SigComp compartment"); - ret = -3; - goto bail; - } + tsip_sigcomp_compartment_t* compartment; + tsip_sigcomp_t* sigcomp = self; + int ret = -1; + + if(!sigcomp || !comp_id) { + TSK_DEBUG_ERROR("Invalid parameter"); + return -1; + } + + tsk_safeobj_lock(sigcomp); + + /* check if we already have a compartment with the same id */ + if(tsk_list_find_object_by_pred(sigcomp->compartments, pred_find_compartment_by_id, comp_id)) { + TSK_DEBUG_ERROR("Failed to add new SigComp compartment. %s already exist.", comp_id); + ret = -2; + goto bail; + } + + if((compartment = tsk_object_new(tsip_sigcomp_compartment_def_t))) { + compartment->id = tsk_strdup(comp_id); + tcomp_result_setCompartmentId(compartment->decomp_result, compartment->id, tsk_strlen(compartment->id)); + + tsk_list_push_back_data(sigcomp->compartments, (void**)&compartment); + ret = 0; + goto bail; + } + else { + TSK_DEBUG_ERROR("Failed to create new SigComp compartment"); + ret = -3; + goto bail; + } bail: - tsk_safeobj_unlock(sigcomp); + tsk_safeobj_unlock(sigcomp); - return ret; + return ret; } /** Removes a SigComp compartement from the handler @@ -203,37 +201,37 @@ bail: */ int tsip_sigcomp_handler_remove_compartment(tsip_sigcomp_handle_t* self, const char* comp_id) { - tsip_sigcomp_t* sigcomp = self; + tsip_sigcomp_t* sigcomp = self; - if(!sigcomp || !comp_id){ - TSK_DEBUG_ERROR("Invalid parameter"); - return -1; - } + if(!sigcomp || !comp_id) { + TSK_DEBUG_ERROR("Invalid parameter"); + return -1; + } - tsk_safeobj_lock(sigcomp); - tsk_list_remove_item_by_pred(sigcomp->compartments, pred_find_compartment_by_id, comp_id); - tsk_safeobj_unlock(sigcomp); + tsk_safeobj_lock(sigcomp); + tsk_list_remove_item_by_pred(sigcomp->compartments, pred_find_compartment_by_id, comp_id); + tsk_safeobj_unlock(sigcomp); - return 0; + return 0; } // FIXME const char* tsip_sigcomp_handler_fixme_getcompid(const tsip_sigcomp_handle_t* self) { - const tsip_sigcomp_t* sigcomp = self; - const char* comp_id = tsk_null; - - if(!sigcomp){ - TSK_DEBUG_ERROR("Invalid parameter"); - return tsk_null; - } - - tsk_safeobj_lock(sigcomp); - if(!TSK_LIST_IS_EMPTY(sigcomp->compartments)){ - comp_id = ((tsip_sigcomp_compartment_t*)TSK_LIST_FIRST_DATA(sigcomp->compartments))->id; - } - tsk_safeobj_unlock(sigcomp); - return comp_id; + const tsip_sigcomp_t* sigcomp = self; + const char* comp_id = tsk_null; + + if(!sigcomp) { + TSK_DEBUG_ERROR("Invalid parameter"); + return tsk_null; + } + + tsk_safeobj_lock(sigcomp); + if(!TSK_LIST_IS_EMPTY(sigcomp->compartments)) { + comp_id = ((tsip_sigcomp_compartment_t*)TSK_LIST_FIRST_DATA(sigcomp->compartments))->id; + } + tsk_safeobj_unlock(sigcomp); + return comp_id; } /** Close all SigComp compartments @@ -241,24 +239,24 @@ const char* tsip_sigcomp_handler_fixme_getcompid(const tsip_sigcomp_handle_t* se */ int tsip_sigcomp_close_all(tsip_sigcomp_handle_t* self) { - tsip_sigcomp_t* sigcomp = self; - const tsk_list_item_t* item; - const char* comp_id; + tsip_sigcomp_t* sigcomp = self; + const tsk_list_item_t* item; + const char* comp_id; - if(!sigcomp){ - return -1; - } + if(!sigcomp) { + return -1; + } - tsk_safeobj_lock(sigcomp); + tsk_safeobj_lock(sigcomp); - tsk_list_foreach(item, sigcomp->compartments){ - comp_id = ((tsip_sigcomp_compartment_t*)item->data)->id; - tcomp_manager_closeCompartment(sigcomp->manager, comp_id, tsk_strlen(comp_id)); - } + tsk_list_foreach(item, sigcomp->compartments) { + comp_id = ((tsip_sigcomp_compartment_t*)item->data)->id; + tcomp_manager_closeCompartment(sigcomp->manager, comp_id, tsk_strlen(comp_id)); + } - tsk_safeobj_unlock(sigcomp); + tsk_safeobj_unlock(sigcomp); - return 0; + return 0; } /** Compress a Sip message @@ -275,33 +273,33 @@ int tsip_sigcomp_close_all(tsip_sigcomp_handle_t* self) */ tsk_size_t tsip_sigcomp_handler_compress(tsip_sigcomp_handle_t* self, const char* comp_id, tsk_bool_t is_stream, const void* in_data, tsk_size_t in_size, void* out_data, tsk_size_t out_maxsize) { - tsk_size_t out_size = 0; - tsip_sigcomp_compartment_t* compartment; - tsip_sigcomp_t* sigcomp = self; - - if(!sigcomp || !in_data || !in_size || !out_data || !out_maxsize){ - TSK_DEBUG_ERROR("Invalid parameter"); - return 0; - } - - /* find the compartment */ - if(!(compartment = (tsip_sigcomp_compartment_t*)tsk_list_find_object_by_pred(sigcomp->compartments, pred_find_compartment_by_id, comp_id))){ - TSK_DEBUG_ERROR("%s not a valid compartment Id", comp_id); - return 0; - } - - /* take ownership and lock() */ - compartment = tsk_object_ref(compartment); /* take ownership instead of locking the handler(which will lock all compartments) */ - tsk_safeobj_lock(compartment); - - /* compress the message */ - out_size = tcomp_manager_compress(sigcomp->manager, compartment->id, tsk_strlen(compartment->id), in_data, in_size, out_data, out_maxsize, is_stream); - - /* release ownership and unlock() */ - tsk_safeobj_unlock(compartment); - tsk_object_unref(compartment); - - return out_size; + tsk_size_t out_size = 0; + tsip_sigcomp_compartment_t* compartment; + tsip_sigcomp_t* sigcomp = self; + + if(!sigcomp || !in_data || !in_size || !out_data || !out_maxsize) { + TSK_DEBUG_ERROR("Invalid parameter"); + return 0; + } + + /* find the compartment */ + if(!(compartment = (tsip_sigcomp_compartment_t*)tsk_list_find_object_by_pred(sigcomp->compartments, pred_find_compartment_by_id, comp_id))) { + TSK_DEBUG_ERROR("%s not a valid compartment Id", comp_id); + return 0; + } + + /* take ownership and lock() */ + compartment = tsk_object_ref(compartment); /* take ownership instead of locking the handler(which will lock all compartments) */ + tsk_safeobj_lock(compartment); + + /* compress the message */ + out_size = tcomp_manager_compress(sigcomp->manager, compartment->id, tsk_strlen(compartment->id), in_data, in_size, out_data, out_maxsize, is_stream); + + /* release ownership and unlock() */ + tsk_safeobj_unlock(compartment); + tsk_object_unref(compartment); + + return out_size; } /** UnCompress a SigComp message @@ -318,57 +316,57 @@ tsk_size_t tsip_sigcomp_handler_compress(tsip_sigcomp_handle_t* self, const char */ tsk_size_t tsip_sigcomp_handler_uncompress(tsip_sigcomp_handle_t* self, const char* comp_id, tsk_bool_t is_stream, const void* in_data, tsk_size_t in_size, void* out_data, tsk_size_t out_maxsize, tsk_bool_t* is_nack) { - tsk_size_t out_size = 0; - tsip_sigcomp_compartment_t* compartment; - tsip_sigcomp_t* sigcomp = self; - - if(!sigcomp || !in_data || !in_size || !out_data || !out_maxsize || !is_nack){ - TSK_DEBUG_ERROR("Invalid parameter"); - return 0; - } - - /* find the compartment */ - if(!(compartment = (tsip_sigcomp_compartment_t*)tsk_list_find_object_by_pred(sigcomp->compartments, pred_find_compartment_by_id, comp_id))){ - TSK_DEBUG_ERROR("%s not a valid compartment Id", comp_id); - return 0; - } - - *is_nack = tsk_false; - - /* take ownership and lock() */ - compartment = tsk_object_ref(compartment); /* take ownership instead of locking the handler(which will lock all compartments) */ - tsk_safeobj_lock(compartment); - - /* uncompress the message */ - tcomp_result_setOutputBuffer(compartment->decomp_result, out_data, out_maxsize, is_stream, compartment->stream_id); // set the output buffer where to copy uncompressed message - out_size = tcomp_manager_decompress(sigcomp->manager, in_data, in_size, compartment->decomp_result); - if(out_size){ - // provide the compartment id --> save temp states - tcomp_manager_provideCompartmentId(sigcomp->manager, compartment->decomp_result); - } - else{ - if((*is_nack = compartment->decomp_result->isNack)){ - tsk_size_t nack_info_size; - if(compartment->decomp_result->nack_info && (nack_info_size = tcomp_buffer_getSize(compartment->decomp_result->nack_info))){ - out_size = (nack_info_size > out_maxsize) ? out_maxsize : nack_info_size; - memcpy(out_data, tcomp_buffer_getBuffer(compartment->decomp_result->nack_info), out_size); - TSK_DEBUG_INFO("We got a NACK to send()"); - } - else{ - TSK_DEBUG_INFO("We got a NACK from the remote party"); - } - } - else{ - /* Should never happen */ - TSK_DEBUG_ERROR("SigComp decompression failed"); - } - } - - /* release ownership and unlock() */ - tsk_safeobj_unlock(compartment); - tsk_object_unref(compartment); - - return out_size; + tsk_size_t out_size = 0; + tsip_sigcomp_compartment_t* compartment; + tsip_sigcomp_t* sigcomp = self; + + if(!sigcomp || !in_data || !in_size || !out_data || !out_maxsize || !is_nack) { + TSK_DEBUG_ERROR("Invalid parameter"); + return 0; + } + + /* find the compartment */ + if(!(compartment = (tsip_sigcomp_compartment_t*)tsk_list_find_object_by_pred(sigcomp->compartments, pred_find_compartment_by_id, comp_id))) { + TSK_DEBUG_ERROR("%s not a valid compartment Id", comp_id); + return 0; + } + + *is_nack = tsk_false; + + /* take ownership and lock() */ + compartment = tsk_object_ref(compartment); /* take ownership instead of locking the handler(which will lock all compartments) */ + tsk_safeobj_lock(compartment); + + /* uncompress the message */ + tcomp_result_setOutputBuffer(compartment->decomp_result, out_data, out_maxsize, is_stream, compartment->stream_id); // set the output buffer where to copy uncompressed message + out_size = tcomp_manager_decompress(sigcomp->manager, in_data, in_size, compartment->decomp_result); + if(out_size) { + // provide the compartment id --> save temp states + tcomp_manager_provideCompartmentId(sigcomp->manager, compartment->decomp_result); + } + else { + if((*is_nack = compartment->decomp_result->isNack)) { + tsk_size_t nack_info_size; + if(compartment->decomp_result->nack_info && (nack_info_size = tcomp_buffer_getSize(compartment->decomp_result->nack_info))) { + out_size = (nack_info_size > out_maxsize) ? out_maxsize : nack_info_size; + memcpy(out_data, tcomp_buffer_getBuffer(compartment->decomp_result->nack_info), out_size); + TSK_DEBUG_INFO("We got a NACK to send()"); + } + else { + TSK_DEBUG_INFO("We got a NACK from the remote party"); + } + } + else { + /* Should never happen */ + TSK_DEBUG_ERROR("SigComp decompression failed"); + } + } + + /* release ownership and unlock() */ + tsk_safeobj_unlock(compartment); + tsk_object_unref(compartment); + + return out_size; } /** Try to unCompress the next stream chunck. Must only be used with stream compartments. @@ -384,55 +382,55 @@ tsk_size_t tsip_sigcomp_handler_uncompress(tsip_sigcomp_handle_t* self, const ch */ tsk_size_t tsip_sigcomp_handler_uncompress_next(tsip_sigcomp_handle_t* self, const char* comp_id, void** nack_data, tsk_bool_t* is_nack) { - tsk_size_t out_size = 0; - tsip_sigcomp_compartment_t* compartment; - tsip_sigcomp_t* sigcomp = self; - - if(!sigcomp || !is_nack || !nack_data){ - TSK_DEBUG_ERROR("Invalid parameter"); - return 0; - } - - /* find the compartment */ - if(!(compartment = (tsip_sigcomp_compartment_t*)tsk_list_find_object_by_pred(sigcomp->compartments, pred_find_compartment_by_id, comp_id))){ - TSK_DEBUG_ERROR("%s not a valid compartment Id", comp_id); - return 0; - } - - /* take ownership and lock() */ - compartment = tsk_object_ref(compartment); /* take ownership instead of locking the handler(which will lock all compartments) */ - tsk_safeobj_lock(compartment); - - /* uncompress the next chunk - * the returned size the the total size which includes previous chuncks uncompressed - * using tsip_sigcomp_handler_uncompress() - */ - out_size = tcomp_manager_getNextStreamMessage(sigcomp->manager, compartment->decomp_result); - - if(out_size){ - // provide the compartment id --> save temp states - tcomp_manager_provideCompartmentId(sigcomp->manager, compartment->decomp_result); - } - else{ - if((*is_nack = compartment->decomp_result->isNack)){ - tsk_size_t nack_info_size; - if(compartment->decomp_result->nack_info && (nack_info_size = tcomp_buffer_getSize(compartment->decomp_result->nack_info))){ - if((*nack_data = tsk_calloc(nack_info_size, sizeof(uint8_t)))){ - memcpy(*nack_data, tcomp_buffer_getBuffer(compartment->decomp_result->nack_info), nack_info_size); - } - TSK_DEBUG_INFO("We got a NACK to send()"); - } - else{ - TSK_DEBUG_INFO("We got a NACK from the remote party"); - } - } - } - - /* release ownership and unlock() */ - tsk_safeobj_unlock(compartment); - tsk_object_unref(compartment); - - return out_size; + tsk_size_t out_size = 0; + tsip_sigcomp_compartment_t* compartment; + tsip_sigcomp_t* sigcomp = self; + + if(!sigcomp || !is_nack || !nack_data) { + TSK_DEBUG_ERROR("Invalid parameter"); + return 0; + } + + /* find the compartment */ + if(!(compartment = (tsip_sigcomp_compartment_t*)tsk_list_find_object_by_pred(sigcomp->compartments, pred_find_compartment_by_id, comp_id))) { + TSK_DEBUG_ERROR("%s not a valid compartment Id", comp_id); + return 0; + } + + /* take ownership and lock() */ + compartment = tsk_object_ref(compartment); /* take ownership instead of locking the handler(which will lock all compartments) */ + tsk_safeobj_lock(compartment); + + /* uncompress the next chunk + * the returned size the the total size which includes previous chuncks uncompressed + * using tsip_sigcomp_handler_uncompress() + */ + out_size = tcomp_manager_getNextStreamMessage(sigcomp->manager, compartment->decomp_result); + + if(out_size) { + // provide the compartment id --> save temp states + tcomp_manager_provideCompartmentId(sigcomp->manager, compartment->decomp_result); + } + else { + if((*is_nack = compartment->decomp_result->isNack)) { + tsk_size_t nack_info_size; + if(compartment->decomp_result->nack_info && (nack_info_size = tcomp_buffer_getSize(compartment->decomp_result->nack_info))) { + if((*nack_data = tsk_calloc(nack_info_size, sizeof(uint8_t)))) { + memcpy(*nack_data, tcomp_buffer_getBuffer(compartment->decomp_result->nack_info), nack_info_size); + } + TSK_DEBUG_INFO("We got a NACK to send()"); + } + else { + TSK_DEBUG_INFO("We got a NACK from the remote party"); + } + } + } + + /* release ownership and unlock() */ + tsk_safeobj_unlock(compartment); + tsk_object_unref(compartment); + + return out_size; } //=========================================================================== @@ -440,37 +438,36 @@ tsk_size_t tsip_sigcomp_handler_uncompress_next(tsip_sigcomp_handle_t* self, con // static tsk_object_t* tsip_sigcomp_ctor(tsk_object_t * self, va_list * app) { - tsip_sigcomp_t *sigcomp = self; - if(sigcomp){ - /* Done by tsip_sigcomp_create() - sigcomp->manager = tcomp_manager_create(); - sigcomp->compartments = tsk_list_create(); - */ - - tsk_safeobj_init(sigcomp); - } - return self; + tsip_sigcomp_t *sigcomp = self; + if(sigcomp) { + /* Done by tsip_sigcomp_create() + sigcomp->manager = tcomp_manager_create(); + sigcomp->compartments = tsk_list_create(); + */ + + tsk_safeobj_init(sigcomp); + } + return self; } static tsk_object_t* tsip_sigcomp_dtor(tsk_object_t * self) -{ - tsip_sigcomp_t *sigcomp = self; - if(sigcomp){ - TSK_OBJECT_SAFE_FREE(sigcomp->manager); - TSK_OBJECT_SAFE_FREE(sigcomp->compartments); +{ + tsip_sigcomp_t *sigcomp = self; + if(sigcomp) { + TSK_OBJECT_SAFE_FREE(sigcomp->manager); + TSK_OBJECT_SAFE_FREE(sigcomp->compartments); - tsk_safeobj_deinit(sigcomp); - } + tsk_safeobj_deinit(sigcomp); + } - return self; + return self; } -static const tsk_object_def_t tsip_sigcomp_def_s = -{ - sizeof(tsip_sigcomp_t), - tsip_sigcomp_ctor, - tsip_sigcomp_dtor, - tsk_null, +static const tsk_object_def_t tsip_sigcomp_def_s = { + sizeof(tsip_sigcomp_t), + tsip_sigcomp_ctor, + tsip_sigcomp_dtor, + tsk_null, }; const tsk_object_def_t *tsip_sigcomp_def_t = &tsip_sigcomp_def_s; @@ -480,48 +477,47 @@ const tsk_object_def_t *tsip_sigcomp_def_t = &tsip_sigcomp_def_s; // static tsk_object_t* tsip_sigcomp_compartment_ctor(tsk_object_t * self, va_list * app) { - static uint64_t __unique_stream_id = 0; - - tsip_sigcomp_compartment_t *compartment = self; - if(compartment){ - compartment->decomp_result = tcomp_result_create(); - compartment->stream_id = ++(__unique_stream_id); - tsk_safeobj_init(compartment); - } - return self; + static uint64_t __unique_stream_id = 0; + + tsip_sigcomp_compartment_t *compartment = self; + if(compartment) { + compartment->decomp_result = tcomp_result_create(); + compartment->stream_id = ++(__unique_stream_id); + tsk_safeobj_init(compartment); + } + return self; } static tsk_object_t* tsip_sigcomp_compartment_dtor(tsk_object_t * self) -{ - tsip_sigcomp_compartment_t *compartment = self; - if(compartment){ - TSK_FREE(compartment->id); - TSK_OBJECT_SAFE_FREE(compartment->decomp_result); +{ + tsip_sigcomp_compartment_t *compartment = self; + if(compartment) { + TSK_FREE(compartment->id); + TSK_OBJECT_SAFE_FREE(compartment->decomp_result); - tsk_safeobj_deinit(compartment); - } + tsk_safeobj_deinit(compartment); + } - return self; + return self; } int tsip_sigcomp_compartment_cmp(const tsk_object_t * _c1, const tsk_object_t * _c2) { - const tsip_sigcomp_compartment_t *c1 = _c1; - const tsip_sigcomp_compartment_t *c2 = _c2; - - if(c1 && c2){ - return tsk_strcmp(c1->id, c2->id); - } - else{ - return (c1 - c2); - } + const tsip_sigcomp_compartment_t *c1 = _c1; + const tsip_sigcomp_compartment_t *c2 = _c2; + + if(c1 && c2) { + return tsk_strcmp(c1->id, c2->id); + } + else { + return (c1 - c2); + } } -static const tsk_object_def_t tsip_sigcomp_compartment_def_s = -{ - sizeof(tsip_sigcomp_compartment_t), - tsip_sigcomp_compartment_ctor, - tsip_sigcomp_compartment_dtor, - tsip_sigcomp_compartment_cmp, +static const tsk_object_def_t tsip_sigcomp_compartment_def_s = { + sizeof(tsip_sigcomp_compartment_t), + tsip_sigcomp_compartment_ctor, + tsip_sigcomp_compartment_dtor, + tsip_sigcomp_compartment_cmp, }; const tsk_object_def_t *tsip_sigcomp_compartment_def_t = &tsip_sigcomp_compartment_def_s; |