sync/gen_codec.ysl2
author Volker Birk <vb@pep.foundation>
Mon, 13 Aug 2018 16:45:23 +0200
branchsync
changeset 2844 6fce34991f7d
parent 2841 3b56e21206cd
child 2875 8e3169c2952a
permissions -rw-r--r--
...
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@2840
   120
            uper_decode_complete(NULL, &asn_DEF_«@name», (void **) &msg, data, size);
vb@2840
   121
            if (!msg)
vb@2844
   122
                return PEP_«yml:ucase(@name)»_ILLEGAL_MESSAGE;
vb@2840
   123
vb@2840
   124
            return PEP_STATUS_OK;
vb@2840
   125
        }
vb@2840
   126
vb@2841
   127
        DYNAMIC_API PEP_STATUS encode_«@name»_message(
vb@2840
   128
                «@name»_t *msg,
vb@2840
   129
                char **data,
vb@2840
   130
                size_t *size
vb@2840
   131
            )
vb@2840
   132
        {
vb@2840
   133
            assert(data && msg);
vb@2840
   134
            if (!(data && msg))
vb@2840
   135
                return PEP_ILLEGAL_VALUE;
vb@2840
   136
vb@2840
   137
            *data = NULL;
vb@2840
   138
            *size = 0;
vb@2840
   139
vb@2840
   140
            char *_data = NULL;
vb@2840
   141
            ssize_t _size = uper_encode_to_new_buffer(&asn_DEF_«@name», NULL, msg,
vb@2840
   142
                    (void **) &_data);
vb@2840
   143
            if (_size == -1)
vb@2840
   144
                return PEP_CANNOT_ENCODE;
vb@2840
   145
vb@2840
   146
            *data = _data;
vb@2840
   147
            *size = (size_t) _size;
vb@2840
   148
vb@2840
   149
            return PEP_STATUS_OK;
vb@2840
   150
        }
vb@2840
   151
vb@2840
   152
        DYNAMIC_API PEP_STATUS PER_to_XER_«@name»_msg(
vb@2840
   153
                const char *data,
vb@2840
   154
                size_t size,
vb@2840
   155
                char **text
vb@2840
   156
            )
vb@2840
   157
        {
vb@2840
   158
            PEP_STATUS status = PEP_STATUS_OK;
vb@2840
   159
            growing_buf_t *dst = NULL;
vb@2840
   160
vb@2840
   161
            assert(data && text);
vb@2840
   162
            if (!(data && text))
vb@2840
   163
                return PEP_ILLEGAL_VALUE;
vb@2840
   164
vb@2840
   165
            *text = NULL;
vb@2840
   166
vb@2840
   167
            «@name»_t *msg = NULL;
vb@2841
   168
            status = decode_«@name»_message(data, size, &msg);
vb@2840
   169
            if (status)
vb@2840
   170
                goto the_end;
vb@2840
   171
vb@2840
   172
            dst = new_growing_buf();
vb@2840
   173
            if (!dst) {
vb@2840
   174
                status = PEP_OUT_OF_MEMORY;
vb@2840
   175
                goto the_end;
vb@2840
   176
            }
vb@2840
   177
vb@2840
   178
            asn_enc_rval_t er = xer_encode(&asn_DEF_«@name», msg, XER_F_BASIC,
vb@2840
   179
                    (asn_app_consume_bytes_f *) growing_buf_consume, (void *) dst);
vb@2840
   180
            if (er.encoded == -1) {
vb@2840
   181
                status = PEP_CANNOT_ENCODE;
vb@2840
   182
                goto the_end;
vb@2840
   183
            }
vb@2840
   184
vb@2840
   185
            *text = dst->data;
vb@2840
   186
            dst->data = NULL;
vb@2840
   187
vb@2840
   188
        the_end:
vb@2840
   189
            free_growing_buf(dst);
vb@2840
   190
            ASN_STRUCT_FREE(asn_DEF_«@name», msg);
vb@2840
   191
            return status;
vb@2840
   192
        }
vb@2840
   193
vb@2840
   194
        DYNAMIC_API PEP_STATUS XER_to_PER_«@name»_msg(
vb@2840
   195
                const char *text,
vb@2840
   196
                char **data,
vb@2840
   197
                size_t *size
vb@2840
   198
            )
vb@2840
   199
        {
vb@2840
   200
            PEP_STATUS status = PEP_STATUS_OK;
vb@2840
   201
vb@2840
   202
            assert(text && data && size);
vb@2840
   203
            if (!(text && data && size))
vb@2840
   204
                return PEP_ILLEGAL_VALUE;
vb@2840
   205
vb@2840
   206
            *data = NULL;
vb@2840
   207
            *size = 0;
vb@2840
   208
vb@2840
   209
            «@name»_t *msg = NULL;
vb@2840
   210
            asn_dec_rval_t dr = xer_decode(NULL, &asn_DEF_«@name», (void **) &msg,
vb@2840
   211
                    (const void *) text, strlen(text));
vb@2840
   212
            if (dr.code != RC_OK) {
vb@2844
   213
                status = PEP_«yml:ucase(@name)»_ILLEGAL_MESSAGE;
vb@2840
   214
                goto the_end;
vb@2840
   215
            }
vb@2840
   216
vb@2840
   217
            char *_data = NULL;
vb@2840
   218
            size_t _size = 0;
vb@2841
   219
            status = encode_«@name»_message(msg, &_data, &_size);
vb@2840
   220
            if (status)
vb@2840
   221
                goto the_end;
vb@2840
   222
vb@2840
   223
            *data = _data;
vb@2840
   224
            *size = (size_t) _size;
vb@2840
   225
vb@2840
   226
        the_end:
vb@2840
   227
            ASN_STRUCT_FREE(asn_DEF_«@name», msg);
vb@2840
   228
            return status;
vb@2840
   229
        }
vb@2840
   230
vb@2840
   231
        ||
vb@2840
   232
    }
vb@2840
   233
}
vb@2840
   234