From 90dc9ac5eccdcb09c55ae7f97b5d1ecdd13201a2 Mon Sep 17 00:00:00 2001 From: Christian Kandeler <christian.kandeler@nokia.com> Date: Mon, 4 Jun 2012 16:42:47 +0200 Subject: [PATCH] Device support: Fix yet another off-by-one error for device indices. Prevent them from happening in the future by hiding the respective functions in the device manager. No one should ever need to map an id to an index directly on the device manager. Change-Id: I41da16489b8aec67709ab3b4b115d915d4f29a4c Reviewed-by: Tobias Hunger <tobias.hunger@nokia.com> --- .../devicesupport/devicemanager.cpp | 31 ++++++++----------- .../devicesupport/devicemanager.h | 3 -- .../devicesupport/devicemanagermodel.h | 3 +- .../devicesupport/devicesettingswidget.cpp | 2 +- 4 files changed, 15 insertions(+), 24 deletions(-) diff --git a/src/plugins/projectexplorer/devicesupport/devicemanager.cpp b/src/plugins/projectexplorer/devicesupport/devicemanager.cpp index 0c0f73d7a28..4f0bfac5410 100644 --- a/src/plugins/projectexplorer/devicesupport/devicemanager.cpp +++ b/src/plugins/projectexplorer/devicesupport/devicemanager.cpp @@ -70,6 +70,15 @@ const char DefaultDevicesKey[] = "DefaultDevices"; class DeviceManagerPrivate { public: + int indexForId(Core::Id id) const + { + for (int i = 0; i < devices.count(); ++i) { + if (devices.at(i)->id() == id) + return i; + } + return -1; + } + static DeviceManager *clonedInstance; QList<IDevice::Ptr> devices; QList<IDevice::Ptr> inactiveAutoDetectedDevices; @@ -223,7 +232,7 @@ void DeviceManager::addDevice(const IDevice::Ptr &_device) QTC_ASSERT(this != instance() || device->isAutoDetected(), return); QString name = device->displayName(); - const int pos = indexForId(device->id()); + const int pos = d->indexForId(device->id()); if (pos >= 0) { device->setDisplayName(QString()); // For name uniquification to work. d->devices[pos] = device; @@ -272,7 +281,7 @@ void DeviceManager::removeDevice(Core::Id id) const bool wasDefault = d->defaultDevices.value(device->type()) == device->id(); const Core::Id deviceType = device->type(); - d->devices.removeAt(indexForId(id)); + d->devices.removeAt(d->indexForId(id)); emit deviceRemoved(device->id()); if (wasDefault) { @@ -342,7 +351,7 @@ IDevice::ConstPtr DeviceManager::deviceAt(int idx) const IDevice::Ptr DeviceManager::mutableDevice(Core::Id id) const { - const int index = indexForId(id); + const int index = d->indexForId(id); return index == -1 ? IDevice::Ptr() : d->devices.at(index); } @@ -357,7 +366,7 @@ bool DeviceManager::hasDevice(const QString &name) const IDevice::ConstPtr DeviceManager::find(Core::Id id) const { - const int index = indexForId(id); + const int index = d->indexForId(id); return index == -1 ? IDevice::ConstPtr() : deviceAt(index); } @@ -374,25 +383,11 @@ IDevice::ConstPtr DeviceManager::defaultDevice(Core::Id deviceType) const return find(id); } -int DeviceManager::indexForId(Core::Id id) const -{ - for (int i = 0; i < d->devices.count(); ++i) { - if (deviceAt(i)->id() == id) - return i; - } - return -1; -} - Core::Id DeviceManager::deviceId(const IDevice::ConstPtr &device) const { return device ? device->id() : IDevice::invalidId(); } -int DeviceManager::indexOf(const IDevice::ConstPtr &device) const -{ - return indexForId(device->id()); -} - void DeviceManager::ensureOneDefaultDevicePerType() { foreach (const IDevice::Ptr &device, d->devices) { diff --git a/src/plugins/projectexplorer/devicesupport/devicemanager.h b/src/plugins/projectexplorer/devicesupport/devicemanager.h index 141cd9bde64..e9a913ef314 100644 --- a/src/plugins/projectexplorer/devicesupport/devicemanager.h +++ b/src/plugins/projectexplorer/devicesupport/devicemanager.h @@ -67,9 +67,6 @@ public: bool hasDevice(const QString &name) const; Core::Id deviceId(const IDevice::ConstPtr &device) const; - int indexForId(Core::Id id) const; - int indexOf(const IDevice::ConstPtr &device) const; - void addDevice(const IDevice::Ptr &device); void removeDevice(Core::Id id); diff --git a/src/plugins/projectexplorer/devicesupport/devicemanagermodel.h b/src/plugins/projectexplorer/devicesupport/devicemanagermodel.h index 3317fb5110c..bc4eeb827d8 100644 --- a/src/plugins/projectexplorer/devicesupport/devicemanagermodel.h +++ b/src/plugins/projectexplorer/devicesupport/devicemanagermodel.h @@ -56,6 +56,7 @@ public: IDevice::ConstPtr device(int pos) const; Core::Id deviceId(int pos) const; int indexOf(IDevice::ConstPtr dev) const; + int indexForId(Core::Id id) const; int rowCount(const QModelIndex &parent = QModelIndex()) const; private slots: @@ -67,8 +68,6 @@ private slots: private: QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const; - int indexForId(Core::Id id) const; - Internal::DeviceManagerModelPrivate * const d; }; diff --git a/src/plugins/projectexplorer/devicesupport/devicesettingswidget.cpp b/src/plugins/projectexplorer/devicesupport/devicesettingswidget.cpp index 0140a3024b5..76051783540 100644 --- a/src/plugins/projectexplorer/devicesupport/devicesettingswidget.cpp +++ b/src/plugins/projectexplorer/devicesupport/devicesettingswidget.cpp @@ -271,7 +271,7 @@ void DeviceSettingsWidget::setDefaultDevice() void DeviceSettingsWidget::handleDeviceUpdated(Id id) { - const int index = m_deviceManager->indexForId(id); + const int index = m_deviceManagerModel->indexForId(id); if (index == currentIndex()) currentDeviceChanged(index); } -- GitLab