OpenMSXConnection.h 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  1. #ifndef OPENMSXCONNECTION_HH
  2. #define OPENMSXCONNECTION_HH
  3. #include <QObject>
  4. #include <QAbstractSocket>
  5. #include <QXmlDefaultHandler>
  6. #include <QQueue>
  7. #include <memory>
  8. class QXmlInputSource;
  9. class QXmlSimpleReader;
  10. class Command
  11. {
  12. public:
  13. virtual ~Command() {}
  14. virtual QString getCommand() const = 0;
  15. virtual void replyOk (const QString& message) = 0;
  16. virtual void replyNok(const QString& message) = 0;
  17. virtual void cancel() = 0;
  18. };
  19. class SimpleCommand : public QObject, public Command
  20. {
  21. Q_OBJECT
  22. public:
  23. SimpleCommand(const QString& command);
  24. virtual QString getCommand() const;
  25. virtual void replyOk (const QString& message);
  26. virtual void replyNok(const QString& message);
  27. virtual void cancel();
  28. signals:
  29. void replyStatusOk(bool status);
  30. private:
  31. QString command;
  32. };
  33. class ReadDebugBlockCommand : public SimpleCommand
  34. {
  35. public:
  36. ReadDebugBlockCommand(const QString& commandString, unsigned size,
  37. unsigned char* target);
  38. ReadDebugBlockCommand(const QString& debuggable, unsigned offset, unsigned size,
  39. unsigned char* target);
  40. protected:
  41. void copyData(const QString& message);
  42. private:
  43. unsigned size;
  44. unsigned char* target;
  45. };
  46. class WriteDebugBlockCommand : public SimpleCommand
  47. {
  48. public:
  49. WriteDebugBlockCommand(const QString& debuggable, unsigned offset, unsigned size,
  50. unsigned char* source);
  51. };
  52. class OpenMSXConnection : public QObject, private QXmlDefaultHandler
  53. {
  54. Q_OBJECT
  55. public:
  56. /** require: socket must be in connected state */
  57. OpenMSXConnection(QAbstractSocket* socket);
  58. ~OpenMSXConnection();
  59. void sendCommand(Command* command);
  60. signals:
  61. void disconnected();
  62. void logParsed(const QString& level, const QString& message);
  63. void updateParsed(const QString& type, const QString& name, const QString& message);
  64. private slots:
  65. void processData();
  66. void socketStateChanged(QAbstractSocket::SocketState state);
  67. void socketError(QAbstractSocket::SocketError state);
  68. private:
  69. void cleanup();
  70. void cancelPending();
  71. // QXmlDefaultHandler
  72. bool fatalError(const QXmlParseException& exception);
  73. bool startElement(const QString& namespaceURI, const QString& localName,
  74. const QString& qName, const QXmlAttributes& atts);
  75. bool endElement(const QString& namespaceURI, const QString& localName,
  76. const QString& qName);
  77. bool characters(const QString& ch);
  78. //std::unique_ptr<QAbstractSocket> socket;
  79. QAbstractSocket* socket;
  80. std::unique_ptr<QXmlInputSource> input;
  81. std::unique_ptr<QXmlSimpleReader> reader;
  82. QString xmlData;
  83. QXmlAttributes xmlAttrs;
  84. QQueue<Command*> commands;
  85. bool connected;
  86. };
  87. #endif