/*
 * Copyright (c) 2017 Lev Walkin <vlm@lionet.info>. All rights reserved.
 * Redistribution and modifications are permitted subject to BSD license.
 */
#ifndef	OER_ENCODER_H
#define	OER_ENCODER_H

#include <asn_application.h>

#ifdef __cplusplus
extern "C" {
#endif

struct asn_TYPE_descriptor_s;	/* Forward declaration */

/*
 * The Octet Encoding Rules (OER, X.696 08/2015) encoder for any type.
 * This function may be invoked directly by the application.
 * Produces CANONICAL-OER output compatible with CANONICAL-OER
 * and BASIC-OER decoders.
 */
asn_enc_rval_t oer_encode(const struct asn_TYPE_descriptor_s *type_descriptor,
                          const void *struct_ptr, /* Structure to be encoded */
                          asn_app_consume_bytes_f *consume_bytes_cb,
                          void *app_key /* Arbitrary callback argument */
);

/* A variant of oer_encode() which encodes data into the pre-allocated buffer */
asn_enc_rval_t oer_encode_to_buffer(
    const struct asn_TYPE_descriptor_s *type_descriptor,
    const asn_oer_constraints_t *constraints,
    const void *struct_ptr, /* Structure to be encoded */
    void *buffer,           /* Pre-allocated buffer */
    size_t buffer_size      /* Initial buffer size (maximum) */
);

/*
 * Type of the generic OER encoder.
 */
typedef asn_enc_rval_t(oer_type_encoder_f)(
    const struct asn_TYPE_descriptor_s *type_descriptor,
    const asn_oer_constraints_t *constraints,
    const void *struct_ptr,                    /* Structure to be encoded */
    asn_app_consume_bytes_f *consume_bytes_cb, /* Callback */
    void *app_key                              /* Arbitrary callback argument */
);

/*
 * Write out the Open Type (X.696 (08/2015), #30).
 * RETURN VALUES:
 *      -1:     Fatal error encoding the type.
 *     >=0:     Number of bytes serialized.
 */
ssize_t oer_open_type_put(const struct asn_TYPE_descriptor_s *td,
                          const asn_oer_constraints_t *constraints,
                          const void *struct_ptr,
                          asn_app_consume_bytes_f *consume_bytes_cb,
                          void *app_key);


/*
 * Length-prefixed buffer encoding for primitive types.
 */
oer_type_encoder_f oer_encode_primitive;

#ifdef __cplusplus
}
#endif

#endif	/* OER_ENCODER_H */
