static void frame_received()

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;
        }
    }
}