LocalJsonServer.cpp 2.7 KB

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