sync/gen_codec.ysl2
author Volker Birk <vb@pep.foundation>
Wed, 29 Aug 2018 17:10:23 +0200
branchsync
changeset 2899 63b619aef131
parent 2875 8e3169c2952a
child 3026 c3e63f6aa233
permissions -rw-r--r--
somewhat bigger
vb@2840
     1
// This file is under GNU General Public License 3.0
vb@2840
     2
// see LICENSE.txt
vb@2840
     3
vb@2840
     4
// generate conditions and actions
vb@2840
     5
vb@2840
     6
// Copyleft (c) 2018, p≡p foundation
vb@2840
     7
vb@2840
     8
// Written by Volker Birk
vb@2840
     9
vb@2840
    10
include yslt.yml2
vb@2840
    11
vb@2840
    12
tstylesheet {
vb@2840
    13
    include standardlib.ysl2
vb@2840
    14
vb@2840
    15
    template "/protocol" {
vb@2899
    16
        document "generated/{yml:lcase(@name)}_codec.h", "text"
vb@2840
    17
        ||
vb@2840
    18
        // This file is under GNU General Public License 3.0
vb@2840
    19
        // see LICENSE.txt
vb@2840
    20
vb@2840
    21
        #pragma once
vb@2840
    22
vb@2840
    23
vb@2840
    24
        #include "pEpEngine.h"
vb@2840
    25
vb@2840
    26
vb@2840
    27
        #ifdef __cplusplus
vb@2840
    28
        extern "C" {
vb@2840
    29
        #endif
vb@2840
    30
vb@2840
    31
vb@2899
    32
        struct «@name»;
vb@2899
    33
vb@2841
    34
        // decode_«@name»_message() - decode PER encoded «@name» message
vb@2840
    35
        //
vb@2840
    36
        //  parameters:
vb@2840
    37
        //      data (in)               PER encoded data
vb@2840
    38
        //      size (in)               size of PER encoded data
vb@2840
    39
        //      msg (out)               «@name» message
vb@2840
    40
        //
vb@2840
    41
        //  caveat:
vb@2840
    42
        //      msg goes into the ownership of the caller
vb@2840
    43
vb@2841
    44
        DYNAMIC_API PEP_STATUS decode_«@name»_message(
vb@2840
    45
                const char *data,
vb@2840
    46
                size_t size,
vb@2899
    47
                struct «@name» **msg
vb@2840
    48
            );
vb@2840
    49
vb@2840
    50
vb@2841
    51
        // encode_«@name»_message() - encode «@name» message into PER encoded data
vb@2840
    52
        //
vb@2840
    53
        //  parameters:
vb@2840
    54
        //      msg (in)                «@name» message
vb@2840
    55
        //      data (out)              PER encoded data
vb@2840
    56
        //      size (out)              size of PER encoded data
vb@2840
    57
        //
vb@2840
    58
        //  caveat:
vb@2840
    59
        //      data goes to the ownership of the caller
vb@2840
    60
vb@2841
    61
        DYNAMIC_API PEP_STATUS encode_«@name»_message(
vb@2899
    62
                struct «@name» *msg,
vb@2840
    63
                char **data,
vb@2840
    64
                size_t *size
vb@2840
    65
            );
vb@2840
    66
vb@2840
    67
vb@2840
    68
        // PER_to_XER_«@name»_msg() - decode «@name» message from PER into XER
vb@2840
    69
        //
vb@2840
    70
        //  parameters:
vb@2840
    71
        //      data (in)               PER encoded data
vb@2840
    72
        //      size (in)               size of PER encoded data
vb@2840
    73
        //      text (out)              XER text of the same «@name» message
vb@2840
    74
vb@2840
    75
        DYNAMIC_API PEP_STATUS PER_to_XER_«@name»_msg(
vb@2840
    76
                const char *data,
vb@2840
    77
                size_t size,
vb@2840
    78
                char **text
vb@2840
    79
            );
vb@2840
    80
vb@2840
    81
vb@2840
    82
        // XER_to_PER_«@name»_msg() - encode «@name» message from XER into PER
vb@2840
    83
        //
vb@2840
    84
        //  parameters:
vb@2840
    85
        //      text (in)               string with XER text of the «@name» message
vb@2840
    86
        //      data (out)              PER encoded data
vb@2840
    87
        //      size (out)              size of PER encoded data
vb@2840
    88
vb@2840
    89
        DYNAMIC_API PEP_STATUS XER_to_PER_«@name»_msg(
vb@2840
    90
                const char *text,
vb@2840
    91
                char **data,
vb@2840
    92
                size_t *size
vb@2840
    93
            );
vb@2840
    94
vb@2840
    95
vb@2840
    96
        #ifdef __cplusplus
vb@2840
    97
        }
vb@2840
    98
        #endif
vb@2840
    99
vb@2840
   100
        ||
vb@2899
   101
        document "generated/{yml:lcase(@name)}_codec.c", "text"
vb@2840
   102
        ||
vb@2840
   103
        // This file is under GNU General Public License 3.0
vb@2840
   104
        // see LICENSE.txt
vb@2840
   105
vb@2899
   106
        #include "«yml:lcase(@name)»_codec.h"
vb@2899
   107
        #include "../asn.1/«@name».h"
vb@2840
   108
        #include "pEp_internal.h"
vb@2840
   109
        #include "growing_buf.h"
vb@2840
   110
vb@2841
   111
        DYNAMIC_API PEP_STATUS decode_«@name»_message(
vb@2840
   112
                const char *data,
vb@2840
   113
                size_t size,
vb@2840
   114
                «@name»_t **msg
vb@2840
   115
            )
vb@2840
   116
        {
vb@2840
   117
            assert(data && msg);
vb@2840
   118
            if (!(data && msg))
vb@2840
   119
                return PEP_ILLEGAL_VALUE;
vb@2840
   120
vb@2840
   121
            *msg = NULL;
vb@2875
   122
            «@name»_t *_msg = NULL;
vb@2875
   123
            uper_decode_complete(NULL, &asn_DEF_«@name», (void **) &_msg, data, size);
vb@2875
   124
            if (!_msg)
vb@2844
   125
                return PEP_«yml:ucase(@name)»_ILLEGAL_MESSAGE;
vb@2840
   126
vb@2875
   127
            *msg = _msg;
vb@2840
   128
            return PEP_STATUS_OK;
vb@2840
   129
        }
vb@2840
   130
vb@2841
   131
        DYNAMIC_API PEP_STATUS encode_«@name»_message(
vb@2840
   132
                «@name»_t *msg,
vb@2840
   133
                char **data,
vb@2840
   134
                size_t *size
vb@2840
   135
            )
vb@2840
   136
        {
vb@2840
   137
            assert(data && msg);
vb@2840
   138
            if (!(data && msg))
vb@2840
   139
                return PEP_ILLEGAL_VALUE;
vb@2840
   140
vb@2840
   141
            *data = NULL;
vb@2840
   142
            *size = 0;
vb@2840
   143
vb@2840
   144
            char *_data = NULL;
vb@2840
   145
            ssize_t _size = uper_encode_to_new_buffer(&asn_DEF_«@name», NULL, msg,
vb@2840
   146
                    (void **) &_data);
vb@2840
   147
            if (_size == -1)
vb@2840
   148
                return PEP_CANNOT_ENCODE;
vb@2840
   149
vb@2840
   150
            *data = _data;
vb@2840
   151
            *size = (size_t) _size;
vb@2840
   152
vb@2840
   153
            return PEP_STATUS_OK;
vb@2840
   154
        }
vb@2840
   155
vb@2840
   156
        DYNAMIC_API PEP_STATUS PER_to_XER_«@name»_msg(
vb@2840
   157
                const char *data,
vb@2840
   158
                size_t size,
vb@2840
   159
                char **text
vb@2840
   160
            )
vb@2840
   161
        {
vb@2840
   162
            PEP_STATUS status = PEP_STATUS_OK;
vb@2840
   163
            growing_buf_t *dst = NULL;
vb@2840
   164
vb@2840
   165
            assert(data && text);
vb@2840
   166
            if (!(data && text))
vb@2840
   167
                return PEP_ILLEGAL_VALUE;
vb@2840
   168
vb@2840
   169
            *text = NULL;
vb@2840
   170
vb@2840
   171
            «@name»_t *msg = NULL;
vb@2841
   172
            status = decode_«@name»_message(data, size, &msg);
vb@2840
   173
            if (status)
vb@2840
   174
                goto the_end;
vb@2840
   175
vb@2840
   176
            dst = new_growing_buf();
vb@2840
   177
            if (!dst) {
vb@2840
   178
                status = PEP_OUT_OF_MEMORY;
vb@2840
   179
                goto the_end;
vb@2840
   180
            }
vb@2840
   181
vb@2840
   182
            asn_enc_rval_t er = xer_encode(&asn_DEF_«@name», msg, XER_F_BASIC,
vb@2840
   183
                    (asn_app_consume_bytes_f *) growing_buf_consume, (void *) dst);
vb@2840
   184
            if (er.encoded == -1) {
vb@2840
   185
                status = PEP_CANNOT_ENCODE;
vb@2840
   186
                goto the_end;
vb@2840
   187
            }
vb@2840
   188
vb@2840
   189
            *text = dst->data;
vb@2840
   190
            dst->data = NULL;
vb@2840
   191
vb@2840
   192
        the_end:
vb@2840
   193
            free_growing_buf(dst);
vb@2840
   194
            ASN_STRUCT_FREE(asn_DEF_«@name», msg);
vb@2840
   195
            return status;
vb@2840
   196
        }
vb@2840
   197
vb@2840
   198
        DYNAMIC_API PEP_STATUS XER_to_PER_«@name»_msg(
vb@2840
   199
                const char *text,
vb@2840
   200
                char **data,
vb@2840
   201
                size_t *size
vb@2840
   202
            )
vb@2840
   203
        {
vb@2840
   204
            PEP_STATUS status = PEP_STATUS_OK;
vb@2840
   205
vb@2840
   206
            assert(text && data && size);
vb@2840
   207
            if (!(text && data && size))
vb@2840
   208
                return PEP_ILLEGAL_VALUE;
vb@2840
   209
vb@2840
   210
            *data = NULL;
vb@2840
   211
            *size = 0;
vb@2840
   212
vb@2840
   213
            «@name»_t *msg = NULL;
vb@2840
   214
            asn_dec_rval_t dr = xer_decode(NULL, &asn_DEF_«@name», (void **) &msg,
vb@2840
   215
                    (const void *) text, strlen(text));
vb@2840
   216
            if (dr.code != RC_OK) {
vb@2844
   217
                status = PEP_«yml:ucase(@name)»_ILLEGAL_MESSAGE;
vb@2840
   218
                goto the_end;
vb@2840
   219
            }
vb@2840
   220
vb@2840
   221
            char *_data = NULL;
vb@2840
   222
            size_t _size = 0;
vb@2841
   223
            status = encode_«@name»_message(msg, &_data, &_size);
vb@2840
   224
            if (status)
vb@2840
   225
                goto the_end;
vb@2840
   226
vb@2840
   227
            *data = _data;
vb@2840
   228
            *size = (size_t) _size;
vb@2840
   229
vb@2840
   230
        the_end:
vb@2840
   231
            ASN_STRUCT_FREE(asn_DEF_«@name», msg);
vb@2840
   232
            return status;
vb@2840
   233
        }
vb@2840
   234
vb@2840
   235
        ||
vb@2840
   236
    }
vb@2840
   237
}
vb@2840
   238