File indexing completed on 2024-05-19 15:58:56

0001 /*
0002    SPDX-FileCopyrightText: 2022-2024 Laurent Montel <montel@kde.org>
0003 
0004    SPDX-License-Identifier: LGPL-2.0-or-later
0005 */
0006 
0007 #include "videoconferencemanager.h"
0008 #include "connection.h"
0009 #include "rocketchataccount.h"
0010 #include "ruqola_videoconference_core_debug.h"
0011 #include "video-conference/videoconferencejoinjob.h"
0012 #include "videoconferencenotificationjob.h"
0013 #include <QDesktopServices>
0014 #include <QJsonObject>
0015 
0016 VideoConferenceManager::VideoConferenceManager(RocketChatAccount *account, QObject *parent)
0017     : QObject{parent}
0018     , mRocketChatAccount(account)
0019 {
0020 }
0021 
0022 VideoConferenceManager::~VideoConferenceManager() = default;
0023 
0024 void VideoConferenceManager::parseVideoConference(const QJsonArray &contents)
0025 {
0026     for (const QJsonValue &current : contents) {
0027         const QJsonObject videoConfObject = current.toObject();
0028         VideoConference videoConference;
0029         videoConference.parseVideoConference(videoConfObject);
0030         if (videoConference.isValid()) {
0031             if (!mVideoConferenceList.contains(videoConference)) {
0032                 mVideoConferenceList.append(std::move(videoConference));
0033 
0034                 switch (videoConference.action()) {
0035                 case VideoConference::Unknown:
0036                     break;
0037                 case VideoConference::IncomingCall:
0038                     showNotification(videoConference);
0039                     break;
0040                 case VideoConference::Accepted:
0041                     Q_EMIT videoConferenceCallAccepted(videoConference);
0042                     break;
0043                 case VideoConference::Canceled:
0044                     Q_EMIT videoConferenceCallCanceled(videoConference);
0045                     break;
0046                 case VideoConference::Confirmed:
0047                     Q_EMIT videoConferenceCallConfirmed(videoConference);
0048                     break;
0049                 case VideoConference::Rejected:
0050                     Q_EMIT videoConferenceCallRejected(videoConference);
0051                     break;
0052                 }
0053             }
0054         }
0055     }
0056 }
0057 
0058 void VideoConferenceManager::showNotification(const VideoConference &videoConference)
0059 {
0060     auto job = new VideoConferenceNotificationJob(this);
0061     connect(job, &VideoConferenceNotificationJob::acceptVideoConference, this, [this, videoConference]() {
0062         // Send info about accept video conf.
0063         mRocketChatAccount->ddp()->videoConferenceAccepted(videoConference.roomId(), videoConference.callId(), mRocketChatAccount->userId());
0064 
0065         auto conferenceJoinJob = new RocketChatRestApi::VideoConferenceJoinJob(this);
0066         RocketChatRestApi::VideoConferenceJoinJob::VideoConferenceJoinInfo joinInfo;
0067         QJsonObject obj;
0068         joinInfo.callId = videoConference.callId();
0069         // TODO joinInfo.useCamera = callInfo.useCamera;
0070         // TODO joinInfo.useMicro = callInfo.useMic;
0071         conferenceJoinJob->setInfo(joinInfo);
0072         mRocketChatAccount->restApi()->initializeRestApiJob(conferenceJoinJob);
0073         connect(conferenceJoinJob, &RocketChatRestApi::VideoConferenceJoinJob::videoConferenceJoinDone, this, [videoConference, this](const QJsonObject &obj) {
0074             // qDebug() << " join info " << obj;
0075             QDesktopServices::openUrl(QUrl(obj[QLatin1String("url")].toString()));
0076             mVideoConferenceList.removeAll(videoConference);
0077         });
0078         if (!conferenceJoinJob->start()) {
0079             qCWarning(RUQOLA_VIDEO_CONFERENCE_LOG) << "Impossible to start VideoConferenceJoinJob job";
0080         }
0081     });
0082     connect(job, &VideoConferenceNotificationJob::rejectVideoConference, this, [this, videoConference]() {
0083         // Send info about reject video conf.
0084         mRocketChatAccount->ddp()->videoConferenceRejected(videoConference.roomId(), videoConference.callId(), mRocketChatAccount->userId());
0085         mVideoConferenceList.removeAll(videoConference);
0086     });
0087     job->setRocketChatAccount(mRocketChatAccount);
0088     job->setVideoConference(videoConference);
0089     job->start();
0090 }
0091 
0092 #include "moc_videoconferencemanager.cpp"