KIO::ListJob::entries emits twice for folders with 100+ entries. Why?
David Faure
faure at kde.org
Thu Nov 15 10:02:47 GMT 2012
On Wednesday 14 November 2012 22:18:08 Albert Astals Cid wrote:
> El Dimecres, 14 de novembre de 2012, a les 17:32:35, Mark va escriure:
> > Hi,
> >
> > I'm playing with KIO::listDir() and the signals to get the directory
> > content and i've hit a strange "issue". Apparently when a folder has
> > more than 100 entries the entries signal [1] will be emitted twice.
> > 1 with 100 entries
> > 1 with all entries
All? That would lead to duplication, I strongly doubt that this is the case,
it would confuse KDirLister very much.
Which ioslave is this about? kio_file, apparently?
> > Also, this only seems to happen if i add:
> > job->addMetaData("details", "0");
> > See the full code example [2] that also contains the above line.
`kioclient ls /dir` can also be used to test KIO::listDir from the command-
line, although adding details=0 has to be patched in.
Tried that, no bug.
kioclient ls /k/testbug174144 | sort | wc -l
kioclient ls /k/testbug174144 | sort | uniq | wc -l
both show the same result, 502.
Now trying your testcase...
(C++) dumpEntries()
-------------- BEGIN DUMPING ENTRIES --------------
99
-------------- END DUMPING ENTRIES --------------
(C++) dumpEntries()
-------------- BEGIN DUMPING ENTRIES --------------
401
-------------- END DUMPING ENTRIES --------------
Total 500. No duplicates.
> > On IRC kde__pepo suggested that the first emit might be so that the
> > app using it has at least some results while waiting for the rest.
Yes entries can be emitted multiple times, but not with duplicates.
> > Is there an option to disable this behavior? In my case i don't want
> > nor need the extra signal and i "was" depending on that signal to
> > properly fill my model. However, since that might be emitted twice it
> > screwed up my logic and my personal workaround is to rather just
> > depend on the results signal (which i can't find in the API docs).
>
> You mean "result" instead of "results", right? I see it documented in the
> KJob class, problaby you want the finished signal, (if it is job being done
> that you are waiting for)
No no no. In 99.99% of the cases, result() is the signal you want.
I thought I made that clear in the last revision of the api documentation :(
result() -> to trigger application logic that should run when the job is done
finished() -> to hide progress dialogs, or to delete the job by hand
The difference: result() is not emitted by kill(Silently).
--
David Faure, faure at kde.org, http://www.davidfaure.fr
Working on KDE, in particular KDE Frameworks 5
More information about the kde-core-devel
mailing list