in src/sasl_frame_codec.c [78:147]
static void frame_received(void* context, const unsigned char* type_specific, uint32_t type_specific_size, const unsigned char* frame_body, uint32_t frame_body_size)
{
SASL_FRAME_CODEC_INSTANCE* sasl_frame_codec_instance = (SASL_FRAME_CODEC_INSTANCE*)context;
/* Codes_SRS_SASL_FRAME_CODEC_01_006: [Bytes 6 and 7 of the header are ignored.] */
(void)type_specific;
/* Codes_SRS_SASL_FRAME_CODEC_01_007: [The extended header is ignored.] */
/* Codes_SRS_SASL_FRAME_CODEC_01_008: [The maximum size of a SASL frame is defined by MIN-MAX-FRAME-SIZE.] */
size_t size = safe_add_size_t(type_specific_size, frame_body_size);
size = safe_add_size_t(size, 6);
if ((size > MIX_MAX_FRAME_SIZE) ||
/* Codes_SRS_SASL_FRAME_CODEC_01_010: [Receipt of an empty frame is an irrecoverable error.] */
(frame_body_size == 0))
{
LogError("Bad SASL frame size");
/* Codes_SRS_SASL_FRAME_CODEC_01_049: [If any error occurs while decoding a frame, the decoder shall call the on_sasl_frame_codec_error and pass to it the callback_context, both of those being the ones given to sasl_frame_codec_create.] */
sasl_frame_codec_instance->on_sasl_frame_codec_error(sasl_frame_codec_instance->callback_context);
}
else
{
switch (sasl_frame_codec_instance->decode_state)
{
default:
case SASL_FRAME_DECODE_ERROR:
break;
case SASL_FRAME_DECODE_FRAME:
sasl_frame_codec_instance->decoded_sasl_frame_value = NULL;
/* Codes_SRS_SASL_FRAME_CODEC_01_039: [sasl_frame_codec shall decode the sasl-frame value as a described type.] */
/* Codes_SRS_SASL_FRAME_CODEC_01_048: [Receipt of an empty frame is an irrecoverable error.] */
while ((frame_body_size > 0) &&
(sasl_frame_codec_instance->decoded_sasl_frame_value == NULL) &&
(sasl_frame_codec_instance->decode_state != SASL_FRAME_DECODE_ERROR))
{
/* Codes_SRS_SASL_FRAME_CODEC_01_040: [Decoding the sasl-frame type shall be done by feeding the bytes to the decoder create in sasl_frame_codec_create.] */
if (amqpvalue_decode_bytes(sasl_frame_codec_instance->decoder, frame_body, 1) != 0)
{
LogError("Could not decode SASL frame AMQP value");
sasl_frame_codec_instance->decode_state = SASL_FRAME_DECODE_ERROR;
}
else
{
frame_body_size--;
frame_body++;
}
}
/* Codes_SRS_SASL_FRAME_CODEC_01_009: [The frame body of a SASL frame MUST contain exactly one AMQP type, whose type encoding MUST have provides="sasl-frame".] */
if (frame_body_size > 0)
{
LogError("More than one AMQP value detected in SASL frame");
sasl_frame_codec_instance->decode_state = SASL_FRAME_DECODE_ERROR;
/* Codes_SRS_SASL_FRAME_CODEC_01_049: [If any error occurs while decoding a frame, the decoder shall call the on_sasl_frame_codec_error and pass to it the callback_context, both of those being the ones given to sasl_frame_codec_create.] */
sasl_frame_codec_instance->on_sasl_frame_codec_error(sasl_frame_codec_instance->callback_context);
}
if (sasl_frame_codec_instance->decode_state != SASL_FRAME_DECODE_ERROR)
{
/* Codes_SRS_SASL_FRAME_CODEC_01_041: [Once the sasl frame is decoded, the callback on_sasl_frame_received shall be called.] */
/* Codes_SRS_SASL_FRAME_CODEC_01_042: [The decoded sasl-frame value and the context passed in sasl_frame_codec_create shall be passed to on_sasl_frame_received.] */
sasl_frame_codec_instance->on_sasl_frame_received(sasl_frame_codec_instance->callback_context, sasl_frame_codec_instance->decoded_sasl_frame_value);
}
break;
}
}
}