diff options
author | Rafael Roquetto <rafael.roquetto@kdab.com> | 2014-05-14 09:16:25 -0300 |
---|---|---|
committer | The Qt Project <gerrit-noreply@qt-project.org> | 2014-05-27 06:32:12 +0200 |
commit | 14a6db457cb1142c0f2e88a5341921d5a33fa2e3 (patch) | |
tree | 461ff10c5bae550d662e808b1c30c9dec94ff980 /src | |
parent | b31adc706ae1497fb5922578311077be678cb0fe (diff) |
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>
Diffstat (limited to 'src')
-rw-r--r-- | src/serialport/qserialport_unix.cpp | 78 | ||||
-rw-r--r-- | src/serialport/qserialport_unix_p.h | 8 |
2 files changed, 49 insertions, 37 deletions
diff --git a/src/serialport/qserialport_unix.cpp b/src/serialport/qserialport_unix.cpp index 1ba23dd3..ab6aad9b 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(¤tTermios, baudRate) < 0) + return decodeSystemError(); + + if ((directions & QSerialPort::Output) && ::cfsetospeed(¤tTermios, 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, ¤tSerialInfo); } - return !(((directions & QSerialPort::Input) && ::cfsetispeed(¤tTermios, baudRate) < 0) - || ((directions & QSerialPort::Output) && ::cfsetospeed(¤tTermios, 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(¤tTermios, baudRate) < 0) - || ((directions & QSerialPort::Output) && ::cfsetospeed(¤tTermios, 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, ¤tSerialInfo) == -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, ¤tSerialInfo) == -1) - return false; + return decodeSystemError(); - return !(((directions & QSerialPort::Input) && ::cfsetispeed(¤tTermios, B38400) < 0) - || ((directions & QSerialPort::Output) && ::cfsetospeed(¤tTermios, 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 0691cf17..5804a2bf 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; |