You are viewing a plain text version of this content. The canonical link for it is here.
Posted to proton@qpid.apache.org by Raul Jimenez <ra...@anydata.com> on 2012/11/02 00:15:28 UTC

Loading a message with AMQP types

Hello, I am trying to load a message with amqp types but am unsure on how
to pack and unpack.
If some one could point me towards the right direction I'd appreciate it.

I have tried the following (messenger and message setup omitted):
Note: I can send text without issue.

server:
int i=0;
pn_data_t *body = pn_message_body(message);
pn_data_fill(body, "si", "test", i);
pn_messenger_put(messenger, message);
pn_messenger_send(messenger);

client:
int i=0;
pn_messenger_recv(messenger, 1);
pn_messenger_get(messenger, message);
pn_data_t *body = pn_message_body(message);
pn_data_scan(body, "si", buff, &i);
printf("str:'%s', i:%d\n", buff, i);

output: "str:'', i:0"
...
I also tried:
server:
int i=0;
pn_data_t *pdata = pn_data(16);
pn_data_fill(pdata, "si", "test", i);
char buff[16];
size_t size = pn_data_encode(pdata, buff, 16);
pn_message_load_amqp(message, buff, size)
pn_messenger_put(messenger, message);
pn_messenger_send(messenger);
...
client:
char buff[16];
char sbuff[16];
int i=0;
pn_messenger_recv(messenger, 1);
pn_messenger_get(messenger, message);
pn_message_save_amqp(message, buff, size);
pn_data_t *pdata = pn_data(16);
size_t size = pn_data_decode(pdata, buff, 16);
pn_data_scan(pdata, "si", sbuff, i);
printf("str:'%s', i:%d\n", sbuff, i);

-Raul Jimenez

Re: Loading a message with AMQP types

Posted by Raul Jimenez <ra...@anydata.com>.
Thanks for taking the time to reply. With lists everything works but I'll
switch my code over to the safe way, the verboseness is a small price to
pay for type checking.

-Raul Jimenez

On Wed, Nov 7, 2012 at 4:38 AM, Rafael Schloming <rh...@alum.mit.edu> wrote:

> Hi, sorry for the delay in answering this. I've been traveling to/attending
> ApacheCon EU, so I haven't had time to sit down and write out an example.
>
> So there are two ways of getting data into/out of a data object. This is
> the safe/verbose way:
>
> Creating:
>   pn_data_t *body = pn_message_body(message);
>   pn_data_put_list(body);
>   pn_data_enter(body);
>   pn_data_put_string(body, pn_bytes(strlen(msgtext), msgtext));
>   pn_data_put_int(body, 1234);
>   pn_data_exit(body);
>
> Extracting:
>   pn_data_t *body = pn_message_body(message);
>   pn_data_next(body);
>   assert(pn_data_type(body) == PN_LIST);
>   int count = pn_data_get_list(body);
>   assert(count == 2);
>   if (count == 2) {
>     pn_data_enter(body);
>     pn_data_next(body);
>     assert(pn_data_type(body) == PN_STRING);
>     pn_bytes_t string = pn_data_get_string(body);
>     pn_data_next(body);
>     assert(pn_data_type(body) == PN_INT);
>     int integer = pn_data_get_int(body);
>     pn_data_exit(body);
>
>     printf("%*s, %i\n", string.size, string.start, integer);
>   }
>
> I call it safe for two reasons, one being that pn_data_fill and
> pn_data_scan both use varargs, and so the arguments can't be typechecked,
> and if you happen to use an argument of the wrong type you get wild and
> unpredictable results. The second reason for it being safe is that it type
> checks the data as it is extracting it. The unsafe/compact way is this:
>
> Creating:
>   pn_data_fill(body, "[si]", "test", 1234);
>
> Extracting:
>   pn_data_t *body = pn_message_body(message);
>   int i;
>   pn_bytes_t buff;
>   pn_data_scan(body, "[si]", &buff, &i);
>   printf("%*s, %i\n", buff.size, buff.start, i);
>
> Note that in both cases you need to use a list to put two values into the
> body. I should probably either error out if you try to put multiple values
> in the body or just automatically encode as a list, but the above snippets
> should work on the current release.
>
> --Rafael
>
> On Fri, Nov 2, 2012 at 12:15 AM, Raul Jimenez <rauljimenez@anydata.com
> >wrote:
>
> > Hello, I am trying to load a message with amqp types but am unsure on how
> > to pack and unpack.
> > If some one could point me towards the right direction I'd appreciate it.
> >
> > I have tried the following (messenger and message setup omitted):
> > Note: I can send text without issue.
> >
> > server:
> > int i=0;
> > pn_data_t *body = pn_message_body(message);
> > pn_data_fill(body, "si", "test", i);
> > pn_messenger_put(messenger, message);
> > pn_messenger_send(messenger);
> >
> > client:
> > int i=0;
> > pn_messenger_recv(messenger, 1);
> > pn_messenger_get(messenger, message);
> > pn_data_t *body = pn_message_body(message);
> > pn_data_scan(body, "si", buff, &i);
> > printf("str:'%s', i:%d\n", buff, i);
> >
> > output: "str:'', i:0"
> > ...
> > I also tried:
> > server:
> > int i=0;
> > pn_data_t *pdata = pn_data(16);
> > pn_data_fill(pdata, "si", "test", i);
> > char buff[16];
> > size_t size = pn_data_encode(pdata, buff, 16);
> > pn_message_load_amqp(message, buff, size)
> > pn_messenger_put(messenger, message);
> > pn_messenger_send(messenger);
> > ...
> > client:
> > char buff[16];
> > char sbuff[16];
> > int i=0;
> > pn_messenger_recv(messenger, 1);
> > pn_messenger_get(messenger, message);
> > pn_message_save_amqp(message, buff, size);
> > pn_data_t *pdata = pn_data(16);
> > size_t size = pn_data_decode(pdata, buff, 16);
> > pn_data_scan(pdata, "si", sbuff, i);
> > printf("str:'%s', i:%d\n", sbuff, i);
> >
> > -Raul Jimenez
> >
>

Re: Loading a message with AMQP types

Posted by Rafael Schloming <rh...@alum.mit.edu>.
Hi, sorry for the delay in answering this. I've been traveling to/attending
ApacheCon EU, so I haven't had time to sit down and write out an example.

So there are two ways of getting data into/out of a data object. This is
the safe/verbose way:

Creating:
  pn_data_t *body = pn_message_body(message);
  pn_data_put_list(body);
  pn_data_enter(body);
  pn_data_put_string(body, pn_bytes(strlen(msgtext), msgtext));
  pn_data_put_int(body, 1234);
  pn_data_exit(body);

Extracting:
  pn_data_t *body = pn_message_body(message);
  pn_data_next(body);
  assert(pn_data_type(body) == PN_LIST);
  int count = pn_data_get_list(body);
  assert(count == 2);
  if (count == 2) {
    pn_data_enter(body);
    pn_data_next(body);
    assert(pn_data_type(body) == PN_STRING);
    pn_bytes_t string = pn_data_get_string(body);
    pn_data_next(body);
    assert(pn_data_type(body) == PN_INT);
    int integer = pn_data_get_int(body);
    pn_data_exit(body);

    printf("%*s, %i\n", string.size, string.start, integer);
  }

I call it safe for two reasons, one being that pn_data_fill and
pn_data_scan both use varargs, and so the arguments can't be typechecked,
and if you happen to use an argument of the wrong type you get wild and
unpredictable results. The second reason for it being safe is that it type
checks the data as it is extracting it. The unsafe/compact way is this:

Creating:
  pn_data_fill(body, "[si]", "test", 1234);

Extracting:
  pn_data_t *body = pn_message_body(message);
  int i;
  pn_bytes_t buff;
  pn_data_scan(body, "[si]", &buff, &i);
  printf("%*s, %i\n", buff.size, buff.start, i);

Note that in both cases you need to use a list to put two values into the
body. I should probably either error out if you try to put multiple values
in the body or just automatically encode as a list, but the above snippets
should work on the current release.

--Rafael

On Fri, Nov 2, 2012 at 12:15 AM, Raul Jimenez <ra...@anydata.com>wrote:

> Hello, I am trying to load a message with amqp types but am unsure on how
> to pack and unpack.
> If some one could point me towards the right direction I'd appreciate it.
>
> I have tried the following (messenger and message setup omitted):
> Note: I can send text without issue.
>
> server:
> int i=0;
> pn_data_t *body = pn_message_body(message);
> pn_data_fill(body, "si", "test", i);
> pn_messenger_put(messenger, message);
> pn_messenger_send(messenger);
>
> client:
> int i=0;
> pn_messenger_recv(messenger, 1);
> pn_messenger_get(messenger, message);
> pn_data_t *body = pn_message_body(message);
> pn_data_scan(body, "si", buff, &i);
> printf("str:'%s', i:%d\n", buff, i);
>
> output: "str:'', i:0"
> ...
> I also tried:
> server:
> int i=0;
> pn_data_t *pdata = pn_data(16);
> pn_data_fill(pdata, "si", "test", i);
> char buff[16];
> size_t size = pn_data_encode(pdata, buff, 16);
> pn_message_load_amqp(message, buff, size)
> pn_messenger_put(messenger, message);
> pn_messenger_send(messenger);
> ...
> client:
> char buff[16];
> char sbuff[16];
> int i=0;
> pn_messenger_recv(messenger, 1);
> pn_messenger_get(messenger, message);
> pn_message_save_amqp(message, buff, size);
> pn_data_t *pdata = pn_data(16);
> size_t size = pn_data_decode(pdata, buff, 16);
> pn_data_scan(pdata, "si", sbuff, i);
> printf("str:'%s', i:%d\n", sbuff, i);
>
> -Raul Jimenez
>