diff options
Diffstat (limited to 'msgreceiver.c')
-rw-r--r-- | msgreceiver.c | 141 |
1 files changed, 141 insertions, 0 deletions
diff --git a/msgreceiver.c b/msgreceiver.c new file mode 100644 index 0000000..478b65b --- /dev/null +++ b/msgreceiver.c @@ -0,0 +1,141 @@ +/* + * msgreceiver.c: A plugin for the Video Disk Recorder + * + * See the README file for copyright information and how to reach the author. + * + * Date: 11.04.05 - 10.09.06 + */ + +//*************************************************************************** +// Includes +//*************************************************************************** + +#include <sys/stat.h> +#include <sys/msg.h> +#include <signal.h> + +#include <vdr/interface.h> +#include "pin.h" + +//*************************************************************************** +// Object +//*************************************************************************** + +MessageReceiver::MessageReceiver() +{ + active = false; + talk = new Talk; + talk->setTimeout(0); // wichtig !! +} + +MessageReceiver::~MessageReceiver() +{ + delete talk; +} + +//*************************************************************************** +// Start Receiver +//*************************************************************************** + +int MessageReceiver::StartReceiver() +{ + if (!talk->isOpen()) + talk->open(10); + + if (!active) + { + Start(); + } + else + { + tell(eloDebug, "Info: Receiver still running, stopping first!"); + + StopReceiver(); + usleep(250); + Start(); + } + + return success; +} + +//*************************************************************************** +// Stop Receiver +//*************************************************************************** + +int MessageReceiver::StopReceiver() +{ + tell(eloAlways, "Try to stop receiver thread (%d)", pid); + active = false; + talk->send(10, Talk::evtExit); + Cancel(3); + + return success; +} + +//*************************************************************************** +// Action +//*************************************************************************** + +void MessageReceiver::Action() +{ + active = true; + pid = getpid(); + + tell(eloAlways, "PIN plugin receiver thread started (pid=%d)", pid); + + while (active) + { + wait(); + tell(eloDebug, "wait ..."); + } + + tell(eloAlways, "PIN plugin receiver thread ended (pid=%d)", pid); +} + +//*************************************************************************** +// Wait +//*************************************************************************** + +int MessageReceiver::wait() +{ + int status; + + if ((status = talk->wait()) != success) + { + sleep(1); + + return status; + } + + // info + + tell(eloDebug, "Got event (%d) from (%ld) with message [%s]", + talk->getEvent(), talk->getFrom(), + talk->getMessage() ? talk->getMessage() : ""); + + // perform request + + switch (talk->getEvent()) + { + case Talk::evtShow: + { + if (talk->getMessage() && *talk->getMessage()) + { + Skins.QueueMessage(mtInfo, tr(talk->getMessage())); + tell(eloDebug, "Got '%s'", talk->getMessage()); + } + + break; + } + + case Talk::evtCheck: + { + int evt = cOsd::pinValid ? Talk::evtConfirm : Talk::evtAbort; + + if (talk->send(11, evt) != success) + tell(eloDebug, "Sending event (%d) to (%d) failed", evt, 11); + } + } + + return success; +} |