summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorchriszero <zerov83@gmail.com>2015-02-08 16:17:10 +0100
committerchriszero <zerov83@gmail.com>2015-02-08 16:17:10 +0100
commitaae151d3808c9c72a6c155261295b2eeaba57c00 (patch)
treea3770b54955c562502aa33c46517c1e327ecfb32
parent886aa7f168ebdc922864aeee432735ba48dde55b (diff)
downloadvdr-plugin-plex-aae151d3808c9c72a6c155261295b2eeaba57c00.tar.gz
vdr-plugin-plex-aae151d3808c9c72a6c155261295b2eeaba57c00.tar.bz2
Fixes GDM Protocol, discovering and registering of players and servers
-rw-r--r--SubscriptionManager.cpp10
-rw-r--r--SubscriptionManager.h2
-rw-r--r--plexgdm.cpp229
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();
+ }
}
-
-
}