diff --git a/server/Makefile b/server/Makefile index 8f512ac..ba09649 100644 --- a/server/Makefile +++ b/server/Makefile @@ -23,7 +23,7 @@ SERVEROBJS = $(PLUGIN).o \ componentHTTP.o connectionHTTP.o menuHTTP.o \ componentIGMP.o connectionIGMP.o \ streamer.o livestreamer.o livefilter.o recplayer.o \ - suspend.o setup.o + menu.o suspend.o setup.o ### The main target: diff --git a/server/connection.c b/server/connection.c index 366eec5..f152f02 100644 --- a/server/connection.c +++ b/server/connection.c @@ -407,3 +407,6 @@ void cServerConnection::MainThreadHook() { m_SwitchLive->Switch(); } + +cString cServerConnection::ToText() const +{ return cString::sprintf("%s\t%s:%d", Protocol(), RemoteIp().c_str(), RemotePort()); } diff --git a/server/connection.h b/server/connection.h index 6cc6764..e7e3f1e 100644 --- a/server/connection.h +++ b/server/connection.h @@ -122,6 +122,9 @@ public: /* This connections protocol name */ virtual const char* Protocol(void) const { return m_Protocol; } + /* Representation in menu */ + virtual cString ToText(void) const; + /* std::map with additional information */ const tStrStrMap& Headers(void) const { return m_Headers; } }; diff --git a/server/connectionHTTP.c b/server/connectionHTTP.c index 161d5c7..937f7ec 100644 --- a/server/connectionHTTP.c +++ b/server/connectionHTTP.c @@ -359,3 +359,8 @@ bool cConnectionHTTP::ProcessURI(const std::string& PathInfo) return false; } +cString cConnectionHTTP::ToText() const +{ + cString str = cServerConnection::ToText(); + return m_LiveStreamer ? cString::sprintf("%s\t%s", *str, *m_LiveStreamer->ToText()) : str; +} diff --git a/server/connectionHTTP.h b/server/connectionHTTP.h index 56f89b0..8f071ce 100644 --- a/server/connectionHTTP.h +++ b/server/connectionHTTP.h @@ -47,6 +47,8 @@ public: virtual void Attach(void) { if (m_LiveStreamer != NULL) m_LiveStreamer->Attach(); } virtual void Detach(void) { if (m_LiveStreamer != NULL) m_LiveStreamer->Detach(); } + virtual cString ToText() const; + virtual bool CanAuthenticate(void); virtual bool Command(char *Cmd); @@ -57,7 +59,7 @@ public: inline bool cConnectionHTTP::Abort(void) const { - return m_LiveStreamer && m_LiveStreamer->Abort(); + return !IsOpen() || (m_LiveStreamer && m_LiveStreamer->Abort()); } #endif // VDR_STREAMDEV_SERVERS_CONNECTIONVTP_H diff --git a/server/connectionIGMP.c b/server/connectionIGMP.c index 53b9acf..695c8bc 100644 --- a/server/connectionIGMP.c +++ b/server/connectionIGMP.c @@ -71,3 +71,9 @@ void cConnectionIGMP::Stop() DELETENULL(m_LiveStreamer); } } + +cString cConnectionIGMP::ToText() const +{ + cString str = cServerConnection::ToText(); + return m_LiveStreamer ? cString::sprintf("%s\t%s", *str, *m_LiveStreamer->ToText()) : str; +} diff --git a/server/connectionIGMP.h b/server/connectionIGMP.h index facda65..1faa51d 100644 --- a/server/connectionIGMP.h +++ b/server/connectionIGMP.h @@ -28,6 +28,7 @@ public: bool SetChannel(cChannel *Channel, in_addr_t Dst); virtual void Welcome(void); + virtual cString ToText() const; void Stop(); /* Not used here */ @@ -41,7 +42,7 @@ public: inline bool cConnectionIGMP::Abort(void) const { - return !m_LiveStreamer || m_LiveStreamer->Abort(); + return !IsOpen() || !m_LiveStreamer || m_LiveStreamer->Abort(); } #endif // VDR_STREAMDEV_SERVERS_CONNECTIONIGMP_H diff --git a/server/connectionVTP.c b/server/connectionVTP.c index 9ffa540..71fa43f 100644 --- a/server/connectionVTP.c +++ b/server/connectionVTP.c @@ -774,7 +774,7 @@ cConnectionVTP::~cConnectionVTP() bool cConnectionVTP::Abort(void) const { - return (m_LiveStreamer && m_LiveStreamer->Abort()) || + return !IsOpen() || (m_LiveStreamer && m_LiveStreamer->Abort()) || (m_FilterStreamer && m_FilterStreamer->Abort()); } @@ -1811,3 +1811,14 @@ bool cConnectionVTP::Respond(int Code, const char *Message, ...) Code < 0 ? -Code : Code, Code < 0 ? '-' : ' ', *str); } + +cString cConnectionVTP::ToText() const +{ + cString str = cServerConnection::ToText(); + if (m_LiveStreamer) + return cString::sprintf("%s\t%s", *str, *m_LiveStreamer->ToText()); + else if (m_RecPlayer) + return cString::sprintf("%s\t%s", *str, m_RecPlayer->getCurrentRecording()->Name()); + else + return str; +} diff --git a/server/connectionVTP.h b/server/connectionVTP.h index 2d683f3..9aab650 100644 --- a/server/connectionVTP.h +++ b/server/connectionVTP.h @@ -53,6 +53,8 @@ public: virtual void Welcome(void); virtual void Reject(void); + virtual cString ToText() const; + virtual bool Abort(void) const; virtual void Detach(void); virtual void Attach(void); diff --git a/server/livestreamer.c b/server/livestreamer.c index 1064943..a90471a 100644 --- a/server/livestreamer.c +++ b/server/livestreamer.c @@ -460,6 +460,14 @@ void cStreamdevLiveStreamer::GetSignal(int *DevNum, int *Strength, int *Quality) } } +cString cStreamdevLiveStreamer::ToText() const +{ + if (m_Device && m_Channel) { + return cString::sprintf("DVB%-2d %3d %s", m_Device->DeviceNumber() + 1, m_Channel->Number(), m_Channel->Name()); + } + return cString(""); +} + void cStreamdevLiveStreamer::StartReceiver(void) { if (m_NumPids > 0) { diff --git a/server/livestreamer.h b/server/livestreamer.h index 6203966..037515c 100644 --- a/server/livestreamer.h +++ b/server/livestreamer.h @@ -40,6 +40,7 @@ public: bool SetChannel(const cChannel *Channel, eStreamType StreamType, const int* Apid = NULL, const int* Dpid = NULL); void SetPriority(int Priority); void GetSignal(int *DevNum, int *Strength, int *Quality) const; + cString ToText() const; virtual int Put(const uchar *Data, int Count); virtual uchar *Get(int &Count); diff --git a/server/menu.c b/server/menu.c new file mode 100644 index 0000000..dac09fe --- /dev/null +++ b/server/menu.c @@ -0,0 +1,67 @@ +/* + * $Id: menu.c,v 1.10 2010/07/19 13:49:31 schmirl Exp $ + */ + +#include +#include +#include + +#include "server/menu.h" +#include "server/setup.h" +#include "server/server.h" +#include "server/suspend.h" + +cStreamdevServerMenu::cStreamdevServerMenu(): cOsdMenu(tr("Streamdev Connections"), 4, 20) { + cThreadLock lock; + const cList& clients = cStreamdevServer::Clients(lock); + for (cServerConnection *s = clients.First(); s; s = clients.Next(s)) + Add(new cOsdItem(s->ToText())); + SetHelpKeys(); + Display(); +} + +cStreamdevServerMenu::~cStreamdevServerMenu() { +} + +void cStreamdevServerMenu::SetHelpKeys() { + SetHelp(Count() ? tr("Disconnect") : NULL, NULL, NULL, StreamdevServerSetup.SuspendMode == smOffer ? tr("Suspend") : NULL); +} + +eOSState cStreamdevServerMenu::Disconnect() { + cOsdItem *item = Get(Current()); + if (item) { + cThreadLock lock; + const cList& clients = cStreamdevServer::Clients(lock); + const char *text = item->Text(); + for (cServerConnection *s = clients.First(); s; s = clients.Next(s)) { + if (!strcmp(text, s->ToText())) { + s->Close(); + Del(Current()); + SetHelpKeys(); + break; + } + } + } + return osContinue; +} + +eOSState cStreamdevServerMenu::Suspend() { + if (StreamdevServerSetup.SuspendMode == smOffer && !cSuspendCtl::IsActive()) { + cControl::Launch(new cSuspendCtl); + return osBack; + } + return osContinue; +} + +eOSState cStreamdevServerMenu::ProcessKey(eKeys Key) { + eOSState state = cOsdMenu::ProcessKey(Key); + if (state == osUnknown) { + switch (Key) { + case kRed: return Disconnect(); + case kBlue: return Suspend(); + case kOk: return osBack; + default: break; + } + } + return state; +} diff --git a/server/menu.h b/server/menu.h new file mode 100644 index 0000000..097d5d2 --- /dev/null +++ b/server/menu.h @@ -0,0 +1,24 @@ +/* + * $Id: menu.h,v 1.4 2010/07/19 13:49:31 schmirl Exp $ + */ + +#ifndef VDR_STREAMDEV_MENU_H +#define VDR_STREAMDEV_MENU_H + +#include +#include "connection.h" + +class cStreamdevServerMenu: public cOsdMenu { +private: + void SetHelpKeys(); + eOSState Disconnect(); + eOSState Suspend(); +protected: + virtual eOSState ProcessKey(eKeys Key); + +public: + cStreamdevServerMenu(); + virtual ~cStreamdevServerMenu(); +}; + +#endif // VDR_STREAMDEV_MENU_H diff --git a/server/po/de_DE.po b/server/po/de_DE.po index 5fb611d..800f1e9 100644 --- a/server/po/de_DE.po +++ b/server/po/de_DE.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: streamdev 0.5.0\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2010-06-14 13:06+0200\n" +"POT-Creation-Date: 2011-11-22 01:05+0100\n" "PO-Revision-Date: 2008-03-30 02:11+0200\n" "Last-Translator: Frank Schmirler \n" "Language-Team: \n" @@ -21,8 +21,14 @@ msgstr "VDR Streaming Server" msgid "Streaming active" msgstr "Streamen im Gange" -msgid "Suspend Live TV" -msgstr "Live-TV pausieren" +msgid "Streamdev Connections" +msgstr "Streamdev Verbindungen" + +msgid "Disconnect" +msgstr "Trennen" + +msgid "Suspend" +msgstr "Pausieren" msgid "Offer suspend mode" msgstr "Pausieren anbieten" @@ -80,4 +86,3 @@ msgstr "Port des Multicast Clients" msgid "Multicast Streamtype" msgstr "Multicast Streamtyp" - diff --git a/server/po/es_ES.po b/server/po/es_ES.po index d7fb59e..db1625b 100644 --- a/server/po/es_ES.po +++ b/server/po/es_ES.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: streamdev 0.5.0\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2010-06-14 13:06+0200\n" +"POT-Creation-Date: 2011-11-22 01:05+0100\n" "PO-Revision-Date: 2010-06-19 03:58+0100\n" "Last-Translator: Javier Bradineras \n" "Language-Team: \n" @@ -21,8 +21,14 @@ msgstr "Servidor de transmisiones del VDR" msgid "Streaming active" msgstr "Trasmisión activa" -msgid "Suspend Live TV" -msgstr "Suspender TV en vivo" +msgid "Streamdev Connections" +msgstr "" + +msgid "Disconnect" +msgstr "" + +msgid "Suspend" +msgstr "Suspender" msgid "Offer suspend mode" msgstr "Ofrecer modo de suspensión" @@ -80,5 +86,3 @@ msgstr "Puerto del Cliente Multicast" msgid "Multicast Streamtype" msgstr "Tipo de flujo Multicast" - - diff --git a/server/po/fi_FI.po b/server/po/fi_FI.po index 99c6ee5..5cafc87 100644 --- a/server/po/fi_FI.po +++ b/server/po/fi_FI.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: streamdev 0.5.0\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2010-06-14 13:06+0200\n" +"POT-Creation-Date: 2011-11-22 01:05+0100\n" "PO-Revision-Date: 2008-03-30 02:11+0200\n" "Last-Translator: Rolf Ahrenberg \n" "Language-Team: \n" @@ -21,8 +21,14 @@ msgstr "VDR-suoratoistopalvelin" msgid "Streaming active" msgstr "Suoratoistopalvelin aktiivinen" -msgid "Suspend Live TV" -msgstr "Pysäytä suora TV-lähetys" +msgid "Streamdev Connections" +msgstr "" + +msgid "Disconnect" +msgstr "" + +msgid "Suspend" +msgstr "Pysäytä" msgid "Offer suspend mode" msgstr "tyrkytä" @@ -80,4 +86,3 @@ msgstr "Multicast-portti" msgid "Multicast Streamtype" msgstr "Multicast-lähetysmuoto" - diff --git a/server/po/fr_FR.po b/server/po/fr_FR.po index c4b458e..a77b330 100644 --- a/server/po/fr_FR.po +++ b/server/po/fr_FR.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: streamdev 0.5.0\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2010-06-14 13:06+0200\n" +"POT-Creation-Date: 2011-11-22 01:05+0100\n" "PO-Revision-Date: 2008-03-30 02:11+0200\n" "Last-Translator: micky979 \n" "Language-Team: \n" @@ -21,8 +21,14 @@ msgstr "Serveur de streaming VDR" msgid "Streaming active" msgstr "Streaming actif" -msgid "Suspend Live TV" -msgstr "Suspendre Live TV" +msgid "Streamdev Connections" +msgstr "" + +msgid "Disconnect" +msgstr "" + +msgid "Suspend" +msgstr "Suspendre" msgid "Offer suspend mode" msgstr "Offrir le mode suspendre" @@ -80,4 +86,3 @@ msgstr "" msgid "Multicast Streamtype" msgstr "" - diff --git a/server/po/it_IT.po b/server/po/it_IT.po index c5eed57..78409f6 100644 --- a/server/po/it_IT.po +++ b/server/po/it_IT.po @@ -9,7 +9,7 @@ msgid "" msgstr "" "Project-Id-Version: streamdev 0.5.0\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2010-06-14 13:06+0200\n" +"POT-Creation-Date: 2011-11-22 01:05+0100\n" "PO-Revision-Date: 2010-06-19 03:58+0100\n" "Last-Translator: Diego Pierotto \n" "Language-Team: \n" @@ -23,8 +23,14 @@ msgstr "Server trasmissione VDR" msgid "Streaming active" msgstr "Trasmissione attiva" -msgid "Suspend Live TV" -msgstr "Sospendi TV dal vivo" +msgid "Streamdev Connections" +msgstr "" + +msgid "Disconnect" +msgstr "" + +msgid "Suspend" +msgstr "Sospendi" msgid "Offer suspend mode" msgstr "Offri mod. sospensione" @@ -82,4 +88,3 @@ msgstr "Porta Client Multicast" msgid "Multicast Streamtype" msgstr "Tipo flusso Multicast" - diff --git a/server/po/lt_LT.po b/server/po/lt_LT.po index f12de4d..7bcbe15 100644 --- a/server/po/lt_LT.po +++ b/server/po/lt_LT.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: streamdev 0.5.0\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2010-06-14 13:06+0200\n" +"POT-Creation-Date: 2011-11-22 01:05+0100\n" "PO-Revision-Date: 2009-11-26 21:57+0200\n" "Last-Translator: Valdemaras Pipiras \n" "Language-Team: Lietuvių\n" @@ -21,8 +21,14 @@ msgstr "VDR transliavimo serveris" msgid "Streaming active" msgstr "Transliavimas vyksta" -msgid "Suspend Live TV" -msgstr "Pristabdyti Live TV" +msgid "Streamdev Connections" +msgstr "" + +msgid "Disconnect" +msgstr "" + +msgid "Suspend" +msgstr "Pristabdyti" msgid "Offer suspend mode" msgstr "Klausti dÄ—l sustabdymo" @@ -80,4 +86,3 @@ msgstr "Multicast kliento portas" msgid "Multicast Streamtype" msgstr "Multicast transliavimo tipas" - diff --git a/server/po/ru_RU.po b/server/po/ru_RU.po index 21abeaf..1def219 100644 --- a/server/po/ru_RU.po +++ b/server/po/ru_RU.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: streamdev 0.5.0\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2010-06-14 13:06+0200\n" +"POT-Creation-Date: 2011-11-22 01:05+0100\n" "PO-Revision-Date: 2008-06-26 15:36+0100\n" "Last-Translator: Oleg Roitburd \n" "Language-Team: \n" @@ -21,8 +21,14 @@ msgstr "VDR Streaming msgid "Streaming active" msgstr "ÁâàØÜØÝÓ ÐÚâØÒÕÝ" -msgid "Suspend Live TV" -msgstr "¾áâÐÝÞÒÚÐ Live TV" +msgid "Streamdev Connections" +msgstr "" + +msgid "Disconnect" +msgstr "" + +msgid "Suspend" +msgstr "¾áâÐÝÞÒÚÐ" msgid "Offer suspend mode" msgstr "¿àÕÔÛÐÓÐâì ÞáâÐÝÞÒÚã" @@ -80,4 +86,3 @@ msgstr "" msgid "Multicast Streamtype" msgstr "" - diff --git a/server/po/sk_SK.po b/server/po/sk_SK.po index 78d98c9..c61ccfe 100644 --- a/server/po/sk_SK.po +++ b/server/po/sk_SK.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: streamdev_SK\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2010-06-14 13:06+0200\n" +"POT-Creation-Date: 2011-11-22 01:05+0100\n" "PO-Revision-Date: \n" "Last-Translator: Milan Hrala \n" "Language-Team: Slovak \n" @@ -23,8 +23,14 @@ msgstr "VDR pr msgid "Streaming active" msgstr "streamovanie aktivne" -msgid "Suspend Live TV" -msgstr "Pozastavenie ¾ivého vysielania" +msgid "Streamdev Connections" +msgstr "" + +msgid "Disconnect" +msgstr "" + +msgid "Suspend" +msgstr "Pozastavenie" msgid "Offer suspend mode" msgstr "Výber re¾ímu pozastavenia" @@ -82,4 +88,3 @@ msgstr "Port klienta Multicast" msgid "Multicast Streamtype" msgstr "Multicast typ streamu" - diff --git a/server/server.c b/server/server.c index c7fa96f..bc12f5d 100644 --- a/server/server.c +++ b/server/server.c @@ -178,9 +178,8 @@ void cStreamdevServer::Action(void) } } -void cStreamdevServer::MainThreadHook(void) +const cList& cStreamdevServer::Clients(cThreadLock& Lock) { - cThreadLock lock(m_Instance); - for (cServerConnection *s = m_Clients.First(); s; s = m_Clients.Next(s)) - s->MainThreadHook(); + Lock.Lock(m_Instance); + return m_Clients; } diff --git a/server/server.h b/server/server.h index dfe9cc1..91a9cae 100644 --- a/server/server.h +++ b/server/server.h @@ -36,7 +36,8 @@ public: static void Initialize(void); static void Destruct(void); static bool Active(void); - static void MainThreadHook(void); + + static const cList& Clients(cThreadLock& Lock); }; inline bool cStreamdevServer::Active(void) diff --git a/server/streamdev-server.c b/server/streamdev-server.c index 0a98394..f2fa057 100644 --- a/server/streamdev-server.c +++ b/server/streamdev-server.c @@ -9,9 +9,9 @@ #include #include #include "streamdev-server.h" +#include "server/menu.h" #include "server/setup.h" #include "server/server.h" -#include "server/suspend.h" #if !defined(APIVERSNUM) || APIVERSNUM < 10516 #error "VDR-1.5.16 API version or greater is required!" @@ -119,20 +119,20 @@ cString cPluginStreamdevServer::Active(void) const char *cPluginStreamdevServer::MainMenuEntry(void) { - if (StreamdevServerSetup.SuspendMode == smOffer && !cSuspendCtl::IsActive()) - return tr("Suspend Live TV"); - return NULL; + return tr("Streamdev Connections"); } cOsdObject *cPluginStreamdevServer::MainMenuAction(void) { - cControl::Launch(new cSuspendCtl); - return NULL; + return new cStreamdevServerMenu(); } void cPluginStreamdevServer::MainThreadHook(void) { - cStreamdevServer::MainThreadHook(); + cThreadLock lock; + const cList& clients = cStreamdevServer::Clients(lock); + for (cServerConnection *s = clients.First(); s; s = clients.Next(s)) + s->MainThreadHook(); } cMenuSetupPage *cPluginStreamdevServer::SetupMenu(void)