~ubuntu-branches/debian/squeeze/erlang/squeeze

« back to all changes in this revision

Viewing changes to lib/megaco/src/text/megaco_text_gen_v3.hrl

  • Committer: Bazaar Package Importer
  • Author(s): Erlang Packagers, Sergei Golovan
  • Date: 2006-12-03 17:07:44 UTC
  • mfrom: (2.1.11 feisty)
  • Revision ID: james.westby@ubuntu.com-20061203170744-rghjwupacqlzs6kv
Tags: 1:11.b.2-4
[ Sergei Golovan ]
Fixed erlang-base and erlang-base-hipe prerm scripts.

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
%% ``The contents of this file are subject to the Erlang Public License,
 
2
%% Version 1.1, (the "License"); you may not use this file except in
 
3
%% compliance with the License. You should have received a copy of the
 
4
%% Erlang Public License along with this software. If not, it can be
 
5
%% retrieved via the world wide web at http://www.erlang.org/.
 
6
%% 
 
7
%% Software distributed under the License is distributed on an "AS IS"
 
8
%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
 
9
%% the License for the specific language governing rights and limitations
 
10
%% under the License.
 
11
%% 
 
12
%% The Initial Developer of the Original Code is Ericsson Utvecklings AB.
 
13
%% Portions created by Ericsson are Copyright 1999, Ericsson Utvecklings
 
14
%% AB. All Rights Reserved.''
 
15
%% 
 
16
%%     $Id$
 
17
%%
 
18
%%----------------------------------------------------------------------
 
19
%% Purpose: Encode V2 Megaco/H.248 text messages from internal form
 
20
%% The following was changed:
 
21
%% - MuxType (Nx64kToken)
 
22
%% - auditItem (terminationAudit)
 
23
%% - serviceChangeParm (auditItem)
 
24
%% 
 
25
%% The following was added:
 
26
%% - All IndAud stuff
 
27
%%----------------------------------------------------------------------
 
28
 
 
29
%% -define(d(F,A), io:format("~w:" ++ F ++ "~n", [?MODULE|A])).
 
30
               
 
31
-define(META_ENC(Type, Item), Item) .
 
32
%% -define(META_ENC(Type, Item), megaco_meta_package:encode(text, Type, Item)).
 
33
%% -define(META_DEC(Type, Item), megaco_meta_package:decode(text, Type, Item)).
 
34
 
 
35
enc_MegacoMessage(Val) ->
 
36
    State = ?INIT_INDENT,
 
37
    enc_MegacoMessage(Val, State).
 
38
 
 
39
enc_MegacoMessage(Val, State)
 
40
  when record(Val, 'MegacoMessage') ->
 
41
    [
 
42
     ?LWSP,
 
43
     enc_AuthenticationHeader(Val#'MegacoMessage'.authHeader, State),
 
44
     enc_Message(Val#'MegacoMessage'.mess, State)
 
45
    ].
 
46
 
 
47
%% Note that encoding the transaction this way
 
48
%% make the message look a bit strange.
 
49
enc_Transaction(Val) ->
 
50
    State = ?INIT_INDENT,
 
51
    enc_Transaction(Val, State).
 
52
 
 
53
%% Note that encoding the action request's this way
 
54
%% make the message look a bit strange.
 
55
enc_ActionRequests(Val) ->
 
56
    State = ?INIT_INDENT,
 
57
    enc_TransactionRequest_actions(Val, State).
 
58
 
 
59
%% Note that encoding the action request this way
 
60
%% make the message look a bit strange.
 
61
enc_ActionRequest(Val) ->
 
62
    State = ?INIT_INDENT,
 
63
    enc_ActionRequest(Val, State).
 
64
 
 
65
enc_CommandRequest(Val) ->
 
66
    State = ?INIT_INDENT,
 
67
    enc_CommandRequest(Val, State).
 
68
 
 
69
enc_ActionReply(Val) ->
 
70
    State = ?INIT_INDENT,
 
71
    enc_ActionReply(Val, State).
 
72
 
 
73
enc_AuthenticationHeader(asn1_NOVALUE, _State) ->
 
74
    [];
 
75
enc_AuthenticationHeader(Val, State)
 
76
  when record(Val, 'AuthenticationHeader') ->
 
77
    [
 
78
     ?AuthToken,
 
79
     ?EQUAL,
 
80
     enc_SecurityParmIndex(Val#'AuthenticationHeader'.secParmIndex, State),
 
81
     ?COLON,
 
82
     enc_SequenceNum(Val#'AuthenticationHeader'.seqNum, State),
 
83
     ?COLON,
 
84
     enc_AuthData(Val#'AuthenticationHeader'.ad, State),
 
85
     ?SEP_INDENT(State)
 
86
    ].
 
87
 
 
88
enc_SecurityParmIndex({'SecurityParmIndex',Val}, State) ->
 
89
    enc_SecurityParmIndex(Val, State);
 
90
enc_SecurityParmIndex(Val, State) ->
 
91
    [
 
92
     "0x",
 
93
     enc_HEXDIG(Val, State, 8, 8)
 
94
    ].
 
95
 
 
96
enc_SequenceNum({'SequenceNum',Val}, State) ->
 
97
    enc_SequenceNum(Val, State);
 
98
enc_SequenceNum(Val, State) ->
 
99
    [
 
100
     "0x",
 
101
     enc_HEXDIG(Val, State, 8, 8)
 
102
    ].
 
103
 
 
104
enc_AuthData({'AuthData',Val}, State) ->
 
105
    enc_AuthData(Val, State);
 
106
enc_AuthData(Val, State) ->
 
107
    [
 
108
     "0x",
 
109
     enc_HEXDIG(Val, State, 24, 64)  %% OTP-4710
 
110
    ].
 
111
 
 
112
enc_Message(Val, State)
 
113
  when record(Val, 'Message') ->
 
114
    [
 
115
     ?MegacopToken,
 
116
     ?SLASH,
 
117
     enc_version(Val#'Message'.version, State),
 
118
     ?SEP,
 
119
     enc_MId(Val#'Message'.mId, State),
 
120
     ?SEP_INDENT(State),
 
121
     enc_Message_messageBody(Val#'Message'.messageBody, State)
 
122
    ].
 
123
 
 
124
enc_version(Val, State) when integer(Val), Val >= 0 ->
 
125
    enc_DIGIT(Val, State, 0, 99).
 
126
 
 
127
enc_Message_messageBody({'Message_messageBody',Val}, State) ->
 
128
    enc_Message_messageBody(Val, State);
 
129
enc_Message_messageBody({Tag, Val}, State) ->
 
130
    case Tag of
 
131
        messageError ->
 
132
            enc_ErrorDescriptor(Val, State);
 
133
        transactions ->
 
134
            enc_Message_messageBody_transactions(Val, State);
 
135
        _ ->
 
136
            error({invalid_messageBody_tag, Tag})
 
137
    end.
 
138
 
 
139
enc_Message_messageBody_transactions({'Message_messageBody_transactions',Val}, 
 
140
                                     State) ->
 
141
    enc_Message_messageBody_transactions(Val, State);
 
142
enc_Message_messageBody_transactions(Val, State)
 
143
  when list(Val), Val /= []->
 
144
    [enc_Transaction(T, State) || T <- Val].
 
145
 
 
146
enc_MId({'MId',Val}, State) ->
 
147
    enc_MId(Val, State);
 
148
enc_MId({Tag, Val}, State) ->
 
149
    case Tag of
 
150
        ip4Address ->
 
151
            enc_IP4Address(Val, State);
 
152
        ip6Address ->
 
153
            enc_IP6Address(Val, State);
 
154
        domainName ->
 
155
            enc_DomainName(Val, State);
 
156
        deviceName ->
 
157
            enc_PathName(Val, State);
 
158
        mtpAddress ->
 
159
            enc_mtpAddress(Val, State);
 
160
        _ ->
 
161
            error({invalid_MId_tag, Tag})
 
162
    end.
 
163
 
 
164
enc_mtpAddress(Val, State) ->
 
165
    [
 
166
     ?MtpToken,
 
167
     ?LBRKT,
 
168
     enc_OCTET_STRING(Val, State, 2, 4),
 
169
     ?RBRKT
 
170
    ].
 
171
 
 
172
enc_DomainName(Val, State)
 
173
  when record(Val, 'DomainName') ->
 
174
    [
 
175
     $<,
 
176
     %% BUGBUG: (ALPHA / DIGIT) *63(ALPHA / DIGIT / "-" / ".")
 
177
     enc_STRING(Val#'DomainName'.name, State, 1, 64),
 
178
     $>,
 
179
     case Val#'DomainName'.portNumber of
 
180
         asn1_NOVALUE ->
 
181
             [];
 
182
         PortNumber ->
 
183
             [
 
184
              $:,
 
185
              enc_portNumber(PortNumber, State)
 
186
             ]
 
187
     end
 
188
    ].
 
189
 
 
190
enc_IP4Address(Val, State)
 
191
  when record(Val, 'IP4Address') ->
 
192
    [A1, A2, A3, A4] = Val#'IP4Address'.address,
 
193
    [
 
194
     $[,
 
195
     enc_V4hex(A1, State),
 
196
     ?DOT,
 
197
     enc_V4hex(A2, State),
 
198
     ?DOT,
 
199
     enc_V4hex(A3, State),
 
200
     ?DOT,
 
201
     enc_V4hex(A4, State),    
 
202
     $],
 
203
     case Val#'IP4Address'.portNumber of
 
204
         asn1_NOVALUE ->
 
205
             [];
 
206
         PortNumber ->
 
207
             [
 
208
              $:,
 
209
              enc_portNumber(PortNumber, State)
 
210
             ]
 
211
     end
 
212
    ].
 
213
 
 
214
enc_V4hex(Val, State) ->
 
215
    enc_DIGIT(Val, State, 0, 255).
 
216
 
 
217
enc_IP6Address(Val, State)
 
218
  when record(Val, 'IP6Address'),
 
219
       list(Val#'IP6Address'.address),
 
220
       length(Val#'IP6Address'.address) == 16 ->
 
221
    [
 
222
     $[,
 
223
     enc_IP6Address_address(Val#'IP6Address'.address, State),
 
224
     $],
 
225
     case Val#'IP6Address'.portNumber of
 
226
         asn1_NOVALUE ->
 
227
             [];
 
228
         PortNumber ->
 
229
             [
 
230
              $:,
 
231
              enc_portNumber(PortNumber, State)
 
232
             ]
 
233
     end
 
234
    ].
 
235
 
 
236
enc_IP6Address_address([0, 0|Addr], State) ->
 
237
    enc_IP6Address_address2(Addr, 1, false, true, State);
 
238
enc_IP6Address_address(Addr, State) ->
 
239
    enc_IP6Address_address2(Addr, 0, false, false, State).
 
240
 
 
241
enc_IP6Address_address2([0,0], 0, _Padding, _First, _State) ->
 
242
    [$0];
 
243
enc_IP6Address_address2([0,0], PadN, false, true, _State) when PadN > 0 ->
 
244
    [$:, $:]; % Padding from the beginning (all zero's)
 
245
enc_IP6Address_address2([0,0], PadN, false, false, _State) when PadN > 0 ->
 
246
    [$:]; % Padding in the middle or end
 
247
enc_IP6Address_address2([0,0], _, true, _First, _State) ->
 
248
    [$0];
 
249
enc_IP6Address_address2([N1,N2], 0, _Padding, _First, State) ->
 
250
    [enc_hex4([N1, N2], State)];
 
251
enc_IP6Address_address2([N1,N2], 1, _Padding, _First, State) ->
 
252
    [$0, $:, enc_hex4([N1, N2], State)];
 
253
enc_IP6Address_address2([N1,N2], PadN, false, true, State) when PadN > 1 ->
 
254
    [$:, $:, enc_hex4([N1, N2], State)];
 
255
enc_IP6Address_address2([N1,N2], PadN, false, false, State) when PadN > 1 ->
 
256
    [$:, enc_hex4([N1, N2], State)];
 
257
enc_IP6Address_address2([N1,N2], _PadN, true, _First, State) ->
 
258
    [enc_hex4([N1, N2], State)];
 
259
enc_IP6Address_address2([0, 0|Ns], PadN, false, First, State) ->
 
260
    enc_IP6Address_address2(Ns, PadN+1, false, First, State);
 
261
enc_IP6Address_address2([0, 0|Ns], _PadN, true, _First, State) ->
 
262
    [
 
263
     $0,
 
264
     $:,
 
265
     enc_IP6Address_address2(Ns, 0, true, false, State)
 
266
    ];
 
267
enc_IP6Address_address2([N1, N2|Ns], 0, Padded, _First, State) ->
 
268
    [
 
269
     enc_hex4([N1, N2], State),
 
270
     $:,
 
271
     enc_IP6Address_address2(Ns, 0, Padded, false, State)
 
272
    ];
 
273
enc_IP6Address_address2([N1, N2|Ns], 1, Padded, _First, State) ->
 
274
    [
 
275
     $0,
 
276
     $:,
 
277
     enc_hex4([N1, N2], State),
 
278
     $:,
 
279
     enc_IP6Address_address2(Ns, 0, Padded, false, State)
 
280
    ];
 
281
enc_IP6Address_address2([N1, N2|Ns], PadN, false, true, State) when PadN > 1 ->
 
282
    %% Padding from the beginning
 
283
    [
 
284
     $:,
 
285
     $:,
 
286
     enc_hex4([N1, N2], State),
 
287
     $:,
 
288
     enc_IP6Address_address2(Ns, 0, true, false, State)
 
289
    ];
 
290
enc_IP6Address_address2([N1, N2|Ns], PadN, false, false, State) 
 
291
  when PadN > 1 ->
 
292
    [
 
293
     $:,  %% The other ':' has already added
 
294
     enc_hex4([N1, N2], State),
 
295
     $:,
 
296
     enc_IP6Address_address2(Ns, 0, true, false, State)
 
297
    ];
 
298
enc_IP6Address_address2([N1, N2|Ns], _PadN, true, _First, State) ->
 
299
    [
 
300
     enc_hex4([N1, N2], State),
 
301
     $:,
 
302
     enc_IP6Address_address2(Ns, 0, true, false, State)
 
303
    ].
 
304
 
 
305
 
 
306
enc_hex4([0,0], _State) ->
 
307
    $0;
 
308
enc_hex4([0,N], _State) ->
 
309
    hex(N);
 
310
enc_hex4([N1, N2], _State) when N2 =< 15 ->
 
311
    [hex(N1), $0, hex(N2)];
 
312
enc_hex4([N1, N2], _State) ->
 
313
    [hex(N1), hex(N2)].
 
314
 
 
315
enc_PathName({'PathName',Val}, State) ->
 
316
    enc_PathName(Val, State);
 
317
enc_PathName(Val, State) ->
 
318
    %% BUGBUG: ["*"] NAME *("/" / "*"/ ALPHA / DIGIT /"_" / "$" ) 
 
319
    %% BUGBUG: ["@" pathDomainName ]
 
320
    enc_STRING(Val, State, 1, 64).
 
321
 
 
322
enc_Transaction(Bin, _State) when binary(Bin) ->
 
323
    [Bin]; %% Already encoded...
 
324
enc_Transaction({'Transaction',Val}, State) ->
 
325
    enc_Transaction(Val, State);
 
326
enc_Transaction({Tag, Val}, State) ->
 
327
    case Tag of
 
328
        transactionRequest ->
 
329
            enc_TransactionRequest(Val, State);
 
330
        transactionPending ->
 
331
            enc_TransactionPending(Val, State);
 
332
        transactionReply ->
 
333
            enc_TransactionReply(Val, State);
 
334
        transactionResponseAck ->
 
335
            enc_TransactionResponseAck(Val, State);
 
336
        _ ->
 
337
            error({invalid_Transaction_tag, Tag})
 
338
    end.
 
339
 
 
340
enc_TransactionResponseAck([Mand | Opt], State) ->
 
341
    [
 
342
     ?ResponseAckToken,
 
343
     ?LBRKT_INDENT(State),
 
344
     [enc_TransactionAck(Mand, State) |
 
345
      [[?COMMA_INDENT(State), enc_TransactionAck(Val, State)] || Val <- Opt]],
 
346
     ?RBRKT_INDENT(State)
 
347
    ].
 
348
    
 
349
enc_TransactionAck(Val, State)
 
350
  when record(Val, 'TransactionAck') ->
 
351
    [
 
352
     enc_TransactionId(Val#'TransactionAck'.firstAck, ?INC_INDENT(State)),
 
353
     case Val#'TransactionAck'.lastAck of
 
354
         asn1_NOVALUE ->
 
355
             [];
 
356
         LastAck ->
 
357
             ["-",enc_TransactionId(LastAck, State)]
 
358
     end
 
359
    ].
 
360
 
 
361
enc_TransactionId({'TransactionId',Val}, State) ->
 
362
    enc_TransactionId(Val, State);
 
363
enc_TransactionId(Val, State) ->
 
364
    enc_UINT32(Val, State).
 
365
 
 
366
enc_TransactionRequest(#'TransactionRequest'{transactionId = Tid,
 
367
                                             actions       = Acts}, State) ->
 
368
    [
 
369
     ?TransToken,
 
370
     ?EQUAL,
 
371
     enc_TransactionId(Tid, State),
 
372
     ?LBRKT_INDENT(State),
 
373
     enc_TransactionRequest_actions(Acts, ?INC_INDENT(State)),
 
374
     ?RBRKT_INDENT(State)
 
375
    ];
 
376
enc_TransactionRequest(Bin, _State) when binary(Bin) ->
 
377
    [Bin].
 
378
 
 
379
enc_TransactionRequest_actions(Bin, _State) when binary(Bin) ->
 
380
    [Bin]; %% Already encoded...
 
381
enc_TransactionRequest_actions({'TransactionRequest_actions',Val}, State) ->
 
382
    enc_TransactionRequest_actions(Val, State);
 
383
enc_TransactionRequest_actions([Mand | Opt], State) ->
 
384
    [enc_ActionRequest(Mand, State) |
 
385
     [[?COMMA_INDENT(State), enc_ActionRequest(Val, State)] || Val <- Opt]].
 
386
 
 
387
enc_TransactionPending(#'TransactionPending'{transactionId = Tid}, State) ->
 
388
    [?PendingToken,
 
389
     ?EQUAL,
 
390
     enc_TransactionId(Tid, State),
 
391
     ?LBRKT_INDENT(State),
 
392
     ?RBRKT_INDENT(State)
 
393
    ];
 
394
enc_TransactionPending(Bin, _State) when binary(Bin) ->
 
395
    [Bin].
 
396
 
 
397
enc_TransactionReply(#'TransactionReply'{transactionId     = Tid,
 
398
                                         immAckRequired    = Req,
 
399
                                         transactionResult = Res}, State) ->
 
400
    [
 
401
     ?ReplyToken,
 
402
     ?EQUAL,
 
403
     enc_TransactionId(Tid, State),
 
404
     ?LBRKT_INDENT(State),
 
405
     enc_immAckRequired(Req, State),
 
406
     enc_TransactionReply_transactionResult(Res, ?INC_INDENT(State)),
 
407
     ?RBRKT_INDENT(State)
 
408
    ];
 
409
enc_TransactionReply(Bin, _State) when binary(Bin) ->
 
410
    [Bin].
 
411
 
 
412
enc_immAckRequired(Val, State) ->
 
413
    case Val of
 
414
        asn1_NOVALUE -> 
 
415
            [];
 
416
        'NULL'       -> 
 
417
            [?ImmAckRequiredToken, ?COMMA_INDENT(?INC_INDENT(State))]
 
418
    end.
 
419
 
 
420
enc_TransactionReply_transactionResult({'TransactionReply_transactionResult',
 
421
                                        Val}, State) ->
 
422
    enc_TransactionReply_transactionResult(Val, State);
 
423
enc_TransactionReply_transactionResult({Tag, Val}, State) ->
 
424
    case Tag of
 
425
        transactionError ->
 
426
            enc_ErrorDescriptor(Val, State);
 
427
        actionReplies ->
 
428
            enc_TransactionReply_transactionResult_actionReplies(Val, State);
 
429
        _ ->
 
430
            error({invalid_TransactionReply_transactionResult_tag, Tag})
 
431
     end.
 
432
 
 
433
enc_TransactionReply_transactionResult_actionReplies({'TransactionReply_transactionResult_actionReplies',Val}, State) ->
 
434
    enc_TransactionReply_transactionResult_actionReplies(Val, State);
 
435
enc_TransactionReply_transactionResult_actionReplies([Mand | Opt], State) ->
 
436
    [enc_ActionReply(Mand, State),
 
437
     [[?COMMA_INDENT(State), enc_ActionReply(Val, State)] || Val <- Opt]].
 
438
 
 
439
enc_ErrorDescriptor(Val, State)
 
440
  when record(Val, 'ErrorDescriptor') ->
 
441
    [
 
442
     ?ErrorToken,
 
443
     ?EQUAL,
 
444
     enc_ErrorCode(Val#'ErrorDescriptor'.errorCode, State),
 
445
     ?LBRKT,
 
446
     case Val#'ErrorDescriptor'.errorText of
 
447
         asn1_NOVALUE ->
 
448
             [];
 
449
         ErrorText ->
 
450
             enc_ErrorText(ErrorText, State)
 
451
     end,
 
452
     ?RBRKT
 
453
    ].
 
454
 
 
455
enc_ErrorCode({'ErrorCode',Val}, State)->
 
456
    enc_ErrorCode(Val, State);
 
457
enc_ErrorCode(Val, State) ->
 
458
    enc_DIGIT(Val, State, 0, 999).
 
459
 
 
460
enc_ErrorText({'ErrorText',Val}, State) ->
 
461
    enc_ErrorText(Val, State);
 
462
enc_ErrorText(Val, State)  ->
 
463
    enc_QUOTED_STRING(Val, State).
 
464
 
 
465
enc_ContextID({'ContextID',Val}, State) ->
 
466
    enc_ContextID(Val, State);
 
467
enc_ContextID(Val, State) ->
 
468
    case Val of
 
469
        ?megaco_all_context_id    -> $*;
 
470
        ?megaco_null_context_id   -> $-;
 
471
        ?megaco_choose_context_id -> $$;
 
472
        Int when integer(Int) -> enc_UINT32(Int, State)
 
473
    end.
 
474
 
 
475
enc_ActionRequest(Bin, _State) when binary(Bin) ->
 
476
    [Bin]; %% Already encoded...
 
477
enc_ActionRequest(Val, State)
 
478
     when record(Val, 'ActionRequest') ->
 
479
    [
 
480
     ?CtxToken,
 
481
     ?EQUAL,
 
482
     enc_ContextID(Val#'ActionRequest'.contextId, State),
 
483
     ?LBRKT_INDENT(State),
 
484
     enc_list([{[Val#'ActionRequest'.contextRequest],
 
485
                fun enc_ContextRequest/2},
 
486
               {[Val#'ActionRequest'.contextAttrAuditReq],
 
487
                fun enc_ContextAttrAuditRequest/2},
 
488
               {Val#'ActionRequest'.commandRequests,
 
489
                fun enc_CommandRequest/2}],
 
490
              ?INC_INDENT(State)),
 
491
     ?RBRKT_INDENT(State)
 
492
    ].
 
493
 
 
494
%% OTP-5085
 
495
enc_ActionReply(#'ActionReply'{contextId       = Id,
 
496
                               errorDescriptor = ED,
 
497
                               contextReply    = CtxRep,
 
498
                               commandReply    = CmdRep}, 
 
499
                State) ->
 
500
%     d("enc_ActionReply -> entry with"
 
501
%       "~n   Id:     ~p"
 
502
%       "~n   ED:     ~p"
 
503
%       "~n   CtxRep: ~p"
 
504
%       "~n   CmdRep: ~p", [Id, ED, CtxRep, CmdRep]),
 
505
    [
 
506
     ?CtxToken,
 
507
     ?EQUAL,
 
508
     enc_ContextID(Id, State),
 
509
     ?LBRKT_INDENT(State),
 
510
     do_enc_ActionReply(ED, CtxRep, CmdRep, State),
 
511
     ?RBRKT_INDENT(State)
 
512
    ].
 
513
 
 
514
do_enc_ActionReply(asn1_NOVALUE, CtxRep, [], State) 
 
515
  when CtxRep =/= asn1_NOVALUE ->
 
516
%     d("do_enc_ActionReply -> entry with"
 
517
%       "~n   CtxRep: ~p", [CtxRep]),
 
518
    [
 
519
     enc_ContextRequest(CtxRep, ?INC_INDENT(State))
 
520
    ];
 
521
do_enc_ActionReply(asn1_NOVALUE, CtxRep, CmdRep, State) 
 
522
  when CtxRep =/= asn1_NOVALUE, CmdRep =/= [] ->
 
523
%     d("do_enc_ActionReply -> entry with"
 
524
%       "~n   CtxRep: ~p"
 
525
%       "~n   CmdRep: ~p", [CtxRep, CmdRep]),
 
526
    [
 
527
     enc_ContextRequest(CtxRep, ?INC_INDENT(State)),
 
528
     ?COMMA_INDENT(?INC_INDENT(State)), 
 
529
     enc_list([{CmdRep, fun enc_CommandReply/2}],
 
530
              ?INC_INDENT(State))
 
531
    ];
 
532
do_enc_ActionReply(asn1_NOVALUE, asn1_NOVALUE, CmdRep, State) 
 
533
  when CmdRep =/= [] ->
 
534
%     d("do_enc_ActionReply -> entry with"
 
535
%       "~n   CmdRep: ~p", [CmdRep]),
 
536
    [
 
537
     enc_list([{CmdRep, fun enc_CommandReply/2}],
 
538
              ?INC_INDENT(State))
 
539
    ];
 
540
do_enc_ActionReply(ED, CtxRep, [], State) 
 
541
  when ED =/= asn1_NOVALUE, CtxRep =/= asn1_NOVALUE ->
 
542
%     d("do_enc_ActionReply -> entry with"
 
543
%       "~n   ED:     ~p"
 
544
%       "~n   CtxRep: ~p", [ED, CtxRep]),
 
545
    [
 
546
     enc_ContextRequest(CtxRep, ?INC_INDENT(State)),
 
547
     ?COMMA_INDENT(?INC_INDENT(State)), 
 
548
     enc_list([{[ED], fun enc_ErrorDescriptor/2}], % Indention cosmetics
 
549
              ?INC_INDENT(State))
 
550
    ];
 
551
do_enc_ActionReply(ED, asn1_NOVALUE, CmdRep, State) 
 
552
  when ED =/= asn1_NOVALUE, CmdRep =/= [] ->
 
553
%     d("do_enc_ActionReply -> entry with"
 
554
%       "~n   ED:     ~p"
 
555
%       "~n   CmdRep: ~p", [ED, CmdRep]),
 
556
    [
 
557
     enc_list([{CmdRep, fun enc_CommandReply/2},
 
558
               {[ED],   fun enc_ErrorDescriptor/2}], % Indention cosmetics
 
559
              ?INC_INDENT(State))
 
560
    ];
 
561
do_enc_ActionReply(ED, CtxRep, CmdRep, State) 
 
562
  when ED =/= asn1_NOVALUE, CtxRep =/= asn1_NOVALUE, CmdRep =/= [] ->
 
563
%     d("do_enc_ActionReply -> entry with"
 
564
%       "~n   ED:     ~p"
 
565
%       "~n   CtxRep: ~p"
 
566
%       "~n   CmdRep: ~p", [ED, CtxRep, CmdRep]),
 
567
    [
 
568
     enc_ContextRequest(CtxRep, ?INC_INDENT(State)),
 
569
     ?COMMA_INDENT(?INC_INDENT(State)), 
 
570
     enc_list([{CmdRep, fun enc_CommandReply/2},
 
571
               {[ED],   fun enc_ErrorDescriptor/2}], % Indention cosmetics
 
572
              ?INC_INDENT(State))
 
573
    ];
 
574
do_enc_ActionReply(ED, asn1_NOVALUE, [], State) 
 
575
  when ED =/= asn1_NOVALUE ->
 
576
%     d("do_enc_ActionReply -> entry with"
 
577
%       "~n   ED:     ~p", [ED]),
 
578
    [
 
579
     enc_ErrorDescriptor(ED, ?INC_INDENT(State))
 
580
    ].
 
581
 
 
582
 
 
583
enc_ContextRequest_priority(asn1_NOVALUE, _State) ->
 
584
    {[], dummy};
 
585
enc_ContextRequest_priority(Val, _State) ->
 
586
    {[Val], fun(X,S) -> [?PriorityToken,?EQUAL,enc_UINT16(X, S)] end}.
 
587
 
 
588
enc_ContextRequest_emergency(asn1_NOVALUE, _State) ->
 
589
    {[], dummy};
 
590
enc_ContextRequest_emergency(true, _State) ->
 
591
    {[?EmergencyToken], fun(Elem, _) -> Elem end};
 
592
enc_ContextRequest_emergency(false, _State) ->
 
593
    {[?EmergencyOffToken], fun(Elem, _) -> Elem end}.
 
594
 
 
595
enc_ContextRequest_topologyReq(asn1_NOVALUE, _State) ->
 
596
    {[], dummy};
 
597
enc_ContextRequest_topologyReq({'ContextRequest_topologyReq', 
 
598
                                asn1_NOVALUE}, _State) ->
 
599
    {[], dummy};
 
600
enc_ContextRequest_topologyReq({'ContextRequest_topologyReq', 
 
601
                                List}, _State) ->
 
602
    {List, fun enc_TopologyRequest/2};
 
603
enc_ContextRequest_topologyReq(List, _State) ->
 
604
    {[List], fun enc_TopologyRequest/2}.
 
605
 
 
606
enc_ContextRequest_iepsCallind(asn1_NOVALUE, _State) ->
 
607
    {[], dummy};
 
608
enc_ContextRequest_iepsCallind(false, _State) ->
 
609
    {[], dummy};
 
610
% enc_ContextRequest_iepsCallind(false, _State) ->
 
611
%     {[?IEPS_XXXX_Token], fun(Elem, _) -> Elem end};
 
612
enc_ContextRequest_iepsCallind(true, _State) ->
 
613
    {[?IEPSToken], fun(Elem, _) -> Elem end}.
 
614
 
 
615
enc_ContextRequest_contextProp(asn1_NOVALUE, _State) ->
 
616
    {[], dummy};
 
617
enc_ContextRequest_contextProp([], _State) ->
 
618
    {[], dummy};
 
619
enc_ContextRequest_contextProp([PP], _State) ->
 
620
    {[PP], fun enc_PropertyParm/2};
 
621
enc_ContextRequest_contextProp(PPs, _State) when list(PPs) ->
 
622
    error({at_most_one_contextProp, PPs}).
 
623
 
 
624
enc_ContextRequest(asn1_NOVALUE, _State) ->
 
625
    [];
 
626
enc_ContextRequest(#'ContextRequest'{priority    = asn1_NOVALUE, 
 
627
                                     emergency   = asn1_NOVALUE,
 
628
                                     topologyReq = asn1_NOVALUE,
 
629
                                     iepsCallind = asn1_NOVALUE,
 
630
                                     contextProp = asn1_NOVALUE}, _State) ->
 
631
    [];
 
632
enc_ContextRequest(#'ContextRequest'{priority    = asn1_NOVALUE, 
 
633
                                     emergency   = asn1_NOVALUE,
 
634
                                     topologyReq = [],
 
635
                                     iepsCallind = asn1_NOVALUE,
 
636
                                     contextProp = []}, _State) ->
 
637
    [];
 
638
enc_ContextRequest(#'ContextRequest'{priority    = Prio, 
 
639
                                     emergency   = Em,
 
640
                                     topologyReq = TR,
 
641
                                     iepsCallind = Ieps,
 
642
                                     contextProp = CP}, State) ->
 
643
    [
 
644
     ?ContextAttrToken,
 
645
     ?LBRKT_INDENT(State),
 
646
     enc_list([enc_ContextRequest_priority(Prio, State), 
 
647
               enc_ContextRequest_emergency(Em, State), 
 
648
               enc_ContextRequest_topologyReq(TR, State), 
 
649
               enc_ContextRequest_iepsCallind(Ieps, State), 
 
650
               enc_ContextRequest_contextProp(CP, State)],
 
651
              ?INC_INDENT(State)),
 
652
     ?RBRKT_INDENT(State)
 
653
    ].
 
654
 
 
655
enc_ContextAttrAuditRequest(
 
656
  #'ContextAttrAuditRequest'{topology       = asn1_NOVALUE,
 
657
                             emergency      = asn1_NOVALUE,
 
658
                             priority       = asn1_NOVALUE,
 
659
                             iepsCallind    = asn1_NOVALUE,
 
660
                             contextPropAud = asn1_NOVALUE}, _State) ->
 
661
    [];
 
662
enc_ContextAttrAuditRequest(
 
663
  #'ContextAttrAuditRequest'{topology       = asn1_NOVALUE,
 
664
                             emergency      = asn1_NOVALUE,
 
665
                             priority       = asn1_NOVALUE,
 
666
                             iepsCallind    = asn1_NOVALUE,
 
667
                             contextPropAud = []}, _State) ->
 
668
    [];
 
669
enc_ContextAttrAuditRequest(CAAR, State) ->
 
670
    [
 
671
     ?ContextAuditToken,
 
672
     ?LBRKT_INDENT(State),
 
673
     enc_IndAudContextAttrDescriptor(CAAR, ?INC_INDENT(State)),
 
674
     ?RBRKT_INDENT(State)
 
675
    ].
 
676
 
 
677
enc_IndAudContextAttrDescriptor(
 
678
  #'ContextAttrAuditRequest'{topology       = Top,
 
679
                             emergency      = Em,
 
680
                             priority       = Prio,
 
681
                             iepsCallind    = Ieps,
 
682
                             contextPropAud = CPA}, State) ->
 
683
    [
 
684
     ?ContextAttrToken,
 
685
     ?LBRKT_INDENT(State),
 
686
     enc_list([{[Top],  fun('NULL', _) -> ?TopologyToken end},
 
687
               {[Em],   fun('NULL', _) -> ?EmergencyToken end},
 
688
               {[Prio], fun('NULL', _) -> ?PriorityToken end},
 
689
               {[Ieps], fun('NULL', _) -> ?IEPSToken end},
 
690
               {CPA,    fun enc_IndAudPropertyParm/2}],
 
691
              ?INC_INDENT(State)),
 
692
     ?RBRKT_INDENT(State)
 
693
    ].
 
694
 
 
695
enc_CommandRequest(Val, State)
 
696
  when record(Val, 'CommandRequest') ->
 
697
%     d("enc_CommandRequest -> entry with"
 
698
%       "~n   Val: ~p", [Val]),
 
699
    [
 
700
     case Val#'CommandRequest'.optional of
 
701
         asn1_NOVALUE ->
 
702
             [];
 
703
         'NULL' ->
 
704
             "O-"
 
705
     end,
 
706
     case Val#'CommandRequest'.wildcardReturn of
 
707
         asn1_NOVALUE ->
 
708
             [];
 
709
         'NULL' ->
 
710
             "W-"
 
711
     end,
 
712
     enc_Command(Val#'CommandRequest'.command, State)
 
713
    ]. 
 
714
 
 
715
enc_Command({'Command',Val}, State) ->
 
716
    enc_Command(Val, State);
 
717
enc_Command({Tag, Val}, State) ->
 
718
%     d("enc_Command -> entry with"
 
719
%       "~n   Tag: ~p"
 
720
%       "~n   Val: ~p", [Tag, Val]),
 
721
    case Tag of
 
722
        addReq ->
 
723
            [?AddToken, enc_AmmRequest(Val, State)];
 
724
        moveReq ->
 
725
            [?MoveToken, enc_AmmRequest(Val, State)];
 
726
        modReq ->
 
727
            [?ModifyToken, enc_AmmRequest(Val, State)];
 
728
        subtractReq ->
 
729
            [?SubtractToken, enc_SubtractRequest(Val, State)];
 
730
        auditCapRequest ->
 
731
            [?AuditCapToken, enc_AuditRequest(Val, State)];
 
732
        auditValueRequest ->
 
733
            [?AuditValueToken, enc_AuditRequest(Val, State)];
 
734
        notifyReq ->
 
735
            [?NotifyToken, enc_NotifyRequest(Val, State)];
 
736
        serviceChangeReq ->
 
737
            [?ServiceChangeToken, enc_ServiceChangeRequest(Val, State)];
 
738
        _ ->
 
739
            error({invalid_Command_tag, Tag})
 
740
    end.
 
741
 
 
742
enc_CommandReply({'CommandReply',Val}, State) ->
 
743
    enc_CommandReply(Val, State);
 
744
enc_CommandReply({Tag, Val}, State) ->
 
745
%     d("enc_CommandReply -> entry with"
 
746
%       "~n   Tag: ~p"
 
747
%       "~n   Val: ~p", [Tag, Val]),
 
748
    case Tag of
 
749
        addReply ->
 
750
            [?AddToken, enc_AmmsReply(Val, State)];
 
751
        moveReply ->
 
752
            [?MoveToken, enc_AmmsReply(Val, State)];
 
753
        modReply ->
 
754
            [?ModifyToken, enc_AmmsReply(Val, State)];
 
755
        subtractReply ->
 
756
            [?SubtractToken, enc_AmmsReply(Val, State)];
 
757
        auditCapReply ->
 
758
            [?AuditCapToken, enc_AuditReply(Val, State)];
 
759
        auditValueReply ->
 
760
            [?AuditValueToken, enc_AuditReply(Val, State)];
 
761
        notifyReply ->
 
762
            [?NotifyToken, enc_NotifyReply(Val, State)];
 
763
        serviceChangeReply ->
 
764
            [?ServiceChangeToken, enc_ServiceChangeReply(Val, State)];
 
765
        _ ->
 
766
            error({invalid_CommandReply_tag, Tag})
 
767
     end.
 
768
 
 
769
enc_TopologyRequest(Val, State)
 
770
  when list(Val) ->
 
771
    [
 
772
     ?TopologyToken,
 
773
     ?LBRKT_INDENT(State),
 
774
     enc_list([{Val, fun enc_TopologyRequest1/2}],?INC_INDENT(State)),
 
775
     ?RBRKT_INDENT(State)
 
776
    ].
 
777
 
 
778
enc_TopologyRequest1(#'TopologyRequest'{terminationFrom   = From,
 
779
                                        terminationTo     = To,
 
780
                                        topologyDirection = Dir}, State) ->
 
781
    [
 
782
     enc_TerminationID(From, State),
 
783
     ?COMMA_INDENT(State),
 
784
     enc_TerminationID(To, State),
 
785
     ?COMMA_INDENT(State),
 
786
     enc_TopologyDirection(Dir, State)
 
787
    ].
 
788
 
 
789
enc_TopologyDirection(bothway, _State) ->
 
790
    ?BothwayToken;
 
791
enc_TopologyDirection(isolate, _State) -> 
 
792
    ?IsolateToken;
 
793
enc_TopologyDirection(oneway, _State) ->  
 
794
    ?OnewayToken;
 
795
enc_TopologyDirection(Top, _State) ->
 
796
    error({illegal_TopologyDirection, Top}).
 
797
 
 
798
enc_AmmRequest(Val, State)
 
799
  when record(Val, 'AmmRequest') ->
 
800
%     d("enc_AmmRequest -> entry with"
 
801
%       "~n   Val: ~p", [Val]),
 
802
    [
 
803
     %% Assume that Token is added elsewhere
 
804
     ?EQUAL,
 
805
     enc_TerminationIDList1(Val#'AmmRequest'.terminationID, State),
 
806
     enc_opt_brackets(
 
807
       enc_list([{Val#'AmmRequest'.descriptors, fun enc_ammDescriptor/2}],
 
808
                ?INC_INDENT(State)),
 
809
       State)
 
810
    ].
 
811
 
 
812
enc_ammDescriptor({Tag, Desc}, State) ->
 
813
%     d("enc_ammDescriptor -> entry with"
 
814
%       "~n   Tag:  ~p"
 
815
%       "~n   Desc: ~p", [Tag, Desc]),
 
816
    case Tag of
 
817
        mediaDescriptor       -> enc_MediaDescriptor(Desc, State);
 
818
        modemDescriptor       -> enc_ModemDescriptor(Desc, State);      
 
819
        muxDescriptor         -> enc_MuxDescriptor(Desc, State);   
 
820
        eventsDescriptor      -> enc_EventsDescriptor(Desc, State);      
 
821
        eventBufferDescriptor -> enc_EventBufferDescriptor(Desc, State); 
 
822
        signalsDescriptor     -> enc_SignalsDescriptor(Desc, State);    
 
823
        digitMapDescriptor    -> enc_DigitMapDescriptor(Desc, State);    
 
824
        auditDescriptor       -> enc_AuditDescriptor(Desc, State);
 
825
        statisticsDescriptor  -> enc_StatisticsDescriptor(Desc, State);
 
826
        _ ->
 
827
            error({invalid_ammDescriptor_tag, Tag})
 
828
    end.
 
829
 
 
830
enc_AmmsReply(#'AmmsReply'{terminationID = ID, 
 
831
                           terminationAudit = asn1_NOVALUE}, State) ->
 
832
%     d("enc_AmmsReply(asn1_NOVALUE) -> entry with"
 
833
%       "~n   ID: ~p", [ID]),
 
834
    [
 
835
     ?EQUAL,
 
836
     enc_TerminationIDList1(ID, State)
 
837
    ];
 
838
enc_AmmsReply(#'AmmsReply'{terminationID = ID, 
 
839
                           terminationAudit = []}, State) ->
 
840
%     d("enc_AmmsReply([]) -> entry with"
 
841
%       "~n   ID:  ~p", [ID]),
 
842
    [
 
843
     ?EQUAL,
 
844
     enc_TerminationIDList1(ID, State)
 
845
    ];
 
846
enc_AmmsReply(#'AmmsReply'{terminationID = ID, 
 
847
                           terminationAudit = Res}, State) ->
 
848
%     d("enc_AmmsReply -> entry with"
 
849
%       "~n   ID:  ~p"
 
850
%       "~n   Res: ~p", [ID, Res]),
 
851
    [
 
852
     ?EQUAL,
 
853
     enc_TerminationIDList1(ID, State),
 
854
     case lists:flatten(enc_TerminationAudit(Res, ?INC_INDENT(State))) of
 
855
         [] ->
 
856
             [];
 
857
         L ->
 
858
             [
 
859
              ?LBRKT_INDENT(State), 
 
860
              L,
 
861
              ?RBRKT_INDENT(State)
 
862
             ]
 
863
     end
 
864
    ].
 
865
 
 
866
enc_SubtractRequest(Val, State)
 
867
  when record(Val, 'SubtractRequest') ->
 
868
    [
 
869
     %% Assume that Token is added elsewhere
 
870
     ?EQUAL,
 
871
     enc_TerminationIDList1(Val#'SubtractRequest'.terminationID, State),
 
872
     case Val#'SubtractRequest'.auditDescriptor of
 
873
         asn1_NOVALUE ->
 
874
             [];
 
875
         AuditDescr ->
 
876
             [
 
877
              ?LBRKT_INDENT(State) ,
 
878
              enc_AuditDescriptor(AuditDescr, ?INC_INDENT(State)),
 
879
              ?RBRKT_INDENT(State)
 
880
             ]
 
881
     end
 
882
    ].    
 
883
 
 
884
enc_AuditRequest(Val, State)
 
885
  when record(Val, 'AuditRequest') ->
 
886
%     d("enc_AuditRequest -> entry with"
 
887
%       "~n   Val: ~p", [Val]),
 
888
    [
 
889
     %% Assume that Token is added elsewhere
 
890
     ?EQUAL,
 
891
     enc_TerminationIDList1([Val#'AuditRequest'.terminationID], State),
 
892
     case Val#'AuditRequest'.auditDescriptor of
 
893
         asn1_NOVALUE ->
 
894
             [];
 
895
         AuditDescr ->
 
896
             [
 
897
              ?LBRKT_INDENT(State) ,
 
898
              enc_AuditDescriptor(AuditDescr, ?INC_INDENT(State)),
 
899
              ?RBRKT_INDENT(State)
 
900
             ]
 
901
     end
 
902
    ].    
 
903
 
 
904
%% auditReply           = (AuditValueToken / AuditCapToken ) 
 
905
%%                        ( contextTerminationAudit  / auditOther)
 
906
%% auditOther           = EQUAL TerminationID LBRKT 
 
907
%%                        terminationAudit RBRKT
 
908
%% terminationAudit     = auditReturnParameter *(COMMA auditReturnParameter) 
 
909
%% 
 
910
%% contextTerminationAudit = EQUAL CtxToken ( terminationIDList / 
 
911
%%                        LBRKT errorDescriptor RBRKT )
 
912
enc_AuditReply({Tag, Val}, State) ->
 
913
    case Tag of
 
914
        contextAuditResult ->
 
915
            [
 
916
             ?EQUAL,
 
917
             ?CtxToken,
 
918
             enc_TerminationIDListN(Val, State)
 
919
            ];
 
920
        error ->
 
921
            [
 
922
             ?EQUAL,
 
923
             ?CtxToken,
 
924
             ?LBRKT_INDENT(State),
 
925
             enc_ErrorDescriptor(Val, ?INC_INDENT(State)),
 
926
             ?RBRKT_INDENT(State)
 
927
            ]; 
 
928
        auditResult when record(Val, 'AuditResult') ->
 
929
            enc_auditOther(Val, State);
 
930
        auditResult ->
 
931
            error({invalid_auditResult, Val});
 
932
        _ ->
 
933
            error({invalid_AuditReply_tag, Tag})
 
934
    end.
 
935
 
 
936
enc_auditOther(#'AuditResult'{terminationID = ID,
 
937
                              terminationAuditResult = asn1_NOVALUE}, State) ->
 
938
    [
 
939
     ?EQUAL,
 
940
     enc_TerminationID(ID, State)
 
941
    ];
 
942
enc_auditOther(#'AuditResult'{terminationID = ID,
 
943
                              terminationAuditResult = []}, State) ->
 
944
    [
 
945
     ?EQUAL,
 
946
     enc_TerminationID(ID, State)
 
947
    ];
 
948
enc_auditOther(#'AuditResult'{terminationID = ID,
 
949
                              terminationAuditResult = Res}, State) ->
 
950
    [
 
951
     ?EQUAL,
 
952
     enc_TerminationID(ID, State),
 
953
     case lists:flatten(enc_TerminationAudit(Res, ?INC_INDENT(State))) of
 
954
         [] ->
 
955
             [];
 
956
         L ->
 
957
             [
 
958
              ?LBRKT_INDENT(State), 
 
959
              L,
 
960
              ?RBRKT_INDENT(State)
 
961
             ]
 
962
     end
 
963
    ].
 
964
 
 
965
    
 
966
enc_AuditDescriptor(#'AuditDescriptor'{auditToken = asn1_NOVALUE,
 
967
                                       auditPropertyToken = asn1_NOVALUE}, 
 
968
                    _State) ->
 
969
%     d("enc_AuditDescriptor(asn1_NOVALUE) -> entry"),
 
970
    [
 
971
     ?AuditToken,
 
972
     [?LBRKT, ?RBRKT]
 
973
    ];
 
974
enc_AuditDescriptor(#'AuditDescriptor'{auditToken = [],
 
975
                                       auditPropertyToken = asn1_NOVALUE}, 
 
976
                    _State) ->
 
977
%     d("enc_AuditDescriptor([]) -> entry"),
 
978
    [
 
979
     ?AuditToken,
 
980
     [?LBRKT, ?RBRKT]
 
981
    ];
 
982
enc_AuditDescriptor(#'AuditDescriptor'{auditToken = List,
 
983
                                       auditPropertyToken = asn1_NOVALUE}, 
 
984
                    State) ->
 
985
%     d("enc_AuditDescriptor -> entry with",
 
986
%       "~n   List: ~p", [List]),
 
987
    [
 
988
     ?AuditToken,
 
989
     [
 
990
      ?LBRKT_INDENT(State),
 
991
      enc_list([{List, fun enc_auditItem/2}], ?INC_INDENT(State)),
 
992
      ?RBRKT_INDENT(State)
 
993
     ]
 
994
    ];
 
995
%% - v2 -
 
996
enc_AuditDescriptor(#'AuditDescriptor'{auditToken = asn1_NOVALUE,
 
997
                                       auditPropertyToken = Prop}, 
 
998
                    State) ->
 
999
%     d("enc_AuditDescriptor -> entry with",
 
1000
%       "~n   Prop: ~p", [Prop]),
 
1001
    [
 
1002
     ?AuditToken,
 
1003
     [
 
1004
      ?LBRKT_INDENT(State),
 
1005
      enc_auditPropertyToken(Prop, ?INC_INDENT(State)),
 
1006
      ?RBRKT_INDENT(State)
 
1007
     ]
 
1008
    ];
 
1009
enc_AuditDescriptor(#'AuditDescriptor'{auditToken = List,
 
1010
                                       auditPropertyToken = Prop}, 
 
1011
                    State) ->
 
1012
%     d("enc_AuditDescriptor -> entry with",
 
1013
%       "~n   List: ~p"
 
1014
%       "~n   Prop: ~p", [List, Prop]),
 
1015
    [
 
1016
     ?AuditToken,
 
1017
     [
 
1018
      ?LBRKT_INDENT(State),
 
1019
      enc_list([{List, fun enc_auditItem/2}], ?INC_INDENT(State)),
 
1020
      ?COMMA_INDENT(State), 
 
1021
      enc_auditPropertyToken(Prop, ?INC_INDENT(State)),  % v2
 
1022
      ?RBRKT_INDENT(State)
 
1023
     ]
 
1024
    ].
 
1025
 
 
1026
enc_auditItem(signalsToken, _State) ->
 
1027
    ?SignalsToken;
 
1028
enc_auditItem(eventBufferToken, _State) -> 
 
1029
    ?EventBufferToken;
 
1030
enc_auditItem(eventsToken, _State) ->
 
1031
    ?EventsToken;
 
1032
enc_auditItem(Val, State) ->
 
1033
    enc_auditReturnItem(Val, State).
 
1034
 
 
1035
 
 
1036
enc_auditReturnItem(muxToken, _State) ->
 
1037
    ?MuxToken;
 
1038
enc_auditReturnItem(modemToken, _State) ->
 
1039
    ?ModemToken;
 
1040
enc_auditReturnItem(mediaToken, _State) ->
 
1041
    ?MediaToken;
 
1042
enc_auditReturnItem(digitMapToken, _State) ->
 
1043
    ?DigitMapToken;
 
1044
enc_auditReturnItem(statsToken, _State) ->
 
1045
    ?StatsToken;
 
1046
enc_auditReturnItem(observedEventsToken, _State) ->
 
1047
    ?ObservedEventsToken;
 
1048
enc_auditReturnItem(packagesToken, _State) ->
 
1049
    ?PackagesToken.
 
1050
 
 
1051
 
 
1052
%% - v2 begin -
 
1053
 
 
1054
enc_auditPropertyToken([], _State) ->
 
1055
    [];
 
1056
enc_auditPropertyToken([Param | Params], State) ->
 
1057
%     d("enc_auditPropertyToken -> entry with",
 
1058
%       "~n   Param: ~p", [Param]),    
 
1059
    [enc_IndAudauditReturnParameter(Param, State),
 
1060
     [[?COMMA_INDENT(State), 
 
1061
       enc_IndAudauditReturnParameter(P, State)] || P <- Params]].
 
1062
 
 
1063
 
 
1064
enc_IndAudauditReturnParameter({Tag, Val}, State) ->
 
1065
    case Tag of
 
1066
        indAudMediaDescriptor ->
 
1067
            enc_IndAudMediaDescriptor(Val, State);
 
1068
        indAudEventsDescriptor ->
 
1069
            enc_IndAudEventsDescriptor(Val, State);
 
1070
        indAudSignalsDescriptor ->
 
1071
            enc_IndAudSignalsDescriptor(Val, State);
 
1072
        indAudDigitMapDescriptor ->
 
1073
            enc_IndAudDigitMapDescriptor(Val, State); 
 
1074
        indAudEventBufferDescriptor ->
 
1075
            enc_IndAudEventBufferDescriptor(Val, State);
 
1076
        indAudStatisticsDescriptor ->
 
1077
            enc_IndAudStatisticsDescriptor(Val, State);
 
1078
        indAudPackagesDescriptor ->
 
1079
            enc_IndAudPackagesDescriptor(Val, State);
 
1080
        _ ->
 
1081
            error({invalid_IndAudauditReturnParameter_tag, Tag})
 
1082
    end.
 
1083
 
 
1084
%% The ASN.1 does not limit to just one of termStateDescr or streams,
 
1085
%% but the ABNF seams to do that...
 
1086
enc_IndAudMediaDescriptor(
 
1087
  #'IndAudMediaDescriptor'{termStateDescr = asn1_NOVALUE,
 
1088
                           streams = Streams}, State) ->
 
1089
%     d("enc_IndAudMediaDescriptor -> entry with",
 
1090
%       "~n   Streams: ~p", [Streams]),    
 
1091
    [
 
1092
     ?MediaToken,
 
1093
     ?LBRKT_INDENT(State),
 
1094
     enc_IndAudMediaDescriptor_streams(Streams, ?INC_INDENT(State)),
 
1095
     ?RBRKT_INDENT(State)
 
1096
    ];
 
1097
enc_IndAudMediaDescriptor(#'IndAudMediaDescriptor'{termStateDescr = TSD,
 
1098
                                                   streams = asn1_NOVALUE}, 
 
1099
                          State) ->
 
1100
%     d("enc_IndAudMediaDescriptor -> entry with",
 
1101
%       "~n   TSD: ~p", [TSD]),    
 
1102
    [
 
1103
     ?MediaToken,
 
1104
     ?LBRKT_INDENT(State),
 
1105
     enc_IndAudTerminationStateDescriptor(TSD, ?INC_INDENT(State)),
 
1106
     ?RBRKT_INDENT(State)
 
1107
    ].
 
1108
 
 
1109
enc_IndAudMediaDescriptor_streams({Tag, Val}, State) ->
 
1110
%     d("enc_IndAudMediaDescriptor_streams -> entry with",
 
1111
%       "~n   Tag: ~p"
 
1112
%       "~n   Val: ~p", [Tag, Val]),    
 
1113
    case Tag of
 
1114
        oneStream ->
 
1115
            enc_IndAudStreamParms(Val, State);
 
1116
        multiStream ->
 
1117
            enc_IndAudMediaDescriptor_multiStream(Val, State);
 
1118
        _ ->
 
1119
            error({invalid_IndAudMediaDescriptor_streams_tag, Tag})
 
1120
    end.
 
1121
 
 
1122
enc_IndAudTerminationStateDescriptor(
 
1123
  #'IndAudTerminationStateDescriptor'{propertyParms = [],
 
1124
                                      eventBufferControl = asn1_NOVALUE,
 
1125
                                      serviceState       = 'NULL'}, State) ->
 
1126
    [
 
1127
     ?TerminationStateToken,
 
1128
     ?LBRKT_INDENT(State),
 
1129
     ?ServiceStatesToken,
 
1130
     ?RBRKT_INDENT(State)
 
1131
    ];
 
1132
enc_IndAudTerminationStateDescriptor(
 
1133
  #'IndAudTerminationStateDescriptor'{propertyParms = [],
 
1134
                                      eventBufferControl = 'NULL',
 
1135
                                      serviceState = asn1_NOVALUE}, State) ->
 
1136
    [
 
1137
     ?TerminationStateToken,
 
1138
     ?LBRKT_INDENT(State),
 
1139
     ?BufferToken,
 
1140
     ?RBRKT_INDENT(State)
 
1141
    ];
 
1142
enc_IndAudTerminationStateDescriptor(
 
1143
  #'IndAudTerminationStateDescriptor'{propertyParms = [Parms],
 
1144
                                      eventBufferControl = asn1_NOVALUE,
 
1145
                                      serviceState = asn1_NOVALUE}, State) ->
 
1146
    #'IndAudPropertyParm'{name = Name} = Parms,
 
1147
    [
 
1148
     ?TerminationStateToken,
 
1149
     ?LBRKT_INDENT(State),
 
1150
     enc_PkgdName(Name, State),
 
1151
     ?RBRKT_INDENT(State)
 
1152
    ].
 
1153
 
 
1154
%% In text, localDescriptor and remoteDescriptor are not allowed!!
 
1155
enc_IndAudStreamParms(
 
1156
  #'IndAudStreamParms'{localControlDescriptor = LCD,
 
1157
                       localDescriptor        = asn1_NOVALUE, 
 
1158
                       remoteDescriptor       = asn1_NOVALUE, 
 
1159
                       statisticsDescriptor   = SD}, State) ->
 
1160
%   d("enc_IndAudStreamParms -> entry with"
 
1161
%     "~n   LCD: ~p"
 
1162
%     "~n   SD:  ~p", [LCD, SD]),
 
1163
    [
 
1164
     enc_list([{[LCD], fun enc_IndAudLocalControlDescriptor/2},
 
1165
               {[SD],  fun enc_IndAudStatisticsDescriptor/2}], 
 
1166
              ?INC_INDENT(State))
 
1167
    ].
 
1168
 
 
1169
enc_IndAudLocalControlDescriptor(Val, State)
 
1170
  when record(Val, 'IndAudLocalControlDescriptor') ->
 
1171
    [
 
1172
     ?LocalControlToken,
 
1173
     ?LBRKT_INDENT(State),
 
1174
     enc_list([{[Val#'IndAudLocalControlDescriptor'.streamMode],
 
1175
                fun('NULL', _) -> ?ModeToken end},
 
1176
               {[Val#'IndAudLocalControlDescriptor'.reserveValue],
 
1177
                fun('NULL', _) -> ?ReservedValueToken end},
 
1178
               {[Val#'IndAudLocalControlDescriptor'.reserveGroup],
 
1179
                fun('NULL', _) -> ?ReservedGroupToken end},
 
1180
               {Val#'IndAudLocalControlDescriptor'.propertyParms,
 
1181
                fun enc_IndAudPropertyParm/2}],
 
1182
              ?INC_INDENT(State)),
 
1183
     ?RBRKT_INDENT(State)
 
1184
    ].
 
1185
 
 
1186
enc_IndAudPropertyParm(#'IndAudPropertyParm'{name = PkgdName}, State) ->
 
1187
    enc_PkgdName(PkgdName, State).
 
1188
 
 
1189
enc_IndAudMediaDescriptor_multiStream([Val], State) ->
 
1190
%   d("enc_IndAudMediaDescriptor_multiStream -> entry with"
 
1191
%     "~n   Val: ~p", [Val]),
 
1192
    [
 
1193
     enc_IndAudStreamDescriptor(Val, ?INC_INDENT(State))
 
1194
    ];
 
1195
enc_IndAudMediaDescriptor_multiStream(Vals, _State) when list(Vals) ->
 
1196
    error({invalid_IndAudMediaDescriptor_multiStream_length, Vals});
 
1197
enc_IndAudMediaDescriptor_multiStream(Val, _State) ->
 
1198
    error({invalid_IndAudMediaDescriptor_multiStream, Val}).
 
1199
 
 
1200
enc_IndAudStreamDescriptor(#'IndAudStreamDescriptor'{streamID    = SID,
 
1201
                                                     streamParms = Parms}, 
 
1202
                           State) ->
 
1203
%     d("enc_IndAudStreamDescriptor -> entry with"
 
1204
%       "~n   SID:   ~p"
 
1205
%       "~n   Parms: ~p", [SID, Parms]),
 
1206
    [
 
1207
     ?StreamToken,
 
1208
     ?EQUAL,
 
1209
     enc_StreamID(SID, State),
 
1210
     ?LBRKT_INDENT(State),
 
1211
     enc_IndAudStreamParms(Parms, ?INC_INDENT(State)),
 
1212
     ?RBRKT_INDENT(State)
 
1213
    ].
 
1214
    
 
1215
enc_IndAudEventBufferDescriptor(Val, State) 
 
1216
  when record(Val, 'IndAudEventBufferDescriptor') ->
 
1217
    #'IndAudEventBufferDescriptor'{eventName = EvName,
 
1218
                                   streamID  = ID} = Val, 
 
1219
    [
 
1220
     ?EventBufferToken,
 
1221
     ?LBRKT_INDENT(State),
 
1222
     enc_PkgdName(EvName, State),
 
1223
     enc_IndAudEventBufferDescriptor_eventSpec(ID, ?INC_INDENT(State)),
 
1224
     ?RBRKT_INDENT(State)
 
1225
    ].
 
1226
 
 
1227
enc_IndAudEventBufferDescriptor_eventSpec(asn1_NOVALUE, _State) ->
 
1228
    [
 
1229
    ];
 
1230
enc_IndAudEventBufferDescriptor_eventSpec({eventParameterName, ParamName}, 
 
1231
                                          State) ->
 
1232
    [
 
1233
     ?LBRKT_INDENT(State),
 
1234
     enc_Name(ParamName, State),
 
1235
     ?RBRKT_INDENT(State)
 
1236
    ];
 
1237
enc_IndAudEventBufferDescriptor_eventSpec(ID, State) ->
 
1238
    [
 
1239
     ?LBRKT_INDENT(State),
 
1240
     enc_eventStream(ID, ?INC_INDENT(State)),
 
1241
     ?RBRKT_INDENT(State)
 
1242
    ].
 
1243
 
 
1244
enc_IndAudEventsDescriptor(Val, State) 
 
1245
  when record(Val, 'IndAudEventsDescriptor') ->
 
1246
    #'IndAudEventsDescriptor'{requestID = ReqID,
 
1247
                              pkgdName  = Name,
 
1248
                              streamID  = asn1_NOVALUE} = Val,
 
1249
    [
 
1250
     ?EventsToken,
 
1251
     ?EQUAL,
 
1252
     enc_RequestID(ReqID, State),
 
1253
     ?LBRKT_INDENT(State),
 
1254
     enc_PkgdName(Name, State), 
 
1255
     ?RBRKT_INDENT(State)
 
1256
    ].
 
1257
 
 
1258
 
 
1259
enc_IndAudSignalsDescriptor(Val, State) ->
 
1260
    [
 
1261
     ?SignalsToken,
 
1262
     ?LBRKT_INDENT(State),
 
1263
     enc_IndAudSignalsDescriptor_value(Val, ?INC_INDENT(State)),
 
1264
     ?RBRKT_INDENT(State)
 
1265
    ].
 
1266
 
 
1267
enc_IndAudSignalsDescriptor_value({signal, Val}, State) ->
 
1268
    enc_IndAudSignal(Val, State);
 
1269
enc_IndAudSignalsDescriptor_value({seqSigList, Val}, State) ->
 
1270
    enc_IndAudSeqSigList(Val, State).
 
1271
    
 
1272
enc_IndAudSignal(#'IndAudSignal'{signalName = SignalName,
 
1273
                                 streamID   = asn1_NOVALUE}, State) ->
 
1274
    [
 
1275
     enc_SignalName(SignalName, State)
 
1276
    ].
 
1277
 
 
1278
enc_IndAudSeqSigList(#'IndAudSeqSigList'{id         = ID,
 
1279
                                         signalList = Parm}, 
 
1280
                     State) ->
 
1281
    [
 
1282
     ?SignalListToken,
 
1283
     ?EQUAL,
 
1284
     enc_UINT16(ID, State),
 
1285
     ?LBRKT_INDENT(State),
 
1286
     enc_IndAudSignal(Parm, ?INC_INDENT(State)),
 
1287
     ?RBRKT_INDENT(State)
 
1288
    ].
 
1289
 
 
1290
enc_IndAudDigitMapDescriptor(#'IndAudDigitMapDescriptor'{digitMapName = Name}, 
 
1291
                             State) ->
 
1292
    [
 
1293
     ?DigitMapToken,
 
1294
     ?EQUAL,
 
1295
     enc_DigitMapName(Name, State)
 
1296
    ].
 
1297
 
 
1298
enc_IndAudStatisticsDescriptor(#'IndAudStatisticsDescriptor'{statName = Name}, 
 
1299
                               State) ->
 
1300
%     d("enc_IndAudStatisticsDescriptor -> entry with"
 
1301
%       "~n   Name: ~p", [Name]),
 
1302
    [
 
1303
     ?StatsToken,
 
1304
     ?LBRKT_INDENT(State),
 
1305
     enc_PkgdName(Name, State),     
 
1306
     ?RBRKT_INDENT(State)    
 
1307
    ].
 
1308
 
 
1309
 
 
1310
enc_IndAudPackagesDescriptor(#'IndAudPackagesDescriptor'{packageName = N,
 
1311
                                                         packageVersion = V}, 
 
1312
                             State) ->
 
1313
    [
 
1314
     ?PackagesToken,
 
1315
     ?LBRKT_INDENT(State),
 
1316
     enc_Name(N, State),
 
1317
     "-",
 
1318
     enc_UINT16(V, State),
 
1319
     ?RBRKT_INDENT(State) 
 
1320
    ].
 
1321
 
 
1322
 
 
1323
%% - v2 end -
 
1324
 
 
1325
    
 
1326
enc_TerminationAudit({'TerminationAudit',Val}, State) ->
 
1327
    enc_TerminationAudit(Val, State);
 
1328
enc_TerminationAudit([], _State) ->
 
1329
    [];
 
1330
enc_TerminationAudit([Mand | Opt], State) ->
 
1331
%     d("enc_TerminationAudit -> entry with"
 
1332
%       "~n   Mand: ~p", [Mand]),
 
1333
    [enc_AuditReturnParameter(Mand, State),
 
1334
     [[?COMMA_INDENT(State), enc_AuditReturnParameter(Val, State)] || Val <- Opt]].
 
1335
 
 
1336
enc_AuditReturnParameter({'AuditReturnParameter',Val}, State) ->
 
1337
    enc_AuditReturnParameter(Val, State);
 
1338
enc_AuditReturnParameter({Tag, Val}, State) ->
 
1339
%     d("enc_AuditReturnParameter -> entry with"
 
1340
%       "~n   Tag: ~p"
 
1341
%       "~n   Val: ~p", [Tag, Val]),
 
1342
    case Tag of
 
1343
        mediaDescriptor ->
 
1344
            enc_MediaDescriptor(Val, State);
 
1345
        modemDescriptor ->
 
1346
            enc_ModemDescriptor(Val, State);
 
1347
        muxDescriptor ->
 
1348
            enc_MuxDescriptor(Val, State);
 
1349
        eventsDescriptor ->
 
1350
            enc_EventsDescriptor(Val, State);
 
1351
        signalsDescriptor ->
 
1352
            enc_SignalsDescriptor(Val, State);
 
1353
        digitMapDescriptor ->
 
1354
            enc_DigitMapDescriptor(Val, State);
 
1355
        observedEventsDescriptor ->
 
1356
            enc_ObservedEventsDescriptor(Val, State);
 
1357
        eventBufferDescriptor ->
 
1358
            enc_EventBufferDescriptor(Val, State);
 
1359
        statisticsDescriptor ->
 
1360
            enc_StatisticsDescriptor(Val, State);
 
1361
        packagesDescriptor ->
 
1362
            enc_PackagesDescriptor(Val, State);
 
1363
        errorDescriptor ->
 
1364
            enc_ErrorDescriptor(Val, State);
 
1365
        emptyDescriptors ->
 
1366
            enc_EmptyDescriptors(Val, State);
 
1367
        _ ->
 
1368
            error({invalid_AuditReturnParameter_tag, Tag})
 
1369
    end.
 
1370
 
 
1371
enc_EmptyDescriptors(#'AuditDescriptor'{auditToken = asn1_NOVALUE}, _State) ->
 
1372
    [];
 
1373
enc_EmptyDescriptors(#'AuditDescriptor'{auditToken = []}, _State) ->
 
1374
    [];
 
1375
enc_EmptyDescriptors(#'AuditDescriptor'{auditToken = List}, State) ->
 
1376
    enc_list([{List, fun enc_auditReturnItem/2}], ?INC_INDENT(State)).
 
1377
 
 
1378
 
 
1379
enc_NotifyRequest(Val, State)
 
1380
  when record(Val, 'NotifyRequest') ->
 
1381
    [
 
1382
     %% Assume that Token is added elsewhere
 
1383
     ?EQUAL,
 
1384
     enc_TerminationIDList1(Val#'NotifyRequest'.terminationID, State),
 
1385
     ?LBRKT_INDENT(State),
 
1386
     %% BUGBUG: Mismatch between ASN.1 and ABNF
 
1387
     %% BUGBUG: The following ought to be a 'choice'
 
1388
     case Val#'NotifyRequest'.errorDescriptor of
 
1389
         asn1_NOVALUE ->
 
1390
             OED = Val#'NotifyRequest'.observedEventsDescriptor,
 
1391
             enc_ObservedEventsDescriptor(OED, ?INC_INDENT(State));
 
1392
         ErrorDescr ->
 
1393
             enc_ErrorDescriptor(ErrorDescr, ?INC_INDENT(State))
 
1394
     end,
 
1395
     ?RBRKT_INDENT(State)
 
1396
    ].
 
1397
 
 
1398
enc_NotifyReply(Val, State)
 
1399
  when record(Val, 'NotifyReply') ->
 
1400
    [
 
1401
     %% Assume that Token is added elsewhere
 
1402
     ?EQUAL,
 
1403
     case Val#'NotifyReply'.terminationID of
 
1404
         asn1_NOVALUE ->
 
1405
             error(asn1_not_compliant_with_abnf);
 
1406
         TermId ->
 
1407
             enc_TerminationIDList1(TermId, State)
 
1408
     end,
 
1409
     case Val#'NotifyReply'.errorDescriptor of
 
1410
         asn1_NOVALUE ->
 
1411
             [];
 
1412
         ErrorDescr ->
 
1413
             [
 
1414
              ?LBRKT_INDENT(State),
 
1415
              enc_ErrorDescriptor(ErrorDescr, ?INC_INDENT(State)),
 
1416
              ?RBRKT_INDENT(State)
 
1417
             ]
 
1418
     end
 
1419
    ].
 
1420
 
 
1421
enc_ObservedEventsDescriptor(Val, State)
 
1422
  when record(Val, 'ObservedEventsDescriptor') ->
 
1423
    [
 
1424
     ?ObservedEventsToken,
 
1425
     ?EQUAL,
 
1426
     enc_RequestID(Val#'ObservedEventsDescriptor'.requestId, State),
 
1427
     ?LBRKT_INDENT(State),
 
1428
     enc_observedEventsDescriptors(Val#'ObservedEventsDescriptor'.observedEventLst, ?INC_INDENT(State)),
 
1429
     ?RBRKT_INDENT(State)
 
1430
    ].
 
1431
 
 
1432
enc_observedEventsDescriptors([Mand | Opt], State) ->
 
1433
    [enc_ObservedEvent(Mand, State),
 
1434
     [[?COMMA_INDENT(State), enc_ObservedEvent(Val, State)] || Val <- Opt]].
 
1435
 
 
1436
%% ;time per event, because it might be buffered
 
1437
%% observedEvent        = [ TimeStamp LWSP COLON] LWSP 
 
1438
%%                        pkgdName [ LBRKT observedEventParameter
 
1439
%%                        *(COMMA observedEventParameter) RBRKT ]
 
1440
%% 
 
1441
%% ;at-most-once eventStream, every eventParameterName at most once
 
1442
%% observedEventParameter = eventStream / eventOther
 
1443
enc_ObservedEvent(Val, State)
 
1444
  when record(Val, 'ObservedEvent') ->
 
1445
    [
 
1446
     case Val#'ObservedEvent'.timeNotation of
 
1447
         asn1_NOVALUE ->
 
1448
             [];
 
1449
         TimeStamp ->
 
1450
             [
 
1451
              enc_TimeNotation(TimeStamp, State),
 
1452
              ?LWSP,
 
1453
              ?COLON
 
1454
             ]
 
1455
     end,
 
1456
     ?LWSP,
 
1457
     enc_EventName(Val#'ObservedEvent'.eventName, State),
 
1458
     enc_opt_brackets(
 
1459
       enc_list([{[Val#'ObservedEvent'.streamID],   fun enc_eventStream/2},
 
1460
                 {Val#'ObservedEvent'.eventParList, fun enc_eventOther/2}],
 
1461
                ?INC_INDENT(State)),
 
1462
       State)
 
1463
    ].
 
1464
 
 
1465
enc_EventName({'EventName',Val}, State) ->
 
1466
    enc_EventName(Val, State);
 
1467
enc_EventName(Val, State) ->
 
1468
    PkgdName = ?META_ENC(event, Val),
 
1469
    enc_PkgdName(PkgdName, State).
 
1470
 
 
1471
enc_eventStream(Val, State) ->
 
1472
    [
 
1473
     ?StreamToken,
 
1474
     ?EQUAL,
 
1475
     enc_StreamID(Val, State)
 
1476
    ].
 
1477
 
 
1478
enc_eventOther(#'EventParameter'{eventParameterName = Name,
 
1479
                                 value              = Value,
 
1480
                                 extraInfo          = Extra}, State) ->
 
1481
    [
 
1482
     enc_Name(Name, State),
 
1483
     enc_propertyParmValues(Value, Extra, State)
 
1484
    ].
 
1485
 
 
1486
enc_ServiceChangeRequest(Val, State)
 
1487
  when record(Val, 'ServiceChangeRequest') ->
 
1488
    [
 
1489
     %% Assume that Token is added elsewhere
 
1490
     ?EQUAL,
 
1491
     enc_TerminationIDList1(Val#'ServiceChangeRequest'.terminationID, State),
 
1492
     ?LBRKT_INDENT(State),
 
1493
     enc_ServiceChangeParm(Val#'ServiceChangeRequest'.serviceChangeParms,
 
1494
                           ?INC_INDENT(State)),
 
1495
     ?RBRKT_INDENT(State)
 
1496
    ].
 
1497
 
 
1498
%% serviceChangeReply   = ServiceChangeToken EQUAL TerminationID
 
1499
%%                        [LBRKT (errorDescriptor / 
 
1500
%%                        serviceChangeReplyDescriptor) RBRKT]
 
1501
%% serviceChangeReplyDescriptor = ServicesToken LBRKT
 
1502
%%                        servChgReplyParm *(COMMA servChgReplyParm) RBRKT
 
1503
%% 
 
1504
%% ;at-most-once. Version is REQUIRED on first ServiceChange response
 
1505
%% servChgReplyParm     = (serviceChangeAddress / serviceChangeMgcId /
 
1506
%%                        serviceChangeProfile / serviceChangeVersion )
 
1507
enc_ServiceChangeReply(Val, State)
 
1508
  when record(Val, 'ServiceChangeReply') ->
 
1509
    [
 
1510
     %% Assume that Token is added elsewhere
 
1511
     ?EQUAL,
 
1512
     enc_TerminationIDList1(Val#'ServiceChangeReply'.terminationID, State),
 
1513
     enc_ServiceChangeResult(Val#'ServiceChangeReply'.serviceChangeResult, State)
 
1514
     ].
 
1515
 
 
1516
enc_ServiceChangeResult({'ServiceChangeResult',Val}, State) ->
 
1517
    enc_ServiceChangeResult(Val, State);
 
1518
enc_ServiceChangeResult({Tag, Val}, State) ->
 
1519
    case Tag of
 
1520
        errorDescriptor ->
 
1521
            [
 
1522
             ?LBRKT_INDENT(State),
 
1523
             enc_ErrorDescriptor(Val, ?INC_INDENT(State)),
 
1524
             ?RBRKT_INDENT(State)
 
1525
            ];
 
1526
        serviceChangeResParms ->
 
1527
            case enc_ServiceChangeResParm(Val, ?INC_INDENT(?INC_INDENT(State))) of
 
1528
                [] ->
 
1529
                    [];
 
1530
                ResParms ->
 
1531
                    [
 
1532
                     ?LBRKT_INDENT(State),
 
1533
                     ?ServicesToken,
 
1534
                     fun(S) ->
 
1535
                             [
 
1536
                              ?LBRKT_INDENT(S),
 
1537
                              ResParms,
 
1538
                              ?RBRKT_INDENT(S)
 
1539
                             ]
 
1540
                     end(?INC_INDENT(State)),
 
1541
                     ?RBRKT_INDENT(State)
 
1542
                    ]
 
1543
            end;
 
1544
        _ ->
 
1545
            error({invalid_ServiceChangeResult_tag, Tag})
 
1546
    end.
 
1547
 
 
1548
%% Required length of termination ID list is 1
 
1549
enc_TerminationIDList1({'TerminationIDList',Val}, State) ->
 
1550
    enc_TerminationIDList1(Val, State);
 
1551
enc_TerminationIDList1([Singleton], State) ->
 
1552
    enc_TerminationID(Singleton, State).
 
1553
 
 
1554
%% No required length of termination ID list
 
1555
enc_TerminationIDListN({'TerminationIDList',Val}, State) ->
 
1556
    enc_TerminationIDListN(Val, State);
 
1557
enc_TerminationIDListN(TidList, State) ->
 
1558
    enc_list([{TidList, fun enc_TerminationID/2}], State).
 
1559
 
 
1560
%% TerminationID        = "ROOT" / pathNAME / "$" / "*"
 
1561
%% ; Total length of pathNAME must not exceed 64 chars.
 
1562
%% pathNAME             = ["*"] NAME *("/" / "*"/ ALPHA / DIGIT /"_" / "$" ) 
 
1563
%%                        ["@" pathDomainName ]
 
1564
enc_TerminationID(Tid, State)
 
1565
  when record(Tid,  megaco_term_id) ->
 
1566
    List = [{Tid#megaco_term_id.id, fun enc_tid_component/2 }],
 
1567
    enc_list(List, State, fun(_S) -> ?SLASH end, false).    
 
1568
 
 
1569
enc_tid_component(Component, State) when list(Component) ->
 
1570
    [enc_tid_sub_component(Sub, State) || Sub <- Component];
 
1571
enc_tid_component(Invalid, _State) ->
 
1572
    error({invalid_id_list_component, Invalid}).
 
1573
 
 
1574
enc_tid_sub_component(Sub, _State) ->
 
1575
    case Sub of
 
1576
        all    -> ?megaco_all;
 
1577
        choose -> ?megaco_choose;
 
1578
        Char when integer(Char) -> Char
 
1579
    end.
 
1580
 
 
1581
%% mediaDescriptor      = MediaToken LBRKT mediaParm *(COMMA mediaParm) RBRKT
 
1582
%% ; at-most-once per item
 
1583
%% ; and either streamParm or streamDescriptor but not both
 
1584
%% mediaParm            = (streamParm / streamDescriptor / 
 
1585
%%                         terminationStateDescriptor)
 
1586
%% ; at-most-once
 
1587
%% streamParm           = ( localDescriptor / remoteDescriptor / 
 
1588
%%                         localControlDescriptor )
 
1589
%% streamDescriptor     = StreamToken EQUAL StreamID LBRKT streamParm 
 
1590
%%                        *(COMMA streamParm) RBRKT
 
1591
enc_MediaDescriptor(Val, State)
 
1592
  when record(Val, 'MediaDescriptor') ->
 
1593
    [
 
1594
     ?MediaToken,
 
1595
     ?LBRKT_INDENT(State),
 
1596
     enc_list([{[Val#'MediaDescriptor'.termStateDescr],
 
1597
                fun enc_TerminationStateDescriptor/2} |
 
1598
               decompose_streams(Val#'MediaDescriptor'.streams)],
 
1599
              ?INC_INDENT(State)),
 
1600
     ?RBRKT_INDENT(State)
 
1601
    ].
 
1602
 
 
1603
decompose_streams(asn1_NOVALUE) ->
 
1604
    [];
 
1605
decompose_streams({'MediaDescriptor_streams',Val}) ->
 
1606
    decompose_streams(Val);
 
1607
decompose_streams({Tag, Val}) ->
 
1608
    case Tag of
 
1609
        oneStream ->
 
1610
            decompose_StreamParms(Val);
 
1611
        multiStream ->
 
1612
            [{Val, fun enc_StreamDescriptor/2}];
 
1613
        _ ->
 
1614
            error({invalid_streams_tag, Tag})
 
1615
    end.
 
1616
 
 
1617
decompose_StreamParms(Val)
 
1618
  when record(Val, 'StreamParms') ->
 
1619
    [
 
1620
     {[Val#'StreamParms'.localControlDescriptor],
 
1621
      fun enc_LocalControlDescriptor/2},
 
1622
     {[Val#'StreamParms'.localDescriptor],
 
1623
      fun enc_localDescriptor/2},
 
1624
     {[Val#'StreamParms'.remoteDescriptor],
 
1625
      fun enc_remoteDescriptor/2},
 
1626
     {[Val#'StreamParms'.statisticsDescriptor],
 
1627
      fun enc_StatisticsDescriptor/2}
 
1628
    ].
 
1629
 
 
1630
enc_StreamDescriptor(Val, State) 
 
1631
    when record(Val, 'StreamDescriptor') ->
 
1632
    [
 
1633
     ?StreamToken,
 
1634
     ?EQUAL,
 
1635
     enc_StreamID(Val#'StreamDescriptor'.streamID, State),
 
1636
     ?LBRKT_INDENT(State),
 
1637
     enc_list(decompose_StreamParms(Val#'StreamDescriptor'.streamParms),
 
1638
              ?INC_INDENT(State)),
 
1639
     ?RBRKT_INDENT(State)
 
1640
    ].
 
1641
 
 
1642
%% localControlDescriptor = LocalControlToken LBRKT localParm 
 
1643
%%                          *(COMMA localParm) RBRKT
 
1644
%% 
 
1645
%% ; at-most-once per item
 
1646
%% localParm            = ( streamMode / propertyParm /
 
1647
%%                          reservedValueMode  / reservedGroupMode ) 
 
1648
%% reservedValueMode       = ReservedValueToken EQUAL ( "ON" / "OFF" ) 
 
1649
%% reservedGroupMode       = ReservedGroupToken EQUAL ( "ON" / "OFF" ) 
 
1650
%% 
 
1651
%% reservedMode      = ReservedToken EQUAL ( "ON" / "OFF" )
 
1652
%% 
 
1653
%% streamMode           = ModeToken EQUAL streamModes
 
1654
enc_LocalControlDescriptor(Val, State)
 
1655
  when record(Val, 'LocalControlDescriptor') ->
 
1656
    [
 
1657
     ?LocalControlToken,
 
1658
     ?LBRKT_INDENT(State),
 
1659
     enc_list([{[Val#'LocalControlDescriptor'.streamMode],
 
1660
                fun enc_StreamMode/2},
 
1661
               {[Val#'LocalControlDescriptor'.reserveGroup],
 
1662
                fun enc_reservedGroupMode/2},
 
1663
               {[Val#'LocalControlDescriptor'.reserveValue],
 
1664
                fun enc_reservedValueMode/2},
 
1665
               {Val#'LocalControlDescriptor'.propertyParms,
 
1666
                fun enc_PropertyParm/2}],
 
1667
              ?INC_INDENT(State)),
 
1668
     ?RBRKT_INDENT(State)
 
1669
    ].
 
1670
 
 
1671
enc_reservedGroupMode(Val, _State) ->
 
1672
    [
 
1673
     ?ReservedGroupToken,
 
1674
     ?EQUAL,
 
1675
     case Val of
 
1676
         false -> ?OffToken;
 
1677
         true  -> ?OnToken
 
1678
     end
 
1679
    ].
 
1680
 
 
1681
enc_reservedValueMode(Val, _State) ->
 
1682
    [
 
1683
     ?ReservedValueToken,
 
1684
     ?EQUAL,
 
1685
     case Val of
 
1686
         false -> ?OffToken;
 
1687
         true  -> ?OnToken
 
1688
     end
 
1689
    ].
 
1690
 
 
1691
enc_StreamMode({'StreamMode',Val}, State) ->
 
1692
    enc_StreamMode(Val, State);
 
1693
enc_StreamMode(Val, _State) ->
 
1694
    [
 
1695
     ?ModeToken,
 
1696
     ?EQUAL,
 
1697
     case Val of
 
1698
         sendOnly -> ?SendonlyToken;
 
1699
         recvOnly -> ?RecvonlyToken;
 
1700
         sendRecv -> ?SendrecvToken;
 
1701
         inactive -> ?InactiveToken;
 
1702
         loopBack -> ?LoopbackToken
 
1703
     end
 
1704
    ].
 
1705
 
 
1706
enc_Name({'Name',Val}, State) ->
 
1707
    enc_Name(Val, State);
 
1708
enc_Name(Val, State) ->
 
1709
    %% BUGBUG: NAME = ALPHA *63(ALPHA / DIGIT / "_" )
 
1710
    enc_STRING(Val, State, 1, 64).
 
1711
 
 
1712
enc_PkgdName({'PkgdName', Val}, State) ->
 
1713
    enc_PkgdName(Val, State);
 
1714
enc_PkgdName(Val, State) ->
 
1715
    %% BUGBUG:  pkgdName =  (NAME / "*")  SLASH  (ItemID / "*" )
 
1716
    enc_OCTET_STRING(Val, State, 1, 64).
 
1717
 
 
1718
enc_localDescriptor(Val, State) 
 
1719
  when record(Val, 'LocalRemoteDescriptor') ->
 
1720
    [
 
1721
     ?LocalToken,
 
1722
     ?LBRKT,
 
1723
     enc_LocalRemoteDescriptor(Val, State),
 
1724
     ?RBRKT_INDENT(State)
 
1725
    ].
 
1726
 
 
1727
enc_remoteDescriptor(Val, State) 
 
1728
  when record(Val, 'LocalRemoteDescriptor') ->
 
1729
    [
 
1730
     ?RemoteToken,
 
1731
     ?LBRKT,
 
1732
     enc_LocalRemoteDescriptor(Val, State),
 
1733
     ?RBRKT_INDENT(State)
 
1734
    ].
 
1735
 
 
1736
%% When text encoding the protocol, the descriptors consist of session
 
1737
%% descriptions as defined in SDP (RFC2327), except that the "s=", "t="
 
1738
%% and "o=" lines are optional. When multiple session descriptions are
 
1739
%% provided in one descriptor, the "v=" lines are required as delimiters;
 
1740
%% otherwise they are optional.  Implementations shall accept session
 
1741
%% descriptions that are fully conformant to RFC2327. When binary
 
1742
%% encoding the protocol the descriptor consists of groups of properties
 
1743
%% (tag-value pairs) as specified in Annex C.  Each such group may
 
1744
%% contain the parameters of a session description.
 
1745
enc_LocalRemoteDescriptor(Val, State)
 
1746
  when record(Val, 'LocalRemoteDescriptor') ->
 
1747
    case Val#'LocalRemoteDescriptor'.propGrps of
 
1748
        [] ->
 
1749
            [];
 
1750
        [OptV | MandV] ->
 
1751
            [?LfToken,
 
1752
             enc_PropertyGroup(OptV, opt_v, State) |
 
1753
             [enc_PropertyGroup(M, mand_v, State) || M <- MandV]]
 
1754
    end.
 
1755
 
 
1756
enc_PropertyGroup({'PropertyGroup',Val}, RequiresV, State) ->
 
1757
    enc_PropertyGroup(Val, RequiresV, State);
 
1758
enc_PropertyGroup([H | _T] = List, mand_v, State) 
 
1759
  when record(H, 'PropertyParm'), H#'PropertyParm'.name == "v" ->
 
1760
    enc_PropertyGroup(List, opt_v, State);
 
1761
enc_PropertyGroup(PG, opt_v, State) ->
 
1762
    [
 
1763
     [[enc_PropertyGroupParm(PP, State), ?CrToken, ?LfToken] || PP <- PG]
 
1764
    ].
 
1765
 
 
1766
enc_PropertyGroupParm(Val, State)
 
1767
  when record(Val, 'PropertyParm') ->
 
1768
    [OctetString] = Val#'PropertyParm'.value,
 
1769
    [
 
1770
     enc_PkgdName(Val#'PropertyParm'.name, State),
 
1771
     ?EqualToken,
 
1772
     enc_OCTET_STRING(OctetString, State, 0, infinity)
 
1773
    ].
 
1774
 
 
1775
%% propertyParm         = pkgdName parmValue
 
1776
%% parmValue            = (EQUAL alternativeValue/ INEQUAL VALUE)
 
1777
%% alternativeValue     = ( VALUE / LSBRKT VALUE *(COMMA VALUE) RSBRKT  / 
 
1778
%%                        LSBRKT VALUE DOT DOT VALUE RSBRKT )
 
1779
enc_PropertyParm(Val, State)
 
1780
  when record(Val, 'PropertyParm') ->
 
1781
    PkgdName = ?META_ENC(property, Val#'PropertyParm'.name),
 
1782
    [
 
1783
     enc_PkgdName(PkgdName, State),
 
1784
     enc_propertyParmValues(Val#'PropertyParm'.value,
 
1785
                            Val#'PropertyParm'.extraInfo,
 
1786
                            State)
 
1787
    ].
 
1788
     
 
1789
enc_propertyParmValues([Single], asn1_NOVALUE, State) ->
 
1790
    [
 
1791
     ?EqualToken,
 
1792
     enc_Value(Single, State)
 
1793
    ];
 
1794
enc_propertyParmValues([Single], {relation, Rel}, State) ->
 
1795
    case Rel of
 
1796
        greaterThan -> [$>, enc_Value(Single, State)];
 
1797
        smallerThan -> [$<, enc_Value(Single, State)];
 
1798
        unequalTo   -> [$#, enc_Value(Single, State)]
 
1799
    end;
 
1800
enc_propertyParmValues([Low, High], {range, true}, State)->
 
1801
    %% Exact two values
 
1802
    [
 
1803
     ?EQUAL,
 
1804
     ?LSBRKT,
 
1805
     enc_Value(Low, State),
 
1806
     ?COLON,
 
1807
     enc_Value(High, State),
 
1808
     ?RSBRKT
 
1809
    ];
 
1810
enc_propertyParmValues(Values, {sublist, true}, State)->
 
1811
    %% sublist (i.e. A AND B AND ...)
 
1812
    [
 
1813
     ?EQUAL,
 
1814
     ?LSBRKT_INDENT(State),
 
1815
     enc_list([{Values, fun enc_Value/2}], ?INC_INDENT(State)),
 
1816
     ?RSBRKT_INDENT(State)
 
1817
    ];
 
1818
enc_propertyParmValues(Values, {sublist, false}, State) ->
 
1819
    %% alternatives (i.e. A OR B OR ...)
 
1820
    [
 
1821
     ?EQUAL,
 
1822
     ?LBRKT_INDENT(State),
 
1823
     enc_list([{Values, fun enc_Value/2}], ?INC_INDENT(State)),
 
1824
     ?RBRKT_INDENT(State)
 
1825
    ];
 
1826
enc_propertyParmValues(V, EI, _State) ->
 
1827
    error({invalid_property_parm_values, V, EI}).
 
1828
 
 
1829
enc_TerminationStateDescriptor(Val, State)
 
1830
  when record(Val, 'TerminationStateDescriptor') ->
 
1831
    [
 
1832
     ?TerminationStateToken,
 
1833
     ?LBRKT_INDENT(State),
 
1834
     enc_list([{Val#'TerminationStateDescriptor'.propertyParms,
 
1835
                fun enc_PropertyParm/2},
 
1836
               {[Val#'TerminationStateDescriptor'.eventBufferControl],
 
1837
                fun enc_eventBufferControl/2},
 
1838
               {[Val#'TerminationStateDescriptor'.serviceState],
 
1839
                fun enc_serviceState/2}],
 
1840
              ?INC_INDENT(State)),
 
1841
     ?RBRKT_INDENT(State)
 
1842
    ].
 
1843
 
 
1844
enc_eventBufferControl(Val, _State) ->
 
1845
    [
 
1846
 
 
1847
     ?BufferToken,
 
1848
     ?EQUAL,  
 
1849
     case Val of
 
1850
         off      -> ?OffToken;
 
1851
         lockStep -> ?LockStepToken
 
1852
    end
 
1853
    ].
 
1854
    
 
1855
enc_serviceState({'ServiceState',Val}, State) ->
 
1856
    enc_serviceState(Val, State);
 
1857
enc_serviceState(Val, _State) ->
 
1858
    [
 
1859
     ?ServiceStatesToken,
 
1860
     ?EQUAL,
 
1861
     case Val of
 
1862
         test     -> ?TestToken;
 
1863
         outOfSvc -> ?OutOfSvcToken;
 
1864
         inSvc    -> ?InSvcToken
 
1865
     end
 
1866
    ].
 
1867
 
 
1868
enc_MuxDescriptor(Val, State)
 
1869
  when record(Val, 'MuxDescriptor') ->
 
1870
    [
 
1871
     ?MuxToken,
 
1872
     ?EQUAL,
 
1873
     enc_MuxType(Val#'MuxDescriptor'.muxType, State),
 
1874
     enc_TerminationIDList1(Val#'MuxDescriptor'.termList, State)
 
1875
    ].
 
1876
 
 
1877
enc_MuxType({'MuxType',Val}, State) ->
 
1878
    enc_MuxType(Val, State);
 
1879
enc_MuxType(Val, _State) ->
 
1880
    case Val of
 
1881
        h221  -> ?H221Token;
 
1882
        h223  -> ?H223Token;
 
1883
        h226  -> ?H226Token;
 
1884
        v76   -> ?V76Token;
 
1885
        %% extensionParameter
 
1886
        nx64k -> ?Nx64kToken  % v2
 
1887
    end.
 
1888
 
 
1889
enc_StreamID({'StreamID',Val}, State) ->
 
1890
    enc_StreamID(Val, State);
 
1891
enc_StreamID(Val, State) ->
 
1892
    enc_UINT16(Val, State).
 
1893
 
 
1894
enc_EventsDescriptor(Val, State)
 
1895
  when record(Val, 'EventsDescriptor') ->
 
1896
    #'EventsDescriptor'{requestID = RequestId,
 
1897
                        eventList = Events} = Val,
 
1898
    if
 
1899
        RequestId == asn1_NOVALUE, Events == [] ->
 
1900
            [
 
1901
             ?EventsToken
 
1902
            ];
 
1903
 
 
1904
        RequestId /= asn1_NOVALUE, Events /= [] ->
 
1905
            [
 
1906
             ?EventsToken,
 
1907
             ?EQUAL,
 
1908
             enc_RequestID(RequestId, State),
 
1909
             ?LBRKT_INDENT(State),
 
1910
             enc_list([{Events, fun enc_RequestedEvent/2}],
 
1911
                      ?INC_INDENT(State)),
 
1912
             ?RBRKT_INDENT(State)
 
1913
            ]
 
1914
    end.
 
1915
 
 
1916
enc_RequestedEvent(Val, State)
 
1917
  when record(Val, 'RequestedEvent') ->
 
1918
    PkgdName = ?META_ENC(event, Val#'RequestedEvent'.pkgdName),
 
1919
    [
 
1920
     enc_PkgdName(PkgdName, State),
 
1921
     enc_opt_brackets(
 
1922
       enc_list([{[Val#'RequestedEvent'.streamID],  fun enc_eventStream/2},
 
1923
                 {Val#'RequestedEvent'.evParList, fun enc_eventOther/2} |
 
1924
                 decompose_requestedActions(Val#'RequestedEvent'.eventAction)],
 
1925
                ?INC_INDENT(State)),
 
1926
      State)
 
1927
    ].
 
1928
 
 
1929
decompose_requestedActions(asn1_NOVALUE) ->
 
1930
    [];
 
1931
 
 
1932
%% 
 
1933
%% This in the ABNF: 
 
1934
%% at-most-once each of KeepActiveToken , eventDM and eventStream
 
1935
%% at most one of either embedWithSig or embedNoSig but not both
 
1936
%% KeepActiveToken and embedWithSig must not both be present
 
1937
%% 
 
1938
 
 
1939
%% embedWithSig
 
1940
decompose_requestedActions(#'RequestedActions'{keepActive        = KA,
 
1941
                                               eventDM           = EDM,
 
1942
                                               secondEvent       = SE,
 
1943
                                               signalsDescriptor = SD}) 
 
1944
  when KA /= true,
 
1945
       SD /= asn1_NOVALUE, SD /= [] ->
 
1946
    [
 
1947
     {[EDM],      fun enc_EventDM/2},
 
1948
     {[{SE, SD}], fun enc_embedWithSig/2}
 
1949
    ];
 
1950
 
 
1951
%% embedNoSig
 
1952
decompose_requestedActions(#'RequestedActions'{keepActive        = KA,
 
1953
                                               eventDM           = EDM,
 
1954
                                               secondEvent       = SE,
 
1955
                                               signalsDescriptor = SD}) 
 
1956
  when SD == asn1_NOVALUE; SD == [] ->
 
1957
    [
 
1958
     {[KA],  fun enc_keepActive/2},
 
1959
     {[EDM], fun enc_EventDM/2},
 
1960
     {[SE],  fun enc_embedNoSig/2}
 
1961
    ];
 
1962
 
 
1963
%% Fallback, if everything else failes....
 
1964
decompose_requestedActions(#'RequestedActions'{keepActive        = KA,
 
1965
                                               eventDM           = EDM,
 
1966
                                               secondEvent       = SE,
 
1967
                                               signalsDescriptor = SD}) ->
 
1968
    [
 
1969
     {[KA],       fun enc_keepActive/2},
 
1970
     {[EDM],      fun enc_EventDM/2},
 
1971
     {[{SE, SD}], fun enc_embedWithSig/2}
 
1972
    ].
 
1973
 
 
1974
enc_embedNoSig(#'SecondEventsDescriptor'{requestID = RID,
 
1975
                                         eventList = Evs}, State) ->
 
1976
    [
 
1977
     ?EmbedToken,
 
1978
     ?LBRKT_INDENT(State),
 
1979
     enc_embedFirst(RID, Evs, ?INC_INDENT(State)), 
 
1980
     ?RBRKT_INDENT(State)
 
1981
    ].
 
1982
 
 
1983
enc_embedWithSig({asn1_NOVALUE, SD}, State) ->
 
1984
    [
 
1985
     ?EmbedToken,
 
1986
     ?LBRKT_INDENT(State),
 
1987
     enc_SignalsDescriptor(SD, ?INC_INDENT(State)),
 
1988
     ?RBRKT_INDENT(State)
 
1989
    ];
 
1990
enc_embedWithSig({#'SecondEventsDescriptor'{requestID = RID,
 
1991
                                            eventList = Evs}, SD}, State) ->
 
1992
    [
 
1993
     ?EmbedToken,
 
1994
     ?LBRKT_INDENT(State),
 
1995
     enc_SignalsDescriptor(SD, ?INC_INDENT(State)),
 
1996
     ?COMMA_INDENT(?INC_INDENT(State)), 
 
1997
     enc_embedFirst(RID, Evs, ?INC_INDENT(State)), 
 
1998
     ?RBRKT_INDENT(State)
 
1999
    ].
 
2000
 
 
2001
enc_keepActive(Val, _State) ->
 
2002
    case Val of
 
2003
        true -> [?KeepActiveToken];
 
2004
        false -> []
 
2005
    end.
 
2006
    
 
2007
enc_EventDM({'EventDM',Val}, State) ->
 
2008
    enc_EventDM(Val, State);
 
2009
enc_EventDM({Tag, Val}, State) ->
 
2010
    case Tag of
 
2011
        digitMapName ->
 
2012
            [
 
2013
             ?DigitMapToken,
 
2014
             ?EQUAL,
 
2015
             enc_DigitMapName(Val, State)
 
2016
            ];
 
2017
        digitMapValue ->
 
2018
            [
 
2019
             ?DigitMapToken,
 
2020
             ?LBRKT_INDENT(State),
 
2021
             enc_DigitMapValue(Val, ?INC_INDENT(State)),
 
2022
             ?RBRKT_INDENT(State)
 
2023
            ];
 
2024
        _ ->
 
2025
            error({invalid_EventDM_tag, Tag})
 
2026
    end.
 
2027
 
 
2028
 
 
2029
enc_embedFirst(RID, Evs, State)
 
2030
  when RID /= asn1_NOVALUE, list(Evs), Evs /= [] ->
 
2031
    %%     d("enc_embedFirst -> entry with"
 
2032
    %%       "~n   RID: ~p"
 
2033
    %%       "~n   Evs: ~p", [RID, Evs]),
 
2034
    [
 
2035
     ?EventsToken,
 
2036
     ?EQUAL,
 
2037
     enc_RequestID(RID, State),
 
2038
     ?LBRKT_INDENT(State),
 
2039
     enc_list([{Evs, fun enc_SecondRequestedEvent/2}], ?INC_INDENT(State)),
 
2040
     ?RBRKT_INDENT(State)
 
2041
    ];
 
2042
enc_embedFirst(_RID, _Evs, State) ->
 
2043
    %%     d("enc_embedFirst -> entry"),
 
2044
    [
 
2045
     ?EventsToken
 
2046
    ].
 
2047
 
 
2048
 
 
2049
enc_SecondRequestedEvent(#'SecondRequestedEvent'{pkgdName    = N,
 
2050
                                                 streamID    = SID,
 
2051
                                                 evParList   = EPL,
 
2052
                                                 eventAction = EA}, State) ->
 
2053
    PkgdName = ?META_ENC(event, N),
 
2054
    [
 
2055
     enc_PkgdName(PkgdName, State),
 
2056
     enc_opt_brackets(
 
2057
       enc_list(
 
2058
         [{[SID], fun enc_eventStream/2},
 
2059
          {EPL, fun enc_eventOther/2} |
 
2060
          decompose_secondRequestedActions(EA)],
 
2061
         ?INC_INDENT(State)),
 
2062
       State)
 
2063
    ].
 
2064
 
 
2065
decompose_secondRequestedActions(asn1_NOVALUE) ->
 
2066
    [];
 
2067
decompose_secondRequestedActions(Val)
 
2068
  when record(Val, 'SecondRequestedActions') ->
 
2069
    [
 
2070
     {[Val#'SecondRequestedActions'.keepActive],
 
2071
      fun enc_keepActive/2},
 
2072
     {[Val#'SecondRequestedActions'.eventDM],
 
2073
      fun enc_EventDM/2},
 
2074
     {[Val#'SecondRequestedActions'.signalsDescriptor],
 
2075
      fun enc_embeddedSignalsDescriptor/2}
 
2076
    ].
 
2077
 
 
2078
enc_embeddedSignalsDescriptor(Val, State) ->
 
2079
    [
 
2080
     ?EmbedToken,
 
2081
     ?LBRKT_INDENT(State),
 
2082
     enc_SignalsDescriptor(Val, ?INC_INDENT(State)),
 
2083
     ?RBRKT_INDENT(State)
 
2084
    ].
 
2085
    
 
2086
enc_EventBufferDescriptor({'EventBufferDescriptor',Val}, State) ->
 
2087
    enc_EventBufferDescriptor(Val, State);
 
2088
enc_EventBufferDescriptor([Mand | Opt], State) ->
 
2089
    [
 
2090
     ?EventBufferToken,
 
2091
     ?LBRKT_INDENT(State),
 
2092
     enc_eventSpecs([Mand | Opt], ?INC_INDENT(State)),
 
2093
     ?RBRKT_INDENT(State)   
 
2094
    ].
 
2095
 
 
2096
enc_eventSpecs([Mand | Opt], State) ->
 
2097
    [enc_eventSpecs(Mand, State),
 
2098
     [[?COMMA_INDENT(State), enc_eventSpec(Val, State)] || Val <- Opt]].
 
2099
 
 
2100
enc_eventSpec(Val, State)
 
2101
  when record(Val, 'EventSpec') ->
 
2102
    [
 
2103
     enc_EventName(Val#'EventSpec'.eventName, State),
 
2104
     enc_opt_brackets(
 
2105
       enc_list([{[Val#'EventSpec'.streamID],   fun enc_eventStream/2},
 
2106
                 {Val#'EventSpec'.eventParList, fun enc_eventOther/2}],
 
2107
                ?INC_INDENT(State)),
 
2108
       State)
 
2109
    ].
 
2110
 
 
2111
enc_SignalsDescriptor({'SignalsDescriptor',Val}, State) ->
 
2112
    enc_SignalsDescriptor(Val, State);
 
2113
enc_SignalsDescriptor([], _State) ->
 
2114
    [
 
2115
     ?SignalsToken
 
2116
    ];
 
2117
enc_SignalsDescriptor(List, State) when list(List) ->
 
2118
    [
 
2119
     ?SignalsToken,
 
2120
     ?LBRKT_INDENT(State),
 
2121
     enc_list([{List, fun enc_SignalRequest/2}], ?INC_INDENT(State)),
 
2122
     ?RBRKT_INDENT(State)
 
2123
    ].
 
2124
 
 
2125
enc_SignalRequest({'SignalRequest',Val}, State) ->
 
2126
    enc_SignalRequest(Val, State);
 
2127
enc_SignalRequest({Tag, Val}, State) ->
 
2128
    case Tag of
 
2129
        signal ->
 
2130
            enc_Signal(Val, State);
 
2131
        seqSigList ->
 
2132
            enc_SeqSigList(Val, State);
 
2133
        _ ->
 
2134
            error({invalid_SignalRequest_tag, Tag})
 
2135
    end.
 
2136
 
 
2137
 
 
2138
enc_SeqSigList(Val, State)
 
2139
  when record(Val, 'SeqSigList') ->
 
2140
    [
 
2141
     ?SignalListToken,
 
2142
     ?EQUAL,
 
2143
     enc_UINT16(Val#'SeqSigList'.id, State),
 
2144
     ?LBRKT_INDENT(State),
 
2145
     enc_list([{Val#'SeqSigList'.signalList, fun enc_Signal/2}],
 
2146
              ?INC_INDENT(State)),
 
2147
     ?RBRKT_INDENT(State)
 
2148
    ].
 
2149
 
 
2150
enc_Signal(Val, State)
 
2151
  when record(Val, 'Signal') ->
 
2152
    [
 
2153
     enc_SignalName(Val#'Signal'.signalName, State),
 
2154
     enc_opt_brackets(
 
2155
       enc_list([{[Val#'Signal'.streamID],         fun enc_sigStream/2},
 
2156
                 {[Val#'Signal'.sigType],          fun enc_sigSignalType/2},
 
2157
                 {[Val#'Signal'.duration],         fun enc_sigDuration/2},
 
2158
                 {[Val#'Signal'.notifyCompletion], fun enc_notifyCompletion/2},
 
2159
                 {[Val#'Signal'.keepActive],       fun enc_keepActive/2},
 
2160
                 {Val#'Signal'.sigParList,         fun enc_sigOther/2},
 
2161
                 {[Val#'Signal'.direction],        fun enc_SignalDirection/2},
 
2162
                 {[Val#'Signal'.requestID],        fun enc_sigRequestID/2}],
 
2163
                ?INC_INDENT(State)),
 
2164
      State)
 
2165
    ].
 
2166
 
 
2167
enc_sigStream(Val, State) ->
 
2168
    [
 
2169
     ?StreamToken,
 
2170
     ?EQUAL, 
 
2171
     enc_StreamID(Val, State)
 
2172
    ].
 
2173
 
 
2174
enc_sigSignalType(Val, State) ->
 
2175
    [
 
2176
     ?SignalTypeToken,
 
2177
     ?EQUAL,
 
2178
     enc_SignalType(Val, State)
 
2179
    ].
 
2180
 
 
2181
enc_sigDuration(Val, State) ->
 
2182
    [
 
2183
     ?DurationToken,
 
2184
     ?EQUAL,
 
2185
     enc_UINT16(Val, State)
 
2186
    ].
 
2187
 
 
2188
enc_notifyCompletion(List, State) when list(List) ->
 
2189
    [
 
2190
     ?NotifyCompletionToken,
 
2191
     ?EQUAL,
 
2192
     ?LBRKT_INDENT(State),
 
2193
     enc_list([{List, fun enc_notifyCompletionItem/2}], ?INC_INDENT(State)),
 
2194
     ?RBRKT_INDENT(State)
 
2195
    ].
 
2196
 
 
2197
enc_notifyCompletionItem(Val, _State) ->
 
2198
    case Val of
 
2199
        onTimeOut                   -> ?TimeOutToken;
 
2200
        onInterruptByEvent          -> ?InterruptByEventToken;
 
2201
        onInterruptByNewSignalDescr -> ?InterruptByNewSignalsDescrToken;
 
2202
        otherReason                 -> ?OtherReasonToken
 
2203
    end.
 
2204
 
 
2205
enc_SignalType({'SignalType',Val}, State) ->
 
2206
    enc_SignalType(Val, State);
 
2207
enc_SignalType(Val, _State) ->
 
2208
    case Val of
 
2209
        brief ->   ?BriefToken;
 
2210
        onOff ->   ?OnOffToken;
 
2211
        timeOut -> ?TimeOutToken
 
2212
    end.
 
2213
 
 
2214
enc_SignalName({'SignalName',Val}, State)->
 
2215
    enc_SignalName(Val, State);
 
2216
enc_SignalName(Val, State) ->
 
2217
    PkgdName = ?META_ENC(signal, Val),
 
2218
    enc_PkgdName(PkgdName, State).
 
2219
 
 
2220
enc_sigOther(Val, State)
 
2221
  when record(Val, 'SigParameter') ->
 
2222
    [
 
2223
     enc_Name(Val#'SigParameter'.sigParameterName, State),
 
2224
     enc_propertyParmValues(Val#'SigParameter'.value,
 
2225
                            Val#'SigParameter'.extraInfo,
 
2226
                            State)
 
2227
    ].
 
2228
 
 
2229
enc_SignalDirection({'SignalDirection', Val}, State) ->
 
2230
    enc_SignalDirection(Val, State);
 
2231
enc_SignalDirection(Val, _State) ->
 
2232
    [
 
2233
     ?DirectionToken,
 
2234
     ?EQUAL,
 
2235
     case Val of
 
2236
         internal -> ?InternalToken;
 
2237
         external -> ?ExternalToken;
 
2238
         both     -> ?BothToken
 
2239
     end
 
2240
    ].
 
2241
 
 
2242
enc_sigRequestID(Val, State) ->
 
2243
    [
 
2244
     ?RequestIDToken,
 
2245
     ?EQUAL,
 
2246
     enc_RequestID(Val, State)
 
2247
    ].
 
2248
 
 
2249
enc_RequestID({'RequestID',Val}, State) ->
 
2250
    enc_RequestID(Val, State);
 
2251
enc_RequestID(Val, _State) when Val == ?megaco_all_request_id ->
 
2252
    "*";
 
2253
enc_RequestID(Val, State) ->
 
2254
    enc_UINT32(Val, State).
 
2255
 
 
2256
enc_ModemDescriptor(MD, _State) ->
 
2257
    error({deprecated, MD}).
 
2258
 
 
2259
%% Corr1:
 
2260
%% As of corr 1 ModemDescriptor has been deprecated.
 
2261
%% 7.1.2: ...shall not be included as part of a transmitted content and,
 
2262
%%        if received, shall either be ignored or processed at the option
 
2263
%%        of the implementation. ...
 
2264
%% enc_ModemDescriptor(#'ModemDescriptor'{mtl = [Val],
 
2265
%%                                     mpl = [],
 
2266
%%                                     nonStandardData = asn1_NOVALUE},
 
2267
%%                  State) ->
 
2268
%%     [
 
2269
%%      ?ModemToken,
 
2270
%%      ?EQUAL,
 
2271
%%      enc_ModemType(Val, State)
 
2272
%%     ];
 
2273
%% enc_ModemDescriptor(Val, State)
 
2274
%%   when record(Val, 'ModemDescriptor') ->
 
2275
%%     [
 
2276
%%      ?ModemToken,
 
2277
%%      ?LSBRKT,
 
2278
%%      enc_list([{Val#'ModemDescriptor'.mtl, fun enc_ModemType/2}], State),
 
2279
%%      ?RSBRKT,
 
2280
%%      enc_opt_brackets(
 
2281
%%        enc_list([{Val#'ModemDescriptor'.mpl, fun enc_PropertyParm/2}],
 
2282
%%              ?INC_INDENT(State)),
 
2283
%%        State)
 
2284
%%      %% BUGBUG: Is PropertyParm == NAME parmValue?
 
2285
%%     ].
 
2286
 
 
2287
%% enc_ModemDescriptor(Val, State)
 
2288
%%   when record(Val, 'ModemDescriptor') ->
 
2289
%%     [
 
2290
%%      ?ModemToken,
 
2291
%%      %% BUGBUG: Does never generate: EQUAL modemType
 
2292
%%      ?LSBRKT,
 
2293
%%      enc_list([{Val#'ModemDescriptor'.mtl, fun enc_ModemType/2}], State),
 
2294
%%      ?RSBRKT,
 
2295
%%      enc_opt_brackets(
 
2296
%%        enc_list([{Val#'ModemDescriptor'.mpl, fun enc_PropertyParm/2}],
 
2297
%%              ?INC_INDENT(State)),
 
2298
%%        State)
 
2299
%%      %% BUGBUG: Is PropertyParm == NAME parmValue?
 
2300
%%     ].
 
2301
 
 
2302
%% Corr1: See ModemDescriptor above
 
2303
%% enc_ModemType({'ModemType',Val}, State)->
 
2304
%%     enc_ModemType(Val, State);
 
2305
%% enc_ModemType(Val, _State) ->
 
2306
%%     %% BUGBUG: Does not handle extensionParameter
 
2307
%%     case Val of
 
2308
%%         v18            -> ?V18Token;
 
2309
%%         v22            -> ?V22Token;
 
2310
%%         v22bis         -> ?V22bisToken;
 
2311
%%         v32            -> ?V32Token;
 
2312
%%         v32bis         -> ?V32bisToken;
 
2313
%%         v34            -> ?V34Token;
 
2314
%%         v90            -> ?V90Token;
 
2315
%%         v91            -> ?V91Token;
 
2316
%%         synchISDN -> ?SynchISDNToken
 
2317
%%     end.
 
2318
 
 
2319
enc_DigitMapDescriptor(Val, State)
 
2320
  when record(Val, 'DigitMapDescriptor') ->
 
2321
    [
 
2322
     ?DigitMapToken,
 
2323
     ?EQUAL,
 
2324
     enc_DigitMapName(Val#'DigitMapDescriptor'.digitMapName, State),
 
2325
     ?LBRKT_INDENT(State),
 
2326
     enc_DigitMapValue(Val#'DigitMapDescriptor'.digitMapValue,
 
2327
                       ?INC_INDENT(State)),
 
2328
     ?RBRKT_INDENT(State)
 
2329
    ].
 
2330
 
 
2331
enc_DigitMapName({'DigitMapName',Val}, State) ->
 
2332
    enc_DigitMapName(Val, State);
 
2333
enc_DigitMapName(Val, State) ->
 
2334
    enc_Name(Val, State).
 
2335
 
 
2336
enc_DigitMapValue(Val, State)
 
2337
  when record(Val, 'DigitMapValue') ->
 
2338
    [
 
2339
     enc_timer(Val#'DigitMapValue'.startTimer,     $T, State),
 
2340
     enc_timer(Val#'DigitMapValue'.shortTimer,     $S, State),
 
2341
     enc_timer(Val#'DigitMapValue'.longTimer,      $L, State),
 
2342
     enc_timer(Val#'DigitMapValue'.durationTimer,  $Z, State),
 
2343
     %% BUGBUG: digitMapBody not handled at all
 
2344
     enc_STRING(Val#'DigitMapValue'.digitMapBody, State, 0, infinity)
 
2345
    ].
 
2346
 
 
2347
enc_timer(asn1_NOVALUE, _Prefix, _State) ->
 
2348
    [];
 
2349
enc_timer(Timer, Prefix, State) ->
 
2350
    [
 
2351
     Prefix,
 
2352
     ?COLON,
 
2353
     enc_DIGIT(Timer, State, 0, 99),
 
2354
     ?COMMA_INDENT(State)
 
2355
    ].
 
2356
 
 
2357
enc_ServiceChangeParm(Val, State)
 
2358
  when record(Val, 'ServiceChangeParm') ->
 
2359
    [
 
2360
     ?ServicesToken,
 
2361
     ?LBRKT_INDENT(State),
 
2362
     enc_list([{[Val#'ServiceChangeParm'.serviceChangeMethod],
 
2363
                fun enc_ServiceChangeMethod/2},
 
2364
               {[Val#'ServiceChangeParm'.serviceChangeAddress],
 
2365
                fun enc_ServiceChangeAddress/2},
 
2366
               {[Val#'ServiceChangeParm'.serviceChangeVersion],
 
2367
                fun enc_serviceChangeVersion/2},
 
2368
               {[Val#'ServiceChangeParm'.serviceChangeProfile],
 
2369
                fun enc_ServiceChangeProfile/2},
 
2370
               {[{reason, Val#'ServiceChangeParm'.serviceChangeReason}],
 
2371
                fun enc_serviceChangeReason/2},
 
2372
               {[Val#'ServiceChangeParm'.serviceChangeDelay],
 
2373
                fun enc_serviceChangeDelay/2},
 
2374
               {[Val#'ServiceChangeParm'.serviceChangeMgcId],
 
2375
                fun enc_serviceChangeMgcId/2},
 
2376
               {[Val#'ServiceChangeParm'.timeStamp],
 
2377
                fun enc_TimeNotation/2},
 
2378
               {Val#'ServiceChangeParm'.serviceChangeInfo,
 
2379
                fun enc_AuditDescriptor/2},
 
2380
               {[Val#'ServiceChangeParm'.serviceChangeIncompleteFlag],
 
2381
                fun('NULL', _) -> ?ServiceChangeIncompleteToken end}],
 
2382
              ?INC_INDENT(State)),
 
2383
     ?RBRKT_INDENT(State)
 
2384
    ].
 
2385
 
 
2386
 
 
2387
enc_ServiceChangeMethod({'ServiceChangeMethod',Val}, State) ->
 
2388
    enc_ServiceChangeMethod(Val, State);
 
2389
enc_ServiceChangeMethod(Val, _State) ->
 
2390
    [
 
2391
     ?MethodToken,
 
2392
     ?EQUAL,
 
2393
     case Val of
 
2394
        failover      -> ?FailoverToken;
 
2395
        forced        -> ?ForcedToken;
 
2396
        graceful      -> ?GracefulToken;
 
2397
        restart       -> ?RestartToken;
 
2398
        disconnected  -> ?DisconnectedToken;
 
2399
        handOff       -> ?HandOffToken
 
2400
     end
 
2401
     %% BUGBUG: extension
 
2402
    ].
 
2403
 
 
2404
enc_ServiceChangeAddress({'ServiceChangeAddress',Val}, State) ->
 
2405
    enc_ServiceChangeAddress(Val, State);
 
2406
enc_ServiceChangeAddress({Tag, Val}, State) ->
 
2407
    [
 
2408
     ?ServiceChangeAddressToken,
 
2409
     ?EQUAL,
 
2410
     case Tag of
 
2411
         portNumber ->
 
2412
             enc_portNumber(Val, State);
 
2413
         ip4Address ->
 
2414
             enc_IP4Address(Val, State);
 
2415
         ip6Address ->
 
2416
             enc_IP6Address(Val, State);
 
2417
         domainName ->
 
2418
             enc_DomainName(Val, State);
 
2419
         deviceName ->
 
2420
             enc_PathName(Val, State);
 
2421
         mtpAddress ->
 
2422
             enc_mtpAddress(Val, State);
 
2423
         _ ->
 
2424
             error({invalid_ServiceChangeAddress_tag, Tag})
 
2425
     end
 
2426
    ].
 
2427
 
 
2428
enc_serviceChangeVersion(Val, State) ->
 
2429
    [
 
2430
     ?VersionToken,
 
2431
     ?EQUAL,
 
2432
     enc_version(Val, State)
 
2433
    ].
 
2434
 
 
2435
enc_ServiceChangeProfile(#'ServiceChangeProfile'{profileName = Name,
 
2436
                                                 version     = Version}, 
 
2437
                         State) ->
 
2438
    [
 
2439
     ?ProfileToken,
 
2440
     ?EQUAL,
 
2441
     enc_Name(Name, State),
 
2442
     ?SLASH,
 
2443
     enc_version(Version, State)
 
2444
    ].
 
2445
 
 
2446
enc_serviceChangeReason({reason, Val}, State) ->
 
2447
    case Val of
 
2448
        asn1_NOVALUE ->
 
2449
            [];
 
2450
        [List] when list(List) ->
 
2451
            [
 
2452
             ?ReasonToken,
 
2453
             ?EQUAL,
 
2454
             enc_QUOTED_STRING(List,State) % OTP-4632 enc_Value(List, State)
 
2455
            ]
 
2456
    end.
 
2457
 
 
2458
enc_serviceChangeDelay(Val, State) ->
 
2459
    [
 
2460
     ?DelayToken,
 
2461
     ?EQUAL,
 
2462
     enc_UINT32(Val, State)
 
2463
    ].
 
2464
 
 
2465
enc_serviceChangeMgcId(Val, State) ->
 
2466
    [
 
2467
     ?MgcIdToken,
 
2468
     ?EQUAL,
 
2469
     enc_MId(Val, State)
 
2470
    ].
 
2471
 
 
2472
enc_portNumber(Val, State) when integer(Val), Val >= 0 ->
 
2473
    enc_UINT16(Val, State).
 
2474
     
 
2475
enc_ServiceChangeResParm(Val, State)
 
2476
  when record(Val, 'ServiceChangeResParm') ->
 
2477
    enc_list([{[Val#'ServiceChangeResParm'.serviceChangeAddress],
 
2478
               fun enc_ServiceChangeAddress/2},
 
2479
              {[Val#'ServiceChangeResParm'.serviceChangeVersion],
 
2480
               fun enc_serviceChangeVersion/2},
 
2481
              {[Val#'ServiceChangeResParm'.serviceChangeProfile],
 
2482
               fun enc_ServiceChangeProfile/2},
 
2483
              {[Val#'ServiceChangeResParm'.serviceChangeMgcId],
 
2484
               fun enc_serviceChangeMgcId/2},
 
2485
              {[Val#'ServiceChangeResParm'.timeStamp],
 
2486
               fun enc_TimeNotation/2}],
 
2487
             State).
 
2488
 
 
2489
enc_PackagesDescriptor({'PackagesDescriptor',Val}, State) ->
 
2490
    enc_PackagesDescriptor(Val, State);
 
2491
enc_PackagesDescriptor(Val, State) ->
 
2492
    [
 
2493
     ?PackagesToken,
 
2494
     ?LBRKT_INDENT(State),
 
2495
     enc_list([{Val, fun enc_PackagesItem/2}], ?INC_INDENT(State)),  
 
2496
     ?RBRKT_INDENT(State)    
 
2497
    ].
 
2498
 
 
2499
enc_PackagesItem(Val, State)
 
2500
  when record(Val, 'PackagesItem') ->
 
2501
    PkgdName = ?META_ENC(package, Val#'PackagesItem'.packageName),
 
2502
    [
 
2503
     enc_Name(PkgdName, State),
 
2504
     "-",
 
2505
     enc_UINT16(Val#'PackagesItem'.packageVersion, State)
 
2506
    ].
 
2507
 
 
2508
enc_StatisticsDescriptor({'StatisticsDescriptor',Val}, State) ->
 
2509
    enc_StatisticsDescriptor(Val, State);
 
2510
enc_StatisticsDescriptor(List, State) when list(List) ->
 
2511
    [
 
2512
     ?StatsToken,
 
2513
     ?LBRKT_INDENT(State),
 
2514
     enc_list([{List, fun enc_StatisticsParameter/2}], ?INC_INDENT(State)),
 
2515
     ?RBRKT_INDENT(State)
 
2516
    ].
 
2517
 
 
2518
enc_StatisticsParameter(Val, State)
 
2519
  when record(Val, 'StatisticsParameter') ->
 
2520
    PkgdName = ?META_ENC(statistics, Val#'StatisticsParameter'.statName),
 
2521
    case Val#'StatisticsParameter'.statValue of
 
2522
        asn1_NOVALUE ->
 
2523
            [
 
2524
             enc_PkgdName(PkgdName, State)
 
2525
            ];
 
2526
        [StatVal] when list(StatVal) ->
 
2527
            [
 
2528
             enc_PkgdName(PkgdName, State),
 
2529
             ?EQUAL,
 
2530
             enc_Value(StatVal, State)
 
2531
            ]
 
2532
    end.
 
2533
 
 
2534
enc_TimeNotation(Val, State)
 
2535
  when record(Val, 'TimeNotation') ->
 
2536
    [
 
2537
     enc_STRING(Val#'TimeNotation'.date, State, 8, 8), % "yyyymmdd"
 
2538
     "T",
 
2539
     enc_STRING(Val#'TimeNotation'.time, State, 8, 8)  % "hhmmssss"
 
2540
    ].
 
2541
 
 
2542
%% BUGBUG: Does not verify that string must contain at least one char
 
2543
%% BUGBUG: This violation of the is required in order to comply with
 
2544
%% BUGBUG: the dd/ce ds parameter that may possibly be empty.
 
2545
enc_Value({'Value',Val}, State) ->
 
2546
    enc_Value(Val, State);
 
2547
enc_Value(String, _State) ->
 
2548
    case quoted_string_count(String, 0, true) of
 
2549
        {_, 0} ->
 
2550
            [?DQUOTE, String, ?DQUOTE];
 
2551
        {false, _} ->
 
2552
            [?DQUOTE, String, ?DQUOTE];
 
2553
        {true, _} ->
 
2554
            [String]
 
2555
    end.
 
2556
 
 
2557
quoted_string_count([H | T], Count, IsSafe) ->
 
2558
    case ?classify_char(H) of
 
2559
        safe_char   -> quoted_string_count(T, Count + 1, IsSafe);
 
2560
        rest_char   -> quoted_string_count(T, Count + 1, false);
 
2561
        white_space -> quoted_string_count(T, Count + 1, false);
 
2562
        _           -> error({illegal_char, H})
 
2563
    end;
 
2564
quoted_string_count([], Count, IsSafe) ->
 
2565
    {IsSafe, Count}.
 
2566
 
 
2567
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 
2568
 
 
2569
%% Encode an octet string, escape } by \ if necessary 
 
2570
enc_OCTET_STRING(List, State, Min, Max) ->
 
2571
    do_enc_OCTET_STRING(List, State, Min, Max, 0).
 
2572
    
 
2573
do_enc_OCTET_STRING([H | T], State, Min, Max, Count) ->
 
2574
    case H of
 
2575
        $} ->
 
2576
            [$\\, H | do_enc_OCTET_STRING(T, State, Min, Max, Count + 1)];
 
2577
        _ ->
 
2578
            [H | do_enc_OCTET_STRING(T, State, Min, Max, Count + 1)]
 
2579
    end;
 
2580
do_enc_OCTET_STRING([], _State, Min, Max, Count) ->
 
2581
    verify_count(Count, Min, Max),
 
2582
    [].
 
2583
 
 
2584
enc_QUOTED_STRING(String, _State) when list(String) ->
 
2585
    {_IsSafe, Count} = quoted_string_count(String, 0, true),
 
2586
    verify_count(Count, 1, infinity),
 
2587
    [?DQUOTE, String, ?DQUOTE].
 
2588
 
 
2589
%% The internal format of hex digits is a list of octets
 
2590
%% Min and Max means #hexDigits
 
2591
%% Leading zeros are prepended in order to fulfill Min
 
2592
enc_HEXDIG(Octets, State, Min, Max) when list(Octets) ->
 
2593
    do_enc_HEXDIG(Octets, State, Min, Max, 0, []).
 
2594
 
 
2595
do_enc_HEXDIG([Octet | Rest], State, Min, Max, Count, Acc) 
 
2596
  when Octet >= 0, Octet =< 255  ->
 
2597
    Hex = hex(Octet), % OTP-4921
 
2598
    if
 
2599
        Octet =< 15 ->
 
2600
            Acc2 = [[$0|Hex]|Acc],  % OTP-4921
 
2601
            do_enc_HEXDIG(Rest, State, Min, Max, Count + 2, ["0" | Acc2]);
 
2602
        true -> 
 
2603
            Acc2 = [Hex|Acc], % OTP-4921    
 
2604
            do_enc_HEXDIG(Rest, State, Min, Max, Count + 2, Acc2)
 
2605
    end;
 
2606
do_enc_HEXDIG([], State, Min, Max, Count, Acc)
 
2607
  when integer(Min), Count < Min ->
 
2608
    do_enc_HEXDIG([0], State, Min, Max, Count, Acc);
 
2609
do_enc_HEXDIG([], _State, Min, Max, Count, Acc) -> %% OTP-4710
 
2610
    verify_count(Count, Min, Max),
 
2611
    lists:reverse(Acc).
 
2612
 
 
2613
enc_DIGIT(Val, State, Min, Max) ->
 
2614
    enc_integer(Val, State, Min, Max).
 
2615
 
 
2616
enc_STRING(String, _State, Min, Max) when list(String) ->
 
2617
    verify_count(length(String), Min, Max),
 
2618
    String.
 
2619
 
 
2620
enc_UINT16(Val, State) ->
 
2621
    enc_integer(Val, State, 0, 65535).
 
2622
 
 
2623
enc_UINT32(Val, State) ->
 
2624
    enc_integer(Val, State, 0, 4294967295).
 
2625
 
 
2626
enc_integer(Val, _State, Min, Max) ->
 
2627
    verify_count(Val, Min, Max),
 
2628
    integer_to_list(Val).
 
2629
 
 
2630
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 
2631
%% Encodes a list of elements with separator tokens between
 
2632
%% the elements. Optional asn1_NOVALUE values are ignored.
 
2633
 
 
2634
enc_list(List, State) ->
 
2635
    enc_list(List, State, fun(S) -> ?COMMA_INDENT(S) end, false).
 
2636
 
 
2637
enc_list([{Elems, ElemEncoder} | Tail], State, SepEncoder, NeedsSep) ->
 
2638
    case do_enc_list(Elems, State, ElemEncoder, SepEncoder, NeedsSep) of
 
2639
        [] ->
 
2640
            enc_list(Tail, State, SepEncoder, NeedsSep);
 
2641
        List ->
 
2642
            [List,
 
2643
             enc_list(Tail, State, SepEncoder, true)]
 
2644
    end;
 
2645
enc_list([], _State, _SepEncoder, _NeedsSep) ->
 
2646
    [];
 
2647
enc_list(asn1_NOVALUE, _State, _SepEncoder, _NeedsSep) ->
 
2648
    [];
 
2649
enc_list(A, B, C, D) ->
 
2650
    error({invalid_list, A, B, C, D}).
 
2651
 
 
2652
do_enc_list(asn1_NOVALUE, _State, _ElemEncoder, _SepEncoder, _NeedsSep) ->
 
2653
    [];
 
2654
do_enc_list([], _State, _ElemEncoder, _SepEncoder, _NeedsSep) ->
 
2655
    [];
 
2656
do_enc_list([asn1_NOVALUE | T], State, ElemEncoder, SepEncoder, NeedsSep) ->
 
2657
    do_enc_list(T, State, ElemEncoder, SepEncoder, NeedsSep);
 
2658
do_enc_list([H | T], State, ElemEncoder, SepEncoder, NeedsSep)
 
2659
  when function(ElemEncoder), function(SepEncoder) ->
 
2660
    case ElemEncoder(H, State) of
 
2661
        [] ->
 
2662
            do_enc_list(T, State, ElemEncoder, SepEncoder, NeedsSep);
 
2663
        List when NeedsSep == true ->
 
2664
            [SepEncoder(State),
 
2665
             List, do_enc_list(T, State, ElemEncoder, SepEncoder, true)];
 
2666
        List when NeedsSep == false ->
 
2667
            [List,
 
2668
             do_enc_list(T, State, ElemEncoder, SepEncoder, true)]
 
2669
    end.
 
2670
 
 
2671
%% Add brackets if list is non-empty
 
2672
enc_opt_brackets([], _State) ->
 
2673
    [];
 
2674
enc_opt_brackets(List, State) when list(List) ->
 
2675
    [?LBRKT_INDENT(State), List, ?RBRKT_INDENT(State)].
 
2676
 
 
2677
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 
2678
 
 
2679
%% Int -> list of hex chars
 
2680
hex(Int) ->
 
2681
    hexi(get_lo_bits(Int, 4), []).
 
2682
 
 
2683
hexi({0, Lo}, Ack) ->
 
2684
    [hex4(Lo) | Ack];
 
2685
hexi({Hi, Lo} , Ack) ->
 
2686
    hexi(get_lo_bits(Hi, 4), [hex4(Lo) | Ack]).
 
2687
 
 
2688
hex4(Int) when Int < 10 ->
 
2689
    Int + $0;
 
2690
hex4(Int) ->
 
2691
    ($A - 10) + Int.
 
2692
 
 
2693
get_lo_bits(Int, Size) ->
 
2694
    Lo = Int band ones_mask(Size),
 
2695
    Hi = Int bsr Size,
 
2696
    {Hi, Lo}.
 
2697
 
 
2698
ones_mask(Ones) ->
 
2699
    (1 bsl Ones) - 1.
 
2700
 
 
2701
%% Verify that Count is within the range of Min and Max
 
2702
verify_count(Count, Min, Max) ->
 
2703
    if
 
2704
        integer(Count) ->
 
2705
            if
 
2706
                integer(Min), Count >= Min ->
 
2707
                    if
 
2708
                        integer(Max), Count =< Max ->
 
2709
                            Count;
 
2710
                        Max == infinity ->
 
2711
                            Count;
 
2712
                        true ->
 
2713
                            error({count_too_large, Count, Max})
 
2714
                    end;
 
2715
                true ->
 
2716
                    error({count_too_small, Count, Min})
 
2717
            end;
 
2718
        true ->
 
2719
            error({count_not_an_integer, Count})
 
2720
    end.
 
2721
 
 
2722
%% -------------------------------------------------------------------
 
2723
 
 
2724
error(Reason) ->
 
2725
    erlang:fault(Reason).
 
2726
 
 
2727
 
 
2728
%% -------------------------------------------------------------------
 
2729
 
 
2730
%% d(F) ->
 
2731
%%     d(F,[]).
 
2732
%% d(F, A) ->
 
2733
%%     d(get(dbg), F, A).
 
2734
 
 
2735
%% d(true, F, A) ->
 
2736
%%     io:format("~p:" ++ F ++ "~n", [?MODULE | A]);
 
2737
%% d(_, _, _) ->
 
2738
%%     ok.
 
2739
 
 
2740