Support dynamic allocation for string, bytes and message fields.

This is turned on by passing -p to nanopb_generator.py or setting the
(nanopb).pointer option for a .proto field.

git-svn-id: https://svn.kapsi.fi/jpa/nanopb-dev@1081 e3a754e5-d11d-0410-8d38-ebb782a927b9
This commit is contained in:
Michael Poole
2011-12-20 03:30:52 +00:00
committed by Petteri Aimonen
parent 8e5337e9ef
commit c66c6b43c4
14 changed files with 403 additions and 48 deletions

View File

@@ -161,6 +161,16 @@ bool checkreturn pb_encode(pb_ostream_t *stream, const pb_message_t *msg, const
switch (PB_HTYPE(field->type))
{
case PB_HTYPE_OPTIONAL:
if (!(has_fields[i/8] & (1 << i%8)))
break;
if (PB_POINTER(field->type)
&& (PB_LTYPE(field->type) == PB_LTYPE_STRING
|| PB_LTYPE(field->type) == PB_LTYPE_SUBMESSAGE)
&& *(void**)pData == NULL)
break;
/* else fall through to required case */
case PB_HTYPE_REQUIRED:
if (!pb_encode_tag_for_field(stream, field))
return false;
@@ -168,17 +178,6 @@ bool checkreturn pb_encode(pb_ostream_t *stream, const pb_message_t *msg, const
return false;
break;
case PB_HTYPE_OPTIONAL:
if (has_fields[i/8] & (1 << i%8))
{
if (!pb_encode_tag_for_field(stream, field))
return false;
if (!func(stream, field, pData))
return false;
}
break;
case PB_HTYPE_ARRAY:
if (!encode_array(stream, field, pData, *(size_t*)pSize, func))
return false;
@@ -334,13 +333,22 @@ bool checkreturn pb_enc_fixed32(pb_ostream_t *stream, const pb_field_t *field, c
bool checkreturn pb_enc_bytes(pb_ostream_t *stream, const pb_field_t *field, const void *src)
{
pb_bytes_array_t *bytes = (pb_bytes_array_t*)src;
return pb_encode_string(stream, bytes->bytes, bytes->size);
if ((field != NULL) && PB_POINTER(field->type)) {
pb_bytes_t *bytes = (pb_bytes_t*)src;
return pb_encode_string(stream, bytes->bytes, bytes->size);
} else {
pb_bytes_array_t *bytes = (pb_bytes_array_t*)src;
return pb_encode_string(stream, bytes->bytes, bytes->size);
}
}
bool checkreturn pb_enc_string(pb_ostream_t *stream, const pb_field_t *field, const void *src)
{
return pb_encode_string(stream, (uint8_t*)src, strlen((char*)src));
size_t len;
if ((field != NULL) && PB_POINTER(field->type))
src = *(char**)src;
len = src ? strlen((char*)src) : 0;
return pb_encode_string(stream, (uint8_t*)src, len);
}
bool checkreturn pb_enc_submessage(pb_ostream_t *stream, const pb_field_t *field, const void *src)
@@ -352,6 +360,11 @@ bool checkreturn pb_enc_submessage(pb_ostream_t *stream, const pb_field_t *field
if (field->ptr == NULL)
return false;
if (PB_POINTER(field->type)) {
src = *(void**)src;
if (src == NULL)
return false;
}
if (!pb_encode(&substream, (const pb_message_t*)field->ptr, src))
return false;