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