GDMManager.cpp 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. #include "GDMManager.h"
  2. #include <QUdpSocket>
  3. #include <QHostInfo>
  4. #include "settings/SettingsComponent.h"
  5. #include "QsLog.h"
  6. #include "RemoteComponent.h"
  7. ///////////////////////////////////////////////////////////////////////////////////////////////////
  8. GDMManager::GDMManager(QObject *parent) : QObject(parent), m_port(-1)
  9. {
  10. }
  11. ///////////////////////////////////////////////////////////////////////////////////////////////////
  12. void GDMManager::startAnnouncing()
  13. {
  14. startListener();
  15. }
  16. ///////////////////////////////////////////////////////////////////////////////////////////////////
  17. void GDMManager::stopAnnouncing()
  18. {
  19. m_socket.close();
  20. }
  21. ///////////////////////////////////////////////////////////////////////////////////////////////////
  22. void GDMManager::startListener()
  23. {
  24. m_socket.bind(QHostAddress::AnyIPv4, 32412, QUdpSocket::ReuseAddressHint | QUdpSocket::ShareAddress);
  25. QHostAddress multicast("239.0.0.250");
  26. m_socket.joinMulticastGroup(multicast);
  27. connect(&m_socket, &QUdpSocket::readyRead, this, &GDMManager::readData);
  28. }
  29. ///////////////////////////////////////////////////////////////////////////////////////////////////
  30. void GDMManager::readData()
  31. {
  32. while (m_socket.hasPendingDatagrams())
  33. {
  34. QByteArray datagram;
  35. datagram.resize(m_socket.pendingDatagramSize());
  36. QHostAddress sender;
  37. quint16 senderPort;
  38. m_socket.readDatagram(datagram.data(), datagram.size(), &sender, &senderPort);
  39. parseData(datagram, sender, senderPort);
  40. }
  41. }
  42. ///////////////////////////////////////////////////////////////////////////////////////////////////
  43. void GDMManager::parseData(const QByteArray& data, const QHostAddress& sender, quint16 port)
  44. {
  45. if (data.startsWith("M-SEARCH *"))
  46. m_socket.writeDatagram(getPacket(), sender, port);
  47. }
  48. /////////////////////////////////////////////////////////////////////////////////////////
  49. QByteArray GDMManager::getPacket()
  50. {
  51. QByteArray packetData;
  52. // Header
  53. packetData.append("HTTP/1.0 200 OK\r\n");
  54. packetData.append("Content-Type: plex/media-player\r\n");
  55. QVariantMap headers = RemoteComponent::GDMInformation();
  56. for(const QString& key : headers.keys())
  57. packetData.append(key + ": " + headers[key].toString() + "\r\n");
  58. // terminate header
  59. packetData.append("\r\n");
  60. return packetData;
  61. }