diff --git a/src/plugins/baremetal/baremetaldevice.cpp b/src/plugins/baremetal/baremetaldevice.cpp index b186da90fd2..e5b22b5e214 100644 --- a/src/plugins/baremetal/baremetaldevice.cpp +++ b/src/plugins/baremetal/baremetaldevice.cpp @@ -59,6 +59,12 @@ BareMetalDevice::Ptr BareMetalDevice::create(const BareMetalDevice &other) return Ptr(new BareMetalDevice(other)); } +BareMetalDevice::~BareMetalDevice() +{ + if (GdbServerProvider *provider = GdbServerProviderManager::findProvider(m_gdbServerProviderId)) + provider->unregisterDevice(this); +} + QString BareMetalDevice::gdbServerProviderId() const { return m_gdbServerProviderId; @@ -66,8 +72,26 @@ QString BareMetalDevice::gdbServerProviderId() const void BareMetalDevice::setGdbServerProviderId(const QString &id) { + if (id == m_gdbServerProviderId) + return; + if (GdbServerProvider *currentProvider = GdbServerProviderManager::findProvider(m_gdbServerProviderId)) + currentProvider->unregisterDevice(this); m_gdbServerProviderId = id; - GdbServerProvider *provider = GdbServerProviderManager::findProvider(id); + if (GdbServerProvider *provider = GdbServerProviderManager::findProvider(id)) { + setChannelByServerProvider(provider); + provider->registerDevice(this); + } +} + +void BareMetalDevice::providerUpdated(GdbServerProvider *provider) +{ + GdbServerProvider *myProvider = GdbServerProviderManager::findProvider(m_gdbServerProviderId); + if (provider == myProvider) + setChannelByServerProvider(provider); +} + +void BareMetalDevice::setChannelByServerProvider(GdbServerProvider *provider) +{ QTC_ASSERT(provider, return); const QString channel = provider->channel(); const int colon = channel.indexOf(QLatin1Char(':')); diff --git a/src/plugins/baremetal/baremetaldevice.h b/src/plugins/baremetal/baremetaldevice.h index c62c83e609a..75d549b2932 100644 --- a/src/plugins/baremetal/baremetaldevice.h +++ b/src/plugins/baremetal/baremetaldevice.h @@ -31,6 +31,8 @@ namespace BareMetal { namespace Internal { +class GdbServerProvider; + class BareMetalDevice : public ProjectExplorer::IDevice { public: @@ -42,6 +44,7 @@ public: Origin origin = ManuallyAdded, Core::Id id = Core::Id()); static Ptr create(const BareMetalDevice &other); + ~BareMetalDevice(); QString displayType() const override; ProjectExplorer::IDeviceWidget *createWidget() override; QList actionIds() const override; @@ -56,6 +59,7 @@ public: QString gdbServerProviderId() const; void setGdbServerProviderId(const QString &id); + void providerUpdated(GdbServerProvider *provider); virtual void fromMap(const QVariantMap &map) override; virtual QVariantMap toMap() const override; @@ -67,6 +71,7 @@ protected: BareMetalDevice(const BareMetalDevice &other); private: + void setChannelByServerProvider(GdbServerProvider *provider); BareMetalDevice &operator=(const BareMetalDevice &); QString m_gdbServerProviderId; }; diff --git a/src/plugins/baremetal/gdbserverprovider.cpp b/src/plugins/baremetal/gdbserverprovider.cpp index 2bd20b04eb9..3491ec3ad01 100644 --- a/src/plugins/baremetal/gdbserverprovider.cpp +++ b/src/plugins/baremetal/gdbserverprovider.cpp @@ -25,7 +25,9 @@ #include "gdbserverprovider.h" #include "gdbserverprovidermanager.h" +#include "baremetaldevice.h" +#include #include #include @@ -74,6 +76,9 @@ GdbServerProvider::GdbServerProvider(const GdbServerProvider &other) GdbServerProvider::~GdbServerProvider() { + const QSet devices = m_devices; + for (BareMetalDevice *device : devices) + device->setGdbServerProviderId(QString()); } QString GdbServerProvider::displayName() const @@ -173,9 +178,21 @@ bool GdbServerProvider::canStartupMode(StartupMode m) const return m == NoStartup; } +void GdbServerProvider::registerDevice(BareMetalDevice *device) +{ + m_devices.insert(device); +} + +void GdbServerProvider::unregisterDevice(BareMetalDevice *device) +{ + m_devices.remove(device); +} + void GdbServerProvider::providerUpdated() { GdbServerProviderManager::notifyAboutUpdate(this); + for (BareMetalDevice *device : Utils::asConst(m_devices)) + device->providerUpdated(this); } bool GdbServerProvider::fromMap(const QVariantMap &data) diff --git a/src/plugins/baremetal/gdbserverprovider.h b/src/plugins/baremetal/gdbserverprovider.h index 0130d2f9fb2..eabac0fa292 100644 --- a/src/plugins/baremetal/gdbserverprovider.h +++ b/src/plugins/baremetal/gdbserverprovider.h @@ -26,8 +26,8 @@ #pragma once #include +#include #include - #include #include @@ -44,6 +44,7 @@ QT_END_NAMESPACE namespace BareMetal { namespace Internal { +class BareMetalDevice; class GdbServerProviderConfigWidget; class GdbServerProviderManager; @@ -85,6 +86,9 @@ public: virtual bool isValid() const; virtual bool canStartupMode(StartupMode) const; + void registerDevice(BareMetalDevice *); + void unregisterDevice(BareMetalDevice *); + protected: explicit GdbServerProvider(const QString &id); explicit GdbServerProvider(const GdbServerProvider &); @@ -103,6 +107,7 @@ private: StartupMode m_startupMode; QString m_initCommands; QString m_resetCommands; + QSet m_devices; friend class GdbServerProviderConfigWidget; };