summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRafael Roquetto <rafael.roquetto@kdab.com>2014-05-14 09:16:25 -0300
committerThe Qt Project <gerrit-noreply@qt-project.org>2014-05-27 06:32:12 +0200
commit14a6db457cb1142c0f2e88a5341921d5a33fa2e3 (patch)
tree461ff10c5bae550d662e808b1c30c9dec94ff980
parentb31adc706ae1497fb5922578311077be678cb0fe (diff)
downloadqtserialport-14a6db457cb1142c0f2e88a5341921d5a33fa2e3.tar.gz
Refactor unix setBaudRate() error handling
Return QSerialPort::SerialPortError instead of bool Change-Id: I79d731c1a0178ef0238495d7e9bb3e1b866e82c0 Reviewed-by: Sergey Belyashov <Sergey.Belyashov@gmail.com> Reviewed-by: Denis Shienkov <denis.shienkov@gmail.com>
-rw-r--r--src/serialport/qserialport_unix.cpp78
-rw-r--r--src/serialport/qserialport_unix_p.h8
2 files changed, 49 insertions, 37 deletions
diff --git a/src/serialport/qserialport_unix.cpp b/src/serialport/qserialport_unix.cpp
index 1ba23dd..ab6aad9 100644
--- a/src/serialport/qserialport_unix.cpp
+++ b/src/serialport/qserialport_unix.cpp
@@ -517,10 +517,23 @@ bool QSerialPortPrivate::setBaudRate()
&& setBaudRate(outputBaudRate, QSerialPort::Output));
}
+QSerialPort::SerialPortError
+QSerialPortPrivate::setBaudRate_helper(qint32 baudRate,
+ QSerialPort::Directions directions)
+{
+ if ((directions & QSerialPort::Input) && ::cfsetispeed(&currentTermios, baudRate) < 0)
+ return decodeSystemError();
+
+ if ((directions & QSerialPort::Output) && ::cfsetospeed(&currentTermios, baudRate) < 0)
+ return decodeSystemError();
+
+ return QSerialPort::NoError;
+}
+
#if defined(Q_OS_LINUX)
-bool QSerialPortPrivate::setStandardBaudRate(qint32 baudRate,
- QSerialPort::Directions directions)
+QSerialPort::SerialPortError
+QSerialPortPrivate::setStandardBaudRate(qint32 baudRate, QSerialPort::Directions directions)
{
struct serial_struct currentSerialInfo;
@@ -532,83 +545,85 @@ bool QSerialPortPrivate::setStandardBaudRate(qint32 baudRate,
::ioctl(descriptor, TIOCSSERIAL, &currentSerialInfo);
}
- return !(((directions & QSerialPort::Input) && ::cfsetispeed(&currentTermios, baudRate) < 0)
- || ((directions & QSerialPort::Output) && ::cfsetospeed(&currentTermios, baudRate) < 0));
+ return setBaudRate_helper(baudRate, directions);
}
+
#else
-bool QSerialPortPrivate::setStandardBaudRate(qint32 baudRate,
- QSerialPort::Directions directions)
+QSerialPort::SerialPortError
+QSerialPortPrivate::setStandardBaudRate(qint32 baudRate, QSerialPort::Directions directions)
{
- return !(((directions & QSerialPort::Input) && ::cfsetispeed(&currentTermios, baudRate) < 0)
- || ((directions & QSerialPort::Output) && ::cfsetospeed(&currentTermios, baudRate) < 0));
+ return setBaudRate_helper(baudRate, directions);
}
#endif
#if defined(Q_OS_LINUX)
-bool QSerialPortPrivate::setCustomBaudRate(qint32 baudRate, QSerialPort::Directions directions)
+QSerialPort::SerialPortError
+QSerialPortPrivate::setCustomBaudRate(qint32 baudRate, QSerialPort::Directions directions)
{
Q_UNUSED(directions);
struct serial_struct currentSerialInfo;
if (::ioctl(descriptor, TIOCGSERIAL, &currentSerialInfo) == -1)
- return false;
-
- if (currentSerialInfo.baud_base % baudRate != 0) {
- Q_Q(QSerialPort);
- q->setError(QSerialPort::UnsupportedOperationError);
+ return decodeSystemError();
- return false;
- }
+ if (currentSerialInfo.baud_base % baudRate != 0)
+ return QSerialPort::UnsupportedOperationError;
currentSerialInfo.flags &= ~ASYNC_SPD_MASK;
currentSerialInfo.flags |= (ASYNC_SPD_CUST /* | ASYNC_LOW_LATENCY*/);
currentSerialInfo.custom_divisor = currentSerialInfo.baud_base / baudRate;
if (currentSerialInfo.custom_divisor == 0)
- currentSerialInfo.custom_divisor = 1;
+ return QSerialPort::UnsupportedOperationError;
if (::ioctl(descriptor, TIOCSSERIAL, &currentSerialInfo) == -1)
- return false;
+ return decodeSystemError();
- return !(((directions & QSerialPort::Input) && ::cfsetispeed(&currentTermios, B38400) < 0)
- || ((directions & QSerialPort::Output) && ::cfsetospeed(&currentTermios, B38400) < 0));
+ return setBaudRate_helper(B38400, directions);
}
#elif defined(Q_OS_MAC)
-bool QSerialPortPrivate::setCustomBaudRate(qint32 baudRate, QSerialPort::Directions directions)
+QSerialPort::SerialPortError
+QSerialPortPrivate::setCustomBaudRate(qint32 baudRate, QSerialPort::Directions directions)
{
Q_UNUSED(directions);
#if defined (MAC_OS_X_VERSION_10_4) && (MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_4)
- return (::ioctl(descriptor, IOSSIOSPEED, &baudRate) != -1);
+ if (::ioctl(descriptor, IOSSIOSPEED, &baudRate) == -1)
+ return decodeSystemError();
+
+ return QSerialPort::NoError;
#endif
- return false;
+
+ return QSerialPort::UnsupportedOperationError;
}
#elif defined (Q_OS_QNX)
-bool QSerialPortPrivate::setCustomBaudRate(qint32 baudRate, QSerialPort::Directions directions)
+QSerialPort::SerialPortError
+QSerialPortPrivate::setCustomBaudRate(qint32 baudRate, QSerialPort::Directions directions)
{
// On QNX, the values of the 'Bxxxx' constants are set to 'xxxx' (i.e.
// B115200 is defined to '115200'), which means that literal values can be
// passed to cfsetispeed/cfsetospeed, including custom values, provided
// that the underlying hardware supports them.
- return setStandardBaudRate(baudRate, directions);
+ return setBaudRate_helper(baudRate, directions);
}
#else
-bool QSerialPortPrivate::setCustomBaudRate(qint32 baudRate, QSerialPort::Directions directions)
+QSerialPort::SerialPortError
+QSerialPortPrivate::setCustomBaudRate(qint32 baudRate, QSerialPort::Directions directions)
{
Q_UNUSED(baudRate);
Q_UNUSED(directions);
- return false;
+ return QSerialPort::UnsupportedOperationError;
}
#endif
@@ -622,20 +637,15 @@ bool QSerialPortPrivate::setBaudRate(qint32 baudRate, QSerialPort::Directions di
return false;
}
- q->setError(QSerialPort::NoError);
-
const qint32 unixBaudRate = QSerialPortPrivate::settingFromBaudRate(baudRate);
- const bool ok = (unixBaudRate > 0)
+ const QSerialPort::SerialPortError error = (unixBaudRate > 0)
? setStandardBaudRate(unixBaudRate, directions)
: setCustomBaudRate(baudRate, directions);
- if (ok)
+ if (error == QSerialPort::NoError)
return updateTermios();
- if (q->error() == QSerialPort::NoError)
- q->setError(decodeSystemError());
-
return false;
}
diff --git a/src/serialport/qserialport_unix_p.h b/src/serialport/qserialport_unix_p.h
index 0691cf1..5804a2b 100644
--- a/src/serialport/qserialport_unix_p.h
+++ b/src/serialport/qserialport_unix_p.h
@@ -156,11 +156,13 @@ public:
private:
bool updateTermios();
- bool setCustomBaudRate(qint32 baudRate,
+
+ QSerialPort::SerialPortError setBaudRate_helper(qint32 baudRate,
QSerialPort::Directions directions);
- bool setStandardBaudRate(qint32 baudRate,
+ QSerialPort::SerialPortError setCustomBaudRate(qint32 baudRate,
+ QSerialPort::Directions directions);
+ QSerialPort::SerialPortError setStandardBaudRate(qint32 baudRate,
QSerialPort::Directions directions);
-
QSerialPort::SerialPortError decodeSystemError() const;
bool isReadNotificationEnabled() const;