source: ntrip/branches/BNC_2.12/src/upload/bncuploadcaster.cpp @ 8152

Last change on this file since 8152 was 8152, checked in by stuerze, 21 months ago

mountpoint info is added for broadcaster connection atempts

File size: 4.2 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 "bnccore.h"
21#include "bnctableitem.h"
22
23using namespace std;
24
25// Constructor
26////////////////////////////////////////////////////////////////////////////
27bncUploadCaster::bncUploadCaster(const QString& mountpoint,
28                                 const QString& outHost, int outPort,
29                                 const QString& password, int iRow,
30                                 int rate) {
31  _mountpoint    = mountpoint;
32  _outHost       = outHost;
33  _outPort       = outPort;
34  _password      = password;
35  _outSocket     = 0;
36  _sOpenTrial    = 0;
37  _iRow          = iRow;
38  _rate          = rate;
39  if      (_rate < 0) {
40    _rate = 0;
41  }
42  else if (_rate > 60) {
43    _rate = 60;
44  }
45  _isToBeDeleted = false;
46
47  connect(this, SIGNAL(newMessage(QByteArray,bool)),
48          BNC_CORE, SLOT(slotMessage(const QByteArray,bool)));
49
50  if (BNC_CORE->_uploadTableItems.find(_iRow) != BNC_CORE->_uploadTableItems.end()){
51    connect(this, SIGNAL(newBytes(QByteArray,double)),
52            BNC_CORE->_uploadTableItems.value(iRow),
53            SLOT(slotNewBytes(const QByteArray,double)));
54  }
55}
56
57// Safe Desctructor
58////////////////////////////////////////////////////////////////////////////
59void bncUploadCaster::deleteSafely() {
60  _isToBeDeleted = true;
61  if (!isRunning()) {
62    delete this;
63  }
64}
65
66// Destructor
67////////////////////////////////////////////////////////////////////////////
68bncUploadCaster::~bncUploadCaster() {
69  if (isRunning()) {
70    wait();
71  }
72  if (_outSocket) {
73    delete _outSocket;
74  }
75}
76
77// Endless Loop
78////////////////////////////////////////////////////////////////////////////
79void bncUploadCaster::run() {
80  while (true) {
81    if (_isToBeDeleted) {
82      QThread::quit();
83      deleteLater();
84      return;
85    }
86    open();
87    if (_outSocket && _outSocket->state() == QAbstractSocket::ConnectedState) {
88      QMutexLocker locker(&_mutex);
89      if (_outBuffer.size() > 0) {
90        _outSocket->write(_outBuffer);
91        _outSocket->flush();
92        emit newBytes(_mountpoint.toAscii(), _outBuffer.size());
93      }
94    }
95    if (_rate == 0) {
96      {
97        QMutexLocker locker(&_mutex);
98        _outBuffer.clear();
99      }
100      msleep(100); //sleep 0.1 sec
101    }
102    else {
103      sleep(_rate);
104    }
105  }
106}
107
108// Start the Communication with NTRIP Caster
109////////////////////////////////////////////////////////////////////////////
110void bncUploadCaster::open() {
111
112  if (_mountpoint.isEmpty()) {
113    return;
114  }
115
116  if (_outSocket != 0 &&
117      _outSocket->state() == QAbstractSocket::ConnectedState) {
118    return;
119  }
120
121  delete _outSocket; _outSocket = 0;
122
123  double minDt = pow(2.0,_sOpenTrial);
124  if (++_sOpenTrial > 4) {
125    _sOpenTrial = 4;
126  }
127  if (_outSocketOpenTime.isValid() &&
128      _outSocketOpenTime.secsTo(QDateTime::currentDateTime()) < minDt) {
129    return;
130  }
131  else {
132    _outSocketOpenTime = QDateTime::currentDateTime();
133  }
134
135  _outSocket = new QTcpSocket();
136  _outSocket->connectToHost(_outHost, _outPort);
137
138  const int timeOut = 5000;  // 5 seconds
139  if (!_outSocket->waitForConnected(timeOut)) {
140    delete _outSocket;
141    _outSocket = 0;
142    emit(newMessage("Broadcaster: Connect timeout for " + _mountpoint.toAscii(), true));
143    return;
144  }
145
146  QByteArray msg = "SOURCE " + _password.toAscii() + " /" +
147                   _mountpoint.toAscii() + "\r\n" +
148                   "Source-Agent: NTRIP BNC/" BNCVERSION "\r\n\r\n";
149
150  _outSocket->write(msg);
151  _outSocket->waitForBytesWritten();
152
153  _outSocket->waitForReadyRead();
154  QByteArray ans = _outSocket->readLine();
155
156  if (ans.indexOf("OK") == -1) {
157    delete _outSocket;
158    _outSocket = 0;
159    emit(newMessage("Broadcaster: Connection broken for" + _mountpoint.toAscii(), true));
160  }
161  else {
162    emit(newMessage("Broadcaster: Connection opened for" + _mountpoint.toAscii(), true));
163    _sOpenTrial = 0;
164  }
165}
166
Note: See TracBrowser for help on using the repository browser.