source: ntrip/trunk/BNC/upload/bncuploadcaster.cpp@ 3234

Last change on this file since 3234 was 3234, checked in by mervart, 13 years ago
File size: 3.5 KB
Line 
1/* -------------------------------------------------------------------------
2 * BKG NTRIP Server
3 * -------------------------------------------------------------------------
4 *
5 * Class: bncUploadCaster
6 *
7 * Purpose: Connection to NTRIP Caster
8 *
9 * Author: L. Mervart
10 *
11 * Created: 29-Mar-2011
12 *
13 * Changes:
14 *
15 * -----------------------------------------------------------------------*/
16
17#include <math.h>
18#include "bncuploadcaster.h"
19#include "bncversion.h"
20#include "bncapp.h"
21
22using namespace std;
23
24// Constructor
25////////////////////////////////////////////////////////////////////////////
26bncUploadCaster::bncUploadCaster(const QString& mountpoint,
27 const QString& outHost, int outPort,
28 const QString& password, int iRow) {
29
30 connect(this, SIGNAL(newMessage(QByteArray,bool)),
31 ((bncApp*)qApp), SLOT(slotMessage(const QByteArray,bool)));
32
33 _mountpoint = mountpoint;
34 _outHost = outHost;
35 _outPort = outPort;
36 _password = password;
37 _outSocket = 0;
38 _sOpenTrial = 0;
39 _iRow = iRow;
40 _isToBeDeleted = false;
41}
42
43// Safe Desctructor
44////////////////////////////////////////////////////////////////////////////
45void bncUploadCaster::deleteSafely() {
46 _isToBeDeleted = true;
47 if (!isRunning()) {
48 delete this;
49 }
50}
51
52// Destructor
53////////////////////////////////////////////////////////////////////////////
54bncUploadCaster::~bncUploadCaster() {
55 if (isRunning()) {
56 wait();
57 }
58}
59
60// Endless Loop
61////////////////////////////////////////////////////////////////////////////
62void bncUploadCaster::run() {
63 while (true) {
64 if (_isToBeDeleted) {
65 QThread::quit();
66 deleteLater();
67 return;
68 }
69 open();
70 if (_outSocket && _outSocket->state() == QAbstractSocket::ConnectedState) {
71 QMutexLocker locker(&_mutex);
72 _outSocket->write(_outBuffer);
73 _outSocket->flush();
74 emit newBytes(_mountpoint.toAscii(), _outBuffer.size());
75 }
76 sleep(5);
77 }
78}
79
80// Start the Communication with NTRIP Caster
81////////////////////////////////////////////////////////////////////////////
82void bncUploadCaster::open() {
83
84 if (_mountpoint.isEmpty()) {
85 return;
86 }
87
88 if (_outSocket != 0 &&
89 _outSocket->state() == QAbstractSocket::ConnectedState) {
90 return;
91 }
92
93 delete _outSocket; _outSocket = 0;
94
95 double minDt = pow(2.0,_sOpenTrial);
96 if (++_sOpenTrial > 4) {
97 _sOpenTrial = 4;
98 }
99 if (_outSocketOpenTime.isValid() &&
100 _outSocketOpenTime.secsTo(QDateTime::currentDateTime()) < minDt) {
101 return;
102 }
103 else {
104 _outSocketOpenTime = QDateTime::currentDateTime();
105 }
106
107 _outSocket = new QTcpSocket();
108 _outSocket->connectToHost(_outHost, _outPort);
109
110 const int timeOut = 5000; // 5 seconds
111 if (!_outSocket->waitForConnected(timeOut)) {
112 delete _outSocket;
113 _outSocket = 0;
114 emit(newMessage("Broadcaster: Connect timeout", true));
115 return;
116 }
117
118 QByteArray msg = "SOURCE " + _password.toAscii() + " /" +
119 _mountpoint.toAscii() + "\r\n" +
120 "Source-Agent: NTRIP BNC/" BNCVERSION "\r\n\r\n";
121
122 _outSocket->write(msg);
123 _outSocket->waitForBytesWritten();
124
125 _outSocket->waitForReadyRead();
126 QByteArray ans = _outSocket->readLine();
127
128 if (ans.indexOf("OK") == -1) {
129 delete _outSocket;
130 _outSocket = 0;
131 emit(newMessage("Broadcaster: Connection broken", true));
132 }
133 else {
134 emit(newMessage("Broadcaster: Connection opened", true));
135 _sOpenTrial = 0;
136 }
137}
138
Note: See TracBrowser for help on using the repository browser.