Skip to content
Snippets Groups Projects
Commit 8c6b1956 authored by Ming Rui Zhang's avatar Ming Rui Zhang
Browse files

newcallmodel: pending conferencees reimplementation

1. Change the container structure
2. Notify when the data is changed

Change-Id: Ia791a58cdc2020ceeff9a311bc2a923e1c638b5c
parent e895400f
No related branches found
No related tags found
No related merge requests found
......@@ -44,7 +44,14 @@ struct Info;
}
namespace call {
struct Info;
}
struct PendingConferenceeInfo
{
QString uri;
QString callId;
QString callIdToJoin;
};
} // namespace call
class NewAccountModel;
/**
......@@ -277,6 +284,12 @@ public:
*/
bool isConferenceHost(const QString& callId);
/**
* Get the list of lists of pending conferencees callId , contact uri, and join callId
* @return pending conferencees
*/
const QList<call::PendingConferenceeInfo>& getPendingConferencees();
Q_SIGNALS:
/**
* Emitted when a call state changes
......@@ -337,6 +350,26 @@ Q_SIGNALS:
const QSet<QString>& peerRec,
bool state) const;
/*!
* Emitted before new pending conferences are inserted into the underlying list
* @param position The starting row of the insertion
* @param rows The number of items inserted
*/
void beginInsertPendingConferenceesRows(int position, int rows = 1) const;
//! Emitted once the insertion of new pending conferences is complete
void endInsertPendingConferenceesRows() const;
/*!
* Emitted before new pending conferences are removed from the underlying list
* @param position The starting row of the removal
* @param rows The number of items removed
*/
void beginRemovePendingConferenceesRows(int position, int rows = 1) const;
//! Emitted once the removal of new pending conferences is complete
void endRemovePendingConferenceesRows() const;
private:
std::unique_ptr<NewCallModelPimpl> pimpl_;
};
......
......@@ -149,7 +149,7 @@ public:
bool manageCurrentCall_ {true};
QString currentCall_ {};
std::map<QString, QString> pendingConferences_;
QList<call::PendingConferenceeInfo> pendingConferencees_;
public Q_SLOTS:
/**
* Listen from CallbacksHandler when a call is incoming
......@@ -270,7 +270,7 @@ NewCallModel::createCall(const QString& uri, bool isAudioOnly)
auto callId = isAudioOnly
? CallManager::instance().placeCall(owner.id, uri, {{"AUDIO_ONLY", "true"}})
: CallManager::instance().placeCall(owner.id, uri);
#else // dbus
#else // dbus
// do not use auto here (QDBusPendingReply<QString>)
QString callId = isAudioOnly
? CallManager::instance().placeCallWithDetails(owner.id,
......@@ -492,7 +492,14 @@ NewCallModel::joinCalls(const QString& callIdA, const QString& callIdB) const
emit callAddedToConference(call, conf);
// Remove from pendingConferences_
pimpl_->pendingConferences_.erase(call);
for (int i = 0; i < pimpl_->pendingConferencees_.size(); ++i) {
if (pimpl_->pendingConferencees_.at(i).callId == call) {
Q_EMIT beginRemovePendingConferenceesRows(i);
pimpl_->pendingConferencees_.removeAt(i);
Q_EMIT endRemovePendingConferenceesRows();
break;
}
}
} else {
CallManager::instance().joinParticipant(callIdA, callIdB);
// NOTE: This will trigger slotConferenceCreated.
......@@ -503,7 +510,9 @@ QString
NewCallModel::callAndAddParticipant(const QString uri, const QString& callId, bool audioOnly)
{
auto newCallId = createCall(uri, audioOnly);
pimpl_->pendingConferences_.insert({newCallId, callId});
Q_EMIT beginInsertPendingConferenceesRows(0);
pimpl_->pendingConferencees_.prepend({uri, newCallId, callId});
Q_EMIT endInsertPendingConferenceesRows();
return newCallId;
}
......@@ -548,6 +557,12 @@ NewCallModel::getSIPCallStatusString(const short& statusCode)
return "";
}
const QList<call::PendingConferenceeInfo>&
NewCallModel::getPendingConferencees()
{
return pimpl_->pendingConferencees_;
}
NewCallModelPimpl::NewCallModelPimpl(const NewCallModel& linked,
const CallbacksHandler& callbacksHandler,
const BehaviorController& behaviorController)
......@@ -666,10 +681,15 @@ NewCallModel::setCurrentCall(const QString& callId) const
{
if (!pimpl_->manageCurrentCall_)
return;
auto it = pimpl_->pendingConferences_.find(callId);
auto it = std::find_if(pimpl_->pendingConferencees_.begin(),
pimpl_->pendingConferencees_.end(),
[callId](const lrc::api::call::PendingConferenceeInfo& info) -> bool {
return info.callId == callId;
});
// Set current call only if not adding this call
// to a current conference
if (it != pimpl_->pendingConferences_.end())
if (it != pimpl_->pendingConferencees_.end())
return;
if (!hasCall(callId))
return;
......@@ -905,6 +925,16 @@ NewCallModelPimpl::slotCallStateChanged(const QString& callId, const QString& st
if (call->status == call::Status::ENDED) {
emit linked.callEnded(callId);
// Remove from pendingConferences_
for (int i = 0; i < pendingConferencees_.size(); ++i) {
if (pendingConferencees_.at(i).callId == callId) {
Q_EMIT linked.beginRemovePendingConferenceesRows(i);
pendingConferencees_.removeAt(i);
Q_EMIT linked.endRemovePendingConferenceesRows();
break;
}
}
} else if (call->status == call::Status::IN_PROGRESS) {
if (previousStatus == call::Status::INCOMING_RINGING
|| previousStatus == call::Status::OUTGOING_RINGING) {
......@@ -919,9 +949,12 @@ NewCallModelPimpl::slotCallStateChanged(const QString& callId, const QString& st
sendProfile(callId);
}
// Add to calls if in pendingConferences_
auto it = pendingConferences_.find(callId);
if (it != pendingConferences_.end()) {
linked.joinCalls(it->second, it->first);
for (int i = 0; i < pendingConferencees_.size(); ++i) {
if (pendingConferencees_.at(i).callId == callId) {
linked.joinCalls(pendingConferencees_.at(i).callIdToJoin,
pendingConferencees_.at(i).callId);
break;
}
}
} else if (call->status == call::Status::PAUSED) {
currentCall_ = "";
......@@ -1042,7 +1075,14 @@ NewCallModelPimpl::slotConferenceCreated(const QString& confId)
foreach (const auto& call, callList) {
emit linked.callAddedToConference(call, confId);
// Remove call from pendingConferences_
pendingConferences_.erase(call);
for (int i = 0; i < pendingConferencees_.size(); ++i) {
if (pendingConferencees_.at(i).callId == call) {
Q_EMIT linked.beginRemovePendingConferenceesRows(i);
pendingConferencees_.removeAt(i);
Q_EMIT linked.endRemovePendingConferenceesRows();
break;
}
}
}
}
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment