On Thu, Aug 23, 2012 at 05:39:02PM -0400, Rafael Schloming wrote: > On Thu, Aug 23, 2012 at 5:06 PM, Darryl L. Pierce <[email protected]>wrote: > > > On Thu, Aug 23, 2012 at 04:02:09PM -0400, Rafael Schloming wrote: > > > I'm a little confused by what you're trying to do with the wrapper. This > > is > > > what I have for the wrapper in my ruby.i: > > > > > > int pn_message_save(pn_message_t *msg, char *OUTPUT, size_t > > *OUTPUT_SIZE); > > > %ignore pn_message_save; > > > > With the above the error happens at 65 characters. I took out my wrapper > > and ran the test again and it crashes at 65 characters every time. > > > > Can you post the test snippet so I can try?
If you track my "Ruby-language-APIs" branch on github[1], and run the
following in the ruby directory with
ruby -I $RUBYLIB -I lib test
you should see the output.
---8<[snip]---
#!/usr/bin/env ruby
require 'qpid_proton'
msg = Qpid::Proton.create_message
Qpid::Proton.set_message_format(msg, Qpid::Proton::Format::TEXT)
length = 1
puts "The message format is #{Qpid::Proton.get_message_format(msg)}."
loop do
data = (0...length).map{ ('a'..'z').to_a[rand(26)] }.join
puts "Testing data at #{length} characters."
Qpid::Proton.set_message_data(msg, data)
returned = Qpid::Proton.get_message_data(msg)[1]
puts "Comparing:\n#{data}\n#{returned}\n"
puts "Do they match? #{(data == returned) ? 'Yes' : 'No'}"
break unless (data == returned)
Qpid::Proton.clear_message(msg)
# length = 0 if length == 128
length += 1
end
puts "We stopped at #{length} characters."
---8<[snip]---
> > > I believe this is all that is necessary since the standard typemaps
> > should
> > > pick up on OUTPUT and OUTPUT_SIZE and just do the right thing.
> >
> > What I would like to see in the dynamic languages for this is to not
> > even have to specify the size for the output buffer; i.e., just call:
> >
> > Qpid::Proton.get_message_data(msg)
> >
> > and get the data back as one lump.
> >
>
> Ah, in that case I think you want to use ALLOC_OUTPUT and ALLOC_SIZE. Your
> wrapper will need to be a little bit smarter though. There is no way to
> know in advance how much space it will take to encode the message in a
> given format, so the wrapper will have to pick an initial size and then
> keep on doubling until it fits.
>
> Here is an example of the ALLOC stuff. Obviously the wrapper would need to
> be different.
>
> %rename(pn_delivery_tag) wrap_pn_delivery_tag;
> %inline %{
> void wrap_pn_delivery_tag(pn_delivery_t *delivery, char **ALLOC_OUTPUT,
> size_t *ALLOC_SIZE) {
> pn_delivery_tag_t tag = pn_delivery_tag(delivery);
> *ALLOC_OUTPUT = malloc(tag.size);
> *ALLOC_SIZE = tag.size;
> memcpy(*ALLOC_OUTPUT, tag.bytes, tag.size);
> }
> %}
> %ignore pn_delivery_tag;
>
> The swig chapter on C string handle is a good reference for this stuff.
> There might be some other macros there that are useful:
>
> http://www.swig.org/Doc2.0/SWIGDocumentation.html#Library_nn8
Okay, I'll take a different approach to this one.
> > Agreed. Also, we should make sure to remove having the individual
> > languages include them relatively (i.e., %include "../cproton.i") and
> > instead place the shared files in the include directory.
> >
>
> +1
I'll send out a patch for this today.
--
Darryl L. Pierce, Sr. Software Engineer @ Red Hat, Inc.
Delivering value year after year.
Red Hat ranks #1 in value among software vendors.
http://www.redhat.com/promo/vendor/
pgps54WXFdwG6.pgp
Description: PGP signature
