Switch to side-by-side view

--- a/src/kde/kioslave/kio_recoll/dirif.cpp
+++ b/src/kde/kioslave/kio_recoll/dirif.cpp
@@ -59,28 +59,28 @@
 
     // Basic checks
     if (!url.host().isEmpty() || url.path().isEmpty() || 
-	(url.protocol().compare("recoll") && url.protocol().compare("recollf")))
-	return false;
+        (url.protocol().compare("recoll") && url.protocol().compare("recollf")))
+        return false;
     QString path = url.path();
     if (!path.startsWith("/")) 
-	return false;
+        return false;
 
     // Look for the last '/' and check if it is followed by
     // resultBaseName (riiiight...)
     int slashpos = path.lastIndexOf("/");
     if (slashpos == -1 || slashpos == 0 || slashpos == path.length() -1)
-	return false;
+        return false;
     slashpos++;
     //kDebug() << "Comparing " << path.mid(slashpos, resultBaseName.length()) <<
-    //	"and " << resultBaseName;
+    //  "and " << resultBaseName;
     if (path.mid(slashpos, resultBaseName.length()).compare(resultBaseName))
-	return false;
+        return false;
 
     // Extract the result number
     QString snum = path.mid(slashpos + resultBaseName.length());
     sscanf(snum.toAscii(), "%d", num);
     if (*num == -1)
-	return false;
+        return false;
 
     //kDebug() << "URL analysis ok, num:" << *num;
 
@@ -103,22 +103,22 @@
     entry.insert(KIO::UDSEntry::UDS_NAME, resultBaseName + cnum);
 
     if (!doc.mimetype.compare("application/x-fsdirectory") || 
-	!doc.mimetype.compare("inode/directory")) {
-	entry.insert(KIO::UDSEntry::UDS_MIME_TYPE, "inode/directory");
-    	entry.insert( KIO::UDSEntry::UDS_FILE_TYPE, S_IFDIR);
+        !doc.mimetype.compare("inode/directory")) {
+        entry.insert(KIO::UDSEntry::UDS_MIME_TYPE, "inode/directory");
+        entry.insert( KIO::UDSEntry::UDS_FILE_TYPE, S_IFDIR);
     } else {
-	entry.insert(KIO::UDSEntry::UDS_MIME_TYPE, doc.mimetype.c_str());
-    	entry.insert( KIO::UDSEntry::UDS_FILE_TYPE, S_IFREG);
+        entry.insert(KIO::UDSEntry::UDS_MIME_TYPE, doc.mimetype.c_str());
+        entry.insert( KIO::UDSEntry::UDS_FILE_TYPE, S_IFREG);
     }
     entry.insert(KIO::UDSEntry::UDS_LOCAL_PATH, url.path());
     // For local files, supply the usual file stat information
     struct stat info;
     if (lstat(url.path().toAscii(), &info) >= 0) {
-	entry.insert( KIO::UDSEntry::UDS_SIZE, info.st_size);
-	entry.insert( KIO::UDSEntry::UDS_ACCESS, info.st_mode);
-	entry.insert( KIO::UDSEntry::UDS_MODIFICATION_TIME, info.st_mtime);
-    	entry.insert( KIO::UDSEntry::UDS_ACCESS_TIME, info.st_atime);
-    	entry.insert( KIO::UDSEntry::UDS_CREATION_TIME, info.st_ctime);
+        entry.insert( KIO::UDSEntry::UDS_SIZE, info.st_size);
+        entry.insert( KIO::UDSEntry::UDS_ACCESS, info.st_mode);
+        entry.insert( KIO::UDSEntry::UDS_MODIFICATION_TIME, info.st_mtime);
+        entry.insert( KIO::UDSEntry::UDS_ACCESS_TIME, info.st_atime);
+        entry.insert( KIO::UDSEntry::UDS_CREATION_TIME, info.st_ctime);
     }
     entry.insert(KIO::UDSEntry::UDS_TARGET_URL, doc.url.c_str());
 
@@ -153,13 +153,13 @@
 static void createGoHelpEntry(KIO::UDSEntry& entry)
 {
     QString location = 
-	KStandardDirs::locate("data", "kio_recoll/help.html");
+        KStandardDirs::locate("data", "kio_recoll/help.html");
     entry.clear();
     entry.insert(KIO::UDSEntry::UDS_NAME, "help");
     entry.insert(KIO::UDSEntry::UDS_DISPLAY_NAME, "Recoll help (click me first)");
     entry.insert(KIO::UDSEntry::UDS_FILE_TYPE, S_IFREG);
     entry.insert(KIO::UDSEntry::UDS_TARGET_URL, QString("file://") +
-		 location);
+                 location);
     entry.insert(KIO::UDSEntry::UDS_ACCESS, 0500);
     entry.insert(KIO::UDSEntry::UDS_MIME_TYPE, "text/html");
     entry.insert(KIO::UDSEntry::UDS_ICON_NAME, "help");
@@ -177,52 +177,52 @@
     QueryDesc qd;
     int num;
     if (ingest.isRootEntry(&rettp)) {
-	switch(rettp) {
-	case UrlIngester::UIRET_ROOT:
-	    createRootEntry(entry);
-	    break;
-	case UrlIngester::UIRET_HELP: 
-	    createGoHelpEntry(entry);
-	    break;
-	case UrlIngester::UIRET_SEARCH:
-	    createGoHomeEntry(entry);
-	    break;
-	default: 
-	    error(ERR_DOES_NOT_EXIST, "");
-	    break;
-	}
+        switch(rettp) {
+        case UrlIngester::UIRET_ROOT:
+            createRootEntry(entry);
+            break;
+        case UrlIngester::UIRET_HELP: 
+            createGoHelpEntry(entry);
+            break;
+        case UrlIngester::UIRET_SEARCH:
+            createGoHomeEntry(entry);
+            break;
+        default: 
+            error(ERR_DOES_NOT_EXIST, "");
+            break;
+        }
     } else if (ingest.isResult(&qd, &num)) {
-	if (syncSearch(qd)) {
-	    Rcl::Doc doc;
-	    if (num >= 0 && !m_source.isNull() && 
-		m_source->getDoc(num, doc)) {
-		entry = resultToUDSEntry(doc, num);
-	    } else {
-		error(ERR_DOES_NOT_EXIST, "");
-	    }
-	} else {
-	    // hopefully syncSearch() set the error?
-	}
+        if (syncSearch(qd)) {
+            Rcl::Doc doc;
+            if (num >= 0 && !m_source.isNull() && 
+                m_source->getDoc(num, doc)) {
+                entry = resultToUDSEntry(doc, num);
+            } else {
+                error(ERR_DOES_NOT_EXIST, "");
+            }
+        } else {
+            // hopefully syncSearch() set the error?
+        }
     } else if (ingest.isQuery(&qd)) {
-	// ie "recoll:/some string" or "recoll:/some string/" 
-	//
-	// We have a problem here. We'd like to let the user enter
-	// either form and get an html or a dir contents result,
-	// depending on the ending /. Otoh this makes the name space
-	// inconsistent, because /toto can't be a file (the html
-	// result page) while /toto/ would be a directory ? or can it
-	//
-	// Another approach would be to use different protocol names
-	// to avoid any possibility of mixups
-	if (m_alwaysdir || ingest.alwaysDir() || ingest.endSlashQuery()) {
-	    kDebug() << "Directory type";
-	    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");
-	    entry.insert(KIO::UDSEntry::UDS_NAME, qd.query);
-	    entry.insert( KIO::UDSEntry::UDS_MODIFICATION_TIME, time(0));
-	    entry.insert( KIO::UDSEntry::UDS_CREATION_TIME, time(0));
-	}
+        // ie "recoll:/some string" or "recoll:/some string/" 
+        //
+        // We have a problem here. We'd like to let the user enter
+        // either form and get an html or a dir contents result,
+        // depending on the ending /. Otoh this makes the name space
+        // inconsistent, because /toto can't be a file (the html
+        // result page) while /toto/ would be a directory ? or can it
+        //
+        // Another approach would be to use different protocol names
+        // to avoid any possibility of mixups
+        if (m_alwaysdir || ingest.alwaysDir() || ingest.endSlashQuery()) {
+            kDebug() << "Directory type";
+            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");
+            entry.insert(KIO::UDSEntry::UDS_NAME, qd.query);
+            entry.insert( KIO::UDSEntry::UDS_MODIFICATION_TIME, time(0));
+            entry.insert( KIO::UDSEntry::UDS_CREATION_TIME, time(0));
+        }
     }
     statEntry(entry);
     finished();
@@ -237,65 +237,73 @@
     QueryDesc qd;
 
     if (ingest.isRootEntry(&rettp)) {
-	switch(rettp) {
-	case UrlIngester::UIRET_ROOT:
-	    {
-		kDebug() << "list /" << endl;
-		UDSEntryList entries;
-		KIO::UDSEntry entry;
-		createRootEntry(entry);
-		entries.append(entry);
-		createGoHomeEntry(entry);
-		entries.append(entry);
-		createGoHelpEntry(entry);
-		entries.append(entry);
-		listEntries(entries);
-		finished();
-	    }
-	    return;
-	default:
-	    error(ERR_CANNOT_ENTER_DIRECTORY, "");
-	    return;
-	}
+        switch(rettp) {
+        case UrlIngester::UIRET_ROOT:
+            {
+                kDebug() << "list /" << endl;
+                UDSEntryList entries;
+                KIO::UDSEntry entry;
+                createRootEntry(entry);
+                entries.append(entry);
+                createGoHomeEntry(entry);
+                entries.append(entry);
+                createGoHelpEntry(entry);
+                entries.append(entry);
+                listEntries(entries);
+                finished();
+            }
+            return;
+        default:
+            error(ERR_CANNOT_ENTER_DIRECTORY, "");
+            return;
+        }
     } else if (ingest.isQuery(&qd)) {
-	// At this point, 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 (ingest.endSlashQuery()) {
-	    kDebug() << "Ends With /" << endl;
-	    error(ERR_SLAVE_DEFINED, "Autocompletion search aborted");
-	    return;
-	}
-	if (!syncSearch(qd)) {
-	    // syncSearch did the error thing
-	    return;
-	}
-	// Fallthrough to actually listing the directory
+        // At this point, 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 (ingest.endSlashQuery()) {
+            kDebug() << "Ends With /" << endl;
+            error(ERR_SLAVE_DEFINED, "Autocompletion search aborted");
+            return;
+        }
+        if (!syncSearch(qd)) {
+            // syncSearch did the error thing
+            return;
+        }
+        // Fallthrough to actually listing the directory
     } else {
-	kDebug() << "Cant grok input url";
-	error(ERR_CANNOT_ENTER_DIRECTORY, "");
-	return;
-    }
-
-    static int numentries = -1;
-    if (numentries == -1) {
-	if (o_rclconfig)
-	    o_rclconfig->getConfParam("kio_max_direntries", &numentries);
-	if (numentries == -1)
-	    numentries = 100;
-    }
-
-    vector<ResListEntry> page;
-    int pagelen = m_source->getSeqSlice(0, numentries, page);
-    if (pagelen < 0) {
-	error(ERR_SLAVE_DEFINED, "Internal error");
-	return;
-    }
-    UDSEntryList entries;
-    for (int i = 0; i < pagelen; i++) {
-	entries.append(resultToUDSEntry(page[i].doc, i));
-    }
-    listEntries(entries);
+        kDebug() << "Cant grok input url";
+        error(ERR_CANNOT_ENTER_DIRECTORY, "");
+        return;
+    }
+
+    static int maxentries = -1;
+    if (maxentries == -1) {
+        if (o_rclconfig)
+            o_rclconfig->getConfParam("kio_max_direntries", &maxentries);
+        if (maxentries == -1)
+            maxentries = 10000;
+    }
+    static const int pagesize = 200;
+    int pagebase = 0;
+    while (pagebase < maxentries) {
+        vector<ResListEntry> page;
+        int pagelen = m_source->getSeqSlice(pagebase, pagesize, page);
+        UDSEntry entry;
+        if (pagelen < 0) {
+            error(ERR_SLAVE_DEFINED, "Internal error");
+            listEntry(entry, true);
+            break;
+        }
+        for (int i = 0; i < pagelen; i++) {
+            listEntry(resultToUDSEntry(page[i].doc, i), false);
+        }
+        if (pagelen != pagesize) {
+            listEntry(entry, true);
+            break;
+        }
+        pagebase += pagelen;
+    }
     finished();
 }