diff options
author | Lincoln Ramsay <lincoln.ramsay@nokia.com> | 2012-06-04 12:14:59 +1000 |
---|---|---|
committer | Qt by Nokia <qt-info@nokia.com> | 2012-06-04 06:16:48 +0200 |
commit | f233e4266e20ea5ac06d51865b4da040b8e12fa9 (patch) | |
tree | d5423554b42d56ff0637c1a7be3bedf05c811bdd | |
parent | 030a56186e1697c0c31a858752f17ca18323dc95 (diff) |
setDataRates clobbers user-set data rate
Under normal conditions, dataRate is set/checked like so.
QSensor::setDataRate records the data rate. It can't be evaluated because we have
no backend. Upon getting a backend, we are notified of the available data rates.
Re-evaluate the previously-set dataRate after connecting to a backend.
The problem is that connectToBackend did not save the dataRate value until after
setDataRates was called and setDataRates was clobbering the dataRate property.
Two fixes will be made. connectToBackend will save the dataRate before creating
the backend and setDataRates will stop clobbering dataRate.
Also, setDataRates is now banned from being called outside of the constructor
because otherwise an available data rate may disappear during use.
Add a test case to verify that a previously-set data rate is not clobbered.
Change-Id: I9632b2c8ffcc6d48d9bc91f263b99028ee997ff9
Reviewed-by: Lorn Potter <lorn.potter@nokia.com>
-rw-r--r-- | src/sensors/qsensor.cpp | 25 | ||||
-rw-r--r-- | src/sensors/qsensorbackend.cpp | 8 | ||||
-rw-r--r-- | tests/auto/qsensor/tst_qsensor.cpp | 22 |
3 files changed, 41 insertions, 14 deletions
diff --git a/src/sensors/qsensor.cpp b/src/sensors/qsensor.cpp index 8d670bb7..a0724ae8 100644 --- a/src/sensors/qsensor.cpp +++ b/src/sensors/qsensor.cpp @@ -263,19 +263,22 @@ bool QSensor::connectToBackend() if (isConnectedToBackend()) return true; + int dataRate = d->dataRate; + int outputRange = d->outputRange; + d->backend = QSensorManager::createBackend(this); - // Reset the properties to their default values and re-set them now so - // that the logic we've put into the setters gets called. - if (d->dataRate != 0) { - int tmp = d->dataRate; - d->dataRate = 0; - setDataRate(tmp); - } - if (d->outputRange != -1) { - int tmp = d->outputRange; - d->outputRange = -1; - setOutputRange(tmp); + if (d->backend) { + // Reset the properties to their default values and re-set them now so + // that the logic we've put into the setters gets called. + if (dataRate != 0) { + d->dataRate = 0; + setDataRate(dataRate); + } + if (outputRange != -1) { + d->outputRange = -1; + setOutputRange(outputRange); + } } return isConnectedToBackend(); diff --git a/src/sensors/qsensorbackend.cpp b/src/sensors/qsensorbackend.cpp index a576e5b9..7c65c59b 100644 --- a/src/sensors/qsensorbackend.cpp +++ b/src/sensors/qsensorbackend.cpp @@ -224,8 +224,7 @@ void QSensorBackend::addDataRate(qreal min, qreal max) setDataRates(otherSensor); \endcode - Note that this function should be called from the constructor so that the information - is available immediately. + Note that this function must be called from the constructor. \sa QSensor::availableDataRates, addDataRate() */ @@ -239,9 +238,12 @@ void QSensorBackend::setDataRates(const QSensor *otherSensor) qWarning() << "ERROR: Cannot call QSensorBackend::setDataRates with an invalid sensor"; return; } + if (m_sensor->isConnectedToBackend()) { + qWarning() << "ERROR: Cannot call QSensorBackend::setDataRates outside of the constructor"; + return; + } QSensorPrivate *d = m_sensor->d_func(); d->availableDataRates = otherSensor->availableDataRates(); - d->dataRate = otherSensor->dataRate(); } /*! diff --git a/tests/auto/qsensor/tst_qsensor.cpp b/tests/auto/qsensor/tst_qsensor.cpp index 92cb281a..8025ab21 100644 --- a/tests/auto/qsensor/tst_qsensor.cpp +++ b/tests/auto/qsensor/tst_qsensor.cpp @@ -353,6 +353,28 @@ private slots: QCOMPARE(actual, expected); } + // Test that a previously-set, valid data rate is retained + { + TestSensor sensor; + sensor.setDataRate(100); + sensor.setProperty("doThis", "rates"); + sensor.connectToBackend(); + int actual = sensor.dataRate(); + int expected = 100; + QCOMPARE(actual, expected); + } + + // Test that a previously-set, invalid data rate is reset to 0 + { + TestSensor sensor; + sensor.setDataRate(50); + sensor.setProperty("doThis", "rates"); + sensor.connectToBackend(); + int actual = sensor.dataRate(); + int expected = 0; + QCOMPARE(actual, expected); + } + { TestSensor sensor; sensor.setProperty("doThis", "rates(0)"); |