1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
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;
}
|