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