MythTV master
ssdp.h
Go to the documentation of this file.
1
2// Program Name: ssdp.h
3// Created : Oct. 1, 2005
4//
5// Purpose : SSDP Discovery Service Implmenetation
6//
7// Copyright (c) 2005 David Blain <dblain@mythtv.org>
8//
9// Licensed under the GPL v2 or later, see LICENSE for details
10//
12
13#ifndef SSDP_H
14#define SSDP_H
15
16#include <array>
17
18#include <QHostAddress>
19#include <QObject>
20#include <QRegularExpression>
21#include <QString>
22
23#include "libmythbase/mthread.h"
24
25#include "upnpexp.h"
26#include "httprequest.h"
27#include "httpserver.h"
28#include "msocketdevice.h"
29#include "ssdpcache.h"
30#include "upnptasknotify.h"
31
32static constexpr const char* SSDP_GROUP { "239.255.255.250" };
33static constexpr uint16_t SSDP_PORT { 1900 };
34static constexpr uint16_t SSDP_SEARCHPORT { 6549 };
35
36enum SSDPMethod : std::uint8_t
37{
41};
42
43enum SSDPRequestType : std::uint8_t
44{
48 SSDP_Notify = 3
49};
50
53//
54// SSDPThread Class Definition (Singleton)
55//
58
59enum SocketIdxType : std::uint8_t
60{
64};
65
66class UPNP_PUBLIC SSDP : public MThread
67{
68 private:
69 // Singleton instance used by all.
70 static SSDP* g_pSSDP;
71
72 QRegularExpression m_procReqLineExp {"\\s+"};
73 constexpr static int kNumberOfSockets = 3;
74 std::array<MSocketDevice*,kNumberOfSockets> m_sockets {nullptr,nullptr,nullptr};
75
76 int m_nPort {SSDP_PORT};
77 int m_nSearchPort {SSDP_SEARCHPORT};
78 int m_nServicePort {0};
79
80 UPnpNotifyTask *m_pNotifyTask {nullptr};
81 bool m_bAnnouncementsEnabled {false};
82
83 bool m_bTermRequested {false};
84 QMutex m_lock;
85
86 private:
87
88 // ------------------------------------------------------------------
89 // Private so the singleton pattern can be enforced.
90 // ------------------------------------------------------------------
91
92 SSDP ();
93
94 protected:
95
96 bool ProcessSearchRequest ( const QStringMap &sHeaders,
97 const QHostAddress& peerAddress,
98 quint16 peerPort ) const;
99 static bool ProcessSearchResponse( const QStringMap &sHeaders );
100 static bool ProcessNotify ( const QStringMap &sHeaders );
101
103
104 static QString GetHeaderValue ( const QStringMap &headers,
105 const QString &sKey,
106 const QString &sDefault );
107
108 void ProcessData ( MSocketDevice *pSocket );
109
110 SSDPRequestType ProcessRequestLine( const QString &sLine );
111
112 void run() override; // MThread
113
114 public:
115
116 static inline const QString kBackendURI = "urn:schemas-mythtv-org:device:MasterMediaServer:1";
117
118 static SSDP* Instance();
119 static void Shutdown();
120
121 ~SSDP() override;
122
123 void RequestTerminate(void);
124
125 void PerformSearch(const QString &sST, std::chrono::seconds timeout = 2s);
126
127 void EnableNotifications ( int nServicePort );
128 void DisableNotifications();
129
130 // ------------------------------------------------------------------
131
132 static void AddListener(QObject *listener)
133 { SSDPCache::Instance()->addListener(listener); }
134 static void RemoveListener(QObject *listener)
135 { SSDPCache::Instance()->removeListener(listener); }
136
137 static SSDPCacheEntries *Find(const QString &sURI)
138 { return SSDPCache::Instance()->Find(sURI); }
139 static DeviceLocation *Find(const QString &sURI,
140 const QString &sUSN)
141 { return SSDPCache::Instance()->Find( sURI, sUSN ); }
142};
143
146//
147// SSDPExtension Class Definition
148//
151
153{
154 private:
155
158
159 private:
160
161 static SSDPMethod GetMethod( const QString &sURI );
162
163 void GetDeviceDesc( HTTPRequest *pRequest ) const;
164 void GetFile ( HTTPRequest *pRequest, const QString& sFileName );
165 static void GetDeviceList( HTTPRequest *pRequest );
166
167 public:
168 SSDPExtension( int nServicePort, const QString &sSharePath);
169 ~SSDPExtension( ) override = default;
170
171 QStringList GetBasePaths() override; // HttpServerExtension
172
173 bool ProcessRequest( HTTPRequest *pRequest ) override; // HttpServerExtension
174};
175
176#endif // SSDP_H
This is a wrapper around QThread that does several additional things.
Definition: mthread.h:49
virtual void run(void)
Runs the Qt event loop unless we have a QRunnable, in which case we run the runnable run instead.
Definition: mthread.cpp:315
void addListener(QObject *listener)
Add a listener to the observable.
void removeListener(QObject *listener)
Remove a listener to the observable.
static SSDPCache * Instance()
Definition: ssdpcache.cpp:285
SSDPCacheEntries * Find(const QString &sURI)
Finds the SSDPCacheEntries in the cache, returns nullptr when absent.
Definition: ssdpcache.cpp:341
int m_nServicePort
Definition: ssdp.h:157
QString m_sUPnpDescPath
Definition: ssdp.h:156
~SSDPExtension() override=default
void GetFile(HTTPRequest *pRequest, const QString &sFileName)
Definition: ssdp.cpp:816
void GetDeviceDesc(HTTPRequest *pRequest) const
Definition: ssdp.cpp:793
static void GetDeviceList(HTTPRequest *pRequest)
Definition: ssdp.cpp:848
SSDPExtension(int nServicePort, const QString &sSharePath)
Definition: ssdp.cpp:734
bool ProcessRequest(HTTPRequest *pRequest) override
Definition: ssdp.cpp:770
static SSDPMethod GetMethod(const QString &sURI)
Definition: ssdp.cpp:746
QStringList GetBasePaths() override
Definition: ssdp.cpp:758
Definition: ssdp.h:67
static SSDPCacheEntries * Find(const QString &sURI)
Definition: ssdp.h:137
static void RemoveListener(QObject *listener)
Definition: ssdp.h:134
bool IsTermRequested()
static void AddListener(QObject *listener)
Definition: ssdp.h:132
QMutex m_lock
Definition: ssdp.h:84
static DeviceLocation * Find(const QString &sURI, const QString &sUSN)
Definition: ssdp.h:139
static SSDP * g_pSSDP
Definition: ssdp.h:70
unsigned short uint16_t
Definition: iso6937tables.h:3
static constexpr uint16_t SSDP_PORT
Definition: ssdp.h:33
SSDPMethod
Definition: ssdp.h:37
@ SSDPM_Unknown
Definition: ssdp.h:38
@ SSDPM_GetDeviceList
Definition: ssdp.h:40
@ SSDPM_GetDeviceDesc
Definition: ssdp.h:39
static constexpr uint16_t SSDP_SEARCHPORT
Definition: ssdp.h:34
static constexpr const char * SSDP_GROUP
Definition: ssdp.h:32
SSDPRequestType
Definition: ssdp.h:44
@ SSDP_Notify
Definition: ssdp.h:48
@ SSDP_MSearchResp
Definition: ssdp.h:47
@ SSDP_Unknown
Definition: ssdp.h:45
@ SSDP_MSearch
Definition: ssdp.h:46
SocketIdxType
Definition: ssdp.h:60
@ SocketIdx_Broadcast
Definition: ssdp.h:63
@ SocketIdx_Search
Definition: ssdp.h:61
@ SocketIdx_Multicast
Definition: ssdp.h:62
#define UPNP_PUBLIC
Definition: upnpexp.h:9
QMap< QString, QString > QStringMap
Definition: upnputil.h:28