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

« back to all changes in this revision

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