Stefan Schuermans commited on 2011-12-04 14:49:17
Showing 13 changed files, with 226 additions and 166 deletions.
... | ... |
@@ -21,6 +21,12 @@ |
21 | 21 |
read. |
22 | 22 |
The frames received from this stream are sent over the network. |
23 | 23 |
</p> |
24 |
+ <h3>Protocol</h3> |
|
25 |
+ <p> |
|
26 |
+ The protcol to use is configured in the file <code>protocol</code>. |
|
27 |
+ It can contain the string <code>blp</code>, <code>eblp</code> or |
|
28 |
+ <code>mcuf</code> to select the BLP, EBLP or MCUF protocol respectively. |
|
29 |
+ </p> |
|
24 | 30 |
<h3>Bind Address</h3> |
25 | 31 |
<p> |
26 | 32 |
The file <code>bind</code> contains the local address to bind to. |
... | ... |
@@ -31,14 +37,13 @@ |
31 | 37 |
</p> |
32 | 38 |
<h3>Static Destinations</h3> |
33 | 39 |
<p> |
34 |
- Static destinations to supply with a network stream in BLP, EBLP |
|
35 |
- or MCUF protocol can be configured in the subdirectories |
|
36 |
- <code>blp</code>, <code>eblp</code> and <code>mcuf</code> respectively. |
|
40 |
+ Static destinations to supply with a network stream in the configured |
|
41 |
+ protocol can be configured in the subdirectory <code>destinations</code>. |
|
37 | 42 |
|
38 | 43 |
Each static destination is configured in an own subdirectory. |
39 |
- E.g. the configurations for static MCUF destinations with name |
|
44 |
+ E.g. the configuration for a static destination with name |
|
40 | 45 |
<code>local</code> resides in the subdirectory |
41 |
- <code>mcuf/local</code>. |
|
46 |
+ <code>destinations/local</code>. |
|
42 | 47 |
</p> |
43 | 48 |
<p> |
44 | 49 |
The configuration inside a static destination consists of the following |
... | ... |
@@ -0,0 +1 @@ |
1 |
+mcuf |
... | ... |
@@ -0,0 +1 @@ |
1 |
+mcuf |
... | ... |
@@ -0,0 +1 @@ |
1 |
+mcuf |
... | ... |
@@ -0,0 +1,57 @@ |
1 |
+/* Blinker |
|
2 |
+ Copyright 2011 Stefan Schuermans <stefan@blinkenarea.org> |
|
3 |
+ Copyleft GNU public license - http://www.gnu.org/copyleft/gpl.html |
|
4 |
+ a blinkenarea.org project */ |
|
5 |
+ |
|
6 |
+#include <sstream> |
|
7 |
+#include <string> |
|
8 |
+ |
|
9 |
+#include "Protocol.h" |
|
10 |
+ |
|
11 |
+namespace Blinker { |
|
12 |
+ |
|
13 |
+/// constructor |
|
14 |
+Protocol::Protocol(): |
|
15 |
+ m_proto(BlinkenProtoNone) |
|
16 |
+{ |
|
17 |
+} |
|
18 |
+ |
|
19 |
+/** |
|
20 |
+ * @brief parse from string format |
|
21 |
+ * @param[in] str string format |
|
22 |
+ * @return if parsing was successful |
|
23 |
+ */ |
|
24 |
+bool Protocol::fromStr(const std::string &str) |
|
25 |
+{ |
|
26 |
+ if (str == "blp") { |
|
27 |
+ m_proto = BlinkenProtoBlp; |
|
28 |
+ return true; |
|
29 |
+ } |
|
30 |
+ else if (str =="eblp") { |
|
31 |
+ m_proto = BlinkenProtoEblp; |
|
32 |
+ return true; |
|
33 |
+ } |
|
34 |
+ else if (str =="mcuf") { |
|
35 |
+ m_proto = BlinkenProtoMcuf; |
|
36 |
+ return true; |
|
37 |
+ } |
|
38 |
+ else |
|
39 |
+ return false; |
|
40 |
+} |
|
41 |
+ |
|
42 |
+/** |
|
43 |
+ * @brief convert to string format |
|
44 |
+ * @return string format |
|
45 |
+ */ |
|
46 |
+std::string Protocol::toStr() const |
|
47 |
+{ |
|
48 |
+ switch (m_proto) { |
|
49 |
+ case BlinkenProtoBlp: return "blp"; |
|
50 |
+ case BlinkenProtoEblp: return "eblp"; |
|
51 |
+ case BlinkenProtoMcuf: return "mcuf"; |
|
52 |
+ default: return ""; |
|
53 |
+ } |
|
54 |
+} |
|
55 |
+ |
|
56 |
+} // namespace Blinker |
|
57 |
+ |
... | ... |
@@ -0,0 +1,43 @@ |
1 |
+/* Blinker |
|
2 |
+ Copyright 2011 Stefan Schuermans <stefan@blinkenarea.org> |
|
3 |
+ Copyleft GNU public license - http://www.gnu.org/copyleft/gpl.html |
|
4 |
+ a blinkenarea.org project */ |
|
5 |
+ |
|
6 |
+#ifndef PROTOCOL_H |
|
7 |
+#define PROTOCOL_H |
|
8 |
+ |
|
9 |
+#include <string> |
|
10 |
+ |
|
11 |
+#include <BlinkenLib/BlinkenProto.h> |
|
12 |
+ |
|
13 |
+namespace Blinker { |
|
14 |
+ |
|
15 |
+/// a Blinken protocol |
|
16 |
+class Protocol |
|
17 |
+{ |
|
18 |
+public: |
|
19 |
+ /// constructor |
|
20 |
+ Protocol(); |
|
21 |
+ |
|
22 |
+public: |
|
23 |
+ /** |
|
24 |
+ * @brief parse from string format |
|
25 |
+ * @param[in] str string format |
|
26 |
+ * @return if parsing was successful |
|
27 |
+ */ |
|
28 |
+ bool fromStr(const std::string &str); |
|
29 |
+ |
|
30 |
+ /** |
|
31 |
+ * @brief convert to string format |
|
32 |
+ * @return string format |
|
33 |
+ */ |
|
34 |
+ std::string toStr() const; |
|
35 |
+ |
|
36 |
+public: |
|
37 |
+ etBlinkenProto m_proto; ///< protocol |
|
38 |
+}; // class Protocol |
|
39 |
+ |
|
40 |
+} // namespace Blinker |
|
41 |
+ |
|
42 |
+#endif // #ifndef PROTOCOL_H |
|
43 |
+ |
... | ... |
@@ -18,6 +18,7 @@ |
18 | 18 |
#include "File.h" |
19 | 19 |
#include "IoCallee.h" |
20 | 20 |
#include "Module.h" |
21 |
+#include "Protocol.h" |
|
21 | 22 |
#include "SettingFile.h" |
22 | 23 |
#include "StreamMgr.h" |
23 | 24 |
#include "StreamRecv.h" |
... | ... |
@@ -94,11 +95,8 @@ public: |
94 | 95 |
virtual void ioWriteCall(Io *io); |
95 | 96 |
|
96 | 97 |
protected: |
97 |
- /** |
|
98 |
- * @brief free static destiation list |
|
99 |
- * @param[in] destList static destination list to free |
|
100 |
- */ |
|
101 |
- void freeDestList(DestList &destList); |
|
98 |
+ /// (re-)read protocol |
|
99 |
+ void readProto(); |
|
102 | 100 |
|
103 | 101 |
/// get input stream and attach to it |
104 | 102 |
void getInStream(); |
... | ... |
@@ -115,19 +113,14 @@ protected: |
115 | 113 |
/** |
116 | 114 |
* @brief light update of static destinations, |
117 | 115 |
* i.e. stat all files in current static destination directory |
118 |
- * @param[in] destList static destinations for protocol |
|
119 | 116 |
*/ |
120 |
- void updateDestsLight(DestList &destList); |
|
117 |
+ void updateDestsLight(); |
|
121 | 118 |
|
122 | 119 |
/** |
123 | 120 |
* @brief full update of static destinations, |
124 | 121 |
* i.e. scan files in playlist directory |
125 |
- * @param[in] dirDests static destinations directory for protocol |
|
126 |
- * @param[in] destList static destinations for protocol |
|
127 |
- * @param[in] pNoFrameData "no frame" protocol data |
|
128 | 122 |
*/ |
129 |
- void updateDestsFull(Directory &dirDests, DestList &destList, |
|
130 |
- const std::string *pNoFrameData); |
|
123 |
+ void updateDestsFull(); |
|
131 | 124 |
|
132 | 125 |
/// remove timed-out dynamic destinations |
133 | 126 |
void removeTimedOutDynDests(); |
... | ... |
@@ -141,15 +134,12 @@ protected: |
141 | 134 |
/** |
142 | 135 |
* @brief send data to static/dynamic destinations |
143 | 136 |
* @param[in] data *pData protocol data to send |
144 |
- * @param[in] destList static destinations |
|
145 |
- * @param[in] dynDests dynamic destinations |
|
146 | 137 |
*/ |
147 |
- void sendDests(const std::string *pData, const DestList destList, |
|
148 |
- const DynDests dynDests); |
|
138 |
+ void sendDests(const std::string *pData); |
|
149 | 139 |
|
150 | 140 |
/** |
151 | 141 |
* @brief send protocol data to address |
152 |
- * @param[in] data protcol data of frame |
|
142 |
+ * @param[in] data protcol data of frame (empty if unknown) |
|
153 | 143 |
* @param[in] addr address to send to |
154 | 144 |
*/ |
155 | 145 |
void sendProto(const std::string &data, const ADDR &addr) const; |
... | ... |
@@ -157,11 +147,9 @@ protected: |
157 | 147 |
/** |
158 | 148 |
* @brief convert frame to protocol data |
159 | 149 |
* @param[in] pFrame frame (NULL for none) |
160 |
- * @param[in] proto Blinken protocol identifier |
|
161 | 150 |
* @param[out] data protcol data |
162 | 151 |
*/ |
163 |
- static void frame2data(stBlinkenFrame *pFrame, etBlinkenProto proto, |
|
164 |
- std::string &data); |
|
152 |
+ void frame2data(stBlinkenFrame *pFrame, std::string &data) const; |
|
165 | 153 |
|
166 | 154 |
/// receive data from socket |
167 | 155 |
void receiveFromSock(); |
... | ... |
@@ -169,24 +157,17 @@ protected: |
169 | 157 |
protected: |
170 | 158 |
SettingFile m_fileInStream; ///< input stream name file |
171 | 159 |
SettingFile m_fileBind; ///< bind address file |
172 |
- Directory m_dirDestsBlp; ///< static BLP destinations directory |
|
173 |
- Directory m_dirDestsEblp; ///< static EBLP destinations directory |
|
174 |
- Directory m_dirDestsMcuf; ///< static MCUF destinations directory |
|
160 |
+ SettingFile m_fileProtocol; ///< protocol file |
|
161 |
+ Directory m_dirDests; ///< static destinations directory |
|
175 | 162 |
std::string m_nameInStream; ///< name of input stream |
176 | 163 |
Stream *m_pInStream; ///< input stream |
177 | 164 |
SOCK *m_pSock; ///< socket to use for sending streams |
178 |
- DestList m_destListBlp; ///< static BLP destinations |
|
179 |
- DestList m_destListEblp; ///< static EBLP destinations |
|
180 |
- DestList m_destListMcuf; ///< static MCUF destinations |
|
181 |
- DynDests m_dynDestsBlp; ///< dynamic BLP destinations |
|
182 |
- DynDests m_dynDestsEblp; ///< dynamic EBLP destinations |
|
183 |
- DynDests m_dynDestsMcuf; ///< dynamic MCUF destinations |
|
184 |
- std::string m_noFrameDataBlp; ///< "no frame" BLP protocol data |
|
185 |
- std::string m_noFrameDataEblp; ///< "no frame" EBLP protocol data |
|
186 |
- std::string m_noFrameDataMcuf; ///< "no frame" MCUF protocol data |
|
187 |
- std::string m_dataBlp; ///< current BLP protocol data |
|
188 |
- std::string m_dataEblp; ///< current BLP protocol data |
|
189 |
- std::string m_dataMcuf; ///< current BLP protocol data |
|
165 |
+ Protocol m_protocol; ///< protocol |
|
166 |
+ bool m_haveProtocol; ///< if protocol is known |
|
167 |
+ DestList m_destList; ///< static destinations |
|
168 |
+ DynDests m_dynDests; ///< dynamic destinations |
|
169 |
+ std::string m_noFrameData; ///< "no frame" protocol data (empty if unknown) |
|
170 |
+ std::string m_data; ///< current protocol data (empty if unknown) |
|
190 | 171 |
}; // class Sender |
191 | 172 |
|
192 | 173 |
} // namespace Blinker |
... | ... |
@@ -26,6 +26,7 @@ public: |
26 | 26 |
* @param[in] sender owning sender object |
27 | 27 |
* @param[in] dirBase base directory |
28 | 28 |
* @param[in] pNoFrameData protocol data for "no frame" packet |
29 |
+ * (empty if unknown) |
|
29 | 30 |
*/ |
30 | 31 |
Dest(Sender &sender, const Directory &dirBase, |
31 | 32 |
const std::string *pNoFrameData); |
... | ... |
@@ -46,7 +47,7 @@ public: |
46 | 47 |
|
47 | 48 |
/** |
48 | 49 |
* @brief set current protocol data |
49 |
- * @param[in] pData protocol data to send to address |
|
50 |
+ * @param[in] pData protocol data to send to address (empty if unkown) |
|
50 | 51 |
*/ |
51 | 52 |
void setProtoData(const std::string *pData); |
52 | 53 |
|
... | ... |
@@ -56,7 +57,7 @@ protected: |
56 | 57 |
|
57 | 58 |
/** |
58 | 59 |
* @brief send protocol data to address |
59 |
- * @param[in] pData protocol data to send to address |
|
60 |
+ * @param[in] pData protocol data to send to address (empty if unknown) |
|
60 | 61 |
*/ |
61 | 62 |
void send(const std::string *pData); |
62 | 63 |
|
... | ... |
@@ -22,6 +22,7 @@ namespace Blinker { |
22 | 22 |
* @param[in] sender owning sender object |
23 | 23 |
* @param[in] dirBase base directory |
24 | 24 |
* @param[in] pNoFrameData protocol data for "no frame" packet |
25 |
+ * (empty if unknown) |
|
25 | 26 |
*/ |
26 | 27 |
template<typename ADDR, typename SOCK> |
27 | 28 |
Sender<ADDR, SOCK>::Dest::Dest(Sender &sender, const Directory &dirBase, |
... | ... |
@@ -55,7 +56,7 @@ void Sender<ADDR, SOCK>::Dest::updateConfig() |
55 | 56 |
|
56 | 57 |
/** |
57 | 58 |
* @brief set current protocol data |
58 |
- * @param[in] pData protocol data to send to address |
|
59 |
+ * @param[in] pData protocol data to send to address (empty if unknown) |
|
59 | 60 |
*/ |
60 | 61 |
template<typename ADDR, typename SOCK> |
61 | 62 |
void Sender<ADDR, SOCK>::Dest::setProtoData(const std::string *pData) |
... | ... |
@@ -85,12 +86,12 @@ void Sender<ADDR, SOCK>::Dest::getAddr() |
85 | 86 |
|
86 | 87 |
/** |
87 | 88 |
* @brief send protocol data to address |
88 |
- * @param[in] pData protocol data to send to address |
|
89 |
+ * @param[in] pData protocol data to send to address (empty if unknown) |
|
89 | 90 |
*/ |
90 | 91 |
template<typename ADDR, typename SOCK> |
91 | 92 |
void Sender<ADDR, SOCK>::Dest::send(const std::string *pData) |
92 | 93 |
{ |
93 |
- if (m_sender.m_pSock && m_haveAddr && pData) |
|
94 |
+ if (m_sender.m_pSock && m_haveAddr && !pData->empty()) |
|
94 | 95 |
m_sender.m_pSock->send(*pData, m_addr); |
95 | 96 |
} |
96 | 97 |
|
... | ... |
@@ -18,6 +18,7 @@ |
18 | 18 |
#include "File.h" |
19 | 19 |
#include "IoCallee.h" |
20 | 20 |
#include "Module.h" |
21 |
+#include "Protocol.h" |
|
21 | 22 |
#include "Sender.h" |
22 | 23 |
#include "SenderDest.h" |
23 | 24 |
#include "SenderDest_impl.h" |
... | ... |
@@ -41,19 +42,14 @@ Sender<ADDR, SOCK>::Sender(CallMgr &callMgr, StreamMgr &streamMgr, |
41 | 42 |
Module(callMgr, streamMgr, dirBase), |
42 | 43 |
m_fileInStream(dirBase.getFile("instream")), |
43 | 44 |
m_fileBind(dirBase.getFile("bind")), |
44 |
- m_dirDestsBlp(dirBase.getSubdir("blp")), |
|
45 |
- m_dirDestsEblp(dirBase.getSubdir("eblp")), |
|
46 |
- m_dirDestsMcuf(dirBase.getSubdir("mcuf")), |
|
45 |
+ m_fileProtocol(dirBase.getFile("protocol")), |
|
46 |
+ m_dirDests(dirBase.getSubdir("destinations")), |
|
47 | 47 |
m_pInStream(NULL), |
48 |
- m_pSock(NULL) |
|
48 |
+ m_pSock(NULL), |
|
49 |
+ m_haveProtocol(false) |
|
49 | 50 |
{ |
50 |
- // initialize protocol data buffers |
|
51 |
- frame2data(NULL, BlinkenProtoBlp, m_noFrameDataBlp); |
|
52 |
- frame2data(NULL, BlinkenProtoEblp, m_noFrameDataEblp); |
|
53 |
- frame2data(NULL, BlinkenProtoMcuf, m_noFrameDataMcuf); |
|
54 |
- m_dataBlp = m_noFrameDataBlp; |
|
55 |
- m_dataEblp = m_noFrameDataEblp; |
|
56 |
- m_dataMcuf = m_noFrameDataMcuf; |
|
51 |
+ // read protocol |
|
52 |
+ readProto(); |
|
57 | 53 |
|
58 | 54 |
// get input stream and attach to it |
59 | 55 |
getInStream(); |
... | ... |
@@ -61,9 +57,7 @@ Sender<ADDR, SOCK>::Sender(CallMgr &callMgr, StreamMgr &streamMgr, |
61 | 57 |
createSock(); |
62 | 58 |
|
63 | 59 |
// load static destinations |
64 |
- updateDestsFull(m_dirDestsBlp, m_destListBlp, &m_noFrameDataBlp); |
|
65 |
- updateDestsFull(m_dirDestsEblp, m_destListEblp, &m_noFrameDataEblp); |
|
66 |
- updateDestsFull(m_dirDestsMcuf, m_destListMcuf, &m_noFrameDataMcuf); |
|
60 |
+ updateDestsFull(); |
|
67 | 61 |
} |
68 | 62 |
|
69 | 63 |
/// virtual destructor |
... | ... |
@@ -74,9 +68,10 @@ Sender<ADDR, SOCK>::~Sender() |
74 | 68 |
sendAllNoFrame(); |
75 | 69 |
|
76 | 70 |
// free static destination lists |
77 |
- freeDestList(m_destListBlp); |
|
78 |
- freeDestList(m_destListEblp); |
|
79 |
- freeDestList(m_destListMcuf); |
|
71 |
+ while (!m_destList.empty()) { |
|
72 |
+ delete m_destList.back().m_pDest; |
|
73 |
+ m_destList.pop_back(); |
|
74 |
+ } |
|
80 | 75 |
|
81 | 76 |
// destroy socket |
82 | 77 |
destroySock(); |
... | ... |
@@ -102,20 +97,16 @@ void Sender<ADDR, SOCK>::updateConfig() |
102 | 97 |
createSock(); |
103 | 98 |
} |
104 | 99 |
|
100 |
+ // protocol file was modified -> re-read protocol |
|
101 |
+ if (m_fileProtocol.checkModified()) |
|
102 |
+ readProto(); |
|
103 |
+ |
|
105 | 104 |
// static destinations update |
106 | 105 |
// (directory modified -> full, otherwise -> light) |
107 |
- if (m_dirDestsBlp.checkModified()) |
|
108 |
- updateDestsFull(m_dirDestsBlp, m_destListBlp, &m_noFrameDataBlp); |
|
109 |
- else |
|
110 |
- updateDestsLight(m_destListBlp); |
|
111 |
- if (m_dirDestsEblp.checkModified()) |
|
112 |
- updateDestsFull(m_dirDestsEblp, m_destListEblp, &m_noFrameDataEblp); |
|
106 |
+ if (m_dirDests.checkModified()) |
|
107 |
+ updateDestsFull(); |
|
113 | 108 |
else |
114 |
- updateDestsLight(m_destListEblp); |
|
115 |
- if (m_dirDestsMcuf.checkModified()) |
|
116 |
- updateDestsFull(m_dirDestsMcuf, m_destListMcuf, &m_noFrameDataMcuf); |
|
117 |
- else |
|
118 |
- updateDestsLight(m_destListMcuf); |
|
109 |
+ updateDestsLight(); |
|
119 | 110 |
} |
120 | 111 |
|
121 | 112 |
/** |
... | ... |
@@ -128,9 +119,7 @@ void Sender<ADDR, SOCK>::setFrame(const std::string &stream, |
128 | 119 |
stBlinkenFrame *pFrame) |
129 | 120 |
{ |
130 | 121 |
// convert new frame to protocol data |
131 |
- frame2data(pFrame, BlinkenProtoBlp, m_dataBlp); |
|
132 |
- frame2data(pFrame, BlinkenProtoEblp, m_dataEblp); |
|
133 |
- frame2data(pFrame, BlinkenProtoMcuf, m_dataMcuf); |
|
122 |
+ frame2data(pFrame, m_data); |
|
134 | 123 |
|
135 | 124 |
// send new protocol data to all destinations |
136 | 125 |
sendAllProto(); |
... | ... |
@@ -168,17 +157,40 @@ void Sender<ADDR, SOCK>::ioWriteCall(Io *io) |
168 | 157 |
(void)io; // unused |
169 | 158 |
} |
170 | 159 |
|
171 |
-/** |
|
172 |
- * @brief free static destiation list |
|
173 |
- * @param[in] destList static destination list to free |
|
174 |
- */ |
|
160 |
+/// (re-)read protocol |
|
175 | 161 |
template<typename ADDR, typename SOCK> |
176 |
-void Sender<ADDR, SOCK>::freeDestList(DestList &destList) |
|
162 |
+void Sender<ADDR, SOCK>::readProto() |
|
177 | 163 |
{ |
178 |
- while (!destList.empty()) { |
|
179 |
- delete destList.back().m_pDest; |
|
180 |
- destList.pop_back(); |
|
164 |
+ std::string strProto; |
|
165 |
+ stBlinkenFrame *pFrame; |
|
166 |
+ |
|
167 |
+ // send "no frame" to all destinations |
|
168 |
+ // (stream with old protocol will stop now) |
|
169 |
+ sendAllNoFrame(); |
|
170 |
+ |
|
171 |
+ // clear dynamic destinations |
|
172 |
+ // (they registered with old protocol, which is out of service now) |
|
173 |
+ m_dynDests.clear(); |
|
174 |
+ |
|
175 |
+ // clear old frame data and old no frame data |
|
176 |
+ m_noFrameData.clear(); |
|
177 |
+ m_data.clear(); |
|
178 |
+ |
|
179 |
+ // read new protocol from file |
|
180 |
+ m_haveProtocol = m_fileProtocol.getStr(strProto) && |
|
181 |
+ m_protocol.fromStr(strProto); |
|
182 |
+ |
|
183 |
+ // create new no frame protocol data and new protocol data |
|
184 |
+ if (m_haveProtocol) { |
|
185 |
+ frame2data(NULL, m_noFrameData); |
|
186 |
+ pFrame = NULL; |
|
187 |
+ if (m_pInStream) |
|
188 |
+ m_pInStream->getCurFrame(pFrame); |
|
189 |
+ frame2data(pFrame, m_data); |
|
181 | 190 |
} |
191 |
+ |
|
192 |
+ // send current protocol data to all destinations |
|
193 |
+ sendAllProto(); |
|
182 | 194 |
} |
183 | 195 |
|
184 | 196 |
/// get input stream and attach to it |
... | ... |
@@ -235,8 +247,11 @@ void Sender<ADDR, SOCK>::createSock() |
235 | 247 |
return; |
236 | 248 |
} |
237 | 249 |
|
238 |
- // request callback on recpetion |
|
250 |
+ // request callback on recepetion |
|
239 | 251 |
m_callMgr.requestIoReadCall(this, m_pSock); |
252 |
+ |
|
253 |
+ // send current protocol data to all destinations |
|
254 |
+ sendAllProto(); |
|
240 | 255 |
} |
241 | 256 |
|
242 | 257 |
/// destroy socket |
... | ... |
@@ -249,9 +264,7 @@ void Sender<ADDR, SOCK>::destroySock() |
249 | 264 |
|
250 | 265 |
// clear dynamic destinations |
251 | 266 |
// (they registered with this socket and this socket is gone) |
252 |
- m_dynDestsBlp.clear(); |
|
253 |
- m_dynDestsEblp.clear(); |
|
254 |
- m_dynDestsMcuf.clear(); |
|
267 |
+ m_dynDests.clear(); |
|
255 | 268 |
|
256 | 269 |
// cancel callback request |
257 | 270 |
m_callMgr.cancelIoReadCall(this, m_pSock); |
... | ... |
@@ -266,49 +279,43 @@ void Sender<ADDR, SOCK>::destroySock() |
266 | 279 |
/** |
267 | 280 |
* @brief light update of static destinations, |
268 | 281 |
* i.e. stat all files in current static destination directory |
269 |
- * @param[in] destList static destinations for one protocol |
|
270 | 282 |
*/ |
271 | 283 |
template<typename ADDR, typename SOCK> |
272 |
-void Sender<ADDR, SOCK>::updateDestsLight(DestList &destList) |
|
284 |
+void Sender<ADDR, SOCK>::updateDestsLight() |
|
273 | 285 |
{ |
274 | 286 |
// walk through all files in static dest dir and check for modification |
275 | 287 |
typename DestList::iterator itDest; |
276 |
- for (itDest = destList.begin(); itDest != destList.end(); ++itDest) |
|
288 |
+ for (itDest = m_destList.begin(); itDest != m_destList.end(); ++itDest) |
|
277 | 289 |
itDest->m_pDest->updateConfig(); |
278 | 290 |
} |
279 | 291 |
|
280 | 292 |
/** |
281 | 293 |
* @brief full update of static destinations, |
282 | 294 |
* i.e. scan files in playlist directory |
283 |
- * @param[in] dirDests static destinations directory for protocol |
|
284 |
- * @param[in] destList static destinations for protocol |
|
285 |
- * @param[in] pNoFrameData "no frame" protocaol data |
|
286 | 295 |
*/ |
287 | 296 |
template<typename ADDR, typename SOCK> |
288 |
-void Sender<ADDR, SOCK>::updateDestsFull(Directory &dirDests, |
|
289 |
- DestList &destList, |
|
290 |
- const std::string *pNoFrameData) |
|
297 |
+void Sender<ADDR, SOCK>::updateDestsFull() |
|
291 | 298 |
{ |
292 | 299 |
// get list of subdirs in input directory |
293 | 300 |
typedef std::list<std::string> Subdirlist; |
294 | 301 |
Subdirlist curSubdirs; |
295 |
- dirDests.getEntries(Directory::TypeSubdir, curSubdirs); |
|
302 |
+ m_dirDests.getEntries(Directory::TypeSubdir, curSubdirs); |
|
296 | 303 |
|
297 | 304 |
// walk through current static destinations and subdir list simultaneously |
298 | 305 |
Subdirlist::const_iterator itSubdir = curSubdirs.begin(); |
299 |
- typename DestList::iterator itDest = destList.begin(); |
|
300 |
- while (itSubdir != curSubdirs.end() || itDest != destList.end()) { |
|
306 |
+ typename DestList::iterator itDest = m_destList.begin(); |
|
307 |
+ while (itSubdir != curSubdirs.end() || itDest != m_destList.end()) { |
|
301 | 308 |
|
302 | 309 |
// new static destination inserted |
303 |
- if (itDest == destList.end() || |
|
310 |
+ if (itDest == m_destList.end() || |
|
304 | 311 |
(itSubdir != curSubdirs.end() && *itSubdir < itDest->m_name)) { |
305 | 312 |
// create static destination object |
306 | 313 |
DestEntry destEntry(*itSubdir); |
307 |
- destEntry.m_pDest = new Dest(*this, dirDests.getSubdir(*itSubdir), |
|
308 |
- pNoFrameData); |
|
314 |
+ destEntry.m_pDest = new Dest(*this, m_dirDests.getSubdir(*itSubdir), |
|
315 |
+ &m_noFrameData); |
|
309 | 316 |
if (destEntry.m_pDest) |
310 | 317 |
// insert static destination entry |
311 |
- destList.insert(itDest, destEntry); |
|
318 |
+ m_destList.insert(itDest, destEntry); |
|
312 | 319 |
// advance to next subdir |
313 | 320 |
++itSubdir; |
314 | 321 |
} |
... | ... |
@@ -317,7 +324,7 @@ void Sender<ADDR, SOCK>::updateDestsFull(Directory &dirDests, |
317 | 324 |
else if (itSubdir == curSubdirs.end() || *itSubdir > itDest->m_name) { |
318 | 325 |
// remove static destination |
319 | 326 |
delete itDest->m_pDest; |
320 |
- itDest = destList.erase(itDest); |
|
327 |
+ itDest = m_destList.erase(itDest); |
|
321 | 328 |
// do not advance to next subdir |
322 | 329 |
} |
323 | 330 |
|
... | ... |
@@ -343,19 +350,9 @@ void Sender<ADDR, SOCK>::removeTimedOutDynDests() |
343 | 350 |
now = Time::now(); |
344 | 351 |
timeout = Time(30); |
345 | 352 |
|
346 |
- for (itDyn = m_dynDestsBlp.begin(); itDyn != m_dynDestsBlp.end(); ) |
|
347 |
- if (itDyn->second + timeout < now) |
|
348 |
- m_dynDestsBlp.erase(itDyn++); |
|
349 |
- else |
|
350 |
- ++itDyn; |
|
351 |
- for (itDyn = m_dynDestsEblp.begin(); itDyn != m_dynDestsEblp.end(); ) |
|
352 |
- if (itDyn->second + timeout < now) |
|
353 |
- m_dynDestsEblp.erase(itDyn++); |
|
354 |
- else |
|
355 |
- ++itDyn; |
|
356 |
- for (itDyn = m_dynDestsMcuf.begin(); itDyn != m_dynDestsMcuf.end(); ) |
|
353 |
+ for (itDyn = m_dynDests.begin(); itDyn != m_dynDests.end(); ) |
|
357 | 354 |
if (itDyn->second + timeout < now) |
358 |
- m_dynDestsMcuf.erase(itDyn++); |
|
355 |
+ m_dynDests.erase(itDyn++); |
|
359 | 356 |
else |
360 | 357 |
++itDyn; |
361 | 358 |
} |
... | ... |
@@ -368,9 +365,7 @@ void Sender<ADDR, SOCK>::sendAllProto() |
368 | 365 |
removeTimedOutDynDests(); |
369 | 366 |
|
370 | 367 |
// send current protocol data to all static/dynamic destinations |
371 |
- sendDests(&m_dataBlp, m_destListBlp, m_dynDestsBlp); |
|
372 |
- sendDests(&m_dataEblp, m_destListEblp, m_dynDestsEblp); |
|
373 |
- sendDests(&m_dataMcuf, m_destListMcuf, m_dynDestsMcuf); |
|
368 |
+ sendDests(&m_data); |
|
374 | 369 |
|
375 | 370 |
// request time callback in one second |
376 | 371 |
m_callMgr.requestTimeCall(this, Time::now() + Time(1)); |
... | ... |
@@ -384,9 +379,7 @@ void Sender<ADDR, SOCK>::sendAllNoFrame() |
384 | 379 |
removeTimedOutDynDests(); |
385 | 380 |
|
386 | 381 |
// get "no frame" protocol data and send to all static/dynamic destinations |
387 |
- sendDests(&m_noFrameDataBlp, m_destListBlp, m_dynDestsBlp); |
|
388 |
- sendDests(&m_noFrameDataEblp, m_destListEblp, m_dynDestsEblp); |
|
389 |
- sendDests(&m_noFrameDataMcuf, m_destListMcuf, m_dynDestsMcuf); |
|
382 |
+ sendDests(&m_noFrameData); |
|
390 | 383 |
|
391 | 384 |
// request time callback in one second |
392 | 385 |
m_callMgr.requestTimeCall(this, Time::now() + Time(1)); |
... | ... |
@@ -395,57 +388,57 @@ void Sender<ADDR, SOCK>::sendAllNoFrame() |
395 | 388 |
/** |
396 | 389 |
* @brief send data to static/dynamic destinations |
397 | 390 |
* @param[in] data *pData protocol data to send |
398 |
- * @param[in] destList static destinations |
|
399 |
- * @param[in] dynDests dynamic destinations |
|
400 | 391 |
*/ |
401 | 392 |
template<typename ADDR, typename SOCK> |
402 |
-void Sender<ADDR, SOCK>::sendDests(const std::string *pData, |
|
403 |
- const DestList destList, |
|
404 |
- const DynDests dynDests) |
|
393 |
+void Sender<ADDR, SOCK>::sendDests(const std::string *pData) |
|
405 | 394 |
{ |
406 | 395 |
// send data to static destinations |
407 | 396 |
typename DestList::const_iterator itDest; |
408 |
- for (itDest = destList.begin(); itDest != destList.end(); ++itDest) |
|
397 |
+ for (itDest = m_destList.begin(); itDest != m_destList.end(); ++itDest) |
|
409 | 398 |
itDest->m_pDest->setProtoData(pData); |
410 | 399 |
|
411 | 400 |
// send data to all dynamic destinations |
412 | 401 |
typename DynDests::const_iterator itDyn; |
413 |
- for (itDyn = dynDests.begin(); itDyn != dynDests.end(); ++itDyn) |
|
402 |
+ for (itDyn = m_dynDests.begin(); itDyn != m_dynDests.end(); ++itDyn) |
|
414 | 403 |
sendProto(*pData, itDyn->first); |
415 | 404 |
} |
416 | 405 |
|
417 | 406 |
/** |
418 | 407 |
* @brief send protocol data to address |
419 |
- * @param[in] data protocol data of frame |
|
408 |
+ * @param[in] data protocol data of frame (empty if unknown) |
|
420 | 409 |
* @param[in] addr address to send to |
421 | 410 |
*/ |
422 | 411 |
template<typename ADDR, typename SOCK> |
423 | 412 |
void Sender<ADDR, SOCK>::sendProto(const std::string &data, |
424 | 413 |
const ADDR &addr) const |
425 | 414 |
{ |
426 |
- if (m_pSock) { |
|
415 |
+ if (m_pSock && !data.empty()) |
|
427 | 416 |
m_pSock->send(data, addr); |
428 | 417 |
} |
429 |
-} |
|
430 | 418 |
|
431 | 419 |
/** |
432 | 420 |
* @brief convert frame to protocol data |
433 | 421 |
* @param[in] pFrame frame (NULL for none) |
434 |
- * @param[in] proto Blinken protocol identifier |
|
435 | 422 |
* @param[out] data protocol data |
436 | 423 |
*/ |
437 | 424 |
template<typename ADDR, typename SOCK> |
438 | 425 |
void Sender<ADDR, SOCK>::frame2data(stBlinkenFrame *pFrame, |
439 |
- etBlinkenProto proto, std::string &data) |
|
426 |
+ std::string &data) const |
|
440 | 427 |
{ |
441 | 428 |
char buf[65536]; |
442 | 429 |
int len; |
443 | 430 |
|
431 |
+ // no protocol -> leave with empty data |
|
432 |
+ if (!m_haveProtocol) { |
|
433 |
+ data.clear(); |
|
434 |
+ return; |
|
435 |
+ } |
|
436 |
+ |
|
444 | 437 |
// convert frame to protcol data |
445 | 438 |
if (pFrame) |
446 |
- len = BlinkenFrameToNetwork(pFrame, proto, buf, sizeof(buf)); |
|
439 |
+ len = BlinkenFrameToNetwork(pFrame, m_protocol.m_proto, buf, sizeof(buf)); |
|
447 | 440 |
else |
448 |
- len = BlinkenProtoMakePacket(proto, BlinkenPacketStreamEnd, |
|
441 |
+ len = BlinkenProtoMakePacket(m_protocol.m_proto, BlinkenPacketStreamEnd, |
|
449 | 442 |
buf, sizeof(buf)); |
450 | 443 |
if (len < 0) |
451 | 444 |
len = 0; |
... | ... |
@@ -472,49 +465,25 @@ void Sender<ADDR, SOCK>::receiveFromSock() |
472 | 465 |
// detect packet type and protocol |
473 | 466 |
BlinkenProtoDetectPacket(data.c_str(), data.size(), &proto, &packet); |
474 | 467 |
|
468 |
+ if (m_haveProtocol && proto == m_protocol.m_proto) { |
|
475 | 469 |
switch (packet) { |
476 | 470 |
|
477 | 471 |
// request -> add to dynamic destinations and send current frame |
478 | 472 |
case BlinkenPacketRequest: |
479 |
- switch (proto) { |
|
480 |
- case BlinkenProtoBlp: |
|
481 |
- m_dynDestsBlp[addr] = Time::now(); |
|
482 |
- sendProto(m_dataBlp, addr); |
|
483 |
- break; |
|
484 |
- case BlinkenProtoEblp: |
|
485 |
- m_dynDestsEblp[addr] = Time::now(); |
|
486 |
- sendProto(m_dataEblp, addr); |
|
487 |
- break; |
|
488 |
- case BlinkenProtoMcuf: |
|
489 |
- m_dynDestsMcuf[addr] = Time::now(); |
|
490 |
- sendProto(m_dataMcuf, addr); |
|
491 |
- break; |
|
492 |
- default: |
|
493 |
- break; |
|
494 |
- } |
|
473 |
+ m_dynDests[addr] = Time::now(); |
|
474 |
+ sendProto(m_data, addr); |
|
495 | 475 |
break; |
496 | 476 |
|
497 | 477 |
// end request -> remove from dynamic destinations |
498 | 478 |
case BlinkenPacketEndRequest: |
499 |
- switch (proto) { |
|
500 |
- case BlinkenProtoBlp: |
|
501 |
- m_dynDestsBlp.erase(addr); |
|
502 |
- break; |
|
503 |
- case BlinkenProtoEblp: |
|
504 |
- m_dynDestsEblp.erase(addr); |
|
505 |
- break; |
|
506 |
- case BlinkenProtoMcuf: |
|
507 |
- m_dynDestsMcuf.erase(addr); |
|
508 |
- break; |
|
509 |
- default: |
|
510 |
- break; |
|
511 |
- } |
|
479 |
+ m_dynDests.erase(addr); |
|
512 | 480 |
break; |
513 | 481 |
|
514 | 482 |
default: |
515 | 483 |
break; |
516 | 484 |
|
517 | 485 |
} // switch (packet) |
486 |
+ } // if (m_haveProtocol ... |
|
518 | 487 |
|
519 | 488 |
} |
520 | 489 |
|
521 | 490 |