sync/gen_codec.ysl2
author Thomas
Fri, 07 Jun 2019 07:41:36 +0200
branchsequoia_windows
changeset 3819 0c1bcfa6f9f3
parent 3512 a5a45f8fa684
permissions -rw-r--r--
Merge with sync
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@3512
     6
// Copyleft (c) 2018-2019, 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@3058
   106
        #include "platform.h"
vb@3058
   107
vb@2899
   108
        #include "«yml:lcase(@name)»_codec.h"
vb@2899
   109
        #include "../asn.1/«@name».h"
vb@2840
   110
        #include "pEp_internal.h"
vb@2840
   111
        #include "growing_buf.h"
vb@2840
   112
vb@3058
   113
        DYNAMIC_API PEP_STATUS decode_«@name»_message(
vb@2840
   114
                const char *data,
vb@2840
   115
                size_t size,
vb@2840
   116
                «@name»_t **msg
vb@2840
   117
            )
vb@2840
   118
        {
vb@2840
   119
            assert(data && msg);
vb@2840
   120
            if (!(data && msg))
vb@2840
   121
                return PEP_ILLEGAL_VALUE;
vb@2840
   122
vb@2840
   123
            *msg = NULL;
vb@2875
   124
            «@name»_t *_msg = NULL;
vb@2875
   125
            uper_decode_complete(NULL, &asn_DEF_«@name», (void **) &_msg, data, size);
vb@2875
   126
            if (!_msg)
vb@2844
   127
                return PEP_«yml:ucase(@name)»_ILLEGAL_MESSAGE;
vb@2840
   128
vb@2875
   129
            *msg = _msg;
vb@2840
   130
            return PEP_STATUS_OK;
vb@2840
   131
        }
vb@2840
   132
vb@3026
   133
        PEP_STATUS encode_«@name»_message(
vb@2840
   134
                «@name»_t *msg,
vb@2840
   135
                char **data,
vb@2840
   136
                size_t *size
vb@2840
   137
            )
vb@2840
   138
        {
vb@2840
   139
            assert(data && msg);
vb@2840
   140
            if (!(data && msg))
vb@2840
   141
                return PEP_ILLEGAL_VALUE;
vb@2840
   142
vb@2840
   143
            *data = NULL;
vb@2840
   144
            *size = 0;
vb@2840
   145
vb@2840
   146
            char *_data = NULL;
vb@2840
   147
            ssize_t _size = uper_encode_to_new_buffer(&asn_DEF_«@name», NULL, msg,
vb@2840
   148
                    (void **) &_data);
vb@2840
   149
            if (_size == -1)
vb@2840
   150
                return PEP_CANNOT_ENCODE;
vb@2840
   151
vb@2840
   152
            *data = _data;
vb@2840
   153
            *size = (size_t) _size;
vb@2840
   154
vb@2840
   155
            return PEP_STATUS_OK;
vb@2840
   156
        }
vb@2840
   157
vb@3026
   158
        PEP_STATUS PER_to_XER_«@name»_msg(
vb@2840
   159
                const char *data,
vb@2840
   160
                size_t size,
vb@2840
   161
                char **text
vb@2840
   162
            )
vb@2840
   163
        {
vb@2840
   164
            PEP_STATUS status = PEP_STATUS_OK;
vb@2840
   165
            growing_buf_t *dst = NULL;
vb@2840
   166
vb@2840
   167
            assert(data && text);
vb@2840
   168
            if (!(data && text))
vb@2840
   169
                return PEP_ILLEGAL_VALUE;
vb@2840
   170
vb@2840
   171
            *text = NULL;
vb@2840
   172
vb@2840
   173
            «@name»_t *msg = NULL;
vb@2841
   174
            status = decode_«@name»_message(data, size, &msg);
vb@2840
   175
            if (status)
vb@2840
   176
                goto the_end;
vb@2840
   177
vb@2840
   178
            dst = new_growing_buf();
vb@2840
   179
            if (!dst) {
vb@2840
   180
                status = PEP_OUT_OF_MEMORY;
vb@2840
   181
                goto the_end;
vb@2840
   182
            }
vb@2840
   183
vb@2840
   184
            asn_enc_rval_t er = xer_encode(&asn_DEF_«@name», msg, XER_F_BASIC,
vb@2840
   185
                    (asn_app_consume_bytes_f *) growing_buf_consume, (void *) dst);
vb@2840
   186
            if (er.encoded == -1) {
vb@2840
   187
                status = PEP_CANNOT_ENCODE;
vb@2840
   188
                goto the_end;
vb@2840
   189
            }
vb@2840
   190
vb@2840
   191
            *text = dst->data;
vb@2840
   192
            dst->data = NULL;
vb@2840
   193
vb@2840
   194
        the_end:
vb@2840
   195
            free_growing_buf(dst);
vb@2840
   196
            ASN_STRUCT_FREE(asn_DEF_«@name», msg);
vb@2840
   197
            return status;
vb@2840
   198
        }
vb@2840
   199
vb@3026
   200
        PEP_STATUS XER_to_PER_«@name»_msg(
vb@2840
   201
                const char *text,
vb@2840
   202
                char **data,
vb@2840
   203
                size_t *size
vb@2840
   204
            )
vb@2840
   205
        {
vb@2840
   206
            PEP_STATUS status = PEP_STATUS_OK;
vb@2840
   207
vb@2840
   208
            assert(text && data && size);
vb@2840
   209
            if (!(text && data && size))
vb@2840
   210
                return PEP_ILLEGAL_VALUE;
vb@2840
   211
vb@2840
   212
            *data = NULL;
vb@2840
   213
            *size = 0;
vb@2840
   214
vb@2840
   215
            «@name»_t *msg = NULL;
vb@2840
   216
            asn_dec_rval_t dr = xer_decode(NULL, &asn_DEF_«@name», (void **) &msg,
vb@2840
   217
                    (const void *) text, strlen(text));
vb@2840
   218
            if (dr.code != RC_OK) {
vb@2844
   219
                status = PEP_«yml:ucase(@name)»_ILLEGAL_MESSAGE;
vb@2840
   220
                goto the_end;
vb@2840
   221
            }
vb@2840
   222
vb@2840
   223
            char *_data = NULL;
vb@2840
   224
            size_t _size = 0;
vb@2841
   225
            status = encode_«@name»_message(msg, &_data, &_size);
vb@2840
   226
            if (status)
vb@2840
   227
                goto the_end;
vb@2840
   228
vb@2840
   229
            *data = _data;
vb@2840
   230
            *size = (size_t) _size;
vb@2840
   231
vb@2840
   232
        the_end:
vb@2840
   233
            ASN_STRUCT_FREE(asn_DEF_«@name», msg);
vb@2840
   234
            return status;
vb@2840
   235
        }
vb@2840
   236
vb@2840
   237
        ||
vb@2840
   238
    }
vb@2840
   239
}
vb@2840
   240