summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--HISTORY3
-rw-r--r--README18
-rw-r--r--server/Makefile2
-rw-r--r--server/componentIGMP.c36
-rw-r--r--server/componentIGMP.h3
-rw-r--r--server/connection.c10
-rw-r--r--server/connection.h6
-rw-r--r--server/connectionHTTP.c5
-rw-r--r--server/connectionHTTP.h4
-rw-r--r--server/connectionIGMP.c13
-rw-r--r--server/connectionIGMP.h5
-rw-r--r--server/connectionVTP.c13
-rw-r--r--server/connectionVTP.h2
-rw-r--r--server/livestreamer.c8
-rw-r--r--server/livestreamer.h1
-rw-r--r--server/menu.c68
-rw-r--r--server/menu.h24
-rw-r--r--server/po/de_DE.po13
-rw-r--r--server/po/es_ES.po14
-rw-r--r--server/po/fi_FI.po13
-rw-r--r--server/po/fr_FR.po13
-rw-r--r--server/po/it_IT.po13
-rw-r--r--server/po/lt_LT.po13
-rw-r--r--server/po/ru_RU.po13
-rw-r--r--server/po/sk_SK.po13
-rw-r--r--server/server.c12
-rw-r--r--server/server.h3
-rw-r--r--server/streamdev-server.c14
28 files changed, 278 insertions, 77 deletions
diff --git a/HISTORY b/HISTORY
index e094cde..557601e 100644
--- a/HISTORY
+++ b/HISTORY
@@ -1,6 +1,9 @@
VDR Plugin 'streamdev' Revision History
---------------------------------------
+- Added server menu with list of clients. Connections can be terminated
+ with the "red" key. The former main menu action of suspending live TV
+ moved to the "blue" key.
- code cleanup and optimization (thanks to Ville Skytt�)
- properly shutdown IGMP timeout handler thread when the plugin is stopped.
Fixes occasional segfaults on VDR exit.
diff --git a/README b/README
index 3d8e381..60c803f 100644
--- a/README
+++ b/README
@@ -175,10 +175,16 @@ Start the server core itself by specifying -Pstreamdev-server on your VDR
commandline. To use the client core, specify -Pstreamdev-client. Both parts
can run in one VDR instance, if necessary.
+On the server, the main menu entry "Streamdev Connections" gives you a list
+of currently connected clients. Use the "red" key to terminate a connection.
+Note that depending on connection type and client, the client might re-connect
+sooner or later. Depending on the server setup, the "blue" key might be enabled
+as well. Please read below.
+
The parameter "Suspend behaviour" allows you to specify how the server should
react in case the client requests a channel that would require switching the
-primary device (i.e. disrupt live-tv). If set to "Offer suspend mode", you will
-have a new entry in the main menu. Activating that will put the server into
+primary device (i.e. disrupt live-tv). If set to "Offer suspend mode", you
+enable the "blue" key in the server's main menu. It will put the server into
"Suspend Mode" (a picture is displayed on TV). Then, a client may switch the
primary card to wherever it likes to. While watching TV (Suspend deactivated),
the client may not switch the transponder on the primary device. If you set
@@ -190,10 +196,10 @@ suspend" to yes, the client can suspend the server remotely (this only applies
if "Offer suspend mode" is selected).
NOTE: This mainly applies to One-Card-Systems, since with multiple cards there
-is no need to switch transponders on the primary interface, if the secondary
-can stream a given channel (i.e. if it is not blocked by a recording). If both
-cards are in use (i.e. when something is recorded, or by multiple clients),
-this applies to Multiple-Card-Systems as well.
+is no need to switch transponders on the primary interface, if on of the other
+cards is idle (i.e. if it is not blocked by a recording). If all cards are in
+use (i.e. when something is recorded, or by multiple clients), this applies to
+Multiple-Card-Systems as well.
3.1 Usage HTTP server:
----------------------
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/componentIGMP.c b/server/componentIGMP.c
index 223aa3c..7398c67 100644
--- a/server/componentIGMP.c
+++ b/server/componentIGMP.c
@@ -6,6 +6,7 @@
#include "server/componentIGMP.h"
#include "server/connectionIGMP.h"
+#include "server/server.h"
#include "server/setup.h"
#ifndef IGMP_ALL_HOSTS
@@ -37,7 +38,6 @@
class cMulticastGroup: public cListObject
{
public:
- cConnectionIGMP *connection;
in_addr_t group;
in_addr_t reporter;
struct timeval timeout;
@@ -48,7 +48,6 @@ public:
};
cMulticastGroup::cMulticastGroup(in_addr_t Group) :
- connection(NULL),
group(Group),
reporter(0)
{
@@ -235,10 +234,7 @@ cServerConnection* cComponentIGMP::ProcessMessage(struct igmp *Igmp, in_addr_t G
group = new cMulticastGroup(Group);
m_Groups.Add(group);
}
- if (!group->connection) {
- IGMPStartMulticast(group);
- conn = group->connection;
- }
+ conn = IGMPStartMulticast(group);
IGMPStartTimer(group, Sender);
if (Igmp->igmp_type == IGMP_V1_MEMBERSHIP_REPORT)
IGMPStartV1HostTimer(group);
@@ -430,20 +426,36 @@ void cComponentIGMP::IGMPSendGroupQuery(cMulticastGroup* Group)
IGMPSendQuery(Group->group, IGMP_LAST_MEMBER_QUERY_INTERVAL_TS);
}
-void cComponentIGMP::IGMPStartMulticast(cMulticastGroup* Group)
+cServerConnection* cComponentIGMP::IGMPStartMulticast(cMulticastGroup* Group)
{
+ cServerConnection *conn = NULL;
in_addr_t g = ntohl(Group->group);
if (g > MULTICAST_PRIV_MIN && g <= MULTICAST_PRIV_MAX) {
+ cThreadLock lock;
cChannel *channel = Channels.GetByNumber(g - MULTICAST_PRIV_MIN);
- Group->connection = (cConnectionIGMP*) NewClient();
- if (!Group->connection->SetChannel(channel, Group->group)) {
- DELETENULL(Group->connection);
+ const cList<cServerConnection>& clients = cStreamdevServer::Clients(lock);
+ cServerConnection *s = clients.First();
+ while (s) {
+ if (s->RemoteIpAddr() == Group->group)
+ break;
+ s = clients.Next(s);
+ }
+ if (!s) {
+ conn = NewClient();
+ if (!((cConnectionIGMP *)conn)->SetChannel(channel, Group->group)) {
+ DELETENULL(conn);
+ }
}
}
+ return conn;
}
void cComponentIGMP::IGMPStopMulticast(cMulticastGroup* Group)
{
- if (Group->connection)
- Group->connection->Stop();
+ cThreadLock lock;
+ const cList<cServerConnection>& clients = cStreamdevServer::Clients(lock);
+ for (cServerConnection *s = clients.First(); s; s = clients.Next(s)) {
+ if (s->RemoteIpAddr() == Group->group)
+ s->Close();
+ }
}
diff --git a/server/componentIGMP.h b/server/componentIGMP.h
index 09d8fde..8f6c027 100644
--- a/server/componentIGMP.h
+++ b/server/componentIGMP.h
@@ -10,7 +10,6 @@
#include <vdr/thread.h>
#include "server/component.h"
-class cConnectionIGMP;
class cMulticastGroup;
class cComponentIGMP: public cServerComponent, public cThread {
@@ -42,7 +41,7 @@ private:
void IGMPStartRetransmitTimer(cMulticastGroup* Group);
void IGMPClearRetransmitTimer(cMulticastGroup* Group);
void IGMPSendGroupQuery(cMulticastGroup* Group);
- void IGMPStartMulticast(cMulticastGroup* Group);
+ cServerConnection* IGMPStartMulticast(cMulticastGroup* Group);
void IGMPStopMulticast(cMulticastGroup* Group);
virtual void Action();
diff --git a/server/connection.c b/server/connection.c
index 366eec5..9b57980 100644
--- a/server/connection.c
+++ b/server/connection.c
@@ -237,6 +237,13 @@ bool cServerConnection::Respond(const char *Message, bool Last, ...)
return true;
}
+bool cServerConnection::Close()
+{
+ if (IsOpen())
+ isyslog("streamdev-server: closing %s connection to %s:%d", Protocol(), RemoteIp().c_str(), RemotePort());
+ return cTBSocket::Close();
+}
+
#if APIVERSNUM >= 10700
static int GetClippedNumProvidedSystems(int AvailableBits, cDevice *Device)
{
@@ -407,3 +414,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..0d7a1a0 100644
--- a/server/connection.h
+++ b/server/connection.h
@@ -103,6 +103,9 @@ public:
/* Will make the socket close after sending all queued output data */
void DeferClose(void) { m_DeferClose = true; }
+ /* Close the socket */
+ virtual bool Close(void);
+
/* Will retrieve an unused device for transmitting data. Receivers have
already been attached from the device if necessary. Use the returned
cDevice in a following call to StartTransfer */
@@ -122,6 +125,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..328fe44 100644
--- a/server/connectionIGMP.c
+++ b/server/connectionIGMP.c
@@ -64,10 +64,15 @@ void cConnectionIGMP::Welcome()
esyslog("streamdev-server IGMP: GetDevice failed");
}
-void cConnectionIGMP::Stop()
+bool cConnectionIGMP::Close()
{
- if (m_LiveStreamer) {
+ if (m_LiveStreamer)
m_LiveStreamer->Stop();
- DELETENULL(m_LiveStreamer);
- }
+ return cServerConnection::Close();
+}
+
+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..255379b 100644
--- a/server/connectionIGMP.h
+++ b/server/connectionIGMP.h
@@ -28,20 +28,21 @@ public:
bool SetChannel(cChannel *Channel, in_addr_t Dst);
virtual void Welcome(void);
- void Stop();
+ virtual cString ToText() const;
/* Not used here */
virtual bool Command(char *Cmd) { return false; }
virtual void Attach(void) { if (m_LiveStreamer != NULL) m_LiveStreamer->Attach(); }
virtual void Detach(void) { if (m_LiveStreamer != NULL) m_LiveStreamer->Detach(); }
+ virtual bool Close(void);
virtual bool Abort(void) const;
};
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..28b25f8
--- /dev/null
+++ b/server/menu.c
@@ -0,0 +1,68 @@
+/*
+ * $Id: menu.c,v 1.10 2010/07/19 13:49:31 schmirl Exp $
+ */
+
+#include <vdr/menuitems.h>
+#include <vdr/thread.h>
+#include <vdr/player.h>
+
+#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<cServerConnection>& 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<cServerConnection>& 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();
+ Display();
+ 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 <vdr/osdbase.h>
+#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: <http://www.vdr-developer.org/mantisbt/>\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 <vdrdev@schmirler.de>\n"
"Language-Team: <vdr@linuxtv.org>\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: <http://www.vdr-developer.org/mantisbt/>\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 <jbradi@hotmail.com>\n"
"Language-Team: <vdr@linuxtv.org>\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: <http://www.vdr-developer.org/mantisbt/>\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 <rahrenbe@cc.hut.fi>\n"
"Language-Team: <vdr@linuxtv.org>\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: <http://www.vdr-developer.org/mantisbt/>\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 <micky979@free.fr>\n"
"Language-Team: <vdr@linuxtv.org>\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: <http://www.vdr-developer.org/mantisbt/>\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 <vdr-italian@tiscali.it>\n"
"Language-Team: <vdr@linuxtv.org>\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: <http://www.vdr-developer.org/mantisbt/>\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 <varas@ambernet.lt>\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: <http://www.vdr-developer.org/mantisbt/>\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 <oleg@roitburd.de>\n"
"Language-Team: <vdr@linuxtv.org>\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: <http://www.vdr-developer.org/mantisbt/>\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 <hrala.milan@gmail.com>\n"
"Language-Team: Slovak <hrala.milan@gmail.com>\n"
@@ -23,8 +23,14 @@ msgstr "VDR pr�dov� server"
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..8dd122e 100644
--- a/server/server.c
+++ b/server/server.c
@@ -152,9 +152,8 @@ void cStreamdevServer::Action(void)
cServerConnection *next = m_Clients.Next(s);
if (!result) {
- isyslog("streamdev: closing streamdev connection to %s:%d",
- s->RemoteIp().c_str(), s->RemotePort());
- s->Close();
+ if (s->IsOpen())
+ s->Close();
Lock();
m_Clients.Del(s);
Unlock();
@@ -178,9 +177,8 @@ void cStreamdevServer::Action(void)
}
}
-void cStreamdevServer::MainThreadHook(void)
+const cList<cServerConnection>& 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<cServerConnection>& 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 <getopt.h>
#include <vdr/tools.h>
#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<cServerConnection>& clients = cStreamdevServer::Clients(lock);
+ for (cServerConnection *s = clients.First(); s; s = clients.Next(s))
+ s->MainThreadHook();
}
cMenuSetupPage *cPluginStreamdevServer::SetupMenu(void)