基于XMPP的发布订阅系统(四)

基于XMPP的发布订阅系统(四)

类图
在这里插入图片描述

  • XmppSubscriber

    XmppSubManager
    XmppSubManager.h

    #ifndef XMPPSUBMANAGER_H
    #define XMPPSUBMANAGER_H
    
    #include <qxmpp/QXmppClientExtension.h>
    
    class XmppSubManager : public QXmppClientExtension
    {
        Q_OBJECT
    public:
        QStringList discoveryFeatures() const;
        bool handleStanza(const QDomElement &stanza);
    signals:
    
    public slots:
    };
    
    #endif // XMPPSUBMANAGER_H
    

    XmppSubManager.cpp

    #include "XmppSubManager.h"
    #include <qxmpp/QXmppPubSubIq.h>
    
    QStringList XmppSubManager::discoveryFeatures() const
    {
        return QStringList() << "http://jabber.org/protocol/pubsub";
    }
    
    bool XmppSubManager::handleStanza(const QDomElement &stanza)
    {
        if(!QXmppPubSubIq::isPubSubIq(stanza))
            return false;
        return true;
    }
    

    XmppSubscriber
    XmppSubscriber.h

    #ifndef XMPPSUBSCRIBER_H
    #define XMPPSUBSCRIBER_H
    
    #include <QObject>
    
    #include <qxmpp/QXmppLogger.h>
    #include <qxmpp/QXmppConfiguration.h>
    #include <qxmpp/QXmppClient.h>
    
    class XmppSubManager;
    class XmppSubscriber : public QObject
    {
        Q_OBJECT
    public:
        explicit XmppSubscriber(QObject *parent = nullptr);
    
        void setDomain(QString const& domain);
        void setHost(QString const& host);
        void setPort(int port);
    
        XmppSubManager* subManager() { return subManager_; }
    signals:
        void connected();
        void disconnected();
        void logMessage(QString const& text);
        void subMessage(QXmppElement const& items);
    
    public slots:
        void login(QString const& user, QString const& password);
    
    private slots:
        void error(QXmppClient::Error);
        void message(QXmppLogger::MessageType type, const QString &text);
        void messageReceived(const QXmppMessage &message);
    private:
        QXmppConfiguration config;
        QXmppClient* client;
        QXmppLogger* logger;
        XmppSubManager *subManager_;
    };
    
    #endif // XMPPSUBSCRIBER_H
    

    XmppSubscriber.cpp

    #include "XmppSubscriber.h"
    #include "XmppSubManager.h"
    #include <qxmpp/QXmppMessage.h>
    
    XmppSubscriber::XmppSubscriber(QObject *parent)
        : QObject(parent)
        , client(new QXmppClient(this))
        , logger(new QXmppLogger(this))
        , subManager_(new XmppSubManager())
    {
        connect(client, SIGNAL(connected()), this, SIGNAL(connected()));
        connect(client, SIGNAL(disconnected()), this, SIGNAL(disconnected()));
        connect(client, SIGNAL(messageReceived(QXmppMessage)),
                this, SLOT(messageReceived(QXmppMessage)));
        connect(client, SIGNAL(error(QXmppClient::Error)),
                this, SLOT(error(QXmppClient::Error)));
        connect(logger, SIGNAL(message(QXmppLogger::MessageType,QString)),
                this, SLOT(message(QXmppLogger::MessageType,QString)));
    
        logger->setLoggingType(QXmppLogger::SignalLogging);
        client->setLogger(logger);
        client->addExtension(subManager_);
        config.setSaslAuthMechanism("DIGEST-MD5");
        config.setDomain("pubsub.flysnow");
        config.setResource("pc");
        config.setHost("127.0.0.1");
    }
    
    void XmppSubscriber::setDomain(QString const& domain)
    {
        config.setDomain(domain);
    }
    void XmppSubscriber::setHost(QString const& host)
    {
        config.setHost(host);
    }
    
    void XmppSubscriber::setPort(int port)
    {
        config.setPort(port);
    }
    
    void XmppSubscriber::login(QString const& user, QString const& password)
    {
        config.setUser(user);
        config.setPassword(password);
        client->connectToServer(config);
    }
    
    void XmppSubscriber::error(QXmppClient::Error e)
    {
        QString errorText;
        if(e == QXmppClient::SocketError)
            errorText = QString("Error    SocketError)");
        else if(e == QXmppClient::KeepAliveError)
            errorText = QString("Error    KeepAliveError)");
        else if(e == QXmppClient::XmppStreamError)
            errorText = QString("Error    XmppStreamError)");
        emit logMessage(errorText);
    }
    
    void XmppSubscriber::message(QXmppLogger::MessageType type, const QString &text)
    {
        QString log;
        if(type == QXmppLogger::DebugMessage)
            log = QString("Debug    %1").arg(text);
        else if(type == QXmppLogger::InformationMessage)
            log = QString("Info     %1").arg(text);
        else if(type == QXmppLogger::WarningMessage)
            log = QString("Warn     %1").arg(text);
        else if(type == QXmppLogger::ReceivedMessage)
            log = QString("Received %1").arg(text);
        else if(type == QXmppLogger::SentMessage)
            log = QString("Sent    %1").arg(text);
        emit logMessage(log);
    }
    
    void XmppSubscriber::messageReceived(const QXmppMessage &message)
    {
        QXmppElementList events = message.extensions();
        if(!events.isEmpty())
            emit subMessage(events.first().firstChildElement());
    }
    

    Widget
    Widget.h

    #ifndef WIDGET_H
    #define WIDGET_H
    
    #include <QWidget>
    #include <qxmpp/QXmppElement.h>
    namespace Ui {
    class Widget;
    }
    class XmppSubscriber;
    class Widget : public QWidget
    {
        Q_OBJECT
    
    public:
        explicit Widget(QWidget *parent = 0);
        ~Widget();
    
    private slots:
        void connected();
        void disconnected();
        void logMessage(QString const& message);
        void subMessage(QXmppElement const& items);;
    private:
        Ui::Widget *ui;
        XmppSubscriber* subscriber;
    };
    
    #endif // WIDGET_H
    

    Widget.cpp

    #include "widget.h"
    #include "ui_widget.h"
    
    #include "XmppSubscriber.h"
    #include "XmppSubManager.h"
    #include <QDateTime>
    #include <QDomDocument>
    #include <QDebug>
    
    Widget::Widget(QWidget *parent)
        : QWidget(parent)
        , ui(new Ui::Widget)
        , subscriber(new XmppSubscriber(this))
    {
        ui->setupUi(this);
        connect(subscriber, SIGNAL(connected()), this, SLOT(connected()));
        connect(subscriber, SIGNAL(disconnected()), this, SLOT(disconnected()));
        connect(subscriber, SIGNAL(subMessage(QXmppElement)), this, SLOT(subMessage(QXmppElement)));
        connect(subscriber, SIGNAL(logMessage(QString)), this, SLOT(logMessage(QString)));
    
        subscriber->setHost("10.2.16.13");
        subscriber->login("subscriber", "subscriber123");
        ui->logBrowser->setText("Start login ...");
    }
    
    Widget::~Widget()
    {
        delete ui;
    }
    
    void Widget::connected()
    {
        setWindowTitle(QString("XmppSubscriber is connected"));
    }
    
    void Widget::disconnected()
    {
        setWindowTitle(QString("XmppSubscriber is disconnected"));
    }
    
    void Widget::logMessage(QString const& message)
    {
        QString text = ui->logBrowser->toPlainText();
    
        ui->logBrowser->setText(QString("%1\n%2").arg(text).arg(message));
    }
    
    void Widget::subMessage(const QXmppElement &items)
    {
        QString text;
        QXmlStreamWriter writer(&text);
        items.toXml(&writer);
        ui->messageBrowser->setText(text);
    }
    

    main.cpp

    #include "widget.h"
    #include <QApplication>
    
    int main(int argc, char *argv[])
    {
        QApplication a(argc, argv);
        Widget w;
        w.show();
    
        return a.exec();
    }
    

    上一篇:基于XMPP的发布订阅系统(三) 下一篇:基于XMPP的发布订阅系统(五)

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

flysnow010

你的鼓励就是我最大的创作动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值