GLib/GObject+C as the lingua franca?
nf2
nf2 at scheinwelt.at
Tue Jul 29 00:03:38 BST 2008
Thiago Macieira wrote:
> nf2 wrote:
>
>> But i'm not really satisfied yet. Don't know how to implement the
>> QIODevice::atEnd() and bytesAvailable () functions. GIO is a pull API so
>> i can't really "answer" those methods. Perhaps with some read-ahead, but
>> then seeking is difficult.
>>
>
> Implement it in sequential mode then, instead of random access:
>
> bytesAvailable() returns the number of bytes you have buffered, the
> maximum amount that calling read() can return. In other words, if you try
> to read more than bytesAvailable(), you will get bytesAvailable() bytes.
>
> atEnd() = true ←→ bytesAvailable() = 0
>
Thanks for the help - i'll try sequential mode with buffering and
read-ahead then. :-) If people want random access (which is a rare case
i guess) they can still use the GIO streams.
>
>
>> Perhaps Qt/GIO bindings should provide both - a QIODevice implementation
>> - and a thin wrapper for all the GIO classes: Directory listings,
>> file-info, drive/mount management, launching apps, and also the GIO
>> streams (maybe useful for the advanced users, dunno).
>>
>
> That makes sense. Those other functionalities aren't streams, so they
> don't make sense as QIODevice, clearly. That functionality is also
> present in KIO: the directory listings, mount requests, etc., are not
> descendants of KIO::TransferJob.
>
> It should be possible to write an abstracted layer of I/O, one that can
> use KIO as well as GIO (and even QNetworkAccessManager, but that's a lot
> more limited in scope). It could, in the future, replace KIO -- i.e., be
> the cleanup of KIO that didn't happen for KDE 4.
>
Yeah - that would be cool. I wonder how i could make my KGIO API more
abstract, that you don't necessarily have to plug GIO.
Some thoughts:
* Should a next-generation KIO be simplified, only providing the
convenience-, high-level APIs (like KIO::Netaccess) and GUI related
functions (password, file dialogs, progress bars), backed with a more
GIO style library for the basic types (File, FileInfo, Errors), advanced
operations (streaming, seeking) and low-level features? I guess the
second library could sit below KDE - on the same layer as Phonon, QtDBus...
* Aligning some things with GIO (FileInfo/UDS fields and error codes)
would be good probably...
* Should all calls go through GIO - at least on Unixes? Because then all
apps get access to the same IO system. If so, i wonder which of the
current KIO protocols/features can not be provided through the GIO
interface and what to do with them? This seems pretty delicate.
* Would there still be need for the Slaves system, cause GVFS will
handle most of the protocols anyway?
> As for launching apps... there's klauncher. Or are you talking about
> launching applications in a remote host?
>
Launching apps. As GIO provides that feature - why hide it. Might still
be useful for Qt-only apps.
>
>>>> Another problem is copy-constructors/operators. Passing around
>>>> wrapped GObjects that way works quite nicely, cause you don't need to
>>>> care about garbage collection, but Qt Signal connections are lost
>>>> when copying the object.
>>>>
>>> Assuming you mean connections of some internal object (since QObjects
>>> themselves can't be copied anyway), why not just have this shared
>>> object in a shared (reference counted) private?
>>>
>> Well - actually most of the public KGIO classes can be copied. And they
>> do derive from QObject.
>>
>
> That's not possible.
>
> Either they are copiable, or they derive from QObject. Doing both is not
> possible.
>
I guess it's technically possible, but if it's not the common Qt style i
agree that it shouldn't be done. Probably i need to think over the KGIO
design. Either i need to split off lots of little job-classes for the
async operations, or make the classes non-copyable. Kind of sad, because
things like
QList<Mount> VolumeMonitor::getMounts()
have to become
QList<Mount*> VolumeMonitor::getMounts()
which seems less convenient.
>
> If you want copiable things, use pointers. I'm implementing a generic
> pointer-holding class with atomic reference-counting for Qt 4.5, so you
> don't have to write anything.
>
>
That's cool. Taking the above example, would something like this be
possible?
QList<QRefCountedPointer<QMount>> VolumeMonitor::getMounts()
Cheers,
Norbert
More information about the kde-core-devel
mailing list