source: ntrip/trunk/BNC/bncnetqueryudp.cpp@ 1720

Last change on this file since 1720 was 1720, checked in by mervart, 15 years ago

* empty log message *

File size: 3.8 KB
Line 
1/* -------------------------------------------------------------------------
2 * BKG NTRIP Client
3 * -------------------------------------------------------------------------
4 *
5 * Class: bncNetQueryUdp
6 *
7 * Purpose: Blocking Network Requests (NTRIP Version 2 with plain UDP)
8 *
9 * Author: L. Mervart
10 *
11 * Created: 04-Feb-2009
12 *
13 * Changes:
14 *
15 * -----------------------------------------------------------------------*/
16
17#include <iostream>
18#include <iomanip>
19
20#include "bncnetqueryudp.h"
21#include "bncsettings.h"
22
23using namespace std;
24
25#define BNCVERSION "1.7"
26
27// Constructor
28////////////////////////////////////////////////////////////////////////////
29bncNetQueryUdp::bncNetQueryUdp() {
30 _port = 0;
31 _udpSocket = 0;
32 _eventLoop = new QEventLoop(this);
33}
34
35// Destructor
36////////////////////////////////////////////////////////////////////////////
37bncNetQueryUdp::~bncNetQueryUdp() {
38 delete _eventLoop;
39 delete _udpSocket;
40}
41
42//
43////////////////////////////////////////////////////////////////////////////
44void bncNetQueryUdp::stop() {
45 _eventLoop->quit();
46 _status = finished;
47}
48
49//
50////////////////////////////////////////////////////////////////////////////
51void bncNetQueryUdp::slotKeepAlive() {
52}
53
54//
55////////////////////////////////////////////////////////////////////////////
56void bncNetQueryUdp::waitForRequestResult(const QUrl&, QByteArray&) {
57}
58
59//
60////////////////////////////////////////////////////////////////////////////
61void bncNetQueryUdp::waitForReadyRead(QByteArray& outData) {
62
63 // Wait Loop
64 // ---------
65 if (!_udpSocket->hasPendingDatagrams()) {
66 _eventLoop->exec();
67 }
68
69 // Append Data
70 // -----------
71 QByteArray datagram;
72 datagram.resize(_udpSocket->pendingDatagramSize());
73 _udpSocket->readDatagram(datagram.data(), datagram.size());
74
75 if (datagram.size() > 12) {
76 outData.append(datagram.mid(12));
77 }
78}
79
80// Connect to Caster, send the Request
81////////////////////////////////////////////////////////////////////////////
82void bncNetQueryUdp::startRequest(const QUrl& url, const QByteArray& gga) {
83
84 _status = running;
85
86 // Default scheme and path
87 // -----------------------
88 _url = url;
89 if (_url.scheme().isEmpty()) {
90 _url.setScheme("http");
91 }
92 if (_url.path().isEmpty()) {
93 _url.setPath("/");
94 }
95
96 _port = _url.port();
97
98 delete _udpSocket;
99 _udpSocket = new QUdpSocket();
100 connect(_udpSocket, SIGNAL(readyRead()), _eventLoop, SLOT(quit()));
101
102 QHostInfo hInfo = QHostInfo::fromName(url.host());
103
104 if (!hInfo.addresses().isEmpty()) {
105
106 _address = hInfo.addresses().first();
107
108 // Send initial RTP packet for firewall handling
109 // ---------------------------------------------
110 char rtpbuffer[12];
111 rtpbuffer[0] = (2<<6);
112 rtpbuffer[1] = 96;
113 rtpbuffer[2] = 0;
114 rtpbuffer[3] = 0;
115 rtpbuffer[4] = 0;
116 rtpbuffer[5] = 0;
117 rtpbuffer[6] = 0;
118 rtpbuffer[7] = 0;
119 rtpbuffer[8] = 0;
120 rtpbuffer[9] = 0;
121 rtpbuffer[10] = 0;
122 rtpbuffer[11] = 0;
123
124 _udpSocket->writeDatagram(rtpbuffer, 12, _address, _port);
125
126 // Send Request
127 // ------------
128 QString uName = QUrl::fromPercentEncoding(_url.userName().toAscii());
129 QString passW = QUrl::fromPercentEncoding(_url.password().toAscii());
130 QByteArray userAndPwd;
131
132 if(!uName.isEmpty() || !passW.isEmpty()) {
133 userAndPwd = "Authorization: Basic " + (uName.toAscii() + ":" +
134 passW.toAscii()).toBase64() + "\r\n";
135 }
136
137 QByteArray reqStr = "GET " + _url.path().toAscii() + " HTTP/1.0\r\n"
138 + "User-Agent: NTRIP BNC/" BNCVERSION "\r\n"
139 + userAndPwd + "\r\n";
140
141 // NMEA string to handle VRS stream
142 // --------------------------------
143 if (!gga.isEmpty()) {
144 reqStr += gga + "\r\n";
145 }
146
147 rtpbuffer[1] = 97;
148 QByteArray buffer = QByteArray(rtpbuffer) + reqStr;
149
150 _udpSocket->writeDatagram(buffer, _address, _port);
151 }
152}
153
Note: See TracBrowser for help on using the repository browser.