Fixed broken logic in evdev input plugins.
authorSamuel Rødal <samuel.rodal@nokia.com>
Fri, 13 Apr 2012 18:31:41 +0000 (20:31 +0200)
committerQt by Nokia <qt-info@nokia.com>
Sat, 14 Apr 2012 23:41:45 +0000 (01:41 +0200)
If we do multiple reads we need to accumulate the total amount of bytes
read, instead of just taking the last read amount into account.

Change-Id: Iaa9b90c269f3ed9d09dae67452ca816d9db6217f
Reviewed-by: Johannes Zellner <johannes.zellner@nokia.com>
Reviewed-by: Girish Ramakrishnan <girish.1.ramakrishnan@nokia.com>
src/plugins/generic/evdevkeyboard/qevdevkeyboardhandler.cpp
src/plugins/generic/evdevmouse/qevdevmousehandler.cpp
src/plugins/generic/evdevtouch/qevdevtouch.cpp

index 73aa641..eb29b85 100644 (file)
@@ -168,16 +168,20 @@ void QEvdevKeyboardHandler::readKeycode()
     int n = 0;
 
     forever {
-        n = qt_safe_read(m_fd, reinterpret_cast<char *>(buffer) + n, sizeof(buffer) - n);
+        int result = qt_safe_read(m_fd, reinterpret_cast<char *>(buffer) + n, sizeof(buffer) - n);
 
-        if (n == 0) {
+        if (result == 0) {
             qWarning("Got EOF from the input device.");
             return;
-        } else if (n < 0 && (errno != EINTR && errno != EAGAIN)) {
-           qWarning("Could not read from input device: %s", strerror(errno));
-            return;
-        } else if (n % sizeof(buffer[0]) == 0) {
-            break;
+        } else if (result < 0) {
+            if (errno != EINTR && errno != EAGAIN) {
+                qWarning("Could not read from input device: %s", strerror(errno));
+                return;
+            }
+        } else {
+            n += result;
+            if (n % sizeof(buffer[0]) == 0)
+                break;
         }
     }
 
index 7c05e9f..5e2911a 100644 (file)
@@ -145,16 +145,20 @@ void QEvdevMouseHandler::readMouseData()
     bool pendingMouseEvent = false;
     int eventCompressCount = 0;
     forever {
-        n = QT_READ(m_fd, reinterpret_cast<char *>(buffer) + n, sizeof(buffer) - n);
+        int result = QT_READ(m_fd, reinterpret_cast<char *>(buffer) + n, sizeof(buffer) - n);
 
-        if (n == 0) {
+        if (result == 0) {
             qWarning("Got EOF from the input device.");
             return;
-        } else if (n < 0 && (errno != EINTR && errno != EAGAIN)) {
-            qWarning("Could not read from input device: %s", strerror(errno));
-            return;
-        } else if (n % sizeof(buffer[0]) == 0) {
-            break;
+        } else if (result < 0) {
+            if (errno != EINTR && errno != EAGAIN) {
+                qWarning("Could not read from input device: %s", strerror(errno));
+                return;
+            }
+        } else {
+            n += result;
+            if (n % sizeof(buffer[0]) == 0)
+                break;
         }
     }
 
index c9c4983..1c3e895 100644 (file)
@@ -253,26 +253,30 @@ void QTouchScreenHandler::readData()
     int n = 0;
     for (; ;) {
 #ifdef USE_MTDEV
-        n = mtdev_get(m_mtdev, m_fd, buffer, sizeof(buffer) / sizeof(::input_event));
-        if (n > 0)
-            n *= sizeof(::input_event);
+        int result = mtdev_get(m_mtdev, m_fd, buffer, sizeof(buffer) / sizeof(::input_event));
+        if (result > 0)
+            result *= sizeof(::input_event);
 #else
-        n = QT_READ(m_fd, reinterpret_cast<char*>(buffer) + n, sizeof(buffer) - n);
+        int result = QT_READ(m_fd, reinterpret_cast<char*>(buffer) + n, sizeof(buffer) - n);
 #endif
-        if (!n) {
+        if (!result) {
             qWarning("Got EOF from input device");
             return;
-        } else if (n < 0 && (errno != EINTR && errno != EAGAIN)) {
-            qWarning("Could not read from input device: %s", strerror(errno));
-            if (errno == ENODEV) { // device got disconnected -> stop reading
-                delete m_notify;
-                m_notify = 0;
-                QT_CLOSE(m_fd);
-                m_fd = -1;
+        } else if (result < 0) {
+            if (errno != EINTR && errno != EAGAIN) {
+                qWarning("Could not read from input device: %s", strerror(errno));
+                if (errno == ENODEV) { // device got disconnected -> stop reading
+                    delete m_notify;
+                    m_notify = 0;
+                    QT_CLOSE(m_fd);
+                    m_fd = -1;
+                }
+                return;
             }
-            return;
-        } else if (n % sizeof(::input_event) == 0) {
-            break;
+        } else {
+            n += result;
+            if (n % sizeof(::input_event) == 0)
+                break;
         }
     }