1
0
Fork 0
mirror of https://git.jami.net/savoirfairelinux/jami-client-qt.git synced 2025-08-08 00:35:50 +02:00
jami-client-qt/src/libclient/api/conversation.h
Sébastien Blin 0996b167d9 swarm: add call buttons and interactions for multi-swarm
+ Add call buttons to start a new call
+ React to events from the swarm
+ call interactions (Join call/Call ended, etc)
+ active calls area
+ Add call management logic in LRC
+ Feature is enabled via the experimental checkbox

https://git.jami.net/savoirfairelinux/jami-daemon/-/issues/312
Change-Id: I83fd20b5e772097c0792bdc66feec69b0cb0009a
2022-11-17 13:16:02 -05:00

137 lines
4.2 KiB
C++

/****************************************************************************
* Copyright (C) 2017-2022 Savoir-faire Linux Inc. *
* Author: Nicolas Jäger <nicolas.jager@savoirfairelinux.com> *
* Author: Sébastien Blin <sebastien.blin@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/>. *
***************************************************************************/
#pragma once
#include "interaction.h"
#include "messagelistmodel.h"
#include "member.h"
#include "typedefs.h"
#include <map>
#include <memory>
#include <vector>
namespace lrc {
namespace api {
namespace conversation {
Q_NAMESPACE
Q_CLASSINFO("RegisterEnumClassesUnscoped", "false")
enum class Mode { ONE_TO_ONE, ADMIN_INVITES_ONLY, INVITES_ONLY, PUBLIC, NON_SWARM };
Q_ENUM_NS(Mode)
static inline Mode
to_mode(const int intMode)
{
switch (intMode) {
case 0:
return Mode::ONE_TO_ONE;
case 1:
return Mode::ADMIN_INVITES_ONLY;
case 2:
return Mode::INVITES_ONLY;
case 3:
return Mode::PUBLIC;
case 4:
return Mode::NON_SWARM;
default:
return Mode::ONE_TO_ONE;
}
}
struct Info
{
Info()
: interactions(std::make_unique<MessageListModel>(nullptr))
{}
Info(const Info& other) = delete;
Info(Info&& other) = default;
Info& operator=(const Info& other) = delete;
Info& operator=(Info&& other) = default;
bool allMessagesLoaded = false;
QString uid = "";
QString accountId;
QVector<member::Member> participants;
VectorMapStringString activeCalls;
VectorMapStringString ignoredActiveCalls;
QString callId;
QString confId;
std::unique_ptr<MessageListModel> interactions;
QString lastMessageUid;
QHash<QString, QString> parentsId; // pair messageid/parentid for messages without parent loaded
unsigned int unreadMessages = 0;
QVector<QPair<int, QString>> errors;
QSet<QString> typers;
MapStringString infos {};
MapStringString preferences {};
int indexOfActiveCall(const MapStringString& commit)
{
for (auto idx = 0; idx != activeCalls.size(); ++idx) {
const auto& call = activeCalls[idx];
if (call["id"] == commit["confId"] && call["uri"] == commit["uri"]
&& call["device"] == commit["device"]) {
return idx;
}
}
return -1;
}
QString getCallId() const
{
return confId.isEmpty() ? callId : confId;
}
inline bool isLegacy() const
{
return mode == Mode::NON_SWARM;
}
inline bool isSwarm() const
{
return !isLegacy();
}
// for each contact we must have one non-swarm conversation or one active one-to-one
// conversation. Where active means peer did not leave the conversation.
inline bool isCoreDialog() const
{
return isLegacy() || mode == Mode::ONE_TO_ONE;
};
inline QStringList participantsUris() const
{
QStringList result;
for (const auto& p : participants)
result.append(p.uri);
return result;
}
Mode mode = Mode::NON_SWARM;
bool needsSyncing = false;
bool isRequest = false;
};
} // namespace conversation
} // namespace api
} // namespace lrc