Commit e34327f5 authored by Ghislain MARY's avatar Ghislain MARY

Handle IM notification policy.

parent 6e37c97c
......@@ -304,6 +304,9 @@ void linphone_chat_room_destroy(LinphoneChatRoom *cr) {
}
void linphone_chat_room_release(LinphoneChatRoom *cr) {
linphone_chat_room_delete_composing_idle_timer(cr);
linphone_chat_room_delete_composing_refresh_timer(cr);
linphone_chat_room_delete_remote_composing_refresh_timer(cr);
cr->lc = NULL;
linphone_chat_room_unref(cr);
}
......@@ -457,6 +460,10 @@ 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 (message_not_encrypted) {
ms_free(message_not_encrypted);
}
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*/
......@@ -465,10 +472,6 @@ void _linphone_chat_room_send_message(LinphoneChatRoom *cr, LinphoneChatMessage
linphone_chat_message_unref(msg);
return;
}
if (message_not_encrypted) {
ms_free(message_not_encrypted);
}
}
// if operation failed, we should not change message state
if (msg->dir == LinphoneChatMessageOutgoing) {
......@@ -778,6 +781,8 @@ static void process_imdn(LinphoneChatRoom *cr, xmlparsing_context_t *xml_ctx) {
xmlXPathObjectPtr display_status_object;
const char *message_id_str = NULL;
const char *datetime_str = NULL;
LinphoneCore *lc = linphone_chat_room_get_core(cr);
LinphoneImNotifPolicy *policy = linphone_core_get_im_notif_policy(lc);
if (linphone_create_xml_xpath_context(xml_ctx) < 0)
return;
......@@ -808,7 +813,9 @@ static void process_imdn(LinphoneChatRoom *cr, xmlparsing_context_t *xml_ctx) {
if ((delivery_status_object->nodesetval != NULL) && (delivery_status_object->nodesetval->nodeNr >= 1)) {
xmlNodePtr node = delivery_status_object->nodesetval->nodeTab[0];
if ((node->children != NULL) && (node->children->name != NULL) && (strcmp((const char *)node->children->name, "delivered") == 0)) {
linphone_chat_message_update_state(cm, LinphoneChatMessageStateDeliveredToUser);
if (linphone_im_notif_policy_get_recv_imdn_delivered(policy) == TRUE) {
linphone_chat_message_update_state(cm, LinphoneChatMessageStateDeliveredToUser);
}
}
}
xmlXPathFreeObject(delivery_status_object);
......@@ -817,7 +824,9 @@ static void process_imdn(LinphoneChatRoom *cr, xmlparsing_context_t *xml_ctx) {
if ((display_status_object->nodesetval != NULL) && (display_status_object->nodesetval->nodeNr >= 1)) {
xmlNodePtr node = display_status_object->nodesetval->nodeTab[0];
if ((node->children != NULL) && (node->children->name != NULL) && (strcmp((const char *)node->children->name, "displayed") == 0)) {
linphone_chat_message_update_state(cm, LinphoneChatMessageStateDisplayed);
if (linphone_im_notif_policy_get_recv_imdn_displayed(policy) == TRUE) {
linphone_chat_message_update_state(cm, LinphoneChatMessageStateDisplayed);
}
}
}
xmlXPathFreeObject(display_status_object);
......@@ -969,46 +978,50 @@ static void linphone_chat_room_send_is_composing_notification(LinphoneChatRoom *
SalOp *op = NULL;
const char *identity = NULL;
char *content = NULL;
LinphoneProxyConfig *proxy = linphone_core_lookup_known_proxy(cr->lc, cr->peer_url);
LinphoneImEncryptionEngine *imee = linphone_core_get_im_encryption_engine(cr->lc);
LinphoneChatMessage *msg = NULL;
if (proxy)
identity = linphone_proxy_config_get_identity(proxy);
else
identity = linphone_core_get_primary_contact(cr->lc);
/*sending out of calls*/
op = sal_op_new(cr->lc->sal);
linphone_configure_op(cr->lc, op, cr->peer_url, NULL,
lp_config_get_int(cr->lc->config, "sip", "chat_msg_with_contact", 0));
LinphoneCore *lc = linphone_chat_room_get_core(cr);
LinphoneImNotifPolicy *policy = linphone_core_get_im_notif_policy(lc);
if (linphone_im_notif_policy_get_send_is_composing(policy) == TRUE) {
LinphoneProxyConfig *proxy = linphone_core_lookup_known_proxy(lc, cr->peer_url);
LinphoneImEncryptionEngine *imee = linphone_core_get_im_encryption_engine(lc);
LinphoneChatMessage *msg = NULL;
if (proxy)
identity = linphone_proxy_config_get_identity(proxy);
else
identity = linphone_core_get_primary_contact(lc);
/*sending out of calls*/
op = sal_op_new(lc->sal);
linphone_configure_op(lc, op, cr->peer_url, NULL,
lp_config_get_int(lc->config, "sip", "chat_msg_with_contact", 0));
content = linphone_chat_room_create_is_composing_xml(cr);
if (content != NULL) {
int retval = -1;
LinphoneAddress *from_addr = linphone_address_new(identity);
LinphoneAddress *to_addr = linphone_address_new(cr->peer);
msg = linphone_chat_room_create_message(cr, content);
linphone_chat_message_set_from_address(msg, from_addr);
linphone_chat_message_set_to_address(msg, to_addr);
msg->content_type = ms_strdup("application/im-iscomposing+xml");
if (imee) {
LinphoneImEncryptionEngineCbs *imee_cbs = linphone_im_encryption_engine_get_callbacks(imee);
LinphoneImEncryptionEngineCbsOutgoingMessageCb cb_process_outgoing_message = linphone_im_encryption_engine_cbs_get_process_outgoing_message(imee_cbs);
if (cb_process_outgoing_message) {
retval = cb_process_outgoing_message(imee, cr, msg);
}
}
content = linphone_chat_room_create_is_composing_xml(cr);
if (content != NULL) {
int retval = -1;
LinphoneAddress *from_addr = linphone_address_new(identity);
LinphoneAddress *to_addr = linphone_address_new(cr->peer);
msg = linphone_chat_room_create_message(cr, content);
linphone_chat_message_set_from_address(msg, from_addr);
linphone_chat_message_set_to_address(msg, to_addr);
msg->content_type = ms_strdup("application/im-iscomposing+xml");
if (imee) {
LinphoneImEncryptionEngineCbs *imee_cbs = linphone_im_encryption_engine_get_callbacks(imee);
LinphoneImEncryptionEngineCbsOutgoingMessageCb cb_process_outgoing_message = linphone_im_encryption_engine_cbs_get_process_outgoing_message(imee_cbs);
if (cb_process_outgoing_message) {
retval = cb_process_outgoing_message(imee, cr, msg);
if (retval <= 0) {
sal_message_send(op, identity, cr->peer, msg->content_type, msg->message, NULL);
}
}
if (retval <= 0) {
sal_message_send(op, identity, cr->peer, msg->content_type, msg->message, NULL);
linphone_chat_message_unref(msg);
linphone_address_destroy(from_addr);
linphone_address_destroy(to_addr);
ms_free(content);
sal_op_unref(op);
}
linphone_chat_message_unref(msg);
linphone_address_destroy(from_addr);
linphone_address_destroy(to_addr);
ms_free(content);
sal_op_unref(op);
}
}
......@@ -1123,9 +1136,9 @@ static void linphone_chat_message_send_imdn(LinphoneChatMessage *cm, enum ImdnTy
if (imee) {
LinphoneImEncryptionEngineCbs *imee_cbs = linphone_im_encryption_engine_get_callbacks(imee);
LinphoneImEncryptionEngineOutgoingMessageCb cb_process_outgoing_message = linphone_im_encryption_engine_cbs_get_process_outgoing_message(imee_cbs);
LinphoneImEncryptionEngineCbsOutgoingMessageCb cb_process_outgoing_message = linphone_im_encryption_engine_cbs_get_process_outgoing_message(imee_cbs);
if (cb_process_outgoing_message) {
retval = cb_process_outgoing_message(cr->lc, cr, msg);
retval = cb_process_outgoing_message(imee, cr, msg);
}
}
......@@ -1142,11 +1155,21 @@ static void linphone_chat_message_send_imdn(LinphoneChatMessage *cm, enum ImdnTy
}
void linphone_chat_message_send_delivery_notification(LinphoneChatMessage *cm) {
linphone_chat_message_send_imdn(cm, ImdnTypeDelivery);
LinphoneChatRoom *cr = linphone_chat_message_get_chat_room(cm);
LinphoneCore *lc = linphone_chat_room_get_core(cr);
LinphoneImNotifPolicy *policy = linphone_core_get_im_notif_policy(lc);
if (linphone_im_notif_policy_get_send_imdn_delivered(policy) == TRUE) {
linphone_chat_message_send_imdn(cm, ImdnTypeDelivery);
}
}
void linphone_chat_message_send_display_notification(LinphoneChatMessage *cm) {
linphone_chat_message_send_imdn(cm, ImdnTypeDisplay);
LinphoneChatRoom *cr = linphone_chat_message_get_chat_room(cm);
LinphoneCore *lc = linphone_chat_room_get_core(cr);
LinphoneImNotifPolicy *policy = linphone_core_get_im_notif_policy(lc);
if (linphone_im_notif_policy_get_send_imdn_displayed(policy) == TRUE) {
linphone_chat_message_send_imdn(cm, ImdnTypeDisplay);
}
}
static char* utf8_to_char(uint32_t ic) {
......
......@@ -40,30 +40,30 @@ static void load_im_notif_policy_from_config(LinphoneImNotifPolicy *policy) {
const char *value = (const char *)bctbx_list_get_data(elem);
if (strcasecmp(value, "all") == 0) {
policy->send_is_composing = TRUE;
policy->display_is_composing = TRUE;
policy->recv_is_composing = TRUE;
policy->send_imdn_delivered = TRUE;
policy->display_imdn_delivered = TRUE;
policy->recv_imdn_delivered = TRUE;
policy->send_imdn_displayed = TRUE;
policy->display_imdn_displayed = TRUE;
policy->recv_imdn_displayed = TRUE;
} else if (strcasecmp(value, "none") == 0) {
policy->send_is_composing = FALSE;
policy->display_is_composing = FALSE;
policy->recv_is_composing = FALSE;
policy->send_imdn_delivered = FALSE;
policy->display_imdn_delivered = FALSE;
policy->recv_imdn_delivered = FALSE;
policy->send_imdn_displayed = FALSE;
policy->display_imdn_displayed = FALSE;
policy->recv_imdn_displayed = FALSE;
} else if (strcasecmp(value, "send_is_comp") == 0) {
policy->send_is_composing = TRUE;
} else if (strcasecmp(value, "disp_is_comp") == 0) {
policy->display_is_composing = TRUE;
} else if (strcasecmp(value, "recv_is_comp") == 0) {
policy->recv_is_composing = TRUE;
} else if (strcasecmp(value, "send_imdn_delivered") == 0) {
policy->send_imdn_delivered = TRUE;
} else if (strcasecmp(value, "disp_imdn_delivered") == 0) {
policy->display_imdn_delivered = TRUE;
} else if (strcasecmp(value, "recv_imdn_delivered") == 0) {
policy->recv_imdn_delivered = TRUE;
} else if (strcasecmp(value, "send_imdn_displayed") == 0) {
policy->send_imdn_displayed = TRUE;
} else if (strcasecmp(value, "disp_imdn_displayed") == 0) {
policy->display_imdn_displayed = TRUE;
} else if (strcasecmp(value, "recv_imdn_displayed") == 0) {
policy->recv_imdn_displayed = TRUE;
}
}
if (values != default_list) {
......@@ -75,32 +75,32 @@ static void load_im_notif_policy_from_config(LinphoneImNotifPolicy *policy) {
static void save_im_notif_policy_to_config(LinphoneImNotifPolicy *policy) {
bctbx_list_t *values = NULL;
if ((policy->send_is_composing == TRUE)
&& (policy->display_is_composing == TRUE)
&& (policy->recv_is_composing == TRUE)
&& (policy->send_imdn_delivered == TRUE)
&& (policy->display_imdn_delivered == TRUE)
&& (policy->recv_imdn_delivered == TRUE)
&& (policy->send_imdn_displayed == TRUE)
&& (policy->display_imdn_displayed == TRUE)) {
&& (policy->recv_imdn_displayed == TRUE)) {
/* Do not save anything, the default is everything enabled */
} else if ((policy->send_is_composing == FALSE)
&& (policy->display_is_composing == FALSE)
&& (policy->recv_is_composing == FALSE)
&& (policy->send_imdn_delivered == FALSE)
&& (policy->display_imdn_delivered == FALSE)
&& (policy->recv_imdn_delivered == FALSE)
&& (policy->send_imdn_displayed == FALSE)
&& (policy->display_imdn_displayed == FALSE)) {
&& (policy->recv_imdn_displayed == FALSE)) {
values = bctbx_list_append(values, "none");
} else {
if (policy->send_is_composing == TRUE)
values = bctbx_list_append(values, "send_is_comp");
if (policy->display_is_composing == TRUE)
values = bctbx_list_append(values, "disp_is_comp");
if (policy->recv_is_composing == TRUE)
values = bctbx_list_append(values, "recv_is_comp");
if (policy->send_imdn_delivered == TRUE)
values = bctbx_list_append(values, "send_imdn_delivered");
if (policy->display_imdn_delivered == TRUE)
values = bctbx_list_append(values, "disp_imdn_delivered");
if (policy->recv_imdn_delivered == TRUE)
values = bctbx_list_append(values, "recv_imdn_delivered");
if (policy->send_imdn_displayed == TRUE)
values = bctbx_list_append(values, "send_imdn_displayed");
if (policy->display_imdn_displayed == TRUE)
values = bctbx_list_append(values, "disp_imdn_displayed");
if (policy->recv_imdn_displayed == TRUE)
values = bctbx_list_append(values, "recv_imdn_displayed");
}
lp_config_set_string_list(policy->lc->config, "sip", "im_notif_policy", values);
if (values != NULL) bctbx_list_free(values);
......@@ -126,11 +126,21 @@ void linphone_im_notif_policy_set_user_data(LinphoneImNotifPolicy *policy, void
void linphone_im_notif_policy_clear(LinphoneImNotifPolicy *policy) {
policy->send_is_composing = FALSE;
policy->display_is_composing = FALSE;
policy->recv_is_composing = FALSE;
policy->send_imdn_delivered = FALSE;
policy->display_imdn_delivered = FALSE;
policy->recv_imdn_delivered = FALSE;
policy->send_imdn_displayed = FALSE;
policy->display_imdn_displayed = FALSE;
policy->recv_imdn_displayed = FALSE;
save_im_notif_policy_to_config(policy);
}
void linphone_im_notif_policy_enable_all(LinphoneImNotifPolicy *policy) {
policy->send_is_composing = TRUE;
policy->recv_is_composing = TRUE;
policy->send_imdn_delivered = TRUE;
policy->recv_imdn_delivered = TRUE;
policy->send_imdn_displayed = TRUE;
policy->recv_imdn_displayed = TRUE;
save_im_notif_policy_to_config(policy);
}
......@@ -143,12 +153,12 @@ void linphone_im_notif_policy_set_send_is_composing(LinphoneImNotifPolicy *polic
save_im_notif_policy_to_config(policy);
}
bool_t linphone_im_notif_policy_get_display_is_composing(const LinphoneImNotifPolicy *policy) {
return policy->display_is_composing;
bool_t linphone_im_notif_policy_get_recv_is_composing(const LinphoneImNotifPolicy *policy) {
return policy->recv_is_composing;
}
void linphone_im_notif_policy_set_display_is_composing(LinphoneImNotifPolicy *policy, bool_t enable) {
policy->display_is_composing = enable;
void linphone_im_notif_policy_set_recv_is_composing(LinphoneImNotifPolicy *policy, bool_t enable) {
policy->recv_is_composing = enable;
save_im_notif_policy_to_config(policy);
}
......@@ -161,12 +171,12 @@ void linphone_im_notif_policy_set_send_imdn_delivered(LinphoneImNotifPolicy *pol
save_im_notif_policy_to_config(policy);
}
bool_t linphone_im_notif_policy_get_display_imdn_delivered(const LinphoneImNotifPolicy *policy) {
return policy->display_imdn_delivered;
bool_t linphone_im_notif_policy_get_recv_imdn_delivered(const LinphoneImNotifPolicy *policy) {
return policy->recv_imdn_delivered;
}
void linphone_im_notif_policy_set_display_imdn_delivered(LinphoneImNotifPolicy *policy, bool_t enable) {
policy->display_imdn_delivered = enable;
void linphone_im_notif_policy_set_recv_imdn_delivered(LinphoneImNotifPolicy *policy, bool_t enable) {
policy->recv_imdn_delivered = enable;
save_im_notif_policy_to_config(policy);
}
......@@ -179,12 +189,12 @@ void linphone_im_notif_policy_set_send_imdn_displayed(LinphoneImNotifPolicy *pol
save_im_notif_policy_to_config(policy);
}
bool_t linphone_im_notif_policy_get_display_imdn_displayed(const LinphoneImNotifPolicy *policy) {
return policy->display_imdn_displayed;
bool_t linphone_im_notif_policy_get_recv_imdn_displayed(const LinphoneImNotifPolicy *policy) {
return policy->recv_imdn_displayed;
}
void linphone_im_notif_policy_set_display_imdn_displayed(LinphoneImNotifPolicy *policy, bool_t enable) {
policy->display_imdn_displayed = enable;
void linphone_im_notif_policy_set_recv_imdn_displayed(LinphoneImNotifPolicy *policy, bool_t enable) {
policy->recv_imdn_displayed = enable;
save_im_notif_policy_to_config(policy);
}
......
......@@ -1297,11 +1297,11 @@ struct _LinphoneImNotifPolicy {
void *user_data;
LinphoneCore *lc;
bool_t send_is_composing;
bool_t display_is_composing;
bool_t recv_is_composing;
bool_t send_imdn_delivered;
bool_t display_imdn_delivered;
bool_t recv_imdn_delivered;
bool_t send_imdn_displayed;
bool_t display_imdn_displayed;
bool_t recv_imdn_displayed;
};
BELLE_SIP_DECLARE_VPTR(LinphoneImNotifPolicy);
......
......@@ -213,8 +213,11 @@ void linphone_core_notify_file_transfer_progress_indication(LinphoneCore *lc, Li
#pragma GCC diagnostic pop
#endif
void linphone_core_notify_is_composing_received(LinphoneCore *lc, LinphoneChatRoom *room) {
NOTIFY_IF_EXIST(is_composing_received, lc,room);
cleanup_dead_vtable_refs(lc);
LinphoneImNotifPolicy *policy = linphone_core_get_im_notif_policy(lc);
if (linphone_im_notif_policy_get_recv_is_composing(policy) == TRUE) {
NOTIFY_IF_EXIST(is_composing_received, lc,room);
cleanup_dead_vtable_refs(lc);
}
}
void linphone_core_notify_dtmf_received(LinphoneCore* lc, LinphoneCall *call, int dtmf) {
......
......@@ -32,7 +32,7 @@ extern "C" {
*/
/**
* Policy to use to send/display instant messaging composing/delivery/display notifications.
* Policy to use to send/receive instant messaging composing/delivery/display notifications.
* The sending of this information is done as in the RFCs 3994 (is_composing) and 5438 (imdn delivered/displayed).
*/
typedef struct _LinphoneImNotifPolicy LinphoneImNotifPolicy;
......@@ -66,11 +66,17 @@ LINPHONE_PUBLIC void *linphone_im_notif_policy_get_user_data(const LinphoneImNot
LINPHONE_PUBLIC void linphone_im_notif_policy_set_user_data(LinphoneImNotifPolicy *policy, void *ud);
/**
* Clear an IM notif policy (deactivate all display and sending of notifications).
* Clear an IM notif policy (deactivate all receiving and sending of notifications).
* @param[in] policy LinphoneImNotifPolicy object.
*/
LINPHONE_PUBLIC void linphone_im_notif_policy_clear(LinphoneImNotifPolicy *policy);
/**
* Enable all receiving and sending of notifications.
* @param[in] policy LinphoneImNotifPolicy object.
*/
LINPHONE_PUBLIC void linphone_im_notif_policy_enable_all(LinphoneImNotifPolicy *policy);
/**
* Tell whether is_composing notifications are being sent.
* @param[in] policy LinphoneImNotifPolicy object
......@@ -86,18 +92,18 @@ LINPHONE_PUBLIC bool_t linphone_im_notif_policy_get_send_is_composing(const Linp
LINPHONE_PUBLIC void linphone_im_notif_policy_set_send_is_composing(LinphoneImNotifPolicy *policy, bool_t enable);
/**
* Tell whether is_composing notifications are being displayed.
* Tell whether is_composing notifications are being notified when received.
* @param[in] policy LinphoneImNotifPolicy object
* @return Boolean value telling whether is_composing notifications are being displayed.
* @return Boolean value telling whether is_composing notifications are being notified when received.
*/
LINPHONE_PUBLIC bool_t linphone_im_notif_policy_get_display_is_composing(const LinphoneImNotifPolicy *policy);
LINPHONE_PUBLIC bool_t linphone_im_notif_policy_get_recv_is_composing(const LinphoneImNotifPolicy *policy);
/**
* Enable is_composing notifications display.
* Enable is_composing notifications receiving.
* @param[in] policy LinphoneImNotifPolicy object
* @param[in] enable Boolean value telling whether to display is_composing notifications.
* @param[in] enable Boolean value telling whether to notify received is_composing notifications.
*/
LINPHONE_PUBLIC void linphone_im_notif_policy_set_display_is_composing(LinphoneImNotifPolicy *policy, bool_t enable);
LINPHONE_PUBLIC void linphone_im_notif_policy_set_recv_is_composing(LinphoneImNotifPolicy *policy, bool_t enable);
/**
* Tell whether imdn delivered notifications are being sent.
......@@ -114,18 +120,18 @@ LINPHONE_PUBLIC bool_t linphone_im_notif_policy_get_send_imdn_delivered(const Li
LINPHONE_PUBLIC void linphone_im_notif_policy_set_send_imdn_delivered(LinphoneImNotifPolicy *policy, bool_t enable);
/**
* Tell whether imdn delivered notifications are being displayed.
* Tell whether imdn delivered notifications are being notified when received.
* @param[in] policy LinphoneImNotifPolicy object
* @return Boolean value telling whether imdn delivered notifications are being displayed.
* @return Boolean value telling whether imdn delivered notifications are being notified when received.
*/
LINPHONE_PUBLIC bool_t linphone_im_notif_policy_get_display_imdn_delivered(const LinphoneImNotifPolicy *policy);
LINPHONE_PUBLIC bool_t linphone_im_notif_policy_get_recv_imdn_delivered(const LinphoneImNotifPolicy *policy);
/**
* Enable imdn delivered notifications display.
* Enable imdn delivered notifications receiving.
* @param[in] policy LinphoneImNotifPolicy object
* @param[in] enable Boolean value telling whether to display imdn delivered notifications.
* @param[in] enable Boolean value telling whether to notify received imdn delivered notifications.
*/
LINPHONE_PUBLIC void linphone_im_notif_policy_set_display_imdn_delivered(LinphoneImNotifPolicy *policy, bool_t enable);
LINPHONE_PUBLIC void linphone_im_notif_policy_set_recv_imdn_delivered(LinphoneImNotifPolicy *policy, bool_t enable);
/**
* Tell whether imdn displayed notifications are being sent.
......@@ -142,18 +148,18 @@ LINPHONE_PUBLIC bool_t linphone_im_notif_policy_get_send_imdn_displayed(const Li
LINPHONE_PUBLIC void linphone_im_notif_policy_set_send_imdn_displayed(LinphoneImNotifPolicy *policy, bool_t enable);
/**
* Tell whether imdn displayed notifications are being displayed.
* Tell whether imdn displayed notifications are being notified when received.
* @param[in] policy LinphoneImNotifPolicy object
* @return Boolean value telling whether imdn displayed notifications are being displayed.
* @return Boolean value telling whether imdn displayed notifications are being notified when received.
*/
LINPHONE_PUBLIC bool_t linphone_im_notif_policy_get_display_imdn_displayed(const LinphoneImNotifPolicy *policy);
LINPHONE_PUBLIC bool_t linphone_im_notif_policy_get_recv_imdn_displayed(const LinphoneImNotifPolicy *policy);
/**
* Enable imdn displayed notifications display.
* Enable imdn displayed notifications receiving.
* @param[in] policy LinphoneImNotifPolicy object
* @param[in] enable Boolean value telling whether to display imdn displayed notifications.
* @param[in] enable Boolean value telling whether to notify received imdn displayed notifications.
*/
LINPHONE_PUBLIC void linphone_im_notif_policy_set_display_imdn_displayed(LinphoneImNotifPolicy *policy, bool_t enable);
LINPHONE_PUBLIC void linphone_im_notif_policy_set_recv_imdn_displayed(LinphoneImNotifPolicy *policy, bool_t enable);
/**
* Get the LinphoneImNotifPolicy object controlling the instant messaging notifications.
......
......@@ -451,6 +451,7 @@ void transfer_message_base2(LinphoneCoreManager* marie, LinphoneCoreManager* pau
LinphoneChatRoom* chat_room;
LinphoneChatMessage* msg;
LinphoneChatMessageCbs *cbs;
bctbx_list_t *msg_list = NULL;
/* Remove any previously downloaded file */
remove(receive_filepath);
......@@ -486,8 +487,18 @@ void transfer_message_base2(LinphoneCoreManager* marie, LinphoneCoreManager* pau
BC_ASSERT_TRUE(wait_for(pauline->lc,marie->lc,&pauline->stat.number_of_LinphoneRegistrationOk,pauline->stat.number_of_LinphoneRegistrationOk+1));
} else {
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);
if (marie->stat.last_received_chat_message) {
LinphoneChatMessage *recv_msg;
if (download_from_history) {
LinphoneChatRoom *marie_room = linphone_core_get_chat_room(marie->lc, pauline->identity);
msg_list = linphone_chat_room_get_history(marie_room,1);
BC_ASSERT_PTR_NOT_NULL(msg_list);
if (!msg_list) goto end;
recv_msg = (LinphoneChatMessage *)msg_list->data;
} 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_cbs_set_file_transfer_progress_indication(cbs, file_transfer_progress_indication);
......@@ -833,7 +844,7 @@ static void _is_composing_notification(bool_t lime_enabled) {
LinphoneCoreManager* marie = linphone_core_manager_new("marie_rc");
LinphoneCoreManager* pauline = linphone_core_manager_new( "pauline_tcp_rc");
if (lime_enabled) {
if (!linphone_core_lime_available(marie->lc)) {
ms_warning("Lime not available, skiping");
......@@ -885,7 +896,7 @@ static void is_composing_notification_with_lime(void) {
static void imdn_notifications(void) {
LinphoneCoreManager *marie = linphone_core_manager_new("marie_rc");
LinphoneCoreManager *pauline = linphone_core_manager_new( "pauline_tcp_rc");
LinphoneCoreManager *pauline = linphone_core_manager_new("pauline_tcp_rc");
LinphoneChatRoom *pauline_chat_room = linphone_core_get_chat_room(pauline->lc, marie->identity);
LinphoneChatRoom *marie_chat_room;
LinphoneChatMessage *sent_cm;
......@@ -893,6 +904,8 @@ static void imdn_notifications(void) {
LinphoneChatMessageCbs *cbs;
bctbx_list_t *history;
linphone_im_notif_policy_enable_all(linphone_core_get_im_notif_policy(marie->lc));
linphone_im_notif_policy_enable_all(linphone_core_get_im_notif_policy(pauline->lc));
sent_cm = linphone_chat_room_create_message(pauline_chat_room, "Tell me if you get my message");
linphone_chat_message_ref(sent_cm);
cbs = linphone_chat_message_get_callbacks(sent_cm);
......@@ -916,6 +929,90 @@ static void imdn_notifications(void) {
linphone_core_manager_destroy(pauline);
}
static void im_notification_policy(void) {
LinphoneCoreManager *marie = linphone_core_manager_new("marie_rc");
LinphoneCoreManager *pauline = linphone_core_manager_new("pauline_tcp_rc");
LinphoneImNotifPolicy *marie_policy = linphone_core_get_im_notif_policy(marie->lc);
LinphoneImNotifPolicy *pauline_policy = linphone_core_get_im_notif_policy(pauline->lc);
LinphoneChatRoom *pauline_chat_room = linphone_core_get_chat_room(pauline->lc, marie->identity);
LinphoneChatRoom *marie_chat_room;
LinphoneChatMessage *msg1;
LinphoneChatMessage *msg2;
LinphoneChatMessage *msg3;
LinphoneChatMessage *msg4;
LinphoneChatMessageCbs *cbs;
int dummy = 0;
linphone_im_notif_policy_enable_all(marie_policy);
linphone_im_notif_policy_clear(pauline_policy);
marie_chat_room = linphone_core_get_chat_room(marie->lc, pauline->identity); /* Make marie create the chatroom with pauline, which is necessary for receiving the is-composing */
/* Test is_composing sending */
linphone_chat_room_compose(pauline_chat_room);
wait_for_until(pauline->lc, marie->lc, &dummy, 1, 1500); /* Just to sleep while iterating */
BC_ASSERT_EQUAL(marie->stat.number_of_LinphoneIsComposingActiveReceived, 0, int, "%d");
linphone_im_notif_policy_set_send_is_composing(pauline_policy, TRUE);
linphone_chat_room_compose(pauline_chat_room);
BC_ASSERT_TRUE(wait_for(pauline->lc, marie->lc, &marie->stat.number_of_LinphoneIsComposingActiveReceived, 1));
/* Test is_composing receiving */
linphone_chat_room_compose(marie_chat_room);
wait_for_until(pauline->lc, marie->lc, &dummy, 1, 1500); /* Just to sleep while iterating */
BC_ASSERT_EQUAL(pauline->stat.number_of_LinphoneIsComposingActiveReceived, 0, int, "%d");
linphone_im_notif_policy_set_recv_is_composing(pauline_policy, TRUE);
linphone_chat_room_compose(marie_chat_room);
BC_ASSERT_TRUE(wait_for(pauline->lc, marie->lc, &pauline->stat.number_of_LinphoneIsComposingActiveReceived, 1));
/* Test imdn delivered */
msg1 = linphone_chat_room_create_message(pauline_chat_room, "Happy new year!");
linphone_chat_message_ref(msg1);
cbs = linphone_chat_message_get_callbacks(msg1);
linphone_chat_message_cbs_set_msg_state_changed(cbs, liblinphone_tester_chat_message_msg_state_changed);
linphone_chat_room_send_chat_message(pauline_chat_room, msg1);
BC_ASSERT_TRUE(wait_for(pauline->lc, marie->lc, &marie->stat.number_of_LinphoneMessageReceived, 1));
wait_for_until(pauline->lc, marie->lc, &dummy, 1, 1500); /* Just to sleep while iterating */
BC_ASSERT_EQUAL(pauline->stat.number_of_LinphoneMessageDeliveredToUser, 0, int, "%d");
linphone_im_notif_policy_set_recv_imdn_delivered(pauline_policy, TRUE);
msg2 = linphone_chat_room_create_message(pauline_chat_room, "I said: Happy new year!");
linphone_chat_message_ref(msg2);
cbs = linphone_chat_message_get_callbacks(msg2);
linphone_chat_message_cbs_set_msg_state_changed(cbs, liblinphone_tester_chat_message_msg_state_changed);
linphone_chat_room_send_chat_message(pauline_chat_room, msg2);
BC_ASSERT_TRUE(wait_for(pauline->lc, marie->lc, &marie->stat.number_of_LinphoneMessageReceived, 2));
BC_ASSERT_TRUE(wait_for(pauline->lc, marie->lc, &pauline->stat.number_of_LinphoneMessageDeliveredToUser, 1));
msg3 = linphone_chat_room_create_message(marie_chat_room, "Thank you! Happy easter to you!");
linphone_chat_message_ref(msg3);
cbs = linphone_chat_message_get_callbacks(msg3);
linphone_chat_message_cbs_set_msg_state_changed(cbs, liblinphone_tester_chat_message_msg_state_changed);
linphone_chat_room_send_chat_message(marie_chat_room, msg3);
BC_ASSERT_TRUE(wait_for(pauline->lc, marie->lc, &pauline->stat.number_of_LinphoneMessageReceived, 1));
wait_for_until(pauline->lc, marie->lc, &dummy, 1, 1500); /* Just to sleep while iterating */
BC_ASSERT_EQUAL(marie->stat.number_of_LinphoneMessageDeliveredToUser, 0, int, "%d");
linphone_im_notif_policy_set_send_imdn_delivered(pauline_policy, TRUE);
msg4 = linphone_chat_room_create_message(marie_chat_room, "Yeah, yeah, I heard that...");
linphone_chat_message_ref(msg4);
cbs = linphone_chat_message_get_callbacks(msg4);
linphone_chat_message_cbs_set_msg_state_changed(cbs, liblinphone_tester_chat_message_msg_state_changed);
linphone_chat_room_send_chat_message(marie_chat_room, msg4);
BC_ASSERT_TRUE(wait_for(pauline->lc, marie->lc, &pauline->stat.number_of_LinphoneMessageReceived, 2));
BC_ASSERT_TRUE(wait_for(pauline->lc, marie->lc, &marie->stat.number_of_LinphoneMessageDeliveredToUser, 1));
/* Test imdn displayed */
linphone_im_notif_policy_set_send_imdn_displayed(pauline_policy, TRUE);
linphone_chat_room_mark_as_read(pauline_chat_room);
BC_ASSERT_TRUE(wait_for(pauline->lc, marie->lc, &marie->stat.number_of_LinphoneMessageDisplayed, 2));
linphone_im_notif_policy_set_recv_imdn_displayed(pauline_policy, TRUE);
linphone_chat_room_mark_as_read(marie_chat_room);
BC_ASSERT_TRUE(wait_for(pauline->lc, marie->lc, &pauline->stat.number_of_LinphoneMessageDisplayed, 2));
linphone_chat_message_unref(msg1);
linphone_chat_message_unref(msg2);
linphone_chat_message_unref(msg3);
linphone_chat_message_unref(msg4);
linphone_core_manager_destroy(marie);
linphone_core_manager_destroy(pauline);
}
static void lime_text_message(void) {
FILE *ZIDCacheMarieFD, *ZIDCachePaulineFD;
LinphoneChatRoom* chat_room;
......@@ -927,7 +1024,7 @@ static void lime_text_message(void) {
ms_warning("Lime not available, skiping");
goto end;
}
/* make sure lime is enabled */
/* make sure lime is enabled and im notify policy is empty */
linphone_core_enable_lime(marie->lc, 1);
linphone_core_enable_lime(pauline->lc, 1);
......@@ -2083,6 +2180,7 @@ test_t message_tests[] = {
TEST_NO_TAG("IsComposing notification", is_composing_notification),
TEST_ONE_TAG("IsComposing notification lime", is_composing_notification_with_lime, "LIME"),
TEST_NO_TAG("IMDN notifications", imdn_notifications),
TEST_NO_TAG("IM notification policy", im_notification_policy),
TEST_ONE_TAG("Lime text message", lime_text_message, "LIME"),
TEST_ONE_TAG("Lime text message to non lime", lime_text_message_to_non_lime, "LIME"),
TEST_ONE_TAG("Lime transfer message", lime_transfer_message, "LIME"),
......
......@@ -290,8 +290,10 @@ bool_t transport_supported(LinphoneTransportType transport) {
#pragma GCC diagnostic ignored "-Wdeprecated-declarations"
#endif
void linphone_core_manager_init(LinphoneCoreManager *mgr, const char* rc_file, const char* phone_alias) {
LinphoneImNotifPolicy *im_notif_policy;
char *rc_path = NULL;
char *hellopath = bc_tester_res("sounds/hello8000.wav");
mgr->number_of_bcunit_error_at_creation = bc_get_number_of_failures();
mgr->v_table.registration_state_changed=registration_state_changed;
mgr->v_table.auth_info_requested=auth_info_requested;
......@@ -319,6 +321,10 @@ void linphone_core_manager_init(LinphoneCoreManager *mgr, const char* rc_file, c
if (rc_file) rc_path = ms_strdup_printf("rcfiles/%s", rc_file);
mgr->lc=configure_lc_from(&mgr->v_table, bc_tester_get_resource_dir_prefix(), rc_path, mgr);
linphone_core_manager_check_accounts(mgr);
im_notif_policy = linphone_core_get_im_notif_policy(mgr->lc);
linphone_im_notif_policy_clear(im_notif_policy);
linphone_im_notif_policy_set_send_is_composing(im_notif_policy, TRUE);
linphone_im_notif_policy_set_recv_is_composing(im_notif_policy, TRUE);
manager_count++;
......@@ -438,9 +444,11 @@ void linphone_core_manager_stop(LinphoneCoreManager *mgr){
}
}
linphone_core_destroy(mgr->lc);
if (chatdb && ortp_file_exist(chatdb)==0) {
if (unlink(chatdb) != 0){
ms_error("Could not delete %s: %s", chatdb, strerror(errno));
if (chatdb) {
if (ortp_file_exist(chatdb)==0) {
if (unlink(chatdb) != 0){
ms_error("Could not delete %s: %s", chatdb, strerror(errno));
}
}
ms_free(chatdb);
}
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment