[prev in list] [next in list] [prev in thread] [next in thread] 

List:       kde-panel-devel
Subject:    Re: Making paths case insensitive in krunner
From:       "Diaa Sami" <diaasami () gmail ! com>
Date:       2009-01-19 17:56:57
Message-ID: 1232387817.4353.1295602247 () webmail ! messagingengine ! com
[Download RAW message or body]


The previous patch had some mistakes, please use this one instead

Index: kdelibs/plasma/runnercontext.cpp
===================================================================
--- kdelibs/plasma/runnercontext.cpp	(revision 911086)
+++ kdelibs/plasma/runnercontext.cpp	(working copy)
@@ -47,6 +47,115 @@
 namespace Plasma
 {
 
+/*
+Corrects the case of the last component in a path (e.g. /usr/liB -> /usr/lib)
+path: The path to be processed.
+correctCasePath: The corrected-case path
+mustBeDir: Tells whether the last component is a folder or doesn't matter
+Returns true on success and false on error, in case of error, correctCasePath is not \
modified +*/
+bool CorrectLastComponentCase(const QString &path, QString *correctCasePath, const \
bool mustBeDir) +    {
+    const QFileInfo pathInfo(path);
+
+    const QDir fileDir = pathInfo.dir();
+    qDebug() << "Directory is" << fileDir;
+
+    const QString filename = pathInfo.fileName();
+    qDebug() << "Filename is" << filename;
+
+    qDebug() << "searching for a" << (mustBeDir ? "directory" : "directory/file");
+
+    const QStringList matchingFilenames = fileDir.entryList(QStringList(filename),
+            mustBeDir ? QDir::Dirs : QDir::NoFilter);
+
+    if (matchingFilenames.empty())
+        {
+        qDebug() << "No matches found!!\n";
+        return false;
+        }
+    else
+        {
+        if (matchingFilenames.size() > 1)
+            {
+            qDebug() << "Found multiple matches!!\n";
+            }
+
+        *correctCasePath = fileDir.path() + QDir::separator() + \
matchingFilenames[0];         +        if (correctCasePath->startsWith("//"))
+            {
+            correctCasePath->remove(0, 1);
+            }
+
+        return true;
+        }
+    }
+
+/*
+Corrects the case of a path (e.g. /uSr/loCAL/bIN -> /usr/local/bin)
+path: The path to be processed.
+corrected: The corrected-case path
+Returns true on success and false on error, in case of error, corrected is not \
modified +*/
+bool CorrectPathCase(const QString path, QString *corrected)
+    {
+  // early exit check
+        if (QFile::exists(path))
+            {
+            *corrected = path;
+            return true;
+            }
+
+  // path components
+    QStringList components = QString(path).split(QDir::separator());
+
+    const bool mustBeDir = components.back() == "";
+
+    qDebug() << "Components are" << components;
+
+    QString correctPath;
+
+    if (components.back() == "")
+        {
+        components.pop_back();
+        }
+
+    Q_ASSERT(components.size() > 1);
+
+        if (components.size() == 1)
+            return false;
+ 
+    const unsigned initialComponents = components.size();
+    for (unsigned i = 0; i < initialComponents - 1; i ++)
+        {
+        const QString tmp = components[0] + QDir::separator() + components[1];
+
+        qDebug() << "Correcting " << tmp;
+
+        // If the file already exists then no need to search for it
+        if (QFile::exists(tmp))
+            {
+            correctPath = tmp; 
+            }
+        else
+            {
+            if (CorrectLastComponentCase(tmp, &correctPath, components.size() > 2 || \
mustBeDir) == false) +                {
+                qDebug() << "search was not successfull";
+                return false;
+                }
+            }
+
+        components.removeFirst();
+        components[0] = correctPath;
+
+        qDebug() << "Correct path is" << correctPath;
+        }
+
+    *corrected = correctPath;
+        return true;
+    }
+
 class RunnerContextPrivate : public QSharedData
 {
     public:
@@ -88,9 +197,11 @@
                                      RunnerContext::Executable;
             } else {
                 KUrl url(term);
+                QString correctCasePath;
                 if (!url.protocol().isEmpty() && !url.isLocalFile()) {
                     type = RunnerContext::NetworkLocation;
-                } else if (QFile::exists(path)) {
+                } else if (CorrectPathCase(path, &correctCasePath)) {
+		    path = correctCasePath;
                     QFileInfo info(path);
                     if (info.isSymLink()) {
                         path = info.canonicalFilePath();
_______________________________________________
Plasma-devel mailing list
Plasma-devel@kde.org
https://mail.kde.org/mailman/listinfo/plasma-devel


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic