You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

65 lines
2.6 KiB

#pragma once
#include <QObject>
#include <QDBusArgument>
#include <QDBusObjectPath>
#include <QDBusMessage>
#include <QSet>
#include <QTimer>
#include <QVariantMap>
struct PttPortalShortcut { QString id; QVariantMap properties; };
using PttPortalShortcuts = QList<PttPortalShortcut>;
Q_DECLARE_METATYPE(PttPortalShortcut)
Q_DECLARE_METATYPE(PttPortalShortcuts)
QDBusArgument& operator<<(QDBusArgument& arg, const PttPortalShortcut& shortcut);
const QDBusArgument& operator>>(const QDBusArgument& arg, PttPortalShortcut& shortcut);
// Wayland PTT: портал владеет сочетаниями и хранит их; приложение владеет сессией.
// Один запрос за раз. Подписка на Response устанавливается до вызова метода.
class PttPortal : public QObject {
Q_OBJECT
public:
explicit PttPortal(QObject* parent = nullptr, const QString& sessionToken = "utun_vibechat_ptt");
~PttPortal() override;
void initialize();
void configure(const QString& parentWindow);
void setInhibited(bool inhibited);
QStringList descriptions() const { return m_descriptions; }
QString status() const { return m_status; }
bool busy() const;
signals:
void descriptionsChanged();
void statusChanged();
void talkingChanged(bool talking);
private slots:
void response(uint code, const QVariantMap& results, const QDBusMessage& message);
void activated(const QDBusObjectPath& session, const QString& id, qulonglong timestamp, const QVariantMap& options);
void deactivated(const QDBusObjectPath& session, const QString& id, qulonglong timestamp, const QVariantMap& options);
void shortcutsChanged(const QDBusObjectPath& session, const PttPortalShortcuts& shortcuts);
void sessionClosed();
private:
enum class State { Idle, Checking, Creating, Listing, Unbound, Binding, Ready, Failed };
void request(const QString& method, const QVariantList& arguments, QVariantMap options);
void bind();
void openConfiguration();
void updateDescriptions(const PttPortalShortcuts& shortcuts);
void updateTalking();
void setStatus(const QString& text);
void fail(const QString& detail);
void disconnectRequest();
void closeSession();
static bool isPttId(const QString& id);
uint m_epoch = 0;
bool m_configureAfterBind = false;
State m_state = State::Idle;
QString m_sessionToken, m_session, m_request, m_parentWindow, m_status;
QStringList m_descriptions = {"", "", ""};
QSet<QString> m_active;
QTimer m_requestTimer;
bool m_configureRequested = false, m_inhibited = false, m_talking = false;
};