[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