diff --git a/src/kde/kioslave/recoll/CMakeLists.txt b/src/kde/kioslave/recoll/CMakeLists.txt index 06d6da09..ed553b98 100644 --- a/src/kde/kioslave/recoll/CMakeLists.txt +++ b/src/kde/kioslave/recoll/CMakeLists.txt @@ -105,6 +105,10 @@ CHECK_LIBRARY_EXISTS(dl dlopen "" DLOPEN_IN_LIBDL) IF(DLOPEN_IN_LIBDL) LIST(APPEND EXTRA_LIBS dl) ENDIF(DLOPEN_IN_LIBDL) +CHECK_LIBRARY_EXISTS(pthread pthread_sigmask "" PTHREAD_IN_LIBPTHREAD) +IF(PTHREAD_IN_LIBPTHREAD) + LIST(APPEND EXTRA_LIBS pthread) +ENDIF(PTHREAD_IN_LIBPTHREAD) kde4_add_plugin(kio_recoll ${kio_recoll_SRCS}) diff --git a/src/kde/kioslave/recoll/dirif.cpp b/src/kde/kioslave/recoll/dirif.cpp index ffb10e5f..0678f53e 100644 --- a/src/kde/kioslave/recoll/dirif.cpp +++ b/src/kde/kioslave/recoll/dirif.cpp @@ -1,5 +1,5 @@ #ifndef lint -static char rcsid[] = "@(#$Id: dirif.cpp,v 1.1 2008-11-26 15:03:41 dockes Exp $ (C) 2008 J.F.Dockes"; +static char rcsid[] = "@(#$Id: dirif.cpp,v 1.2 2008-11-27 17:48:43 dockes Exp $ (C) 2008 J.F.Dockes"; #endif /* * This program is free software; you can redistribute it and/or modify @@ -66,33 +66,88 @@ const UDSEntry resultToUDSEntry(Rcl::Doc doc) entry.insert( KIO::UDSEntry::UDS_CREATION_TIME, info.st_ctime); } - // entry.insert(KIO::UDSEntry::UDS_URL, doc.url.c_str()); + entry.insert(KIO::UDSEntry::UDS_TARGET_URL, doc.url.c_str()); // entry.insert(KIO::UDSEntry::UDS_URL, "recoll://search/query/1"); return entry; } -// Don't know that we really need this. It's used by beagle to return -// info on the virtual entries used to execute commands, and on the -// saved searches (appearing as directories) void RecollProtocol::stat(const KUrl & url) { kDebug() << url << endl ; QString path = url.path(); KIO::UDSEntry entry; - entry.insert(KIO::UDSEntry::UDS_NAME, url.path()); - entry.insert(KIO::UDSEntry::UDS_URL, url.url()); + if (!path.compare("/")) + entry.insert(KIO::UDSEntry::UDS_NAME, "/welcome"); + else + entry.insert(KIO::UDSEntry::UDS_NAME, url.path()); + entry.insert(KIO::UDSEntry::UDS_TARGET_URL, url.url()); entry.insert(KIO::UDSEntry::UDS_FILE_TYPE, S_IFREG); statEntry(entry); finished(); } +// From kio_beagle +void RecollProtocol::createRootEntry(KIO::UDSEntry& entry) +{ + // home directory + entry.clear(); + entry.insert( KIO::UDSEntry::UDS_NAME, "."); + entry.insert( KIO::UDSEntry::UDS_FILE_TYPE, S_IFDIR); + entry.insert( KIO::UDSEntry::UDS_ACCESS, 0700); + entry.insert( KIO::UDSEntry::UDS_MIME_TYPE, "inode/directory"); +} + +void RecollProtocol::createGoHomeEntry(KIO::UDSEntry& entry) +{ + // status file + entry.clear(); + entry.insert(KIO::UDSEntry::UDS_NAME, "Recoll home (click me)"); + entry.insert(KIO::UDSEntry::UDS_FILE_TYPE, S_IFREG); + entry.insert(KIO::UDSEntry::UDS_TARGET_URL, "recoll:///welcome"); + entry.insert(KIO::UDSEntry::UDS_ACCESS, 0500); + entry.insert(KIO::UDSEntry::UDS_MIME_TYPE, "text/html"); + entry.insert(KIO::UDSEntry::UDS_ICON_NAME, "recoll"); +} + + void RecollProtocol::listDir(const KUrl& url) { kDebug() << url << endl; + + // It seems that when the request is from konqueror + // autocompletion it comes with a / at the end, which offers + // an opportunity to not perform it. + if (url.path() != "/" && url.path().endsWith("/")) { + kDebug() << "Endswith/" << endl; + error(-1, ""); + return; + } + if (!m_initok || !maybeOpenDb(m_reason)) { - error(KIO::ERR_SLAVE_DEFINED, "Init error"); + string reason = "RecollProtocol::listDir: Init error:" + m_reason; + error(KIO::ERR_SLAVE_DEFINED, reason.c_str()); + return; + } + if (url.path().isEmpty() || url.path() == "/") { + kDebug() << "list /" << endl; + + UDSEntryList entries; + KIO::UDSEntry entry; + + // entry for '/' + createRootEntry(entry); + // listEntry(entry, false); + entries.append(entry); + + // entry for 'Information' + createGoHomeEntry(entry); + // listEntry(entry, false); + entries.append(entry); + + listEntries(entries); + finished(); return; } @@ -100,19 +155,20 @@ void RecollProtocol::listDir(const KUrl& url) URLToQuery(url, query, opt); kDebug() << "Query: " << query; if (!query.isEmpty()) { - doSearch(query, opt.toUtf8().at(0)); + if (!doSearch(query, opt.toUtf8().at(0))) + return; } else { finished(); return; } vector page; - int pagelen = m_source->getSeqSlice(0, 20, page); + int pagelen = m_source->getSeqSlice(0, 100, page); kDebug() << "Got " << pagelen << " results."; UDSEntryList entries; for (int i = 0; i < pagelen; i++) { entries.append(resultToUDSEntry(page[i].doc)); } listEntries(entries); - // finished(); + finished(); } diff --git a/src/kde/kioslave/recoll/htmlif.cpp b/src/kde/kioslave/recoll/htmlif.cpp index 78fba888..f12a408e 100644 --- a/src/kde/kioslave/recoll/htmlif.cpp +++ b/src/kde/kioslave/recoll/htmlif.cpp @@ -1,5 +1,5 @@ #ifndef lint -static char rcsid[] = "@(#$Id: htmlif.cpp,v 1.1 2008-11-26 15:03:41 dockes Exp $ (C) 2005 J.F.Dockes"; +static char rcsid[] = "@(#$Id: htmlif.cpp,v 1.2 2008-11-27 17:48:43 dockes Exp $ (C) 2005 J.F.Dockes"; #endif /* * This program is free software; you can redistribute it and/or modify @@ -72,7 +72,7 @@ const string &RecollKioPager::parFormat() string RecollKioPager::pageTop() { - return "

New Search

"; + return "

New Search

"; } string RecollKioPager::nextUrl() @@ -148,9 +148,10 @@ void RecollProtocol::queryDetails() void RecollProtocol::htmlDoSearch(const QString& q, char opt) { - kDebug() << endl; + kDebug() << "htmlDoSearch" << endl; + if (!doSearch(q, opt)) + return; mimeType("text/html"); - doSearch(q, opt); m_pager.setDocSource(m_source); m_pager.resultPageNext(); m_pager.displayPage(); diff --git a/src/kde/kioslave/recoll/kio_recoll.cpp b/src/kde/kioslave/recoll/kio_recoll.cpp index 2e17a826..ea1dfa9f 100644 --- a/src/kde/kioslave/recoll/kio_recoll.cpp +++ b/src/kde/kioslave/recoll/kio_recoll.cpp @@ -1,5 +1,5 @@ #ifndef lint -static char rcsid[] = "@(#$Id: kio_recoll.cpp,v 1.16 2008-11-26 15:03:41 dockes Exp $ (C) 2005 J.F.Dockes"; +static char rcsid[] = "@(#$Id: kio_recoll.cpp,v 1.17 2008-11-27 17:48:43 dockes Exp $ (C) 2005 J.F.Dockes"; #endif /* * This program is free software; you can redistribute it and/or modify @@ -119,10 +119,11 @@ bool RecollProtocol::maybeOpenDb(string &reason) void RecollProtocol::mimetype(const KUrl &url) { kDebug() << url << endl; - if (0) - mimeType("text/html"); - else +#ifdef USEDIRMODEL mimeType("inode/directory"); +#else + mimeType("text/html"); +#endif finished(); } @@ -139,6 +140,8 @@ bool RecollProtocol::URLToQuery(const KUrl &url, QString& q, QString& opt) opt = "l"; } } + if (q.startsWith("/")) + q.remove(0,1); return true; } @@ -147,18 +150,21 @@ void RecollProtocol::get(const KUrl & url) kDebug() << url << endl; if (!m_initok || !maybeOpenDb(m_reason)) { - error(KIO::ERR_SLAVE_DEFINED, "Init error"); + string reason = "RecollProtocol::get:Init error: " + m_reason; + error(KIO::ERR_SLAVE_DEFINED, reason.c_str()); return; } +#ifdef USEDIRMODEL error(KIO::ERR_IS_DIRECTORY, QString::null); return; +#endif QString host = url.host(); QString path = url.path(); kDebug() << "host:" << host << " path:" << path; - if (host.isEmpty() && !path.compare("/")) { + if (host.isEmpty() && (!path.compare("/")||!path.compare("/welcome"))) { // recoll:/ welcomePage(); goto out; @@ -202,7 +208,7 @@ void RecollProtocol::get(const KUrl & url) kDebug() << "done" << endl; } -void RecollProtocol::doSearch(const QString& q, char opt) +bool RecollProtocol::doSearch(const QString& q, char opt) { kDebug() << q << endl; string qs = (const char *)q.toUtf8(); @@ -231,33 +237,37 @@ void RecollProtocol::doSearch(const QString& q, char opt) sd = wasaStringToRcl(qs, m_reason); } if (!sd) { - m_reason = "Internal Error: cant allocate new query"; - outputError(m_reason.c_str()); + kDebug() << "Could not build search data from user string"; + m_reason = "Internal Error: cant build search"; + error(-1, m_reason.c_str()); finished(); - return; + return false; } RefCntr sdata(sd); sdata->setStemlang("english"); - kDebug() << "Building query"; + kDebug() << "Executing query"; RefCntrquery(new Rcl::Query(m_rcldb)); if (!query->setQuery(sdata)) { - m_reason = "Internal Error: setQuery failed"; - outputError(m_reason.c_str()); + m_reason = "Internal Error: query execute failed"; + error(-1, m_reason.c_str()); finished(); - return; + kDebug() << "setQuery failed, returning"; + return false; } + kDebug() << "Building docsequence"; DocSequenceDb *src = new DocSequenceDb(RefCntr(query), "Query results", sdata); if (src == 0) { kDebug() << "Cant' build result sequence"; - error(-1, QString::null); + error(-1, "Can't build result sequence"); finished(); - return; + return false; } kDebug() << "Setting source"; m_source = RefCntr(src); + return true; } // Note: KDE_EXPORT is actually needed on Unix when building with diff --git a/src/kde/kioslave/recoll/kio_recoll.h b/src/kde/kioslave/recoll/kio_recoll.h index f6f06889..803f44df 100644 --- a/src/kde/kioslave/recoll/kio_recoll.h +++ b/src/kde/kioslave/recoll/kio_recoll.h @@ -1,5 +1,5 @@ #ifndef _RECOLL_H -/* @(#$Id: kio_recoll.h,v 1.7 2008-11-26 15:03:41 dockes Exp $ (C) 2005 J.F.Dockes */ +/* @(#$Id: kio_recoll.h,v 1.8 2008-11-27 17:48:43 dockes Exp $ (C) 2005 J.F.Dockes */ #define _RECOLL_H /* * This program is free software; you can redistribute it and/or modify @@ -64,17 +64,19 @@ class RecollProtocol : public KIO::SlaveBase { virtual void get(const KUrl & url ); virtual void stat(const KUrl & url); virtual void listDir(const KUrl& url); - + static RclConfig *o_rclconfig; private: bool maybeOpenDb(string &reason); void outputError(const QString& errmsg); - void doSearch(const QString& q, char opt = 'l'); + bool doSearch(const QString& q, char opt = 'l'); void welcomePage(); void queryDetails(); void htmlDoSearch(const QString& q, char opt); bool URLToQuery(const KUrl &url, QString& q, QString& opt); + void createRootEntry(KIO::UDSEntry& entry); + void createGoHomeEntry(KIO::UDSEntry& entry); bool m_initok; Rcl::Db *m_rcldb; diff --git a/src/kde/kioslave/recoll/notes.txt b/src/kde/kioslave/recoll/notes.txt index 48d7dc56..762993fb 100644 --- a/src/kde/kioslave/recoll/notes.txt +++ b/src/kde/kioslave/recoll/notes.txt @@ -10,3 +10,19 @@ Au lieu de /usr/lib/kde4/share/kde4/apps/ recoll avec --target=/usr pour que les fichiers de config soient au bon endroit + +Sur kubuntu 8.10 (a jour au 2008-27-11), cmake genere une dependance sur +/build/buildd/kde4libs-4.1.2/obj-i486-linux-gnu/lib/libkdecore.so dans +CMakeFiles/kio_recoll.dir/build.make +Pas trouve le moyen de corriger, il faut editer la ligne et remplacer +par /usr/lib/.. + + +Debug areas: /usr/share/kde4/config/kdebug.areas +kdebugdialog [--fullmode] pour configurer +./.kde/share/config/kdebugrc +Output to ~/.xession-errors par defaut controle ? + + +Probleme quand l'url se termine par un / et qu'on edite le mot, +konqueror lance une recherche a chaque lettre. diff --git a/src/kde/kioslave/recoll/recoll.protocol b/src/kde/kioslave/recoll/recoll.protocol index 27f941d4..1907f620 100644 --- a/src/kde/kioslave/recoll/recoll.protocol +++ b/src/kde/kioslave/recoll/recoll.protocol @@ -5,7 +5,8 @@ input=none output=filesystem listing=Name,Type, URL reading=true -defaultMimeType=inode/directory +#defaultMimeType=inode/directory +defaultMimeType=text/html Icon=help_index Class=:local URIMode=rawuri