diff options
author | toma <toma@283d02a7-25f6-0310-bc7c-ecb5cbfe19da> | 2009-11-25 17:56:58 +0000 |
---|---|---|
committer | toma <toma@283d02a7-25f6-0310-bc7c-ecb5cbfe19da> | 2009-11-25 17:56:58 +0000 |
commit | e9ae80694875f869892f13f4fcaf1170a00dea41 (patch) | |
tree | aa2f8d8a217e2d376224c8d46b7397b68d35de2d /quanta/components/debugger/pathmapper.cpp | |
download | tdewebdev-e9ae80694875f869892f13f4fcaf1170a00dea41.tar.gz tdewebdev-e9ae80694875f869892f13f4fcaf1170a00dea41.zip |
Copy the KDE 3.5 branch to branches/trinity for new KDE 3.5 features.
BUG:215923
git-svn-id: svn://anonsvn.kde.org/home/kde/branches/trinity/kdewebdev@1054174 283d02a7-25f6-0310-bc7c-ecb5cbfe19da
Diffstat (limited to 'quanta/components/debugger/pathmapper.cpp')
-rw-r--r-- | quanta/components/debugger/pathmapper.cpp | 228 |
1 files changed, 228 insertions, 0 deletions
diff --git a/quanta/components/debugger/pathmapper.cpp b/quanta/components/debugger/pathmapper.cpp new file mode 100644 index 00000000..194355d7 --- /dev/null +++ b/quanta/components/debugger/pathmapper.cpp @@ -0,0 +1,228 @@ +/*************************************************************************** + pathmapper.h + ------------------------ + begin : 2004-10-10 + copyright : (C) 2004 Linus McCabe + + ***************************************************************************/ + +/**************************************************************************** + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + ***************************************************************************/ + +#include "pathmapper.h" +#include "pathmapperdialog.h" + +#include "quantacommon.h" +#include "project.h" + +#include <kdebug.h> +#include <klocale.h> +#include <qstring.h> +#include <qextfileinfo.h> +#include <qdom.h> + +PathMapper::PathMapper(QObject *parent, const char *name) + : QObject(parent, name) +{ + +} + +PathMapper::PathMapper() +{ + +} + +QString PathMapper::translate(const QString & path, const QString & from, const QString &to) +{ + QString translated = path; + + // Check if this dir is matched by the maps + if(path.startsWith(from, false)) + { + translated.remove(0, from.length()); + translated = to + translated; + } + + return translated; +} + +QString PathMapper::mapLocalPathToServer(const QString &localpath) +{ + if(localpath.isEmpty()) + return localpath; + + if(m_localBasedir == "/" && m_serverBasedir == "/") + return localpath; + + QString newpath = translate(localpath, m_localBasedir, m_serverBasedir); + + // If no translation occurred, check and see if some of the other translations does + if(newpath == localpath) + { + for (unsigned int cnt = 0; cnt < m_serverlist.count(); cnt++ ) + { + // If the entire filename matches, count it as a match even if there is no difference + if(m_locallist[cnt] == localpath) + return localpath; + + // If both are slashes, count it as a local project + if(m_locallist[cnt] == "/" && m_serverlist[cnt] == "/") + return localpath; + + // Check if it translates into something + newpath = translate(localpath, m_locallist[cnt], m_serverlist[cnt]); + if(newpath != localpath) + { + addHistory(localpath, newpath, true); + return newpath; + } + } + + // No translation found -> show dialog + PathMapperDialog pmdlg(localpath, PathMapperDialog::LocalToServer); + for (unsigned int cnt = 0; cnt < m_serverlist.count(); cnt++ ) + pmdlg.addHistory(m_serverlist[cnt], m_locallist[cnt]); + + if(pmdlg.exec() == QDialog::Accepted ) + { + newpath = translate(localpath, pmdlg.localPath(), pmdlg.serverPath()); + addHistory(pmdlg.localPath(), pmdlg.serverPath(), newpath != localpath); + + return newpath; + } + return localpath; + } + return newpath; +} + +QString PathMapper::mapServerPathToLocal(const QString &serverpath) +{ + QString newpath; + if(serverpath.isEmpty()) + return serverpath; + + newpath = translate(serverpath, m_serverBasedir, m_localBasedir); + + // Check if this dir is matched by the basedirs + if(QExtFileInfo::exists(newpath, true, 0L)) + return newpath; + + // Check if any previous mappings fit... + for (unsigned int cnt = 0; cnt < m_serverlist.count(); cnt++ ) + { + newpath = translate(serverpath, m_serverlist[cnt], m_locallist[cnt]); + if(QExtFileInfo::exists(newpath, true, 0L)) + return newpath; + } + + // If the basedirs didnt match, check if the file exists, + // otherwise scan through the mapping history or show the + // mapping dialog + if(!QExtFileInfo::exists(serverpath, true, 0L)) + { + PathMapperDialog pmdlg(serverpath, PathMapperDialog::ServerToLocal); + for (unsigned int cnt = 0; cnt < m_serverlist.count(); cnt++ ) + pmdlg.addHistory(m_serverlist[cnt], m_locallist[cnt]); + + if(pmdlg.exec() == QDialog::Accepted ) + { + addHistory(pmdlg.localPath(), pmdlg.serverPath(), true); + newpath = translate(serverpath, pmdlg.localPath(), pmdlg.serverPath()); + return newpath; + } + } + + return serverpath; +} + +void PathMapper::setLocalBasedir(const QString &localpath) +{ + m_localBasedir = localpath; +} +void PathMapper::setServerBasedir(const QString &serverpath) +{ + m_serverBasedir = serverpath; +} + +QDomNode PathMapper::pathMapperNode() +{ + QDomNode nodeThisDbg; + QDomDocument *dom = Project::ref()->sessionDom(); + QDomNode projectNode = dom->firstChild().firstChild(); + QDomNode nodeDbg = projectNode.namedItem("debuggers"); + if(nodeDbg.isNull()) + { + nodeDbg = dom->createElement("debuggers"); + projectNode.appendChild(nodeDbg); + } + + // Find the pathmapper section + nodeThisDbg = nodeDbg.namedItem("pathmapper"); + if(nodeThisDbg.isNull()) + { + nodeThisDbg = dom->createElement("pathmapper"); + nodeDbg.appendChild(nodeThisDbg); + } + + return nodeThisDbg; +} + +void PathMapper::addHistory(const QString &localpath, const QString &serverpath, bool saveinproject) +{ + bool exists = false; + for (unsigned int cnt = 0; cnt < m_serverlist.count() && !exists; cnt++ ) + if(m_serverlist[cnt] == serverpath && m_locallist[cnt] == localpath) + exists = true; + + if(!exists) + { + if(saveinproject) + { + QDomNode node = pathMapperNode(); + QDomNode newnode = Project::ref()->dom()->createElement("mapping"); + + QDomAttr serverattr = Project::ref()->dom()->createAttribute("serverpath"); + serverattr.setValue(serverpath); + QDomAttr localattr = Project::ref()->dom()->createAttribute("localpath"); + localattr.setValue(localpath); + + newnode.attributes().setNamedItem(serverattr); + newnode.attributes().setNamedItem(localattr); + + node = node.namedItem("mappings"); + node.insertAfter(newnode, node.lastChild()); + } + + m_serverlist.append(serverpath); + m_locallist.append(localpath); + } + +} + +void PathMapper::readConfig() +{ + QDomNode node = pathMapperNode(); + + // Server + QDomNode valuenode = node.namedItem("mappings"); + QDomNode child = valuenode.firstChild(); + QString serverpath, localpath; + while(!child.isNull()) + { + serverpath = child.attributes().namedItem("serverpath").nodeValue(); + localpath = child.attributes().namedItem("localpath").nodeValue(); + kdDebug(24002) << "PathMapper::readConfig " << serverpath << ", " << localpath << endl; + + m_serverlist.append(serverpath); + m_locallist.append(localpath); + child = child.nextSibling(); + } +} + +#include "pathmapper.moc" |