diff --git a/src/plugins/debugger/debugger.pro b/src/plugins/debugger/debugger.pro index db73a14a820deddd55ad24f7e3d3d141a918daaa..ca08adcf0681f57ca571be2df9ed7bd3e80b1169 100644 --- a/src/plugins/debugger/debugger.pro +++ b/src/plugins/debugger/debugger.pro @@ -46,6 +46,7 @@ HEADERS += breakhandler.h \ registerwindow.h \ snapshothandler.h \ snapshotwindow.h \ + sourceagent.h \ sourcefileshandler.h \ sourcefileswindow.h \ stackframe.h \ @@ -85,6 +86,7 @@ SOURCES += breakhandler.cpp \ registerwindow.cpp \ snapshothandler.cpp \ snapshotwindow.cpp \ + sourceagent.cpp \ sourcefileshandler.cpp \ sourcefileswindow.cpp \ stackhandler.cpp \ diff --git a/src/plugins/debugger/debuggerplugin.cpp b/src/plugins/debugger/debuggerplugin.cpp index ed57f520713425fb3172ddec5c880bb22cdb9348..24cb7fb6a0dc8db8c23513528410fcbda818f042 100644 --- a/src/plugins/debugger/debuggerplugin.cpp +++ b/src/plugins/debugger/debuggerplugin.cpp @@ -2313,9 +2313,6 @@ void DebuggerPluginPrivate::startRemoteEngine() sp.connParams.uname = dlg.username(); sp.connParams.pwd = dlg.password(); - - qDebug() << sp.connParams.host << sp.connParams.uname << sp.connParams.pwd; - sp.connParams.timeout = 5; sp.connParams.authType = SshConnectionParameters::AuthByPwd; sp.connParams.port = 22; diff --git a/src/plugins/debugger/lldb/ipcenginehost.cpp b/src/plugins/debugger/lldb/ipcenginehost.cpp index f2bd37d40709c8d86ed74e44be295c2a4bda73b5..642f6004596f68dfacb0e6afc09a53678efe60d9 100644 --- a/src/plugins/debugger/lldb/ipcenginehost.cpp +++ b/src/plugins/debugger/lldb/ipcenginehost.cpp @@ -40,9 +40,7 @@ #include "threadshandler.h" #include "debuggeragents.h" #include "debuggerstreamops.h" -#include <coreplugin/editormanager/editormanager.h> -#include <coreplugin/editormanager/ieditor.h> -#include <cppeditor/cppeditorconstants.h> +#include "debuggercore.h" #include <QSysInfo> #include <QDebug> @@ -426,8 +424,10 @@ void IPCEngineHost::rpcCallback(quint64 f, QByteArray payload) sh->setCurrentIndex(token); if (!sh->currentFrame().isUsable() || QFileInfo(sh->currentFrame().file).exists()) gotoLocation(sh->currentFrame(), true); - else + else if (!m_sourceAgents.contains(sh->currentFrame().file)) fetchFrameSource(token); + foreach(SourceAgent *agent, m_sourceAgents.values()) + agent->updateLocationMarker(); } break; case IPCEngineGuest::CurrentThreadChanged: @@ -562,14 +562,14 @@ void IPCEngineHost::rpcCallback(quint64 f, QByteArray payload) QDataStream s(payload); SET_NATIVE_BYTE_ORDER(s); qint64 token; - QString name; + QString path; QString source; - s >> token >> name >> source; - Core::EditorManager *editorManager = Core::EditorManager::instance(); - Core::IEditor *editor = editorManager->openEditorWithContents(CppEditor::Constants::CPPEDITOR_ID, &name, source); - editorManager->activateEditor(editor); - editor->gotoLine(stackHandler()->currentFrame().line, 0); - editor->setProperty(Debugger::Constants::OPENED_BY_DEBUGGER, true); + s >> token >> path >> source; + SourceAgent *agent = new SourceAgent(this); + agent->setSourceProducerName(startParameters().connParams.host); + agent->setContent(path, source); + m_sourceAgents.insert(path, agent); + agent->updateLocationMarker(); } break; } diff --git a/src/plugins/debugger/lldb/ipcenginehost.h b/src/plugins/debugger/lldb/ipcenginehost.h index a9db3c7c52ea28a088a42c4f8fad3271deae769f..8866ded2615acf4280880aea95e52833a0ce1dc7 100644 --- a/src/plugins/debugger/lldb/ipcenginehost.h +++ b/src/plugins/debugger/lldb/ipcenginehost.h @@ -34,6 +34,7 @@ #include "threadshandler.h" #include "stackhandler.h" #include "breakhandler.h" +#include "sourceagent.h" #include <QtCore/QQueue> #include <QtCore/QVariant> @@ -129,6 +130,7 @@ private: quint64 m_cookie; QIODevice *m_device; QHash<quint64, DisassemblerViewAgent *> m_frameToDisassemblerAgent; + QHash<QString, SourceAgent *> m_sourceAgents; }; } // namespace Internal diff --git a/src/plugins/debugger/sourceagent.cpp b/src/plugins/debugger/sourceagent.cpp new file mode 100644 index 0000000000000000000000000000000000000000..b9b76cc20050c6f96905006d348ee92956a14bee --- /dev/null +++ b/src/plugins/debugger/sourceagent.cpp @@ -0,0 +1,187 @@ +/************************************************************************** +** +** This file is part of Qt Creator +** +** Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies). +** +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** Commercial Usage +** +** Licensees holding valid Qt Commercial licenses may use this file in +** accordance with the Qt Commercial License Agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and Nokia. +** +** GNU Lesser General Public License Usage +** +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** If you are unsure which license is appropriate for your use, please +** contact the sales department at http://qt.nokia.com/contact. +** +**************************************************************************/ + +#include "sourceagent.h" + +#include "breakhandler.h" +#include "debuggerengine.h" +#include "debuggercore.h" +#include "debuggerstringutils.h" +#include "stackframe.h" +#include "stackhandler.h" + +#include <coreplugin/coreconstants.h> +#include <coreplugin/editormanager/editormanager.h> +#include <coreplugin/editormanager/ieditor.h> +#include <coreplugin/mimedatabase.h> +#include <coreplugin/icore.h> + +#include <texteditor/basetextdocument.h> +#include <texteditor/basetexteditor.h> +#include <texteditor/basetextmark.h> +#include <texteditor/plaintexteditor.h> +#include <texteditor/texteditorconstants.h> + +#include <cppeditor/cppeditorconstants.h> + +#include <utils/qtcassert.h> + +#include <QtCore/QDebug> +#include <QtCore/QMetaObject> +#include <QtCore/QTimer> + +#include <QtGui/QMessageBox> +#include <QtGui/QPlainTextEdit> +#include <QtGui/QTextBlock> +#include <QtGui/QTextCursor> +#include <QtGui/QIcon> + +#include <limits.h> + +using namespace Core; + +namespace Debugger { +namespace Internal { + +class LocationMarkFoo : public TextEditor::ITextMark +{ +public: + LocationMarkFoo() {} + + QIcon icon() const { return debuggerCore()->locationMarkIcon(); } + void updateLineNumber(int /*lineNumber*/) {} + void updateBlock(const QTextBlock & /*block*/) {} + void removedFromEditor() {} + void documentClosing() {} +}; + +class SourceAgentPrivate +{ +public: + SourceAgentPrivate(); + ~SourceAgentPrivate(); + +public: + QPointer<TextEditor::ITextEditor> editor; + QPointer<DebuggerEngine> engine; + TextEditor::ITextMark *locationMark; + QString path; + QString producer; +}; + +SourceAgentPrivate::SourceAgentPrivate() + : editor(0) + , locationMark(new LocationMarkFoo) + , producer("remote") +{ +} + +SourceAgentPrivate::~SourceAgentPrivate() +{ + if (editor) { + EditorManager *editorManager = EditorManager::instance(); + editorManager->closeEditors(QList<IEditor *>() << editor); + } + editor = 0; + delete locationMark; +} + +SourceAgent::SourceAgent(DebuggerEngine *engine) + : QObject(0), d(new SourceAgentPrivate) +{ + d->engine = engine; +} + +SourceAgent::~SourceAgent() +{ + delete d; + d = 0; +} + +void SourceAgent::setSourceProducerName(const QString &name) +{ + d->producer = name; +} + +void SourceAgent::setContent(const QString &filePath, const QString &content) +{ + QTC_ASSERT(d, return); + using namespace Core; + using namespace TextEditor; + + d->path = filePath; + + EditorManager *editorManager = EditorManager::instance(); + if (!d->editor) { + QString titlePattern = d->producer + QLatin1String(": ") + + QFileInfo(filePath).fileName(); + d->editor = qobject_cast<ITextEditor *>( + editorManager->openEditorWithContents( + CppEditor::Constants::CPPEDITOR_ID, + &titlePattern, content)); + QTC_ASSERT(d->editor, return); + d->editor->setProperty(Debugger::Constants::OPENED_BY_DEBUGGER, true); + + BaseTextEditor *baseTextEdit = + qobject_cast<BaseTextEditor *>(d->editor->widget()); + if (baseTextEdit) + baseTextEdit->setRequestMarkEnabled(true); + } + + editorManager->activateEditor(d->editor); + + QPlainTextEdit *plainTextEdit = + qobject_cast<QPlainTextEdit *>(d->editor->widget()); + QTC_ASSERT(plainTextEdit, return); + plainTextEdit->setReadOnly(true); + + updateLocationMarker(); +} + +void SourceAgent::updateLocationMarker() +{ + QTC_ASSERT(d->editor, return); + + d->editor->markableInterface()->removeMark(d->locationMark); + if (d->engine->stackHandler()->currentFrame().file == d->path) { + int lineNumber = d->engine->stackHandler()->currentFrame().line; + d->editor->markableInterface()->addMark(d->locationMark, lineNumber); + QPlainTextEdit *plainTextEdit = qobject_cast<QPlainTextEdit *>(d->editor->widget()); + QTC_ASSERT(plainTextEdit, return); + QTextCursor tc = plainTextEdit->textCursor(); + QTextBlock block = tc.document()->findBlockByNumber(lineNumber - 1); + tc.setPosition(block.position()); + plainTextEdit->setTextCursor(tc); + EditorManager *editorManager = EditorManager::instance(); + editorManager->activateEditor(d->editor); + } +} + +} // namespace Internal +} // namespace Debugger diff --git a/src/plugins/debugger/sourceagent.h b/src/plugins/debugger/sourceagent.h new file mode 100644 index 0000000000000000000000000000000000000000..649e01ab7d0cec1c91622221df34683281d44b52 --- /dev/null +++ b/src/plugins/debugger/sourceagent.h @@ -0,0 +1,62 @@ +/************************************************************************** +** +** This file is part of Qt Creator +** +** Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies). +** +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** Commercial Usage +** +** Licensees holding valid Qt Commercial licenses may use this file in +** accordance with the Qt Commercial License Agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and Nokia. +** +** GNU Lesser General Public License Usage +** +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** If you are unsure which license is appropriate for your use, please +** contact the sales department at http://qt.nokia.com/contact. +** +**************************************************************************/ + +#ifndef DEBUGGER_SOURCE_AGENT_H +#define DEBUGGER_SOURCE_AGENT_H + +#include <QtCore/QObject> +#include <QtCore/QHash> +#include <QtCore/QPointer> +#include <QtCore/QVector> + +namespace Debugger { + +class DebuggerEngine; + +namespace Internal { + +class SourceAgentPrivate; +class SourceAgent : public QObject +{ +public: + explicit SourceAgent(Debugger::DebuggerEngine *engine); + ~SourceAgent(); + void setSourceProducerName(const QString &name); + void resetLocation(); + void setContent(const QString &name, const QString &content); + void updateLocationMarker(); +private: + SourceAgentPrivate *d; +}; + + +} // namespace Internal +} // namespace Debugger + +#endif