diff --git a/coreapi/chat.c b/coreapi/chat.c index ac2e6e291..0279db9f5 100644 --- a/coreapi/chat.c +++ b/coreapi/chat.c @@ -385,7 +385,7 @@ void _linphone_chat_room_send_message(LinphoneChatRoom *cr, LinphoneChatMessage linphone_chat_room_upload_file(msg); } else { SalOp *op = NULL; - LinphoneCall *call; + LinphoneCall *call=NULL; char *content_type; const char *identity = NULL; msg->time = ms_time(0); @@ -460,6 +460,16 @@ void _linphone_chat_room_send_message(LinphoneChatRoom *cr, LinphoneChatMessage } linphone_chat_room_delete_composing_idle_timer(cr); linphone_chat_room_delete_composing_refresh_timer(cr); + + if (call && call->op == op) { + /*In this case, chat delivery status is not notified, so unrefing chat message right now*/ + /*Might be better fixed by delivering status, but too costly for now*/ + msg->chat_room->transient_messages = ms_list_remove(msg->chat_room->transient_messages, msg); + linphone_chat_message_unref(msg); + linphone_chat_message_unref(msg); + return; + } + } // if operation failed, we should not change message state diff --git a/coreapi/linphonecore.c b/coreapi/linphonecore.c index b5787b456..057d2c272 100644 --- a/coreapi/linphonecore.c +++ b/coreapi/linphonecore.c @@ -7459,6 +7459,9 @@ void linphone_core_set_chat_database_path(LinphoneCore *lc, const char *path){ linphone_core_message_storage_init(lc); } } +const char* linphone_core_get_chat_database_path(const LinphoneCore *lc) { + return lc->chat_db_file; +} void linphone_core_enable_sdp_200_ack(LinphoneCore *lc, bool_t enable) { lp_config_set_int(lc->config,"sip","sdp_200_ack",lc->sip_conf.sdp_200_ack=enable); } diff --git a/coreapi/linphonecore.h b/coreapi/linphonecore.h index 9661b5d92..773c16877 100644 --- a/coreapi/linphonecore.h +++ b/coreapi/linphonecore.h @@ -1299,7 +1299,13 @@ typedef void (*LinphoneChatMessageCbsFileTransferProgressIndicationCb)(LinphoneC LINPHONE_PUBLIC void linphone_core_set_chat_database_path(LinphoneCore *lc, const char *path); - +/** + * Get path to the database file used for storing chat messages. + * @param lc the linphone core + * @return file path or NULL if not exist + **/ + +LINPHONE_PUBLIC const char *linphone_core_get_chat_database_path(const LinphoneCore *lc); /** * Get a chat room whose peer is the supplied address. If it does not exist yet, it will be created. * No reference is transfered to the application. The LinphoneCore keeps a reference on the chat room. diff --git a/tester/message_tester.c b/tester/message_tester.c index 26c615e7c..5ada03f4e 100644 --- a/tester/message_tester.c +++ b/tester/message_tester.c @@ -774,6 +774,10 @@ static void lime_text_message(void) { LinphoneCoreManager* marie = linphone_core_manager_new("marie_rc"); LinphoneCoreManager* pauline = linphone_core_manager_new( "pauline_tcp_rc"); + if (!linphone_core_lime_available(marie->lc)) { + ms_warning("Lime not available, skiping"); + goto end; + } /* make sure lime is enabled */ linphone_core_enable_lime(marie->lc, 1); linphone_core_enable_lime(pauline->lc, 1); @@ -802,7 +806,7 @@ static void lime_text_message(void) { BC_ASSERT_PTR_NOT_NULL(linphone_core_get_chat_room(marie->lc,pauline->identity)); /* TODO : check the msg arrived correctly deciphered */ - +end: linphone_core_manager_destroy(marie); linphone_core_manager_destroy(pauline); } @@ -813,7 +817,11 @@ static void lime_text_message_to_non_lime(void) { char* filepath; LinphoneCoreManager* marie = linphone_core_manager_new("marie_rc"); LinphoneCoreManager* pauline = linphone_core_manager_new( "pauline_tcp_rc"); - + + if (!linphone_core_lime_available(marie->lc)) { + ms_warning("Lime not available, skiping"); + goto end; + } /* make sure lime is enabled */ linphone_core_enable_lime(marie->lc, 0); linphone_core_enable_lime(pauline->lc, 1); @@ -835,10 +843,11 @@ static void lime_text_message_to_non_lime(void) { BC_ASSERT_EQUAL(marie->stat.number_of_LinphoneMessageReceivedLegacy,0, int, "%d"); BC_ASSERT_PTR_NOT_NULL(linphone_core_get_chat_room(marie->lc,pauline->identity)); +end: linphone_core_manager_destroy(marie); linphone_core_manager_destroy(pauline); } -void lime_transfer_message_base(bool_t encrypt_file) { +void lime_transfer_message_base(bool_t encrypt_file,bool_t download_file_from_stored_msg) { FILE *ZIDCacheMarieFD, *ZIDCachePaulineFD; LinphoneCoreManager *marie, *pauline; LinphoneChatMessage *msg; @@ -848,7 +857,11 @@ void lime_transfer_message_base(bool_t encrypt_file) { marie = linphone_core_manager_new( "marie_rc"); pauline = linphone_core_manager_new( "pauline_tcp_rc"); - + + if (!linphone_core_lime_available(marie->lc)) { + ms_warning("Lime not available, skiping"); + goto end; + } /* make sure lime is enabled */ linphone_core_enable_lime(marie->lc, 1); linphone_core_enable_lime(pauline->lc, 1); @@ -886,26 +899,49 @@ void lime_transfer_message_base(bool_t encrypt_file) { linphone_chat_room_send_chat_message(msg->chat_room, msg); BC_ASSERT_TRUE(wait_for(pauline->lc,marie->lc,&marie->stat.number_of_LinphoneMessageReceivedWithFile,1)); if (marie->stat.last_received_chat_message ) { - cbs = linphone_chat_message_get_callbacks(marie->stat.last_received_chat_message); + LinphoneChatMessage *recv_msg; + const LinphoneContent* content; + if (download_file_from_stored_msg) { + LinphoneChatRoom *marie_room = linphone_core_get_chat_room(marie->lc, pauline->identity); + MSList * msgs = linphone_chat_room_get_history(marie_room,1); + BC_ASSERT_PTR_NOT_NULL(msgs); + if (!msgs) goto end; + recv_msg = (LinphoneChatMessage *)msgs->data; + ms_list_free(msgs); + } else { + recv_msg = marie->stat.last_received_chat_message; + } + cbs = linphone_chat_message_get_callbacks(recv_msg); linphone_chat_message_cbs_set_msg_state_changed(cbs, liblinphone_tester_chat_message_msg_state_changed); linphone_chat_message_cbs_set_file_transfer_recv(cbs, file_transfer_received); - linphone_chat_message_download_file(marie->stat.last_received_chat_message); + content = linphone_chat_message_get_file_transfer_information(recv_msg); + if (!content) goto end; + if (encrypt_file) + BC_ASSERT_PTR_NOT_NULL(linphone_content_get_key(content)); + else + BC_ASSERT_PTR_NULL(linphone_content_get_key(content)); + linphone_chat_message_download_file(recv_msg); + BC_ASSERT_TRUE(wait_for(pauline->lc,marie->lc,&marie->stat.number_of_LinphoneFileTransferDownloadSuccessful,1)); } - BC_ASSERT_TRUE(wait_for(pauline->lc,marie->lc,&marie->stat.number_of_LinphoneFileTransferDownloadSuccessful,1)); BC_ASSERT_EQUAL(pauline->stat.number_of_LinphoneMessageInProgress,2, int, "%d"); // file transfer BC_ASSERT_EQUAL(pauline->stat.number_of_LinphoneMessageDelivered,1, int, "%d"); BC_ASSERT_EQUAL(marie->stat.number_of_LinphoneFileTransferDownloadSuccessful,1, int, "%d"); +end: linphone_core_manager_destroy(marie); linphone_core_manager_destroy(pauline); } static void lime_transfer_message(void) { - lime_transfer_message_base(TRUE); + lime_transfer_message_base(TRUE,FALSE); +} + +static void lime_transfer_message_from_history(void) { + lime_transfer_message_base(TRUE,TRUE); } static void lime_transfer_message_without_encryption(void) { - lime_transfer_message_base(FALSE); + lime_transfer_message_base(FALSE,FALSE); } static void printHex(char *title, uint8_t *data, uint32_t length) { @@ -1092,8 +1128,6 @@ static void lime_unit(void) { #endif /* HAVE_LIME */ -#ifdef MSG_STORAGE_ENABLED - /* * Copy file "from" to file "to". * Destination file is truncated if existing. @@ -1285,7 +1319,6 @@ static void history_count(void) { ms_free(src_db); bc_free(tmp_db); } -#endif static void text_status_after_destroying_chat_room(void) { LinphoneCoreManager *marie = linphone_core_manager_new("marie_rc"); @@ -1759,7 +1792,7 @@ void file_transfer_with_http_proxy(void) { test_t message_tests[] = { TEST_NO_TAG("Text message", text_message), - TEST_ONE_TAG("Text message within call dialog", text_message_within_call_dialog, "LeaksMemory"), + TEST_NO_TAG("Text message within call dialog", text_message_within_call_dialog), TEST_NO_TAG("Text message with credentials from auth callback", text_message_with_credential_from_auth_callback), TEST_NO_TAG("Text message with privacy", text_message_with_privacy), TEST_NO_TAG("Text message compatibility mode", text_message_compatibility_mode), @@ -1778,18 +1811,15 @@ test_t message_tests[] = { TEST_NO_TAG("Info message", info_message), TEST_NO_TAG("Info message with body", info_message_with_body), TEST_NO_TAG("IsComposing notification", is_composing_notification), -#ifdef HAVE_LIME TEST_NO_TAG("Lime text message", lime_text_message), TEST_NO_TAG("Lime text message to non lime", lime_text_message_to_non_lime), TEST_NO_TAG("Lime transfer message", lime_transfer_message), + TEST_ONE_TAG("Lime transfer message from history", lime_transfer_message_from_history,"LeaksMemory"), TEST_NO_TAG("Lime transfer message without encryption", lime_transfer_message_without_encryption), TEST_NO_TAG("Lime unitary", lime_unit), -#endif /* HAVE_LIME */ -#ifdef MSG_STORAGE_ENABLED TEST_NO_TAG("Database migration", database_migration), TEST_NO_TAG("History range", history_range), TEST_NO_TAG("History count", history_count), -#endif TEST_NO_TAG("Text status after destroying chat room", text_status_after_destroying_chat_room), TEST_ONE_TAG("Transfer not sent if invalid url", file_transfer_not_sent_if_invalid_url, "LeaksMemory"), TEST_ONE_TAG("Transfer not sent if host not found", file_transfer_not_sent_if_host_not_found, "LeaksMemory"), diff --git a/tester/tester.c b/tester/tester.c index 5e4414dd1..e6d472918 100644 --- a/tester/tester.c +++ b/tester/tester.c @@ -117,6 +117,7 @@ LinphoneCore* configure_lc_from(LinphoneCoreVTable* v_table, const char* path, c char *rootcapath = NULL; char *dnsuserhostspath = NULL; char *nowebcampath = NULL; + char *chatdb = NULL; if (path==NULL) path="."; @@ -134,8 +135,8 @@ LinphoneCore* configure_lc_from(LinphoneCoreVTable* v_table, const char* path, c ringbackpath = ms_strdup_printf("%s/sounds/ringback.wav", path); nowebcampath = ms_strdup_printf("%s/images/nowebcamCIF.jpg", path); rootcapath = ms_strdup_printf("%s/certificates/cn/cafile.pem", path); - dnsuserhostspath = ms_strdup_printf( "%s/%s", path, userhostsfile); - + dnsuserhostspath = ms_strdup_printf("%s/%s", path, userhostsfile); + if( config != NULL ) { lp_config_set_string(config, "sound", "remote_ring", ringbackpath); @@ -149,18 +150,22 @@ LinphoneCore* configure_lc_from(LinphoneCoreVTable* v_table, const char* path, c linphone_core_set_ringback(lc, ringbackpath); linphone_core_set_root_ca(lc,rootcapath); } - + chatdb = ms_strdup_printf("%s/messages-%p.db",bc_tester_get_writable_dir_prefix(),lc); + linphone_core_enable_ipv6(lc, liblinphonetester_ipv6); sal_enable_test_features(lc->sal,TRUE); sal_set_dns_user_hosts_file(lc->sal, dnsuserhostspath); linphone_core_set_static_picture(lc,nowebcampath); + linphone_core_set_chat_database_path(lc, chatdb); + ms_free(ringpath); ms_free(ringbackpath); ms_free(nowebcampath); ms_free(rootcapath); ms_free(dnsuserhostspath); + ms_free(chatdb); if( filepath ) ms_free(filepath); @@ -415,7 +420,7 @@ void linphone_core_manager_uninit(LinphoneCoreManager *mgr) { if (mgr->stat.last_received_info_message) linphone_info_message_destroy(mgr->stat.last_received_info_message); if (mgr->lc){ const char *record_file=linphone_core_get_record_file(mgr->lc); - + const char *chatdb = linphone_core_get_chat_database_path(mgr->lc); if (!liblinphone_tester_keep_record_files && record_file){ if ((bc_get_number_of_failures()-mgr->number_of_cunit_error_at_creation)>0) { ms_message ("Test has failed, keeping recorded file [%s]",record_file); @@ -424,6 +429,7 @@ void linphone_core_manager_uninit(LinphoneCoreManager *mgr) { } } linphone_core_destroy(mgr->lc); + if (chatdb) unlink(chatdb); } if (mgr->identity) { linphone_address_destroy(mgr->identity);