summaryrefslogtreecommitdiffstats
path: root/kio/kfile/krecentdocument.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'kio/kfile/krecentdocument.cpp')
-rw-r--r--kio/kfile/krecentdocument.cpp177
1 files changed, 177 insertions, 0 deletions
diff --git a/kio/kfile/krecentdocument.cpp b/kio/kfile/krecentdocument.cpp
new file mode 100644
index 000000000..9b3d4f75f
--- /dev/null
+++ b/kio/kfile/krecentdocument.cpp
@@ -0,0 +1,177 @@
+/* -*- c++ -*-
+ * Copyright (C)2000 Daniel M. Duley <mosfet@kde.org>
+ *
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ */
+#include <krecentdocument.h>
+#include <ksimpleconfig.h>
+#include <kstandarddirs.h>
+#include <kapplication.h>
+#include <kurl.h>
+#include <kdebug.h>
+#include <kmimetype.h>
+#include <kdesktopfile.h>
+#include <qdir.h>
+#include <qfileinfo.h>
+#include <qtextstream.h>
+#include <qstringlist.h>
+#include <qregexp.h>
+
+#include <sys/types.h>
+#include <utime.h>
+
+QString KRecentDocument::recentDocumentDirectory()
+{
+ // need to change this path, not sure where
+ return locateLocal("data", QString::fromLatin1("RecentDocuments/"));
+}
+
+QStringList KRecentDocument::recentDocuments()
+{
+ QDir d(recentDocumentDirectory(), "*.desktop", QDir::Time,
+ QDir::Files | QDir::Readable | QDir::Hidden);
+
+ if (!d.exists())
+ d.mkdir(recentDocumentDirectory());
+
+ QStringList list = d.entryList();
+ QStringList fullList;
+
+ for (QStringList::ConstIterator it = list.begin(); it != list.end(); ++it) {
+ QString pathDesktop = d.absFilePath( *it );
+ KDesktopFile tmpDesktopFile( pathDesktop, false);
+ KURL urlDesktopFile(tmpDesktopFile.readURL());
+ if( urlDesktopFile.isLocalFile() && !QFile(urlDesktopFile.path()).exists())
+ d.remove(pathDesktop);
+ else
+ fullList.append( pathDesktop );
+ }
+
+ return fullList;
+}
+
+void KRecentDocument::add(const KURL& url)
+{
+ KRecentDocument::add(url, qApp->argv()[0]); // ### argv[0] might not match the service filename!
+}
+
+void KRecentDocument::add(const KURL& url, const QString& desktopEntryName)
+{
+ if ( url.isLocalFile() && !KGlobal::dirs()->relativeLocation("tmp", url.path()).startsWith("/"))
+ return;
+
+ QString openStr = url.url();
+ openStr.replace( QRegExp("\\$"), "$$" ); // Desktop files with type "Link" are $-variable expanded
+
+ kdDebug(250) << "KRecentDocument::add for " << openStr << endl;
+ KConfig *config = KGlobal::config();
+ QString oldGrp = config->group();
+ config->setGroup(QString::fromLatin1("RecentDocuments"));
+ bool useRecent = config->readBoolEntry(QString::fromLatin1("UseRecent"), true);
+ int maxEntries = config->readNumEntry(QString::fromLatin1("MaxEntries"), 10);
+
+ config->setGroup(oldGrp);
+ if(!useRecent)
+ return;
+
+ QString path = recentDocumentDirectory();
+
+ QString dStr = path + url.fileName();
+
+ QString ddesktop = dStr + QString::fromLatin1(".desktop");
+
+ int i=1;
+ // check for duplicates
+ while(QFile::exists(ddesktop)){
+ // see if it points to the same file and application
+ KSimpleConfig tmp(ddesktop);
+ tmp.setDesktopGroup();
+ if(tmp.readEntry(QString::fromLatin1("X-KDE-LastOpenedWith"))
+ == desktopEntryName)
+ {
+ utime(QFile::encodeName(ddesktop), NULL);
+ return;
+ }
+ // if not append a (num) to it
+ ++i;
+ if ( i > maxEntries )
+ break;
+ ddesktop = dStr + QString::fromLatin1("[%1].desktop").arg(i);
+ }
+
+ QDir dir(path);
+ // check for max entries, delete oldest files if exceeded
+ QStringList list = dir.entryList(QDir::Files | QDir::Hidden, QDir::Time | QDir::Reversed);
+ i = list.count();
+ if(i > maxEntries-1){
+ QStringList::Iterator it;
+ it = list.begin();
+ while(i > maxEntries-1){
+ QFile::remove(dir.absPath() + QString::fromLatin1("/") + (*it));
+ --i, ++it;
+ }
+ }
+
+ // create the applnk
+ KSimpleConfig conf(ddesktop);
+ conf.setDesktopGroup();
+ conf.writeEntry( QString::fromLatin1("Type"), QString::fromLatin1("Link") );
+ conf.writePathEntry( QString::fromLatin1("URL"), openStr );
+ // If you change the line below, change the test in the above loop
+ conf.writeEntry( QString::fromLatin1("X-KDE-LastOpenedWith"), desktopEntryName );
+ QString name = url.fileName();
+ if (name.isEmpty())
+ name = openStr;
+ conf.writeEntry( QString::fromLatin1("Name"), name );
+ conf.writeEntry( QString::fromLatin1("Icon"), KMimeType::iconForURL( url ) );
+}
+
+void KRecentDocument::add(const QString &openStr, bool isUrl)
+{
+ if( isUrl ) {
+ add( KURL( openStr ) );
+ } else {
+ KURL url;
+ url.setPath( openStr );
+ add( url );
+ }
+}
+
+void KRecentDocument::clear()
+{
+ QStringList list = recentDocuments();
+ QDir dir;
+ for(QStringList::Iterator it = list.begin(); it != list.end() ; ++it)
+ dir.remove(*it);
+}
+
+int KRecentDocument::maximumItems()
+{
+ KConfig *config = KGlobal::config();
+ KConfigGroupSaver sa(config, QString::fromLatin1("RecentDocuments"));
+ return config->readNumEntry(QString::fromLatin1("MaxEntries"), 10);
+}
+
+