/* ------------------------------------------------------------------------- * BKG NTRIP Client * ------------------------------------------------------------------------- * * Class: bncTableDlg * * Purpose: Displays the source table, allows mountpoints selection * * Author: L. Mervart * * Created: 24-Dec-2005 * * Changes: * * -----------------------------------------------------------------------*/ #include #include "bnctabledlg.h" #include "bncgetthread.h" // Constructor //////////////////////////////////////////////////////////////////////////// bncTableDlg::bncTableDlg(QWidget* parent) : QDialog(parent) { setMinimumSize(600,400); QVBoxLayout* mainLayout = new QVBoxLayout(this); QSettings settings; _casterHostLineEdit = new QLineEdit(settings.value("casterHost").toString()); int ww = QFontMetrics(_casterHostLineEdit->font()).width('w'); _casterHostLineEdit->setMaximumWidth(18*ww); _casterPortLineEdit = new QLineEdit(settings.value("casterPort").toString()); _casterPortLineEdit->setMaximumWidth(9*ww); _casterUserLineEdit = new QLineEdit(settings.value("casterUser").toString()); _casterUserLineEdit->setMaximumWidth(9*ww); _casterPasswordLineEdit = new QLineEdit(settings.value("casterPassword").toString()); _casterPasswordLineEdit->setMaximumWidth(9*ww); _casterPasswordLineEdit->setEchoMode(QLineEdit::Password); QGridLayout* editLayout = new QGridLayout; editLayout->addWidget(new QLabel(tr("Caster host")), 0, 0); editLayout->addWidget(_casterHostLineEdit, 0, 1); editLayout->addWidget(new QLabel(tr("Caster port")), 0, 2); editLayout->addWidget(_casterPortLineEdit, 0, 3); editLayout->addWidget(new QLabel(tr("User")), 1, 0); editLayout->addWidget(_casterUserLineEdit, 1, 1); editLayout->addWidget(new QLabel(tr("Password")), 1, 2); editLayout->addWidget(_casterPasswordLineEdit, 1, 3); mainLayout->addLayout(editLayout); _table = new QTableWidget(this); connect(_table, SIGNAL(itemSelectionChanged()), this, SLOT(slotSelectionChanged())); mainLayout->addWidget(_table); _buttonSkl = new QPushButton(tr("Create skeleton headers"), this); _buttonSkl->setEnabled(false); connect(_buttonSkl, SIGNAL(clicked()), this, SLOT(slotSkl())); _buttonGet = new QPushButton(tr("Get table"), this); connect(_buttonGet, SIGNAL(clicked()), this, SLOT(slotGetTable())); _buttonCancel = new QPushButton(tr("Cancel"), this); connect(_buttonCancel, SIGNAL(clicked()), this, SLOT(reject())); _buttonOK = new QPushButton(tr("OK"), this); connect(_buttonOK, SIGNAL(clicked()), this, SLOT(accept())); QHBoxLayout* buttonLayout = new QHBoxLayout; buttonLayout->addWidget(_buttonSkl); buttonLayout->addStretch(1); buttonLayout->addWidget(_buttonGet); buttonLayout->addWidget(_buttonCancel); buttonLayout->addWidget(_buttonOK); mainLayout->addLayout(buttonLayout); } // Destructor //////////////////////////////////////////////////////////////////////////// bncTableDlg::~bncTableDlg() { if (_table) { for (int ir = 0; ir < _table->rowCount(); ir++) { for (int ic = 0; ic < _table->columnCount(); ic++) { delete _table->item(ir,ic); } } } } // Read Table the caster (static) //////////////////////////////////////////////////////////////////////////// t_irc bncTableDlg::getFullTable(const QString& casterHost, int casterPort, QStringList& allLines) { allLines.clear(); QUrl url; url.setHost(casterHost); url.setPort(casterPort); // Send the Request // ---------------- const int timeOut = 10*1000; QString msg; QTcpSocket* socket = bncGetThread::request(url, timeOut, msg); if (!socket) { return failure; } // Read Caster Response // -------------------- bool first = true; while (true) { if (socket->canReadLine()) { QString line = socket->readLine(); allLines.push_back(line); if (first) { first = false; if (line.indexOf("SOURCETABLE 200 OK") != 0) { break; } } else { if (line.indexOf("ENDSOURCETABLE") == 0) { break; } } } else { socket->waitForReadyRead(timeOut); if (socket->bytesAvailable() > 0) { continue; } else { break; } } } delete socket; return success; } // Read Table from Caster //////////////////////////////////////////////////////////////////////////// void bncTableDlg::slotGetTable() { _allLines.clear(); if ( getFullTable(_casterHostLineEdit->text(), _casterPortLineEdit->text().toInt(), _allLines) != success ) { QMessageBox::warning(0, "BNC", "Cannot retrieve table of data"); return; } QStringList lines; QStringListIterator it(_allLines); while (it.hasNext()) { QString line = it.next(); if (line.indexOf("STR") == 0) { lines.push_back(line); } } static const QStringList labels = QString("mountpoint,identifier,format," "format-details,carrier,nav-system,network,country,latitude,longitude," "nmea,solution,generator,compression,authentication,fee,bitrate," "misc").split(","); if (lines.size() > 0) { _table->setSelectionMode(QAbstractItemView::ExtendedSelection); _table->setSelectionBehavior(QAbstractItemView::SelectRows); QStringList hlp = lines[0].split(";"); _table->setColumnCount(hlp.size()-1); _table->setRowCount(lines.size()); QListIterator it(lines); int nRow = -1; while (it.hasNext()) { QStringList columns = it.next().split(";"); ++nRow; for (int ic = 0; ic < columns.size()-1; ic++) { QTableWidgetItem* it = new QTableWidgetItem(columns[ic+1]); it->setFlags(it->flags() & ~Qt::ItemIsEditable); _table->setItem(nRow, ic, it); } } _table->sortItems(0); _table->setHorizontalHeaderLabels(labels); _table->setSortingEnabled(true); } } // Accept slot //////////////////////////////////////////////////////////////////////////// void bncTableDlg::accept() { QSettings settings; settings.setValue("casterHost", _casterHostLineEdit->text()); settings.setValue("casterPort", _casterPortLineEdit->text()); settings.setValue("casterUser", _casterUserLineEdit->text()); settings.setValue("casterPassword", _casterPasswordLineEdit->text()); QStringList* mountPoints = new QStringList; if (_table) { for (int ir = 0; ir < _table->rowCount(); ir++) { QTableWidgetItem* item = _table->item(ir,0); QString format = _table->item(ir,2)->text(); format.replace(" ", "_"); if (_table->isItemSelected(item)) { QUrl url; url.setUserName(_casterUserLineEdit->text()); url.setPassword(_casterPasswordLineEdit->text()); url.setHost(_casterHostLineEdit->text()); url.setPort(_casterPortLineEdit->text().toInt()); url.setPath(item->text()); mountPoints->push_back(url.toString() + " " + format); } } } emit newMountPoints(mountPoints); QDialog::accept(); } // User changed the selection of mountPoints //////////////////////////////////////////////////////////////////////////// void bncTableDlg::slotSelectionChanged() { if (_table->selectedItems().isEmpty()) { _buttonSkl->setEnabled(false); } else { _buttonSkl->setEnabled(true); } } // Create RINEX skeleton header //////////////////////////////////////////////////////////////////////////// void bncTableDlg::slotSkl() { int nRows = _table->rowCount(); for (int iRow = 0; iRow < nRows; iRow++) { if (_table->isItemSelected(_table->item(iRow,1))) { QString staID = _table->item(iRow,0)->text(); QString net = _table->item(iRow,6)->text(); cout << (staID + " " + net).toAscii().data() << endl; QString ftpDir; QStringListIterator it(_allLines); while (it.hasNext()) { QString line = it.next(); if (line.indexOf("NET") == 0) { QStringList tags = line.split(';'); if (tags.at(1) == net) { ftpDir = tags.at(6); break; } } } cout << ftpDir.toAscii().data() << endl; } } }