misc: vendor libjamiclient into 'src/libclient/'
This is libjamiclient from the jami-libclient.git repository as of
767c45b8b09806ac05cbada720864df93588c047, with the following changes:
* src/libclient/newaccountmodel.cpp:
(NewAccountModelPimpl::removeFromAccounts): The lock wait inside
'#ifdef CHK_FREEABLE_BEFORE_ERASE_ACCOUNT' was not updated when the
type of 'accounts' was changed over the years from this:
std::map<std::string, account::Info>
to this:
std::map<QString, std::pair<account::Info, std::shared_ptr<Database>>>
Basically we need to get the 'first' of the pair for 'account::Info'.
So we now do that.
* src/libclient/avmodel.cpp:
* src/libclient/callbackshandler.cpp:
* src/libclient/contactmodel.cpp:
* src/libclient/conversationmodel.cpp:
* src/libclient/database.cpp:
* src/libclient/namedirectory.cpp:
* src/libclient/newaccountmodel.cpp:
* src/libclient/newcallmodel.cpp:
* src/libclient/newdevicemodel.cpp:
* src/libclient/peerdiscoverymodel.cpp:
* src/libclient/pluginmodel.cpp:
* src/libclient/smartinfohub.cpp:
* src/libclient/vcard.h:
* src/libclient/authority/storagehelper.cpp: Replace Qt's 'foreach'
with 'Q_FOREACH' and its 'emit' with 'Q_EMIT' because in the client-qt
code base we have '-DQT_NO_KEYWORDS' to avoid conflicts with other
libraries we use.
* cmake/FindLibJami.cmake: Import cmake/FindRing.cmake from the
jami-libclient.git repository. Then, rename RING_BUILD_DIR to
LIBJAMI_BUILD_DIR (though the old name is still supported for now).
Also update other references of Ring to Jami. Further, add additional
calls to 'find_library' to make sure specified local paths for libjami
are checked before system-wide ones (in case of older/obsolete libjami
being available system-wide, which might happen on GNU/Linux systems).
* translations/lrc_*.ts: Import translation files from the libclient
repository. The message location paths were corrected by running
"sed -i 's|../src|&/libclient|g' lrc_*.ts" in 'translations/'.
.tx/config: Add section for the newly-imported libclient translations.
* CMakeLists.txt: Reformat, plus various fixes and cleanups, such as
changing indentation to 2 spaces and wrapping lines at 70 characters,
renaming the parent directory of translations from 'ring' to 'jami',
and using all lowercase function calls. Also add copyright headers.
* src/app/appsettingsmanager.cpp:
(AppSettingsManager::loadTranslations):
* src/app/utilsadapter.cpp (UtilsAdapter::supportedLang): Update to
adapt to the renaming of the parent directory of translations from
'ring' to 'jami'.
GitLab: #748
Change-Id: I86e3b0fb30e554755023e7b858b6a0d132cd59ab
2022-05-06 16:00:16 -04:00
|
|
|
/*!
|
|
|
|
* Copyright (C) 2022 Savoir-faire Linux Inc.
|
|
|
|
* Author: Aline Gondim Santos <aline.gondimsantos@savoirfairelinux.com>
|
|
|
|
*
|
|
|
|
* This library is free software; you can redistribute it and/or
|
|
|
|
* modify it under the terms of the GNU Lesser General Public
|
|
|
|
* License as published by the Free Software Foundation; either
|
|
|
|
* version 2.1 of the License, or (at your option) any later version.
|
|
|
|
*
|
|
|
|
* This library 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
|
|
|
|
* Lesser 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 <http://www.gnu.org/licenses/>.
|
|
|
|
*/
|
|
|
|
|
|
|
|
#include "api/callparticipantsmodel.h"
|
|
|
|
|
|
|
|
#include "api/account.h"
|
|
|
|
#include "api/contactmodel.h"
|
|
|
|
#include "api/contact.h"
|
|
|
|
#include "api/newcallmodel.h"
|
|
|
|
#include "api/newaccountmodel.h"
|
|
|
|
|
|
|
|
namespace lrc {
|
|
|
|
|
|
|
|
namespace api {
|
|
|
|
|
|
|
|
CallParticipants::CallParticipants(const VectorMapStringString& infos,
|
|
|
|
const QString& callId,
|
|
|
|
const NewCallModel& linked)
|
|
|
|
: linked_(linked)
|
|
|
|
, callId_(callId)
|
|
|
|
{
|
|
|
|
update(infos);
|
|
|
|
}
|
|
|
|
|
|
|
|
QList<ParticipantInfos>
|
|
|
|
CallParticipants::getParticipants() const
|
|
|
|
{
|
|
|
|
std::lock_guard<std::mutex> lk(participantsMtx_);
|
|
|
|
return participants_.values();
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
CallParticipants::update(const VectorMapStringString& infos)
|
|
|
|
{
|
|
|
|
std::lock_guard<std::mutex> lk(updateMtx_);
|
|
|
|
validUris_.clear();
|
|
|
|
filterCandidates(infos);
|
|
|
|
validUris_.sort();
|
|
|
|
|
|
|
|
idx_ = 0;
|
|
|
|
QList<QString> keys {};
|
|
|
|
{
|
|
|
|
std::lock_guard<std::mutex> lk(participantsMtx_);
|
|
|
|
keys = participants_.keys();
|
|
|
|
}
|
|
|
|
for (const auto& key : keys) {
|
|
|
|
auto keyIdx = validUris_.indexOf(key);
|
|
|
|
if (keyIdx < 0 || keyIdx >= validUris_.size())
|
|
|
|
removeParticipant(idx_);
|
|
|
|
else
|
|
|
|
idx_++;
|
|
|
|
}
|
|
|
|
|
|
|
|
idx_ = 0;
|
|
|
|
for (const auto& partUri : validUris_) {
|
|
|
|
addParticipant(candidates_[partUri]);
|
|
|
|
idx_++;
|
|
|
|
}
|
|
|
|
|
|
|
|
verifyLayout();
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
CallParticipants::verifyLayout()
|
|
|
|
{
|
|
|
|
std::lock_guard<std::mutex> lk(participantsMtx_);
|
|
|
|
auto it = std::find_if(participants_.begin(),
|
|
|
|
participants_.end(),
|
|
|
|
[](const lrc::api::ParticipantInfos& participant) -> bool {
|
|
|
|
return participant.active;
|
|
|
|
});
|
|
|
|
auto newLayout = call::Layout::GRID;
|
|
|
|
if (it != participants_.end())
|
|
|
|
if (participants_.size() == 1)
|
|
|
|
newLayout = call::Layout::ONE;
|
|
|
|
else
|
|
|
|
newLayout = call::Layout::ONE_WITH_SMALL;
|
|
|
|
else
|
|
|
|
newLayout = call::Layout::GRID;
|
|
|
|
if (newLayout != hostLayout_)
|
|
|
|
hostLayout_ = newLayout;
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
CallParticipants::removeParticipant(int index)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
std::lock_guard<std::mutex> lk(participantsMtx_);
|
|
|
|
auto it = participants_.begin() + index;
|
|
|
|
participants_.erase(it);
|
|
|
|
}
|
|
|
|
Q_EMIT linked_.participantRemoved(callId_, idx_);
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
CallParticipants::addParticipant(const ParticipantInfos& participant)
|
|
|
|
{
|
|
|
|
bool added {false};
|
|
|
|
{
|
|
|
|
std::lock_guard<std::mutex> lk(participantsMtx_);
|
|
|
|
auto it = participants_.find(participant.uri);
|
|
|
|
if (it == participants_.end()) {
|
|
|
|
participants_.insert(participants_.begin() + idx_, participant.uri, participant);
|
|
|
|
added = true;
|
|
|
|
} else {
|
|
|
|
if (participant == (*it))
|
|
|
|
return;
|
|
|
|
(*it) = participant;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (added)
|
|
|
|
Q_EMIT linked_.participantAdded(callId_, idx_);
|
|
|
|
else
|
|
|
|
Q_EMIT linked_.participantUpdated(callId_, idx_);
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
CallParticipants::filterCandidates(const VectorMapStringString& infos)
|
|
|
|
{
|
|
|
|
std::lock_guard<std::mutex> lk(participantsMtx_);
|
|
|
|
candidates_.clear();
|
|
|
|
for (const auto& candidate : infos) {
|
2022-06-09 11:24:29 -04:00
|
|
|
if (!candidate.contains(ParticipantsInfosStrings::URI))
|
|
|
|
continue;
|
misc: vendor libjamiclient into 'src/libclient/'
This is libjamiclient from the jami-libclient.git repository as of
767c45b8b09806ac05cbada720864df93588c047, with the following changes:
* src/libclient/newaccountmodel.cpp:
(NewAccountModelPimpl::removeFromAccounts): The lock wait inside
'#ifdef CHK_FREEABLE_BEFORE_ERASE_ACCOUNT' was not updated when the
type of 'accounts' was changed over the years from this:
std::map<std::string, account::Info>
to this:
std::map<QString, std::pair<account::Info, std::shared_ptr<Database>>>
Basically we need to get the 'first' of the pair for 'account::Info'.
So we now do that.
* src/libclient/avmodel.cpp:
* src/libclient/callbackshandler.cpp:
* src/libclient/contactmodel.cpp:
* src/libclient/conversationmodel.cpp:
* src/libclient/database.cpp:
* src/libclient/namedirectory.cpp:
* src/libclient/newaccountmodel.cpp:
* src/libclient/newcallmodel.cpp:
* src/libclient/newdevicemodel.cpp:
* src/libclient/peerdiscoverymodel.cpp:
* src/libclient/pluginmodel.cpp:
* src/libclient/smartinfohub.cpp:
* src/libclient/vcard.h:
* src/libclient/authority/storagehelper.cpp: Replace Qt's 'foreach'
with 'Q_FOREACH' and its 'emit' with 'Q_EMIT' because in the client-qt
code base we have '-DQT_NO_KEYWORDS' to avoid conflicts with other
libraries we use.
* cmake/FindLibJami.cmake: Import cmake/FindRing.cmake from the
jami-libclient.git repository. Then, rename RING_BUILD_DIR to
LIBJAMI_BUILD_DIR (though the old name is still supported for now).
Also update other references of Ring to Jami. Further, add additional
calls to 'find_library' to make sure specified local paths for libjami
are checked before system-wide ones (in case of older/obsolete libjami
being available system-wide, which might happen on GNU/Linux systems).
* translations/lrc_*.ts: Import translation files from the libclient
repository. The message location paths were corrected by running
"sed -i 's|../src|&/libclient|g' lrc_*.ts" in 'translations/'.
.tx/config: Add section for the newly-imported libclient translations.
* CMakeLists.txt: Reformat, plus various fixes and cleanups, such as
changing indentation to 2 spaces and wrapping lines at 70 characters,
renaming the parent directory of translations from 'ring' to 'jami',
and using all lowercase function calls. Also add copyright headers.
* src/app/appsettingsmanager.cpp:
(AppSettingsManager::loadTranslations):
* src/app/utilsadapter.cpp (UtilsAdapter::supportedLang): Update to
adapt to the renaming of the parent directory of translations from
'ring' to 'jami'.
GitLab: #748
Change-Id: I86e3b0fb30e554755023e7b858b6a0d132cd59ab
2022-05-06 16:00:16 -04:00
|
|
|
auto peerId = candidate[ParticipantsInfosStrings::URI];
|
|
|
|
peerId.truncate(peerId.lastIndexOf("@"));
|
|
|
|
if (peerId.isEmpty()) {
|
|
|
|
for (const auto& accId : linked_.owner.accountModel->getAccountList()) {
|
|
|
|
try {
|
|
|
|
auto& accountInfo = linked_.owner.accountModel->getAccountInfo(accId);
|
|
|
|
if (accountInfo.callModel->hasCall(callId_)) {
|
|
|
|
peerId = accountInfo.profileInfo.uri;
|
|
|
|
}
|
|
|
|
} catch (...) {
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (candidate[ParticipantsInfosStrings::W].toInt() != 0
|
|
|
|
&& candidate[ParticipantsInfosStrings::H].toInt() != 0) {
|
|
|
|
validUris_.append(peerId);
|
|
|
|
candidates_.insert(peerId, ParticipantInfos(candidate, callId_, peerId));
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
bool
|
|
|
|
CallParticipants::checkModerator(const QString& uri) const
|
|
|
|
{
|
|
|
|
std::lock_guard<std::mutex> lk(participantsMtx_);
|
|
|
|
return std::find_if(participants_.cbegin(),
|
|
|
|
participants_.cend(),
|
|
|
|
[&](auto participant) {
|
|
|
|
return participant.uri == uri && participant.isModerator;
|
|
|
|
})
|
|
|
|
!= participants_.cend();
|
|
|
|
}
|
|
|
|
|
|
|
|
QJsonObject
|
|
|
|
CallParticipants::toQJsonObject(uint index) const
|
|
|
|
{
|
|
|
|
std::lock_guard<std::mutex> lk(participantsMtx_);
|
|
|
|
if (index >= participants_.size())
|
|
|
|
return {};
|
|
|
|
|
|
|
|
QJsonObject ret;
|
|
|
|
const auto& participant = participants_.begin() + index;
|
|
|
|
|
|
|
|
ret[ParticipantsInfosStrings::URI] = participant->uri;
|
|
|
|
ret[ParticipantsInfosStrings::DEVICE] = participant->device;
|
2022-06-09 11:24:29 -04:00
|
|
|
ret[ParticipantsInfosStrings::STREAMID] = participant->sinkId;
|
misc: vendor libjamiclient into 'src/libclient/'
This is libjamiclient from the jami-libclient.git repository as of
767c45b8b09806ac05cbada720864df93588c047, with the following changes:
* src/libclient/newaccountmodel.cpp:
(NewAccountModelPimpl::removeFromAccounts): The lock wait inside
'#ifdef CHK_FREEABLE_BEFORE_ERASE_ACCOUNT' was not updated when the
type of 'accounts' was changed over the years from this:
std::map<std::string, account::Info>
to this:
std::map<QString, std::pair<account::Info, std::shared_ptr<Database>>>
Basically we need to get the 'first' of the pair for 'account::Info'.
So we now do that.
* src/libclient/avmodel.cpp:
* src/libclient/callbackshandler.cpp:
* src/libclient/contactmodel.cpp:
* src/libclient/conversationmodel.cpp:
* src/libclient/database.cpp:
* src/libclient/namedirectory.cpp:
* src/libclient/newaccountmodel.cpp:
* src/libclient/newcallmodel.cpp:
* src/libclient/newdevicemodel.cpp:
* src/libclient/peerdiscoverymodel.cpp:
* src/libclient/pluginmodel.cpp:
* src/libclient/smartinfohub.cpp:
* src/libclient/vcard.h:
* src/libclient/authority/storagehelper.cpp: Replace Qt's 'foreach'
with 'Q_FOREACH' and its 'emit' with 'Q_EMIT' because in the client-qt
code base we have '-DQT_NO_KEYWORDS' to avoid conflicts with other
libraries we use.
* cmake/FindLibJami.cmake: Import cmake/FindRing.cmake from the
jami-libclient.git repository. Then, rename RING_BUILD_DIR to
LIBJAMI_BUILD_DIR (though the old name is still supported for now).
Also update other references of Ring to Jami. Further, add additional
calls to 'find_library' to make sure specified local paths for libjami
are checked before system-wide ones (in case of older/obsolete libjami
being available system-wide, which might happen on GNU/Linux systems).
* translations/lrc_*.ts: Import translation files from the libclient
repository. The message location paths were corrected by running
"sed -i 's|../src|&/libclient|g' lrc_*.ts" in 'translations/'.
.tx/config: Add section for the newly-imported libclient translations.
* CMakeLists.txt: Reformat, plus various fixes and cleanups, such as
changing indentation to 2 spaces and wrapping lines at 70 characters,
renaming the parent directory of translations from 'ring' to 'jami',
and using all lowercase function calls. Also add copyright headers.
* src/app/appsettingsmanager.cpp:
(AppSettingsManager::loadTranslations):
* src/app/utilsadapter.cpp (UtilsAdapter::supportedLang): Update to
adapt to the renaming of the parent directory of translations from
'ring' to 'jami'.
GitLab: #748
Change-Id: I86e3b0fb30e554755023e7b858b6a0d132cd59ab
2022-05-06 16:00:16 -04:00
|
|
|
ret[ParticipantsInfosStrings::BESTNAME] = participant->bestName;
|
|
|
|
ret[ParticipantsInfosStrings::AVATAR] = participant->avatar;
|
|
|
|
ret[ParticipantsInfosStrings::ACTIVE] = participant->active;
|
|
|
|
ret[ParticipantsInfosStrings::X] = participant->x;
|
|
|
|
ret[ParticipantsInfosStrings::Y] = participant->y;
|
|
|
|
ret[ParticipantsInfosStrings::WIDTH] = participant->width;
|
|
|
|
ret[ParticipantsInfosStrings::HEIGHT] = participant->height;
|
|
|
|
ret[ParticipantsInfosStrings::AUDIOLOCALMUTED] = participant->audioLocalMuted;
|
|
|
|
ret[ParticipantsInfosStrings::AUDIOMODERATORMUTED] = participant->audioModeratorMuted;
|
|
|
|
ret[ParticipantsInfosStrings::VIDEOMUTED] = participant->videoMuted;
|
|
|
|
ret[ParticipantsInfosStrings::ISMODERATOR] = participant->isModerator;
|
|
|
|
ret[ParticipantsInfosStrings::ISLOCAL] = participant->islocal;
|
|
|
|
ret[ParticipantsInfosStrings::ISCONTACT] = participant->isContact;
|
|
|
|
ret[ParticipantsInfosStrings::HANDRAISED] = participant->handRaised;
|
|
|
|
ret[ParticipantsInfosStrings::CALLID] = callId_;
|
|
|
|
|
|
|
|
return ret;
|
|
|
|
}
|
|
|
|
} // end namespace api
|
|
|
|
} // end namespace lrc
|