/*
* Copyright (c) 2010-2024 Belledonne Communications SARL.
*
* This file is part of linphone-desktop
* (see https://www.linphone.org).
*
* 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 .
*/
#include "ConferenceInfoList.hpp"
#include "ConferenceInfoCore.hpp"
#include "ConferenceInfoGui.hpp"
#include "core/App.hpp"
#include "model/object/VariantObject.hpp"
#include "tool/Utils.hpp"
#include
#include
// =============================================================================
DEFINE_ABSTRACT_OBJECT(ConferenceInfoList)
QSharedPointer ConferenceInfoList::create() {
auto model = QSharedPointer(new ConferenceInfoList(), &QObject::deleteLater);
model->moveToThread(App::getInstance()->thread());
model->setSelf(model);
return model;
}
ConferenceInfoList::ConferenceInfoList(QObject *parent) : ListProxy(parent) {
mustBeInMainThread(getClassName());
}
ConferenceInfoList::~ConferenceInfoList() {
mustBeInMainThread("~" + getClassName());
mCoreModelConnection = nullptr;
}
void ConferenceInfoList::setSelf(QSharedPointer me) {
mCoreModelConnection = QSharedPointer>(
new SafeConnection(me, CoreModel::getInstance()), &QObject::deleteLater);
mCoreModelConnection->makeConnectToCore(&ConferenceInfoList::lUpdate, [this]() {
mCoreModelConnection->invokeToModel([this]() {
QList> *items = new QList>();
mustBeInLinphoneThread(getClassName());
std::list> conferenceInfos =
CoreModel::getInstance()->getCore()->getDefaultAccount()->getConferenceInformationList();
for (auto conferenceInfo : conferenceInfos) {
auto confInfoCore = build(conferenceInfo);
if (confInfoCore) items->push_back(confInfoCore);
}
mCoreModelConnection->invokeToCore([this, items]() {
mustBeInMainThread(getClassName());
resetData();
add(*items);
delete items;
});
});
});
// mCoreModelConnection->makeConnectToModel(
// &CoreModel::conferenceInfoReceived,
// [this](const std::shared_ptr core,
// const std::shared_ptr &conferenceInfo) {
// auto realConferenceInfo = CoreModel::getInstance()->getCore()->findConferenceInformationFromUri(
// conferenceInfo->getUri()->clone());
// // auto realConferenceInfo = ConferenceInfoModel::findConferenceInfo(conferenceInfo);
// if (realConferenceInfo) {
// auto model = get(realConferenceInfo);
// if (model) {
// // model->setConferenceInfo(realConferenceInfo);
// } else {
// auto confInfo = build(realConferenceInfo);
// if (confInfo) add(confInfo);
// }
// } else
// qWarning() << "No ConferenceInfo have beend found for " << conferenceInfo->getUri()->asString().c_str();
// });
mCoreModelConnection->makeConnectToModel(&CoreModel::defaultAccountChanged, &ConferenceInfoList::lUpdate);
mCoreModelConnection->makeConnectToModel(&CoreModel::conferenceInfoReceived, &ConferenceInfoList::lUpdate);
mCoreModelConnection->makeConnectToModel(&CoreModel::conferenceStateChanged, [this] {
qDebug() << "list: conf state changed";
lUpdate();
});
mCoreModelConnection->makeConnectToModel(
&CoreModel::conferenceInfoReceived,
[this](const std::shared_ptr &core,
const std::shared_ptr &conferenceInfo) {
qDebug() << "info received" << conferenceInfo->getOrganizer()->asStringUriOnly()
<< conferenceInfo->getSubject();
});
emit lUpdate();
}
QSharedPointer
ConferenceInfoList::get(std::shared_ptr conferenceInfo) const {
auto uri = Utils::coreStringToAppString(conferenceInfo->getUri()->asStringUriOnly());
for (auto item : mList) {
auto model = item.objectCast();
auto confUri = model->getUri();
if (confUri == uri) {
return model;
}
}
return nullptr;
}
QSharedPointer
ConferenceInfoList::build(const std::shared_ptr &conferenceInfo) const {
auto me = CoreModel::getInstance()->getCore()->getDefaultAccount()->getParams()->getIdentityAddress();
qDebug() << "[CONFERENCEINFOLIST] looking for me " << me->asStringUriOnly();
std::list> participants = conferenceInfo->getParticipantInfos();
bool haveMe = conferenceInfo->getOrganizer()->weakEqual(me);
if (!haveMe)
haveMe = (std::find_if(participants.begin(), participants.end(),
[me](const std::shared_ptr &p) {
// qDebug()
// << "[CONFERENCEINFOLIST] participant " << p->getAddress()->asStringUriOnly();
return me->weakEqual(p->getAddress());
}) != participants.end());
if (haveMe) {
auto conferenceModel = ConferenceInfoCore::create(conferenceInfo);
connect(conferenceModel.get(), &ConferenceInfoCore::removed, this, &ConferenceInfoList::lUpdate);
return conferenceModel;
} else return nullptr;
}
void ConferenceInfoList::remove(const int &row) {
// beginRemoveRows(QModelIndex(), row, row);
auto item = mList[row].objectCast();
emit item->lDeleteConferenceInfo();
// endRemoveRows();
}
QHash ConferenceInfoList::roleNames() const {
QHash roles;
roles[Qt::DisplayRole] = "$modelData";
roles[Qt::DisplayRole + 1] = "$sectionMonth";
return roles;
}
QVariant ConferenceInfoList::data(const QModelIndex &index, int role) const {
int row = index.row();
if (!index.isValid() || row < 0 || row >= mList.count()) return QVariant();
if (role == Qt::DisplayRole) {
return QVariant::fromValue(new ConferenceInfoGui(mList[row].objectCast()));
} else if (role == Qt::DisplayRole + 1) {
return Utils::toDateMonthString(mList[row].objectCast()->getDateTimeUtc());
}
return QVariant();
}