forked from mirrors/linphone-iphone
Improved a few things in RTT + added tests for message end character compatibility
This commit is contained in:
parent
bf20c29de6
commit
868c725dae
3 changed files with 98 additions and 11 deletions
|
|
@ -188,6 +188,7 @@ static LinphoneChatRoom *_linphone_core_create_chat_room_base(LinphoneCore *lc,
|
|||
cr->peer = linphone_address_as_string(addr);
|
||||
cr->peer_url = addr;
|
||||
cr->unread_count = -1;
|
||||
cr->received_rtt_characters = NULL;
|
||||
return cr;
|
||||
}
|
||||
|
||||
|
|
@ -291,6 +292,9 @@ static void linphone_chat_room_delete_remote_composing_refresh_timer(LinphoneCha
|
|||
}
|
||||
|
||||
void linphone_chat_room_destroy(LinphoneChatRoom *cr) {
|
||||
if (cr->received_rtt_characters) {
|
||||
cr->received_rtt_characters = ms_list_free(cr->received_rtt_characters);
|
||||
}
|
||||
linphone_chat_room_unref(cr);
|
||||
}
|
||||
|
||||
|
|
@ -810,12 +814,30 @@ static void linphone_chat_room_send_is_composing_notification(LinphoneChatRoom *
|
|||
|
||||
void linphone_core_real_time_text_received(LinphoneCore *lc, LinphoneChatRoom *cr, uint32_t character, LinphoneCall *call) {
|
||||
uint32_t new_line = 0x2028;
|
||||
uint32_t crlf = 0x0D0A;
|
||||
uint32_t lf = 0x0A;
|
||||
|
||||
if (call && linphone_call_params_realtime_text_enabled(linphone_call_get_current_params(call))) {
|
||||
char *value = NULL;
|
||||
LinphoneChatMessageCharacter *cmc = ms_new0(LinphoneChatMessageCharacter, 1);
|
||||
|
||||
if (cr->pending_message == NULL) {
|
||||
cr->pending_message = linphone_chat_room_create_message(cr, "");
|
||||
}
|
||||
|
||||
if (character == new_line) {
|
||||
value = ms_strdup_printf("%c%c%c%c",((char*)&character)[0],((char*)&character)[1],((char*)&character)[2],((char*)&character)[3]);
|
||||
cr->pending_message->message = ms_strcat_printf(cr->pending_message->message, value);
|
||||
ms_message("Received RTT character: %s (%lu), pending text is %s", value, (unsigned long)character, cr->pending_message->message);
|
||||
ms_free(value);
|
||||
|
||||
cmc->value = character;
|
||||
cmc->has_been_read = FALSE;
|
||||
cr->received_rtt_characters = ms_list_append(cr->received_rtt_characters, (void *)cmc);
|
||||
|
||||
cr->remote_is_composing = LinphoneIsComposingActive;
|
||||
linphone_core_notify_is_composing_received(cr->lc, cr);
|
||||
|
||||
if (character == new_line || character == crlf || character == lf) {
|
||||
// End of message
|
||||
LinphoneChatMessage *msg = cr->pending_message;
|
||||
ms_message("New line received, forge a message with content %s", cr->pending_message->message);
|
||||
|
|
@ -837,21 +859,22 @@ void linphone_core_real_time_text_received(LinphoneCore *lc, LinphoneChatRoom *c
|
|||
linphone_chat_room_message_received(cr, lc, msg);
|
||||
linphone_chat_message_unref(msg);
|
||||
cr->pending_message = NULL;
|
||||
} else {
|
||||
char *value = ms_strdup_printf("%c%c%c%c",((char*)&character)[0],((char*)&character)[1],((char*)&character)[2],((char*)&character)[3]);
|
||||
cr->pending_message->message = ms_strcat_printf(cr->pending_message->message, value);
|
||||
ms_message("Received RTT character: %s (%lu), pending text is %s", value, (unsigned long)character, cr->pending_message->message);
|
||||
ms_free(value);
|
||||
|
||||
cr->remote_is_composing = LinphoneIsComposingActive;
|
||||
linphone_core_notify_is_composing_received(cr->lc, cr);
|
||||
cr->received_rtt_characters = ms_list_free(cr->received_rtt_characters);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
uint32_t linphone_chat_room_get_char(const LinphoneChatRoom *cr) {
|
||||
if (cr->pending_message && strlen(cr->pending_message->message) > 0) {
|
||||
return cr->pending_message->message[strlen(cr->pending_message->message)-1];
|
||||
if (cr && cr->received_rtt_characters) {
|
||||
MSList *characters = cr->received_rtt_characters;
|
||||
while (characters != NULL) {
|
||||
LinphoneChatMessageCharacter *cmc = (LinphoneChatMessageCharacter *)characters->data;
|
||||
if (!cmc->has_been_read) {
|
||||
cmc->has_been_read = TRUE;
|
||||
return cmc->value;
|
||||
}
|
||||
characters = ms_list_next(characters);
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -608,8 +608,14 @@ struct _LinphoneChatRoom{
|
|||
belle_sip_source_t *composing_refresh_timer;
|
||||
LinphoneCall *call;
|
||||
LinphoneChatMessage *pending_message;
|
||||
MSList *received_rtt_characters;
|
||||
};
|
||||
|
||||
typedef struct _LinphoneChatMessageCharacter {
|
||||
uint32_t value;
|
||||
bool_t has_been_read;
|
||||
} LinphoneChatMessageCharacter;
|
||||
|
||||
BELLE_SIP_DECLARE_VPTR(LinphoneChatRoom);
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -1335,6 +1335,7 @@ static void real_time_text(bool_t audio_stream_enabled, bool_t srtp_enabled) {
|
|||
BC_ASSERT_EQUAL(linphone_chat_room_get_char(marie_chat_room), message[i], char, "%c");
|
||||
}
|
||||
linphone_chat_room_send_chat_message(pauline_chat_room, rtt_message);
|
||||
BC_ASSERT_TRUE(wait_for(pauline->lc, marie->lc, &marie->stat.number_of_LinphoneMessageReceived, 1));
|
||||
}
|
||||
|
||||
if (!audio_stream_enabled) {
|
||||
|
|
@ -1462,6 +1463,61 @@ static void real_time_text_srtp(void) {
|
|||
real_time_text(TRUE, TRUE);
|
||||
}
|
||||
|
||||
static void real_time_text_message_compat(bool_t end_with_crlf, bool_t end_with_lf) {
|
||||
LinphoneChatRoom *pauline_chat_room;
|
||||
LinphoneCoreManager* marie = linphone_core_manager_new("marie_rc");
|
||||
LinphoneCoreManager* pauline = linphone_core_manager_new( "pauline_tcp_rc");
|
||||
LinphoneCallParams *marie_params = NULL;
|
||||
LinphoneCall *pauline_call, *marie_call;
|
||||
|
||||
marie_params = linphone_core_create_call_params(marie->lc, NULL);
|
||||
linphone_call_params_enable_realtime_text(marie_params,TRUE);
|
||||
|
||||
BC_ASSERT_TRUE(call_with_caller_params(marie, pauline, marie_params));
|
||||
pauline_call=linphone_core_get_current_call(pauline->lc);
|
||||
marie_call=linphone_core_get_current_call(marie->lc);
|
||||
if (pauline_call) {
|
||||
BC_ASSERT_TRUE(linphone_call_params_realtime_text_enabled(linphone_call_get_current_params(pauline_call)));
|
||||
|
||||
pauline_chat_room = linphone_call_get_chat_room(pauline_call);
|
||||
BC_ASSERT_PTR_NOT_NULL(pauline_chat_room);
|
||||
if (pauline_chat_room) {
|
||||
const char* message = "Lorem Ipsum Belledonnum Communicatum";
|
||||
int i;
|
||||
LinphoneChatMessage* rtt_message = linphone_chat_room_create_message(pauline_chat_room,NULL);
|
||||
LinphoneChatRoom *marie_chat_room = linphone_call_get_chat_room(marie_call);
|
||||
uint32_t crlf = 0x0D0A;
|
||||
uint32_t lf = 0x0A;
|
||||
|
||||
for (i = 0; i < strlen(message); i++) {
|
||||
linphone_chat_message_put_char(rtt_message, message[i]);
|
||||
BC_ASSERT_TRUE(wait_for_until(pauline->lc, marie->lc, &marie->stat.number_of_LinphoneIsComposingActiveReceived, i+1, 1000));
|
||||
BC_ASSERT_EQUAL(linphone_chat_room_get_char(marie_chat_room), message[i], char, "%c");
|
||||
}
|
||||
|
||||
if (end_with_crlf) {
|
||||
linphone_chat_message_put_char(rtt_message, crlf);
|
||||
} else if (end_with_lf) {
|
||||
linphone_chat_message_put_char(rtt_message, lf);
|
||||
}
|
||||
BC_ASSERT_TRUE(wait_for_until(pauline->lc, marie->lc, &marie->stat.number_of_LinphoneIsComposingActiveReceived, strlen(message), 1000));
|
||||
BC_ASSERT_TRUE(wait_for(pauline->lc, marie->lc, &marie->stat.number_of_LinphoneMessageReceived, 1));
|
||||
}
|
||||
end_call(marie, pauline);
|
||||
}
|
||||
linphone_call_params_destroy(marie_params);
|
||||
linphone_core_manager_destroy(marie);
|
||||
linphone_core_manager_destroy(pauline);
|
||||
}
|
||||
|
||||
static void real_time_text_message_compat_crlf() {
|
||||
real_time_text_message_compat(TRUE, FALSE);
|
||||
}
|
||||
|
||||
static void real_time_text_message_compat_lf() {
|
||||
real_time_text_message_compat(FALSE, TRUE);
|
||||
}
|
||||
|
||||
void file_transfer_with_http_proxy(void) {
|
||||
if (transport_supported(LinphoneTransportTls)) {
|
||||
LinphoneCoreManager* marie = linphone_core_manager_new( "marie_rc");
|
||||
|
|
@ -1514,6 +1570,8 @@ test_t message_tests[] = {
|
|||
{"Real Time Text conversation", real_time_text_conversation},
|
||||
{"Real Time Text without audio", real_time_text_without_audio},
|
||||
{"Real Time Text with srtp", real_time_text_srtp},
|
||||
{"Real Time Text message compatibility crlf", real_time_text_message_compat_crlf},
|
||||
{"Real Time Text message compatibility lf", real_time_text_message_compat_lf},
|
||||
};
|
||||
|
||||
test_suite_t message_test_suite = {
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue