summaryrefslogtreecommitdiff
path: root/src/plugins/baremetal/debugserverprovidermanager.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/plugins/baremetal/debugserverprovidermanager.cpp')
-rw-r--r--src/plugins/baremetal/debugserverprovidermanager.cpp207
1 files changed, 207 insertions, 0 deletions
diff --git a/src/plugins/baremetal/debugserverprovidermanager.cpp b/src/plugins/baremetal/debugserverprovidermanager.cpp
new file mode 100644
index 0000000000..19b0704e1c
--- /dev/null
+++ b/src/plugins/baremetal/debugserverprovidermanager.cpp
@@ -0,0 +1,207 @@
+/****************************************************************************
+**
+** Copyright (C) 2016 Denis Shienkov <denis.shienkov@gmail.com>
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt Creator.
+**
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 as published by the Free Software
+** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+****************************************************************************/
+
+#include "debugserverprovidermanager.h"
+#include "idebugserverprovider.h"
+
+// GDB debug servers.
+#include "debugservers/gdb/defaultgdbserverprovider.h"
+#include "debugservers/gdb/openocdgdbserverprovider.h"
+#include "debugservers/gdb/stlinkutilgdbserverprovider.h"
+
+#include <coreplugin/icore.h>
+
+#include <extensionsystem/pluginmanager.h>
+
+#include <utils/algorithm.h>
+#include <utils/persistentsettings.h>
+#include <utils/qtcassert.h>
+
+#include <QDir>
+
+namespace BareMetal {
+namespace Internal {
+
+const char dataKeyC[] = "DebugServerProvider.";
+const char countKeyC[] = "DebugServerProvider.Count";
+const char fileVersionKeyC[] = "Version";
+const char fileNameKeyC[] = "/debugserverproviders.xml";
+
+static DebugServerProviderManager *m_instance = nullptr;
+
+// DebugServerProviderManager
+
+DebugServerProviderManager::DebugServerProviderManager()
+ : m_configFile(Utils::FilePath::fromString(Core::ICore::userResourcePath() + fileNameKeyC))
+ , m_factories({new DefaultGdbServerProviderFactory,
+ new OpenOcdGdbServerProviderFactory,
+ new StLinkUtilGdbServerProviderFactory})
+{
+ m_instance = this;
+ m_writer = new Utils::PersistentSettingsWriter(
+ m_configFile, QLatin1String("QtCreatorDebugServerProviders"));
+
+ connect(Core::ICore::instance(), &Core::ICore::saveSettingsRequested,
+ this, &DebugServerProviderManager::saveProviders);
+
+ connect(this, &DebugServerProviderManager::providerAdded,
+ this, &DebugServerProviderManager::providersChanged);
+ connect(this, &DebugServerProviderManager::providerRemoved,
+ this, &DebugServerProviderManager::providersChanged);
+ connect(this, &DebugServerProviderManager::providerUpdated,
+ this, &DebugServerProviderManager::providersChanged);
+}
+
+DebugServerProviderManager::~DebugServerProviderManager()
+{
+ qDeleteAll(m_providers);
+ m_providers.clear();
+ qDeleteAll(m_factories);
+ delete m_writer;
+ m_instance = nullptr;
+}
+
+DebugServerProviderManager *DebugServerProviderManager::instance()
+{
+ return m_instance;
+}
+
+void DebugServerProviderManager::restoreProviders()
+{
+ Utils::PersistentSettingsReader reader;
+ if (!reader.load(m_configFile))
+ return;
+
+ const QVariantMap data = reader.restoreValues();
+ const int version = data.value(QLatin1String(fileVersionKeyC), 0).toInt();
+ if (version < 1)
+ return;
+
+ const int count = data.value(QLatin1String(countKeyC), 0).toInt();
+ for (int i = 0; i < count; ++i) {
+ const QString key = QString::fromLatin1(dataKeyC) + QString::number(i);
+ if (!data.contains(key))
+ break;
+
+ const QVariantMap map = data.value(key).toMap();
+ bool restored = false;
+ for (IDebugServerProviderFactory *f : qAsConst(m_factories)) {
+ if (f->canRestore(map)) {
+ if (IDebugServerProvider *p = f->restore(map)) {
+ registerProvider(p);
+ restored = true;
+ break;
+ }
+ }
+ }
+ if (!restored)
+ qWarning("Warning: Unable to restore provider '%s' stored in %s.",
+ qPrintable(IDebugServerProviderFactory::idFromMap(map)),
+ qPrintable(m_configFile.toUserOutput()));
+ }
+
+ emit providersLoaded();
+}
+
+void DebugServerProviderManager::saveProviders()
+{
+ QVariantMap data;
+ data.insert(QLatin1String(fileVersionKeyC), 1);
+
+ int count = 0;
+ for (const IDebugServerProvider *p : qAsConst(m_providers)) {
+ if (p->isValid()) {
+ const QVariantMap tmp = p->toMap();
+ if (tmp.isEmpty())
+ continue;
+ const QString key = QString::fromLatin1(dataKeyC) + QString::number(count);
+ data.insert(key, tmp);
+ ++count;
+ }
+ }
+ data.insert(QLatin1String(countKeyC), count);
+ m_writer->save(data, Core::ICore::mainWindow());
+}
+
+QList<IDebugServerProvider *> DebugServerProviderManager::providers()
+{
+ return m_instance->m_providers;
+}
+
+QList<IDebugServerProviderFactory *> DebugServerProviderManager::factories()
+{
+ return m_instance->m_factories;
+}
+
+IDebugServerProvider *DebugServerProviderManager::findProvider(const QString &id)
+{
+ if (id.isEmpty() || !m_instance)
+ return nullptr;
+
+ return Utils::findOrDefault(m_instance->m_providers, Utils::equal(&IDebugServerProvider::id, id));
+}
+
+IDebugServerProvider *DebugServerProviderManager::findByDisplayName(const QString &displayName)
+{
+ if (displayName.isEmpty())
+ return nullptr;
+
+ return Utils::findOrDefault(m_instance->m_providers,
+ Utils::equal(&IDebugServerProvider::displayName, displayName));
+}
+
+void DebugServerProviderManager::notifyAboutUpdate(IDebugServerProvider *provider)
+{
+ if (!provider || !m_instance->m_providers.contains(provider))
+ return;
+ emit m_instance->providerUpdated(provider);
+}
+
+bool DebugServerProviderManager::registerProvider(IDebugServerProvider *provider)
+{
+ if (!provider || m_instance->m_providers.contains(provider))
+ return true;
+ for (const IDebugServerProvider *current : qAsConst(m_instance->m_providers)) {
+ if (*provider == *current)
+ return false;
+ QTC_ASSERT(current->id() != provider->id(), return false);
+ }
+
+ m_instance->m_providers.append(provider);
+ emit m_instance->providerAdded(provider);
+ return true;
+}
+
+void DebugServerProviderManager::deregisterProvider(IDebugServerProvider *provider)
+{
+ if (!provider || !m_instance->m_providers.contains(provider))
+ return;
+ m_instance->m_providers.removeOne(provider);
+ emit m_instance->providerRemoved(provider);
+ delete provider;
+}
+
+} // namespace Internal
+} // namespace BareMetal