Skip to content
Snippets Groups Projects
CallManager.h 2.51 KiB
Newer Older
  • Learn to ignore specific revisions
  • trilene's avatar
    trilene committed
    #pragma once
    
    #include <string>
    #include <vector>
    
    #include <QMediaPlayer>
    
    trilene's avatar
    trilene committed
    #include <QObject>
    
    trilene's avatar
    trilene committed
    #include <QSharedPointer>
    #include <QString>
    #include <QTimer>
    
    #include "mtx/events/collections.hpp"
    #include "mtx/events/voip.hpp"
    
    trilene's avatar
    trilene committed
    
    namespace mtx::responses {
    struct TurnServer;
    }
    
    trilene's avatar
    trilene committed
    
    class UserSettings;
    class WebRTCSession;
    
    class CallManager : public QObject
    {
            Q_OBJECT
    
    public:
            CallManager(QSharedPointer<UserSettings>);
    
            void sendInvite(const QString &roomid);
    
    trilene's avatar
    trilene committed
            void hangUp(
              mtx::events::msg::CallHangUp::Reason = mtx::events::msg::CallHangUp::Reason::User);
    
            bool onActiveCall() const;
            QString callPartyName() const { return callPartyName_; }
            QString callPartyAvatarUrl() const { return callPartyAvatarUrl_; }
    
    trilene's avatar
    trilene committed
            void refreshTurnServer();
    
    trilene's avatar
    trilene committed
    
    public slots:
            void syncEvent(const mtx::events::collections::TimelineEvents &event);
    
    signals:
    
    trilene's avatar
    trilene committed
            void newMessage(const QString &roomid, const mtx::events::msg::CallInvite &);
            void newMessage(const QString &roomid, const mtx::events::msg::CallCandidates &);
            void newMessage(const QString &roomid, const mtx::events::msg::CallAnswer &);
            void newMessage(const QString &roomid, const mtx::events::msg::CallHangUp &);
    
            void newCallParty();
    
    trilene's avatar
    trilene committed
            void turnServerRetrieved(const mtx::responses::TurnServer &);
    
    trilene's avatar
    trilene committed
    
    private slots:
            void retrieveTurnServer();
    
    private:
    
    trilene's avatar
    trilene committed
            WebRTCSession &session_;
    
    trilene's avatar
    trilene committed
            QString roomid_;
    
            QString callPartyName_;
            QString callPartyAvatarUrl_;
    
    trilene's avatar
    trilene committed
            std::string callid_;
            const uint32_t timeoutms_ = 120000;
            std::vector<mtx::events::msg::CallCandidates::Candidate> remoteICECandidates_;
    
    trilene's avatar
    trilene committed
            std::vector<std::string> turnURIs_;
    
    trilene's avatar
    trilene committed
            QTimer turnServerTimer_;
            QSharedPointer<UserSettings> settings_;
            QMediaPlayer player_;
    
            template<typename T>
            bool handleEvent_(const mtx::events::collections::TimelineEvents &event);
    
    trilene's avatar
    trilene committed
            void handleEvent(const mtx::events::RoomEvent<mtx::events::msg::CallInvite> &);
            void handleEvent(const mtx::events::RoomEvent<mtx::events::msg::CallCandidates> &);
            void handleEvent(const mtx::events::RoomEvent<mtx::events::msg::CallAnswer> &);
            void handleEvent(const mtx::events::RoomEvent<mtx::events::msg::CallHangUp> &);
            void answerInvite(const mtx::events::msg::CallInvite &);
    
    trilene's avatar
    trilene committed
            void generateCallID();
    
    trilene's avatar
    trilene committed
            void clear();
    
    trilene's avatar
    trilene committed
            void endCall();
            void playRingtone(const QString &ringtone, bool repeat);
            void stopRingtone();
    };