diff --git a/src/chat/chat-room/client-group-chat-room-p.h b/src/chat/chat-room/client-group-chat-room-p.h index 7842d2071..fa51cf8a3 100644 --- a/src/chat/chat-room/client-group-chat-room-p.h +++ b/src/chat/chat-room/client-group-chat-room-p.h @@ -22,6 +22,7 @@ #include "chat/chat-room/chat-room-p.h" #include "client-group-chat-room.h" +#include "utils/background-task.h" // ============================================================================= @@ -53,6 +54,7 @@ private: ChatRoomListener *chatRoomListener = this; ClientGroupChatRoom::CapabilitiesMask capabilities = ClientGroupChatRoom::Capabilities::Conference; bool deletionOnTerminationEnabled = false; + BackgroundTask bgTask; L_DECLARE_PUBLIC(ClientGroupChatRoom); }; diff --git a/src/chat/chat-room/client-group-chat-room.cpp b/src/chat/chat-room/client-group-chat-room.cpp index bf6c6e13c..a3e2847b4 100644 --- a/src/chat/chat-room/client-group-chat-room.cpp +++ b/src/chat/chat-room/client-group-chat-room.cpp @@ -168,7 +168,11 @@ ClientGroupChatRoom::ClientGroupChatRoom ( const string &subject ) : ChatRoom(*new ClientGroupChatRoomPrivate, core, ChatRoomId(IdentityAddress(), me)), RemoteConference(core, me, nullptr) { + L_D(); L_D_T(RemoteConference, dConference); + + d->bgTask.setName("Client group chat room refer received"); + IdentityAddress focusAddr(uri); dConference->focus = make_shared(focusAddr); dConference->focus->getPrivate()->addDevice(focusAddr); @@ -207,11 +211,11 @@ shared_ptr ClientGroupChatRoom::getCore () const { } void ClientGroupChatRoom::allowCpim (bool value) { - + } void ClientGroupChatRoom::allowMultipart (bool value) { - + } bool ClientGroupChatRoom::canHandleCpim () const { @@ -390,6 +394,7 @@ void ClientGroupChatRoom::join () { shared_ptr session = dConference->focus->getPrivate()->getSession(); if (!session && ((getState() == ChatRoom::State::Instantiated) || (getState() == ChatRoom::State::Terminated))) { + d->bgTask.start(); session = d->createSession(); session->startInvite(nullptr, "", nullptr); d->setState(ChatRoom::State::CreationPending); @@ -400,6 +405,7 @@ void ClientGroupChatRoom::leave () { L_D(); L_D_T(RemoteConference, dConference); + d->bgTask.start(); dConference->eventHandler->unsubscribe(); shared_ptr session = dConference->focus->getPrivate()->getSession(); @@ -471,6 +477,7 @@ void ClientGroupChatRoom::onFirstNotifyReceived (const IdentityAddress &addr) { d->chatRoomId )); #endif + d->bgTask.stop(); } void ClientGroupChatRoom::onParticipantAdded (const shared_ptr &event, bool isFullState) { diff --git a/src/utils/background-task.cpp b/src/utils/background-task.cpp index f977c517f..a83d1b14b 100644 --- a/src/utils/background-task.cpp +++ b/src/utils/background-task.cpp @@ -30,6 +30,11 @@ static void notifier (void *context) { } void BackgroundTask::start () { + if (mName.empty()) { + lError() << "No name was set on background task."; + return; + } + unsigned long newId = sal_begin_background_task(mName.c_str(), notifier, this); lInfo() << "Starting background task [" << newId << "] with name : [" << mName << "]."; stop(); @@ -45,4 +50,9 @@ void BackgroundTask::stop () { mId = 0; } +void BackgroundTask::handleTimeout () { + lWarning() << "Background task [" << mId << "] with name : [" << mName << "] has expired before completion..."; + stop(); +} + LINPHONE_END_NAMESPACE diff --git a/src/utils/background-task.h b/src/utils/background-task.h index cc9f3a3cd..a649dcee2 100644 --- a/src/utils/background-task.h +++ b/src/utils/background-task.h @@ -30,11 +30,16 @@ LINPHONE_BEGIN_NAMESPACE class BackgroundTask { public: + BackgroundTask () = default; BackgroundTask (const std::string &name) : mName(name) {} virtual ~BackgroundTask () { stop(); } + void setName (const std::string &name) { + mName = name; + } + void start (); void stop (); @@ -42,7 +47,7 @@ public: return mName; } - virtual void handleTimeout () {} + virtual void handleTimeout (); private: std::string mName;