diff options
| -rw-r--r-- | SubscriptionManager.cpp | 10 | ||||
| -rw-r--r-- | SubscriptionManager.h | 2 | ||||
| -rw-r--r-- | plexgdm.cpp | 229 | 
3 files changed, 110 insertions, 131 deletions
| diff --git a/SubscriptionManager.cpp b/SubscriptionManager.cpp index 327d54f..e9830df 100644 --- a/SubscriptionManager.cpp +++ b/SubscriptionManager.cpp @@ -267,11 +267,6 @@ cSubscriberStatus::cSubscriberStatus()  	pControl = NULL;  } -void cSubscriberStatus::ChannelSwitch(const cDevice* Device, int ChannelNumber, bool LiveView) -{ -	dsyslog("[plex]: '%s'", __FUNCTION__); -} -  void cSubscriberStatus::Replaying(const cControl* DvbPlayerControl, const char* Name, const char* FileName, bool On)  {  	//dsyslog("[plex]: '%s'", __FUNCTION__); @@ -287,9 +282,4 @@ void cSubscriberStatus::Replaying(const cControl* DvbPlayerControl, const char*  	SubscriptionManager::GetInstance().Notify();  } -void cSubscriberStatus::SetVolume(int Volume, bool Absolute) -{ -	dsyslog("[plex]: '%s'", __FUNCTION__); -} -  } // Namespace diff --git a/SubscriptionManager.h b/SubscriptionManager.h index ec87d9b..19cfad1 100644 --- a/SubscriptionManager.h +++ b/SubscriptionManager.h @@ -17,9 +17,7 @@ namespace plexclient  class cSubscriberStatus : public cStatus  {  protected: -	virtual void ChannelSwitch(const cDevice *Device, int ChannelNumber, bool LiveView);  	virtual void Replaying(const cControl *DvbPlayerControl, const char *Name, const char *FileName, bool On); -	virtual void SetVolume(int Volume, bool Absolute);  public:  	cSubscriberStatus(); diff --git a/plexgdm.cpp b/plexgdm.cpp index fca991e..31e40b7 100644 --- a/plexgdm.cpp +++ b/plexgdm.cpp @@ -1,156 +1,147 @@  #include <vdr/tools.h>  #include "plexgdm.h" +#include <ctime>  namespace plexclient  {  plexgdm::plexgdm() -{	 -	_discoverMessage = "M-SEARCH * HTTP/1.0"; -	_clientHeader = "* HTTP/1.0"; -	_multicastAddress = "239.0.0.250"; -	_clientUpdatePort = 32412; -	 -	m_discoverAdress = Poco::Net::SocketAddress(_multicastAddress, 32414); -	m_clientRegisterGroup = Poco::Net::SocketAddress(_multicastAddress, 32413); -	 -	m_discoveryComplete = false; -	m_registrationIsRunning = false; -	m_clientRegistered = false; -	m_discoveryInterval = 120; -	m_discoveryIsRunning = false; +{ +    _discoverMessage = "M-SEARCH * HTTP/1.0"; +    _clientHeader = "* HTTP/1.0"; +    _multicastAddress = "239.0.0.250"; +    _clientUpdatePort = 32412; + +    m_discoverAdress = Poco::Net::SocketAddress(_multicastAddress, 32414); +    m_clientRegisterGroup = Poco::Net::SocketAddress(_multicastAddress, 32413); + +    m_discoveryComplete = false; +    m_registrationIsRunning = false; +    m_clientRegistered = false; +    m_discoveryInterval = 120; +    m_discoveryIsRunning = false;  }  plexgdm::~plexgdm()  {  } -void plexgdm::clientDetails(std::string c_id, std::string c_name, std::string c_port, std::string c_product, std::string c_version) +void plexgdm::clientDetails(std::string c_id, +                            std::string c_name, +                            std::string c_port, +                            std::string c_product, +                            std::string c_version)  { -	_clientData = 	"Content-Type: plex/media-player\n" -					"Resource-Identifier: " + c_id + "\n" -					"Device-Class: HTPC\n" -					"Name: " + c_name + "\n" -					"Port: " + c_port + "\n" -					"Product: " + c_product + "\n" -					"Protocol: plex\n" -					"Protocol-Capabilities: navigation,playback,timeline\n" -					"Protocol-Version: 1\n" -					"Version: " + c_version; -	_clientId = c_id; +	_clientData =   "Content-Type: plex/media-player\r\n" +					"Resource-Identifier: " + c_id + "\r\n" +					"Device-Class: PC\r\n" +					"Name: " +  c_name + "\r\n" +					"Port: " + c_port + "\r\n" +					"Product: " + c_product + "\r\n" +					"Protocol: plex\r\n" +					"Protocol-Capabilities: navigation,playback,timeline\r\n" +					"Protocol-Version: 1\r\n" +					"Version: " + c_version + "\r\n"; +    _clientId = c_id;  }  std::string plexgdm::getClientDetails()  { -	if (_clientData.empty()) throw "client_Data not initialized"; -	return _clientData; +    if(_clientData.empty()) +	throw "client_Data not initialized"; +    return _clientData;  }  void plexgdm::Action()  { -	 -	char buffer[1024]; -	m_registrationIsRunning = true; -	cMutexLock lock(&m_mutex); - -try { -	Poco::Net::MulticastSocket update_sock( -	    Poco::Net::SocketAddress( Poco::Net::IPAddress(), m_discoverAdress.port() ), -		true -	); - -	update_sock.setLoopback(true); -	update_sock.setReuseAddress(true); -	update_sock.setTimeToLive(255); -	update_sock.setBlocking(false); -	// Send initial Client Registration - -	std::string s = Poco::format("HELLO %s\n%s", _clientHeader, _clientData); -	update_sock.sendTo(s.c_str(), s.length(), m_clientRegisterGroup,0); - - -	while(m_registrationIsRunning) { -		Poco::Net::SocketAddress sender; -		int n = 0; -		try { -			n = update_sock.receiveFrom(buffer, sizeof(buffer), sender); -		} catch (Poco::TimeoutException &e) { -			n = 0; -		} -		if(n > 0) { -			std::string buf(buffer, n); -			if (buf.find("M-SEARCH * HTTP/1.") != std::string::npos) { -				dsyslog("[plex]: Detected client discovery request from %s",sender.host().toString().c_str()); -				s = Poco::format("HTTP/1.0 200 OK\n%s", _clientData); -				update_sock.sendTo(s.c_str(), s.length(), sender); -				m_clientRegistered = true; -			} -		} -		m_waitCondition.TimedWait(m_mutex, 600); -	} -	// Client loop stopped -	// unregister from Server -	s = Poco::format("BYE %s\n%s", _clientHeader, _clientData); -	update_sock.sendTo(s.c_str(), s.length(), m_clientRegisterGroup,0); +    char buffer[1024]; +    m_registrationIsRunning = true; +    cMutexLock lock(&m_mutex); -	m_clientRegistered = false; -} -	catch(Poco::Exception &exc){ -		esyslog("[plex]Exception in %s s%", __func__, exc.displayText().c_str() ); +    Poco::Net::MulticastSocket update_sock(Poco::Net::SocketAddress(Poco::Net::IPAddress(), _clientUpdatePort), true); + +    update_sock.setLoopback(true); +    update_sock.setReuseAddress(true); +    update_sock.setTimeToLive(255); +    update_sock.setBlocking(false); +    // Send initial Client Registration + +    std::string s = Poco::format("HELLO %s\n%s", _clientHeader, _clientData); +    update_sock.sendTo(s.c_str(), s.length(), m_clientRegisterGroup, 0); + +    while(m_registrationIsRunning && Running()) { +	Poco::Net::SocketAddress sender; +	int n = 0; +	try { +	    n = update_sock.receiveFrom(buffer, sizeof(buffer), sender); +	} catch(Poco::TimeoutException& e) { +	    n = 0;  	} +	if(n > 0) { +	    std::string buf(buffer, n); +	    if(buf.find("M-SEARCH * HTTP/1.") != std::string::npos) { +		//dsyslog("[plex]: Detected client discovery request from %s", sender.host().toString().c_str()); +		int t = std::time(0); +		s = Poco::format("HTTP/1.0 200 OK\r\n%sUpdated-At: %d", _clientData, t); +		update_sock.sendTo(s.c_str(), s.length(), sender, 0); +		m_clientRegistered = true; +	    } +	} +	m_waitCondition.TimedWait(m_mutex, 500); +    } +    // Client loop stopped + +    // unregister from Server +    s = Poco::format("BYE %s\r\n%s", _clientHeader, _clientData); +    update_sock.sendTo(s.c_str(), s.length(), m_clientRegisterGroup, 0); +    m_clientRegistered = false;  }  void plexgdm::discover()  { -	Poco::Net::MulticastSocket socket( -			Poco::Net::SocketAddress( Poco::Net::IPAddress(), m_discoverAdress.port() ), -			true -	); -	// TODO: Discover multiple servers -	char buffer[1024]; -	std::map<std::string, std::string> vBuffer; -	 -	socket.setLoopback(true); -	socket.setTimeToLive(1); -	socket.setReceiveTimeout(Poco::Timespan(0, 600*1000)); // microseconds -	socket.joinGroup(m_discoverAdress.host()); -	socket.sendTo(_discoverMessage.c_str(), _discoverMessage.length(), m_discoverAdress, 0); -	 -	try { -		while(true) { -			Poco::Net::SocketAddress sender; -			int n = socket.receiveFrom(buffer, sizeof(buffer), sender); -			std::string buf(buffer, n); -			if(buf.find("200 OK") != std::string::npos) { -				vBuffer[sender.host().toString()] = buf; -			} -		} -	} -	catch(Poco::TimeoutException &exc){ -		dsyslog("[plex]TimeoutException in %s s%", __func__, exc.displayText().c_str() ); -	} -	 -	socket.close(); -	m_discoveryComplete = true; -	 -	for(std::map<std::string, std::string>::iterator it = vBuffer.begin() ; it != vBuffer.end(); ++it) { -		std::string host = it->first; -		std::string data = it->second; -		 -		m_vServers.push_back(PlexServer(data, host)); +    Poco::Net::MulticastSocket socket(Poco::Net::SocketAddress(Poco::Net::IPAddress(), m_discoverAdress.port()), true); +    // TODO: Discover multiple servers +    char buffer[1024]; +    std::map<std::string, std::string> vBuffer; + +    socket.setLoopback(true); +    socket.setTimeToLive(1); +    socket.setReceiveTimeout(Poco::Timespan(0, 600 * 1000)); // microseconds +    socket.joinGroup(m_discoverAdress.host()); +    socket.sendTo(_discoverMessage.c_str(), _discoverMessage.length(), m_discoverAdress, 0); + +    try { +	while(true) { +	    Poco::Net::SocketAddress sender; +	    int n = socket.receiveFrom(buffer, sizeof(buffer), sender); +	    std::string buf(buffer, n); +	    if(buf.find("200 OK") != std::string::npos) { +		vBuffer[sender.host().toString()] = buf; +	    }  	} +    } catch(Poco::TimeoutException& exc) { +	dsyslog("[plex]TimeoutException in %s s%", __func__, exc.displayText().c_str()); +    } + +    socket.close(); +    m_discoveryComplete = true; + +    for(std::map<std::string, std::string>::iterator it = vBuffer.begin(); it != vBuffer.end(); ++it) { +	std::string host = it->first; +	std::string data = it->second; + +	m_vServers.push_back(PlexServer(data, host)); +    }  }  void plexgdm::stopRegistration()  { -	if(m_registrationIsRunning) { -		m_registrationIsRunning = false; -		m_waitCondition.Broadcast(); -		Cancel(3); -	} +    if(m_registrationIsRunning) { +	m_registrationIsRunning = false; +	m_waitCondition.Broadcast(); +	Cancel(); +    }  } - -  } | 
