Questions on the new KIO::FileJob API

nf2 nf2 at scheinwelt.at
Sun May 4 21:03:03 BST 2008


Thiago Macieira wrote:
> nf2 wrote:
>   
>> 1) - Creating Files: Apparently FileJob in kio_file doesn't allow
>> creating files. As there is no QIODevice::Create flag in the
>> QIODevice::OpenMode enum, it should probably create the file on
>> QIODevice::WriteOnly. Although i believe it would be good to have a
>> QIODevice::Create flag which prevents overwriting by mistake. Please
>> have a look at the GIO GFile API also...
>>     
>
> It was probably not conceived for creating files. If you're going to 
> create one, use KIO::put.
>   

Really?

>   
>> 2) - Reading Files: From reading the code in kio_file i'm not sure
>> whether data() is supposed to emit all the requested data in a single
>> callback, all the requested data in multiple callbacks *), or only as
>> much as it can get (>1 bytes) **). The latter would allow to have a
>> POSIX style streaming API, which has been missing in KIO anyway. This
>> would also work the other way round - when writing - as the written()
>> callback has a byte count.
>>
>> *) this is what the current - kio_file implementation suggests, but i
>> guess that's pretty dangerous, as the client might try to call seek()
>> before read() is finished.
>>     
>
> It emits as much as it can read, multiple times, until it has read the 
> amount of data requested. You shouldn't be calling seek() until you've 
> got the entire "mouthful" that you requested.
>   

Hmm - probably i wouldn't design it that way - i would stick to the 
behavior that is common elsewhere: one read() - one data() reply which 
can return less than requested. IMHO this would have two advantages:

1) On slow connections it might take quite long until you got the entire 
"mouthful". You can't change the file position during this span. A 
problem for multimedia apps?

2) API simplicity. You don't need to memorize on the client side how 
much you have requested (and sum up the byte-counts of multiple data() 
callbacks to find out whether read() is finished).

However, there seems to be a missing

if (bytes==0) break;

in kio_files read() loop.

Regards,
Norbert





More information about the kde-core-devel mailing list