diff options
-rw-r--r-- | cPlexOsdItem.cpp | 15 | ||||
-rw-r--r-- | cPlexOsdItem.h | 4 | ||||
-rw-r--r-- | plex.cpp | 75 | ||||
-rw-r--r-- | plex.h | 8 | ||||
-rw-r--r-- | plexgdm.cpp | 52 | ||||
-rw-r--r-- | plexgdm.h | 15 |
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; @@ -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"); } /** @@ -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)); } } @@ -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; }; } |