[Kde-perl] [Kde-bindings] [PATCH] kdebindings: add perl string marshaller for QByteArray
Gary Greene
greeneg at phoenuxos.com
Thu Oct 12 17:46:47 CEST 2006
On Thursday 12 October 2006 04:32 am, Richard Dale wrote:
> Hi Gary
>
> On Wednesday 11 October 2006 20:53, Gary Greene wrote:
> > On Monday 09 October 2006 05:40 am, Richard Dale wrote:
> > > On Monday 09 October 2006 05:27, Logan Rathbone wrote:
> > > > I was always using PerlQt's version of smoke, and I had written a
> > > > couple programs using it. The other day though, I decided to try to
> > > > build it against kdebindings's smoke. However, some of my code broke
> > > > because I was using some Qt functions that take QByteArrays, and for
> > > > some reason kdebindings's smoke doesn't allow for that and PerlQt's
> > > > does. So this patch seems to add that marshaller into kdebindings's
> > > > smoke, and hence unbreaks my code when built against it.
> > >
> > > The problem is that if you have automatic Perl <--> C++ QByteArray
> > > conversion it makes it difficult to use QTextOStreams for instance.
> > > When you write to the stream, the underlying QByteArray will be
> > > updated, but possibly not the original string you passed. So I found
> > > the automatic conversion was more trouble than it's worth. I think a
> > > better solution to get the current Smoke lib working with PerlQt is to
> > > remove the QByteArray marshalling from handlers.cpp. I'll forward this
> > > mail to the kde-bindings and perlqt mailing lists to see what Ashley
> > > Winters thinks anyway.
> > >
> > > -- Richard
> > > _______________________________________________
> > > Kde-perl mailing list
> > > Kde-perl at kde.org
> > > https://mail.kde.org/mailman/listinfo/kde-perl
> >
> > Richard, the only problem with this is that it completely breaks usage of
> > QByteArrays for PerlQt. Logan has some apps in PhoeNUX OS that actually
> > use QByteArray constructs, thus the reason WHY he patched our build of
> > kdebindings to get it working and submitted the patch to kde-devel. The
> > definitive plan for PheoNUX is to have the Perl Qt3 / KDE bindings
> > solidly working for all apps that we are developing, and then port the
> > codebase of PerlQt/PerlKDE to Qt4 / KDE 4 so we get a sane path for when
> > KDE 4 is out. This measn that short-changing the binding in this case
> > isn't a good option unless we can get QByteArrays working with the
> > marshaller.
>
> You can still use Qt::ByteArrays and they are marshalled find, but you must
> create them with Qt::ByteArray.new in Ruby, and the equivalent in PerlQt.
>
> Here is an example of why you need the QByteArray class in the Smoke
> library as an ordinary class, from Qt4 QtRuby in
> qtruby/rubylib/examples/network/fortuneserver/server.rb:
>
> def sendFortune
> block = Qt::ByteArray.new
> outf = Qt::DataStream.new(block, Qt::IODevice::WriteOnly)
> outf.version = Qt::DataStream::Qt_4_0
> outf << 0 # Write a 4 byte integer
> outf << @fortunes[rand(@fortunes.length)]
> outf.device.seek(0)
> outf << (block.length - 4) # 4 bytes is the size of an integer
>
> clientConnection = @tcpServer.nextPendingConnection()
> connect(clientConnection, SIGNAL('disconnected()'),
> clientConnection, SLOT('deleteLater()'))
>
> clientConnection.write(block)
> clientConnection.disconnectFromHost
> end
>
> You open a stream on 'block', write a few things to it, and then later when
> you use 'block' it needs to have been updated. In Ruby, when 'block' was a
> Ruby string and marshalled to a QByteArray before being passed to the
> Qt::DataStream constructor, it meant that the Ruby String never got
> updated. In some other languages like C# the problem is even worse because
> Strings are immutable, and you would have to use a StringBuffer instance
> instead, and manage to keep it updated in line with the underlying
> QByteArray. Perhaps in Perl you can manage to make it work in the case, I
> don't know.
>
> Here is how it used to look in QtRuby, and it didn't work:
>
> def sendFortune
> # Create block as a Ruby String
> block = ""
>
> # 'block' is marshalled to a C++ QByteArray here:
> outf = Qt::DataStream.new(block, Qt::IODevice::WriteOnly)
>
> outf.version = Qt::DataStream::Qt_4_0
> outf << 0 # Write a 4 byte integer
> outf << @fortunes[rand(@fortunes.length)]
> outf.device.seek(0)
> outf << (block.length - 4) # 4 bytes is the size of an integer
>
> clientConnection = @tcpServer.nextPendingConnection()
> connect(clientConnection, SIGNAL('disconnected()'),
> clientConnection, SLOT('deleteLater()'))
>
> # How is block updated here to reflect the current value of the
> # QByteArray that was passed to the QDataStream constructor
> # above?
> clientConnection.write(block)
> clientConnection.disconnectFromHost
> end
>
> Assuming you're porting PertQt code from Qt3 to Qt4, I think this is a
> minor conversion issue, and I would have thought it shouldn't be too
> difficult to amend the code.
>
> -- Richard
> _______________________________________________
> Kde-perl mailing list
> Kde-perl at kde.org
> https://mail.kde.org/mailman/listinfo/kde-perl
So then this means that it becomes an explicit declaration? This seems to fly
in the face of Perl's implicitness everywhere but, I think I can live with
that now that that's been explained. Important note though, we're not at the
stage of porting code yet, as the Perl Qt4 binding is still in
pre-development stages at this time as I'm still looking for paying work so I
can get out of my Parents and get on broadband instead of this nasty dial-up
they've got.
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 190 bytes
Desc: not available
Url : http://mail.kde.org/pipermail/kde-perl/attachments/20061012/dd4348ce/attachment.pgp
More information about the Kde-perl
mailing list