diff --git a/coreapi/linphonecore.c b/coreapi/linphonecore.c index 8e4416df4..de865fead 100644 --- a/coreapi/linphonecore.c +++ b/coreapi/linphonecore.c @@ -425,6 +425,14 @@ void linphone_core_cbs_set_version_update_check_result_received(LinphoneCoreCbs cbs->vtable->version_update_check_result_received = cb; } +LinphoneCoreCbsChatRoomInstantiatedCb linphone_core_cbs_get_chat_room_instantiated (LinphoneCoreCbs *cbs) { + return cbs->vtable->chat_room_instantiated; +} + +void linphone_core_cbs_set_chat_room_instantiated (LinphoneCoreCbs *cbs, LinphoneCoreCbsChatRoomInstantiatedCb cb) { + cbs->vtable->chat_room_instantiated = cb; +} + typedef belle_sip_object_t_vptr_t LinphoneCore_vptr_t; BELLE_SIP_DECLARE_NO_IMPLEMENTED_INTERFACES(LinphoneCore); diff --git a/coreapi/private.h b/coreapi/private.h index d8f94da45..7f25bb906 100644 --- a/coreapi/private.h +++ b/coreapi/private.h @@ -508,6 +508,7 @@ LinphoneChatRoom * linphone_client_group_chat_room_new(LinphoneCore *lc, const b void linphone_chat_room_release(LinphoneChatRoom *cr); void linphone_chat_room_set_call(LinphoneChatRoom *cr, LinphoneCall *call); bctbx_list_t * linphone_chat_room_get_transient_messages(const LinphoneChatRoom *cr); +LinphoneChatRoomCbs * linphone_chat_room_cbs_new (void); void linphone_chat_message_destroy(LinphoneChatMessage* msg); void linphone_chat_message_update_state(LinphoneChatMessage *msg, LinphoneChatMessageState new_state); void linphone_chat_message_set_state(LinphoneChatMessage *msg, LinphoneChatMessageState state); @@ -1681,6 +1682,7 @@ BELLE_SIP_TYPE_ID(LinphoneCallParams), BELLE_SIP_TYPE_ID(LinphoneChatMessage), BELLE_SIP_TYPE_ID(LinphoneChatMessageCbs), BELLE_SIP_TYPE_ID(LinphoneChatRoom), +BELLE_SIP_TYPE_ID(LinphoneChatRoomCbs), BELLE_SIP_TYPE_ID(LinphoneContent), BELLE_SIP_TYPE_ID(LinphoneImEncryptionEngine), BELLE_SIP_TYPE_ID(LinphoneImEncryptionEngineCbs), @@ -1770,6 +1772,7 @@ void linphone_core_notify_friend_list_created(LinphoneCore *lc, LinphoneFriendLi void linphone_core_notify_friend_list_removed(LinphoneCore *lc, LinphoneFriendList *list); void linphone_core_notify_call_created(LinphoneCore *lc, LinphoneCall *call); void linphone_core_notify_version_update_check_result_received(LinphoneCore *lc, LinphoneVersionUpdateCheckResult result, const char *version, const char *url); +void linphone_core_notify_chat_room_instantiated (LinphoneCore *lc, LinphoneChatRoom *cr); void set_playback_gain_db(AudioStream *st, float gain); diff --git a/coreapi/vtables.c b/coreapi/vtables.c index ca9960ef9..ada08a8e7 100644 --- a/coreapi/vtables.c +++ b/coreapi/vtables.c @@ -321,6 +321,11 @@ void linphone_core_notify_version_update_check_result_received(LinphoneCore *lc, cleanup_dead_vtable_refs(lc); } +void linphone_core_notify_chat_room_instantiated (LinphoneCore *lc, LinphoneChatRoom *cr) { + NOTIFY_IF_EXIST(chat_room_instantiated, lc, cr); + cleanup_dead_vtable_refs(lc); +} + static VTableReference * v_table_reference_new(LinphoneCoreCbs *cbs, bool_t internal){ VTableReference *ref=ms_new0(VTableReference,1); ref->valid=TRUE; diff --git a/include/CMakeLists.txt b/include/CMakeLists.txt index ecedd8a55..54af30490 100644 --- a/include/CMakeLists.txt +++ b/include/CMakeLists.txt @@ -76,7 +76,9 @@ set(ROOT_HEADER_FILES set(C_API_HEADER_FILES c-address.h c-api.h + c-callbacks.h c-chat-room.h + c-chat-room-cbs.h c-event-log.h c-participant.h c-types.h diff --git a/include/linphone/api/c-callbacks.h b/include/linphone/api/c-callbacks.h new file mode 100644 index 000000000..7402dda84 --- /dev/null +++ b/include/linphone/api/c-callbacks.h @@ -0,0 +1,65 @@ +/* + * c-callbacks.h + * Copyright (C) 2017 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 3 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, see . + */ + +#ifndef _C_CALLBACKS_H_ +#define _C_CALLBACKS_H_ + +// TODO: Remove me in the future. +#include "linphone/callbacks.h" + +// ============================================================================= + +#ifdef __cplusplus + extern "C" { +#endif // ifdef __cplusplus + +/** + * @addtogroup chatroom + * @{ + */ + +/** + * Is composing notification callback prototype. + * @param[in] cr #LinphoneChatRoom involved in the conversation + * @param[in] participant The #LinphoneParticipant that has sent the is-composing notification + */ +typedef void (*LinphoneChatRoomCbsIsComposingReceivedCb) (LinphoneChatRoom *cr, const LinphoneParticipant *participant); + +/** + * Callback used to notify a chat room that a message has been received. + * @param[in] cr #LinphoneChatRoom object + * @param[in] msg The #LinphoneChatMessage that has been received + */ +typedef void (*LinphoneChatRoomCbsMessageReceivedCb) (LinphoneChatRoom *cr, LinphoneChatMessage *msg); + +/** + * Callback used to notify a chat room that a message has been received but we were unable to decrypt it + * @param cr #LinphoneChatRoom involved in this conversation + * @param msg The #LinphoneChatMessage that has been received + */ +typedef void (*LinphoneChatRoomCbsUndecryptableMessageReceivedCb) (LinphoneChatRoom *cr, LinphoneChatMessage *msg); + +/** + * @} +**/ + +#ifdef __cplusplus + } +#endif // ifdef __cplusplus + +#endif // ifndef _C_CALLBACKS_H_ diff --git a/include/linphone/api/c-chat-room-cbs.h b/include/linphone/api/c-chat-room-cbs.h new file mode 100644 index 000000000..2b26c2a3f --- /dev/null +++ b/include/linphone/api/c-chat-room-cbs.h @@ -0,0 +1,113 @@ +/* + * c-chat-room-cbs.h + * Copyright (C) 2017 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 3 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, see . + */ + +#ifndef _C_CHAT_ROOM_CBS_H_ +#define _C_CHAT_ROOM_CBS_H_ + +#include "linphone/api/c-callbacks.h" +#include "linphone/api/c-types.h" + +// ============================================================================= + +#ifdef __cplusplus + extern "C" { +#endif // ifdef __cplusplus + +/** + * @addtogroup chatroom + * @{ + */ + +/** + * Acquire a reference to the chat room callbacks object. + * @param[in] cbs The chat room callbacks object + * @return The same chat room callbacks object +**/ +LINPHONE_PUBLIC LinphoneChatRoomCbs * linphone_chat_room_cbs_ref (LinphoneChatRoomCbs *cbs); + +/** + * Release reference to the chat room callbacks object. + * @param[in] cr The chat room callbacks object +**/ +LINPHONE_PUBLIC void linphone_chat_room_cbs_unref (LinphoneChatRoomCbs *cbs); + +/** + * Retrieve the user pointer associated with the chat room callbacks object. + * @param[in] cr The chat room callbacks object + * @return The user pointer associated with the chat room callbacks object +**/ +LINPHONE_PUBLIC void * linphone_chat_room_cbs_get_user_data (const LinphoneChatRoomCbs *cbs); + +/** + * Assign a user pointer to the chat room callbacks object. + * @param[in] cr The chat room callbacks object + * @param[in] ud The user pointer to associate with the chat room callbacks object +**/ +LINPHONE_PUBLIC void linphone_chat_room_cbs_set_user_data (LinphoneChatRoomCbs *cbs, void *ud); + +/** + * Get the is-composing received callback. + * @param[in] cbs LinphoneChatRoomCbs object. + * @return The current is-composing received callback. + */ +LINPHONE_PUBLIC LinphoneChatRoomCbsIsComposingReceivedCb linphone_chat_room_cbs_get_is_composing_received (const LinphoneChatRoomCbs *cbs); + +/** + * Set the is-composing received callback. + * @param[in] cbs LinphoneChatRoomCbs object. + * @param[in] cb The is-composing received callback to be used. + */ +LINPHONE_PUBLIC void linphone_chat_room_cbs_set_is_composing_received (LinphoneChatRoomCbs *cbs, LinphoneChatRoomCbsIsComposingReceivedCb cb); + +/** + * Get the message received callback. + * @param[in] cbs LinphoneChatRoomCbs object. + * @return The current message received callback. + */ +LINPHONE_PUBLIC LinphoneChatRoomCbsMessageReceivedCb linphone_chat_room_cbs_get_message_received (const LinphoneChatRoomCbs *cbs); + +/** + * Set the message received callback. + * @param[in] cbs LinphoneChatRoomCbs object. + * @param[in] cb The message received callback to be used. + */ +LINPHONE_PUBLIC void linphone_chat_room_cbs_set_message_received (LinphoneChatRoomCbs *cbs, LinphoneChatRoomCbsMessageReceivedCb cb); + +/** + * Get the undecryptable message received callback. + * @param[in] cbs LinphoneChatRoomCbs object. + * @return The current undecryptable message received callback. + */ +LINPHONE_PUBLIC LinphoneChatRoomCbsUndecryptableMessageReceivedCb linphone_chat_room_cbs_get_undecryptable_message_received (const LinphoneChatRoomCbs *cbs); + +/** + * Set the undecryptable message received callback. + * @param[in] cbs LinphoneChatRoomCbs object. + * @param[in] cb The undecryptable message received callback to be used. + */ +LINPHONE_PUBLIC void linphone_chat_room_cbs_set_undecryptable_message_received (LinphoneChatRoomCbs *cbs, LinphoneChatRoomCbsUndecryptableMessageReceivedCb cb); + +/** + * @} + */ + +#ifdef __cplusplus + } +#endif // ifdef __cplusplus + +#endif // ifndef _C_CHAT_ROOM_H_ diff --git a/include/linphone/api/c-chat-room.h b/include/linphone/api/c-chat-room.h index 241609a9c..075abca35 100644 --- a/include/linphone/api/c-chat-room.h +++ b/include/linphone/api/c-chat-room.h @@ -223,6 +223,13 @@ LINPHONE_PUBLIC bool_t linphone_chat_room_lime_available(LinphoneChatRoom *cr); */ LINPHONE_PUBLIC LinphoneCall *linphone_chat_room_get_call(const LinphoneChatRoom *room); +/** + * Get the LinphoneChatRoomCbs object associated with the LinphoneChatRoom. + * @param[in] cr LinphoneChatRoom object + * @return The LinphoneChatRoomCbs object associated with the LinphoneChatRoom + */ +LINPHONE_PUBLIC LinphoneChatRoomCbs * linphone_chat_room_get_callbacks (const LinphoneChatRoom *cr); + /** * Add a participant to a chat room. This may fail if this type of chat room does not handle participants. * Use linphone_chat_room_can_handle_participants() to know if this chat room handles participants. diff --git a/include/linphone/api/c-types.h b/include/linphone/api/c-types.h index a550c9cc8..79202b952 100644 --- a/include/linphone/api/c-types.h +++ b/include/linphone/api/c-types.h @@ -75,7 +75,20 @@ typedef struct _LinphoneAddress LinphoneAddress; typedef struct _LinphoneCall LinphoneCall; typedef struct _LinphoneCallEvent LinphoneCallEvent; + +/** + * A chat room is the place where text messages are exchanged. + * Can be created by linphone_core_create_chat_room(). + * @ingroup chatroom + */ typedef struct _LinphoneChatRoom LinphoneChatRoom; + +/** + * An object to handle the callbacks for the handling a LinphoneChatRoom objects. + * @ingroup chatroom + */ +typedef struct _LinphoneChatRoomCbs LinphoneChatRoomCbs; + typedef struct _LinphoneConferenceEvent LinphoneConferenceEvent; typedef struct _LinphoneConferenceParticipantEvent LinphoneConferenceParticipantEvent; typedef struct _LinphoneEventLog LinphoneEventLog; diff --git a/include/linphone/callbacks.h b/include/linphone/callbacks.h index e25180714..f9f892570 100644 --- a/include/linphone/callbacks.h +++ b/include/linphone/callbacks.h @@ -22,6 +22,7 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. #include "linphone/types.h" +#include "linphone/api/c-callbacks.h" /** @@ -502,6 +503,13 @@ typedef LinphoneCoreCbsFriendListRemovedCb LinphoneCoreFriendListRemovedCb; */ typedef void (*LinphoneCoreCbsVersionUpdateCheckResultReceivedCb) (LinphoneCore *lc, LinphoneVersionUpdateCheckResult result, const char *version, const char *url); +/** + * Callback prototype telling that a LinphoneChatRoom object has been instantiated. This is useful to set the callbacks on the LinphoneChatRoom object. + * @param[in] lc LinphoneCore object + * @param[in] cr The LinphoneChatRoom object that has been instantiated + */ +typedef void (*LinphoneCoreCbsChatRoomInstantiatedCb) (LinphoneCore *lc, LinphoneChatRoom *cr); + /** * @} **/ diff --git a/include/linphone/chat.h b/include/linphone/chat.h index 0660003b5..e84c70bae 100644 --- a/include/linphone/chat.h +++ b/include/linphone/chat.h @@ -25,6 +25,7 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. #include "linphone/types.h" #include "linphone/api/c-types.h" #include "linphone/api/c-chat-room.h" +#include "linphone/api/c-chat-room-cbs.h" #ifdef __cplusplus diff --git a/include/linphone/core.h b/include/linphone/core.h index e34b45f9c..f3fa25583 100644 --- a/include/linphone/core.h +++ b/include/linphone/core.h @@ -218,6 +218,7 @@ typedef struct _LinphoneCoreVTable{ LinphoneCoreFriendListRemovedCb friend_list_removed; LinphoneCoreCbsCallCreatedCb call_created; LinphoneCoreCbsVersionUpdateCheckResultReceivedCb version_update_check_result_received; + LinphoneCoreCbsChatRoomInstantiatedCb chat_room_instantiated; void *user_data; /**. + */ + + +#include "linphone/api/c-chat-room-cbs.h" +#include "private.h" + + +struct _LinphoneChatRoomCbs { + belle_sip_object_t base; + void *userData; + LinphoneChatRoomCbsIsComposingReceivedCb isComposingReceivedCb; + LinphoneChatRoomCbsMessageReceivedCb messageReceivedCb; + LinphoneChatRoomCbsUndecryptableMessageReceivedCb undecryptableMessageReceivedCb; +}; + +BELLE_SIP_DECLARE_VPTR_NO_EXPORT(LinphoneChatRoomCbs); + +BELLE_SIP_DECLARE_NO_IMPLEMENTED_INTERFACES(LinphoneChatRoomCbs); + +BELLE_SIP_INSTANCIATE_VPTR(LinphoneChatRoomCbs, belle_sip_object_t, + NULL, // destroy + NULL, // clone + NULL, // marshal + FALSE +); + +LinphoneChatRoomCbs * linphone_chat_room_cbs_new (void) { + return belle_sip_object_new(LinphoneChatRoomCbs); +} + +LinphoneChatRoomCbs * linphone_chat_room_cbs_ref (LinphoneChatRoomCbs *cbs) { + belle_sip_object_ref(cbs); + return cbs; +} + +void linphone_chat_room_cbs_unref (LinphoneChatRoomCbs *cbs) { + belle_sip_object_unref(cbs); +} + +void * linphone_chat_room_cbs_get_user_data (const LinphoneChatRoomCbs *cbs) { + return cbs->userData; +} + +void linphone_chat_room_cbs_set_user_data (LinphoneChatRoomCbs *cbs, void *ud) { + cbs->userData = ud; +} + +LinphoneChatRoomCbsIsComposingReceivedCb linphone_chat_room_cbs_get_is_composing_received (const LinphoneChatRoomCbs *cbs) { + return cbs->isComposingReceivedCb; +} + +void linphone_chat_room_cbs_set_is_composing_received (LinphoneChatRoomCbs *cbs, LinphoneChatRoomCbsIsComposingReceivedCb cb) { + cbs->isComposingReceivedCb = cb; +} + +LinphoneChatRoomCbsMessageReceivedCb linphone_chat_room_cbs_get_message_received (const LinphoneChatRoomCbs *cbs) { + return cbs->messageReceivedCb; +} + +void linphone_chat_room_cbs_set_message_received (LinphoneChatRoomCbs *cbs, LinphoneChatRoomCbsMessageReceivedCb cb) { + cbs->messageReceivedCb = cb; +} + +LinphoneChatRoomCbsUndecryptableMessageReceivedCb linphone_chat_room_cbs_get_undecryptable_message_received (const LinphoneChatRoomCbs *cbs) { + return cbs->undecryptableMessageReceivedCb; +} + +void linphone_chat_room_cbs_set_undecryptable_message_received (LinphoneChatRoomCbs *cbs, LinphoneChatRoomCbsUndecryptableMessageReceivedCb cb) { + cbs->undecryptableMessageReceivedCb = cb; +} diff --git a/src/c-wrapper/api/c-chat-room.cpp b/src/c-wrapper/api/c-chat-room.cpp index bc3e93450..c53b3c41f 100644 --- a/src/c-wrapper/api/c-chat-room.cpp +++ b/src/c-wrapper/api/c-chat-room.cpp @@ -42,12 +42,17 @@ static void _linphone_chat_room_destructor(LinphoneChatRoom *cr); L_DECLARE_C_STRUCT_IMPL_WITH_XTORS(ChatRoom, ChatRoom, chat_room, _linphone_chat_room_constructor, _linphone_chat_room_destructor, + LinphoneChatRoomCbs *cbs; LinphoneAddress *peerAddressCache; ) -static void _linphone_chat_room_constructor(LinphoneChatRoom *cr) {} +static void _linphone_chat_room_constructor(LinphoneChatRoom *cr) { + cr->cbs = linphone_chat_room_cbs_new(); +} static void _linphone_chat_room_destructor(LinphoneChatRoom *cr) { + linphone_chat_room_cbs_unref(cr->cbs); + cr->cbs = nullptr; if (cr->peerAddressCache) { linphone_address_unref(cr->peerAddressCache); cr->peerAddressCache = nullptr; @@ -189,6 +194,10 @@ LinphoneChatMessage * linphone_chat_room_find_message(LinphoneChatRoom *cr, cons return GET_CPP_PTR(cr)->findMessage(message_id); } +LinphoneChatRoomCbs * linphone_chat_room_get_callbacks (const LinphoneChatRoom *cr) { + return cr->cbs; +} + LinphoneParticipant * linphone_chat_room_add_participant (LinphoneChatRoom *cr, const LinphoneAddress *addr) { return L_GET_C_BACK_PTR(GET_CPP_PTR(cr)->addParticipant( *L_GET_CPP_PTR_FROM_C_STRUCT(addr, Address, Address), nullptr, false), @@ -257,25 +266,27 @@ LinphoneChatRoom * linphone_chat_room_new(LinphoneCore *core, const LinphoneAddr L_SET_CPP_PTR_FROM_C_STRUCT(cr, std::make_shared(core, *L_GET_CPP_PTR_FROM_C_STRUCT(addr, Address, Address))); else L_SET_CPP_PTR_FROM_C_STRUCT(cr, std::make_shared(core, *L_GET_CPP_PTR_FROM_C_STRUCT(addr, Address, Address))); + linphone_core_notify_chat_room_instantiated(core, cr); return cr; } -LinphoneChatRoom * linphone_client_group_chat_room_new(LinphoneCore *lc, const bctbx_list_t *addresses) { - const char *factoryUri = linphone_core_get_chat_conference_factory_uri(lc); +LinphoneChatRoom * linphone_client_group_chat_room_new(LinphoneCore *core, const bctbx_list_t *addresses) { + const char *factoryUri = linphone_core_get_chat_conference_factory_uri(core); if (!factoryUri) return nullptr; LinphoneAddress *factoryAddr = linphone_address_new(factoryUri); - LinphoneProxyConfig *proxy = linphone_core_lookup_known_proxy(lc, factoryAddr); + LinphoneProxyConfig *proxy = linphone_core_lookup_known_proxy(core, factoryAddr); linphone_address_unref(factoryAddr); std::string from; if (proxy) from = L_GET_CPP_PTR_FROM_C_STRUCT(linphone_proxy_config_get_identity_address(proxy), Address, Address)->asString(); if (from.empty()) - from = linphone_core_get_primary_contact(lc); + from = linphone_core_get_primary_contact(core); LinphonePrivate::Address me(from); std::list l = L_GET_CPP_LIST_OF_CPP_OBJ_FROM_C_LIST_OF_STRUCT_PTR(addresses, Address, Address); LinphoneChatRoom *cr = _linphone_chat_room_init(); - L_SET_CPP_PTR_FROM_C_STRUCT(cr, make_shared(lc, me, l)); + L_SET_CPP_PTR_FROM_C_STRUCT(cr, make_shared(core, me, l)); + linphone_core_notify_chat_room_instantiated(core, cr); return cr; } diff --git a/src/chat/chat-room-p.h b/src/chat/chat-room-p.h index c1230eadf..d7dd25fe0 100644 --- a/src/chat/chat-room-p.h +++ b/src/chat/chat-room-p.h @@ -76,6 +76,10 @@ protected: void imdnReceived (const std::string &text); void isComposingReceived (const std::string &text); +private: + void notifyChatMessageReceived (LinphoneChatMessage *msg); + void notifyUndecryptableMessageReceived (LinphoneChatMessage *msg); + private: /* IsComposingListener */ void onIsComposingStateChanged (bool isComposing); diff --git a/src/chat/chat-room.cpp b/src/chat/chat-room.cpp index 6d1f6484a..0d7d2eaa3 100644 --- a/src/chat/chat-room.cpp +++ b/src/chat/chat-room.cpp @@ -425,7 +425,7 @@ LinphoneReason ChatRoomPrivate::messageReceived (SalOp *op, const SalMessage *sa msg->is_secured = TRUE; } else if (retval > 0) { /* Unable to decrypt message */ - linphone_core_notify_message_received_unable_decrypt(core, GET_BACK_PTR(q), msg); + notifyUndecryptableMessageReceived(msg); reason = linphone_error_code_to_reason(retval); linphone_chat_message_send_delivery_notification(msg, reason); /* Return LinphoneReasonNone to avoid flexisip resending us a message we can't decrypt */ @@ -472,9 +472,9 @@ LinphoneReason ChatRoomPrivate::messageReceived (SalOp *op, const SalMessage *sa unreadCount = 1; else unreadCount++; - /* Mark the message as pending so that if linphone_core_chat_room_mark_as_read() is called - in the linphone_chat_room_message_received() callback, it will effectively be marked as - being read before being stored. */ + /* Mark the message as pending so that if ChatRoom::markAsRead() is called in the + * ChatRoomPrivate::chatMessageReceived() callback, it will effectively be marked as + * being read before being stored. */ pendingMessage = msg; } @@ -496,12 +496,8 @@ end: void ChatRoomPrivate::chatMessageReceived (LinphoneChatMessage *msg) { L_Q(ChatRoom); - if (msg->message) { - /* Legacy API */ - linphone_core_notify_text_message_received(core, GET_BACK_PTR(q), msg->from, msg->message); - } - linphone_core_notify_message_received(core, GET_BACK_PTR(q), msg); if (!ContentType::isImdn(msg->content_type) && !ContentType::isImIsComposing(msg->content_type)) { + notifyChatMessageReceived(msg); remoteIsComposing = false; linphone_core_notify_is_composing_received(core, GET_BACK_PTR(q)); linphone_chat_message_send_delivery_notification(msg, LinphoneReasonNone); @@ -519,6 +515,32 @@ void ChatRoomPrivate::isComposingReceived (const string &text) { // ----------------------------------------------------------------------------- +void ChatRoomPrivate::notifyChatMessageReceived (LinphoneChatMessage *msg) { + L_Q(ChatRoom); + LinphoneChatRoom *cr = GET_BACK_PTR(q); + if (msg->message) { + /* Legacy API */ + linphone_core_notify_text_message_received(core, cr, msg->from, msg->message); + } + LinphoneChatRoomCbs *cbs = linphone_chat_room_get_callbacks(cr); + LinphoneChatRoomCbsMessageReceivedCb cb = linphone_chat_room_cbs_get_message_received(cbs); + if (cb) + cb(cr, msg); + linphone_core_notify_message_received(core, cr, msg); +} + +void ChatRoomPrivate::notifyUndecryptableMessageReceived (LinphoneChatMessage *msg) { + L_Q(ChatRoom); + LinphoneChatRoom *cr = GET_BACK_PTR(q); + LinphoneChatRoomCbs *cbs = linphone_chat_room_get_callbacks(cr); + LinphoneChatRoomCbsUndecryptableMessageReceivedCb cb = linphone_chat_room_cbs_get_undecryptable_message_received(cbs); + if (cb) + cb(cr, msg); + linphone_core_notify_message_received_unable_decrypt(core, cr, msg); +} + +// ----------------------------------------------------------------------------- + void ChatRoomPrivate::onIsComposingStateChanged (bool isComposing) { this->isComposing = isComposing; sendIsComposingNotification();