LocalJsonServer.cpp 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  1. //
  2. // Created by Tobias Hieta on 30/08/15.
  3. //
  4. #include <QDebug>
  5. #include <QFile>
  6. #include "LocalJsonServer.h"
  7. #include "Paths.h"
  8. /////////////////////////////////////////////////////////////////////////////////////////
  9. LocalJsonServer::LocalJsonServer(const QString& serverName, QObject* parent) : QObject(parent)
  10. {
  11. m_server = new QLocalServer(this);
  12. m_serverName = Paths::socketName(serverName);
  13. connect(m_server, &QLocalServer::newConnection, this, &LocalJsonServer::serverClientConnected);
  14. }
  15. /////////////////////////////////////////////////////////////////////////////////////////
  16. bool LocalJsonServer::listen()
  17. {
  18. while (!m_server->listen(m_serverName))
  19. {
  20. if (m_server->serverError() == QAbstractSocket::AddressInUseError)
  21. {
  22. QFile(m_serverName).remove();
  23. continue;
  24. }
  25. qWarning() << "Failed to listen to local socket:" << m_server->errorString();
  26. return false;
  27. }
  28. qInfo() << "Listening to socket:" << m_serverName;
  29. return true;
  30. }
  31. /////////////////////////////////////////////////////////////////////////////////////////
  32. void LocalJsonServer::serverClientConnected()
  33. {
  34. QLocalSocket* socket = m_server->nextPendingConnection();
  35. if (socket)
  36. {
  37. m_clientSockets << socket;
  38. connect(socket, &QLocalSocket::readyRead, this, &LocalJsonServer::clientReadyRead);
  39. emit clientConnected(socket);
  40. }
  41. }
  42. /////////////////////////////////////////////////////////////////////////////////////////
  43. bool LocalJsonServer::sendMessage(const QVariantMap& message, QLocalSocket* socket)
  44. {
  45. QJsonObject obj = QJsonObject::fromVariantMap(message);
  46. if (obj.isEmpty())
  47. return false;
  48. QJsonDocument doc(obj);
  49. QByteArray data = doc.toJson(QJsonDocument::Compact);
  50. data.append("\r\n");
  51. if (!data.isEmpty())
  52. return (socket->write(data) == data.size());
  53. return false;
  54. }
  55. /////////////////////////////////////////////////////////////////////////////////////////
  56. void LocalJsonServer::clientReadyRead()
  57. {
  58. QLocalSocket* socket = dynamic_cast<QLocalSocket*>(sender());
  59. if (!socket)
  60. return;
  61. QVariantList messages = readFromSocket(socket);
  62. for(const QVariant& msg : messages)
  63. emit messageReceived(msg.toMap());
  64. }
  65. /////////////////////////////////////////////////////////////////////////////////////////
  66. QVariantList LocalJsonServer::readFromSocket(QLocalSocket* socket)
  67. {
  68. QVariantList lst;
  69. while (socket->canReadLine())
  70. {
  71. QByteArray data = socket->readLine();
  72. if (!data.isNull())
  73. {
  74. QJsonParseError err;
  75. QJsonDocument doc = QJsonDocument::fromJson(data, &err);
  76. if (doc.isNull())
  77. {
  78. qWarning() << "Failed to parse message from client:" << err.errorString();
  79. continue;
  80. }
  81. lst << doc.toVariant();
  82. }
  83. }
  84. return lst;
  85. }