diff --git a/src/plugins/projectexplorer/devicesupport/devicemanager.cpp b/src/plugins/projectexplorer/devicesupport/devicemanager.cpp index 6291a697cca..f4e3bb69fb4 100644 --- a/src/plugins/projectexplorer/devicesupport/devicemanager.cpp +++ b/src/plugins/projectexplorer/devicesupport/devicemanager.cpp @@ -34,6 +34,7 @@ #include "idevicefactory.h" #include +#include #include #include #include @@ -55,11 +56,10 @@ namespace Internal { static IDevice::Ptr findAutoDetectedDevice(const QList &deviceList, const QString &type, const QString &fingerprint) { + const Core::Id id(fingerprint); foreach (const IDevice::Ptr &device, deviceList) { - if (device->isAutoDetected() && device->type() == type - && device->fingerprint() == fingerprint) { + if (device->isAutoDetected() && device->type() == type && device->internalId() == id) return device; - } } return IDevice::Ptr(); } @@ -74,7 +74,7 @@ public: static DeviceManager *clonedInstance; QList devices; QList inactiveAutoDetectedDevices; - QHash defaultDevices; + QHash defaultDevices; }; DeviceManager *DeviceManagerPrivate::clonedInstance = 0; @@ -153,7 +153,7 @@ void DeviceManager::loadPre2_6() const QVariantHash defaultDevsHash = settings->value(QLatin1String("DefaultConfigs")).toHash(); for (QVariantHash::ConstIterator it = defaultDevsHash.constBegin(); it != defaultDevsHash.constEnd(); ++it) { - d->defaultDevices.insert(it.key(), it.value().toULongLong()); + d->defaultDevices.insert(it.key(), Core::Id(it.value().toString())); } int count = settings->beginReadArray(QLatin1String("ConfigList")); for (int i = 0; i < count; ++i) { @@ -166,8 +166,6 @@ void DeviceManager::loadPre2_6() continue; IDevice::Ptr device = factory->loadDevice(map); QTC_ASSERT(device, continue); - if (device->internalId() == IDevice::invalidId()) - device->setInternalId(unusedId()); d->devices << device; } settings->endArray(); @@ -179,7 +177,7 @@ void DeviceManager::fromMap(const QVariantMap &map) const QVariantMap defaultDevsMap = map.value(QLatin1String(DefaultDevicesKey)).toMap(); for (QVariantMap::ConstIterator it = defaultDevsMap.constBegin(); it != defaultDevsMap.constEnd(); ++it) { - d->defaultDevices.insert(it.key(), it.value().toULongLong()); + d->defaultDevices.insert(it.key(), Core::Id(it.value().toString())); } const QVariantList deviceList = map.value(QLatin1String(DeviceListKey)).toList(); foreach (const QVariant &v, deviceList) { @@ -189,8 +187,6 @@ void DeviceManager::fromMap(const QVariantMap &map) continue; IDevice::Ptr device = factory->loadDevice(map); QTC_ASSERT(device, continue); - if (device->internalId() == IDevice::invalidId()) - device->setInternalId(unusedId()); if (device->isAutoDetected()) d->inactiveAutoDetectedDevices << device; else @@ -202,10 +198,10 @@ QVariantMap DeviceManager::toMap() const { QVariantMap map; QVariantMap defaultDeviceMap; - typedef QHash TypeIdHash; + typedef QHash TypeIdHash; for (TypeIdHash::ConstIterator it = d->defaultDevices.constBegin(); it != d->defaultDevices.constEnd(); ++it) { - defaultDeviceMap.insert(it.key(), it.value()); + defaultDeviceMap.insert(it.key(), it.value().toString()); } map.insert(QLatin1String(DefaultDevicesKey), defaultDeviceMap); QVariantList deviceList; @@ -241,8 +237,6 @@ void DeviceManager::addDevice(const IDevice::Ptr &device) while (hasDevice(name)); } device->setDisplayName(name); - if (pos < 0) - device->setInternalId(unusedId()); if (!defaultDevice(device->type())) d->defaultDevices.insert(device->type(), device->internalId()); d->devices << device; @@ -251,8 +245,7 @@ void DeviceManager::addDevice(const IDevice::Ptr &device) if (this == instance()) { QList::Iterator it = d->inactiveAutoDetectedDevices.begin(); while (it != d->inactiveAutoDetectedDevices.end()) { - if (it->data()->type() == device->type() - && it->data()->fingerprint() == device->fingerprint()) { + if (it->data()->internalId() == device->internalId()) { d->inactiveAutoDetectedDevices.erase(it); break; } @@ -370,7 +363,7 @@ bool DeviceManager::hasDevice(const QString &name) const return false; } -IDevice::ConstPtr DeviceManager::find(IDevice::Id id) const +IDevice::ConstPtr DeviceManager::find(const Core::Id &id) const { const int index = indexForInternalId(id); return index == -1 ? IDevice::ConstPtr() : deviceAt(index); @@ -384,13 +377,13 @@ IDevice::ConstPtr DeviceManager::findInactiveAutoDetectedDevice(const QString &t IDevice::ConstPtr DeviceManager::defaultDevice(const QString &deviceType) const { - const IDevice::Id id = d->defaultDevices.value(deviceType, IDevice::invalidId()); + const Core::Id id = d->defaultDevices.value(deviceType, IDevice::invalidId()); if (id == IDevice::invalidId()) return IDevice::ConstPtr(); return find(id); } -int DeviceManager::indexForInternalId(IDevice::Id internalId) const +int DeviceManager::indexForInternalId(const Core::Id &internalId) const { for (int i = 0; i < d->devices.count(); ++i) { if (deviceAt(i)->internalId() == internalId) @@ -399,7 +392,7 @@ int DeviceManager::indexForInternalId(IDevice::Id internalId) const return -1; } -IDevice::Id DeviceManager::internalId(const IDevice::ConstPtr &device) const +Core::Id DeviceManager::internalId(const IDevice::ConstPtr &device) const { return device ? device->internalId() : IDevice::invalidId(); } @@ -417,16 +410,6 @@ void DeviceManager::ensureOneDefaultDevicePerType() } } -IDevice::Id DeviceManager::unusedId() const -{ - for (IDevice::Id id = 0; id <= std::numeric_limits::max(); ++id) { - if (id != IDevice::invalidId() && !find(id)) - return id; - } - QTC_CHECK(false); - return IDevice::invalidId(); -} - IDevice::Ptr DeviceManager::fromRawPointer(IDevice *device) const { foreach (const IDevice::Ptr &devPtr, d->devices) { diff --git a/src/plugins/projectexplorer/devicesupport/devicemanager.h b/src/plugins/projectexplorer/devicesupport/devicemanager.h index 7a7b5a9d8ce..ab95c193a1f 100644 --- a/src/plugins/projectexplorer/devicesupport/devicemanager.h +++ b/src/plugins/projectexplorer/devicesupport/devicemanager.h @@ -60,12 +60,12 @@ public: int deviceCount() const; IDevice::ConstPtr deviceAt(int index) const; - IDevice::ConstPtr find(IDevice::Id id) const; + IDevice::ConstPtr find(const Core::Id &id) const; IDevice::ConstPtr findInactiveAutoDetectedDevice(const QString &type, const QString &fingerprint); IDevice::ConstPtr defaultDevice(const QString &deviceType) const; bool hasDevice(const QString &name) const; - IDevice::Id internalId(const IDevice::ConstPtr &device) const; + Core::Id internalId(const IDevice::ConstPtr &device) const; int indexOf(const IDevice::ConstPtr &device) const; @@ -75,7 +75,7 @@ public: static const IDeviceFactory *factoryForDeviceType(const QString &type); signals: - void deviceUpdated(ProjectExplorer::IDevice::Id id); + void deviceUpdated(const Core::Id &id); void deviceAdded(const QSharedPointer &device); void deviceRemoved(int index); @@ -93,8 +93,7 @@ private: void fromMap(const QVariantMap &map); QVariantMap toMap() const; void ensureOneDefaultDevicePerType(); - IDevice::Id unusedId() const; - int indexForInternalId(IDevice::Id internalId) const; + int indexForInternalId(const Core::Id &internalId) const; // For SettingsWidget. IDevice::Ptr mutableDeviceAt(int index) const; diff --git a/src/plugins/projectexplorer/devicesupport/devicesettingswidget.cpp b/src/plugins/projectexplorer/devicesupport/devicesettingswidget.cpp index a69408f0d93..4314085948e 100644 --- a/src/plugins/projectexplorer/devicesupport/devicesettingswidget.cpp +++ b/src/plugins/projectexplorer/devicesupport/devicesettingswidget.cpp @@ -39,6 +39,7 @@ #include "idevicewidget.h" #include +#include #include #include #include @@ -189,7 +190,7 @@ void DeviceSettingsWidget::displayCurrent() m_deviceManager->defaultDevice(current->type()) != current); m_ui->osTypeValueLabel->setText(current->displayType()); m_ui->autoDetectionValueLabel->setText(current->isAutoDetected() - ? tr("Yes (fingerprint is '%1')").arg(current->fingerprint()) : tr("No")); + ? tr("Yes (fingerprint is '%1')").arg(current->internalId().toString()) : tr("No")); m_nameValidator->setDisplayName(current->displayName()); m_ui->removeConfigButton->setEnabled(!current->isAutoDetected()); fillInValues(); diff --git a/src/plugins/projectexplorer/devicesupport/idevice.cpp b/src/plugins/projectexplorer/devicesupport/idevice.cpp index 7f0ae1a56bf..a1aad1ac0cc 100644 --- a/src/plugins/projectexplorer/devicesupport/idevice.cpp +++ b/src/plugins/projectexplorer/devicesupport/idevice.cpp @@ -33,9 +33,11 @@ #include "devicemanager.h" +#include #include #include +#include /*! * \class ProjectExplorer::IDevice @@ -74,21 +76,15 @@ */ /*! - * \fn ProjectExplorer::IDevice::Id ProjectExplorer::IDevice::internalId() const + * \fn Core::Id ProjectExplorer::IDevice::internalId() const * \brief Identify the device internally. - */ - -/*! - * \fn QString ProjectExplorer::IDevice::fingerprint() const - * \brief Uniquely identifies an auto-detected device. - * The fingerprint can later be used to retrieve changes the user has done to the settings - * of an auto-detected device so they are not lost when the device goes away, e.g. because - * it has been disconnected. + * If a fingerprint is given when constructing the device, the id will be derived from it, and + * the fingerprint can later be retrieved from the id. * \sa ProjectExplorer::DeviceManager::findInactiveAutoDetectedDevice() */ /*! - * \fn ProjectExplorer::IDevice::Id ProjectExplorer::IDevice::invalidId() + * \fn Core::Id ProjectExplorer::IDevice::invalidId() * \brief A value that no device can ever have as its internal id. */ @@ -141,25 +137,26 @@ * implementation. */ +static Core::Id newId() +{ + return Core::Id(QUuid::createUuid().toString()); +} + namespace ProjectExplorer { const char DisplayNameKey[] = "Name"; const char TypeKey[] = "OsType"; const char InternalIdKey[] = "InternalId"; const char OriginKey[] = "Origin"; -const char FingerprintKey[] = "FingerPrint"; namespace Internal { class IDevicePrivate { public: - IDevicePrivate() : internalId(IDevice::invalidId()) { } - QString displayName; QString type; IDevice::Origin origin; - IDevice::Id internalId; - QString fingerprint; + Core::Id internalId; }; } // namespace Internal @@ -172,8 +169,8 @@ IDevice::IDevice(const QString &type, Origin origin, const QString &fingerprint) { d->type = type; d->origin = origin; - d->fingerprint = fingerprint; - QTC_CHECK(d->origin == ManuallyAdded || !d->fingerprint.isEmpty()); + QTC_CHECK(origin == ManuallyAdded || !fingerprint.isEmpty()); + d->internalId = fingerprint.isEmpty() ? newId() : Core::Id(fingerprint); } IDevice::IDevice(const IDevice &other) : d(new Internal::IDevicePrivate) @@ -208,24 +205,14 @@ bool IDevice::isAutoDetected() const return d->origin == AutoDetected; } -QString IDevice::fingerprint() const -{ - return d->fingerprint; -} - -IDevice::Id IDevice::internalId() const +Core::Id IDevice::internalId() const { return d->internalId; } -void IDevice::setInternalId(IDevice::Id id) +Core::Id IDevice::invalidId() { - d->internalId = id; -} - -IDevice::Id IDevice::invalidId() -{ - return 0; + return Core::Id(); } QString IDevice::typeFromMap(const QVariantMap &map) @@ -237,10 +224,8 @@ void IDevice::fromMap(const QVariantMap &map) { d->type = typeFromMap(map); d->displayName = map.value(QLatin1String(DisplayNameKey)).toString(); - d->internalId = map.value(QLatin1String(InternalIdKey), invalidId()).toULongLong(); + d->internalId = Core::Id(map.value(QLatin1String(InternalIdKey), newId().toString()).toString()); d->origin = static_cast(map.value(QLatin1String(OriginKey), ManuallyAdded).toInt()); - d->fingerprint = map.value(QLatin1String(FingerprintKey)).toString(); - QTC_CHECK(d->origin == ManuallyAdded || !d->fingerprint.isEmpty()); } QVariantMap IDevice::toMap() const @@ -248,9 +233,8 @@ QVariantMap IDevice::toMap() const QVariantMap map; map.insert(QLatin1String(DisplayNameKey), d->displayName); map.insert(QLatin1String(TypeKey), d->type); - map.insert(QLatin1String(InternalIdKey), d->internalId); + map.insert(QLatin1String(InternalIdKey), d->internalId.toString()); map.insert(QLatin1String(OriginKey), d->origin); - map.insert(QLatin1String(FingerprintKey), d->fingerprint); return map; } diff --git a/src/plugins/projectexplorer/devicesupport/idevice.h b/src/plugins/projectexplorer/devicesupport/idevice.h index 75a0d942c64..d21ac43f504 100644 --- a/src/plugins/projectexplorer/devicesupport/idevice.h +++ b/src/plugins/projectexplorer/devicesupport/idevice.h @@ -43,6 +43,8 @@ class QDialog; class QWidget; QT_END_NAMESPACE +namespace Core { class Id; } + namespace ProjectExplorer { namespace Internal { class IDevicePrivate; } class IDeviceWidget; @@ -50,13 +52,10 @@ class IDeviceWidget; // See cpp file for documentation. class PROJECTEXPLORER_EXPORT IDevice { - friend class DeviceManager; public: typedef QSharedPointer Ptr; typedef QSharedPointer ConstPtr; - typedef quint64 Id; - enum Origin { ManuallyAdded, AutoDetected }; virtual ~IDevice(); @@ -66,8 +65,7 @@ public: QString type() const; bool isAutoDetected() const; - QString fingerprint() const; - Id internalId() const; + Core::Id internalId() const; virtual QString displayType() const = 0; virtual IDeviceWidget *createWidget() = 0; @@ -76,9 +74,10 @@ public: virtual QDialog *createAction(const QString &actionId, QWidget *parent = 0) const = 0; virtual void fromMap(const QVariantMap &map); + virtual QVariantMap toMap() const; virtual Ptr clone() const = 0; - static Id invalidId(); + static Core::Id invalidId(); static QString typeFromMap(const QVariantMap &map); @@ -90,11 +89,7 @@ protected: Ptr sharedFromThis(); ConstPtr sharedFromThis() const; - virtual QVariantMap toMap() const; - private: - void setInternalId(Id id); - IDevice &operator=(const IDevice &); Internal::IDevicePrivate *d; diff --git a/src/plugins/remotelinux/remotelinuxdeployconfiguration.cpp b/src/plugins/remotelinux/remotelinuxdeployconfiguration.cpp index 7c77a918f64..f6735f7da7e 100644 --- a/src/plugins/remotelinux/remotelinuxdeployconfiguration.cpp +++ b/src/plugins/remotelinux/remotelinuxdeployconfiguration.cpp @@ -36,6 +36,7 @@ #include "remotelinuxdeployconfigurationwidget.h" #include "typespecificdeviceconfigurationlistmodel.h" +#include #include #include @@ -91,7 +92,7 @@ void RemoteLinuxDeployConfiguration::handleDeviceConfigurationListUpdated() setDeviceConfig(DeviceManager::instance()->internalId(d->deviceConfiguration)); } -void RemoteLinuxDeployConfiguration::setDeviceConfig(LinuxDeviceConfiguration::Id internalId) +void RemoteLinuxDeployConfiguration::setDeviceConfig(const Core::Id &internalId) { d->deviceConfiguration = target()->deviceConfigModel()->find(internalId); emit deviceConfigurationListChanged(); @@ -102,7 +103,8 @@ bool RemoteLinuxDeployConfiguration::fromMap(const QVariantMap &map) { if (!DeployConfiguration::fromMap(map)) return false; - setDeviceConfig(map.value(QLatin1String(DeviceIdKey), IDevice::invalidId()).toULongLong()); + setDeviceConfig(Core::Id(map.value(QLatin1String(DeviceIdKey), + IDevice::invalidId().toString()).toString())); return true; } @@ -110,7 +112,7 @@ QVariantMap RemoteLinuxDeployConfiguration::toMap() const { QVariantMap map = DeployConfiguration::toMap(); map.insert(QLatin1String(DeviceIdKey), - DeviceManager::instance()->internalId(d->deviceConfiguration)); + DeviceManager::instance()->internalId(d->deviceConfiguration).toString()); return map; } diff --git a/src/plugins/remotelinux/remotelinuxdeployconfiguration.h b/src/plugins/remotelinux/remotelinuxdeployconfiguration.h index 9b0db1bbd21..a5f662a7e17 100644 --- a/src/plugins/remotelinux/remotelinuxdeployconfiguration.h +++ b/src/plugins/remotelinux/remotelinuxdeployconfiguration.h @@ -93,7 +93,7 @@ signals: private: void initialize(); - void setDeviceConfig(LinuxDeviceConfiguration::Id internalId); + void setDeviceConfig(const Core::Id &internalId); Q_SLOT void handleDeviceConfigurationListUpdated(); Internal::RemoteLinuxDeployConfigurationPrivate * const d; diff --git a/src/plugins/remotelinux/remotelinuxdeployconfigurationwidget.cpp b/src/plugins/remotelinux/remotelinuxdeployconfigurationwidget.cpp index 950f7a68f2e..5b78e7d7a5a 100644 --- a/src/plugins/remotelinux/remotelinuxdeployconfigurationwidget.cpp +++ b/src/plugins/remotelinux/remotelinuxdeployconfigurationwidget.cpp @@ -39,6 +39,7 @@ #include #include +#include #include #include #include @@ -182,7 +183,7 @@ void RemoteLinuxDeployConfigurationWidget::handleDeviceConfigurationListChanged( { const LinuxDeviceConfiguration::ConstPtr &devConf = d->deployConfiguration->deviceConfiguration(); - const IDevice::Id internalId = DeviceManager::instance()->internalId(devConf); + const Core::Id &internalId = DeviceManager::instance()->internalId(devConf); const int newIndex = d->deployConfiguration->target()->deviceConfigModel()->indexForInternalId(internalId); d->ui.deviceConfigsComboBox->setCurrentIndex(newIndex); diff --git a/src/plugins/remotelinux/typespecificdeviceconfigurationlistmodel.cpp b/src/plugins/remotelinux/typespecificdeviceconfigurationlistmodel.cpp index 3b177f5b4f6..c6349045b37 100644 --- a/src/plugins/remotelinux/typespecificdeviceconfigurationlistmodel.cpp +++ b/src/plugins/remotelinux/typespecificdeviceconfigurationlistmodel.cpp @@ -109,7 +109,7 @@ LinuxDeviceConfiguration::ConstPtr TypeSpecificDeviceConfigurationListModel::def return LinuxDeviceConfiguration::ConstPtr(); } -LinuxDeviceConfiguration::ConstPtr TypeSpecificDeviceConfigurationListModel::find(LinuxDeviceConfiguration::Id id) const +LinuxDeviceConfiguration::ConstPtr TypeSpecificDeviceConfigurationListModel::find(const Core::Id &id) const { const IDevice::ConstPtr &devConf = DeviceManager::instance()->find(id); if (devConf && target()->supportsDevice(devConf)) @@ -117,7 +117,7 @@ LinuxDeviceConfiguration::ConstPtr TypeSpecificDeviceConfigurationListModel::fin return defaultDeviceConfig(); } -int TypeSpecificDeviceConfigurationListModel::indexForInternalId(LinuxDeviceConfiguration::Id id) const +int TypeSpecificDeviceConfigurationListModel::indexForInternalId(const Core::Id &id) const { const int count = rowCount(); for (int i = 0; i < count; ++i) { diff --git a/src/plugins/remotelinux/typespecificdeviceconfigurationlistmodel.h b/src/plugins/remotelinux/typespecificdeviceconfigurationlistmodel.h index 9fac87a802c..9e61862c3da 100644 --- a/src/plugins/remotelinux/typespecificdeviceconfigurationlistmodel.h +++ b/src/plugins/remotelinux/typespecificdeviceconfigurationlistmodel.h @@ -54,8 +54,8 @@ public: QSharedPointer deviceAt(int idx) const; QSharedPointer defaultDeviceConfig() const; - QSharedPointer find(LinuxDeviceConfiguration::Id id) const; - int indexForInternalId(LinuxDeviceConfiguration::Id id) const; + QSharedPointer find(const Core::Id &id) const; + int indexForInternalId(const Core::Id &id) const; private: AbstractEmbeddedLinuxTarget * target() const;