1%%
2%% %CopyrightBegin%
3%%
4%% Copyright Ericsson AB 2006-2016. All Rights Reserved.
5%%
6%% Licensed under the Apache License, Version 2.0 (the "License");
7%% you may not use this file except in compliance with the License.
8%% You may obtain a copy of the License at
9%%
10%%     http://www.apache.org/licenses/LICENSE-2.0
11%%
12%% Unless required by applicable law or agreed to in writing, software
13%% distributed under the License is distributed on an "AS IS" BASIS,
14%% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15%% See the License for the specific language governing permissions and
16%% limitations under the License.
17%%
18%% %CopyrightEnd%
19%%
20
21%%
22%%----------------------------------------------------------------------
23%% Purpose: Utility functions for creating the megaco types
24%%----------------------------------------------------------------------
25
26-module(megaco_test_msg_prev3c_lib).
27
28%% ----
29
30-compile({no_auto_import,[error/1]}).
31
32%% ----
33
34-include_lib("megaco/include/megaco_message_prev3c.hrl").
35-include_lib("megaco/include/megaco.hrl").
36
37%% ----
38
39-export([chk_MegacoMessage/2,
40
41	 cre_MegacoMessage/1,
42	 cre_MegacoMessage/2,
43
44	 cre_ActionReply/2,
45	 cre_ActionReply/3,
46	 cre_ActionReply/4,
47	 cre_ActionRequest/2,
48	 cre_ActionRequest/3,
49	 cre_ActionRequest/4,
50	 cre_AmmDescriptor/1,
51	 cre_AmmRequest/2,
52	 cre_AmmsReply/1,
53	 cre_AmmsReply/2,
54	 cre_AuditDescriptor/0,
55	 cre_AuditDescriptor/1,
56	 cre_AuditDescriptor/2,
57	 cre_AuditReply/1,
58	 cre_AuditRequest/2,
59	 cre_AuditRequest/3,
60	 cre_AuditResult/2,
61	 cre_AuditReturnParameter/1,
62	 cre_AuthenticationHeader/3,
63	 cre_BOOLEAN/1,
64	 cre_Command/2,
65	 cre_CommandReply/2,
66	 cre_CommandRequest/1,
67	 cre_CommandRequest/2,
68	 cre_CommandRequest/3,
69	 cre_ContextAttrAuditRequest/0,
70	 cre_ContextAttrAuditRequest/3,
71	 cre_ContextAttrAuditRequest/4,
72	 cre_ContextAttrAuditRequest/5,
73	 cre_ContextAttrAuditRequest/6,
74	 cre_ContextAttrAuditRequest/7,
75	 cre_ContextAttrAuditRequest/8,
76	 cre_ContextAttrAuditRequest/9,
77	 cre_ContextID/1,
78	 cre_ContextRequest/0,
79	 cre_ContextRequest/1,
80	 cre_ContextRequest/2,
81	 cre_ContextRequest/3,
82	 cre_ContextRequest/4,
83	 cre_ContextRequest/5,
84	 cre_ContextRequest/6,
85	 cre_DigitMapDescriptor/0,
86	 cre_DigitMapDescriptor/1,
87	 cre_DigitMapDescriptor/2,
88	 cre_DigitMapName/1,
89	 cre_DigitMapValue/1,
90	 cre_DigitMapValue/4,
91	 cre_DigitMapValue/5,
92	 cre_ErrorCode/1,
93	 cre_ErrorDescriptor/1,
94	 cre_ErrorDescriptor/2,
95	 cre_ErrorText/1,
96	 cre_EventBufferControl/1,
97	 cre_EventBufferDescriptor/1,
98	 cre_EventDM/1,
99	 cre_EventName/1,
100	 cre_EventParameter/2,
101	 cre_EventParameter/4,
102	 cre_EventsDescriptor/0,
103	 cre_EventsDescriptor/2,
104	 cre_EventSpec/2,
105	 cre_EventSpec/3,
106	 %% cre_H221NonStandard/4,
107	 cre_IndAuditParameter/1,
108	 cre_IndAudLocalControlDescriptor/0,
109	 cre_IndAudLocalControlDescriptor/4,
110	 cre_IndAudLocalControlDescriptor/5,
111	 cre_IndAudLocalRemoteDescriptor/1,
112	 cre_IndAudLocalRemoteDescriptor/2,
113	 cre_IndAudMediaDescriptor/0,
114	 cre_IndAudMediaDescriptor/1,
115	 cre_IndAudMediaDescriptor/2,
116	 cre_IndAudPropertyGroup/1,
117	 cre_IndAudPropertyParm/1,
118	 cre_IndAudPropertyParm/2,
119	 cre_IndAudDigitMapDescriptor/0,
120	 cre_IndAudDigitMapDescriptor/1,
121	 cre_IndAudEventBufferDescriptor/1,
122	 cre_IndAudEventBufferDescriptor/2,
123	 cre_IndAudEventsDescriptor/1,
124	 cre_IndAudEventsDescriptor/2,
125	 cre_IndAudEventsDescriptor/3,
126	 cre_IndAudPackagesDescriptor/2,
127	 cre_IndAudSeqSigList/1,
128	 cre_IndAudSeqSigList/2,
129	 cre_IndAudSignal/1,
130	 cre_IndAudSignal/2,
131	 cre_IndAudSignalsDescriptor/1,
132	 cre_IndAudStatisticsDescriptor/1,
133	 cre_IndAudStreamDescriptor/2,
134	 cre_IndAudStreamParms/0,
135	 cre_IndAudStreamParms/1,
136	 cre_IndAudStreamParms/3,
137	 cre_IndAudStreamParms/4,
138	 cre_IndAudTerminationStateDescriptor/1,
139	 cre_IndAudTerminationStateDescriptor/3,
140	 cre_IndAudTerminationStateDescriptor/4,
141	 cre_LocalControlDescriptor/1,
142	 cre_LocalControlDescriptor/2,
143	 cre_LocalControlDescriptor/4,
144	 cre_LocalRemoteDescriptor/1,
145	 cre_MediaDescriptor/0,
146	 cre_MediaDescriptor/1,
147	 cre_MediaDescriptor/2,
148	 cre_Message/3,
149	 cre_ModemDescriptor/2,
150	 %% cre_ModemDescriptor/3,
151	 cre_ModemType/1,
152	 cre_MuxDescriptor/2,
153	 %% cre_MuxDescriptor/3,
154	 cre_MuxType/1,
155	 cre_Name/1,
156	 %% cre_NonStandardData/2,
157	 %% cre_NonStandardIdentifier/1,
158	 cre_NotifyBehaviour/2,
159	 cre_NotifyCompletion/1,
160	 cre_NotifyReply/1,
161	 cre_NotifyReply/2,
162	 cre_NotifyRequest/2,
163	 cre_NotifyRequest/3,
164	 cre_ObservedEvent/2,
165	 cre_ObservedEvent/3,
166	 cre_ObservedEvent/4,
167	 cre_ObservedEventsDescriptor/2,
168	 cre_PackagesDescriptor/1,
169	 cre_PackagesItem/2,
170	 cre_PkgdName/1,
171	 cre_PkgdName/2,
172	 cre_PropertyGroup/1,
173	 cre_PropertyParm/2,
174	 cre_PropertyParm/4,
175	 cre_RegulatedEmbeddedDescriptor/0,
176	 cre_RegulatedEmbeddedDescriptor/1,
177	 cre_RegulatedEmbeddedDescriptor/2,
178	 cre_Relation/1,
179	 cre_RequestedActions/0,
180	 cre_RequestedActions/1,
181	 cre_RequestedActions/4,
182	 cre_RequestedActions/6,
183	 cre_RequestedEvent/1,
184	 cre_RequestedEvent/2,
185	 cre_RequestedEvent/3,
186	 cre_RequestedEvent/4,
187	 cre_RequestID/1,
188	 cre_SecondEventsDescriptor/1,
189	 cre_SecondEventsDescriptor/2,
190	 cre_SecondRequestedActions/0,
191	 cre_SecondRequestedActions/1,
192	 cre_SecondRequestedActions/2,
193	 cre_SecondRequestedActions/3,
194	 cre_SecondRequestedActions/5,
195	 cre_SecondRequestedEvent/2,
196	 cre_SecondRequestedEvent/3,
197	 cre_SecondRequestedEvent/4,
198	 cre_SelectLogic/1,
199	 cre_SeqSigList/2,
200	 cre_ServiceChangeAddress/2,
201	 cre_ServiceChangeRequest/2,
202	 cre_ServiceChangeMethod/1,
203	 cre_ServiceChangeParm/2,
204	 cre_ServiceChangeParm/4,
205	 cre_ServiceChangeParm/9,
206	 cre_ServiceChangeParm/10,
207	 cre_ServiceChangeProfile/1,
208	 cre_ServiceChangeProfile/2,
209	 cre_ServiceChangeReply/2,
210	 cre_ServiceChangeResParm/0,
211	 cre_ServiceChangeResParm/2,
212	 cre_ServiceChangeResParm/5,
213	 cre_ServiceChangeResult/1,
214	 cre_ServiceState/1,
215	 cre_Signal/1,
216	 cre_Signal/2,
217	 cre_Signal/7,
218	 cre_Signal/9,
219	 cre_Signal/10,
220	 cre_SignalDirection/1,
221	 cre_SignalName/1,
222	 cre_SignalRequest/1,
223	 cre_SignalsDescriptor/1,
224	 cre_SignalType/1,
225	 cre_SigParameter/2,
226	 cre_SigParameter/4,
227	 cre_StatisticsDescriptor/1,
228	 cre_StatisticsParameter/1,
229	 cre_StatisticsParameter/2,
230	 cre_StreamDescriptor/2,
231	 cre_StreamID/1,
232	 cre_StreamMode/1,
233	 cre_StreamParms/0,
234	 cre_StreamParms/1,
235	 cre_StreamParms/2,
236	 cre_StreamParms/3,
237	 cre_StreamParms/4,
238	 cre_SubtractRequest/1,
239	 cre_SubtractRequest/2,
240	 cre_TopologyRequest/3,
241	 cre_TopologyRequest/4,
242	 cre_TerminationAudit/1,
243	 cre_TerminationID/2,
244	 cre_TerminationIDList/1,
245	 cre_TerminationStateDescriptor/1,
246	 cre_TerminationStateDescriptor/2,
247	 cre_TerminationStateDescriptor/3,
248	 cre_TermListAuditResult/2,
249	 cre_TimeNotation/2,
250	 cre_Transaction/1,
251	 cre_TransactionAck/1,
252	 cre_TransactionAck/2,
253	 cre_TransactionId/1,
254	 cre_TransactionPending/1,
255	 cre_TransactionReply/2,
256	 cre_TransactionReply/3,
257	 cre_TransactionRequest/2,
258	 cre_Value/1
259	 %% cre_WildcardField/1,
260	]).
261
262
263%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
264
265cre_MegacoMessage(M) when is_record(M, 'Message') ->
266    #'MegacoMessage'{mess = M}.
267
268cre_MegacoMessage(AH, M)
269  when is_record(AH, 'AuthenticationHeader') andalso is_record(M, 'Message') ->
270    #'MegacoMessage'{authHeader = AH,
271		     mess       = M}.
272
273cre_AuthenticationHeader(SPI, SN, AD) ->
274    #'AuthenticationHeader'{secParmIndex = SPI,
275			    seqNum       = SN,
276			    ad           = AD}.
277
278cre_Message(V, Mid, ED) when is_record(ED, 'ErrorDescriptor') ->
279    Body = {errorDescriptor, ED},
280    #'Message'{version     = V,
281	       mId         = Mid,
282	       messageBody = Body};
283cre_Message(V, Mid, Transactions) when is_list(Transactions) ->
284    Body = {transactions, Transactions},
285    #'Message'{version     = V,
286	       mId         = Mid,
287	       messageBody = Body};
288cre_Message(V, Mid, {transactions, T} = Body) when is_list(T) ->
289    #'Message'{version     = V,
290	       mId         = Mid,
291	       messageBody = Body};
292cre_Message(V, Mid, {errorDescriptor, ED} = Body)
293  when is_record(ED, 'ErrorDescriptor') ->
294    #'Message'{version     = V,
295	       mId         = Mid,
296	       messageBody = Body}.
297
298
299cre_ErrorDescriptor(EC) when is_integer(EC) ->
300    #'ErrorDescriptor'{errorCode = EC}.
301
302cre_ErrorDescriptor(EC, ET) when is_integer(EC) andalso is_list(ET) ->
303    #'ErrorDescriptor'{errorCode = EC, errorText = ET}.
304
305cre_ErrorCode(C) when is_integer(C) andalso (0 =< C) andalso (C =< 65535) ->
306    C;
307cre_ErrorCode(C) ->
308    exit({invalid_ErrorCode, C}).
309
310cre_ErrorText(T) when is_list(T) ->
311    T.
312
313cre_ContextID(Val) when 0 =< Val, Val =< 4294967295 ->
314    Val;
315cre_ContextID(Val) ->
316    exit({invalid_ContextID, Val}).
317
318cre_Transaction(TR) when is_record(TR, 'TransactionRequest') ->
319    {transactionRequest, TR};
320cre_Transaction(TP) when is_record(TP, 'TransactionPending') ->
321    {transactionPending, TP};
322cre_Transaction(TR) when is_record(TR, 'TransactionReply') ->
323    {transactionReply, TR};
324cre_Transaction(TRA) when is_list(TRA) ->
325    {transactionResponseAck, TRA}.
326
327cre_TransactionId(Val) when 0 =< Val, Val =< 4294967295 ->
328    Val;
329cre_TransactionId(Val) ->
330    exit({invalid_TransactionId, Val}).
331
332cre_TransactionRequest(TransID, ARs) when is_integer(TransID) andalso is_list(ARs) ->
333    #'TransactionRequest'{transactionId = TransID,
334			  actions       = ARs}.
335
336cre_TransactionPending(TransID) when is_integer(TransID) ->
337    #'TransactionPending'{transactionId = TransID}.
338
339cre_TransactionReply(TransID, ED)
340  when is_integer(TransID) andalso is_record(ED, 'ErrorDescriptor') ->
341    Res = {transactionError, ED},
342    #'TransactionReply'{transactionId     = TransID,
343			transactionResult = Res};
344cre_TransactionReply(TransID, ARs)
345  when is_integer(TransID) andalso is_list(ARs) ->
346    Res = {actionReplies, ARs},
347    #'TransactionReply'{transactionId     = TransID,
348			transactionResult = Res}.
349
350cre_TransactionReply(TransID, IAR, ED)
351  when is_integer(TransID) andalso
352       ((IAR =:= 'NULL') orelse (IAR =:= asn1_NOVALUE)) andalso
353       is_record(ED, 'ErrorDescriptor') ->
354    Res = {transactionError, ED},
355    #'TransactionReply'{transactionId     = TransID,
356			transactionResult = Res};
357cre_TransactionReply(TransID, IAR, ARs)
358  when is_integer(TransID) andalso
359       ((IAR =:= 'NULL') orelse (IAR =:= asn1_NOVALUE)) andalso
360       is_list(ARs) ->
361    Res = {actionReplies, ARs},
362    #'TransactionReply'{transactionId     = TransID,
363			transactionResult = Res}.
364
365cre_TransactionAck(FirstAck) ->
366    #'TransactionAck'{firstAck = FirstAck}.
367
368cre_TransactionAck(FirstAck, FirstAck) ->
369    #'TransactionAck'{firstAck = FirstAck};
370cre_TransactionAck(FirstAck, LastAck) ->
371    #'TransactionAck'{firstAck = FirstAck,
372		      lastAck  = LastAck}.
373
374cre_ActionRequest(CtxID, CmdReqs)
375  when is_integer(CtxID) andalso is_list(CmdReqs) ->
376    #'ActionRequest'{contextId       = CtxID,
377		     commandRequests = CmdReqs}.
378
379cre_ActionRequest(CtxID, CtxReq, CmdReqs)
380  when is_integer(CtxID) andalso
381       is_record(CtxReq, 'ContextRequest') andalso
382       is_list(CmdReqs) ->
383    #'ActionRequest'{contextId       = CtxID,
384		     contextRequest  = CtxReq,
385		     commandRequests = CmdReqs};
386cre_ActionRequest(CtxID, CAAR, CmdReqs)
387  when is_integer(CtxID) and
388       is_record(CAAR, 'ContextAttrAuditRequest') and
389       is_list(CmdReqs) ->
390    #'ActionRequest'{contextId           = CtxID,
391		     contextAttrAuditReq = CAAR,
392		     commandRequests     = CmdReqs}.
393
394cre_ActionRequest(CtxID, CtxReq, CAAR, CmdReqs)
395  when is_integer(CtxID) and
396       (is_record(CtxReq, 'ContextRequest') or
397	(CtxReq == asn1_NOVALUE)) and
398       (is_record(CAAR, 'ContextAttrAuditRequest') or
399	(CAAR == asn1_NOVALUE)) and
400       is_list(CmdReqs) ->
401    #'ActionRequest'{contextId           = CtxID,
402		     contextRequest      = CtxReq,
403		     contextAttrAuditReq = CAAR,
404		     commandRequests     = CmdReqs}.
405
406cre_ActionReply(CtxID, CmdReps)
407  when is_integer(CtxID) andalso is_list(CmdReps) ->
408    #'ActionReply'{contextId    = CtxID,
409		   commandReply = CmdReps}.
410
411cre_ActionReply(CtxID, ED, CmdReps)
412  when is_integer(CtxID) andalso is_record(ED, 'ErrorDescriptor') andalso is_list(CmdReps) ->
413    #'ActionReply'{contextId       = CtxID,
414		   errorDescriptor = ED,
415		   commandReply    = CmdReps};
416cre_ActionReply(CtxID, CtxReq, CmdReps)
417  when is_integer(CtxID) andalso
418       is_record(CtxReq, 'ContextRequest') andalso
419       is_list(CmdReps) ->
420    #'ActionReply'{contextId    = CtxID,
421		   contextReply = CtxReq,
422		   commandReply = CmdReps}.
423
424cre_ActionReply(CtxID, ED, CtxReq, CmdReps)
425  when is_integer(CtxID) andalso
426       (is_record(ED, 'ErrorDescriptor') orelse (ED =:= asn1_NOVALUE)) andalso
427       (is_record(CtxReq, 'ContextRequest') orelse (CtxReq =:= asn1_NOVALUE)) andalso
428       is_list(CmdReps) ->
429    #'ActionReply'{contextId       = CtxID,
430		   errorDescriptor = ED,
431		   contextReply    = CtxReq,
432		   commandReply    = CmdReps}.
433
434cre_ContextRequest() ->
435    strip_ContextRequest(#'ContextRequest'{}).
436
437cre_ContextRequest(Prio) when is_integer(Prio) andalso (0 =< Prio) andalso (Prio =< 15) ->
438    strip_ContextRequest(#'ContextRequest'{priority = Prio});
439cre_ContextRequest(Em) when (Em =:= true) orelse (Em =:= false) orelse (Em =:= asn1_NOVALUE) ->
440    strip_ContextRequest(#'ContextRequest'{emergency = Em});
441cre_ContextRequest(Top) when is_list(Top) ->
442    strip_ContextRequest(#'ContextRequest'{topologyReq = Top}).
443
444cre_ContextRequest(Prio, Em)
445  when (is_integer(Prio) and (0 =< Prio) and (Prio =< 15)) and
446       ((Em == true) or (Em == false) or (Em == asn1_NOVALUE)) ->
447    CR = #'ContextRequest'{priority  = Prio,
448			   emergency = Em},
449    strip_ContextRequest(CR);
450cre_ContextRequest(Prio, Top)
451  when is_integer(Prio) andalso (0 =< Prio) andalso (Prio =< 15) andalso is_list(Top) ->
452    CR = #'ContextRequest'{priority    = Prio,
453			   topologyReq = Top},
454    strip_ContextRequest(CR).
455
456cre_ContextRequest(Prio, Em, Top)
457  when (is_integer(Prio) and (0 =< Prio) and (Prio =< 15)) and
458       ((Em == true) or (Em == false) or (Em == asn1_NOVALUE)) and
459       (is_list(Top) or (Top == asn1_NOVALUE)) ->
460    CR = #'ContextRequest'{priority    = Prio,
461			   emergency   = Em,
462			   topologyReq = Top},
463    strip_ContextRequest(CR).
464
465cre_ContextRequest(Prio, Em, Top, Ieps)
466  when (is_integer(Prio) and (0 =< Prio) and (Prio =< 15)) and
467       ((Em == true) or (Em == false) or (Em == asn1_NOVALUE)) and
468       (is_list(Top) or (Top == asn1_NOVALUE)) and
469       ((Ieps == true) or (Ieps == false)) ->
470    CR = #'ContextRequest'{priority       = Prio,
471			   emergency      = Em,
472			   topologyReq    = Top,
473			   iepscallind    = Ieps},
474    strip_ContextRequest(CR);
475cre_ContextRequest(Prio, Em, Top, Ctx)
476  when ((is_integer(Prio) and (0 =< Prio) and (Prio =< 15)) or
477	(Prio == asn1_NOVALUE)) and
478       ((Em == true) or (Em == false) or (Em == asn1_NOVALUE)) and
479       (is_list(Top) or (Top == asn1_NOVALUE)) and
480       (is_list(Ctx)) ->
481    CR =
482	case context_list_or_prop(Ctx) of
483	    contextProp ->
484		#'ContextRequest'{priority    = Prio,
485				  emergency   = Em,
486				  topologyReq = Top,
487				  contextProp = Ctx};
488	    contextList ->
489		#'ContextRequest'{priority    = Prio,
490				  emergency   = Em,
491				  topologyReq = Top,
492				  contextList = Ctx}
493	end,
494    strip_ContextRequest(CR).
495
496cre_ContextRequest(Prio, Em, Top, Ieps, Ctx)
497  when ((is_integer(Prio) and (0 =< Prio) and (Prio =< 15)) or
498	(Prio == asn1_NOVALUE)) and
499       ((Em == true) or (Em == false) or (Em == asn1_NOVALUE)) and
500       (is_list(Top) or (Top == asn1_NOVALUE)) and
501       ((Ieps == true) or (Ieps == false) or (Ieps == asn1_NOVALUE)) and
502       (is_list(Ctx)) ->
503    CR =
504	case context_list_or_prop(Ctx) of
505	    contextProp ->
506		#'ContextRequest'{priority    = Prio,
507				  emergency   = Em,
508				  topologyReq = Top,
509				  iepscallind = Ieps,
510				  contextProp = Ctx};
511	    contextList ->
512		#'ContextRequest'{priority    = Prio,
513				  emergency   = Em,
514				  topologyReq = Top,
515				  iepscallind = Ieps,
516				  contextList = Ctx}
517	end,
518    strip_ContextRequest(CR).
519
520cre_ContextRequest(Prio, Em, Top, Ieps, CtxProp, CtxList)
521  when ((is_integer(Prio) and (0 =< Prio) and (Prio =< 15)) or
522	(Prio == asn1_NOVALUE)) and
523       ((Em == true) or (Em == false) or (Em == asn1_NOVALUE)) and
524       (is_list(Top) or (Top == asn1_NOVALUE)) and
525       ((Ieps == true) or (Ieps == false) or (Ieps == asn1_NOVALUE)) and
526       (is_list(CtxProp) or (CtxProp == asn1_NOVALUE)) and
527       (is_list(CtxList) or (CtxList == asn1_NOVALUE)) ->
528    CR = #'ContextRequest'{priority    = Prio,
529			   emergency   = Em,
530			   topologyReq = Top,
531			   iepscallind = Ieps,
532			   contextProp = CtxProp,
533			   contextList = CtxList},
534    strip_ContextRequest(CR).
535
536context_list_or_prop(asn1_NOVALUE) ->
537    contextProp;
538context_list_or_prop([]) ->
539    contextProp;
540context_list_or_prop([H|T]) ->
541    case is_ContextID(H) of
542	true ->
543	    context_list_or_prop(T, contextList);
544	false ->
545	    context_list_or_prop(T, contextProp)
546    end.
547
548context_list_or_prop([], What) ->
549    What;
550context_list_or_prop([H|T], What) ->
551    case is_ContextID(H) of
552	true when What == contextList ->
553	    context_list_or_prop(T, What);
554	false when What == contextProp ->
555	    context_list_or_prop(T, What);
556	_ ->
557	    error({invalid_contextListOrProp, H, What})
558    end.
559
560strip_ContextRequest(#'ContextRequest'{priority    = asn1_NOVALUE,
561				       emergency   = asn1_NOVALUE,
562				       topologyReq = asn1_NOVALUE,
563				       iepscallind = asn1_NOVALUE,
564				       contextProp = asn1_NOVALUE}) ->
565    asn1_NOVALUE;
566strip_ContextRequest(#'ContextRequest'{priority    = asn1_NOVALUE,
567				       emergency   = asn1_NOVALUE,
568				       topologyReq = Top,
569				       iepscallind = Ieps,
570				       contextProp = Prop} = CR) ->
571    case (((Top  == [])    or (Top  == asn1_NOVALUE)) and
572	  ((Ieps == false) or (Ieps == asn1_NOVALUE)) and
573	  ((Prop == [])    or (Prop == asn1_NOVALUE))) of
574	true ->
575	    asn1_NOVALUE;
576	false ->
577	    CR
578    end;
579strip_ContextRequest(CR) ->
580    CR.
581
582cre_ContextAttrAuditRequest() ->
583    strip_ContextAttrAuditRequest(#'ContextAttrAuditRequest'{}).
584
585cre_ContextAttrAuditRequest(Top, Em, Prio)
586  when ((Top  == 'NULL') or (Top  == asn1_NOVALUE)) and
587       ((Em   == 'NULL') or (Em   == asn1_NOVALUE)) and
588       ((Prio == 'NULL') or (Prio == asn1_NOVALUE)) ->
589    CAAR = #'ContextAttrAuditRequest'{topology  = Top,
590				      emergency = Em,
591				      priority  = Prio},
592    strip_ContextAttrAuditRequest(CAAR).
593
594cre_ContextAttrAuditRequest(Top, Em, Prio, Ieps)
595  when ((Top  == 'NULL') or (Top  == asn1_NOVALUE)) and
596       ((Em   == 'NULL') or (Em   == asn1_NOVALUE)) and
597       ((Prio == 'NULL') or (Prio == asn1_NOVALUE)) and
598       ((Ieps == 'NULL') or (Ieps == asn1_NOVALUE)) ->
599    CAAR = #'ContextAttrAuditRequest'{topology    = Top,
600				      emergency   = Em,
601				      priority    = Prio,
602				      iepscallind = Ieps},
603    strip_ContextAttrAuditRequest(CAAR).
604
605cre_ContextAttrAuditRequest(Top, Em, Prio, Ieps, Ctx)
606  when ((Top  == 'NULL') or (Top  == asn1_NOVALUE)) and
607       ((Em   == 'NULL') or (Em   == asn1_NOVALUE)) and
608       ((Prio == 'NULL') or (Prio == asn1_NOVALUE)) and
609       ((Ieps == 'NULL') or (Ieps == asn1_NOVALUE)) and
610       (is_list(Ctx)     or (Ctx == asn1_NOVALUE)) ->
611    CAAR = #'ContextAttrAuditRequest'{topology       = Top,
612				      emergency      = Em,
613				      priority       = Prio,
614				      iepscallind    = Ieps,
615				      contextPropAud = Ctx},
616    strip_ContextAttrAuditRequest(CAAR).
617
618cre_ContextAttrAuditRequest(Top, Em, Prio, Ieps, Ctx, SelPrio)
619  when ((Top  == 'NULL') or (Top  == asn1_NOVALUE)) and
620       ((Em   == 'NULL') or (Em   == asn1_NOVALUE)) and
621       ((Prio == 'NULL') or (Prio == asn1_NOVALUE)) and
622       ((Ieps == 'NULL') or (Ieps == asn1_NOVALUE)) and
623       (is_list(Ctx)     or (Ctx  == asn1_NOVALUE)) and
624       ((is_integer(SelPrio) and ((0 =< SelPrio) and (SelPrio =< 15))) or
625	(SelPrio == asn1_NOVALUE)) ->
626    CAAR = #'ContextAttrAuditRequest'{topology       = Top,
627				      emergency      = Em,
628				      priority       = Prio,
629				      iepscallind    = Ieps,
630				      contextPropAud = Ctx,
631				      selectpriority = SelPrio},
632    strip_ContextAttrAuditRequest(CAAR).
633
634cre_ContextAttrAuditRequest(Top, Em, Prio, Ieps, Ctx, SelPrio, SelLog)
635  when ((Top  == 'NULL') or (Top  == asn1_NOVALUE)) and
636       ((Em   == 'NULL') or (Em   == asn1_NOVALUE)) and
637       ((Prio == 'NULL') or (Prio == asn1_NOVALUE)) and
638       ((Ieps == 'NULL') or (Ieps == asn1_NOVALUE)) and
639       (is_list(Ctx)     or (Ctx  == asn1_NOVALUE)) and
640       ((is_integer(SelPrio) and ((0 =< SelPrio) and (SelPrio =< 15))) or
641	(SelPrio == asn1_NOVALUE)) ->
642    case ((SelLog == asn1_NOVALUE) orelse is_SelectLogic(SelLog)) of
643	true ->
644	    CAAR = #'ContextAttrAuditRequest'{topology       = Top,
645					      emergency      = Em,
646					      priority       = Prio,
647					      iepscallind    = Ieps,
648					      contextPropAud = Ctx,
649					      selectpriority = SelPrio,
650					      selectLogic    = SelLog},
651	    strip_ContextAttrAuditRequest(CAAR);
652	false ->
653	    error({invalid_SelectLogic, SelLog,
654		   ['ContextAttrAuditRequest',
655		    Top, Em, Prio, Ieps, Ctx, SelPrio]})
656    end.
657
658cre_ContextAttrAuditRequest(Top, Em, Prio, Ieps, Ctx,
659			    SelPrio, SelEm, SelIeps)
660  when ((Top  == 'NULL') or (Top  == asn1_NOVALUE)) and
661       ((Em   == 'NULL') or (Em   == asn1_NOVALUE)) and
662       ((Prio == 'NULL') or (Prio == asn1_NOVALUE)) and
663       ((Ieps == 'NULL') or (Ieps == asn1_NOVALUE)) and
664       (is_list(Ctx)     or (Ctx  == asn1_NOVALUE)) and
665       ((is_integer(SelPrio) and ((0 =< SelPrio) and (SelPrio =< 15))) or
666	(SelPrio == asn1_NOVALUE)) and
667       ((SelEm == true)  or
668	(SelEm == false) or
669	(SelEm == asn1_NOVALUE)) and
670       ((SelIeps == true)  or
671	(SelIeps == false) or
672	(SelIeps == asn1_NOVALUE)) ->
673    CAAR = #'ContextAttrAuditRequest'{topology          = Top,
674				      emergency         = Em,
675				      priority          = Prio,
676				      iepscallind       = Ieps,
677				      contextPropAud    = Ctx,
678				      selectpriority    = SelPrio,
679				      selectemergency   = SelEm,
680				      selectiepscallind = SelIeps},
681    strip_ContextAttrAuditRequest(CAAR).
682
683cre_ContextAttrAuditRequest(Top, Em, Prio, Ieps, Ctx,
684			    SelPrio, SelEm, SelIeps, SelLog)
685  when ((Top  == 'NULL') or (Top  == asn1_NOVALUE)) and
686       ((Em   == 'NULL') or (Em   == asn1_NOVALUE)) and
687       ((Prio == 'NULL') or (Prio == asn1_NOVALUE)) and
688       ((Ieps == 'NULL') or (Ieps == asn1_NOVALUE)) and
689       (is_list(Ctx)     or (Ctx  == asn1_NOVALUE)) and
690       ((is_integer(SelPrio) and ((0 =< SelPrio) and (SelPrio =< 15))) or
691	(SelPrio == asn1_NOVALUE)) and
692       ((SelEm == true)  or
693	(SelEm == false) or
694	(SelEm == asn1_NOVALUE)) and
695       ((SelIeps == true)  or
696	(SelIeps == false) or
697	(SelIeps == asn1_NOVALUE)) ->
698    case ((SelLog == asn1_NOVALUE) orelse is_SelectLogic(SelLog)) of
699	true ->
700	    CAAR = #'ContextAttrAuditRequest'{topology          = Top,
701					      emergency         = Em,
702					      priority          = Prio,
703					      iepscallind       = Ieps,
704					      contextPropAud    = Ctx,
705					      selectpriority    = SelPrio,
706					      selectemergency   = SelEm,
707					      selectiepscallind = SelIeps,
708					      selectLogic       = SelLog},
709	    strip_ContextAttrAuditRequest(CAAR);
710	false ->
711	    error({invalid_SelectLogic, SelLog})
712    end.
713
714strip_ContextAttrAuditRequest(
715  #'ContextAttrAuditRequest'{topology       = asn1_NOVALUE,
716			     emergency      = asn1_NOVALUE,
717			     priority       = asn1_NOVALUE,
718			     iepscallind    = asn1_NOVALUE,
719			     contextPropAud = asn1_NOVALUE}) ->
720    asn1_NOVALUE;
721strip_ContextAttrAuditRequest(
722  #'ContextAttrAuditRequest'{topology       = asn1_NOVALUE,
723			     emergency      = asn1_NOVALUE,
724			     priority       = asn1_NOVALUE,
725			     iepscallind    = asn1_NOVALUE,
726			     contextPropAud = []}) ->
727    asn1_NOVALUE;
728strip_ContextAttrAuditRequest(CAAR) ->
729    CAAR.
730
731
732cre_SelectLogic(andAUDITSelect = SL) ->
733    {SL, 'NULL'};
734cre_SelectLogic(orAUDITSelect = SL) ->
735    {SL, 'NULL'};
736cre_SelectLogic(asn1_NOVALUE) ->
737    asn1_NOVALUE.
738
739
740cre_CommandRequest(Cmd) ->
741    #'CommandRequest'{command = Cmd}.
742
743cre_CommandRequest(Cmd, Opt)
744  when ((Opt == 'NULL') or (Opt == asn1_NOVALUE)) ->
745    #'CommandRequest'{command  = Cmd,
746		      optional = Opt}.
747
748cre_CommandRequest(Cmd, Opt, WR)
749  when ((Opt == 'NULL') or (Opt == asn1_NOVALUE)) and
750       ((WR  == 'NULL') or (WR  == asn1_NOVALUE)) ->
751    #'CommandRequest'{command        = Cmd,
752		      optional       = Opt,
753		      wildcardReturn = WR}.
754
755cre_Command(addReq = Tag, Req)
756  when is_record(Req, 'AmmRequest') ->
757    {Tag, Req};
758cre_Command(moveReq = Tag, Req)
759  when is_record(Req, 'AmmRequest') ->
760    {Tag, Req};
761cre_Command(modReq = Tag, Req)
762  when is_record(Req, 'AmmRequest') ->
763    {Tag, Req};
764cre_Command(subtractReq = Tag, Req)
765  when is_record(Req, 'SubtractRequest') ->
766    {Tag, Req};
767cre_Command(auditCapRequest = Tag, Req)
768  when is_record(Req, 'AuditRequest') ->
769    {Tag, Req};
770cre_Command(auditValueRequest = Tag, Req)
771  when is_record(Req, 'AuditRequest') ->
772    {Tag, Req};
773cre_Command(notifyReq = Tag, Req)
774  when is_record(Req, 'NotifyRequest') ->
775    {Tag, Req};
776cre_Command(serviceChangeReq = Tag, Req)
777  when is_record(Req, 'ServiceChangeRequest') ->
778    {Tag, Req}.
779
780cre_CommandReply(addReply = Tag, Rep)
781  when is_record(Rep, 'AmmsReply') ->
782    {Tag, Rep};
783cre_CommandReply(moveReply = Tag, Rep)
784  when is_record(Rep, 'AmmsReply') ->
785    {Tag, Rep};
786cre_CommandReply(modReply = Tag, Rep)
787  when is_record(Rep, 'AmmsReply') ->
788    {Tag, Rep};
789cre_CommandReply(subtractReply = Tag, Rep)
790  when is_record(Rep, 'AmmsReply') ->
791    {Tag, Rep};
792cre_CommandReply(auditCapReply = Tag, Rep)
793  when is_tuple(Rep) ->
794    {Tag, Rep};
795cre_CommandReply(auditValueReply = Tag, Rep)
796  when is_tuple(Rep) ->
797    {Tag, Rep};
798cre_CommandReply(notifyReply = Tag, Rep)
799  when is_record(Rep, 'NotifyReply') ->
800    {Tag, Rep};
801cre_CommandReply(serviceChangeReply = Tag, Rep)
802  when is_record(Rep, 'ServiceChangeReply') ->
803    {Tag, Rep}.
804
805
806%% -- TopologyRequest --
807
808cre_TopologyRequest(From, To, TD)
809  when (is_record(From, 'TerminationID') or
810	is_record(From, megaco_term_id)) and
811       (is_record(To, 'TerminationID') or
812	is_record(To, megaco_term_id)) and
813       ((TD == bothway) or (TD == isolate) or (TD == oneway)) ->
814    #'TopologyRequest'{terminationFrom   = From,
815		       terminationTo     = To,
816		       topologyDirection = TD};
817cre_TopologyRequest(From, To, TDE)
818  when (is_record(From, 'TerminationID') or
819	is_record(From, megaco_term_id)) and
820       (is_record(To, 'TerminationID') or
821	is_record(To, megaco_term_id)) and
822       ((TDE == onewayexternal) or (TDE == onewayboth)) ->
823    #'TopologyRequest'{terminationFrom            = From,
824		       terminationTo              = To,
825		       topologyDirection          = oneway,
826		       topologyDirectionExtension = TDE}.
827
828cre_TopologyRequest(From, To, TD, SID)
829  when (is_record(From, 'TerminationID') or
830	is_record(From, megaco_term_id)) and
831       (is_record(To, 'TerminationID') or
832	is_record(To, megaco_term_id)) and
833       ((TD == bothway) or (TD == isolate) or (TD == oneway)) and
834       (is_integer(SID)) ->
835    #'TopologyRequest'{terminationFrom   = From,
836		       terminationTo     = To,
837		       topologyDirection = TD,
838		       streamID          = SID};
839cre_TopologyRequest(From, To, SID, TDE)
840  when (is_record(From, 'TerminationID') or
841	is_record(From, megaco_term_id)) and
842       (is_record(To, 'TerminationID') or
843	is_record(To, megaco_term_id)) and
844       (is_integer(SID)) and
845       ((TDE == onewayexternal) or (TDE == onewayboth)) ->
846    #'TopologyRequest'{terminationFrom            = From,
847		       terminationTo              = To,
848		       topologyDirection          = oneway,
849		       streamID                   = SID,
850		       topologyDirectionExtension = TDE}.
851
852cre_AmmRequest(TermIDs, Descs) ->
853    d("cre_AmmRequest -> entry with"
854      "~n   TermIDs: ~p"
855      "~n   Descs:   ~p", [TermIDs, Descs]),
856    case is_TerminationIDList(TermIDs) andalso
857	is_AmmRequest_descriptors(Descs) of
858	true ->
859	    #'AmmRequest'{terminationID = TermIDs,
860			  descriptors   = Descs};
861	false ->
862	    error({invalid_AmmRequest, {TermIDs, Descs}})
863    end.
864
865cre_AmmDescriptor(D) when is_record(D, 'MediaDescriptor') ->
866    {mediaDescriptor, D};
867cre_AmmDescriptor(D) when is_record(D, 'ModemDescriptor') ->
868    {modemDescriptor, D};
869cre_AmmDescriptor(D) when is_record(D, 'MuxDescriptor') ->
870    {muxDescriptor, D};
871cre_AmmDescriptor(D) when is_record(D, 'EventsDescriptor') ->
872    {eventsDescriptor, D};
873cre_AmmDescriptor(D) when is_record(D, 'DigitMapDescriptor') ->
874    {digitMapDescriptor, D};
875cre_AmmDescriptor(D) when is_record(D, 'AuditDescriptor') ->
876    {auditDescriptor, D};
877cre_AmmDescriptor(D) when is_list(D) ->
878    case is_EventBufferDescriptor(D) of
879	true ->
880	    {eventBufferDescriptor, D};
881	false ->
882	    case is_SignalsDescriptor(D) of
883		true ->
884		    {signalsDescriptor, D};
885		false ->
886		    case is_StatisticsDescriptor(D) of
887			true ->
888			    {statisticsDescriptor, D};
889			false ->
890			    error({invalid_AmmDescriptor, D})
891		    end
892	    end
893    end.
894
895cre_AmmsReply(TermIDs) when is_list(TermIDs) ->
896    #'AmmsReply'{terminationID = TermIDs}.
897
898cre_AmmsReply(TermIDs, TAs) when is_list(TermIDs) andalso is_list(TAs) ->
899    #'AmmsReply'{terminationID    = TermIDs,
900		 terminationAudit = TAs}.
901
902cre_SubtractRequest(TermIDs) when is_list(TermIDs) ->
903    #'SubtractRequest'{terminationID = TermIDs}.
904
905cre_SubtractRequest(TermIDs, Audit)
906  when is_list(TermIDs) andalso is_record(Audit, 'AuditDescriptor') ->
907    #'SubtractRequest'{terminationID   = TermIDs,
908		       auditDescriptor = Audit}.
909
910cre_AuditRequest(TermID, Audit)
911  when is_record(TermID, megaco_term_id) andalso
912       is_record(Audit, 'AuditDescriptor') ->
913    #'AuditRequest'{terminationID   = TermID,
914		    auditDescriptor = Audit}.
915
916cre_AuditRequest(TID, Audit, [TID|_] = TIDs)
917  when is_record(TID, megaco_term_id) and
918       is_record(Audit, 'AuditDescriptor') ->
919    #'AuditRequest'{terminationID     = TID,
920		    auditDescriptor   = Audit,
921		    terminationIDList = TIDs}.
922
923cre_AuditReply(TermIDs) when is_list(TermIDs) ->
924    {contextAuditResult, TermIDs};
925cre_AuditReply(ED) when is_record(ED, 'ErrorDescriptor') ->
926    {error, ED};
927cre_AuditReply(Audit) when is_record(Audit, 'AuditResult') ->
928    {auditResult, Audit};
929cre_AuditReply(ARTL) when is_record(ARTL, 'TermListAuditResult') ->
930    {auditResultTermList, ARTL}.
931
932cre_AuditResult(TID, TAs)
933  when is_record(TID, megaco_term_id) andalso is_list(TAs) ->
934    #'AuditResult'{terminationID          = TID,
935		   terminationAuditResult = TAs}.
936
937cre_TermListAuditResult(TIDs, TA)
938  when is_list(TIDs) andalso is_list(TA) ->
939    #'TermListAuditResult'{terminationIDList      = TIDs,
940			   terminationAuditResult = TA}.
941
942cre_TerminationAudit(D) ->
943    true = is_TerminationAudit(D),
944    D.
945
946cre_AuditReturnParameter(D) when is_record(D, 'ErrorDescriptor') ->
947    {errorDescriptor, D};
948cre_AuditReturnParameter(D) when is_record(D, 'MediaDescriptor') ->
949    {mediaDescriptor, D};
950cre_AuditReturnParameter(D) when is_record(D, 'ModemDescriptor') ->
951    {modemDescriptor, D};
952cre_AuditReturnParameter(D) when is_record(D, 'MuxDescriptor') ->
953    {muxDescriptor, D};
954cre_AuditReturnParameter(D) when is_record(D, 'EventsDescriptor') ->
955    {eventsDescriptor, D};
956cre_AuditReturnParameter([H|_] = D) when is_record(H, 'EventSpec') ->
957    {eventBufferDescriptor, D};
958cre_AuditReturnParameter(D) when is_record(D, 'DigitMapDescriptor') ->
959    {digitMapDescriptor, D};
960cre_AuditReturnParameter(D) when is_record(D, 'ObservedEventsDescriptor') ->
961    {observedEventsDescriptor, D};
962cre_AuditReturnParameter([H|_] = D) when is_record(H, 'StatisticsParameter') ->
963    {statisticsDescriptor, D};
964cre_AuditReturnParameter([H|_] = D) when is_record(H, 'PackagesItem') ->
965    {packagesDescriptor, D};
966cre_AuditReturnParameter(D) when is_record(D, 'AuditDescriptor') ->
967    {emptyDescriptors, D};
968cre_AuditReturnParameter([H|_] = D) when is_tuple(H) ->
969    {signalsDescriptor, D}.
970
971cre_AuditDescriptor() ->
972    #'AuditDescriptor'{}.
973
974cre_AuditDescriptor([H|_] = AT) when is_atom(H) ->
975    #'AuditDescriptor'{auditToken = AT};
976cre_AuditDescriptor(APT) ->
977    #'AuditDescriptor'{auditPropertyToken = APT}.
978
979cre_AuditDescriptor(AT, APT) ->
980    #'AuditDescriptor'{auditToken         = AT,
981		       auditPropertyToken = APT}.
982
983cre_IndAuditParameter(D) when is_record(D, 'IndAudMediaDescriptor') ->
984    {indAudMediaDescriptor, D};
985cre_IndAuditParameter(D) when is_record(D, 'IndAudEventsDescriptor') ->
986    {indAudEventsDescriptor, D};
987cre_IndAuditParameter(D) when is_record(D, 'IndAudEventBufferDescriptor') ->
988    {indAudEventBufferDescriptor, D};
989cre_IndAuditParameter({signal, _} = D) ->
990    {indAudSignalsDescriptor, D};
991cre_IndAuditParameter({seqSigList, _} = D) ->
992    {indAudSignalsDescriptor, D};
993cre_IndAuditParameter(D) when is_record(D, 'IndAudDigitMapDescriptor') ->
994    {indAudDigitMapDescriptor, D};
995cre_IndAuditParameter(D) when is_record(D, 'IndAudStatisticsDescriptor') ->
996    {indAudStatisticsDescriptor, D};
997cre_IndAuditParameter(D) when is_record(D, 'IndAudPackagesDescriptor') ->
998    {indAudPackagesDescriptor, D}.
999
1000cre_IndAudMediaDescriptor() ->
1001    #'IndAudMediaDescriptor'{}.
1002
1003cre_IndAudMediaDescriptor(TSD)
1004  when is_record(TSD, 'IndAudTerminationStateDescriptor') ->
1005    #'IndAudMediaDescriptor'{termStateDescr = TSD};
1006cre_IndAudMediaDescriptor(Parms) when is_record(Parms, 'IndAudStreamParms') ->
1007    Streams = {oneStream, Parms},
1008    #'IndAudMediaDescriptor'{streams = Streams};
1009cre_IndAudMediaDescriptor(Descs) when is_list(Descs) ->
1010    Streams = {multiStream, Descs},
1011    #'IndAudMediaDescriptor'{streams = Streams}.
1012
1013cre_IndAudMediaDescriptor(TSD, Parms)
1014  when is_record(TSD, 'IndAudTerminationStateDescriptor') andalso
1015       is_record(Parms, 'IndAudStreamParms') ->
1016    Streams = {oneStream, Parms},
1017    #'IndAudMediaDescriptor'{termStateDescr = TSD,
1018			     streams        = Streams};
1019cre_IndAudMediaDescriptor(TSD, Descs)
1020  when is_record(TSD, 'IndAudTerminationStateDescriptor') andalso is_list(Descs) ->
1021    Streams = {multiStream, Descs},
1022    #'IndAudMediaDescriptor'{termStateDescr = TSD,
1023			     streams        = Streams}.
1024
1025cre_IndAudStreamDescriptor(SID, Parms)
1026  when is_integer(SID) andalso is_record(Parms, 'IndAudStreamParms') ->
1027    #'IndAudStreamDescriptor'{streamID    = SID,
1028			      streamParms = Parms};
1029cre_IndAudStreamDescriptor(SID, Parms) ->
1030    error({invalid_IndAudStreamDescriptor, [SID, Parms]}).
1031
1032cre_IndAudStreamParms() ->
1033    #'IndAudStreamParms'{}.
1034
1035cre_IndAudStreamParms(LCD) when is_record(LCD, 'IndAudLocalControlDescriptor') ->
1036    #'IndAudStreamParms'{localControlDescriptor = LCD};
1037cre_IndAudStreamParms(SD) when is_record(SD, 'IndAudStatisticsDescriptor') ->
1038    #'IndAudStreamParms'{statisticsDescriptor = SD}.
1039
1040cre_IndAudStreamParms(LC, L, R)
1041  when is_record(LC, 'IndAudLocalControlDescriptor') andalso
1042       is_record(L,  'IndAudLocalRemoteDescriptor') andalso
1043       is_record(R,  'IndAudLocalRemoteDescriptor') ->
1044    #'IndAudStreamParms'{localControlDescriptor = LC,
1045			 localDescriptor        = L,
1046			 remoteDescriptor       = R}.
1047
1048cre_IndAudStreamParms(LC, L, R, S)
1049  when is_record(LC, 'IndAudLocalControlDescriptor') andalso
1050       is_record(L,  'IndAudLocalRemoteDescriptor') andalso
1051       is_record(R,  'IndAudLocalRemoteDescriptor') andalso
1052       is_record(S,  'IndAudStatisticsDescriptor') ->
1053    #'IndAudStreamParms'{localControlDescriptor = LC,
1054			 localDescriptor        = L,
1055			 remoteDescriptor       = R,
1056			 statisticsDescriptor   = S}.
1057
1058cre_IndAudLocalControlDescriptor() ->
1059    #'IndAudLocalControlDescriptor'{}.
1060
1061cre_IndAudLocalControlDescriptor(SM, RV, RG, PP)
1062  when ((SM == 'NULL') or (SM == asn1_NOVALUE)) and
1063       ((RV == 'NULL') or (RV == asn1_NOVALUE)) and
1064       ((RG == 'NULL') or (RG == asn1_NOVALUE)) and
1065       (is_list(PP) or (PP == asn1_NOVALUE)) ->
1066    #'IndAudLocalControlDescriptor'{streamMode    = SM,
1067				    reserveValue  = RV,
1068				    reserveGroup  = RG,
1069				    propertyParms = PP};
1070cre_IndAudLocalControlDescriptor(RV, RG, PP, SMS)
1071  when ((RV == 'NULL') or (RV == asn1_NOVALUE)) and
1072       ((RG == 'NULL') or (RG == asn1_NOVALUE)) and
1073       (is_list(PP) or (PP == asn1_NOVALUE))    and
1074       is_atom(SMS) ->
1075    #'IndAudLocalControlDescriptor'{reserveValue  = RV,
1076				    reserveGroup  = RG,
1077				    propertyParms = PP,
1078				    streamModeSel = SMS}.
1079
1080cre_IndAudLocalControlDescriptor(SM, RV, RG, PP, SMS)
1081  when (SM == 'NULL') and
1082       (is_atom(SMS) and (SMS =/= asn1_NOVALUE)) ->
1083    error({invalid_IndAudLocalControlDescriptor, [SM, RV, RG, PP, SMS]});
1084cre_IndAudLocalControlDescriptor(SM, RV, RG, PP, SMS)
1085  when ((SM == 'NULL') or (SM == asn1_NOVALUE)) and
1086       ((RV == 'NULL') or (RV == asn1_NOVALUE)) and
1087       ((RG == 'NULL') or (RG == asn1_NOVALUE)) and
1088       (is_list(PP)    or (PP == asn1_NOVALUE)) and
1089       is_atom(SMS) ->
1090    case is_StreamMode(SMS) of
1091	true ->
1092	    #'IndAudLocalControlDescriptor'{streamMode    = SM,
1093					    reserveValue  = RV,
1094					    reserveGroup  = RG,
1095					    propertyParms = PP,
1096					    streamModeSel = SMS};
1097	false ->
1098	    error({invalid_IndAudLocalControlDescriptor, SMS})
1099    end.
1100
1101cre_IndAudPropertyParm(PkgdName) when is_list(PkgdName) ->
1102    #'IndAudPropertyParm'{name = PkgdName}.
1103
1104cre_IndAudPropertyParm(PkgdName, PP)
1105  when is_list(PkgdName) andalso is_record(PP, 'PropertyParm') ->
1106    #'IndAudPropertyParm'{name = PkgdName, propertyParms = PP}.
1107
1108cre_IndAudLocalRemoteDescriptor(Grps)
1109  when is_list(Grps) ->
1110    #'IndAudLocalRemoteDescriptor'{propGrps = Grps}.
1111
1112cre_IndAudLocalRemoteDescriptor(GID, Grps)
1113  when is_integer(GID) andalso (0 =< GID) andalso (GID =< 65535) andalso is_list(Grps) ->
1114    #'IndAudLocalRemoteDescriptor'{propGroupID = GID,
1115				   propGrps    = Grps}.
1116
1117cre_IndAudPropertyGroup([]) ->
1118    [];
1119cre_IndAudPropertyGroup([H|_] = PG)
1120  when is_record(H, 'IndAudPropertyParm') ->
1121    PG.
1122
1123cre_IndAudTerminationStateDescriptor([] = PP) ->
1124    #'IndAudTerminationStateDescriptor'{propertyParms = PP};
1125cre_IndAudTerminationStateDescriptor([H|_] = PP)
1126  when is_record(H, 'IndAudPropertyParm') ->
1127    #'IndAudTerminationStateDescriptor'{propertyParms = PP}.
1128
1129cre_IndAudTerminationStateDescriptor([] = PP, EBC, SS)
1130  when ((EBC == 'NULL') or (EBC == asn1_NOVALUE)) and
1131       ((SS  == 'NULL') or (SS  == asn1_NOVALUE)) ->
1132    #'IndAudTerminationStateDescriptor'{propertyParms      = PP,
1133					eventBufferControl = EBC,
1134					serviceState       = SS};
1135cre_IndAudTerminationStateDescriptor([H|_] = PP, EBC, SS)
1136  when is_record(H, 'IndAudPropertyParm') andalso
1137       ((EBC =:= 'NULL') orelse (EBC =:= asn1_NOVALUE)) andalso
1138       ((SS  =:= 'NULL') orelse (SS  =:= asn1_NOVALUE)) ->
1139    #'IndAudTerminationStateDescriptor'{propertyParms      = PP,
1140					eventBufferControl = EBC,
1141					serviceState       = SS}.
1142
1143cre_IndAudTerminationStateDescriptor(PP, EBC, SS, SSS)
1144  when (SS  =:= 'NULL') andalso
1145       ((is_atom(SSS) andalso (SSS =/= asn1_NOVALUE))) ->
1146    error({invalid_IndAudTerminationStateDescriptor, [PP, EBC, SS, SSS]});
1147cre_IndAudTerminationStateDescriptor([] = PP, EBC, SS, SSS)
1148  when ((EBC =:= 'NULL') orelse (EBC =:= asn1_NOVALUE)) andalso
1149       ((SS  =:= 'NULL') orelse (SS  =:= asn1_NOVALUE)) andalso
1150       is_atom(SSS) ->
1151    #'IndAudTerminationStateDescriptor'{propertyParms      = PP,
1152					eventBufferControl = EBC,
1153					serviceState       = SS,
1154					serviceStateSel    = SSS};
1155cre_IndAudTerminationStateDescriptor([H|_] = PP, EBC, SS, SSS)
1156  when is_record(H, 'IndAudPropertyParm') and
1157       ((EBC =:= 'NULL') orelse (EBC =:= asn1_NOVALUE)) andalso
1158       ((SS  =:= 'NULL') orelse (SS  =:= asn1_NOVALUE)) andalso
1159       is_atom(SSS) ->
1160    #'IndAudTerminationStateDescriptor'{propertyParms      = PP,
1161					eventBufferControl = EBC,
1162					serviceState       = SS,
1163					serviceStateSel    = SSS}.
1164
1165cre_IndAudEventsDescriptor(PkgdName)
1166  when is_list(PkgdName) ->
1167    #'IndAudEventsDescriptor'{pkgdName = PkgdName}.
1168
1169cre_IndAudEventsDescriptor(RID, PkgdName)
1170  when is_integer(RID) andalso is_list(PkgdName) ->
1171    #'IndAudEventsDescriptor'{requestID = RID, pkgdName = PkgdName};
1172cre_IndAudEventsDescriptor(PkgdName, SID)
1173  when is_list(PkgdName) andalso is_integer(SID) ->
1174    #'IndAudEventsDescriptor'{pkgdName = PkgdName, streamID = SID}.
1175
1176cre_IndAudEventsDescriptor(RID, PkgdName, SID)
1177  when is_integer(RID) andalso is_list(PkgdName) andalso is_integer(SID)  ->
1178    #'IndAudEventsDescriptor'{requestID = RID,
1179			      pkgdName  = PkgdName,
1180			      streamID  = SID}.
1181
1182cre_IndAudEventBufferDescriptor(EventName) when is_list(EventName) ->
1183    #'IndAudEventBufferDescriptor'{eventName = EventName}.
1184
1185cre_IndAudEventBufferDescriptor(EventName, SID)
1186  when is_list(EventName) andalso is_integer(SID)  ->
1187    #'IndAudEventBufferDescriptor'{eventName = EventName, streamID = SID}.
1188
1189cre_IndAudSignalsDescriptor(S) when is_record(S, 'IndAudSignal') ->
1190    {signal, S};
1191cre_IndAudSignalsDescriptor(S) when is_record(S, 'IndAudSeqSigList') ->
1192    {seqSigList, S}.
1193
1194cre_IndAudSeqSigList(ID) when is_integer(ID) andalso (0=< ID) andalso (ID =< 65535) ->
1195    #'IndAudSeqSigList'{id = ID}.
1196
1197cre_IndAudSeqSigList(ID, S)
1198  when is_integer(ID) andalso (0=< ID) andalso (ID =< 65535) andalso is_record(S, 'IndAudSignal') ->
1199    #'IndAudSeqSigList'{id = ID, signalList = S}.
1200
1201cre_IndAudSignal(SigName) when is_list(SigName) ->
1202    #'IndAudSignal'{signalName = SigName}.
1203
1204cre_IndAudSignal(SigName, RID)
1205  when is_list(SigName) andalso is_integer(RID) ->
1206    #'IndAudSignal'{signalName      = SigName,
1207		    signalRequestID = RID}.
1208
1209cre_IndAudDigitMapDescriptor() ->
1210    #'IndAudDigitMapDescriptor'{}.
1211
1212cre_IndAudDigitMapDescriptor(DMN) when is_list(DMN) ->
1213    #'IndAudDigitMapDescriptor'{digitMapName = DMN}.
1214
1215cre_IndAudStatisticsDescriptor(StatName) when is_list(StatName) ->
1216    #'IndAudStatisticsDescriptor'{statName = StatName}.
1217
1218cre_IndAudPackagesDescriptor(N, V)
1219  when is_list(N) andalso is_integer(V) andalso (0 =< V) andalso (V =< 99) ->
1220    #'IndAudPackagesDescriptor'{packageName    = N,
1221				packageVersion = V}.
1222
1223cre_NotifyRequest(TermIDs, D)
1224  when is_list(TermIDs) andalso is_record(D, 'ObservedEventsDescriptor') ->
1225    #'NotifyRequest'{terminationID            = TermIDs,
1226		     observedEventsDescriptor = D}.
1227
1228cre_NotifyRequest(TermIDs, D, ED)
1229  when is_list(TermIDs) andalso is_record(D, 'ObservedEventsDescriptor') andalso is_record(ED, 'ErrorDescriptor') ->
1230    #'NotifyRequest'{terminationID            = TermIDs,
1231		     observedEventsDescriptor = D,
1232		     errorDescriptor          = ED}.
1233
1234cre_NotifyReply(TermIDs) when is_list(TermIDs) ->
1235    #'NotifyReply'{terminationID = TermIDs}.
1236
1237cre_NotifyReply(TermIDs, ED)
1238  when is_list(TermIDs) andalso is_record(ED, 'ErrorDescriptor') ->
1239    #'NotifyReply'{terminationID   = TermIDs,
1240		   errorDescriptor = ED}.
1241
1242cre_ObservedEventsDescriptor(RID, [H|_] = L)
1243  when is_integer(RID) andalso is_record(H, 'ObservedEvent') ->
1244    #'ObservedEventsDescriptor'{requestId        = RID,
1245				observedEventLst = L}.
1246
1247cre_ObservedEvent(EN, EPL) when is_list(EN) andalso is_list(EPL) ->
1248    #'ObservedEvent'{eventName    = EN,
1249		     eventParList = EPL};
1250cre_ObservedEvent(EN, TN) when is_list(EN) andalso is_record(TN, 'TimeNotation') ->
1251    #'ObservedEvent'{eventName    = EN,
1252		     timeNotation = TN}.
1253
1254cre_ObservedEvent(EN, SID, EPL) when is_list(EN) andalso is_integer(SID) andalso is_list(EPL) ->
1255    #'ObservedEvent'{eventName    = EN,
1256		     streamID     = SID,
1257		     eventParList = EPL};
1258cre_ObservedEvent(EN, EPL, TN)
1259  when is_list(EN) andalso is_list(EPL) andalso is_record(TN, 'TimeNotation') ->
1260    #'ObservedEvent'{eventName    = EN,
1261		     eventParList = EPL,
1262		     timeNotation = TN}.
1263
1264cre_ObservedEvent(EN, SID, EPL, TN)
1265  when is_list(EN) andalso is_integer(SID) andalso is_list(EPL) andalso is_record(TN, 'TimeNotation') ->
1266    #'ObservedEvent'{eventName    = EN,
1267		     streamID     = SID,
1268		     eventParList = EPL,
1269		     timeNotation = TN}.
1270
1271cre_EventName(N) when is_list(N) ->
1272    N.
1273
1274cre_EventParameter(N, V) when is_list(N) andalso is_list(V) ->
1275    #'EventParameter'{eventParameterName = N,
1276		      value              = V}.
1277
1278cre_EventParameter(N, V, relation = Tag, R)
1279  when is_list(N) andalso is_list(V) andalso is_atom(R) ->
1280    EI = {Tag, R},
1281    #'EventParameter'{eventParameterName = N,
1282		      value              = V,
1283		      extraInfo          = EI};
1284cre_EventParameter(N, V, range = Tag, B)
1285  when is_list(N) andalso is_list(V) andalso is_atom(B) ->
1286    EI = {Tag, B},
1287    #'EventParameter'{eventParameterName = N,
1288		      value              = V,
1289		      extraInfo          = EI};
1290cre_EventParameter(N, V, sublist = Tag, B)
1291  when is_list(N) andalso is_list(V) andalso is_atom(B) ->
1292    EI = {Tag, B},
1293    #'EventParameter'{eventParameterName = N,
1294		      value              = V,
1295		      extraInfo          = EI}.
1296
1297cre_ServiceChangeRequest(TermIDs, SCP)
1298  when is_list(TermIDs) andalso is_record(SCP, 'ServiceChangeParm') ->
1299    #'ServiceChangeRequest'{terminationID      = TermIDs,
1300			    serviceChangeParms = SCP}.
1301
1302cre_ServiceChangeReply(TermIDs, {Tag, R} = SCR)
1303  when is_list(TermIDs) andalso is_atom(Tag) andalso is_tuple(R) ->
1304    #'ServiceChangeReply'{terminationID       = TermIDs,
1305			  serviceChangeResult = SCR}.
1306
1307cre_ServiceChangeResult(ED) when is_record(ED, 'ErrorDescriptor') ->
1308    {errorDescriptor, ED};
1309cre_ServiceChangeResult(SCRP) when is_record(SCRP, 'ServiceChangeResParm') ->
1310    {serviceChangeResParms, SCRP}.
1311
1312%% cre_WildcardField(L) when list(L), length(L) == 1 -> L.
1313
1314cre_TerminationID(W, ID)
1315  when is_list(W) andalso is_list(ID) andalso (1 =< length(ID)) andalso (length(ID) =< 8) ->
1316    #'TerminationID'{wildcard = W,
1317		     id       = ID}.
1318
1319cre_TerminationIDList(L) when is_list(L) ->
1320    L.
1321
1322cre_MediaDescriptor() ->
1323    #'MediaDescriptor'{}.
1324
1325cre_MediaDescriptor(TSD) when is_record(TSD, 'TerminationStateDescriptor') ->
1326    #'MediaDescriptor'{termStateDescr = TSD};
1327cre_MediaDescriptor(SP) when is_record(SP, 'StreamParms') ->
1328    Streams = {oneStream, SP},
1329    #'MediaDescriptor'{streams = Streams};
1330cre_MediaDescriptor([H|_] = SDs) when is_record(H, 'StreamDescriptor') ->
1331    Streams = {multiStream, SDs},
1332    #'MediaDescriptor'{streams = Streams}.
1333
1334cre_MediaDescriptor(TSD, SP)
1335  when is_record(TSD, 'TerminationStateDescriptor') andalso
1336       is_record(SP, 'StreamParms') ->
1337    Streams = {oneStream, SP},
1338    #'MediaDescriptor'{termStateDescr = TSD,
1339		       streams        = Streams};
1340cre_MediaDescriptor(TSD, [H|_] = SDs)
1341  when is_record(TSD, 'TerminationStateDescriptor') andalso
1342       is_record(H, 'StreamDescriptor') ->
1343    Streams = {multiStream, SDs},
1344    #'MediaDescriptor'{termStateDescr = TSD,
1345		       streams        = Streams}.
1346
1347cre_StreamDescriptor(SID, SP) when is_integer(SID) andalso is_record(SP, 'StreamParms') ->
1348    #'StreamDescriptor'{streamID    = SID,
1349			streamParms = SP}.
1350
1351cre_StreamParms() ->
1352    #'StreamParms'{}.
1353
1354cre_StreamParms(LCD) when is_record(LCD, 'LocalControlDescriptor') ->
1355    #'StreamParms'{localControlDescriptor = LCD};
1356cre_StreamParms(LD) when is_record(LD, 'LocalRemoteDescriptor') ->
1357    #'StreamParms'{localDescriptor = LD};
1358cre_StreamParms(SD) when is_list(SD) ->
1359    #'StreamParms'{statisticsDescriptor = SD}.
1360
1361cre_StreamParms(LCD, LD)
1362  when (is_record(LCD, 'LocalControlDescriptor') or (LCD == asn1_NOVALUE)) and
1363       (is_record(LD,  'LocalRemoteDescriptor')  or (LD  == asn1_NOVALUE)) ->
1364    #'StreamParms'{localControlDescriptor = LCD,
1365		   localDescriptor        = LD}.
1366
1367cre_StreamParms(LCD, LD, RD)
1368  when (is_record(LCD, 'LocalControlDescriptor') or (LCD == asn1_NOVALUE)) and
1369       (is_record(LD,  'LocalRemoteDescriptor')  or (LD  == asn1_NOVALUE)) and
1370       (is_record(RD,  'LocalRemoteDescriptor')  or (RD  == asn1_NOVALUE)) ->
1371    #'StreamParms'{localControlDescriptor = LCD,
1372		   localDescriptor        = LD,
1373		   remoteDescriptor       = RD};
1374cre_StreamParms(LCD, LD, SD)
1375  when (is_record(LCD, 'LocalControlDescriptor') or (LCD == asn1_NOVALUE)) and
1376       (is_record(LD,  'LocalRemoteDescriptor')  or (LD  == asn1_NOVALUE)) and
1377       (is_list(SD) or (SD == asn1_NOVALUE)) ->
1378    #'StreamParms'{localControlDescriptor = LCD,
1379		   localDescriptor        = LD,
1380		   statisticsDescriptor   = SD}.
1381
1382cre_StreamParms(LCD, LD, RD, SD)
1383  when (is_record(LCD, 'LocalControlDescriptor') or (LCD == asn1_NOVALUE)) and
1384       (is_record(LD,  'LocalRemoteDescriptor')  or (LD  == asn1_NOVALUE)) and
1385       (is_record(RD,  'LocalRemoteDescriptor')  or (RD  == asn1_NOVALUE)) and
1386       (is_list(SD) or (SD == asn1_NOVALUE)) ->
1387    #'StreamParms'{localControlDescriptor = LCD,
1388		   localDescriptor        = LD,
1389		   remoteDescriptor       = RD,
1390		   statisticsDescriptor   = SD}.
1391
1392cre_LocalControlDescriptor(SM) when is_atom(SM) ->
1393    #'LocalControlDescriptor'{streamMode = SM, propertyParms = []};
1394cre_LocalControlDescriptor([H|_] = PP) when is_record(H, 'PropertyParm') ->
1395    #'LocalControlDescriptor'{propertyParms = PP}.
1396
1397cre_LocalControlDescriptor(SM, [H|_] = PP)
1398  when is_atom(SM) andalso is_record(H, 'PropertyParm') ->
1399    #'LocalControlDescriptor'{streamMode    = SM,
1400			      propertyParms = PP}.
1401
1402cre_LocalControlDescriptor(SM, RV, RG, [H|_] = PP)
1403  when is_atom(SM) andalso
1404     ((RV =:= true) orelse (RV =:= false) orelse (RV =:= asn1_NOVALUE)) andalso
1405     ((RG =:= true) orelse (RG =:= false) orelse (RG =:= asn1_NOVALUE)) andalso
1406     is_record(H, 'PropertyParm') ->
1407    #'LocalControlDescriptor'{streamMode    = SM,
1408			      reserveValue  = RV,
1409			      reserveGroup  = RG,
1410			      propertyParms = PP}.
1411
1412cre_StreamMode(sendOnly = M) ->
1413    M;
1414cre_StreamMode(recvOnly = M) ->
1415    M;
1416cre_StreamMode(sendRecv = M) ->
1417    M;
1418cre_StreamMode(inactive = M) ->
1419    M;
1420cre_StreamMode(loopBack = M) ->
1421    M.
1422
1423cre_PropertyParm(N, [H|_] = V) when is_list(N) andalso is_list(H) ->
1424    #'PropertyParm'{name = N, value = V}.
1425
1426cre_PropertyParm(N, [H|_] = V, relation = Tag, R)
1427  when is_list(N) andalso is_list(H) andalso is_atom(R) ->
1428    EI = {Tag, R},
1429    #'PropertyParm'{name = N, value = V, extraInfo = EI};
1430cre_PropertyParm(N, [H|_] = V, range = Tag, B)
1431  when is_list(N) andalso is_list(H) andalso is_atom(B) ->
1432    EI = {Tag, B},
1433    #'PropertyParm'{name = N, value = V, extraInfo = EI};
1434cre_PropertyParm(N, [H|_] = V, sublist = Tag, B)
1435  when is_list(N) andalso is_list(H) andalso is_atom(B) ->
1436    EI = {Tag, B},
1437    #'PropertyParm'{name = N, value = V, extraInfo = EI}.
1438
1439
1440cre_Name(N) when is_list(N) andalso (length(N) == 2) ->
1441    N.
1442
1443cre_PkgdName(N) when is_list(N) ->
1444    case string:tokens(N, [$\\]) of
1445	[_PkgName, _ItemID] ->
1446	    N;
1447	_ ->
1448	    error({invalid_PkgdName, N})
1449    end.
1450cre_PkgdName(root, root) ->
1451    "*/*";
1452cre_PkgdName(PackageName, root)
1453  when is_list(PackageName) andalso (length(PackageName) =< 64) ->
1454    PackageName ++ "/*";
1455cre_PkgdName(PackageName, ItemID)
1456  when ((is_list(PackageName) andalso (length(PackageName) =< 64)) andalso
1457	(is_list(ItemID)      andalso (length(ItemID) =< 64))) ->
1458    PackageName ++ "/" ++ ItemID;
1459cre_PkgdName(PackageName, ItemID) ->
1460    error({invalid_PkgdName, {PackageName, ItemID}}).
1461
1462cre_Relation(greaterThan = R) ->
1463    R;
1464cre_Relation(smallerThan = R) ->
1465    R;
1466cre_Relation(unequalTo = R) ->
1467    R.
1468
1469cre_LocalRemoteDescriptor([H|_] = PGs) when is_list(H) ->
1470    #'LocalRemoteDescriptor'{propGrps = PGs}.
1471
1472cre_PropertyGroup([H|_] = PG) when is_record(H, 'PropertyParm') ->
1473    PG.
1474
1475cre_TerminationStateDescriptor([H|_] = PPs) when is_record(H, 'PropertyParm') ->
1476    #'TerminationStateDescriptor'{propertyParms = PPs}.
1477
1478cre_TerminationStateDescriptor([H|_] = PPs, off = EBC)
1479  when is_record(H, 'PropertyParm') ->
1480    #'TerminationStateDescriptor'{propertyParms      = PPs,
1481				  eventBufferControl = EBC};
1482cre_TerminationStateDescriptor([H|_] = PPs, lockStep = EBC)
1483  when is_record(H, 'PropertyParm') ->
1484    #'TerminationStateDescriptor'{propertyParms      = PPs,
1485				  eventBufferControl = EBC};
1486cre_TerminationStateDescriptor([H|_] = PPs, test = SS)
1487  when is_record(H, 'PropertyParm') ->
1488    #'TerminationStateDescriptor'{propertyParms = PPs,
1489				  serviceState  = SS};
1490cre_TerminationStateDescriptor([H|_] = PPs, outOfSvc = SS)
1491  when is_record(H, 'PropertyParm') ->
1492    #'TerminationStateDescriptor'{propertyParms = PPs,
1493				  serviceState  = SS};
1494cre_TerminationStateDescriptor([H|_] = PPs, inSvc = SS)
1495  when is_record(H, 'PropertyParm') ->
1496    #'TerminationStateDescriptor'{propertyParms = PPs,
1497				  serviceState  = SS}.
1498
1499cre_TerminationStateDescriptor([H|_] = PPs, EMC, SS)
1500  when is_record(H, 'PropertyParm') andalso
1501       ((EMC =:= off)  orelse (EMC =:= lockStep)) andalso
1502       ((SS  =:= test) orelse (SS  =:= outOfSvc) orelse (SS =:= inSvc)) ->
1503    #'TerminationStateDescriptor'{propertyParms      = PPs,
1504				  eventBufferControl = EMC,
1505				  serviceState       = SS}.
1506
1507cre_EventBufferControl(off = EBC) ->
1508    EBC;
1509cre_EventBufferControl(lockStep = EBC) ->
1510    EBC.
1511
1512cre_ServiceState(test = SS) ->
1513    SS;
1514cre_ServiceState(outOfSvc = SS) ->
1515    SS;
1516cre_ServiceState(inSvc = SS) ->
1517    SS.
1518
1519cre_MuxDescriptor(MT, [H|_] = TL)
1520  when is_atom(MT) andalso is_record(H, 'TerminationID') ->
1521    #'MuxDescriptor'{muxType = MT, termList = TL}.
1522
1523%% cre_MuxDescriptor(MT, [H|_] = TL, NSD)
1524%%   when atom(MT), record(H, 'TerminationID'), record(NSD, 'NonStandardData') ->
1525%%     #'MuxDescriptor'{muxType = MT, termList = TL, nonStandardData = NSD}.
1526
1527cre_MuxType(h221 = MT) ->
1528    MT;
1529cre_MuxType(h223 = MT) ->
1530    MT;
1531cre_MuxType(h226 = MT) ->
1532    MT;
1533cre_MuxType(v76 = MT) ->
1534    MT;
1535cre_MuxType(nx64k = MT) ->
1536    MT.
1537
1538cre_StreamID(Val) when 0 =< Val, Val =< 65535 ->
1539    Val;
1540cre_StreamID(Val) ->
1541    exit({invalid_ContextID, Val}).
1542
1543%% RequestID must be present if eventList is non empty
1544cre_EventsDescriptor() ->
1545    #'EventsDescriptor'{eventList = []}.
1546
1547cre_EventsDescriptor(RID, [H|_] = EL)
1548  when is_integer(RID) andalso is_record(H, 'RequestedEvent') ->
1549    #'EventsDescriptor'{requestID = RID, eventList = EL}.
1550
1551cre_RequestedEvent(N) ->
1552    #'RequestedEvent'{pkgdName = N}.
1553
1554cre_RequestedEvent(N, EPL)
1555  when is_list(N) andalso is_list(EPL) ->
1556    #'RequestedEvent'{pkgdName  = N,
1557		      evParList = EPL};
1558cre_RequestedEvent(N, EA)
1559  when is_list(N) andalso is_record(EA, 'RequestedActions')->
1560    #'RequestedEvent'{pkgdName    = N,
1561		      eventAction = EA}.
1562
1563
1564cre_RequestedEvent(N, SID, EPL)
1565  when is_list(N) and is_integer(SID) and is_list(EPL) ->
1566    #'RequestedEvent'{pkgdName  = N,
1567		      streamID  = SID,
1568		      evParList = EPL};
1569cre_RequestedEvent(N, EA, EPL)
1570  when is_list(N) and is_record(EA, 'RequestedActions') and is_list(EPL) ->
1571    #'RequestedEvent'{pkgdName     = N,
1572		      eventAction  = EA,
1573		      evParList    = EPL}.
1574
1575cre_RequestedEvent(N, SID, EA, EPL)
1576  when is_list(N) and
1577       is_integer(SID) and
1578       is_record(EA, 'RequestedActions') and
1579       is_list(EPL) ->
1580    #'RequestedEvent'{pkgdName     = N,
1581		      streamID     = SID,
1582		      eventAction  = EA,
1583		      evParList    = EPL}.
1584
1585cre_RegulatedEmbeddedDescriptor() ->
1586    #'RegulatedEmbeddedDescriptor'{}.
1587
1588cre_RegulatedEmbeddedDescriptor(D) ->
1589    case is_SecondEventsDescriptor(D) of
1590	true ->
1591	    #'RegulatedEmbeddedDescriptor'{secondEvent = D};
1592	false ->
1593	    case is_SignalsDescriptor(D) of
1594		true ->
1595		    #'RegulatedEmbeddedDescriptor'{signalsDescriptor = D};
1596		false ->
1597		    error({invalid_RegulatedEmbeddedDescriptor, D})
1598	    end
1599    end.
1600
1601cre_RegulatedEmbeddedDescriptor(SED, SD)
1602  when ((SED == asn1_NOVALUE) or is_record(SED, 'SecondEventsDescriptor')) and
1603       ((SD  == asn1_NOVALUE) or is_list(SD)) ->
1604    #'RegulatedEmbeddedDescriptor'{secondEvent       = SED,
1605				   signalsDescriptor = SD}.
1606
1607cre_NotifyBehaviour(notifyImmediate = Tag, 'NULL' = Val) ->
1608    {Tag, Val};
1609cre_NotifyBehaviour(notifyRegulated = Tag, Val)
1610  when is_record(Val, 'RegulatedEmbeddedDescriptor') ->
1611    {Tag, Val};
1612cre_NotifyBehaviour(neverNotify = Tag, 'NULL' = Val) ->
1613    {Tag, Val};
1614cre_NotifyBehaviour(Tag, Val) ->
1615    error({invalid_NotifyBehaviour, [Tag, Val]}).
1616
1617cre_RequestedActions() ->
1618    #'RequestedActions'{}.
1619
1620cre_RequestedActions(KA)
1621  when (KA == true) or (KA == true) ->
1622    #'RequestedActions'{keepActive = KA};
1623cre_RequestedActions(SE)
1624  when is_record(SE, 'SecondEventsDescriptor') ->
1625    #'RequestedActions'{secondEvent = SE};
1626cre_RequestedActions(SD)
1627  when is_list(SD) ->
1628    #'RequestedActions'{signalsDescriptor = SD};
1629cre_RequestedActions({Tag, _} = EDM)
1630  when is_atom(Tag) ->
1631    #'RequestedActions'{eventDM = EDM}.
1632
1633cre_RequestedActions(KA, {Tag, _} = EDM, SE, SD)
1634  when ((KA == true) or (KA == true) or (KA == asn1_NOVALUE)) and
1635       (is_atom(Tag) or (EDM == asn1_NOVALUE)) and
1636       (is_record(SE, 'SecondEventsDescriptor') or (SE == asn1_NOVALUE)) and
1637       (is_list(SD) or (SD == asn1_NOVALUE)) ->
1638    #'RequestedActions'{keepActive        = KA,
1639			eventDM           = EDM,
1640			secondEvent       = SE,
1641			signalsDescriptor = SD}.
1642
1643cre_RequestedActions(KA, {EDMTag, _} = EDM, SE, SD, {NBTag, _} = NB, RED)
1644  when ((KA == true) or (KA == true) or (KA == asn1_NOVALUE)) and
1645       (is_atom(EDMTag) or (EDM == asn1_NOVALUE)) and
1646       (is_record(SE, 'SecondEventsDescriptor') or (SE == asn1_NOVALUE)) and
1647       (is_list(SD) or (SD == asn1_NOVALUE)) and
1648       (is_atom(NBTag) or (NB == asn1_NOVALUE)) and
1649       ((RED == 'NULL') or (RED == asn1_NOVALUE))  ->
1650    #'RequestedActions'{keepActive            = KA,
1651			eventDM               = EDM,
1652			secondEvent           = SE,
1653			signalsDescriptor     = SD,
1654			notifyBehaviour       = NB,
1655			resetEventsDescriptor = RED}.
1656
1657cre_EventDM(N) when is_list(N) ->
1658    {digitMapName, N};
1659cre_EventDM(V) when is_record(V, 'DigitMapValue') ->
1660    {digitMapValue, V}.
1661
1662cre_SecondEventsDescriptor([H|_] = EL)
1663  when is_record(H, 'SecondRequestedEvent') ->
1664    #'SecondEventsDescriptor'{eventList = EL}.
1665
1666cre_SecondEventsDescriptor(RID, [H|_] = EL)
1667  when is_integer(RID) andalso is_record(H, 'SecondRequestedEvent') ->
1668    #'SecondEventsDescriptor'{requestID = RID, eventList = EL}.
1669
1670cre_SecondRequestedEvent(N, EPL)
1671  when is_list(N) andalso is_list(EPL) ->
1672    #'SecondRequestedEvent'{pkgdName  = N,
1673			    evParList = EPL};
1674cre_SecondRequestedEvent(N, EPL) ->
1675    error({invalid_SecondRequestedEvent, [N, EPL]}).
1676
1677cre_SecondRequestedEvent(N, SID, EPL)
1678  when is_list(N) andalso is_integer(SID) andalso is_list(EPL) ->
1679    #'SecondRequestedEvent'{pkgdName  = N,
1680			    streamID  = SID,
1681			    evParList = EPL};
1682cre_SecondRequestedEvent(N, EA, EPL)
1683  when is_list(N) andalso
1684       is_record(EA, 'SecondRequestedActions') andalso
1685       is_list(EPL) ->
1686    #'SecondRequestedEvent'{pkgdName     = N,
1687			    eventAction  = EA,
1688			    evParList    = EPL}.
1689
1690cre_SecondRequestedEvent(N, SID, EA, EPL)
1691  when is_list(N) andalso
1692       is_integer(SID) andalso
1693       is_record(EA, 'SecondRequestedActions') andalso
1694       is_list(EPL) ->
1695    #'SecondRequestedEvent'{pkgdName     = N,
1696			    streamID     = SID,
1697			    eventAction  = EA,
1698			    evParList    = EPL}.
1699
1700cre_SecondRequestedActions() ->
1701    #'SecondRequestedActions'{}.
1702
1703cre_SecondRequestedActions(KA)
1704  when ((KA == true) or (KA == false) or (KA == asn1_NOVALUE)) ->
1705    #'SecondRequestedActions'{keepActive = KA};
1706cre_SecondRequestedActions(SD) when is_list(SD) ->
1707    #'SecondRequestedActions'{signalsDescriptor = SD};
1708cre_SecondRequestedActions({Tag, _} = Val) when is_atom(Tag) ->
1709    case is_EventDM(Val) of
1710	true ->
1711	    #'SecondRequestedActions'{eventDM = Val};
1712	false ->
1713	    case is_NotifyBehaviour(Val) of
1714		true ->
1715		    #'SecondRequestedActions'{notifyBehaviour = Val};
1716		false ->
1717		    error({invalid_SecondRequestedActions, Val})
1718	    end
1719    end;
1720cre_SecondRequestedActions('NULL' = RED) ->
1721    #'SecondRequestedActions'{resetEventsDescriptor = RED}.
1722
1723cre_SecondRequestedActions(KA, SD)
1724  when ((KA == true) or (KA == false) or (KA == asn1_NOVALUE)) and
1725       is_list(SD) ->
1726    #'SecondRequestedActions'{keepActive = KA, signalsDescriptor = SD};
1727cre_SecondRequestedActions(KA, {Tag, _} = Val)
1728  when ((KA == true) or (KA == false) or (KA == asn1_NOVALUE)) and
1729       is_atom(Tag) ->
1730    case is_EventDM(Val) of
1731	true ->
1732	    #'SecondRequestedActions'{keepActive = KA,
1733				      eventDM    = Val};
1734	false ->
1735	    case is_NotifyBehaviour(Val) of
1736		true ->
1737		    #'SecondRequestedActions'{keepActive      = KA,
1738					      notifyBehaviour = Val};
1739		false ->
1740		    error({invalid_SecondRequestedActions, Val})
1741	    end
1742    end;
1743cre_SecondRequestedActions(KA, 'NULL' = RED)
1744  when ((KA == true) or (KA == false) or (KA == asn1_NOVALUE)) ->
1745    #'SecondRequestedActions'{keepActive            = KA,
1746			      resetEventsDescriptor = RED}.
1747
1748cre_SecondRequestedActions(KA, {Tag, _} = EDM, SD)
1749  when ((KA == true) or (KA == false) or (KA == asn1_NOVALUE)) and
1750       is_atom(Tag) and
1751       is_list(SD) ->
1752    #'SecondRequestedActions'{keepActive        = KA,
1753			      eventDM           = EDM,
1754			      signalsDescriptor = SD};
1755cre_SecondRequestedActions(KA, SD, {Tag, _} = NB)
1756  when ((KA == true) or (KA == false) or (KA == asn1_NOVALUE)) and
1757       is_list(SD) and
1758       is_atom(Tag) ->
1759    #'SecondRequestedActions'{keepActive        = KA,
1760			      signalsDescriptor = SD,
1761			      notifyBehaviour   = NB};
1762cre_SecondRequestedActions(KA, SD, 'NULL' = RED)
1763  when ((KA == true) or (KA == false) or (KA == asn1_NOVALUE)) and
1764       is_list(SD) ->
1765    #'SecondRequestedActions'{keepActive            = KA,
1766			      signalsDescriptor     = SD,
1767			      resetEventsDescriptor = RED}.
1768
1769cre_SecondRequestedActions(KA, {EDMTag, _} = EDM, SD,
1770			   {NBTag, _} = NB, RED)
1771  when ((KA == true) or (KA == false) or (KA == asn1_NOVALUE)) and
1772       (is_atom(EDMTag) or (EDM == asn1_NOVALUE)) and
1773       (is_list(SD) or (SD == asn1_NOVALUE)) and
1774       (is_atom(NBTag) or (NB == asn1_NOVALUE)) and
1775       ((RED == 'NULL') or (RED == asn1_NOVALUE)) ->
1776    #'SecondRequestedActions'{keepActive            = KA,
1777			      eventDM               = EDM,
1778			      signalsDescriptor     = SD,
1779			      notifyBehaviour       = NB,
1780			      resetEventsDescriptor = RED}.
1781
1782cre_EventBufferDescriptor([H|_] = D) when is_record(H, 'EventSpec') ->
1783    D.
1784
1785cre_EventSpec(N, [H|_] = EPL) when is_list(N) andalso is_record(H, 'EventParameter') ->
1786    #'EventSpec'{eventName = N, eventParList = EPL}.
1787
1788cre_EventSpec(N, SID, [H|_] = EPL)
1789  when is_list(N) andalso is_integer(SID) andalso is_record(H, 'EventParameter') ->
1790    #'EventSpec'{eventName = N, streamID = SID, eventParList = EPL}.
1791
1792cre_SignalsDescriptor(D) ->
1793    case is_SignalsDescriptor(D) of
1794	true ->
1795	    D;
1796	false ->
1797	    error({invalid_SignalsDescriptor, D})
1798    end.
1799
1800cre_SignalRequest(S) when is_record(S, 'Signal') ->
1801    {signal, S};
1802cre_SignalRequest(S) when is_record(S, 'SeqSigList') ->
1803    {seqSigList, S}.
1804
1805cre_SeqSigList(ID, [H|_] = SL)
1806  when is_integer(ID) andalso (0 =< ID) andalso (ID =< 65535) andalso is_record(H, 'Signal') ->
1807    #'SeqSigList'{id = ID, signalList = SL}.
1808
1809cre_Signal(N) when is_list(N) ->
1810    #'Signal'{signalName = N}.
1811
1812cre_Signal(N, SPL) when is_list(N) andalso is_list(SPL) ->
1813    #'Signal'{signalName = N,
1814	      sigParList = SPL}.
1815
1816cre_Signal(N, SID, ST, Dur, NC, KA, SPL)
1817  when is_list(N) and
1818       (is_integer(SID) or (SID == asn1_NOVALUE)) and
1819       ((ST == brief) or (ST == onOff) or (ST == timeOut) or
1820	(ST == asn1_NOVALUE)) and
1821       ((is_integer(Dur) and (0 =< Dur) and (Dur =< 65535)) or
1822	(Dur == asn1_NOVALUE)) and
1823       (is_list(NC) or (NC == asn1_NOVALUE)) and
1824       ((KA == true) or (KA == false) or (KA == asn1_NOVALUE)) and
1825       is_list(SPL) ->
1826    #'Signal'{signalName       = N,
1827	      streamID         = SID,
1828	      sigType          = ST,
1829	      duration         = Dur,
1830	      notifyCompletion = NC,
1831	      keepActive       = KA,
1832	      sigParList       = SPL}.
1833
1834cre_Signal(N, SID, ST, Dur, NC, KA, SPL, Dir, RID)
1835  when is_list(N) and
1836       (is_integer(SID) or (SID == asn1_NOVALUE)) and
1837       ((ST == brief) or (ST == onOff) or (ST == timeOut) or
1838	(ST == asn1_NOVALUE)) and
1839       ((is_integer(Dur) and (0 =< Dur) and (Dur =< 65535)) or
1840	(Dur == asn1_NOVALUE)) and
1841       (is_list(NC) or (NC == asn1_NOVALUE)) and
1842       ((KA == true) or (KA == false) or (KA == asn1_NOVALUE)) and
1843       is_list(SPL) and
1844       ((Dir == internal) or (Dir == external) or (Dir == both) or
1845	(Dir == asn1_NOVALUE)) and
1846       (is_integer(RID) or (RID == asn1_NOVALUE)) ->
1847    #'Signal'{signalName       = N,
1848	      streamID         = SID,
1849	      sigType          = ST,
1850	      duration         = Dur,
1851	      notifyCompletion = NC,
1852	      keepActive       = KA,
1853	      sigParList       = SPL,
1854	      direction        = Dir,
1855	      requestID        = RID}.
1856
1857cre_Signal(N, SID, ST, Dur, NC, KA, SPL, Dir, RID, ISIG)
1858  when is_list(N) and
1859       (is_integer(SID) or (SID == asn1_NOVALUE)) and
1860       ((ST == brief) or (ST == onOff) or (ST == timeOut) or
1861	(ST == asn1_NOVALUE)) and
1862       ((is_integer(Dur) and (0 =< Dur) and (Dur =< 65535)) or
1863	(Dur == asn1_NOVALUE)) and
1864       (is_list(NC) or (NC == asn1_NOVALUE)) and
1865       ((KA == true) or (KA == false) or (KA == asn1_NOVALUE)) and
1866       is_list(SPL) and
1867       ((Dir == internal) or (Dir == external) or (Dir == both) or
1868	(Dir == asn1_NOVALUE)) and
1869       (is_integer(RID) or (RID == asn1_NOVALUE)) and
1870       (is_integer(ISIG) or (ISIG == asn1_NOVALUE)) ->
1871    #'Signal'{signalName       = N,
1872	      streamID         = SID,
1873	      sigType          = ST,
1874	      duration         = Dur,
1875	      notifyCompletion = NC,
1876	      keepActive       = KA,
1877	      sigParList       = SPL,
1878	      direction        = Dir,
1879	      requestID        = RID,
1880	      intersigDelay    = ISIG}.
1881
1882cre_SignalType(brief = ST) ->
1883    ST;
1884cre_SignalType(onOff = ST) ->
1885    ST;
1886cre_SignalType(timeOut = ST) ->
1887    ST.
1888
1889cre_SignalDirection(internal = SD) ->
1890    SD;
1891cre_SignalDirection(external = SD) ->
1892    SD;
1893cre_SignalDirection(both = SD) ->
1894    SD.
1895
1896cre_SignalName(N) ->
1897    cre_PkgdName(N).
1898
1899cre_NotifyCompletion(L) when is_list(L) ->
1900    Vals = [onTimeOut, onInterruptByEvent,
1901	    onInterruptByNewSignalDescr, otherReason],
1902    F = fun(E) -> case lists:member(E, Vals) of
1903		      true ->
1904			  ok;
1905		      false ->
1906			  exit({invalid_NotifyCompletion, E})
1907		  end
1908	end,
1909    lists:foreach(F, L),
1910    L.
1911
1912cre_SigParameter(N, V) when is_list(N) andalso is_list(V) ->
1913    #'SigParameter'{sigParameterName = N, value = V}.
1914
1915cre_SigParameter(N, V, relation = Tag, R)
1916  when is_list(N) and is_list(V) and is_atom(R) ->
1917    EI = {Tag, R},
1918    #'SigParameter'{sigParameterName = N, value = V, extraInfo = EI};
1919cre_SigParameter(N, V, range = Tag, B)
1920  when is_list(N) and is_list(V) and is_atom(B) ->
1921    EI = {Tag, B},
1922    #'SigParameter'{sigParameterName = N, value = V, extraInfo = EI};
1923cre_SigParameter(N, V, sublist = Tag, B)
1924  when is_list(N) and is_list(V) and is_atom(B) ->
1925    EI = {Tag, B},
1926    #'SigParameter'{sigParameterName = N, value = V, extraInfo = EI}.
1927
1928cre_RequestID(Val) when 0 =< Val, Val =< 4294967295 ->
1929    Val;
1930cre_RequestID(Val) ->
1931    exit({invalid_RequestID, Val}).
1932
1933cre_ModemDescriptor(MTL, MPL) when is_list(MTL) andalso is_list(MPL) ->
1934    #'ModemDescriptor'{mtl = MTL, mpl = MPL}.
1935
1936%% cre_ModemDescriptor(MTL, MPL, NSD)
1937%%   when list(MTL), list(MPL), record(NSD, 'NonStandardData') ->
1938%%     #'ModemDescriptor'{mtl = MTL, mpl = MPL}.
1939
1940cre_ModemType(v18 = MT) ->
1941    MT;
1942cre_ModemType(v22 = MT) ->
1943    MT;
1944cre_ModemType(v22bis = MT) ->
1945    MT;
1946cre_ModemType(v32 = MT) ->
1947    MT;
1948cre_ModemType(v32bis = MT) ->
1949    MT;
1950cre_ModemType(v34 = MT) ->
1951    MT;
1952cre_ModemType(v90 = MT) ->
1953    MT;
1954cre_ModemType(v91 = MT) ->
1955    MT;
1956cre_ModemType(synchISDN = MT) ->
1957    MT.
1958
1959cre_DigitMapDescriptor() ->
1960    #'DigitMapDescriptor'{}.
1961
1962cre_DigitMapDescriptor(N) when is_list(N) ->
1963    #'DigitMapDescriptor'{digitMapName = N};
1964cre_DigitMapDescriptor(V) when is_record(V, 'DigitMapValue') ->
1965    #'DigitMapDescriptor'{digitMapValue = V}.
1966
1967cre_DigitMapDescriptor(N, V) when is_list(N) andalso is_record(V, 'DigitMapValue') ->
1968    #'DigitMapDescriptor'{digitMapName = N, digitMapValue = V}.
1969
1970cre_DigitMapName(N) ->
1971    cre_Name(N).
1972
1973cre_DigitMapValue(DMB) when is_list(DMB) ->
1974    #'DigitMapValue'{digitMapBody = DMB}.
1975
1976cre_DigitMapValue(Start, Short, Long, DMB) ->
1977    cre_DigitMapValue(Start, Short, Long, DMB, asn1_NOVALUE).
1978
1979cre_DigitMapValue(Start, Short, Long, DMB, Dur)
1980  when ((is_integer(Start) and (0 =< Start) and (Start =< 99)) or
1981	(Start == asn1_NOVALUE)) and
1982       ((is_integer(Short) and (0 =< Short) and (Short =< 99)) or
1983	(Short == asn1_NOVALUE)) and
1984       ((is_integer(Long) and (0 =< Long) and (Long =< 99)) or
1985	(Long == asn1_NOVALUE)) and
1986       is_list(DMB) and
1987       ((is_integer(Dur) and (0 =< Dur) and (Dur =< 99)) or
1988	(Dur == asn1_NOVALUE)) ->
1989    #'DigitMapValue'{startTimer    = Start,
1990		     shortTimer    = Short,
1991		     longTimer     = Long,
1992		     digitMapBody  = DMB,
1993		     durationTimer = Dur}.
1994
1995cre_ServiceChangeParm(M, R) when is_atom(M) andalso is_list(R) ->
1996    #'ServiceChangeParm'{serviceChangeMethod = M,
1997			 serviceChangeReason = R}.
1998
1999cre_ServiceChangeParm(M, Addr, Prof, Reason) ->
2000    cre_ServiceChangeParm(M, Addr, asn1_NOVALUE, Prof, Reason, asn1_NOVALUE,
2001			  asn1_NOVALUE, asn1_NOVALUE,
2002			  asn1_NOVALUE, asn1_NOVALUE).
2003
2004%% Addr = asn1_NOVALUE | {AddrTag, AddrVal}
2005cre_ServiceChangeParm(M, Addr, Ver, Prof, R, D, Mid, TS, I) ->
2006    cre_ServiceChangeParm(M, Addr, Ver, Prof, R, D, Mid, TS, I, asn1_NOVALUE).
2007
2008cre_ServiceChangeParm(M, Addr, Ver, Prof, R, D, Mid, TS, I, IF)
2009  when is_atom(M) and
2010       ((is_integer(Ver) and (0 =< Ver) and (Ver =< 99)) or
2011	(Ver == asn1_NOVALUE)) and
2012       (is_record(Prof, 'ServiceChangeProfile') or (Prof == asn1_NOVALUE)) and
2013       is_list(R) and
2014       ((is_integer(D) and (0 =< D) and (D =< 4294967295)) or
2015	(D == asn1_NOVALUE)) and
2016       (is_record(TS, 'TimeNotation') or (TS == asn1_NOVALUE)) and
2017       (is_record(I, 'AuditDescriptor') or (I == asn1_NOVALUE)) and
2018       ((IF == 'NULL') or (IF == asn1_NOVALUE)) ->
2019    F = fun(A) ->
2020		(A == asn1_NOVALUE) orelse
2021				      (is_tuple(A)
2022				       andalso is_atom(element(1, A)))
2023	end,
2024    case (F(Addr) andalso F(Mid)) of
2025	true ->
2026	    #'ServiceChangeParm'{serviceChangeMethod         = M,
2027				 serviceChangeAddress        = Addr,
2028				 serviceChangeVersion        = Ver,
2029				 serviceChangeProfile        = Prof,
2030				 serviceChangeReason         = R,
2031				 serviceChangeDelay          = D,
2032				 serviceChangeMgcId          = Mid,
2033				 timeStamp                   = TS,
2034				 serviceChangeInfo           = I,
2035				 serviceChangeIncompleteFlag = IF};
2036	_ ->
2037	    exit({invalid_ServiceChangeParm_args, {Addr, Mid}})
2038    end.
2039
2040cre_ServiceChangeAddress(portNumber = Tag, P)
2041  when is_integer(P) andalso (0 =< P) andalso (P =< 65535) ->
2042    {Tag, P};
2043cre_ServiceChangeAddress(ip4Address = Tag, A) when is_record(A, 'IP4Address') ->
2044    {Tag, A};
2045cre_ServiceChangeAddress(ip6Address = Tag, A) when is_record(A, 'IP6Address') ->
2046    {Tag, A};
2047cre_ServiceChangeAddress(domainName = Tag, N) when is_record(N, 'DomainName') ->
2048    {Tag, N};
2049cre_ServiceChangeAddress(deviceName = Tag, N) when is_list(N) ->
2050    {Tag, N};
2051cre_ServiceChangeAddress(mtpAddress = Tag, A) when is_list(A) ->
2052    {Tag, A}.
2053
2054cre_ServiceChangeResParm() ->
2055    #'ServiceChangeResParm'{}.
2056cre_ServiceChangeResParm(Addr, Prof) ->
2057    cre_ServiceChangeResParm(asn1_NOVALUE, Addr, asn1_NOVALUE,
2058			     Prof, asn1_NOVALUE).
2059cre_ServiceChangeResParm(Mid, Addr, Ver, Prof, TS)
2060  when ((is_integer(Ver) andalso (0 =< Ver) andalso (Ver =< 99)) orelse
2061	(Ver =:= asn1_NOVALUE)) andalso
2062       (is_record(Prof, 'ServiceChangeProfile') orelse (Prof =:= asn1_NOVALUE)) andalso
2063       (is_record(TS, 'TimeNotation') orelse (TS =:= asn1_NOVALUE)) ->
2064    F = fun(A) ->
2065		(A == asn1_NOVALUE) orelse
2066				      (is_tuple(A)
2067				       andalso is_atom(element(1, A)))
2068	end,
2069    case (F(Addr) andalso F(Mid)) of
2070	true ->
2071	    #'ServiceChangeResParm'{serviceChangeMgcId   = Mid,
2072				    serviceChangeAddress = Addr,
2073				    serviceChangeVersion = Ver,
2074				    serviceChangeProfile = Prof,
2075				    timeStamp            = TS};
2076	_ ->
2077	    exit({invalid_ServiceChangeResParm_args, {Addr, Mid}})
2078    end.
2079
2080cre_ServiceChangeMethod(failover = M) ->
2081    M;
2082cre_ServiceChangeMethod(forced = M) ->
2083    M;
2084cre_ServiceChangeMethod(graceful = M) ->
2085    M;
2086cre_ServiceChangeMethod(restart = M) ->
2087    M;
2088cre_ServiceChangeMethod(disconnected = M) ->
2089    M;
2090cre_ServiceChangeMethod(handOff = M) ->
2091    M.
2092
2093%% The version field is added to make it look more like ABNF
2094cre_ServiceChangeProfile(N) ->
2095    cre_ServiceChangeProfile(N, 1).
2096
2097cre_ServiceChangeProfile(N, V)
2098  when is_list(N) andalso is_integer(V) andalso (0 =< V) andalso (V =< 99) ->
2099    #'ServiceChangeProfile'{profileName = N, version = V}.
2100
2101cre_PackagesDescriptor([H|_] = D) when is_record(H, 'PackagesItem') ->
2102    D.
2103
2104cre_PackagesItem(N, Ver) when is_list(N) andalso is_integer(Ver) andalso (0 =< Ver) andalso (Ver =< 99) ->
2105    #'PackagesItem'{packageName    = N,
2106		    packageVersion = Ver}.
2107
2108cre_StatisticsDescriptor(D) ->
2109    true = is_StatisticsDescriptor(D),
2110    D.
2111
2112cre_StatisticsParameter(N) when is_list(N) ->
2113    #'StatisticsParameter'{statName = N}.
2114
2115cre_StatisticsParameter(N, V) when is_list(N) andalso is_list(V) ->
2116    #'StatisticsParameter'{statName = N, statValue = V}.
2117
2118%% cre_NonStandardData({Tag, _} = Id, Data) when atom(Tag), list(Data) ->
2119%%     #'NonStandardData'{nonStandardIdentifier = Id, data = Data}.
2120
2121%% cre_NonStandardIdentifier(H221) when record(H221, 'H221NonStandard') ->
2122%%     {h221NonStandard, H221};
2123%% cre_NonStandardIdentifier(Obj) when tuple(Obj) ->
2124%%     {object, Obj};
2125%% cre_NonStandardIdentifier(Exp) when list(Exp), length(Exp) == 8 ->
2126%%     {experimental, Exp}.
2127
2128%% cre_H221NonStandard(CC1, CC2, Ext, MC)
2129%%   when (is_integer(CC1) and (0 =< CC1) and (CC1 =< 255)) and
2130%%        (is_integer(CC2) and (0 =< CC2) and (CC2 =< 255)) and
2131%%        (is_integer(Ext) and (0 =< Ext) and (Ext =< 255)) and
2132%%        (is_integer(MC)  and (0 =< MC)  and (MC =< 255)) ->
2133%%     #'H221NonStandard'{t35CountryCode1  = CC1,
2134%% 		       t35CountryCode2  = CC2,
2135%% 		       t35Extension     = Ext,
2136%% 		       manufacturerCode = MC}.
2137
2138cre_TimeNotation(D, T)
2139  when is_list(D) andalso (length(D) =:= 8) andalso is_list(T) andalso (length(T) =:= 8) ->
2140    #'TimeNotation'{date = D, time = T}.
2141
2142cre_Value([H|_] = V) when is_list(H) ->
2143    V.
2144
2145cre_BOOLEAN(true = B) ->
2146    B;
2147cre_BOOLEAN(false = B) ->
2148    B.
2149
2150
2151%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2152
2153%% -- MegacoMessage --
2154
2155is_MegacoMessage(#'MegacoMessage'{authHeader = Auth,
2156				  mess       = Mess}) ->
2157    d("is_MegacoMessage -> entry"),
2158    is_opt_AuthenticationHeader(Auth) andalso is_Message(Mess);
2159is_MegacoMessage(_) ->
2160    false.
2161
2162
2163chk_MegacoMessage(M, M) ->
2164    d("chk_MegacoMessage -> entry (1)"),
2165    chk_type(fun is_MegacoMessage/1, 'MegacoMessage', M);
2166chk_MegacoMessage(#'MegacoMessage'{authHeader = Auth1,
2167				   mess       = Mess1},
2168		  #'MegacoMessage'{authHeader = Auth2,
2169				   mess       = Mess2}) ->
2170    d("chk_MegacoMessage -> entry (2)"),
2171    chk_opt_AuthenticationHeader(Auth1,Auth2),
2172    chk_Message(Mess1,Mess2),
2173    ok;
2174chk_MegacoMessage(M1, M2) ->
2175    wrong_type('MegacoMessage', M1, M2).
2176
2177
2178%% -- AuthenticationHeader --
2179
2180is_opt_AuthenticationHeader(AH) ->
2181    is_OPTIONAL(fun is_AuthenticationHeader/1, AH).
2182
2183is_AuthenticationHeader(#'AuthenticationHeader'{secParmIndex = SPI,
2184						seqNum       = SN,
2185						ad           = AD}) ->
2186    is_SecurityParmIndex(SPI) andalso
2187	is_SequenceNum(SN) andalso
2188	is_AuthData(AD);
2189is_AuthenticationHeader(_) ->
2190    false.
2191
2192%% This stuff is not really used, so make it simple...
2193chk_opt_AuthenticationHeader(A1, A2) ->
2194    chk_OPTIONAL('AuthenticationHeader', A1, A2,
2195		 fun is_AuthenticationHeader/1,
2196		 fun chk_AuthenticationHeader/2).
2197
2198chk_AuthenticationHeader(A, A) ->
2199    chk_type(fun is_AuthenticationHeader/1, 'AuthenticationHeader', A);
2200chk_AuthenticationHeader(A1, A2) ->
2201    case (is_AuthenticationHeader(A1) andalso is_AuthenticationHeader(A2)) of
2202	true ->
2203	    not_equal('AuthenticationHeader', A1, A2);
2204	false ->
2205	    wrong_type('AuthenticationHeader', A1, A2)
2206    end.
2207
2208
2209%% -- SecurityParmIndex --
2210
2211is_SecurityParmIndex(V) -> is_OCTET_STRING(V, {exact, 4}).
2212
2213
2214%% -- SequenceNum --
2215
2216is_SequenceNum(V) -> is_OCTET_STRING(V, {exact, 4}).
2217
2218
2219%% -- AuthData --
2220
2221is_AuthData(V) -> is_OCTET_STRING(V, {range, 12, 32}).
2222
2223
2224%% -- Message --
2225
2226is_Message(#'Message'{version     = V,
2227		      mId         = MID,
2228		      messageBody = Body}) ->
2229    d("is_Message -> entry"),
2230    is_INTEGER(V, {range, 0, 99}) andalso
2231	is_MId(MID) andalso
2232	is_Message_messageBody(Body);
2233is_Message(_) ->
2234    false.
2235
2236chk_Message(M, M) ->
2237    d("chk_Message -> entry (1)"),
2238    chk_type(fun is_Message/1, 'Message', M);
2239chk_Message(#'Message'{version     = V1,
2240		       mId         = MID1,
2241		       messageBody = Body1},
2242	    #'Message'{version     = V2,
2243		       mId         = MID2,
2244		       messageBody = Body2}) ->
2245    d("chk_Message -> entry with"
2246      "~n   V1:    ~p"
2247      "~n   V2:    ~p"
2248      "~n   MID1:  ~p"
2249      "~n   MID2:  ~p"
2250      "~n   Body1: ~p"
2251      "~n   Body2: ~p",
2252     [V1, V2, MID1, MID2, Body1, Body2]),
2253    validate(fun() -> chk_INTEGER(V1, V2, {range, 0, 99}) end,
2254	     'Message_version'),
2255    validate(fun() -> chk_MId(MID1, MID2) end, 'Message_mId'),
2256    chk_Message_messageBody(Body1, Body2),
2257    ok;
2258chk_Message(M1, M2) ->
2259    wrong_type('Message', M1, M2).
2260
2261
2262is_Message_messageBody({Tag, Val}) ->
2263    d("is_Message_messageBody -> entry"),
2264    is_Message_messageBody_tag(Tag) andalso
2265	is_Message_messageBody_val(Tag, Val);
2266is_Message_messageBody(_) ->
2267    false.
2268
2269is_Message_messageBody_tag(Tag) ->
2270    Tags = [messageError, transactions],
2271    lists:member(Tag, Tags).
2272
2273is_Message_messageBody_val(messageError, Val) ->
2274    is_ErrorDescriptor(Val);
2275is_Message_messageBody_val(transactions, Val) ->
2276    is_Message_messageBody_transactions(Val).
2277
2278is_Message_messageBody_transactions([]) ->
2279    d("is_Message_messageBody_transactions -> entry when done"),
2280    true;
2281is_Message_messageBody_transactions([H|T]) ->
2282    d("is_Message_messageBody_transactions -> entry"),
2283    is_Transaction(H) andalso is_Message_messageBody_transactions(T);
2284is_Message_messageBody_transactions(_) ->
2285    false.
2286
2287chk_Message_messageBody(B, B) ->
2288    d("chk_Message_messageBody -> entry (1)"),
2289    chk_type(fun is_Message_messageBody/1, 'Message_messageBody', B);
2290chk_Message_messageBody({Tag, Val1} = B1, {Tag, Val2} = B2) ->
2291    d("chk_Message_messageBody -> entry (2)"),
2292    case (is_Message_messageBody_tag(Tag) andalso
2293	  is_Message_messageBody_val(Tag, Val1) andalso
2294	  is_Message_messageBody_val(Tag, Val2)) of
2295	true ->
2296	    chk_Message_messageBody_val(Tag, Val1, Val2);
2297	false ->
2298	    wrong_type('Message_messageBody', B1, B2)
2299    end;
2300chk_Message_messageBody({Tag1, Val1} = B1, {Tag2, Val2} = B2) ->
2301    d("chk_Message_messageBody -> entry (3)"),
2302    case ((is_Message_messageBody_tag(Tag1) andalso
2303	   is_Message_messageBody_val(Tag1, Val1)) andalso
2304	  (is_Message_messageBody_tag(Tag2) andalso
2305	   is_Message_messageBody_val(Tag2, Val2))) of
2306	true ->
2307	    not_equal('Message_messageBody', B1, B2);
2308	false ->
2309	    wrong_type('Message_messageBody', B1, B2)
2310    end;
2311chk_Message_messageBody(B1, B2) ->
2312    wrong_type('Message_messageBody', B1, B2).
2313
2314chk_Message_messageBody_val(messageError, Val1, Val2) ->
2315    validate(fun() -> chk_ErrorDescriptor(Val1, Val2) end,
2316	     'Message_messageBody');
2317chk_Message_messageBody_val(transactions, Val1, Val2) ->
2318    chk_Message_messageBody_transactions(lists:sort(Val1),
2319					 lists:sort(Val2)).
2320
2321chk_Message_messageBody_transactions([], []) ->
2322    d("chk_Message_messageBody_transactions -> entry - ok (1)"),
2323    ok;
2324chk_Message_messageBody_transactions([] = T1, T2) ->
2325    d("chk_Message_messageBody_transactions -> entry - not-equal (2)"),
2326    not_equal('Message_messageBody_transactions', T1, T2);
2327chk_Message_messageBody_transactions(T1, [] = T2) ->
2328    d("chk_Message_messageBody_transactions -> entry - not-equal (3)"),
2329    not_equal('Message_messageBody_transactions', T1, T2);
2330chk_Message_messageBody_transactions([H|T1], [H|T2]) ->
2331    d("chk_Message_messageBody_transactions -> entry (4)"),
2332    case is_Transaction(H) of
2333	true ->
2334	    chk_Message_messageBody_transactions(T1, T2);
2335	false ->
2336	    wrong_type('Message_messageBody_transactions_val', H)
2337    end;
2338chk_Message_messageBody_transactions([H1|T1], [H2|T2]) ->
2339    d("chk_Message_messageBody_transactions -> entry (5)"),
2340    validate(fun() -> chk_Transaction(H1, H2) end,
2341	     'Message_messageBody_transactions_val'),
2342    chk_Message_messageBody_transactions(T1, T2);
2343chk_Message_messageBody_transactions(T1, T2) ->
2344    d("chk_Message_messageBody_transactions -> entry - wrong-type (6)"),
2345    wrong_type('Message_messageBody_transactions', T1, T2).
2346
2347
2348%% -- MId --
2349
2350is_opt_MId(M) ->
2351    is_OPTIONAL(fun is_MId/1, M).
2352
2353is_MId({Tag, Val}) ->
2354    is_MId_tag(Tag) andalso is_MId_val(Tag, Val);
2355is_MId(_) ->
2356    false.
2357
2358is_MId_tag(Tag) ->
2359    Tags = [ip4Address, ip6Address, domainName, deviceName, mtpAddress],
2360    lists:member(Tag, Tags).
2361
2362is_MId_val(ip4Address, Val) -> is_IP4Address(Val);
2363is_MId_val(ip6Address, Val) -> is_IP6Address(Val);
2364is_MId_val(domainName, Val) -> is_DomainName(Val);
2365is_MId_val(deviceName, Val) -> is_PathName(Val);
2366is_MId_val(mtpAddress, Val) -> is_OCTET_STRING(Val, {range, 2, 4}).
2367
2368chk_opt_MId(M1, M2) ->
2369    chk_OPTIONAL('MId', M1, M2, fun is_MId/1, fun chk_MId/2).
2370
2371chk_MId(M, M) ->
2372    chk_type(fun is_MId/1, 'MId', M);
2373chk_MId({Tag, Val1} = M1, {Tag, Val2} = M2) ->
2374    case (is_MId_tag(Tag) andalso
2375	  is_MId_val(Tag, Val1) andalso
2376	  is_MId_val(Tag, Val2)) of
2377	true ->
2378	    chk_MId_val(Tag, Val1, Val2);
2379	false ->
2380	    wrong_type('MId', M1, M2)
2381    end;
2382chk_MId({Tag1, Val1} = M1, {Tag2, Val2} = M2) ->
2383    case ((is_MId_tag(Tag1) andalso
2384	   is_MId_val(Tag1, Val1)) andalso
2385	  (is_MId_tag(Tag2) andalso
2386	   is_MId_val(Tag2, Val2))) of
2387	true ->
2388	    not_equal('MId', M1, M2);
2389	false ->
2390	    wrong_type('MId', M1, M2)
2391    end;
2392chk_MId(M1, M2) ->
2393    wrong_type('MId', M1, M2).
2394
2395chk_MId_val(ip4Address, M1, M2) -> chk_IP4Address(M1, M2);
2396chk_MId_val(ip6Address, M1, M2) -> chk_IP6Address(M1, M2);
2397chk_MId_val(domainName, M1, M2) -> chk_DomainName(M1, M2);
2398chk_MId_val(deviceName, M1, M2) -> chk_PathName(M1,   M2);
2399chk_MId_val(mtpAddress, M1, M2) -> chk_OCTET_STRING(M1, M2, {range, 2, 4}).
2400
2401
2402%% -- DomainName --
2403
2404is_DomainName(#'DomainName'{name = N, portNumber = PN}) ->
2405    is_IA5String(N) andalso is_opt_INTEGER(PN, {range, 0, 65535});
2406is_DomainName(_) ->
2407    false.
2408
2409chk_DomainName(N, N) ->
2410    ok;
2411chk_DomainName(N1, N2) ->
2412    not_equal('DomainName', N1, N2).
2413
2414
2415%% -- IP4Address --
2416
2417is_IP4Address(#'IP4Address'{address = A, portNumber = PN}) ->
2418    is_OCTET_STRING(A, {exact, 4}) andalso
2419	is_opt_INTEGER(PN, {range, 0, 65535});
2420is_IP4Address(_) ->
2421    false.
2422
2423chk_IP4Address(A, A) ->
2424    ok;
2425chk_IP4Address(A1, A2) ->
2426    not_equal('IP4Address', A1, A2).
2427
2428
2429%% -- IP6Address --
2430
2431is_IP6Address(#'IP6Address'{address = A, portNumber = PN}) ->
2432    is_OCTET_STRING(A, {exact, 16}) andalso
2433	is_opt_INTEGER(PN, {range, 0, 65535});
2434is_IP6Address(_) ->
2435    false.
2436
2437chk_IP6Address(A, A) ->
2438    ok;
2439chk_IP6Address(A1, A2) ->
2440    not_equal('IP6Address', A1, A2).
2441
2442
2443%% -- PathName --
2444
2445is_PathName(N) -> is_IA5String(N, {range, 1, 64}).
2446
2447chk_PathName(N, N) ->
2448    ok;
2449chk_PathName(N1, N2) ->
2450    not_equal('PathName', N1, N2).
2451
2452
2453%% -- Transaction --
2454
2455is_Transaction({Tag, Val}) ->
2456    d("is_Transaction -> entry"),
2457    is_Transaction_tag(Tag) andalso is_Transaction_val(Tag, Val);
2458is_Transaction(_) ->
2459    false.
2460
2461is_Transaction_tag(Tag) ->
2462    Tags = [transactionRequest,
2463	    transactionPending,
2464	    transactionReply,
2465	    transactionResponseAck],
2466    lists:member(Tag, Tags).
2467
2468is_Transaction_val(transactionRequest, V)     -> is_TransactionRequest(V);
2469is_Transaction_val(transactionPending, V)     -> is_TransactionPending(V);
2470is_Transaction_val(transactionReply, V)       -> is_TransactionReply(V);
2471is_Transaction_val(transactionResponseAck, V) -> is_TransactionResponseAck(V).
2472
2473
2474chk_Transaction({Tag, Val} = Trans, Trans) ->
2475    d("chk_Transaction -> entry (1)"),
2476    case (is_Transaction_tag(Tag) andalso is_Transaction_val(Tag, Val)) of
2477	true ->
2478	    ok;
2479	false ->
2480	    wrong_type('Transaction', Trans, Trans)
2481    end;
2482chk_Transaction({Tag, Val1} = Trans1, {Tag, Val2} = Trans2) ->
2483    d("chk_Transaction -> entry (2)"),
2484    case (is_Transaction_tag(Tag) and
2485	  is_Transaction_val(Tag, Val1) and
2486	  is_Transaction_val(Tag, Val2)) of
2487	true ->
2488	    chk_Transaction_val(Tag, Val1, Val2);
2489	false ->
2490	    wrong_type('Transaction', Trans1, Trans2)
2491    end;
2492chk_Transaction({Tag1, Val1} = Trans1, {Tag2, Val2} = Trans2) ->
2493    d("chk_Transaction -> entry (3)"),
2494    case ((is_Transaction_tag(Tag1) andalso
2495	   is_Transaction_val(Tag1, Val1)) andalso
2496	  (is_Transaction_tag(Tag2) andalso
2497	   is_Transaction_val(Tag2, Val2))) of
2498	true ->
2499	    not_equal('Transaction', Trans1, Trans2);
2500	false ->
2501	    wrong_type('Transaction', Trans1, Trans2)
2502    end;
2503chk_Transaction(Trans1, Trans2) ->
2504    d("chk_Transaction -> entry - wrong-type - (4)"),
2505    wrong_type('Transaction', Trans1, Trans2).
2506
2507chk_Transaction_val(transactionRequest, T1, T2) ->
2508    chk_TransactionRequest(T1, T2);
2509chk_Transaction_val(transactionPending, T1, T2) ->
2510    chk_TransactionPending(T1, T2);
2511chk_Transaction_val(transactionReply, T1, T2) ->
2512    chk_TransactionReply(T1,T2);
2513chk_Transaction_val(transactionResponseAck, T1, T2) ->
2514    chk_TransactionResponseAck(T1, T2).
2515
2516
2517%% -- TransactionId --
2518
2519is_opt_TransactionId(TID) ->
2520    is_OPTIONAL(fun is_TransactionId/1, TID).
2521
2522is_TransactionId(TID) ->
2523    d("is_TransactionId -> entry"),
2524    is_INTEGER(TID, {range, 0, 4294967295}).
2525
2526chk_opt_TransactionId(TID1, TID2) ->
2527    chk_OPTIONAL('TransactionId', TID1, TID2,
2528		 fun is_TransactionId/1, fun chk_TransactionId/2).
2529
2530chk_TransactionId(TID, TID) ->
2531    chk_type(fun is_TransactionId/1, 'TransactionId', TID);
2532chk_TransactionId(TID1, TID2) ->
2533    case (is_TransactionId(TID1) andalso is_TransactionId(TID2)) of
2534	true ->
2535	    not_equal('TransactionId', TID1, TID2);
2536	false ->
2537	    wrong_type('TransactionId', TID1, TID2)
2538    end.
2539
2540
2541%% -- TransactionRequest --
2542
2543is_TransactionRequest(#'TransactionRequest'{transactionId = TID,
2544					    actions       = Acts}) ->
2545    d("is_TransactionRequest -> entry"),
2546    is_TransactionId(TID) andalso is_TransactionRequest_actions(Acts);
2547is_TransactionRequest(_) ->
2548    false.
2549
2550chk_TransactionRequest(T, T) ->
2551    chk_type(fun is_TransactionRequest/1, 'TransactionRequest', T);
2552chk_TransactionRequest(#'TransactionRequest'{transactionId = TID1,
2553					     actions       = Acts1},
2554		       #'TransactionRequest'{transactionId = TID2,
2555					     actions       = Acts2}) ->
2556    validate(fun() -> chk_TransactionId(TID1, TID2) end, 'TransactionRequest'),
2557    chk_TransactionRequest_actions(lists:sort(Acts1),
2558				   lists:sort(Acts2)),
2559    ok;
2560chk_TransactionRequest(T1, T2) ->
2561    wrong_type('TransactionRequest', T1, T2).
2562
2563is_TransactionRequest_actions([]) ->
2564    d("is_TransactionRequest_actions -> entry when done"),
2565    true;
2566is_TransactionRequest_actions([H|T]) ->
2567    d("is_TransactionRequest_actions -> entry"),
2568    is_ActionRequest(H) andalso is_TransactionRequest_actions(T);
2569is_TransactionRequest_actions(_) ->
2570    false.
2571
2572chk_TransactionRequest_actions([], []) ->
2573    ok;
2574chk_TransactionRequest_actions([] = Acts1, Acts2) ->
2575    not_equal('TransactionRequest_actions', Acts1, Acts2);
2576chk_TransactionRequest_actions(Acts1, [] = Acts2) ->
2577    not_equal('TransactionRequest_actions', Acts1, Acts2);
2578chk_TransactionRequest_actions([H|T1], [H|T2]) ->
2579    case is_ActionRequest(H) of
2580	true ->
2581	    chk_TransactionRequest_actions(T1, T2);
2582	false ->
2583	    wrong_type('TransactionRequest_actions_val', H)
2584    end;
2585chk_TransactionRequest_actions([H1|T1], [H2|T2]) ->
2586    validate(fun() -> chk_ActionRequest(H1, H2) end,
2587	     'TransactionRequest_actions_val'),
2588    chk_TransactionRequest_actions(T1, T2);
2589chk_TransactionRequest_actions(Acts1, Acts2) ->
2590    wrong_type('TransactionRequest_actions', Acts1, Acts2).
2591
2592
2593%% -- TransactionPending --
2594
2595is_TransactionPending(#'TransactionPending'{transactionId = TID}) ->
2596    d("is_TransactionPending -> entry"),
2597    is_TransactionId(TID);
2598is_TransactionPending(_) ->
2599    false.
2600
2601chk_TransactionPending(T, T) ->
2602    chk_type(fun is_TransactionPending/1, 'TransactionPending', T);
2603chk_TransactionPending(#'TransactionPending'{transactionId = TID1},
2604		       #'TransactionPending'{transactionId = TID2}) ->
2605    validate(fun() -> chk_TransactionId(TID1, TID2) end, 'TransactionPending'),
2606    ok;
2607chk_TransactionPending(T1, T2) ->
2608    wrong_type('TransactionPending', T1, T2).
2609
2610
2611%% -- TransactionReply --
2612
2613is_TransactionReply(#'TransactionReply'{transactionId     = TID,
2614					immAckRequired    = IAR,
2615					transactionResult = TR}) ->
2616    d("is_TransactionReply -> entry"),
2617    is_TransactionId(TID) andalso
2618	is_opt_NULL(IAR) andalso
2619	is_TransactionReply_transactionResult(TR);
2620is_TransactionReply(_) ->
2621    false.
2622
2623chk_TransactionReply(T, T) ->
2624    d("chk_TransactionReply -> entry (2)"),
2625    chk_type(fun is_TransactionReply/1, 'TransactionReply', T);
2626chk_TransactionReply(#'TransactionReply'{transactionId     = TID1,
2627					 immAckRequired    = IAR1,
2628					 transactionResult = TR1},
2629		     #'TransactionReply'{transactionId     = TID2,
2630					 immAckRequired    = IAR2,
2631					 transactionResult = TR2}) ->
2632    d("chk_TransactionReply -> entry (2)"),
2633    validate(fun() -> chk_TransactionId(TID1, TID2) end, 'TransactionReply'),
2634    validate(fun() -> chk_opt_NULL(IAR1, IAR2) end, 'TransactionReply'),
2635    chk_TransactionReply_transactionResult(TR1, TR2),
2636    ok;
2637chk_TransactionReply(T1, T2) ->
2638    d("chk_TransactionReply -> entry (3)"),
2639    wrong_type('TransactionReply', T1, T2).
2640
2641is_TransactionReply_transactionResult({Tag, Val}) ->
2642    d("is_TransactionReply_transactionResult -> entry"),
2643    is_TransactionReply_transactionResult_tag(Tag) andalso
2644	is_TransactionReply_transactionResult_val(Tag, Val);
2645is_TransactionReply_transactionResult(_) ->
2646    false.
2647
2648is_TransactionReply_transactionResult_tag(T) ->
2649    lists:member(T, [transactionError, actionReplies]).
2650
2651is_TransactionReply_transactionResult_val(transactionError, V) ->
2652    is_ErrorDescriptor(V);
2653is_TransactionReply_transactionResult_val(actionReplies, V) ->
2654    is_TransactionReply_actionReplies(V).
2655
2656chk_TransactionReply_transactionResult(Res, Res) ->
2657    chk_type(fun is_TransactionReply_transactionResult/1,
2658	     'TransactionReply_transactionResult', Res);
2659chk_TransactionReply_transactionResult({Tag, Val1} = Res1,
2660				       {Tag, Val2} = Res2) ->
2661    case (is_TransactionReply_transactionResult_tag(Tag) and
2662	  is_TransactionReply_transactionResult_val(Tag, Val1) and
2663	  is_TransactionReply_transactionResult_val(Tag, Val2)) of
2664	true ->
2665	    chk_TransactionReply_transactionResult_val(Tag, Val1, Val2);
2666	false ->
2667	    wrong_type('TransactionReply_transactionResult', Res1, Res2)
2668    end;
2669chk_TransactionReply_transactionResult({Tag1, Val1} = Res1,
2670				       {Tag2, Val2} = Res2) ->
2671    case ((is_TransactionReply_transactionResult_tag(Tag1) and
2672	   is_TransactionReply_transactionResult_val(Tag1, Val1)) and
2673	  (is_TransactionReply_transactionResult_tag(Tag2) and
2674	   is_TransactionReply_transactionResult_val(Tag2, Val2))) of
2675	true ->
2676	    not_equal('TransactionReply_transactionResult', Res1, Res2);
2677	false ->
2678	    wrong_type('TransactionReply_transactionResult', Res1, Res2)
2679    end;
2680chk_TransactionReply_transactionResult(Res1, Res2) ->
2681    wrong_type('TransactionReply_transactionResult', Res1, Res2).
2682
2683chk_TransactionReply_transactionResult_val(transactionError, E1, E2) ->
2684    validate(fun() -> chk_ErrorDescriptor(E1, E2) end,
2685	     'TransactionReply_transactionResult');
2686chk_TransactionReply_transactionResult_val(actionReplies, R1, R2) ->
2687    validate(fun() ->
2688		     chk_TransactionReply_actionReplies(lists:sort(R1),
2689							lists:sort(R2))
2690	     end,
2691	     'TransactionReply_transactionResult').
2692
2693is_TransactionReply_actionReplies([]) ->
2694    d("is_TransactionReply_actionReplies -> entry when done"),
2695    true;
2696is_TransactionReply_actionReplies([H|T]) ->
2697    d("is_TransactionReply_actionReplies -> entry"),
2698    is_ActionReply(H) andalso is_TransactionReply_actionReplies(T);
2699is_TransactionReply_actionReplies(_) ->
2700    false.
2701
2702chk_TransactionReply_actionReplies([], []) ->
2703    ok;
2704chk_TransactionReply_actionReplies([] = AR1, AR2) ->
2705    not_equal('TransactionReply_actionReplies', AR1, AR2);
2706chk_TransactionReply_actionReplies(AR1, [] = AR2) ->
2707    not_equal('TransactionReply_actionReplies', AR1, AR2);
2708chk_TransactionReply_actionReplies([H|T1], [H|T2]) ->
2709    case is_ActionReply(H) of
2710	true ->
2711	    chk_TransactionReply_actionReplies(T1, T2);
2712	false ->
2713	    wrong_type('TransactionReply_actionReplies_val', H)
2714    end;
2715chk_TransactionReply_actionReplies([H1|T1], [H2|T2]) ->
2716    validate(fun() -> chk_ActionReply(H1, H2) end,
2717	     'TransactionReply_actionReplies_val'),
2718    chk_TransactionReply_actionReplies(T1, T2);
2719chk_TransactionReply_actionReplies(AR1, AR2) ->
2720    wrong_type('TransactionReply_actionReplies', AR1, AR2).
2721
2722
2723%% -- TransactionResponseAck --
2724
2725is_TransactionResponseAck([]) ->
2726    d("is_TransactionResponseAck -> entry when done"),
2727    true;
2728is_TransactionResponseAck([H|T]) ->
2729    d("is_TransactionResponseAck -> entry"),
2730    is_TransactionAck(H) andalso is_TransactionResponseAck(T);
2731is_TransactionResponseAck(_) ->
2732    false.
2733
2734chk_TransactionResponseAck([], []) ->
2735    ok;
2736chk_TransactionResponseAck([] = AR1, AR2) ->
2737    not_equal('TransactionResponseAck', AR1, AR2);
2738chk_TransactionResponseAck(AR1, [] = AR2) ->
2739    not_equal('TransactionResponseAck', AR1, AR2);
2740chk_TransactionResponseAck([H|T1], [H|T2]) ->
2741    case is_TransactionAck(H) of
2742	true ->
2743	    chk_TransactionResponseAck(T1, T2);
2744	false ->
2745	    wrong_type('TransactionResponseAck_val', H)
2746    end;
2747chk_TransactionResponseAck([H1|T1], [H2|T2]) ->
2748    validate(fun() -> chk_TransactionAck(H1, H2) end,
2749	     'TransactionResponseAck'),
2750    chk_TransactionResponseAck(T1, T2);
2751chk_TransactionResponseAck(AR1, AR2) ->
2752    wrong_type('TransactionResponseAck', AR1, AR2).
2753
2754
2755%% -- TransactionAck --
2756
2757is_TransactionAck(#'TransactionAck'{firstAck = F,
2758				    lastAck  = L}) ->
2759    d("is_TransactionAck -> entry"),
2760    is_TransactionId(F) andalso is_opt_TransactionId(L);
2761is_TransactionAck(_) ->
2762    false.
2763
2764chk_TransactionAck(T, T) ->
2765    chk_type(fun is_TransactionAck/1, 'TransactionAck', T);
2766chk_TransactionAck(#'TransactionAck'{firstAck = F1,
2767				     lastAck  = L1},
2768		   #'TransactionAck'{firstAck = F2,
2769				     lastAck  = L2}) ->
2770    validate(fun() -> chk_TransactionId(F1, F2) end, 'TransactionAck'),
2771    validate(fun() -> chk_opt_TransactionId(L1, L2) end, 'TransactionAck'),
2772    ok;
2773chk_TransactionAck(T1, T2) ->
2774    wrong_type('TransactionAck', T1, T2).
2775
2776
2777%% -- ErrorDescriptor --
2778
2779is_opt_ErrorDescriptor(V) ->
2780    is_OPTIONAL(fun is_ErrorDescriptor/1, V).
2781
2782is_ErrorDescriptor(#'ErrorDescriptor'{errorCode = Code,
2783				      errorText = Text}) ->
2784    d("is_ErrorDescriptor -> entry"),
2785    is_ErrorCode(Code) andalso is_opt_ErrorText(Text);
2786is_ErrorDescriptor(_) ->
2787    false.
2788
2789chk_opt_ErrorDescriptor(E1, E2) ->
2790    chk_OPTIONAL('ErrorDescriptor', E1, E2,
2791		 fun is_ErrorDescriptor/1, fun chk_ErrorDescriptor/2).
2792
2793chk_ErrorDescriptor(E, E) ->
2794    chk_type(fun is_ErrorDescriptor/1, 'ErrorDescriptor', E);
2795chk_ErrorDescriptor(#'ErrorDescriptor'{errorCode = Code1,
2796                                       errorText = Text1},
2797                    #'ErrorDescriptor'{errorCode = Code2,
2798                                       errorText = Text2}) ->
2799    chk_ErrorCode(Code1, Code2),
2800    chk_opt_ErrorText(Text1, Text2),
2801    ok;
2802chk_ErrorDescriptor(E1, E2) ->
2803    wrong_type('ErrorDescriptor', E1, E2).
2804
2805
2806%% -- ErrorCode --
2807
2808is_ErrorCode(C) -> is_INTEGER(C, {range, 0, 65535}).
2809
2810chk_ErrorCode(C, C) ->
2811    case is_ErrorCode(C) of
2812	true ->
2813	    ok;
2814	false ->
2815	    wrong_type(errorCode, C, C)
2816    end;
2817chk_ErrorCode(C1, C2) ->
2818    case (is_ErrorCode(C1) andalso is_ErrorCode(C2)) of
2819	true ->
2820	    not_equal(errorCode, C1, C2);
2821	false ->
2822	    wrong_type(errorCode, C1, C2)
2823    end.
2824
2825
2826%% -- ErrorText --
2827
2828is_opt_ErrorText(V) ->
2829    is_OPTIONAL(fun is_ErrorText/1, V).
2830
2831is_ErrorText(V) -> is_IA5String(V).
2832
2833chk_opt_ErrorText(T1, T2) ->
2834    chk_OPTIONAL('ErrorText', T1, T2, fun is_ErrorText/1, fun chk_ErrorText/2).
2835
2836chk_ErrorText(T, T) ->
2837    chk_type(fun is_ErrorText/1, 'ErrorText', T);
2838chk_ErrorText(T1, T2) ->
2839    case (is_ErrorText(T1) andalso is_ErrorText(T2)) of
2840	true ->
2841	    case {to_lower(T1), to_lower(T2)} of
2842		{T, T} ->
2843		    ok;
2844		_ ->
2845		    not_equal('ErrorText', T1, T2)
2846	    end;
2847	false ->
2848	    wrong_type('ErrorText', T1, T2)
2849    end.
2850
2851
2852%% -- ContextID --
2853
2854is_ContextID(Id) -> is_INTEGER(Id, {range, 0, 4294967295}).
2855
2856chk_ContextID(Id, Id) ->
2857    chk_type(fun is_ContextID/1, 'ContextID', Id);
2858chk_ContextID(Id1, Id2) ->
2859    case (is_ContextID(Id1) andalso is_ContextID(Id2)) of
2860	true ->
2861	    not_equal('ContextID', Id1, Id2);
2862	false ->
2863	    wrong_type('ContextID', Id1, Id2)
2864    end.
2865
2866
2867%% -- ActionRequest --
2868
2869is_ActionRequest(#'ActionRequest'{contextId           = Id,
2870				  contextRequest      = CtxReq,
2871				  contextAttrAuditReq = AuditReq,
2872				  commandRequests     = CmdReqs}) ->
2873    d("is_ActionRequest -> entry"),
2874    is_ContextID(Id) andalso
2875	is_opt_ContextRequest(CtxReq) andalso
2876	is_opt_ContextAttrAuditRequest(AuditReq) andalso
2877	is_ActionRequest_commandRequests(CmdReqs);
2878is_ActionRequest(_) ->
2879    false.
2880
2881chk_ActionRequest(A, A) ->
2882    chk_type(fun is_ActionRequest/1, 'ActionRequest', A);
2883chk_ActionRequest(#'ActionRequest'{contextId           = Id1,
2884                                   contextRequest      = Req1,
2885                                   contextAttrAuditReq = AuditReq1,
2886                                   commandRequests     = CmdReqs1},
2887                  #'ActionRequest'{contextId           = Id2,
2888                                   contextRequest      = Req2,
2889                                   contextAttrAuditReq = AuditReq2,
2890                                   commandRequests     = CmdReqs2}) ->
2891    validate(fun() -> chk_ContextID(Id1, Id2) end, 'ActionRequest'),
2892    validate(fun() -> chk_opt_ContextRequest(Req1, Req2) end, 'ActionRequest'),
2893    validate(fun() ->
2894		     chk_opt_ContextAttrAuditRequest(AuditReq1, AuditReq2)
2895	     end,
2896	     'ActionRequest'),
2897    chk_ActionRequest_commandRequests(CmdReqs1, CmdReqs2),
2898    ok.
2899
2900
2901is_ActionRequest_commandRequests([]) ->
2902    d("is_ActionRequest_commandRequests -> entry when done"),
2903    true;
2904is_ActionRequest_commandRequests([H|T]) ->
2905    d("is_ActionRequest_commandRequests -> entry"),
2906    is_CommandRequest(H) andalso is_ActionRequest_commandRequests(T);
2907is_ActionRequest_commandRequests(_) ->
2908    false.
2909
2910chk_ActionRequest_commandRequests([], []) ->
2911    ok;
2912chk_ActionRequest_commandRequests([] = CmdReqs1, CmdReqs2) ->
2913    not_equal('ActionRequest_commandRequests', CmdReqs1, CmdReqs2);
2914chk_ActionRequest_commandRequests(CmdReqs1, [] = CmdReqs2) ->
2915    not_equal('ActionRequest_commandRequests', CmdReqs1, CmdReqs2);
2916chk_ActionRequest_commandRequests([H|T1], [H|T2]) ->
2917    case is_CommandRequest(H) of
2918	true ->
2919	    chk_ActionRequest_commandRequests(T1, T2);
2920	false ->
2921	    wrong_type('ActionRequest_commandRequest_val', H)
2922    end;
2923chk_ActionRequest_commandRequests([H1|T1], [H2|T2]) ->
2924    validate(fun() -> chk_CommandRequest(H1, H2) end,
2925	     'ActionRequest_commandRequests_val'),
2926    chk_ActionRequest_commandRequests(T1, T2);
2927chk_ActionRequest_commandRequests(R1, R2) ->
2928    wrong_type('ActionRequest_commandRequests', R1, R2).
2929
2930
2931%% -- ActionReply --
2932
2933is_ActionReply(#'ActionReply'{contextId       = Id,
2934			      errorDescriptor = ED,
2935			      contextReply    = CtxRep,
2936			      commandReply    = CmdRep}) ->
2937    d("is_ActionReply -> entry"),
2938    is_ContextID(Id) andalso
2939	is_opt_ErrorDescriptor(ED) andalso
2940	is_opt_ContextRequest(CtxRep) andalso
2941	is_ActionReply_commandReply(CmdRep);
2942is_ActionReply(_) ->
2943    false.
2944
2945is_ActionReply_commandReply([]) ->
2946    d("is_ActionReply_commandReply -> entry when done"),
2947    true;
2948is_ActionReply_commandReply([H|T]) ->
2949    d("is_ActionReply_commandReply -> entry"),
2950    is_CommandReply(H) andalso is_ActionReply_commandReply(T);
2951is_ActionReply_commandReply(_) ->
2952    false.
2953
2954chk_ActionReply(A, A) ->
2955    d("chk_ActionReply -> entry (1)"),
2956    chk_type(fun is_ActionReply/1, 'ActionReply', A);
2957chk_ActionReply(#'ActionReply'{contextId       = Id1,
2958			       errorDescriptor = ED1,
2959			       contextReply    = CtxRep1,
2960			       commandReply    = CmdRep1},
2961		#'ActionReply'{contextId       = Id2,
2962			       errorDescriptor = ED2,
2963			       contextReply    = CtxRep2,
2964			       commandReply    = CmdRep2}) ->
2965    d("chk_ActionReply -> entry (2)"),
2966    chk_ContextID(Id1, Id2),
2967    chk_opt_ErrorDescriptor(ED1, ED2),
2968    chk_opt_ContextRequest(CtxRep1, CtxRep2),
2969    chk_ActionReply_commandReply(CmdRep1, CmdRep2).
2970
2971chk_ActionReply_commandReply([], []) ->
2972    ok;
2973chk_ActionReply_commandReply([] = Reps1, Reps2) ->
2974    not_equal('ActionReply_commandReply', Reps1, Reps2);
2975chk_ActionReply_commandReply(Reps1, [] = Reps2) ->
2976    not_equal('ActionReply_commandReply', Reps1, Reps2);
2977chk_ActionReply_commandReply([H|T1], [H|T2]) ->
2978    case is_CommandReply(H) of
2979	true ->
2980	    chk_ActionReply_commandReply(T1, T2);
2981	false ->
2982	    wrong_type('ActionReply_commandReply_val', H)
2983    end;
2984chk_ActionReply_commandReply([H1|T1], [H2|T2]) ->
2985    validate(fun() -> chk_CommandReply(H1, H2) end,
2986	     'ActionReply_commandReply_val'),
2987    chk_ActionReply_commandReply(T1, T2);
2988chk_ActionReply_commandReply(R1, R2) ->
2989    wrong_type('ActionReply_commandReply', R1, R2).
2990
2991
2992%% -- ContextRequest --
2993
2994is_opt_ContextRequest(V) ->
2995    is_OPTIONAL(fun is_ContextRequest/1, V).
2996
2997is_ContextRequest(#'ContextRequest'{priority    = Prio,
2998				    emergency   = Em,
2999				    topologyReq = TopReq,
3000				    iepscallind = Ieps,
3001				    contextProp = CtxProp,
3002				    contextList = CtxList}) ->
3003    d("is_ContextRequest -> entry"),
3004    is_ContextRequest_priority(Prio) andalso
3005    is_ContextRequest_emergency(Em) andalso
3006    is_ContextRequest_topologyReq(TopReq) andalso
3007    is_ContextRequest_iepscallind(Ieps) andalso
3008    is_ContextRequest_contextProp(CtxProp) andalso
3009    is_ContextRequest_contextList(CtxList);
3010is_ContextRequest(_) ->
3011    false.
3012
3013is_ContextRequest_priority(asn1_NOVALUE) ->
3014    true;
3015is_ContextRequest_priority(V) ->
3016    is_INTEGER(V, {range, 1, 15}).
3017
3018is_ContextRequest_emergency(asn1_NOVALUE) ->
3019    true;
3020is_ContextRequest_emergency(V) ->
3021    is_BOOLEAN(V).
3022
3023is_ContextRequest_topologyReq(asn1_NOVALUE) ->
3024    true;
3025is_ContextRequest_topologyReq([]) ->
3026    true;
3027is_ContextRequest_topologyReq([H|T]) ->
3028    is_TopologyRequest(H) andalso is_ContextRequest_topologyReq(T);
3029is_ContextRequest_topologyReq(_) ->
3030    false.
3031
3032is_ContextRequest_iepscallind(asn1_NOVALUE) ->
3033    true;
3034is_ContextRequest_iepscallind(V) ->
3035    is_BOOLEAN(V).
3036
3037is_ContextRequest_contextProp(asn1_NOVALUE) ->
3038    true;
3039is_ContextRequest_contextProp([]) ->
3040    true;
3041is_ContextRequest_contextProp([H|T]) ->
3042    is_PropertyParm(H) andalso is_ContextRequest_contextProp(T);
3043is_ContextRequest_contextProp(_) ->
3044    false.
3045
3046is_ContextRequest_contextList(asn1_NOVALUE) ->
3047    true;
3048is_ContextRequest_contextList([]) ->
3049    true;
3050is_ContextRequest_contextList([H|T]) ->
3051    is_ContextID(H) andalso is_ContextRequest_contextList(T);
3052is_ContextRequest_contextList(_) ->
3053    false.
3054
3055chk_opt_ContextRequest(R1, R2) ->
3056    chk_OPTIONAL('ContextRequest', R1, R2,
3057		 fun is_ContextRequest/1, fun chk_ContextRequest/2).
3058
3059chk_ContextRequest(R, R) ->
3060    chk_type(fun is_ContextRequest/1, 'ContextRequest', R);
3061chk_ContextRequest(#'ContextRequest'{priority    = Prio1,
3062				     emergency   = Em1,
3063				     topologyReq = TopReq1,
3064				     iepscallind = Ieps1,
3065				     contextProp = CtxProp1,
3066				     contextList = CtxList1},
3067		   #'ContextRequest'{priority    = Prio2,
3068				     emergency   = Em2,
3069				     topologyReq = TopReq2,
3070				     iepscallind = Ieps2,
3071				     contextProp = CtxProp2,
3072				     contextList = CtxList2}) ->
3073    chk_ContextRequest_priority(Prio1, Prio2),
3074    chk_ContextRequest_emergency(Em1, Em2),
3075    chk_ContextRequest_topologyReq(TopReq1, TopReq2),
3076    chk_ContextRequest_iepscallind(Ieps1, Ieps2),
3077    chk_ContextRequest_contextProp(CtxProp1, CtxProp2),
3078    chk_ContextRequest_contextList(CtxList1, CtxList2),
3079    ok;
3080chk_ContextRequest(R1, R2) ->
3081    wrong_type('ContextRequest', R1, R2).
3082
3083
3084chk_ContextRequest_priority(asn1_NOVALUE,asn1_NOVALUE) ->
3085    ok;
3086chk_ContextRequest_priority(P, P) ->
3087    chk_type(fun is_ContextRequest_priority/1, 'ContextRequest_priority', P);
3088chk_ContextRequest_priority(P1, P2) ->
3089    case (is_ContextRequest_priority(P1) andalso
3090	  is_ContextRequest_priority(P2)) of
3091	true ->
3092	    not_equal('ContextRequest_priority', P1, P2);
3093	false ->
3094	    wrong_type(contextRequest_priority, P1, P2)
3095    end.
3096
3097
3098chk_ContextRequest_emergency(asn1_NOVALUE, asn1_NOVALUE) ->
3099    ok;
3100chk_ContextRequest_emergency(E, E) ->
3101    chk_type(fun is_ContextRequest_emergency/1, 'ContextRequest_emergency', E);
3102chk_ContextRequest_emergency(E1, E2) ->
3103    case (is_ContextRequest_emergency(E1) andalso
3104	  is_ContextRequest_emergency(E2)) of
3105	true ->
3106	    not_equal('ContextRequest_emergency', E1, E2);
3107	false ->
3108	    wrong_type('ContextRequest_emergency', E1, E2)
3109    end.
3110
3111chk_ContextRequest_topologyReq(asn1_NOVALUE, asn1_NOVALUE) ->
3112    ok;
3113chk_ContextRequest_topologyReq([], []) ->
3114    ok;
3115chk_ContextRequest_topologyReq([] = T1, T2) ->
3116    not_equal('ContextRequest_topologyReq', T1, T2);
3117chk_ContextRequest_topologyReq(T1, [] = T2) ->
3118    not_equal('ContextRequest_topologyReq', T1, T2);
3119chk_ContextRequest_topologyReq([H|T1], [H|T2]) ->
3120    case is_TopologyRequest(H) of
3121	true ->
3122	    chk_ContextRequest_topologyReq(T1, T2);
3123	false ->
3124	    wrong_type('ContextRequest_topologyReq_val', H)
3125    end;
3126chk_ContextRequest_topologyReq([H1|T1], [H2|T2]) ->
3127    validate(fun() -> chk_TopologyRequest(H1, H2) end,
3128	     'ContextRequest_topologyReq_val'),
3129    chk_ContextRequest_topologyReq(T1, T2);
3130chk_ContextRequest_topologyReq(T1, T2) ->
3131    wrong_type('ContextRequest_topologyReq', T1, T2).
3132
3133
3134chk_ContextRequest_iepscallind(asn1_NOVALUE, asn1_NOVALUE) ->
3135    ok;
3136chk_ContextRequest_iepscallind(E, E) ->
3137    chk_type(fun is_ContextRequest_iepscallind/1,
3138	     'ContextRequest_iepscallind', E);
3139chk_ContextRequest_iepscallind(E1, E2) ->
3140    case (is_ContextRequest_iepscallind(E1) andalso
3141	  is_ContextRequest_iepscallind(E2)) of
3142	true ->
3143	    case (((E1 == false)        and (E2 == asn1_NOVALUE)) or
3144		  ((E1 == asn1_NOVALUE) and (E2 == false))) of
3145		true ->
3146		    ok;
3147		false ->
3148		    not_equal('ContextRequest_iepscallind', E1, E2)
3149	    end;
3150
3151	false ->
3152	    wrong_type('ContextRequest_iepscallind', E1, E2)
3153    end.
3154
3155chk_ContextRequest_contextProp(asn1_NOVALUE, asn1_NOVALUE) ->
3156    ok;
3157chk_ContextRequest_contextProp([], []) ->
3158    ok;
3159chk_ContextRequest_contextProp([] = T1, T2) ->
3160    not_equal('ContextRequest_contextProp', T1, T2);
3161chk_ContextRequest_contextProp(T1, [] = T2) ->
3162    not_equal('ContextRequest_contextProp', T1, T2);
3163chk_ContextRequest_contextProp([H|T1], [H|T2]) ->
3164    case is_PropertyParm(H) of
3165	true ->
3166	    chk_ContextRequest_contextProp(T1, T2);
3167	false ->
3168	    wrong_type('ContextRequest_contextProp_val', H)
3169    end;
3170chk_ContextRequest_contextProp([H1|T1], [H2|T2]) ->
3171    validate(fun() -> chk_PropertyParm(H1, H2) end,
3172	     'ContextRequest_contextProp_val'),
3173    chk_ContextRequest_contextProp(T1, T2);
3174chk_ContextRequest_contextProp(T1, T2) ->
3175    wrong_type('ContextRequest_contextProp', T1, T2).
3176
3177chk_ContextRequest_contextList(asn1_NOVALUE, asn1_NOVALUE) ->
3178    ok;
3179chk_ContextRequest_contextList([], []) ->
3180    ok;
3181chk_ContextRequest_contextList([] = T1, T2) ->
3182    not_equal('ContextRequest_contextList', T1, T2);
3183chk_ContextRequest_contextList(T1, [] = T2) ->
3184    not_equal('ContextRequest_contextList', T1, T2);
3185chk_ContextRequest_contextList([H|T1], [H|T2]) ->
3186    case is_ContextID(H) of
3187	true ->
3188	    chk_ContextRequest_contextList(T1, T2);
3189	false ->
3190	    wrong_type('ContextRequest_contextList_val', H)
3191    end;
3192chk_ContextRequest_contextList([H1|T1], [H2|T2]) ->
3193    validate(fun() -> chk_ContextID(H1, H2) end,
3194	     'ContextRequest_contextList_val'),
3195    chk_ContextRequest_contextList(T1, T2);
3196chk_ContextRequest_contextList(T1, T2) ->
3197    wrong_type('ContextRequest_contextList', T1, T2).
3198
3199
3200%% -- ContextAttrAuditRequest --
3201
3202is_opt_ContextAttrAuditRequest(asn1_NOVALUE) ->
3203    true;
3204is_opt_ContextAttrAuditRequest(V) ->
3205    is_ContextAttrAuditRequest(V).
3206
3207is_ContextAttrAuditRequest(
3208  #'ContextAttrAuditRequest'{topology          = T,
3209			     emergency         = E,
3210			     priority          = P,
3211			     iepscallind       = I,
3212			     contextPropAud    = A,
3213			     selectpriority    = SP,
3214			     selectemergency   = SE,
3215			     selectiepscallind = SI,
3216			     selectLogic       = SL}) ->
3217    d("is_ContextAttrAuditRequest -> entry"),
3218    is_opt_NULL(T) andalso
3219	is_opt_NULL(E) andalso
3220	is_opt_NULL(P) andalso
3221	is_opt_NULL(I) andalso
3222	is_ContextAttrAuditRequest_contextPropAud(A) andalso
3223	is_ContextAttrAuditRequest_selectpriority(SP) andalso
3224	is_ContextAttrAuditRequest_selectemergency(SE) andalso
3225	is_ContextAttrAuditRequest_selectiepscallind(SI) andalso
3226	is_opt_SelectLogic(SL);
3227is_ContextAttrAuditRequest(_) ->
3228    false.
3229
3230is_ContextAttrAuditRequest_contextPropAud(asn1_NOVALUE) ->
3231    true;
3232is_ContextAttrAuditRequest_contextPropAud([]) ->
3233    true;
3234is_ContextAttrAuditRequest_contextPropAud([H|T]) ->
3235    d("is_ContextAttrAuditRequest_contextPropAud -> entry"),
3236    is_IndAudPropertyParm(H) andalso
3237	is_ContextAttrAuditRequest_contextPropAud(T).
3238
3239is_ContextAttrAuditRequest_selectpriority(asn1_NOVALUE) ->
3240    true;
3241is_ContextAttrAuditRequest_selectpriority(V) ->
3242    is_INTEGER(V, {range, 1, 15}).
3243
3244is_ContextAttrAuditRequest_selectemergency(asn1_NOVALUE) ->
3245    true;
3246is_ContextAttrAuditRequest_selectemergency(V) ->
3247    is_BOOLEAN(V).
3248
3249is_ContextAttrAuditRequest_selectiepscallind(asn1_NOVALUE) ->
3250    true;
3251is_ContextAttrAuditRequest_selectiepscallind(V) ->
3252    is_BOOLEAN(V).
3253
3254
3255chk_opt_ContextAttrAuditRequest(asn1_NOVALUE, asn1_NOVALUE) ->
3256    ok;
3257chk_opt_ContextAttrAuditRequest(R1, R2) ->
3258    chk_ContextAttrAuditRequest(R1, R2).
3259
3260chk_ContextAttrAuditRequest(R, R) ->
3261    chk_type(fun is_ContextAttrAuditRequest/1, 'ContextAttrAuditRequest', R);
3262chk_ContextAttrAuditRequest(
3263  #'ContextAttrAuditRequest'{topology          = T1,
3264			     emergency         = E1,
3265			     priority          = P1,
3266			     iepscallind       = I1,
3267			     contextPropAud    = A1,
3268			     selectpriority    = SP1,
3269			     selectemergency   = SE1,
3270			     selectiepscallind = SI1,
3271			     selectLogic       = SL1},
3272  #'ContextAttrAuditRequest'{topology          = T2,
3273			     emergency         = E2,
3274			     priority          = P2,
3275			     iepscallind       = I2,
3276			     contextPropAud    = A2,
3277			     selectpriority    = SP2,
3278			     selectemergency   = SE2,
3279			     selectiepscallind = SI2,
3280			     selectLogic       = SL2}) ->
3281    validate(fun() -> chk_opt_NULL(T1, T2) end,
3282	     'ContextAttrAuditRequest_topology'),
3283    validate(fun() -> chk_opt_NULL(E1, E2) end,
3284	     'ContextAttrAuditRequest_emergency'),
3285    validate(fun() -> chk_opt_NULL(P1, P2) end,
3286	     'ContextAttrAuditRequest_priority'),
3287    validate(fun() -> chk_opt_NULL(I1, I2) end,
3288	     'ContextAttrAuditRequest_iepscallind'),
3289    chk_ContextAttrAuditRequest_contextPropAud(lists:sort(A1),
3290					       lists:sort(A2)),
3291    chk_ContextAttrAuditRequest_selectpriority(SP1, SP2),
3292    chk_ContextAttrAuditRequest_selectemergency(SE1, SE2),
3293    chk_ContextAttrAuditRequest_selectiepscallind(SI1, SI2),
3294    chk_ContextAttrAuditRequest_selectLogic(SL1, SL2),
3295    ok.
3296
3297chk_ContextAttrAuditRequest_contextPropAud(asn1_NOVALUE, asn1_NOVALUE) ->
3298    ok;
3299chk_ContextAttrAuditRequest_contextPropAud(A, A) ->
3300    chk_type(fun is_ContextAttrAuditRequest_contextPropAud/1,
3301	     'ContextAttrAuditRequest_contextPropAud', A);
3302chk_ContextAttrAuditRequest_contextPropAud([], []) ->
3303    ok;
3304chk_ContextAttrAuditRequest_contextPropAud([] = T1, T2) ->
3305    not_equal('ContextAttrAuditRequest_contextPropAud', T1, T2);
3306chk_ContextAttrAuditRequest_contextPropAud(T1, [] = T2) ->
3307    not_equal('ContextAttrAuditRequest_contextPropAud', T1, T2);
3308chk_ContextAttrAuditRequest_contextPropAud([H|T1], [H|T2]) ->
3309    case is_IndAudPropertyParm(H) of
3310	true ->
3311	    chk_ContextAttrAuditRequest_contextPropAud(T1, T2);
3312	false ->
3313	    wrong_type('ContextAttrAuditRequest_contextPropAud_val', H)
3314    end;
3315chk_ContextAttrAuditRequest_contextPropAud([H1|T1], [H2|T2]) ->
3316    validate(fun() -> chk_PropertyParm(H1, H2) end,
3317	     'ContextAttrAuditRequest_contextPropAud_val'),
3318    chk_ContextAttrAuditRequest_contextPropAud(T1, T2);
3319chk_ContextAttrAuditRequest_contextPropAud(T1, T2) ->
3320    wrong_type('ContextAttrAuditRequest_contextPropAud', T1, T2).
3321
3322chk_ContextAttrAuditRequest_selectpriority(asn1_NOVALUE, asn1_NOVALUE) ->
3323    ok;
3324chk_ContextAttrAuditRequest_selectpriority(A, A) ->
3325    chk_type(fun is_ContextAttrAuditRequest_selectpriority/1,
3326	     'ContextAttrAuditRequest_selectpriority', A);
3327chk_ContextAttrAuditRequest_selectpriority(SP1, SP2) ->
3328    case (is_ContextAttrAuditRequest_selectpriority(SP1) andalso
3329	  is_ContextAttrAuditRequest_selectpriority(SP2)) of
3330	true ->
3331	    not_equal('ContextAttrAuditRequest_selectpriority', SP1, SP2);
3332	false ->
3333	    wrong_type('ContextAttrAuditRequest_selectpriority', SP1, SP2)
3334    end.
3335
3336chk_ContextAttrAuditRequest_selectemergency(asn1_NOVALUE, asn1_NOVALUE) ->
3337    ok;
3338chk_ContextAttrAuditRequest_selectemergency(A, A) ->
3339    chk_type(fun is_ContextAttrAuditRequest_selectemergency/1,
3340	     'ContextAttrAuditRequest_selectemergency', A);
3341chk_ContextAttrAuditRequest_selectemergency(SE1, SE2) ->
3342    case (is_ContextAttrAuditRequest_selectemergency(SE1) andalso
3343	  is_ContextAttrAuditRequest_selectemergency(SE2)) of
3344	true ->
3345	    not_equal('ContextAttrAuditRequest_selectemergency', SE1, SE2);
3346	false ->
3347	    wrong_type('ContextAttrAuditRequest_selectemergency', SE1, SE2)
3348    end.
3349
3350chk_ContextAttrAuditRequest_selectiepscallind(asn1_NOVALUE, asn1_NOVALUE) ->
3351    ok;
3352chk_ContextAttrAuditRequest_selectiepscallind(A, A) ->
3353    chk_type(fun is_ContextAttrAuditRequest_selectiepscallind/1,
3354	     'ContextAttrAuditRequest_selectiepscallind', A);
3355chk_ContextAttrAuditRequest_selectiepscallind(SI1, SI2) ->
3356    case (is_ContextAttrAuditRequest_selectiepscallind(SI1) andalso
3357	  is_ContextAttrAuditRequest_selectiepscallind(SI2)) of
3358	true ->
3359	    not_equal('ContextAttrAuditRequest_selectiepscallind', SI1, SI2);
3360	false ->
3361	    wrong_type('ContextAttrAuditRequest_selectiepscallind', SI1, SI2)
3362    end.
3363
3364chk_ContextAttrAuditRequest_selectLogic(SL1, SL2) ->
3365    validate(fun() -> chk_opt_SelectLogic(SL1, SL2) end,
3366	     'ContextAttrAuditRequest_selectLogic').
3367
3368
3369%% -- SelectLogic --
3370
3371is_opt_SelectLogic(asn1_NOVALUE) ->
3372    true;
3373is_opt_SelectLogic(SL) ->
3374    is_SelectLogic(SL).
3375
3376is_SelectLogic({Tag, Val}) ->
3377    d("is_SelectLogic -> entry"),
3378    is_SelectLogic_tag(Tag) andalso is_SelectLogic_val(Tag, Val);
3379is_SelectLogic(_) ->
3380    false.
3381
3382is_SelectLogic_tag(Tag) ->
3383    Tags = [andAUDITSelect, orAUDITSelect],
3384    lists:member(Tag, Tags).
3385
3386is_SelectLogic_val(andAUDITSelect, 'NULL') -> true;
3387is_SelectLogic_val(orAUDITSelect,  'NULL') -> true;
3388is_SelectLogic_val(_, _) -> false.
3389
3390chk_opt_SelectLogic(asn1_NOVALUE, asn1_NOVALUE) ->
3391    ok;
3392chk_opt_SelectLogic(SL1, SL2) ->
3393    chk_SelectLogic(SL1, SL2).
3394
3395chk_SelectLogic(SL, SL) ->
3396    chk_type(fun is_SelectLogic/1, 'SelectLogic', SL);
3397chk_SelectLogic(asn1_NOVALUE, {andAUDITSelect, 'NULL'}) ->
3398    ok; % AND is default
3399chk_SelectLogic({andAUDITSelect, 'NULL'}, asn1_NOVALUE) ->
3400    ok; % AND is default
3401chk_SelectLogic({Tag, Val1} = SL1, {Tag, Val2} = SL2) ->
3402    case (is_SelectLogic_tag(Tag) andalso
3403	  is_SelectLogic_val(Tag, Val1) andalso
3404	  is_SelectLogic_val(Tag, Val2)) of
3405	true ->
3406	    chk_SelectLogic_val(Tag, Val1, Val2);
3407	false ->
3408	    wrong_type('SelectLogic', SL1, SL2)
3409    end;
3410chk_SelectLogic({Tag1, Val1} = SL1, {Tag2, Val2} = SL2) ->
3411    case ((is_SelectLogic_tag(Tag1) andalso
3412	   is_SelectLogic_val(Tag1, Val1)) andalso
3413	  (is_SelectLogic_tag(Tag2) andalso
3414	   is_SelectLogic_val(Tag2, Val2))) of
3415	true ->
3416	    not_equal('SelectLogic', SL1, SL2);
3417	false ->
3418	    wrong_type('SelectLogic', SL1, SL2)
3419    end;
3420chk_SelectLogic(SL1, SL2) ->
3421    wrong_type('SelectLogic', SL1, SL2).
3422
3423chk_SelectLogic_val(andAUDITSelect, SL1, SL2) ->
3424    validate(fun() -> chk_NULL(SL1, SL2) end, 'SelectLogic_andAUDITSelect');
3425chk_SelectLogic_val(orAUDITSelect, SL1, SL2) ->
3426    validate(fun() -> chk_NULL(SL1, SL2) end, 'SelectLogic_orAUDITSelect').
3427
3428
3429%% -- CommandRequest --
3430
3431is_CommandRequest(#'CommandRequest'{command        = Cmd,
3432				    optional       = Opt,
3433				    wildcardReturn = WR}) ->
3434    d("is_CommandRequest -> entry with"
3435      "~n   Cmd: ~p"
3436      "~n   Opt: ~p"
3437      "~n   WR:  ~p", [Cmd, Opt, WR]),
3438    is_Command(Cmd) andalso is_opt_NULL(Opt) andalso is_opt_NULL(WR);
3439is_CommandRequest(_) ->
3440    false.
3441
3442chk_CommandRequest(C, C) ->
3443    chk_type(fun is_CommandRequest/1, 'CommandRequest', C);
3444chk_CommandRequest(#'CommandRequest'{command        = Cmd1,
3445				     optional       = Opt1,
3446				     wildcardReturn = WR1},
3447		   #'CommandRequest'{command        = Cmd2,
3448				     optional       = Opt2,
3449				     wildcardReturn = WR2}) ->
3450    validate(fun() -> chk_Command(Cmd1, Cmd2) end, 'CommandRequest'),
3451    validate(fun() -> chk_opt_NULL(Opt1, Opt2) end, 'CommandRequest'),
3452    validate(fun() -> chk_opt_NULL(WR1, WR2) end, 'CommandRequest'),
3453    ok;
3454chk_CommandRequest(R1, R2) ->
3455    wrong_type('CommandRequest', R1, R2).
3456
3457
3458%% -- Command --
3459
3460is_Command({Tag, Val}) ->
3461    d("is_Command -> entry with"
3462      "~n   Tag: ~p"
3463      "~n   Val: ~p", [Tag, Val]),
3464    is_Command_tag(Tag) andalso is_Command_val(Tag, Val);
3465is_Command(_) ->
3466    false.
3467
3468is_Command_tag(Tag) ->
3469    Tags = [addReq, moveReq, modReq, subtractReq, auditCapRequest,
3470	    auditValueRequest, notifyReq, serviceChangeReq],
3471    lists:member(Tag, Tags).
3472
3473is_Command_val(addReq,  V)           -> is_AmmRequest(V);
3474is_Command_val(moveReq, V)           -> is_AmmRequest(V);
3475is_Command_val(modReq,  V)           -> is_AmmRequest(V);
3476is_Command_val(subtractReq, V)       -> is_SubtractRequest(V);
3477is_Command_val(auditCapRequest, V)   -> is_AuditRequest(V);
3478is_Command_val(auditValueRequest, V) -> is_AuditRequest(V);
3479is_Command_val(notifyReq, V)         -> is_NotifyRequest(V);
3480is_Command_val(serviceChangeReq, V)  -> is_ServiceChangeRequest(V).
3481
3482chk_Command(Cmd, Cmd) ->
3483    chk_type(fun is_Command/1, 'Command', Cmd);
3484chk_Command({Tag, Val1} = Cmd1, {Tag, Val2} = Cmd2) ->
3485    case (is_Command_tag(Tag) andalso
3486	  is_Command_val(Tag, Val1) andalso
3487	  is_Command_val(Tag, Val2)) of
3488	true ->
3489	    chk_Command_val(Tag, Val1, Val2);
3490	false ->
3491	    wrong_type('Command', Cmd1, Cmd2)
3492    end;
3493chk_Command({Tag1, Val1} = Cmd1, {Tag2, Val2} = Cmd2) ->
3494    case ((is_Command_tag(Tag1) andalso is_Command_val(Tag1, Val1)) andalso
3495	  (is_Command_tag(Tag2) andalso is_Command_val(Tag2, Val2))) of
3496	true ->
3497	    not_equal('Command', Cmd1, Cmd2);
3498	false ->
3499	    wrong_type('Command', Cmd1, Cmd2)
3500    end;
3501chk_Command(Cmd1, Cmd2) ->
3502    wrong_type('Command', Cmd1, Cmd2).
3503
3504
3505chk_Command_val(addReq, R1, R2) ->
3506    validate(fun() -> chk_AmmRequest(R1, R2) end, 'Command_addReq');
3507chk_Command_val(moveReq, R1, R2) ->
3508    validate(fun() -> chk_AmmRequest(R1, R2) end, 'Command_moveReq');
3509chk_Command_val(modReq, R1, R2) ->
3510    validate(fun() -> chk_AmmRequest(R1, R2) end, 'Command_modReq');
3511chk_Command_val(subtractReq, R1, R2) ->
3512    validate(fun() -> chk_SubtractRequest(R1, R2) end, 'Command_subtractReq');
3513chk_Command_val(auditCapRequest, R1, R2) ->
3514    validate(fun() -> chk_AuditRequest(R1, R2) end, 'Command_auditCapRequest');
3515chk_Command_val(auditValueRequest, R1, R2) ->
3516    validate(fun() -> chk_AuditRequest(R1, R2) end,
3517	     'Command_auditValueRequest');
3518chk_Command_val(notifyReq, R1, R2) ->
3519    validate(fun() -> chk_NotifyRequest(R1, R2) end, 'Command_notifyReq');
3520chk_Command_val(serviceChangeReq, R1, R2) ->
3521    validate(fun() -> chk_ServiceChangeRequest(R1, R2) end,
3522	     'Command_serviceChangeReq').
3523
3524
3525%% -- CommandReply --
3526
3527is_CommandReply({Tag, Val}) ->
3528    d("is_CommandReply -> entry"),
3529    is_CommandReply_tag(Tag) andalso is_CommandReply_val(Tag, Val);
3530is_CommandReply(_) ->
3531    false.
3532
3533is_CommandReply_tag(Tag) ->
3534    Tags = [addReply, moveReply, modReply, subtractReply,
3535	    auditCapReply, auditValueReply, notifyReply, serviceChangeReply],
3536    lists:member(Tag, Tags).
3537
3538is_CommandReply_val(addReply, V)           -> is_AmmsReply(V);
3539is_CommandReply_val(moveReply, V)          -> is_AmmsReply(V);
3540is_CommandReply_val(modReply, V)           -> is_AmmsReply(V);
3541is_CommandReply_val(subtractReply, V)      -> is_AmmsReply(V);
3542is_CommandReply_val(auditCapReply, V)      -> is_AuditReply(V);
3543is_CommandReply_val(auditValueReply, V)    -> is_AuditReply(V);
3544is_CommandReply_val(notifyReply, V)        -> is_NotifyReply(V);
3545is_CommandReply_val(serviceChangeReply, V) -> is_ServiceChangeReply(V).
3546
3547chk_CommandReply({Tag, Val} = Cmd, Cmd) ->
3548    case (is_CommandReply_tag(Tag) andalso is_CommandReply_val(Tag, Val)) of
3549	true ->
3550	    ok;
3551	false ->
3552	    wrong_type('CommandReply', Cmd)
3553    end;
3554chk_CommandReply({Tag, Val1} = Cmd1, {Tag, Val2} = Cmd2) ->
3555    case (is_CommandReply_tag(Tag) andalso
3556	  is_CommandReply_val(Tag, Val1) andalso
3557	  is_CommandReply_val(Tag, Val2)) of
3558	true ->
3559	    chk_CommandReply_val(Tag, Val1, Val2);
3560	false ->
3561	    wrong_type('CommandReply', Cmd1, Cmd2)
3562    end;
3563chk_CommandReply({Tag1, Val1} = Cmd1, {Tag2, Val2} = Cmd2) ->
3564    case ((is_CommandReply_tag(Tag1) andalso
3565	   is_CommandReply_val(Tag1, Val1)) andalso
3566	  (is_CommandReply_tag(Tag2) andalso
3567	   is_CommandReply_val(Tag2, Val2))) of
3568	true ->
3569	    not_equal('CommandReply', Cmd1, Cmd2);
3570	false ->
3571	    wrong_type('CommandReply', Cmd1, Cmd2)
3572    end;
3573chk_CommandReply(Cmd1, Cmd2) ->
3574    wrong_type('CommandReply', Cmd1, Cmd2).
3575
3576chk_CommandReply_val(addReply, V1, V2) ->
3577    validate(fun() -> chk_AmmsReply(V1, V2) end, 'CommandReply_addReply');
3578chk_CommandReply_val(moveReply, V1, V2) ->
3579    validate(fun() -> chk_AmmsReply(V1, V2) end, 'CommandReply_moveReply');
3580chk_CommandReply_val(modReply, V1, V2) ->
3581    validate(fun() -> chk_AmmsReply(V1, V2) end, 'CommandReply_modReply');
3582chk_CommandReply_val(subtractReply, V1, V2) ->
3583    validate(fun() -> chk_AmmsReply(V1, V2) end, 'CommandReply_subtractReply');
3584chk_CommandReply_val(auditCapReply, V1, V2) ->
3585    validate(fun() -> chk_AuditReply(V1, V2) end,
3586	     'CommandReply_auditCapReply');
3587chk_CommandReply_val(auditValueReply, V1, V2) ->
3588    validate(fun() -> chk_AuditReply(V1, V2) end,
3589	     'CommandReply_auditValueReply');
3590chk_CommandReply_val(notifyReply, V1, V2) ->
3591    validate(fun() -> chk_NotifyReply(V1, V2) end, 'CommandReply_notifyReply');
3592chk_CommandReply_val(serviceChangeReply, V1, V2) ->
3593    validate(fun() -> chk_ServiceChangeReply(V1, V2) end,
3594	     'CommandReply_serviceChangeReply').
3595
3596
3597%% -- TopologyRequest --
3598
3599is_TopologyRequest(#'TopologyRequest'{terminationFrom            = F,
3600				      terminationTo              = T,
3601				      topologyDirection          = TD,
3602				      streamID                   = S,
3603				      topologyDirectionExtension = TDE}) ->
3604    d("is_TopologyRequest -> entry"),
3605    is_TerminationID(F) andalso
3606	is_TerminationID(T) andalso
3607	is_TopologyRequest_topologyDirection(TD) andalso
3608	is_opt_StreamID(S) andalso
3609	is_TopologyRequest_topologyDirectionExtension(TDE);
3610is_TopologyRequest(_) ->
3611    false.
3612
3613is_TopologyRequest_topologyDirection(D) ->
3614    lists:member(D, [bothway, isolate, oneway]).
3615
3616is_TopologyRequest_topologyDirectionExtension(asn1_NOVALUE) ->
3617    true;
3618is_TopologyRequest_topologyDirectionExtension(D) ->
3619    lists:member(D, [onewayexternal, onewayboth]).
3620
3621
3622chk_TopologyRequest(T, T) when is_record(T,'TopologyRequest') ->
3623    ok;
3624chk_TopologyRequest(#'TopologyRequest'{terminationFrom            = F1,
3625                                       terminationTo              = T1,
3626                                       topologyDirection          = TD1,
3627				       streamID                   = S1,
3628				       topologyDirectionExtension = TDE1},
3629                    #'TopologyRequest'{terminationFrom            = F2,
3630                                       terminationTo              = T2,
3631                                       topologyDirection          = TD2,
3632				       streamID                   = S2,
3633				       topologyDirectionExtension = TDE2}) ->
3634    validate(fun() -> chk_TerminationID(F1, F2) end,
3635	     'TopologyRequest_terminationFrom'),
3636    validate(fun() -> chk_TerminationID(T1, T2) end,
3637	     'TopologyRequest_terminationTo'),
3638    chk_TopologyRequest_topologyDirection(TD1, TD2),
3639    validate(fun() -> chk_opt_StreamID(S1, S2) end,
3640	     'TopologyRequest_streamID'),
3641    chk_TopologyRequest_topologyDirectionExtension(TDE1, TDE2),
3642    ok.
3643
3644chk_TopologyRequest_topologyDirection(D, D) ->
3645    case is_TopologyRequest_topologyDirection(D) of
3646	true ->
3647	    ok;
3648	false ->
3649	    wrong_type('TopologyRequest_topologyDirection', D)
3650    end;
3651chk_TopologyRequest_topologyDirection(D1, D2) ->
3652    case (is_TopologyRequest_topologyDirection(D1) andalso
3653	  is_TopologyRequest_topologyDirection(D1)) of
3654	true ->
3655	    not_equal('TopologyRequest_topologyDirection', D1, D2);
3656	false ->
3657	    wrong_type('TopologyRequest_topologyDirection', D1, D2)
3658    end.
3659
3660chk_TopologyRequest_topologyDirectionExtension(asn1_NOVALUE, asn1_NOVALUE) ->
3661    ok;
3662chk_TopologyRequest_topologyDirectionExtension(D, D) ->
3663    case is_TopologyRequest_topologyDirectionExtension(D) of
3664	true ->
3665	    ok;
3666	false ->
3667	    wrong_type('TopologyRequest_topologyDirectionExtension', D)
3668    end;
3669chk_TopologyRequest_topologyDirectionExtension(D1, D2) ->
3670    case (is_TopologyRequest_topologyDirectionExtension(D1) andalso
3671	  is_TopologyRequest_topologyDirectionExtension(D1)) of
3672	true ->
3673	    not_equal('TopologyRequest_topologyDirectionExtension', D1, D2);
3674	false ->
3675	    wrong_type('TopologyRequest_topologyDirectionExtension', D1, D2)
3676    end.
3677
3678
3679%% -- AmmRequest --
3680
3681is_AmmRequest(#'AmmRequest'{terminationID = Tids,
3682			    descriptors   = Descs}) ->
3683    d("is_AmmRequest -> entry with"
3684      "~n   Tids:  ~p", [Tids]),
3685    is_TerminationIDList(Tids) andalso is_AmmRequest_descriptors(Descs);
3686is_AmmRequest(_) ->
3687    false.
3688
3689is_AmmRequest_descriptors(Descs) ->
3690    d("is_AmmRequest_descriptors -> entry"),
3691    is_AmmRequest_descriptors(Descs, []).
3692
3693is_AmmRequest_descriptors([], _) ->
3694    true;
3695is_AmmRequest_descriptors([{Tag, _} = Desc|Descs], FoundDescs) ->
3696    d("is_AmmRequest_descriptors -> entry with"
3697      "~n   Tag:        ~p"
3698      "~n   FoundDescs: ~p", [Tag, FoundDescs]),
3699    case lists:member(Tag, FoundDescs) of
3700	true ->
3701	    atmost_once('AmmRequest_descriptors', Tag);
3702	false ->
3703	    case is_AmmDescriptor(Desc) of
3704		true ->
3705		    is_AmmRequest_descriptors(Descs, [Tag|FoundDescs]);
3706		false ->
3707		    wrong_type('AmmRequest_descriptors', Desc)
3708	    end
3709    end;
3710is_AmmRequest_descriptors(Descs, _) ->
3711    d("is_AmmRequest_descriptors -> entry with WRONG TYPE"
3712      "~n   Descs: ~p", [Descs]),
3713    wrong_type('AmmRequest_descriptors', Descs).
3714
3715
3716chk_AmmRequest(R, R) when is_record(R, 'AmmRequest') ->
3717    d("chk_AmmRequest -> entry when equal"),
3718    chk_type(fun is_AmmRequest/1, 'AmmRequest', R);
3719chk_AmmRequest(#'AmmRequest'{terminationID = Tids1,
3720			     descriptors   = Descs1},
3721	       #'AmmRequest'{terminationID = Tids2,
3722			     descriptors   = Descs2}) ->
3723    d("chk_AmmRequest -> entry with not equal"
3724      "~n   Tids1:  ~p"
3725      "~n   Tids2:  ~p", [Tids1, Tids2]),
3726    validate(
3727      fun() -> chk_TerminationIDList(Tids1, Tids2) end,
3728      'AmmRequest'),
3729    validate(
3730      fun() -> chk_AmmRequest_descriptors(Descs1, Descs2) end,
3731      'AmmRequest'),
3732    ok.
3733
3734
3735chk_AmmRequest_descriptors([], []) ->
3736    d("chk_AmmRequest_descriptors -> done when OK"),
3737    ok;
3738chk_AmmRequest_descriptors([] = Descs1, Descs2) ->
3739    d("chk_AmmRequest_descriptors -> done when NOT EQUAL:"
3740      "~n   Descs1: ~p"
3741      "~n   Descs1: ~p", [Descs1, Descs2]),
3742    not_equal('AmmRequest_descriptors', Descs1, Descs2);
3743chk_AmmRequest_descriptors(Descs1, [] = Descs2) ->
3744    d("chk_AmmRequest_descriptors -> done when NOT EQUAL:"
3745      "~n   Descs1: ~p"
3746      "~n   Descs1: ~p", [Descs1, Descs2]),
3747    not_equal('AmmRequest_descriptors', Descs1, Descs2);
3748chk_AmmRequest_descriptors([H|T1], [H|T2]) ->
3749    d("chk_AmmRequest_descriptors -> entry when equal"),
3750    case is_AmmDescriptor(H) of
3751	true ->
3752	    chk_AmmRequest_descriptors(T1, T2);
3753	false ->
3754	    wrong_type('AmmRequest_descriptors_val', H)
3755    end;
3756chk_AmmRequest_descriptors([H1|T1], [H2|T2]) ->
3757    d("chk_AmmRequest_descriptors -> entry when not equal"),
3758    validate(fun() -> chk_AmmDescriptor(H1, H2) end,
3759	     'AmmRequest_descriptors_val'),
3760    chk_AmmRequest_descriptors(T1, T2);
3761chk_AmmRequest_descriptors(Descs1, Descs2) ->
3762    d("chk_AmmRequest_descriptors -> done when WRONG TYPE:"
3763      "~n   Descs1: ~p"
3764      "~n   Descs1: ~p", [Descs1, Descs2]),
3765    wrong_type('AmmRequest_descriptors', Descs1, Descs2).
3766
3767
3768%% -- AmmDescriptor --
3769
3770is_AmmDescriptor({Tag, Val}) ->
3771    d("is_AmmDescriptor -> entry with"
3772      "~n   Tag: ~p"
3773      "~n   Val: ~p",[Tag, Val]),
3774    is_AmmDescriptor_tag(Tag) andalso is_AmmDescriptor_val(Tag, Val);
3775is_AmmDescriptor(_) ->
3776    false.
3777
3778is_AmmDescriptor_tag(Tag) ->
3779    Tags = [mediaDescriptor, modemDescriptor, muxDescriptor, eventsDescriptor,
3780	    eventBufferDescriptor, signalsDescriptor, digitMapDescriptor,
3781	    auditDescriptor, statisticsDescriptor],
3782    lists:member(Tag, Tags).
3783
3784is_AmmDescriptor_val(mediaDescriptor, D) ->
3785    is_MediaDescriptor(D);
3786is_AmmDescriptor_val(modemDescriptor, D) ->
3787    is_ModemDescriptor(D);
3788is_AmmDescriptor_val(muxDescriptor, D) ->
3789    is_MuxDescriptor(D);
3790is_AmmDescriptor_val(eventsDescriptor, D) ->
3791    is_EventsDescriptor(D);
3792is_AmmDescriptor_val(eventBufferDescriptor, D) ->
3793    is_EventBufferDescriptor(D);
3794is_AmmDescriptor_val(signalsDescriptor, D) ->
3795    is_SignalsDescriptor(D);
3796is_AmmDescriptor_val(digitMapDescriptor, D) ->
3797    is_DigitMapDescriptor(D);
3798is_AmmDescriptor_val(auditDescriptor, D) ->
3799    is_AuditDescriptor(D);
3800is_AmmDescriptor_val(statisticsDescriptor, D) ->
3801    is_StatisticsDescriptor(D).
3802
3803chk_AmmDescriptor(D, D) ->
3804    chk_type(fun is_AmmDescriptor_tag/1, 'AmmDescriptor', D);
3805chk_AmmDescriptor({Tag, Val1} = Cmd1, {Tag, Val2} = Cmd2) ->
3806    case (is_AmmDescriptor_tag(Tag) andalso
3807	  is_AmmDescriptor_val(Tag, Val1) andalso
3808	  is_AmmDescriptor_val(Tag, Val2)) of
3809	true ->
3810	    chk_AmmDescriptor_val(Tag, Val1, Val2);
3811	false ->
3812	    wrong_type('AmmDescriptor', Cmd1, Cmd2)
3813    end;
3814chk_AmmDescriptor({Tag1, Val1} = Cmd1, {Tag2, Val2} = Cmd2) ->
3815    case ((is_AmmDescriptor_tag(Tag1) andalso
3816	   is_AmmDescriptor_val(Tag1, Val1)) andalso
3817	  (is_AmmDescriptor_tag(Tag2) andalso
3818	   is_AmmDescriptor_val(Tag2, Val2))) of
3819	true ->
3820	    not_equal('AmmDescriptor', Cmd1, Cmd2);
3821	false ->
3822	    wrong_type('AmmDescriptor', Cmd1, Cmd2)
3823    end;
3824chk_AmmDescriptor(Cmd1, Cmd2) ->
3825    wrong_type('AmmDescriptor', Cmd1, Cmd2).
3826
3827chk_AmmDescriptor_val(mediaDescriptor, D1, D2) ->
3828    validate(fun() -> chk_MediaDescriptor(D1, D2) end, 'AmmDescriptor');
3829chk_AmmDescriptor_val(modemDescriptor, D1, D2) ->
3830    validate(fun() -> chk_ModemDescriptor(D1, D2) end, 'AmmDescriptor');
3831chk_AmmDescriptor_val(muxDescriptor, D1, D2) ->
3832    validate(fun() -> chk_MuxDescriptor(D1, D2) end, 'AmmDescriptor');
3833chk_AmmDescriptor_val(eventsDescriptor, D1, D2) ->
3834    validate(fun() -> chk_EventsDescriptor(D1, D2) end, 'AmmDescriptor');
3835chk_AmmDescriptor_val(eventBufferDescriptor, D1, D2) ->
3836    validate(fun() -> chk_EventBufferDescriptor(D1, D2) end, 'AmmDescriptor');
3837chk_AmmDescriptor_val(signalsDescriptor, D1, D2) ->
3838    validate(fun() -> chk_SignalsDescriptor(D1, D2) end, 'AmmDescriptor');
3839chk_AmmDescriptor_val(digitMapDescriptor, D1, D2) ->
3840    validate(fun() -> chk_DigitMapDescriptor(D1, D2) end, 'AmmDescriptor');
3841chk_AmmDescriptor_val(auditDescriptor, D1, D2) ->
3842    validate(fun() -> chk_AuditDescriptor(D1, D2) end, 'AmmDescriptor').
3843
3844
3845%% -- AmmsReply --
3846
3847is_AmmsReply(#'AmmsReply'{terminationID    = Tids,
3848			  terminationAudit = TA}) ->
3849    is_TerminationIDList(Tids) andalso is_opt_TerminationAudit(TA);
3850is_AmmsReply(_) ->
3851    false.
3852
3853chk_AmmsReply(R, R) ->
3854    is_AmmsReply(R);
3855chk_AmmsReply(#'AmmsReply'{terminationID    = TID1,
3856			   terminationAudit = TA1},
3857	      #'AmmsReply'{terminationID    = TID2,
3858			   terminationAudit = TA2}) ->
3859    validate(fun() -> chk_TerminationIDList(TID1, TID2) end, 'AmmsReply'),
3860    validate(fun() -> chk_opt_TerminationAudit(TA1, TA2) end, 'AmmsReply'),
3861    ok;
3862chk_AmmsReply(R1, R2) ->
3863    wrong_type('AmmsReply', R1, R2).
3864
3865
3866%% -- SubtractRequest --
3867
3868is_SubtractRequest(#'SubtractRequest'{terminationID   = TID,
3869				      auditDescriptor = AD}) ->
3870    d("is_SubtractDescriptor -> entry with"
3871      "~n   TID: ~p"
3872      "~n   AD:  ~p",[TID, AD]),
3873    is_TerminationIDList(TID) andalso is_opt_AuditDescriptor(AD);
3874is_SubtractRequest(_) ->
3875    false.
3876
3877chk_SubtractRequest(R, R) ->
3878    chk_type(fun is_SubtractRequest/1, 'SubtractRequest', R);
3879chk_SubtractRequest(#'SubtractRequest'{terminationID   = Tids1,
3880				       auditDescriptor = AD1},
3881		    #'SubtractRequest'{terminationID   = Tids2,
3882				       auditDescriptor = AD2}) ->
3883    validate(fun() -> chk_TerminationIDList(Tids1, Tids2) end,
3884	     'SubtractRequest'),
3885    validate(fun() -> chk_opt_AuditDescriptor(AD1, AD2) end,
3886	     'SubtractRequest'),
3887    ok;
3888chk_SubtractRequest(SR1, SR2) ->
3889    wrong_type('SubtractRequest', SR1, SR2).
3890
3891
3892%% -- AuditRequest --
3893
3894is_AuditRequest(#'AuditRequest'{terminationID     = TID,
3895				auditDescriptor   = AD,
3896				terminationIDList = asn1_NOVALUE}) ->
3897    d("is_AuditRequest -> entry with"
3898      "~n   TID: ~p"
3899      "~n   AD:  ~p",[TID, AD]),
3900    is_TerminationID(TID) andalso
3901	is_AuditDescriptor(AD);
3902is_AuditRequest(#'AuditRequest'{terminationID     = TID,
3903				auditDescriptor   = AD,
3904				terminationIDList = [TID|_] = TIDs}) ->
3905    d("is_AuditRequest -> entry with"
3906      "~n   TID:   ~p"
3907      "~n   AD:    ~p"
3908      "~n   TIDs:  ~p",[TID, AD, TIDs]),
3909    is_TerminationID(TID) andalso
3910	is_AuditDescriptor(AD) andalso
3911	is_TerminationIDList(TIDs);
3912is_AuditRequest(_) ->
3913    false.
3914
3915chk_AuditRequest(R, R) ->
3916    chk_type(fun is_AuditRequest/1, 'AuditRequest', R);
3917chk_AuditRequest(#'AuditRequest'{terminationID     = TID1,
3918				 auditDescriptor   = AD1,
3919				 terminationIDList = [TID1|_] = TIDs1},
3920		 #'AuditRequest'{terminationID     = TID2,
3921				 auditDescriptor   = AD2,
3922				 terminationIDList = [TID2|_] = TIDs2}) ->
3923    validate(fun() -> chk_TerminationID(TID1, TID2) end,
3924	     'AuditRequest'),
3925    validate(fun() -> chk_AuditDescriptor(AD1, AD2) end,
3926	     'AuditRequest'),
3927    validate(fun() -> chk_opt_TerminationIDList(TIDs1, TIDs2) end,
3928	     'AuditRequest'),
3929    ok;
3930chk_AuditRequest(AR1, AR2) ->
3931    wrong_type('AuditRequest', AR1, AR2).
3932
3933
3934%% -- AuditReply --
3935
3936is_AuditReply({Tag, Val}) ->
3937    is_AuditReply_tag(Tag) andalso is_AuditReply_val(Tag, Val);
3938is_AuditReply(_) ->
3939    false.
3940
3941is_AuditReply_tag(Tag) ->
3942    Tags = [contextAuditResult, error, auditResult, auditResultTermList],
3943    lists:member(Tag, Tags).
3944
3945is_AuditReply_val(contextAuditResult, Val) ->
3946    is_TerminationIDList(Val);
3947is_AuditReply_val(error, Val) ->
3948    is_ErrorDescriptor(Val);
3949is_AuditReply_val(auditResult, Val) ->
3950    is_AuditResult(Val);
3951is_AuditReply_val(auditResultTermList, Val) ->
3952    is_TermListAuditResult(Val).
3953
3954chk_AuditReply(R, R) ->
3955    chk_type(fun is_AuditReply/1, 'AuditReply', R);
3956chk_AuditReply({Tag, Val1} = R1, {Tag, Val2} = R2) ->
3957    case (is_AuditReply_tag(Tag) andalso
3958	  is_AuditReply_val(Tag, Val1)andalso
3959	  is_AuditReply_val(Tag, Val2)) of
3960	true ->
3961	    chk_AuditReply_val(Tag, Val1, Val2);
3962	false ->
3963	    wrong_type('AuditReply', R1, R2)
3964    end;
3965chk_AuditReply({Tag1, Val1} = R1, {Tag2, Val2} = R2) ->
3966    case ((is_AuditReply_tag(Tag1) andalso
3967	   is_AuditReply_val(Tag1, Val1)) andalso
3968	  (is_AuditReply_tag(Tag2) andalso
3969	   is_AuditReply_val(Tag2, Val2))) of
3970	true ->
3971	    not_equal('AuditReply', R1, R2);
3972	false ->
3973	    wrong_type('AuditReply', R1, R2)
3974    end;
3975chk_AuditReply(AR1, AR2) ->
3976    wrong_type('AuditReply', AR1, AR2).
3977
3978chk_AuditReply_val(contextAuditResult, Val1, Val2) ->
3979    chk_TerminationIDList(Val1, Val2);
3980chk_AuditReply_val(error, Val1, Val2) ->
3981    chk_ErrorDescriptor(Val1, Val2);
3982chk_AuditReply_val(auditResult, Val1, Val2) ->
3983    chk_AuditResult(Val1, Val2);
3984chk_AuditReply_val(auditResultTermList, Val1, Val2) ->
3985    chk_TermListAuditResult(Val1, Val2).
3986
3987
3988%% -- AuditResult --
3989
3990is_AuditResult(#'AuditResult'{terminationID          = TID,
3991			      terminationAuditResult = TAR}) ->
3992    is_TerminationID(TID) andalso is_TerminationAudit(TAR);
3993is_AuditResult(_) ->
3994    false.
3995
3996chk_AuditResult(R, R) ->
3997    d("chk_AuditResult -> entry (1)"),
3998    chk_type(fun is_AuditResult/1, 'AuditResult', R);
3999chk_AuditResult(#'AuditResult'{terminationID          = TID1,
4000			       terminationAuditResult = TAR1},
4001		#'AuditResult'{terminationID          = TID2,
4002			       terminationAuditResult = TAR2}) ->
4003    d("chk_AuditResult -> entry (2)"),
4004    validate(fun() -> chk_TerminationID(TID1, TID2) end, 'AuditResult'),
4005    validate(fun() -> chk_TerminationAudit(TAR1, TAR2) end, 'AuditResult'),
4006    ok;
4007chk_AuditResult(AR1, AR2) ->
4008    d("chk_AuditResult -> entry (3)"),
4009    wrong_type('AuditResult', AR1, AR2).
4010
4011
4012%% -- TermListAuditResult --
4013
4014is_TermListAuditResult(#'TermListAuditResult'{terminationIDList      = TIDs,
4015					      terminationAuditResult = TAR}) ->
4016    is_TerminationIDList(TIDs) andalso is_TerminationAudit(TAR);
4017is_TermListAuditResult(_) ->
4018    false.
4019
4020chk_TermListAuditResult(TLAR, TLAR) ->
4021    d("chk_TermListAuditResult(1) -> entry with"
4022      "~n   TLAR: ~p", [TLAR]),
4023    chk_type(fun is_TermListAuditResult/1, 'TermListAuditResult', TLAR);
4024chk_TermListAuditResult(
4025  #'TermListAuditResult'{terminationIDList      = TIDs1,
4026			 terminationAuditResult = TAR1},
4027  #'TermListAuditResult'{terminationIDList      = TIDs2,
4028			 terminationAuditResult = TAR2}) ->
4029    d("chk_TermListAuditResult(2) -> entry with"
4030      "~n   TIDs1: ~p"
4031      "~n   TAR1:  ~p"
4032      "~n   TIDs2: ~p"
4033      "~n   TAR2:  ~p", [TIDs1, TAR1, TIDs2, TAR2]),
4034    validate(fun() -> chk_TerminationIDList(TIDs1, TIDs2) end,
4035	     'TermListAuditResult_terminationIDList'),
4036    validate(fun() -> chk_TerminationAudit(TAR1, TAR2) end,
4037	     'TermListAuditResult_terminationAuditResult'),
4038    ok;
4039chk_TermListAuditResult(TLAR1, TLAR2) ->
4040    d("chk_TermListAuditResult(3) -> entry with"
4041      "~n   TLAR1: ~p"
4042      "~n   TLAR2: ~p", [TLAR1, TLAR2]),
4043    wrong_type('TermListAuditResult', TLAR1, TLAR2).
4044
4045
4046%% -- TerminationAudit --
4047
4048is_opt_TerminationAudit(TA) ->
4049    is_OPTIONAL(fun is_TerminationAudit/1, TA).
4050
4051is_TerminationAudit([]) ->
4052    true;
4053is_TerminationAudit([H|T]) ->
4054    is_AuditReturnParameter(H) andalso is_TerminationAudit(T);
4055is_TerminationAudit(_) ->
4056    false.
4057
4058chk_opt_TerminationAudit(TA1, TA2) ->
4059    d("chk_opt_TerminationAudit -> entry with"
4060      "~n   TA1: ~p"
4061      "~n   TA2: ~p", [TA1, TA2]),
4062    chk_OPTIONAL('TerminationAudit',
4063		 strip_TerminationAudit(TA1),
4064		 strip_TerminationAudit(TA2),
4065		 fun is_TerminationAudit/1, fun chk_TerminationAudit/2).
4066
4067strip_TerminationAudit(L) when is_list(L) ->
4068    d("strip_TerminationAudit(1) -> entry with"
4069      "~n   L: ~p", [L]),
4070    %% Drop all empty emptyDescriptor's
4071    F = fun({emptyDescriptors, AD}) ->
4072		case AD of
4073		    #'AuditDescriptor'{auditToken         = asn1_NOVALUE,
4074				       auditPropertyToken = asn1_NOVALUE} ->
4075			true;
4076		    _ ->
4077			false
4078		end;
4079	   (_) ->
4080		false
4081	end,
4082    lists:dropwhile(F, L);
4083strip_TerminationAudit(asn1_NOVALUE) ->
4084    d("strip_TerminationAudit(2) -> entry"),
4085    [];
4086strip_TerminationAudit(X) ->
4087    d("strip_TerminationAudit(3) -> entry with"
4088      "~n   X: ~p", [X]),
4089    X.
4090
4091chk_TerminationAudit(TA1, TA2) ->
4092    d("chk_TerminationAudit -> entry with"
4093      "~n   TA1: ~p"
4094      "~n   TA2: ~p", [TA1, TA2]),
4095    do_chk_TerminationAudit(strip_TerminationAudit(TA1),
4096			    strip_TerminationAudit(TA2)).
4097
4098do_chk_TerminationAudit([], []) ->
4099    d("do_chk_TerminationAudit(1) -> entry"),
4100    ok;
4101do_chk_TerminationAudit([], asn1_NOVALUE) ->
4102    d("do_chk_TerminationAudit(2) -> entry"),
4103    ok;
4104do_chk_TerminationAudit(asn1_NOVALUE, []) ->
4105    d("do_chk_TerminationAudit(3) -> entry"),
4106    ok;
4107do_chk_TerminationAudit([] = TA1, TA2) ->
4108    d("do_chk_TerminationAudit(4) -> entry with"
4109      "~n   TA2: ~p", [TA2]),
4110    not_equal('TerminationAudit', TA1, TA2);
4111do_chk_TerminationAudit(TA1, [] = TA2) ->
4112    d("do_chk_TerminationAudit(5) -> entry with"
4113      "~n   TA1: ~p", [TA1]),
4114    not_equal('TerminationAudit', TA1, TA2);
4115do_chk_TerminationAudit([H|T1], [H|T2]) ->
4116    d("do_chk_TerminationAudit(6) -> entry with"
4117      "~n   H: ~p", [H]),
4118    case is_AuditReturnParameter(H) of
4119	true ->
4120	    do_chk_TerminationAudit(T1, T2);
4121	false ->
4122	    wrong_type('TerminationAudit', H)
4123    end;
4124do_chk_TerminationAudit([H1|T1], [H2|T2]) ->
4125    d("do_chk_TerminationAudit(7) -> entry with"
4126      "~n   H1: ~p"
4127      "~n   H2: ~p", [H1, H2]),
4128    chk_AuditReturnParameter(H1, H2),
4129    do_chk_TerminationAudit(T1, T2);
4130do_chk_TerminationAudit(TA1, TA2) ->
4131    d("do_chk_TerminationAudit(8) -> entry with"
4132      "~n   TA1: ~p"
4133      "~n   TA2: ~p", [TA1, TA2]),
4134    not_equal('TerminationAudit', TA1, TA2).
4135
4136
4137%% -- AuditReturnParameter --
4138
4139is_AuditReturnParameter({Tag, Val}) ->
4140    is_AuditReturnParameter_tag(Tag) andalso
4141	is_AuditReturnParameter_val(Tag, Val);
4142is_AuditReturnParameter(_) ->
4143    false.
4144
4145is_AuditReturnParameter_tag(Tag) ->
4146    Tags = [errorDescriptor,
4147	    mediaDescriptor,
4148	    modemDescriptor,
4149	    muxDescriptor,
4150	    eventsDescriptor,
4151	    eventBufferDescriptor,
4152	    signalsDescriptor,
4153	    digitMapDescriptor,
4154	    observedEventsDescriptor,
4155	    statisticsDescriptor,
4156	    packagesDescriptor,
4157	    emptyDescriptors],
4158    lists:member(Tag, Tags).
4159
4160is_AuditReturnParameter_val(errorDescriptor, V) ->
4161    is_ErrorDescriptor(V);
4162is_AuditReturnParameter_val(mediaDescriptor, V) ->
4163    is_MediaDescriptor(V);
4164is_AuditReturnParameter_val(modemDescriptor, V) ->
4165    is_ModemDescriptor(V);
4166is_AuditReturnParameter_val(muxDescriptor, V) ->
4167    is_MuxDescriptor(V);
4168is_AuditReturnParameter_val(eventsDescriptor, V) ->
4169    is_EventsDescriptor(V);
4170is_AuditReturnParameter_val(eventBufferDescriptor, V) ->
4171    is_EventBufferDescriptor(V);
4172is_AuditReturnParameter_val(signalsDescriptor, V) ->
4173    is_SignalsDescriptor(V);
4174is_AuditReturnParameter_val(digitMapDescriptor, V) ->
4175    is_DigitMapDescriptor(V);
4176is_AuditReturnParameter_val(observedEventsDescriptor, V) ->
4177    is_ObservedEventsDescriptor(V);
4178is_AuditReturnParameter_val(statisticsDescriptor, V) ->
4179    is_StatisticsDescriptor(V);
4180is_AuditReturnParameter_val(packagesDescriptor, V) ->
4181    is_PackagesDescriptor(V);
4182is_AuditReturnParameter_val(emptyDescriptors, V) ->
4183    is_AuditDescriptor(V).
4184
4185chk_AuditReturnParameter(ARP, ARP) ->
4186    chk_type(fun is_AuditReturnParameter/1, 'AuditReturnParameter', ARP);
4187chk_AuditReturnParameter({Tag, Val1} = ARP1, {Tag, Val2} = ARP2) ->
4188    case (is_AuditReturnParameter_tag(Tag) andalso
4189	  is_AuditReturnParameter_val(Tag, Val1) andalso
4190	  is_AuditReturnParameter_val(Tag, Val2)) of
4191	true ->
4192	    chk_AuditReturnParameter_val(Tag, Val1, Val2);
4193	false ->
4194	    wrong_type('AuditReturnParameter', ARP1, ARP2)
4195    end;
4196chk_AuditReturnParameter({Tag1, Val1} = ARP1, {Tag2, Val2} = ARP2) ->
4197    case ((is_AuditReturnParameter_tag(Tag1) andalso
4198	   is_AuditReturnParameter_val(Tag1, Val1)) andalso
4199	  (is_AuditReturnParameter_tag(Tag2) andalso
4200	   is_AuditReturnParameter_val(Tag2, Val2))) of
4201	true ->
4202	    not_equal('AuditReturnParameter', ARP1, ARP2);
4203	false ->
4204	    wrong_type('AuditReturnParameter', ARP1, ARP2)
4205    end;
4206chk_AuditReturnParameter(ARP1, ARP2) ->
4207    wrong_type('AuditReturnParameter', ARP1, ARP2).
4208
4209chk_AuditReturnParameter_val(errorDescriptor, V1, V2) ->
4210    validate(fun() -> chk_ErrorDescriptor(V1, V2) end,
4211	     'AuditReturnParameter');
4212chk_AuditReturnParameter_val(mediaDescriptor, V1, V2) ->
4213    validate(fun() -> chk_MediaDescriptor(V1, V2) end,
4214	     'AuditReturnParameter');
4215chk_AuditReturnParameter_val(modemDescriptor, V1, V2) ->
4216    validate(fun() -> chk_ModemDescriptor(V1, V2) end,
4217	     'AuditReturnParameter');
4218chk_AuditReturnParameter_val(muxDescriptor, V1, V2) ->
4219    validate(fun() -> chk_MuxDescriptor(V1, V2) end,
4220	     'AuditReturnParameter');
4221chk_AuditReturnParameter_val(eventsDescriptor, V1, V2) ->
4222    validate(fun() -> chk_EventsDescriptor(V1, V2) end,
4223	     'AuditReturnParameter');
4224chk_AuditReturnParameter_val(eventBufferDescriptor, V1, V2) ->
4225    validate(fun() -> chk_EventBufferDescriptor(V1, V2) end,
4226	     'AuditReturnParameter');
4227chk_AuditReturnParameter_val(signalsDescriptor, V1, V2) ->
4228    validate(fun() -> chk_SignalsDescriptor(V1, V2) end,
4229	     'AuditReturnParameter');
4230chk_AuditReturnParameter_val(digitMapDescriptor, V1, V2) ->
4231    validate(fun() -> chk_DigitMapDescriptor(V1, V2) end,
4232	     'AuditReturnParameter');
4233chk_AuditReturnParameter_val(observedEventsDescriptor, V1, V2) ->
4234    validate(fun() -> chk_ObservedEventsDescriptor(V1, V2) end,
4235	     'AuditReturnParameter');
4236chk_AuditReturnParameter_val(statisticsDescriptor, V1, V2) ->
4237    validate(fun() -> chk_StatisticsDescriptor(V1, V2) end,
4238	     'AuditReturnParameter');
4239chk_AuditReturnParameter_val(packagesDescriptor, V1, V2) ->
4240    validate(fun() -> chk_PackagesDescriptor(V1, V2) end,
4241	     'AuditReturnParameter');
4242chk_AuditReturnParameter_val(emptyDescriptors, V1, V2) ->
4243    validate(fun() -> chk_AuditDescriptor(V1, V2) end,
4244	     'AuditReturnParameter').
4245
4246
4247%% -- AuditDescriptor --
4248
4249is_opt_AuditDescriptor(asn1_NOVALUE) ->
4250    true;
4251is_opt_AuditDescriptor(V) ->
4252    is_AuditDescriptor(V).
4253
4254is_AuditDescriptor(#'AuditDescriptor'{auditToken         = AT,
4255				      auditPropertyToken = APT}) ->
4256    d("is_AuditDescriptor -> entry with"
4257      "~n   AT:  ~p"
4258      "~n   APT: ~p", [AT, APT]),
4259    is_AuditDescriptor_auditToken(AT) andalso
4260	is_AuditDescriptor_auditPropertyToken(APT);
4261is_AuditDescriptor(_) ->
4262    false.
4263
4264is_AuditDescriptor_auditToken(asn1_NOVALUE) ->
4265    true;
4266is_AuditDescriptor_auditToken([]) ->
4267    true;
4268is_AuditDescriptor_auditToken([H|T]) ->
4269    is_AuditDescriptor_auditToken_val(H) andalso
4270	is_AuditDescriptor_auditToken(T);
4271is_AuditDescriptor_auditToken(_) ->
4272    false.
4273
4274is_AuditDescriptor_auditToken_val(V) ->
4275    Toks = [muxToken, modemToken, mediaToken, eventsToken, signalsToken,
4276	    digitMapToken, statsToken, observedEventsToken,
4277	    packagesToken, eventBufferToken],
4278    lists:member(V, Toks).
4279
4280is_AuditDescriptor_auditPropertyToken(asn1_NOVALUE) ->
4281    true;
4282is_AuditDescriptor_auditPropertyToken([]) ->
4283    true;
4284is_AuditDescriptor_auditPropertyToken([H|T]) ->
4285    d("is_AuditDescriptor_auditPropertyToken -> entry with"
4286      "~n   H: ~p", [H]),
4287    is_IndAuditParameter(H) andalso is_AuditDescriptor_auditPropertyToken(T);
4288is_AuditDescriptor_auditPropertyToken(_) ->
4289    false.
4290
4291chk_opt_AuditDescriptor(asn1_NOVALUE, asn1_NOVALUE) ->
4292    ok;
4293chk_opt_AuditDescriptor(AD1, AD2) ->
4294    chk_AuditDescriptor(AD1, AD2).
4295
4296chk_AuditDescriptor(AD, AD) ->
4297    chk_type(fun is_AuditDescriptor/1, 'AuditDescriptor', AD);
4298chk_AuditDescriptor(#'AuditDescriptor'{auditToken         = AT1,
4299				       auditPropertyToken = APT1},
4300		    #'AuditDescriptor'{auditToken         = AT2,
4301				       auditPropertyToken = APT2}) ->
4302    chk_AuditDescriptor_auditToken(maybe_sort(AT1), maybe_sort(AT2)),
4303    chk_AuditDescriptor_auditPropertyToken(APT1, APT2),
4304    ok;
4305chk_AuditDescriptor(AD1, AD2) ->
4306    wrong_type('AuditDescriptor', AD1, AD2).
4307
4308chk_AuditDescriptor_auditToken(asn1_NOVALUE, asn1_NOVALUE) ->
4309    ok;
4310chk_AuditDescriptor_auditToken([], []) ->
4311    ok;
4312chk_AuditDescriptor_auditToken([] = AT1, AT2) ->
4313    not_equal('AuditDescriptor_auditToken', AT1, AT2);
4314chk_AuditDescriptor_auditToken(AT1, [] = AT2) ->
4315    not_equal('AuditDescriptor_auditToken', AT1, AT2);
4316chk_AuditDescriptor_auditToken([H|T1], [H|T2]) ->
4317    case is_AuditDescriptor_auditToken_val(H) of
4318	true ->
4319	    chk_AuditDescriptor_auditToken(T1, T2);
4320	false ->
4321	    wrong_type('AuditDescriptor_auditToken_val', H)
4322    end;
4323chk_AuditDescriptor_auditToken([H1|_T1], [H2|_T2]) ->
4324    case (is_AuditDescriptor_auditToken_val(H1) andalso
4325	  is_AuditDescriptor_auditToken_val(H2)) of
4326	true ->
4327	    not_equal('AuditDescriptor_auditToken_val', H1, H2);
4328	false ->
4329	    wrong_type('AuditDescriptor_auditToken_val', H1, H2)
4330    end;
4331chk_AuditDescriptor_auditToken(AT1, AT2) ->
4332    wrong_type('AuditDescriptor_auditToken', AT1, AT2).
4333
4334chk_AuditDescriptor_auditPropertyToken(asn1_NOVALUE, asn1_NOVALUE) ->
4335    ok;
4336chk_AuditDescriptor_auditPropertyToken([], []) ->
4337    ok;
4338chk_AuditDescriptor_auditPropertyToken([] = AT1, AT2) ->
4339    not_equal('AuditDescriptor_auditPropertyToken', AT1, AT2);
4340chk_AuditDescriptor_auditPropertyToken(AT1, [] = AT2) ->
4341    not_equal('AuditDescriptor_auditPropertyToken', AT1, AT2);
4342chk_AuditDescriptor_auditPropertyToken([H|T1], [H|T2]) ->
4343    case is_IndAuditParameter(H) of
4344	true ->
4345	    chk_AuditDescriptor_auditPropertyToken(T1, T2);
4346	false ->
4347	    wrong_type('AuditDescriptor_auditPropertyToken_val', H)
4348    end;
4349chk_AuditDescriptor_auditPropertyToken([H1|_], [H2|_]) ->
4350    chk_IndAuditParameter(H1, H2),
4351    not_equal('AuditDescriptor_auditPropertyToken_val', H1, H2);
4352chk_AuditDescriptor_auditPropertyToken(AT1, AT2) ->
4353    wrong_type('AuditDescriptor_auditPropertyToken', AT1, AT2).
4354
4355
4356%% -- IndAuditParameter --
4357
4358is_IndAuditParameter({Tag, Val}) ->
4359    is_IndAuditParameter_tag(Tag) andalso is_IndAuditParameter_val(Tag, Val);
4360is_IndAuditParameter(_) ->
4361    false.
4362
4363is_IndAuditParameter_tag(Tag) ->
4364    Tags = [indAudMediaDescriptor,
4365	    indAudEventsDescriptor,
4366	    indAudEventBufferDescriptor,
4367	    indAudSignalsDescriptor,
4368	    indAudDigitMapDescriptor,
4369	    indAudStatisticsDescriptor,
4370	    indAudPackagesDescriptor],
4371    lists:member(Tag, Tags).
4372
4373is_IndAuditParameter_val(indAudMediaDescriptor, Val) ->
4374    is_IndAudMediaDescriptor(Val);
4375is_IndAuditParameter_val(indAudEventsDescriptor, Val) ->
4376    is_IndAudEventsDescriptor(Val);
4377is_IndAuditParameter_val(indAudEventBufferDescriptor, Val) ->
4378    is_IndAudEventBufferDescriptor(Val);
4379is_IndAuditParameter_val(indAudSignalsDescriptor, Val) ->
4380    is_IndAudSignalsDescriptor(Val);
4381is_IndAuditParameter_val(indAudDigitMapDescriptor, Val) ->
4382    is_IndAudDigitMapDescriptor(Val);
4383is_IndAuditParameter_val(indAudStatisticsDescriptor, Val) ->
4384    is_IndAudStatisticsDescriptor(Val);
4385is_IndAuditParameter_val(indAudPackagesDescriptor, Val) ->
4386    is_IndAudPackagesDescriptor(Val).
4387
4388chk_IndAuditParameter(IAP, IAP) ->
4389    chk_type(fun is_IndAuditParameter/1, 'IndAuditParameter', IAP);
4390chk_IndAuditParameter({Tag, Val1} = IAP1, {Tag, Val2} = IAP2) ->
4391    case (is_IndAuditParameter_tag(Tag) andalso
4392	  is_IndAuditParameter_val(Tag, Val1) andalso
4393	  is_IndAuditParameter_val(Tag, Val2)) of
4394	true ->
4395	    chk_IndAuditParameter_val(Tag, Val1, Val2);
4396	false ->
4397	    wrong_type('IndAuditParameter', IAP1, IAP2)
4398    end;
4399chk_IndAuditParameter({Tag1, Val1} = IAP1, {Tag2, Val2} = IAP2) ->
4400    case ((is_IndAuditParameter_tag(Tag1) andalso
4401	   is_IndAuditParameter_val(Tag1, Val1)) andalso
4402	  (is_IndAuditParameter_tag(Tag2) andalso
4403	   is_IndAuditParameter_val(Tag2, Val2))) of
4404	true ->
4405	    not_equal('IndAuditParameter', IAP1, IAP2);
4406	false ->
4407	    wrong_type('IndAuditParameter', IAP1, IAP2)
4408    end;
4409chk_IndAuditParameter(IAP1, IAP2) ->
4410    wrong_type('IndAuditParameter', IAP1, IAP2).
4411
4412chk_IndAuditParameter_val(indAudMediaDescriptor, Val1, Val2) ->
4413    validate(fun() -> chk_IndAudMediaDescriptor(Val1, Val2) end,
4414	     'IndAuditParameter');
4415chk_IndAuditParameter_val(indAudEventsDescriptor, Val1, Val2) ->
4416    validate(fun() -> chk_IndAudEventsDescriptor(Val1, Val2) end,
4417	     'IndAuditParameter');
4418chk_IndAuditParameter_val(indAudEventBufferDescriptor, Val1, Val2) ->
4419    validate(fun() -> chk_IndAudEventBufferDescriptor(Val1, Val2) end,
4420	     'IndAuditParameter');
4421chk_IndAuditParameter_val(indAudSignalsDescriptor, Val1, Val2) ->
4422    validate(fun() -> chk_IndAudSignalsDescriptor(Val1, Val2) end,
4423	     'IndAuditParameter');
4424chk_IndAuditParameter_val(indAudDigitMapDescriptor, Val1, Val2) ->
4425    validate(fun() -> chk_IndAudDigitMapDescriptor(Val1, Val2) end,
4426	     'IndAuditParameter');
4427chk_IndAuditParameter_val(indAudStatisticsDescriptor, Val1, Val2) ->
4428    validate(fun() -> chk_IndAudStatisticsDescriptor(Val1, Val2) end,
4429	     'IndAuditParameter');
4430chk_IndAuditParameter_val(indAudPackagesDescriptor, Val1, Val2) ->
4431    validate(fun() -> chk_IndAudPackagesDescriptor(Val1, Val2) end,
4432	     'IndAuditParameter').
4433
4434
4435%% -- IndAudMediaDescriptor --
4436
4437is_IndAudMediaDescriptor(#'IndAudMediaDescriptor'{termStateDescr = TSD,
4438						  streams        = S}) ->
4439    d("is_IndAudMediaDescriptor -> entry with"
4440      "~n   TSD: ~p"
4441      "~n   S:   ~p", [TSD, S]),
4442    is_opt_IndAudTerminationStateDescriptor(TSD) andalso
4443	is_IndAudMediaDescriptor_streams(S);
4444is_IndAudMediaDescriptor(_) ->
4445    false.
4446
4447is_IndAudMediaDescriptor_streams(asn1_NOVALUE) ->
4448    true;
4449is_IndAudMediaDescriptor_streams({Tag, Val}) ->
4450    d("is_IndAudMediaDescriptor_streams -> entry with"
4451      "~n   Tag: ~p"
4452      "~n   Val: ~p", [Tag, Val]),
4453    is_IndAudMediaDescriptor_streams_tag(Tag) andalso
4454	is_IndAudMediaDescriptor_streams_val(Tag, Val);
4455is_IndAudMediaDescriptor_streams(_) ->
4456    false.
4457
4458is_IndAudMediaDescriptor_streams_tag(Tag) ->
4459    Tags = [oneStream, multiStream],
4460    lists:member(Tag, Tags).
4461
4462is_IndAudMediaDescriptor_streams_val(oneStream, Val) ->
4463    d("is_IndAudMediaDescriptor_streams_val(oneStream) -> entry with"
4464      "~n   Val: ~p", [Val]),
4465    is_IndAudStreamParms(Val);
4466is_IndAudMediaDescriptor_streams_val(multiStream, Val) ->
4467    d("is_IndAudMediaDescriptor_streams_val(multiStream) -> entry with"
4468      "~n   Val: ~p", [Val]),
4469    is_IndAudMediaDescriptor_multiStream(Val).
4470
4471is_IndAudMediaDescriptor_multiStream([]) ->
4472    true;
4473is_IndAudMediaDescriptor_multiStream([H|T]) ->
4474    d("is_IndAudMediaDescriptor_multiStream -> entry with"
4475      "~n   H: ~p", [H]),
4476    is_IndAudStreamDescriptor(H) andalso
4477	is_IndAudMediaDescriptor_multiStream(T);
4478is_IndAudMediaDescriptor_multiStream(_) ->
4479    false.
4480
4481chk_IndAudMediaDescriptor(IAMD, IAMD) ->
4482    chk_type(fun is_IndAudMediaDescriptor/1, 'IndAudMediaDescriptor', IAMD);
4483chk_IndAudMediaDescriptor(#'IndAudMediaDescriptor'{termStateDescr = TSD1,
4484						   streams        = S1},
4485			  #'IndAudMediaDescriptor'{termStateDescr = TSD2,
4486						   streams        = S2}) ->
4487    validate(fun() -> chk_opt_IndAudTerminationStateDescriptor(TSD1, TSD2) end,
4488	     'IndAudMediaDescriptor'),
4489    validate(fun() -> chk_IndAudMediaDescriptor_streams(S1, S2) end,
4490	     'IndAudMediaDescriptor'),
4491    ok;
4492chk_IndAudMediaDescriptor(IAMD1, IAMD2) ->
4493    wrong_type('IndAudMediaDescriptor', IAMD1, IAMD2).
4494
4495chk_IndAudMediaDescriptor_streams(asn1_NOVALUE, asn1_NOVALUE) ->
4496    ok;
4497chk_IndAudMediaDescriptor_streams({Tag, Val1} = S1,
4498					     {Tag, Val2} = S2) ->
4499    case (is_IndAudMediaDescriptor_streams_tag(Tag) andalso
4500	  is_IndAudMediaDescriptor_streams_val(Tag, Val1) andalso
4501	  is_IndAudMediaDescriptor_streams_val(Tag, Val2)) of
4502	true ->
4503	    chk_IndAudMediaDescriptor_streams_val(Tag, Val1, Val2);
4504	false ->
4505	    wrong_type('IndAudMediaDescriptor_streams', S1, S2)
4506    end;
4507chk_IndAudMediaDescriptor_streams({Tag1, Val1} = S1,
4508					     {Tag2, Val2} = S2) ->
4509    case ((is_IndAudMediaDescriptor_streams_tag(Tag1) andalso
4510	   is_IndAudMediaDescriptor_streams_val(Tag1, Val1)) andalso
4511	  (is_IndAudMediaDescriptor_streams_tag(Tag2) andalso
4512	   is_IndAudMediaDescriptor_streams_val(Tag2, Val2))) of
4513	true ->
4514	    not_equal('IndAudMediaDescriptor_streams', S1, S2);
4515	false ->
4516	    wrong_type('IndAudMediaDescriptor_streams', S1, S2)
4517    end;
4518chk_IndAudMediaDescriptor_streams(S1, S2) ->
4519    wrong_type('IndAudMediaDescriptor_streams', S1, S2).
4520
4521chk_IndAudMediaDescriptor_streams_val(oneStream, Val1, Val2) ->
4522    validate(fun() -> chk_IndAudStreamParms(Val1, Val2) end,
4523	     'IndAudMediaDescriptor_streams');
4524chk_IndAudMediaDescriptor_streams_val(multiStream, Val1, Val2) ->
4525    validate(fun() -> chk_IndAudMediaDescriptor_multiStream(Val1, Val2) end,
4526	     'IndAudMediaDescriptor_streams').
4527
4528chk_IndAudMediaDescriptor_multiStream([], []) ->
4529    ok;
4530chk_IndAudMediaDescriptor_multiStream([] = MS1, MS2) ->
4531    not_equal('IndAudMediaDescriptor_multiStream', MS1, MS2);
4532chk_IndAudMediaDescriptor_multiStream(MS1, [] = MS2) ->
4533    not_equal('IndAudMediaDescriptor_multiStream', MS1, MS2);
4534chk_IndAudMediaDescriptor_multiStream([H|T1], [H|T2]) ->
4535    case is_IndAudStreamDescriptor(H) of
4536	true ->
4537	    chk_IndAudMediaDescriptor_multiStream(T1, T2);
4538	false ->
4539	    wrong_type('IndAudMediaDescriptor_multiStream_val', H)
4540    end;
4541chk_IndAudMediaDescriptor_multiStream([H1|T1], [H2|T2]) ->
4542    validate(fun() -> chk_IndAudStreamDescriptor(H1, H2) end,
4543	     'IndAudMediaDescriptor_multiStream_val'),
4544    chk_IndAudMediaDescriptor_multiStream(T1, T2);
4545chk_IndAudMediaDescriptor_multiStream(MS1, MS2) ->
4546    wrong_type('IndAudMediaDescriptor_multiStream', MS1, MS2).
4547
4548
4549%% -- IndAudStreamDescriptor --
4550
4551is_IndAudStreamDescriptor(#'IndAudStreamDescriptor'{streamID    = SID,
4552						    streamParms = Parms}) ->
4553    d("is_IndAudStreamDescriptor -> entry with"
4554      "~n   SID:   ~p"
4555      "~n   Parms: ~p", [SID, Parms]),
4556    is_StreamID(SID) andalso is_IndAudStreamParms(Parms);
4557is_IndAudStreamDescriptor(_) ->
4558    false.
4559
4560chk_IndAudStreamDescriptor(D, D) ->
4561    chk_type(fun is_IndAudStreamDescriptor/1, 'IndAudStreamDescriptor', D);
4562chk_IndAudStreamDescriptor(#'IndAudStreamDescriptor'{streamID    = SID1,
4563						     streamParms = Parms1},
4564			   #'IndAudStreamDescriptor'{streamID    = SID2,
4565						     streamParms = Parms2}) ->
4566    validate(fun() -> chk_StreamID(SID1, SID2) end, 'IndAudStreamDescriptor'),
4567    validate(fun() -> chk_IndAudStreamParms(Parms1, Parms2) end,
4568	     'IndAudStreamDescriptor'),
4569    ok;
4570chk_IndAudStreamDescriptor(D1, D2) ->
4571    wrong_type('IndAudStreamDescriptor', D1, D2).
4572
4573
4574%% -- IndAudStreamParms --
4575
4576is_IndAudStreamParms(#'IndAudStreamParms'{localControlDescriptor = LCD,
4577					  localDescriptor        = LD,
4578					  remoteDescriptor       = RD}) ->
4579    d("is_IndAudStreamParms -> entry with"
4580      "~n   LCD: ~p"
4581      "~n   LD:  ~p"
4582      "~n   RD:  ~p", [LCD, LD, RD]),
4583    is_opt_IndAudLocalControlDescriptor(LCD) andalso
4584	is_opt_IndAudLocalRemoteDescriptor(LD) andalso
4585	is_opt_IndAudLocalRemoteDescriptor(RD);
4586is_IndAudStreamParms(_) ->
4587    false.
4588
4589chk_IndAudStreamParms(#'IndAudStreamParms'{localControlDescriptor = LCD1,
4590					   localDescriptor        = LD1,
4591					   remoteDescriptor       = RD1},
4592		      #'IndAudStreamParms'{localControlDescriptor = LCD2,
4593					   localDescriptor        = LD2,
4594					   remoteDescriptor       = RD2}) ->
4595    validate(fun() -> chk_opt_IndAudLocalControlDescriptor(LCD1, LCD2) end,
4596	     'IndAudStreamParms'),
4597    validate(fun() -> chk_opt_IndAudLocalRemoteDescriptor(LD1, LD2) end,
4598	     'IndAudStreamParms'),
4599    validate(fun() -> chk_opt_IndAudLocalRemoteDescriptor(RD1, RD2) end,
4600	     'IndAudStreamParms'),
4601    ok;
4602chk_IndAudStreamParms(D1, D2) ->
4603    wrong_type('IndAudStreamParms', D1, D2).
4604
4605
4606%% -- IndAudLocalControlDescriptor --
4607
4608is_opt_IndAudLocalControlDescriptor(asn1_NOVALUE) ->
4609    true;
4610is_opt_IndAudLocalControlDescriptor(D) ->
4611    is_IndAudLocalControlDescriptor(D).
4612
4613is_IndAudLocalControlDescriptor(
4614  #'IndAudLocalControlDescriptor'{streamMode    = SM,
4615				  reserveValue  = RV,
4616				  reserveGroup  = RG,
4617				  propertyParms = PPs,
4618				  streamModeSel = SMS}) ->
4619    d("is_IndAudLocalControlDescriptor -> entry with"
4620      "~n   SM:  ~p"
4621      "~n   RV:  ~p"
4622      "~n   RG:  ~p"
4623      "~n   PPs: ~p"
4624      "~n   SMS: ~p", [SM, RV, RG, PPs, SMS]),
4625    is_opt_NULL(SM) andalso
4626	is_opt_NULL(RV) andalso
4627	is_opt_NULL(RG) andalso
4628	is_IndAudLocalControlDescriptor_propertyParms(PPs) andalso
4629	is_opt_StreamMode(SMS);
4630is_IndAudLocalControlDescriptor(_) ->
4631    false.
4632
4633is_IndAudLocalControlDescriptor_propertyParms(asn1_NOVALUE) ->
4634    true;
4635is_IndAudLocalControlDescriptor_propertyParms([]) ->
4636    true;
4637is_IndAudLocalControlDescriptor_propertyParms([H|T]) ->
4638    is_IndAudPropertyParm(H) andalso
4639	is_IndAudLocalControlDescriptor_propertyParms(T);
4640is_IndAudLocalControlDescriptor_propertyParms(_) ->
4641    false.
4642
4643chk_opt_IndAudLocalControlDescriptor(asn1_NOVALUE, asn1_NOVALUE) ->
4644    ok;
4645chk_opt_IndAudLocalControlDescriptor(
4646  #'IndAudLocalControlDescriptor'{streamMode    = SM1,
4647				  reserveValue  = RV1,
4648				  reserveGroup  = RG1,
4649				  propertyParms = PPs1,
4650				  streamModeSel = SMS1},
4651  #'IndAudLocalControlDescriptor'{streamMode    = SM2,
4652				  reserveValue  = RV2,
4653				  reserveGroup  = RG2,
4654				  propertyParms = PPs2,
4655				  streamModeSel = SMS2}) ->
4656    chk_IndAudLocalControlDescriptor_streamMode(SM1, SM2),
4657    chk_IndAudLocalControlDescriptor_reserveValue(RV1, RV2),
4658    chk_IndAudLocalControlDescriptor_reserveGroup(RG1, RG2),
4659    chk_IndAudLocalControlDescriptor_propertyParms(PPs1, PPs2),
4660    chk_IndAudLocalControlDescriptor_streamModeSel(SMS1, SMS2),
4661    ok;
4662chk_opt_IndAudLocalControlDescriptor(D1, D2) ->
4663    wrong_type('IndAudLocalControlDescriptor', D1, D2).
4664
4665chk_IndAudLocalControlDescriptor_streamMode(SM1, SM2) ->
4666    validate(fun() -> chk_opt_NULL(SM1, SM2) end,
4667	     'IndAudLocalControlDescriptor_streamMode').
4668
4669chk_IndAudLocalControlDescriptor_reserveValue(RV1, RV2) ->
4670    validate(fun() -> chk_opt_NULL(RV1, RV2) end,
4671	     'IndAudLocalControlDescriptor_reserveValue').
4672
4673chk_IndAudLocalControlDescriptor_reserveGroup(RG1, RG2) ->
4674    validate(fun() -> chk_opt_NULL(RG1, RG2) end,
4675	     'IndAudLocalControlDescriptor_reserveGroup').
4676
4677chk_IndAudLocalControlDescriptor_propertyParms(asn1_NOVALUE, asn1_NOVALUE) ->
4678    ok;
4679chk_IndAudLocalControlDescriptor_propertyParms([], []) ->
4680    ok;
4681chk_IndAudLocalControlDescriptor_propertyParms([] = PPs1, PPs2) ->
4682    not_equal('IndAudLocalControlDescriptor_propertyParms', PPs1, PPs2);
4683chk_IndAudLocalControlDescriptor_propertyParms(PPs1, [] = PPs2) ->
4684    not_equal('IndAudLocalControlDescriptor_propertyParms', PPs1, PPs2);
4685chk_IndAudLocalControlDescriptor_propertyParms([H|T1], [H|T2]) ->
4686    case is_IndAudPropertyParm(H) of
4687	true ->
4688	    chk_IndAudLocalControlDescriptor_propertyParms(T1, T2);
4689	false ->
4690	    wrong_type('IndAudLocalControlDescriptor_propertyParms_val', H)
4691    end;
4692chk_IndAudLocalControlDescriptor_propertyParms([H1|T1], [H2|T2]) ->
4693    validate(fun() -> chk_IndAudPropertyParm(H1, H2) end,
4694	     'IndAudLocalControlDescriptor_propertyParms_val'),
4695    chk_IndAudLocalControlDescriptor_propertyParms(T1, T2);
4696chk_IndAudLocalControlDescriptor_propertyParms(PPs1, PPs2) ->
4697    wrong_type('IndAudLocalControlDescriptor_propertyParms', PPs1, PPs2).
4698
4699chk_IndAudLocalControlDescriptor_streamModeSel(SMS1, SMS2) ->
4700    validate(fun() -> chk_opt_StreamMode(SMS1, SMS2) end,
4701	     'IndAudLocalControlDescriptor_streamModeSel').
4702
4703
4704%% -- IndAudPropertyParm --
4705
4706is_IndAudPropertyParm(#'IndAudPropertyParm'{name          = Name,
4707					    propertyParms = PP}) ->
4708    d("is_IndAudPropertyParm -> entry"),
4709    is_PkgdName(Name) andalso is_opt_PropertyParm(PP);
4710is_IndAudPropertyParm(_) ->
4711    false.
4712
4713chk_IndAudPropertyParm(#'IndAudPropertyParm'{name          = Name1,
4714					     propertyParms = PP1},
4715		       #'IndAudPropertyParm'{name          = Name2,
4716					     propertyParms = PP2}) ->
4717    validate(fun() -> chk_PkgdName(Name1, Name2) end, 'IndAudPropertyParm'),
4718    validate(fun() -> chk_opt_PropertyParm(PP1, PP2) end,
4719	     'IndAudPropertyParm'),
4720    ok;
4721chk_IndAudPropertyParm(P1, P2) ->
4722    wrong_type('IndAudPropertyParm', P1, P2).
4723
4724
4725%% -- IndAudLocalRemoteDescriptor --
4726
4727is_opt_IndAudLocalRemoteDescriptor(asn1_NOVALUE) ->
4728    true;
4729is_opt_IndAudLocalRemoteDescriptor(D) ->
4730    is_IndAudLocalRemoteDescriptor(D).
4731
4732is_IndAudLocalRemoteDescriptor(
4733  #'IndAudLocalRemoteDescriptor'{propGroupID = ID,
4734				 propGrps    = Grps}) ->
4735    is_IndAudLocalRemoteDescriptor_propGroupID(ID) andalso
4736	is_IndAudPropertyGroup(Grps);
4737is_IndAudLocalRemoteDescriptor(_) ->
4738    false.
4739
4740is_IndAudLocalRemoteDescriptor_propGroupID(asn1_NOVALUE) ->
4741    true;
4742is_IndAudLocalRemoteDescriptor_propGroupID(V) ->
4743    is_INTEGER(V, {range, 0, 65535}).
4744
4745chk_opt_IndAudLocalRemoteDescriptor(asn1_NOVALUE, asn1_NOVALUE) ->
4746    ok;
4747chk_opt_IndAudLocalRemoteDescriptor(D1, D2) ->
4748    chk_IndAudLocalRemoteDescriptor(D1, D2).
4749
4750chk_IndAudLocalRemoteDescriptor(D, D) ->
4751    chk_type(fun is_IndAudLocalRemoteDescriptor/1,
4752	     'IndAudLocalRemoteDescriptor', D);
4753chk_IndAudLocalRemoteDescriptor(
4754  #'IndAudLocalRemoteDescriptor'{propGroupID = ID1,
4755				 propGrps    = Grps1},
4756  #'IndAudLocalRemoteDescriptor'{propGroupID = ID2,
4757				 propGrps    = Grps2}) ->
4758    chk_IndAudLocalRemoteDescriptor_propGroupID(ID1, ID2),
4759    chk_IndAudPropertyGroup(Grps1, Grps2),
4760    ok;
4761chk_IndAudLocalRemoteDescriptor(D1, D2) ->
4762    wrong_type('IndAudLocalRemoteDescriptor', D1, D2).
4763
4764chk_IndAudLocalRemoteDescriptor_propGroupID(ID, ID) ->
4765    chk_type(fun is_IndAudLocalRemoteDescriptor_propGroupID/1,
4766	     'IndAudLocalRemoteDescriptor_propGroupID', ID);
4767chk_IndAudLocalRemoteDescriptor_propGroupID(ID1, ID2) ->
4768    case (is_IndAudLocalRemoteDescriptor_propGroupID(ID1) andalso
4769	  is_IndAudLocalRemoteDescriptor_propGroupID(ID2)) of
4770	true ->
4771	    not_equal('IndAudLocalRemoteDescriptor_propGroupID', ID1, ID2);
4772	false ->
4773	    wrong_type('IndAudLocalRemoteDescriptor_propGroupID', ID1, ID2)
4774    end.
4775
4776
4777%% -- IndAudPropertyGroup --
4778
4779is_IndAudPropertyGroup([]) ->
4780    true;
4781is_IndAudPropertyGroup([H|T]) ->
4782    is_IndAudPropertyParm(H) andalso is_IndAudPropertyGroup(T);
4783is_IndAudPropertyGroup(_) ->
4784    false.
4785
4786chk_IndAudPropertyGroup([], []) ->
4787    ok;
4788chk_IndAudPropertyGroup([] = PG1, PG2) ->
4789    not_equal('IndAudPropertyGroup', PG1, PG2);
4790chk_IndAudPropertyGroup(PG1, [] = PG2) ->
4791    not_equal('IndAudPropertyGroup', PG1, PG2);
4792chk_IndAudPropertyGroup([H|T1], [H|T2]) ->
4793    case is_IndAudPropertyParm(H) of
4794	true ->
4795	    chk_IndAudPropertyGroup(T1, T2);
4796	false ->
4797	    wrong_type('IndAudPropertyGroup_val', H)
4798    end;
4799chk_IndAudPropertyGroup([H1|T1], [H2|T2]) ->
4800    validate(fun() -> chk_IndAudPropertyParm(H1, H2) end,
4801	     'IndAudPropertyGroup_val'),
4802    chk_IndAudPropertyGroup(T1, T2);
4803chk_IndAudPropertyGroup(P1, P2) ->
4804    wrong_type('IndAudPropertyGroup', P1, P2).
4805
4806
4807%% -- IndAudTerminationStateDescriptor --
4808
4809is_opt_IndAudTerminationStateDescriptor(asn1_NOVALUE) ->
4810    true;
4811is_opt_IndAudTerminationStateDescriptor(D) ->
4812    is_IndAudTerminationStateDescriptor(D).
4813
4814is_IndAudTerminationStateDescriptor(
4815  #'IndAudTerminationStateDescriptor'{propertyParms      = Parms,
4816				      eventBufferControl = EBC,
4817				      serviceState       = SS,
4818				      serviceStateSel    = SSS}) ->
4819    is_IndAudTerminationStateDescriptor_propertyParms(Parms) andalso
4820	is_opt_NULL(EBC) andalso
4821	is_opt_NULL(SS) andalso
4822	is_opt_ServiceState(SSS);
4823is_IndAudTerminationStateDescriptor(_) ->
4824    false.
4825
4826is_IndAudTerminationStateDescriptor_propertyParms([]) ->
4827    true;
4828is_IndAudTerminationStateDescriptor_propertyParms([H|T]) ->
4829    is_IndAudPropertyParm(H) andalso
4830	is_IndAudTerminationStateDescriptor_propertyParms(T);
4831is_IndAudTerminationStateDescriptor_propertyParms(_) ->
4832    false.
4833
4834chk_opt_IndAudTerminationStateDescriptor(asn1_NOVALUE, asn1_NOVALUE) ->
4835    ok;
4836chk_opt_IndAudTerminationStateDescriptor(D1, D2) ->
4837    chk_IndAudTerminationStateDescriptor(D1, D2).
4838
4839chk_IndAudTerminationStateDescriptor(
4840  #'IndAudTerminationStateDescriptor'{propertyParms      = Parms1,
4841				      eventBufferControl = EBC1,
4842				      serviceState       = SS1,
4843				      serviceStateSel    = SSS1},
4844  #'IndAudTerminationStateDescriptor'{propertyParms      = Parms2,
4845				      eventBufferControl = EBC2,
4846				      serviceState       = SS2,
4847				      serviceStateSel    = SSS2}) ->
4848    chk_IndAudTerminationStateDescriptor_propertyParms(Parms1, Parms2),
4849    chk_IndAudTerminationStateDescriptor_eventBufferControl(EBC1, EBC2),
4850    chk_IndAudTerminationStateDescriptor_serviceState(SS1, SS2),
4851    chk_IndAudTerminationStateDescriptor_serviceStateSel(SSS1, SSS2),
4852    ok;
4853chk_IndAudTerminationStateDescriptor(D1, D2) ->
4854    wrong_type('IndAudTerminationStateDescriptor', D1, D2).
4855
4856chk_IndAudTerminationStateDescriptor_propertyParms([], []) ->
4857    ok;
4858chk_IndAudTerminationStateDescriptor_propertyParms([] = PP1, PP2) ->
4859    not_equal('IndAudTerminationStateDescriptor_propertyParms', PP1, PP2);
4860chk_IndAudTerminationStateDescriptor_propertyParms(PP1, [] = PP2) ->
4861    not_equal('IndAudTerminationStateDescriptor_propertyParms', PP1, PP2);
4862chk_IndAudTerminationStateDescriptor_propertyParms([H|T1], [H|T2]) ->
4863    case is_IndAudPropertyParm(H) of
4864	true ->
4865	    chk_IndAudTerminationStateDescriptor_propertyParms(T1, T2);
4866	false ->
4867	    wrong_type('IndAudTerminationStateDescriptor_propertyParms', H)
4868    end;
4869chk_IndAudTerminationStateDescriptor_propertyParms([H1|T1], [H2|T2]) ->
4870    validate(fun() -> chk_IndAudPropertyParm(H1, H2) end,
4871	     'IndAudTerminationStateDescriptor_propertyParms'),
4872    chk_IndAudTerminationStateDescriptor_propertyParms(T1, T2);
4873chk_IndAudTerminationStateDescriptor_propertyParms(PP1, PP2) ->
4874    wrong_type('IndAudTerminationStateDescriptor_propertyParms', PP1, PP2).
4875
4876chk_IndAudTerminationStateDescriptor_eventBufferControl(EBC1, EBC2) ->
4877    validate(fun() -> chk_opt_NULL(EBC1, EBC2) end,
4878	     'IndAudTerminationStateDescriptor_eventBufferControl').
4879
4880chk_IndAudTerminationStateDescriptor_serviceState(SS1, SS2) ->
4881    validate(fun() -> chk_opt_NULL(SS1, SS2) end,
4882	     'IndAudTerminationStateDescriptor_serviceState').
4883
4884chk_IndAudTerminationStateDescriptor_serviceStateSel(SSS1, SSS2) ->
4885    validate(fun() -> chk_opt_ServiceState(SSS1, SSS2) end,
4886	     'IndAudTerminationStateDescriptor_serviceStateSel').
4887
4888%% -- IndAudEventsDescriptor --
4889
4890is_IndAudEventsDescriptor(#'IndAudEventsDescriptor'{requestID = RID,
4891						    pkgdName  = Name,
4892						    streamID  = SID}) ->
4893    is_opt_RequestID(RID) andalso
4894	is_PkgdName(Name) andalso
4895	is_opt_StreamID(SID);
4896is_IndAudEventsDescriptor(_) ->
4897    false.
4898
4899chk_IndAudEventsDescriptor(#'IndAudEventsDescriptor'{requestID = RID1,
4900						     pkgdName  = Name1,
4901						     streamID  = SID1},
4902			   #'IndAudEventsDescriptor'{requestID = RID2,
4903						     pkgdName  = Name2,
4904						     streamID  = SID2}) ->
4905    chk_opt_RequestID(RID1, RID2),
4906    chk_PkgdName(Name1, Name2),
4907    chk_opt_StreamID(SID1, SID2),
4908    ok;
4909chk_IndAudEventsDescriptor(D1, D2) ->
4910    wrong_type('IndAudEventsDescriptor', D1, D2).
4911
4912
4913%% -- IndAudEventBufferDescriptor --
4914
4915is_IndAudEventBufferDescriptor(
4916  #'IndAudEventBufferDescriptor'{eventName = Name,
4917				 streamID  = SID}) ->
4918    is_PkgdName(Name) andalso is_opt_StreamID(SID);
4919is_IndAudEventBufferDescriptor(_) ->
4920    false.
4921
4922chk_IndAudEventBufferDescriptor(
4923  #'IndAudEventBufferDescriptor'{eventName = Name1,
4924				 streamID  = SID1},
4925  #'IndAudEventBufferDescriptor'{eventName = Name2,
4926				 streamID  = SID2}) ->
4927    chk_PkgdName(Name1, Name2),
4928    chk_opt_StreamID(SID1, SID2),
4929    ok;
4930chk_IndAudEventBufferDescriptor(D1, D2) ->
4931    wrong_type('IndAudEventBufferDescriptor', D1, D2).
4932
4933
4934%% -- IndAudSignalsDescriptor --
4935
4936is_IndAudSignalsDescriptor({Tag, Val}) ->
4937    is_IndAudSignalsDescriptor_tag(Tag) andalso
4938	is_IndAudSignalsDescriptor_val(Tag, Val);
4939is_IndAudSignalsDescriptor(_) ->
4940    false.
4941
4942is_IndAudSignalsDescriptor_tag(Tag) ->
4943    Tags = [signal, seqSigList],
4944    lists:member(Tag, Tags).
4945
4946is_IndAudSignalsDescriptor_val(signal, Val) ->
4947    is_IndAudSignal(Val);
4948is_IndAudSignalsDescriptor_val(seqSigList, Val) ->
4949    is_IndAudSeqSigList(Val).
4950
4951chk_IndAudSignalsDescriptor(D, D) ->
4952    chk_type(fun is_IndAudSignalsDescriptor/1, 'IndAudSignalsDescriptor', D);
4953chk_IndAudSignalsDescriptor({Tag, Val1} = D1, {Tag, Val2} = D2) ->
4954    case (is_IndAudSignalsDescriptor_tag(Tag) andalso
4955	  is_IndAudSignalsDescriptor_val(Tag, Val1) andalso
4956	  is_IndAudSignalsDescriptor_val(Tag, Val2)) of
4957	true ->
4958	    chk_IndAudSignalsDescriptor_val(Tag, Val1, Val2);
4959	false ->
4960	    wrong_type('IndAudSignalsDescriptor', D1, D2)
4961    end;
4962chk_IndAudSignalsDescriptor({Tag1, Val1} = D1, {Tag2, Val2} = D2) ->
4963    case ((is_IndAudSignalsDescriptor_tag(Tag1) andalso
4964	   is_IndAudSignalsDescriptor_val(Tag1, Val1)) andalso
4965	  (is_IndAudSignalsDescriptor_tag(Tag2) andalso
4966	   is_IndAudSignalsDescriptor_val(Tag2, Val2))) of
4967	true ->
4968	    not_equal('IndAudSignalsDescriptor', D1, D2);
4969	false ->
4970	    wrong_type('IndAudSignalsDescriptor', D1, D2)
4971    end;
4972chk_IndAudSignalsDescriptor(D1, D2) ->
4973    wrong_type('IndAudSignalsDescriptor', D1, D2).
4974
4975chk_IndAudSignalsDescriptor_val(signal, Val1, Val2) ->
4976    chk_IndAudSignal(Val1, Val2);
4977chk_IndAudSignalsDescriptor_val(seqSigList, Val1, Val2) ->
4978    chk_IndAudSeqSigList(Val1, Val2).
4979
4980
4981%% -- IndAudSeqSigList --
4982
4983is_IndAudSeqSigList(#'IndAudSeqSigList'{id         = ID,
4984					signalList = SL}) ->
4985    is_IndAudSeqSigList_id(ID) andalso is_opt_IndAudSignal(SL);
4986is_IndAudSeqSigList(_) ->
4987    false.
4988
4989is_IndAudSeqSigList_id(ID) -> is_INTEGER(ID, {range, 0, 65535}).
4990
4991chk_IndAudSeqSigList(L, L) ->
4992    chk_type(fun is_IndAudSeqSigList/1, 'IndAudSeqSigList', L);
4993chk_IndAudSeqSigList(#'IndAudSeqSigList'{id         = ID1,
4994					 signalList = SL1},
4995		     #'IndAudSeqSigList'{id         = ID2,
4996					 signalList = SL2}) ->
4997    chk_IndAudSeqSigList_id(ID1, ID2),
4998    chk_opt_IndAudSignal(SL1, SL2),
4999    ok;
5000chk_IndAudSeqSigList(L1, L2) ->
5001    wrong_type('IndAudSeqSigList', L1, L2).
5002
5003chk_IndAudSeqSigList_id(ID, ID) ->
5004    chk_type(fun is_IndAudSeqSigList_id/1, 'IndAudSeqSigList_id', ID);
5005chk_IndAudSeqSigList_id(ID1, ID2) ->
5006    case (is_IndAudSeqSigList_id(ID1) andalso
5007	  is_IndAudSeqSigList_id(ID2)) of
5008	true ->
5009	    not_equal('IndAudSeqSigList_id', ID1, ID2);
5010	false ->
5011	    wrong_type('IndAudSeqSigList_id', ID1, ID2)
5012    end.
5013
5014
5015%% -- IndAudSignal --
5016
5017is_opt_IndAudSignal(asn1_NOVALUE) ->
5018    true;
5019is_opt_IndAudSignal(V) ->
5020    is_IndAudSignal(V).
5021
5022is_IndAudSignal(#'IndAudSignal'{signalName      = Name,
5023				streamID        = SID,
5024				signalRequestID = SRID}) ->
5025    is_PkgdName(Name) andalso
5026	is_opt_StreamID(SID) andalso
5027	is_opt_RequestID(SRID);
5028is_IndAudSignal(_) ->
5029    false.
5030
5031chk_opt_IndAudSignal(asn1_NOVALUE, asn1_NOVALUE) ->
5032    ok;
5033chk_opt_IndAudSignal(S1, S2) ->
5034    chk_IndAudSignal(S1, S2).
5035
5036chk_IndAudSignal(S, S) ->
5037    chk_type(fun is_IndAudSignal/1, 'IndAudSignal', S);
5038chk_IndAudSignal(#'IndAudSignal'{signalName      = Name1,
5039				 streamID        = SID1,
5040				 signalRequestID = SRID1},
5041		 #'IndAudSignal'{signalName      = Name2,
5042				 streamID        = SID2,
5043				 signalRequestID = SRID2}) ->
5044    validate(fun() -> chk_PkgdName(Name1, Name2) end,
5045	     'IndAudSignal_signalName'),
5046    validate(fun() -> chk_opt_StreamID(SID1, SID2) end,
5047	     'IndAudSignal_streamID'),
5048    validate(fun() -> chk_opt_RequestID(SRID1, SRID2) end,
5049	     'IndAudSignal_signalRequestID'),
5050    ok;
5051chk_IndAudSignal(S1, S2) ->
5052    wrong_type('IndAudSignal', S1, S2).
5053
5054
5055%% -- IndAudDigitMapDescriptor --
5056
5057is_IndAudDigitMapDescriptor(
5058  #'IndAudDigitMapDescriptor'{digitMapName = Name}) ->
5059    is_opt_DigitMapName(Name);
5060is_IndAudDigitMapDescriptor(_) ->
5061    false.
5062
5063chk_IndAudDigitMapDescriptor(D, D) ->
5064    chk_type(fun is_IndAudDigitMapDescriptor/1, 'IndAudDigitMapDescriptor', D);
5065chk_IndAudDigitMapDescriptor(
5066  #'IndAudDigitMapDescriptor'{digitMapName = Name1},
5067  #'IndAudDigitMapDescriptor'{digitMapName = Name2}) ->
5068    validate(fun() -> chk_opt_DigitMapName(Name1, Name2) end,
5069	     'IndAudDigitMapDescriptor'),
5070    ok;
5071chk_IndAudDigitMapDescriptor(D1, D2) ->
5072    wrong_type('IndAudDigitMapDescriptor', D1, D2).
5073
5074
5075%% -- IndAudStatisticsDescriptor --
5076
5077is_IndAudStatisticsDescriptor(
5078  #'IndAudStatisticsDescriptor'{statName = Name}) ->
5079    is_PkgdName(Name);
5080is_IndAudStatisticsDescriptor(_) ->
5081    false.
5082
5083chk_IndAudStatisticsDescriptor(D, D) ->
5084    chk_type(fun is_IndAudStatisticsDescriptor/1,
5085	     'IndAudStatisticsDescriptor', D);
5086chk_IndAudStatisticsDescriptor(
5087  #'IndAudStatisticsDescriptor'{statName = Name1},
5088  #'IndAudStatisticsDescriptor'{statName = Name2}) ->
5089    validate(fun() -> chk_PkgdName(Name1, Name2) end,
5090	     'IndAudStatisticsDescriptor'),
5091    ok;
5092chk_IndAudStatisticsDescriptor(D1, D2) ->
5093    wrong_type('IndAudStatisticsDescriptor', D1, D2).
5094
5095
5096%% -- IndAudPackagesDescriptor --
5097
5098is_IndAudPackagesDescriptor(
5099  #'IndAudPackagesDescriptor'{packageName    = Name,
5100			      packageVersion = Ver}) ->
5101    is_Name(Name) andalso is_IndAudPackagesDescriptor_packageVersion(Ver);
5102is_IndAudPackagesDescriptor(_) ->
5103    false.
5104
5105is_IndAudPackagesDescriptor_packageVersion(V) ->
5106     is_INTEGER(V, {range, 0, 99}).
5107
5108chk_IndAudPackagesDescriptor(
5109  #'IndAudPackagesDescriptor'{packageName    = Name1,
5110			      packageVersion = Ver1},
5111  #'IndAudPackagesDescriptor'{packageName    = Name2,
5112			      packageVersion = Ver2}) ->
5113    validate(fun() -> chk_Name(Name1, Name2) end, 'IndAudPackagesDescriptor'),
5114    chk_IndAudPackagesDescriptor_packageVersion(Ver1, Ver2),
5115    ok;
5116chk_IndAudPackagesDescriptor(D1, D2) ->
5117    wrong_type('IndAudPackagesDescriptor', D1, D2).
5118
5119chk_IndAudPackagesDescriptor_packageVersion(V, V) ->
5120    chk_type(fun is_IndAudPackagesDescriptor_packageVersion/1,
5121	     'IndAudPackagesDescriptor_packageVersion', V);
5122chk_IndAudPackagesDescriptor_packageVersion(V1, V2) ->
5123    case (is_IndAudPackagesDescriptor_packageVersion(V1) andalso
5124	  is_IndAudPackagesDescriptor_packageVersion(V2)) of
5125	true ->
5126	    not_equal('IndAudPackagesDescriptor_packageVersion', V1, V2);
5127	false ->
5128	    wrong_type('IndAudPackagesDescriptor_packageVersion', V1, V2)
5129    end.
5130
5131
5132%% -- NotifyRequest --
5133
5134is_NotifyRequest(#'NotifyRequest'{terminationID            = Tids,
5135				  observedEventsDescriptor = OED,
5136				  errorDescriptor          = ED}) ->
5137    is_TerminationIDList(Tids) andalso
5138	is_ObservedEventsDescriptor(OED) andalso
5139	is_opt_ErrorDescriptor(ED);
5140is_NotifyRequest(_) ->
5141    false.
5142
5143chk_NotifyRequest(#'NotifyRequest'{terminationID            = Tids1,
5144				   observedEventsDescriptor = OED1,
5145				   errorDescriptor          = ED1},
5146		  #'NotifyRequest'{terminationID            = Tids2,
5147				   observedEventsDescriptor = OED2,
5148				   errorDescriptor          = ED2}) ->
5149    validate(fun() -> chk_TerminationIDList(Tids1, Tids2) end,
5150	     'NotifyRequest'),
5151    validate(fun() -> chk_ObservedEventsDescriptor(OED1, OED2) end,
5152	     'NotifyRequest'),
5153    validate(fun() -> chk_opt_ErrorDescriptor(ED1, ED2) end,
5154	     'NotifyRequest'),
5155    ok;
5156chk_NotifyRequest(NR1, NR2) ->
5157    wrong_type('NotifyRequest', NR1, NR2).
5158
5159
5160%% -- NotifyReply --
5161
5162is_NotifyReply(#'NotifyReply'{terminationID   = Tids,
5163			      errorDescriptor = ED}) ->
5164    is_TerminationIDList(Tids) andalso is_opt_ErrorDescriptor(ED);
5165is_NotifyReply(_) ->
5166    false.
5167
5168chk_NotifyReply(#'NotifyReply'{terminationID   = Tids1,
5169			       errorDescriptor = ED1},
5170		#'NotifyReply'{terminationID   = Tids2,
5171			       errorDescriptor = ED2}) ->
5172    validate(fun() -> chk_TerminationIDList(Tids1, Tids2) end, 'NotifyReply'),
5173    validate(fun() -> chk_opt_ErrorDescriptor(ED1, ED2) end, 'NotifyReply'),
5174    ok;
5175chk_NotifyReply(NR1, NR2) ->
5176    wrong_type('NotifyReply', NR1, NR2).
5177
5178
5179%% -- ObservedEventsDescriptor --
5180
5181is_ObservedEventsDescriptor(
5182  #'ObservedEventsDescriptor'{requestId        = RID,
5183			      observedEventLst = OEL}) ->
5184    is_RequestID(RID) andalso
5185	is_ObservedEventsDescriptor_observedEventLst(OEL);
5186is_ObservedEventsDescriptor(_) ->
5187    false.
5188
5189is_ObservedEventsDescriptor_observedEventLst([]) ->
5190    true;
5191is_ObservedEventsDescriptor_observedEventLst([H|T]) ->
5192    is_ObservedEvent(H) andalso
5193	is_ObservedEventsDescriptor_observedEventLst(T);
5194is_ObservedEventsDescriptor_observedEventLst(_) ->
5195    false.
5196
5197chk_ObservedEventsDescriptor(
5198  #'ObservedEventsDescriptor'{requestId        = RID1,
5199			      observedEventLst = OEL1},
5200  #'ObservedEventsDescriptor'{requestId        = RID2,
5201			      observedEventLst = OEL2}) ->
5202    validate(fun() -> chk_RequestID(RID1, RID2) end,
5203	     'ObservedEventsDescriptor'),
5204    validate(
5205      fun() ->
5206	      chk_ObservedEventsDescriptor_observedEventLst(OEL1, OEL2)
5207      end,
5208      'ObservedEventsDescriptor'),
5209    ok;
5210chk_ObservedEventsDescriptor(D1, D2) ->
5211    wrong_type('ObservedEventsDescriptor', D1, D2).
5212
5213chk_ObservedEventsDescriptor_observedEventLst([], []) ->
5214    ok;
5215chk_ObservedEventsDescriptor_observedEventLst([] = L1, L2) ->
5216    not_equal('ObservedEventsDescriptor_observedEventLst', L1, L2);
5217chk_ObservedEventsDescriptor_observedEventLst(L1, [] = L2) ->
5218    not_equal('ObservedEventsDescriptor_observedEventLst', L1, L2);
5219chk_ObservedEventsDescriptor_observedEventLst([H|T1], [H|T2]) ->
5220    case is_ObservedEvent(H) of
5221	true ->
5222	    chk_ObservedEventsDescriptor_observedEventLst(T1, T2);
5223	false ->
5224	    wrong_type('ObservedEventsDescriptor_observedEventLst_val', H)
5225    end;
5226chk_ObservedEventsDescriptor_observedEventLst([H1|T1], [H2|T2]) ->
5227    validate(fun() -> chk_ObservedEvent(H1, H2) end,
5228	     'ObservedEventsDescriptor_observedEventLst_val'),
5229    chk_ObservedEventsDescriptor_observedEventLst(T1, T2);
5230chk_ObservedEventsDescriptor_observedEventLst(L1, L2) ->
5231    wrong_type('ObservedEventsDescriptor_observedEventLst', L1, L2).
5232
5233
5234%% -- ObservedEvent --
5235
5236is_ObservedEvent(#'ObservedEvent'{eventName    = Name,
5237				  streamID     = SID,
5238				  eventParList = EPL,
5239				  timeNotation = TN}) ->
5240    is_EventName(Name) andalso
5241	is_opt_StreamID(SID) andalso
5242	is_ObservedEvent_eventParList(EPL) andalso
5243	is_opt_TimeNotation(TN);
5244is_ObservedEvent(_) ->
5245    false.
5246
5247is_ObservedEvent_eventParList([]) ->
5248    true;
5249is_ObservedEvent_eventParList([H|T]) ->
5250    is_EventParameter(H) andalso is_ObservedEvent_eventParList(T);
5251is_ObservedEvent_eventParList(_) ->
5252    false.
5253
5254chk_ObservedEvent(E, E) ->
5255    chk_type(fun is_ObservedEvent/1, 'ObservedEvent', E);
5256chk_ObservedEvent(#'ObservedEvent'{eventName    = Name1,
5257				   streamID     = SID1,
5258				   eventParList = EPL1,
5259				   timeNotation = TN1},
5260		  #'ObservedEvent'{eventName    = Name2,
5261				   streamID     = SID2,
5262				   eventParList = EPL2,
5263				   timeNotation = TN2}) ->
5264    validate(fun() -> chk_EventName(Name1, Name2) end, 'ObservedEvent'),
5265    validate(fun() -> chk_opt_StreamID(SID1, SID2) end, 'ObservedEvent'),
5266    chk_ObservedEvent_eventParList(EPL1, EPL2),
5267    validate(fun() -> chk_opt_TimeNotation(TN1, TN2) end, 'ObservedEvent'),
5268    ok;
5269chk_ObservedEvent(E1, E2) ->
5270    wrong_type('ObservedEvent', E1, E2).
5271
5272chk_ObservedEvent_eventParList([], []) ->
5273    ok;
5274chk_ObservedEvent_eventParList([] = EPL1, EPL2) ->
5275    not_equal('ObservedEvent_eventParList', EPL1, EPL2);
5276chk_ObservedEvent_eventParList(EPL1, [] = EPL2) ->
5277    not_equal('ObservedEvent_eventParList', EPL1, EPL2);
5278chk_ObservedEvent_eventParList([H|T1], [H|T2]) ->
5279    case is_EventParameter(H) of
5280	true ->
5281	    chk_ObservedEvent_eventParList(T1, T2);
5282	false ->
5283	    wrong_type('ObservedEvent_eventParList_val', H)
5284    end;
5285chk_ObservedEvent_eventParList([H1|T1], [H2|T2]) ->
5286    validate(fun() -> chk_EventParameter(H1, H2) end,
5287	     'ObservedEvent_eventParList'),
5288    chk_ObservedEvent_eventParList(T1, T2);
5289chk_ObservedEvent_eventParList(L1, L2) ->
5290    wrong_type('ObservedEvent_eventParList', L1, L2).
5291
5292
5293%% -- EventName --
5294
5295is_EventName(N) -> is_PkgdName(N).
5296
5297chk_EventName(N, N) ->
5298    chk_type(fun is_EventName/1, 'EventName', N);
5299chk_EventName(N1, N2) ->
5300    case (is_EventName(N1) andalso is_EventName(N2)) of
5301	true ->
5302	    not_equal('EventName', N1, N2);
5303	false ->
5304	    wrong_type('EventName', N1, N2)
5305    end.
5306
5307
5308%% -- EventParameter --
5309
5310is_EventParameter(#'EventParameter'{eventParameterName = Name,
5311				    value              = Val,
5312				    extraInfo          = EI}) ->
5313    d("is_EventParameter -> entery with"
5314      "~n   Name: ~p"
5315      "~n   Val:  ~p"
5316      "~n   EI:   ~p", [Name, Val, EI]),
5317    is_Name(Name) andalso
5318	is_Value(Val) andalso
5319	is_EventParameter_extraInfo(EI);
5320is_EventParameter(_) ->
5321    false.
5322
5323is_EventParameter_extraInfo(asn1_NOVALUE) ->
5324    true;
5325is_EventParameter_extraInfo({Tag, Val}) ->
5326    is_EventParameter_extraInfo_tag(Tag) andalso
5327	is_EventParameter_extraInfo_val(Tag, Val);
5328is_EventParameter_extraInfo(_) ->
5329    false.
5330
5331is_EventParameter_extraInfo_tag(Tag) ->
5332    Tags = [relation, range, sublist],
5333    lists:member(Tag, Tags).
5334
5335is_EventParameter_extraInfo_val(relation, Val) ->
5336    is_Relation(Val);
5337is_EventParameter_extraInfo_val(range, Val) ->
5338    is_BOOLEAN(Val);
5339is_EventParameter_extraInfo_val(sublist, Val) ->
5340    is_BOOLEAN(Val).
5341
5342chk_EventParameter(#'EventParameter'{eventParameterName = Name1,
5343				     value              = Val1,
5344				     extraInfo          = EI1},
5345		   #'EventParameter'{eventParameterName = Name2,
5346				     value              = Val2,
5347				     extraInfo          = EI2}) ->
5348    validate(fun() -> chk_Name(Name1, Name2) end, 'EventParameter'),
5349    validate(fun() -> chk_Value(Val1, Val2)  end, 'EventParameter'),
5350    chk_EventParameter_extraInfo(EI1, EI2),
5351    ok;
5352chk_EventParameter(P1, P2) ->
5353    wrong_type('EventParameter', P1, P2).
5354
5355chk_EventParameter_extraInfo(asn1_NOVALUE, asn1_NOVALUE) ->
5356    ok;
5357chk_EventParameter_extraInfo(EI, EI) ->
5358    chk_type(fun is_EventParameter_extraInfo/1,
5359	     'EventParameter_extraInfo', EI);
5360chk_EventParameter_extraInfo({Tag, Val1} = EI1, {Tag, Val2} = EI2) ->
5361    case (is_EventParameter_extraInfo_tag(Tag) andalso
5362	  is_EventParameter_extraInfo_val(Tag, Val1) andalso
5363	  is_EventParameter_extraInfo_val(Tag, Val2)) of
5364	true ->
5365	    chk_EventParameter_extraInfo_val(Tag, Val1, Val2);
5366	false ->
5367	    wrong_type('EventParameter_extraInfo', EI1, EI2)
5368    end;
5369chk_EventParameter_extraInfo({Tag1, Val1} = EI1, {Tag2, Val2} = EI2) ->
5370    case ((is_EventParameter_extraInfo_tag(Tag1) andalso
5371	   is_EventParameter_extraInfo_val(Tag1, Val1)) andalso
5372	  (is_EventParameter_extraInfo_tag(Tag2) andalso
5373	   is_EventParameter_extraInfo_val(Tag2, Val2))) of
5374	true ->
5375	    not_equal('EventParameter_extraInfo', EI1, EI2);
5376	false ->
5377	    wrong_type('EventParameter_extraInfo', EI1, EI2)
5378    end;
5379chk_EventParameter_extraInfo(EI1, EI2) ->
5380    wrong_type('EventParameter_extraInfo', EI1, EI2).
5381
5382chk_EventParameter_extraInfo_val(relation, Val1, Val2) ->
5383    validate(fun() -> chk_Relation(Val1, Val2) end,
5384	     'EventParameter_extraInfo_val');
5385chk_EventParameter_extraInfo_val(range, Val1, Val2) ->
5386    validate(fun() -> chk_BOOLEAN(Val1, Val2) end,
5387	     'EventParameter_extraInfo_val');
5388chk_EventParameter_extraInfo_val(sublist, Val1, Val2) ->
5389    validate(fun() -> chk_BOOLEAN(Val1, Val2) end,
5390	     'EventParameter_extraInfo_val').
5391
5392
5393%% -- ServiceChangeRequest --
5394
5395is_ServiceChangeRequest(#'ServiceChangeRequest'{terminationID      = Tids,
5396						serviceChangeParms = Parms}) ->
5397    is_TerminationIDList(Tids) andalso is_ServiceChangeParm(Parms);
5398is_ServiceChangeRequest(_) ->
5399    false.
5400
5401chk_ServiceChangeRequest(R, R) ->
5402    chk_type(fun is_ServiceChangeRequest/1, 'ServiceChangeRequest', R);
5403chk_ServiceChangeRequest(
5404  #'ServiceChangeRequest'{terminationID      = Tids1,
5405			  serviceChangeParms = Parms1},
5406  #'ServiceChangeRequest'{terminationID      = Tids2,
5407			  serviceChangeParms = Parms2}) ->
5408    validate(fun() -> chk_TerminationIDList(Tids1, Tids2) end,
5409	     'ServiceChangeRequest'),
5410    validate(fun() -> chk_ServiceChangeParm(Parms1, Parms2) end,
5411	     'ServiceChangeRequest'),
5412    ok;
5413chk_ServiceChangeRequest(R1, R2) ->
5414    wrong_type('ServiceChangeRequest', R1, R2).
5415
5416
5417%% -- ServiceChangeReply --
5418
5419is_ServiceChangeReply(#'ServiceChangeReply'{terminationID       = Tids,
5420					    serviceChangeResult = Res}) ->
5421    is_TerminationIDList(Tids) andalso is_ServiceChangeResult(Res);
5422is_ServiceChangeReply(_) ->
5423    false.
5424
5425chk_ServiceChangeReply(R, R) ->
5426    chk_type(fun is_ServiceChangeReply/1, 'ServiceChangeReply', R);
5427chk_ServiceChangeReply(
5428  #'ServiceChangeReply'{terminationID       = Tids1,
5429			serviceChangeResult = Res1},
5430  #'ServiceChangeReply'{terminationID       = Tids2,
5431			serviceChangeResult = Res2}) ->
5432    validate(fun() -> chk_TerminationIDList(Tids1, Tids2) end,
5433	     'ServiceChangeReply'),
5434    validate(fun() -> chk_ServiceChangeResult(Res1, Res2) end,
5435	     'ServiceChangeReply'),
5436    ok;
5437chk_ServiceChangeReply(R1, R2) ->
5438    wrong_type('ServiceChangeReply', R1, R2).
5439
5440
5441%% -- ServiceChangeResult --
5442
5443is_ServiceChangeResult({Tag, Val}) ->
5444    is_ServiceChangeResult_tag(Tag) andalso
5445	is_ServiceChangeResult_val(Tag, Val);
5446is_ServiceChangeResult(_) ->
5447    false.
5448
5449is_ServiceChangeResult_tag(Tag) ->
5450    Tags = [errorDescriptor, serviceChangeResParms],
5451    lists:member(Tag, Tags).
5452
5453is_ServiceChangeResult_val(errorDescriptor, Val) ->
5454    is_ErrorDescriptor(Val);
5455is_ServiceChangeResult_val(serviceChangeResParms, Val) ->
5456    is_ServiceChangeResParm(Val).
5457
5458chk_ServiceChangeResult(Res, Res) ->
5459    chk_type(fun is_ServiceChangeResult/1, 'ServiceChangeResult', Res);
5460chk_ServiceChangeResult({Tag, Val1} = Res1, {Tag, Val2} = Res2) ->
5461    case (is_ServiceChangeResult_tag(Tag) andalso
5462	  is_ServiceChangeResult_val(Tag, Val1) andalso
5463	  is_ServiceChangeResult_val(Tag, Val2)) of
5464	true ->
5465	    chk_ServiceChangeResult_val(Tag, Val1, Val2);
5466	false ->
5467	    wrong_type('ServiceChangeResult', Res1, Res2)
5468    end;
5469chk_ServiceChangeResult({Tag1, Val1} = Res1, {Tag2, Val2} = Res2) ->
5470    case ((is_ServiceChangeResult_tag(Tag1) andalso
5471	   is_ServiceChangeResult_val(Tag1, Val1)) andalso
5472	  (is_ServiceChangeResult_tag(Tag2) andalso
5473	   is_ServiceChangeResult_val(Tag2, Val2))) of
5474	true ->
5475	    not_equal('ServiceChangeResult', Res1, Res2);
5476	false ->
5477	    wrong_type('ServiceChangeResult', Res1, Res2)
5478    end;
5479chk_ServiceChangeResult(Res1, Res2) ->
5480    wrong_type('ServiceChangeResult', Res1, Res2).
5481
5482chk_ServiceChangeResult_val(errorDescriptor, Val1, Val2) ->
5483    validate(fun() -> chk_ErrorDescriptor(Val1, Val2) end,
5484	     'ServiceChangeResult');
5485chk_ServiceChangeResult_val(serviceChangeResParms, Val1, Val2) ->
5486    validate(fun() -> chk_ServiceChangeResParm(Val1, Val2) end,
5487	     'ServiceChangeResult').
5488
5489
5490%% -- WildcardField --
5491
5492is_WildcardField(WF) -> is_OCTET_STRING(WF, {exact, 1}).
5493
5494chk_WildcardField(WF, WF) ->
5495    case is_WildcardField(WF) of
5496	true ->
5497	    ok;
5498	false ->
5499	    wrong_type('WildcardField', WF)
5500    end;
5501chk_WildcardField(WF1, WF2) ->
5502    case (is_WildcardField(WF1) andalso is_WildcardField(WF2)) of
5503	true ->
5504	    not_equal('WildcardField', WF1, WF2);
5505	false ->
5506	    wrong_type('WildcardField', WF1, WF2)
5507    end.
5508
5509
5510%% -- TerminationID --
5511
5512is_TerminationID(#'TerminationID'{wildcard = W,
5513				  id       = ID}) ->
5514    is_TerminationID_wildcard(W) andalso is_TerminationID_id(ID);
5515is_TerminationID(#megaco_term_id{contains_wildcards = _W,
5516				 id                 = _ID}) ->
5517    true; % What are the types?
5518is_TerminationID(_) ->
5519    false.
5520
5521is_TerminationID_wildcard([]) ->
5522    true;
5523is_TerminationID_wildcard([H|T]) ->
5524    is_WildcardField(H) andalso is_TerminationID_wildcard(T);
5525is_TerminationID_wildcard(_) ->
5526    false.
5527
5528is_TerminationID_id(ID) -> is_OCTET_STRING(ID, {range, 1, 8}).
5529
5530chk_TerminationID(Id,Id) ->
5531    d("chk_TerminationID(1) -> entry with"
5532      "~n   Id: ~p", [Id]),
5533    chk_type(fun is_TerminationID/1, 'TerminationID', Id);
5534chk_TerminationID(#'TerminationID'{wildcard = W1,
5535                                   id       = I1},
5536                  #'TerminationID'{wildcard = W2,
5537                                   id       = I2}) ->
5538    d("chk_TerminationID(2) -> entry with"
5539      "~n   W1: ~p"
5540      "~n   W2: ~p"
5541      "~n   I1: ~p"
5542      "~n   I2: ~p", [W1, W2, I1, I2]),
5543    chk_TerminationID_wildcard(W1, W2),
5544    chk_TerminationID_id(I1, I2),
5545    ok;
5546chk_TerminationID(#megaco_term_id{contains_wildcards = W1,
5547                                  id                 = I1},
5548                  #megaco_term_id{contains_wildcards = W2,
5549                                  id                 = I2}) ->
5550    d("chk_TerminationID(3) -> entry with"
5551      "~n   W1: ~p"
5552      "~n   W2: ~p"
5553      "~n   I1: ~p"
5554      "~n   I2: ~p", [W1, W2, I1, I2]),
5555    validate(fun() -> chk_BOOLEAN(W1, W2) end, 'TerminationID_wildcard'),
5556    chk_TerminationID_id(I1, I2),
5557    ok;
5558chk_TerminationID(Tid1, Tid2) ->
5559    d("chk_TerminationID(4) -> entry with"
5560      "~n   Tid1: ~p"
5561      "~n   Tid2: ~p", [Tid1, Tid2]),
5562    wrong_type('TerminationID', Tid1, Tid2).
5563
5564chk_TerminationID_wildcard([], []) ->
5565    ok;
5566chk_TerminationID_wildcard([] = WF1, WF2) ->
5567    not_equal('TerminationID_wildcard', WF1, WF2);
5568chk_TerminationID_wildcard(WF1, [] = WF2) ->
5569    not_equal('TerminationID_wildcard', WF1, WF2);
5570chk_TerminationID_wildcard([H|T1], [H|T2]) ->
5571    case is_WildcardField(H) of
5572	true ->
5573	    chk_TerminationID_wildcard(T1, T2);
5574	false ->
5575	    wrong_type('TerminationID_wildcard_val', H)
5576    end;
5577chk_TerminationID_wildcard([H1|T1], [H2|T2]) ->
5578    validate(fun() -> chk_WildcardField(H1, H2) end,
5579	     'TerminationID_wildcard_val'),
5580    chk_TerminationID_wildcard(T1, T2);
5581chk_TerminationID_wildcard(WF1,WF2) ->
5582    not_equal('TerminationId_wildcard', WF1, WF2).
5583
5584chk_TerminationID_id(Id, Id) ->
5585    case is_OCTET_STRING(Id, {range, 1, 8}) of
5586	true ->
5587	    ok;
5588	false ->
5589	    wrong_type('TerminationID_id', Id, Id)
5590    end;
5591chk_TerminationID_id(Id1, Id2) ->
5592    Id12 = flatten_TerminationID_id(Id1, []),
5593    Id22 = flatten_TerminationID_id(Id2, []),
5594    case Id12 == Id22 of
5595	true ->
5596	    ok;
5597	false ->
5598	    not_equal(terminationId_id, Id1, Id2)
5599    end.
5600
5601flatten_TerminationID_id([], Acc) ->
5602    lists:flatten(lists:reverse(Acc));
5603flatten_TerminationID_id([H|T], Acc) ->
5604    flatten_TerminationID_id(T, [string:tokens(H, [$/])|Acc]).
5605
5606%% -- TerminationIDList --
5607
5608%% is_opt_TerminationIDList(asn1_NOVALUE) ->
5609%%     true;
5610%% is_opt_TerminationIDList(TIDs) ->
5611%%     is_TerminationIDList(TIDs).
5612
5613is_TerminationIDList([]) ->
5614    true;
5615is_TerminationIDList([H|T]) ->
5616    is_TerminationID(H) andalso is_TerminationIDList(T);
5617is_TerminationIDList(_) ->
5618    false.
5619
5620chk_opt_TerminationIDList(asn1_NOVALUE, asn1_NOVALUE) ->
5621    ok;
5622chk_opt_TerminationIDList(TIDs1, TIDs2) ->
5623    chk_TerminationIDList(TIDs1, TIDs2).
5624
5625chk_TerminationIDList([], []) ->
5626    ok;
5627chk_TerminationIDList([] = L1, L2) ->
5628    not_equal('TerminationIDList', L1, L2);
5629chk_TerminationIDList(L1, [] = L2) ->
5630    not_equal('TerminationIDList', L1, L2);
5631chk_TerminationIDList([H|T1], [H|T2]) ->
5632    case is_TerminationID(H) of
5633	true ->
5634	    chk_TerminationIDList(T1, T2);
5635	false ->
5636	    wrong_type('TerminationIDList', H)
5637    end;
5638chk_TerminationIDList([H1|T1], [H2|T2]) ->
5639    validate(fun() -> chk_TerminationID(H1, H2) end, 'TerminationIDList'),
5640    chk_TerminationIDList(T1, T2);
5641chk_TerminationIDList(L1, L2) ->
5642    wrong_type('TerminationIDList', L1, L2).
5643
5644
5645%% -- MediaDescriptor --
5646
5647is_MediaDescriptor(#'MediaDescriptor'{termStateDescr = TSD,
5648				      streams        = S}) ->
5649    d("is_MediaDescriptor -> entry with"
5650      "~n   TSD: ~p"
5651      "~n   S:   ~p", [TSD, S]),
5652    is_opt_TerminationStateDescriptor(TSD) andalso
5653	is_MediaDescriptor_streams(S);
5654is_MediaDescriptor(_) ->
5655    false.
5656
5657is_MediaDescriptor_streams(asn1_NOVALUE) ->
5658    true;
5659is_MediaDescriptor_streams({Tag, Val}) ->
5660    is_MediaDescriptor_streams_tag(Tag) andalso
5661	is_MediaDescriptor_streams_val(Tag, Val);
5662is_MediaDescriptor_streams(_) ->
5663    false.
5664
5665is_MediaDescriptor_streams_tag(Tag) ->
5666    Tags = [oneStream, multiStream],
5667    lists:member(Tag, Tags).
5668
5669is_MediaDescriptor_streams_val(oneStream, SP) ->
5670    is_StreamParms(SP);
5671is_MediaDescriptor_streams_val(multiStream, SDL) ->
5672    is_MediaDescriptor_multiStream(SDL).
5673
5674is_MediaDescriptor_multiStream([]) ->
5675    true;
5676is_MediaDescriptor_multiStream([H|T]) ->
5677    is_StreamDescriptor(H) andalso is_MediaDescriptor_multiStream(T);
5678is_MediaDescriptor_multiStream(_) ->
5679    false.
5680
5681chk_MediaDescriptor(D, D) ->
5682    chk_type(fun is_MediaDescriptor/1, 'MediaDescriptor', D);
5683chk_MediaDescriptor(#'MediaDescriptor'{termStateDescr = TSD1,
5684				       streams        = S1},
5685		    #'MediaDescriptor'{termStateDescr = TSD2,
5686				       streams        = S2}) ->
5687    validate(
5688      fun() ->
5689	      chk_opt_TerminationStateDescriptor(TSD1, TSD2)
5690      end,
5691      'MediaDescriptor'),
5692    validate(
5693      fun() ->
5694	      chk_MediaDescriptor_streams(S1, S2)
5695      end,
5696      'MediaDescriptor'),
5697    ok;
5698chk_MediaDescriptor(D1, D2) ->
5699    wrong_type('MediaDescriptor', D1, D2).
5700
5701
5702chk_MediaDescriptor_streams(asn1_NOVALUE, asn1_NOVALUE) ->
5703    ok;
5704chk_MediaDescriptor_streams({oneStream, SP1}, {oneStream, SP2}) ->
5705    validate(fun() ->
5706		     chk_StreamParms(SP1, SP2)
5707	     end,
5708	     'MediaDescriptor_streams');
5709chk_MediaDescriptor_streams({multiStream, SDs1}, {multiStream, SDs2}) ->
5710    validate(fun() ->
5711		     chk_MediaDescriptor_multiStream(SDs1, SDs2)
5712	     end,
5713	     'MediaDescriptor_streams');
5714chk_MediaDescriptor_streams(S1, S2) ->
5715    wrong_type('MediaDescriptor_streams', S1, S2).
5716
5717chk_MediaDescriptor_multiStream([], []) ->
5718    ok;
5719chk_MediaDescriptor_multiStream([] = MS1, MS2) ->
5720    not_equal('MediaDescriptor_multiStream', MS1, MS2);
5721chk_MediaDescriptor_multiStream(MS1, [] = MS2) ->
5722    not_equal('MediaDescriptor_multiStream', MS1, MS2);
5723chk_MediaDescriptor_multiStream([H|T1], [H|T2]) ->
5724    case is_StreamDescriptor(H) of
5725	true ->
5726	    chk_MediaDescriptor_multiStream(T1, T2);
5727	false ->
5728	    wrong_type('MediaDescriptor_multiStream_val', H)
5729    end;
5730chk_MediaDescriptor_multiStream([H1|T1], [H2|T2]) ->
5731    validate(fun() -> chk_StreamDescriptor(H1, H2) end,
5732	     'MediaDescriptor_multiStream_val'),
5733    chk_MediaDescriptor_multiStream(T1, T2);
5734chk_MediaDescriptor_multiStream(MS1, MS2) ->
5735    wrong_type('MediaDescriptor_multiStream_val', MS1, MS2).
5736
5737
5738%% -- StreamDescriptor --
5739
5740is_StreamDescriptor(#'StreamDescriptor'{streamID    = SID,
5741					streamParms = Parms}) ->
5742    d("is_StreamDescriptor -> entry with"
5743      "~n   SID:   ~p"
5744      "~n   Parms: ~p", [SID, Parms]),
5745    is_StreamID(SID) andalso is_StreamParms(Parms);
5746is_StreamDescriptor(X) ->
5747    d("is_StreamDescriptor -> entry when ERROR with"
5748      "~n   X: ~p", [X]),
5749    false.
5750
5751chk_StreamDescriptor(D, D) ->
5752    chk_type(fun is_StreamDescriptor/1, 'StreamDescriptor', D);
5753chk_StreamDescriptor(#'StreamDescriptor'{streamID    = SID1,
5754					 streamParms = Parms1},
5755		     #'StreamDescriptor'{streamID    = SID2,
5756					 streamParms = Parms2}) ->
5757    validate(fun() -> chk_StreamID(SID1, SID2) end, 'StreamDescriptor'),
5758    validate(fun() -> chk_StreamParms(Parms1, Parms2) end, 'StreamDescriptor'),
5759    ok;
5760chk_StreamDescriptor(D1, D2) ->
5761    wrong_type('StreamDescriptor', D1, D2).
5762
5763
5764%% -- StreamParms --
5765
5766is_StreamParms(#'StreamParms'{localControlDescriptor = LCD,
5767			      localDescriptor        = LD,
5768			      remoteDescriptor       = RD,
5769			      statisticsDescriptor   = SD}) ->
5770    d("is_StreamParms -> entry with"
5771      "~n   LCD: ~p"
5772      "~n   LD:  ~p"
5773      "~n   RD:  ~p"
5774      "~n   SD:  ~p", [LCD, LD, RD, SD]),
5775    is_opt_LocalControlDescriptor(LCD) andalso
5776	is_opt_LocalRemoteDescriptor(LD) andalso
5777	is_opt_LocalRemoteDescriptor(RD) andalso
5778	is_opt_StatisticsDescriptor(SD);
5779is_StreamParms(X) ->
5780    d("is_StreamParms -> entry when ERROR with"
5781      "~n   X: ~p", [X]),
5782    false.
5783
5784chk_StreamParms(SP, SP) ->
5785    chk_type(fun is_StreamParms/1, 'StreamParms', SP);
5786chk_StreamParms(#'StreamParms'{localControlDescriptor = LCD1,
5787			       localDescriptor        = LD1,
5788			       remoteDescriptor       = RD1,
5789			       statisticsDescriptor   = SD1},
5790		#'StreamParms'{localControlDescriptor = LCD2,
5791			       localDescriptor        = LD2,
5792			       remoteDescriptor       = RD2,
5793			       statisticsDescriptor   = SD2}) ->
5794    validate(fun() -> chk_opt_LocalControlDescriptor(LCD1, LCD2) end,
5795	     'StreamParms_localControlDescriptor'),
5796    validate(fun() -> chk_opt_LocalRemoteDescriptor(LD1, LD2) end,
5797	     'StreamParms_localDescriptor'),
5798    validate(fun() -> chk_opt_LocalRemoteDescriptor(RD1, RD2) end,
5799	     'StreamParms_remoteDescriptor'),
5800    validate(fun() -> chk_opt_StatisticsDescriptor(SD1, SD2) end,
5801	     'StreamParms_statisticsDescriptor'),
5802    ok;
5803chk_StreamParms(P1, P2) ->
5804    wrong_type('StreamParms', P1, P2).
5805
5806
5807%% -- LocalControlDescriptor --
5808
5809is_opt_LocalControlDescriptor(D) ->
5810    d("is_opt_LocalControlDescriptor -> entry"),
5811    is_OPTIONAL(fun is_LocalControlDescriptor/1, D).
5812
5813is_LocalControlDescriptor(#'LocalControlDescriptor'{streamMode    = SM,
5814						    reserveValue  = RV,
5815						    reserveGroup  = RG,
5816						    propertyParms = PP}) ->
5817    d("is_LocalControlDescriptor -> entry with"
5818      "~n   SM: ~p"
5819      "~n   RV: ~p"
5820      "~n   RG: ~p"
5821      "~n   PP: ~p", [SM, RV, RG, PP]),
5822    is_opt_StreamMode(SM) andalso
5823	is_opt_BOOLEAN(RV) andalso
5824	is_opt_BOOLEAN(RG) andalso
5825	is_LocalControlDescriptor_propertyParms(PP);
5826is_LocalControlDescriptor(_) ->
5827    false.
5828
5829is_LocalControlDescriptor_propertyParms([]) ->
5830    d("is_LocalControlDescriptor_propertyParms -> entry when done"),
5831    true;
5832is_LocalControlDescriptor_propertyParms([H|T]) ->
5833    d("is_LocalControlDescriptor_propertyParms -> entry with"
5834      "~n   H: ~p"
5835      "~n   T: ~p", [H, T]),
5836    is_PropertyParm(H) andalso is_LocalControlDescriptor_propertyParms(T);
5837is_LocalControlDescriptor_propertyParms(_) ->
5838    false.
5839
5840chk_opt_LocalControlDescriptor(LCD1, LCD2) ->
5841    chk_OPTIONAL('LocalControlDescriptor', LCD1, LCD2,
5842		 fun is_LocalControlDescriptor/1,
5843		 fun chk_LocalControlDescriptor/2).
5844
5845chk_LocalControlDescriptor(LCD, LCD) ->
5846    chk_type(fun is_LocalControlDescriptor/1, 'LocalControlDescriptor', LCD);
5847chk_LocalControlDescriptor(#'LocalControlDescriptor'{streamMode    = SM1,
5848						     reserveValue  = RV1,
5849						     reserveGroup  = RG1,
5850						     propertyParms = PP1},
5851			   #'LocalControlDescriptor'{streamMode    = SM2,
5852						     reserveValue  = RV2,
5853						     reserveGroup  = RG2,
5854						     propertyParms = PP2}) ->
5855    validate(
5856      fun() -> chk_opt_StreamMode(SM1, SM2) end,
5857      'LocalControlDescriptor'),
5858    validate(
5859      fun() -> chk_opt_BOOLEAN(RV1, RV2) end,
5860      'LocalControlDescriptor_reserveValue'),
5861    validate(
5862      fun() -> chk_opt_BOOLEAN(RG1, RG2) end,
5863      'LocalControlDescriptor_reserveGroup'),
5864    chk_LocalControlDescriptor_propertyParms(PP1, PP2),
5865    ok;
5866chk_LocalControlDescriptor(LCD1, LCD2) ->
5867    wrong_type('LocalControlDescriptor', LCD1, LCD2).
5868
5869
5870chk_LocalControlDescriptor_propertyParms([], []) ->
5871    ok;
5872chk_LocalControlDescriptor_propertyParms([] = PP1, PP2) ->
5873    not_equal('LocalControlDescriptor_propertyParms', PP1, PP2);
5874chk_LocalControlDescriptor_propertyParms(PP1, [] = PP2) ->
5875    not_equal('LocalControlDescriptor_propertyParms', PP1, PP2);
5876chk_LocalControlDescriptor_propertyParms([H|T1], [H|T2]) ->
5877    case is_PropertyParm(H) of
5878	true ->
5879	    chk_LocalControlDescriptor_propertyParms(T1, T2);
5880	false ->
5881	    wrong_type('LocalControlDescriptor_propertyParms_val', H)
5882    end;
5883chk_LocalControlDescriptor_propertyParms([H1|T1], [H2|T2]) ->
5884    validate(fun() -> chk_PropertyParm(H1, H2) end,
5885	     'LocalControlDescriptor_propertyParms_val'),
5886    chk_LocalControlDescriptor_propertyParms(T1, T2);
5887chk_LocalControlDescriptor_propertyParms(PP1, PP2) ->
5888    wrong_type('LocalControlDescriptor_propertyParms', PP1, PP2).
5889
5890
5891%% -- StreamMode --
5892
5893is_opt_StreamMode(asn1_NOVALUE) ->
5894    true;
5895is_opt_StreamMode(SM) ->
5896    is_StreamMode(SM).
5897
5898is_StreamMode(SM) ->
5899    lists:member(SM, [sendOnly, recvOnly, sendRecv, inactive, loopBack]).
5900
5901chk_opt_StreamMode(asn1_NOVALUE, asn1_NOVALUE) ->
5902    ok;
5903chk_opt_StreamMode(SM1, SM2) ->
5904    chk_StreamMode(SM1, SM2).
5905
5906chk_StreamMode(SM, SM) ->
5907    chk_type(fun is_StreamMode/1, 'StreamMode', SM);
5908chk_StreamMode(SM1, SM2) ->
5909    case (is_StreamMode(SM1) andalso is_StreamMode(SM2)) of
5910	true ->
5911	    not_equal('StreamMode', SM1, SM2);
5912	false ->
5913	    wrong_type('StreamMode', SM1, SM2)
5914    end.
5915
5916
5917%% -- PropertyParm --
5918
5919is_opt_PropertyParm(asn1_NOVALUE) ->
5920    true;
5921is_opt_PropertyParm(PP) ->
5922    is_PropertyParm(PP).
5923
5924is_PropertyParm(#'PropertyParm'{name      = N,
5925				value     = V,
5926				extraInfo = I}) ->
5927    d("is_PropertyParm -> entry with"
5928      "~n   N: ~p"
5929      "~n   V: ~p"
5930      "~n   I: ~p", [N, V, I]),
5931    is_PkgdName(N) andalso
5932	is_PropertyParm_value(V) andalso
5933	is_PropertyParm_extraInfo(I);
5934is_PropertyParm(_) ->
5935    false.
5936
5937is_PropertyParm_value([]) ->
5938    d("is_PropertyParm_value -> entry when done"),
5939    true;
5940is_PropertyParm_value([H|T]) ->
5941    d("is_PropertyParm_value -> entry with"
5942      "~n   H: ~p", [H]),
5943    is_OCTET_STRING(H) andalso is_PropertyParm_value(T);
5944is_PropertyParm_value(_) ->
5945    false.
5946
5947is_PropertyParm_extraInfo(asn1_NOVALUE) ->
5948    true;
5949is_PropertyParm_extraInfo({Tag, Val}) ->
5950    d("is_PropertyParm_extraInfo -> entry with"
5951      "~n   Tag: ~p"
5952      "~n   Val: ~p", [Tag, Val]),
5953    is_PropertyParm_extraInfo_tag(Tag) andalso
5954	is_PropertyParm_extraInfo_val(Tag, Val);
5955is_PropertyParm_extraInfo(_) ->
5956    false.
5957
5958is_PropertyParm_extraInfo_tag(Tag) ->
5959    Tags = [relation, range, sublist],
5960    lists:member(Tag, Tags).
5961
5962is_PropertyParm_extraInfo_val(relation, Val) ->
5963    is_Relation(Val);
5964is_PropertyParm_extraInfo_val(range, Val) ->
5965    is_BOOLEAN(Val);
5966is_PropertyParm_extraInfo_val(sublist, Val) ->
5967    is_BOOLEAN(Val).
5968
5969
5970chk_opt_PropertyParm(asn1_NOVALUE, asn1_NOVALUE) ->
5971    ok;
5972chk_opt_PropertyParm(P1, P2) ->
5973    chk_PropertyParm(P1, P2).
5974
5975chk_PropertyParm(P, P) ->
5976    chk_type(fun is_PropertyParm/1, 'PropertyParm', P);
5977chk_PropertyParm(#'PropertyParm'{name      = N1,
5978				 value     = V1,
5979				 extraInfo = I1},
5980		 #'PropertyParm'{name      = N2,
5981				 value     = V2,
5982				 extraInfo = I2}) ->
5983    validate(fun() -> chk_PkgdName(N1, N2) end, 'PropertyParm'),
5984    chk_PropertyParm_value(V1, V2),
5985    chk_PropertyParm_extraInfo(I1, I2),
5986    ok;
5987chk_PropertyParm(P1, P2) ->
5988    wrong_type('PropertyParm', P1, P2).
5989
5990chk_PropertyParm_value([], []) ->
5991    ok;
5992chk_PropertyParm_value([] = V1, V2) ->
5993    not_equal('PropertyParm_value', V1, V2);
5994chk_PropertyParm_value(V1, [] = V2) ->
5995    not_equal('PropertyParm_value', V1, V2);
5996chk_PropertyParm_value([H|T1], [H|T2]) ->
5997    case is_OCTET_STRING(H) of
5998	true ->
5999	    chk_PropertyParm_value(T1, T2);
6000	false ->
6001	    wrong_type('PropertyParm_value_val', H)
6002    end;
6003chk_PropertyParm_value([H1|_], [H2|_]) ->
6004    case (is_OCTET_STRING(H1) andalso is_OCTET_STRING(H2)) of
6005	true ->
6006	    not_equal('PropertyParm_value_val', H1, H2);
6007	false ->
6008	    wrong_type('PropertyParm_value_val', H1, H2)
6009    end;
6010chk_PropertyParm_value(V1, V2) ->
6011    wrong_type('PropertyParm_value', V1, V2).
6012
6013chk_PropertyParm_extraInfo(EI, EI) ->
6014    chk_type(fun is_PropertyParm_extraInfo/1, 'PropertyParm_extraInfo', EI);
6015chk_PropertyParm_extraInfo({Tag, Val1} = EI1, {Tag, Val2} = EI2) ->
6016    case (is_PropertyParm_extraInfo_tag(Tag) and
6017	  is_PropertyParm_extraInfo_val(Tag, Val1) and
6018	  is_PropertyParm_extraInfo_val(Tag, Val2)) of
6019	true ->
6020	    chk_PropertyParm_extraInfo_val(Tag, Val1, Val2);
6021	false ->
6022	    wrong_type('PropertyParm_extraInfo', EI1, EI2)
6023    end;
6024chk_PropertyParm_extraInfo({Tag1, Val1} = EI1, {Tag2, Val2} = EI2) ->
6025    case ((is_PropertyParm_extraInfo_tag(Tag1) and
6026	   is_PropertyParm_extraInfo_val(Tag1, Val1)) and
6027	  (is_PropertyParm_extraInfo_tag(Tag2) and
6028	   is_PropertyParm_extraInfo_val(Tag2, Val2))) of
6029	true ->
6030	    not_equal('PropertyParm_extraInfo', EI1, EI2);
6031	false ->
6032	    wrong_type('PropertyParm_extraInfo', EI1, EI2)
6033    end;
6034chk_PropertyParm_extraInfo(EI1, EI2) ->
6035    wrong_type('PropertyParm_extraInfo', EI1, EI2).
6036
6037chk_PropertyParm_extraInfo_val(relation, Val1, Val2) ->
6038    validate(fun() -> chk_Relation(Val1, Val2) end, 'PropertyParm_extraInfo');
6039chk_PropertyParm_extraInfo_val(range, Val1, Val2) ->
6040    validate(fun() -> chk_BOOLEAN(Val1, Val2) end, 'PropertyParm_extraInfo');
6041chk_PropertyParm_extraInfo_val(sublist, Val1, Val2) ->
6042    validate(fun() -> chk_BOOLEAN(Val1, Val2) end, 'PropertyParm_extraInfo').
6043
6044
6045%% -- Name --
6046
6047is_Name(N) ->
6048    %% Binary: is_OCTET_STRING(N, {exact, 2}).
6049    case is_OCTET_STRING(N, {range, 1, 64}) of
6050	true ->
6051	    is_NAME(N);
6052	false ->
6053	    false
6054    end.
6055
6056is_NAME([H|T]) when H =< $z, $a =< H ->
6057    is_NAME2(T);
6058is_NAME([H|T]) when H =< $Z, $A =< H ->
6059    is_NAME2(T);
6060is_NAME(_) ->
6061    false.
6062
6063is_NAME2([]) ->
6064    true;
6065is_NAME2([$_|T]) ->
6066    is_NAME2(T);
6067is_NAME2([H|T]) when H =< $z, $a =< H ->
6068    is_NAME2(T);
6069is_NAME2([H|T]) when H =< $Z, $A =< H ->
6070    is_NAME2(T);
6071is_NAME2([H|T]) when H =< $9, $0 =< H ->
6072    is_NAME2(T);
6073is_NAME2(_) ->
6074    false.
6075
6076
6077
6078chk_Name(N, N) ->
6079    chk_type(fun is_Name/1, 'Name', N);
6080chk_Name(N1, N2) ->
6081    case (is_Name(N1) andalso is_Name(N2)) of
6082	true ->
6083	    not_equal('Name', N1, N2);
6084	false ->
6085	    wrong_type('Name', N1, N2)
6086    end.
6087
6088
6089%% -- PkgdName --
6090
6091%% PkgdName is either "AB/CD" or just plain "ABCD"
6092%% Note that in ASN.1 the parts is exactly 2 char
6093%% each, unless you don't use the native config
6094%% option. In text and in binary without the native
6095%% option, it is 63 + 1 chars for each.
6096is_PkgdName(N) ->
6097    d("is_PkgdName -> entry with"
6098      "~n   N: ~p", [N]),
6099    case string:tokens(N, "/") of
6100	["*" = PackageName, "*" = ItemID] ->
6101	    d("is_PkgdName -> tokenized (0): "
6102	      "~n   PackageName: ~p"
6103	      "~n   ItemID:      ~p", [PackageName, ItemID]),
6104	    true;
6105	[PackageName, "*" = ItemID] ->
6106	    d("is_PkgdName -> tokenized (1): "
6107	      "~n   PackageName: ~p"
6108	      "~n   ItemID:      ~p", [PackageName, ItemID]),
6109	    is_Name(PackageName);
6110	[PackageName, ItemID] ->
6111	    d("is_PkgdName -> tokenized (2): "
6112	      "~n   PackageName: ~p"
6113	      "~n   ItemID:      ~p", [PackageName, ItemID]),
6114	    is_Name(PackageName) andalso is_Name(ItemID);
6115	_ ->
6116	    is_Name(N)
6117    end.
6118
6119chk_PkgdName(N, N) ->
6120    case is_PkgdName(N) of
6121	true ->
6122	    ok;
6123	false ->
6124	    wrong_type('PkgdName', N, N)
6125    end;
6126chk_PkgdName(N1, N2) ->
6127    case (is_PkgdName(N1) andalso is_PkgdName(N2)) of
6128	true ->
6129	    not_equal('PkgdName', N1, N2);
6130	false ->
6131	    wrong_type('PkgdName', N1, N2)
6132    end.
6133
6134
6135%% -- Relation --
6136
6137is_Relation(R) ->
6138    lists:member(R, [greaterThan, smallerThan, unequalTo]).
6139
6140chk_Relation(R, R) ->
6141    chk_type(fun is_Relation/1, 'Relation', R);
6142chk_Relation(R1, R2) ->
6143    case (is_Relation(R1) andalso is_Relation(R2)) of
6144	true ->
6145	    not_equal('Relation', R1, R2);
6146	false ->
6147	    wrong_type('Relation', R1, R2)
6148    end.
6149
6150
6151%% -- LocalRemoteDescriptor --
6152
6153is_opt_LocalRemoteDescriptor(D) ->
6154    d("is_LocalRemoteDescriptor -> entry"),
6155    is_OPTIONAL(fun is_LocalRemoteDescriptor/1, D).
6156
6157is_LocalRemoteDescriptor(#'LocalRemoteDescriptor'{propGrps = PGs}) ->
6158    d("is_LocalRemoteDescriptor -> entry with"
6159      "~n   PGs: ~p", [PGs]),
6160    is_LocalRemoteDescriptor_propGrps(PGs);
6161is_LocalRemoteDescriptor(_) ->
6162    false.
6163
6164is_LocalRemoteDescriptor_propGrps([]) ->
6165    true;
6166is_LocalRemoteDescriptor_propGrps([H|T]) ->
6167    is_PropertyGroup(H) andalso is_LocalRemoteDescriptor_propGrps(T);
6168is_LocalRemoteDescriptor_propGrps(_) ->
6169    false.
6170
6171chk_opt_LocalRemoteDescriptor(D1, D2) ->
6172    chk_OPTIONAL('LocalRemoteDescriptor', D1, D2,
6173		 fun is_LocalRemoteDescriptor/1,
6174		 fun chk_LocalRemoteDescriptor/2).
6175
6176chk_LocalRemoteDescriptor(LRD, LRD) ->
6177    chk_type(fun is_LocalRemoteDescriptor/1, 'LocalRemoteDescriptor', LRD);
6178chk_LocalRemoteDescriptor(#'LocalRemoteDescriptor'{propGrps = PG1},
6179			  #'LocalRemoteDescriptor'{propGrps = PG2}) ->
6180    chk_LocalRemoteDescriptor_propGrps(PG1, PG2),
6181    ok;
6182chk_LocalRemoteDescriptor(LRD1, LRD2) ->
6183    wrong_type('LocalRemoteDescriptor', LRD1, LRD2).
6184
6185chk_LocalRemoteDescriptor_propGrps([], []) ->
6186    ok;
6187chk_LocalRemoteDescriptor_propGrps([] = PG1, PG2) ->
6188    not_equal('LocalRemoteDescriptor_propGrps', PG1, PG2);
6189chk_LocalRemoteDescriptor_propGrps(PG1, [] = PG2) ->
6190    not_equal('LocalRemoteDescriptor_propGrps', PG1, PG2);
6191chk_LocalRemoteDescriptor_propGrps([H|T1], [H|T2]) ->
6192    case is_PropertyGroup(H) of
6193	true ->
6194	    chk_LocalRemoteDescriptor_propGrps(T1, T2);
6195	false ->
6196	    wrong_type('LocalRemoteDescriptor_propGrps_val', H)
6197    end;
6198chk_LocalRemoteDescriptor_propGrps([H1|T1], [H2|T2]) ->
6199    validate(fun() -> chk_PropertyGroup(H1, H2) end,
6200	     'LocalRemoteDescriptor_propGrps_val'),
6201    chk_LocalRemoteDescriptor_propGrps(T1, T2);
6202chk_LocalRemoteDescriptor_propGrps(PG1, PG2) ->
6203    wrong_type('LocalRemoteDescriptor_propGrps', PG1, PG2).
6204
6205
6206%% -- PropertyGroup --
6207
6208is_PropertyGroup([]) ->
6209    true;
6210is_PropertyGroup([H|T]) ->
6211    is_PropertyParm(H) andalso is_PropertyGroup(T);
6212is_PropertyGroup(_) ->
6213    false.
6214
6215chk_PropertyGroup([], []) ->
6216    ok;
6217chk_PropertyGroup([] = PG1, PG2) ->
6218    not_equal('PropertyGroup', PG1, PG2);
6219chk_PropertyGroup(PG1, [] = PG2) ->
6220    not_equal('PropertyGroup', PG1, PG2);
6221chk_PropertyGroup([H|T1], [H|T2]) ->
6222    case is_PropertyParm(H) of
6223	true ->
6224	    chk_PropertyGroup(T1, T2);
6225	false ->
6226	    wrong_type('PropertyGroup_val', H)
6227    end;
6228chk_PropertyGroup([H1|T1], [H2|T2]) ->
6229    validate(fun() -> chk_PropertyParm(H1, H2) end, 'PropertyGroup_val'),
6230    chk_PropertyGroup(T1, T2);
6231chk_PropertyGroup(PG1, PG2) ->
6232    wrong_type('PropertyGroup', PG1, PG2).
6233
6234
6235%% -- TerminationStateDescriptor --
6236
6237is_opt_TerminationStateDescriptor(D) ->
6238    is_OPTIONAL(fun is_TerminationStateDescriptor/1, D).
6239
6240is_TerminationStateDescriptor(
6241  #'TerminationStateDescriptor'{propertyParms      = PP,
6242				eventBufferControl = EBC,
6243				serviceState       = SS}) ->
6244    is_TerminationStateDescriptor_propertyParms(PP) andalso
6245	is_opt_EventBufferControl(EBC) andalso
6246	is_opt_ServiceState(SS);
6247is_TerminationStateDescriptor(_) ->
6248    false.
6249
6250is_TerminationStateDescriptor_propertyParms([]) ->
6251    true;
6252is_TerminationStateDescriptor_propertyParms([H|T]) ->
6253    is_PropertyParm(H) andalso is_TerminationStateDescriptor_propertyParms(T);
6254is_TerminationStateDescriptor_propertyParms(_) ->
6255    false.
6256
6257chk_opt_TerminationStateDescriptor(D1, D2) ->
6258    chk_OPTIONAL('TerminationStateDescriptor', D1, D2,
6259		 fun is_TerminationStateDescriptor/1,
6260		 fun chk_TerminationStateDescriptor/2).
6261
6262chk_TerminationStateDescriptor(D, D) ->
6263    chk_type(fun is_TerminationStateDescriptor/1,
6264	     'TerminationStateDescriptor', D);
6265chk_TerminationStateDescriptor(
6266  #'TerminationStateDescriptor'{propertyParms      = PP1,
6267				eventBufferControl = EBC1,
6268				serviceState       = SS1},
6269  #'TerminationStateDescriptor'{propertyParms      = PP2,
6270				eventBufferControl = EBC2,
6271				serviceState       = SS2}) ->
6272    chk_TerminationStateDescriptor_propertyParms(PP1, PP2),
6273    validate(
6274      fun() ->
6275	      chk_opt_EventBufferControl(EBC1, EBC2)
6276      end,
6277      'TerminationStateDescriptor'),
6278    validate(
6279      fun() ->
6280	      chk_opt_ServiceState(SS1, SS2)
6281      end,
6282      'TerminationStateDescriptor'),
6283    ok;
6284chk_TerminationStateDescriptor(D1, D2) ->
6285    wrong_type('TerminationStateDescriptor', D1, D2).
6286
6287
6288chk_TerminationStateDescriptor_propertyParms([], []) ->
6289    ok;
6290chk_TerminationStateDescriptor_propertyParms([] = P1, P2) ->
6291    not_equal('TerminationStateDescriptor_propertyParms', P1, P2);
6292chk_TerminationStateDescriptor_propertyParms(P1, [] = P2) ->
6293    not_equal('TerminationStateDescriptor_propertyParms', P1, P2);
6294chk_TerminationStateDescriptor_propertyParms([H|T1], [H|T2]) ->
6295    case is_PropertyParm(H) of
6296	true ->
6297	    chk_TerminationStateDescriptor_propertyParms(T1, T2);
6298	false ->
6299	    wrong_type('TerminationStateDescriptor_propertyParms_val', H)
6300    end;
6301chk_TerminationStateDescriptor_propertyParms([H1|_], [H2|_]) ->
6302    case (is_PropertyParm(H1) andalso is_PropertyParm(H2)) of
6303	true ->
6304	    not_equal('TerminationStateDescriptor_propertyParms_val', H1, H2);
6305	false ->
6306	    wrong_type('TerminationStateDescriptor_propertyParms_val', H1, H2)
6307    end;
6308chk_TerminationStateDescriptor_propertyParms(P1, P2) ->
6309    wrong_type('TerminationStateDescriptor_propertyParms', P1, P2).
6310
6311
6312%% -- EventBufferControl --
6313
6314is_opt_EventBufferControl(asn1_NOVALUE) ->
6315    true;
6316is_opt_EventBufferControl(EBC) ->
6317    is_EventBufferControl(EBC).
6318
6319is_EventBufferControl(EBC) ->
6320    lists:member(EBC, [off, lockStep]).
6321
6322chk_opt_EventBufferControl(asn1_NOVALUE, asn1_NOVALUE) ->
6323    ok;
6324chk_opt_EventBufferControl(EBC1, EBC2) ->
6325    chk_EventBufferControl(EBC1, EBC2).
6326
6327chk_EventBufferControl(EBC, EBC) ->
6328    chk_type(fun is_EventBufferControl/1, 'EventBufferControl', EBC);
6329chk_EventBufferControl(EBC1, EBC2) ->
6330    case (is_EventBufferControl(EBC1) andalso is_EventBufferControl(EBC2)) of
6331	true ->
6332	    not_equal('EventBufferControl', EBC1, EBC2);
6333	false ->
6334	    wrong_type('EventBufferControl', EBC1, EBC2)
6335    end.
6336
6337
6338%% -- ServiceState --
6339
6340is_opt_ServiceState(asn1_NOVALUE) ->
6341    true;
6342is_opt_ServiceState(SS) ->
6343    is_ServiceState(SS).
6344
6345is_ServiceState(SS) ->
6346    lists:member(SS, [test, outOfSvc, inSvc]).
6347
6348chk_opt_ServiceState(asn1_NOVALUE, asn1_NOVALUE) ->
6349    ok;
6350chk_opt_ServiceState(SS1, SS2) ->
6351    chk_ServiceState(SS1, SS2).
6352
6353chk_ServiceState(SS, SS) ->
6354    chk_type(fun is_ServiceState/1, 'ServiceState', SS);
6355chk_ServiceState(SS1, SS2) ->
6356    case (is_ServiceState(SS1) andalso is_ServiceState(SS2)) of
6357	true ->
6358	    not_equal('ServiceState', SS1, SS2);
6359	false ->
6360	    wrong_type('ServiceState', SS1, SS2)
6361    end.
6362
6363
6364%% -- MuxDescriptor --
6365
6366is_MuxDescriptor(#'MuxDescriptor'{muxType         = MT,
6367				  termList        = TL,
6368				  nonStandardData = NSD}) ->
6369    is_MuxType(MT) andalso
6370	is_MuxDescriptor_termList(TL) andalso
6371	is_NonStandardData(NSD);
6372is_MuxDescriptor(_) ->
6373    false.
6374
6375is_MuxDescriptor_termList([]) ->
6376    true;
6377is_MuxDescriptor_termList([H|T]) ->
6378    is_TerminationID(H) andalso is_MuxDescriptor_termList(T);
6379is_MuxDescriptor_termList(_) ->
6380    false.
6381
6382chk_MuxDescriptor(D, D) ->
6383    chk_type(fun is_MuxDescriptor/1, 'MuxDescriptor', D);
6384chk_MuxDescriptor(#'MuxDescriptor'{muxType         = MT1,
6385				   termList        = TL1,
6386				   nonStandardData = NSD1},
6387		  #'MuxDescriptor'{muxType         = MT2,
6388				   termList        = TL2,
6389				   nonStandardData = NSD2}) ->
6390    validate(fun() -> chk_MuxType(MT1, MT2) end, 'MuxDescriptor'),
6391    chk_MuxDescriptor_termList(TL1, TL2),
6392    validate(fun() -> chk_NonStandardData(NSD1, NSD2) end, 'MuxDescriptor'),
6393    ok;
6394chk_MuxDescriptor(D1, D2) ->
6395    wrong_type('MuxDescriptor', D1, D2).
6396
6397chk_MuxDescriptor_termList([], []) ->
6398    ok;
6399chk_MuxDescriptor_termList([] = TL1, TL2) ->
6400    not_equal('MuxDescriptor_termList', TL1, TL2);
6401chk_MuxDescriptor_termList(TL1, [] = TL2) ->
6402    not_equal('MuxDescriptor_termList', TL1, TL2);
6403chk_MuxDescriptor_termList([H|T1], [H|T2]) ->
6404    case is_TerminationID(H) of
6405	true ->
6406	    chk_MuxDescriptor_termList(T1, T2);
6407	false ->
6408	    wrong_type('MuxDescriptor_termList_val', H)
6409    end;
6410chk_MuxDescriptor_termList([H1|T1], [H2|T2]) ->
6411    validate(fun() -> chk_TerminationID(H1, H2) end,
6412	     'MuxDescriptor_termList_val'),
6413    chk_MuxDescriptor_termList(T1, T2);
6414chk_MuxDescriptor_termList(TL1, TL2) ->
6415    wrong_type('MuxDescriptor_termList', TL1, TL2).
6416
6417
6418%% -- MuxType --
6419
6420is_MuxType(MT) ->
6421    lists:member(MT, [h221, h223, h226, v76, nx64k]).
6422
6423chk_MuxType(MT, MT) ->
6424    chk_type(fun is_MuxType/1, 'MuxType', MT);
6425chk_MuxType(MT1, MT2) ->
6426    case (is_MuxType(MT1) andalso is_MuxType(MT2)) of
6427	true ->
6428	    not_equal('MuxType', MT1, MT2);
6429	false ->
6430	    wrong_type('MuxType', MT1, MT2)
6431    end.
6432
6433
6434%% -- StreamID --
6435
6436is_opt_StreamID(V) ->
6437    is_OPTIONAL(fun is_StreamID/1, V).
6438
6439is_StreamID(V) ->
6440    d("is_StreamID -> entry with"
6441      "~n   V: ~p", [V]),
6442    is_INTEGER(V, {range, 0, 65535}).
6443
6444chk_opt_StreamID(V1, V2) ->
6445    chk_OPTIONAL('StreamID', V1, V2, fun is_StreamID/1, fun chk_StreamID/2).
6446
6447chk_StreamID(ID, ID) ->
6448    chk_type(fun is_StreamID/1, 'StreamID', ID);
6449chk_StreamID(ID1, ID2) ->
6450    case (is_StreamID(ID1) andalso is_StreamID(ID2)) of
6451	true ->
6452	    not_equal('StreamID', ID1, ID2);
6453	false ->
6454	    wrong_type('StreamID', ID1, ID2)
6455    end.
6456
6457
6458%% -- EventsDescriptor --
6459
6460is_EventsDescriptor(#'EventsDescriptor'{requestID = RID,
6461					eventList = EVL}) ->
6462    d("is_EventsDescriptor -> entry with"
6463      "~n   RID: ~p"
6464      "~n   EVL: ~p", [RID, EVL]),
6465    is_opt_RequestID(RID) andalso is_EventsDescriptor_eventList(EVL);
6466is_EventsDescriptor(_) ->
6467    false.
6468
6469is_EventsDescriptor_eventList([]) ->
6470    true;
6471is_EventsDescriptor_eventList([H|T]) ->
6472    is_RequestedEvent(H) andalso is_EventsDescriptor_eventList(T);
6473is_EventsDescriptor_eventList(_) ->
6474    false.
6475
6476chk_EventsDescriptor(D, D) ->
6477    chk_type(fun is_EventsDescriptor/1, 'EventsDescriptor', D);
6478chk_EventsDescriptor(#'EventsDescriptor'{requestID = RID1,
6479					 eventList = EVL1},
6480		     #'EventsDescriptor'{requestID = RID2,
6481					 eventList = EVL2}) ->
6482    validate(fun() -> chk_opt_RequestID(RID1, RID2) end, 'EventsDescriptor'),
6483    chk_EventsDescriptor_eventList(EVL1, EVL2),
6484    ok;
6485chk_EventsDescriptor(D1, D2) ->
6486    wrong_type('EventsDescriptor', D1, D2).
6487
6488chk_EventsDescriptor_eventList([], []) ->
6489    ok;
6490chk_EventsDescriptor_eventList([] = EVL1, EVL2) ->
6491    not_equal('EventsDescriptor_eventList', EVL1, EVL2);
6492chk_EventsDescriptor_eventList(EVL1, [] = EVL2) ->
6493    not_equal('EventsDescriptor_eventList', EVL1, EVL2);
6494chk_EventsDescriptor_eventList([H|T1], [H|T2]) ->
6495    case is_RequestedEvent(H) of
6496	true ->
6497	    chk_EventsDescriptor_eventList(T1, T2);
6498	false ->
6499	    wrong_type('EventsDescriptor_eventList_val', H)
6500    end;
6501chk_EventsDescriptor_eventList([H1|T1], [H2|T2]) ->
6502    validate(fun() -> chk_RequestedEvent(H1, H2) end,
6503	     'EventsDescriptor_eventList_val'),
6504    chk_EventsDescriptor_eventList(T1, T2);
6505chk_EventsDescriptor_eventList(EVL1, EVL2) ->
6506    wrong_type('EventsDescriptor_eventList', EVL1, EVL2).
6507
6508
6509%% -- RequestedEvent --
6510
6511is_RequestedEvent(#'RequestedEvent'{pkgdName    = N,
6512				    streamID    = SID,
6513				    eventAction = EA,
6514				    evParList   = EPL}) ->
6515    d("is_RequestedEvent -> entry with"
6516      "~n   N:   ~p"
6517      "~n   SID: ~p"
6518      "~n   EA:  ~p"
6519      "~n   EPL: ~p", [N, SID, EA, EPL]),
6520    is_PkgdName(N) andalso
6521	is_opt_StreamID(SID) andalso
6522	is_opt_RequestedActions(EA) andalso
6523	is_RequestedEvent_evParList(EPL);
6524is_RequestedEvent(_) ->
6525    false.
6526
6527is_RequestedEvent_evParList([]) ->
6528    true;
6529is_RequestedEvent_evParList([H|T]) ->
6530    is_EventParameter(H) andalso is_RequestedEvent_evParList(T);
6531is_RequestedEvent_evParList(_) ->
6532    false.
6533
6534chk_RequestedEvent(RE, RE) ->
6535    chk_type(fun is_RequestedEvent/1, 'RequestedEvent', RE);
6536chk_RequestedEvent(#'RequestedEvent'{pkgdName    = N1,
6537				     streamID    = SID1,
6538				     eventAction = EA1,
6539				     evParList   = EPL1},
6540		   #'RequestedEvent'{pkgdName    = N2,
6541				     streamID    = SID2,
6542				     eventAction = EA2,
6543				     evParList   = EPL2}) ->
6544    validate(fun() -> chk_PkgdName(N1, N2) end, 'RequestedEvent'),
6545    validate(fun() -> chk_opt_StreamID(SID1, SID2) end, 'RequestedEvent'),
6546    validate(fun() -> chk_opt_RequestedActions(EA1, EA2) end,
6547	     'RequestedEvent'),
6548    chk_RequestedEvent_evParList(EPL1, EPL2),
6549    ok;
6550chk_RequestedEvent(RE1, RE2) ->
6551    wrong_type('RequestedEvent', RE1, RE2).
6552
6553chk_RequestedEvent_evParList([], []) ->
6554    ok;
6555chk_RequestedEvent_evParList([] = EPL1, EPL2) ->
6556    not_equal('RequestedEvent_evParList', EPL1, EPL2);
6557chk_RequestedEvent_evParList(EPL1, [] = EPL2) ->
6558    not_equal('RequestedEvent_evParList', EPL1, EPL2);
6559chk_RequestedEvent_evParList([H|T1], [H|T2]) ->
6560    case is_EventParameter(H) of
6561	true ->
6562	    chk_RequestedEvent_evParList(T1, T2);
6563	false ->
6564	    wrong_type('RequestedEvent_evParList_val', H)
6565    end;
6566chk_RequestedEvent_evParList([H1|T1], [H2|T2]) ->
6567    validate(fun() -> chk_EventParameter(H1, H2) end,
6568	     'RequestedEvent_evParList_val'),
6569    chk_RequestedEvent_evParList(T1, T2);
6570chk_RequestedEvent_evParList(EPL1, EPL2) ->
6571    wrong_type('RequestedEvent_evParList', EPL1, EPL2).
6572
6573
6574%% -- RegulatedEmbeddedDescriptor --
6575
6576is_RegulatedEmbeddedDescriptor(
6577  #'RegulatedEmbeddedDescriptor'{secondEvent       = SE,
6578				 signalsDescriptor = SD}) ->
6579    is_opt_SecondEventsDescriptor(SE) andalso
6580	is_opt_SignalsDescriptor(SD);
6581is_RegulatedEmbeddedDescriptor(_) ->
6582    false.
6583
6584
6585chk_RegulatedEmbeddedDescriptor(
6586  #'RegulatedEmbeddedDescriptor'{secondEvent       = SE1,
6587				 signalsDescriptor = SD1},
6588  #'RegulatedEmbeddedDescriptor'{secondEvent       = SE2,
6589				 signalsDescriptor = SD2}) ->
6590    chk_RegulatedEmbeddedDescriptor_secondEvent(SE1, SE2),
6591    chk_RegulatedEmbeddedDescriptor_signalsDescriptor(SD1, SD2),
6592    ok;
6593chk_RegulatedEmbeddedDescriptor(RED1, RED2) ->
6594    wrong_type('RegulatedEmbeddedDescriptor', RED1, RED2).
6595
6596chk_RegulatedEmbeddedDescriptor_secondEvent(SE1, SE2) ->
6597    validate(fun() -> chk_opt_SecondEventsDescriptor(SE1, SE2) end,
6598	     'RegulatedEmbeddedDescriptor_secondEvent').
6599
6600chk_RegulatedEmbeddedDescriptor_signalsDescriptor(SD1, SD2) ->
6601    validate(fun() -> chk_opt_SignalsDescriptor(SD1, SD2) end,
6602	     'RegulatedEmbeddedDescriptor_signalsDescriptor').
6603
6604
6605%% -- NotifyBehaviour --
6606
6607tags_NotifyBehaviour() ->
6608    [
6609     {notifyImmediate,
6610      fun is_NULL/1,
6611      fun chk_NULL/2},
6612
6613     {notifyRegulated,
6614      fun is_RegulatedEmbeddedDescriptor/1,
6615      fun chk_RegulatedEmbeddedDescriptor/2},
6616
6617     {neverNotify,
6618      fun is_NULL/1,
6619      fun chk_NULL/2}
6620    ].
6621
6622is_opt_NotifyBehaviour(asn1_NOVALUE) ->
6623    true;
6624is_opt_NotifyBehaviour(NB) ->
6625    is_NotifyBehaviour(NB).
6626
6627is_NotifyBehaviour(NB) ->
6628    is_CHOICE(NB, tags_NotifyBehaviour()).
6629
6630chk_opt_NotifyBehaviour(asn1_NOVALUE, asn1_NOVALUE) ->
6631    ok;
6632chk_opt_NotifyBehaviour(NB1, NB2) ->
6633    chk_NotifyBehaviour(NB1, NB2).
6634
6635chk_NotifyBehaviour(NB1, NB2) ->
6636    chk_CHOICE(NB1, NB2, 'NotifyBehaviour', tags_NotifyBehaviour()).
6637
6638
6639%% -- RequestedActions --
6640
6641is_opt_RequestedActions(asn1_NOVALUE) ->
6642    true;
6643is_opt_RequestedActions(RA) ->
6644    is_RequestedActions(RA).
6645
6646is_RequestedActions(#'RequestedActions'{keepActive            = KA,
6647					eventDM               = EDM,
6648					secondEvent           = SE,
6649					signalsDescriptor     = SD,
6650					notifyBehaviour       = NB,
6651					resetEventsDescriptor = RED}) ->
6652    d("is_RequestedActions -> entry with"
6653      "~n   KA:  ~p"
6654      "~n   EDM: ~p"
6655      "~n   SE:  ~p"
6656      "~n   SD:  ~p"
6657      "~n   NB:  ~p"
6658      "~n   RED: ~p", [KA, EDM, SE, SD, NB, RED]),
6659    is_opt_BOOLEAN(KA) andalso
6660	is_opt_EventDM(EDM) andalso
6661	is_opt_SecondEventsDescriptor(SE) andalso
6662	is_opt_SignalsDescriptor(SD) andalso
6663	is_opt_NotifyBehaviour(SD) andalso
6664	is_opt_NULL(SD);
6665is_RequestedActions(_) ->
6666    false.
6667
6668chk_opt_RequestedActions(asn1_NOVALUE, asn1_NOVALUE) ->
6669    ok;
6670chk_opt_RequestedActions(RA1, RA2) ->
6671    chk_RequestedActions(RA1, RA2).
6672
6673chk_RequestedActions(RA, RA) ->
6674    chk_type(fun is_RequestedActions/1, 'RequestedActions', RA);
6675chk_RequestedActions(#'RequestedActions'{keepActive            = KA1,
6676					 eventDM               = EDM1,
6677					 secondEvent           = SE1,
6678					 signalsDescriptor     = SD1,
6679					 notifyBehaviour       = NB1,
6680					 resetEventsDescriptor = RED1},
6681		     #'RequestedActions'{keepActive            = KA2,
6682					 eventDM               = EDM2,
6683					 secondEvent           = SE2,
6684					 signalsDescriptor     = SD2,
6685					 notifyBehaviour       = NB2,
6686					 resetEventsDescriptor = RED2}) ->
6687    chk_RequestedActions_keepActive(KA1, KA2),
6688    chk_RequestedActions_eventDM(EDM1, EDM2),
6689    chk_RequestedActions_secondEvent(SE1, SE2),
6690    chk_RequestedActions_signalsDescriptor(SD1, SD2),
6691    chk_RequestedActions_notifyBehaviour(NB1, NB2),
6692    chk_RequestedActions_resetEventsDescriptor(RED1, RED2),
6693    ok;
6694chk_RequestedActions(RA1, RA2) ->
6695    wrong_type('RequestedActions', RA1, RA2).
6696
6697chk_RequestedActions_keepActive(V1, V2) ->
6698    validate(fun() -> chk_opt_BOOLEAN(V1, V2) end,
6699	     'RequestedActions_keepActive').
6700
6701chk_RequestedActions_eventDM(V1, V2) ->
6702    validate(fun() -> chk_opt_EventDM(V1, V2) end,
6703	     'RequestedActions_eventDM').
6704
6705chk_RequestedActions_secondEvent(V1, V2) ->
6706    validate(fun() -> chk_opt_SecondEventsDescriptor(V1, V2) end,
6707	     'RequestedActions_secondEvent').
6708
6709chk_RequestedActions_signalsDescriptor(V1, V2) ->
6710    validate(fun() -> chk_opt_SignalsDescriptor(V1, V2) end,
6711	     'RequestedActions_signalsDescriptor').
6712
6713chk_RequestedActions_notifyBehaviour(V1, V2) ->
6714    validate(fun() -> chk_opt_NotifyBehaviour(V1, V2) end,
6715	     'RequestedActions_notifyBehaviour').
6716
6717chk_RequestedActions_resetEventsDescriptor(V1, V2) ->
6718    validate(fun() -> chk_opt_NULL(V1, V2) end,
6719	     'RequestedActions_resetEventsDescriptor').
6720
6721
6722%% -- EventDM --
6723
6724is_opt_EventDM(EDM) ->
6725    is_OPTIONAL(fun is_EventDM/1, EDM).
6726
6727is_EventDM({Tag, Val}) ->
6728    is_EventDM_tag(Tag) andalso is_EventDM_val(Tag, Val);
6729is_EventDM(_) ->
6730    false.
6731
6732is_EventDM_tag(Tag) ->
6733    Tags = [digitMapName, digitMapValue],
6734    lists:member(Tag, Tags).
6735
6736is_EventDM_val(digitMapName, Val) ->
6737    is_DigitMapName(Val);
6738is_EventDM_val(digitMapValue, Val) ->
6739    is_DigitMapValue(Val).
6740
6741chk_opt_EventDM(EDM1, EDM2) ->
6742    chk_OPTIONAL('EventDM', EDM1, EDM2, fun is_EventDM/1, fun chk_EventDM/2).
6743
6744chk_EventDM(EDM, EDM) ->
6745    chk_type(fun is_EventDM/1, 'EventDM', EDM);
6746chk_EventDM({Tag, Val1} = EDM1, {Tag, Val2} = EDM2) ->
6747    case (is_EventDM_tag(Tag) andalso
6748	  is_EventDM_val(Tag, Val1) andalso
6749	  is_EventDM_val(Tag, Val2)) of
6750	true ->
6751	    chk_EventDM_val(Tag, Val1, Val2);
6752	false ->
6753	    wrong_type('EventDM', EDM1, EDM2)
6754    end;
6755chk_EventDM({Tag1, Val1} = EDM1, {Tag2, Val2} = EDM2) ->
6756    case ((is_EventDM_tag(Tag1) andalso
6757	   is_EventDM_val(Tag1, Val1)) andalso
6758	  (is_EventDM_tag(Tag2) andalso
6759	   is_EventDM_val(Tag2, Val2))) of
6760	true ->
6761	    not_equal('EventDM', EDM1, EDM2);
6762	false ->
6763	    wrong_type('EventDM', EDM1, EDM2)
6764    end;
6765chk_EventDM(EDM1, EDM2) ->
6766    wrong_type('EventDM', EDM1, EDM2).
6767
6768chk_EventDM_val(digitMapName, Val1, Val2) ->
6769    validate(fun() -> chk_DigitMapName(Val1, Val2) end, 'EventDM');
6770chk_EventDM_val(digitMapValue, Val1, Val2) ->
6771    validate(fun() -> chk_DigitMapValue(Val1, Val2) end, 'EventDM').
6772
6773
6774%% -- SecondEventsDescriptor --
6775
6776is_opt_SecondEventsDescriptor(asn1_NOVALUE) ->
6777    true;
6778is_opt_SecondEventsDescriptor(D) ->
6779    is_SecondEventsDescriptor(D).
6780
6781is_SecondEventsDescriptor(#'SecondEventsDescriptor'{requestID = RID,
6782						    eventList = EL}) ->
6783    is_opt_RequestID(RID) andalso is_SecondEventsDescriptor_eventList(EL);
6784is_SecondEventsDescriptor(_) ->
6785    false.
6786
6787is_SecondEventsDescriptor_eventList([]) ->
6788    true;
6789is_SecondEventsDescriptor_eventList([H|T]) ->
6790    is_SecondRequestedEvent(H) andalso is_SecondEventsDescriptor_eventList(T);
6791is_SecondEventsDescriptor_eventList(_) ->
6792    false.
6793
6794chk_opt_SecondEventsDescriptor(asn1_NOVALUE, asn1_NOVALUE) ->
6795    ok;
6796chk_opt_SecondEventsDescriptor(D1, D2) ->
6797    chk_SecondEventsDescriptor(D1, D2).
6798
6799chk_SecondEventsDescriptor(D, D) ->
6800    chk_type(fun is_SecondEventsDescriptor/1, 'SecondEventsDescriptor', D);
6801chk_SecondEventsDescriptor(#'SecondEventsDescriptor'{requestID = RID1,
6802						     eventList = EL1},
6803			   #'SecondEventsDescriptor'{requestID = RID2,
6804						     eventList = EL2}) ->
6805    validate(fun() -> chk_opt_RequestID(RID1, RID2) end,
6806	     'SecondEventsDescriptor'),
6807    chk_SecondEventsDescriptor_eventList(EL1, EL2),
6808    ok;
6809chk_SecondEventsDescriptor(D1, D2) ->
6810    wrong_type('SecondEventsDescriptor', D1, D2).
6811
6812chk_SecondEventsDescriptor_eventList([], []) ->
6813    ok;
6814chk_SecondEventsDescriptor_eventList([] = EL1, EL2) ->
6815    not_equal('SecondEventsDescriptor_eventList', EL1, EL2);
6816chk_SecondEventsDescriptor_eventList(EL1, [] = EL2) ->
6817    not_equal('SecondEventsDescriptor_eventList', EL1, EL2);
6818chk_SecondEventsDescriptor_eventList([H|T1], [H|T2]) ->
6819    case is_SecondRequestedEvent(H) of
6820	true ->
6821	    chk_SecondEventsDescriptor_eventList(T1, T2);
6822	false ->
6823	    wrong_type('SecondEventsDescriptor_eventList_val', H)
6824    end;
6825chk_SecondEventsDescriptor_eventList([H1|T1], [H2|T2]) ->
6826    validate(fun() -> chk_SecondRequestedEvent(H1, H2) end,
6827	     'SecondEventsDescriptor_eventList_val'),
6828    chk_SecondEventsDescriptor_eventList(T1, T2);
6829chk_SecondEventsDescriptor_eventList(L1, L2) ->
6830    wrong_type('SecondEventsDescriptor_eventList_val', L1, L2).
6831
6832
6833%% -- SecondRequestedEvent --
6834
6835is_SecondRequestedEvent(#'SecondRequestedEvent'{pkgdName    = N,
6836						streamID    = SID,
6837						eventAction = EA,
6838						evParList   = EPL}) ->
6839    is_PkgdName(N) andalso
6840	is_opt_StreamID(SID) andalso
6841	is_opt_SecondRequestedActions(EA) andalso
6842	is_SecondRequestedEvent_evParList(EPL);
6843is_SecondRequestedEvent(_) ->
6844    false.
6845
6846is_SecondRequestedEvent_evParList([]) ->
6847    true;
6848is_SecondRequestedEvent_evParList([H|T]) ->
6849    is_EventParameter(H) andalso is_SecondRequestedEvent_evParList(T);
6850is_SecondRequestedEvent_evParList(_) ->
6851    false.
6852
6853chk_SecondRequestedEvent(RE, RE) ->
6854    chk_type(fun is_SecondRequestedEvent/1, 'SecondRequestedEvent', RE);
6855chk_SecondRequestedEvent(#'SecondRequestedEvent'{pkgdName    = N1,
6856						 streamID    = SID1,
6857						 eventAction = EA1,
6858						 evParList   = EPL1},
6859			 #'SecondRequestedEvent'{pkgdName    = N2,
6860						 streamID    = SID2,
6861						 eventAction = EA2,
6862						 evParList   = EPL2}) ->
6863    validate(fun() -> chk_PkgdName(N1, N2) end, 'SecondRequestedEvent'),
6864    validate(fun() -> chk_opt_StreamID(SID1, SID2) end,
6865	     'SecondRequestedEvent'),
6866    validate(fun() -> chk_opt_SecondRequestedActions(EA1, EA2) end,
6867	     'SecondRequestedEvent'),
6868    chk_SecondRequestedEvent_evParList(EPL1, EPL2),
6869    ok;
6870chk_SecondRequestedEvent(RE1, RE2) ->
6871    wrong_type('SecondRequestedEvent', RE1, RE2).
6872
6873chk_SecondRequestedEvent_evParList([], []) ->
6874    ok;
6875chk_SecondRequestedEvent_evParList([] = EPL1, EPL2) ->
6876    not_equal('SecondRequestedEvent_evParList', EPL1, EPL2);
6877chk_SecondRequestedEvent_evParList(EPL1, [] = EPL2) ->
6878    not_equal('SecondRequestedEvent_evParList', EPL1, EPL2);
6879chk_SecondRequestedEvent_evParList([H|T1], [H|T2]) ->
6880    case is_EventParameter(H) of
6881	true ->
6882	    chk_SecondRequestedEvent_evParList(T1, T2);
6883	false ->
6884	    wrong_type('SecondRequestedEvent_evParList_val', H)
6885    end;
6886chk_SecondRequestedEvent_evParList([H1|T1], [H2|T2]) ->
6887    validate(fun() -> chk_EventParameter(H1, H2) end,
6888	     'SecondRequestedEvent_evParList_val'),
6889    chk_SecondRequestedEvent_evParList(T1, T2);
6890chk_SecondRequestedEvent_evParList(EPL1, EPL2) ->
6891    wrong_type('SecondRequestedEvent_evParList', EPL1, EPL2).
6892
6893
6894%% -- SecondRequestedActions --
6895
6896is_opt_SecondRequestedActions(asn1_NOVALUE) ->
6897    true;
6898is_opt_SecondRequestedActions(SRA) ->
6899    is_SecondRequestedActions(SRA).
6900
6901is_SecondRequestedActions(
6902  #'SecondRequestedActions'{keepActive            = KA,
6903			    eventDM               = EDM,
6904			    signalsDescriptor     = SD,
6905			    notifyBehaviour       = NB,
6906			    resetEventsDescriptor = RED}) ->
6907    is_opt_BOOLEAN(KA) andalso
6908	is_opt_EventDM(EDM) andalso
6909	is_opt_SignalsDescriptor(SD) andalso
6910	is_opt_NotifyBehaviour(NB) andalso
6911	is_opt_NULL(RED);
6912is_SecondRequestedActions(_) ->
6913    false.
6914
6915chk_opt_SecondRequestedActions(asn1_NOVALUE, asn1_NOVALUE) ->
6916    ok;
6917chk_opt_SecondRequestedActions(SRA1, SRA2) ->
6918    chk_SecondRequestedActions(SRA1, SRA2).
6919
6920chk_SecondRequestedActions(SRA, SRA) ->
6921    chk_type(fun is_SecondRequestedActions/1, 'SecondRequestedActions', SRA);
6922chk_SecondRequestedActions(
6923  #'SecondRequestedActions'{keepActive            = KA1,
6924			    eventDM               = EDM1,
6925			    signalsDescriptor     = SD1,
6926			    notifyBehaviour       = NB1,
6927			    resetEventsDescriptor = RED1},
6928  #'SecondRequestedActions'{keepActive            = KA2,
6929			    eventDM               = EDM2,
6930			    signalsDescriptor     = SD2,
6931			    notifyBehaviour       = NB2,
6932			    resetEventsDescriptor = RED2}) ->
6933    chk_SecondRequestedActions_keepActive(KA1, KA2),
6934    chk_SecondRequestedActions_eventDM(EDM1, EDM2),
6935    chk_SecondRequestedActions_signalsDescriptor(SD1, SD2),
6936    chk_SecondRequestedActions_notifyBehaviour(NB1, NB2),
6937    chk_SecondRequestedActions_resetEventsDescriptor(RED1, RED2),
6938    ok;
6939chk_SecondRequestedActions(SRA1, SRA2) ->
6940    wrong_type('SecondRequestedActions', SRA1, SRA2).
6941
6942chk_SecondRequestedActions_keepActive(V1, V2) ->
6943    validate(fun() -> chk_opt_BOOLEAN(V1, V2) end,
6944	     'SecondRequestedActions_keepActive').
6945
6946chk_SecondRequestedActions_eventDM(V1, V2) ->
6947    validate(fun() -> chk_opt_EventDM(V1, V2) end,
6948	     'SecondRequestedActions_eventDM').
6949
6950chk_SecondRequestedActions_signalsDescriptor(V1, V2) ->
6951    validate(fun() -> chk_opt_SignalsDescriptor(V1, V2) end,
6952	     'SecondRequestedActions_signalsDescriptor').
6953
6954chk_SecondRequestedActions_notifyBehaviour(V1, V2) ->
6955    validate(fun() -> chk_opt_NotifyBehaviour(V1, V2) end,
6956	     'SecondRequestedActions_notifyBehaviour').
6957
6958chk_SecondRequestedActions_resetEventsDescriptor(V1, V2) ->
6959    validate(fun() -> chk_opt_NULL(V1, V2) end,
6960	     'SecondRequestedActions_resetEventsDescriptor').
6961
6962
6963%% -- EventBufferDescriptor --
6964
6965is_EventBufferDescriptor(D) ->
6966    is_SEQUENCE_OF(D, fun is_EventSpec/1).
6967
6968chk_EventBufferDescriptor(D1, D2) ->
6969    chk_SEQUENCE_OF(D1, D2, 'EventBufferDescriptor',
6970		    fun is_EventSpec/1, fun chk_EventSpec/2).
6971
6972
6973%% -- EventSpec --
6974
6975is_EventSpec(#'EventSpec'{eventName    = N,
6976			  streamID     = SID,
6977			  eventParList = EPL}) ->
6978    is_EventName(N) andalso
6979	is_opt_StreamID(SID) andalso
6980	is_EventSpec_eventParList(EPL);
6981is_EventSpec(_) ->
6982    false.
6983
6984is_EventSpec_eventParList([]) ->
6985    true;
6986is_EventSpec_eventParList([H|T]) ->
6987    is_EventParameter(H) andalso is_EventSpec_eventParList(T);
6988is_EventSpec_eventParList(_) ->
6989    false.
6990
6991chk_EventSpec(ES, ES) ->
6992    chk_type(fun is_EventSpec/1, 'EventSpec', ES);
6993chk_EventSpec(#'EventSpec'{eventName    = N1,
6994			   streamID     = SID1,
6995			   eventParList = EPL1},
6996	      #'EventSpec'{eventName    = N2,
6997			   streamID     = SID2,
6998			   eventParList = EPL2}) ->
6999    validate(fun() -> chk_EventName(N1, N2) end, 'EventSpec'),
7000    validate(fun() -> chk_opt_StreamID(SID1, SID2) end, 'EventSpec'),
7001    chk_EventSpec_eventParList(EPL1, EPL2),
7002    ok;
7003chk_EventSpec(ES1, ES2) ->
7004    wrong_type('EventSpec', ES1, ES2).
7005
7006chk_EventSpec_eventParList([], []) ->
7007    ok;
7008chk_EventSpec_eventParList([] = EPL1, EPL2) ->
7009    not_equal('EventSpec_eventParList', EPL1, EPL2);
7010chk_EventSpec_eventParList(EPL1, [] = EPL2) ->
7011    not_equal('EventSpec_eventParList', EPL1, EPL2);
7012chk_EventSpec_eventParList([H|T1], [H|T2]) ->
7013    case is_EventParameter(H) of
7014	true ->
7015	    chk_EventSpec_eventParList(T1, T2);
7016	false ->
7017	    wrong_type('EventSpec_eventParList_val', H)
7018    end;
7019chk_EventSpec_eventParList([H1|T1], [H2|T2]) ->
7020    validate(fun() -> chk_EventParameter(H1, H2) end,
7021	     'EventSpec_eventParList_val'),
7022    chk_EventSpec_eventParList(T1, T2);
7023chk_EventSpec_eventParList(EPL1, EPL2) ->
7024    wrong_type('EventSpec_eventParList', EPL1, EPL2).
7025
7026
7027%% -- SignalsDescriptor --
7028
7029is_opt_SignalsDescriptor(asn1_NOVALUE) ->
7030    true;
7031is_opt_SignalsDescriptor(D) ->
7032    is_SignalsDescriptor(D).
7033
7034is_SignalsDescriptor(D) ->
7035    is_SEQUENCE_OF(D, fun is_SignalRequest/1).
7036
7037chk_opt_SignalsDescriptor(asn1_NOVALUE, asn1_NOVALUE) ->
7038    ok;
7039chk_opt_SignalsDescriptor(D1, D2) ->
7040    chk_SignalsDescriptor(D1, D2).
7041
7042chk_SignalsDescriptor(D1, D2) ->
7043    chk_SEQUENCE_OF(D1, D2, 'SignalsDescriptor',
7044		    fun is_SignalRequest/1, fun chk_SignalRequest/2).
7045
7046
7047%% -- SignalRequest --
7048
7049tags_SignalRequest() ->
7050    [
7051     {signal,     fun is_Signal/1,     fun chk_Signal/2},
7052     {seqSigList, fun is_SeqSigList/1, fun chk_SeqSigList/2}
7053    ].
7054
7055is_SignalRequest(SR) ->
7056    is_CHOICE(SR, tags_SignalRequest()).
7057
7058chk_SignalRequest(R1, R2) ->
7059    chk_CHOICE(R1, R2, 'SignalRequest', tags_SignalRequest()).
7060
7061
7062%% -- SeqSigList --
7063
7064%% fields_SeqSigList() ->
7065%%     [
7066%%      {id,
7067%%       'INTEGER(0,65535)',
7068%%       fun(ID) -> is_INTEGER(ID, {range, 0, 65535}) end,
7069%%       fun(ID1, ID2) -> chk_INTEGER(ID1, ID2, {range, 0, 65535}) end},
7070
7071%%      {signalList,
7072%%       'SEQUENCE OF Signal',
7073%%       fun(S) ->
7074%% 	      is_SEQUENCE_OF(S, fun is_Signal/1)
7075%%       end,
7076%%       fun(S1, S2) ->
7077%% 	      chk_SEQUENCE_OF(S1, S2, fun is_Signal/1, fun chk_Signal/2)
7078%%       end}
7079%%     ].
7080
7081%% is_SeqSigList(V) ->
7082%%     is_SEQUENCE(V, 'SeqSigList', fields_SeqSigList()).
7083
7084
7085is_SeqSigList(#'SeqSigList'{id         = ID,
7086			    signalList = SL}) ->
7087    is_INTEGER(ID, {range, 0, 65535}) andalso
7088	is_SeqSigList_signalList(SL);
7089is_SeqSigList(_) ->
7090    false.
7091
7092is_SeqSigList_signalList([]) ->
7093    true;
7094is_SeqSigList_signalList([H|T]) ->
7095    is_Signal(H) andalso is_SeqSigList_signalList(T);
7096is_SeqSigList_signalList(_) ->
7097    false.
7098
7099chk_SeqSigList(L, L) ->
7100    chk_type(fun is_SeqSigList/1, 'SeqSigList', L);
7101chk_SeqSigList(#'SeqSigList'{id         = ID1,
7102			     signalList = SL1},
7103	       #'SeqSigList'{id         = ID2,
7104			     signalList = SL2}) ->
7105    validate(fun() -> chk_INTEGER(ID1, ID2, {range, 0, 65535}) end,
7106	     'SeqSigList'),
7107    chk_SeqSigList_signalList(SL1, SL2),
7108    ok;
7109chk_SeqSigList(L1, L2) ->
7110    wrong_type('SeqSigList', L1, L2).
7111
7112chk_SeqSigList_signalList([], []) ->
7113    ok;
7114chk_SeqSigList_signalList([] = L1, L2) ->
7115    not_equal('SeqSigList_signalList', L1, L2);
7116chk_SeqSigList_signalList(L1, [] = L2) ->
7117    not_equal('SeqSigList_signalList', L1, L2);
7118chk_SeqSigList_signalList([H|T1], [H|T2]) ->
7119    case is_Signal(H) of
7120	true ->
7121	    chk_SeqSigList_signalList(T1, T2);
7122	false ->
7123	    wrong_type('SeqSigList_signalList_val', H)
7124    end;
7125chk_SeqSigList_signalList([H1|T1], [H2|T2]) ->
7126    validate(fun() -> chk_Signal(H1, H2) end,
7127	     'SeqSigList_signalList_val'),
7128    chk_SeqSigList_signalList(T1, T2);
7129chk_SeqSigList_signalList(L1, L2) ->
7130    wrong_type('SeqSigList_signalList', L1, L2).
7131
7132
7133%% -- Signal --
7134
7135is_Signal(#'Signal'{signalName       = N,
7136		    streamID         = SID,
7137		    sigType          = ST,
7138		    duration         = Dur,
7139		    notifyCompletion = NC,
7140		    keepActive       = KA,
7141		    sigParList       = SPL,
7142		    direction        = Dir,
7143		    requestID        = RID,
7144		    intersigDelay    = ISD}) ->
7145    d("is_Signal -> entry with"
7146      "~n   N:   ~p"
7147      "~n   SID: ~p"
7148      "~n   ST:  ~p"
7149      "~n   Dur: ~p"
7150      "~n   NC:  ~p"
7151      "~n   KA:  ~p"
7152      "~n   SPL: ~p"
7153      "~n   Dir: ~p"
7154      "~n   RID: ~p"
7155      "~n   ISD: ~p", [N, SID, ST, Dur, NC, KA, SPL, Dir, RID, ISD]),
7156    is_SignalName(N) andalso
7157	is_opt_StreamID(SID) andalso
7158	is_opt_SignalType(ST) andalso
7159	is_opt_INTEGER(Dur, {range, 0, 65535}) andalso
7160	is_opt_NotifyCompletion(NC) andalso
7161	is_opt_BOOLEAN(KA) andalso
7162	is_Signal_sigParList(SPL) andalso
7163	is_opt_SignalDirection(Dir) andalso
7164	is_opt_RequestID(RID) andalso
7165	is_opt_INTEGER(ISD, {range, 0, 65535}).
7166
7167is_Signal_sigParList([]) ->
7168    true;
7169is_Signal_sigParList([H|T]) ->
7170    is_SigParameter(H) andalso is_Signal_sigParList(T);
7171is_Signal_sigParList(_) ->
7172    false.
7173
7174chk_Signal(S, S) ->
7175    chk_type(fun is_Signal/1, 'Signal', S);
7176chk_Signal(#'Signal'{signalName       = N1,
7177		     streamID         = SID1,
7178		     sigType          = ST1,
7179		     duration         = Dur1,
7180		     notifyCompletion = NC1,
7181		     keepActive       = KA1,
7182		     sigParList       = SPL1,
7183		     direction        = Dir1,
7184		     requestID        = RID1,
7185		     intersigDelay    = ISD1},
7186	   #'Signal'{signalName       = N2,
7187		     streamID         = SID2,
7188		     sigType          = ST2,
7189		     duration         = Dur2,
7190		     notifyCompletion = NC2,
7191		     keepActive       = KA2,
7192		     sigParList       = SPL2,
7193		     direction        = Dir2,
7194		     requestID        = RID2,
7195		     intersigDelay    = ISD2}) ->
7196    chk_Signal_signalName(N1, N2),
7197    chk_Signal_streamID(SID1, SID2),
7198    chk_Signal_sigType(ST1, ST2),
7199    chk_Signal_duration(Dur1, Dur2),
7200    chk_Signal_notifyCompletion(NC1, NC2),
7201    chk_Signal_keepActive(KA1, KA2),
7202    chk_Signal_sigParList(SPL1, SPL2),
7203    chk_Signal_direction(Dir1, Dir2),
7204    chk_Signal_requestID(RID1, RID2),
7205    chk_Signal_intersigDelay(ISD1, ISD2),
7206    ok;
7207chk_Signal(S1, S2) ->
7208    wrong_type('Signal', S1, S2).
7209
7210chk_Signal_signalName(N1, N2) ->
7211    validate(fun() -> chk_SignalName(N1, N2) end, 'Signal_signalName').
7212
7213chk_Signal_streamID(V1, V2) ->
7214    validate(fun() -> chk_opt_StreamID(V1, V2) end, 'Signal_streamID').
7215
7216chk_Signal_sigType(V1, V2) ->
7217    validate(fun() -> chk_opt_SignalType(V1, V2) end, 'Signal_sigType').
7218
7219chk_Signal_duration(V1, V2) ->
7220    validate(fun() ->
7221		     chk_opt_INTEGER(V1, V2, {range, 0, 65535})
7222	     end,
7223	     'Signal_duration').
7224
7225chk_Signal_notifyCompletion(V1, V2) ->
7226    validate(fun() -> chk_opt_NotifyCompletion(V1, V2) end,
7227	     'Signal_notifyCompletion').
7228
7229chk_Signal_keepActive(false, asn1_NOVALUE) ->
7230    ok;
7231chk_Signal_keepActive(asn1_NOVALUE, false) ->
7232    ok;
7233chk_Signal_keepActive(V1, V2) ->
7234    validate(fun() -> chk_opt_BOOLEAN(V1, V2) end, 'Signal_keepActive').
7235
7236chk_Signal_sigParList([], []) ->
7237    ok;
7238chk_Signal_sigParList([] = L1, L2) ->
7239    not_equal('Signal_sigParList', L1, L2);
7240chk_Signal_sigParList(L1, [] = L2) ->
7241    not_equal('Signal_sigParList', L1, L2);
7242chk_Signal_sigParList([H|T1], [H|T2]) ->
7243    case is_SigParameter(H) of
7244	true ->
7245	    chk_Signal_sigParList(T1, T2);
7246	false ->
7247	    wrong_type('Signal_sigParList_val', H)
7248    end;
7249chk_Signal_sigParList([H1|T1], [H2|T2]) ->
7250    validate(fun() -> chk_SigParameter(H1, H2) end,
7251	     'Signal_sigParList_val'),
7252    chk_Signal_sigParList(T1, T2);
7253chk_Signal_sigParList(L1, L2) ->
7254    wrong_type('Signal_sigParList', L1, L2).
7255
7256chk_Signal_direction(V1, V2) ->
7257    validate(fun() -> chk_opt_SignalDirection(V1, V2) end, 'Signal_direction').
7258
7259chk_Signal_requestID(V1, V2) ->
7260    validate(fun() -> chk_opt_RequestID(V1, V2) end, 'Signal_requestID').
7261
7262chk_Signal_intersigDelay(V1, V2) ->
7263    validate(fun() -> chk_opt_INTEGER(V1, V2, {range, 0, 65535}) end,
7264	     'Signal_intersigDelay').
7265
7266
7267%% -- SignalType --
7268
7269is_opt_SignalType(T) ->
7270    is_OPTIONAL(fun is_SignalType/1, T).
7271
7272is_SignalType(T) ->
7273    d("is_SignalType -> entry with"
7274      "~n   T: ~p", [T]),
7275    Types = [brief, onOff, timeOut],
7276    lists:member(T, Types).
7277
7278chk_opt_SignalType(T1, T2) ->
7279    chk_OPTIONAL('SignalType', T1, T2,
7280		 fun is_SignalType/1, fun chk_SignalType/2).
7281
7282chk_SignalType(T, T) ->
7283    chk_type(fun is_SignalType/1, 'SignalType', T);
7284chk_SignalType(T1, T2) ->
7285    case (is_SignalType(T1) andalso is_SignalType(T2)) of
7286	true ->
7287	    not_equal('SignalType', T1, T2);
7288	false ->
7289	    wrong_type('SignalType', T1, T2)
7290    end.
7291
7292
7293%% -- SignalDirection --
7294
7295is_opt_SignalDirection(T) ->
7296    is_OPTIONAL(fun is_SignalDirection/1, T).
7297
7298is_SignalDirection(Dir) ->
7299    d("is_SignalDirection -> entry with"
7300      "~n   Dir: ~p", [Dir]),
7301    Dirs = [internal, external, both],
7302    lists:member(Dir, Dirs).
7303
7304chk_opt_SignalDirection(T1, T2) ->
7305    chk_OPTIONAL('SignalDirection', T1, T2,
7306		 fun is_SignalDirection/1, fun chk_SignalDirection/2).
7307
7308chk_SignalDirection(Dir, Dir) ->
7309    chk_type(fun is_SignalDirection/1, 'SignalDirection', Dir);
7310chk_SignalDirection(Dir1, Dir2) ->
7311    case (is_SignalDirection(Dir1) andalso is_SignalDirection(Dir2)) of
7312	true ->
7313	    not_equal('SignalDirection', Dir1, Dir2);
7314	false ->
7315	    wrong_type('SignalDirection', Dir1, Dir2)
7316    end.
7317
7318
7319%% -- SignalName --
7320
7321is_SignalName(N) ->
7322    d("is_SignalName -> entry with"
7323      "~n   N: ~p", [N]),
7324    is_PkgdName(N).
7325
7326chk_SignalName(N1, N2) ->
7327    validate(fun() -> chk_PkgdName(N1, N2) end, 'SignalName').
7328
7329
7330%% -- NotifyCompletion --
7331
7332is_opt_NotifyCompletion(NC) ->
7333    is_OPTIONAL(fun is_NotifyCompletion/1, NC).
7334
7335is_NotifyCompletion(NC) ->
7336    d("is_NotifyCompletion -> entry with"
7337      "~n   NC: ~p", [NC]),
7338    Valids = [onTimeOut,
7339	      onInterruptByEvent,
7340	      onInterruptByNewSignalDescr,
7341	      otherReason],
7342    lists:all(fun(X) -> lists:member(X, Valids) end, NC).
7343
7344chk_opt_NotifyCompletion(NC1, NC2) ->
7345    chk_OPTIONAL('NotifyCompletion', NC1, NC2,
7346		 fun is_NotifyCompletion/1,
7347		 fun chk_NotifyCompletion/2).
7348
7349chk_NotifyCompletion(NC, NC) ->
7350    chk_type(fun is_NotifyCompletion/1, 'NotifyCompletion', NC);
7351chk_NotifyCompletion(NC1, NC2) ->
7352    case (is_NotifyCompletion(NC1) andalso is_NotifyCompletion(NC2)) of
7353	true ->
7354	    not_equal('NotifyCompletion', NC1, NC2);
7355	false ->
7356	    wrong_type('NotifyCompletion', NC1, NC2)
7357    end.
7358
7359
7360%% -- SigParameter --
7361
7362is_SigParameter(#'SigParameter'{sigParameterName = N,
7363				value            = V,
7364				extraInfo        = I}) ->
7365    d("is_SigParameter -> entry with"
7366      "~n   N: ~p"
7367      "~n   V: ~p"
7368      "~n   I: ~p", [N, V, I]),
7369    is_Name(N) andalso
7370	is_Value(V) andalso
7371	is_SigParameter_extraInfo(I);
7372is_SigParameter(_) ->
7373    false.
7374
7375is_SigParameter_extraInfo(asn1_NOVALUE) ->
7376    true;
7377is_SigParameter_extraInfo({Tag, Val}) ->
7378    is_SigParameter_extraInfo_tag(Tag) andalso
7379	is_SigParameter_extraInfo_val(Tag, Val);
7380is_SigParameter_extraInfo(_) ->
7381    false.
7382
7383is_SigParameter_extraInfo_tag(Tag) ->
7384    Tags = [relation, range, sublist],
7385    lists:member(Tag, Tags).
7386
7387is_SigParameter_extraInfo_val(relation, Val) ->
7388    is_Relation(Val);
7389is_SigParameter_extraInfo_val(range, Val) ->
7390    is_BOOLEAN(Val);
7391is_SigParameter_extraInfo_val(sublist, Val) ->
7392    is_BOOLEAN(Val).
7393
7394chk_SigParameter(P, P) ->
7395    chk_type(fun is_SigParameter/1, 'SigParameter', P);
7396chk_SigParameter(#'SigParameter'{sigParameterName = N1,
7397				 value            = V1,
7398				 extraInfo        = I1},
7399		 #'SigParameter'{sigParameterName = N2,
7400				 value            = V2,
7401				 extraInfo        = I2}) ->
7402    validate(fun() -> chk_Name(N1, N2) end, 'SigParameter'),
7403    validate(fun() -> chk_Value(V1, V2) end, 'SigParameter'),
7404    chk_SigParameter_extraInfo(I1, I2),
7405    ok;
7406chk_SigParameter(P1, P2) ->
7407    wrong_type('SigParameter', P1, P2).
7408
7409chk_SigParameter_extraInfo(EI, EI) ->
7410    chk_type(fun is_SigParameter_extraInfo/1, 'SigParameter_extraInfo', EI);
7411chk_SigParameter_extraInfo({Tag, Val1} = EI1, {Tag, Val2} = EI2) ->
7412    case (is_SigParameter_extraInfo_tag(Tag) and
7413	  is_SigParameter_extraInfo_val(Tag, Val1) and
7414	  is_SigParameter_extraInfo_val(Tag, Val2)) of
7415	true ->
7416	    chk_SigParameter_extraInfo_val(Tag, Val1, Val2);
7417	false ->
7418	    wrong_type('SigParameter_extraInfo', EI1, EI2)
7419    end;
7420chk_SigParameter_extraInfo({Tag1, Val1} = EI1, {Tag2, Val2} = EI2) ->
7421    case ((is_SigParameter_extraInfo_tag(Tag1) and
7422	   is_SigParameter_extraInfo_val(Tag1, Val1)) and
7423	  (is_SigParameter_extraInfo_tag(Tag2) and
7424	   is_SigParameter_extraInfo_val(Tag2, Val2))) of
7425	true ->
7426	    not_equal('SigParameter_extraInfo', EI1, EI2);
7427	false ->
7428	    wrong_type('SigParameter_extraInfo', EI1, EI2)
7429    end;
7430chk_SigParameter_extraInfo(EI1, EI2) ->
7431    wrong_type('SigParameter_extraInfo', EI1, EI2).
7432
7433chk_SigParameter_extraInfo_val(relation, Val1, Val2) ->
7434    validate(fun() -> chk_Relation(Val1, Val2) end, 'SigParameter_extraInfo');
7435chk_SigParameter_extraInfo_val(range, Val1, Val2) ->
7436    validate(fun() -> chk_BOOLEAN(Val1, Val2) end, 'SigParameter_extraInfo');
7437chk_SigParameter_extraInfo_val(sublist, Val1, Val2) ->
7438    validate(fun() -> chk_BOOLEAN(Val1, Val2) end, 'SigParameter_extraInfo').
7439
7440
7441%% -- RequestID --
7442
7443is_opt_RequestID(asn1_NOVALUE) ->
7444    true;
7445is_opt_RequestID(V) ->
7446    is_RequestID(V).
7447
7448is_RequestID(V) -> is_INTEGER(V, {range, 0, 4294967295}).
7449
7450chk_opt_RequestID(asn1_NOVALUE, asn1_NOVALUE) ->
7451    ok;
7452chk_opt_RequestID(V1, V2) ->
7453    chk_RequestID(V1, V2).
7454
7455chk_RequestID(ID, ID) ->
7456    chk_type(fun is_RequestID/1, 'RequestID', ID);
7457chk_RequestID(ID1, ID2) ->
7458    case (is_RequestID(ID1) andalso is_RequestID(ID2)) of
7459	true ->
7460	    not_equal('RequestID', ID1, ID2);
7461	false ->
7462	    wrong_type('RequestID', ID1, ID2)
7463    end.
7464
7465
7466%% -- ModemDescriptor --
7467
7468is_ModemDescriptor(D) when is_record(D, 'ModemDescriptor') ->
7469    true;
7470is_ModemDescriptor(_) ->
7471    false.
7472
7473chk_ModemDescriptor(D, D) when is_record(D, 'ModemDescriptor') ->
7474    ok;
7475chk_ModemDescriptor(#'ModemDescriptor'{mtl             = MTL1,
7476				       mpl             = MPL1,
7477				       nonStandardData = NSD1},
7478		    #'ModemDescriptor'{mtl             = MTL2,
7479				       mpl             = MPL2,
7480				       nonStandardData = NSD2}) ->
7481    chk_ModemDescriptor_mtl(MTL1, MTL2),
7482    chk_ModemDescriptor_mpl(MPL1, MPL2),
7483    chk_opt_NonStandardData(NSD1, NSD2),
7484    ok;
7485chk_ModemDescriptor(D1, D2) ->
7486    wrong_type('ModemDescriptor', D1, D2).
7487
7488chk_ModemDescriptor_mtl([], []) ->
7489    ok;
7490chk_ModemDescriptor_mtl([] = MTL1, MTL2) ->
7491    not_equal('ModemDescriptor_mtl', MTL1, MTL2);
7492chk_ModemDescriptor_mtl(MTL1, [] = MTL2) ->
7493    not_equal('ModemDescriptor_mtl', MTL1, MTL2);
7494chk_ModemDescriptor_mtl([H|T1], [H|T2]) ->
7495    case is_ModemType(H) of
7496	true ->
7497	    chk_ModemDescriptor_mtl(T1, T2);
7498	false ->
7499	    wrong_type('ModemDescriptor_mtl_val', H)
7500    end;
7501chk_ModemDescriptor_mtl([H1|T1], [H2|T2]) ->
7502    validate(fun() -> chk_ModemType(H1, H2) end, 'ModemDescriptor_mtl_val'),
7503    chk_ModemDescriptor_mtl(T1, T2);
7504chk_ModemDescriptor_mtl(MTL1, MTL2) ->
7505    wrong_type('ModemDescriptor_mtl', MTL1, MTL2).
7506
7507
7508chk_ModemDescriptor_mpl([], []) ->
7509    ok;
7510chk_ModemDescriptor_mpl([] = MPL1, MPL2) ->
7511    not_equal('ModemDescriptor_mpl', MPL1, MPL2);
7512chk_ModemDescriptor_mpl(MPL1, [] = MPL2) ->
7513    not_equal('ModemDescriptor_mpl', MPL1, MPL2);
7514chk_ModemDescriptor_mpl([H|T1], [H|T2]) ->
7515    case is_PropertyParm(H) of
7516	true ->
7517	    chk_ModemDescriptor_mpl(T1, T2);
7518	false ->
7519	    wrong_type('ModemDescriptor_mpl_val', H)
7520    end;
7521chk_ModemDescriptor_mpl([H1|T1], [H2|T2]) ->
7522    validate(fun() -> chk_PropertyParm(H1, H2) end, 'ModemDescriptor_mpl_val'),
7523    chk_ModemDescriptor_mpl(T1, T2);
7524chk_ModemDescriptor_mpl(MPL1, MPL2) ->
7525    wrong_type('ModemDescriptor_mpl', MPL1, MPL2).
7526
7527
7528%% -- ModemType --
7529
7530chk_ModemType(MT, MT) ->
7531    case is_ModemType(MT) of
7532	true ->
7533	    ok;
7534	false ->
7535	    wrong_type('ModemType', MT, MT)
7536    end;
7537chk_ModemType(MT1, MT2) ->
7538    case (is_ModemType(MT1) andalso is_ModemType(MT2)) of
7539	true ->
7540	    not_equal('ModemType', MT1, MT2);
7541	false ->
7542	    wrong_type('ModemType', MT1, MT2)
7543    end.
7544
7545is_ModemType(MT) ->
7546    lists:member(MT,
7547		 [v18, v22, v22bis, v32, v32bis, v34, v90, v91, synchISDN]).
7548
7549
7550%% -- DigitMapDescriptor --
7551
7552is_DigitMapDescriptor(#'DigitMapDescriptor'{digitMapName  = Name,
7553					    digitMapValue = Val}) ->
7554    is_opt_DigitMapName(Name) andalso is_opt_DigitMapValue(Val);
7555is_DigitMapDescriptor(_) ->
7556    false.
7557
7558chk_DigitMapDescriptor(D, D) ->
7559    chk_type(fun is_DigitMapDescriptor/1, 'DigitMapDescriptor', D);
7560chk_DigitMapDescriptor(#'DigitMapDescriptor'{digitMapName  = Name1,
7561					     digitMapValue = Val1},
7562		       #'DigitMapDescriptor'{digitMapName  = Name2,
7563					     digitMapValue = Val2}) ->
7564    d("chk_DigitMapDescriptor -> entry with"
7565      "~n   Name1: ~p"
7566      "~n   Name2: ~p"
7567      "~n   Val1:  ~p"
7568      "~n   Val2:  ~p", [Name1, Name2, Val1, Val2]),
7569    validate(fun() -> chk_opt_DigitMapName(Name1, Name2) end,
7570		      'DigitMapDescriptor'),
7571    validate(fun() -> chk_opt_DigitMapValue(Val1, Val2) end,
7572		      'DigitMapDescriptor'),
7573    ok;
7574chk_DigitMapDescriptor(D1, D2) ->
7575    wrong_type('DigitMapDescriptor', D1, D2).
7576
7577
7578%% -- DigitMapName --
7579
7580is_opt_DigitMapName(asn1_NOVALUE) ->
7581    true;
7582is_opt_DigitMapName(N) ->
7583    is_DigitMapName(N).
7584
7585is_DigitMapName(N) -> is_Name(N).
7586
7587chk_opt_DigitMapName(asn1_NOVALUE, asn1_NOVALUE) ->
7588    ok;
7589chk_opt_DigitMapName(N1, N2) ->
7590    chk_DigitMapName(N1, N2).
7591
7592chk_DigitMapName(N, N) ->
7593    chk_type(fun is_DigitMapName/1, 'DigitMapName', N);
7594chk_DigitMapName(N1, N2) ->
7595    case (is_DigitMapName(N1) andalso is_DigitMapName(N2)) of
7596	true ->
7597	    not_equal('DigitMapName', N1, N2);
7598	false ->
7599	    wrong_type('DigitMapName', N1, N2)
7600    end.
7601
7602
7603%% -- DigitMapValue --
7604
7605is_opt_DigitMapValue(V) ->
7606    is_OPTIONAL(fun is_DigitMapValue/1, V).
7607
7608is_DigitMapValue(#'DigitMapValue'{startTimer    = Start,
7609				  shortTimer    = Short,
7610				  longTimer     = Long,
7611				  digitMapBody  = Body,
7612				  durationTimer = Dur}) ->
7613    is_DigitMapValue_startTimer(Start) andalso
7614	is_DigitMapValue_shortTimer(Short) andalso
7615	is_DigitMapValue_longTimer(Long) andalso
7616	is_IA5String(Body) andalso
7617	is_DigitMapValue_durationTimer(Dur);
7618is_DigitMapValue(_) ->
7619    false.
7620
7621is_DigitMapValue_startTimer(asn1_NOVALUE)    -> true;
7622is_DigitMapValue_startTimer(T)               -> is_INTEGER(T, {range, 0, 99}).
7623
7624is_DigitMapValue_shortTimer(asn1_NOVALUE)    -> true;
7625is_DigitMapValue_shortTimer(T)               -> is_INTEGER(T, {range, 0, 99}).
7626
7627is_DigitMapValue_longTimer(asn1_NOVALUE)     -> true;
7628is_DigitMapValue_longTimer(T)                -> is_INTEGER(T, {range, 0, 99}).
7629
7630is_DigitMapValue_durationTimer(asn1_NOVALUE) -> true;
7631is_DigitMapValue_durationTimer(T)            -> is_INTEGER(T, {range, 0, 99}).
7632
7633chk_opt_DigitMapValue(V1, V2) ->
7634    chk_OPTIONAL('DigitMapValue', V1, V2,
7635		 fun is_DigitMapValue/1, fun chk_DigitMapValue/2).
7636
7637chk_DigitMapValue(#'DigitMapValue'{startTimer    = Start1,
7638				   shortTimer    = Short1,
7639				   longTimer     = Long1,
7640				   digitMapBody  = Body1,
7641				   durationTimer = Dur1},
7642		  #'DigitMapValue'{startTimer    = Start2,
7643				   shortTimer    = Short2,
7644				   longTimer     = Long2,
7645				   digitMapBody  = Body2,
7646				   durationTimer = Dur2}) ->
7647    d("chk_DigitMapValue -> entry with"
7648      "~n   Start1: ~p"
7649      "~n   Start2: ~p"
7650      "~n   Short1: ~p"
7651      "~n   Short2: ~p"
7652      "~n   Long1:  ~p"
7653      "~n   Long2:  ~p"
7654      "~n   Body1:  ~p"
7655      "~n   Body2:  ~p"
7656      "~n   Dur1:   ~p"
7657      "~n   Dur2:   ~p", [Start1, Start2,
7658			  Short1, Short2,
7659			  Long1, Long2,
7660			  Body1, Body2,
7661			  Dur1, Dur2]),
7662    chk_DigitMapValue_startTimer(Start1, Start2),
7663    chk_DigitMapValue_shortTimer(Short1, Short2),
7664    chk_DigitMapValue_longTimer(Long1, Long2),
7665    chk_DigitMapValue_digitMapBody(Body1, Body2),
7666    chk_DigitMapValue_durationTimer(Dur1, Dur2),
7667    ok;
7668chk_DigitMapValue(V1, V2) ->
7669    wrong_type('DigitMapValue', V1, V2).
7670
7671chk_DigitMapValue_startTimer(T, T) ->
7672    chk_type(fun is_DigitMapValue_startTimer/1, 'DigitMapValue_startTimer', T);
7673chk_DigitMapValue_startTimer(T1, T2) ->
7674    case (is_DigitMapValue_startTimer(T1) andalso
7675	  is_DigitMapValue_startTimer(T2)) of
7676	true ->
7677	    not_equal('DigitMapValue_startTimer', T1, T2);
7678	false ->
7679	    wrong_type('DigitMapValue_startTimer', T1, T2)
7680    end.
7681
7682chk_DigitMapValue_shortTimer(T, T) ->
7683    chk_type(fun is_DigitMapValue_shortTimer/1, 'DigitMapValue_shortTimer', T);
7684chk_DigitMapValue_shortTimer(T1, T2) ->
7685    case (is_DigitMapValue_shortTimer(T1) andalso
7686	  is_DigitMapValue_shortTimer(T2)) of
7687	true ->
7688	    not_equal('DigitMapValue_shortTimer', T1, T2);
7689	false ->
7690	    wrong_type('DigitMapValue_shortTimer', T1, T2)
7691    end.
7692
7693chk_DigitMapValue_longTimer(T, T) ->
7694    chk_type(fun is_DigitMapValue_longTimer/1, 'DigitMapValue_longTimer', T);
7695chk_DigitMapValue_longTimer(T1, T2) ->
7696    case (is_DigitMapValue_longTimer(T1) andalso
7697	  is_DigitMapValue_longTimer(T2)) of
7698	true ->
7699	    not_equal('DigitMapValue_longTimer', T1, T2);
7700	false ->
7701	    wrong_type('DigitMapValue_longTimer', T1, T2)
7702    end.
7703
7704chk_DigitMapValue_durationTimer(T, T) ->
7705    chk_type(fun is_DigitMapValue_durationTimer/1,
7706	     'DigitMapValue_durationTimer', T);
7707chk_DigitMapValue_durationTimer(T1, T2) ->
7708    case (is_DigitMapValue_durationTimer(T1) andalso
7709	  is_DigitMapValue_durationTimer(T2)) of
7710	true ->
7711	    not_equal('DigitMapValue_durationTimer', T1, T2);
7712	false ->
7713	    wrong_type('DigitMapValue_durationTimer', T1, T2)
7714    end.
7715
7716chk_DigitMapValue_digitMapBody(B, B) ->
7717    d("chk_DigitMapValue_digitMapBody -> entry with"
7718      "~n   B: ~p", [B]),
7719    chk_type(fun is_IA5String/1, 'DigitMapValue_digitMapBody', B);
7720chk_DigitMapValue_digitMapBody(B1, B2) ->
7721    d("chk_DigitMapValue_digitMapBody -> entry with"
7722      "~n   B1: ~p"
7723      "~n   B2: ~p", [B1, B2]),
7724    case (is_IA5String(B1) andalso is_IA5String(B2)) of
7725	true ->
7726	    %% If they are different it could be because
7727	    %% of trailing tab's and newline's.
7728	    case compare_strings(B1, B2) of
7729		{[], []} ->
7730		    ok;
7731		{Str1, []} ->
7732		    case strip_tab_and_newline(Str1) of
7733			[] ->
7734			    ok;
7735			_ ->
7736			    not_equal('DigitMapValue_digitMapBody', B1, B2)
7737		    end;
7738		{[], Str2} ->
7739		    case strip_tab_and_newline(Str2) of
7740			[] ->
7741			    ok;
7742			_ ->
7743			    not_equal('DigitMapValue_digitMapBody', B1, B2)
7744		    end;
7745		_ ->
7746		    not_equal('DigitMapValue_digitMapBody', B1, B2)
7747	    end;
7748	false ->
7749	    wrong_type('DigitMapValue_digitMapBody', B1, B2)
7750    end.
7751
7752%% -- ServiceChangeParm --
7753
7754is_ServiceChangeParm(#'ServiceChangeParm'{serviceChangeMethod  = M,
7755					  serviceChangeAddress = A,
7756					  serviceChangeVersion = V,
7757					  serviceChangeProfile = P,
7758					  serviceChangeReason  = R,
7759					  serviceChangeDelay   = D,
7760					  serviceChangeMgcId   = Id,
7761					  timeStamp            = TS,
7762					  nonStandardData      = NSD,
7763					  serviceChangeInfo    = I}) ->
7764    is_ServiceChangeMethod(M) andalso
7765	is_opt_ServiceChangeAddress(A) andalso
7766	is_opt_INTEGER(V, {range, 0, 99}) andalso
7767	is_opt_ServiceChangeProfile(P) andalso
7768	is_Value(R) andalso
7769	is_opt_INTEGER(D, {range, 0, 4294967295}) andalso
7770	is_opt_MId(Id) andalso
7771	is_opt_TimeNotation(TS) andalso
7772	is_opt_NonStandardData(NSD) andalso
7773	is_opt_AuditDescriptor(I);
7774is_ServiceChangeParm(_) ->
7775    false.
7776
7777chk_ServiceChangeParm(P, P) ->
7778    chk_type(fun is_ServiceChangeParm/1, 'ServiceChangeParm', P);
7779chk_ServiceChangeParm(#'ServiceChangeParm'{serviceChangeMethod  = M1,
7780					   serviceChangeAddress = A1,
7781					   serviceChangeVersion = V1,
7782					   serviceChangeProfile = P1,
7783					   serviceChangeReason  = R1,
7784					   serviceChangeDelay   = D1,
7785					   serviceChangeMgcId   = Id1,
7786					   timeStamp            = TS1,
7787					   nonStandardData      = NSD1,
7788					   serviceChangeInfo    = I1},
7789		      #'ServiceChangeParm'{serviceChangeMethod  = M2,
7790					   serviceChangeAddress = A2,
7791					   serviceChangeVersion = V2,
7792					   serviceChangeProfile = P2,
7793					   serviceChangeReason  = R2,
7794					   serviceChangeDelay   = D2,
7795					   serviceChangeMgcId   = Id2,
7796					   timeStamp            = TS2,
7797					   nonStandardData      = NSD2,
7798					   serviceChangeInfo    = I2}) ->
7799    validate(fun() -> chk_ServiceChangeMethod(M1, M2) end,
7800	     'ServiceChangeParm'),
7801    validate(fun() -> chk_opt_ServiceChangeAddress(A1, A2) end,
7802	     'ServiceChangeParm'),
7803    validate(fun() -> chk_opt_INTEGER(V1, V2, {range, 0, 99}) end,
7804	     'ServiceChangeParm'),
7805    validate(fun() -> chk_opt_ServiceChangeProfile(P1, P2) end,
7806	     'ServiceChangeParm'),
7807    validate(fun() -> chk_Value(R1, R2) end,
7808	     'ServiceChangeParm'),
7809    validate(fun() -> chk_opt_INTEGER(D1, D2, {range, 0, 4294967295}) end,
7810	     'ServiceChangeParm'),
7811    validate(fun() -> chk_opt_MId(Id1, Id2) end,
7812	     'ServiceChangeParm'),
7813    validate(fun() -> chk_opt_TimeNotation(TS1, TS2) end,
7814	     'ServiceChangeParm'),
7815    validate(fun() -> chk_opt_NonStandardData(NSD1, NSD2) end,
7816	     'ServiceChangeParm'),
7817    validate(fun() -> chk_opt_AuditDescriptor(I1, I2) end,
7818	     'ServiceChangeParm'),
7819    ok;
7820chk_ServiceChangeParm(P1, P2) ->
7821    wrong_type('ServiceChangeParm', P1, P2).
7822
7823
7824%% -- ServiceChangeAddress --
7825
7826is_opt_ServiceChangeAddress(A) ->
7827    is_OPTIONAL(fun is_ServiceChangeAddress/1, A).
7828
7829is_ServiceChangeAddress({Tag, Val}) ->
7830    is_ServiceChangeAddress_tag(Tag) andalso
7831	is_ServiceChangeAddress_val(Tag, Val);
7832is_ServiceChangeAddress(_) ->
7833    false.
7834
7835is_ServiceChangeAddress_tag(Tag) ->
7836    Tags = [portNumber, ip4Address, ip6Address, domainName, deviceName,
7837	    mtpAddress],
7838    lists:member(Tag, Tags).
7839
7840is_ServiceChangeAddress_val(portNumber, Val) ->
7841    is_INTEGER(Val, {range, 0, 65535});
7842is_ServiceChangeAddress_val(ip4Address, Val) ->
7843    is_IP4Address(Val);
7844is_ServiceChangeAddress_val(ip6Address, Val) ->
7845    is_IP6Address(Val);
7846is_ServiceChangeAddress_val(domainName, Val) ->
7847    is_DomainName(Val);
7848is_ServiceChangeAddress_val(deviceName, Val) ->
7849    is_PathName(Val);
7850is_ServiceChangeAddress_val(mtpAddress, Val) ->
7851    is_OCTET_STRING(Val, {range, 2, 4}).
7852
7853
7854chk_opt_ServiceChangeAddress(A1, A2) ->
7855    chk_OPTIONAL('ServiceChangeAddress', A1, A2,
7856		 fun is_ServiceChangeAddress/1,
7857		 fun chk_ServiceChangeAddress/2).
7858
7859chk_ServiceChangeAddress(A, A) ->
7860    chk_type(fun is_ServiceChangeAddress/1, 'ServiceChangeAddress', A);
7861chk_ServiceChangeAddress({Tag, Val1} = A1, {Tag, Val2} = A2) ->
7862    case (is_ServiceChangeAddress_tag(Tag) andalso
7863	  is_ServiceChangeAddress_val(Tag, Val1) andalso
7864	  is_ServiceChangeAddress_val(Tag, Val2)) of
7865	true ->
7866	    chk_ServiceChangeAddress_val(Tag, Val1, Val2);
7867	false ->
7868	    wrong_type('ServiceChangeAddress', A1, A2)
7869    end;
7870chk_ServiceChangeAddress({Tag1, Val1} = A1, {Tag2, Val2} = A2) ->
7871    case ((is_ServiceChangeAddress_tag(Tag1) andalso
7872	   is_ServiceChangeAddress_val(Tag1, Val1)) andalso
7873	  (is_ServiceChangeAddress_tag(Tag2) andalso
7874	   is_ServiceChangeAddress_val(Tag2, Val2))) of
7875	true ->
7876	    not_equal('ServiceChangeAddress', A1, A2);
7877	false ->
7878	    wrong_type('ServiceChangeAddress', A1, A2)
7879    end;
7880chk_ServiceChangeAddress(A1, A2) ->
7881    wrong_type('ServiceChangeAddress', A1, A2).
7882
7883chk_ServiceChangeAddress_val(portNumber, Val1, Val2) ->
7884    validate(fun() -> chk_INTEGER(Val1, Val2, {range, 0, 99}) end,
7885	     'ServiceChangeAddress');
7886chk_ServiceChangeAddress_val(ip4Address, Val1, Val2) ->
7887    validate(fun() -> chk_IP4Address(Val1, Val2) end,
7888	     'ServiceChangeAddress');
7889chk_ServiceChangeAddress_val(ip6Address, Val1, Val2) ->
7890    validate(fun() -> chk_IP6Address(Val1, Val2) end,
7891	     'ServiceChangeAddress');
7892chk_ServiceChangeAddress_val(domainName, Val1, Val2) ->
7893    validate(fun() -> chk_DomainName(Val1, Val2) end,
7894	     'ServiceChangeAddress');
7895chk_ServiceChangeAddress_val(deviceName, Val1, Val2) ->
7896    validate(fun() -> chk_PathName(Val1, Val2) end,
7897	     'ServiceChangeAddress');
7898chk_ServiceChangeAddress_val(mtpAddress, Val1, Val2) ->
7899    validate(fun() -> chk_OCTET_STRING(Val1, Val2, {range, 2, 4}) end,
7900	     'ServiceChangeAddress').
7901
7902
7903%% -- ServiceChangeResParm --
7904
7905is_ServiceChangeResParm(#'ServiceChangeResParm'{serviceChangeMgcId   = Id,
7906						serviceChangeAddress = A,
7907						serviceChangeVersion = V,
7908						serviceChangeProfile = P,
7909						timeStamp            = TS}) ->
7910    is_opt_MId(Id) andalso
7911	is_opt_ServiceChangeAddress(A) andalso
7912	is_opt_INTEGER(V, {range, 0, 99}) andalso
7913	is_opt_ServiceChangeProfile(P) andalso
7914	is_opt_TimeNotation(TS);
7915is_ServiceChangeResParm(_) ->
7916    false.
7917
7918chk_ServiceChangeResParm(P, P) ->
7919    chk_type(fun is_ServiceChangeResParm/1, 'ServiceChangeResParm', P);
7920chk_ServiceChangeResParm(
7921  #'ServiceChangeResParm'{serviceChangeMgcId   = Id1,
7922			  serviceChangeAddress = A1,
7923			  serviceChangeVersion = V1,
7924			  serviceChangeProfile = P1,
7925			  timeStamp            = TS1},
7926  #'ServiceChangeResParm'{serviceChangeMgcId   = Id2,
7927			  serviceChangeAddress = A2,
7928			  serviceChangeVersion = V2,
7929			  serviceChangeProfile = P2,
7930			  timeStamp            = TS2}) ->
7931    validate(fun() -> chk_opt_MId(Id1, Id2) end, 'ServiceChangeResParm'),
7932    validate(fun() -> chk_opt_ServiceChangeAddress(A1, A2) end,
7933	     'ServiceChangeResParm'),
7934    validate(fun() -> chk_opt_INTEGER(V1, V2, {range, 0, 99}) end,
7935	     'ServiceChangeResParm'),
7936    validate(fun() -> chk_opt_ServiceChangeProfile(P1, P2) end,
7937	     'ServiceChangeResParm'),
7938    validate(fun() -> chk_opt_TimeNotation(TS1, TS2) end,
7939	     'ServiceChangeResParm'),
7940    ok;
7941chk_ServiceChangeResParm(P1, P2) ->
7942    wrong_type('ServiceChangeResParm', P1, P2).
7943
7944
7945%% -- ServiceChangeMethod --
7946
7947is_ServiceChangeMethod(M) ->
7948    Methods = [failover, forced, graceful, restart, disconnected, handOff],
7949    lists:member(M, Methods).
7950
7951chk_ServiceChangeMethod(M, M) ->
7952    chk_type(fun is_ServiceChangeMethod/1, 'ServiceChangeMethod', M);
7953chk_ServiceChangeMethod(M1, M2) ->
7954    case (is_ServiceChangeMethod(M1) andalso is_ServiceChangeMethod(M2)) of
7955	true ->
7956	    not_equal('ServiceChangeMethod', M1, M2);
7957	false ->
7958	    wrong_type('ServiceChangeMethod', M1, M2)
7959    end.
7960
7961
7962%% -- ServiceChangeProfile --
7963
7964is_opt_ServiceChangeProfile(P) ->
7965    is_OPTIONAL(fun is_ServiceChangeProfile/1, P).
7966
7967is_ServiceChangeProfile(#'ServiceChangeProfile'{profileName = N}) ->
7968    is_IA5String(N, {range, 1, 67});
7969is_ServiceChangeProfile(_) ->
7970    false.
7971
7972chk_opt_ServiceChangeProfile(P1, P2) ->
7973    chk_OPTIONAL('ServiceChangeProfile', P1, P2,
7974		 fun is_ServiceChangeProfile/1,
7975		 fun chk_ServiceChangeProfile/2).
7976
7977chk_ServiceChangeProfile(P, P) ->
7978    chk_type(fun is_ServiceChangeProfile/1, 'ServiceChangeProfile', P);
7979chk_ServiceChangeProfile(#'ServiceChangeProfile'{profileName = N1},
7980			 #'ServiceChangeProfile'{profileName = N2}) ->
7981    validate(fun() -> chk_IA5String(N1, N2, {range, 1, 67}) end,
7982	     'ServiceChangeProfile'),
7983    ok;
7984chk_ServiceChangeProfile(P1, P2) ->
7985    wrong_type('ServiceChangeProfile', P1, P2).
7986
7987
7988%% -- PackagesDescriptor --
7989
7990is_PackagesDescriptor([]) ->
7991    true;
7992is_PackagesDescriptor([H|T]) ->
7993    is_PackagesItem(H) andalso is_PackagesDescriptor(T);
7994is_PackagesDescriptor(_) ->
7995    false.
7996
7997chk_PackagesDescriptor([], []) ->
7998    ok;
7999chk_PackagesDescriptor([] = D1, D2) ->
8000    not_equal('PackagesDescriptor', D1, D2);
8001chk_PackagesDescriptor(D1, [] = D2) ->
8002    not_equal('PackagesDescriptor', D1, D2);
8003chk_PackagesDescriptor([H|T1], [H|T2]) ->
8004    case is_PackagesItem(H) of
8005	true ->
8006	    chk_PackagesDescriptor(T1, T2);
8007	false ->
8008	    wrong_type('PackagesDescriptor_val', H)
8009    end;
8010chk_PackagesDescriptor([H1|T1], [H2|T2]) ->
8011    validate(fun() -> chk_PackagesItem(H1, H2) end,
8012	     'PackagesDescriptor_val'),
8013    chk_PackagesDescriptor(T1, T2);
8014chk_PackagesDescriptor(D1, D2) ->
8015    wrong_type('PackagesDescriptor_val', D1, D2).
8016
8017
8018%% -- PackagesItem --
8019
8020is_PackagesItem(#'PackagesItem'{packageName    = N,
8021				packageVersion = V}) ->
8022    is_Name(N) andalso is_INTEGER(V, {range, 0, 99});
8023is_PackagesItem(_) ->
8024    false.
8025
8026chk_PackagesItem(I, I) ->
8027    chk_type(fun is_PackagesItem/1, 'PackagesItem', I);
8028chk_PackagesItem(#'PackagesItem'{packageName    = N1,
8029				 packageVersion = V1},
8030		 #'PackagesItem'{packageName    = N2,
8031				 packageVersion = V2}) ->
8032    validate(fun() -> chk_Name(N1, N2) end, 'PackagesItem'),
8033    validate(fun() -> chk_INTEGER(V1, V2, {range, 0, 99}) end, 'PackagesItem'),
8034    ok;
8035chk_PackagesItem(I1, I2) ->
8036    wrong_type('PackagesItem', I1, I2).
8037
8038
8039%% -- StatisticsDescriptor --
8040
8041is_opt_StatisticsDescriptor(D) ->
8042    is_OPTIONAL(fun is_StatisticsDescriptor/1, D).
8043
8044is_StatisticsDescriptor([]) ->
8045    true;
8046is_StatisticsDescriptor([H|T]) ->
8047    is_StatisticsParameter(H) andalso is_StatisticsDescriptor(T);
8048is_StatisticsDescriptor(_) ->
8049    false.
8050
8051chk_opt_StatisticsDescriptor(D1, D2) ->
8052    chk_OPTIONAL('StatisticsDescriptor', D1, D2,
8053		 fun is_StatisticsDescriptor/1,
8054		 fun chk_StatisticsDescriptor/2).
8055
8056chk_StatisticsDescriptor([], []) ->
8057    ok;
8058chk_StatisticsDescriptor([] = D1, D2) ->
8059    not_equal('StatisticsDescriptor', D1, D2);
8060chk_StatisticsDescriptor(D1, [] = D2) ->
8061    not_equal('StatisticsDescriptor', D1, D2);
8062chk_StatisticsDescriptor([H|T1], [H|T2]) ->
8063    case is_StatisticsParameter(H) of
8064	true ->
8065	    chk_StatisticsDescriptor(T1, T2);
8066	false ->
8067	    wrong_type('StatisticsDescriptor_val', H)
8068    end;
8069chk_StatisticsDescriptor([H1|T1], [H2|T2]) ->
8070    validate(fun() -> chk_StatisticsParameter(H1, H2) end,
8071	     'StatisticsDescriptor_val'),
8072    chk_StatisticsDescriptor(T1, T2);
8073chk_StatisticsDescriptor(D1, D2) ->
8074    wrong_type('StatisticsDescriptor_val', D1, D2).
8075
8076
8077%% -- StatisticsParameter --
8078
8079is_StatisticsParameter(#'StatisticsParameter'{statName  = N,
8080					      statValue = V}) ->
8081    is_PkgdName(N) andalso is_opt_Value(V);
8082is_StatisticsParameter(_) ->
8083    false.
8084
8085chk_StatisticsParameter(P, P) ->
8086    chk_type(fun is_StatisticsParameter/1, 'StatisticsParameter', P);
8087chk_StatisticsParameter(#'StatisticsParameter'{statName  = N1,
8088					       statValue = V1},
8089			#'StatisticsParameter'{statName  = N2,
8090					       statValue = V2}) ->
8091    validate(fun() -> chk_PkgdName(N1, N2) end, 'StatisticsParameter'),
8092    validate(fun() -> chk_opt_Value(V1, V2) end, 'StatisticsParameter'),
8093    ok;
8094chk_StatisticsParameter(P1, P2) ->
8095    wrong_type('StatisticsParameter', P1, P2).
8096
8097
8098%% -- NonStandardData --
8099
8100is_opt_NonStandardData(asn1_NOVALUE) ->
8101    true;
8102is_opt_NonStandardData(NSD) ->
8103    is_NonStandardData(NSD).
8104
8105%% is_NonStandardData(#'NonStandardData'{nonStandardIdentifier = Id,
8106%% 				      data                  = D}) ->
8107%%     is_NonStandardIdentifier(Id) andalso is_OCTET_STRING(D);
8108%% is_NonStandardData(_) ->
8109%%     false.
8110
8111is_NonStandardData(_) ->
8112    true.
8113
8114chk_opt_NonStandardData(asn1_NOVALUE, asn1_NOVALUE) ->
8115    true;
8116chk_opt_NonStandardData(NSD1, NSD2) ->
8117    chk_NonStandardData(NSD1, NSD2).
8118
8119chk_NonStandardData(NSD, NSD) ->
8120    chk_type(fun is_NonStandardData/1, 'NonStandardData', NSD);
8121%% chk_NonStandardData(#'NonStandardData'{nonStandardIdentifier = Id1,
8122%% 				       data                  = D1},
8123%% 		    #'NonStandardData'{nonStandardIdentifier = Id2,
8124%% 				       data                  = D2}) ->
8125%%     validate(fun() -> chk_NonStandardIdentifier(Id1, Id2) end,
8126%% 	     'NonStandardData'),
8127%%     validate(fun() -> chk_OCTET_STRING(D1, D2) end, 'NonStandardData'),
8128%%     ok;
8129%% chk_NonStandardData(NSD1, NSD2) ->
8130%%     wrong_type('NonStandardData', NSD1, NSD2).
8131chk_NonStandardData(NSD1, NSD2) ->
8132    not_equal('NonStandardData', NSD1, NSD2).
8133
8134
8135%% -- NonStandardIdentifier --
8136
8137%% is_NonStandardIdentifier({Tag, Val}) ->
8138%%     is_NonStandardIdentifier_tag(Tag) andalso
8139%% 	is_NonStandardIdentifier_val(Tag, Val);
8140%% is_NonStandardIdentifier(_) ->
8141%%     false.
8142
8143%% is_NonStandardIdentifier_tag(Tag) ->
8144%%     Tags = [object, h221NonStandard, experimental],
8145%%     lists:member(Tag, Tags).
8146
8147%% is_NonStandardIdentifier_val(object, Val) ->
8148%%     is_OBJECT_IDENTIFIER(Val);
8149%% is_NonStandardIdentifier_val(h221NonStandard, Val) ->
8150%%     is_H221NonStandard(Val);
8151%% is_NonStandardIdentifier_val(experimental, Val) ->
8152%%     is_IA5String(Val, {exact, 8}).
8153
8154%% chk_NonStandardIdentifier(Id, Id) ->
8155%%     chk_type(fun is_NonStandardIdentifier/1, 'NonStandardIdentifier', Id);
8156%% chk_NonStandardIdentifier({Tag, Val1} = Id1, {Tag, Val2} = Id2) ->
8157%%     case (is_NonStandardIdentifier_tag(Tag) andalso
8158%% 	  is_NonStandardIdentifier_val(Tag, Val1) andalso
8159%% 	  is_NonStandardIdentifier_val(Tag, Val1)) of
8160%% 	true ->
8161%% 	    chk_NonStandardIdentifier_val(Tag, Val1, Val2);
8162%% 	false ->
8163%% 	    wrong_type('NonStandardIdentifier', Id1, Id2)
8164%%     end;
8165%% chk_NonStandardIdentifier({Tag1, Val1} = Id1, {Tag2, Val2} = Id2) ->
8166%%     case ((is_NonStandardIdentifier_tag(Tag1) andalso
8167%% 	   is_NonStandardIdentifier_val(Tag1, Val1)) andalso
8168%% 	  (is_NonStandardIdentifier_tag(Tag2) andalso
8169%% 	   is_NonStandardIdentifier_val(Tag2, Val1))) of
8170%% 	true ->
8171%% 	    not_equal('NonStandardIdentifier', Id1, Id2);
8172%% 	false ->
8173%% 	    wrong_type('NonStandardIdentifier', Id1, Id2)
8174%%     end;
8175%% chk_NonStandardIdentifier(Id1, Id2) ->
8176%%     wrong_type('NonStandardIdentifier', Id1, Id2).
8177
8178%% chk_NonStandardIdentifier_val(object, Val1, Val2) ->
8179%%     chk_OBJECT_IDENTIFIER(Val1, Val2);
8180%% chk_NonStandardIdentifier_val(h221NonStandard, Val1, Val2) ->
8181%%     chk_H221NonStandard(Val1, Val2);
8182%% chk_NonStandardIdentifier_val(experimental, Val1, Val2) ->
8183%%     chk_IA5String(Val1, Val2, {exact, 8}).
8184
8185
8186%% -- H221NonStandard --
8187
8188%% is_H221NonStandard(#'H221NonStandard'{t35CountryCode1  = CC1,
8189%% 				      t35CountryCode2  = CC2,
8190%% 				      t35Extension     = Ext,
8191%% 				      manufacturerCode = MC}) ->
8192%%     is_INTEGER(CC1, {range, 0, 255}) andalso
8193%% 	is_INTEGER(CC2, {range, 0, 255}) andalso
8194%% 	is_INTEGER(Ext, {range, 0, 255}) andalso
8195%% 	is_INTEGER(Ext, {range, 0, 65535});
8196%% is_H221NonStandard(_) ->
8197%%     false.
8198
8199%% chk_H221NonStandard(NS, NS) ->
8200%%     chk_type(fun is_H221NonStandard/1, 'H221NonStandard', NS);
8201%% chk_H221NonStandard(#'H221NonStandard'{t35CountryCode1  = CC11,
8202%% 				       t35CountryCode2  = CC21,
8203%% 				       t35Extension     = Ext1,
8204%% 				       manufacturerCode = MC1},
8205%% 		    #'H221NonStandard'{t35CountryCode1  = CC12,
8206%% 				       t35CountryCode2  = CC22,
8207%% 				       t35Extension     = Ext2,
8208%% 				       manufacturerCode = MC2}) ->
8209%%     validate(fun() -> chk_INTEGER(CC11, CC12, {range, 0, 255}) end,
8210%% 	     'H221NonStandard'),
8211%%     validate(fun() -> chk_INTEGER(CC21, CC22, {range, 0, 255}) end,
8212%% 	     'H221NonStandard'),
8213%%     validate(fun() -> chk_INTEGER(Ext1, Ext2, {range, 0, 255}) end,
8214%% 	     'H221NonStandard'),
8215%%     validate(fun() -> chk_INTEGER(MC1, MC2, {range, 0, 65535}) end,
8216%% 	     'H221NonStandard'),
8217%%     ok;
8218%% chk_H221NonStandard(NS1, NS2) ->
8219%%     wrong_type('H221NonStandard', NS1, NS2).
8220
8221
8222%% -- TimeNotation --
8223
8224is_opt_TimeNotation(asn1_NOVALUE) ->
8225    true;
8226is_opt_TimeNotation(TN) ->
8227    is_TimeNotation(TN).
8228
8229is_TimeNotation(#'TimeNotation'{date = D, time = T}) ->
8230    is_IA5String(D, {exact, 8}) andalso is_IA5String(T, {exact, 8});
8231is_TimeNotation(_) ->
8232    false.
8233
8234chk_opt_TimeNotation(asn1_NOVALUE, asn1_NOVALUE) ->
8235    ok;
8236chk_opt_TimeNotation(TN1, TN2) ->
8237    chk_TimeNotation(TN1, TN2).
8238
8239chk_TimeNotation(TN, TN) ->
8240    chk_type(fun is_TimeNotation/1, 'TimeNotation', TN);
8241chk_TimeNotation(#'TimeNotation'{date = D1, time = T1},
8242		 #'TimeNotation'{date = D2, time = T2}) ->
8243    validate(fun() -> chk_IA5String(D1, D2, {exact, 8}) end, 'TimeNotation'),
8244    validate(fun() -> chk_IA5String(T1, T2, {exact, 8}) end, 'TimeNotation'),
8245    ok;
8246chk_TimeNotation(TN1, TN2) ->
8247    wrong_type('TimeNotation', TN1, TN2).
8248
8249
8250%% -- Value --
8251
8252is_opt_Value(V) ->
8253    is_OPTIONAL(fun is_Value/1, V).
8254
8255is_Value([]) ->
8256    true;
8257is_Value([H|T]) ->
8258    is_OCTET_STRING(H) andalso is_Value(T);
8259is_Value(_) ->
8260    false.
8261
8262chk_opt_Value(V1, V2) ->
8263    chk_OPTIONAL('Value', V1, V2, fun is_Value/1, fun chk_Value/2).
8264
8265chk_Value(V, V) ->
8266    case is_Value(V) of
8267	true ->
8268	    ok;
8269	false ->
8270	    wrong_type('Value', V, V)
8271    end;
8272chk_Value(V1, V2) ->
8273    case (is_Value(V1) andalso is_Value(V2)) of
8274	true ->
8275	    not_equal('Value', V1, V2);
8276	false ->
8277	    wrong_type('Value', V1, V2)
8278    end.
8279
8280
8281%% ----------------------------------------------------------------------
8282%% Basic type check functions
8283%% ----------------------------------------------------------------------
8284
8285
8286is_opt_BOOLEAN(B) ->
8287    is_OPTIONAL(fun is_BOOLEAN/1, B).
8288
8289is_BOOLEAN(B) ->
8290    d("is_BOOLEAN -> entry with"
8291      "~n   B: ~p", [B]),
8292    lists:member(B, [true, false]).
8293
8294chk_opt_BOOLEAN(B1, B2) ->
8295    chk_OPTIONAL('BOOLEAN', B1, B2, fun is_BOOLEAN/1, fun chk_BOOLEAN/2).
8296
8297chk_BOOLEAN(B, B) ->
8298    chk_type(fun is_BOOLEAN/1, 'BOOLEAN', B);
8299chk_BOOLEAN(B1, B2) ->
8300    case (is_BOOLEAN(B1) andalso is_BOOLEAN(B2)) of
8301	true ->
8302	    not_equal('BOOLEAN', B1, B2);
8303	false ->
8304	    wrong_type('BOOLEAN', B1, B2)
8305    end.
8306
8307
8308is_IA5String(S) when is_list(S) ->
8309    true;
8310is_IA5String(_) ->
8311    false.
8312
8313% chk_IA5String(S, S) ->
8314%     chk_type(fun is_IA5String/1, 'IA5String', S);
8315% chk_IA5String(S1, S2) ->
8316%     case (is_IA5String(S1) andalso is_IA5String(S2)) of
8317% 	true ->
8318% 	    not_equal('IA5String', S1, S2);
8319% 	false ->
8320% 	    wrong_type('IA5String', S1, S2)
8321%     end.
8322
8323is_IA5String(S, _) when is_list(S) ->
8324    true;
8325is_IA5String(_, _) ->
8326    false.
8327
8328chk_IA5String(S, S, R) ->
8329    chk_type(fun is_IA5String/2, 'IA5String', S, R);
8330chk_IA5String(S1, S2, R) ->
8331    case (is_IA5String(S1, R) andalso is_IA5String(S2, R)) of
8332	true ->
8333	    not_equal('IA5String', S1, S2);
8334	false ->
8335	    wrong_type('IA5String', S1, S2)
8336    end.
8337
8338
8339is_OCTET_STRING(L) -> is_OCTET_STRING(L, any).
8340
8341is_OCTET_STRING(L, any) when is_list(L) ->
8342    true;
8343is_OCTET_STRING(L, {exact, Len}) when is_list(L) andalso (length(L) =:= Len) ->
8344    true;
8345is_OCTET_STRING(L, {atleast, Len}) when is_list(L) andalso (Len =< length(L)) ->
8346    true;
8347is_OCTET_STRING(L, {atmost, Len}) when is_list(L) andalso (length(L) =< Len) ->
8348    true;
8349is_OCTET_STRING(L, {range, Min, Max})
8350  when is_list(L) andalso (Min =< length(L)) andalso (length(L) =< Max) ->
8351    true;
8352is_OCTET_STRING(_, _) ->
8353    false.
8354
8355%% chk_OCTET_STRING(L1, L2) ->
8356%%     chk_OCTET_STRING(L1, L2, any).
8357
8358chk_OCTET_STRING(L, L, R) ->
8359    chk_type(fun is_OCTET_STRING/2, 'OCTET STRING', L, R);
8360chk_OCTET_STRING(L1, L2, R) ->
8361    case (is_OCTET_STRING(L1, R) andalso is_OCTET_STRING(L2, R)) of
8362	true ->
8363	    not_equal('OCTET STRING', L1, L2);
8364	false ->
8365	    wrong_type('OCTET STRING', L1, L2)
8366    end.
8367
8368
8369%% is_OBJECT_IDENTIFIER(_) ->
8370%%     true.
8371
8372%% chk_OBJECT_IDENTIFIER(X, X) ->
8373%%     ok;
8374%% chk_OBJECT_IDENTIFIER(X1, X2) ->
8375%%     not_equal('OBJECT IDENTIFIER', X1, X2).
8376
8377
8378is_opt_NULL(N) ->
8379    is_OPTIONAL(fun is_NULL/1, N).
8380
8381is_NULL('NULL') ->
8382    true;
8383is_NULL(_) ->
8384    false.
8385
8386chk_opt_NULL(N1, N2) ->
8387    chk_OPTIONAL('NULL', N1, N2, fun is_NULL/1, fun chk_NULL/2).
8388
8389chk_NULL(N, N) ->
8390    chk_type(fun is_NULL/1, 'NULL', N);
8391chk_NULL(N1, N2) ->
8392    case (is_NULL(N1) andalso is_NULL(N2)) of
8393	true ->
8394	    not_equal('NULL', N1, N2);
8395	false ->
8396	    wrong_type('NULL', N1, N2)
8397    end.
8398
8399
8400is_opt_INTEGER(I, R) ->
8401    d("is_opt_INTEGER -> entry with"
8402      "~n   I: ~p"
8403      "~n   R: ~p", [I, R]),
8404    is_OPTIONAL(fun(X) -> is_INTEGER(X, R) end, I).
8405
8406is_INTEGER(I, any) when is_integer(I) ->
8407    true;
8408is_INTEGER(I, {exact, I}) when is_integer(I) ->
8409    true;
8410is_INTEGER(I, {atleast, Min})
8411  when is_integer(I) andalso is_integer(Min) andalso (Min =< I) ->
8412    true;
8413is_INTEGER(I, {atmost, Max})
8414  when is_integer(I) andalso is_integer(Max) andalso (I =< Max) ->
8415    true;
8416is_INTEGER(I, {range, Min, Max})
8417  when is_integer(I) andalso
8418       is_integer(Min) andalso
8419       is_integer(Max) andalso
8420       (Min =< I) andalso
8421       (I =< Max) ->
8422    true;
8423is_INTEGER(_, _) ->
8424    false.
8425
8426chk_opt_INTEGER(I1, I2, R) ->
8427    chk_OPTIONAL('INTEGER', I1, I2,
8428		 fun(X) -> is_INTEGER(X, R) end,
8429		 fun(Y1, Y2) -> chk_INTEGER(Y1, Y2, R) end).
8430
8431chk_INTEGER(I, I, R) ->
8432    chk_type(fun is_INTEGER/2, 'INTEGER', I, R);
8433chk_INTEGER(I1, I2, R) ->
8434    case (is_INTEGER(I1, R) andalso is_INTEGER(I2, R)) of
8435	true ->
8436	    not_equal('INTEGER', I1, I2);
8437	false ->
8438	    wrong_type('INTEGER', I1, I2)
8439    end.
8440
8441
8442%% ----------------------------------------------------------------------
8443%% Various utility functions
8444%% ----------------------------------------------------------------------
8445
8446
8447to_lower([C|Cs]) when (C >= $A) andalso (C =< $Z) ->
8448    [C+($a-$A)|to_lower(Cs)];
8449to_lower([C|Cs]) ->
8450    [C|to_lower(Cs)];
8451to_lower([]) ->
8452    [].
8453
8454
8455validate(F, Type) when is_function(F) ->
8456    case (catch F()) of
8457	{error, Reason} ->
8458	    error({Type, Reason});
8459	ok ->
8460	    ok
8461    end.
8462
8463
8464chk_type(F, T, V) when is_function(F) andalso is_atom(T) ->
8465    case F(V) of
8466	true ->
8467	    ok;
8468	false ->
8469	    wrong_type(T, V)
8470    end.
8471
8472chk_type(F, T, V1, V2) when is_function(F) andalso is_atom(T) ->
8473    case F(V1, V2) of
8474	true ->
8475	    ok;
8476	false ->
8477	    wrong_type(T, V1)
8478    end.
8479
8480
8481is_OPTIONAL(_, asn1_NOVALUE) ->
8482    true;
8483is_OPTIONAL(F, Val) when is_function(F) ->
8484    F(Val).
8485
8486chk_OPTIONAL(_, asn1_NOVALUE, asn1_NOVALUE, _, _) ->
8487    ok;
8488chk_OPTIONAL(Type, asn1_NOVALUE = V1, V2, IS, _CHK) when is_function(IS) ->
8489    case IS(V2) of
8490	true ->
8491	    not_equal(Type, V1, V2);
8492	false ->
8493	    wrong_type(Type, V1, V2)
8494    end;
8495chk_OPTIONAL(Type, V1, asn1_NOVALUE = V2, IS, _CHK) when is_function(IS) ->
8496    case IS(V1) of
8497	true ->
8498	    not_equal(Type, V1, V2);
8499	false ->
8500	    wrong_type(Type, V1, V2)
8501    end;
8502chk_OPTIONAL(_Type, V1, V2, _IS, CHK) when is_function(CHK) ->
8503    CHK(V1, V2).
8504
8505
8506%% -- CHOICE --
8507
8508is_CHOICE({Tag, Val}, Tags) when is_list(Tags) ->
8509    d("is_CHOICE -> entry with"
8510      "~n   Tag: ~p"
8511      "~n   Val: ~p", [Tag, Val]),
8512    is_CHOICE_tag(Tag, Tags) andalso
8513	is_CHOICE_val(Tag, Val, Tags);
8514is_CHOICE(_, _) ->
8515    false.
8516
8517is_CHOICE_tag(Tag, Tags) ->
8518    lists:keymember(Tag, 1, Tags).
8519
8520is_CHOICE_val(Tag, Val, Tags) ->
8521    {value, {_, IsVal, _}} = lists:keysearch(Tag, 1, Tags),
8522    IsVal(Val).
8523
8524
8525chk_CHOICE(V1, V2, Type, Tags) when is_atom(Type) and is_list(Tags) ->
8526    IsTag  = fun(Tag) -> is_CHOICE_tag(Tag, Tags) end,
8527    IsVal  = fun(Tag, Val) -> is_CHOICE_val(Tag, Val, Tags) end,
8528    ChkVal = fun(Tag, Val1, Val2) ->
8529		     chk_CHOICE_val(Tag, Val1, Val2, Tags)
8530	     end,
8531    chk_CHOICE(V1, V2, Type, IsTag, IsVal, ChkVal).
8532
8533chk_CHOICE_val(Tag, Val1, Val2, Tags) ->
8534    {value, {_, _, ChkVal}} = lists:keysearch(Tag, 1, Tags),
8535    ChkVal(Val1, Val2).
8536
8537chk_CHOICE({Tag, Val1} = V1, {Tag, Val2} = V2, Type, IsTag, IsVal, ChkVal) ->
8538    case (IsTag(Tag) andalso
8539	  IsVal(Tag, Val1) andalso IsVal(Tag, Val2)) of
8540	true ->
8541	    ChkVal(Tag, Val1, Val2);
8542	false ->
8543	    wrong_type(Type, V1, V2)
8544    end;
8545chk_CHOICE({Tag1, Val1} = V1, {Tag2, Val2} = V2, Type,
8546	   IsTag, IsVal, _ChkVal) ->
8547    case ((IsTag(Tag1) andalso IsVal(Tag1, Val1)) andalso
8548	  (IsTag(Tag2) andalso IsVal(Tag2, Val2))) of
8549	true ->
8550	    not_equal(Type, V1, V2);
8551	false ->
8552	    wrong_type(Type, V1, V2)
8553    end;
8554chk_CHOICE(V1, V2, Type, _, _, _) ->
8555    wrong_type(Type, V1, V2).
8556
8557
8558%% -- SEQUENCE OF --
8559
8560is_SEQUENCE_OF([], _) ->
8561    true;
8562is_SEQUENCE_OF([H|T], IS) when is_function(IS) ->
8563    IS(H) andalso is_SEQUENCE_OF(T, IS);
8564is_SEQUENCE_OF(_, _) ->
8565    false.
8566
8567chk_SEQUENCE_OF([], [], _, _, _) ->
8568    ok;
8569chk_SEQUENCE_OF([] = V1, V2, Type, _, _) ->
8570    not_equal(Type, V1, V2);
8571chk_SEQUENCE_OF(V1, [] = V2, Type, _, _) ->
8572    not_equal(Type, V1, V2);
8573chk_SEQUENCE_OF([H|T1], [H|T2], Type, IS, CHK) ->
8574    case IS(H) of
8575	true ->
8576	    chk_SEQUENCE_OF(T1, T2, Type, IS, CHK);
8577	false ->
8578	    Type2 = list_to_atom(atom_to_list(Type) ++ "_val"),
8579	    wrong_type(Type2, H)
8580    end;
8581chk_SEQUENCE_OF([H1|T1], [H2|T2], Type, IS, CHK) ->
8582    Type2 = list_to_atom(atom_to_list(Type) ++ "_val"),
8583    validate(fun() -> CHK(H1, H2) end, Type2),
8584    chk_SEQUENCE_OF(T1, T2, Type, IS, CHK);
8585chk_SEQUENCE_OF(V1, V2, Type, _, _) ->
8586    wrong_type(Type, V1, V2).
8587
8588
8589%% ----------------------------------------------------------------------
8590
8591compare_strings([] = L1, L2) ->
8592    {L1, L2};
8593compare_strings(L1, [] = L2) ->
8594    {L1, L2};
8595compare_strings([H|T1], [H|T2]) ->
8596    compare_strings(T1, T2);
8597compare_strings(L1, L2) ->
8598    {L1, L2}.
8599
8600strip_tab_and_newline([]) ->
8601    [];
8602strip_tab_and_newline([$\n|T]) ->
8603    strip_tab_and_newline(T);
8604strip_tab_and_newline([$\t|T]) ->
8605    strip_tab_and_newline(T);
8606strip_tab_and_newline([H|T]) ->
8607    [H|strip_tab_and_newline(T)].
8608
8609
8610%% ----------------------------------------------------------------------
8611
8612maybe_sort(L) when is_list(L) ->
8613    lists:sort(L);
8614maybe_sort(X) ->
8615    X.
8616
8617
8618%% ----------------------------------------------------------------------
8619
8620atmost_once(Type, Val) ->
8621    error({atmost_once, {Type, Val}}).
8622
8623wrong_type(Type, Val) ->
8624    error({wrong_type, {Type, Val}}).
8625
8626wrong_type(Type, Val1, Val2) ->
8627    error({wrong_type, {Type, Val1, Val2}}).
8628
8629not_equal(What, Val1, Val2) ->
8630    error({not_equal, {What, Val1, Val2}}).
8631
8632error(Reason) ->
8633    throw({error, Reason}).
8634
8635
8636%% ----------------------------------------------------------------------
8637
8638d(F) ->
8639    d(F, []).
8640
8641d(F, A) ->
8642    d(get(dbg), F, A).
8643
8644d(true, F, A) ->
8645    io:format("DBG:" ++ F ++ "~n", A);
8646d(_, _, _) ->
8647    ok.
8648
8649