#include <windows.h>
#include <msber.h>
#include "mcspdu.h"

#ifndef ASSERT
#ifdef _DEBUG
#define ASSERT(flag) if (!(flag)) DebugBreak()
#else
#define ASSERT(flag)
#endif /* _DEBUG */
#endif /* ! ASSERT */


__inline int ASN1API ASN1BEREncSimpleOSTR(ASN1encoding_t enc, ASN1uint32_t len, ASN1octet_t *val)
{
    return ASN1BEREncOctetString(enc, 0x4, len, val);
}
__inline int ASN1API ASN1BERDecSimpleOSTR(ASN1decoding_t dec, ASN1octetstring_t *val)
{
    return ASN1BERDecOctetString(dec, 0x4, val);
}

__inline int ASN1API ASN1BEREncSimpleU32(ASN1encoding_t enc, ASN1uint32_t val)
{
    return ASN1BEREncU32(enc, 0x02, val);
}
__inline int ASN1API ASN1BERDecSimpleU32Val(ASN1decoding_t dec, ASN1uint32_t *val)
{
    return ASN1BERDecU32Val(dec, 0x02, val);
}

__inline int ASN1API ASN1BEREncEnum(ASN1encoding_t enc, ASN1uint32_t val)
{
    return ASN1BEREncU32(enc, 0x0a, val);
}
__inline int ASN1API ASN1BERDecEnum(ASN1decoding_t dec, ASN1uint32_t *val)
{
    return ASN1BERDecU32Val(dec, 0x0a, val);
}


// THE FOLLOWING IS GENERATED BY THE TELES COMPILER PLUS MANUAL CHANGES

ASN1int32_t ASN1CALL ASN1Enc_PDUDomainParameters(ASN1encoding_t enc, PDUDomainParameters *val)
{
    ASN1uint32_t nLenOff;
    if (!ASN1BEREncExplicitTag(enc, 0x10, &nLenOff))
        return 0;
    if (!ASN1BEREncSimpleU32(enc, (val)->max_channel_ids))
        return 0;
    if (!ASN1BEREncSimpleU32(enc, (val)->max_user_ids))
        return 0;
    if (!ASN1BEREncSimpleU32(enc, (val)->max_token_ids))
        return 0;
    if (!ASN1BEREncSimpleU32(enc, (val)->number_priorities))
        return 0;
    if (!ASN1BEREncSimpleU32(enc, (val)->min_throughput))
        return 0;
    if (!ASN1BEREncSimpleU32(enc, (val)->max_height))
        return 0;
    if (!ASN1BEREncSimpleU32(enc, (val)->max_mcspdu_size))
        return 0;
    if (!ASN1BEREncSimpleU32(enc, (val)->protocol_version))
        return 0;
    return ASN1BEREncEndOfContents(enc, nLenOff);
}

ASN1int32_t ASN1CALL ASN1Dec_PDUDomainParameters(ASN1decoding_t dec, PDUDomainParameters *val)
{
    ASN1octet_t *pBufEnd;
    if (!ASN1BERDecExplicitTag(dec, 0x10, NULL, &pBufEnd))
        return 0;
    if (!ASN1BERDecSimpleU32Val(dec, &(val)->max_channel_ids))
        return 0;
    if (!ASN1BERDecSimpleU32Val(dec, &(val)->max_user_ids))
        return 0;
    if (!ASN1BERDecSimpleU32Val(dec, &(val)->max_token_ids))
        return 0;
    if (!ASN1BERDecSimpleU32Val(dec, &(val)->number_priorities))
        return 0;
    if (!ASN1BERDecSimpleU32Val(dec, &(val)->min_throughput))
        return 0;
    if (!ASN1BERDecSimpleU32Val(dec, &(val)->max_height))
        return 0;
    if (!ASN1BERDecSimpleU32Val(dec, &(val)->max_mcspdu_size))
        return 0;
    if (!ASN1BERDecSimpleU32Val(dec, &(val)->protocol_version))
        return 0;
    return ASN1BERDecEndOfContents(dec, NULL, pBufEnd);
}

ASN1int32_t ASN1CALL ASN1Enc_ConnectInitialPDU(ASN1encoding_t enc, ConnectInitialPDU *val)
{
    ASN1uint32_t nLenOff;
    if (!ASN1BEREncExplicitTag(enc, 0x40000065, &nLenOff))
        return 0;
    if (!ASN1BEREncSimpleOSTR(enc, ((val)->calling_domain_selector).length, ((val)->calling_domain_selector).value))
        return 0;
    if (!ASN1BEREncSimpleOSTR(enc, ((val)->called_domain_selector).length, ((val)->called_domain_selector).value))
        return 0;
    if (!ASN1BEREncBool(enc, 0x01, (val)->upward_flag))
        return 0;
    if (!ASN1Enc_PDUDomainParameters(enc, &(val)->target_parameters))
        return 0;
    if (!ASN1Enc_PDUDomainParameters(enc, &(val)->minimum_parameters))
        return 0;
    if (!ASN1Enc_PDUDomainParameters(enc, &(val)->maximum_parameters))
        return 0;
    if (!ASN1BEREncSimpleOSTR(enc, ((val)->user_data).length, ((val)->user_data).value))
        return 0;
    return ASN1BEREncEndOfContents(enc, nLenOff);
}

ASN1int32_t ASN1CALL ASN1Dec_ConnectInitialPDU(ASN1decoding_t dec, ConnectInitialPDU *val)
{
    ASN1octet_t *pBufEnd;
    if (!ASN1BERDecExplicitTag(dec, 0x40000065, NULL, &pBufEnd))
        return 0;
    if (!ASN1BERDecSimpleOSTR(dec, &(val)->calling_domain_selector))
        return 0;
    if (!ASN1BERDecSimpleOSTR(dec, &(val)->called_domain_selector))
        return 0;
    if (!ASN1BERDecBool(dec, 0x01, &(val)->upward_flag))
        return 0;
    if (!ASN1Dec_PDUDomainParameters(dec, &(val)->target_parameters))
        return 0;
    if (!ASN1Dec_PDUDomainParameters(dec, &(val)->minimum_parameters))
        return 0;
    if (!ASN1Dec_PDUDomainParameters(dec, &(val)->maximum_parameters))
        return 0;
    if (!ASN1BERDecSimpleOSTR(dec, &(val)->user_data))
        return 0;
    return ASN1BERDecEndOfContents(dec, NULL, pBufEnd);
}

ASN1int32_t ASN1CALL ASN1Enc_ConnectResponsePDU(ASN1encoding_t enc, ConnectResponsePDU *val)
{
    ASN1uint32_t nLenOff;
    if (!ASN1BEREncExplicitTag(enc, 0x40000066, &nLenOff))
        return 0;
    if (!ASN1BEREncEnum(enc, (val)->result))
        return 0;
    if (!ASN1BEREncSimpleU32(enc, (val)->called_connect_id))
        return 0;
    if (!ASN1Enc_PDUDomainParameters(enc, &(val)->domain_parameters))
        return 0;
    if (!ASN1BEREncSimpleOSTR(enc, ((val)->user_data).length, ((val)->user_data).value))
        return 0;
    return ASN1BEREncEndOfContents(enc, nLenOff);
}

ASN1int32_t ASN1CALL ASN1Dec_ConnectResponsePDU(ASN1decoding_t dec, ConnectResponsePDU *val)
{
    ASN1octet_t *pBufEnd;
    if (!ASN1BERDecExplicitTag(dec, 0x40000066, NULL, &pBufEnd))
        return 0;
    if (!ASN1BERDecEnum(dec, (ASN1uint32_t *) &(val)->result))
        return 0;
    if (!ASN1BERDecSimpleU32Val(dec, &(val)->called_connect_id))
        return 0;
    if (!ASN1Dec_PDUDomainParameters(dec, &(val)->domain_parameters))
        return 0;
    if (!ASN1BERDecSimpleOSTR(dec, &(val)->user_data))
        return 0;
    return ASN1BERDecEndOfContents(dec, NULL, pBufEnd);
}

ASN1int32_t ASN1CALL ASN1Enc_ConnectAdditionalPDU(ASN1encoding_t enc, ConnectAdditionalPDU *val)
{
    ASN1uint32_t nLenOff;
    if (!ASN1BEREncExplicitTag(enc, 0x40000067, &nLenOff))
        return 0;
    if (!ASN1BEREncSimpleU32(enc, (val)->called_connect_id))
        return 0;
    if (!ASN1BEREncEnum(enc, (val)->data_priority))
        return 0;
    return ASN1BEREncEndOfContents(enc, nLenOff);
}

ASN1int32_t ASN1CALL ASN1Dec_ConnectAdditionalPDU(ASN1decoding_t dec, ConnectAdditionalPDU *val)
{
    ASN1octet_t *pBufEnd;
    if (!ASN1BERDecExplicitTag(dec, 0x40000067, NULL, &pBufEnd))
        return 0;
    if (!ASN1BERDecSimpleU32Val(dec, &(val)->called_connect_id))
        return 0;
    if (!ASN1BERDecEnum(dec, (ASN1uint32_t *) &(val)->data_priority))
        return 0;
    return ASN1BERDecEndOfContents(dec, NULL, pBufEnd);
}

ASN1int32_t ASN1CALL ASN1Enc_ConnectResultPDU(ASN1encoding_t enc, ConnectResultPDU *val)
{
    ASN1uint32_t nLenOff;
    if (!ASN1BEREncExplicitTag(enc, 0x40000068, &nLenOff))
        return 0;
    if (!ASN1BEREncEnum(enc, (val)->result))
        return 0;
    return ASN1BEREncEndOfContents(enc, nLenOff);
}

ASN1int32_t ASN1CALL ASN1Dec_ConnectResultPDU(ASN1decoding_t dec, ConnectResultPDU *val)
{
    ASN1octet_t *pBufEnd;
    if (!ASN1BERDecExplicitTag(dec, 0x40000068, NULL, &pBufEnd))
        return 0;
    if (!ASN1BERDecEnum(dec, (ASN1uint32_t *) &(val)->result))
        return 0;
    return ASN1BERDecEndOfContents(dec, NULL, pBufEnd);
}

ASN1int32_t ASN1CALL ASN1Enc_ConnectMCSPDU(ASN1encoding_t enc, ConnectMCSPDU *val)
{
    switch ((val)->choice) {
    case 1:
        if (!ASN1Enc_ConnectInitialPDU(enc, &(val)->u.connect_initial))
            return 0;
        break;
    case 2:
        if (!ASN1Enc_ConnectResponsePDU(enc, &(val)->u.connect_response))
            return 0;
        break;
    case 3:
        if (!ASN1Enc_ConnectAdditionalPDU(enc, &(val)->u.connect_additional))
            return 0;
        break;
    case 4:
        if (!ASN1Enc_ConnectResultPDU(enc, &(val)->u.connect_result))
            return 0;
        break;
    default:
        ASSERT(0);
        return 0;
    }
    return 1;
}

ASN1int32_t ASN1CALL ASN1Dec_ConnectMCSPDU(ASN1decoding_t dec, ConnectMCSPDU *val)
{
    ASN1uint32_t t;
    if (!ASN1BERDecPeekTag(dec, &t))
        return 0;
    switch (t) {
    case 0x40000065:
        (val)->choice = 1;
        if (!ASN1Dec_ConnectInitialPDU(dec, &(val)->u.connect_initial))
            return 0;
        break;
    case 0x40000066:
        (val)->choice = 2;
        if (!ASN1Dec_ConnectResponsePDU(dec, &(val)->u.connect_response))
            return 0;
        break;
    case 0x40000067:
        (val)->choice = 3;
        if (!ASN1Dec_ConnectAdditionalPDU(dec, &(val)->u.connect_additional))
            return 0;
        break;
    case 0x40000068:
        (val)->choice = 4;
        if (!ASN1Dec_ConnectResultPDU(dec, &(val)->u.connect_result))
            return 0;
        break;
    default:
        (val)->choice = -1;
        ASSERT(0);
        return 0;
    }
    return 1;
}