/src/sip/jabber/xmlconsole.h

http://github.com/tomahawk-player/tomahawk · C Header · 186 lines · 148 code · 20 blank · 18 comment · 16 complexity · 2d597484b99ce42334b3c3234dfb5db3 MD5 · raw file

  1. /* === This file is part of Tomahawk Player - <http://tomahawk-player.org> ===
  2. *
  3. * Copyright 2011, Ruslan Nigmatullin <euroelessar@ya.ru>
  4. * Copyright 2011, Dominik Schmidt <dev@dominik-schmidt.de>
  5. *
  6. * Tomahawk is free software: you can redistribute it and/or modify
  7. * it under the terms of the GNU General Public License as published by
  8. * the Free Software Foundation, either version 3 of the License, or
  9. * (at your option) any later version.
  10. *
  11. * Tomahawk is distributed in the hope that it will be useful,
  12. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  13. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  14. * GNU General Public License for more details.
  15. *
  16. * You should have received a copy of the GNU General Public License
  17. * along with Tomahawk. If not, see <http://www.gnu.org/licenses/>.
  18. */
  19. #ifndef XMLCONSOLE_H
  20. #define XMLCONSOLE_H
  21. #include <jreen/client.h>
  22. #include <jreen/jid.h>
  23. #include <QWidget>
  24. #include <QXmlStreamReader>
  25. #include <QDateTime>
  26. #include <QTextBlock>
  27. namespace Ui {
  28. class XmlConsole;
  29. }
  30. #include "../sipdllmacro.h"
  31. class SIPDLLEXPORT XmlConsole : public QWidget, public Jreen::XmlStreamHandler
  32. {
  33. Q_OBJECT
  34. public:
  35. XmlConsole(Jreen::Client* client, QWidget *parent = 0);
  36. ~XmlConsole();
  37. virtual void handleStreamBegin();
  38. virtual void handleStreamEnd();
  39. virtual void handleIncomingData(const char *data, qint64 size);
  40. virtual void handleOutgoingData(const char *data, qint64 size);
  41. protected:
  42. void changeEvent(QEvent *e);
  43. private:
  44. void stackProcess(const QByteArray &data, bool incoming);
  45. struct XmlNode
  46. {
  47. enum Type
  48. {
  49. Iq = 1,
  50. Presence = 2,
  51. Message = 4,
  52. Custom = 8
  53. };
  54. QDateTime time;
  55. Type type;
  56. bool incoming;
  57. QSet<QString> xmlns;
  58. Jreen::JID jid;
  59. QSet<QString> attributes;
  60. QTextBlock block;
  61. int lineCount;
  62. };
  63. enum FilterType
  64. {
  65. Disabled = 0x10,
  66. ByJid = 0x20,
  67. ByXmlns = 0x30,
  68. ByAllAttributes = 0x40
  69. };
  70. enum State
  71. {
  72. WaitingForStanza,
  73. ReadFeatures,
  74. ReadStanza,
  75. ReadCustom
  76. };
  77. struct StackToken
  78. {
  79. StackToken(QXmlStreamReader &reader)
  80. {
  81. type = reader.tokenType();
  82. if (type == QXmlStreamReader::StartElement) {
  83. QStringRef tmp = reader.name();
  84. startTag.namePointer = new QString(*tmp.string());
  85. startTag.name = new QStringRef(startTag.namePointer, tmp.position(), tmp.length());
  86. tmp = reader.namespaceUri();
  87. startTag.xmlnsPointer = new QString(*tmp.string());
  88. startTag.xmlns = new QStringRef(startTag.xmlnsPointer, tmp.position(), tmp.length());
  89. startTag.attributes = new QXmlStreamAttributes(reader.attributes());
  90. startTag.empty = false;
  91. } else if (type == QXmlStreamReader::Characters) {
  92. QStringRef tmp = reader.text();
  93. charachters.textPointer = new QString(*tmp.string());
  94. charachters.text = new QStringRef(charachters.textPointer, tmp.position(), tmp.length());
  95. } else if (type == QXmlStreamReader::EndElement) {
  96. QStringRef tmp = reader.name();
  97. endTag.namePointer = new QString(*tmp.string());
  98. endTag.name = new QStringRef(endTag.namePointer, tmp.position(), tmp.length());
  99. }
  100. }
  101. StackToken(const QString &name)
  102. {
  103. type = QXmlStreamReader::Characters;
  104. charachters.textPointer = new QString(name);
  105. charachters.text = new QStringRef(charachters.textPointer);
  106. }
  107. ~StackToken()
  108. {
  109. if (type == QXmlStreamReader::StartElement) {
  110. delete startTag.namePointer;
  111. delete startTag.name;
  112. delete startTag.xmlnsPointer;
  113. delete startTag.xmlns;
  114. delete startTag.attributes;
  115. } else if (type == QXmlStreamReader::Characters) {
  116. delete charachters.textPointer;
  117. delete charachters.text;
  118. } else if (type == QXmlStreamReader::EndElement) {
  119. delete endTag.namePointer;
  120. delete endTag.name;
  121. }
  122. }
  123. QXmlStreamReader::TokenType type;
  124. union {
  125. struct {
  126. QString *namePointer;
  127. QStringRef *name;
  128. QString *xmlnsPointer;
  129. QStringRef *xmlns;
  130. QXmlStreamAttributes *attributes;
  131. bool empty;
  132. } startTag;
  133. struct {
  134. QString *textPointer;
  135. QStringRef *text;
  136. } charachters;
  137. struct {
  138. QString *namePointer;
  139. QStringRef *name;
  140. } endTag;
  141. };
  142. };
  143. struct StackEnvironment
  144. {
  145. QXmlStreamReader reader;
  146. State state;
  147. int depth;
  148. QList<StackToken*> tokens;
  149. QColor bodyColor;
  150. QColor tagColor;
  151. QColor attributeColor;
  152. QColor paramColor;
  153. };
  154. Ui::XmlConsole *m_ui;
  155. Jreen::Client *m_client;
  156. QList<XmlNode> m_nodes;
  157. StackEnvironment m_stackIncoming;
  158. StackEnvironment m_stackOutgoing;
  159. QColor m_stackBracketsColor;
  160. int m_filter;
  161. private slots:
  162. void on_lineEdit_textChanged(const QString &);
  163. void onActionGroupTriggered(QAction *action);
  164. void on_saveButton_clicked();
  165. };
  166. #endif // XMLCONSOLE_H