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.

Squashed commit of the following:

commit 7175d7de91
Author: Frank Schmirler <vdr@schmirler.de>
Date:   Sun Nov 27 11:51:26 2011 +0100

    Updated README

commit 94aef85adc
Author: Frank Schmirler <vdr@schmirler.de>
Date:   Sun Nov 27 11:32:16 2011 +0100

    Moved "closing connection" log message to overload of cTBSocket::Close() in
    cServerConnection.

commit 9b91301d94
Author: Frank Schmirler <vdr@schmirler.de>
Date:   Fri Nov 25 00:24:37 2011 +0100

    Don't keep a pointer to the connection in components MulticastGroup
    structure as the connection may now be deleted from outside via menu.

commit 7347e24123
Author: Frank Schmirler <vdr@schmirler.de>
Date:   Thu Nov 24 23:45:59 2011 +0100

    Fixed missing Display() call after disconnecting a client.

commit c652e8fa81
Author: Frank Schmirler <vdr@schmirler.de>
Date:   Tue Nov 22 01:15:09 2011 +0100

    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.
This commit is contained in:
Frank Schmirler 2011-11-28 16:23:57 +01:00
parent ce1583a756
commit afe255aa0b
28 changed files with 278 additions and 77 deletions

View File

@ -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.

18
README
View File

@ -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:
----------------------

View File

@ -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:

View File

@ -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();
}
}

View File

@ -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();

View File

@ -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()); }

View File

@ -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; }
};

View File

@ -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;
}

View File

@ -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

View File

@ -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;
}

View File

@ -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

View File

@ -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;
}

View File

@ -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);

View File

@ -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) {

View File

@ -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);

68
server/menu.c Normal file
View File

@ -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;
}

24
server/menu.h Normal file
View File

@ -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

View File

@ -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"

View File

@ -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"

View File

@ -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"

View File

@ -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 ""

View File

@ -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"

View File

@ -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"

View File

@ -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 ""

View File

@ -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
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"

View File

@ -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;
}

View File

@ -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)

View File

@ -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)