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

« back to all changes in this revision

Viewing changes to lib/megaco/src/text/megaco_text_gen_prev3a.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([TID], State) ->
 
1558
    [
 
1559
     ?LBRKT_INDENT(State),
 
1560
     enc_TerminationID(TID, State),
 
1561
     ?RBRKT_INDENT(State)
 
1562
    ];
 
1563
enc_TerminationIDListN(TIDs, State) ->
 
1564
    [
 
1565
     ?LBRKT_INDENT(State),
 
1566
     enc_list([{TIDs, fun enc_TerminationID/2}], State),
 
1567
     ?RBRKT_INDENT(State)
 
1568
    ].
 
1569
 
 
1570
%% TerminationID        = "ROOT" / pathNAME / "$" / "*"
 
1571
%% ; Total length of pathNAME must not exceed 64 chars.
 
1572
%% pathNAME             = ["*"] NAME *("/" / "*"/ ALPHA / DIGIT /"_" / "$" ) 
 
1573
%%                        ["@" pathDomainName ]
 
1574
enc_TerminationID(Tid, State)
 
1575
  when record(Tid,  megaco_term_id) ->
 
1576
    List = [{Tid#megaco_term_id.id, fun enc_tid_component/2 }],
 
1577
    enc_list(List, State, fun(_S) -> ?SLASH end, false).    
 
1578
 
 
1579
enc_tid_component(Component, State) when list(Component) ->
 
1580
    [enc_tid_sub_component(Sub, State) || Sub <- Component];
 
1581
enc_tid_component(Invalid, _State) ->
 
1582
    error({invalid_id_list_component, Invalid}).
 
1583
 
 
1584
enc_tid_sub_component(Sub, _State) ->
 
1585
    case Sub of
 
1586
        all    -> ?megaco_all;
 
1587
        choose -> ?megaco_choose;
 
1588
        Char when integer(Char) -> Char
 
1589
    end.
 
1590
 
 
1591
%% mediaDescriptor      = MediaToken LBRKT mediaParm *(COMMA mediaParm) RBRKT
 
1592
%% ; at-most-once per item
 
1593
%% ; and either streamParm or streamDescriptor but not both
 
1594
%% mediaParm            = (streamParm / streamDescriptor / 
 
1595
%%                         terminationStateDescriptor)
 
1596
%% ; at-most-once
 
1597
%% streamParm           = ( localDescriptor / remoteDescriptor / 
 
1598
%%                         localControlDescriptor )
 
1599
%% streamDescriptor     = StreamToken EQUAL StreamID LBRKT streamParm 
 
1600
%%                        *(COMMA streamParm) RBRKT
 
1601
enc_MediaDescriptor(Val, State)
 
1602
  when record(Val, 'MediaDescriptor') ->
 
1603
    [
 
1604
     ?MediaToken,
 
1605
     ?LBRKT_INDENT(State),
 
1606
     enc_list([{[Val#'MediaDescriptor'.termStateDescr],
 
1607
                fun enc_TerminationStateDescriptor/2} |
 
1608
               decompose_streams(Val#'MediaDescriptor'.streams)],
 
1609
              ?INC_INDENT(State)),
 
1610
     ?RBRKT_INDENT(State)
 
1611
    ].
 
1612
 
 
1613
decompose_streams(asn1_NOVALUE) ->
 
1614
    [];
 
1615
decompose_streams({'MediaDescriptor_streams',Val}) ->
 
1616
    decompose_streams(Val);
 
1617
decompose_streams({Tag, Val}) ->
 
1618
    case Tag of
 
1619
        oneStream ->
 
1620
            decompose_StreamParms(Val);
 
1621
        multiStream ->
 
1622
            [{Val, fun enc_StreamDescriptor/2}];
 
1623
        _ ->
 
1624
            error({invalid_streams_tag, Tag})
 
1625
    end.
 
1626
 
 
1627
decompose_StreamParms(Val)
 
1628
  when record(Val, 'StreamParms') ->
 
1629
    [
 
1630
     {[Val#'StreamParms'.localControlDescriptor],
 
1631
      fun enc_LocalControlDescriptor/2},
 
1632
     {[Val#'StreamParms'.localDescriptor],
 
1633
      fun enc_localDescriptor/2},
 
1634
     {[Val#'StreamParms'.remoteDescriptor],
 
1635
      fun enc_remoteDescriptor/2},
 
1636
     {[Val#'StreamParms'.statisticsDescriptor],
 
1637
      fun enc_StatisticsDescriptor/2}
 
1638
    ].
 
1639
 
 
1640
enc_StreamDescriptor(Val, State) 
 
1641
    when record(Val, 'StreamDescriptor') ->
 
1642
    [
 
1643
     ?StreamToken,
 
1644
     ?EQUAL,
 
1645
     enc_StreamID(Val#'StreamDescriptor'.streamID, State),
 
1646
     ?LBRKT_INDENT(State),
 
1647
     enc_list(decompose_StreamParms(Val#'StreamDescriptor'.streamParms),
 
1648
              ?INC_INDENT(State)),
 
1649
     ?RBRKT_INDENT(State)
 
1650
    ].
 
1651
 
 
1652
%% localControlDescriptor = LocalControlToken LBRKT localParm 
 
1653
%%                          *(COMMA localParm) RBRKT
 
1654
%% 
 
1655
%% ; at-most-once per item
 
1656
%% localParm            = ( streamMode / propertyParm /
 
1657
%%                          reservedValueMode  / reservedGroupMode ) 
 
1658
%% reservedValueMode       = ReservedValueToken EQUAL ( "ON" / "OFF" ) 
 
1659
%% reservedGroupMode       = ReservedGroupToken EQUAL ( "ON" / "OFF" ) 
 
1660
%% 
 
1661
%% reservedMode      = ReservedToken EQUAL ( "ON" / "OFF" )
 
1662
%% 
 
1663
%% streamMode           = ModeToken EQUAL streamModes
 
1664
enc_LocalControlDescriptor(
 
1665
  #'LocalControlDescriptor'{streamMode    = asn1_NOVALUE, 
 
1666
                            reserveValue  = asn1_NOVALUE, 
 
1667
                            reserveGroup  = asn1_NOVALUE, 
 
1668
                            propertyParms = []}, _State) ->
 
1669
    error({invalid_LocalControlDescriptor, empty});
 
1670
enc_LocalControlDescriptor(
 
1671
  #'LocalControlDescriptor'{streamMode    = SM, 
 
1672
                            reserveValue  = RV, 
 
1673
                            reserveGroup  = RG, 
 
1674
                            propertyParms = PPs}, State) ->
 
1675
    [
 
1676
     ?LocalControlToken,
 
1677
     ?LBRKT_INDENT(State),
 
1678
     enc_list([{[SM], fun enc_StreamMode/2},
 
1679
               {[RG], fun enc_reservedGroupMode/2},
 
1680
               {[RV], fun enc_reservedValueMode/2},
 
1681
               {PPs,  fun enc_PropertyParm/2}], ?INC_INDENT(State)),
 
1682
     ?RBRKT_INDENT(State)
 
1683
    ].
 
1684
 
 
1685
enc_reservedGroupMode(Val, _State) ->
 
1686
    [
 
1687
     ?ReservedGroupToken,
 
1688
     ?EQUAL,
 
1689
     case Val of
 
1690
         false -> ?OffToken;
 
1691
         true  -> ?OnToken
 
1692
     end
 
1693
    ].
 
1694
 
 
1695
enc_reservedValueMode(Val, _State) ->
 
1696
    [
 
1697
     ?ReservedValueToken,
 
1698
     ?EQUAL,
 
1699
     case Val of
 
1700
         false -> ?OffToken;
 
1701
         true  -> ?OnToken
 
1702
     end
 
1703
    ].
 
1704
 
 
1705
enc_StreamMode({'StreamMode',Val}, State) ->
 
1706
    enc_StreamMode(Val, State);
 
1707
enc_StreamMode(Val, _State) ->
 
1708
    [
 
1709
     ?ModeToken,
 
1710
     ?EQUAL,
 
1711
     case Val of
 
1712
         sendOnly -> ?SendonlyToken;
 
1713
         recvOnly -> ?RecvonlyToken;
 
1714
         sendRecv -> ?SendrecvToken;
 
1715
         inactive -> ?InactiveToken;
 
1716
         loopBack -> ?LoopbackToken
 
1717
     end
 
1718
    ].
 
1719
 
 
1720
enc_Name({'Name',Val}, State) ->
 
1721
    enc_Name(Val, State);
 
1722
enc_Name(Val, State) ->
 
1723
    %% BUGBUG: NAME = ALPHA *63(ALPHA / DIGIT / "_" )
 
1724
    enc_STRING(Val, State, 1, 64).
 
1725
 
 
1726
enc_PkgdName({'PkgdName', Val}, State) ->
 
1727
    enc_PkgdName(Val, State);
 
1728
enc_PkgdName(Val, State) ->
 
1729
    %% BUGBUG:  pkgdName =  (NAME / "*")  SLASH  (ItemID / "*" )
 
1730
    enc_OCTET_STRING(Val, State, 1, 64).
 
1731
 
 
1732
enc_localDescriptor(Val, State) 
 
1733
  when record(Val, 'LocalRemoteDescriptor') ->
 
1734
    [
 
1735
     ?LocalToken,
 
1736
     ?LBRKT,
 
1737
     enc_LocalRemoteDescriptor(Val, State),
 
1738
     ?RBRKT_INDENT(State)
 
1739
    ].
 
1740
 
 
1741
enc_remoteDescriptor(Val, State) 
 
1742
  when record(Val, 'LocalRemoteDescriptor') ->
 
1743
    [
 
1744
     ?RemoteToken,
 
1745
     ?LBRKT,
 
1746
     enc_LocalRemoteDescriptor(Val, State),
 
1747
     ?RBRKT_INDENT(State)
 
1748
    ].
 
1749
 
 
1750
%% When text encoding the protocol, the descriptors consist of session
 
1751
%% descriptions as defined in SDP (RFC2327), except that the "s=", "t="
 
1752
%% and "o=" lines are optional. When multiple session descriptions are
 
1753
%% provided in one descriptor, the "v=" lines are required as delimiters;
 
1754
%% otherwise they are optional.  Implementations shall accept session
 
1755
%% descriptions that are fully conformant to RFC2327. When binary
 
1756
%% encoding the protocol the descriptor consists of groups of properties
 
1757
%% (tag-value pairs) as specified in Annex C.  Each such group may
 
1758
%% contain the parameters of a session description.
 
1759
enc_LocalRemoteDescriptor(Val, State)
 
1760
  when record(Val, 'LocalRemoteDescriptor') ->
 
1761
    case Val#'LocalRemoteDescriptor'.propGrps of
 
1762
        [] ->
 
1763
            [];
 
1764
        [OptV | MandV] ->
 
1765
            [?LfToken,
 
1766
             enc_PropertyGroup(OptV, opt_v, State) |
 
1767
             [enc_PropertyGroup(M, mand_v, State) || M <- MandV]]
 
1768
    end.
 
1769
 
 
1770
enc_PropertyGroup({'PropertyGroup',Val}, RequiresV, State) ->
 
1771
    enc_PropertyGroup(Val, RequiresV, State);
 
1772
enc_PropertyGroup([H | _T] = List, mand_v, State) 
 
1773
  when record(H, 'PropertyParm'), H#'PropertyParm'.name == "v" ->
 
1774
    enc_PropertyGroup(List, opt_v, State);
 
1775
enc_PropertyGroup(PG, opt_v, State) ->
 
1776
    [
 
1777
     [[enc_PropertyGroupParm(PP, State), ?CrToken, ?LfToken] || PP <- PG]
 
1778
    ].
 
1779
 
 
1780
enc_PropertyGroupParm(Val, State)
 
1781
  when record(Val, 'PropertyParm') ->
 
1782
    [OctetString] = Val#'PropertyParm'.value,
 
1783
    [
 
1784
     enc_PkgdName(Val#'PropertyParm'.name, State),
 
1785
     ?EqualToken,
 
1786
     enc_OCTET_STRING(OctetString, State, 0, infinity)
 
1787
    ].
 
1788
 
 
1789
%% propertyParm         = pkgdName parmValue
 
1790
%% parmValue            = (EQUAL alternativeValue/ INEQUAL VALUE)
 
1791
%% alternativeValue     = ( VALUE / LSBRKT VALUE *(COMMA VALUE) RSBRKT  / 
 
1792
%%                        LSBRKT VALUE DOT DOT VALUE RSBRKT )
 
1793
enc_PropertyParm(Val, State)
 
1794
  when record(Val, 'PropertyParm') ->
 
1795
    PkgdName = ?META_ENC(property, Val#'PropertyParm'.name),
 
1796
    [
 
1797
     enc_PkgdName(PkgdName, State),
 
1798
     enc_propertyParmValues(Val#'PropertyParm'.value,
 
1799
                            Val#'PropertyParm'.extraInfo,
 
1800
                            State)
 
1801
    ].
 
1802
     
 
1803
enc_propertyParmValues([Single], asn1_NOVALUE, State) ->
 
1804
    [
 
1805
     ?EqualToken,
 
1806
     enc_Value(Single, State)
 
1807
    ];
 
1808
enc_propertyParmValues([Single], {relation, Rel}, State) ->
 
1809
    case Rel of
 
1810
        greaterThan -> [$>, enc_Value(Single, State)];
 
1811
        smallerThan -> [$<, enc_Value(Single, State)];
 
1812
        unequalTo   -> [$#, enc_Value(Single, State)]
 
1813
    end;
 
1814
enc_propertyParmValues([Low, High], {range, true}, State)->
 
1815
    %% Exact two values
 
1816
    [
 
1817
     ?EQUAL,
 
1818
     ?LSBRKT,
 
1819
     enc_Value(Low, State),
 
1820
     ?COLON,
 
1821
     enc_Value(High, State),
 
1822
     ?RSBRKT
 
1823
    ];
 
1824
enc_propertyParmValues(Values, {sublist, true}, State)->
 
1825
    %% sublist (i.e. A AND B AND ...)
 
1826
    [
 
1827
     ?EQUAL,
 
1828
     ?LSBRKT_INDENT(State),
 
1829
     enc_list([{Values, fun enc_Value/2}], ?INC_INDENT(State)),
 
1830
     ?RSBRKT_INDENT(State)
 
1831
    ];
 
1832
enc_propertyParmValues(Values, {sublist, false}, State) ->
 
1833
    %% alternatives (i.e. A OR B OR ...)
 
1834
    [
 
1835
     ?EQUAL,
 
1836
     ?LBRKT_INDENT(State),
 
1837
     enc_list([{Values, fun enc_Value/2}], ?INC_INDENT(State)),
 
1838
     ?RBRKT_INDENT(State)
 
1839
    ];
 
1840
enc_propertyParmValues(V, EI, _State) ->
 
1841
    error({invalid_property_parm_values, V, EI}).
 
1842
 
 
1843
enc_TerminationStateDescriptor(Val, State)
 
1844
  when record(Val, 'TerminationStateDescriptor') ->
 
1845
    [
 
1846
     ?TerminationStateToken,
 
1847
     ?LBRKT_INDENT(State),
 
1848
     enc_list([{Val#'TerminationStateDescriptor'.propertyParms,
 
1849
                fun enc_PropertyParm/2},
 
1850
               {[Val#'TerminationStateDescriptor'.eventBufferControl],
 
1851
                fun enc_eventBufferControl/2},
 
1852
               {[Val#'TerminationStateDescriptor'.serviceState],
 
1853
                fun enc_serviceState/2}],
 
1854
              ?INC_INDENT(State)),
 
1855
     ?RBRKT_INDENT(State)
 
1856
    ].
 
1857
 
 
1858
enc_eventBufferControl(Val, _State) ->
 
1859
    [
 
1860
 
 
1861
     ?BufferToken,
 
1862
     ?EQUAL,  
 
1863
     case Val of
 
1864
         off      -> ?OffToken;
 
1865
         lockStep -> ?LockStepToken
 
1866
    end
 
1867
    ].
 
1868
    
 
1869
enc_serviceState({'ServiceState',Val}, State) ->
 
1870
    enc_serviceState(Val, State);
 
1871
enc_serviceState(Val, _State) ->
 
1872
    [
 
1873
     ?ServiceStatesToken,
 
1874
     ?EQUAL,
 
1875
     case Val of
 
1876
         test     -> ?TestToken;
 
1877
         outOfSvc -> ?OutOfSvcToken;
 
1878
         inSvc    -> ?InSvcToken
 
1879
     end
 
1880
    ].
 
1881
 
 
1882
enc_MuxDescriptor(Val, State)
 
1883
  when record(Val, 'MuxDescriptor') ->
 
1884
    [
 
1885
     ?MuxToken,
 
1886
     ?EQUAL,
 
1887
     enc_MuxType(Val#'MuxDescriptor'.muxType, State),
 
1888
     enc_TerminationIDListN(Val#'MuxDescriptor'.termList, State)
 
1889
    ].
 
1890
 
 
1891
enc_MuxType({'MuxType',Val}, State) ->
 
1892
    enc_MuxType(Val, State);
 
1893
enc_MuxType(Val, _State) ->
 
1894
    case Val of
 
1895
        h221  -> ?H221Token;
 
1896
        h223  -> ?H223Token;
 
1897
        h226  -> ?H226Token;
 
1898
        v76   -> ?V76Token;
 
1899
        %% extensionParameter
 
1900
        nx64k -> ?Nx64kToken  % v2
 
1901
    end.
 
1902
 
 
1903
enc_StreamID({'StreamID',Val}, State) ->
 
1904
    enc_StreamID(Val, State);
 
1905
enc_StreamID(Val, State) ->
 
1906
    enc_UINT16(Val, State).
 
1907
 
 
1908
enc_EventsDescriptor(Val, State)
 
1909
  when record(Val, 'EventsDescriptor') ->
 
1910
    #'EventsDescriptor'{requestID = RequestId,
 
1911
                        eventList = Events} = Val,
 
1912
    if
 
1913
        RequestId == asn1_NOVALUE, Events == [] ->
 
1914
            [
 
1915
             ?EventsToken
 
1916
            ];
 
1917
 
 
1918
        RequestId /= asn1_NOVALUE, Events /= [] ->
 
1919
            [
 
1920
             ?EventsToken,
 
1921
             ?EQUAL,
 
1922
             enc_RequestID(RequestId, State),
 
1923
             ?LBRKT_INDENT(State),
 
1924
             enc_list([{Events, fun enc_RequestedEvent/2}],
 
1925
                      ?INC_INDENT(State)),
 
1926
             ?RBRKT_INDENT(State)
 
1927
            ]
 
1928
    end.
 
1929
 
 
1930
enc_RequestedEvent(Val, State)
 
1931
  when record(Val, 'RequestedEvent') ->
 
1932
    PkgdName = ?META_ENC(event, Val#'RequestedEvent'.pkgdName),
 
1933
    [
 
1934
     enc_PkgdName(PkgdName, State),
 
1935
     enc_opt_brackets(
 
1936
       enc_list([{[Val#'RequestedEvent'.streamID],  fun enc_eventStream/2},
 
1937
                 {Val#'RequestedEvent'.evParList, fun enc_eventOther/2} |
 
1938
                 decompose_requestedActions(Val#'RequestedEvent'.eventAction)],
 
1939
                ?INC_INDENT(State)),
 
1940
      State)
 
1941
    ].
 
1942
 
 
1943
decompose_requestedActions(asn1_NOVALUE) ->
 
1944
    [];
 
1945
 
 
1946
%% 
 
1947
%% This in the ABNF: 
 
1948
%% at-most-once each of KeepActiveToken , eventDM and eventStream
 
1949
%% at most one of either embedWithSig or embedNoSig but not both
 
1950
%% KeepActiveToken and embedWithSig must not both be present
 
1951
%% 
 
1952
 
 
1953
%% embedWithSig
 
1954
decompose_requestedActions(#'RequestedActions'{keepActive        = KA,
 
1955
                                               eventDM           = EDM,
 
1956
                                               secondEvent       = SE,
 
1957
                                               signalsDescriptor = SD}) 
 
1958
  when KA /= true,
 
1959
       SD /= asn1_NOVALUE, SD /= [] ->
 
1960
    [
 
1961
     {[EDM],      fun enc_EventDM/2},
 
1962
     {[{SE, SD}], fun enc_embedWithSig/2}
 
1963
    ];
 
1964
 
 
1965
%% embedNoSig
 
1966
decompose_requestedActions(#'RequestedActions'{keepActive        = KA,
 
1967
                                               eventDM           = EDM,
 
1968
                                               secondEvent       = SE,
 
1969
                                               signalsDescriptor = SD}) 
 
1970
  when SD == asn1_NOVALUE; SD == [] ->
 
1971
    [
 
1972
     {[KA],  fun enc_keepActive/2},
 
1973
     {[EDM], fun enc_EventDM/2},
 
1974
     {[SE],  fun enc_embedNoSig/2}
 
1975
    ];
 
1976
 
 
1977
%% Fallback, if everything else failes....
 
1978
decompose_requestedActions(#'RequestedActions'{keepActive        = KA,
 
1979
                                               eventDM           = EDM,
 
1980
                                               secondEvent       = SE,
 
1981
                                               signalsDescriptor = SD}) ->
 
1982
    [
 
1983
     {[KA],       fun enc_keepActive/2},
 
1984
     {[EDM],      fun enc_EventDM/2},
 
1985
     {[{SE, SD}], fun enc_embedWithSig/2}
 
1986
    ].
 
1987
 
 
1988
enc_embedNoSig(#'SecondEventsDescriptor'{requestID = RID,
 
1989
                                         eventList = Evs}, State) ->
 
1990
    [
 
1991
     ?EmbedToken,
 
1992
     ?LBRKT_INDENT(State),
 
1993
     enc_embedFirst(RID, Evs, ?INC_INDENT(State)), 
 
1994
     ?RBRKT_INDENT(State)
 
1995
    ].
 
1996
 
 
1997
enc_embedWithSig({asn1_NOVALUE, SD}, State) ->
 
1998
    [
 
1999
     ?EmbedToken,
 
2000
     ?LBRKT_INDENT(State),
 
2001
     enc_SignalsDescriptor(SD, ?INC_INDENT(State)),
 
2002
     ?RBRKT_INDENT(State)
 
2003
    ];
 
2004
enc_embedWithSig({#'SecondEventsDescriptor'{requestID = RID,
 
2005
                                            eventList = Evs}, SD}, State) ->
 
2006
    [
 
2007
     ?EmbedToken,
 
2008
     ?LBRKT_INDENT(State),
 
2009
     enc_SignalsDescriptor(SD, ?INC_INDENT(State)),
 
2010
     ?COMMA_INDENT(?INC_INDENT(State)), 
 
2011
     enc_embedFirst(RID, Evs, ?INC_INDENT(State)), 
 
2012
     ?RBRKT_INDENT(State)
 
2013
    ].
 
2014
 
 
2015
enc_keepActive(Val, _State) ->
 
2016
    case Val of
 
2017
        true -> [?KeepActiveToken];
 
2018
        false -> []
 
2019
    end.
 
2020
    
 
2021
enc_EventDM({'EventDM',Val}, State) ->
 
2022
    enc_EventDM(Val, State);
 
2023
enc_EventDM({Tag, Val}, State) ->
 
2024
    case Tag of
 
2025
        digitMapName ->
 
2026
            [
 
2027
             ?DigitMapToken,
 
2028
             ?EQUAL,
 
2029
             enc_DigitMapName(Val, State)
 
2030
            ];
 
2031
        digitMapValue ->
 
2032
            [
 
2033
             ?DigitMapToken,
 
2034
             ?LBRKT_INDENT(State),
 
2035
             enc_DigitMapValue(Val, ?INC_INDENT(State)),
 
2036
             ?RBRKT_INDENT(State)
 
2037
            ];
 
2038
        _ ->
 
2039
            error({invalid_EventDM_tag, Tag})
 
2040
    end.
 
2041
 
 
2042
 
 
2043
enc_embedFirst(RID, Evs, State)
 
2044
  when RID /= asn1_NOVALUE, list(Evs), Evs /= [] ->
 
2045
    %%     d("enc_embedFirst -> entry with"
 
2046
    %%       "~n   RID: ~p"
 
2047
    %%       "~n   Evs: ~p", [RID, Evs]),
 
2048
    [
 
2049
     ?EventsToken,
 
2050
     ?EQUAL,
 
2051
     enc_RequestID(RID, State),
 
2052
     ?LBRKT_INDENT(State),
 
2053
     enc_list([{Evs, fun enc_SecondRequestedEvent/2}], ?INC_INDENT(State)),
 
2054
     ?RBRKT_INDENT(State)
 
2055
    ];
 
2056
enc_embedFirst(_RID, _Evs, _State) ->
 
2057
    %%     d("enc_embedFirst -> entry"),
 
2058
    [
 
2059
     ?EventsToken
 
2060
    ].
 
2061
 
 
2062
 
 
2063
enc_SecondRequestedEvent(#'SecondRequestedEvent'{pkgdName    = N,
 
2064
                                                 streamID    = SID,
 
2065
                                                 evParList   = EPL,
 
2066
                                                 eventAction = EA}, State) ->
 
2067
    PkgdName = ?META_ENC(event, N),
 
2068
    [
 
2069
     enc_PkgdName(PkgdName, State),
 
2070
     enc_opt_brackets(
 
2071
       enc_list(
 
2072
         [{[SID], fun enc_eventStream/2},
 
2073
          {EPL, fun enc_eventOther/2} |
 
2074
          decompose_secondRequestedActions(EA)],
 
2075
         ?INC_INDENT(State)),
 
2076
       State)
 
2077
    ].
 
2078
 
 
2079
decompose_secondRequestedActions(asn1_NOVALUE) ->
 
2080
    [];
 
2081
decompose_secondRequestedActions(Val)
 
2082
  when record(Val, 'SecondRequestedActions') ->
 
2083
    [
 
2084
     {[Val#'SecondRequestedActions'.keepActive],
 
2085
      fun enc_keepActive/2},
 
2086
     {[Val#'SecondRequestedActions'.eventDM],
 
2087
      fun enc_EventDM/2},
 
2088
     {[Val#'SecondRequestedActions'.signalsDescriptor],
 
2089
      fun enc_embeddedSignalsDescriptor/2}
 
2090
    ].
 
2091
 
 
2092
enc_embeddedSignalsDescriptor(Val, State) ->
 
2093
    [
 
2094
     ?EmbedToken,
 
2095
     ?LBRKT_INDENT(State),
 
2096
     enc_SignalsDescriptor(Val, ?INC_INDENT(State)),
 
2097
     ?RBRKT_INDENT(State)
 
2098
    ].
 
2099
    
 
2100
enc_EventBufferDescriptor({'EventBufferDescriptor',Val}, State) ->
 
2101
    enc_EventBufferDescriptor(Val, State);
 
2102
enc_EventBufferDescriptor([Mand | Opt], State) ->
 
2103
    [
 
2104
     ?EventBufferToken,
 
2105
     ?LBRKT_INDENT(State),
 
2106
     enc_eventSpecs([Mand | Opt], ?INC_INDENT(State)),
 
2107
     ?RBRKT_INDENT(State)   
 
2108
    ].
 
2109
 
 
2110
enc_eventSpecs([Mand | Opt], State) ->
 
2111
    [enc_eventSpecs(Mand, State),
 
2112
     [[?COMMA_INDENT(State), enc_eventSpec(Val, State)] || Val <- Opt]].
 
2113
 
 
2114
enc_eventSpec(Val, State)
 
2115
  when record(Val, 'EventSpec') ->
 
2116
    [
 
2117
     enc_EventName(Val#'EventSpec'.eventName, State),
 
2118
     enc_opt_brackets(
 
2119
       enc_list([{[Val#'EventSpec'.streamID],   fun enc_eventStream/2},
 
2120
                 {Val#'EventSpec'.eventParList, fun enc_eventOther/2}],
 
2121
                ?INC_INDENT(State)),
 
2122
       State)
 
2123
    ].
 
2124
 
 
2125
enc_SignalsDescriptor({'SignalsDescriptor',Val}, State) ->
 
2126
    enc_SignalsDescriptor(Val, State);
 
2127
enc_SignalsDescriptor([], _State) ->
 
2128
    [
 
2129
     ?SignalsToken
 
2130
    ];
 
2131
enc_SignalsDescriptor(List, State) when list(List) ->
 
2132
    [
 
2133
     ?SignalsToken,
 
2134
     ?LBRKT_INDENT(State),
 
2135
     enc_list([{List, fun enc_SignalRequest/2}], ?INC_INDENT(State)),
 
2136
     ?RBRKT_INDENT(State)
 
2137
    ].
 
2138
 
 
2139
enc_SignalRequest({'SignalRequest',Val}, State) ->
 
2140
    enc_SignalRequest(Val, State);
 
2141
enc_SignalRequest({Tag, Val}, State) ->
 
2142
    case Tag of
 
2143
        signal ->
 
2144
            enc_Signal(Val, State);
 
2145
        seqSigList ->
 
2146
            enc_SeqSigList(Val, State);
 
2147
        _ ->
 
2148
            error({invalid_SignalRequest_tag, Tag})
 
2149
    end.
 
2150
 
 
2151
 
 
2152
enc_SeqSigList(Val, State)
 
2153
  when record(Val, 'SeqSigList') ->
 
2154
    [
 
2155
     ?SignalListToken,
 
2156
     ?EQUAL,
 
2157
     enc_UINT16(Val#'SeqSigList'.id, State),
 
2158
     ?LBRKT_INDENT(State),
 
2159
     enc_list([{Val#'SeqSigList'.signalList, fun enc_Signal/2}],
 
2160
              ?INC_INDENT(State)),
 
2161
     ?RBRKT_INDENT(State)
 
2162
    ].
 
2163
 
 
2164
enc_Signal(Val, State)
 
2165
  when record(Val, 'Signal') ->
 
2166
    [
 
2167
     enc_SignalName(Val#'Signal'.signalName, State),
 
2168
     enc_opt_brackets(
 
2169
       enc_list([{[Val#'Signal'.streamID],         fun enc_sigStream/2},
 
2170
                 {[Val#'Signal'.sigType],          fun enc_sigSignalType/2},
 
2171
                 {[Val#'Signal'.duration],         fun enc_sigDuration/2},
 
2172
                 {[Val#'Signal'.notifyCompletion], fun enc_notifyCompletion/2},
 
2173
                 {[Val#'Signal'.keepActive],       fun enc_keepActive/2},
 
2174
                 {Val#'Signal'.sigParList,         fun enc_sigOther/2},
 
2175
                 {[Val#'Signal'.direction],        fun enc_SignalDirection/2},
 
2176
                 {[Val#'Signal'.requestID],        fun enc_sigRequestID/2}],
 
2177
                ?INC_INDENT(State)),
 
2178
      State)
 
2179
    ].
 
2180
 
 
2181
enc_sigStream(Val, State) ->
 
2182
    [
 
2183
     ?StreamToken,
 
2184
     ?EQUAL, 
 
2185
     enc_StreamID(Val, State)
 
2186
    ].
 
2187
 
 
2188
enc_sigSignalType(Val, State) ->
 
2189
    [
 
2190
     ?SignalTypeToken,
 
2191
     ?EQUAL,
 
2192
     enc_SignalType(Val, State)
 
2193
    ].
 
2194
 
 
2195
enc_sigDuration(Val, State) ->
 
2196
    [
 
2197
     ?DurationToken,
 
2198
     ?EQUAL,
 
2199
     enc_UINT16(Val, State)
 
2200
    ].
 
2201
 
 
2202
enc_notifyCompletion(List, State) when list(List) ->
 
2203
    [
 
2204
     ?NotifyCompletionToken,
 
2205
     ?EQUAL,
 
2206
     ?LBRKT_INDENT(State),
 
2207
     enc_list([{List, fun enc_notifyCompletionItem/2}], ?INC_INDENT(State)),
 
2208
     ?RBRKT_INDENT(State)
 
2209
    ].
 
2210
 
 
2211
enc_notifyCompletionItem(Val, _State) ->
 
2212
    case Val of
 
2213
        onTimeOut                   -> ?TimeOutToken;
 
2214
        onInterruptByEvent          -> ?InterruptByEventToken;
 
2215
        onInterruptByNewSignalDescr -> ?InterruptByNewSignalsDescrToken;
 
2216
        otherReason                 -> ?OtherReasonToken
 
2217
    end.
 
2218
 
 
2219
enc_SignalType({'SignalType',Val}, State) ->
 
2220
    enc_SignalType(Val, State);
 
2221
enc_SignalType(Val, _State) ->
 
2222
    case Val of
 
2223
        brief ->   ?BriefToken;
 
2224
        onOff ->   ?OnOffToken;
 
2225
        timeOut -> ?TimeOutToken
 
2226
    end.
 
2227
 
 
2228
enc_SignalName({'SignalName',Val}, State)->
 
2229
    enc_SignalName(Val, State);
 
2230
enc_SignalName(Val, State) ->
 
2231
    PkgdName = ?META_ENC(signal, Val),
 
2232
    enc_PkgdName(PkgdName, State).
 
2233
 
 
2234
enc_sigOther(Val, State)
 
2235
  when record(Val, 'SigParameter') ->
 
2236
    [
 
2237
     enc_Name(Val#'SigParameter'.sigParameterName, State),
 
2238
     enc_propertyParmValues(Val#'SigParameter'.value,
 
2239
                            Val#'SigParameter'.extraInfo,
 
2240
                            State)
 
2241
    ].
 
2242
 
 
2243
enc_SignalDirection({'SignalDirection', Val}, State) ->
 
2244
    enc_SignalDirection(Val, State);
 
2245
enc_SignalDirection(Val, _State) ->
 
2246
    [
 
2247
     ?DirectionToken,
 
2248
     ?EQUAL,
 
2249
     case Val of
 
2250
         internal -> ?InternalToken;
 
2251
         external -> ?ExternalToken;
 
2252
         both     -> ?BothToken
 
2253
     end
 
2254
    ].
 
2255
 
 
2256
enc_sigRequestID(Val, State) ->
 
2257
    [
 
2258
     ?RequestIDToken,
 
2259
     ?EQUAL,
 
2260
     enc_RequestID(Val, State)
 
2261
    ].
 
2262
 
 
2263
enc_RequestID({'RequestID',Val}, State) ->
 
2264
    enc_RequestID(Val, State);
 
2265
enc_RequestID(Val, _State) when Val == ?megaco_all_request_id ->
 
2266
    "*";
 
2267
enc_RequestID(Val, State) ->
 
2268
    enc_UINT32(Val, State).
 
2269
 
 
2270
enc_ModemDescriptor(MD, _State) ->
 
2271
    error({deprecated, MD}).
 
2272
 
 
2273
%% Corr1:
 
2274
%% As of corr 1 ModemDescriptor has been deprecated.
 
2275
%% 7.1.2: ...shall not be included as part of a transmitted content and,
 
2276
%%        if received, shall either be ignored or processed at the option
 
2277
%%        of the implementation. ...
 
2278
%% enc_ModemDescriptor(#'ModemDescriptor'{mtl = [Val],
 
2279
%%                                     mpl = [],
 
2280
%%                                     nonStandardData = asn1_NOVALUE},
 
2281
%%                  State) ->
 
2282
%%     [
 
2283
%%      ?ModemToken,
 
2284
%%      ?EQUAL,
 
2285
%%      enc_ModemType(Val, State)
 
2286
%%     ];
 
2287
%% enc_ModemDescriptor(Val, State)
 
2288
%%   when record(Val, 'ModemDescriptor') ->
 
2289
%%     [
 
2290
%%      ?ModemToken,
 
2291
%%      ?LSBRKT,
 
2292
%%      enc_list([{Val#'ModemDescriptor'.mtl, fun enc_ModemType/2}], State),
 
2293
%%      ?RSBRKT,
 
2294
%%      enc_opt_brackets(
 
2295
%%        enc_list([{Val#'ModemDescriptor'.mpl, fun enc_PropertyParm/2}],
 
2296
%%              ?INC_INDENT(State)),
 
2297
%%        State)
 
2298
%%      %% BUGBUG: Is PropertyParm == NAME parmValue?
 
2299
%%     ].
 
2300
 
 
2301
%% enc_ModemDescriptor(Val, State)
 
2302
%%   when record(Val, 'ModemDescriptor') ->
 
2303
%%     [
 
2304
%%      ?ModemToken,
 
2305
%%      %% BUGBUG: Does never generate: EQUAL modemType
 
2306
%%      ?LSBRKT,
 
2307
%%      enc_list([{Val#'ModemDescriptor'.mtl, fun enc_ModemType/2}], State),
 
2308
%%      ?RSBRKT,
 
2309
%%      enc_opt_brackets(
 
2310
%%        enc_list([{Val#'ModemDescriptor'.mpl, fun enc_PropertyParm/2}],
 
2311
%%              ?INC_INDENT(State)),
 
2312
%%        State)
 
2313
%%      %% BUGBUG: Is PropertyParm == NAME parmValue?
 
2314
%%     ].
 
2315
 
 
2316
%% Corr1: See ModemDescriptor above
 
2317
%% enc_ModemType({'ModemType',Val}, State)->
 
2318
%%     enc_ModemType(Val, State);
 
2319
%% enc_ModemType(Val, _State) ->
 
2320
%%     %% BUGBUG: Does not handle extensionParameter
 
2321
%%     case Val of
 
2322
%%         v18            -> ?V18Token;
 
2323
%%         v22            -> ?V22Token;
 
2324
%%         v22bis         -> ?V22bisToken;
 
2325
%%         v32            -> ?V32Token;
 
2326
%%         v32bis         -> ?V32bisToken;
 
2327
%%         v34            -> ?V34Token;
 
2328
%%         v90            -> ?V90Token;
 
2329
%%         v91            -> ?V91Token;
 
2330
%%         synchISDN -> ?SynchISDNToken
 
2331
%%     end.
 
2332
 
 
2333
enc_DigitMapDescriptor(Val, State)
 
2334
  when record(Val, 'DigitMapDescriptor') ->
 
2335
    [
 
2336
     ?DigitMapToken,
 
2337
     ?EQUAL,
 
2338
     enc_DigitMapName(Val#'DigitMapDescriptor'.digitMapName, State),
 
2339
     ?LBRKT_INDENT(State),
 
2340
     enc_DigitMapValue(Val#'DigitMapDescriptor'.digitMapValue,
 
2341
                       ?INC_INDENT(State)),
 
2342
     ?RBRKT_INDENT(State)
 
2343
    ].
 
2344
 
 
2345
enc_DigitMapName({'DigitMapName',Val}, State) ->
 
2346
    enc_DigitMapName(Val, State);
 
2347
enc_DigitMapName(Val, State) ->
 
2348
    enc_Name(Val, State).
 
2349
 
 
2350
enc_DigitMapValue(Val, State)
 
2351
  when record(Val, 'DigitMapValue') ->
 
2352
    [
 
2353
     enc_timer(Val#'DigitMapValue'.startTimer,     $T, State),
 
2354
     enc_timer(Val#'DigitMapValue'.shortTimer,     $S, State),
 
2355
     enc_timer(Val#'DigitMapValue'.longTimer,      $L, State),
 
2356
     enc_timer(Val#'DigitMapValue'.durationTimer,  $Z, State),
 
2357
     %% BUGBUG: digitMapBody not handled at all
 
2358
     enc_STRING(Val#'DigitMapValue'.digitMapBody, State, 0, infinity)
 
2359
    ].
 
2360
 
 
2361
enc_timer(asn1_NOVALUE, _Prefix, _State) ->
 
2362
    [];
 
2363
enc_timer(Timer, Prefix, State) ->
 
2364
    [
 
2365
     Prefix,
 
2366
     ?COLON,
 
2367
     enc_DIGIT(Timer, State, 0, 99),
 
2368
     ?COMMA_INDENT(State)
 
2369
    ].
 
2370
 
 
2371
enc_ServiceChangeParm(Val, State)
 
2372
  when record(Val, 'ServiceChangeParm') ->
 
2373
    [
 
2374
     ?ServicesToken,
 
2375
     ?LBRKT_INDENT(State),
 
2376
     enc_list([{[Val#'ServiceChangeParm'.serviceChangeMethod],
 
2377
                fun enc_ServiceChangeMethod/2},
 
2378
               {[Val#'ServiceChangeParm'.serviceChangeAddress],
 
2379
                fun enc_ServiceChangeAddress/2},
 
2380
               {[Val#'ServiceChangeParm'.serviceChangeVersion],
 
2381
                fun enc_serviceChangeVersion/2},
 
2382
               {[Val#'ServiceChangeParm'.serviceChangeProfile],
 
2383
                fun enc_ServiceChangeProfile/2},
 
2384
               {[{reason, Val#'ServiceChangeParm'.serviceChangeReason}],
 
2385
                fun enc_serviceChangeReason/2},
 
2386
               {[Val#'ServiceChangeParm'.serviceChangeDelay],
 
2387
                fun enc_serviceChangeDelay/2},
 
2388
               {[Val#'ServiceChangeParm'.serviceChangeMgcId],
 
2389
                fun enc_serviceChangeMgcId/2},
 
2390
               {[Val#'ServiceChangeParm'.timeStamp],
 
2391
                fun enc_TimeNotation/2},
 
2392
               {Val#'ServiceChangeParm'.serviceChangeInfo,
 
2393
                fun enc_AuditDescriptor/2},
 
2394
               {[Val#'ServiceChangeParm'.serviceChangeIncompleteFlag],
 
2395
                fun('NULL', _) -> ?ServiceChangeIncompleteToken end}],
 
2396
              ?INC_INDENT(State)),
 
2397
     ?RBRKT_INDENT(State)
 
2398
    ].
 
2399
 
 
2400
 
 
2401
enc_ServiceChangeMethod({'ServiceChangeMethod',Val}, State) ->
 
2402
    enc_ServiceChangeMethod(Val, State);
 
2403
enc_ServiceChangeMethod(Val, _State) ->
 
2404
    [
 
2405
     ?MethodToken,
 
2406
     ?EQUAL,
 
2407
     case Val of
 
2408
        failover      -> ?FailoverToken;
 
2409
        forced        -> ?ForcedToken;
 
2410
        graceful      -> ?GracefulToken;
 
2411
        restart       -> ?RestartToken;
 
2412
        disconnected  -> ?DisconnectedToken;
 
2413
        handOff       -> ?HandOffToken
 
2414
     end
 
2415
     %% BUGBUG: extension
 
2416
    ].
 
2417
 
 
2418
enc_ServiceChangeAddress({'ServiceChangeAddress',Val}, State) ->
 
2419
    enc_ServiceChangeAddress(Val, State);
 
2420
enc_ServiceChangeAddress({Tag, Val}, State) ->
 
2421
    [
 
2422
     ?ServiceChangeAddressToken,
 
2423
     ?EQUAL,
 
2424
     case Tag of
 
2425
         portNumber ->
 
2426
             enc_portNumber(Val, State);
 
2427
         ip4Address ->
 
2428
             enc_IP4Address(Val, State);
 
2429
         ip6Address ->
 
2430
             enc_IP6Address(Val, State);
 
2431
         domainName ->
 
2432
             enc_DomainName(Val, State);
 
2433
         deviceName ->
 
2434
             enc_PathName(Val, State);
 
2435
         mtpAddress ->
 
2436
             enc_mtpAddress(Val, State);
 
2437
         _ ->
 
2438
             error({invalid_ServiceChangeAddress_tag, Tag})
 
2439
     end
 
2440
    ].
 
2441
 
 
2442
enc_serviceChangeVersion(Val, State) ->
 
2443
    [
 
2444
     ?VersionToken,
 
2445
     ?EQUAL,
 
2446
     enc_version(Val, State)
 
2447
    ].
 
2448
 
 
2449
enc_ServiceChangeProfile(#'ServiceChangeProfile'{profileName = Name,
 
2450
                                                 version     = Version}, 
 
2451
                         State) ->
 
2452
    [
 
2453
     ?ProfileToken,
 
2454
     ?EQUAL,
 
2455
     enc_Name(Name, State),
 
2456
     ?SLASH,
 
2457
     enc_version(Version, State)
 
2458
    ].
 
2459
 
 
2460
enc_serviceChangeReason({reason, Val}, State) ->
 
2461
    case Val of
 
2462
        asn1_NOVALUE ->
 
2463
            [];
 
2464
        [List] when list(List) ->
 
2465
            [
 
2466
             ?ReasonToken,
 
2467
             ?EQUAL,
 
2468
             enc_QUOTED_STRING(List,State) % OTP-4632 enc_Value(List, State)
 
2469
            ]
 
2470
    end.
 
2471
 
 
2472
enc_serviceChangeDelay(Val, State) ->
 
2473
    [
 
2474
     ?DelayToken,
 
2475
     ?EQUAL,
 
2476
     enc_UINT32(Val, State)
 
2477
    ].
 
2478
 
 
2479
enc_serviceChangeMgcId(Val, State) ->
 
2480
    [
 
2481
     ?MgcIdToken,
 
2482
     ?EQUAL,
 
2483
     enc_MId(Val, State)
 
2484
    ].
 
2485
 
 
2486
enc_portNumber(Val, State) when integer(Val), Val >= 0 ->
 
2487
    enc_UINT16(Val, State).
 
2488
     
 
2489
enc_ServiceChangeResParm(Val, State)
 
2490
  when record(Val, 'ServiceChangeResParm') ->
 
2491
    enc_list([{[Val#'ServiceChangeResParm'.serviceChangeAddress],
 
2492
               fun enc_ServiceChangeAddress/2},
 
2493
              {[Val#'ServiceChangeResParm'.serviceChangeVersion],
 
2494
               fun enc_serviceChangeVersion/2},
 
2495
              {[Val#'ServiceChangeResParm'.serviceChangeProfile],
 
2496
               fun enc_ServiceChangeProfile/2},
 
2497
              {[Val#'ServiceChangeResParm'.serviceChangeMgcId],
 
2498
               fun enc_serviceChangeMgcId/2},
 
2499
              {[Val#'ServiceChangeResParm'.timeStamp],
 
2500
               fun enc_TimeNotation/2}],
 
2501
             State).
 
2502
 
 
2503
enc_PackagesDescriptor({'PackagesDescriptor',Val}, State) ->
 
2504
    enc_PackagesDescriptor(Val, State);
 
2505
enc_PackagesDescriptor(Val, State) ->
 
2506
    [
 
2507
     ?PackagesToken,
 
2508
     ?LBRKT_INDENT(State),
 
2509
     enc_list([{Val, fun enc_PackagesItem/2}], ?INC_INDENT(State)),  
 
2510
     ?RBRKT_INDENT(State)    
 
2511
    ].
 
2512
 
 
2513
enc_PackagesItem(Val, State)
 
2514
  when record(Val, 'PackagesItem') ->
 
2515
    PkgdName = ?META_ENC(package, Val#'PackagesItem'.packageName),
 
2516
    [
 
2517
     enc_Name(PkgdName, State),
 
2518
     "-",
 
2519
     enc_UINT16(Val#'PackagesItem'.packageVersion, State)
 
2520
    ].
 
2521
 
 
2522
enc_StatisticsDescriptor({'StatisticsDescriptor',Val}, State) ->
 
2523
    enc_StatisticsDescriptor(Val, State);
 
2524
enc_StatisticsDescriptor(List, State) when list(List) ->
 
2525
    [
 
2526
     ?StatsToken,
 
2527
     ?LBRKT_INDENT(State),
 
2528
     enc_list([{List, fun enc_StatisticsParameter/2}], ?INC_INDENT(State)),
 
2529
     ?RBRKT_INDENT(State)
 
2530
    ].
 
2531
 
 
2532
enc_StatisticsParameter(Val, State)
 
2533
  when record(Val, 'StatisticsParameter') ->
 
2534
    PkgdName = ?META_ENC(statistics, Val#'StatisticsParameter'.statName),
 
2535
    case Val#'StatisticsParameter'.statValue of
 
2536
        asn1_NOVALUE ->
 
2537
            [
 
2538
             enc_PkgdName(PkgdName, State)
 
2539
            ];
 
2540
        [StatVal] when list(StatVal) ->
 
2541
            [
 
2542
             enc_PkgdName(PkgdName, State),
 
2543
             ?EQUAL,
 
2544
             enc_Value(StatVal, State)
 
2545
            ]
 
2546
    end.
 
2547
 
 
2548
enc_TimeNotation(Val, State)
 
2549
  when record(Val, 'TimeNotation') ->
 
2550
    [
 
2551
     enc_STRING(Val#'TimeNotation'.date, State, 8, 8), % "yyyymmdd"
 
2552
     "T",
 
2553
     enc_STRING(Val#'TimeNotation'.time, State, 8, 8)  % "hhmmssss"
 
2554
    ].
 
2555
 
 
2556
%% BUGBUG: Does not verify that string must contain at least one char
 
2557
%% BUGBUG: This violation of the is required in order to comply with
 
2558
%% BUGBUG: the dd/ce ds parameter that may possibly be empty.
 
2559
enc_Value({'Value',Val}, State) ->
 
2560
    enc_Value(Val, State);
 
2561
enc_Value(String, _State) ->
 
2562
    case quoted_string_count(String, 0, true) of
 
2563
        {_, 0} ->
 
2564
            [?DQUOTE, String, ?DQUOTE];
 
2565
        {false, _} ->
 
2566
            [?DQUOTE, String, ?DQUOTE];
 
2567
        {true, _} ->
 
2568
            [String]
 
2569
    end.
 
2570
 
 
2571
quoted_string_count([H | T], Count, IsSafe) ->
 
2572
    case ?classify_char(H) of
 
2573
        safe_char   -> quoted_string_count(T, Count + 1, IsSafe);
 
2574
        rest_char   -> quoted_string_count(T, Count + 1, false);
 
2575
        white_space -> quoted_string_count(T, Count + 1, false);
 
2576
        _           -> error({illegal_char, H})
 
2577
    end;
 
2578
quoted_string_count([], Count, IsSafe) ->
 
2579
    {IsSafe, Count}.
 
2580
 
 
2581
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 
2582
 
 
2583
%% Encode an octet string, escape } by \ if necessary 
 
2584
enc_OCTET_STRING(List, State, Min, Max) ->
 
2585
    do_enc_OCTET_STRING(List, State, Min, Max, 0).
 
2586
    
 
2587
do_enc_OCTET_STRING([H | T], State, Min, Max, Count) ->
 
2588
    case H of
 
2589
        $} ->
 
2590
            [$\\, H | do_enc_OCTET_STRING(T, State, Min, Max, Count + 1)];
 
2591
        _ ->
 
2592
            [H | do_enc_OCTET_STRING(T, State, Min, Max, Count + 1)]
 
2593
    end;
 
2594
do_enc_OCTET_STRING([], _State, Min, Max, Count) ->
 
2595
    verify_count(Count, Min, Max),
 
2596
    [].
 
2597
 
 
2598
enc_QUOTED_STRING(String, _State) when list(String) ->
 
2599
    {_IsSafe, Count} = quoted_string_count(String, 0, true),
 
2600
    verify_count(Count, 1, infinity),
 
2601
    [?DQUOTE, String, ?DQUOTE].
 
2602
 
 
2603
%% The internal format of hex digits is a list of octets
 
2604
%% Min and Max means #hexDigits
 
2605
%% Leading zeros are prepended in order to fulfill Min
 
2606
enc_HEXDIG(Octets, State, Min, Max) when list(Octets) ->
 
2607
    do_enc_HEXDIG(Octets, State, Min, Max, 0, []).
 
2608
 
 
2609
do_enc_HEXDIG([Octet | Rest], State, Min, Max, Count, Acc) 
 
2610
  when Octet >= 0, Octet =< 255  ->
 
2611
    Hex = hex(Octet), % OTP-4921
 
2612
    if
 
2613
        Octet =< 15 ->
 
2614
            Acc2 = [[$0|Hex]|Acc],  % OTP-4921
 
2615
            do_enc_HEXDIG(Rest, State, Min, Max, Count + 2, ["0" | Acc2]);
 
2616
        true -> 
 
2617
            Acc2 = [Hex|Acc], % OTP-4921    
 
2618
            do_enc_HEXDIG(Rest, State, Min, Max, Count + 2, Acc2)
 
2619
    end;
 
2620
do_enc_HEXDIG([], State, Min, Max, Count, Acc)
 
2621
  when integer(Min), Count < Min ->
 
2622
    do_enc_HEXDIG([0], State, Min, Max, Count, Acc);
 
2623
do_enc_HEXDIG([], _State, Min, Max, Count, Acc) -> %% OTP-4710
 
2624
    verify_count(Count, Min, Max),
 
2625
    lists:reverse(Acc).
 
2626
 
 
2627
enc_DIGIT(Val, State, Min, Max) ->
 
2628
    enc_integer(Val, State, Min, Max).
 
2629
 
 
2630
enc_STRING(String, _State, Min, Max) when list(String) ->
 
2631
    verify_count(length(String), Min, Max),
 
2632
    String.
 
2633
 
 
2634
enc_UINT16(Val, State) ->
 
2635
    enc_integer(Val, State, 0, 65535).
 
2636
 
 
2637
enc_UINT32(Val, State) ->
 
2638
    enc_integer(Val, State, 0, 4294967295).
 
2639
 
 
2640
enc_integer(Val, _State, Min, Max) ->
 
2641
    verify_count(Val, Min, Max),
 
2642
    integer_to_list(Val).
 
2643
 
 
2644
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 
2645
%% Encodes a list of elements with separator tokens between
 
2646
%% the elements. Optional asn1_NOVALUE values are ignored.
 
2647
 
 
2648
enc_list(List, State) ->
 
2649
    enc_list(List, State, fun(_S) -> ?COMMA_INDENT(_S) end, false).
 
2650
 
 
2651
enc_list([{Elems, ElemEncoder} | Tail], State, SepEncoder, NeedsSep) ->
 
2652
    case do_enc_list(Elems, State, ElemEncoder, SepEncoder, NeedsSep) of
 
2653
        [] ->
 
2654
            enc_list(Tail, State, SepEncoder, NeedsSep);
 
2655
        List ->
 
2656
            [List,
 
2657
             enc_list(Tail, State, SepEncoder, true)]
 
2658
    end;
 
2659
enc_list([], _State, _SepEncoder, _NeedsSep) ->
 
2660
    [];
 
2661
enc_list(asn1_NOVALUE, _State, _SepEncoder, _NeedsSep) ->
 
2662
    [];
 
2663
enc_list(A, B, C, D) ->
 
2664
    error({invalid_list, A, B, C, D}).
 
2665
 
 
2666
do_enc_list(asn1_NOVALUE, _State, _ElemEncoder, _SepEncoder, _NeedsSep) ->
 
2667
    [];
 
2668
do_enc_list([], _State, _ElemEncoder, _SepEncoder, _NeedsSep) ->
 
2669
    [];
 
2670
do_enc_list([asn1_NOVALUE | T], State, ElemEncoder, SepEncoder, NeedsSep) ->
 
2671
    do_enc_list(T, State, ElemEncoder, SepEncoder, NeedsSep);
 
2672
do_enc_list([H | T], State, ElemEncoder, SepEncoder, NeedsSep)
 
2673
  when function(ElemEncoder), function(SepEncoder) ->
 
2674
    case ElemEncoder(H, State) of
 
2675
        [] ->
 
2676
            do_enc_list(T, State, ElemEncoder, SepEncoder, NeedsSep);
 
2677
        List when NeedsSep == true ->
 
2678
            [SepEncoder(State),
 
2679
             List, do_enc_list(T, State, ElemEncoder, SepEncoder, true)];
 
2680
        List when NeedsSep == false ->
 
2681
            [List,
 
2682
             do_enc_list(T, State, ElemEncoder, SepEncoder, true)]
 
2683
    end.
 
2684
 
 
2685
%% Add brackets if list is non-empty
 
2686
enc_opt_brackets([], _State) ->
 
2687
    [];
 
2688
enc_opt_brackets(List, _State) when list(List) ->
 
2689
    [?LBRKT_INDENT(_State), List, ?RBRKT_INDENT(_State)].
 
2690
 
 
2691
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 
2692
 
 
2693
%% Int -> list of hex chars
 
2694
hex(Int) ->
 
2695
    hexi(get_lo_bits(Int, 4), []).
 
2696
 
 
2697
hexi({0, Lo}, Ack) ->
 
2698
    [hex4(Lo) | Ack];
 
2699
hexi({Hi, Lo} , Ack) ->
 
2700
    hexi(get_lo_bits(Hi, 4), [hex4(Lo) | Ack]).
 
2701
 
 
2702
hex4(Int) when Int < 10 ->
 
2703
    Int + $0;
 
2704
hex4(Int) ->
 
2705
    ($A - 10) + Int.
 
2706
 
 
2707
get_lo_bits(Int, Size) ->
 
2708
    Lo = Int band ones_mask(Size),
 
2709
    Hi = Int bsr Size,
 
2710
    {Hi, Lo}.
 
2711
 
 
2712
ones_mask(Ones) ->
 
2713
    (1 bsl Ones) - 1.
 
2714
 
 
2715
%% Verify that Count is within the range of Min and Max
 
2716
verify_count(Count, Min, Max) ->
 
2717
    if
 
2718
        integer(Count) ->
 
2719
            if
 
2720
                integer(Min), Count >= Min ->
 
2721
                    if
 
2722
                        integer(Max), Count =< Max ->
 
2723
                            Count;
 
2724
                        Max == infinity ->
 
2725
                            Count;
 
2726
                        true ->
 
2727
                            error({count_too_large, Count, Max})
 
2728
                    end;
 
2729
                true ->
 
2730
                    error({count_too_small, Count, Min})
 
2731
            end;
 
2732
        true ->
 
2733
            error({count_not_an_integer, Count})
 
2734
    end.
 
2735
 
 
2736
%% -------------------------------------------------------------------
 
2737
 
 
2738
error(Reason) ->
 
2739
    erlang:fault(Reason).
 
2740
 
 
2741
 
 
2742
%% -------------------------------------------------------------------
 
2743
 
 
2744
%% d(F) ->
 
2745
%%     d(F,[]).
 
2746
%% d(F, A) ->
 
2747
%%     d(get(dbg), F, A).
 
2748
 
 
2749
%% d(true, F, A) ->
 
2750
%%     io:format("~p:" ++ F ++ "~n", [?MODULE | A]);
 
2751
%% d(_, _, _) ->
 
2752
%%     ok.
 
2753
 
 
2754