File indexing completed on 2024-04-21 04:36:04

0001 /*
0002  * XDebug Debugger Support
0003  *
0004  * Copyright 1999-2001 John Birch <jbb@kdevelop.org>
0005  * Copyright 2001 by Bernd Gehrmann <bernd@kdevelop.org>
0006  * Copyright 2006 Vladimir Prus <ghost@cs.msu.su>
0007  * Copyright 2007 Hamish Rodda <rodda@kde.org>
0008  * Copyright 2009 Niko Sams <niko.sams@gmail.com>
0009  *
0010  * This program is free software; you can redistribute it and/or modify
0011  * it under the terms of the GNU General Public License as
0012  * published by the Free Software Foundation; either version 2 of the
0013  * License, or (at your option) any later version.
0014  *
0015  * This program is distributed in the hope that it will be useful,
0016  * but WITHOUT ANY WARRANTY; without even the implied warranty of
0017  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
0018  * GNU General Public License for more details.
0019  *
0020  * You should have received a copy of the GNU General Public
0021  * License along with this program; if not, write to the
0022  * Free Software Foundation, Inc.,
0023  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
0024  */
0025 
0026 #include "xdebugplugin.h"
0027 
0028 #include <QDir>
0029 #include <QToolTip>
0030 #include <QByteArray>
0031 #include <QTimer>
0032 #include <QMenu>
0033 #include <QDBusConnectionInterface>
0034 #include <QDBusInterface>
0035 #include <QSignalMapper>
0036 
0037 #include <KPluginFactory>
0038 
0039 #include <interfaces/icore.h>
0040 #include <interfaces/iuicontroller.h>
0041 #include <interfaces/idocumentcontroller.h>
0042 #include <interfaces/iprojectcontroller.h>
0043 #include <interfaces/iruncontroller.h>
0044 #include <interfaces/context.h>
0045 #include <interfaces/idebugcontroller.h>
0046 #include <interfaces/iplugincontroller.h>
0047 #include <interfaces/launchconfigurationtype.h>
0048 #include <executescript/iexecutescriptplugin.h>
0049 #include <iexecutebrowserplugin.h>
0050 
0051 #include "debugsession.h"
0052 #include "launchconfig.h"
0053 #include "debuggerdebug.h"
0054 
0055 K_PLUGIN_FACTORY_WITH_JSON(KDevXDebugDebuggerFactory, "kdevxdebug.json",
0056                            registerPlugin<XDebug::XDebugPlugin>();)
0057 
0058 namespace XDebug {
0059 XDebugPlugin::XDebugPlugin(QObject* parent, const QVariantList&) :
0060     KDevelop::IPlugin(QStringLiteral("kdevxdebug"), parent)
0061 {
0062     core()->debugController()->initializeUi();
0063 
0064     qCDebug(KDEV_PHP_DEBUGGER);
0065 //     connect(m_server, SIGNAL(sessionStarted(DebugSession*)), SLOT(sessionStarted(DebugSession*)));
0066 //     connect(m_server, SIGNAL(outputLine(DebugSession*,QString,KDevelop::IRunProvider::OutputTypes)), SLOT(outputLine(DebugSession*,QString,KDevelop::IRunProvider::OutputTypes)));
0067 //     connect(m_server, SIGNAL(stateChanged(DebugSession*,KDevelop::IDebugSession::DebuggerState)), SLOT(debuggerStateChanged(DebugSession*,KDevelop::IDebugSession::DebuggerState)));
0068     {
0069         IExecuteScriptPlugin* iface = KDevelop::ICore::self()->pluginController()->pluginForExtension("org.kdevelop.IExecuteScriptPlugin")->extension<IExecuteScriptPlugin>();
0070         Q_ASSERT(iface);
0071         KDevelop::LaunchConfigurationType* type = core()->runController()->launchConfigurationTypeForId(iface->scriptAppConfigTypeId());
0072         Q_ASSERT(type);
0073         type->addLauncher(new XDebugLauncher(this));
0074     }
0075     {
0076         IExecuteBrowserPlugin* iface = KDevelop::ICore::self()->pluginController()->pluginForExtension("org.kdevelop.IExecuteBrowserPlugin")->extension<IExecuteBrowserPlugin>();
0077         Q_ASSERT(iface);
0078         KDevelop::LaunchConfigurationType* type = core()->runController()->launchConfigurationTypeForId(iface->browserAppConfigTypeId());
0079         Q_ASSERT(type);
0080         type->addLauncher(new XDebugBrowserLauncher(this));
0081     }
0082 }
0083 
0084 XDebugPlugin::~XDebugPlugin()
0085 {
0086 }
0087 
0088 DebugSession* XDebugPlugin::createSession() const
0089 {
0090     DebugSession* session = new DebugSession();
0091     KDevelop::ICore::self()->debugController()->addSession(session);
0092     return session;
0093 }
0094 
0095 /*
0096 
0097    void XDebugPlugin::sessionStarted(DebugSession* session)
0098    {
0099     qCDebug(KDEV_PHP_DEBUGGER) << session;
0100     KDevelop::ICore::self()->debugController()->addSession(session);
0101    }
0102 
0103    void XDebugPlugin::outputLine(XDebug::DebugSession* session, QString line, KDevelop::IRunProvider::OutputTypes type)
0104    {
0105     if (session->process() && m_jobs.contains(session->process())) {
0106         emit output(m_jobs[session->process()], line, type);
0107     }
0108    }
0109 
0110    bool XDebugPlugin::execute(const KDevelop::IRun & run, KJob* job)
0111    {
0112     Q_ASSERT(instrumentorsProvided().contains(run.instrumentor()));
0113 
0114     QString path = run.executable().toLocalFile();
0115     if (path.endsWith("php")) {
0116         path = "";
0117     }
0118     path += " " + run.arguments().join(" ");
0119     path = path.trimmed();
0120     qCDebug(KDEV_PHP_DEBUGGER) << path;
0121 
0122     KProcess* process = m_server->startDebugger(path);
0123     m_jobs[process] = job;
0124 
0125     return !!job;
0126    }
0127 
0128    void XDebugPlugin::abort(KJob* job) {
0129 
0130    }
0131 
0132 
0133    void XDebugPlugin::debuggerStateChanged(DebugSession* session, KDevelop::IDebugSession::DebuggerState state)
0134    {
0135     switch (state) {
0136         case KDevelop::IDebugSession::StartingState:
0137         case KDevelop::IDebugSession::ActiveState:
0138             break;
0139         case KDevelop::IDebugSession::PausedState:
0140             break;
0141         case KDevelop::IDebugSession::NotStartedState:
0142         case KDevelop::IDebugSession::StoppingState:
0143         case KDevelop::IDebugSession::StoppedState:
0144             if (session->process() && m_jobs.contains(session->process())) {
0145                 emit finished(m_jobs[session->process()]);
0146             }
0147             break;
0148     }
0149    }
0150  */
0151 }
0152 
0153 #include "xdebugplugin.moc"