4#include "Stroika/Frameworks/StroikaPreComp.h"
7#include "Stroika/Foundation/Containers/Sequence.h"
13#include "Stroika/Foundation/Streams/MemoryStream.h"
18#include "BasicServer.h"
24using namespace Stroika::Foundation::IO;
27using namespace Stroika::Frameworks;
28using namespace Stroika::Frameworks::UPnP;
29using namespace Stroika::Frameworks::UPnP::SSDP;
30using namespace Stroika::Frameworks::UPnP::SSDP::Server;
37class BasicServer::Rep_ {
40 FrequencyInfo fFrequencyInfo;
44 , fLocation{d.fLocation}
47 SSDP::Advertisement dan;
49 dan.fServer = d.fServer;
51 dan.fTarget = kTarget_UPNPRootDevice;
52 dan.fUSN = Format (
"uuid:{}::{}"_f, d.fDeviceID, kTarget_UPNPRootDevice);
53 fAdvertisements.
Append (dan);
56 dan.fUSN = Format (
"uuid:{}"_f, d.fDeviceID);
57 dan.fTarget = dan.fUSN;
58 fAdvertisements.
Append (dan);
60 if (not dd.fDeviceType.empty ()) {
61 dan.fUSN = Format (
"uuid:{}::{}"_f, d.fDeviceID, dd.fDeviceType);
62 dan.fTarget = dd.fDeviceType;
63 fAdvertisements.
Append (dan);
69 fNotifier_ = make_unique<PeriodicNotifier> (GetAdjustedAdvertisements_ (), fi, ipVersion);
70 fSearchResponder_ = make_unique<SearchResponder> (GetAdjustedAdvertisements_ (), ipVersion);
74 lm.AddCallback ([
this] (LinkMonitor::LinkChange lc,
String netName,
String ipNum) {
75 Debug::TraceContextBumper ctx{
"Basic SSDP server - LinkMonitor callback",
"lc = {}, netName={}, ipNum={}"_f, lc, netName, ipNum};
76 if (lc == LinkMonitor::LinkChange::eAdded) {
80 fLinkMonitor_ = optional<LinkMonitor>{move (lm)};
89 return fAdvertisements;
93 URI useBaseURL = fLocation;
96 useBaseURL.SetAuthority (useAuthority);
97 for (
auto ai : fAdvertisements) {
98 ai.fLocation = useBaseURL.
Combine (ai.fLocation);
99 revisedAdvertisements.
Append (ai);
101 return revisedAdvertisements;
108 fSearchResponder_.reset ();
109 fNotifier_ = make_unique<PeriodicNotifier> (GetAdjustedAdvertisements_ (), PeriodicNotifier::FrequencyInfo{});
110 fSearchResponder_ = make_unique<SearchResponder> (GetAdjustedAdvertisements_ ());
112 unique_ptr<PeriodicNotifier> fNotifier_;
113 unique_ptr<SearchResponder> fSearchResponder_;
114 optional<IO::Network::LinkMonitor> fLinkMonitor_;
123 : fRep_{make_shared<Rep_> (d, dd, fi, ipVersion)}
String is like std::u32string, except it is much easier to use, often much more space efficient,...
A generalization of a vector: a container whose elements are keyed by the natural numbers.
nonvirtual void Append(ArgByValueType< value_type > item)
nonvirtual URI Combine(const URI &overridingURI) const
Combine overridingURI possibly relative url with this base url, to produce a new URI.
nonvirtual optional< Authority > GetAuthority() const
InternetAddress GetPrimaryInternetAddress()