基于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的发布订阅系统(五)