summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--cPlexOsdItem.cpp15
-rw-r--r--cPlexOsdItem.h4
-rw-r--r--plex.cpp75
-rw-r--r--plex.h8
-rw-r--r--plexgdm.cpp52
-rw-r--r--plexgdm.h15
6 files changed, 100 insertions, 69 deletions
diff --git a/cPlexOsdItem.cpp b/cPlexOsdItem.cpp
index b76f577..3d0684e 100644
--- a/cPlexOsdItem.cpp
+++ b/cPlexOsdItem.cpp
@@ -3,6 +3,15 @@
cPlexOsdItem::cPlexOsdItem(const char* title) :cOsdItem(title) {
item = 0;
dir = 0;
+ pserver = 0;
+ m_bVideo = false;
+ m_bDir = false;
+}
+
+cPlexOsdItem::cPlexOsdItem(const char* title, plexclient::PlexServer* server) :cOsdItem(title) {
+ item = 0;
+ dir = 0;
+ pserver = server;
m_bVideo = false;
m_bDir = false;
}
@@ -10,6 +19,7 @@ cPlexOsdItem::cPlexOsdItem(const char* title) :cOsdItem(title) {
cPlexOsdItem::cPlexOsdItem(const char* title, plexclient::Video* obj) :cOsdItem(title) {
item = obj;
dir = 0;
+ pserver = 0;
m_bVideo = true;
m_bDir = false;
}
@@ -17,6 +27,7 @@ cPlexOsdItem::cPlexOsdItem(const char* title, plexclient::Video* obj) :cOsdItem(
cPlexOsdItem::cPlexOsdItem(const char* title, plexclient::Directory* obj) :cOsdItem(title) {
dir = obj;
item = 0;
+ pserver = 0;
m_bDir = true;
m_bVideo = false;
}
@@ -29,6 +40,10 @@ plexclient::Directory* cPlexOsdItem::GetAttachedDirectory() {
return dir;
}
+plexclient::PlexServer* cPlexOsdItem::GetAttachedServer() {
+ return pserver;
+}
+
cPlexOsdItem::~cPlexOsdItem()
{
}
diff --git a/cPlexOsdItem.h b/cPlexOsdItem.h
index 5ca144c..3395cb0 100644
--- a/cPlexOsdItem.h
+++ b/cPlexOsdItem.h
@@ -7,22 +7,26 @@
#include "PVideo.h"
#include "Directory.h"
+#include "PlexServer.h"
class cPlexOsdItem : public cOsdItem
{
private:
plexclient::Video *item;
plexclient::Directory *dir;
+ plexclient::PlexServer *pserver;
bool m_bVideo;
bool m_bDir;
public:
cPlexOsdItem(const char* title);
+ cPlexOsdItem(const char* title, plexclient::PlexServer* server);
cPlexOsdItem(const char* title, plexclient::Video* obj);
cPlexOsdItem(const char* title, plexclient::Directory* obj);
~cPlexOsdItem();
plexclient::Video* GetAttachedVideo();
plexclient::Directory* GetAttachedDirectory();
+ plexclient::PlexServer* GetAttachedServer();
bool IsVideo() const {
return m_bVideo;
diff --git a/plex.cpp b/plex.cpp
index f424d18..a5287ae 100644
--- a/plex.cpp
+++ b/plex.cpp
@@ -573,6 +573,7 @@ static void PlayFile(const char *filename)
static char ShowBrowser; ///< flag show browser
+static plexclient::PlexServer* pPlexServer;
/*
static const char *BrowserStartDir; ///< browser start directory
static const NameFilter *BrowserFilters; ///< browser name filters
@@ -583,14 +584,19 @@ static char **DirStack; ///< current path directory stack
*/
-cPlexBrowser::cPlexBrowser(const char *title, plexclient::Plexservice* pServ) :cOsdMenu(title) {
+cPlexBrowser::cPlexBrowser(const char *title, plexclient::PlexServer* pServ) :cOsdMenu(title) {
dsyslog("[plex]%s:\n", __FUNCTION__);
- pService = pServ;
+ pService = new plexclient::Plexservice(pServ);
+ pService->Authenticate();
pCont = pService->GetAllSections();
CreateMenu();
}
+cPlexBrowser::~cPlexBrowser() {
+ delete pService;
+}
+
void cPlexBrowser::CreateMenu() {
// Clear Menu
Clear();
@@ -678,14 +684,12 @@ eOSState cPlexBrowser::LevelUp() {
}
eOSState cPlexBrowser::ProcessSelected() {
- int current;
- cPlexOsdItem *item;
std::string fullUri;
//char *filename;
//char *tmp;
- current = Current(); // get current menu item index
- item = static_cast<cPlexOsdItem*>(Get(current));
+ int current = Current(); // get current menu item index
+ cPlexOsdItem *item = static_cast<cPlexOsdItem*>(Get(current));
if(item->IsVideo()) {
@@ -731,19 +735,18 @@ eOSState cPlexBrowser::ProcessSelected() {
/**
** Play menu constructor.
*/
-cPlayMenu::cPlayMenu(const char *title, plexclient::plexgdm* gdm, int c0, int c1, int c2, int c3, int c4)
+cPlayMenu::cPlayMenu(const char *title, int c0, int c1, int c2, int c3, int c4)
:cOsdMenu(title, c0, c1, c2, c3, c4)
{
SetHasHotkeys();
- plexclient::PlexServer *server = gdm->GetPServer();
-
- if(server) {
- std::string serverName = server->GetServerName();
- Add(new cOsdItem(hk(serverName.c_str()), osUser1));
+ for(std::vector<plexclient::PlexServer>::iterator it = plexclient::plexgdm::GetInstance().GetPlexservers().begin(); it != plexclient::plexgdm::GetInstance().GetPlexservers().end(); ++it) {
+ plexclient::PlexServer *pServer = &(*it);
+ Add(new cPlexOsdItem(pServer->GetServerName().c_str(), pServer));
}
- else {
- Add(new cOsdItem("No Plex Media Server found."));
+
+ if(Count() < 1) {
+ Add(new cPlexOsdItem("No Plex Media Server found."), false);
}
}
@@ -768,13 +771,22 @@ eOSState cPlayMenu::ProcessKey(eKeys key)
}
// call standard function
state = cOsdMenu::ProcessKey(key);
-
+
+ int current = Current(); // get current menu item index
+ cPlexOsdItem *item = static_cast<cPlexOsdItem*>(Get(current));
+
switch (state) {
- case osUser1:
- ShowBrowser = 1;
- return osPlugin; // restart with OSD browser
- default:
- break;
+ case osUnknown:
+ switch (key) {
+ case kOk:
+ pPlexServer = item->GetAttachedServer();
+ ShowBrowser = 1;
+ return osPlugin; // restart with OSD browser
+ default:
+ break;
+ }
+ default:
+ break;
}
return state;
}
@@ -1082,10 +1094,8 @@ cMyPlugin::cMyPlugin(void)
cMyPlugin::~cMyPlugin(void)
{
dsyslog("[plex]%s:\n", __FUNCTION__);
- pPlexgdm->stopRegistration();
+ plexclient::plexgdm::GetInstance().stopRegistration();
plexclient::ControlServer::GetInstance().Stop();
- delete(pPlexgdm);
- delete(pService);
}
/**
@@ -1140,20 +1150,17 @@ bool cMyPlugin::Initialize(void)
// First Startup? Save UUID
SetupStore("UUID", Config::GetInstance().GetUUID().c_str());
- pPlexgdm = new plexclient::plexgdm();
- pPlexgdm->discover();
- plexclient::PlexServer *pServer = pPlexgdm->GetPServer();
- if (pServer != 0) {
- pPlexgdm->clientDetails(Config::GetInstance().GetUUID(), DESCRIPTION, "3200", "VDR", VERSION);
- pPlexgdm->Start();
-
- pService = new plexclient::Plexservice(pServer);
- pService->Authenticate();
+ plexclient::plexgdm::GetInstance().discover();
+
+ if (plexclient::plexgdm::GetInstance().GetPlexservers().size() > 0) {
+ plexclient::plexgdm::GetInstance().clientDetails(Config::GetInstance().GetUUID(), DESCRIPTION, "3200", "VDR", VERSION);
+ plexclient::plexgdm::GetInstance().Start();
plexclient::ControlServer::GetInstance().Start();
} else {
perror("No Plexserver found");
+ std::cout << "No Plexmediaserver found" << std::endl;
}
MyDevice = new cMyDevice;
@@ -1177,9 +1184,9 @@ cOsdObject *cMyPlugin::MainMenuAction(void)
//dsyslog("[plex]%s:\n", __FUNCTION__);
if (ShowBrowser) {
- return new cPlexBrowser("Newest", this->pService);
+ return new cPlexBrowser("Newest", pPlexServer);
}
- return new cPlayMenu("Plex", pPlexgdm);
+ return new cPlayMenu("Plex");
}
/**
diff --git a/plex.h b/plex.h
index 5b0ff71..a81f08e 100644
--- a/plex.h
+++ b/plex.h
@@ -130,8 +130,8 @@ private:
eOSState ProcessSelected();
public:
- cPlexBrowser(const char *title, plexclient::Plexservice* pServ);
-
+ cPlexBrowser(const char *title, plexclient::PlexServer* pServ);
+ ~cPlexBrowser();
/// File browser destructor
//virtual ~ cPlexBrowser();
/// Process keyboard input
@@ -146,7 +146,7 @@ class cPlayMenu:public cOsdMenu
{
private:
public:
- cPlayMenu(const char *, plexclient::plexgdm* gdm, int = 0, int = 0, int = 0, int = 0, int = 0);
+ cPlayMenu(const char *, int = 0, int = 0, int = 0, int = 0, int = 0);
virtual ~ cPlayMenu();
virtual eOSState ProcessKey(eKeys);
};
@@ -215,8 +215,6 @@ class cMyPlugin:public cPlugin
virtual cString SVDRPCommand(const char *, const char *, int &);
private:
- plexclient::Plexservice* pService;
- plexclient::plexgdm* pPlexgdm;
};
#endif \ No newline at end of file
diff --git a/plexgdm.cpp b/plexgdm.cpp
index cb42be3..769e5dd 100644
--- a/plexgdm.cpp
+++ b/plexgdm.cpp
@@ -108,40 +108,44 @@ try {
void plexgdm::discover()
{
- try {
- // TODO: Discover multiple servers
- char buffer[1024];
-
- Poco::Net::MulticastSocket socket(
+ Poco::Net::MulticastSocket socket(
Poco::Net::SocketAddress( Poco::Net::IPAddress(), m_discoverAdress.port() ),
true
- );
- socket.setLoopback(true);
- socket.setTimeToLive(1);
- socket.setReceiveTimeout(0.6);
- socket.sendTo(_discoverMessage.c_str(), _discoverMessage.length(), m_discoverAdress, 0);
-
- socket.joinGroup(m_discoverAdress.host());
+ );
+ // 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);
- std::cout << "Discover received from: " << sender.host().toString() << "\nData:\n" << buf << std::endl;
-
- // check for a valid response
if(buf.find("200 OK") != std::string::npos) {
- m_pServer = new PlexServer(buf, sender.host().toString());
- std::cout << "New Plexserver: " << m_pServer->GetServerName() << " Adress: " << m_pServer->GetIpAdress() << ":" << m_pServer->GetPort() << std::endl;
- socket.close();
- m_discoveryComplete = true;
- break;
+ vBuffer[sender.host().toString()] = buf;
}
+ //std::cout << "Discover received from: " << sender.host().toString() << "\nData:\n" << buf << std::endl;
}
-
}
- catch(Poco::Exception &exc){
- esyslog("[plex]Exception in %s s%", __func__, exc.displayText().c_str() );
- std::cout << "[plex]Exception: in " << __func__ << " | " << exc.displayText() << std::endl;
+ catch(Poco::TimeoutException &exc){
+ //dsyslog("[plex]TimeoutException in %s s%", __func__, exc.displayText().c_str() );
+ std::cout << "[plex]TimeoutException: in " << __func__ << " | " << exc.displayText() << std::endl;
+ }
+
+ 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));
}
}
diff --git a/plexgdm.h b/plexgdm.h
index f48f07f..8cbedea 100644
--- a/plexgdm.h
+++ b/plexgdm.h
@@ -8,6 +8,7 @@
#include <unistd.h>
#include <string.h>
#include <errno.h>
+#include <vector>
#include <Poco/Net/SocketAddress.h>
#include <Poco/Net/MulticastSocket.h>
@@ -23,7 +24,10 @@ namespace plexclient
class plexgdm : public cThread
{
public:
- plexgdm();
+ static plexgdm& GetInstance() {
+ static plexgdm instance;
+ return instance;
+ }
~plexgdm();
void clientDetails(std::string c_id, std::string c_name, std::string c_port, std::string c_product, std::string c_version);
std::string getClientDetails();
@@ -39,16 +43,15 @@ public:
//void stopAll();
void stopRegistration();
-
- PlexServer* GetPServer() {
- return m_pServer;
+ std::vector<PlexServer> &GetPlexservers() {
+ return m_vServers;
}
protected:
private:
-
+ plexgdm();
cMutex m_mutex;
cCondVar m_waitCondition;
@@ -68,7 +71,7 @@ protected:
std::string _clientId;
std::string _multicastAddress;
int _clientUpdatePort;
- PlexServer *m_pServer;
+ std::vector<PlexServer> m_vServers;
};
}