implemented stream receiver
Stefan Schuermans authored 12 years ago
|
src/noarch/Receiver_impl.h 1) /* Blinker
|
update copyright years
Stefan Schuermans authored 10 years ago
|
src/noarch/Receiver_impl.h 2) Copyright 2011-2014 Stefan Schuermans <stefan@blinkenarea.org>
|
implemented stream receiver
Stefan Schuermans authored 12 years ago
|
src/noarch/Receiver_impl.h 3) Copyleft GNU public license - http://www.gnu.org/copyleft/gpl.html
src/noarch/Receiver_impl.h 4) a blinkenarea.org project */
src/noarch/Receiver_impl.h 5)
src/noarch/Receiver_impl.h 6) #ifndef BLINKER_RECEIVER_IMPL_H
src/noarch/Receiver_impl.h 7) #define BLINKER_RECEIVER_IMPL_H
src/noarch/Receiver_impl.h 8)
src/noarch/Receiver_impl.h 9) #include <string>
src/noarch/Receiver_impl.h 10)
src/noarch/Receiver_impl.h 11) #include <BlinkenLib/BlinkenProto.h>
src/noarch/Receiver_impl.h 12) #include <BlinkenLib/BlinkenFrame.h>
src/noarch/Receiver_impl.h 13)
src/noarch/Receiver_impl.h 14) #include "Directory.h"
src/noarch/Receiver_impl.h 15) #include "File.h"
src/noarch/Receiver_impl.h 16) #include "IoCallee.h"
|
put all managers in one str...
Stefan Schuermans authored 12 years ago
|
src/noarch/Receiver_impl.h 17) #include "Mgrs.h"
|
implemented stream receiver
Stefan Schuermans authored 12 years ago
|
src/noarch/Receiver_impl.h 18) #include "Module.h"
src/noarch/Receiver_impl.h 19) #include "OutStreamFile.h"
src/noarch/Receiver_impl.h 20) #include "Protocol.h"
src/noarch/Receiver_impl.h 21) #include "ProtocolFile.h"
src/noarch/Receiver_impl.h 22) #include "Receiver.h"
src/noarch/Receiver_impl.h 23) #include "SettingFile.h"
src/noarch/Receiver_impl.h 24) #include "Time.h"
src/noarch/Receiver_impl.h 25) #include "TimeCallee.h"
src/noarch/Receiver_impl.h 26)
src/noarch/Receiver_impl.h 27) namespace Blinker {
src/noarch/Receiver_impl.h 28)
src/noarch/Receiver_impl.h 29) /**
src/noarch/Receiver_impl.h 30) * @brief constructor
|
make modules know their name
Stefan Schuermans authored 12 years ago
|
src/noarch/Receiver_impl.h 31) * @param[in] name module name
|
put all managers in one str...
Stefan Schuermans authored 12 years ago
|
src/noarch/Receiver_impl.h 32) * @param[in] mgrs managers
|
implemented stream receiver
Stefan Schuermans authored 12 years ago
|
src/noarch/Receiver_impl.h 33) * @param[in] dirBase base directory
src/noarch/Receiver_impl.h 34) */
src/noarch/Receiver_impl.h 35) template<typename ADDR, typename SOCK>
|
make modules know their name
Stefan Schuermans authored 12 years ago
|
src/noarch/Receiver_impl.h 36) Receiver<ADDR, SOCK>::Receiver(const std::string &name, Mgrs &mgrs,
src/noarch/Receiver_impl.h 37) const Directory &dirBase):
src/noarch/Receiver_impl.h 38) Module(name, mgrs, dirBase),
|
put all managers in one str...
Stefan Schuermans authored 12 years ago
|
src/noarch/Receiver_impl.h 39) m_fileOutStream(dirBase.getFile("outstream"), mgrs.m_streamMgr),
|
implemented stream receiver
Stefan Schuermans authored 12 years ago
|
src/noarch/Receiver_impl.h 40) m_fileBind(dirBase.getFile("bind")),
src/noarch/Receiver_impl.h 41) m_fileSrc(dirBase.getFile("source")),
src/noarch/Receiver_impl.h 42) m_fileProtocol(dirBase.getFile("protocol")),
src/noarch/Receiver_impl.h 43) m_pSock(NULL),
src/noarch/Receiver_impl.h 44) m_needTimeout(false),
src/noarch/Receiver_impl.h 45) m_needNextReq(false)
src/noarch/Receiver_impl.h 46) {
src/noarch/Receiver_impl.h 47) // read protocol and source address
src/noarch/Receiver_impl.h 48) readProto();
src/noarch/Receiver_impl.h 49) readSrc();
src/noarch/Receiver_impl.h 50)
src/noarch/Receiver_impl.h 51) // create and bind socket
src/noarch/Receiver_impl.h 52) createSock();
src/noarch/Receiver_impl.h 53) }
src/noarch/Receiver_impl.h 54)
src/noarch/Receiver_impl.h 55) /// virtual destructor
src/noarch/Receiver_impl.h 56) template<typename ADDR, typename SOCK>
src/noarch/Receiver_impl.h 57) Receiver<ADDR, SOCK>::~Receiver()
src/noarch/Receiver_impl.h 58) {
src/noarch/Receiver_impl.h 59) // cancel stream request
src/noarch/Receiver_impl.h 60) request(false);
src/noarch/Receiver_impl.h 61)
src/noarch/Receiver_impl.h 62) // destroy socket
src/noarch/Receiver_impl.h 63) destroySock();
src/noarch/Receiver_impl.h 64) }
src/noarch/Receiver_impl.h 65)
src/noarch/Receiver_impl.h 66) /// check for update of configuration
src/noarch/Receiver_impl.h 67) template<typename ADDR, typename SOCK>
src/noarch/Receiver_impl.h 68) void Receiver<ADDR, SOCK>::updateConfig()
src/noarch/Receiver_impl.h 69) {
src/noarch/Receiver_impl.h 70) // output stream name file was modified -> re-get output stream
src/noarch/Receiver_impl.h 71) if (m_fileOutStream.checkModified())
src/noarch/Receiver_impl.h 72) m_fileOutStream.update();
src/noarch/Receiver_impl.h 73)
src/noarch/Receiver_impl.h 74) // bind address file was modified -> re-create socket
src/noarch/Receiver_impl.h 75) if (m_fileBind.checkModified()) {
src/noarch/Receiver_impl.h 76) destroySock();
src/noarch/Receiver_impl.h 77) createSock();
src/noarch/Receiver_impl.h 78) }
src/noarch/Receiver_impl.h 79)
src/noarch/Receiver_impl.h 80) // source address file was modified -> re-read source address
src/noarch/Receiver_impl.h 81) if (m_fileSrc.checkModified())
src/noarch/Receiver_impl.h 82) readSrc();
src/noarch/Receiver_impl.h 83)
src/noarch/Receiver_impl.h 84) // protocol file was modified -> re-read protocol
src/noarch/Receiver_impl.h 85) if (m_fileProtocol.checkModified())
src/noarch/Receiver_impl.h 86) readProto();
src/noarch/Receiver_impl.h 87) }
src/noarch/Receiver_impl.h 88)
src/noarch/Receiver_impl.h 89) /// callback when requested time reached
src/noarch/Receiver_impl.h 90) template<typename ADDR, typename SOCK>
src/noarch/Receiver_impl.h 91) void Receiver<ADDR, SOCK>::timeCall()
src/noarch/Receiver_impl.h 92) {
src/noarch/Receiver_impl.h 93) Time now = Time::now();
src/noarch/Receiver_impl.h 94)
src/noarch/Receiver_impl.h 95) // stream timeout
src/noarch/Receiver_impl.h 96) if (m_needTimeout && m_timeout <= now) {
src/noarch/Receiver_impl.h 97) m_needTimeout = false;
src/noarch/Receiver_impl.h 98) m_fileOutStream.setFrame(NULL);
src/noarch/Receiver_impl.h 99) }
src/noarch/Receiver_impl.h 100)
src/noarch/Receiver_impl.h 101) // re-request stream
src/noarch/Receiver_impl.h 102) if (m_needNextReq && m_nextReq <= now)
src/noarch/Receiver_impl.h 103) request(true);
src/noarch/Receiver_impl.h 104)
src/noarch/Receiver_impl.h 105) updateTimeCallback();
src/noarch/Receiver_impl.h 106) }
src/noarch/Receiver_impl.h 107)
src/noarch/Receiver_impl.h 108) /**
src/noarch/Receiver_impl.h 109) * @brief callback when I/O object is readable
src/noarch/Receiver_impl.h 110) * @param[in] io I/O object that is readable
src/noarch/Receiver_impl.h 111) */
src/noarch/Receiver_impl.h 112) template<typename ADDR, typename SOCK>
src/noarch/Receiver_impl.h 113) void Receiver<ADDR, SOCK>::ioReadCall(Io *io)
src/noarch/Receiver_impl.h 114) {
src/noarch/Receiver_impl.h 115) // reception on socket
src/noarch/Receiver_impl.h 116) if (io == m_pSock)
src/noarch/Receiver_impl.h 117) receiveFromSock();
src/noarch/Receiver_impl.h 118) }
src/noarch/Receiver_impl.h 119)
src/noarch/Receiver_impl.h 120) /**
src/noarch/Receiver_impl.h 121) * @brief callback when I/O object is writable
src/noarch/Receiver_impl.h 122) * @param[in] io I/O object that is writable
src/noarch/Receiver_impl.h 123) */
src/noarch/Receiver_impl.h 124) template<typename ADDR, typename SOCK>
src/noarch/Receiver_impl.h 125) void Receiver<ADDR, SOCK>::ioWriteCall(Io *io)
src/noarch/Receiver_impl.h 126) {
src/noarch/Receiver_impl.h 127) (void)io; // unused
src/noarch/Receiver_impl.h 128) }
src/noarch/Receiver_impl.h 129)
src/noarch/Receiver_impl.h 130) /// (re-)read source address
src/noarch/Receiver_impl.h 131) template<typename ADDR, typename SOCK>
src/noarch/Receiver_impl.h 132) void Receiver<ADDR, SOCK>::readSrc()
src/noarch/Receiver_impl.h 133) {
src/noarch/Receiver_impl.h 134) // cancel old stream request
src/noarch/Receiver_impl.h 135) request(false);
src/noarch/Receiver_impl.h 136) // set "no frame", because stream is going to change
src/noarch/Receiver_impl.h 137) m_fileOutStream.setFrame(NULL);
src/noarch/Receiver_impl.h 138)
src/noarch/Receiver_impl.h 139) m_fileSrc.update();
src/noarch/Receiver_impl.h 140)
src/noarch/Receiver_impl.h 141) // send new stream request
src/noarch/Receiver_impl.h 142) request(true);
src/noarch/Receiver_impl.h 143) }
src/noarch/Receiver_impl.h 144)
src/noarch/Receiver_impl.h 145) /// (re-)read protocol
src/noarch/Receiver_impl.h 146) template<typename ADDR, typename SOCK>
src/noarch/Receiver_impl.h 147) void Receiver<ADDR, SOCK>::readProto()
src/noarch/Receiver_impl.h 148) {
src/noarch/Receiver_impl.h 149) // cancel old stream request
src/noarch/Receiver_impl.h 150) request(false);
src/noarch/Receiver_impl.h 151) // set "no frame", because stream is going to change
src/noarch/Receiver_impl.h 152) m_fileOutStream.setFrame(NULL);
src/noarch/Receiver_impl.h 153)
src/noarch/Receiver_impl.h 154) // read new protocol from file
src/noarch/Receiver_impl.h 155) m_fileProtocol.update();
src/noarch/Receiver_impl.h 156)
src/noarch/Receiver_impl.h 157) // send new stream request
src/noarch/Receiver_impl.h 158) request(true);
src/noarch/Receiver_impl.h 159) }
src/noarch/Receiver_impl.h 160)
src/noarch/Receiver_impl.h 161) /// create socket and bind it
src/noarch/Receiver_impl.h 162) template<typename ADDR, typename SOCK>
src/noarch/Receiver_impl.h 163) void Receiver<ADDR, SOCK>::createSock()
src/noarch/Receiver_impl.h 164) {
src/noarch/Receiver_impl.h 165) // create socket
src/noarch/Receiver_impl.h 166) if (!m_pSock) {
src/noarch/Receiver_impl.h 167) m_pSock = new SOCK();
src/noarch/Receiver_impl.h 168) if (!m_pSock)
src/noarch/Receiver_impl.h 169) return;
src/noarch/Receiver_impl.h 170) }
src/noarch/Receiver_impl.h 171)
src/noarch/Receiver_impl.h 172) // get bind address from bind address setting file
src/noarch/Receiver_impl.h 173) m_fileBind.update();
src/noarch/Receiver_impl.h 174) if (!m_fileBind.m_valid) {
src/noarch/Receiver_impl.h 175) delete m_pSock;
src/noarch/Receiver_impl.h 176) m_pSock = NULL;
src/noarch/Receiver_impl.h 177) return;
src/noarch/Receiver_impl.h 178) }
src/noarch/Receiver_impl.h 179)
src/noarch/Receiver_impl.h 180) // bind socket
src/noarch/Receiver_impl.h 181) if (!m_pSock->bind(m_fileBind.m_obj)) {
src/noarch/Receiver_impl.h 182) delete m_pSock;
src/noarch/Receiver_impl.h 183) m_pSock = NULL;
src/noarch/Receiver_impl.h 184) return;
src/noarch/Receiver_impl.h 185) }
src/noarch/Receiver_impl.h 186)
src/noarch/Receiver_impl.h 187) // request callback on recepetion
|
put all managers in one str...
Stefan Schuermans authored 12 years ago
|
src/noarch/Receiver_impl.h 188) m_mgrs.m_callMgr.requestIoReadCall(this, m_pSock);
|
implemented stream receiver
Stefan Schuermans authored 12 years ago
|
src/noarch/Receiver_impl.h 189)
src/noarch/Receiver_impl.h 190) // send new stream request
src/noarch/Receiver_impl.h 191) request(true);
src/noarch/Receiver_impl.h 192) }
src/noarch/Receiver_impl.h 193)
src/noarch/Receiver_impl.h 194) /// destroy socket
src/noarch/Receiver_impl.h 195) template<typename ADDR, typename SOCK>
src/noarch/Receiver_impl.h 196) void Receiver<ADDR, SOCK>::destroySock()
src/noarch/Receiver_impl.h 197) {
src/noarch/Receiver_impl.h 198) // cancel old stream request
src/noarch/Receiver_impl.h 199) request(false);
src/noarch/Receiver_impl.h 200) // set "no frame", because stream is going to change
src/noarch/Receiver_impl.h 201) m_fileOutStream.setFrame(NULL);
src/noarch/Receiver_impl.h 202)
src/noarch/Receiver_impl.h 203) // cancel callback request
|
put all managers in one str...
Stefan Schuermans authored 12 years ago
|
src/noarch/Receiver_impl.h 204) m_mgrs.m_callMgr.cancelIoReadCall(this, m_pSock);
|
implemented stream receiver
Stefan Schuermans authored 12 years ago
|
src/noarch/Receiver_impl.h 205)
src/noarch/Receiver_impl.h 206) // destroy socket
src/noarch/Receiver_impl.h 207) if (m_pSock) {
src/noarch/Receiver_impl.h 208) delete m_pSock;
src/noarch/Receiver_impl.h 209) m_pSock = NULL;
src/noarch/Receiver_impl.h 210) }
src/noarch/Receiver_impl.h 211) }
src/noarch/Receiver_impl.h 212)
src/noarch/Receiver_impl.h 213) /**
src/noarch/Receiver_impl.h 214) * @brief request stream / cancel stream request
src/noarch/Receiver_impl.h 215) * @param req if to send a request (otherwise: cancel request)
src/noarch/Receiver_impl.h 216) */
src/noarch/Receiver_impl.h 217) template<typename ADDR, typename SOCK>
src/noarch/Receiver_impl.h 218) void Receiver<ADDR, SOCK>::request(bool req)
src/noarch/Receiver_impl.h 219) {
src/noarch/Receiver_impl.h 220) etBlinkenPacket type;
src/noarch/Receiver_impl.h 221) char buf[65536];
src/noarch/Receiver_impl.h 222) int len;
src/noarch/Receiver_impl.h 223) std::string data;
src/noarch/Receiver_impl.h 224)
src/noarch/Receiver_impl.h 225) // check that there is a socket, a source address and a protocol
src/noarch/Receiver_impl.h 226) if (!m_pSock || !m_fileSrc.m_valid || !m_fileProtocol.m_valid)
src/noarch/Receiver_impl.h 227) return;
src/noarch/Receiver_impl.h 228)
src/noarch/Receiver_impl.h 229) // assemble request / cancel request
src/noarch/Receiver_impl.h 230) type = req ? BlinkenPacketRequest: BlinkenPacketEndRequest;
src/noarch/Receiver_impl.h 231) len = BlinkenProtoMakePacket(m_fileProtocol.m_obj.m_proto, type,
src/noarch/Receiver_impl.h 232) buf, sizeof(buf));
src/noarch/Receiver_impl.h 233) if (len < 0)
src/noarch/Receiver_impl.h 234) len = 0;
src/noarch/Receiver_impl.h 235) data.assign(buf, len);
src/noarch/Receiver_impl.h 236)
src/noarch/Receiver_impl.h 237) // send request / cancel request
src/noarch/Receiver_impl.h 238) m_pSock->send(data, m_fileSrc.m_obj);
src/noarch/Receiver_impl.h 239)
src/noarch/Receiver_impl.h 240) // set time for next request
src/noarch/Receiver_impl.h 241) if (req)
src/noarch/Receiver_impl.h 242) m_nextReq = Time::now() + Time(10);
src/noarch/Receiver_impl.h 243) m_needNextReq = req;
src/noarch/Receiver_impl.h 244) updateTimeCallback();
src/noarch/Receiver_impl.h 245) }
src/noarch/Receiver_impl.h 246)
src/noarch/Receiver_impl.h 247) /// receive data from socket
src/noarch/Receiver_impl.h 248) template<typename ADDR, typename SOCK>
src/noarch/Receiver_impl.h 249) void Receiver<ADDR, SOCK>::receiveFromSock()
src/noarch/Receiver_impl.h 250) {
src/noarch/Receiver_impl.h 251) etBlinkenProto proto;
src/noarch/Receiver_impl.h 252) etBlinkenPacket packet;
src/noarch/Receiver_impl.h 253) std::string data;
src/noarch/Receiver_impl.h 254) ADDR addr;
src/noarch/Receiver_impl.h 255)
src/noarch/Receiver_impl.h 256) // make sure socket exists
src/noarch/Receiver_impl.h 257) if (!m_pSock)
src/noarch/Receiver_impl.h 258) return;
src/noarch/Receiver_impl.h 259)
src/noarch/Receiver_impl.h 260) // receive (leave if no reception)
src/noarch/Receiver_impl.h 261) if (!m_pSock->recv(data, addr))
src/noarch/Receiver_impl.h 262) return;
src/noarch/Receiver_impl.h 263)
src/noarch/Receiver_impl.h 264) // check source address (if configured)
src/noarch/Receiver_impl.h 265) if (m_fileSrc.m_valid && addr != m_fileSrc.m_obj)
src/noarch/Receiver_impl.h 266) return; // mismatch
src/noarch/Receiver_impl.h 267)
|
first check address and the...
Stefan Schuermans authored 12 years ago
|
src/noarch/Receiver_impl.h 268) // detect packet type and protocol
src/noarch/Receiver_impl.h 269) BlinkenProtoDetectPacket(data.c_str(), data.size(), &proto, &packet);
src/noarch/Receiver_impl.h 270)
|
implemented stream receiver
Stefan Schuermans authored 12 years ago
|
src/noarch/Receiver_impl.h 271) // check protocol (if configured)
src/noarch/Receiver_impl.h 272) if (m_fileProtocol.m_valid && proto != m_fileProtocol.m_obj.m_proto)
src/noarch/Receiver_impl.h 273) return; // mismatch
src/noarch/Receiver_impl.h 274)
src/noarch/Receiver_impl.h 275) switch (packet) {
src/noarch/Receiver_impl.h 276)
src/noarch/Receiver_impl.h 277) // frame -> process it
src/noarch/Receiver_impl.h 278) case BlinkenPacketFrame:
src/noarch/Receiver_impl.h 279) procFrame(data);
src/noarch/Receiver_impl.h 280) break;
src/noarch/Receiver_impl.h 281)
src/noarch/Receiver_impl.h 282) // end of stream -> pass on "no frame"
src/noarch/Receiver_impl.h 283) case BlinkenPacketStreamEnd:
src/noarch/Receiver_impl.h 284) m_fileOutStream.setFrame(NULL);
src/noarch/Receiver_impl.h 285) break;
src/noarch/Receiver_impl.h 286)
src/noarch/Receiver_impl.h 287) default:
src/noarch/Receiver_impl.h 288) break;
src/noarch/Receiver_impl.h 289)
src/noarch/Receiver_impl.h 290) } // switch (packet)
src/noarch/Receiver_impl.h 291) }
src/noarch/Receiver_impl.h 292)
src/noarch/Receiver_impl.h 293) /**
src/noarch/Receiver_impl.h 294) * @brief process frame
src/noarch/Receiver_impl.h 295) * @param[in] data received frame protocol data
src/noarch/Receiver_impl.h 296) */
src/noarch/Receiver_impl.h 297) template<typename ADDR, typename SOCK>
src/noarch/Receiver_impl.h 298) void Receiver<ADDR, SOCK>::procFrame(const std::string &data)
src/noarch/Receiver_impl.h 299) {
src/noarch/Receiver_impl.h 300) stBlinkenFrame *pFrame;
src/noarch/Receiver_impl.h 301)
src/noarch/Receiver_impl.h 302) // parse frame
src/noarch/Receiver_impl.h 303) pFrame = BlinkenFrameFromNetwork(data.c_str(), data.size(), NULL);
src/noarch/Receiver_impl.h 304) if (!pFrame)
src/noarch/Receiver_impl.h 305) return;
src/noarch/Receiver_impl.h 306)
src/noarch/Receiver_impl.h 307) // pass on frame
src/noarch/Receiver_impl.h 308) m_fileOutStream.setFrame(pFrame);
src/noarch/Receiver_impl.h 309)
|
fix memory leak
Stefan Schuermans authored 12 years ago
|
src/noarch/Receiver_impl.h 310) // frame not needed any more (stream creates copy for it use)
src/noarch/Receiver_impl.h 311) BlinkenFrameFree(pFrame);
src/noarch/Receiver_impl.h 312)
|
implemented stream receiver
Stefan Schuermans authored 12 years ago
|
src/noarch/Receiver_impl.h 313) // set new stream timeout
src/noarch/Receiver_impl.h 314) m_timeout = Time::now() + Time(5);
src/noarch/Receiver_impl.h 315) m_needTimeout = true;
src/noarch/Receiver_impl.h 316) updateTimeCallback();
src/noarch/Receiver_impl.h 317) }
src/noarch/Receiver_impl.h 318)
src/noarch/Receiver_impl.h 319) /// update time callback
src/noarch/Receiver_impl.h 320) template<typename ADDR, typename SOCK>
src/noarch/Receiver_impl.h 321) void Receiver<ADDR, SOCK>::updateTimeCallback()
src/noarch/Receiver_impl.h 322) {
src/noarch/Receiver_impl.h 323) if (m_needTimeout)
src/noarch/Receiver_impl.h 324) if (m_needNextReq)
|
put all managers in one str...
Stefan Schuermans authored 12 years ago
|
src/noarch/Receiver_impl.h 325) m_mgrs.m_callMgr.requestTimeCall(this, m_timeout < m_nextReq ? m_timeout
|
implemented stream receiver
Stefan Schuermans authored 12 years ago
|
src/noarch/Receiver_impl.h 326) : m_nextReq);
src/noarch/Receiver_impl.h 327) else
|
put all managers in one str...
Stefan Schuermans authored 12 years ago
|
src/noarch/Receiver_impl.h 328) m_mgrs.m_callMgr.requestTimeCall(this, m_timeout);
|
implemented stream receiver
Stefan Schuermans authored 12 years ago
|
src/noarch/Receiver_impl.h 329) else
src/noarch/Receiver_impl.h 330) if (m_needNextReq)
|
put all managers in one str...
Stefan Schuermans authored 12 years ago
|
src/noarch/Receiver_impl.h 331) m_mgrs.m_callMgr.requestTimeCall(this, m_nextReq);
|
implemented stream receiver
Stefan Schuermans authored 12 years ago
|
src/noarch/Receiver_impl.h 332) else
|
put all managers in one str...
Stefan Schuermans authored 12 years ago
|
src/noarch/Receiver_impl.h 333) m_mgrs.m_callMgr.cancelTimeCall(this);
|
implemented stream receiver
Stefan Schuermans authored 12 years ago
|
src/noarch/Receiver_impl.h 334) }
src/noarch/Receiver_impl.h 335)
src/noarch/Receiver_impl.h 336) } // namespace Blinker
src/noarch/Receiver_impl.h 337)
|
fix comment
Stefan Schuermans authored 12 years ago
|
src/noarch/Receiver_impl.h 338) #endif // #ifndef BLINKER_RECEIVER_IMPL_H
|