From 35189535a7ba0f4bdacd0c3e7b2dc26fa55eb918 Mon Sep 17 00:00:00 2001 From: Ghislain MARY Date: Tue, 18 Nov 2014 16:41:24 +0100 Subject: [PATCH] Convert LinphoneContent from a simple struct to a belle-sip object to ease generation of wrappers. --- build/android/Android.mk | 61 ++++----- build/wp8/LibLinphone.vcxproj | 2 + coreapi/CMakeLists.txt | 2 + coreapi/Makefile.am | 76 ++++++----- coreapi/callbacks.c | 3 +- coreapi/chat.c | 47 ++++--- coreapi/content.c | 205 ++++++++++++++++++++++++++++ coreapi/content.h | 213 ++++++++++++++++++++++++++++++ coreapi/help/filetransfer.c | 21 +-- coreapi/help/notify.c | 4 +- coreapi/info.c | 91 ++----------- coreapi/linphonecore.c | 22 +-- coreapi/linphonecore.h | 30 +---- coreapi/message_storage.c | 27 ++-- coreapi/private.h | 21 ++- coreapi/quality_reporting.c | 18 +-- tester/eventapi_tester.c | 112 ++++++++-------- tester/flexisip_tester.c | 16 ++- tester/message_tester.c | 91 +++++++------ tester/quality_reporting_tester.c | 8 +- 20 files changed, 723 insertions(+), 347 deletions(-) create mode 100644 coreapi/content.c create mode 100644 coreapi/content.h diff --git a/build/android/Android.mk b/build/android/Android.mk index cb4b703f4..adc78454c 100755 --- a/build/android/Android.mk +++ b/build/android/Android.mk @@ -26,50 +26,51 @@ include $(CLEAR_VARS) LOCAL_CPP_EXTENSION := .cc LOCAL_SRC_FILES := \ - linphonecore.c \ - misc.c \ - enum.c \ - presence.c \ - proxy.c \ - friend.c \ - authentication.c \ - lpconfig.c \ - chat.c \ - sipsetup.c \ - siplogin.c \ address.c \ - linphonecore_jni.cc \ + authentication.c \ bellesip_sal/sal_address_impl.c \ bellesip_sal/sal_impl.c \ bellesip_sal/sal_op_call.c \ bellesip_sal/sal_op_call_transfer.c \ + bellesip_sal/sal_op_events.c \ bellesip_sal/sal_op_impl.c \ + bellesip_sal/sal_op_info.c \ bellesip_sal/sal_op_message.c \ bellesip_sal/sal_op_presence.c \ - bellesip_sal/sal_op_registration.c \ bellesip_sal/sal_op_publish.c \ - bellesip_sal/sal_op_info.c \ - bellesip_sal/sal_op_events.c \ + bellesip_sal/sal_op_registration.c \ bellesip_sal/sal_sdp.c \ - sal.c \ - offeranswer.c \ callbacks.c \ - linphonecall.c \ - conference.c \ - ec-calibrator.c \ - linphone_tunnel_config.c \ - message_storage.c \ - info.c \ - event.c \ - xml.c \ - xml2lpc.c \ - lpc2xml.c \ - remote_provisioning.c \ - quality_reporting.c \ call_log.c \ call_params.c \ + chat.c \ + conference.c \ + content.c \ + ec-calibrator.c \ + enum.c \ + event.c \ + friend.c \ + info.c \ + linphonecall.c \ + linphonecore.c \ + linphonecore_jni.cc \ + linphone_tunnel_config.c \ + localplayer.c \ + lpc2xml.c \ + lpconfig.c \ + message_storage.c \ + misc.c \ + offeranswer.c \ player.c \ - localplayer.c + presence.c \ + proxy.c \ + quality_reporting.c \ + remote_provisioning.c \ + sal.c \ + siplogin.c \ + sipsetup.c \ + xml2lpc.c \ + xml.c ifndef LIBLINPHONE_VERSION LIBLINPHONE_VERSION = "Devel" diff --git a/build/wp8/LibLinphone.vcxproj b/build/wp8/LibLinphone.vcxproj index cca41bb87..6a3d8e034 100644 --- a/build/wp8/LibLinphone.vcxproj +++ b/build/wp8/LibLinphone.vcxproj @@ -115,6 +115,7 @@ + @@ -144,6 +145,7 @@ + diff --git a/coreapi/CMakeLists.txt b/coreapi/CMakeLists.txt index 8ed8185ab..2369501c7 100644 --- a/coreapi/CMakeLists.txt +++ b/coreapi/CMakeLists.txt @@ -46,6 +46,7 @@ set(SOURCE_FILES call_params.c chat.c conference.c + content.c ec-calibrator.c enum.c event.c @@ -152,6 +153,7 @@ install(TARGETS linphone set(HEADER_FILES call_log.h call_params.h + content.h event.h linphonecore.h linphonecore_utils.h diff --git a/coreapi/Makefile.am b/coreapi/Makefile.am index 2bb8498d9..f7d163749 100644 --- a/coreapi/Makefile.am +++ b/coreapi/Makefile.am @@ -24,45 +24,61 @@ CLEANFILES=$(GITVERSION_FILE) ## Process this file with automake to produce Makefile.in linphone_includedir=$(includedir)/linphone -linphone_include_HEADERS=linphonecore.h linphonefriend.h linphonepresence.h linphonecore_utils.h lpconfig.h sipsetup.h event.h xml2lpc.h lpc2xml.h linphone_tunnel.h call_log.h call_params.h +linphone_include_HEADERS=\ + call_log.h \ + call_params.h \ + content.h \ + event.h \ + linphonecore.h \ + linphonecore_utils.h \ + linphonefriend.h \ + linphonepresence.h \ + linphone_tunnel.h \ + lpc2xml.h \ + lpconfig.h \ + sipsetup.h \ + xml2lpc.h lib_LTLIBRARIES=liblinphone.la liblinphone_la_SOURCES=\ - linphonecore.c linphonecore.h private.h\ - offeranswer.c offeranswer.h\ - sal.c \ - callbacks.c \ - misc.c \ address.c \ - enum.c enum.h \ - presence.c \ - proxy.c \ - friend.c \ authentication.c \ - lpconfig.c lpconfig.h \ - chat.c \ - linphonecall.c \ - sipsetup.c sipsetup.h \ - siplogin.c \ - lsd.c linphonecore_utils.h \ - ec-calibrator.c \ - conference.c \ - message_storage.c \ - info.c \ - event.c event.h \ - contactprovider.c contactprovider.h contact_providers_priv.h \ - ldap/ldapprovider.c ldap/ldapprovider.h \ - dict.c \ - xml.c \ - xml2lpc.c \ - lpc2xml.c \ - remote_provisioning.c \ - quality_reporting.c quality_reporting.h\ + callbacks.c \ call_log.c \ call_params.c \ - player.c \ + chat.c \ + conference.c \ + contactprovider.c contactprovider.h contact_providers_priv.h \ + content.c \ + dict.c \ + ec-calibrator.c \ + enum.c enum.h \ + event.c event.h \ + friend.c \ + info.c \ + ldap/ldapprovider.c ldap/ldapprovider.h \ + linphonecall.c \ + linphonecore.c linphonecore.h \ + linphonecore_utils.h \ localplayer.c \ + lpc2xml.c \ + lpconfig.c lpconfig.h \ + lsd.c \ + message_storage.c \ + misc.c \ + offeranswer.c offeranswer.h\ + player.c \ + presence.c \ + private.h \ + proxy.c \ + quality_reporting.c quality_reporting.h\ + remote_provisioning.c \ + sal.c \ + siplogin.c \ + sipsetup.c sipsetup.h \ + xml2lpc.c \ + xml.c \ $(GITVERSION_FILE) if BUILD_UPNP diff --git a/coreapi/callbacks.c b/coreapi/callbacks.c index bc58f3c7d..59ce4a9a6 100644 --- a/coreapi/callbacks.c +++ b/coreapi/callbacks.c @@ -1208,14 +1208,13 @@ static void subscribe_response(SalOp *op, SalSubscribeStatus status){ static void notify(SalOp *op, SalSubscribeStatus st, const char *eventname, const SalBody *body){ LinphoneEvent *lev=(LinphoneEvent*)sal_op_get_user_pointer(op); LinphoneCore *lc=(LinphoneCore *)sal_get_user_pointer(sal_op_get_sal(op)); - LinphoneContent content={0}; if (lev==NULL) { /*out of subscribe notify */ lev=linphone_event_new_with_out_of_dialog_op(lc,op,LinphoneSubscriptionOutgoing,eventname); } { - const LinphoneContent *ct=linphone_content_from_sal_body(&content,body); + LinphoneContent *ct=linphone_content_from_sal_body(body); if (ct) linphone_core_notify_notify_received(lc,lev,eventname,ct); } if (st!=SalSubscribeNone){ diff --git a/coreapi/chat.c b/coreapi/chat.c index a6f2a952d..989350544 100644 --- a/coreapi/chat.c +++ b/coreapi/chat.c @@ -96,7 +96,7 @@ static int linphone_chat_message_file_transfer_on_send_body(belle_sip_user_body_ char *buf = (char *)buffer; /* if we've not reach the end of file yet, ask for more data*/ - if (offsetfile_transfer_information->size){ + if (offsetfile_transfer_information)){ /* get data from call back */ linphone_core_notify_file_transfer_send(lc, chatMsg, chatMsg->file_transfer_information, buf, size); } @@ -130,17 +130,17 @@ static void linphone_chat_message_process_response_from_post_file(void *data, co belle_sip_body_handler_t *first_part_bh; /* temporary storage for the Content-disposition header value */ - first_part_header = belle_sip_strdup_printf("form-data; name=\"File\"; filename=\"%s\"", msg->file_transfer_information->name); + first_part_header = belle_sip_strdup_printf("form-data; name=\"File\"; filename=\"%s\"", linphone_content_get_name(msg->file_transfer_information)); /* create a user body handler to take care of the file and add the content disposition and content-type headers */ if (msg->file_transfer_filepath != NULL) { first_part_bh=(belle_sip_body_handler_t *)belle_sip_file_body_handler_new(msg->file_transfer_filepath,NULL,msg); } else { - first_part_bh=(belle_sip_body_handler_t *)belle_sip_user_body_handler_new(msg->file_transfer_information->size,NULL,NULL,linphone_chat_message_file_transfer_on_send_body,msg); + first_part_bh=(belle_sip_body_handler_t *)belle_sip_user_body_handler_new(linphone_content_get_size(msg->file_transfer_information),NULL,NULL,linphone_chat_message_file_transfer_on_send_body,msg); } belle_sip_body_handler_add_header(first_part_bh, belle_sip_header_create("Content-disposition", first_part_header)); belle_sip_free(first_part_header); - belle_sip_body_handler_add_header(first_part_bh, (belle_sip_header_t *)belle_sip_header_content_type_create(msg->file_transfer_information->type, msg->file_transfer_information->subtype)); + belle_sip_body_handler_add_header(first_part_bh, (belle_sip_header_t *)belle_sip_header_content_type_create(linphone_content_get_type(msg->file_transfer_information), linphone_content_get_subtype(msg->file_transfer_information))); /* insert it in a multipart body handler which will manage the boundaries of multipart message */ bh=belle_sip_multipart_body_handler_new(linphone_chat_message_file_transfer_on_progress, msg, first_part_bh); @@ -531,7 +531,7 @@ void linphone_core_message_received(LinphoneCore *lc, SalOp *op, const SalMessag msg = linphone_chat_room_create_message(cr, NULL); /* create a message with empty body */ msg->content_type = ms_strdup(sal_msg->content_type); /* add the content_type "application/vnd.gsma.rcs-ft-http+xml" */ - msg->file_transfer_information = ms_new0(LinphoneContent,1); + msg->file_transfer_information = linphone_content_new(); /* parse the message body to get all informations from it */ xmlMessageBody = xmlParseDoc((const xmlChar *)sal_msg->text); @@ -547,21 +547,27 @@ void linphone_core_message_received(LinphoneCore *lc, SalOp *op, const SalMessag while (cur!=NULL) { if (!xmlStrcmp(cur->name, (const xmlChar *)"file-size")) { xmlChar *fileSizeString = xmlNodeListGetString(xmlMessageBody, cur->xmlChildrenNode, 1); - msg->file_transfer_information->size = strtol((const char*)fileSizeString, NULL, 10); + linphone_content_set_size(msg->file_transfer_information, strtol((const char*)fileSizeString, NULL, 10)); xmlFree(fileSizeString); } if (!xmlStrcmp(cur->name, (const xmlChar *)"file-name")) { - msg->file_transfer_information->name = (char *)xmlNodeListGetString(xmlMessageBody, cur->xmlChildrenNode, 1); + linphone_content_set_name(msg->file_transfer_information, (const char *)xmlNodeListGetString(xmlMessageBody, cur->xmlChildrenNode, 1)); } if (!xmlStrcmp(cur->name, (const xmlChar *)"content-type")) { xmlChar *contentType = xmlNodeListGetString(xmlMessageBody, cur->xmlChildrenNode, 1); int contentTypeIndex = 0; + char *type; + char *subtype; while (contentType[contentTypeIndex]!='/' && contentType[contentTypeIndex]!='\0') { contentTypeIndex++; } - msg->file_transfer_information->type = ms_strndup((char *)contentType, contentTypeIndex); - msg->file_transfer_information->subtype = ms_strdup(((char *)contentType+contentTypeIndex+1)); + type = ms_strndup((char *)contentType, contentTypeIndex); + subtype = ms_strdup(((char *)contentType+contentTypeIndex+1)); + linphone_content_set_type(msg->file_transfer_information, type); + linphone_content_set_subtype(msg->file_transfer_information, subtype); + ms_free(subtype); + ms_free(type); xmlFree(contentType); } if (!xmlStrcmp(cur->name, (const xmlChar *)"data")) { @@ -1024,28 +1030,27 @@ static void on_recv_body(belle_sip_user_body_handler_t *bh, belle_sip_message_t static LinphoneContent* linphone_chat_create_file_transfer_information_from_headers(const belle_sip_message_t* message ){ - LinphoneContent *content = ms_new0(LinphoneContent,1); + LinphoneContent *content = linphone_content_new(); belle_sip_header_content_length_t* content_length_hdr = BELLE_SIP_HEADER_CONTENT_LENGTH(belle_sip_message_get_header(message, "Content-Length")); belle_sip_header_content_type_t* content_type_hdr = BELLE_SIP_HEADER_CONTENT_TYPE(belle_sip_message_get_header(message, "Content-Type")); const char* type = NULL,*subtype = NULL; - content->name = ms_strdup(""); + linphone_content_set_name(content, ""); if( content_type_hdr ){ type = belle_sip_header_content_type_get_type(content_type_hdr); subtype = belle_sip_header_content_type_get_subtype(content_type_hdr); ms_message("Extracted content type %s / %s from header", type?type:"", subtype?subtype:""); - if( type ) content->type = ms_strdup(type); - if( subtype ) content->type = ms_strdup(subtype); + if( type ) linphone_content_set_type(content, type); + if( subtype ) linphone_content_set_subtype(content, subtype); } if( content_length_hdr ){ - content->size = belle_sip_header_content_length_get_content_length(content_length_hdr); - ms_message("Extracted content length %i from header", (int)content->size); + linphone_content_set_size(content, belle_sip_header_content_length_get_content_length(content_length_hdr)); + ms_message("Extracted content length %i from header", (int)linphone_content_get_size(content)); } - return content; } @@ -1063,7 +1068,7 @@ static void linphone_chat_process_response_headers_from_get_file(void *data, con } if( message->file_transfer_information ){ - body_size = message->file_transfer_information->size; + body_size = linphone_content_get_size(message->file_transfer_information); } if (message->file_transfer_filepath == NULL) { @@ -1318,8 +1323,7 @@ static void _linphone_chat_message_destroy(LinphoneChatMessage* msg) { if (msg->custom_headers) sal_custom_header_free(msg->custom_headers); if (msg->content_type) ms_free(msg->content_type); if (msg->file_transfer_information) { - linphone_content_uninit(msg->file_transfer_information); - ms_free(msg->file_transfer_information); + linphone_content_unref(msg->file_transfer_information); } if (msg->file_transfer_filepath != NULL) { ms_free(msg->file_transfer_filepath); @@ -1385,7 +1389,7 @@ const char * linphone_chat_message_get_file_transfer_filepath(LinphoneChatMessag /** * Create a message attached to a dedicated chat room with a particular content. Use #linphone_chat_room_send_message2 to initiate the transfer * @param cr the chat room. - * @param a #LinphoneContent initial content. #LinphoneCoreVTable.file_transfer_send is invoked later to notify file transfer progress and collect next chunk of the message if #LinphoneContent.data is NULL. + * @param initial_content #LinphoneContent initial content. #LinphoneCoreVTable.file_transfer_send is invoked later to notify file transfer progress and collect next chunk of the message if #LinphoneContent.data is NULL. * @return a new #LinphoneChatMessage */ @@ -1393,8 +1397,7 @@ LinphoneChatMessage* linphone_chat_room_create_file_transfer_message(LinphoneCha LinphoneChatMessage* msg = belle_sip_object_new(LinphoneChatMessage); msg->chat_room=(LinphoneChatRoom*)cr; msg->message = NULL; - msg->file_transfer_information = ms_new0(LinphoneContent,1); - linphone_content_copy(msg->file_transfer_information, initial_content); + msg->file_transfer_information = linphone_content_copy(initial_content); msg->dir=LinphoneChatMessageOutgoing; linphone_chat_message_set_to(msg, linphone_chat_room_get_peer_address(cr)); linphone_chat_message_set_from(msg, linphone_address_new(linphone_core_get_identity(cr->lc))); diff --git a/coreapi/content.c b/coreapi/content.c new file mode 100644 index 000000000..944ebb2e0 --- /dev/null +++ b/coreapi/content.c @@ -0,0 +1,205 @@ +/* +linphone +Copyright (C) 2010-2014 Belledonne Communications SARL + +This program 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 2 +of the License, or (at your option) any later version. + +This program 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 this program; if not, write to the Free Software +Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +*/ + +#include "linphonecore.h" +#include "private.h" + + + +static void linphone_content_destroy(LinphoneContent *content) { + if (content->lcp.type) belle_sip_free(content->lcp.type); + if (content->lcp.subtype) belle_sip_free(content->lcp.subtype); + if (content->lcp.data) belle_sip_free(content->lcp.data); + if (content->lcp.encoding) belle_sip_free(content->lcp.encoding); + if (content->lcp.name) belle_sip_free(content->lcp.name); +} + +static void linphone_content_clone(LinphoneContent *obj, const LinphoneContent *ref) { + void *data; + linphone_content_set_type(obj, linphone_content_get_type(ref)); + linphone_content_set_subtype(obj, linphone_content_get_subtype(ref)); + linphone_content_set_encoding(obj, linphone_content_get_encoding(ref)); + linphone_content_set_name(obj, linphone_content_get_name(ref)); + linphone_content_set_size(obj, linphone_content_get_size(ref)); + data = linphone_content_get_data(ref); + if (data != NULL) { + size_t size = linphone_content_get_size(ref); + void *objdata = belle_sip_malloc(size + 1); + memcpy(objdata, data, size); + ((char *)objdata)[size] = '\0'; + linphone_content_set_data(obj, objdata); + } +} + + +BELLE_SIP_DECLARE_NO_IMPLEMENTED_INTERFACES(LinphoneContent); + +BELLE_SIP_INSTANCIATE_VPTR(LinphoneContent, belle_sip_object_t, + (belle_sip_object_destroy_t)linphone_content_destroy, + (belle_sip_object_clone_t)linphone_content_clone, + NULL, // marshal + TRUE +); + + +LinphoneContent * linphone_core_create_content(LinphoneCore *lc) { + return linphone_content_new(); +} + +LinphoneContent * linphone_content_ref(LinphoneContent *content) { + belle_sip_object_ref(content); + return content; +} + +void linphone_content_unref(LinphoneContent *content) { + belle_sip_object_unref(content); +} + +void *linphone_content_get_user_data(const LinphoneContent *content) { + return content->user_data; +} + +void linphone_content_set_user_data(LinphoneContent *content, void *ud) { + content->user_data = ud; +} + +const char * linphone_content_get_type(const LinphoneContent *content) { + return content->lcp.type; +} + +void linphone_content_set_type(LinphoneContent *content, const char *type) { + if (content->lcp.type != NULL) { + belle_sip_free(content->lcp.type); + content->lcp.type = NULL; + } + if (type != NULL) { + content->lcp.type = belle_sip_strdup(type); + } +} + +const char * linphone_content_get_subtype(const LinphoneContent *content) { + return content->lcp.subtype; +} + +void linphone_content_set_subtype(LinphoneContent *content, const char *subtype) { + if (content->lcp.subtype != NULL) { + belle_sip_free(content->lcp.subtype); + content->lcp.subtype = NULL; + } + if (subtype != NULL) { + content->lcp.subtype = belle_sip_strdup(subtype); + } +} + +void * linphone_content_get_data(const LinphoneContent *content) { + return content->lcp.data; +} + +void linphone_content_set_data(LinphoneContent *content, void *data) { + content->lcp.data = data; +} + +size_t linphone_content_get_size(const LinphoneContent *content) { + return content->lcp.size; +} + +void linphone_content_set_size(LinphoneContent *content, size_t size) { + content->lcp.size = size; +} + +const char * linphone_content_get_encoding(const LinphoneContent *content) { + return content->lcp.encoding; +} + +void linphone_content_set_encoding(LinphoneContent *content, const char *encoding) { + if (content->lcp.encoding != NULL) { + belle_sip_free(content->lcp.encoding); + content->lcp.encoding = NULL; + } + if (encoding != NULL) { + content->lcp.encoding = belle_sip_strdup(encoding); + } +} + +const char * linphone_content_get_name(const LinphoneContent *content) { + return content->lcp.name; +} + +void linphone_content_set_name(LinphoneContent *content, const char *name) { + if (content->lcp.name != NULL) { + belle_sip_free(content->lcp.name); + content->lcp.name = NULL; + } + if (name != NULL) { + content->lcp.name = belle_sip_strdup(name); + } +} + + + +LinphoneContent * linphone_content_new(void) { + LinphoneContent *content = belle_sip_object_new(LinphoneContent); + belle_sip_object_ref(content); + return content; +} + +LinphoneContent * linphone_content_copy(const LinphoneContent *ref) { + return (LinphoneContent *)belle_sip_object_ref(belle_sip_object_clone(BELLE_SIP_OBJECT(ref))); +} + +LinphoneContent * linphone_content_from_sal_body(const SalBody *ref) { + if (ref && ref->type) { + void *objdata; + LinphoneContent *content = linphone_content_new(); + linphone_content_set_type(content, ref->type); + linphone_content_set_subtype(content, ref->subtype); + linphone_content_set_encoding(content, ref->encoding); + linphone_content_set_size(content, ref->size); + objdata = belle_sip_malloc(ref->size + 1); + memcpy(objdata, ref->data, ref->size); + ((char *)objdata)[ref->size] = '\0'; + linphone_content_set_data(content, objdata); + return content; + } + return NULL; +} + +SalBody *sal_body_from_content(SalBody *body, const LinphoneContent *content) { + if (content && linphone_content_get_type(content)) { + body->type = linphone_content_get_type(content); + body->subtype = linphone_content_get_subtype(content); + body->data = linphone_content_get_data(content); + body->size = linphone_content_get_size(content); + body->encoding = linphone_content_get_encoding(content); + return body; + } + return NULL; +} + + + +LinphoneContent * linphone_content_private_to_linphone_content(const LinphoneContentPrivate *lcp) { + LinphoneContent *content = belle_sip_object_new(LinphoneContent); + memcpy(&content->lcp, lcp, sizeof(LinphoneContentPrivate)); + return content; +} + +LinphoneContentPrivate * linphone_content_to_linphone_content_private(const LinphoneContent *content) { + return (LinphoneContentPrivate *)&content->lcp; +} diff --git a/coreapi/content.h b/coreapi/content.h new file mode 100644 index 000000000..24f137857 --- /dev/null +++ b/coreapi/content.h @@ -0,0 +1,213 @@ +/* +content.h +Copyright (C) 2010-2014 Belledonne Communications SARL + +This program 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 2 +of the License, or (at your option) any later version. + +This program 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 this program; if not, write to the Free Software +Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +*/ + +#ifndef LINPHONE_CONTENT_H_ +#define LINPHONE_CONTENT_H_ + + +#ifdef __cplusplus +extern "C" { +#endif + + +/** + * @addtogroup misc + * @{ + */ + +/** + * The LinphoneContent object holds data that can be embedded in a signaling message. +**/ +struct _LinphoneContent; +/** + * The LinphoneContent object holds data that can be embedded in a signaling message. +**/ +typedef struct _LinphoneContent LinphoneContent; + +/** + * @deprecated Use LinphoneContent objects instead of this structure. + */ +struct _LinphoneContentPrivate{ + char *type; /**type - , content->subtype + , linphone_content_get_type(content) + , linphone_content_get_subtype(content) ,(linphone_chat_message_is_outgoing(message)?"to":"from") , address); free(address); @@ -131,7 +131,7 @@ static void linphone_file_transfer_state_changed(LinphoneChatMessage* msg,Linpho */ static void message_received(LinphoneCore *lc, LinphoneChatRoom *cr, LinphoneChatMessage *msg) { const LinphoneContent *file_transfer_info = linphone_chat_message_get_file_transfer_information(msg); - printf ("Do you really want to download %s (size %ld)?[Y/n]\nOk, let's go\n", file_transfer_info->name, (long int)file_transfer_info->size); + printf ("Do you really want to download %s (size %ld)?[Y/n]\nOk, let's go\n", linphone_content_get_name(file_transfer_info), (long int)linphone_content_get_size(file_transfer_info)); linphone_chat_message_start_file_download(msg, linphone_file_transfer_state_changed, NULL); @@ -145,7 +145,7 @@ int main(int argc, char *argv[]){ int i; const char* big_file_content="big file"; LinphoneChatRoom* chat_room; - LinphoneContent content; + LinphoneContent* content; LinphoneChatMessage* chat_message; /*seting dummy file content to something*/ @@ -189,14 +189,14 @@ int main(int argc, char *argv[]){ /*Next step is to create a chat room*/ chat_room = linphone_core_create_chat_room(lc,dest_friend); - memset(&content,0,sizeof(content)); - content.type="text"; - content.subtype="plain"; - content.size=sizeof(big_file); /*total size to be transfered*/ - content.name = "bigfile.txt"; + content = linphone_core_create_content(lc); + linphone_content_set_type(content,"text"); + linphone_content_set_subtype(content,"plain"); + linphone_content_set_size(content,sizeof(big_file)); /*total size to be transfered*/ + linphone_content_set_name(content,"bigfile.txt"); /*now create a chat message with custom content*/ - chat_message = linphone_chat_room_create_file_transfer_message(chat_room,&content); + chat_message = linphone_chat_room_create_file_transfer_message(chat_room,content); if (chat_message == NULL) { printf("returned message is null\n"); } @@ -212,6 +212,7 @@ int main(int argc, char *argv[]){ printf("Shutting down...\n"); + linphone_content_unref(content); linphone_chat_room_destroy(chat_room); linphone_core_destroy(lc); printf("Exited\n"); diff --git a/coreapi/help/notify.c b/coreapi/help/notify.c index 27077d92f..bdfae0835 100644 --- a/coreapi/help/notify.c +++ b/coreapi/help/notify.c @@ -152,12 +152,12 @@ int main(int argc, char *argv[]){ ms_usleep(50000); ++i; if (data->ev && i%100==0){ - LinphoneContent content; + LinphoneContentPrivate content; content.type="application"; content.subtype="goodxml"; content.data="really cool"; content.size=strlen((const char*)content.data); - linphone_event_notify(data->ev,&content); + linphone_event_notify(data->ev,LINPHONE_CONTENT(&content)); } } diff --git a/coreapi/info.c b/coreapi/info.c index ad8cd1f8e..6b2eb33fa 100644 --- a/coreapi/info.c +++ b/coreapi/info.c @@ -29,98 +29,23 @@ struct _LinphoneInfoMessage{ - LinphoneContent content; + LinphoneContent *content; SalCustomHeader *headers; }; -#define SET_STRING(ptr,field,val) \ - if (ptr->field) { \ - ms_free(ptr->field); \ - ptr->field=NULL; \ - } \ - if (val){ \ - ptr->field=ms_strdup(val); \ - } - -void linphone_content_copy(LinphoneContent *obj, const LinphoneContent *ref){ - SET_STRING(obj,type,ref->type); - SET_STRING(obj,subtype,ref->subtype); - SET_STRING(obj,encoding,ref->encoding); - SET_STRING(obj,name,ref->name); - if (obj->data) { - ms_free(obj->data); - obj->data=NULL; - } - if (ref->data){ - obj->data=ms_malloc(ref->size+1); - memcpy(obj->data, ref->data, ref->size); - ((char*)obj->data)[ref->size]='\0'; - } - obj->size=ref->size; -} - -void linphone_content_uninit(LinphoneContent * obj){ - if (obj->type) ms_free(obj->type); - if (obj->subtype) ms_free(obj->subtype); - if (obj->data) ms_free(obj->data); - if (obj->encoding) ms_free(obj->encoding); - if (obj->name) ms_free(obj->name); -} - -LinphoneContent *linphone_content_copy_from_sal_body(LinphoneContent *obj, const SalBody *ref){ - SET_STRING(obj,type,ref->type); - SET_STRING(obj,subtype,ref->subtype); - SET_STRING(obj,encoding,ref->encoding); - if (obj->data) { - ms_free(obj->data); - obj->data=NULL; - } - if (ref->data){ - obj->data=ms_malloc(ref->size+1); - memcpy(obj->data, ref->data, ref->size); - ((char*)obj->data)[ref->size]='\0'; - } - obj->size=ref->size; - return obj; -} - -const LinphoneContent *linphone_content_from_sal_body(LinphoneContent *obj, const SalBody *ref){ - if (ref && ref->type){ - obj->type=(char*)ref->type; - obj->subtype=(char*)ref->subtype; - obj->data=(void*)ref->data; - obj->encoding=(char*)ref->encoding; - obj->size=ref->size; - return obj; - } - return NULL; -} - -SalBody *sal_body_from_content(SalBody *body, const LinphoneContent *lc){ - if (lc && lc->type){ - body->type=lc->type; - body->subtype=lc->subtype; - body->data=lc->data; - body->size=lc->size; - body->encoding=lc->encoding; - return body; - } - return NULL; -} - /** * Destroy a LinphoneInfoMessage **/ void linphone_info_message_destroy(LinphoneInfoMessage *im){ - linphone_content_uninit(&im->content); - sal_custom_header_free(im->headers); + if (im->content) linphone_content_unref(im->content); + if (im->headers) sal_custom_header_free(im->headers); ms_free(im); } LinphoneInfoMessage *linphone_info_message_copy(const LinphoneInfoMessage *orig){ LinphoneInfoMessage *im=ms_new0(LinphoneInfoMessage,1); - linphone_content_copy(&im->content,&orig->content); + if (orig->content) im->content=linphone_content_copy(orig->content); if (orig->headers) im->headers=sal_custom_header_clone(orig->headers); return im; } @@ -146,7 +71,7 @@ LinphoneInfoMessage *linphone_core_create_info_message(LinphoneCore *lc){ int linphone_call_send_info_message(LinphoneCall *call, const LinphoneInfoMessage *info){ SalBody body; sal_op_set_sent_custom_header(call->op,info->headers); - return sal_send_info(call->op,NULL, NULL, sal_body_from_content(&body,&info->content)); + return sal_send_info(call->op,NULL, NULL, sal_body_from_content(&body,info->content)); } /** @@ -176,14 +101,14 @@ const char *linphone_info_message_get_header(const LinphoneInfoMessage *im, cons * All fields of the LinphoneContent are copied, thus the application can destroy/modify/recycloe the content object freely ater the function returns. **/ void linphone_info_message_set_content(LinphoneInfoMessage *im, const LinphoneContent *content){ - linphone_content_copy(&im->content,content); + im->content=linphone_content_copy(content); } /** * Returns the info message's content as a #LinphoneContent structure. **/ const LinphoneContent * linphone_info_message_get_content(const LinphoneInfoMessage *im){ - return im->content.type ? &im->content : NULL; + return (im->content && linphone_content_get_type(im->content)) ? im->content : NULL; } void linphone_core_notify_info_message(LinphoneCore* lc,SalOp *op, const SalBody *body){ @@ -191,7 +116,7 @@ void linphone_core_notify_info_message(LinphoneCore* lc,SalOp *op, const SalBody if (call){ LinphoneInfoMessage *info=ms_new0(LinphoneInfoMessage,1); info->headers=sal_custom_header_clone(sal_op_get_recv_custom_header(op)); - if (body) linphone_content_copy_from_sal_body(&info->content,body); + if (body) info->content=linphone_content_from_sal_body(body); linphone_core_notify_info_received(lc,call,info); linphone_info_message_destroy(info); } diff --git a/coreapi/linphonecore.c b/coreapi/linphonecore.c index c36c5894d..3ead49966 100644 --- a/coreapi/linphonecore.c +++ b/coreapi/linphonecore.c @@ -354,7 +354,7 @@ static int log_collection_upload_on_send_body(belle_sip_user_body_handler_t *bh, LinphoneCore *core = (LinphoneCore *)data; /* If we've not reach the end of file yet, fill the buffer with more data */ - if (offset < core->log_collection_upload_information->size) { + if (offset < linphone_content_get_size(core->log_collection_upload_information)) { char *log_filename = ms_strdup_printf("%s/%s_log.%s", liblinphone_log_collection_path ? liblinphone_log_collection_path : LOG_COLLECTION_DEFAULT_PATH, liblinphone_log_collection_prefix ? liblinphone_log_collection_prefix : LOG_COLLECTION_DEFAULT_PREFIX, @@ -410,13 +410,14 @@ static void process_response_from_post_file_log_collection(void *data, const bel linphone_core_notify_log_collection_upload_state_changed(core, LinphoneCoreLogCollectionUploadStateInProgress, NULL); /* Temporary storage for the Content-disposition header value */ - first_part_header = belle_sip_strdup_printf("form-data; name=\"File\"; filename=\"%s\"", core->log_collection_upload_information->name); + first_part_header = belle_sip_strdup_printf("form-data; name=\"File\"; filename=\"%s\"", linphone_content_get_name(core->log_collection_upload_information)); /* Create a user body handler to take care of the file and add the content disposition and content-type headers */ - first_part_bh = belle_sip_user_body_handler_new(core->log_collection_upload_information->size, NULL, NULL, log_collection_upload_on_send_body, core); + first_part_bh = belle_sip_user_body_handler_new(linphone_content_get_size(core->log_collection_upload_information), NULL, NULL, log_collection_upload_on_send_body, core); belle_sip_body_handler_add_header((belle_sip_body_handler_t *)first_part_bh, belle_sip_header_create("Content-disposition", first_part_header)); belle_sip_free(first_part_header); - belle_sip_body_handler_add_header((belle_sip_body_handler_t *)first_part_bh, (belle_sip_header_t *)belle_sip_header_content_type_create(core->log_collection_upload_information->type, core->log_collection_upload_information->subtype)); + belle_sip_body_handler_add_header((belle_sip_body_handler_t *)first_part_bh, + (belle_sip_header_t *)belle_sip_header_content_type_create(linphone_content_get_type(core->log_collection_upload_information), linphone_content_get_subtype(core->log_collection_upload_information))); /* Insert it in a multipart body handler which will manage the boundaries of multipart message */ bh = belle_sip_multipart_body_handler_new(log_collection_upload_on_progress, core, (belle_sip_body_handler_t *)first_part_bh); @@ -553,6 +554,7 @@ void linphone_core_upload_log_collection(LinphoneCore *core) { belle_http_request_listener_t *l; belle_generic_uri_t *uri; belle_http_request_t *req; + char *name; core->log_collection_upload_information = (LinphoneContent *)malloc(sizeof(LinphoneContent)); memset(core->log_collection_upload_information, 0, sizeof(LinphoneContent)); @@ -560,14 +562,15 @@ void linphone_core_upload_log_collection(LinphoneCore *core) { core->log_collection_upload_information->type = "application"; core->log_collection_upload_information->subtype = "gzip"; #else - core->log_collection_upload_information->type = "text"; - core->log_collection_upload_information->subtype = "plain"; + linphone_content_set_type(core->log_collection_upload_information, "text"); + linphone_content_set_subtype(core->log_collection_upload_information,"plain"); #endif - core->log_collection_upload_information->name = ms_strdup_printf("%s_log.%s", + name = ms_strdup_printf("%s_log.%s", liblinphone_log_collection_prefix ? liblinphone_log_collection_prefix : LOG_COLLECTION_DEFAULT_PREFIX, COMPRESSED_LOG_COLLECTION_EXTENSION); - if (prepare_log_collection_file_to_upload(core->log_collection_upload_information->name) < 0) return; - core->log_collection_upload_information->size = get_size_of_file_to_upload(core->log_collection_upload_information->name); + linphone_content_set_name(core->log_collection_upload_information, name); + if (prepare_log_collection_file_to_upload(name) < 0) return; + linphone_content_set_size(core->log_collection_upload_information, get_size_of_file_to_upload(name)); uri = belle_generic_uri_parse(linphone_core_get_log_collection_upload_server_url(core)); req = belle_http_request_create("POST", uri, NULL, NULL, NULL); cbs.process_response = process_response_from_post_file_log_collection; @@ -575,6 +578,7 @@ void linphone_core_upload_log_collection(LinphoneCore *core) { cbs.process_auth_requested = process_auth_requested_upload_log_collection; l = belle_http_request_listener_create_from_callbacks(&cbs, core); belle_http_provider_send_request(core->http_provider, req, l); + ms_free(name); } } diff --git a/coreapi/linphonecore.h b/coreapi/linphonecore.h index 33dd95df2..add43e4a0 100644 --- a/coreapi/linphonecore.h +++ b/coreapi/linphonecore.h @@ -126,26 +126,6 @@ typedef struct SalAddress LinphoneAddress; typedef struct belle_sip_dict LinphoneDictionary; -/** - * The LinphoneContent struct holds data that can be embedded in a signaling message. - * @ingroup misc -**/ -struct _LinphoneContent{ - char *type; /**file_transfer_information) { - linphone_content_uninit(message->file_transfer_information); - ms_free(message->file_transfer_information); + linphone_content_unref(message->file_transfer_information); message->file_transfer_information = NULL; } - message->file_transfer_information = (LinphoneContent *)malloc(sizeof(LinphoneContent)); - memset(message->file_transfer_information, 0, sizeof(*(message->file_transfer_information))); - - message->file_transfer_information->type = argv[1] ? ms_strdup(argv[1]) : NULL; - message->file_transfer_information->subtype = argv[2] ? ms_strdup(argv[2]) : NULL; - message->file_transfer_information->name = argv[3] ? ms_strdup(argv[3]) : NULL; - message->file_transfer_information->encoding = argv[4] ? ms_strdup(argv[4]) : NULL; - message->file_transfer_information->size = (size_t) atoi(argv[5]); + message->file_transfer_information = linphone_content_new(); + if (argv[1]) linphone_content_set_type(message->file_transfer_information, argv[1]); + if (argv[2]) linphone_content_set_subtype(message->file_transfer_information, argv[2]); + if (argv[3]) linphone_content_set_name(message->file_transfer_information, argv[3]); + if (argv[4]) linphone_content_set_encoding(message->file_transfer_information, argv[4]); + linphone_content_set_size(message->file_transfer_information, (size_t)atoi(argv[5])); return 0; } @@ -199,11 +196,11 @@ static int linphone_chat_message_store_content(LinphoneChatMessage *msg) { if (lc->db) { LinphoneContent *content = msg->file_transfer_information; char *buf = sqlite3_mprintf("INSERT INTO content VALUES(NULL,%Q,%Q,%Q,%Q,%i,%Q);", - content->type, - content->subtype, - content->name, - content->encoding, - content->size, + linphone_content_get_type(content), + linphone_content_get_subtype(content), + linphone_content_get_name(content), + linphone_content_get_encoding(content), + linphone_content_get_size(content), NULL ); linphone_sql_request(lc->db, buf); diff --git a/coreapi/private.h b/coreapi/private.h index 0a6270a24..8e1bfaf8a 100644 --- a/coreapi/private.h +++ b/coreapi/private.h @@ -887,10 +887,9 @@ void linphone_configure_op(LinphoneCore *lc, SalOp *op, const LinphoneAddress *d void linphone_call_create_op(LinphoneCall *call); int linphone_call_prepare_ice(LinphoneCall *call, bool_t incoming_offer); void linphone_core_notify_info_message(LinphoneCore* lc,SalOp *op, const SalBody *body); -void linphone_content_uninit(LinphoneContent * obj); -void linphone_content_copy(LinphoneContent *obj, const LinphoneContent *ref); -LinphoneContent *linphone_content_copy_from_sal_body(LinphoneContent *obj, const SalBody *ref); -SalBody *sal_body_from_content(SalBody *body, const LinphoneContent *lc); +LinphoneContent * linphone_content_new(void); +LinphoneContent * linphone_content_copy(const LinphoneContent *ref); +SalBody *sal_body_from_content(SalBody *body, const LinphoneContent *content); SalReason linphone_reason_to_sal(LinphoneReason reason); LinphoneReason linphone_reason_from_sal(SalReason reason); LinphoneEvent *linphone_event_new(LinphoneCore *lc, LinphoneSubscriptionDir dir, const char *name, int expires); @@ -902,9 +901,20 @@ LinphoneEvent *linphone_event_new_with_out_of_dialog_op(LinphoneCore *lc, SalOp void linphone_event_set_state(LinphoneEvent *lev, LinphoneSubscriptionState state); void linphone_event_set_publish_state(LinphoneEvent *lev, LinphonePublishState state); LinphoneSubscriptionState linphone_subscription_state_from_sal(SalSubscribeStatus ss); -const LinphoneContent *linphone_content_from_sal_body(LinphoneContent *obj, const SalBody *ref); +LinphoneContent *linphone_content_from_sal_body(const SalBody *ref); void linphone_core_invalidate_friend_subscriptions(LinphoneCore *lc); + +struct _LinphoneContent { + belle_sip_object_t base; + void *user_data; + struct _LinphoneContentPrivate lcp; +}; + +BELLE_SIP_DECLARE_VPTR(LinphoneContent); + + + /***************************************************************************** * REMOTE PROVISIONING FUNCTIONS * ****************************************************************************/ @@ -986,6 +996,7 @@ BELLE_SIP_TYPE_ID(LinphoneCallLog), BELLE_SIP_TYPE_ID(LinphoneCallParams), BELLE_SIP_TYPE_ID(LinphoneChatMessage), BELLE_SIP_TYPE_ID(LinphoneChatRoom), +BELLE_SIP_TYPE_ID(LinphoneContent), BELLE_SIP_TYPE_ID(LinphoneLDAPContactProvider), BELLE_SIP_TYPE_ID(LinphoneLDAPContactSearch), BELLE_SIP_TYPE_ID(LinphoneProxyConfig) diff --git a/coreapi/quality_reporting.c b/coreapi/quality_reporting.c index 52d88a7a2..1beea886a 100644 --- a/coreapi/quality_reporting.c +++ b/coreapi/quality_reporting.c @@ -257,7 +257,7 @@ static void append_metrics_to_buffer(char ** buffer, size_t * size, size_t * off } static int send_report(LinphoneCall* call, reporting_session_report_t * report, const char * report_event) { - LinphoneContent content = {0}; + LinphoneContent *content = linphone_content_new(); LinphoneAddress *addr; int expires = -1; size_t offset = 0; @@ -294,9 +294,9 @@ static int send_report(LinphoneCall* call, reporting_session_report_t * report, goto end; } - buffer = (char *) ms_malloc(size); - content.type = ms_strdup("application"); - content.subtype = ms_strdup("vq-rtcpxr"); + buffer = (char *) belle_sip_malloc(size); + linphone_content_set_type(content, "application"); + linphone_content_set_subtype(content, "vq-rtcpxr"); append_to_buffer(&buffer, &size, &offset, "%s\r\n", report_event); append_to_buffer(&buffer, &size, &offset, "CallID: %s\r\n", report->info.call_id); @@ -331,17 +331,17 @@ static int send_report(LinphoneCall* call, reporting_session_report_t * report, append_to_buffer(&buffer, &size, &offset, "\r\n"); } - content.data = buffer; - content.size = strlen(buffer); + linphone_content_set_data(content, buffer); + linphone_content_set_size(content, strlen(buffer)); if (call->log->reporting.on_report_sent != NULL){ call->log->reporting.on_report_sent( call, (report==call->log->reporting.reports[0])?LINPHONE_CALL_STATS_AUDIO:LINPHONE_CALL_STATS_VIDEO, - &content); + content); } - if (! linphone_core_publish(call->core, addr, "vq-rtcpxr", expires, &content)){ + if (! linphone_core_publish(call->core, addr, "vq-rtcpxr", expires, content)){ ret=4; } else { reset_avg_metrics(report); @@ -354,7 +354,7 @@ static int send_report(LinphoneCall* call, reporting_session_report_t * report, linphone_address_destroy(addr); - linphone_content_uninit(&content); + linphone_content_unref(content); end: ms_message("QualityReporting[%p]: Send '%s' with status %d", diff --git a/tester/eventapi_tester.c b/tester/eventapi_tester.c index 1d4b07e59..835130f54 100644 --- a/tester/eventapi_tester.c +++ b/tester/eventapi_tester.c @@ -40,7 +40,7 @@ const char *liblinphone_tester_get_notify_content(void){ void linphone_notify_received(LinphoneCore *lc, LinphoneEvent *lev, const char *eventname, const LinphoneContent *content){ LinphoneCoreManager *mgr; CU_ASSERT_PTR_NOT_NULL_FATAL(content); - CU_ASSERT_TRUE(strcmp(notify_content,(const char*)content->data)==0); + CU_ASSERT_TRUE(strcmp(notify_content,(const char*)linphone_content_get_data(content))==0); mgr=get_manager(lc); mgr->stat.number_of_NotifyReceived++; } @@ -48,13 +48,14 @@ void linphone_notify_received(LinphoneCore *lc, LinphoneEvent *lev, const char * void linphone_subscription_state_change(LinphoneCore *lc, LinphoneEvent *lev, LinphoneSubscriptionState state) { stats* counters = get_stats(lc); LinphoneCoreManager *mgr=get_manager(lc); - LinphoneContent content={0}; + LinphoneContent* content; const LinphoneAddress* from_addr = linphone_event_get_from(lev); char* from = linphone_address_as_string(from_addr); - content.type="application"; - content.subtype="somexml2"; - content.data=(void*)notify_content; - content.size=strlen(notify_content); + content = linphone_core_create_content(lc); + linphone_content_set_type(content,"application"); + linphone_content_set_subtype(content,"somexml2"); + linphone_content_set_data(content,belle_sip_strdup(notify_content)); + linphone_content_set_size(content,strlen(notify_content)); ms_message("Subscription state [%s] from [%s]",linphone_subscription_state_to_string(state),from); ms_free(from); @@ -80,7 +81,7 @@ void linphone_subscription_state_change(LinphoneCore *lc, LinphoneEvent *lev, Li counters->number_of_LinphoneSubscriptionActive++; if (linphone_event_get_subscription_dir(lev)==LinphoneSubscriptionIncoming){ mgr->lev=lev; - linphone_event_notify(lev,&content); + linphone_event_notify(lev,content); } break; case LinphoneSubscriptionTerminated: @@ -96,6 +97,7 @@ void linphone_subscription_state_change(LinphoneCore *lc, LinphoneEvent *lev, Li mgr->lev=NULL; break; } + linphone_content_unref(content); } void linphone_publish_state_changed(LinphoneCore *lc, LinphoneEvent *ev, LinphonePublishState state){ @@ -123,23 +125,23 @@ void linphone_publish_state_changed(LinphoneCore *lc, LinphoneEvent *ev, Linphon static void subscribe_test_declined(void) { LinphoneCoreManager* marie = linphone_core_manager_new( "marie_rc"); LinphoneCoreManager* pauline = linphone_core_manager_new( "pauline_rc"); - LinphoneContent content={0}; + LinphoneContent* content; LinphoneEvent *lev; const LinphoneErrorInfo *ei; MSList* lcs=ms_list_append(NULL,marie->lc); lcs=ms_list_append(lcs,pauline->lc); + content = linphone_core_create_content(marie->lc); + linphone_content_set_type(content,"application"); + linphone_content_set_subtype(content,"somexml"); + linphone_content_set_data(content,belle_sip_strdup(subscribe_content)); + linphone_content_set_size(content,strlen(subscribe_content)); - content.type="application"; - content.subtype="somexml"; - content.data=(char*)subscribe_content; - content.size=strlen(subscribe_content); - pauline->decline_subscribe=TRUE; - - lev=linphone_core_subscribe(marie->lc,pauline->identity,"dodo",600,&content); + + lev=linphone_core_subscribe(marie->lc,pauline->identity,"dodo",600,content); linphone_event_ref(lev); - + CU_ASSERT_TRUE(wait_for_list(lcs,&marie->stat.number_of_LinphoneSubscriptionOutgoingInit,1,1000)); CU_ASSERT_TRUE(wait_for_list(lcs,&pauline->stat.number_of_LinphoneSubscriptionIncomingReceived,1,3000)); CU_ASSERT_TRUE(wait_for_list(lcs,&marie->stat.number_of_LinphoneSubscriptionError,1,21000));/*yes flexisip may wait 20 secs in case of forking*/ @@ -150,7 +152,8 @@ static void subscribe_test_declined(void) { CU_ASSERT_PTR_NOT_NULL(linphone_error_info_get_phrase(ei)); } CU_ASSERT_TRUE(wait_for_list(lcs,&pauline->stat.number_of_LinphoneSubscriptionTerminated,1,1000)); - + + linphone_content_unref(content); linphone_event_unref(lev); linphone_core_manager_destroy(marie); linphone_core_manager_destroy(pauline); @@ -165,23 +168,24 @@ typedef enum RefreshTestType{ static void subscribe_test_with_args(bool_t terminated_by_subscriber, RefreshTestType refresh_type) { LinphoneCoreManager* marie = linphone_core_manager_new( "marie_rc"); LinphoneCoreManager* pauline = linphone_core_manager_new( "pauline_rc"); - LinphoneContent content={0}; + LinphoneContent* content; LinphoneEvent *lev; int expires= refresh_type!=NoRefresh ? 4 : 600; MSList* lcs=ms_list_append(NULL,marie->lc); - + lcs=ms_list_append(lcs,pauline->lc); if (refresh_type==ManualRefresh){ lp_config_set_int(marie->lc->config,"sip","refresh_generic_subscribe",0); } - content.type="application"; - content.subtype="somexml"; - content.data=(char*)subscribe_content; - content.size=strlen(subscribe_content); - - lev=linphone_core_subscribe(marie->lc,pauline->identity,"dodo",expires,&content); + content = linphone_core_create_content(marie->lc); + linphone_content_set_type(content,"application"); + linphone_content_set_subtype(content,"somexml"); + linphone_content_set_data(content,belle_sip_strdup(subscribe_content)); + linphone_content_set_size(content,strlen(subscribe_content)); + + lev=linphone_core_subscribe(marie->lc,pauline->identity,"dodo",expires,content); CU_ASSERT_TRUE(wait_for_list(lcs,&marie->stat.number_of_LinphoneSubscriptionOutgoingInit,1,1000)); CU_ASSERT_TRUE(wait_for_list(lcs,&pauline->stat.number_of_LinphoneSubscriptionIncomingReceived,1,3000)); @@ -190,7 +194,7 @@ static void subscribe_test_with_args(bool_t terminated_by_subscriber, RefreshTes /*make sure marie receives first notification before terminating*/ CU_ASSERT_TRUE(wait_for_list(lcs,&marie->stat.number_of_NotifyReceived,1,1000)); - + if (refresh_type==AutoRefresh){ wait_for_list(lcs,NULL,0,6000); CU_ASSERT_TRUE(linphone_event_get_subscription_state(pauline->lev)==LinphoneSubscriptionActive); @@ -206,10 +210,11 @@ static void subscribe_test_with_args(bool_t terminated_by_subscriber, RefreshTes CU_ASSERT_PTR_NOT_NULL_FATAL(pauline->lev); linphone_event_terminate(pauline->lev); } - + CU_ASSERT_TRUE(wait_for_list(lcs,&marie->stat.number_of_LinphoneSubscriptionTerminated,1,1000)); CU_ASSERT_TRUE(wait_for_list(lcs,&pauline->stat.number_of_LinphoneSubscriptionTerminated,1,1000)); - + + linphone_content_unref(content); linphone_core_manager_destroy(marie); linphone_core_manager_destroy(pauline); } @@ -217,7 +222,7 @@ static void subscribe_test_with_args(bool_t terminated_by_subscriber, RefreshTes static void subscribe_test_with_args2(bool_t terminated_by_subscriber, RefreshTestType refresh_type) { LinphoneCoreManager* marie = linphone_core_manager_new( "marie_rc"); LinphoneCoreManager* pauline = linphone_core_manager_new( "pauline_rc"); - LinphoneContent content={0}; + LinphoneContent* content; LinphoneEvent *lev; int expires= refresh_type!=NoRefresh ? 4 : 600; MSList* lcs=ms_list_append(NULL,marie->lc); @@ -228,19 +233,20 @@ static void subscribe_test_with_args2(bool_t terminated_by_subscriber, RefreshTe lp_config_set_int(marie->lc->config,"sip","refresh_generic_subscribe",0); } - content.type="application"; - content.subtype="somexml"; - content.data=(char*)subscribe_content; - content.size=strlen(subscribe_content); - + content = linphone_core_create_content(marie->lc); + linphone_content_set_type(content,"application"); + linphone_content_set_subtype(content,"somexml"); + linphone_content_set_data(content,belle_sip_strdup(subscribe_content)); + linphone_content_set_size(content,strlen(subscribe_content)); + lev=linphone_core_create_subscribe(marie->lc,pauline->identity,"dodo",expires); linphone_event_add_custom_header(lev,"My-Header","pouet"); linphone_event_add_custom_header(lev,"My-Header2","pimpon"); - linphone_event_send_subscribe(lev,&content); - + linphone_event_send_subscribe(lev,content); + CU_ASSERT_TRUE(wait_for_list(lcs,&marie->stat.number_of_LinphoneSubscriptionOutgoingInit,1,1000)); CU_ASSERT_TRUE(wait_for_list(lcs,&pauline->stat.number_of_LinphoneSubscriptionIncomingReceived,1,3000)); - + /*check good receipt of custom headers*/ CU_ASSERT_STRING_EQUAL(linphone_event_get_custom_header(pauline->lev,"My-Header"),"pouet"); CU_ASSERT_STRING_EQUAL(linphone_event_get_custom_header(pauline->lev,"My-Header2"),"pimpon"); @@ -266,10 +272,11 @@ static void subscribe_test_with_args2(bool_t terminated_by_subscriber, RefreshTe CU_ASSERT_PTR_NOT_NULL_FATAL(pauline->lev); linphone_event_terminate(pauline->lev); } - + CU_ASSERT_TRUE(wait_for_list(lcs,&marie->stat.number_of_LinphoneSubscriptionTerminated,1,1000)); CU_ASSERT_TRUE(wait_for_list(lcs,&pauline->stat.number_of_LinphoneSubscriptionTerminated,1,1000)); - + + linphone_content_unref(content); linphone_core_manager_destroy(marie); linphone_core_manager_destroy(pauline); } @@ -300,30 +307,30 @@ static void subscribe_test_manually_refreshed(void){ static void publish_test_with_args(bool_t refresh, int expires){ LinphoneCoreManager* marie = linphone_core_manager_new( "marie_rc"); LinphoneCoreManager* pauline = linphone_core_manager_new( "pauline_rc"); - LinphoneContent content={0}; + LinphoneContent* content; LinphoneEvent *lev; MSList* lcs=ms_list_append(NULL,marie->lc); lcs=ms_list_append(lcs,pauline->lc); + content = linphone_core_create_content(marie->lc); + linphone_content_set_type(content,"application"); + linphone_content_set_subtype(content,"somexml"); + linphone_content_set_data(content,belle_sip_strdup(subscribe_content)); + linphone_content_set_size(content,strlen(subscribe_content)); - content.type="application"; - content.subtype="somexml"; - content.data=(char*)subscribe_content; - content.size=strlen(subscribe_content); - lp_config_set_int(marie->lc->config,"sip","refresh_generic_publish",refresh); lev=linphone_core_create_publish(marie->lc,pauline->identity,"dodo",expires); linphone_event_add_custom_header(lev,"CustomHeader","someValue"); - linphone_event_send_publish(lev,&content); + linphone_event_send_publish(lev,content); linphone_event_ref(lev); - + CU_ASSERT_TRUE(wait_for_list(lcs,&marie->stat.number_of_LinphonePublishProgress,1,1000)); CU_ASSERT_TRUE(wait_for_list(lcs,&marie->stat.number_of_LinphonePublishOk,1,3000)); - + if (!refresh){ CU_ASSERT_TRUE(wait_for_list(lcs,&marie->stat.number_of_LinphonePublishExpiring,1,5000)); - linphone_event_update_publish(lev,&content); + linphone_event_update_publish(lev,content); CU_ASSERT_TRUE(wait_for_list(lcs,&marie->stat.number_of_LinphonePublishProgress,1,1000)); CU_ASSERT_TRUE(wait_for_list(lcs,&marie->stat.number_of_LinphonePublishOk,1,3000)); }else{ @@ -331,11 +338,12 @@ static void publish_test_with_args(bool_t refresh, int expires){ } linphone_event_terminate(lev); - + CU_ASSERT_TRUE(wait_for_list(lcs,&marie->stat.number_of_LinphonePublishCleared,1,3000)); - + linphone_event_unref(lev); - + + linphone_content_unref(content); linphone_core_manager_destroy(marie); linphone_core_manager_destroy(pauline); } diff --git a/tester/flexisip_tester.c b/tester/flexisip_tester.c index a91811538..f2ec9192e 100644 --- a/tester/flexisip_tester.c +++ b/tester/flexisip_tester.c @@ -27,7 +27,7 @@ static void subscribe_forking(void) { LinphoneCoreManager* marie = linphone_core_manager_new( "marie_rc"); LinphoneCoreManager* pauline = linphone_core_manager_new( "pauline_tcp_rc"); LinphoneCoreManager* pauline2 = linphone_core_manager_new( "pauline_tcp_rc"); - LinphoneContent content={0}; + LinphoneContent* content; LinphoneEvent *lev; int expires= 600; MSList* lcs=ms_list_append(NULL,marie->lc); @@ -35,12 +35,13 @@ static void subscribe_forking(void) { lcs=ms_list_append(lcs,pauline->lc); lcs=ms_list_append(lcs,pauline2->lc); - content.type="application"; - content.subtype="somexml"; - content.data=(char*)liblinphone_tester_get_subscribe_content(); - content.size=strlen(liblinphone_tester_get_subscribe_content()); + content = linphone_core_create_content(marie->lc); + linphone_content_set_type(content,"application"); + linphone_content_set_subtype(content,"somexml"); + linphone_content_set_data(content, belle_sip_strdup(liblinphone_tester_get_subscribe_content())); + linphone_content_set_size(content, strlen(liblinphone_tester_get_subscribe_content())); - lev=linphone_core_subscribe(marie->lc,pauline->identity,"dodo",expires,&content); + lev=linphone_core_subscribe(marie->lc,pauline->identity,"dodo",expires,content); CU_ASSERT_TRUE(wait_for_list(lcs,&marie->stat.number_of_LinphoneSubscriptionOutgoingInit,1,1000)); CU_ASSERT_TRUE(wait_for_list(lcs,&pauline->stat.number_of_LinphoneSubscriptionIncomingReceived,1,3000)); @@ -51,7 +52,8 @@ static void subscribe_forking(void) { CU_ASSERT_TRUE(wait_for_list(lcs,&marie->stat.number_of_NotifyReceived,1,1000)); linphone_event_terminate(lev); - + + linphone_content_unref(content); linphone_core_manager_destroy(marie); linphone_core_manager_destroy(pauline); linphone_core_manager_destroy(pauline2); diff --git a/tester/message_tester.c b/tester/message_tester.c index d5f084f44..65ad16d9d 100644 --- a/tester/message_tester.c +++ b/tester/message_tester.c @@ -124,8 +124,8 @@ void file_transfer_progress_indication(LinphoneCore *lc, LinphoneChatMessage *me int progress = (int)((offset * 100)/total); ms_message(" File transfer [%d%%] %s of type [%s/%s] %s [%s] \n", progress ,(linphone_chat_message_is_outgoing(message)?"sent":"received") - , content->type - , content->subtype + , linphone_content_get_type(content) + , linphone_content_get_subtype(content) ,(linphone_chat_message_is_outgoing(message)?"to":"from") , address); counters->progress_of_LinphoneFileTransfer = progress; @@ -396,7 +396,7 @@ static void file_transfer_message(void) { char* to; LinphoneChatRoom* chat_room; LinphoneChatMessage* message; - LinphoneContent content; + LinphoneContent* content; const char* big_file_content="big file"; /* setting dummy file content to something */ LinphoneCoreManager* marie = linphone_core_manager_new( "marie_rc"); LinphoneCoreManager* pauline = linphone_core_manager_new( "pauline_rc"); @@ -417,12 +417,12 @@ static void file_transfer_message(void) { chat_room = linphone_core_create_chat_room(pauline->lc,to); ms_free(to); /* create a file transfer message */ - memset(&content,0,sizeof(content)); - content.type="text"; - content.subtype="plain"; - content.size=sizeof(big_file); /*total size to be transfered*/ - content.name = "bigfile.txt"; - message = linphone_chat_room_create_file_transfer_message(chat_room, &content); + content = linphone_core_create_content(pauline->lc); + linphone_content_set_type(content,"text"); + linphone_content_set_subtype(content,"plain"); + linphone_content_set_size(content,sizeof(big_file)); /*total size to be transfered*/ + linphone_content_set_name(content,"bigfile.txt"); + message = linphone_chat_room_create_file_transfer_message(chat_room, content); { int dummy=0; wait_for_until(marie->lc,pauline->lc,&dummy,1,100); /*just to have time to purge message stored in the server*/ @@ -440,6 +440,7 @@ static void file_transfer_message(void) { CU_ASSERT_EQUAL(pauline->stat.number_of_LinphoneMessageDelivered,1); CU_ASSERT_EQUAL(marie->stat.number_of_LinphoneMessageExtBodyReceived,1); + linphone_content_unref(content); linphone_core_manager_destroy(marie); linphone_core_manager_destroy(pauline); } @@ -451,7 +452,7 @@ static void small_file_transfer_message(void) { char* to; LinphoneChatRoom* chat_room; LinphoneChatMessage* message; - LinphoneContent content; + LinphoneContent* content; const char* big_file_content="big file"; /* setting dummy file content to something */ LinphoneCoreManager* marie = linphone_core_manager_new( "marie_rc"); LinphoneCoreManager* pauline = linphone_core_manager_new( "pauline_rc"); @@ -472,12 +473,12 @@ static void small_file_transfer_message(void) { chat_room = linphone_core_create_chat_room(pauline->lc,to); ms_free(to); /* create a file transfer message */ - memset(&content,0,sizeof(content)); - content.type="text"; - content.subtype="plain"; - content.size=SMALL_FILE_SIZE; /*total size to be transfered*/ - content.name = "bigfile.txt"; - message = linphone_chat_room_create_file_transfer_message(chat_room, &content); + content = linphone_core_create_content(pauline->lc); + linphone_content_set_type(content,"text"); + linphone_content_set_subtype(content,"plain"); + linphone_content_set_size(content,SMALL_FILE_SIZE); /*total size to be transfered*/ + linphone_content_set_name(content,"bigfile.txt"); + message = linphone_chat_room_create_file_transfer_message(chat_room, content); { int dummy=0; wait_for_until(marie->lc,pauline->lc,&dummy,1,100); /*just to have time to purge message stored in the server*/ @@ -495,6 +496,7 @@ static void small_file_transfer_message(void) { CU_ASSERT_EQUAL(pauline->stat.number_of_LinphoneMessageDelivered,1); CU_ASSERT_EQUAL(marie->stat.number_of_LinphoneMessageExtBodyReceived,1); + linphone_content_unref(content); linphone_core_manager_destroy(marie); linphone_core_manager_destroy(pauline); } @@ -504,7 +506,7 @@ static void file_transfer_message_io_error_upload(void) { char* to; LinphoneChatRoom* chat_room; LinphoneChatMessage* message; - LinphoneContent content; + LinphoneContent* content; const char* big_file_content="big file"; /* setting dummy file content to something */ LinphoneCoreManager* marie = linphone_core_manager_new( "marie_rc"); LinphoneCoreManager* pauline = linphone_core_manager_new( "pauline_rc"); @@ -526,12 +528,12 @@ static void file_transfer_message_io_error_upload(void) { chat_room = linphone_core_create_chat_room(pauline->lc,to); /* create a file transfer message */ - memset(&content,0,sizeof(content)); - content.type="text"; - content.subtype="plain"; - content.size=sizeof(big_file); /*total size to be transfered*/ - content.name = "bigfile.txt"; - message = linphone_chat_room_create_file_transfer_message(chat_room, &content); + content = linphone_core_create_content(pauline->lc); + linphone_content_set_type(content,"text"); + linphone_content_set_subtype(content,"plain"); + linphone_content_set_size(content,sizeof(big_file)); /*total size to be transfered*/ + linphone_content_set_name(content,"bigfile.txt"); + message = linphone_chat_room_create_file_transfer_message(chat_room, content); { int dummy=0; wait_for_until(marie->lc,pauline->lc,&dummy,1,100); /*just to have time to purge message stored in the server*/ @@ -554,6 +556,7 @@ static void file_transfer_message_io_error_upload(void) { linphone_core_refresh_registers(pauline->lc); /*to make sure registration is back in registered and so it can be later unregistered*/ CU_ASSERT_TRUE(wait_for(pauline->lc,marie->lc,&pauline->stat.number_of_LinphoneRegistrationOk,pauline->stat.number_of_LinphoneRegistrationOk+1)); + linphone_content_unref(content); linphone_core_manager_destroy(marie); linphone_core_manager_destroy(pauline); } @@ -629,7 +632,7 @@ static void file_transfer_message_upload_cancelled(void) { char* to; LinphoneChatRoom* chat_room; LinphoneChatMessage* message; - LinphoneContent content; + LinphoneContent* content; const char* big_file_content="big file"; /* setting dummy file content to something */ LinphoneCoreManager* marie = linphone_core_manager_new( "marie_rc"); LinphoneCoreManager* pauline = linphone_core_manager_new( "pauline_rc"); @@ -651,12 +654,12 @@ static void file_transfer_message_upload_cancelled(void) { chat_room = linphone_core_create_chat_room(pauline->lc,to); /* create a file transfer message */ - memset(&content,0,sizeof(content)); - content.type="text"; - content.subtype="plain"; - content.size=sizeof(big_file); /*total size to be transfered*/ - content.name = "bigfile.txt"; - message = linphone_chat_room_create_file_transfer_message(chat_room, &content); + content = linphone_core_create_content(pauline->lc); + linphone_content_set_type(content,"text"); + linphone_content_set_subtype(content,"plain"); + linphone_content_set_size(content,sizeof(big_file)); /*total size to be transfered*/ + linphone_content_set_name(content,"bigfile.txt"); + message = linphone_chat_room_create_file_transfer_message(chat_room, content); { int dummy=0; wait_for_until(marie->lc,pauline->lc,&dummy,1,100); /*just to have time to purge message stored in the server*/ @@ -674,6 +677,7 @@ static void file_transfer_message_upload_cancelled(void) { CU_ASSERT_EQUAL(pauline->stat.number_of_LinphoneMessageNotDelivered,1); CU_ASSERT_EQUAL(marie->stat.number_of_LinphoneMessageExtBodyReceived,0); + linphone_content_unref(content); linphone_core_manager_destroy(marie); linphone_core_manager_destroy(pauline); } @@ -829,12 +833,13 @@ static void info_message_with_args(bool_t with_content) { info=linphone_core_create_info_message(marie->lc); linphone_info_message_add_header(info,"Weather","still bad"); if (with_content) { - LinphoneContent ct={0}; - ct.type="application"; - ct.subtype="somexml"; - ct.data=(void*)info_content; - ct.size=strlen(info_content); - linphone_info_message_set_content(info,&ct); + LinphoneContent* ct=linphone_core_create_content(marie->lc); + linphone_content_set_type(ct,"application"); + linphone_content_set_subtype(ct,"somexml"); + linphone_content_set_data(ct,belle_sip_strdup(info_content)); + linphone_content_set_size(ct,strlen(info_content)); + linphone_info_message_set_content(info,ct); + linphone_content_unref(ct); } { int dummy=0; @@ -858,13 +863,13 @@ static void info_message_with_args(bool_t with_content) { if (with_content){ CU_ASSERT_PTR_NOT_NULL(content); if (content) { - CU_ASSERT_PTR_NOT_NULL(content->data); - CU_ASSERT_PTR_NOT_NULL(content->type); - CU_ASSERT_PTR_NOT_NULL(content->subtype); - if (content->type) CU_ASSERT_TRUE(strcmp(content->type,"application")==0); - if (content->subtype) CU_ASSERT_TRUE(strcmp(content->subtype,"somexml")==0); - if (content->data)CU_ASSERT_TRUE(strcmp((const char*)content->data,info_content)==0); - CU_ASSERT_EQUAL(content->size,strlen(info_content)); + CU_ASSERT_PTR_NOT_NULL(linphone_content_get_data(content)); + CU_ASSERT_PTR_NOT_NULL(linphone_content_get_type(content)); + CU_ASSERT_PTR_NOT_NULL(linphone_content_get_subtype(content)); + if (linphone_content_get_type(content)) CU_ASSERT_TRUE(strcmp(linphone_content_get_type(content),"application")==0); + if (linphone_content_get_subtype(content)) CU_ASSERT_TRUE(strcmp(linphone_content_get_subtype(content),"somexml")==0); + if (linphone_content_get_data(content))CU_ASSERT_TRUE(strcmp((const char*)linphone_content_get_data(content),info_content)==0); + CU_ASSERT_EQUAL(linphone_content_get_size(content),strlen(info_content)); } } linphone_core_manager_destroy(marie); diff --git a/tester/quality_reporting_tester.c b/tester/quality_reporting_tester.c index 1190f188f..81bae75cf 100644 --- a/tester/quality_reporting_tester.c +++ b/tester/quality_reporting_tester.c @@ -25,7 +25,7 @@ #define __strstr(x, y) ((x==NULL)?NULL:strstr(x,y)) void on_report_send_mandatory(const LinphoneCall *call, int stream_type, const LinphoneContent *content){ - char * body = (char *)content->data; + char * body = (char *)linphone_content_get_data(content); char * remote_metrics_start = __strstr(body, "RemoteMetrics:"); reporting_session_report_t * report = call->log->reporting.reports[stream_type]; MediaStream * ms; @@ -91,7 +91,7 @@ char * on_report_send_verify_metrics(const reporting_content_metrics_t *metrics, } void on_report_send_with_rtcp_xr_local(const LinphoneCall *call, int stream_type, const LinphoneContent *content){ - char * body = (char*)content->data; + char * body = (char*)linphone_content_get_data(content); char * remote_metrics_start = __strstr(body, "RemoteMetrics:"); reporting_session_report_t * report = call->log->reporting.reports[stream_type]; on_report_send_mandatory(call,stream_type,content); @@ -99,7 +99,7 @@ void on_report_send_with_rtcp_xr_local(const LinphoneCall *call, int stream_type CU_ASSERT_TRUE(!remote_metrics_start || on_report_send_verify_metrics(&report->local_metrics,body) < remote_metrics_start); } void on_report_send_with_rtcp_xr_remote(const LinphoneCall *call, int stream_type, const LinphoneContent *content){ - char * body = (char*)content->data; + char * body = (char*)linphone_content_get_data(content); reporting_session_report_t * report = call->log->reporting.reports[stream_type]; on_report_send_mandatory(call,stream_type,content); @@ -214,7 +214,7 @@ static void quality_reporting_not_sent_if_low_bandwidth() { } void on_report_send_remove_fields(const LinphoneCall *call, int stream_type, const LinphoneContent *content){ - char *body = (char*)content->data; + char *body = (char*)linphone_content_get_data(content); /*corrupt start of the report*/ strncpy(body, "corrupted report is corrupted", strlen("corrupted report is corrupted")); }