diff --git a/tests/manual/trk/launcher.cpp b/tests/manual/trk/launcher.cpp index 2bbec859575837c08a6da92f9a846d54b2db3e33..a7268e40e5c7dd5e479acec25f817cc289a865e9 100644 --- a/tests/manual/trk/launcher.cpp +++ b/tests/manual/trk/launcher.cpp @@ -38,7 +38,13 @@ #include <QtCore/QFile> #ifdef Q_OS_WIN -#include <windows.h> +# include <windows.h> +#else +# include <stdio.h> +# include <sys/ioctl.h> +#endif + +#ifdef Q_OS_WIN // Format windows error from GetLastError() value: TODO: Use the one provided by the utisl lib. QString winErrorMessage(unsigned long error) @@ -97,6 +103,8 @@ struct LauncherPrivate { LauncherPrivate(); #ifdef Q_OS_WIN HANDLE m_hdevice; +#else + QFile m_file; #endif QString m_trkServerName; @@ -226,16 +234,19 @@ bool Launcher::openTrkPort(const QString &port, QString *errorMessage) } return true; #else - Q_UNUSED(port) - *errorMessage = QString::fromLatin1("Not implemented"); - logMessage(*errorMessage); - return false; + d->m_file.setFileName(port); + if (!d->m_file.open(QIODevice::ReadWrite|QIODevice::Unbuffered)) { + *errorMessage = QString::fromLatin1("Cannot open %1: %2").arg(port, d->m_file.errorString()); + return false; + } + return true; #endif } void Launcher::timerEvent(QTimerEvent *) { - //qDebug("."); + if (d->m_verbose>1) + qDebug("."); tryTrkWrite(); tryTrkRead(); } @@ -327,9 +338,23 @@ void Launcher::trkWrite(const TrkMessage &msg) //logMessage("WRITE: " + stringFromArray(ba)); FlushFileBuffers(d->m_hdevice); +#else + if (d->m_file.write(ba) == -1 || !d->m_file.flush()) + logMessage(QString::fromLatin1("Cannot write: %1").arg(d->m_file.errorString())); #endif } +#ifndef Q_OS_WIN +static inline int bytesAvailable(int fileNo) +{ + int numBytes; + const int rc = ioctl(fileNo, FIONREAD, &numBytes); + if (rc < 0) + numBytes=0; + return numBytes; +} +#endif + void Launcher::tryTrkRead() { #ifdef Q_OS_WIN @@ -346,6 +371,19 @@ void Launcher::tryTrkRead() logMessage("Partial message: " + stringFromArray(d->m_trkReadQueue)); return; } +#else + const int size = bytesAvailable(d->m_file.handle()); + if (!size) + return; + const QByteArray data = d->m_file.read(size); + d->m_trkReadQueue.append(data); + if (!isValidTrkResult(d->m_trkReadQueue)) { + if (d->m_trkReadQueue.size() > 10) { + logMessage(QString::fromLatin1("Unable to extract message from '%1' '%2'"). + arg(QLatin1String(d->m_trkReadQueue.toHex())).arg(QString::fromAscii(d->m_trkReadQueue))); + } + return; + } #endif // Q_OS_WIN logMessage("READ: " + stringFromArray(d->m_trkReadQueue)); handleResult(extractResult(&d->m_trkReadQueue));